Statistics
| Revision:

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
}