1 package prefuse.controls; 2 3 import java.awt.Cursor ; 4 import java.awt.event.MouseEvent ; 5 import java.awt.geom.Point2D ; 6 import java.util.Iterator ; 7 8 import javax.swing.SwingUtilities ; 9 10 import prefuse.Display; 11 import prefuse.visual.NodeItem; 12 import prefuse.visual.VisualItem; 13 14 15 23 public class SubtreeDragControl extends ControlAdapter { 24 25 private Point2D down = new Point2D.Double (); 26 private Point2D tmp = new Point2D.Double (); 27 private boolean wasFixed; 28 29 33 public SubtreeDragControl() { 34 } 35 36 39 public void itemEntered(VisualItem item, MouseEvent e) { 40 if ( !(item instanceof NodeItem) ) return; 41 Display d = (Display)e.getSource(); 42 d.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 43 } 44 45 48 public void itemExited(VisualItem item, MouseEvent e) { 49 if ( !(item instanceof NodeItem) ) return; 50 Display d = (Display)e.getSource(); 51 d.setCursor(Cursor.getDefaultCursor()); 52 } 53 54 57 public void itemPressed(VisualItem item, MouseEvent 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 69 public void itemReleased(VisualItem item, MouseEvent e) { 70 if (!SwingUtilities.isLeftMouseButton(e)) return; 71 if ( !(item instanceof NodeItem) ) return; 72 item.setFixed(wasFixed); 73 } 74 75 78 public void itemDragged(VisualItem item, MouseEvent 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 children = n.children(); 98 while ( children.hasNext() ) 99 updateLocations((NodeItem)children.next(), dx, dy); 100 } 101 102 } | Popular Tags |