Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.ui / src / main / java / org / gvsig / gui / beans / panelGroup / treePanel / TreePanel.java @ 40561

History | View | Annotate | Download (23.4 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.gui.beans.panelGroup.treePanel;
25

    
26
import java.awt.BorderLayout;
27
import java.awt.Component;
28
import java.awt.Dimension;
29
import java.awt.event.ContainerEvent;
30
import java.io.Serializable;
31
import java.util.Enumeration;
32

    
33
import javax.swing.ImageIcon;
34
import javax.swing.JPanel;
35
import javax.swing.JScrollPane;
36
import javax.swing.JSplitPane;
37
import javax.swing.JTree;
38
import javax.swing.event.ChangeEvent;
39
import javax.swing.event.TreeModelEvent;
40
import javax.swing.event.TreeModelListener;
41
import javax.swing.event.TreeSelectionEvent;
42
import javax.swing.event.TreeSelectionListener;
43
import javax.swing.tree.DefaultMutableTreeNode;
44
import javax.swing.tree.DefaultTreeCellRenderer;
45
import javax.swing.tree.DefaultTreeModel;
46
import javax.swing.tree.TreePath;
47
import javax.swing.tree.TreeSelectionModel;
48

    
49
import org.gvsig.gui.beans.panelGroup.AbstractPanelGroup;
50
import org.gvsig.gui.beans.panelGroup.PanelGroupManager;
51
import org.gvsig.gui.beans.panelGroup.panels.AbstractPanel;
52
import org.gvsig.gui.beans.panelGroup.panels.IPanel;
53
import org.gvsig.gui.beans.panelGroup.tabbedPanel.TabbedPanel;
54

    
55

    
56
/**
57
 * <p>Graphical interface that's a {@link JPanel JPanel} with an inner {@link JSplitPane JSplitPane} that
58
 *  contains the {@link IPanel IPanel}'s grouped in a {@link JTree JTree}.</p>
59
 * <p>When user selects one of them, at the tree, that's displayed at the right pane of the split pane, and
60
 *  user can work with it.</p>
61
 *
62
 * @see AbstractPanelGroup
63
 *
64
 * @version 15/10/2007
65
 * @author Pablo Piqueras Bartolom? (pablo.piqueras@iver.es)
66
 */
67
public class TreePanel extends AbstractPanelGroup implements Serializable {
68
        private static final long serialVersionUID = 2350636078676872309L;
69

    
70
        /**
71
         * <p>Graphical interface where the tree and the selected panel will be drawn.</p>
72
         *
73
         * @see #getJSplitPane()
74
         */
75
        private JSplitPane jSplitPane = null;
76

    
77
        /**
78
         * <p>Graphical interface that represents a tree where panels will be listed and grouped together.</p>
79
         *
80
         * @see #getJTree()
81
         */
82
        private JTree jTree = null;
83

    
84
        /**
85
         * <p>Graphical interface where is allocated the tree.</p>
86
         *
87
         * @see #getJSplitPane()
88
         */
89
        private JScrollPane treeJScrollPane = null;
90

    
91
        /**
92
         * <p>Reference to the root node of the tree.</p>
93
         *
94
         * #see #getRootNode()
95
         */
96
        private DefaultMutableTreeNode rootNode = null;
97

    
98
        /**
99
         * <p>Reference to the tree model.</p>
100
         *
101
         * @see #getTreeModel()
102
         */
103
        private DefaultTreeModel treeModel = null;
104

    
105
        /**
106
         * <p>A panel used in the initialization of the split pane.</p>
107
         *
108
         * @see #getDefaultPanel()
109
         */
110
        private AbstractPanel defaultPanel = null;
111

    
112
        /**
113
         * <p>Name of the tree root node.</p>
114
         */
115
        private final String rootNodeName = "";
116

    
117
        /**
118
         * <p>Default (horizontal) divider width.</p>
119
         */
120
        private final short DEFAULT_DIVIDER_WIDTH = 5;
121

    
122
        /**
123
         * <p>Reference to the last node inserted or removed.</p>
124
         */
125
        private DefaultMutableTreeNode lastNode = null;
126

    
127
        /**
128
         * <p>Attribute used to hold the position of the divider.</p>
129
         */
130
        private int currentDividerLocation;
131

    
132
        /**
133
         * <p>Number of the registered panels of this group that are in the GUI.</p>
134
         */
135
        private int panelsInGUICount;
136

    
137
        static {
138
                // Registers this class as a "PanelGroup" type
139
                PanelGroupManager.getManager().registerPanelGroup(TabbedPanel.class);
140
        }
141

    
142
        /**
143
         * <p>Default constructor.</p>
144
         *
145
         * @param reference object that is ''semantically' or 'contextually' related to the group of panels
146
         */
147
        public TreePanel(Object reference) {
148
                super(reference);
149

    
150
                initialize();
151
        }
152

    
153
        /*
154
         * (non-Javadoc)
155
         * @see org.gvsig.gui.beans.panelGroup.AbstractPanelGroup#initialize()
156
         */
157
        protected void initialize() {
158
                super.initialize();
159

    
160
                currentDividerLocation = -1;
161

    
162
                panelsInGUICount = 0;
163
                this.setLayout(new BorderLayout());
164
                this.add(getJSplitPane(), BorderLayout.CENTER);
165
        }
166

    
167
        /**
168
         * <p>This method initializes <code>jSplitPane</code>.</p>
169
         *
170
         * @return JSplitPane
171
         */
172
        protected JSplitPane getJSplitPane() {
173
                if (jSplitPane == null) {
174
                        jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
175
                        jSplitPane.setDividerSize(DEFAULT_DIVIDER_WIDTH);
176
                        jSplitPane.setLeftComponent(getTreeJScrollPane());
177
                        jSplitPane.setRightComponent(getDefaultPanel());
178
                        jSplitPane.setOneTouchExpandable(true);
179
                        jSplitPane.setDividerLocation(180);
180
                }
181

    
182
                return jSplitPane;
183
        }
184

    
185
        /**
186
         * <p>This method initializes <code>defaultPanel</code>.</p>
187
         *
188
         * @return AbstractPanel inner panel that is stored as a right panel of the <code>JSplitPane</code> object
189
         *  when this object is created
190
         */
191
        protected AbstractPanel getDefaultPanel() {
192
                if (defaultPanel == null) {
193
                        defaultPanel = new DefaultPanel();
194
                }
195

    
196
                return defaultPanel;
197
        }
198

    
199
        /**
200
         * <p>This method initializes <code>jTree</code>.</p>
201
         *
202
         * @return JTree
203
         */
204
        protected JTree getJTree() {
205
                if (jTree == null) {
206
                        jTree = new JTree(getTreeModel());
207

    
208
                        // Single Selection:
209
                        jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
210

    
211
                        // Remove icons:
212
                        DefaultTreeCellRenderer defaultTreeCellRenderer = new DefaultTreeCellRenderer();
213
                        defaultTreeCellRenderer.setOpenIcon(null);
214
                        defaultTreeCellRenderer.setClosedIcon(null);
215
                        defaultTreeCellRenderer.setLeafIcon(null);
216

    
217
                        // Add new icons for the node-branches that can be expanded or collapsed
218
                        ImageIcon treeCellRendererIcon = new ImageIcon(TreePanel.class.getResource("images/treenodecollapsibleicon.png"), null);
219
                        defaultTreeCellRenderer.setOpenIcon(treeCellRendererIcon);
220
                        treeCellRendererIcon = new ImageIcon(TreePanel.class.getResource("images/treenodeexpandableicon.png"), null);
221
                        defaultTreeCellRenderer.setClosedIcon(treeCellRendererIcon);
222

    
223
                        // Root not visible
224
                        jTree.setRootVisible(false);
225
                        jTree.setCellRenderer(defaultTreeCellRenderer);
226

    
227
                        // Expand only the root node
228
                        // Adds support for notification that a node has been adder or removed using a ''ContainerEvent''
229
                        //  which is used in other AbstractPanelGruop implementations:
230
                        jTree.getModel().addTreeModelListener(new TreeModelListener() {
231
                                /*
232
                                 * (non-Javadoc)
233
                                 * @see org.apache.log4j.lf5.viewer.categoryexplorer.TreeModelAdapter#treeNodesInserted(javax.swing.event.TreeModelEvent)
234
                                 */
235
                                public void treeNodesInserted(TreeModelEvent e) {
236
                                        // Expand only the root node
237
                                        TreePath rootNodePath = new TreePath(getRootNode());
238

    
239
                                        if (jTree.isCollapsed(rootNodePath))
240
                                                jTree.expandPath(rootNodePath);
241

    
242
                                        // Only notify as ContainerEvent the insertion of a IPanel
243
                                        if (((DefaultMutableTreeNode)lastNode).getUserObject() instanceof IPanel)
244
                                                dispatchEvent(new ContainerEvent(jTree, ContainerEvent.COMPONENT_ADDED, (Component)((DefaultMutableTreeNode)lastNode).getUserObject()));
245

    
246
                                        lastNode = null;
247
                                }
248

    
249
                                /*
250
                                 * (non-Javadoc)
251
                                 * @see org.apache.log4j.lf5.viewer.categoryexplorer.TreeModelAdapter#treeNodesRemoved(javax.swing.event.TreeModelEvent)
252
                                 */
253
                                public void treeNodesRemoved(TreeModelEvent e) {
254
                                        // Expand only the root node
255
                                        TreePath rootNodePath = new TreePath(getRootNode());
256

    
257
                                        if (jTree.isCollapsed(rootNodePath))
258
                                                jTree.expandPath(rootNodePath);
259

    
260
                                        // Only notify as ContainerEvent the insertion of a IPanel
261
                                        if (((DefaultMutableTreeNode)lastNode).getUserObject() instanceof IPanel)
262
                                                dispatchEvent(new ContainerEvent(jTree, ContainerEvent.COMPONENT_REMOVED, (Component)((DefaultMutableTreeNode)lastNode).getUserObject()));
263

    
264
                                        lastNode = null;
265
                                }
266

    
267
                                public void treeNodesChanged(TreeModelEvent e) {
268
                                        // TODO Auto-generated method stub
269

    
270
                                }
271

    
272
                                public void treeStructureChanged(TreeModelEvent e) {
273
                                        // TODO Auto-generated method stub
274

    
275
                                }
276
                        });
277

    
278
                        // Set to the right panel of the JSplitPane, the AbstractPanel selected
279
                        // Adds support for notification that a node has been selected -> set the panel associated to
280
                        //  the right panel of the jSplitPane
281
                        jTree.addTreeSelectionListener(new TreeSelectionListener() {
282
                                /*
283
                                 * (non-Javadoc)
284
                                 * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent)
285
                                 */
286
                            public void valueChanged(TreeSelectionEvent e) {
287
                                DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
288

    
289
                                /* If nothing is selected */
290
                                if (node == null)
291
                                        return;
292

    
293
                                /* Retrieve the node that was selected and set it to the right panel of the JSPlitPane */
294
                                Object object = node.getUserObject();
295

    
296
                                if ((object != null) && (object instanceof AbstractPanel)) {
297
                                        getJSplitPane().setRightComponent((Component) object);
298

    
299
                                        // Notifies the new panel selected
300
                                        stateChanged(new ChangeEvent(object));
301

    
302
                                            getJSplitPane().setDividerLocation(currentDividerLocation);
303
                                }
304
                            }
305
                        });
306
                }
307

    
308
                return jTree;
309
        }
310

    
311
        /**
312
         * <p>This method initializes <code>treeModel</code>.</p>
313
         *
314
         * @return DefaultTreeModel
315
         */
316
        protected DefaultTreeModel getTreeModel() {
317
                if (treeModel == null) {
318
                        treeModel = new DefaultTreeModel(getRootNode());
319
                }
320

    
321
                return treeModel;
322
        }
323

    
324
        /**
325
         * <p>This method initializes <code>rootNode</code>.</p>
326
         *
327
         * @return DefaultMutableTreeNode
328
         */
329
        protected DefaultMutableTreeNode getRootNode() {
330
                if (rootNode == null)
331
                        rootNode = new DefaultMutableTreeNode(rootNodeName);
332

    
333
                return rootNode;
334
        }
335

    
336
        /**
337
         * <p>This method initialiazes <code>jScrollPane</code>.</p>
338
         *
339
         * @return JScrollPane
340
         */
341
        protected JScrollPane getTreeJScrollPane() {
342
                if (treeJScrollPane == null) {
343
                        treeJScrollPane = new JScrollPane();
344
                        treeJScrollPane.setViewportView(getJTree());
345
                }
346

    
347
                return treeJScrollPane;
348
        }
349

    
350
        /*
351
         * (non-Javadoc)
352
         * @see org.gvsig.gui.beans.panelGroup.AbstractPanelGroup#loadPanel(org.gvsig.gui.beans.panelGroup.panels.IPanel)
353
         */
354
        protected void loadPanel(IPanel panel) {
355
                super.loadPanel(panel);
356

    
357
                AbstractPanel panel_obj = (AbstractPanel)panel;
358

    
359
                if (panel_obj.isVisible()) {
360
                        addPanelImpl(panel);
361

    
362
                        // Recalculates preferred sizes (of the right component of the JSPlitPane), and then resizes also this one if it's necessary
363
                        Dimension panelPreferredSize = panel_obj.getPreferredSize();
364
                        Dimension rightPanelPreferredSize = getJSplitPane().getRightComponent().getPreferredSize();
365

    
366
                        if ((panelPreferredSize.width > rightPanelPreferredSize.width) || (panelPreferredSize.height > rightPanelPreferredSize.height)) {
367
                                getJSplitPane().getRightComponent().setPreferredSize(new Dimension(Math.max(panelPreferredSize.width, rightPanelPreferredSize.width), Math.max(panelPreferredSize.height, rightPanelPreferredSize.height)));
368
                        }
369
                }
370
        }
371

    
372
        /**
373
         * <p>Has the algorithms that allows adding a panel to the JTree component.</p>
374
         *
375
         * @param panel the panel to add
376
         *
377
         * @see #addPanel(IPanel)
378
         */
379
        protected void addPanelImpl(IPanel panel) {
380
                if (belongsThisGroup(panel)) {
381

    
382
                        // Don't add the panel if hasn't defined the 'label' attribute
383
                        if (panel.getLabel() == null)
384
                                return;
385

    
386
                        DefaultMutableTreeNode new_node = new DefaultMutableTreeNode(panel);
387
                        lastNode = new_node;
388

    
389
                        // Case 1 -> the attribute 'labelGroup' is undefined
390
                        if (panel.getLabelGroup() == null) {
391
                                getTreeModel().insertNodeInto(new_node, getRootNode(), getRootNode().getChildCount());
392
                                panelsInGUICount ++;
393
                                return;
394
                        }
395

    
396
                        // Case 2 -> Check if already exists a node with the same 'labelGroup' attribute than the panel
397
                        DefaultMutableTreeNode node;
398

    
399
                        for (short i = 0; i < getRootNode().getChildCount(); i ++) {
400
                                node = (DefaultMutableTreeNode) getRootNode().getChildAt(i);
401

    
402
                                if (node.getUserObject().toString().equals(panel.getLabelGroup())) {
403
                                        getTreeModel().insertNodeInto(new_node, node, node.getChildCount());
404
                                        panelsInGUICount ++;
405
                                        return;
406
                                }
407
                        }
408

    
409
                        // Case 3 -> Normal insertion
410
                        DefaultMutableTreeNode parent = new DefaultMutableTreeNode(panel.getLabelGroup());
411
                        lastNode = parent;
412
                        getTreeModel().insertNodeInto(parent, getRootNode(), getRootNode().getChildCount());
413

    
414
                        lastNode = new_node;
415
                        getTreeModel().insertNodeInto(new_node, parent, 0);
416
                        panelsInGUICount ++;
417
                }
418
        }
419

    
420
        /**
421
         * <p>Has the algorithms that allows adding a panel to the JTree component, considering the position
422
         *  of that panel in the group, and the group position in the JTree.</p>
423
         *
424
         * @param panel the panel to add
425
         *
426
         * @see #addPanel(IPanel)
427
         */
428
        protected void addPanelSortOrdered(IPanel panel) {
429
                if (belongsThisGroup(panel)) {
430

    
431
                        // Don't add the panel if hasn't defined the 'label' attribute
432
                        if (panel.getLabel() == null)
433
                                return;
434

    
435
                        short p_index = (short)registeredPanels.indexOf(panel);
436

    
437
                        DefaultMutableTreeNode new_node = new DefaultMutableTreeNode(panel);
438
                        lastNode = new_node;
439

    
440
//                        String label;
441
                        short l_index = 0;
442
                        short i;
443

    
444
                        // Case 1 -> the attribute 'labelGroup' is undefined (null)
445
                        if (panel.getLabelGroup() == null) {
446
                                Enumeration labelsAndGroups = rootNode.children();
447

    
448
                                for (i = 0; i < p_index; i++) {
449
                                        if (registeredPanels.get(i).getLabelGroup() == null) {
450
                                                if (labelsAndGroups.hasMoreElements()) {
451
                                                        if (((DefaultMutableTreeNode)labelsAndGroups.nextElement()).getUserObject().equals(registeredPanels.get(i)))
452
                                                                l_index ++;
453
                                                }
454
                                                else {
455
                                                        break;
456
                                                }
457
                                        }
458
                                        else {
459
                                                if (labelsAndGroups.hasMoreElements()) {
460
                                                        if (((DefaultMutableTreeNode)labelsAndGroups.nextElement()).getUserObject().equals(registeredPanels.get(i).getLabelGroup()))
461
                                                                l_index ++;
462
                                                }
463
                                                else {
464
                                                        break;
465
                                                }
466
                                        }
467
                                }
468

    
469
                                // Insert the node
470
                                getTreeModel().insertNodeInto(new_node, getRootNode(), l_index);
471
                                panelsInGUICount ++;
472
                                return;
473
                        }
474

    
475
                        // Case 2 -> Check if already exists a node with the same 'labelGroup' attribute than the panel
476
                        DefaultMutableTreeNode node = null;
477
                        Enumeration groups = rootNode.children();
478
                        Enumeration labels;
479

    
480
                        // Find the node with the label group
481
                        while (groups.hasMoreElements()) {
482
                                node = (DefaultMutableTreeNode) groups.nextElement();
483

    
484
                                if ((node.getUserObject()).equals(panel.getLabelGroup())) {
485
                                        break;
486
                                }
487
                                else {
488
                                        node = null;
489
                                }
490
                        }
491

    
492
                        if (node != null) {
493
                                labels = node.children();
494
                                l_index = 0;
495

    
496
                                // Avoid adding two times the same node
497
                                while (labels.hasMoreElements()) {
498
                                        if (((DefaultMutableTreeNode)labels.nextElement()).getUserObject().equals(panel))
499
                                                return;
500
                                }
501

    
502
                                labels = node.children();
503
                                Object leaf_panel = ((DefaultMutableTreeNode) labels.nextElement()).getUserObject();
504

    
505
                                for (i = 0; i < p_index; i++) {
506
                                        if (registeredPanels.get(i).getLabelGroup() == panel.getLabelGroup()) {
507
                                                if (registeredPanels.get(i).equals(leaf_panel)) {
508
                                                        l_index ++;
509

    
510
                                                        if (! labels.hasMoreElements())
511
                                                                break;
512

    
513
                                                        leaf_panel = ((DefaultMutableTreeNode) labels.nextElement()).getUserObject();
514
                                                }
515
                                        }
516
                                }
517

    
518
                                // Insert the node
519
                                getTreeModel().insertNodeInto(new_node, node, l_index);
520
                                panelsInGUICount ++;
521
                                return;
522
                        }
523

    
524
                        // Case 3 -> Normal insertion
525

    
526
                        // Check the position of the 'labelGroup' node:
527
                        short g_index = 0;
528

    
529
                        groups = rootNode.children();
530
                        String c_labelGroup = (String)((DefaultMutableTreeNode)groups.nextElement()).getUserObject();
531
                        String labelGroup;
532

    
533
                        for (i = 0; i < p_index; i++) {
534
                                labelGroup = registeredPanels.get(i).getLabelGroup();
535

    
536
                                if (c_labelGroup == null) {
537
                                        if (labelGroup == null) {
538
                                                c_labelGroup = (String)((DefaultMutableTreeNode)groups.nextElement()).getUserObject();
539
                                                g_index ++;
540
                                        }
541
                                }
542
                                else {
543
                                        if (c_labelGroup.equals(labelGroup))
544
                                        {
545
                                                DefaultMutableTreeNode dmtnode = ((DefaultMutableTreeNode)groups.nextElement());
546
                                                c_labelGroup = (String)dmtnode.getUserObject().toString();
547
                                                g_index ++;
548
                                        }
549
                                }
550
                        }
551

    
552
                        // Insert the node
553
                        DefaultMutableTreeNode parent = new DefaultMutableTreeNode(panel.getLabelGroup());
554
                        lastNode = parent;
555
                        getTreeModel().insertNodeInto(parent, getRootNode(), g_index);
556

    
557
                        lastNode = new_node;
558
                        getTreeModel().insertNodeInto(new_node, parent, 0);
559
                        panelsInGUICount ++;
560
                }
561
        }
562

    
563
        /*
564
         * (non-Javadoc)
565
         * @see org.gvsig.gui.beans.panelGroup.AbstractPanelGroup#unLoadPanel(org.gvsig.gui.beans.panelGroup.panels.IPanel)
566
         */
567
        protected void unLoadPanel(IPanel panel) {
568
                super.unLoadPanel(panel);
569

    
570
                removePanelImpl(panel);
571
        }
572

    
573
        /**
574
         * <p>Has the algorithms that allows removing a panel from the JTree component.</p>
575
         *
576
         * @param panel the panel to remove
577
         *
578
         * @see #removePanel(IPanel)
579
         */
580
        protected void removePanelImpl(IPanel panel) {
581
                if (belongsThisGroup(panel)) {
582

    
583
                        // Don't add the panel if hasn't defined the 'label' attribute
584
                        if (panel.getLabel() == null)
585
                                return;
586

    
587
                        DefaultMutableTreeNode node;
588

    
589
                        // Case 1 -> the attribute 'labelGroup' is undefined
590
                        if (panel.getLabelGroup() == null) {
591
                                for (short i = 0; i < getRootNode().getChildCount(); i ++) {
592
                                        node = (DefaultMutableTreeNode) getRootNode().getChildAt(i);
593

    
594
                                        if ((node.getUserObject().toString().equals(panel.getLabel())) && (node.getChildCount() == 0)) {
595
                                                lastNode = node;
596
                                                getTreeModel().removeNodeFromParent(node);
597
                                                panelsInGUICount --;
598
                                                return;
599
                                        }
600
                                }
601

    
602
                                return;
603
                        }
604

    
605
                        DefaultMutableTreeNode parent;
606

    
607
                        // Case 2 -> Check if already exists a node with the same 'labelGroup' and 'label' attributes than the panel
608
                        for (short i = 0; i < getRootNode().getChildCount(); i ++) {
609
                                parent = (DefaultMutableTreeNode) getRootNode().getChildAt(i);
610

    
611
                                if ((parent.getChildCount() > 0) && (parent.getUserObject().toString().equals(panel.getLabelGroup()))) {
612
                                        for (short j = 0; j < parent.getChildCount(); j ++) {
613
                                                node = (DefaultMutableTreeNode)parent.getChildAt(j);
614

    
615
                                                if (node.getUserObject().toString().equals(panel.getLabel())) {
616
                                                        if (parent.getChildCount() == 1) { // Case 3 -> If there is only one panel in that 'labelGroup'
617
                                                                lastNode = parent;
618
                                                                getTreeModel().removeNodeFromParent(parent);
619
                                                                panelsInGUICount --;
620
                                                        }
621
                                                        else {
622
                                                                lastNode = node;
623
                                                                getTreeModel().removeNodeFromParent(node);
624
                                                                panelsInGUICount --;
625
                                                        }
626
                                                }
627
                                        }
628
                                        return;
629
                                }
630
                        }
631
                }
632
        }
633

    
634
        /**
635
         * @see JTree#getSelectionPath()
636
         */
637
        public TreePath getSelectionPath() {
638
                return getJTree().getSelectionPath();
639
        }
640

    
641
        /*
642
         * (non-Javadoc)
643
         * @see org.gvsig.gui.beans.panelGroup.IPanelGroup#getActivePanel()
644
         */
645
        public IPanel getActivePanel() {
646
                if (registeredPanels.size() == 0)
647
                        return null;
648

    
649
                Object node = ((DefaultMutableTreeNode)getJTree().getLastSelectedPathComponent()).getUserObject();
650

    
651
                if (node instanceof IPanel)
652
                        return (IPanel)node;
653
                else
654
                        return null;
655
        }
656

    
657
        /*
658
         * (non-Javadoc)
659
         * @see org.gvsig.gui.beans.panelGroup.AbstractPanelGroup#stateChanged(javax.swing.event.ChangeEvent)
660
         */
661
        public void stateChanged(ChangeEvent e) {
662
                if (registeredPanels.size() == 0)
663
                        return;
664

    
665
                Object object = e.getSource();
666

    
667
                if ((object != null) && (object instanceof IPanel)) {
668
                        ((IPanel) object).selected();
669

    
670
                        // Get the current divider location to hold it after the selected panel will be set to the interface of the inner JTreePanel
671
                        currentDividerLocation = getJSplitPane().getDividerLocation();
672
            }
673
        }
674

    
675
        /*
676
         * (non-Javadoc)
677
         * @see org.gvsig.gui.beans.panelGroup.IPanelGroup#updatePanelVisibility(org.gvsig.gui.beans.panelGroup.panels.IPanel, boolean)
678
         */
679
        public synchronized void setPanelInGUI(IPanel panel, boolean b) {
680
                if (registeredPanels.size() == 0)
681
                        return;
682

    
683
                if (registeredPanels.indexOf(panel) == -1)
684
                        return;
685

    
686
                if (b == true) {
687
                        addPanelSortOrdered((AbstractPanel)panel);
688
                }
689
                else {
690
                        removePanelImpl((AbstractPanel)panel);
691
                }
692

    
693
                repaint();
694
        }
695

    
696
        /*
697
         * (non-Javadoc)
698
         * @see org.gvsig.gui.beans.panelGroup.IPanelGroup#isPanelInGUI(org.gvsig.gui.beans.panelGroup.panels.IPanel)
699
         */
700
        public synchronized boolean isPanelInGUI(IPanel panel) {
701
                if (!registeredPanels.contains(panel))
702
                        return false;
703

    
704
                DefaultMutableTreeNode node;
705

    
706
                for (int i = 0; i < getRootNode().getChildCount(); i++) {
707
                        node = (DefaultMutableTreeNode) getRootNode().getChildAt(i);
708

    
709
                        if (node.getChildCount() == 0) {
710
                                if (node.getUserObject().equals(panel))
711
                                        return true;
712
                        }
713
                        else {
714
                                if (isPanelAtBranch(panel, node))
715
                                        return true;
716
                        }
717
                }
718

    
719
                return false;
720
        }
721

    
722
        /**
723
         * <p>Returns <code>true</code> if the panel is a child of the tree node as parameter.</p>
724
         */
725
        protected boolean isPanelAtBranch(IPanel panel, DefaultMutableTreeNode node) {
726
                DefaultMutableTreeNode child;
727

    
728
                for (int i = 0; i < node.getChildCount(); i++) {
729
                        child = (DefaultMutableTreeNode) node.getChildAt(i);
730

    
731
                        if (child.getUserObject().equals(panel))
732
                                return true;
733
                }
734

    
735
                return false;
736
        }
737

    
738
    /**
739
     * @see JTree#addTreeSelectionListener(TreeSelectionListener)
740
     */
741
    public void addTreeSelectionListener(TreeSelectionListener tsl) {
742
            getJTree().addTreeSelectionListener(tsl);
743
    }
744

    
745
    /**
746
     * @see JTree#removeTreeSelectionListener(TreeSelectionListener)
747
     */
748
    public void removeTreeSelectionListener(TreeSelectionListener tsl) {
749
            getJTree().removeTreeSelectionListener(tsl);
750
    }
751

    
752
    /**
753
     * @see JTree#getTreeSelectionListeners()
754
     */
755
    public TreeSelectionListener[] getTreeSelectionListeners() {
756
            return getJTree().getTreeSelectionListeners();
757
    }
758

    
759
     /*
760
     * (non-Javadoc)
761
     * @see org.gvsig.gui.beans.panelGroup.IPanelGroup#getPanelInGUICount()
762
     */
763
        public int getPanelInGUICount() {
764
                return panelsInGUICount;
765
        }
766

    
767
        /**
768
         * @see JSplitPane#getDividerLocation()
769
         */
770
        public int getDividerLocation() {
771
                return getJSplitPane().getDividerLocation();
772
        }
773

    
774
        /**
775
         * @see JSplitPane#setDividerLocation(int)
776
         */
777
        public void setDividerLocation(int location) {
778
                getJSplitPane().setDividerLocation(location);
779
        }
780

    
781
        /**
782
         * @see JSplitPane#getDividerSize()
783
         */
784
        public int getDividerSize() {
785
                return getJSplitPane().getDividerSize();
786
        }
787

    
788
        /**
789
         * @see JSplitPane#setDividerSize()
790
         */
791
        public void setDividerSize(int newSize) {
792
                getJSplitPane().setDividerSize(newSize);
793
        }
794

    
795
        /**
796
         * <p>A trivial implementation of {@link AbstractPanel AbstractPanel} used in the
797
         *  initialization of the <code>jSplitPane</code> attribute.</p>
798
         *
799
         * @version 15/10/2007
800
         * @author Pablo Piqueras Bartolom? (pablo.piqueras@iver.es)
801
         */
802
        protected class DefaultPanel extends AbstractPanel {
803
                /**
804
                 * @see AbstractPanel#AbstractPanel()
805
                 */
806
                public DefaultPanel() {
807
                        super();
808
                }
809

    
810
                /**
811
                 * @see AbstractPanel#AbstractPanel(String, String, String)
812
                 */
813
                public DefaultPanel(String id, String label, String labelGroup) {
814
                        super(id, label, labelGroup);
815
                }
816

    
817
                /*
818
                 * (non-Javadoc)
819
                 * @see org.gvsig.gui.beans.panelGroup.panels.AbstractPanel#initialize()
820
                 */
821
                protected void initialize() {
822
                }
823

    
824
                /*
825
                 * (non-Javadoc)
826
                 * @see org.gvsig.gui.beans.panelGroup.panels.IPanel#accept()
827
                 */
828
                public void accept() {
829
                }
830

    
831
                /*
832
                 * (non-Javadoc)
833
                 * @see org.gvsig.gui.beans.panelGroup.panels.IPanel#apply()
834
                 */
835
                public void apply() {
836
                }
837

    
838
                public void cancel() {
839
                }
840

    
841
                public void selected() {
842
                }
843
        }
844
}