1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package org.ximtec.igesture.tool.explorer;
27
28 import java.beans.PropertyChangeEvent;
29 import java.util.Map;
30 import java.util.logging.Logger;
31
32 import javax.swing.Icon;
33 import javax.swing.JComponent;
34 import javax.swing.SwingUtilities;
35 import javax.swing.ToolTipManager;
36 import javax.swing.event.TreeSelectionEvent;
37 import javax.swing.event.TreeSelectionListener;
38 import javax.swing.tree.TreeCellRenderer;
39 import javax.swing.tree.TreePath;
40
41 import org.ximtec.igesture.tool.core.Controller;
42 import org.ximtec.igesture.tool.core.DefaultController;
43 import org.ximtec.igesture.tool.core.TabbedView;
44 import org.ximtec.igesture.tool.explorer.core.ExplorerTreeContainer;
45 import org.ximtec.igesture.tool.explorer.core.ExplorerTreeView;
46 import org.ximtec.igesture.tool.explorer.core.NodeInfo;
47
48
49
50
51
52
53
54
55 public class ExplorerTreeController extends DefaultController implements TreeSelectionListener {
56
57 private static final Logger LOG = Logger.getLogger(ExplorerTreeController.class.getName());
58
59
60
61
62
63 private ExplorerTreeContainer container;
64
65
66
67
68 private ExplorerTreeModel model;
69
70
71
72
73 private Map<Class<?>, NodeInfo> nodeInfos;
74
75
76
77
78 private ExplorerTree tree;
79
80 private ExplorerTreeView selectedExplorerTreeView;
81
82
83
84
85
86
87
88
89
90 public ExplorerTreeController(Controller parentController, ExplorerTreeContainer container, ExplorerTreeModel model,
91 TreeCellRenderer renderer) {
92 super(parentController);
93 this.container = container;
94 this.model = model;
95 this.nodeInfos = model.getNodeInfos();
96
97 tree = new ExplorerTree(this.model, renderer);
98 ToolTipManager.sharedInstance().registerComponent(tree);
99
100 tree.addTreeSelectionListener(this);
101 tree.addMouseListener(new ExplorerPopupDispatcher(nodeInfos));
102
103 container.setTree(tree);
104 selectedExplorerTreeView = nodeInfos.get(model.getRoot().getClass()).getView(this, model.getRoot());
105 container.setView(selectedExplorerTreeView);
106
107 }
108
109
110
111
112
113
114
115
116
117
118 public ExplorerTreeController(Controller parentController, ExplorerTreeContainer container, ExplorerTreeModel model) {
119 this(parentController, container, model, new NodeRenderer(model.getNodeInfos()));
120 }
121
122
123
124
125
126
127
128
129 @Override
130 public void valueChanged(TreeSelectionEvent e) {
131 final Object node = e.getPath().getLastPathComponent();
132 if (nodeInfos.get(node.getClass()) != null) {
133 SwingUtilities.invokeLater(new Runnable() {
134
135 @Override
136 public void run() {
137 selectedExplorerTreeView = nodeInfos.get(node.getClass()).getView(ExplorerTreeController.this, node);
138 container.setView(selectedExplorerTreeView);
139 }
140 });
141 }
142 }
143
144
145
146
147
148
149 @Override
150 public TabbedView getView() {
151 return new TabbedView() {
152
153 @Override
154 public Icon getIcon() {
155 return null;
156 }
157
158 @Override
159 public String getTabName() {
160 return tree.getName();
161 }
162
163 @Override
164 public JComponent getPane() {
165 return tree;
166 }
167
168 };
169 }
170
171 public void selectNode(Object obj) {
172 TreePath path = new TreePath(obj);
173 tree.setSelectionPath(path);
174 tree.setExpandsSelectedPaths(true);
175 }
176
177
178
179
180
181
182
183 public ExplorerTreeView getExplorerTreeView() {
184 return selectedExplorerTreeView;
185 }
186
187 public ExplorerTree getExplorerTree(){
188 return tree;
189 }
190
191
192
193
194
195
196
197
198 @Override
199 public void propertyChange(PropertyChangeEvent evt) {
200
201 LOG.info("Update Tree");
202
203
204 if (evt.getOldValue() == null && evt.getNewValue() != null) {
205 TreePath[] paths = tree.getSelectionPaths();
206 if (paths != null) {
207 for (TreePath treePath : paths) {
208
209 if (treePath.getLastPathComponent() == evt.getSource()
210 && !nodeInfos.get(treePath.getLastPathComponent().getClass()).isLeaf(treePath.getLastPathComponent())) {
211 tree.setSelectionPath(treePath.pathByAddingChild(evt.getNewValue()));
212 }
213 }
214 }
215 }
216
217
218 else if (evt.getOldValue() != null && evt.getNewValue() == null) {
219 TreePath[] paths = tree.getSelectionPaths();
220 if (paths != null) {
221 for (TreePath treePath : paths) {
222
223 if (treePath.getParentPath() != null && treePath.getParentPath().getLastPathComponent() == evt.getSource()) {
224 tree.setSelectionPath(treePath.getParentPath());
225 }
226 }
227 }
228 }
229
230 tree.updateUI();
231 }
232
233 }