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

History | View | Annotate | Download (3.69 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.gvsig.tools.swing.api.FilteredTreeModel;
9

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

    
16
    private final TreeModel treeModel;
17
    private TreeModelFilter filter;
18
    protected EventListenerList listenerList = new EventListenerList();
19

    
20
    public FilteredTreeModelImpl(final TreeModel treeModel) {
21
        this.treeModel = treeModel;
22
        this.filter = null;
23
    }
24

    
25
    @Override
26
    public TreeModel getTreeModel() {
27
        return treeModel;
28
    }
29

    
30
    @Override
31
    public void setFilter(final TreeModelFilter filter) {
32
        this.filter = filter;
33
        TreePath tp = new TreePath(new Object[]{this.getRoot()});
34
        fireTreeStructureChanged(this, tp);
35
    }
36

    
37
    @Override
38
    public Object getRoot() {
39
        return treeModel.getRoot();
40
    }
41

    
42
    @Override
43
    public Object getChild(final Object parent, final int index) {
44
        int count = 0;
45
        int childCount = treeModel.getChildCount(parent);
46
        for (int i = 0; i < childCount; i++) {
47
            Object child = treeModel.getChild(parent, i);
48
            if( filter==null || filter.test(treeModel, child) ) {
49
                if (count == index) {
50
                    return child;
51
                }
52
                count++;
53
            }
54
        }
55
        return null;
56
    }
57

    
58
    @Override
59
    public int getChildCount(final Object parent) {
60
        int count = 0;
61
        int childCount = treeModel.getChildCount(parent);
62
        for (int i = 0; i < childCount; i++) {
63
            Object child = treeModel.getChild(parent, i);
64
            if( filter==null || filter.test(treeModel, child) ) {
65
                count++;
66
            }
67
        }
68
        return count;
69
    }
70

    
71
    @Override
72
    public boolean isLeaf(final Object node) {
73
        return treeModel.isLeaf(node);
74
    }
75

    
76
    @Override
77
    public void valueForPathChanged(final TreePath path, final Object newValue) {
78
        treeModel.valueForPathChanged(path, newValue);
79
    }
80

    
81
    @Override
82
    public int getIndexOfChild(final Object parent, final Object childToFind) {
83
        int childCount = treeModel.getChildCount(parent);
84
        for (int i = 0; i < childCount; i++) {
85
            Object child = treeModel.getChild(parent, i);
86
            if( filter==null || filter.test(treeModel, child) ) {
87
                if (childToFind.equals(child)) {
88
                    return i;
89
                }
90
            }
91
        }
92
        return -1;
93
    }
94

    
95
    @Override
96
    public void addTreeModelListener(final TreeModelListener l) {
97
        listenerList.add(TreeModelListener.class, l);
98
        treeModel.addTreeModelListener(l);
99
    }
100

    
101
    @Override
102
    public void removeTreeModelListener(final TreeModelListener l) {
103
        listenerList.remove(TreeModelListener.class, l);
104
        treeModel.removeTreeModelListener(l);
105
    }
106

    
107
    private void fireTreeStructureChanged(Object source, TreePath path) {
108
        // Guaranteed to return a non-null array
109
        Object[] listeners = listenerList.getListenerList();
110
        TreeModelEvent e = null;
111
        // Process the listeners last to first, notifying
112
        // those that are interested in this event
113
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
114
            if (listeners[i] == TreeModelListener.class) {
115
                // Lazily create the event:
116
                if (e == null) {
117
                    e = new TreeModelEvent(source, path);
118
                }
119
                ((TreeModelListener) listeners[i + 1]).treeStructureChanged(e);
120
            }
121
        }
122
    }
123

    
124
}