svn commit: r16391 - trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/sequence2/diagram/ModeCreateMessage.java

Bob Tarling <[email protected]>
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: bobtarling
Date: 2008-12-20 08:46:34-0800
New Revision: 16391

Modified:
   trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/sequence2/diagram/ModeCreateMessage.java

Log:
Improve autospacing

Modified: trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/sequence2/diagram/ModeCreateMessage.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/sequence2/diagram/ModeCreateMessage.java?view=diff&pathrev=16391&r1=16390&r2=16391
==============================================================================
--- trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/sequence2/diagram/ModeCreateMessage.java	(original)
+++ trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/sequence2/diagram/ModeCreateMessage.java	2008-12-20 08:46:34-0800
@@ -38,10 +38,11 @@
 import org.tigris.gef.presentation.FigPoly;
 
 /**
- * Mode to create a link between two figclassifierroles. 
+ * Mode to create a link between two FigClassifierRoles. 
+ * TODO: Provide a ModeFactory and then this class can become package scope.
  * @author penyaskito
  */
-class ModeCreateMessage extends ModeCreatePolyEdge {
+public class ModeCreateMessage extends ModeCreatePolyEdge {
 
     /**
      * Logger.
@@ -158,9 +159,10 @@
      * @param figMessage
      */
     private void ensureSpace(final FigMessage figMessage) {
-        final FigMessage firstMessageBelow = getFirstMessageBelow(
+        final FigMessage firstMessageBelow = getNearestMessage(
                 (FigClassifierRole) getSourceFigNode(),
-                figMessage);
+                figMessage,
+                true);
         
         final int defaultMessageGap = 20;
         final int heightPlusGap = 
@@ -207,38 +209,48 @@
      * @param figMessage
      * @return the FigMessage below or null
      */
-    private FigMessage getFirstMessageBelow(
+    private FigMessage getNearestMessage(
             final FigClassifierRole figClassifierRole,
-            final FigMessage figMessage) {
+            final FigMessage figMessage,
+            final boolean below) {
         
-        final int figMessageY = figMessage.getFirstPoint().y;
-        
-        FigMessage firstMessageBelow = null;
+        FigMessage nearestMessage = null;
         
         for (FigEdge fe : figClassifierRole.getFigEdges()) {
             if (fe instanceof FigMessage && fe != figMessage) {
                 final FigMessage fm = (FigMessage) fe;
                 final int y = fm.getFirstPoint().y;
-                if (firstMessageBelow == null
-                            || isBetween (y,
-                                    figMessageY, 
-                                    firstMessageBelow.getFirstPoint().y)) {
-                    firstMessageBelow = fm;
+                if (below) {
+                    if (isBetween(y, figMessage, nearestMessage)) {
+                        nearestMessage = fm;
+                    }
+                } else {
+                    if (isBetween(y, nearestMessage, figMessage)) {
+                        nearestMessage = fm;
+                    }
                 }
             }
         }
         
-        return firstMessageBelow;
+        return nearestMessage;
     }
     
     /**
-     * Return true if a value is in a given range (exclusive)
-     * @param val the value to test
-     * @param lowerVal the lowest value to check
-     * @param upperVal the upper value to check
+     * Return true if a given y co-ordinate is between the two given messages
+     * @param y the value to test
+     * @param message1 the lowest value to check
+     * @param message2 the upper value to check
      * @return
      */
-    private boolean isBetween(int val, int lowerVal, int upperVal) {
-        return (val > lowerVal && val < upperVal);
+    private boolean isBetween(
+            final int val,
+            final FigMessage message1,
+            final FigMessage message2) {
+        if (val >= message1.getFirstPoint().y 
+                && (message2 == null
+                        || val <= message2.getFirstPoint().y)) {
+            return true;
+        }
+        return false;
     }
 }

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

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.