Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / TreeComboUtils.java @ 2339

History | View | Annotate | Download (4.48 KB)

1 1377 jjdelcerro
package org.gvsig.tools.swing.impl;
2
3 1381 jjdelcerro
import java.util.ArrayList;
4
import java.util.List;
5 1377 jjdelcerro
import javax.swing.AbstractListModel;
6
import javax.swing.ComboBoxModel;
7
import javax.swing.JComboBox;
8
import javax.swing.event.TreeModelEvent;
9
import javax.swing.event.TreeModelListener;
10 1381 jjdelcerro
import javax.swing.tree.DefaultMutableTreeNode;
11 1377 jjdelcerro
import javax.swing.tree.TreeModel;
12
13 1381 jjdelcerro
public class TreeComboUtils {
14 1377 jjdelcerro
15
    public static void setTreeModel(JComboBox comboBox, TreeModel aTreeModel) {
16 1424 jjdelcerro
        ComboBoxModel model = createComboBoxModel(aTreeModel);
17
        comboBox.setModel(model);
18
        comboBox.setRenderer(new TreeComboCellRenderer(model));
19 1377 jjdelcerro
    }
20
21 1424 jjdelcerro
    public static ComboBoxModel createComboBoxModel(TreeModel aTreeModel) {
22
        return new TreeModelToComboBoxModelAdapter(aTreeModel);
23
    }
24 1381 jjdelcerro
25 1424 jjdelcerro
    public static class TreeModelToComboBoxModelAdapter extends AbstractListModel implements ComboBoxModel, TreeModelListener {
26
27
        private static final long serialVersionUID = 922222366298284635L;
28
29 1377 jjdelcerro
        TreeModel source;
30
        boolean invalid = true;
31 1424 jjdelcerro
        DefaultMutableTreeNode currentValue;
32
        List<DefaultMutableTreeNode> cache = new ArrayList<>();
33 1377 jjdelcerro
34 1381 jjdelcerro
        @SuppressWarnings("LeakingThisInConstructor")
35 1424 jjdelcerro
        public TreeModelToComboBoxModelAdapter(TreeModel aTreeModel) {
36 1377 jjdelcerro
            source = aTreeModel;
37
            aTreeModel.addTreeModelListener(this);
38
        }
39
40 1381 jjdelcerro
        @Override
41 1377 jjdelcerro
        public void setSelectedItem(Object anObject) {
42 1381 jjdelcerro
            if ((currentValue != null && !currentValue.equals(anObject))
43
                    || currentValue == null && anObject != null) {
44 1424 jjdelcerro
                currentValue = this.getNode(anObject);
45 1377 jjdelcerro
            }
46
            fireContentsChanged(this, -1, -1);
47
        }
48
49 1381 jjdelcerro
        @Override
50 1377 jjdelcerro
        public Object getSelectedItem() {
51 1381 jjdelcerro
            if (currentValue == null) {
52
                return null;
53
            }
54 1424 jjdelcerro
            return currentValue.getUserObject();
55 1377 jjdelcerro
        }
56
57 1381 jjdelcerro
        @Override
58 1377 jjdelcerro
        public int getSize() {
59
            validate();
60
            return cache.size();
61
        }
62
63 1381 jjdelcerro
        @Override
64 1377 jjdelcerro
        public Object getElementAt(int index) {
65 1424 jjdelcerro
            return cache.get(index).getUserObject();
66 1377 jjdelcerro
        }
67
68 1424 jjdelcerro
        public DefaultMutableTreeNode getNode(int index) {
69 1381 jjdelcerro
            return cache.get(index);
70
        }
71
72 1424 jjdelcerro
        public DefaultMutableTreeNode getNode(Object anObject) {
73
            for (DefaultMutableTreeNode node : cache) {
74
                if (node.getUserObject().equals(anObject)) {
75
                    return node;
76 1381 jjdelcerro
                }
77
            }
78
            return null;
79
        }
80
81
        @Override
82 1377 jjdelcerro
        public void treeNodesChanged(TreeModelEvent e) {
83
            invalid = true;
84
        }
85
86 1381 jjdelcerro
        @Override
87 1377 jjdelcerro
        public void treeNodesInserted(TreeModelEvent e) {
88
            invalid = true;
89
        }
90
91 1381 jjdelcerro
        @Override
92 1377 jjdelcerro
        public void treeNodesRemoved(TreeModelEvent e) {
93
            invalid = true;
94
        }
95
96 1381 jjdelcerro
        @Override
97 1377 jjdelcerro
        public void treeStructureChanged(TreeModelEvent e) {
98
            invalid = true;
99
        }
100
101
        void validate() {
102 1381 jjdelcerro
            if (invalid) {
103
                cache = new ArrayList<>();
104
                cacheTree(source.getRoot(), 0);
105
                if (cache.size() > 0) {
106
                    currentValue = cache.get(0);
107
                }
108 1377 jjdelcerro
                invalid = false;
109
                fireContentsChanged(this, 0, 0);
110
            }
111
        }
112
113 1381 jjdelcerro
        void cacheTree(Object anObject, int level) {
114
            if (source.isLeaf(anObject)) {
115 1424 jjdelcerro
                addNode(anObject, level, false);
116 1381 jjdelcerro
            } else {
117 1377 jjdelcerro
                int c = source.getChildCount(anObject);
118
                int i;
119
                Object child;
120
121 1424 jjdelcerro
                addNode(anObject, level, true);
122 1377 jjdelcerro
                level++;
123
124 1381 jjdelcerro
                for (i = 0; i < c; i++) {
125
                    child = source.getChild(anObject, i);
126
                    cacheTree(child, level);
127 1377 jjdelcerro
                }
128
129
                level--;
130
            }
131
        }
132
133 1424 jjdelcerro
        void addNode(Object anObject, int level, boolean isNode) {
134 1381 jjdelcerro
            cache.add(new ListEntry(anObject, level, isNode));
135 1377 jjdelcerro
        }
136 1381 jjdelcerro
137 1424 jjdelcerro
        private static class ListEntry extends DefaultMutableTreeNode {
138 1381 jjdelcerro
139 1424 jjdelcerro
            private static final long serialVersionUID = 304579876188493086L;
140 1381 jjdelcerro
141 1424 jjdelcerro
            int level;
142 1381 jjdelcerro
143 1424 jjdelcerro
            public ListEntry(Object anObject, int aLevel, boolean isNode) {
144
                super(anObject, isNode);
145
                this.setUserObject(anObject);
146
                level = aLevel;
147 1381 jjdelcerro
            }
148
149
            @Override
150 1424 jjdelcerro
            public int getLevel() {
151
                return level;
152 1381 jjdelcerro
            }
153 1377 jjdelcerro
154
        }
155
    }
156
}