1 package org.glassbox.graphview;
2
3 import de.fzi.wim.guibase.graphview.graph.Node;
4 import de.fzi.wim.guibase.graphview.graph.Edge;
5
6 import org.glassbox.Theme;
7 import org.glassbox.graphview.MouseMovementTracker;
8
9 import java.awt.*;
10 import java.awt.event.*;
11 import javax.swing.*;
12
13 /***
14 <li>*.node.border.color</li>
15 <li>*.node.border.stroke</li>
16 <li>*.node.border.insets</li>
17 <li>*.node.border.corner.size</li>
18 */
19 public class SingleNodeSelectionManipulator extends MouseMovementTracker {
20 /***
21 Interface for the controller.
22 */
23 public interface Controller {
24 /***
25 Notify the controller about the selected node.
26 */
27 void notifyNodeSelected(Node node);
28 }
29
30 private Rectangle _bounds;
31 private Controller _controller;
32 private String _name;
33 private Cursor _cursor;
34 private Color _border_color;
35 private Stroke _border_stroke;
36 private Insets _border_insets;
37 private Dimension _corner_size;
38 private Class _nodetype;
39 private Node _selectednode;
40
41 public SingleNodeSelectionManipulator(String name, String themeprefix, Cursor cursor, Controller controller, Class nodetype) {
42 _bounds = new Rectangle();
43 _cursor = cursor;
44 _border_color = Theme.getColor(themeprefix+".node.border.color");
45 _border_stroke = Theme.getStroke(themeprefix+".node.border.stroke");
46 _border_insets = Theme.getInsets(themeprefix+".node.border.insets");
47 _corner_size = Theme.getSize(themeprefix+".node.border.corner.size");
48 _controller = controller;
49 _name = name;
50 _nodetype = nodetype;
51 _selectednode = null;
52 }
53
54 protected boolean acceptNode(Node node, Point mousepoint) {
55 return node.getClass().equals(_nodetype);
56 }
57
58 protected boolean acceptEdge(Edge edge, Point mousepoint) {
59 return false;
60 }
61
62 public String getName() {
63 return _name;
64 }
65
66 public void setSelectedNode(Node node) {
67 _selectednode = node;
68 m_graphPane.repaint();
69 }
70
71 public Node getSelectedNode() {
72 return _selectednode;
73 }
74
75 protected void setNodeAtMouse(Node node) {
76 super.setNodeAtMouse(node);
77 if (node!=null) m_graphPane.setCursor(_cursor);
78 }
79
80 public void mouseDragged(MouseEvent e) { }
81
82 public void mouseClicked(MouseEvent e) {
83 Node node = getNodeAtMouse();
84 if (node!=null) {
85 e.consume();
86 _selectednode = node;
87 _controller.notifyNodeSelected(node);
88 m_graphPane.repaint();
89 }
90 }
91
92 public void paint(Graphics2D g) {
93 if (isEnabled()) {
94 Node node = getSelectedNode();
95
96 if (node!=null) {
97 Rectangle clip = g.getClipBounds();
98 m_graphPane.getNodeScreenBounds(node, _bounds);
99 _bounds.setBounds(_bounds.x-_border_insets.left,
100 _bounds.y-_border_insets.top,
101 _bounds.width+_border_insets.left+_border_insets.right,
102 _bounds.height+_border_insets.top+_border_insets.bottom);
103 if (clip.intersects(_bounds)) {
104 Stroke oldstroke = g.getStroke();
105 g.setColor(_border_color);
106 g.setStroke(_border_stroke);
107 if (_corner_size.width == 0 || _corner_size.height == 0)
108 g.drawRect(_bounds.x,
109 _bounds.y,
110 _bounds.width-1,
111 _bounds.height-1);
112 else
113 g.drawRoundRect(_bounds.x,
114 _bounds.y,
115 _bounds.width-1,
116 _bounds.height-1,
117 _corner_size.width,
118 _corner_size.height);
119 g.setStroke(oldstroke);
120 }
121 }
122 }
123 }
124 }