View Javadoc

1   package org.glassbox.graphview;
2   
3   import java.awt.Point;
4   import java.awt.event.MouseEvent;
5   
6   import de.fzi.wim.guibase.graphview.graph.*;
7   import de.fzi.wim.guibase.graphview.view.*;
8   
9   /***
10   * A manipulator that tracks the movement of the mouse.
11   */
12  public abstract class MouseMovementTracker extends AbstractManipulator {
13      /*** The name of the Manipulator. */
14      public static final String NAME = "org.glassbox.graphview.MouseMovementTracker";
15  
16      private Node _overnode;
17      private Edge _overedge;
18      private boolean _enabled;
19  
20      public MouseMovementTracker() {
21  	_overnode = null;
22  	_overedge = null;
23  	_enabled = true;
24      }
25  
26      protected abstract boolean acceptNode(Node node, Point mousepoint);
27  
28      protected abstract boolean acceptEdge(Edge edge, Point mousepoint);
29  
30      public String getName() {
31          return NAME;
32      }
33  
34      public void setEnabled(boolean enabled) {
35  	_enabled = enabled;
36  	if (m_graphPane!=null) m_graphPane.repaint();
37      }
38  
39      public boolean isEnabled() {
40  	return _enabled;
41      }
42  
43      /***
44         Get the node the mouse is currently pointing to.
45       */
46      public Node getNodeAtMouse() {
47  	return _overnode;
48      }
49  
50      /***
51         Get the edge the mouse is currently pointing to.
52       */
53      public Edge getEdgeAtMouse() {
54  	return _overedge;
55      }
56  
57      /***
58         Called internally to set the node at the current mouse position.
59       */
60      protected void setNodeAtMouse(Node node) {
61          if (node!=_overnode) {
62              Node oldNode=_overnode;
63              if (oldNode!=null)
64                  m_graphPane.repaintNode(oldNode);
65              _overnode=node;
66              if (_overnode!=null)
67                  m_graphPane.repaintNode(_overnode);
68          }
69      }
70  
71      /***
72         Called internally to set the edge at the current mouse position.
73       */
74      protected void setEdgeAtMouse(Edge edge) {
75          if (edge!=_overedge) {
76              Edge oldEdge=_overedge;
77              if (oldEdge!=null)
78                  m_graphPane.repaintEdge(oldEdge);
79              _overedge=edge;
80              if (_overedge!=null)
81                  m_graphPane.repaintEdge(_overedge);
82          }
83      }
84  
85      public void mouseEntered(MouseEvent e) {
86  	updateNode(e);
87      }
88  
89      public void mouseExited(MouseEvent e) {
90  	setNodeAtMouse(null);
91  	setEdgeAtMouse(null);
92      }
93  
94      public void mouseMoved(MouseEvent e) {
95  	updateNode(e);
96      }
97  
98      private void updateNode(MouseEvent e) {
99          if (m_graphPane.isEnabled() && isEnabled()) {
100             Point point=e.getPoint();
101             Node node=m_graphPane.getNodeAtPoint(point);
102             if (node!=null && acceptNode(node, e.getPoint())) {
103                 setNodeAtMouse(node);
104                 setEdgeAtMouse(null);
105 		e.consume();
106             } else {
107                 setNodeAtMouse(null);
108                 Edge edge=m_graphPane.getNearestEdge(point);
109 		if (edge!=null && acceptEdge(edge, e.getPoint())) {
110 		    e.consume();
111 		    setEdgeAtMouse(edge);
112 		} else {
113 		    setEdgeAtMouse(null);
114 		}
115             }
116         } else {
117             setNodeAtMouse(null);
118             setEdgeAtMouse(null);
119         }
120     }    
121 }