Author: bobtarling Date: 2011-04-21 08:17:00-0700 New Revision: 19267 Modified: trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDisplayState.java
Log: When the name grows the rest of the presentation also grows (but not yet the node itself) 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=19267&r1=19266&r2=19267 ============================================================================== --- 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 08:17:00-0700 @@ -19,7 +19,6 @@ 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; @@ -28,11 +27,11 @@ 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; + private static final int PADDING = 2; + private static final int MIN_WIDTH = 90; public BaseDisplayState( final Rectangle rect, @@ -70,19 +69,30 @@ } public void propertyChange(PropertyChangeEvent pce) { - if (pce.getSource() == getNameDisplay() && pce.getPropertyName().equals("bounds")) { + 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); + Rectangle thisBounds = getBounds(); + int notationEndX = + textBounds.x + textBounds.width + getRightMargin(); + int thisEndX = thisBounds.x + thisBounds.width; 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(); + thisBounds.width = + getLeftMargin() + textBounds.width + getRightMargin(); + setBounds(thisBounds); + // TODO: We have noticed that the child fig inside for notation + // has grown beyond our bounds so we change the size of ourself + // to encompass it. We should now inform our own parent that we + // have changed size so that it can fit us. + // Maybe we need a separate event mechanism for this as + // property change with bounds can happen for many reasons and + // may cause problems with cycles (e.g. our parent changes + // size so we change, we tell our parent we changed so it + // redraws and tells us to change, we change and tell our + // parent we changed.....) Events are maybe OTT - we could just + // call our parent directly. } } super.propertyChange(pce); @@ -91,17 +101,55 @@ // 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; + final int nx = bounds.x + getLeftMargin() + + (bounds.width - (nameWidth + getLeftMargin() + getRightMargin())) + / 2; + final int ny = bounds.y + getTopMargin() + + (bounds.height - nameHeight - getTopMargin() - getBottomMargin()) + / 2; getNameDisplay().setLocation(nx, ny); } + @Override + public Dimension getMinimumSize() { + + final Dimension nameDim = getNameDisplay().getMinimumSize(); + int width = nameDim.width; + int height = nameDim.height; + if (getStereotypeDisplay() != null) { + final Dimension stereoDim = getStereotypeDisplay().getMinimumSize(); + width += Math.max(stereoDim.width, nameDim.width); + height += (stereoDim.height - 2); + } + + int w = width + getRightMargin() + getLeftMargin(); + final int h = height + getTopMargin() + getBottomMargin(); + w = Math.max(w, MIN_WIDTH); // the width needs to be > the height + return new Dimension(w, h); + } + + protected int getRightMargin() { + return PADDING; + } + + protected int getLeftMargin() { + return PADDING; + } + + protected int getTopMargin() { + return PADDING; + } + + protected int getBottomMargin() { + return PADDING; + } // // !! TODO: All code below here is duplicated in FigBaseNode. The reason @@ -116,19 +164,37 @@ final int w, final int h) { + final int ww; + // Refuse to set bounds below the minimum width + final int minWidth = getMinimumSize().width; + if (w < minWidth) { + ww = minWidth; + } else { + ww = w; + } + final int hh; + final int minHeight = getMinimumSize().height; + if (h < minHeight) { + hh = minHeight; + } else { + hh = h; + } + final Rectangle oldBounds = getBounds(); + bounds = new Rectangle(x, y, ww, hh); + + if (oldBounds.equals(bounds)) { + return; + } - bounds = new Rectangle(x, y, w, h); _x = x; _y = y; - _w = w; - _h = h; + _w = ww; + _h = hh; positionChildren(); - if (!oldBounds.equals(getBounds())) { - firePropChange("bounds", oldBounds, bounds); - } + firePropChange("bounds", oldBounds, bounds); } protected Rectangle getBoundsImpl() { @@ -155,4 +221,3 @@ setBounds(newBounds); } } - ------------------------------------------------------ http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2722186 To unsubscribe from this discussion, e-mail: [[email protected]].
