/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.visitors;
import static org.whole.gen.lang.ClassNames.CompositeColumnPartName;
import static org.whole.gen.lang.ClassNames.CompositeRowPartName;
import static org.whole.gen.lang.ClassNames.EmptyOptionalPartName;
import static org.whole.gen.lang.ClassNames.GrammarRuleFigureName;
import static org.whole.gen.lang.ClassNames.GrammarRuleFoldableFigureName;
import static org.whole.gen.lang.ClassNames.PlaceHolderPartName;
import static org.whole.gen.lang.ClassNames.SimpleFoldablePartName;
import static org.whole.gen.lang.ClassNames.SimplePartName;
import org.whole.gen.lang.LanguageGenerator;
import org.whole.gen.lang.ui.editparts.PartBuilder;
import org.whole.gen.lang.ui.figures.FigureBuilder;
import org.whole.gen.lang.visitors.PartFactoryVisitorBuilder;
import org.whole.lang.editors.model.ChildPlace;
import org.whole.lang.editors.model.ControllerComponent;
import org.whole.lang.editors.model.ControllerDeclaration;
import org.whole.lang.editors.model.ControllerDeclarations;
import org.whole.lang.editors.model.DelimiterToken;
import org.whole.lang.editors.model.Editor;
import org.whole.lang.editors.model.EntityFeatures;
import org.whole.lang.editors.model.EntityName;
import org.whole.lang.editors.model.EntityNames;
import org.whole.lang.editors.model.FoldableTextualFigure;
import org.whole.lang.editors.model.FoldingToggle;
import org.whole.lang.editors.model.GenericPartDeclaration;
import org.whole.lang.editors.model.GenericPartName;
import org.whole.lang.editors.model.GenericPartNameEnum;
import org.whole.lang.editors.model.Identifier;
import org.whole.lang.editors.model.IdentifierToken;
import org.whole.lang.editors.model.Indent;
import org.whole.lang.editors.model.JavaPartDeclaration;
import org.whole.lang.editors.model.KeywordToken;
import org.whole.lang.editors.model.LiteralToken;
import org.whole.lang.editors.model.ModelComponent;
import org.whole.lang.editors.model.OperatorToken;
import org.whole.lang.editors.model.ParenthesisToken;
import org.whole.lang.editors.model.PartDeclaration;
import org.whole.lang.editors.model.Row;
import org.whole.lang.editors.model.RowElement;
import org.whole.lang.editors.model.SimpleFigureDeclaration;
import org.whole.lang.editors.model.TextualFigure;
import org.whole.lang.editors.model.ViewComponent;
import org.whole.lang.editors.model.ViewDeclaration;
import org.whole.lang.editors.model.ViewDeclarations;
import org.whole.lang.editors.visitors.EditorsIdentityVisitor;
import org.whole.lang.operations.JavaCompilerOperation;
/**
* @author Riccardo Solmi
*/
public class EditorsJavaModelGeneratorVisitor extends EditorsIdentityVisitor {
private LanguageGenerator wgen;
private FigureBuilder figureBuilder;
private PartBuilder partBuilder;
private PartFactoryVisitorBuilder partFactoryVisitorBuilder;
public void visit(Editor editor) {
String editorName = editor.getEditorName().wStringValue();
name = null;
editor.getSuperEditorName().accept(this);
String superEditorName = name;
modelName = editorName;
editor.getModelComponent().accept(this);
wgen = (LanguageGenerator) ((JavaCompilerOperation) getOperation()).getGenerator();
wgen.setPackagePrefix(wgen.getBasePackagePrefix()+"."+modelName.toLowerCase());
wgen.setModelName(modelName);
wgen.setEditorName(editorName);
wgen.editorKitBuilder();
partFactoryVisitorBuilder = wgen.addPartFactoryVisitorBuilder(superEditorName);
editor.getViewComponent().accept(this);
editor.getControllerComponent().accept(this);
}
String modelName;
public void visit(ModelComponent entity) {
entity.getModelName().accept(this);
modelName = name;
}
public void visit(ViewComponent view) {
view.getDeclarations().accept(this);
}
public void visit(ViewDeclarations entity) {
for (int i = 0; i < entity.wSize(); i++)
((ViewDeclaration) entity.wGet(i)).accept(this);
}
public void visit(SimpleFigureDeclaration view) {
figureBuilder = wgen.newFigureBuilder(view.getName().wStringValue());
view.getFigure().accept(this);
}
public void visit(FoldableTextualFigure entity) {
entity.getExpandedFigure().accept(this);
figureBuilder.collapsedLayout();
entity.getCollapsedFigure().accept(this);
figureBuilder.expandedLayout();
figureBuilder.setSuperclass(GrammarRuleFoldableFigureName);
}
public void visit(TextualFigure entity) {
figureBuilder.setSuperclass(GrammarRuleFigureName);
for (int i = 0; i < entity.wSize(); i++) {
if (i>0)
figureBuilder.nextRow();
((Row) entity.wGet(i)).accept(this);
}
}
public void visit(Row entity) {
for (int i = 0; i < entity.wSize(); i++)
((RowElement) entity.wGet(i)).accept(this);
}
public void visit(ChildPlace place) {
figureBuilder.addChildPlace();
}
public void visit(Indent token) {
figureBuilder.addIndent();
}
public void visit(FoldingToggle token) {
figureBuilder.addFoldingToggle();
}
public void visit(KeywordToken token) {
figureBuilder.addToken("Keyword", token.getValue());
}
public void visit(LiteralToken token) {
figureBuilder.addToken("Literal", token.getValue());
}
public void visit(IdentifierToken token) {
figureBuilder.addToken("Identifier", token.getValue());
}
public void visit(OperatorToken token) {
figureBuilder.addToken("Operator", token.getValue());
}
public void visit(DelimiterToken token) {
figureBuilder.addToken("Delimiter", token.getValue());
}
public void visit(ParenthesisToken token) {
figureBuilder.addToken("Parenthesis", token.getValue());
}
public void visit(ControllerComponent controller) {
controller.getDeclarations().accept(this);
}
public void visit(ControllerDeclarations entity) {
for (int i = 0; i < entity.wSize(); i++)
((ControllerDeclaration) entity.wGet(i)).accept(this);
}
String partName;
String entityName;
public void visit(PartDeclaration part) {
partName = part.getPartName().wStringValue();
entityName = part.getEntityName().wStringValue();
String figureName = part.getFigureName().wStringValue();
partBuilder = wgen.newPartBuilder(
partName, entityName, figureName);
partFactoryVisitorBuilder.addPartFactoryVisitMethod(entityName, partName);
part.getEntityFeatures().accept(this);
}
public void visit(EntityFeatures entity) {
for (int i = 0; i < entity.wSize(); i++) {
String featureName = entity.wGet(i).wStringValue();
partBuilder.addChildrenFeature("reference", featureName);
}
partBuilder.endChildrenFeatures();
}
public void visit(JavaPartDeclaration part) {
part.getPartName().accept(this);
partName = name;
part.getEntityNames().accept(this);
}
public void visit(GenericPartDeclaration part) {
part.getPartName().accept(this);
part.getEntityNames().accept(this);
}
public void visit(EntityNames entity) {
for (int i = 0; i < entity.wSize(); i++) {
((EntityName) entity.wGet(i)).accept(this);
partFactoryVisitorBuilder.addPartFactoryVisitMethod(entityName = name, partName);
}
}
String name;
public void visit(Identifier entity) {
name = entity.getValue();
}
public void visit(GenericPartName entity) {
switch (entity.getValue().getOrdinal()) {
case GenericPartNameEnum.CompositeColumn_ord:
partName = CompositeColumnPartName;
break;
case GenericPartNameEnum.CompositeRow_ord:
partName = CompositeRowPartName;
break;
case GenericPartNameEnum.ConstructorColumn_ord:
partName = SimplePartName;//FIXME
break;
case GenericPartNameEnum.ConstructorRow_ord:
partName = SimplePartName;//FIXME
break;
case GenericPartNameEnum.FoldableConstructor_ord:
partName = SimpleFoldablePartName;
break;
case GenericPartNameEnum.Resolver_ord:
partName = PlaceHolderPartName;
break;
case GenericPartNameEnum.OptionalResolver_ord:
partName = EmptyOptionalPartName;
break;
//FIXME
case GenericPartNameEnum.LiteralData_ord:
partName = CompositeRowPartName;
break;
case GenericPartNameEnum.KeywordData_ord:
partName = CompositeRowPartName;
break;
case GenericPartNameEnum.IdentifierData_ord:
partName = CompositeRowPartName;
break;
case GenericPartNameEnum.OperatorData_ord:
partName = CompositeRowPartName;
break;
case GenericPartNameEnum.DelimiterData_ord:
partName = CompositeRowPartName;
break;
case GenericPartNameEnum.ParenthesisData_ord:
partName = CompositeRowPartName;
break;
}
}
}