package com.isencia.passerelle.workbench.model.editor.ui.editpart; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ptolemy.actor.CompositeActor; import ptolemy.actor.IOPort; import ptolemy.data.expr.Parameter; import ptolemy.kernel.Entity; import ptolemy.kernel.Relation; import ptolemy.kernel.util.NamedObj; import ptolemy.moml.Vertex; import ptolemy.vergil.kernel.attributes.TextAttribute; import com.isencia.passerelle.editor.common.model.LinkHolder; import com.isencia.passerelle.workbench.model.editor.ui.editor.PasserelleModelMultiPageEditor; /** * Provides support for Container EditParts. */ abstract public class ContainerEditPart extends AbstractBaseEditPart { private final static Logger LOGGER = LoggerFactory.getLogger(ContainerEditPart.class); private PasserelleModelMultiPageEditor editor; private boolean showChildren = true; // This actor will be used as offset. It's not possible to have multiple editors with different model private CompositeActor actor; public CompositeActor getCompositeActor() { return actor; } public ContainerEditPart(PasserelleModelMultiPageEditor editor, CompositeActor actor) { super(); this.editor = editor; this.actor = actor; } public ContainerEditPart(PasserelleModelMultiPageEditor editor, boolean showChildren) { super(); this.editor = editor; this.showChildren = showChildren; } /** * Installs the desired EditPolicies for this. */ protected void createEditPolicies() { } /** * Returns the model of this as a CompositeActor. * * @return CompositeActor of this. */ protected CompositeActor getModelDiagram(CompositeActor actor) { return actor != null ? actor : (CompositeActor) getModel(); } /** * Returns the children of this through the model. * * @return Children of this as a List. */ @SuppressWarnings("unchecked") protected List<NamedObj> getModelChildren() { if (!showChildren) { return Collections.emptyList(); } CompositeActor modelDiagram = getModelDiagram(actor); if (editor != null) { try { CompositeActor selectedActor = editor.getSelectedContainer(); if (selectedActor != null && !containsActor(selectedActor, actor)) { modelDiagram = selectedActor; } } catch (Exception e) { LOGGER.error("Error getting container model object", e); } } List<NamedObj> children = new ArrayList<NamedObj>(); LinkHolder linkHolder = getLinkHolder(); if (linkHolder != null) { linkHolder.generateLinks(modelDiagram); } List<NamedObj> entities = modelDiagram.entityList(); if (entities != null) { children.addAll(entities); } if (modelDiagram.getContainer() == null && modelDiagram.getDirector() != null) { children.add(modelDiagram.getDirector()); } children.addAll(modelDiagram.attributeList(Parameter.class)); children.addAll(modelDiagram.attributeList(TextAttribute.class)); children.addAll(modelDiagram.attributeList(IOPort.class)); children.addAll(modelDiagram.inputPortList()); children.addAll(modelDiagram.outputPortList()); List<Relation> relations = modelDiagram.relationList(); for (Relation relation : relations) { children.addAll(getVertexModelChildren(relation)); } return children; } public LinkHolder getLinkHolder() { DiagramEditPart diagram = (this instanceof DiagramEditPart) ? (DiagramEditPart) this: getDiagram(); return diagram.getMultiPageEditorPart(); } @SuppressWarnings("unchecked") protected List<NamedObj> getVertexModelChildren(Relation relation) { List<NamedObj> children = new ArrayList<NamedObj>(); children.addAll(relation.attributeList(Vertex.class)); return children; } public boolean containsActor(CompositeActor parent, CompositeActor child) { @SuppressWarnings("unchecked") List<Entity> entities = parent.entityList(); for (Entity el : entities) { if (el == child) { return true; } if (el instanceof CompositeActor) { if (containsActor((CompositeActor) el, child)) { return true; } } } return false; } }