Author: bobtarling
Date: 2011-05-20 03:51:10-0700
New Revision: 19471

Added:
   
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigRegion.java
   
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigVertex.java
Removed:
   
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/BaseDiagram.java
   
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramRenderer.java
Modified:
   
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramFactory.java
   
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramGraphModel.java
   
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/UMLStateDiagram.java

Log:
Move UML2 state diagram code into module

Removed: 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/BaseDiagram.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/BaseDiagram.java?view=markup&pathrev=19470

Added: 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigRegion.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigRegion.java?view=markup&pathrev=19471
==============================================================================
--- (empty file)
+++ 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigRegion.java
        2011-05-20 03:51:10-0700
@@ -0,0 +1,44 @@
+/* $Id: $
+ *****************************************************************************
+ * Copyright (c) 2011 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:
+ *    Bob Tarling
+ *****************************************************************************
+ */
+
+package org.argouml.state2.diagram;
+
+import java.awt.Dimension;
+import org.tigris.gef.presentation.FigRect;
+
+/**
+ * Displays a region within a composite state
+ */
+public class FigRegion extends FigRect {
+
+    /**
+     * Construct a fig representing a region.
+     * 
+     * @param region owning UML element
+     * @param bounds position and size
+     */
+    public FigRegion(
+            final Object region) {
+        super(0,0,0,0);
+        setLineWidth(0);
+        setOwner(region);
+    }
+    
+    /*
+     * @see org.tigris.gef.presentation.Fig#getMinimumSize()
+     */
+    @Override
+    public Dimension getMinimumSize() {
+        return new Dimension(180, 80);
+    }
+}

Added: 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigVertex.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigVertex.java?view=markup&pathrev=19471
==============================================================================
--- (empty file)
+++ 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/FigVertex.java
        2011-05-20 03:51:10-0700
@@ -0,0 +1,502 @@
+/* $Id: $
+ *****************************************************************************
+ * Copyright (c) 2011 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:
+ *    Bob Tarling
+ *****************************************************************************
+ */
+
+package org.argouml.state2.diagram;
+
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyVetoException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+import org.argouml.model.AddAssociationEvent;
+import org.argouml.model.Model;
+import org.argouml.model.RemoveAssociationEvent;
+import org.argouml.notation.Notation;
+import org.argouml.notation.NotationName;
+import org.argouml.notation.NotationProvider;
+import org.argouml.notation.NotationProviderFactory2;
+import org.argouml.notation.NotationSettings;
+import org.argouml.ui.ActionCreateContainedModelElement;
+import org.argouml.ui.targetmanager.TargetManager;
+import org.argouml.uml.diagram.ArgoDiagram;
+import org.argouml.uml.diagram.DiagramSettings;
+import org.argouml.uml.diagram.ui.FigNodeModelElement;
+import org.tigris.gef.base.LayerPerspective;
+import org.tigris.gef.base.Selection;
+import org.tigris.gef.di.DiagramElement;
+import org.tigris.gef.presentation.Fig;
+import org.tigris.gef.presentation.FigGroup;
+import org.tigris.gef.presentation.FigRRect;
+import org.tigris.gef.presentation.FigText;
+
+/**
+ * A Fig that can represent a UML2 vertex. The current implementation
+ * is limited to just handling States. Other vertices are currently handled
+ * by different Figs but they will most likely all be handled here in future.
+ */
+public class FigVertex extends FigNodeModelElement {
+
+    private static final Logger LOG = Logger.getLogger(FigVertex.class);
+    
+    private static final int MARGIN = 2;
+
+    private NotationProvider notationProviderBody;
+
+    /**
+     * The body for entry/exit/do actions
+     */
+    private FigBody bodyText;
+    
+    private FigGroup regionCompartment;
+
+    /**
+     * Create a new instance of FigVertex
+     * @param owner the vertex that own this dagram element
+     * @param bounds the bounds of the diagram element
+     * @param settings the display settings for this diagram element
+     */
+    public FigVertex(Object owner, Rectangle bounds, DiagramSettings settings) 
{
+        super(owner, bounds, settings);
+        this.allowRemoveFromDiagram(false);
+
+        initialize();
+
+        NotationName notation = Notation.findNotation(getNotationSettings()
+                .getNotationLanguage());
+        notationProviderBody = NotationProviderFactory2.getInstance()
+                .getNotationProvider(NotationProviderFactory2.TYPE_STATEBODY,
+                        getOwner(), this, notation);
+        updateNameText();
+        
+        LOG.info("Registering as listener");
+        Model.getPump().addModelEventListener(this, getOwner(), "region");
+    }
+
+    @Override
+    public void setEnclosingFig(Fig encloser) {
+        LayerPerspective lp = (LayerPerspective) getLayer();
+        if (lp == null) {
+            return;
+        }
+        
+        super.setEnclosingFig(encloser);
+
+        Object region = null;
+        if (encloser != null) {
+            // Get the region as the first Region in the State.
+            // If there is no region in the StateMachine then create one.
+            List regions = Model.getStateMachinesHelper().getRegions(
+                    encloser.getOwner());
+            if (regions.isEmpty()) {
+                // There are no regions so create one and place the vertex 
there.
+                region = Model.getUmlFactory().buildNode(
+                        Model.getMetaTypes().getRegion(), encloser.getOwner());
+            } else {
+                // There are one or more regions so find the one that the
+                //vertex was dropped in
+                FigVertex compositeState = (FigVertex) encloser;
+                for (DiagramElement de :
+                        compositeState.regionCompartment.getDiagramElements()) 
{
+                    if (((Fig) de).getBounds().contains(getBounds())) {
+                        region = de.getOwner();
+                        break;
+                    }
+                }
+            }
+        } else {
+            // The vertex was dropped onto the diagram.
+            // Get the region as the first Region in the StateMachine.
+            // If there is no region in the StateMachine then create one.
+            ArgoDiagram diagram = (ArgoDiagram) lp.getDiagram();
+            Object stateMachine = diagram.getOwner();
+            List regions = 
+                Model.getStateMachinesHelper().getRegions(stateMachine);
+            if (regions.isEmpty()) {
+                region = Model.getUmlFactory().buildNode(
+                        Model.getMetaTypes().getRegion(), stateMachine);
+            } else {
+                region = regions.get(0);
+            }
+        }
+        if (region != null
+                && Model.getFacade().getContainer(getOwner()) != region) {
+            Model.getStateMachinesHelper().setContainer(getOwner(), region);
+        }
+    }
+
+    @Override
+    protected Fig createBigPortFig() {
+        return new FigRRect(0, 0, 0, 0, LINE_COLOR, FILL_COLOR);
+    }
+
+    private void initialize() {
+        getNameFig().setLineWidth(0);
+        getNameFig().setFilled(false);
+
+        bodyText = new FigBody(0,0,0,0);
+        regionCompartment = new FigRegionCompartment(0,0,0,0);
+        
+        addFig(getBigPort());
+        addFig(getNameFig());
+        addFig(getBodyText());
+        addFig(regionCompartment);
+
+        setBounds(getBounds());
+    }
+
+    /*
+     * @see
+     * org.argouml.uml.diagram.state.ui.FigStateVertex#initNotationProviders
+     * (java.lang.Object)
+     */
+    @Override
+    protected void initNotationProviders(Object own) {
+        if (notationProviderBody != null) {
+            notationProviderBody.cleanListener();
+        }
+        super.initNotationProviders(own);
+        NotationName notation = Notation.findNotation(getNotationSettings()
+                .getNotationLanguage());
+        if (Model.getFacade().isAState(own)) {
+            notationProviderBody = NotationProviderFactory2.getInstance()
+                    .getNotationProvider(
+                            NotationProviderFactory2.TYPE_STATEBODY, own, this,
+                            notation);
+        }
+    }
+
+    // Temporary start
+//    private static final Color[] COLOR_ARRAY = {
+//        Color.RED, Color.BLUE, Color.CYAN, Color.YELLOW, Color.GREEN}; 
+//    private int nextColor = 0;
+    // Temporary end
+    
+    @Override
+    protected void modelChanged(PropertyChangeEvent mee) {
+        super.modelChanged(mee);
+        
+        assert(mee.getPropertyName().equals("region"));
+        
+        if (mee instanceof AddAssociationEvent) {
+            // TODO: Before adding a new region make the last region
+            // its minimum size (smallest size that will still
+            // contain all enclosed)
+            
+            Object newRegion = mee.getNewValue();
+            FigRegion rg = new FigRegion(newRegion);
+            rg.setBounds(
+                    regionCompartment.getX(), regionCompartment.getY(),
+                    rg.getMinimumSize().width, rg.getMinimumSize().height);
+            
+            // Temporary start - colour the regions so that we can see them 
for now
+//            rg.setFillColor(COLOR_ARRAY[nextColor++]);
+//            if (nextColor >= COLOR_ARRAY.length) {
+//                nextColor = 0;
+//            }
+            // Temporary end
+            
+            regionCompartment.addFig(rg);
+            setSize(getMinimumSize());
+        }
+        if (mee instanceof RemoveAssociationEvent) {
+            Object oldRegion = mee.getNewValue();
+            for (DiagramElement de : regionCompartment.getDiagramElements()) {
+                if (de.getOwner() == oldRegion) {
+                    regionCompartment.removeFig((Fig) de);
+                    // TODO: After removing a region reset the overall
+                    // size of the node.
+                    renderingChanged();
+                    damage();
+                }
+            }
+            LOG.debug("Removing region " + oldRegion);
+        }
+    }
+
+    /*
+     * @see
+     * org.argouml.uml.diagram.ui.FigNodeModelElement#removeFromDiagramImpl()
+     */
+    @Override
+    public void removeFromDiagramImpl() {
+        if (notationProviderBody != null) {
+            notationProviderBody.cleanListener();
+        }
+        super.removeFromDiagramImpl();
+    }
+
+    /*
+     * @see org.argouml.uml.diagram.ui.FigNodeModelElement#renderingChanged()
+     */
+    @Override
+    public void renderingChanged() {
+        super.renderingChanged();
+        if (notationProviderBody != null) {
+            bodyText.setText(notationProviderBody.toString(getOwner(),
+                    getNotationSettings()));
+        }
+        calcBounds();
+        setBounds(getBounds());
+    }
+
+    private FigText getBodyText() {
+        return bodyText;
+    }
+
+    @Override
+    protected void textEditStarted(FigText ft) {
+        super.textEditStarted(ft);
+        if (ft == bodyText) {
+            showHelp(notationProviderBody.getParsingHelp());
+        }
+    }
+
+    @Override
+    public void textEdited(FigText ft) throws PropertyVetoException {
+        super.textEdited(ft);
+        if (ft == getBodyText()) {
+            notationProviderBody.parse(getOwner(), ft.getText());
+            ft.setText(notationProviderBody.toString(getOwner(),
+                    getNotationSettings()));
+        }
+    }
+
+    public void notationRenderingChanged(NotationProvider np, String 
rendering) {
+        super.notationRenderingChanged(np, rendering);
+        if (notationProviderBody == np) {
+            bodyText.setText(rendering);
+            updateBounds();
+            damage();
+        }
+    }
+
+    public NotationSettings getNotationSettings(NotationProvider np) {
+        return getNotationSettings();
+    }
+
+    public Object getOwner(NotationProvider np) {
+        return getOwner();
+    }
+
+    public Dimension getMinimumSize() {
+        final Dimension nameSize = getNameFig().getMinimumSize();
+        final Dimension bodySize = getBodyText().getMinimumSize();
+
+        int h = getTopMargin()
+            + nameSize.height
+            + getBottomMargin();
+
+        h += regionCompartment.getMinimumSize().height;
+        
+        if (getBodyText().getText().length() > 0) {
+            h += bodySize.height;
+        }
+        
+        int w = getLeftMargin()
+            + Math.max(nameSize.width, bodySize.width)
+            + getRightMargin();
+        
+        if (Model.getFacade().isACompositeState(getOwner())) {
+            w = Math.max(180, w);
+            h = Math.max(150, h);
+        } else {
+            w = Math.max(80, w);
+            h = Math.max(40, h);
+        }
+        
+        return new Dimension(w, h);
+    }
+
+    public boolean getUseTrapRect() {
+        return true;
+    }
+
+    public List<Rectangle> getTrapRects() {
+        List regions = Model.getStateMachinesHelper().getRegions(getOwner());
+        
+        ArrayList<Rectangle> rects = new ArrayList<Rectangle>(regions.size());
+        if (regions.isEmpty()) {
+            rects.add(regionCompartment.getBounds());
+        } else {
+            for (DiagramElement f : regionCompartment.getDiagramElements()) {
+                rects.add(((Fig) f).getBounds());
+            }
+        }
+        return rects;
+    }
+    
+    protected void setStandardBounds(int x, int y, int w, int h) {
+        Dimension nameSize = getNameFig().getMinimumSize();
+        Dimension bodySize = getBodyText().getMinimumSize();
+
+        getNameFig().setBounds(
+                x + getLeftMargin(), y + getTopMargin(),
+                w - getLeftMargin() - getRightMargin(), nameSize.height);
+
+
+        
+        if (getBodyText().getText().length() > 0) {
+            getBodyText().setBounds(
+                    x + getLeftMargin(), y + getTopMargin() + nameSize.height,
+                    bodySize.width,
+                    bodySize.height);
+        } else {
+            getBodyText().setBounds(
+                    x + getLeftMargin(), y + getTopMargin() + nameSize.height,
+                    bodySize.width,
+                    1);
+        }
+        
+        regionCompartment.setBounds(
+                x + getLeftMargin(),
+                getBodyText().getY() + getBodyText().getHeight(),
+                w - getLeftMargin() - getRightMargin(),
+                h - getTopMargin() - getBottomMargin()
+                    - getNameFig().getHeight() - getBodyText().getHeight());
+
+        getBigPort().setBounds(x, y, w, h);
+        
+        calcBounds(); // _x = x; _y = y; _w = w; _h = h;
+    }
+    
+    
+    
+    int getRightMargin() {
+        return MARGIN;
+    }
+
+    int getLeftMargin() {
+        return MARGIN;
+    }
+    
+    int getTopMargin() {
+        return MARGIN;
+    }
+    
+    int getBottomMargin() {
+        return MARGIN;
+    }
+    
+    /*
+     * @see 
org.tigris.gef.ui.PopupGenerator#getPopUpActions(java.awt.event.MouseEvent)
+     */
+    public Vector getPopUpActions(MouseEvent me) {
+        Vector popUpActions = super.getPopUpActions(me);
+        if (TargetManager.getInstance().getTargets().size() == 1) {
+            popUpActions.add(
+                    popUpActions.size() - getPopupAddOffset(),
+                    new ActionCreateContainedModelElement(
+                            Model.getMetaTypes().getRegion(), getOwner()));
+        }
+        return popUpActions;
+    }
+    
+    /**
+     * The text Fig that displays the body of the actions on the state
+     *
+     * @author Bob Tarling
+     */
+    private class FigBody extends FigText {
+        public FigBody(int x, int y, int width, int height) {
+            super (x, y, width, height);
+            setFont(getSettings().getFont(Font.PLAIN));
+            setTextColor(TEXT_COLOR);
+            setLineWidth(0);
+            setFilled(false);
+            setExpandOnly(true);
+            setReturnAction(FigText.INSERT);
+            setJustification(FigText.JUSTIFY_LEFT);
+        }
+    }
+    
+    /**
+     * The text Fig that displays the body of the actions on the state
+     *
+     * @author Bob Tarling
+     */
+    private class FigRegionCompartment extends FigGroup {
+        public FigRegionCompartment(int x, int y, int width, int height) {
+            super();
+        }
+        
+        @Override
+        protected void setBoundsImpl(
+                final int x,
+                int y,
+                final int w,
+                int h) {
+
+            _x = x;
+            _y = y;
+            _w = w;
+            _h = h;
+            
+            for (Iterator it = getFigs().iterator(); it.hasNext(); ) {
+                Fig fig = (Fig) it.next();
+                if (it.hasNext()) {
+                    fig.setBounds(x, y, w, fig.getMinimumSize().height);
+                    h -= fig.getMinimumSize().height;
+                } else {
+                    fig.setBounds(x, y, w, h);
+                }
+                y += fig.getHeight();
+            }
+        }
+        
+        
+        @Override
+        public Dimension getMinimumSize() {
+            int minWidth = 0;
+            int minHeight = 0;
+            for (Iterator it = getFigs().iterator(); it.hasNext(); ) {
+                Fig fig = (Fig) it.next();
+                minWidth = Math.max(fig.getMinimumSize().width, minWidth);
+                if (it.hasNext()) {
+                    minHeight += fig.getHeight();
+                } else {
+                    minHeight += fig.getMinimumSize().height;
+                }
+            }
+
+            return new Dimension(minWidth, minHeight);
+        }
+        
+        public void paint(Graphics g) {
+            super.paint(g);
+            
+            for (Iterator it = getFigs().iterator(); it.hasNext(); ) {
+                Fig fig = (Fig) it.next();
+                if (it.hasNext()) {
+                    g.setColor(getLineColor());
+                    
+                    drawDashedLine(
+                            g, 1, 
+                            fig.getX(), 
+                            fig.getY() + fig.getHeight(),
+                            fig.getX() + fig.getWidth(),
+                            fig.getY() + fig.getHeight(),
+                            0, new float [] { 5.0f, 5.0f }, 10);            
+                }
+            }
+            
+        }
+    }
+}

Modified: 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramFactory.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramFactory.java?view=diff&pathrev=19471&r1=19470&r2=19471
==============================================================================
--- 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramFactory.java
      (original)
+++ 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramFactory.java
      2011-05-20 03:51:10-0700
@@ -13,9 +13,6 @@
 
 package org.argouml.state2.diagram;
 
-import java.beans.PropertyVetoException;
-
-import org.apache.log4j.Logger;
 import org.argouml.uml.diagram.ArgoDiagram;
 import org.argouml.uml.diagram.DiagramFactoryInterface2;
 import org.argouml.uml.diagram.DiagramSettings;
@@ -23,23 +20,8 @@
 public class StateDiagramFactory
         implements DiagramFactoryInterface2{
 
-    /**
-     * Logger.
-     */
-    private static final Logger LOG =
-        Logger.getLogger(StateDiagramFactory.class);
-    
     public ArgoDiagram createDiagram(Object owner, String name,
             DiagramSettings settings) {
-        final ArgoDiagram diagram = new UMLStateDiagram(owner);
-        if (name != null) {
-            try {
-                diagram.setName(name);
-            } catch (PropertyVetoException e) {            
-                LOG.error("Cannot set the name " + name + 
-                        " to the diagram just created: "+ diagram.getName(), 
e);
-            }
-        }
-        return diagram;  
+        return new UMLStateDiagram(name, owner);
     }
 }

Modified: 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramGraphModel.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramGraphModel.java?view=diff&pathrev=19471&r1=19470&r2=19471
==============================================================================
--- 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramGraphModel.java
   (original)
+++ 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramGraphModel.java
   2011-05-20 03:51:10-0700
@@ -1,4 +1,4 @@
-/* $Id:$
+/* $Id: StateDiagramGraphModel.java 19385 2011-05-09 19:41:39Z bobtarling $
  *****************************************************************************
  * Copyright (c) 2009 Contributors - see below
  * All rights reserved. This program and the accompanying materials
@@ -7,52 +7,43 @@
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *    Bob Tarling
+ *    bobtarling
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
  */
 
-package org.argouml.state2.diagram;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.argouml.model.Model;
-import org.argouml.uml.diagram.UMLMutableGraphSupport;
-
-class StateDiagramGraphModel extends UMLMutableGraphSupport {
-
-    /**
-     * Logger.
-     */
-    private static final Logger LOG = Logger
-            .getLogger(StateDiagramGraphModel.class);
-
-    public StateDiagramGraphModel() {
-        super();
-    }
-
-    /*
-     * @see org.tigris.gef.graph.GraphModel#getPorts(java.lang.Object)
-     */
-    public List getPorts(Object nodeOrEdge) {
-        List res = new ArrayList();
-        return res;
-    }
+// Copyright (c) 1996-2006 The Regents of the University of California. All
+// Rights Reserved. Permission to use, copy, modify, and distribute this
+// software and its documentation without fee, and without a written
+// agreement is hereby granted, provided that the above copyright notice
+// and this paragraph appear in all copies. This software program and
+// documentation are copyrighted by The Regents of the University of
+// California. The software program and documentation are supplied "AS
+// IS", without any accompanying services from The Regents. The Regents
+// does not warrant that the operation of the program will be
+// uninterrupted or error-free. The end-user understands that the program
+// was developed for research purposes and is advised not to rely
+// exclusively on the program for any reason. IN NO EVENT SHALL THE
+// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
+// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
+// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
+// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
+// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
+// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
+// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 
-    public List getInEdges(Object port) {
-        // TODO: Auto-generated method stub
-        return null;
-    }
+package org.argouml.state2.diagram;
 
-    public List getOutEdges(Object port) {
-        // TODO: Auto-generated method stub
-        return null;
-    }
+public class StateDiagramGraphModel extends 
org.argouml.uml.diagram.state.StateDiagramGraphModel {
 
-    public Object getOwner(Object port) {
-        return port;
+    
+    public void setHomeModel(Object ns) {
+        super.setHomeModel(ns);
+        setMachine(ns);
     }
+    
 }

Removed: 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramRenderer.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/StateDiagramRenderer.java?view=markup&pathrev=19470

Modified: 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/UMLStateDiagram.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/UMLStateDiagram.java?view=diff&pathrev=19471&r1=19470&r2=19471
==============================================================================
--- 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/UMLStateDiagram.java
  (original)
+++ 
trunk/src/argouml-core-diagrams-state2/src/org/argouml/state2/diagram/UMLStateDiagram.java
  2011-05-20 03:51:10-0700
@@ -1,6 +1,6 @@
 /* $Id: $
  *****************************************************************************
- * Copyright (c) 2010 Contributors - see below
+ * Copyright (c) 2009-2011 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
@@ -14,70 +14,186 @@
 package org.argouml.state2.diagram;
 
 import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyVetoException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.swing.Action;
 
-import org.apache.log4j.Logger;
 import org.argouml.i18n.Translator;
+import org.argouml.model.DeleteInstanceEvent;
 import org.argouml.model.Model;
-import org.argouml.model.StateDiagram;
+import org.argouml.ui.CmdCreateNode;
 import org.argouml.uml.diagram.DiagramElement;
+import org.argouml.uml.diagram.DiagramFactory;
 import org.argouml.uml.diagram.DiagramSettings;
-import org.argouml.uml.diagram.UMLMutableGraphSupport;
-import org.argouml.uml.diagram.UmlDiagramRenderer;
+import org.argouml.uml.diagram.state.ui.FigBranchState;
+import org.argouml.uml.diagram.state.ui.FigDeepHistoryState;
+import org.argouml.uml.diagram.state.ui.FigFinalState;
+import org.argouml.uml.diagram.state.ui.FigForkState;
+import org.argouml.uml.diagram.state.ui.FigInitialState;
+import org.argouml.uml.diagram.state.ui.FigJoinState;
+import org.argouml.uml.diagram.state.ui.FigJunctionState;
+import org.argouml.uml.diagram.state.ui.FigShallowHistoryState;
+import org.argouml.uml.diagram.state.ui.StateDiagramRenderer;
 import org.argouml.uml.diagram.static_structure.ui.FigComment;
+import org.argouml.uml.diagram.ui.ActionSetMode;
 import org.argouml.uml.diagram.ui.FigNodeModelElement;
+import org.argouml.uml.diagram.ui.RadioAction;
+import org.argouml.uml.diagram.ui.UMLDiagram;
+import org.tigris.gef.base.LayerPerspective;
+import org.tigris.gef.base.LayerPerspectiveMutable;
+import org.tigris.gef.base.ModeCreatePolyEdge;
+import org.tigris.gef.presentation.FigNode;
 
-public class UMLStateDiagram extends BaseDiagram implements StateDiagram {
-    
-    private static final Logger LOG = Logger
-        .getLogger(UMLStateDiagram.class);
-    
-    public UMLStateDiagram(Object stateMachine) {
-        super(stateMachine);
-    }
-    
-    @Override
-    UmlDiagramRenderer createDiagramRenderer() {
-        return new StateDiagramRenderer();
+/**
+ * Diagram for UML2 State Machine diagram
+ * @author Bob Tarling
+ */
+public class UMLStateDiagram extends UMLDiagram {
+
+    /**
+     * Construct a new State Machine diagram.
+     * 
+     * @param name the name of the new diagram
+     * @param machine the owner of the diagram which will be a state machine
+     */
+    public UMLStateDiagram(String name, Object machine) {
+        super(name, machine, new StateDiagramGraphModel());
+        if (name == null || name.trim().length() == 0) {
+            name = getLabelName() + Model.getFacade().getName(machine);
+            try {
+                setName(name);
+            } catch (PropertyVetoException pve) {
+                // nothing we can do about veto, so just ignore it
+            }
+        }
+        initialize(machine);
     }
 
     @Override
-    UMLMutableGraphSupport createGraphModel() {
-        return new StateDiagramGraphModel(); 
+    public void initialize(Object o) {
+
+        setNamespace(o);
+
+        StateDiagramGraphModel gm = createGraphModel();
+        gm.setHomeModel(namespace);
+        StateDiagramRenderer rend = new StateDiagramRenderer();
+
+        LayerPerspective lay = new LayerPerspectiveMutable(
+                Model.getFacade().getName(namespace), gm);
+        lay.setGraphNodeRenderer(rend);
+        lay.setGraphEdgeRenderer(rend);
+        setLayer(lay);
+
+        Model.getPump().addModelEventListener(this, namespace, 
+                new String[] {"remove"});
     }
 
-    @Override
-    Object[] getNewEdgeTypes() {
-        return new Object[] {
-        };
+    private StateDiagramGraphModel createGraphModel() {
+        if ((getGraphModel() instanceof StateDiagramGraphModel)) {
+            return (StateDiagramGraphModel) getGraphModel();
+        } else {
+            return new StateDiagramGraphModel();
+        }
     }
 
+    /*
+     * @see 
org.argouml.uml.diagram.ui.UMLDiagram#propertyChange(java.beans.PropertyChangeEvent)
+     */
     @Override
-    Object[] getNewNodeTypes() {
-        return new Object[] {
-        };
+    public void propertyChange(PropertyChangeEvent evt) {
+        if ((evt.getSource() == namespace)
+                && (evt instanceof DeleteInstanceEvent)) {
+            Model.getPump().removeModelEventListener(this, 
+                    namespace, new String[] {"remove"});
+            if (getProject() != null) {
+                getProject().moveToTrash(this);
+            } else {
+                DiagramFactory.getInstance().removeDiagram(this);
+            }
+        }
     }
 
 
-    @Override
-    public void initialize(Object owner) {
-        super.initialize(owner);
-        StateDiagramGraphModel gm =
-            (StateDiagramGraphModel) getGraphModel();
+    protected Object[] getUmlActions() {
+        
+        ArrayList actions = new ArrayList();
+        
+        actions.add(getNodeAction(Model.getMetaTypes().getState()));
+        actions.add(getEdgeAction(Model.getMetaTypes().getTransition()));
+        actions.add(null);
+        actions.add(getPseudoAction(Model.getPseudostateKind().getInitial()));
+        actions.add(getNodeAction(Model.getMetaTypes().getFinalState()));
+        actions.add(getPseudoAction(
+                Model.getPseudostateKind().getEntryPoint()));
+        
actions.add(getPseudoAction(Model.getPseudostateKind().getExitPoint()));
+        actions.add(getPseudoAction(Model.getPseudostateKind().getJunction()));
+        actions.add(getPseudoAction(Model.getPseudostateKind().getChoice()));
+        actions.add(getPseudoAction(Model.getPseudostateKind().getFork()));
+        actions.add(getPseudoAction(Model.getPseudostateKind().getJoin()));
+        actions.add(getPseudoAction(
+                Model.getPseudostateKind().getShallowHistory()));
+        actions.add(getPseudoAction(
+                Model.getPseudostateKind().getDeepHistory()));
+        
+        return actions.toArray();
     }
 
-    @Override
     public String getLabelName() {
-        return Translator.localize("label.state-diagram");
+        return Translator.localize("label.statemachine-diagram");
+    }
+
+    private Action getNodeAction(Object metaType) {
+        String label = getLabel(metaType);
+        return new RadioAction(new CmdCreateNode(metaType, label));
+    }
+
+    private Action getPseudoAction(Object kind) {
+        String label = 
+            "button.new-" + Model.getFacade().getName(kind).toLowerCase();
+        return new RadioAction(new CreatePseudostateAction(kind, label));
     }
     
+    
+    private Action getEdgeAction(Object metaType) {
+        String label = getLabel(metaType);
+        return new RadioAction(
+                    new ActionSetMode(
+                        ModeCreatePolyEdge.class,
+                        "edgeClass",
+                        metaType,
+                        label));
+    }
+    
+    private String getLabel(Object metaType) {
+        return "button.new-"
+            + Model.getMetaTypes().getName(metaType).toLowerCase();
+    }
+
+    /*
+     * @see org.argouml.uml.diagram.ui.UMLDiagram#relocate(java.lang.Object)
+     */
+    public boolean relocate(Object base) {
+        return false;
+    }
+
+    public void encloserChanged(FigNode enclosed, 
+            FigNode oldEncloser, FigNode newEncloser) {
+    }
+
     @Override
     public boolean doesAccept(Object objectToAccept) {
-        if (Model.getFacade().isAComment(objectToAccept) ) {
+        if (Model.getFacade().isAVertex(objectToAccept)) {
             return true;
-        }
+        } else if (Model.getFacade().isAComment(objectToAccept)) {
+            return true;
+        } 
         return false;
     }
     
+
     public DiagramElement createDiagramElement(
             final Object modelElement,
             final Rectangle bounds) {
@@ -86,6 +202,66 @@
         
         DiagramSettings settings = getDiagramSettings();
         
+        if (Model.getFacade().isAFinalState(modelElement)) {
+            figNode = new FigFinalState(modelElement, bounds, settings);
+        } else if (Model.getFacade().isAState(modelElement)) {
+            figNode = new FigVertex(modelElement, bounds, settings);
+        } else if (Model.getFacade().isAComment(modelElement)) {
+            figNode = new FigComment(modelElement, bounds, settings);
+        } else if (Model.getFacade().isAPseudostate(modelElement)) {
+            Object kind = Model.getFacade().getKind(modelElement);
+            if (kind == null) {
+                return null;
+            }
+            if (kind.equals(Model.getPseudostateKind().getInitial())) {
+                figNode = new FigInitialState(modelElement, bounds, settings);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getChoice())) {
+                figNode = new FigBranchState(modelElement, bounds, settings);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getJunction())) {
+                figNode = new FigJunctionState(modelElement, bounds, settings);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getFork())) {
+                figNode = new FigForkState(modelElement, bounds, settings);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getJoin())) {
+                figNode = new FigJoinState(modelElement, bounds, settings);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getShallowHistory())) {
+                figNode = new FigShallowHistoryState(modelElement, bounds, 
+                        settings);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getDeepHistory())) {
+                figNode = new FigDeepHistoryState(modelElement, bounds, 
+                        settings);
+            }
+        }
         return figNode;
     }
-}
+
+    @Override
+    public boolean isRelocationAllowed(Object base) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public Collection getRelocationCandidates(Object root) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    private class CreatePseudostateAction extends CmdCreateNode {
+        public CreatePseudostateAction(Object kind, String name) {
+            super(Model.getMetaTypes().getPseudostate(), name);
+            setArg("kind", kind);
+        }
+
+        public Object makeNode() {
+            Object newNode = super.makeNode();
+            Object kind = getArg("kind");
+            Model.getCoreHelper().setKind(newNode, kind);
+            return newNode;
+        }
+    }
+}
\ No newline at end of file

------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2742258

To unsubscribe from this discussion, e-mail: 
[[email protected]].

Reply via email to