KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > prefuse > controls > SubtreeDragControl


1 package prefuse.controls;
2
3 import java.awt.Cursor JavaDoc;
4 import java.awt.event.MouseEvent JavaDoc;
5 import java.awt.geom.Point2D JavaDoc;
6 import java.util.Iterator JavaDoc;
7
8 import javax.swing.SwingUtilities JavaDoc;
9
10 import prefuse.Display;
11 import prefuse.visual.NodeItem;
12 import prefuse.visual.VisualItem;
13
14
15 /**
16  * Control that changes the location of a whole subtree when dragged on screen.
17  * This is similar to the {@link DragControl DragControl} class, except that it
18  * moves the entire visible subtree rooted at an item, rather than just the
19  * item itself.
20  *
21  * @author <a HREF="http://jheer.org">jeffrey heer</a>
22  */

23 public class SubtreeDragControl extends ControlAdapter {
24
25     private Point2D JavaDoc down = new Point2D.Double JavaDoc();
26     private Point2D JavaDoc tmp = new Point2D.Double JavaDoc();
27     private boolean wasFixed;
28     
29     /**
30      * Creates a new subtree drag control that issues repaint requests as an
31      * item is dragged.
32      */

33     public SubtreeDragControl() {
34     }
35     
36     /**
37      * @see prefuse.controls.Control#itemEntered(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
38      */

39     public void itemEntered(VisualItem item, MouseEvent JavaDoc e) {
40         if ( !(item instanceof NodeItem) ) return;
41         Display d = (Display)e.getSource();
42         d.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
43     }
44     
45     /**
46      * @see prefuse.controls.Control#itemExited(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
47      */

48     public void itemExited(VisualItem item, MouseEvent JavaDoc e) {
49         if ( !(item instanceof NodeItem) ) return;
50         Display d = (Display)e.getSource();
51         d.setCursor(Cursor.getDefaultCursor());
52     }
53     
54     /**
55      * @see prefuse.controls.Control#itemPressed(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
56      */

57     public void itemPressed(VisualItem item, MouseEvent JavaDoc e) {
58         if (!SwingUtilities.isLeftMouseButton(e)) return;
59         if ( !(item instanceof NodeItem) ) return;
60         Display d = (Display)e.getComponent();
61         down = d.getAbsoluteCoordinate(e.getPoint(), down);
62         wasFixed = item.isFixed();
63         item.setFixed(true);
64     }
65     
66     /**
67      * @see prefuse.controls.Control#itemReleased(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
68      */

69     public void itemReleased(VisualItem item, MouseEvent JavaDoc e) {
70         if (!SwingUtilities.isLeftMouseButton(e)) return;
71         if ( !(item instanceof NodeItem) ) return;
72         item.setFixed(wasFixed);
73     }
74     
75     /**
76      * @see prefuse.controls.Control#itemDragged(prefuse.visual.VisualItem, java.awt.event.MouseEvent)
77      */

78     public void itemDragged(VisualItem item, MouseEvent JavaDoc e) {
79         if (!SwingUtilities.isLeftMouseButton(e)) return;
80         if ( !(item instanceof NodeItem) ) return;
81         Display d = (Display)e.getComponent();
82         tmp = d.getAbsoluteCoordinate(e.getPoint(), tmp);
83         double dx = tmp.getX()-down.getX();
84         double dy = tmp.getY()-down.getY();
85         updateLocations((NodeItem)item, dx, dy);
86         down.setLocation(tmp);
87         item.getVisualization().repaint();
88     }
89     
90     private void updateLocations(NodeItem n, double dx, double dy) {
91         double x = n.getX(), y = n.getY();
92         n.setStartX(x); n.setStartY(y);
93         x += dx; y += dy;
94         n.setX(x); n.setY(y);
95         n.setEndX(x); n.setEndY(y);
96
97         Iterator JavaDoc children = n.children();
98         while ( children.hasNext() )
99             updateLocations((NodeItem)children.next(), dx, dy);
100     }
101     
102 } // end of class SubtreeDragControl
103
Popular Tags