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