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

History | View | Annotate | Download (4.85 KB)

1
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
import org.apache.commons.lang3.StringUtils;
9
import org.gvsig.tools.swing.api.FilteredTreeModel;
10
import org.gvsig.tools.swing.api.TreeModelRecursiveWildcarMatchFilter;
11

    
12
/**
13
 *
14
 * @author osc
15
 */
16
public final class FilteredTreeModelImpl implements FilteredTreeModel {
17

    
18
    private final TreeModel treeModel;
19
    private FilterFunction filterfn;
20
    protected EventListenerList listenerList = new EventListenerList();
21
    private String filter;
22
    private boolean caseSensitive;
23

    
24
    public FilteredTreeModelImpl(final TreeModel treeModel) {
25
        this.treeModel = treeModel;
26
        this.filterfn = new TreeModelRecursiveWildcarMatchFilter(this);
27
//        this.filterfn = (Object model, Object value, String filter1) -> true;
28
    }
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
            if( filterfn.test(treeModel, child, filter) ) {
47
                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
            if( filterfn.test(treeModel, child, filter) ) {
63
                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
            if( filterfn.test(treeModel, child, filter) ) {
85
                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
    @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
    
153
    @Override
154
    public void setCaseSensitive(boolean sensitive) {
155
        this.caseSensitive = sensitive;
156
    }
157

    
158
    @Override
159
    public boolean isCaseSensitive() {
160
        return this.caseSensitive;
161
    }
162

    
163
}