View Javadoc

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  	    // if (node==null) node = getNodeAtMouse();
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 }