svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / toc / TOC.java @ 709
History | View | Annotate | Download (13.8 KB)
1 | 480 | fjp | /*
|
---|---|---|---|
2 | * Created on 13-may-2004
|
||
3 | *
|
||
4 | * To change the template for this generated file go to
|
||
5 | * Window>Preferences>Java>Code Generation>Code and Comments
|
||
6 | */
|
||
7 | package com.iver.cit.gvsig.gui.toc; |
||
8 | |||
9 | |||
10 | import java.awt.BorderLayout; |
||
11 | import java.awt.Dimension; |
||
12 | import java.awt.Point; |
||
13 | import java.awt.Rectangle; |
||
14 | import java.awt.event.ActionEvent; |
||
15 | import java.awt.event.ActionListener; |
||
16 | import java.awt.event.ComponentEvent; |
||
17 | import java.awt.event.ComponentListener; |
||
18 | import java.awt.event.InputEvent; |
||
19 | import java.awt.event.MouseAdapter; |
||
20 | import java.awt.event.MouseEvent; |
||
21 | import java.util.ArrayList; |
||
22 | import java.util.Enumeration; |
||
23 | |||
24 | import javax.swing.BorderFactory; |
||
25 | import javax.swing.JColorChooser; |
||
26 | import javax.swing.JComponent; |
||
27 | import javax.swing.JDialog; |
||
28 | import javax.swing.JScrollPane; |
||
29 | import javax.swing.JTree; |
||
30 | import javax.swing.UIManager; |
||
31 | import javax.swing.tree.DefaultMutableTreeNode; |
||
32 | import javax.swing.tree.DefaultTreeModel; |
||
33 | import javax.swing.tree.TreePath; |
||
34 | import javax.swing.tree.TreeSelectionModel; |
||
35 | |||
36 | 681 | fernando | import com.iver.cit.gvsig.fmap.AtomicEvent; |
37 | import com.iver.cit.gvsig.fmap.AtomicEventListener; |
||
38 | 654 | fernando | import com.iver.cit.gvsig.fmap.DriverException; |
39 | 480 | fjp | import com.iver.cit.gvsig.fmap.FMap; |
40 | import com.iver.cit.gvsig.fmap.core.v02.FSymbol; |
||
41 | import com.iver.cit.gvsig.fmap.drivers.DriverIOException; |
||
42 | import com.iver.cit.gvsig.fmap.layers.CancelationException; |
||
43 | import com.iver.cit.gvsig.fmap.layers.FLayer; |
||
44 | 494 | fjp | import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent; |
45 | import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener; |
||
46 | import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent; |
||
47 | 564 | fernando | import com.iver.cit.gvsig.fmap.layers.LegendListener; |
48 | import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable; |
||
49 | 709 | fernando | import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection; |
50 | 480 | fjp | import com.iver.cit.gvsig.fmap.rendering.ClassifiedLegendInfo; |
51 | import com.iver.cit.gvsig.fmap.rendering.Legend; |
||
52 | 486 | fjp | import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent; |
53 | 480 | fjp | import com.iver.cit.gvsig.fmap.rendering.styling.FStyle2D; |
54 | |||
55 | /**
|
||
56 | * @author fjp
|
||
57 | *
|
||
58 | * To change the template for this generated type comment go to
|
||
59 | * Window>Preferences>Java>Code Generation>Code and Comments
|
||
60 | */
|
||
61 | 494 | fjp | public class TOC extends JComponent implements ITocOrderListener, |
62 | 564 | fernando | LegendListener, LayerCollectionListener, ComponentListener {
|
63 | 493 | fjp | private FMap mapContext;
|
64 | 480 | fjp | private DnDJTree m_Tree;
|
65 | private DefaultTreeModel m_TreeModel; |
||
66 | private DefaultMutableTreeNode m_Root; |
||
67 | private TOCRenderer m_TocRenderer;
|
||
68 | private JScrollPane m_Scroller; |
||
69 | private ArrayList m_Listeners; |
||
70 | |||
71 | /**
|
||
72 | * Clase Listener que reacciona al pulsar sobre el checkbox de un nodo y
|
||
73 | * crea un popupmenu al pulsar el bot?n derecho.
|
||
74 | */
|
||
75 | class NodeSelectionListener extends MouseAdapter implements ActionListener { |
||
76 | JTree tree;
|
||
77 | JDialog dlg;
|
||
78 | JColorChooser colorChooser;
|
||
79 | FPopupMenu popmenu = null;
|
||
80 | |||
81 | NodeSelectionListener(JTree tree) {
|
||
82 | this.tree = tree;
|
||
83 | } |
||
84 | |||
85 | public void mouseClicked(MouseEvent e) { |
||
86 | int x = e.getX();
|
||
87 | int y = e.getY();
|
||
88 | int row = tree.getRowForLocation(x, y);
|
||
89 | TreePath path = tree.getPathForRow(row);
|
||
90 | 709 | fernando | LayerCollection layers = mapContext.getLayers(); |
91 | 480 | fjp | // System.out.println(e.getSource());
|
92 | |||
93 | if (path != null) { |
||
94 | DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); |
||
95 | // System.out.println("Evento de rat?n originado por " + e.getSource().getClass().toString());
|
||
96 | |||
97 | if (node.getUserObject() instanceof TocItemBranch) { |
||
98 | TocItemBranch elTema = (TocItemBranch) node.getUserObject(); |
||
99 | FLayer lyr = elTema.getLayer(); |
||
100 | // Si tenemos may?sculas apretadas es que queremos activar m?s temas.
|
||
101 | // Si no, primero desactivamos temas
|
||
102 | if (!((e.getModifiers() & InputEvent.SHIFT_MASK) != 0)) |
||
103 | { |
||
104 | 709 | fernando | layers.setAllActives(false);
|
105 | 480 | fjp | |
106 | } |
||
107 | |||
108 | lyr.setActive(true);
|
||
109 | // Si pertenece a un grupo, lo ponemos activo tambi?n.
|
||
110 | FLayer parentLayer = lyr.getParentLayer(); |
||
111 | if (parentLayer != null){ |
||
112 | parentLayer.setActive(true);
|
||
113 | } |
||
114 | |||
115 | Point layerNodeLocation = tree.getUI()
|
||
116 | .getPathBounds(tree, path) |
||
117 | .getLocation(); |
||
118 | |||
119 | //Rect?ngulo que representa el checkbox
|
||
120 | Rectangle checkBoxBounds = m_TocRenderer.getCheckBoxBounds();
|
||
121 | checkBoxBounds.translate((int) layerNodeLocation.getX(),
|
||
122 | (int) layerNodeLocation.getY());
|
||
123 | |||
124 | if (checkBoxBounds.contains(e.getPoint())) {
|
||
125 | lyr.setVisible(!lyr.isVisible()); |
||
126 | } |
||
127 | |||
128 | //Boton derecho sobre un nodo del arbol
|
||
129 | if ((e.getModifiers() & InputEvent.META_MASK) != 0) { |
||
130 | 493 | fjp | popmenu = new FPopupMenu(mapContext, node);
|
131 | 480 | fjp | tree.add(popmenu); |
132 | |||
133 | //System.out.println("boton derecho");
|
||
134 | popmenu.show(e.getComponent(), e.getX(), e.getY()); |
||
135 | } |
||
136 | |||
137 | } |
||
138 | |||
139 | |||
140 | if (node.getUserObject() instanceof FStyle2D) |
||
141 | { |
||
142 | //Boton derecho sobre un Simbolo
|
||
143 | if ((e.getModifiers() & InputEvent.META_MASK) != 0) { |
||
144 | 493 | fjp | popmenu = new FPopupMenu(mapContext, node);
|
145 | 480 | fjp | tree.add(popmenu); |
146 | popmenu.show(e.getComponent(), e.getX(), e.getY()); |
||
147 | } |
||
148 | } |
||
149 | |||
150 | ((DefaultTreeModel) tree.getModel()).nodeChanged(node);
|
||
151 | |||
152 | if (row == 0) { |
||
153 | tree.revalidate(); |
||
154 | tree.repaint(); |
||
155 | } |
||
156 | |||
157 | } |
||
158 | } |
||
159 | |||
160 | public void actionPerformed(ActionEvent arg0) { |
||
161 | } |
||
162 | } |
||
163 | |||
164 | |||
165 | 493 | fjp | public TOC() {
|
166 | 480 | fjp | |
167 | this.setLayout(new BorderLayout()); |
||
168 | this.setMinimumSize(new Dimension(100,80)); |
||
169 | this.setPreferredSize(new Dimension(100,80)); |
||
170 | |||
171 | //Construct the tree.
|
||
172 | m_Root = new DefaultMutableTreeNode(java.lang.Object.class); |
||
173 | m_TreeModel = new DefaultTreeModel(m_Root); |
||
174 | m_Tree = new DnDJTree(m_TreeModel);
|
||
175 | |||
176 | m_TocRenderer = new TOCRenderer();
|
||
177 | m_Tree.setCellRenderer(m_TocRenderer); |
||
178 | |||
179 | m_Tree.setRootVisible(false);
|
||
180 | // m_Tree.setExpandsSelectedPaths(true);
|
||
181 | // m_Tree.setAutoscrolls(true);
|
||
182 | m_Tree.setShowsRootHandles(true);
|
||
183 | //Posibilidad de seleccionar de forma aleatoria nodos de la leyenda.
|
||
184 | m_Tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
|
||
185 | m_Tree.addMouseListener(new NodeSelectionListener(m_Tree));
|
||
186 | m_Tree.setBackground(UIManager.getColor("Button.background")); |
||
187 | m_Tree.setBorder(BorderFactory.createEtchedBorder());
|
||
188 | |||
189 | 493 | fjp | this.addComponentListener(this); |
190 | 480 | fjp | |
191 | m_Tree.addOrderListener(this);
|
||
192 | |||
193 | m_Tree.setRowHeight(0); // Para que lo determine el renderer |
||
194 | |||
195 | |||
196 | m_Scroller = new JScrollPane(m_Tree); |
||
197 | m_Scroller.setBorder(BorderFactory.createEmptyBorder());
|
||
198 | |||
199 | // scrollPane.setPreferredSize(new Dimension(80,80));
|
||
200 | |||
201 | //Add everything to this panel.
|
||
202 | /* GridBagLayout gridbag = new GridBagLayout();
|
||
203 | GridBagConstraints c = new GridBagConstraints();
|
||
204 | |||
205 | setLayout(gridbag);
|
||
206 | |||
207 | c.fill = GridBagConstraints.BOTH;
|
||
208 | c.weightx = 1.0;
|
||
209 | gridbag.setConstraints(check,c); */
|
||
210 | |||
211 | add(m_Scroller); //, BorderLayout.WEST);
|
||
212 | |||
213 | // refresh();
|
||
214 | |||
215 | } |
||
216 | |||
217 | |||
218 | |||
219 | 493 | fjp | public void setMapContext(FMap mc) { |
220 | mapContext = mc; |
||
221 | 681 | fernando | mapContext.addAtomicEventListener(new AtomicEventListener() {
|
222 | /**
|
||
223 | * @see com.iver.cit.gvsig.fmap.AtomicEventListener#atomicEvent(com.iver.cit.gvsig.fmap.AtomicEvent)
|
||
224 | */
|
||
225 | public void atomicEvent(AtomicEvent e) { |
||
226 | if ((e.getLayerCollectionEvents().length > 0) || |
||
227 | (e.getLegendEvents().length > 0)){
|
||
228 | System.err.println("se refresca"); |
||
229 | refresh(); |
||
230 | }else
|
||
231 | System.err.println("no se refresca"); |
||
232 | } |
||
233 | }); |
||
234 | 480 | fjp | } |
235 | |||
236 | /* (non-Javadoc)
|
||
237 | * @see com.iver.cit.opensig.gui.IToc#refresh()
|
||
238 | */
|
||
239 | public void refresh() { |
||
240 | 709 | fernando | LayerCollection theLayers = mapContext.getLayers(); |
241 | 480 | fjp | m_Root.removeAllChildren(); |
242 | m_Root.setAllowsChildren(true);
|
||
243 | |||
244 | doRefresh(theLayers, m_Root); |
||
245 | |||
246 | m_TreeModel.reload(); |
||
247 | } |
||
248 | 709 | fernando | private void doRefresh(LayerCollection theLayers, DefaultMutableTreeNode parentNode) |
249 | 480 | fjp | { |
250 | Dimension sizeLeaf = new Dimension(m_Tree.getWidth(), 15); |
||
251 | Dimension sizeBranch = new Dimension(m_Tree.getWidth(), 25); |
||
252 | for (int i=theLayers.getLayersCount()-1;i>=0; i--) |
||
253 | { |
||
254 | FLayer lyr = theLayers.getLayer(i); |
||
255 | TocItemBranch elTema = new TocItemBranch(lyr);
|
||
256 | elTema.setSize(sizeBranch); |
||
257 | DefaultMutableTreeNode nodeLayer = new DefaultMutableTreeNode(elTema); |
||
258 | |||
259 | m_TreeModel.insertNodeInto(nodeLayer, parentNode, parentNode.getChildCount()); |
||
260 | TreePath path = new TreePath(m_TreeModel.getPathToRoot(nodeLayer)); |
||
261 | m_Tree.makeVisible(path); |
||
262 | 709 | fernando | if (lyr instanceof LayerCollection) |
263 | 480 | fjp | { |
264 | 709 | fernando | LayerCollection group = (LayerCollection) lyr; |
265 | 480 | fjp | doRefresh(group, nodeLayer); |
266 | } |
||
267 | else
|
||
268 | { |
||
269 | 564 | fernando | if (lyr instanceof Classifiable) |
270 | 512 | fjp | { |
271 | 564 | fernando | Classifiable aux = (Classifiable) lyr; |
272 | Legend legendInfo = aux.getLegend(); |
||
273 | 512 | fjp | try {
|
274 | if (legendInfo instanceof ClassifiedLegendInfo) |
||
275 | { |
||
276 | ClassifiedLegendInfo cl = (ClassifiedLegendInfo) legendInfo; |
||
277 | String[] descriptions = cl.getDescriptions(); |
||
278 | FSymbol[] symbols = cl.getSymbols();
|
||
279 | for (int j=0; j<descriptions.length;j++) |
||
280 | { |
||
281 | TocItemLeaf itemLeaf; |
||
282 | itemLeaf = new TocItemLeaf(symbols[j],descriptions[j], aux.getShapeType());
|
||
283 | itemLeaf.setSize(sizeLeaf); |
||
284 | DefaultMutableTreeNode nodeValue = new DefaultMutableTreeNode(itemLeaf); |
||
285 | m_TreeModel.insertNodeInto(nodeValue, nodeLayer, nodeLayer.getChildCount()); |
||
286 | TreePath pathSymbol = new TreePath(m_TreeModel.getPathToRoot(nodeValue)); |
||
287 | m_Tree.makeVisible(pathSymbol); |
||
288 | } |
||
289 | } |
||
290 | if (legendInfo.getDefaultSymbol() != null) |
||
291 | { |
||
292 | TocItemLeaf itemLeaf; |
||
293 | itemLeaf = new TocItemLeaf(legendInfo.getDefaultSymbol(),"Default", aux.getShapeType()); |
||
294 | 480 | fjp | itemLeaf.setSize(sizeLeaf); |
295 | DefaultMutableTreeNode nodeValue = new DefaultMutableTreeNode(itemLeaf); |
||
296 | m_TreeModel.insertNodeInto(nodeValue, nodeLayer, nodeLayer.getChildCount()); |
||
297 | TreePath pathSymbol = new TreePath(m_TreeModel.getPathToRoot(nodeValue)); |
||
298 | 512 | fjp | m_Tree.makeVisible(pathSymbol); |
299 | } |
||
300 | 654 | fernando | } catch (DriverException e) {
|
301 | 512 | fjp | // TODO Auto-generated catch block
|
302 | e.printStackTrace(); |
||
303 | 480 | fjp | } |
304 | 512 | fjp | } |
305 | 480 | fjp | |
306 | } // if instanceof layers
|
||
307 | |||
308 | } |
||
309 | |||
310 | } |
||
311 | |||
312 | /**
|
||
313 | * @see com.iver.cit.opensig.gui.toc.ITocOrderListener#orderChanged(int, int)
|
||
314 | */
|
||
315 | public void orderChanged(int oldPos, int newPos) { |
||
316 | 709 | fernando | LayerCollection layers = mapContext.getLayers(); |
317 | 480 | fjp | // El orden es el contrario, hay que traducir.
|
318 | // El orden es el contrario, hay que traducir.
|
||
319 | oldPos = layers.getLayersCount() -1 - oldPos;
|
||
320 | newPos = layers.getLayersCount() -1 - newPos;
|
||
321 | try {
|
||
322 | layers.moveTo(oldPos, newPos); |
||
323 | } catch (CancelationException e) {
|
||
324 | // TODO Auto-generated catch block
|
||
325 | e.printStackTrace(); |
||
326 | } |
||
327 | refresh(); |
||
328 | } |
||
329 | |||
330 | |||
331 | |||
332 | /* (non-Javadoc)
|
||
333 | * @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent)
|
||
334 | */
|
||
335 | public void componentHidden(ComponentEvent e) { |
||
336 | |||
337 | |||
338 | } |
||
339 | |||
340 | |||
341 | |||
342 | /* (non-Javadoc)
|
||
343 | * @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent)
|
||
344 | */
|
||
345 | public void componentMoved(ComponentEvent e) { |
||
346 | |||
347 | |||
348 | } |
||
349 | |||
350 | |||
351 | |||
352 | /* (non-Javadoc)
|
||
353 | * @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent)
|
||
354 | */
|
||
355 | public void componentResized(ComponentEvent e) { |
||
356 | System.out.println("Cambiando tama?o."); |
||
357 | |||
358 | int i = 0; |
||
359 | DefaultMutableTreeNode n;
|
||
360 | Enumeration enum = m_Root.children(); |
||
361 | while (enum.hasMoreElements()) |
||
362 | { |
||
363 | n = (DefaultMutableTreeNode) enum.nextElement(); |
||
364 | if (n.getUserObject() instanceof TocItemBranch) |
||
365 | { |
||
366 | |||
367 | ITocItem item = (ITocItem) n.getUserObject(); |
||
368 | Dimension szAnt = item.getSize();
|
||
369 | item.setSize(new Dimension(this.getWidth()-30,szAnt.height)); |
||
370 | } |
||
371 | System.out.println("i=" + i++); |
||
372 | } |
||
373 | m_Tree.setSize(this.getSize());
|
||
374 | |||
375 | System.out.println("Ancho del tree=" + m_Tree.getWidth() + " " + m_Tree.getComponentCount()); |
||
376 | System.out.println("Ancho del TOC=" + this.getWidth()); |
||
377 | // m_Tree.repaint();
|
||
378 | |||
379 | |||
380 | } |
||
381 | |||
382 | |||
383 | |||
384 | /* (non-Javadoc)
|
||
385 | * @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent)
|
||
386 | */
|
||
387 | public void componentShown(ComponentEvent e) { |
||
388 | |||
389 | |||
390 | } |
||
391 | |||
392 | |||
393 | 486 | fjp | |
394 | /* (non-Javadoc)
|
||
395 | * @see com.iver.cit.gvsig.fmap.layers.LayerListener#legendChanged(com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent)
|
||
396 | */
|
||
397 | public void legendChanged(LegendChangedEvent e) { |
||
398 | System.out.println("Refrescando TOC"); |
||
399 | refresh(); |
||
400 | } |
||
401 | |||
402 | |||
403 | 494 | fjp | |
404 | /* (non-Javadoc)
|
||
405 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerAdded(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
|
||
406 | */
|
||
407 | public void layerAdded(LayerCollectionEvent e) { |
||
408 | refresh(); |
||
409 | |||
410 | } |
||
411 | |||
412 | |||
413 | |||
414 | /* (non-Javadoc)
|
||
415 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerMoved(com.iver.cit.gvsig.fmap.layers.LayerPositionEvent)
|
||
416 | */
|
||
417 | public void layerMoved(LayerPositionEvent e) { |
||
418 | refresh(); |
||
419 | } |
||
420 | |||
421 | |||
422 | |||
423 | /* (non-Javadoc)
|
||
424 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerRemoved(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
|
||
425 | */
|
||
426 | public void layerRemoved(LayerCollectionEvent e) { |
||
427 | refresh(); |
||
428 | |||
429 | } |
||
430 | |||
431 | |||
432 | |||
433 | /* (non-Javadoc)
|
||
434 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerAdding(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
|
||
435 | */
|
||
436 | public void layerAdding(LayerCollectionEvent e) throws CancelationException { |
||
437 | |||
438 | } |
||
439 | |||
440 | |||
441 | |||
442 | /* (non-Javadoc)
|
||
443 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerMoving(com.iver.cit.gvsig.fmap.layers.LayerPositionEvent)
|
||
444 | */
|
||
445 | public void layerMoving(LayerPositionEvent e) throws CancelationException { |
||
446 | |||
447 | } |
||
448 | |||
449 | |||
450 | |||
451 | /* (non-Javadoc)
|
||
452 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerRemoving(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
|
||
453 | */
|
||
454 | public void layerRemoving(LayerCollectionEvent e) throws CancelationException { |
||
455 | |||
456 | } |
||
457 | |||
458 | |||
459 | |||
460 | /* (non-Javadoc)
|
||
461 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#activationChanged(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
|
||
462 | */
|
||
463 | public void activationChanged(LayerCollectionEvent e) throws CancelationException { |
||
464 | repaint(); |
||
465 | |||
466 | } |
||
467 | |||
468 | |||
469 | |||
470 | /* (non-Javadoc)
|
||
471 | * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#visibilityChanged(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
|
||
472 | */
|
||
473 | public void visibilityChanged(LayerCollectionEvent e) throws CancelationException { |
||
474 | repaint(); |
||
475 | |||
476 | } |
||
477 | |||
478 | |||
479 | 480 | fjp | } |