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 / FilteredTreeModelImpl.java @ 2339
History | View | Annotate | Download (4.85 KB)
1 | 2116 | omartinez | package org.gvsig.tools.swing.impl; |
---|---|---|---|
2 | |||
3 | import javax.swing.event.EventListenerList; |
||
4 | import javax.swing.event.TreeModelEvent; |
||
5 | import javax.swing.event.TreeModelListener; |
||
6 | import javax.swing.tree.TreeModel; |
||
7 | import javax.swing.tree.TreePath; |
||
8 | 2285 | jjdelcerro | import org.apache.commons.lang3.StringUtils; |
9 | 2116 | omartinez | import org.gvsig.tools.swing.api.FilteredTreeModel; |
10 | 2296 | omartinez | import org.gvsig.tools.swing.api.TreeModelRecursiveWildcarMatchFilter; |
11 | 2116 | omartinez | |
12 | /**
|
||
13 | *
|
||
14 | * @author osc
|
||
15 | */
|
||
16 | public final class FilteredTreeModelImpl implements FilteredTreeModel { |
||
17 | |||
18 | 2130 | jjdelcerro | private final TreeModel treeModel; |
19 | 2285 | jjdelcerro | private FilterFunction filterfn;
|
20 | 2116 | omartinez | protected EventListenerList listenerList = new EventListenerList(); |
21 | 2285 | jjdelcerro | private String filter; |
22 | 2287 | omartinez | private boolean caseSensitive; |
23 | 2116 | omartinez | |
24 | public FilteredTreeModelImpl(final TreeModel treeModel) { |
||
25 | this.treeModel = treeModel;
|
||
26 | 2310 | omartinez | this.filterfn = new TreeModelRecursiveWildcarMatchFilter(this); |
27 | 2296 | omartinez | // this.filterfn = (Object model, Object value, String filter1) -> true;
|
28 | 2116 | omartinez | } |
29 | |||
30 | @Override
|
||
31 | public TreeModel getTreeModel() { |
||
32 | return treeModel;
|
||
33 | } |
||
34 | |||
35 | @Override
|
||
36 | public Object getRoot() { |
||
37 | return treeModel.getRoot();
|
||
38 | } |
||
39 | |||
40 | @Override
|
||
41 | public Object getChild(final Object parent, final int index) { |
||
42 | int count = 0; |
||
43 | int childCount = treeModel.getChildCount(parent);
|
||
44 | for (int i = 0; i < childCount; i++) { |
||
45 | Object child = treeModel.getChild(parent, i);
|
||
46 | 2296 | omartinez | if( filterfn.test(treeModel, child, filter) ) {
|
47 | 2116 | omartinez | if (count == index) {
|
48 | return child;
|
||
49 | } |
||
50 | count++; |
||
51 | } |
||
52 | } |
||
53 | return null; |
||
54 | } |
||
55 | |||
56 | @Override
|
||
57 | public int getChildCount(final Object parent) { |
||
58 | int count = 0; |
||
59 | int childCount = treeModel.getChildCount(parent);
|
||
60 | for (int i = 0; i < childCount; i++) { |
||
61 | Object child = treeModel.getChild(parent, i);
|
||
62 | 2296 | omartinez | if( filterfn.test(treeModel, child, filter) ) {
|
63 | 2116 | omartinez | count++; |
64 | } |
||
65 | } |
||
66 | return count;
|
||
67 | } |
||
68 | |||
69 | @Override
|
||
70 | public boolean isLeaf(final Object node) { |
||
71 | return treeModel.isLeaf(node);
|
||
72 | } |
||
73 | |||
74 | @Override
|
||
75 | public void valueForPathChanged(final TreePath path, final Object newValue) { |
||
76 | treeModel.valueForPathChanged(path, newValue); |
||
77 | } |
||
78 | |||
79 | @Override
|
||
80 | public int getIndexOfChild(final Object parent, final Object childToFind) { |
||
81 | int childCount = treeModel.getChildCount(parent);
|
||
82 | for (int i = 0; i < childCount; i++) { |
||
83 | Object child = treeModel.getChild(parent, i);
|
||
84 | 2296 | omartinez | if( filterfn.test(treeModel, child, filter) ) {
|
85 | 2116 | omartinez | if (childToFind.equals(child)) {
|
86 | return i;
|
||
87 | } |
||
88 | } |
||
89 | } |
||
90 | return -1; |
||
91 | } |
||
92 | |||
93 | @Override
|
||
94 | public void addTreeModelListener(final TreeModelListener l) { |
||
95 | listenerList.add(TreeModelListener.class, l);
|
||
96 | treeModel.addTreeModelListener(l); |
||
97 | } |
||
98 | |||
99 | @Override
|
||
100 | public void removeTreeModelListener(final TreeModelListener l) { |
||
101 | listenerList.remove(TreeModelListener.class, l);
|
||
102 | treeModel.removeTreeModelListener(l); |
||
103 | } |
||
104 | |||
105 | private void fireTreeStructureChanged(Object source, TreePath path) { |
||
106 | // Guaranteed to return a non-null array
|
||
107 | Object[] listeners = listenerList.getListenerList(); |
||
108 | TreeModelEvent e = null; |
||
109 | // Process the listeners last to first, notifying
|
||
110 | // those that are interested in this event
|
||
111 | for (int i = listeners.length - 2; i >= 0; i -= 2) { |
||
112 | if (listeners[i] == TreeModelListener.class) { |
||
113 | // Lazily create the event:
|
||
114 | if (e == null) { |
||
115 | e = new TreeModelEvent(source, path); |
||
116 | } |
||
117 | ((TreeModelListener) listeners[i + 1]).treeStructureChanged(e); |
||
118 | } |
||
119 | } |
||
120 | } |
||
121 | |||
122 | 2285 | jjdelcerro | @Override
|
123 | public String getFilter() { |
||
124 | return this.filter; |
||
125 | } |
||
126 | |||
127 | @Override
|
||
128 | public void setFilter(String filter) { |
||
129 | if (StringUtils.isBlank(filter)) {
|
||
130 | this.filter = null; |
||
131 | } else {
|
||
132 | if (StringUtils.containsAny(filter, "*?")) { |
||
133 | this.filter = filter;
|
||
134 | } else {
|
||
135 | this.filter = "*" + filter + "*"; |
||
136 | } |
||
137 | } |
||
138 | TreePath tp = new TreePath(new Object[]{this.getRoot()}); |
||
139 | fireTreeStructureChanged(this, tp);
|
||
140 | } |
||
141 | |||
142 | @Override
|
||
143 | public void setFilterFunction(FilterFunction filter) { |
||
144 | if( filter == null ) { |
||
145 | this.filterfn = (Object model, Object value, String filter1) -> true; |
||
146 | } else {
|
||
147 | this.filterfn = filter;
|
||
148 | } |
||
149 | TreePath tp = new TreePath(new Object[]{this.getRoot()}); |
||
150 | fireTreeStructureChanged(this, tp);
|
||
151 | } |
||
152 | 2287 | omartinez | |
153 | @Override
|
||
154 | public void setCaseSensitive(boolean sensitive) { |
||
155 | this.caseSensitive = sensitive;
|
||
156 | } |
||
157 | 2285 | jjdelcerro | |
158 | 2287 | omartinez | @Override
|
159 | public boolean isCaseSensitive() { |
||
160 | return this.caseSensitive; |
||
161 | } |
||
162 | 2285 | jjdelcerro | |
163 | 2116 | omartinez | } |