diff options
Diffstat (limited to 'deprecated/deprecated-plugins/uml.deprecated/org.eclipse.papyrus.diagram.sequence/custom-src/org/eclipse/papyrus/diagram/sequence/util/InteractionViewInitializationUtil.java')
-rw-r--r-- | deprecated/deprecated-plugins/uml.deprecated/org.eclipse.papyrus.diagram.sequence/custom-src/org/eclipse/papyrus/diagram/sequence/util/InteractionViewInitializationUtil.java | 1110 |
1 files changed, 1110 insertions, 0 deletions
diff --git a/deprecated/deprecated-plugins/uml.deprecated/org.eclipse.papyrus.diagram.sequence/custom-src/org/eclipse/papyrus/diagram/sequence/util/InteractionViewInitializationUtil.java b/deprecated/deprecated-plugins/uml.deprecated/org.eclipse.papyrus.diagram.sequence/custom-src/org/eclipse/papyrus/diagram/sequence/util/InteractionViewInitializationUtil.java new file mode 100644 index 00000000000..15b5a497a30 --- /dev/null +++ b/deprecated/deprecated-plugins/uml.deprecated/org.eclipse.papyrus.diagram.sequence/custom-src/org/eclipse/papyrus/diagram/sequence/util/InteractionViewInitializationUtil.java @@ -0,0 +1,1110 @@ +/*************************************************************************** + * Copyright (c) 2008 Conselleria de Infraestructuras y Transporte, + * Generalitat de la Comunitat Valenciana . All rights reserved. This program + * and the accompanying materials are made available under the terms of the + * Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: Francisco Javier Cano Muñoz - Initial API implementation + * + ******************************************************************************/ +package org.eclipse.papyrus.diagram.sequence.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; +import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.emf.common.util.BasicEList; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.gef.Request; +import org.eclipse.gef.RequestConstants; +import org.eclipse.gef.commands.Command; +import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand; +import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; +import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest.ConnectionViewDescriptor; +import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor; +import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter; +import org.eclipse.gmf.runtime.emf.type.core.IElementType; +import org.eclipse.gmf.runtime.notation.Diagram; +import org.eclipse.gmf.runtime.notation.Node; +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.uml2.uml.BehaviorExecutionSpecification; +import org.eclipse.uml2.uml.Element; +import org.eclipse.uml2.uml.Interaction; +import org.eclipse.uml2.uml.Lifeline; +import org.eclipse.uml2.uml.Message; +import org.eclipse.uml2.uml.MessageOccurrenceSpecification; +import org.eclipse.uml2.uml.MessageSort; +import org.eclipse.uml2.uml.Package; + +import org.eclipse.papyrus.diagram.common.commands.AddEObjectReferencesToDiagram; +import org.eclipse.papyrus.diagram.common.command.wrappers.GEFtoEMFCommandWrapper; +import org.eclipse.papyrus.diagram.common.commands.GMFToEMFCommand; +import org.eclipse.papyrus.diagram.sequence.edit.parts.BehaviorExecutionSpecificationEditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.Interaction2EditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.InteractionEditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.LifelineEditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.Message2EditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.Message3EditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.Message4EditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.Message5EditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.Message6EditPart; +import org.eclipse.papyrus.diagram.sequence.edit.parts.MessageEditPart; +import org.eclipse.papyrus.diagram.sequence.part.UMLDiagramEditorPlugin; +import org.eclipse.papyrus.diagram.sequence.part.UMLLinkDescriptor; +import org.eclipse.papyrus.diagram.sequence.providers.UMLElementTypes; + +public class InteractionViewInitializationUtil { + + /** + * Helper classes for location and size data + */ + public class InitDataFigure { + EObject eObject = null; + List<InitDataFigure> children = null; + } + + /** + * A <Node> size and location data. + * + * @author fjcano + * + */ + public class NodeInitDataFigure extends InitDataFigure { + Point size = null; + Point location = null; + } + + /** + * An <Edge> start and end data. + * + * @author fjcano + * + */ + public class EdgeInitDataFigure extends InitDataFigure { + Point start = null; + Point end = null; + } + + /* + * + */ + + // //** Constants and fixed values **//// + protected static final int Interaction_Minimun_Size_X = 400; + protected static final int Interaction_Minimun_Size_Y = 250; + protected static final int Interaction_Offset_X = 40; + protected static final int Interaction_Offset_Y = 40; + protected static final int Interaction_Title_Size = 20; + + protected static final int Lifeline_Minimun_Size_X = 100; + protected static final int Lifeline_Minimun_Size_Y = 100; + protected static final int Lifeline_Offset_X = 20; + protected static final int Lifeline_Title_Size = 20; + + protected static final int BES_Minimun_Size_X = 16; + protected static final int BES_Minimun_Size_Y = 60; + protected static final int BES_Offset_X = 20; + + protected static final int Message_Slot_Size_Y = 40; + protected static final int Message_BES_Offset = 10; + + // //** General, auxiliary functions and methods for initializing an + // interaction with Lifelines, Behaviour Execution Specifications and + // Messages **//// + + private static final InteractionViewInitializationUtil INSTANCE = new InteractionViewInitializationUtil(); + + protected static int getTotalMessagesSize( + List<List<Message>> orderedMessages) { + if (orderedMessages == null) { + return 0; + } + return orderedMessages.size(); + } + + /** + * Main size initialization method. + * + * @param interaction + * @param orderedMessages + * @return + */ + public static NodeInitDataFigure calculateInteractionInitData( + Interaction interaction, List<List<Message>> orderedMessages, + Point offset) { + // Interaction initialization data. + NodeInitDataFigure interactionInitDataFigure = INSTANCE.new NodeInitDataFigure(); + // set Interaction + interactionInitDataFigure.eObject = interaction; + // prepare children's list + interactionInitDataFigure.children = new ArrayList<InitDataFigure>(); + // set Interaction real size + Point size = new Point(0, 0); + size.x = calculateInterationWidth(interaction, orderedMessages); + size.y = calculateInteractionHeight(interaction, orderedMessages); + interactionInitDataFigure.size = size; + interactionInitDataFigure.location = new Point(0, 0); + // add Lifelines initialization data. + addLifelinesToInteraction(interactionInitDataFigure, orderedMessages); + // add Messages and BES + addMessagesAndBESToInteraction(interactionInitDataFigure, + orderedMessages); + addOffsetToDataFigure(interactionInitDataFigure, offset); + return interactionInitDataFigure; + } + + protected static void addOffsetToDataFigure(InitDataFigure dataFigure, + Point offset) { + if (dataFigure == null || offset == null + || (offset.x == 0 && offset.y == 0)) { + return; + } + if (dataFigure instanceof NodeInitDataFigure) { + NodeInitDataFigure nodeData = (NodeInitDataFigure) dataFigure; + nodeData.location.x += offset.x; + nodeData.location.y += offset.y; + } + if (dataFigure instanceof EdgeInitDataFigure) { + EdgeInitDataFigure edgeData = (EdgeInitDataFigure) dataFigure; + edgeData.start.x += offset.x; + edgeData.start.y += offset.y; + edgeData.end.x += offset.x; + edgeData.end.y += offset.y; + } + if (dataFigure.children != null) { + for (InitDataFigure childFigure : dataFigure.children) { + addOffsetToDataFigure(childFigure, offset); + } + } + } + + /** + * Calculates <Interaction> height. + * + * @param interaction + * @param orderedMessages + * @return + */ + protected static int calculateInteractionHeight(Interaction interaction, + List<List<Message>> orderedMessages) { + int height = 0; + height = calculateLifelineHeight(interaction, orderedMessages); + height += Interaction_Offset_Y * 2; + height += Interaction_Title_Size; + return height >= Interaction_Minimun_Size_Y ? height + : Interaction_Minimun_Size_Y; + } + + /** + * Calculates <Interaction> width. + * + * @param interaction + * @param orderedMessages + * @return + */ + protected static int calculateInterationWidth(Interaction interaction, + List<List<Message>> orderedMessages) { + int width = 0; + if (interaction.getLifelines() != null + && interaction.getLifelines().size() > 0) { + int nLifelines = interaction.getLifelines().size(); + width += nLifelines + * calculateLifelineWidth(interaction, orderedMessages); + width += (nLifelines - 1) * Lifeline_Offset_X; + width += Interaction_Offset_X * 2; + } + return width >= Interaction_Minimun_Size_X ? width + : Interaction_Minimun_Size_X; + } + + /** + * Calculates <Lifeline> height. + * + * @param interaction + * @param orderedMessages + * @return + */ + protected static int calculateLifelineHeight(Interaction interaction, + List<List<Message>> orderedMessages) { + int height = 0; + height = getTotalMessagesSize(orderedMessages); + height *= Message_Slot_Size_Y; + height += Message_BES_Offset * 2; + height += Lifeline_Title_Size; + return height >= Lifeline_Minimun_Size_Y ? height + : Lifeline_Minimun_Size_Y; + } + + /** + * Calculates <Lifeline> width. + * + * @param interaction + * @param orderedMessages + * @return + */ + protected static int calculateLifelineWidth(Interaction interaction, + List<List<Message>> orderedMessages) { + int width = 0; + return width >= Lifeline_Minimun_Size_X ? width + : Lifeline_Minimun_Size_X; + } + + protected static int calculateBESXOffset(NodeInitDataFigure rootData, + Lifeline lifeline) { + return calculateLifelineXCenter(lifeline, rootData); + } + + /** + * Modified by gmerin + */ + protected static int calculateLifelineXCenter(Lifeline lifeline, + NodeInitDataFigure rootData) { + if (lifeline == null || rootData == null) { + return -1; + } + NodeInitDataFigure lifelineData = findElementNodeData(rootData, + lifeline); + if (lifelineData.location == null || lifelineData.size == null) { + return -1; + } + return (lifelineData.location.x + (lifelineData.size.x / 2)); + } + + /** + * Added + * + * @author gmerin + */ + protected static int calculateBESXEdge(BehaviorExecutionSpecification bes, + NodeInitDataFigure rootData, Boolean isSourceEnd) { + if (bes == null || rootData == null || isSourceEnd == null) { + return -1; + } + NodeInitDataFigure besData = findElementNodeData(rootData, bes); + if (besData == null || besData.location == null || besData.size == null) { + return -1; + } + if (isSourceEnd) + return (besData.location.x + besData.size.x - 1); + else + return (besData.location.x); + } + + /** + * Modified by gmerin + */ + protected static int calculateMessageEndXOffset(Element element, + NodeInitDataFigure rootData, Boolean isSourceEnd) { + if (element instanceof Lifeline) { + return calculateLifelineXCenter((Lifeline) element, rootData); + } else if (element instanceof BehaviorExecutionSpecification) { + BehaviorExecutionSpecification bes = ((BehaviorExecutionSpecification) element); + if (bes.getCovereds().size() > 0) { + // Lifeline lifeline = bes.getCovereds().get(0); + // return calculateLifelineXCenter(lifeline, rootData); + return calculateBESXEdge(bes, rootData, isSourceEnd); + } else { + return -1; + } + } else { + return -1; + } + } + + protected static void addLifelinesToInteraction( + NodeInitDataFigure interactionData, + List<List<Message>> orderedMessages) { + // sanity check + if (interactionData == null || orderedMessages == null + || orderedMessages.size() <= 0) { + return; + } + Interaction interaction = interactionData.eObject instanceof Interaction ? (Interaction) interactionData.eObject + : null; + if (interaction == null) { + return; + } + int xOffset = Interaction_Offset_X, yOffset = Interaction_Offset_Y + + Interaction_Title_Size; + int width = calculateLifelineWidth(interaction, orderedMessages); + int height = calculateLifelineHeight(interaction, orderedMessages); + for (Lifeline lifeline : interaction.getLifelines()) { + NodeInitDataFigure lifelineData = initLifelineData(xOffset, + yOffset, width, height, lifeline); + if (lifelineData != null) { + interactionData.children.add(lifelineData); + xOffset += width + Lifeline_Offset_X; + } + } + } + + /** + * Adds Messages and BES to the Lifelines. + * + * @param interactionData + * @param orderedMessages + */ + protected static void addMessagesAndBESToInteraction( + NodeInitDataFigure interactionData, + List<List<Message>> orderedMessages) { + // sanity check + if (interactionData == null || orderedMessages == null + || orderedMessages.size() <= 0) { + return; + } + Interaction interaction = interactionData.eObject instanceof Interaction ? (Interaction) interactionData.eObject + : null; + if (interaction == null) { + return; + } + int yOffset = Interaction_Title_Size + Interaction_Offset_Y + + Lifeline_Title_Size + Message_Slot_Size_Y + + Message_BES_Offset; + + // added by gmerin + // To store the BES that added to the interactionData as ends of the + // messages + List<BehaviorExecutionSpecification> addedBESList = new BasicEList<BehaviorExecutionSpecification>(); + // end gmerin + + for (List<Message> messages : orderedMessages) { + // a slot/position can have more than one Message + for (Message message : messages) { + // Message source and target MOS + MessageOccurrenceSpecification sourceMOS = message + .getSendEvent() instanceof MessageOccurrenceSpecification ? (MessageOccurrenceSpecification) message + .getSendEvent() + : null; + MessageOccurrenceSpecification targetMOS = message + .getReceiveEvent() instanceof MessageOccurrenceSpecification ? (MessageOccurrenceSpecification) message + .getReceiveEvent() + : null; + // sanity check + if (sourceMOS == null || targetMOS == null) { + continue; + } + // Message source and target + Element source = MessageCommonUtil.getMessageSrc(message); + Element target = MessageCommonUtil.getMessageDst(message); + // source and target Lifelines - to calculate x offsets + Lifeline sourceLifeline = getMOSLifeline(sourceMOS); + Lifeline targetLifeline = getMOSLifeline(targetMOS); + // do we have to create any BES figure at source ? + if (source instanceof BehaviorExecutionSpecification) { + BehaviorExecutionSpecification sourceBES = (BehaviorExecutionSpecification) source; + + // added by gmerin + addedBESList.add(sourceBES); + // end gmerin + + // is this the first Message of a BES ? + if (sourceBES.getStart() != null + && sourceBES.getStart().equals(sourceMOS)) { + int y = yOffset; + int x = calculateBESXOffset(interactionData, + sourceLifeline) + - (BES_Minimun_Size_X / 2); + addStartBES(x, y, sourceBES, sourceLifeline, + interactionData); + } + // is this the last Message of a BES ? + if (sourceBES.getFinish() != null + && sourceBES.getFinish().equals(sourceMOS)) { + int y = yOffset; + addEndBES(BES_Minimun_Size_X, y, sourceBES, + sourceLifeline, interactionData); + } + } // end source BES + // do we have to create any BES at target ? + if (target instanceof BehaviorExecutionSpecification) { + BehaviorExecutionSpecification targetBES = (BehaviorExecutionSpecification) target; + + // added by gmerin + addedBESList.add(targetBES); + // end gmerin + + // is the first Message of a BES ? + if (targetBES.getStart() != null + && targetBES.getStart().equals(targetMOS)) { + int y = yOffset; + int x = calculateBESXOffset(interactionData, + targetLifeline) + - (BES_Minimun_Size_X / 2); + addStartBES(x, y, targetBES, targetLifeline, + interactionData); + } + // is the last Message of a BES ? + if (targetBES.getFinish() != null + && targetBES.getFinish().equals(targetMOS)) { + int y = yOffset; + addEndBES(BES_Minimun_Size_X, y, targetBES, + targetLifeline, interactionData); + } + } // end target BES + // init edge figure data + EdgeInitDataFigure messageData = INSTANCE.new EdgeInitDataFigure(); + messageData.eObject = message; + // a message won't have children + messageData.children = Collections.EMPTY_LIST; + // y will be the same for source and target + int y = yOffset; + int xOffsetSrc = 0, xOffsetDst = 0; + // Modified by gmerin + xOffsetSrc = calculateMessageEndXOffset(source, + interactionData, true); + xOffsetDst = calculateMessageEndXOffset(target, + interactionData, false); + // start and end point of the Message edge. + messageData.start = new Point(xOffsetSrc, y); + messageData.end = new Point(xOffsetDst, y); + // add Message figure data + interactionData.children.add(messageData); + } + // increase y offset + yOffset += Message_Slot_Size_Y; + } + + // Added by gmerin + // All the BES that are ends of messages have been considered in the + // above + // code. Now is the turn of the BES that do not have messages anchored + // to them + int auxMaxYOffset = yOffset; + for(Lifeline lifeline : interaction.getLifelines()) { + int auxYOffset = yOffset; + int auxXOffset = calculateLifelineXCenter(lifeline, interactionData) + - BES_Minimun_Size_X / 2; + + List<BehaviorExecutionSpecification> notAddedBESList = MessageCommonUtil + .getLifelineBESList(lifeline); + notAddedBESList.removeAll(addedBESList); + + for (BehaviorExecutionSpecification bes : notAddedBESList) { + addStartBES(auxXOffset, auxYOffset, bes, lifeline, + interactionData); + addEndBES(BES_Minimun_Size_X, auxYOffset, bes, lifeline, + interactionData); + auxYOffset += Message_Slot_Size_Y; + } + + // Increase the height of the lifeline + if (auxYOffset - yOffset > 0) { + NodeInitDataFigure node = findElementNodeData(interactionData, + lifeline); + if (node != null && node.size != null) + node.size.y += (auxYOffset - yOffset) + Message_BES_Offset + * 2; + // Update the auxMaxYOffset in case is bigger than before + auxMaxYOffset = auxYOffset > auxMaxYOffset ? auxYOffset + : auxMaxYOffset; + } + } + // Increase the height of the Interaction + if (auxMaxYOffset - yOffset > 0) { + if (interactionData.size != null) + interactionData.size.y += (auxMaxYOffset - yOffset); + } + // end gmerin + } + + /** + * Modified by gmerin + */ + protected static void addStartBES(int x, int y, + BehaviorExecutionSpecification bes, Lifeline lifeline, + NodeInitDataFigure interactionData) { + NodeInitDataFigure BESData = startInitBESData(x, y, bes); + NodeInitDataFigure lifelineData = findElementNodeData(interactionData, + lifeline); + if (lifelineData != null) { + if (lifelineData.children == null) { + lifelineData.children = new ArrayList<InitDataFigure>(); + } + lifelineData.children.add(BESData); + } + } + + /** + * Modified by gmerin + */ + protected static void addEndBES(int width, int y, + BehaviorExecutionSpecification bes, Lifeline lifeline, + NodeInitDataFigure interactionData) { + // get the NodeInitDataFigure corresponding to the Lifeline + NodeInitDataFigure lifelineData = findElementNodeData(interactionData, + lifeline); + if (lifelineData == null || lifelineData.children == null + || lifelineData.children.size() <= 0) { + return; + } + // look in that Lifeline children figures for a corresponding BES figure + for (InitDataFigure dataFigure : lifelineData.children) { + if (dataFigure != null && dataFigure.eObject != null + && dataFigure.eObject.equals(bes)) { + if (dataFigure instanceof NodeInitDataFigure) { + // correct BES figure found -> set size + int initialY = ((NodeInitDataFigure) dataFigure).location.y; + ((NodeInitDataFigure) dataFigure).size = new Point(width, + (y - initialY) + Message_BES_Offset); + } + } + } + } + + protected static NodeInitDataFigure initLifelineData(int xOffset, + int yOffset, int width, int height, Lifeline lifeline) { + NodeInitDataFigure lifelineData = INSTANCE.new NodeInitDataFigure(); + lifelineData.eObject = lifeline; + lifelineData.location = new Point(xOffset, yOffset); + lifelineData.size = new Point(width, height); + lifelineData.children = new ArrayList<InitDataFigure>(); + return lifelineData; + } + + protected static NodeInitDataFigure startInitBESData(int xOffset, + int yOffset, BehaviorExecutionSpecification bes) { + NodeInitDataFigure BESData = INSTANCE.new NodeInitDataFigure(); + BESData.eObject = bes; + BESData.location = new Point(xOffset, yOffset - Message_BES_Offset); + BESData.children = new ArrayList<InitDataFigure>(); + // no size, as we don't know yet the height + BESData.size = new Point(0, 0); + return BESData; + } + + protected static NodeInitDataFigure endInitBESData(int width, int height, + NodeInitDataFigure BESData) { + if (BESData != null) { + BESData.size = new Point(width, height); + } + return BESData; + } + + /** + * Modified by gmerin + */ + protected static NodeInitDataFigure findElementNodeData( + InitDataFigure rootData, Element element) { + // sanity check + if (rootData == null || element == null) { + return null; + } + if (rootData.eObject != null && rootData.eObject.equals(element)) { + return rootData instanceof NodeInitDataFigure ? (NodeInitDataFigure) rootData + : null; + } + if (rootData.children == null || rootData.children.size() <= 0) { + return null; + } + for (InitDataFigure dataFigure : rootData.children) { + InitDataFigure elementDataFigure = findElementNodeData(dataFigure, + element); + if (elementDataFigure instanceof NodeInitDataFigure) { + return (NodeInitDataFigure) elementDataFigure; + } + } + return null; + } + + protected static Lifeline getMOSLifeline(MessageOccurrenceSpecification mos) { + if (mos == null) { + return null; + } + if (mos.getCovereds().size() <= 0) { + return null; + } + return mos.getCovereds().get(0); + } + + // //** View creation **//// + + public static void createViews(IGraphicalEditPart parentEditPart, + NodeInitDataFigure interactionData) { + // Map relating the EObjects and their EditParts + Map<EObject, IGraphicalEditPart> mapEObject2EditPart = new HashMap<EObject, IGraphicalEditPart>(); + // create nodes views + // - create Interaction View + createInteractionView(interactionData, parentEditPart, + mapEObject2EditPart); + IGraphicalEditPart interactionEditPart = mapEObject2EditPart + .get(interactionData.eObject); + // - create Lifelines Views + createLifelineViews(interactionData, interactionEditPart, + mapEObject2EditPart); + // - create BES Views + createBESViews(interactionData, mapEObject2EditPart); + // - create Message Views + TransactionalEditingDomain domain = parentEditPart.getEditingDomain(); + createMessageViews(interactionData, parentEditPart, mapEObject2EditPart); + // add element's created views to the Diagram list of references. + if (parentEditPart.getNotationView() instanceof Diagram) { + Diagram diagram = (Diagram) parentEditPart.getNotationView(); + Set<EObject> elements = mapEObject2EditPart.keySet(); + addReferencesToDiagram(diagram, elements, domain); + } + } + + protected static void createInteractionView( + NodeInitDataFigure interactionData, + IGraphicalEditPart parentEditPart, + Map<EObject, IGraphicalEditPart> mapEObject2EditPart) { + // - create Interaction View + Interaction interaction = interactionData.eObject instanceof Interaction ? (Interaction) interactionData.eObject + : null; + String semanticHint = getInteractionSemanticHint(parentEditPart); + ViewDescriptor interactionViewDescriptor = new ViewDescriptor( + new EObjectAdapter(interactionData.eObject), Node.class, + semanticHint, UMLDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT); + CreateViewRequest createInteractionViewRequest = new CreateViewRequest( + interactionViewDescriptor); + createInteractionViewRequest.setLocation(interactionData.location); + createInteractionViewRequest.setSize(new Dimension( + interactionData.size.x, interactionData.size.y)); + IGraphicalEditPart interactionEditPart = createView(parentEditPart, + createInteractionViewRequest); + if (interactionEditPart != null) { + interactionEditPart.getFigure().getUpdateManager().performUpdate(); + mapEObject2EditPart.put(interactionData.eObject, + interactionEditPart); + } + } + + protected static String getInteractionSemanticHint( + IGraphicalEditPart parentEditPart) { + if (parentEditPart == null + || parentEditPart.resolveSemanticElement() == null) { + return null; + } + EObject element = parentEditPart.resolveSemanticElement(); + if (element instanceof Package) { + return String.valueOf(InteractionEditPart.VISUAL_ID); + } else if (element instanceof Interaction) { + return String.valueOf(Interaction2EditPart.VISUAL_ID); + } + return null; + } + + protected static void createLifelineViews(InitDataFigure interactionData, + IGraphicalEditPart interactionEditPart, + Map<EObject, IGraphicalEditPart> mapEObject2EditPart) { + IGraphicalEditPart parentEditPart = null; + for (Object child : interactionEditPart.getChildren()) { + // careful here, a CompartmentEditPart is looked for here because we + // know that it is applicable to the Interaction figure; other + // figures may need other logic + if (child instanceof CompartmentEditPart) { + parentEditPart = (CompartmentEditPart) child; + } + } + + for (InitDataFigure dataFigure : interactionData.children) { + if (dataFigure instanceof NodeInitDataFigure + && dataFigure.eObject instanceof Lifeline) { + Lifeline lifeline = (Lifeline) dataFigure.eObject; + IGraphicalEditPart createdEditPart = findLifelineEditPart( + lifeline, mapEObject2EditPart); + NodeInitDataFigure nodeDataFigure = (NodeInitDataFigure) dataFigure; + if (createdEditPart != null) { + // the view and its editpart already existed; we + // destroy them to recreate them with the proper + // location and size + DeleteCommand deleteCommand = new DeleteCommand( + createdEditPart.getNotationView()); + parentEditPart.getEditingDomain().getCommandStack() + .execute(new GMFToEMFCommand(deleteCommand)); + } + ViewDescriptor viewDescriptor = new ViewDescriptor( + new EObjectAdapter(lifeline), Node.class, String + .valueOf(LifelineEditPart.VISUAL_ID), + UMLDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT); + CreateViewRequest createViewRequest = new CreateViewRequest( + viewDescriptor); + createViewRequest.setLocation(nodeDataFigure.location); + createViewRequest.setSize(new Dimension(nodeDataFigure.size.x, + nodeDataFigure.size.y)); + createdEditPart = createView(parentEditPart, createViewRequest); + if (createdEditPart != null) { + createdEditPart.getFigure().getUpdateManager() + .performUpdate(); + mapEObject2EditPart.put(nodeDataFigure.eObject, + createdEditPart); + } + } + } + } + + protected static IGraphicalEditPart findLifelineEditPart(Lifeline lifeline, + Map<EObject, IGraphicalEditPart> mapEObject2EditPart) { + if (lifeline != null && mapEObject2EditPart != null) { + Interaction interaction = lifeline.getInteraction(); + IGraphicalEditPart interactionEditPart = mapEObject2EditPart + .get(interaction); + if (interactionEditPart != null) { + return searchEObjectInEditPart(lifeline, interactionEditPart); + } + } + return null; + } + + protected static Point calculateLocationDelta(IGraphicalEditPart editPart, + Point finalLocation) { + Point locationDelta = new Point(0, 0); + if (editPart != null && finalLocation != null) { + Rectangle bounds = editPart.getFigure().getBounds(); + locationDelta.x = finalLocation.x - bounds.x; + locationDelta.y = finalLocation.y - bounds.y; + } + return locationDelta; + } + + protected static Dimension calculateSizeDelta(IGraphicalEditPart editPart, + Point finalSize) { + Dimension dimensionDelta = new Dimension(0, 0); + if (editPart != null && finalSize != null) { + Rectangle bounds = editPart.getFigure().getBounds(); + dimensionDelta.width = finalSize.x - bounds.width; + dimensionDelta.height = finalSize.y - bounds.height; + } + return dimensionDelta; + } + + protected static IGraphicalEditPart searchEObjectInEditPart( + EObject eObject, IGraphicalEditPart editPart) { + if (eObject != null && editPart != null) { + if (eObject.equals(editPart.resolveSemanticElement())) { + return editPart; + } + for (Object childEditPart : editPart.getChildren()) { + if (childEditPart instanceof IGraphicalEditPart) { + IGraphicalEditPart foundEditPart = searchEObjectInEditPart( + eObject, (IGraphicalEditPart) childEditPart); + if (foundEditPart != null) { + return foundEditPart; + } + } + } + } + return null; + } + + protected static void createBESViews(InitDataFigure interactionData, + Map<EObject, IGraphicalEditPart> mapEObject2EditPart) { + for (InitDataFigure dataFigure : interactionData.children) { + if (dataFigure instanceof NodeInitDataFigure + && dataFigure.eObject instanceof Lifeline) { + NodeInitDataFigure lifelineData = (NodeInitDataFigure) dataFigure; + for (InitDataFigure initFigure : lifelineData.children) { + if (initFigure instanceof NodeInitDataFigure + && initFigure.eObject instanceof BehaviorExecutionSpecification) { + NodeInitDataFigure BESData = (NodeInitDataFigure) initFigure; + BehaviorExecutionSpecification bes = (BehaviorExecutionSpecification) BESData.eObject; + IGraphicalEditPart createdEditPart = findBESEditPart( + bes, mapEObject2EditPart); + IGraphicalEditPart parentEditPart = null; + if (mapEObject2EditPart + .containsKey(lifelineData.eObject)) { + parentEditPart = mapEObject2EditPart + .get(lifelineData.eObject); + } + if (createdEditPart != null) { + // the view and its editpart already existed; we + // destroy them to recreate them with the proper + // location and size + DeleteCommand deleteCommand = new DeleteCommand( + createdEditPart.getNotationView()); + parentEditPart + .getEditingDomain() + .getCommandStack() + .execute(new GMFToEMFCommand(deleteCommand)); + } + ViewDescriptor viewDescriptor = new ViewDescriptor( + new EObjectAdapter(BESData.eObject), + Node.class, + String + .valueOf(BehaviorExecutionSpecificationEditPart.VISUAL_ID), + UMLDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT); + CreateViewRequest createRequest = new CreateViewRequest( + viewDescriptor); + createRequest.setLocation(BESData.location); + createRequest.setSize(new Dimension(BESData.size.x, + BESData.size.y)); + if (parentEditPart != null) { + createdEditPart = createView(parentEditPart, + createRequest); + } + if (createdEditPart != null) { + createdEditPart.getFigure().getUpdateManager() + .performUpdate(); + mapEObject2EditPart.put(BESData.eObject, + createdEditPart); + } + } + } + } + } + } + + protected static IGraphicalEditPart findBESEditPart( + BehaviorExecutionSpecification bes, + Map<EObject, IGraphicalEditPart> mapEObject2EditPart) { + if (bes != null && bes.getCovereds().size() > 0 + && mapEObject2EditPart != null) { + Lifeline lifeline = bes.getCovereds().get(0); + IGraphicalEditPart lifelineEditPart = mapEObject2EditPart + .get(lifeline); + if (lifelineEditPart != null) { + return searchEObjectInEditPart(bes, lifelineEditPart); + } + } + return null; + } + + protected static Lifeline findContainerLifeline(Interaction interaction, + BehaviorExecutionSpecification bes) { + if (interaction == null || bes == null) { + return null; + } + for (Lifeline lifeline : interaction.getLifelines()) { + for (BehaviorExecutionSpecification childBes : MessageCommonUtil + .getLifelineBESList(lifeline)) { + if (bes.equals(childBes)) { + return lifeline; + } + } + } + return null; + } + + protected static void createMessageViews(InitDataFigure interactionData, + IGraphicalEditPart parentEditPart, + Map<EObject, IGraphicalEditPart> mapEObject2EditPart) { + TransactionalEditingDomain domain = parentEditPart.getEditingDomain(); + if (domain != null) { + for (InitDataFigure dataFigure : interactionData.children) { + if (dataFigure instanceof EdgeInitDataFigure + && dataFigure.eObject instanceof Message) { + EdgeInitDataFigure edgeFigure = (EdgeInitDataFigure) dataFigure; + Message message = (Message) dataFigure.eObject; + Element source = MessageCommonUtil.getMessageSrc(message); + Element target = MessageCommonUtil.getMessageDst(message); + String semanticHint = getMessageSemanticHint(message); + IElementType type = getMessageElementType(message); + UMLLinkDescriptor linkDescriptor = new UMLLinkDescriptor( + source, target, message, type, Integer + .valueOf(semanticHint)); + ConnectionViewDescriptor viewDescriptor = new ConnectionViewDescriptor( + linkDescriptor.getSemanticAdapter(), semanticHint, + ViewUtil.APPEND, false, + UMLDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT); + CreateConnectionViewRequest createRequest = new CreateConnectionViewRequest( + viewDescriptor); + createRequest.setLocation(edgeFigure.start); + createRequest + .setType(RequestConstants.REQ_CONNECTION_START); + + IGraphicalEditPart sourceEditPart = mapEObject2EditPart + .get(source); + if (sourceEditPart != null) { + createRequest.setSourceEditPart(sourceEditPart); + sourceEditPart.getCommand(createRequest); + createRequest.setLocation(edgeFigure.end); + createRequest + .setType(RequestConstants.REQ_CONNECTION_END); + IGraphicalEditPart targetEditPart = mapEObject2EditPart + .get(target); + if (targetEditPart != null) { + createRequest.setTargetEditPart(targetEditPart); + Command command = targetEditPart + .getCommand(createRequest); + if (command.canExecute() == false) { + continue; + } + domain.getCommandStack().execute( + new GEFtoEMFCommandWrapper(command)); + refreshEditPart(interactionData, + mapEObject2EditPart); + View view = getCreatedViewFromRequest(createRequest); + if (view != null) { + IGraphicalEditPart editPart = (IGraphicalEditPart) parentEditPart + .getViewer().getEditPartRegistry().get( + view); + if (editPart != null) { + mapEObject2EditPart.put(message, editPart); + } + } + } + } + } + } // for (figures) + } // if (domain != null) + } + + protected static void addReferencesToDiagram(Diagram diagram, + Set<EObject> elements, TransactionalEditingDomain domain) { + if (diagram == null || elements == null || elements.size() <= 0 + || domain == null) { + return; + } + List<EObject> eObjects = new ArrayList<EObject>(elements); + AddEObjectReferencesToDiagram command = new AddEObjectReferencesToDiagram( + domain, diagram, eObjects, false); + domain.getCommandStack().execute(new GMFToEMFCommand(command)); + } + + protected static IGraphicalEditPart createView( + IGraphicalEditPart parentEditPart, CreateViewRequest request) { + if (getAndExecuteCommand(parentEditPart, request)) { + View view = getCreatedViewFromRequest(request); + if (view != null) { + if (parentEditPart.getViewer().getEditPartRegistry() + .containsKey(view)) { + Object value = parentEditPart.getViewer() + .getEditPartRegistry().get(view); + if (value instanceof IGraphicalEditPart) { + return (IGraphicalEditPart) value; + } + } + } + } + return null; + } + + protected static View getCreatedViewFromRequest(CreateViewRequest request) { + View view = null; + Object newObject = request.getNewObject(); + if (newObject instanceof List) { + List<Object> adaptersList = ((List) newObject); + for (int i = 0; i < adaptersList.size(); i++) { + Object object = adaptersList.get(i); + if (object instanceof IAdaptable) { + Object adapted = ((IAdaptable) object) + .getAdapter(View.class); + if (adapted instanceof View) { + view = (View) adapted; + } + } + } + } + return view; + } + + protected static View getCreatedViewFromRequest( + CreateConnectionViewRequest request) { + View view = null; + Object newObject = request.getNewObject(); + if (newObject instanceof IAdaptable) { + Object object = ((IAdaptable) newObject).getAdapter(View.class); + if (object instanceof View) { + view = ((View) object); + } + } + return view; + } + + protected static boolean getAndExecuteCommand( + IGraphicalEditPart parentEditPart, Request request) { + if (parentEditPart == null || parentEditPart.getEditingDomain() == null + || request == null) { + return false; + } + Command command = parentEditPart.getCommand(request); + if (command == null) { + return false; + } + TransactionalEditingDomain domain = parentEditPart.getEditingDomain(); + domain.getCommandStack().execute(new GEFtoEMFCommandWrapper(command)); + parentEditPart.refresh(); + return true; + } + + protected static String getMessageSemanticHint(Message message) { + String hint = ""; + if (message != null) { + switch (message.getMessageSort().getValue()) { + case MessageSort.SYNCH_CALL: + hint = String.valueOf(MessageEditPart.VISUAL_ID); + break; + case MessageSort.ASYNCH_CALL: + hint = String.valueOf(Message2EditPart.VISUAL_ID); + break; + case MessageSort.REPLY: + hint = String.valueOf(Message3EditPart.VISUAL_ID); + break; + case MessageSort.ASYNCH_SIGNAL: + hint = String.valueOf(Message4EditPart.VISUAL_ID); + break; + case MessageSort.CREATE_MESSAGE: + hint = String.valueOf(Message5EditPart.VISUAL_ID); + break; + case MessageSort.DELETE_MESSAGE: + hint = String.valueOf(Message6EditPart.VISUAL_ID); + break; + default: + break; + } + } + return hint; + } + + protected static IElementType getMessageElementType(Message message) { + IElementType type = null; + if (message != null) { + switch (message.getMessageSort().getValue()) { + case MessageSort.SYNCH_CALL: + type = UMLElementTypes.Message_3001; + break; + case MessageSort.ASYNCH_CALL: + type = UMLElementTypes.Message_3002; + break; + case MessageSort.REPLY: + type = UMLElementTypes.Message_3003; + break; + case MessageSort.ASYNCH_SIGNAL: + type = UMLElementTypes.Message_3004; + break; + case MessageSort.CREATE_MESSAGE: + type = UMLElementTypes.Message_3005; + break; + case MessageSort.DELETE_MESSAGE: + type = UMLElementTypes.Message_3006; + break; + default: + break; + } + } + return type; + } + + protected static void refreshEditPart(InitDataFigure dataFigure, + Map<EObject, IGraphicalEditPart> mapEObject2EditPart) { + if (dataFigure == null) { + return; + } + IGraphicalEditPart editPart = null; + if (dataFigure.eObject != null) { + editPart = mapEObject2EditPart.get(dataFigure.eObject); + if (editPart != null) { + editPart.refresh(); + } + } + if (dataFigure.children == null) { + return; + } + for (InitDataFigure childFigure : dataFigure.children) { + refreshEditPart(childFigure, mapEObject2EditPart); + } + } +} |