/** * 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.semantics.ui.editparts; import org.eclipse.draw2d.IFigure; import org.eclipse.gef.EditPart; import org.whole.lang.matchers.Matcher; import org.whole.lang.model.IEntity; import org.whole.lang.model.adapters.IEntityAdapter; import org.whole.lang.queries.ui.editparts.ChooseTablePart; import org.whole.lang.semantics.model.AnyType; import org.whole.lang.semantics.model.BindingOp; import org.whole.lang.semantics.model.BindingsScope; import org.whole.lang.semantics.model.ChooseTemplate; import org.whole.lang.semantics.model.Configuration; import org.whole.lang.semantics.model.ElseTemplate; import org.whole.lang.semantics.model.EntityType; import org.whole.lang.semantics.model.EnvType; import org.whole.lang.semantics.model.EnvironmentType; import org.whole.lang.semantics.model.EnvironmentVariable; import org.whole.lang.semantics.model.ExecutionRule; import org.whole.lang.semantics.model.ForTemplate; import org.whole.lang.semantics.model.FunctionApplication; import org.whole.lang.semantics.model.FunctionType; import org.whole.lang.semantics.model.ISemanticsEntity; import org.whole.lang.semantics.model.IfDefTemplate; import org.whole.lang.semantics.model.IfTemplate; import org.whole.lang.semantics.model.InferenceRule; import org.whole.lang.semantics.model.InferenceRules; import org.whole.lang.semantics.model.InlineTemplate; import org.whole.lang.semantics.model.InputBinding; import org.whole.lang.semantics.model.InputBindings; import org.whole.lang.semantics.model.LanguageType; import org.whole.lang.semantics.model.LegacyType; import org.whole.lang.semantics.model.LocalBinding; import org.whole.lang.semantics.model.LocalBindings; import org.whole.lang.semantics.model.Name; import org.whole.lang.semantics.model.Namespace; import org.whole.lang.semantics.model.Num; import org.whole.lang.semantics.model.OutputBinding; import org.whole.lang.semantics.model.OutputBindings; import org.whole.lang.semantics.model.Premises; import org.whole.lang.semantics.model.ProductType; import org.whole.lang.semantics.model.Rename; import org.whole.lang.semantics.model.RenameGroup; import org.whole.lang.semantics.model.RuleName; import org.whole.lang.semantics.model.Rules; import org.whole.lang.semantics.model.SemanticFunction; import org.whole.lang.semantics.model.SemanticFunctions; import org.whole.lang.semantics.model.SemanticTheory; import org.whole.lang.semantics.model.SequenceType; import org.whole.lang.semantics.model.StageChange; import org.whole.lang.semantics.model.StructuredVariable; import org.whole.lang.semantics.model.SubtypeType; import org.whole.lang.semantics.model.SupertypeType; import org.whole.lang.semantics.model.Transition; import org.whole.lang.semantics.model.TypeCast; import org.whole.lang.semantics.model.TypedVariable; import org.whole.lang.semantics.model.URI; import org.whole.lang.semantics.model.UnionType; import org.whole.lang.semantics.model.Variable; import org.whole.lang.semantics.model.VariableValue; import org.whole.lang.semantics.model.Version; import org.whole.lang.semantics.model.WhereTemplate; import org.whole.lang.semantics.reflect.SemanticsEntityDescriptorEnum; import org.whole.lang.semantics.reflect.SemanticsFeatureDescriptorEnum; import org.whole.lang.semantics.visitors.SemanticsIdentityDefaultVisitor; import org.whole.lang.ui.editparts.AbstractDataEntityPart; import org.whole.lang.ui.editparts.AnyTypePart; import org.whole.lang.ui.editparts.CompositeColumnWithPlaceholderPart; import org.whole.lang.ui.editparts.ContentDataEntityPart; import org.whole.lang.ui.editparts.ContentTextualEntityPart; import org.whole.lang.ui.editparts.EntityTypePart; import org.whole.lang.ui.editparts.EnvTypePart; import org.whole.lang.ui.editparts.FunctionNamePart; import org.whole.lang.ui.editparts.IEditPartFactory; import org.whole.lang.ui.editparts.LanguageTypePart; import org.whole.lang.ui.editparts.LiteralDataEntityPart; import org.whole.lang.ui.editparts.ModuleNameTextualEntityPart; import org.whole.lang.ui.editparts.ModuleNamespaceTextualEntityPart; import org.whole.lang.ui.editparts.PlaceHolderPart; import org.whole.lang.ui.editparts.SmallContentTextualEntityPart; import org.whole.lang.ui.editparts.SmallIdentifierTextualEntityPart; import org.whole.lang.ui.editparts.VariableDataEntityPart; import org.whole.lang.ui.figures.LabelFactory; import org.whole.lang.ui.notations.text.editparts.DefaultTextualPartFactory; import org.whole.lang.util.EntityUtils; /** * @author Riccardo Solmi */ public class SemanticsPartFactoryVisitor extends SemanticsIdentityDefaultVisitor implements IEditPartFactory { protected EditPart part, context; public EditPart createEditPart(EditPart context, Object modelEntity) { this.context = context; ((ISemanticsEntity) modelEntity).accept(this); return part; } @Override public boolean visitAdapter(IEntityAdapter entity) { part = new PlaceHolderPart(); return super.visitAdapter(entity); } @Override public void visit(ISemanticsEntity entity) { part = DefaultTextualPartFactory.instance().createEditPart(context, entity); } @Override public void visit(SemanticTheory entity) { part = new SemanticTheoryPart(); } @Override public void visit(SemanticFunctions entity) { part = new CompositeColumnWithPlaceholderPart(); } @Override public void visit(SemanticFunction entity) { part = new SemanticFunctionPart(); } @Override public void visit(Rules entity) { part = new ChooseTablePart(); } @Override public void visit(InferenceRules entity) { part = new InferenceRulesTablePart(); } @Override public void visit(ExecutionRule entity) { part = new ExecutionRulePart(); } @Override public void visit(InferenceRule entity) { part = new InferenceRulePart(); } @Override public void visit(Premises entity) { part = new PremisesPart(); } @Override public void visit(Transition entity) { part = new TransitionPart(); } @Override public void visit(Configuration entity) { part = new ConfigurationPart(); } @Override public void visit(BindingsScope entity) { part = new BindingsScopePart(); } @Override public void visit(LocalBindings entity) { part = new BindingsTablePart(); } @Override public void visit(LocalBinding entity) { part = new LocalBindingPart(); } @Override public void visit(BindingOp entity) { part = new ContentDataEntityPart(); } @Override public void visit(EnvironmentVariable entity) { part = new EnvironmentVariablePart(); } @Override public void visit(TypeCast entity) { part = new TypeCastPart(); } @Override public void visit(FunctionApplication entity) { part = new FunctionApplicationPart(); } @Override public void visit(StageChange entity) { part = new AbstractDataEntityPart() { public IFigure createFigure() { return LabelFactory.createMonospaceSmall(); } }; } @Override public void visit(EnvironmentType entity) { part = new EnvironmentTypePart(); } @Override public void visit(LegacyType entity) { part = new LiteralDataEntityPart(); } @Override public void visit(EntityType entity) { part = new EntityTypePart(); } @Override public void visit(AnyType entity) { part = new AnyTypePart(); } @Override public void visit(EnvType entity) { part = new EnvTypePart(); } @Override public void visit(LanguageType entity) { part = new LanguageTypePart(); } @Override public void visit(UnionType entity) { part = new UnionTypePart(); } @Override public void visit(FunctionType entity) { part = new FunctionTypePart(); } @Override public void visit(ProductType entity) { part = new ProductTypePart(); } @Override public void visit(SequenceType entity) { part = new SequenceTypePart(); } @Override public void visit(SubtypeType entity) { part = new SubtypeTypePart(); } @Override public void visit(SupertypeType entity) { part = new SupertypeTypePart(); } @Override public void visit(TypedVariable entity) { part = new TypedVariablePart(); } @Override public void visit(Variable entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(SemanticsEntityDescriptorEnum.StructuredVariable, parent) || Matcher.match(SemanticsEntityDescriptorEnum.TypedVariable, parent) || Matcher.match(SemanticsEntityDescriptorEnum.OutputBinding, parent)) { part = new VariableDataEntityPart(); return; } } part = new VariablePart(); } @Override public void visit(VariableValue entity) { part = new VariableValuePart(); } @Override public void visit(Name entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(SemanticsEntityDescriptorEnum.FunctionApplication, parent)) { part = new FunctionNamePart(); return; } else if (Matcher.match(SemanticsEntityDescriptorEnum.RuleName, parent) && (parent.wGet(SemanticsFeatureDescriptorEnum.sup) == entity || parent.wGet(SemanticsFeatureDescriptorEnum.sub) == entity)) { part = new SmallContentTextualEntityPart(); return; } else if (Matcher.match(SemanticsEntityDescriptorEnum.SemanticTheory, parent)) { part = new ModuleNameTextualEntityPart(); return; } } part = new ContentTextualEntityPart(); } @Override public void visit(Num entity) { part = new SmallIdentifierTextualEntityPart(); } @Override public void visit(StructuredVariable entity) { part = new StructuredVariablePart(); } @Override public void visit(RenameGroup entity) { part = new CompositeColumnWithPlaceholderPart(); } @Override public void visit(Rename entity) { part = new RenamePart(); } @Override public void visit(RuleName entity) { part = new RuleNamePart(); } @Override public void visit(OutputBindings entity) { part = new OutputBindingsTablePart(); } @Override public void visit(OutputBinding entity) { part = new OutputBindingRowPart(); } @Override public void visit(InputBindings entity) { part = new InputBindingsTablePart(); } @Override public void visit(InputBinding entity) { part = new InputBindingRowPart(); } @Override public void visit(InlineTemplate entity) { part = new InlineTemplatePart(); }; @Override public void visit(ChooseTemplate entity) { part = new ChooseTemplateTablePart(); } @Override public void visit(WhereTemplate entity) { part = new WhereTemplatePart(); } @Override public void visit(ForTemplate entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(SemanticsEntityDescriptorEnum.ChooseTemplate, parent)) { part = new ForTemplateRowPart(); return; } } part = new ForTemplatePart(); } @Override public void visit(IfTemplate entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(SemanticsEntityDescriptorEnum.ChooseTemplate, parent)) { part = new IfTemplateRowPart(); return; } } part = new IfTemplatePart(); } @Override public void visit(IfDefTemplate entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(SemanticsEntityDescriptorEnum.ChooseTemplate, parent)) { part = new IfDefTemplateRowPart(); return; } } part = new IfDefTemplatePart(); }; @Override public void visit(ElseTemplate entity) { part = new ElseTemplateRowPart(); } public void visit(URI entity) { part = new ContentTextualEntityPart(); } public void visit(Namespace entity) { part = new ModuleNamespaceTextualEntityPart(); } public void visit(Version entity) { part = new ContentTextualEntityPart(); } }