/** * 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.queries.ui.editparts; import org.eclipse.draw2d.IFigure; import org.eclipse.gef.EditPart; import org.whole.lang.commons.parsers.CommonsDataTypePersistenceParser; import org.whole.lang.matchers.Matcher; import org.whole.lang.model.IEntity; import org.whole.lang.model.adapters.IEntityAdapter; import org.whole.lang.queries.model.*; import org.whole.lang.queries.reflect.QueriesEntityDescriptorEnum; import org.whole.lang.queries.reflect.QueriesFeatureDescriptorEnum; import org.whole.lang.queries.ui.figures.CollectByExpressionFigure; import org.whole.lang.queries.visitors.QueriesIdentityDefaultVisitor; import org.whole.lang.reflect.EntityDescriptor; import org.whole.lang.ui.editparts.CommaSeparatedCompositeColumnPart; import org.whole.lang.ui.editparts.CommaSeparatedCompositeFlowPart; import org.whole.lang.ui.editparts.CompositeColumnWithPlaceholderPart; import org.whole.lang.ui.editparts.ContentLightDataEntityPart; import org.whole.lang.ui.editparts.ContentTextualEntityPart; import org.whole.lang.ui.editparts.EntityTypePart; import org.whole.lang.ui.editparts.FeatureTypePart; import org.whole.lang.ui.editparts.IEditPartFactory; import org.whole.lang.ui.editparts.KeywordDataEntityPart; import org.whole.lang.ui.editparts.PlaceHolderPart; import org.whole.lang.ui.editparts.VariableDataEntityPart; import org.whole.lang.ui.notations.editparts.QuotedStringTextualEntityPart; import org.whole.lang.ui.notations.text.editparts.TextPartFactory; import org.whole.lang.util.DataTypeUtils; import org.whole.lang.util.EntityUtils; /** * @author Riccardo Solmi */ public class QueriesPartFactoryVisitor extends QueriesIdentityDefaultVisitor implements IEditPartFactory { protected EditPart part, context; public EditPart createEditPart(EditPart context, Object modelEntity) { this.context = context; ((IQueriesEntity) modelEntity).accept(this); return part; } @Override public boolean visitAdapter(IEntityAdapter entity) { part = new PlaceHolderPart(); return super.visitAdapter(entity); } @Override public void visit(IQueriesEntity entity) { part = TextPartFactory.instance().createEditPart(context, entity); } @Override public void visit(QueryDeclaration entity) { part = new QueryDeclarationPart(); } @Override public void visit(Names entity) { part = new CommaSeparatedCompositeFlowPart(); } @Override public void visit(Name entity) { IEntity parent = entity.wGetParent(); if (EntityUtils.hasParent(entity) && Matcher.match(QueriesEntityDescriptorEnum.Bind, parent) && parent.wGet(QueriesFeatureDescriptorEnum.name) == entity) part = new ContentTextualEntityPart(); else part = new VariableDataEntityPart();//IdentifierTextualEntityPart(); } @Override public void visit(Expressions entity) { IEntity parent = entity.wGetParent(); if (EntityUtils.hasParent(entity)) { if (Matcher.match(QueriesEntityDescriptorEnum.EntityTemplate, parent)) { part = new CompositeColumnWithPlaceholderPart(); return; } else if (Matcher.match(QueriesEntityDescriptorEnum.UnionAll, parent) || Matcher.isAssignableAsIsFrom(QueriesEntityDescriptorEnum.CollectByExpression, parent)) { part = new CommaSeparatedCompositeColumnPart(); return; } } part = new CommaSeparatedCompositeFlowPart(); } @Override public void visit(Tuple entity) { part = new TuplePart(); } @Override public void visit(Path entity) { part = new PathPart(); } @Override public void visit(Delete entity) { part = new DeletePart(); } @Override public void visit(CartesianInsert entity) { part = new CartesianInsertPart(); } @Override public void visit(PointwiseInsert entity) { part = new PointwiseInsertPart(); } @Override public void visit(Placement entity) { part = new KeywordDataEntityPart(); } @Override public void visit(CartesianUpdate entity) { part = new CartesianUpdatePart(); } @Override public void visit(PointwiseUpdate entity) { part = new PointwiseUpdatePart(); } @Override public void visit(Select entity) { IEntity parent = entity.wGetParent(); if (Matcher.match(QueriesEntityDescriptorEnum.Choose, parent)) part = new SelectRowPart(); else part = new SelectPart(); } @Override public void visit(If entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(QueriesEntityDescriptorEnum.Choose, parent)) { part = new IfRowPart(); return; } } part = new IfPart(); } @Override public void visit(For entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(QueriesEntityDescriptorEnum.Choose, parent)) { part = new ForRowPart(); return; } } part = new ForPart(); } @Override public void visit(CartesianProduct entity) { part = new CartesianProductPart(); } @Override public void visit(PointwiseProduct entity) { part = new PointwiseProductPart(); } @Override public void visit(Choose entity) { part = new ChooseTablePart(); } @Override public void visit(Block entity) { part = new BlockPart(); } @Override public void visit(Sequence entity) { part = new SequencePart(); } @Override public void visit(Call entity) { part = new CallPart(); } @Override public void visit(EntityCall entity) { part = new EntityCallPart(); } @Override public void visit(EntityTemplate entity) { EntityType name = entity.getName(); if (DataTypeUtils.getDataKind(name).isString()) { EntityDescriptor<?> ed = CommonsDataTypePersistenceParser.getEntityDescriptor(name.getValue(), false, null); if (ed != null && ed.getEntityKind().isData()) { part = new EntityTemplateInlinePart(); return; } } part = new EntityTemplatePart(); } @Override public void visit(EntityType entity) { part = new EntityTypePart(); } @Override public void visit(Bindings entity) { part = new BindingsTablePart(); } @Override public void visit(Bind entity) { part = new BindPart(); } @Override public void visit(Do entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(QueriesEntityDescriptorEnum.Choose, parent)) { part = new DoRowPart(); return; } } part = new DoPart(); } @Override public void visit(Filter entity) { if (EntityUtils.hasParent(entity)) { IEntity parent = entity.wGetParent(); if (Matcher.match(QueriesEntityDescriptorEnum.Tuple, parent)) { part = new FilterRowPart(); return; } } part = new FilterPart(); } @Override public void visit(AspectStep entity) { part = new AspectStepPart(); } @Override public void visit(AdjacentStep entity) { part = new AdjacentStepPart(); } @Override public void visit(ReachableStep entity) { part = new ReachableStepPart(); } @Override public void visit(ReachableOrSelfStep entity) { part = new ReachableOrSelfStepPart(); } @Override public void visit(InverseAdjacentStep entity) { part = new InverseAdjacentStepPart(); } @Override public void visit(InverseReachableStep entity) { part = new InverseReachableStepPart(); } @Override public void visit(InverseReachableOrSelfStep entity) { part = new InverseReachableOrSelfStepPart(); } @Override public void visit(RootStep entity) { part = new RootStepPart(); } @Override public void visit(FragmentRootStep entity) { part = new FragmentRootStepPart(); } @Override public void visit(SelfStep entity) { part = new SelfStepPart(); } @Override public void visit(FeatureStep entity) { part = new FeatureTypePart(); } @Override public void visit(ChildStep entity) { part = new ChildStepPart(); } @Override public void visit(DescendantStep entity) { part = new DescendantStepPart(); } @Override public void visit(DescendantOrSelfStep entity) { part = new DescendantOrSelfStepPart(); } @Override public void visit(FollowingSiblingStep entity) { part = new FollowingSiblingStepPart(); } @Override public void visit(FollowingStep entity) { part = new FollowingStepPart(); } @Override public void visit(ParentStep entity) { part = new ParentStepPart(); } @Override public void visit(AncestorStep entity) { part = new AncestorStepPart(); } @Override public void visit(AncestorOrSelfStep entity) { part = new AncestorOrSelfStepPart(); } @Override public void visit(PrecedingSiblingStep entity) { part = new PrecedingSiblingStepPart(); } @Override public void visit(PrecedingStep entity) { part = new PrecedingStepPart(); } @Override public void visit(KindTest entity) { part = new ContentLightDataEntityPart(); } @Override public void visit(StageTest entity) { part = new ContentLightDataEntityPart(); } @Override public void visit(StageVariableTest entity) { part = new StageVariableTestPart(); } @Override public void visit(LanguageTest entity) { part = new LanguageTestPart(); } @Override public void visit(TypeTest entity) { part = new TypeTestPart(); } @Override public void visit(SubtypeTest entity) { part = new SubtypeTestPart(); } @Override public void visit(SupertypeTest entity) { part = new SupertypeTestPart(); } @Override public void visit(ExtendedSubtypeTest entity) { part = new ExtendedSubtypeTestPart(); } @Override public void visit(ExtendedSupertypeTest entity) { part = new ExtendedSupertypeTestPart(); } @Override public void visit(AtTypeTest entity) { part = new AtTypeTestPart(); } @Override public void visit(AtFeatureTest entity) { part = new AtFeatureTestPart(); } @Override public void visit(AtIndexTest entity) { part = new AtIndexTestPart(); } @Override public void visit(IndexVariableTest entity) { part = new IndexVariableTestPart(); } @Override public void visit(IndexTest entity) { part = new IndexTestPart(); } @Override public void visit(IndexRangeTest entity) { part = new IndexRangeTestPart(); } @Override public void visit(StringLiteral entity) { part = new QuotedStringTextualEntityPart(); } @Override public void visit(VoidLiteral entity) { part = new VoidLiteralPart(); } @Override public void visit(ExpressionTest entity) { part = new ExpressionTestPart(); } @Override public void visit(VariableRefStep entity) { part = new VariableDataEntityPart(); } @Override public void visit(VariableTest entity) { // IEntity parent = entity.wGetParent(); // boolean hasParent = EntityUtils.hasParent(entity); // boolean isBindContext = hasParent && Matcher.match(QueriesEntityDescriptorEnum.Bind, parent); // boolean isAndContext = hasParent & Matcher.match(QueriesEntityDescriptorEnum.And, parent); // boolean isAnd2Context = false; // if (isAndContext) { // int indexOf = parent.wIndexOf(entity); // isAnd2Context = indexOf > 0 && indexOf == parent.wSize()-1; // } // // //TODO !isAnd2StarContext // if (isAnd2Context) // context = context.getParent(); EditPart contextParent = context.getParent(); boolean isFilterContext = (context instanceof FilterPart) || (context instanceof FilterRowPart); boolean isFilterInPath = isFilterContext && contextParent instanceof PathPart; boolean isFilterLastChild = false; if (isFilterInPath) { IEntity path = ((PathPart) contextParent).getModelEntity(); isFilterLastChild = path.wGet(path.wSize()-1) == context.getModel(); } // final boolean showBrackets = !isBindContext && (!isFilterContext || (isFilterInPath && !isFilterLastChild)); part = new VariableTestPart(isFilterInPath && !isFilterLastChild);//showBrackets); } @Override public void visit(DistinctTest entity) { part = new DistinctTestPart(); } @Override public void visit(Prune entity) { part = new PrunePart(); } @Override public void visit(And entity) { part = new AndPart(); } @Override public void visit(Or entity) { part = new OrPart(); } @Override public void visit(Not entity) { part = new NotPart(); } @Override public void visit(One entity) { part = new OnePart(); } @Override public void visit(Some entity) { part = new SomePart(); } @Override public void visit(Every entity) { part = new EveryPart(); } @Override public void visit(ParenthesizedPredicate entity) { part = new ParenthesizedPredicatePart(); } @Override public void visit(UnionAll entity) { part = new UnionAllPart(); } @Override public void visit(Union entity) { part = new CollectByExpressionPart() { protected IFigure createFigure() { return new CollectByExpressionFigure("\u222a"); } }; } @Override public void visit(Intersect entity) { part = new CollectByExpressionPart() { protected IFigure createFigure() { return new CollectByExpressionFigure("\u2229"); } }; } @Override public void visit(Except entity) { part = new CollectByExpressionPart() { protected IFigure createFigure() { return new CollectByExpressionFigure("\u2216"); } }; } @Override public void visit(IdentityComparator entity) { part = new IdentityComparatorPart(); } @Override public void visit(PointwiseEquals entity) { part = new PointwiseEqualsPart(); } @Override public void visit(AdditionStep entity) { part = new PrefixExpressionPart("+"); } @Override public void visit(SubtractionStep entity) { part = new PrefixExpressionPart("-"); } @Override public void visit(MultiplicationStep entity) { part = new PrefixExpressionPart("*"); } @Override public void visit(DivisionStep entity) { part = new PrefixExpressionPart("/"); } @Override public void visit(RemainderStep entity) { part = new PrefixExpressionPart("%"); } @Override public void visit(EqualsStep entity) { part = new PrefixExpressionPart("=="); } @Override public void visit(NotEqualsStep entity) { part = new PrefixExpressionPart("!="); } @Override public void visit(LessThanStep entity) { part = new PrefixExpressionPart("<"); } @Override public void visit(LessOrEqualsStep entity) { part = new PrefixExpressionPart("<="); } @Override public void visit(GreaterThanStep entity) { part = new PrefixExpressionPart(">"); } @Override public void visit(GreaterOrEqualsStep entity) { part = new PrefixExpressionPart(">="); } @Override public void visit(Addition entity) { part = new InfixExpressionPart("+"); } @Override public void visit(Subtraction entity) { part = new InfixExpressionPart("-"); } @Override public void visit(Multiplication entity) { part = new InfixExpressionPart("*"); } @Override public void visit(Division entity) { part = new InfixExpressionPart("/"); } @Override public void visit(Remainder entity) { part = new InfixExpressionPart("%"); } @Override public void visit(Equals entity) { part = new InfixExpressionPart("=="); } @Override public void visit(NotEquals entity) { part = new InfixExpressionPart("!="); } @Override public void visit(LessThan entity) { part = new InfixExpressionPart("<"); } @Override public void visit(LessOrEquals entity) { part = new InfixExpressionPart("<="); } @Override public void visit(GreaterThan entity) { part = new InfixExpressionPart(">"); } @Override public void visit(GreaterOrEquals entity) { part = new InfixExpressionPart(">="); } @Override public void visit(Singleton entity) { part = new SingletonPart(); } @Override public void visit(Scope entity) { part = new ScopePart(); } @Override public void visit(AllNames entity) { part = new AllNamesPart(); } @Override public void visit(TemplateNames entity) { part = new TemplateNamesPart(); } @Override public void visit(AddNames entity) { part = new AddNamesPart(); } @Override public void visit(RemoveNames entity) { part = new RemoveNamesPart(); } }