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 | } |