Author: mvw
Date: 2010-07-30 06:18:06-0700
New Revision: 18611
Added:
trunk/src/argouml-app/src/org/argouml/uml/transformer/
trunk/src/argouml-app/src/org/argouml/uml/transformer/EventTransformer.java
trunk/src/argouml-app/src/org/argouml/uml/transformer/InitTransformer.java
trunk/src/argouml-app/src/org/argouml/uml/transformer/SimpleStateTransformer.java
trunk/src/argouml-app/src/org/argouml/uml/transformer/Transformer.java
trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerAction.java
trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerManager.java
Modified:
trunk/src/argouml-app/src/org/argouml/application/Main.java
trunk/src/argouml-app/src/org/argouml/i18n/menu.properties
trunk/src/argouml-app/src/org/argouml/ui/explorer/ExplorerPopup.java
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CommonBehaviorHelperMDRImpl.java
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java
trunk/src/argouml-core-model/src/org/argouml/model/CommonBehaviorHelper.java
trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java
Log:
Fix for issue 3990 and issue 3403: Add a tool to convert event types into each other, and simple states into composite states.
Modified: trunk/src/argouml-app/src/org/argouml/application/Main.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/application/Main.java?view=diff&pathrev=18611&r1=18610&r2=18611
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/application/Main.java (original)
+++ trunk/src/argouml-app/src/org/argouml/application/Main.java 2010-07-30 06:18:06-0700
@@ -1,6 +1,6 @@
/* $Id$
*******************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
* 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
@@ -8,6 +8,7 @@
*
* Contributors:
* andreas
+ * mvw
*******************************************************************************
*
* Some portions of this file was previously release using the BSD License:
@@ -97,6 +98,7 @@
import org.argouml.uml.diagram.static_structure.ui.InitClassDiagram;
import org.argouml.uml.diagram.ui.InitDiagramAppearanceUI;
import org.argouml.uml.diagram.use_case.ui.InitUseCaseDiagram;
+import org.argouml.uml.transformer.InitTransformer;
import org.argouml.uml.ui.InitUmlUI;
import org.argouml.util.ArgoFrame;
import org.argouml.util.JavaRuntimeUtility;
@@ -442,6 +444,7 @@
SubsystemUtility.initSubsystem(new InitUmlUI());
SubsystemUtility.initSubsystem(new InitCheckListUI());
SubsystemUtility.initSubsystem(new InitCognitiveUI());
+ SubsystemUtility.initSubsystem(new InitTransformer());
/*
* Initialize the module loader. At least the plug-ins that provide
Modified: trunk/src/argouml-app/src/org/argouml/i18n/menu.properties
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/i18n/menu.properties?view=diff&pathrev=18611&r1=18610&r2=18611
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/i18n/menu.properties (original)
+++ trunk/src/argouml-app/src/org/argouml/i18n/menu.properties 2010-07-30 06:18:06-0700
@@ -1,6 +1,6 @@
# $Id$
#******************************************************************************
-# Copyright (c) 2009 Contributors - see below
+# Copyright (c) 2009-2010 Contributors - see below
# 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
@@ -288,6 +288,7 @@
menu.popup.show.path = Show Path in Name
menu.popup.show.show-visibility = Show Visibility
menu.popup.show.hide-visibility = Hide Visibility
+menu.popup.transform = Transform into
menu.popup.trigger = New Trigger
menu.popup.uses = {0} Uses {1}
menu.popup.visibility = Visibility
Modified: trunk/src/argouml-app/src/org/argouml/ui/explorer/ExplorerPopup.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/ui/explorer/ExplorerPopup.java?view=diff&pathrev=18611&r1=18610&r2=18611
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/ui/explorer/ExplorerPopup.java (original)
+++ trunk/src/argouml-app/src/org/argouml/ui/explorer/ExplorerPopup.java 2010-07-30 06:18:06-0700
@@ -1,6 +1,6 @@
/* $Id$
*****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
* 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
@@ -8,6 +8,7 @@
*
* Contributors:
* bobtarling
+ * mvw
*****************************************************************************
*
* Some portions of this file was previously release using the BSD License:
@@ -56,6 +57,7 @@
import org.apache.log4j.Logger;
import org.argouml.i18n.Translator;
import org.argouml.kernel.ProfileConfiguration;
+import org.argouml.kernel.Project;
import org.argouml.kernel.ProjectManager;
import org.argouml.model.IllegalModelElementConnectionException;
import org.argouml.model.Model;
@@ -63,6 +65,7 @@
import org.argouml.ui.ActionCreateContainedModelElement;
import org.argouml.ui.ActionCreateEdgeModelElement;
import org.argouml.ui.ContextActionFactoryManager;
+import org.argouml.ui.UndoableAction;
import org.argouml.ui.targetmanager.TargetManager;
import org.argouml.uml.diagram.ArgoDiagram;
import org.argouml.uml.diagram.DiagramUtils;
@@ -76,6 +79,7 @@
import org.argouml.uml.diagram.ui.ActionAddExistingNodes;
import org.argouml.uml.diagram.ui.ActionSaveDiagramToClipboard;
import org.argouml.uml.diagram.ui.ModeAddToDiagram;
+import org.argouml.uml.transformer.TransformerManager;
import org.argouml.uml.ui.ActionActivityDiagram;
import org.argouml.uml.ui.ActionClassDiagram;
import org.argouml.uml.ui.ActionCollaborationDiagram;
@@ -90,7 +94,6 @@
import org.tigris.gef.base.Globals;
import org.tigris.gef.graph.GraphModel;
import org.tigris.gef.graph.MutableGraphModel;
-import org.argouml.ui.UndoableAction;
/**
* PopUp for extra functionality for the Explorer.
@@ -236,6 +239,10 @@
if (mutableModelElementsOnly) {
initMenuCreateModelElements();
}
+
+ if (!multiSelect && mutableModelElementsOnly) {
+ initMenuTransform();
+ }
final boolean modelElementSelected =
Model.getFacade().isAUMLElement(selectedItem);
@@ -377,6 +384,22 @@
}
}
+ private void initMenuTransform() {
+ Project p = ProjectManager.getManager().getCurrentProject();
+ Object t = TargetManager.getInstance().getModelTarget();
+ List<Action> actions = TransformerManager.getInstance().actions(p, t);
+ LOG.debug("Building menu Transform");
+ if (!actions.isEmpty()) {
+ JMenu transformMenu =
+ new JMenu(menuLocalize("menu.popup.transform"));
+ for (Action a : actions) {
+ transformMenu.add(new JMenuItem(a));
+ LOG.debug("Building menu Transform - adding: " + a.getValue(Action.NAME));
+ }
+ this.add(transformMenu);
+ }
+ }
+
/**
* initialize the menu for diagram construction in the explorer popup menu.
*
Added: trunk/src/argouml-app/src/org/argouml/uml/transformer/EventTransformer.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/transformer/EventTransformer.java?view=markup&pathrev=18611
==============================================================================
--- (empty file)
+++ trunk/src/argouml-app/src/org/argouml/uml/transformer/EventTransformer.java 2010-07-30 06:18:06-0700
@@ -0,0 +1,204 @@
+/* $Id$
+ *******************************************************************************
+ * Copyright (c) 2010 Contributors - see below
+ * 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:
+ * mvw
+ *******************************************************************************
+ */
+
+package org.argouml.uml.transformer;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.swing.Action;
+
+import org.argouml.kernel.Project;
+import org.argouml.model.Model;
+
+class EventTransformer implements Transformer {
+
+ public List<Action> actions(Project p, Object sourceModelElement) {
+ assert Model.getFacade().isAEvent(sourceModelElement);
+ List<Action> result = new ArrayList<Action>();
+ if (!Model.getFacade().isACallEvent(sourceModelElement)) {
+ result.add(new EventToCallEvent(p, sourceModelElement));
+ }
+ if (!Model.getFacade().isASignalEvent(sourceModelElement)) {
+ result.add(new EventToSignalEvent(p, sourceModelElement));
+ }
+ if (!Model.getFacade().isAChangeEvent(sourceModelElement)) {
+ result.add(new EventToChangeEvent(p, sourceModelElement));
+ }
+ if (!Model.getFacade().isATimeEvent(sourceModelElement)) {
+ result.add(new EventToTimeEvent(p, sourceModelElement));
+ }
+ return result;
+ }
+
+ public boolean canTransform(Object sourceModelElement) {
+ return Model.getFacade().isAEvent(sourceModelElement);
+ }
+
+ abstract class EventTransformerAction extends TransformerAction {
+ /**
+ * Constructor.
+ */
+ EventTransformerAction(String nameKey, Project project, Object sourceModelElement) {
+ super(nameKey, project, sourceModelElement);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ super.actionPerformed(e);
+ String text = getText();
+ String name = getName();
+ Object ns = Model.getFacade().getNamespace(source);
+ /* Need to copy the lists since we will be moving the elements
+ * one by one: */
+ Collection transitions = new ArrayList(
+ Model.getFacade().getTransitions(source));
+ Collection parameters = new ArrayList(
+ Model.getFacade().getParameters(source));
+ // Deleting "source" here would probably delete the parameters...
+
+ Object trans = null;
+ if (!transitions.isEmpty()) {
+ trans = transitions.iterator().next();
+ }
+ Object evt = buildEvent(text, name, ns, trans);
+
+ for (Object param : parameters) {
+ Model.getCoreHelper().removeParameter(source, param);
+ Model.getCoreHelper().addParameter(evt, param);
+ }
+ for (Object t : transitions) {
+ Model.getStateMachinesHelper().setTrigger(t, null);
+ Model.getStateMachinesHelper().setTrigger(t, evt);
+ }
+
+ Model.getUmlFactory().delete(source);
+ }
+
+ protected String getText() {
+ String text = "";
+ if (Model.getFacade().isACallEvent(source)) {
+ text = Model.getFacade().getName(source);
+ }
+ if (Model.getFacade().isAChangeEvent(source)) {
+ Object changeExpr = Model.getFacade().getChangeExpression(source);
+ if (changeExpr != null) {
+ text = Model.getDataTypesHelper().getBody(changeExpr);
+ }
+ }
+ if (Model.getFacade().isATimeEvent(source)) {
+ Object timeExpr = Model.getFacade().getWhen(source);
+ if (timeExpr != null) {
+ text = Model.getDataTypesHelper().getBody(timeExpr);
+ }
+ }
+ if (Model.getFacade().isASignalEvent(source)) {
+ text = Model.getFacade().getName(source);
+ }
+ return text;
+ }
+
+ /*
+ * Only set the name if it differs from the text.
+ */
+ protected String getName() {
+ String name = "";
+ if (Model.getFacade().isAChangeEvent(source)) {
+ name = Model.getFacade().getName(source);
+ }
+ if (Model.getFacade().isATimeEvent(source)) {
+ name = Model.getFacade().getName(source);
+ }
+ return name;
+ }
+
+ abstract protected Object buildEvent(String text, String name, Object ns, Object trans);
+ }
+
+ class EventToCallEvent extends EventTransformerAction {
+
+ /**
+ * Constructor.
+ */
+ EventToCallEvent(Project project, Object sourceModelElement) {
+ super("button.new-callevent", project, sourceModelElement);
+ }
+
+ @Override
+ protected Object buildEvent(String text, String name, Object ns, Object trans) {
+ Object evt = Model.getStateMachinesFactory().buildCallEvent(
+ ns);
+ Model.getCoreHelper().setName(evt, text);
+ Object op = Model.getStateMachinesHelper().findOperationByName(
+ trans, text);
+ if (op != null) {
+ Model.getCommonBehaviorHelper().setOperation(evt, op);
+ }
+ return evt;
+ }
+ }
+
+ class EventToSignalEvent extends EventTransformerAction {
+
+ /**
+ * Constructor.
+ */
+ EventToSignalEvent(Project project, Object sourceModelElement) {
+ super("button.new-signalevent", project, sourceModelElement);
+ }
+
+ @Override
+ protected Object buildEvent(String text, String name, Object ns, Object trans) {
+ return Model.getStateMachinesFactory().buildSignalEvent(
+ text, ns);
+ }
+ }
+
+ class EventToChangeEvent extends EventTransformerAction {
+
+ /**
+ * Constructor.
+ */
+ EventToChangeEvent(Project project, Object sourceModelElement) {
+ super("button.new-changeevent", project, sourceModelElement);
+ }
+
+ @Override
+ protected Object buildEvent(String text, String name, Object ns, Object trans) {
+ Object evt = Model.getStateMachinesFactory().buildChangeEvent(
+ text, ns);
+ Model.getCoreHelper().setName(evt, name);
+ return evt;
+ }
+ }
+
+ class EventToTimeEvent extends EventTransformerAction {
+
+ /**
+ * Constructor.
+ */
+ EventToTimeEvent(Project project, Object sourceModelElement) {
+ super("button.new-timeevent", project, sourceModelElement);
+ }
+
+ @Override
+ protected Object buildEvent(String text, String name, Object ns, Object trans) {
+ Object evt = Model.getStateMachinesFactory().buildTimeEvent(
+ text, ns);
+ Model.getCoreHelper().setName(evt, name);
+ return evt;
+ }
+ }
+
+}
Added: trunk/src/argouml-app/src/org/argouml/uml/transformer/InitTransformer.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/transformer/InitTransformer.java?view=markup&pathrev=18611
==============================================================================
--- (empty file)
+++ trunk/src/argouml-app/src/org/argouml/uml/transformer/InitTransformer.java 2010-07-30 06:18:06-0700
@@ -0,0 +1,49 @@
+/* $Id$
+ *******************************************************************************
+ * Copyright (c) 2010 Contributors - see below
+ * 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:
+ * mvw
+ *******************************************************************************
+ */
+
+package org.argouml.uml.transformer;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.argouml.application.api.AbstractArgoJPanel;
+import org.argouml.application.api.GUISettingsTabInterface;
+import org.argouml.application.api.InitSubsystem;
+
+/**
+ * Initialise this subsystem.
+ *
+ * @author michiel
+ */
+public class InitTransformer implements InitSubsystem {
+
+ public List<AbstractArgoJPanel> getDetailsTabs() {
+ return Collections.emptyList();
+ }
+
+ public List<GUISettingsTabInterface> getProjectSettingsTabs() {
+ return Collections.emptyList();
+ }
+
+ public List<GUISettingsTabInterface> getSettingsTabs() {
+ return Collections.emptyList();
+ }
+
+ public void init() {
+ TransformerManager.getInstance().addTransformer(
+ new EventTransformer());
+ TransformerManager.getInstance().addTransformer(
+ new SimpleStateTransformer());
+ }
+
+}
Added: trunk/src/argouml-app/src/org/argouml/uml/transformer/SimpleStateTransformer.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/transformer/SimpleStateTransformer.java?view=markup&pathrev=18611
==============================================================================
--- (empty file)
+++ trunk/src/argouml-app/src/org/argouml/uml/transformer/SimpleStateTransformer.java 2010-07-30 06:18:06-0700
@@ -0,0 +1,251 @@
+/* $Id$
+ *******************************************************************************
+ * Copyright (c) 2010 Contributors - see below
+ * 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:
+ * michiel
+ *******************************************************************************
+ */
+
+package org.argouml.uml.transformer;
+
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.Action;
+
+import org.apache.log4j.Logger;
+import org.argouml.kernel.Project;
+import org.argouml.model.Model;
+import org.argouml.uml.diagram.DiagramSettings;
+import org.argouml.uml.diagram.state.ui.FigCompositeState;
+import org.argouml.uml.diagram.state.ui.FigSimpleState;
+import org.argouml.uml.diagram.state.ui.FigTransition;
+import org.argouml.uml.diagram.ui.FigEdgeModelElement;
+import org.argouml.uml.diagram.ui.FigNodeModelElement;
+import org.tigris.gef.base.Layer;
+import org.tigris.gef.base.LayerPerspective;
+import org.tigris.gef.presentation.Fig;
+import org.tigris.gef.presentation.FigEdge;
+import org.tigris.gef.presentation.FigNode;
+
+/**
+ * This class transforms a SimpleState into a CompositeState. <p>
+ *
+ * This involves copying the following:
+ * from State:
+ * entry : Action
+ * exit : Action
+ * deferrableEvent : Event
+ * internalTransition : Transition
+ * doActivity : Action
+ * stateMachine : StateMachine
+ * from StateVertex:
+ * container : CompositeState
+ * outgoing : Transition
+ * incoming : Transition
+ * from ModelElement:
+ * name
+ * and maybe others...
+ *
+ * @author michiel
+ */
+class SimpleStateTransformer implements Transformer {
+
+ private static final Logger LOG =
+ Logger.getLogger(SimpleStateTransformer.class);
+
+ public List<Action> actions(Project p, Object sourceModelElement) {
+ assert Model.getFacade().isASimpleState(sourceModelElement);
+ List<Action> result = new ArrayList<Action>();
+ result.add(new SimpleStateToCompositeState(p, sourceModelElement));
+ return result;
+ }
+
+ public boolean canTransform(Object sourceModelElement) {
+ return Model.getFacade().isASimpleState(sourceModelElement);
+ }
+
+ class SimpleStateToCompositeState extends TransformerAction {
+
+ SimpleStateToCompositeState(Project project, Object sourceModelElement) {
+ super("button.new-compositestate", project, sourceModelElement);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ LOG.debug("Transforming a SimpleState into a CompositeState");
+// Editor editor = Globals.curEditor();
+// GraphModel gm = editor.getGraphModel();
+// LayerDiagram lay =
+// ((LayerDiagram) editor.getLayerManager().getActiveLayer());
+
+
+ super.actionPerformed(e);
+ Object entry = Model.getFacade().getEntry(source);
+ Object exit = Model.getFacade().getExit(source);
+ /* Need to copy the lists since we will be moving the elements: */
+ Collection deferEvts = new ArrayList(Model.getFacade().getDeferrableEvents(source));
+ Collection intTrans = new ArrayList(Model.getFacade().getInternalTransitions(source));
+ Object doActivity = Model.getFacade().getDoActivity(source);
+ Object sm = Model.getFacade().getStateMachine(source);
+ Object container = Model.getFacade().getContainer(source);
+ Collection outgoings = new ArrayList(Model.getFacade().getOutgoings(source));
+ Collection incomings = new ArrayList(Model.getFacade().getIncomings(source));
+
+ outgoings.removeAll(intTrans);
+ incomings.removeAll(intTrans);
+ LOG.debug("Transformer found " + intTrans.size() + " internal transitions.");
+ LOG.debug("Transformer found " + incomings.size() + " incoming transitions.");
+ LOG.debug("Transformer found " + outgoings.size() + " outgoing transitions.");
+
+ String name = Model.getFacade().getName(source);
+ Object cs = Model.getStateMachinesFactory().buildCompositeState(container);
+ Model.getStateMachinesHelper().setEntry(source, null);
+ Model.getStateMachinesHelper().setEntry(cs, entry);
+ Model.getStateMachinesHelper().setExit(source, null);
+ Model.getStateMachinesHelper().setExit(cs, exit);
+ for (Object de : deferEvts) {
+ Model.getStateMachinesHelper().removeDeferrableEvent(source, de);
+ Model.getStateMachinesHelper().addDeferrableEvent(cs, de);
+ }
+ Model.getStateMachinesHelper().setInternalTransitions(source, Collections.EMPTY_LIST);
+ Model.getStateMachinesHelper().setInternalTransitions(cs, intTrans);
+ Model.getStateMachinesHelper().setDoActivity(source, null);
+ Model.getStateMachinesHelper().setDoActivity(cs, doActivity);
+ Model.getStateMachinesHelper().setStateMachine(cs, sm);
+ for (Object to : outgoings) {
+ Model.getStateMachinesHelper().setSource(to, null);
+ Model.getStateMachinesHelper().setSource(to, cs);
+ }
+ for (Object ti : incomings) {
+ Model.getCommonBehaviorHelper().setTarget(ti, null);
+ Model.getCommonBehaviorHelper().setTarget(ti, cs);
+ }
+ Model.getCoreHelper().setName(cs, name);
+
+
+
+ // This is not necessarily the current diagram!
+ Collection<Fig> figs = p.findAllPresentationsFor(source);
+ LOG.debug("Transformer found " + figs.size() + " representations (Figs).");
+ for (Fig ssFig : figs) {
+ LOG.debug("Transformer found a Fig: " + ssFig);
+ assert ssFig.getOwner() == source;
+ assert ssFig instanceof FigSimpleState;
+ Rectangle bounds = ssFig.getBounds();
+ DiagramSettings settings = ((FigNodeModelElement) ssFig).getSettings();
+ Layer lay = ssFig.getLayer();
+ /* Remove the old fig from the diagram, so we can draw the
+ * new one in its place: */
+ ssFig.removeFromDiagram();
+
+ FigCompositeState fcs =
+ new FigCompositeState(cs, bounds, settings);
+ lay.add(fcs);
+ fcs.setBounds(bounds);
+ ((LayerPerspective) lay).putInPosition(fcs);
+ fcs.renderingChanged();
+
+ for (Object to : outgoings) {
+ makeTransition(settings, lay, to);
+ }
+ for (Object ti : incomings) {
+ makeTransition(settings, lay, ti);
+ }
+ }
+
+ Model.getUmlFactory().delete(source);
+// p.moveToTrash(source);
+ }
+
+ private void makeTransition(DiagramSettings settings, Layer lay,
+ Object transUml) {
+ FigTransition transFig = new FigTransition(transUml, settings);
+ setPorts(lay, transFig);
+ lay.add(transFig);
+ transFig.computeRoute();
+ transFig.renderingChanged();
+ }
+
+ /**
+ * TODO: Copied from UmlDiagramRenderer.
+ *
+ * Find the Figs in the given layer that should be the source and
+ * destination and attach these to either end of the FigEdge
+ * @param layer the layer to look for the FigNodes
+ * @param newEdge The edge to attach
+ */
+ protected final void setPorts(Layer layer, FigEdge newEdge) {
+ Object modelElement = newEdge.getOwner();
+ if (newEdge.getSourcePortFig() == null) {
+ Object tSource;
+ tSource = Model.getUmlHelper().getSource(modelElement);
+ FigNode sourceNode = getNodePresentationFor(layer, tSource);
+ assert (sourceNode != null) : "No FigNode found for " + tSource;
+ setSourcePort(newEdge, sourceNode);
+ }
+ if (newEdge.getDestPortFig() == null) {
+ Object tDest;
+ tDest = Model.getUmlHelper().getDestination(newEdge.getOwner());
+ setDestPort(newEdge, getNodePresentationFor(layer, tDest));
+ }
+ if (newEdge.getSourcePortFig() == null
+ || newEdge.getDestPortFig() == null) {
+ throw new IllegalStateException("Edge of type "
+ + newEdge.getClass().getName()
+ + " created with no source or destination port");
+ }
+ }
+
+ private void setSourcePort(FigEdge edge, FigNode source) {
+ edge.setSourcePortFig(source);
+ edge.setSourceFigNode(source);
+ }
+
+ private void setDestPort(FigEdge edge, FigNode dest) {
+ edge.setDestPortFig(dest);
+ edge.setDestFigNode(dest);
+ }
+
+ /**
+ * TODO: Copied from UmlDiagramRenderer.
+ *
+ * Get the FigNode from the given layer that represents the given
+ * model element.
+ * The FigNode portion of an association class is returned in preference
+ * to the FigEdge portion.
+ * If no FigNode is found then a FIgEdge is searched for and the FigNode
+ * that acts as its edge port is returned.
+ * @param lay the layer containing the Fig
+ * @param modelElement the model element to find presentation for
+ * @return the FigNode presentation of the model element
+ */
+ private FigNode getNodePresentationFor(Layer lay, Object modelElement) {
+ assert modelElement != null : "A modelElement must be supplied";
+ for (Object fig : lay.getContentsNoEdges()) {
+
+ if (fig instanceof FigNode
+ && modelElement.equals(((FigNode) fig).getOwner())) {
+ return ((FigNode) fig);
+ }
+ }
+ for (Object fig : lay.getContentsEdgesOnly()) {
+ if (fig instanceof FigEdgeModelElement
+ && modelElement.equals(((FigEdgeModelElement) fig)
+ .getOwner())) {
+ return ((FigEdgeModelElement) fig).getEdgePort();
+ }
+ }
+ return null;
+ }
+ }
+
+}
Added: trunk/src/argouml-app/src/org/argouml/uml/transformer/Transformer.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/transformer/Transformer.java?view=markup&pathrev=18611
==============================================================================
--- (empty file)
+++ trunk/src/argouml-app/src/org/argouml/uml/transformer/Transformer.java 2010-07-30 06:18:06-0700
@@ -0,0 +1,48 @@
+/* $Id$
+ *******************************************************************************
+ * Copyright (c) 2010 Contributors - see below
+ * 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:
+ * mvw
+ *******************************************************************************
+ */
+
+package org.argouml.uml.transformer;
+
+import java.util.List;
+
+import javax.swing.Action;
+
+import org.argouml.kernel.Project;
+
+/**
+ * Interface implemented by a class that is able to transform
+ * (convert, mutate) one modelelement into another type.
+ * E.g. converting a SimpleState into a CompositeState.
+ *
+ * @author mvw
+ */
+interface Transformer {
+
+ /**
+ * Determine if this implementation is able to transform the supplied
+ * element. In fact, this boolean only determines if the transformation
+ * menu will become visible - it is still exceptionally possible that the
+ * actual conversion fails.
+ *
+ * @param sourceModelElement an UML element. Null is not allowed.
+ * @return true if the given element is transformable
+ */
+ boolean canTransform(Object sourceModelElement);
+
+ /**
+ * @param p the project in which the modelelement resides
+ * @param sourceModelElement
+ * @return
+ */
+ List<Action> actions(Project p, Object sourceModelElement);
+}
Added: trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerAction.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerAction.java?view=markup&pathrev=18611
==============================================================================
--- (empty file)
+++ trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerAction.java 2010-07-30 06:18:06-0700
@@ -0,0 +1,49 @@
+/* $Id$
+ *******************************************************************************
+ * Copyright (c) 2010 Contributors - see below
+ * 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:
+ * mvw
+ *******************************************************************************
+ */
+
+package org.argouml.uml.transformer;
+
+
+import javax.swing.Action;
+
+import org.argouml.application.helpers.ResourceLoaderWrapper;
+import org.argouml.i18n.Translator;
+import org.argouml.kernel.Project;
+import org.argouml.ui.UndoableAction;
+
+/**
+ * This class guarantees a similar layout for all transformer menu items.
+ *
+ * @author mvw
+ */
+class TransformerAction extends UndoableAction {
+ protected Project p;
+ protected Object source;
+
+ /**
+ * Constructor.
+ */
+ TransformerAction(String s) {
+ Object icon = ResourceLoaderWrapper.lookupIcon(s);
+ putValue(Action.NAME, Translator.localize(s));
+ putValue(Action.SMALL_ICON, icon);
+ // Set the tooltip string:
+ putValue(Action.SHORT_DESCRIPTION, Translator.localize(s));
+ }
+
+ TransformerAction(String nameKey, Project project, Object sourceModelElement) {
+ this(nameKey);
+ p = project;
+ source = sourceModelElement;
+ }
+}
Added: trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerManager.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerManager.java?view=markup&pathrev=18611
==============================================================================
--- (empty file)
+++ trunk/src/argouml-app/src/org/argouml/uml/transformer/TransformerManager.java 2010-07-30 06:18:06-0700
@@ -0,0 +1,80 @@
+/* $Id$
+ *******************************************************************************
+ * Copyright (c) 2010 Contributors - see below
+ * 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:
+ * michiel
+ *******************************************************************************
+ */
+
+package org.argouml.uml.transformer;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import javax.swing.Action;
+
+import org.argouml.kernel.Project;
+
+/**
+ * This is a singleton.
+ *
+ * @author mvw
+ */
+public final class TransformerManager {
+
+ private HashSet<Transformer> transformers;
+
+ /**
+ * The singleton instance.
+ */
+ private static TransformerManager instance = new TransformerManager();
+
+ /**
+ * Singleton constructor should remain private.
+ */
+ private TransformerManager() {
+ }
+
+ /**
+ * Singleton retrieval method.
+ * @return the transformermanager
+ */
+ public static TransformerManager getInstance() {
+ return instance;
+ }
+
+ private HashSet<Transformer> getTransformers() {
+ if (transformers == null) {
+ transformers = new HashSet<Transformer>();
+ }
+ return transformers;
+ }
+
+ void addTransformer(Transformer t) {
+ getTransformers().add(t);
+ }
+
+ /**
+ * Returns an ordered list of Actions that transform the given
+ * modelelement into another.
+ *
+ * @param p the current project
+ * @param sourceModelElement the given source modelelement
+ * @return ordered list of Actions suitable for inclusion in a Menu
+ */
+ public List<Action> actions(Project p, Object sourceModelElement) {
+ List<Action> result = new ArrayList<Action>();
+ for (Transformer t : getTransformers()) {
+ if (t.canTransform(sourceModelElement)) {
+ result.addAll(t.actions(p, sourceModelElement));
+ }
+ }
+ return result;
+ }
+}
Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CommonBehaviorHelperMDRImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CommonBehaviorHelperMDRImpl.java?view=diff&pathrev=18611&r1=18610&r2=18611
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CommonBehaviorHelperMDRImpl.java (original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CommonBehaviorHelperMDRImpl.java 2010-07-30 06:18:06-0700
@@ -1,6 +1,6 @@
/* $Id$
*****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
* 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
@@ -8,6 +8,7 @@
*
* Contributors:
* tfmorris
+ * mvw
*****************************************************************************
*
* Some portions of this file was previously release using the BSD License:
@@ -515,7 +516,8 @@
((Action) handle).setTarget((ObjectSetExpression) element);
return;
}
- if (handle instanceof Transition && element instanceof StateVertex) {
+ if (handle instanceof Transition &&
+ (element == null || element instanceof StateVertex)) {
((Transition) handle).setTarget((StateVertex) element);
return;
}
Modified: trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java?view=diff&pathrev=18611&r1=18610&r2=18611
==============================================================================
--- trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java (original)
+++ trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/StateMachinesHelperMDRImpl.java 2010-07-30 06:18:06-0700
@@ -540,7 +540,8 @@
public void setSource(Object handle, Object state) {
- if (handle instanceof Transition && state instanceof StateVertex) {
+ if (handle instanceof Transition &&
+ (state == null || state instanceof StateVertex)) {
((Transition) handle).setSource((StateVertex) state);
return;
}
Modified: trunk/src/argouml-core-model/src/org/argouml/model/CommonBehaviorHelper.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model/src/org/argouml/model/CommonBehaviorHelper.java?view=diff&pathrev=18611&r1=18610&r2=18611
==============================================================================
--- trunk/src/argouml-core-model/src/org/argouml/model/CommonBehaviorHelper.java (original)
+++ trunk/src/argouml-core-model/src/org/argouml/model/CommonBehaviorHelper.java 2010-07-30 06:18:06-0700
@@ -1,6 +1,6 @@
/* $Id$
*******************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2010 Contributors - see below
* 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
@@ -8,6 +8,7 @@
*
* Contributors:
* tfmorris
+ * mvw
*******************************************************************************
*
* Some portions of this file was previously release using the BSD License:
@@ -288,7 +289,7 @@
* Sets the target of some action or transition.
*
* @param handle the model element
- * @param element the target of the model elemnet
+ * @param element the target of the model element or null
*/
void setTarget(Object handle, Object element);
Modified: trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java?view=diff&pathrev=18611&r1=18610&r2=18611
==============================================================================
--- trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java (original)
+++ trunk/src/argouml-core-model/src/org/argouml/model/StateMachinesHelper.java 2010-07-30 06:18:06-0700
@@ -89,7 +89,7 @@
* implementation, the parameters of the method are of type Object.<p>
*
* @param transition the given transition
- * @param event the given event
+ * @param event the given event or null
*/
void setEventAsTrigger(Object transition, Object event);
@@ -301,10 +301,10 @@
void setInternalTransitions(Object handle, Collection intTrans);
/**
- * Sets the source state of some message.
+ * Sets the source state of some transition.
*
- * @param handle the message
- * @param state the source state
+ * @param handle the transition
+ * @param state the source state or null
*/
void setSource(Object handle, Object state);
------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2640691
To unsubscribe from this discussion, e-mail: [[email protected]].
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.