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 }