svn commit: r16354 - branches/work_issue1048_dthompson/src/argouml-app: . src/org/argouml/ui src/org/argouml/uml/diagram/ui

Dave Thompson <[email protected]>
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: dthompson
Date: 2008-12-14 00:39:01-0800
New Revision: 16354

Added:
   branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDrag.java   (contents, props changed)
   branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDragFactory.java   (contents, props changed)
Modified:
   branches/work_issue1048_dthompson/src/argouml-app/.classpath
   branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/ui/MultiEditorPane.java
   branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/PathItemPlacement.java
   branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java

Log:
Issue 1048: First commit of draggable fig labels.  Currently only active for FigAssocation, and label positions are not yet saved.  Still a bit of tidying up to do, and a global is initialised in a really unobvious place.  Requires SVN gef at the moment.

Modified: branches/work_issue1048_dthompson/src/argouml-app/.classpath
Url: http://argouml.tigris.org/source/browse/argouml/branches/work_issue1048_dthompson/src/argouml-app/.classpath?view=diff&pathrev=16354&r1=16353&r2=16354
==============================================================================
--- branches/work_issue1048_dthompson/src/argouml-app/.classpath	(original)
+++ branches/work_issue1048_dthompson/src/argouml-app/.classpath	2008-12-14 00:39:01-0800
@@ -6,6 +6,7 @@
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry exported="true" kind="lib" path="lib/antlr-2.7.7.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/commons-logging-1.0.2.jar"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/gef"/>
 	<classpathentry exported="true" kind="lib" path="lib/gef-0.13M3.jar" sourcepath="/gef/src"/>
 	<classpathentry exported="true" kind="lib" path="lib/ocl-argo-1.1.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/swidgets-0.1.4.jar" sourcepath="/swidgets/src"/>

Modified: branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/ui/MultiEditorPane.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/ui/MultiEditorPane.java?view=diff&pathrev=16354&r1=16353&r2=16354
==============================================================================
--- branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/ui/MultiEditorPane.java	(original)
+++ branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/ui/MultiEditorPane.java	2008-12-14 00:39:01-0800
@@ -45,7 +45,13 @@
 import org.argouml.ui.targetmanager.TargetEvent;
 import org.argouml.ui.targetmanager.TargetListener;
 import org.argouml.ui.targetmanager.TargetManager;
+import org.argouml.uml.diagram.ui.ModeLabelDragFactory;
 import org.argouml.uml.diagram.ui.TabDiagram;
+import org.tigris.gef.base.Globals;
+import org.tigris.gef.base.ModeDragScrollFactory;
+import org.tigris.gef.base.ModeFactory;
+import org.tigris.gef.base.ModePopupFactory;
+import org.tigris.gef.base.ModeSelectFactory;
 
 /**
  * The upper right pane in the ArgoUML user interface.  It may have several
@@ -57,6 +63,18 @@
     extends JPanel
     implements ChangeListener, MouseListener, TargetListener {
 
+    {
+        // I hate this so much even before I start writing it.
+        // Re-initialising a global in a place where no-one will see it just
+        // feels wrong.  Oh well, here goes.
+        ArrayList<ModeFactory> modeFactories = new ArrayList<ModeFactory>();
+        modeFactories.add(new ModeLabelDragFactory());
+        modeFactories.add(new ModeSelectFactory());
+        modeFactories.add(new ModePopupFactory());
+        modeFactories.add(new ModeDragScrollFactory()); 
+        Globals.setDefaultModeFactories(modeFactories);
+    }
+    
     /** logger */
     private static final Logger LOG = Logger.getLogger(MultiEditorPane.class);
         

Added: branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDrag.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDrag.java?view=markup&pathrev=16354
==============================================================================
--- (empty file)
+++ branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDrag.java	2008-12-14 00:39:01-0800
@@ -0,0 +1,167 @@
+// $Id$
+// Copyright (c) 2008 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.
+
+package org.argouml.uml.diagram.ui;
+
+import java.util.List;
+import java.awt.Point;
+import java.awt.event.MouseEvent;
+
+import org.tigris.gef.base.Editor;
+import org.tigris.gef.base.FigModifyingModeImpl;
+import org.tigris.gef.base.PathItemPlacementStrategy;
+import org.tigris.gef.presentation.Fig;
+import org.tigris.gef.presentation.FigEdge;
+
+/**
+ * Mode for dragging (i.e. user repositioning) of Text labels
+ * connected to FigEdges.
+ * @author Dave Thompson
+ */
+public class ModeLabelDrag extends FigModifyingModeImpl {
+    
+    /**
+     * The text label that is currently being dragged, or
+     * null if nothing is being dragged.
+     */
+    private Fig dragFig = null;
+    
+    /**
+     * The FigEdge that contains the label that is currently
+     * being dragged.  We have to keep track of this because
+     * the FigEdge is the only object that holds references to the
+     * PathItems that place it's child figs.  The child Figs do not
+     * have these references. 
+     * figEdge = null if nothing is being dragged.
+     */
+    private FigEdge figEdge = null;
+    
+    /**
+     * Point for tracking a mouse drag, indicates the last recorded mouse 
+     * point.  When a new mouse drag event occurs, the difference between
+     * the current point and dragBasePoint is the delta in position.
+     */
+    private Point dragBasePoint = new Point(0,0);
+   
+    /**
+     * X-offset for storing the location of the mouse click on a label
+     * relative to the centre of the label.  Used while dragging to 
+     * ensure that the user can click anywhere to start the drag, and things
+     * still behave sensibly.  X component.
+     */
+    private int deltax = 0;
+    
+    /**
+     * Y-offset for storing the location of the mouse click on a label
+     * relative to the centre of the label.  Used while dragging to 
+     * ensure that the user can click anywhere to start the drag, and things
+     * still behave sensibly.  X component.
+     */
+    private int deltay = 0;
+    /**
+     * Constructor for creating the ModeLabelDrag instance.
+     * @param editor The editor which will own this mode.
+     */
+    public ModeLabelDrag(Editor editor) {
+        super(editor);
+    }
+    
+    /**
+     * Constructor for creating the ModeLabelDrag instance.
+     */
+    public ModeLabelDrag() {
+        super();
+    }
+
+    /** 
+     * Reply a string of instructions that should be shown in the
+     * statusbar when this mode starts.
+     * @return The text to display in the status bar.
+     * @override 
+     */
+    public String instructions() {
+        return "  ";
+    }
+    /**
+     * Grabs label to begin movement. Turns cursor into a hand.
+     * @param me The mouse event to process.
+     * @override
+     * @see org.tigris.gef.base.ModeImpl#mousePressed(java.awt.event.MouseEvent)
+     */
+    public void mousePressed(MouseEvent me) {
+        // Translate the mouse event to the drawing scale coordinates.
+        //me = editor.translateMouseEvent(me);
+
+        Point clickPoint = me.getPoint(); 
+        Fig underMouse = editor.hit(clickPoint);
+        if (underMouse instanceof FigEdge) {
+            List<Fig> figList = ((FigEdge)underMouse).getPathItemFigs();
+            for (Fig fig : figList) {
+                if (fig.contains(clickPoint)) {
+                    // Consume to stop other modes from trying to take over
+                    me.consume();
+                    dragFig = fig;
+                    dragBasePoint = fig.getCenter();
+                    deltax = clickPoint.x - dragBasePoint.x;
+                    deltay = clickPoint.y - dragBasePoint.y;
+                    figEdge = (FigEdge) underMouse;
+                    break;
+                }
+            }
+        }
+        System.out.println("dragFig=" + dragFig);
+    }
+    
+    public void mouseReleased(MouseEvent me) {
+        //me = editor.retranslateMouseEvent(me);
+        if (dragFig != null) {
+            dragFig = null;
+        }
+    }
+    
+    public void mouseDragged(MouseEvent me) {
+        if (dragFig != null) {
+            me = editor.translateMouseEvent(me);
+            Point newPoint = me.getPoint();
+            // Subtract the the offset of the click, to take account of user
+            // having not initially clicked in the centre.
+            newPoint.translate(-deltax, -deltay);
+            PathItemPlacementStrategy pips 
+                = figEdge.getPathItemPlacementStrategy(dragFig);
+            pips.setPoint(newPoint);
+            newPoint = pips.getPoint();
+            int dx = newPoint.x - dragBasePoint.x;
+            int dy = newPoint.y - dragBasePoint.y;
+            dragBasePoint.setLocation(newPoint);
+            dragFig.translate(dx, dy);
+            me.consume();
+        }
+        //dragBasePoint.setLocation(me.getX(), me.getY());
+        
+        System.out.println("ModeLabelDrag.mouseDragged()");
+        
+        editor.damageAll(); /// TODO: reckless use of damageAll.
+    }
+
+}

Added: branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDragFactory.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDragFactory.java?view=markup&pathrev=16354
==============================================================================
--- (empty file)
+++ branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeLabelDragFactory.java	2008-12-14 00:39:01-0800
@@ -0,0 +1,54 @@
+// $Id$
+// Copyright (c) 2008 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.
+
+package org.argouml.uml.diagram.ui;
+
+import org.tigris.gef.base.Editor;
+import org.tigris.gef.base.FigModifyingMode;
+import org.tigris.gef.base.ModeFactory;
+
+/**
+ * Factory to create a ModeLabelDrag instance.
+ * @author Dave Thompson
+ */
+public class ModeLabelDragFactory implements ModeFactory {
+
+    /**
+     * @return The created ModeLabelDrag instance.
+     * @see org.tigris.gef.base.ModeFactory#createMode()
+     */
+    public FigModifyingMode createMode() {
+        return new ModeLabelDrag();
+    }
+
+    /**
+     * @param The editor to create the mode in.
+     * @return The created ModeLabelDrag instance.
+     * @see org.tigris.gef.base.ModeFactory#createMode(org.tigris.gef.base.Editor)
+     */
+    public FigModifyingMode createMode(Editor editor) {
+        return new ModeLabelDrag(editor);
+    }
+
+}

Modified: branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/PathItemPlacement.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/PathItemPlacement.java?view=diff&pathrev=16354&r1=16353&r2=16354
==============================================================================
--- branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/PathItemPlacement.java	(original)
+++ branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/PathItemPlacement.java	2008-12-14 00:39:01-0800
@@ -373,6 +373,25 @@
         offset = newOffset;
         useAngle = false;
     }
+    
+    /**
+     * Attempts to set a new location for the fig being controlled
+     * by this path item.  Takes the given Point which represents an x,y 
+     * position, and calculates the most appropriate angle and displacement
+     * to achieve this new position.  Used when the user drags a label
+     * on the diagram.  
+     * @override
+     * @param newPoint The new target location for the PathItem fig.
+     * @see org.tigris.gef.base.PathConv#setPoint(java.awt.Point)
+     */
+    public void setPoint(Point newPoint) {
+        //Point p1 = getAnchorPosition();
+        //Point p2 = newPoint;
+        int vect[] = computeVector(newPoint);
+        setDisplacementAngle(vect[0]);
+        setDisplacementDistance(vect[1]);
+        //setDisplacementDistance((int) Point.distance(p1.x, p1.y, p2.x, p2.y));
+    }
 
 
     /**
@@ -391,10 +410,10 @@
         double offsetSlope = getSlope(anchor, point);
         // TODO: This is completely untested.  The angle probably needs to
         // be adjusted to get it to match what is expected on input.
-        int angle = (int) ((offsetSlope - pathSlope) / Math.PI * 180);
+        int angle = (int) ((offsetSlope - pathSlope) / Math.PI * 180) + 180;
         int[] result = new int[] {angle, distance};
-        throw new UnsupportedOperationException();
-//        return result;
+        //throw new UnsupportedOperationException();
+        return result;
     }
     
     /**

Modified: branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java?view=diff&pathrev=16354&r1=16353&r2=16354
==============================================================================
--- branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java	(original)
+++ branches/work_issue1048_dthompson/src/argouml-app/src/org/argouml/uml/diagram/ui/TabDiagram.java	2008-12-14 00:39:01-0800
@@ -313,7 +313,9 @@
      */
     public void modeChange(ModeChangeEvent mce) {
         LOG.debug("TabDiagram got mode change event");
-        if (!Globals.getSticky() && Globals.mode() instanceof ModeSelect) {
+        if (target != null    // Target might not have been initialised yet. 
+                && !Globals.getSticky() 
+                && Globals.mode() instanceof ModeSelect) {
 //            if (_target instanceof UMLDiagram) {
 	    target.deselectAllTools();
 //            }

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

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.