package org.eclipse.uml2.diagram.sequence.internal.layout.manage; import java.util.ArrayList; import org.eclipse.gef.EditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart; import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsLink; import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNode; import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.gef.AbsDiagramGef; import org.eclipse.uml2.diagram.sequence.internal.layout.model.SdLayoutModelAddRemoveProcessor; class UpdateEventAccumulator { public UpdateEventAccumulator(AbsDiagramGef.AbsElementFactory absElementFactory, EditPart rootEditPart) { myAbsElementFactory = absElementFactory; //assert assertAsserterSwitched(rootEditPart); } abstract class UpdateEvent { abstract public void process(SdLayoutModelAddRemoveProcessor processor); } class AddNode extends UpdateEvent { AddNode(GraphicalEditPart editPart) { myNode = myAbsElementFactory.createAbsNode(editPart); } public void process(SdLayoutModelAddRemoveProcessor processor) { processor.processAddedGdeNode(myNode); } final AbsNode myNode; } class RemoveNode extends UpdateEvent { RemoveNode(GraphicalEditPart editPart) { myNode = myAbsElementFactory.createAbsNode(editPart); } public void process(SdLayoutModelAddRemoveProcessor processor) { processor.processRemovedGdeNode(myNode); } final AbsNode myNode; } class AddLink extends UpdateEvent { AddLink(ConnectionEditPart editPart) { myLink = myAbsElementFactory.createAbsLink(editPart); } public void process(SdLayoutModelAddRemoveProcessor processor) { processor.processAddedGdeLink(myLink); } final AbsLink myLink; } class RemoveLink extends UpdateEvent { RemoveLink(ConnectionEditPart editPart) { myLink = myAbsElementFactory.createAbsLink(editPart); } public void process(SdLayoutModelAddRemoveProcessor processor) { processor.processRemovedGdeLink(myLink); } final AbsLink myLink; } public void elementAdded(IGraphicalEditPart element) { if (isUnsupported(element)) { return; } if (element instanceof ConnectionEditPart) { myEvents.add(new AddLink((ConnectionEditPart)element)); } else if (element instanceof GraphicalEditPart) { GraphicalEditPart modelNodeEditPart = (GraphicalEditPart)element; myAsserterRunner.nodeAdded(modelNodeEditPart); myEvents.add(new AddNode(modelNodeEditPart)); } } public void elementRemoved(IGraphicalEditPart element) { if (isUnsupported(element)) { return; } if (element instanceof ConnectionEditPart) { myEvents.add(new RemoveLink((ConnectionEditPart)element)); } else if (element instanceof GraphicalEditPart) { GraphicalEditPart modelNodeEditPart = (GraphicalEditPart)element; myAsserterRunner.nodeRemoved(modelNodeEditPart); myEvents.add(new RemoveNode(modelNodeEditPart)); } } /** * All except diagram and interaction */ boolean isUnsupported(IGraphicalEditPart element) { return element instanceof DiagramEditPart || element instanceof ITextAwareEditPart; } public void accept(SdLayoutModelAddRemoveProcessor processor) { try { for (int i=0; i<myEvents.size(); i++) { ((UpdateEvent)myEvents.get(i)).process(processor); } } finally { processor.finish(); } } public void clear() { myEvents.clear(); } // /** // * This method will be invoked if asserts are enabled. Doesn't actually assert anything. // */ // private boolean assertAsserterSwitched(final EditPart rootEditPart) { // myAsserterRunner = new AsserterRunner() { // final UpdateConsistencyAsserter myAsserter = new UpdateConsistencyAsserter(rootEditPart); // void nodeAdded(GraphicalEditPart nodeEditPart) { // myAsserter.nodeAdded(nodeEditPart); // } // void nodeRemoved(GraphicalEditPart nodeEditPart) { // myAsserter.nodeRemoved(nodeEditPart); // } // }; // return true; // } private final AbsDiagramGef.AbsElementFactory myAbsElementFactory; private final ArrayList<UpdateEvent> myEvents = new ArrayList<UpdateEvent>(); private AsserterRunner myAsserterRunner = AsserterRunner.STUB; private static abstract class AsserterRunner { abstract void nodeAdded(GraphicalEditPart nodeEditPart); abstract void nodeRemoved(GraphicalEditPart nodeEditPart); static final AsserterRunner STUB = new AsserterRunner() { void nodeAdded(GraphicalEditPart nodeEditPart) {} void nodeRemoved(GraphicalEditPart nodeEditPart) {} }; } }