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 @ 1845

History | View | Annotate | Download (4.48 KB)

1
package org.gvsig.tools.swing.impl;
2

    
3
import java.util.ArrayList;
4
import java.util.List;
5
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
import javax.swing.tree.DefaultMutableTreeNode;
11
import javax.swing.tree.TreeModel;
12

    
13
public class TreeComboUtils {
14

    
15
    public static void setTreeModel(JComboBox comboBox, TreeModel aTreeModel) {
16
        ComboBoxModel model = createComboBoxModel(aTreeModel);
17
        comboBox.setModel(model);
18
        comboBox.setRenderer(new TreeComboCellRenderer(model));
19
    }
20

    
21
    public static ComboBoxModel createComboBoxModel(TreeModel aTreeModel) {
22
        return new TreeModelToComboBoxModelAdapter(aTreeModel);
23
    }
24

    
25
    public static class TreeModelToComboBoxModelAdapter extends AbstractListModel implements ComboBoxModel, TreeModelListener {
26

    
27
        private static final long serialVersionUID = 922222366298284635L;
28

    
29
        TreeModel source;
30
        boolean invalid = true;
31
        DefaultMutableTreeNode currentValue;
32
        List<DefaultMutableTreeNode> cache = new ArrayList<>();
33

    
34
        @SuppressWarnings("LeakingThisInConstructor")
35
        public TreeModelToComboBoxModelAdapter(TreeModel aTreeModel) {
36
            source = aTreeModel;
37
            aTreeModel.addTreeModelListener(this);
38
        }
39

    
40
        @Override
41
        public void setSelectedItem(Object anObject) {
42
            if ((currentValue != null && !currentValue.equals(anObject))
43
                    || currentValue == null && anObject != null) {
44
                currentValue = this.getNode(anObject);
45
            }
46
            fireContentsChanged(this, -1, -1);
47
        }
48

    
49
        @Override
50
        public Object getSelectedItem() {
51
            if (currentValue == null) {
52
                return null;
53
            }
54
            return currentValue.getUserObject();
55
        }
56

    
57
        @Override
58
        public int getSize() {
59
            validate();
60
            return cache.size();
61
        }
62

    
63
        @Override
64
        public Object getElementAt(int index) {
65
            return cache.get(index).getUserObject();
66
        }
67

    
68
        public DefaultMutableTreeNode getNode(int index) {
69
            return cache.get(index);
70
        }
71

    
72
        public DefaultMutableTreeNode getNode(Object anObject) {
73
            for (DefaultMutableTreeNode node : cache) {
74
                if (node.getUserObject().equals(anObject)) {
75
                    return node;
76
                }
77
            }
78
            return null;
79
        }
80

    
81
        @Override
82
        public void treeNodesChanged(TreeModelEvent e) {
83
            invalid = true;
84
        }
85

    
86
        @Override
87
        public void treeNodesInserted(TreeModelEvent e) {
88
            invalid = true;
89
        }
90

    
91
        @Override
92
        public void treeNodesRemoved(TreeModelEvent e) {
93
            invalid = true;
94
        }
95

    
96
        @Override
97
        public void treeStructureChanged(TreeModelEvent e) {
98
            invalid = true;
99
        }
100

    
101
        void validate() {
102
            if (invalid) {
103
                cache = new ArrayList<>();
104
                cacheTree(source.getRoot(), 0);
105
                if (cache.size() > 0) {
106
                    currentValue = cache.get(0);
107
                }
108
                invalid = false;
109
                fireContentsChanged(this, 0, 0);
110
            }
111
        }
112

    
113
        void cacheTree(Object anObject, int level) {
114
            if (source.isLeaf(anObject)) {
115
                addNode(anObject, level, false);
116
            } else {
117
                int c = source.getChildCount(anObject);
118
                int i;
119
                Object child;
120

    
121
                addNode(anObject, level, true);
122
                level++;
123

    
124
                for (i = 0; i < c; i++) {
125
                    child = source.getChild(anObject, i);
126
                    cacheTree(child, level);
127
                }
128

    
129
                level--;
130
            }
131
        }
132

    
133
        void addNode(Object anObject, int level, boolean isNode) {
134
            cache.add(new ListEntry(anObject, level, isNode));
135
        }
136

    
137
        private static class ListEntry extends DefaultMutableTreeNode {
138

    
139
            private static final long serialVersionUID = 304579876188493086L;
140

    
141
            int level;
142

    
143
            public ListEntry(Object anObject, int aLevel, boolean isNode) {
144
                super(anObject, isNode);
145
                this.setUserObject(anObject);
146
                level = aLevel;
147
            }
148

    
149
            @Override
150
            public int getLevel() {
151
                return level;
152
            }
153

    
154
        }
155
    }
156
}