Author: bobtarling
Date: 2011-04-21 06:25:57-0700
New Revision: 19266

Modified:
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDisplayState.java
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigBaseNode.java
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigNotation.java
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/RRectDisplayState.java

Log:
Trying to get parent Fig to grow when a notation fig grows beyond its bounds.
Not complete as yet.

Modified: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDisplayState.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDisplayState.java?view=diff&pathrev=19266&r1=19265&r2=19266
==============================================================================
--- 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDisplayState.java
   (original)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDisplayState.java
   2011-04-21 06:25:57-0700
@@ -19,6 +19,7 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 
+import org.apache.log4j.Logger;
 import org.argouml.notation2.NotationType;
 import org.argouml.uml.diagram.DiagramSettings;
 import org.tigris.gef.presentation.Fig;
@@ -26,9 +27,12 @@
 
 abstract class BaseDisplayState extends FigGroup
         implements StereotypeDisplayer, NameDisplayer, PropertyChangeListener {
+    
+    private static final Logger LOG = Logger.getLogger(BaseDisplayState.class);
 
     private final DiagramElement bigPort;
     private final DiagramElement nameDisplay;
+    private Rectangle bounds;
     
     public BaseDisplayState(
             final Rectangle rect,
@@ -45,6 +49,7 @@
         addFig((Fig) bigPort);
         addFig((Fig) getNameDisplay());
         ((Fig) nameDisplay).addPropertyChangeListener(this);
+        setBounds(rect);
     }
     
     public DiagramElement getStereotypeDisplay() {
@@ -64,11 +69,46 @@
         return bigPort;
     }
     
-    /**
-     * Default implementation makes sure the model element name is
-     * displayed in the centre of the node.
-     * TODO: We need stereotypes displayed above this.
-     */
+    public void propertyChange(PropertyChangeEvent pce) {
+        if (pce.getSource() == getNameDisplay() && 
pce.getPropertyName().equals("bounds")) {
+            // The size of the name has changed. Check if we need to make the
+            // node bigger so that it contains all its children.
+            Rectangle textBounds = (Rectangle) pce.getNewValue();
+            int notationEndX = textBounds.x + textBounds.width;
+            int thisEndX = getBounds().x + getBounds().width;
+            LOG.debug("Got the event notation right = " + notationEndX + " 
container right = " + thisEndX);
+            if (notationEndX > thisEndX) {
+                // TODO: Why do we not get here?
+                // The container seems to be growing by itself but we don't 
see that visibly.
+                LOG.info("text has grown too wide so redrawing parent");
+                // TODO: layout our children and calculate our bounds.
+                calcBounds();
+            }
+        }
+        super.propertyChange(pce);
+    }
+    
+    // TODO: Move an empty implementation to FigGroup in GEF
+    protected void positionChildren() {
+        Rectangle myBounds = getBounds();
+        getPort().setBounds(myBounds);
+        
+        final Dimension nameDim = getNameDisplay().getMinimumSize();
+        final int nameWidth = nameDim.width;
+        final int nameHeight = nameDim.height;
+        
+        final int nx = bounds.x + (bounds.width - nameWidth) /2;
+        final int ny = bounds.y + (bounds.height - nameHeight) /2;
+        getNameDisplay().setLocation(nx, ny);
+    }
+    
+    
+    //
+    // !! TODO: All code below here is duplicated in FigBaseNode. The reason
+    // is the GEF defect - http://gef.tigris.org/issues/show_bug.cgi?id=358
+    // Once we have taken a release of GEF with that fix we can remove this
+    // code.
+    //
     @Override
     protected void setBoundsImpl(
             final int x,
@@ -78,25 +118,41 @@
 
         final Rectangle oldBounds = getBounds();
         
-        getPort().setBounds(new Rectangle(x, y, w, h));
+        bounds = new Rectangle(x, y, w, h);
+        _x = x;
+        _y = y;
+        _w = w;
+        _h = h;
         
-        final Dimension nameDim = getNameDisplay().getMinimumSize();
-        final int nameWidth = nameDim.width;
-        final int nameHeight = nameDim.height;
+        positionChildren();
         
-        final int nx = x + (w - nameWidth) /2;
-        final int ny = y + (h - nameHeight) /2;
-        getNameDisplay().setLocation(nx, ny);
-        calcBounds();
-        firePropChange("bounds", oldBounds, getBounds());
-    }
-
-    public void propertyChange(PropertyChangeEvent pce) {
-        if (pce.getSource() == getNameDisplay() && 
pce.getPropertyName().equals("bounds")) {
-            calcBounds();
+        if (!oldBounds.equals(getBounds())) {
+            firePropChange("bounds", oldBounds, bounds);
         }
-        super.propertyChange(pce);
+    }
+    
+    protected Rectangle getBoundsImpl() {
+        return bounds;
     }
     
     
+    /**
+     * Change the position of the object from where it is to where it is plus 
dx
+     * and dy. Often called when an object is dragged. This could be very 
useful
+     * if local-coordinate systems are used because deltas need less
+     * transforming... maybe. Fires property "bounds".
+     */
+    protected void translateImpl(int dx, int dy) {
+        if (dx ==0 || dy == 0) {
+            return;
+        }
+        Rectangle oldBounds = getBounds();
+        Rectangle newBounds = new Rectangle(
+                oldBounds.x + dx,
+                oldBounds.y + dy,
+                oldBounds.width,
+                oldBounds.height);
+        setBounds(newBounds);
+    }
 }
+

Modified: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigBaseNode.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigBaseNode.java?view=diff&pathrev=19266&r1=19265&r2=19266
==============================================================================
--- 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigBaseNode.java
        (original)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigBaseNode.java
        2011-04-21 06:25:57-0700
@@ -17,7 +17,6 @@
 import java.awt.Rectangle;
 
 import org.argouml.uml.diagram.DiagramSettings;
-import org.tigris.gef.presentation.Fig;
 import org.tigris.gef.presentation.FigNode;
 
 /**
@@ -31,6 +30,8 @@
     private final DiagramSettings settings;
     private DiagramElement nameDiagramElement;
     
+    private Rectangle bounds;
+    
     /**
      * Constructor a new FigBaseNode
      * 
@@ -41,6 +42,7 @@
     FigBaseNode(final Object owner, final Rectangle bounds,
             final DiagramSettings settings) {
         super(owner);
+        this.bounds = bounds;
         this.settings = settings;
     }
     
@@ -62,4 +64,57 @@
 
     public void setNameDiagramElement(DiagramElement name) {
     }
+
+    // TODO: Move an empty implementation to FigGroup in GEF
+    protected void positionChildren() {
+        Rectangle myBounds = getBounds();
+        displayState.setBounds(myBounds);
+//      calcBounds();
+        updateEdges();
+    }
+    
+    @Override
+    protected void setBoundsImpl(
+            final int x,
+            final int y,
+            final int w,
+            final int h) {
+
+        final Rectangle oldBounds = getBounds();
+        
+        bounds = new Rectangle(x, y, w, h);
+        _x = x;
+        _y = y;
+        _w = w;
+        _h = h;
+        
+        positionChildren();
+        
+        if (!oldBounds.equals(getBounds())) {
+            firePropChange("bounds", oldBounds, bounds);
+        }
+    }
+
+    protected Rectangle getBoundsImpl() {
+        return bounds;
+    }
+    
+    /**
+     * Change the position of the object from where it is to where it is plus 
dx
+     * and dy. Often called when an object is dragged. This could be very 
useful
+     * if local-coordinate systems are used because deltas need less
+     * transforming... maybe. Fires property "bounds".
+     */
+    protected void translateImpl(int dx, int dy) {
+        if (dx ==0 || dy == 0) {
+            return;
+        }
+        Rectangle oldBounds = getBounds();
+        Rectangle newBounds = new Rectangle(
+                oldBounds.x + dx,
+                oldBounds.y + dy,
+                oldBounds.width,
+                oldBounds.height);
+        setBounds(newBounds);
+    }
 }

Modified: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigNotation.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigNotation.java?view=diff&pathrev=19266&r1=19265&r2=19266
==============================================================================
--- 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigNotation.java
        (original)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/FigNotation.java
        2011-04-21 06:25:57-0700
@@ -16,6 +16,7 @@
 import java.awt.Dimension;
 import java.awt.Rectangle;
 
+import org.apache.log4j.Logger;
 import org.argouml.notation2.NotatedItem;
 import org.argouml.notation2.NotationLanguage;
 import org.argouml.notation2.NotationManager;
@@ -29,6 +30,8 @@
  */
 class FigNotation extends FigText implements NotatedItem, DiagramElement {
 
+    private static final Logger LOG = Logger.getLogger(FigNotation.class);
+
     private final NotationType notationType;
     
     /**
@@ -68,9 +71,6 @@
     @Override
     public Dimension getMinimumSize() {
         
-//        int w = getFontMetrics().stringWidth(getText());
-//        int h = getFontMetrics().getHeight();
-        
         int w = getFontMetrics().stringWidth(getText());
         int h = getFontMetrics().getHeight();
         
@@ -109,4 +109,57 @@
         }
         this.damage();
     }
+    
+    public void setText(String s) {
+        final String oldText = getText();
+        if (s.equals(oldText)) {
+            return;
+        }
+        final Rectangle oldBounds = getBounds();
+        super.setText(s);
+        // TODO: This should happen in GEF
+        firePropChange("text", oldText, s);
+        // TODO: setText in GEF should call setBounds instead of directly
+        // changing x, y, w, h - then we will have an event generated
+        // correctly in GEF
+        firePropChange("bounds", oldBounds, getBounds());
+        if (!oldBounds.equals(getBounds())) {
+            LOG.info("notation Fig firing bounds changed");
+            firePropChange("bounds changed", oldBounds, getBounds());
+        }
+    }
+    
+    /**
+     * Prevent underline events if underline does not change.
+     * TODO: GEF should manage this after GEF 0.13.4 is included.
+     */
+    public void setUnderline(boolean u) {
+        if (getUnderline() == u) {
+            return;
+        }
+        super.setUnderline(u);
+    }
+    
+    
+    /**
+     * Prevent bold events if bold does not change.
+     * TODO: GEF should manage this after GEF 0.13.4 is included.
+     */
+    public void setBold(boolean b) {
+        if (getBold() == b) {
+            return;
+        }
+        super.setBold(b);
+    }
+    
+    /**
+     * Prevent italic events if italic does not change.
+     * TODO: GEF should manage this after GEF 0.13.4 is included.
+     */
+    public void setItalic(boolean i) {
+        if (getItalic() == i) {
+            return;
+        }
+        super.setItalic(i);
+    }
 }

Modified: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/RRectDisplayState.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/RRectDisplayState.java?view=diff&pathrev=19266&r1=19265&r2=19266
==============================================================================
--- 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/RRectDisplayState.java
  (original)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/RRectDisplayState.java
  2011-04-21 06:25:57-0700
@@ -17,7 +17,6 @@
 import java.awt.Dimension;
 import java.awt.Rectangle;
 
-import org.argouml.uml.diagram.DiagramAppearance;
 import org.argouml.uml.diagram.DiagramSettings;
 import org.tigris.gef.presentation.FigRRect;
 
@@ -77,5 +76,6 @@
             super(x, y, w, h, lineColor, fillColor);
             this.setCornerRadius(RADIUS);
         }
-    }    
+    }
+    
 }

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

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

Reply via email to