From 2ca02df71b1e6c856c551c0ca31a2638e15479d8 Mon Sep 17 00:00:00 2001 From: Retera Date: Wed, 20 May 2020 08:21:29 -0400 Subject: [PATCH] Key value pair parser for FDF, new design --- .../fdf/DataSourceFDFParserBuilder.java | 48 +++++ .../etheller/warsmash/parsers/fdf/Main.java | 55 +++++ .../FrameDefinitionFieldVisitor.java | 151 +++++++++++++- .../fdfparser/FrameDefinitionVisitor.java | 189 +++++++++++++++--- .../com/etheller/warsmash/fdfparser/Main.java | 4 +- .../fdf/datamodel/ColorDefinition.java | 28 --- .../parsers/fdf/datamodel/FrameClass.java | 8 + ...ameDefintion.java => FrameDefinition.java} | 33 ++- .../datamodel/FrameTemplateEnvironment.java | 9 + .../parsers/fdf/datamodel/Insets.java | 41 ---- .../{Offset.java => Vector2Definition.java} | 7 +- .../fdf/datamodel/Vector3Definition.java | 23 +++ .../fdf/datamodel/Vector4Definition.java | 28 +++ .../fields/ColorFrameDefinitionField.java | 21 -- .../fields/FloatFrameDefinitionField.java | 1 + .../fields/FrameDefinitionFieldVisitor.java | 10 +- .../fields/InsetsFrameDefinitionField.java | 20 -- .../fields/OffsetFrameDefinitionField.java | 20 -- .../StringPairFrameDefinitionField.java | 24 +++ .../TextJustifyFrameDefinitionField.java | 21 ++ .../fields/Vector2FrameDefinitionField.java | 20 ++ .../fields/Vector3FrameDefinitionField.java | 21 ++ .../fields/Vector4FrameDefinitionField.java | 20 ++ 23 files changed, 632 insertions(+), 170 deletions(-) create mode 100644 core/src/com/etheller/warsmash/parsers/fdf/DataSourceFDFParserBuilder.java create mode 100644 core/src/com/etheller/warsmash/parsers/fdf/Main.java delete mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/ColorDefinition.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameClass.java rename fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/{FrameDefintion.java => FrameDefinition.java} (56%) delete mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Insets.java rename fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/{Offset.java => Vector2Definition.java} (70%) create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector3Definition.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector4Definition.java delete mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/ColorFrameDefinitionField.java delete mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/InsetsFrameDefinitionField.java delete mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/OffsetFrameDefinitionField.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/StringPairFrameDefinitionField.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/TextJustifyFrameDefinitionField.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector2FrameDefinitionField.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector3FrameDefinitionField.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector4FrameDefinitionField.java diff --git a/core/src/com/etheller/warsmash/parsers/fdf/DataSourceFDFParserBuilder.java b/core/src/com/etheller/warsmash/parsers/fdf/DataSourceFDFParserBuilder.java new file mode 100644 index 0000000..a2bec5b --- /dev/null +++ b/core/src/com/etheller/warsmash/parsers/fdf/DataSourceFDFParserBuilder.java @@ -0,0 +1,48 @@ +package com.etheller.warsmash.parsers.fdf; + +import java.io.IOException; + +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; + +import com.etheller.warsmash.datasources.DataSource; +import com.etheller.warsmash.fdfparser.FDFLexer; +import com.etheller.warsmash.fdfparser.FDFParser; +import com.etheller.warsmash.fdfparser.FDFParserBuilder; + +public class DataSourceFDFParserBuilder implements FDFParserBuilder { + private final DataSource dataSource; + + public DataSourceFDFParserBuilder(final DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public FDFParser build(final String path) { + FDFLexer lexer; + try { + lexer = new FDFLexer(CharStreams.fromStream(this.dataSource.getResourceAsStream(path))); + } + catch (final IOException e) { + throw new RuntimeException(e); + } + final FDFParser fdfParser = new FDFParser(new CommonTokenStream(lexer)); + final BaseErrorListener errorListener = new BaseErrorListener() { + @Override + public void syntaxError(final Recognizer recognizer, final Object offendingSymbol, final int line, + final int charPositionInLine, final String msg, final RecognitionException e) { + String sourceName = path; + if (!sourceName.isEmpty()) { + sourceName = String.format("%s:%d:%d: ", sourceName, line, charPositionInLine); + } + + System.err.println(sourceName + "line " + line + ":" + charPositionInLine + " " + msg); + } + }; + fdfParser.addErrorListener(errorListener); + return fdfParser; + } +} \ No newline at end of file diff --git a/core/src/com/etheller/warsmash/parsers/fdf/Main.java b/core/src/com/etheller/warsmash/parsers/fdf/Main.java new file mode 100644 index 0000000..02a6fc1 --- /dev/null +++ b/core/src/com/etheller/warsmash/parsers/fdf/Main.java @@ -0,0 +1,55 @@ +package com.etheller.warsmash.parsers.fdf; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Arrays; + +import com.etheller.warsmash.datasources.CompoundDataSourceDescriptor; +import com.etheller.warsmash.datasources.DataSource; +import com.etheller.warsmash.datasources.DataSourceDescriptor; +import com.etheller.warsmash.datasources.FolderDataSourceDescriptor; +import com.etheller.warsmash.fdfparser.FDFParser; +import com.etheller.warsmash.fdfparser.FrameDefinitionVisitor; +import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition; +import com.etheller.warsmash.parsers.fdf.datamodel.FrameTemplateEnvironment; + +public class Main { + public static final boolean REPORT_SYNTAX_ERRORS = true; + + public static void main(final String[] args) { + if (args.length < 1) { + System.err.println("Usage: "); + return; + } + try { + + final FolderDataSourceDescriptor war3mpq = new FolderDataSourceDescriptor( + "E:\\Backups\\Warcraft\\Data\\127"); + final FolderDataSourceDescriptor testingFolder = new FolderDataSourceDescriptor( + "E:\\Backups\\Warsmash\\Data"); + final FolderDataSourceDescriptor currentFolder = new FolderDataSourceDescriptor("."); + final DataSource dataSource = new CompoundDataSourceDescriptor( + Arrays.asList(war3mpq, testingFolder, currentFolder)).createDataSource(); + + final FrameTemplateEnvironment templates = new FrameTemplateEnvironment(); + final DataSourceFDFParserBuilder dataSourceFDFParserBuilder = new DataSourceFDFParserBuilder(dataSource); + final FrameDefinitionVisitor fdfVisitor = new FrameDefinitionVisitor(templates, dataSourceFDFParserBuilder); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(dataSource.getResourceAsStream("UI\\FrameDef\\FrameDef.toc")))) { + String line; + while ((line = reader.readLine()) != null) { + final FDFParser firstFileParser = dataSourceFDFParserBuilder.build(line); + fdfVisitor.visit(firstFileParser.program()); + } + } + + final FrameDefinition bnetChat = templates.getFrame("ConsoleUI"); + System.out.println("Value of ConsoleUI: " + bnetChat); + } + catch (final Exception exc) { + exc.printStackTrace(); + System.err.println(exc.getMessage()); + } + } + +} diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionFieldVisitor.java b/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionFieldVisitor.java index 633819a..e366a1d 100644 --- a/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionFieldVisitor.java +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionFieldVisitor.java @@ -1,19 +1,156 @@ package com.etheller.warsmash.fdfparser; -import com.etheller.warsmash.fdfparser.FDFParser.BackdropBackgroundElementContext; -import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefintion; +import com.etheller.warsmash.fdfparser.FDFParser.AnchorElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.FlagElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.FloatElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.FontElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.FrameFrameElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.SetPointElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.SimpleFontElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.StringElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.StringPairElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.TextJustifyElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.Vector2ElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.Vector3ElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.Vector4CommaElementContext; +import com.etheller.warsmash.fdfparser.FDFParser.Vector4ElementContext; +import com.etheller.warsmash.parsers.fdf.datamodel.AnchorDefinition; +import com.etheller.warsmash.parsers.fdf.datamodel.FontDefinition; +import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition; +import com.etheller.warsmash.parsers.fdf.datamodel.FramePoint; +import com.etheller.warsmash.parsers.fdf.datamodel.SetPointDefinition; +import com.etheller.warsmash.parsers.fdf.datamodel.TextJustify; +import com.etheller.warsmash.parsers.fdf.datamodel.Vector2Definition; +import com.etheller.warsmash.parsers.fdf.datamodel.Vector4Definition; +import com.etheller.warsmash.parsers.fdf.datamodel.fields.FloatFrameDefinitionField; +import com.etheller.warsmash.parsers.fdf.datamodel.fields.FontFrameDefinitionField; +import com.etheller.warsmash.parsers.fdf.datamodel.fields.StringFrameDefinitionField; +import com.etheller.warsmash.parsers.fdf.datamodel.fields.StringPairFrameDefinitionField; +import com.etheller.warsmash.parsers.fdf.datamodel.fields.TextJustifyFrameDefinitionField; +import com.etheller.warsmash.parsers.fdf.datamodel.fields.Vector2FrameDefinitionField; +import com.etheller.warsmash.parsers.fdf.datamodel.fields.Vector4FrameDefinitionField; public class FrameDefinitionFieldVisitor extends FDFBaseVisitor { - private final FrameDefintion frameDefintion; + private static final int JUSTIFY_OFFSET = "JUSTIFY".length(); + private final FrameDefinition frameDefinition; + private final FrameDefinitionVisitor frameDefinitionVisitor; - public FrameDefinitionFieldVisitor(final FrameDefintion frameDefintion, + public FrameDefinitionFieldVisitor(final FrameDefinition frameDefinition, final FrameDefinitionVisitor frameDefinitionVisitor) { - this.frameDefintion = frameDefintion; + this.frameDefinition = frameDefinition; + this.frameDefinitionVisitor = frameDefinitionVisitor; } @Override - public Void visitBackdropBackgroundElement(final BackdropBackgroundElementContext ctx) { - this.frameDefintion.set("BackdropBackground", value); + public Void visitStringElement(final StringElementContext ctx) { + String text = ctx.STRING_LITERAL().getText(); + text = text.substring(1, text.length() - 1); + this.frameDefinition.set(ctx.ID().getText(), new StringFrameDefinitionField(text)); + return null; + } + + @Override + public Void visitStringPairElement(final StringPairElementContext ctx) { + String first = ctx.STRING_LITERAL(0).getText(); + first = first.substring(1, first.length() - 1); + String second = ctx.STRING_LITERAL(1).getText(); + second = second.substring(1, second.length() - 1); + this.frameDefinition.set(ctx.ID().getText(), new StringPairFrameDefinitionField(first, second)); + return super.visitStringPairElement(ctx); + } + + @Override + public Void visitFloatElement(final FloatElementContext ctx) { + this.frameDefinition.set(ctx.ID().getText(), + new FloatFrameDefinitionField(Float.parseFloat(ctx.FLOAT().getText()))); + return null; + } + + @Override + public Void visitFlagElement(final FlagElementContext ctx) { + this.frameDefinition.add(ctx.ID().getText()); + return null; + } + + @Override + public Void visitVector2Element(final Vector2ElementContext ctx) { + this.frameDefinition.set(ctx.ID().getText(), + new Vector2FrameDefinitionField(new Vector2Definition(Float.parseFloat(ctx.FLOAT(0).getText()), + Float.parseFloat(ctx.FLOAT(1).getText())))); + return null; + } + + @Override + public Void visitVector3Element(final Vector3ElementContext ctx) { + this.frameDefinition.set(ctx.ID().getText(), + new Vector4FrameDefinitionField(new Vector4Definition(Float.parseFloat(ctx.FLOAT(0).getText()), + Float.parseFloat(ctx.FLOAT(1).getText()), Float.parseFloat(ctx.FLOAT(2).getText()), 1.0f))); + return null; + } + + @Override + public Void visitVector4Element(final Vector4ElementContext ctx) { + this.frameDefinition.set(ctx.ID().getText(), + new Vector4FrameDefinitionField(new Vector4Definition(Float.parseFloat(ctx.FLOAT(0).getText()), + Float.parseFloat(ctx.FLOAT(1).getText()), Float.parseFloat(ctx.FLOAT(2).getText()), + Float.parseFloat(ctx.FLOAT(3).getText())))); + return null; + } + + @Override + public Void visitVector4CommaElement(final Vector4CommaElementContext ctx) { + this.frameDefinition.set(ctx.ID().getText(), + new Vector4FrameDefinitionField(new Vector4Definition(Float.parseFloat(ctx.FLOAT(0).getText()), + Float.parseFloat(ctx.FLOAT(1).getText()), Float.parseFloat(ctx.FLOAT(2).getText()), + Float.parseFloat(ctx.FLOAT(3).getText())))); + return null; + } + + @Override + public Void visitSetPointElement(final SetPointElementContext ctx) { + String other = ctx.STRING_LITERAL().getText(); + other = other.substring(1, other.length() - 1); + final SetPointDefinition setPointDefinition = new SetPointDefinition( + FramePoint.valueOf(ctx.frame_point(0).getText()), other, + FramePoint.valueOf(ctx.frame_point(1).getText()), Float.parseFloat(ctx.FLOAT(0).getText()), + Float.parseFloat(ctx.FLOAT(1).getText())); + this.frameDefinition.add(setPointDefinition); + return null; + } + + @Override + public Void visitAnchorElement(final AnchorElementContext ctx) { + final AnchorDefinition anchorDefinition = new AnchorDefinition(FramePoint.valueOf(ctx.frame_point().getText()), + Float.parseFloat(ctx.FLOAT(0).getText()), Float.parseFloat(ctx.FLOAT(1).getText())); + this.frameDefinition.add(anchorDefinition); + return null; + } + + @Override + public Void visitTextJustifyElement(final TextJustifyElementContext ctx) { + final TextJustify justify = TextJustify.valueOf(ctx.text_justify().getText().substring(JUSTIFY_OFFSET)); + this.frameDefinition.set(ctx.ID().getText(), new TextJustifyFrameDefinitionField(justify)); + return null; + } + + @Override + public Void visitFontElement(final FontElementContext ctx) { + this.frameDefinition.set(ctx.ID().getText(), + new FontFrameDefinitionField(new FontDefinition(ctx.STRING_LITERAL(0).getText(), + Float.parseFloat(ctx.FLOAT().getText()), ctx.STRING_LITERAL(1).getText()))); + return null; + } + + @Override + public Void visitSimpleFontElement(final SimpleFontElementContext ctx) { + this.frameDefinition.set(ctx.ID().getText(), new FontFrameDefinitionField( + new FontDefinition(ctx.STRING_LITERAL().getText(), Float.parseFloat(ctx.FLOAT().getText()), null))); + return null; + } + + @Override + public Void visitFrameFrameElement(final FrameFrameElementContext ctx) { + this.frameDefinition.add(this.frameDefinitionVisitor.visit(ctx)); return null; } } diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java b/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java index 097a407..f9f0f45 100644 --- a/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java @@ -4,18 +4,23 @@ import java.util.List; import org.antlr.v4.runtime.tree.TerminalNode; +import com.etheller.warsmash.fdfparser.FDFParser.AnonymousCompDefinitionContext; +import com.etheller.warsmash.fdfparser.FDFParser.AnonymousCompSubTypeDefinitionContext; +import com.etheller.warsmash.fdfparser.FDFParser.AnonymousCompSubTypeDefinitionWithChildrenContext; import com.etheller.warsmash.fdfparser.FDFParser.CompDefinitionContext; import com.etheller.warsmash.fdfparser.FDFParser.CompSubTypeDefinitionContext; import com.etheller.warsmash.fdfparser.FDFParser.CompSubTypeDefinitionWithChildrenContext; import com.etheller.warsmash.fdfparser.FDFParser.FrameDefinitionContext; import com.etheller.warsmash.fdfparser.FDFParser.FrameSubTypeDefinitionContext; import com.etheller.warsmash.fdfparser.FDFParser.FrameSubTypeDefinitionWithChildrenContext; +import com.etheller.warsmash.fdfparser.FDFParser.Frame_elementContext; import com.etheller.warsmash.fdfparser.FDFParser.IncludeStatementContext; import com.etheller.warsmash.fdfparser.FDFParser.StringListStatementContext; -import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefintion; +import com.etheller.warsmash.parsers.fdf.datamodel.FrameClass; +import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition; import com.etheller.warsmash.parsers.fdf.datamodel.FrameTemplateEnvironment; -public class FrameDefinitionVisitor extends FDFBaseVisitor { +public class FrameDefinitionVisitor extends FDFBaseVisitor { private final FrameTemplateEnvironment templates; private final FDFParserBuilder fdfParserBuilder; @@ -25,57 +30,195 @@ public class FrameDefinitionVisitor extends FDFBaseVisitor { } @Override - public FrameDefintion visitStringListStatement(final StringListStatementContext ctx) { + public FrameDefinition visitStringListStatement(final StringListStatementContext ctx) { final List ids = ctx.ID(); final List strings = ctx.STRING_LITERAL(); for (int i = 0; i < ids.size(); i++) { final String id = ids.get(i).getText(); String value = strings.get(i).getText(); - value = value.substring(1, value.length() - 1); + value = unquote(value); this.templates.addDecoratedString(id, value); } return null; } @Override - public FrameDefintion visitIncludeStatement(final IncludeStatementContext ctx) { - String includeFilePath = ctx.STRING_LITERAL().getText(); - includeFilePath = includeFilePath.substring(1, includeFilePath.length() - 1); + public FrameDefinition visitIncludeStatement(final IncludeStatementContext ctx) { + final String includeFilePath = unquote(ctx.STRING_LITERAL().getText()); final FDFParser parser = this.fdfParserBuilder.build(includeFilePath); visit(parser.program()); return null; } - @Override - public FrameDefintion visitFrameDefinition(final FrameDefinitionContext ctx) { - return super.visitFrameDefinition(ctx); + private String unquote(String includeFilePath) { + includeFilePath = includeFilePath.substring(1, includeFilePath.length() - 1); + return includeFilePath; } @Override - public FrameDefintion visitFrameSubTypeDefinition(final FrameSubTypeDefinitionContext ctx) { - return super.visitFrameSubTypeDefinition(ctx); + public FrameDefinition visitFrameDefinition(final FrameDefinitionContext ctx) { + final String type = unquote(ctx.STRING_LITERAL(0).getText()); + final String name = unquote(ctx.STRING_LITERAL(1).getText()); + final FrameDefinition frameDefinition = new FrameDefinition(FrameClass.Frame, type, name); + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + this.templates.put(name, frameDefinition); + return frameDefinition; } @Override - public FrameDefintion visitFrameSubTypeDefinitionWithChildren(final FrameSubTypeDefinitionWithChildrenContext ctx) { - return super.visitFrameSubTypeDefinitionWithChildren(ctx); + public FrameDefinition visitFrameSubTypeDefinition(final FrameSubTypeDefinitionContext ctx) { + final String type = unquote(ctx.STRING_LITERAL(0).getText()); + final String name = unquote(ctx.STRING_LITERAL(1).getText()); + final String parent = unquote(ctx.STRING_LITERAL(2).getText()); + final FrameDefinition frameDefinition = new FrameDefinition(FrameClass.Frame, type, name); + // INHERITS + final FrameDefinition inheritParent = this.templates.getFrame(parent); + if (inheritParent == null) { + throw new IllegalStateException( + "\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!"); + } + frameDefinition.inheritFrom(inheritParent, false); + + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + this.templates.put(name, frameDefinition); + return frameDefinition; } @Override - public FrameDefintion visitCompDefinition(final CompDefinitionContext ctx) { - // TODO Auto-generated method stub - return super.visitCompDefinition(ctx); + public FrameDefinition visitFrameSubTypeDefinitionWithChildren( + final FrameSubTypeDefinitionWithChildrenContext ctx) { + final String type = unquote(ctx.STRING_LITERAL(0).getText()); + final String name = unquote(ctx.STRING_LITERAL(1).getText()); + final String parent = unquote(ctx.STRING_LITERAL(2).getText()); + final FrameDefinition frameDefinition = new FrameDefinition(FrameClass.Frame, type, name); + // INHERITS + final FrameDefinition inheritParent = this.templates.getFrame(parent); + if (inheritParent == null) { + throw new IllegalStateException( + "\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!"); + } + frameDefinition.inheritFrom(inheritParent, true); + + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + this.templates.put(name, frameDefinition); + return frameDefinition; } @Override - public FrameDefintion visitCompSubTypeDefinition(final CompSubTypeDefinitionContext ctx) { - // TODO Auto-generated method stub - return super.visitCompSubTypeDefinition(ctx); + public FrameDefinition visitAnonymousCompDefinition(final AnonymousCompDefinitionContext ctx) { + final FrameDefinition frameDefinition = new FrameDefinition( + FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, null); + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + return frameDefinition; } @Override - public FrameDefintion visitCompSubTypeDefinitionWithChildren(final CompSubTypeDefinitionWithChildrenContext ctx) { - // TODO Auto-generated method stub - return super.visitCompSubTypeDefinitionWithChildren(ctx); + public FrameDefinition visitAnonymousCompSubTypeDefinition(final AnonymousCompSubTypeDefinitionContext ctx) { + final String parent = unquote(ctx.STRING_LITERAL().getText()); + final FrameClass frameClass = FrameClass.valueOf(ctx.frame_type_qualifier().getText()); + final FrameDefinition frameDefinition = new FrameDefinition(frameClass, null, null); + // INHERITS + final FrameDefinition inheritParent = this.templates.getFrame(parent); + if (inheritParent == null) { + throw new IllegalStateException( + "" + frameClass + " cannot inherit from \"" + parent + "\" because it does not exist!"); + } + frameDefinition.inheritFrom(inheritParent, false); + + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + return frameDefinition; + } + + @Override + public FrameDefinition visitAnonymousCompSubTypeDefinitionWithChildren( + final AnonymousCompSubTypeDefinitionWithChildrenContext ctx) { + final String parent = unquote(ctx.STRING_LITERAL().getText()); + final FrameClass frameClass = FrameClass.valueOf(ctx.frame_type_qualifier().getText()); + final FrameDefinition frameDefinition = new FrameDefinition(frameClass, null, null); + // INHERITS + final FrameDefinition inheritParent = this.templates.getFrame(parent); + if (inheritParent == null) { + throw new IllegalStateException( + "" + frameClass + " cannot inherit from \"" + parent + "\" because it does not exist!"); + } + frameDefinition.inheritFrom(inheritParent, true); + + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + return frameDefinition; + } + + @Override + public FrameDefinition visitCompDefinition(final CompDefinitionContext ctx) { + final String name = unquote(ctx.STRING_LITERAL().getText()); + final FrameDefinition frameDefinition = new FrameDefinition( + FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, name); + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + this.templates.put(name, frameDefinition); + return frameDefinition; + } + + @Override + public FrameDefinition visitCompSubTypeDefinition(final CompSubTypeDefinitionContext ctx) { + final String name = unquote(ctx.STRING_LITERAL(0).getText()); + final String parent = unquote(ctx.STRING_LITERAL(1).getText()); + final FrameDefinition frameDefinition = new FrameDefinition( + FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, name); + // INHERITS + final FrameDefinition inheritParent = this.templates.getFrame(parent); + if (inheritParent == null) { + throw new IllegalStateException( + "\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!"); + } + frameDefinition.inheritFrom(inheritParent, false); + + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + this.templates.put(name, frameDefinition); + return frameDefinition; + } + + @Override + public FrameDefinition visitCompSubTypeDefinitionWithChildren(final CompSubTypeDefinitionWithChildrenContext ctx) { + final String name = unquote(ctx.STRING_LITERAL(0).getText()); + final String parent = unquote(ctx.STRING_LITERAL(1).getText()); + final FrameDefinition frameDefinition = new FrameDefinition( + FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, name); + // INHERITS + final FrameDefinition inheritParent = this.templates.getFrame(parent); + if (inheritParent == null) { + throw new IllegalStateException( + "\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!"); + } + frameDefinition.inheritFrom(inheritParent, true); + + final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this); + for (final Frame_elementContext element : ctx.frame_element()) { + fieldVisitor.visit(element); + } + this.templates.put(name, frameDefinition); + return frameDefinition; } } diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/Main.java b/fdfparser/src/com/etheller/warsmash/fdfparser/Main.java index 3769298..c2c4f81 100644 --- a/fdfparser/src/com/etheller/warsmash/fdfparser/Main.java +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/Main.java @@ -4,6 +4,7 @@ import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.Recognizer; +import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition; import com.etheller.warsmash.parsers.fdf.datamodel.FrameTemplateEnvironment; public class Main { @@ -36,7 +37,8 @@ public class Main { final FrameDefinitionVisitor fdfVisitor = new FrameDefinitionVisitor(templates, testFDFParserBuilder); final FDFParser firstFileParser = testFDFParserBuilder.build(args[0]); fdfVisitor.visit(firstFileParser.program()); - System.out.println("Value of MONTH_12: " + templates.getDecoratedString("MONTH_12")); + final FrameDefinition bnetChat = templates.getFrame("BattleNetTextAreaTemplate"); + System.out.println("Value of BattleNetTextAreaTemplate: " + bnetChat); } catch (final Exception exc) { System.err.println(exc.getMessage()); diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/ColorDefinition.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/ColorDefinition.java deleted file mode 100644 index eea2153..0000000 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/ColorDefinition.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.etheller.warsmash.parsers.fdf.datamodel; - -public class ColorDefinition { - private final float red, green, blue, alpha; - - public ColorDefinition(final float red, final float green, final float blue, final float alpha) { - this.red = red; - this.green = green; - this.blue = blue; - this.alpha = alpha; - } - - public float getRed() { - return this.red; - } - - public float getGreen() { - return this.green; - } - - public float getBlue() { - return this.blue; - } - - public float getAlpha() { - return this.alpha; - } -} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameClass.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameClass.java new file mode 100644 index 0000000..ad62408 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameClass.java @@ -0,0 +1,8 @@ +package com.etheller.warsmash.parsers.fdf.datamodel; + +public enum FrameClass { + Frame, + String, + Texture, + Layer; +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameDefintion.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameDefinition.java similarity index 56% rename from fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameDefintion.java rename to fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameDefinition.java index 6c9374a..1225719 100644 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameDefintion.java +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameDefinition.java @@ -14,16 +14,23 @@ import com.etheller.warsmash.parsers.fdf.datamodel.fields.FrameDefinitionField; * everything class might help get a prototype running fast until I have a * better understanding of how I want these classes designed. */ -public class FrameDefintion { - private String frameType; - private String name; - private final List innerFrames = new ArrayList<>(); +public class FrameDefinition { + private final FrameClass frameClass; + private final String frameType; + private final String name; + private final List innerFrames = new ArrayList<>(); private final Set flags = new HashSet<>(); private final Map nameToField = new HashMap<>(); private final List setPoints = new ArrayList<>(); private final List anchors = new ArrayList<>(); - public void inheritFrom(final FrameDefintion other, final boolean withChildren) { + public FrameDefinition(final FrameClass frameClass, final String frameType, final String name) { + this.frameClass = frameClass; + this.frameType = frameType; + this.name = name; + } + + public void inheritFrom(final FrameDefinition other, final boolean withChildren) { this.flags.addAll(other.flags); this.nameToField.putAll(other.nameToField); if (withChildren) { @@ -35,6 +42,10 @@ public class FrameDefintion { this.nameToField.put(fieldName, value); } + public void add(final FrameDefinition childDefition) { + this.innerFrames.add(childDefition); + } + public void add(final SetPointDefinition setPointDefinition) { this.setPoints.add(setPointDefinition); } @@ -42,4 +53,16 @@ public class FrameDefintion { public void add(final AnchorDefinition anchorDefinition) { this.anchors.add(anchorDefinition); } + + public void add(final String flag) { + this.flags.add(flag); + } + + @Override + public String toString() { + return "FrameDefinition [frameClass=" + this.frameClass + ", frameType=" + this.frameType + ", name=" + + this.name + ", innerFrames=" + this.innerFrames + ", flags=" + this.flags + ", nameToField=" + + this.nameToField + ", setPoints=" + this.setPoints + ", anchors=" + this.anchors + "]"; + } + } diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameTemplateEnvironment.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameTemplateEnvironment.java index fc13cd0..ba9da1b 100644 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameTemplateEnvironment.java +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/FrameTemplateEnvironment.java @@ -5,6 +5,7 @@ import java.util.Map; public class FrameTemplateEnvironment { private final Map idToDecoratedString = new HashMap<>(); + private final Map idToFrame = new HashMap<>(); public void addDecoratedString(final String id, final String value) { this.idToDecoratedString.put(id, value); @@ -17,4 +18,12 @@ public class FrameTemplateEnvironment { } return id; } + + public void put(final String id, final FrameDefinition frame) { + this.idToFrame.put(id, frame); + } + + public FrameDefinition getFrame(final String id) { + return this.idToFrame.get(id); + } } diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Insets.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Insets.java deleted file mode 100644 index 7ad6db6..0000000 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Insets.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.etheller.warsmash.parsers.fdf.datamodel; - -public class Insets { - private float top; - private float left; - private float bottom; - private float right; - - public float getTop() { - return this.top; - } - - public float getLeft() { - return this.left; - } - - public float getBottom() { - return this.bottom; - } - - public float getRight() { - return this.right; - } - - public void setTop(final float top) { - this.top = top; - } - - public void setLeft(final float left) { - this.left = left; - } - - public void setBottom(final float bottom) { - this.bottom = bottom; - } - - public void setRight(final float right) { - this.right = right; - } - -} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Offset.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector2Definition.java similarity index 70% rename from fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Offset.java rename to fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector2Definition.java index eb2732b..209ce72 100644 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Offset.java +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector2Definition.java @@ -1,9 +1,14 @@ package com.etheller.warsmash.parsers.fdf.datamodel; -public class Offset { +public class Vector2Definition { private float x; private float y; + public Vector2Definition(final float x, final float y) { + this.x = x; + this.y = y; + } + public float getX() { return this.x; } diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector3Definition.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector3Definition.java new file mode 100644 index 0000000..22aa15d --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector3Definition.java @@ -0,0 +1,23 @@ +package com.etheller.warsmash.parsers.fdf.datamodel; + +public class Vector3Definition { + private final float x, y, z; + + public Vector3Definition(final float x, final float y, final float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public float getX() { + return this.x; + } + + public float getY() { + return this.y; + } + + public float getZ() { + return this.z; + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector4Definition.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector4Definition.java new file mode 100644 index 0000000..c2741ed --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/Vector4Definition.java @@ -0,0 +1,28 @@ +package com.etheller.warsmash.parsers.fdf.datamodel; + +public class Vector4Definition { + private final float x, y, z, w; + + public Vector4Definition(final float x, final float y, final float z, final float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + public float getX() { + return this.x; + } + + public float getY() { + return this.y; + } + + public float getZ() { + return this.z; + } + + public float getW() { + return this.w; + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/ColorFrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/ColorFrameDefinitionField.java deleted file mode 100644 index 9fdebc5..0000000 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/ColorFrameDefinitionField.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.etheller.warsmash.parsers.fdf.datamodel.fields; - -import com.etheller.warsmash.parsers.fdf.datamodel.ColorDefinition; - -public class ColorFrameDefinitionField implements FrameDefinitionField { - private final ColorDefinition value; - - public ColorFrameDefinitionField(final ColorDefinition value) { - this.value = value; - } - - public ColorDefinition getValue() { - return this.value; - } - - @Override - public TYPE visit(final FrameDefinitionFieldVisitor visitor) { - return visitor.accept(this); - } - -} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FloatFrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FloatFrameDefinitionField.java index 8c21db2..5218833 100644 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FloatFrameDefinitionField.java +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FloatFrameDefinitionField.java @@ -15,4 +15,5 @@ public class FloatFrameDefinitionField implements FrameDefinitionField { public TYPE visit(final FrameDefinitionFieldVisitor visitor) { return visitor.accept(this); } + } diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FrameDefinitionFieldVisitor.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FrameDefinitionFieldVisitor.java index aa082ae..1049510 100644 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FrameDefinitionFieldVisitor.java +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/FrameDefinitionFieldVisitor.java @@ -3,13 +3,17 @@ package com.etheller.warsmash.parsers.fdf.datamodel.fields; public interface FrameDefinitionFieldVisitor { TYPE accept(StringFrameDefinitionField field); + TYPE accept(StringPairFrameDefinitionField field); + TYPE accept(FloatFrameDefinitionField field); - TYPE accept(ColorFrameDefinitionField field); + TYPE accept(Vector3FrameDefinitionField field); - TYPE accept(InsetsFrameDefinitionField field); + TYPE accept(Vector4FrameDefinitionField field); - TYPE accept(OffsetFrameDefinitionField field); + TYPE accept(Vector2FrameDefinitionField field); TYPE accept(FontFrameDefinitionField field); + + TYPE accept(TextJustifyFrameDefinitionField field); } diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/InsetsFrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/InsetsFrameDefinitionField.java deleted file mode 100644 index 67c3be2..0000000 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/InsetsFrameDefinitionField.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.etheller.warsmash.parsers.fdf.datamodel.fields; - -import com.etheller.warsmash.parsers.fdf.datamodel.Insets; - -public class InsetsFrameDefinitionField implements FrameDefinitionField { - private final Insets value; - - public InsetsFrameDefinitionField(final Insets value) { - this.value = value; - } - - public Insets getValue() { - return this.value; - } - - @Override - public TYPE visit(final FrameDefinitionFieldVisitor visitor) { - return visitor.accept(this); - } -} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/OffsetFrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/OffsetFrameDefinitionField.java deleted file mode 100644 index 770c135..0000000 --- a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/OffsetFrameDefinitionField.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.etheller.warsmash.parsers.fdf.datamodel.fields; - -import com.etheller.warsmash.parsers.fdf.datamodel.Offset; - -public class OffsetFrameDefinitionField implements FrameDefinitionField { - private final Offset value; - - public OffsetFrameDefinitionField(final Offset value) { - this.value = value; - } - - public Offset getValue() { - return this.value; - } - - @Override - public TYPE visit(final FrameDefinitionFieldVisitor visitor) { - return visitor.accept(this); - } -} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/StringPairFrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/StringPairFrameDefinitionField.java new file mode 100644 index 0000000..9cf192b --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/StringPairFrameDefinitionField.java @@ -0,0 +1,24 @@ +package com.etheller.warsmash.parsers.fdf.datamodel.fields; + +public class StringPairFrameDefinitionField implements FrameDefinitionField { + private final String first; + private final String second; + + public StringPairFrameDefinitionField(final String first, final String second) { + this.first = first; + this.second = second; + } + + public String getFirst() { + return this.first; + } + + public String getSecond() { + return this.second; + } + + @Override + public TYPE visit(final FrameDefinitionFieldVisitor visitor) { + return visitor.accept(this); + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/TextJustifyFrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/TextJustifyFrameDefinitionField.java new file mode 100644 index 0000000..c0aa295 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/TextJustifyFrameDefinitionField.java @@ -0,0 +1,21 @@ +package com.etheller.warsmash.parsers.fdf.datamodel.fields; + +import com.etheller.warsmash.parsers.fdf.datamodel.TextJustify; + +public class TextJustifyFrameDefinitionField implements FrameDefinitionField { + private final TextJustify value; + + public TextJustifyFrameDefinitionField(final TextJustify value) { + this.value = value; + } + + public TextJustify getValue() { + return this.value; + } + + @Override + public TYPE visit(final FrameDefinitionFieldVisitor visitor) { + return visitor.accept(this); + } + +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector2FrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector2FrameDefinitionField.java new file mode 100644 index 0000000..e07f798 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector2FrameDefinitionField.java @@ -0,0 +1,20 @@ +package com.etheller.warsmash.parsers.fdf.datamodel.fields; + +import com.etheller.warsmash.parsers.fdf.datamodel.Vector2Definition; + +public class Vector2FrameDefinitionField implements FrameDefinitionField { + private final Vector2Definition value; + + public Vector2FrameDefinitionField(final Vector2Definition value) { + this.value = value; + } + + public Vector2Definition getValue() { + return this.value; + } + + @Override + public TYPE visit(final FrameDefinitionFieldVisitor visitor) { + return visitor.accept(this); + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector3FrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector3FrameDefinitionField.java new file mode 100644 index 0000000..da09089 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector3FrameDefinitionField.java @@ -0,0 +1,21 @@ +package com.etheller.warsmash.parsers.fdf.datamodel.fields; + +import com.etheller.warsmash.parsers.fdf.datamodel.Vector3Definition; + +public class Vector3FrameDefinitionField implements FrameDefinitionField { + private final Vector3Definition value; + + public Vector3FrameDefinitionField(final Vector3Definition value) { + this.value = value; + } + + public Vector3Definition getValue() { + return this.value; + } + + @Override + public TYPE visit(final FrameDefinitionFieldVisitor visitor) { + return visitor.accept(this); + } + +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector4FrameDefinitionField.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector4FrameDefinitionField.java new file mode 100644 index 0000000..94bc3b6 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/datamodel/fields/Vector4FrameDefinitionField.java @@ -0,0 +1,20 @@ +package com.etheller.warsmash.parsers.fdf.datamodel.fields; + +import com.etheller.warsmash.parsers.fdf.datamodel.Vector4Definition; + +public class Vector4FrameDefinitionField implements FrameDefinitionField { + private final Vector4Definition value; + + public Vector4FrameDefinitionField(final Vector4Definition value) { + this.value = value; + } + + public Vector4Definition getValue() { + return this.value; + } + + @Override + public TYPE visit(final FrameDefinitionFieldVisitor visitor) { + return visitor.accept(this); + } +}