Author: bobtarling
Date: 2011-05-11 04:49:42-0700
New Revision: 19398

Added:
   trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigRegion.java
Modified:
   trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigVertex.java

Log:
Let the vertex react to add/remove region events.
Each region has its own trap rect for enclosing.
Right click allows add region option.

Added: trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigRegion.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigRegion.java?view=markup&pathrev=19398
==============================================================================
--- (empty file)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigRegion.java   
2011-05-11 04:49:42-0700
@@ -0,0 +1,46 @@
+/* $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.uml.diagram.state.ui;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+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);
+        setOwner(region);
+        setFillColor(Color.red);
+    }
+    
+    /*
+     * @see org.tigris.gef.presentation.Fig#getMinimumSize()
+     */
+    @Override
+    public Dimension getMinimumSize() {
+        return new Dimension(180, 80);
+    }
+}

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigVertex.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigVertex.java?view=diff&pathrev=19398&r1=19397&r2=19398
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigVertex.java   
(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/FigVertex.java   
2011-05-11 04:49:42-0700
@@ -13,25 +13,39 @@
 
 package org.argouml.uml.diagram.state.ui;
 
+import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Font;
 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.FigRect;
 import org.tigris.gef.presentation.FigText;
 
 /**
@@ -41,6 +55,8 @@
  */
 public class FigVertex extends FigNodeModelElement {
 
+    private static final Logger LOG = Logger.getLogger(FigVertex.class);
+    
     private static final int MARGIN = 2;
 
     private NotationProvider notationProviderBody;
@@ -49,6 +65,8 @@
      * The body for entry/exit/do actions
      */
     private FigBody bodyText;
+    
+    private FigGroup regionCompartment;
 
     /**
      * Create a new instance of FigVertex
@@ -68,6 +86,9 @@
                 .getNotationProvider(NotationProviderFactory2.TYPE_STATEBODY,
                         getOwner(), this, notation);
         updateNameText();
+        
+        LOG.info("Registering as listener");
+        Model.getPump().addModelEventListener(this, getOwner(), "region");
     }
 
     @Override
@@ -127,10 +148,12 @@
         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());
     }
@@ -156,6 +179,49 @@
         }
     }
 
+    // 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
+            rg.setFillColor(COLOR_ARRAY[nextColor++]);
+            if (nextColor >= COLOR_ARRAY.length) {
+                nextColor = 0;
+            }
+            // Temporary end
+            
+            regionCompartment.addFig(rg);
+            
+            // TODO: After adding a new region resize the node to
+            // include it.
+        }
+        if (mee instanceof RemoveAssociationEvent) {
+            Object oldRegion = mee.getNewValue();
+            LOG.debug("Removing region " + oldRegion);
+        }
+        renderingChanged();
+        damage();
+    }
+
     /*
      * @see
      * org.argouml.uml.diagram.ui.FigNodeModelElement#removeFromDiagramImpl()
@@ -226,8 +292,12 @@
         final Dimension bodySize = getBodyText().getMinimumSize();
 
         int h = getTopMargin()
-            + nameSize.height + bodySize.height
+            + nameSize.height
             + getBottomMargin();
+
+        if (getBodyText().getText().length() > 0) {
+            h += bodySize.height;
+        }
         
         int w = getLeftMargin()
             + Math.max(nameSize.width, bodySize.width)
@@ -248,6 +318,20 @@
         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();
@@ -256,16 +340,64 @@
                 x + getLeftMargin(), y + getTopMargin(),
                 w - getLeftMargin() - getRightMargin(), nameSize.height);
 
-        getBodyText().setBounds(
-                x + getLeftMargin(), y + getTopMargin() + nameSize.height,
-                bodySize.width,
-                bodySize.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
      *
@@ -284,20 +416,37 @@
         }
     }
     
-    
-    int getRightMargin() {
-        return MARGIN;
-    }
-
-    int getLeftMargin() {
-        return MARGIN;
-    }
-    
-    int getTopMargin() {
-        return MARGIN;
-    }
-    
-    int getBottomMargin() {
-        return MARGIN;
+    /**
+     * 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,
+                final 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);
+                } else {
+                    fig.setBounds(x, y, w, h - y);
+                }
+                y += fig.getHeight();
+            }
+        }
     }
 }

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

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

Reply via email to