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]].