/**
* 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.frames.ui.editparts;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.gef.EditPart;
import org.whole.lang.features.ui.editparts.AttributeRightPart;
import org.whole.lang.features.ui.editparts.CardinalityPart;
import org.whole.lang.features.ui.editparts.CloneGroupRightPart;
import org.whole.lang.features.ui.editparts.FeatureReferencePart;
import org.whole.lang.features.ui.editparts.FeatureRightPart;
import org.whole.lang.features.ui.editparts.FeaturesPart;
import org.whole.lang.features.ui.editparts.SubfeaturesRightPart;
import org.whole.lang.features.ui.editparts.SubsetGroupRightPart;
import org.whole.lang.features.ui.editparts.VariableFeatureRightPart;
import org.whole.lang.frames.events.FramesChangeEventHandler;
import org.whole.lang.frames.model.Advices;
import org.whole.lang.frames.model.After;
import org.whole.lang.frames.model.Around;
import org.whole.lang.frames.model.Attribute;
import org.whole.lang.frames.model.Before;
import org.whole.lang.frames.model.Cardinality;
import org.whole.lang.frames.model.CloneGroup;
import org.whole.lang.frames.model.ConditionPoint;
import org.whole.lang.frames.model.Domain;
import org.whole.lang.frames.model.Empty;
import org.whole.lang.frames.model.EntityType;
import org.whole.lang.frames.model.Exclude;
import org.whole.lang.frames.model.Feature;
import org.whole.lang.frames.model.FeatureName;
import org.whole.lang.frames.model.FeatureReference;
import org.whole.lang.frames.model.FeatureRename;
import org.whole.lang.frames.model.Features;
import org.whole.lang.frames.model.Frame;
import org.whole.lang.frames.model.IFramesEntity;
import org.whole.lang.frames.model.IncludePoint;
import org.whole.lang.frames.model.InlineContent;
import org.whole.lang.frames.model.Into;
import org.whole.lang.frames.model.IterationPoint;
import org.whole.lang.frames.model.JoinPoint;
import org.whole.lang.frames.model.MutuallyExclude;
import org.whole.lang.frames.model.MutuallyRequire;
import org.whole.lang.frames.model.Name;
import org.whole.lang.frames.model.Namespace;
import org.whole.lang.frames.model.Pointcut;
import org.whole.lang.frames.model.Relations;
import org.whole.lang.frames.model.Require;
import org.whole.lang.frames.model.ReusePoint;
import org.whole.lang.frames.model.SelectionPoint;
import org.whole.lang.frames.model.SolitaryFeatures;
import org.whole.lang.frames.model.Subfeatures;
import org.whole.lang.frames.model.SubsetGroup;
import org.whole.lang.frames.model.URI;
import org.whole.lang.frames.model.VariableFeature;
import org.whole.lang.frames.model.VariableFeatures;
import org.whole.lang.frames.model.Variants;
import org.whole.lang.frames.model.Version;
import org.whole.lang.frames.reflect.FramesEntityDescriptorEnum;
import org.whole.lang.frames.ui.figures.AdviceFigure;
import org.whole.lang.frames.visitors.FramesIdentityDefaultVisitor;
import org.whole.lang.matchers.Matcher;
import org.whole.lang.model.IEntity;
import org.whole.lang.ui.editparts.ContentLighterDataEntityPartWithRoundBrackets;
import org.whole.lang.ui.editparts.ContentTextualEntityPart;
import org.whole.lang.ui.editparts.DeclarationTextualEntityPart;
import org.whole.lang.ui.editparts.EntityTypePart;
import org.whole.lang.ui.editparts.IEditPartFactory;
import org.whole.lang.ui.editparts.IEntityPart;
import org.whole.lang.ui.editparts.IdentifierTextualEntityPart;
import org.whole.lang.ui.editparts.ModuleNameTextualEntityPart;
import org.whole.lang.ui.editparts.ModuleNamespaceTextualEntityPart;
import org.whole.lang.ui.figures.FigureConstants;
import org.whole.lang.ui.figures.RoundBracketsBorder;
import org.whole.lang.ui.notations.table.editparts.TablePartFactory;
import org.whole.lang.util.EntityUtils;
/**
* @author Riccardo Solmi
*/
public class FramesPartFactoryVisitor extends FramesIdentityDefaultVisitor implements IEditPartFactory {
protected EditPart part, context;
public EditPart createEditPart(EditPart context, Object modelEntity) {
this.context = context;
//for adaptive entities
if (!(modelEntity instanceof IFramesEntity))
modelEntity = ((IEntity) modelEntity).wGetAdaptee(false);
((IFramesEntity) modelEntity).accept(this);
return part;
}
public void visit(IFramesEntity entity) {
part = TablePartFactory.instance().createEditPart(context, entity);
}
@Override
public void visit(Name entity) {
IEntity parent = entity.wGetParent();
if (!EntityUtils.isNull(parent)) {
if (Matcher.match(FramesEntityDescriptorEnum.Frame, parent)) {
part = new ModuleNameTextualEntityPart();
return;
}
}
super.visit(entity);
}
public void visit(URI entity) {
part = new ContentTextualEntityPart();
}
public void visit(Namespace entity) {
part = new ModuleNamespaceTextualEntityPart();
}
public void visit(Version entity) {
part = new ContentTextualEntityPart();
}
protected FramesChangeEventHandler framesChangeEventHandler;
@Override
public void visit(Frame entity) {
part = new FramePart();
if (framesChangeEventHandler == null) {
framesChangeEventHandler = new FramesChangeEventHandler(((IEntityPart) context).getViewer().getContext());
entity.wGetModel().getCompoundModel().addChangeEventHandler(framesChangeEventHandler);
}
}
@Override
public void visit(Relations entity) {
// TODO Auto-generated method stub
super.visit(entity);
}
@Override
public void visit(Pointcut entity) {
part = new PointcutPart();
}
@Override
public void visit(JoinPoint entity) {
part = new JoinPointPart();
}
@Override
public void visit(ConditionPoint entity) {
IEntity parent = entity.wGetParent();
if (!EntityUtils.isNull(parent) &&
Matcher.match(FramesEntityDescriptorEnum.Variants, parent))
part = new ConditionPointRowPart();
else
part = new ConditionPointPart();
}
@Override
public void visit(IterationPoint entity) {
part = new IterationPointPart();
}
@Override
public void visit(SelectionPoint entity) {
part = new SelectionPointPart();
}
@Override
public void visit(Variants entity) {
part = new VariantsTablePart();
}
@Override
public void visit(ReusePoint entity) {
part = new ReusePointPart();
}
@Override
public void visit(IncludePoint entity) {
part = new IncludePointPart();
}
@Override
public void visit(Advices entity) {
part = new AdvicesPart();
}
@Override
public void visit(Before entity) {
part = new AdvicePart() {
@Override
protected IFigure createFigure() {
return new AdviceFigure("before");
}
};
}
@Override
public void visit(After entity) {
part = new AdvicePart() {
@Override
protected IFigure createFigure() {
return new AdviceFigure("after ");
}
};
}
@Override
public void visit(Around entity) {
part = new AdvicePart() {
@Override
protected IFigure createFigure() {
return new AdviceFigure("around");
}
};
}
@Override
public void visit(Into entity) {
part = new AdvicePart() {
@Override
protected IFigure createFigure() {
return new AdviceFigure("into ");
}
};
}
@Override
public void visit(Empty entity) {
part = new EmptyPart();
}
@Override
public void visit(InlineContent entity) {
part = new InlineContentPart();
}
@Override
public void visit(FeatureName entity) {
IEntity parent = entity.wGetParent();
if (EntityUtils.hasParent(entity)) {
if (Matcher.match(FramesEntityDescriptorEnum.Feature, parent) ||
Matcher.match(FramesEntityDescriptorEnum.FeatureRename, parent) ||
Matcher.match(FramesEntityDescriptorEnum.FeatureReference, parent) ||
Matcher.match(FramesEntityDescriptorEnum.Attribute, parent)) {
part = new DeclarationTextualEntityPart();
return;
}
}
part = new IdentifierTextualEntityPart();
}
@Override
public void visit(FeatureReference entity) {
part = new FeatureReferencePart();
}
@Override
public void visit(Feature entity) {
part = new FeatureRightPart();
}
@Override
public void visit(SubsetGroup entity) {
part = new SubsetGroupRightPart();
}
@Override
public void visit(CloneGroup entity) {
part = new CloneGroupRightPart();
}
@Override
public void visit(Features entity) {
part = new FeaturesPart();
}
@Override
public void visit(Subfeatures entity) {
part = new SubfeaturesRightPart();
}
@Override
public void visit(SolitaryFeatures entity) {
part = new SubfeaturesRightPart();
}
@Override
public void visit(VariableFeatures entity) {
part = new SubfeaturesRightPart();
}
@Override
public void visit(VariableFeature entity) {
part = new VariableFeatureRightPart();
}
@Override
public void visit(FeatureRename entity) {
part = new FeatureRenamePart();
}
@Override
public void visit(Attribute entity) {
part = new AttributeRightPart();
}
@Override
public void visit(Cardinality entity) {
part = new CardinalityPart();
}
@Override
public void visit(Domain entity) {
part = new ContentLighterDataEntityPartWithRoundBrackets();
}
@Override
public void visit(EntityType entity) {
part = new EntityTypePart() {
public IFigure createFigure() {
IFigure f = super.createFigure();
f.setBorder(new RoundBracketsBorder() {
@Override
protected void setBracketsStyle(Graphics g) {
g.setForegroundColor(FigureConstants.contentLighterColor);
}
});
return f;
}
};
}
@Override
public void visit(MutuallyRequire entity) {
// TODO Auto-generated method stub
super.visit(entity);
}
@Override
public void visit(MutuallyExclude entity) {
// TODO Auto-generated method stub
super.visit(entity);
}
@Override
public void visit(Require entity) {
// TODO Auto-generated method stub
super.visit(entity);
}
@Override
public void visit(Exclude entity) {
// TODO Auto-generated method stub
super.visit(entity);
}
}