Revision 42657 trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.fmap.control/src/main/java/org/gvsig/fmap/mapcontrol/LayersTreeModel.java

View differences:

LayersTreeModel.java
1 1
package org.gvsig.fmap.mapcontrol;
2 2

  
3 3
import java.util.ArrayList;
4
import java.util.Arrays;
4 5
import java.util.Iterator;
5 6
import java.util.List;
6 7
import javax.swing.event.TreeModelEvent;
7 8
import javax.swing.event.TreeModelListener;
8 9
import javax.swing.tree.TreeModel;
9 10
import javax.swing.tree.TreePath;
11
import org.apache.commons.lang3.BooleanUtils;
10 12
import org.gvsig.fmap.mapcontext.layers.FLayer;
11 13
import org.gvsig.fmap.mapcontext.layers.FLayers;
14
import org.gvsig.tools.evaluator.Evaluator;
15
import org.gvsig.tools.evaluator.EvaluatorData;
12 16

  
13

  
14 17
public class LayersTreeModel implements TreeModel {
15 18

  
16
        protected final FLayers layers;
19
    private final List<TreeModelListener> listeners = new ArrayList();
20
    protected FLayers layers;
21
    private Evaluator filter;
22
    private MyEvaluatorData datafilter;
17 23

  
18
        protected final List<TreeModelListener> listeners = new ArrayList();
24
    private static class MyEvaluatorData implements EvaluatorData {
19 25

  
20
        public LayersTreeModel(FLayers layers) {
21
            this.layers = layers;
22
        }
26
        public FLayer layer = null;
23 27

  
24 28
        @Override
25
        public Object getRoot() {
26
            return layers;
29
        public Object getDataValue(String name) {
30
            if (name.equalsIgnoreCase("layer")) {
31
                return layer;
32
            }
33
            return null;
27 34
        }
28 35

  
29 36
        @Override
30
        public Object getChild(Object parent, int index) {
31
            if (!(parent instanceof FLayers)) {
32
                return null;
37
        public Object getContextValue(String name) {
38
            if (name.equalsIgnoreCase("layer")) {
39
                return layer;
33 40
            }
34
            return ((FLayers) parent).getLayer(index);
41
            return null;
35 42
        }
36 43

  
37 44
        @Override
38
        public int getChildCount(Object parent) {
39
            if (!(parent instanceof FLayers)) {
40
                return 0;
41
            }
42
            return ((FLayers) parent).getLayersCount();
45
        public Iterator getDataValues() {
46
            return Arrays.asList(new FLayer[]{this.layer}).iterator();
43 47
        }
44 48

  
45 49
        @Override
46
        public boolean isLeaf(Object node) {
47
            return !(node instanceof FLayers);
50
        public Iterator getDataNames() {
51
            return Arrays.asList(new String[]{"layer"}).iterator();
48 52
        }
49 53

  
50 54
        @Override
51
        public int getIndexOfChild(Object parent, Object child) {
52
            for( int i=0; i<((FLayers)parent).getLayersCount() ; i++ ) {
53
                FLayer layer = ((FLayers)parent).getLayer(i);
54
                if( child == layer ) {
55
                    return i;
56
                }
55
        public boolean hasDataValue(String name) {
56
            if (name.equalsIgnoreCase("layer")) {
57
                return true;
57 58
            }
58
            return -1;
59
            return false;
59 60
        }
60 61

  
61 62
        @Override
62
        public void valueForPathChanged(TreePath path, Object value) {
63
        public boolean hasContextValue(String name) {
64
            if (name.equalsIgnoreCase("layer")) {
65
                return true;
66
            }
67
            return false;
63 68
        }
64 69

  
65
        @Override
66
        public void addTreeModelListener(TreeModelListener listener) {
67
            listeners.add(listener);
70
    }
71

  
72
    public LayersTreeModel(FLayers layers) {
73
        this.layers = layers;
74
    }
75

  
76
    public void setFilter(Evaluator filter) {
77
        this.filter = filter;
78
        this.datafilter = new MyEvaluatorData();
79
    }
80

  
81
    @Override
82
    public Object getRoot() {
83
        return layers;
84
    }
85

  
86
    @Override
87
    public Object getChild(Object parent, int index) {
88
        if (!(parent instanceof FLayers)) {
89
            return null;
68 90
        }
91
        return ((FLayers) parent).getLayer(index);
92
    }
69 93

  
70
        @Override
71
        public void removeTreeModelListener(TreeModelListener listener) {
72
            listeners.remove(listener);
94
    @Override
95
    public int getChildCount(Object parent) {
96
        if (!(parent instanceof FLayers)) {
97
            return 0;
73 98
        }
99
        if (this.filter == null) {
100
            return ((FLayers) parent).getLayersCount();
101
        }
102
        int count = 0;
103
        for (int i = 0; i < ((FLayers) parent).getLayersCount(); i++) {
104
            FLayer layer = ((FLayers) parent).getLayer(i);
105
            try {
106
                if (!(layer instanceof FLayers)) {
107
                    this.datafilter.layer = layer;
108
                    if (BooleanUtils.isTrue((Boolean) this.filter.evaluate(this.datafilter))) {
109
                        count++;
110
                    }
111
                }
112
            } catch (Exception ex) {
113
                // Do nothing, skyp this layer on error.
114
            }
115
        }
116
        return count;
74 117

  
75
        public void reload() {
76
            TreeModelEvent event = new TreeModelEvent(this, new TreePath(this.layers));
77
            Iterator<TreeModelListener> iterator = listeners.iterator();
78
            TreeModelListener listener;
79
            while (iterator.hasNext()) {
80
                listener = iterator.next();
81
                listener.treeStructureChanged(event);
118
    }
119

  
120
    @Override
121
    public boolean isLeaf(Object node) {
122
        return !(node instanceof FLayers);
123
    }
124

  
125
    @Override
126
    public int getIndexOfChild(Object parent, Object child) {
127
        if (this.filter == null) {
128
            for (int i = 0; i < ((FLayers) parent).getLayersCount(); i++) {
129
                FLayer layer = ((FLayers) parent).getLayer(i);
130
                if (child == layer) {
131
                    return i;
132
                }
82 133
            }
134
            return -1;
83 135
        }
136
        int count = 0;
137
        for (int i = 0; i < ((FLayers) parent).getLayersCount(); i++) {
138
            FLayer layer = ((FLayers) parent).getLayer(i);
139
            try {
140
                if (!(layer instanceof FLayers)) {
141
                    this.datafilter.layer = layer;
142
                    if (BooleanUtils.isTrue((Boolean) this.filter.evaluate(this.datafilter))) {
143
                        if (child == layer) {
144
                            return count;
145
                        }
146
                        count++;
147
                    }
148
                }
149
            } catch (Exception ex) {
150
                // Do nothing, skyp this layer on error.
151
            }
152
        }
153
        return -1;
154

  
155
    }
156

  
157
    @Override
158
    public void valueForPathChanged(TreePath path, Object value) {
159
    }
160

  
161
    @Override
162
    public void addTreeModelListener(TreeModelListener listener) {
163
        listeners.add(listener);
164
    }
165

  
166
    @Override
167
    public void removeTreeModelListener(TreeModelListener listener) {
168
        listeners.remove(listener);
169
    }
170

  
171
    public void reload() {
172
        TreeModelEvent event = new TreeModelEvent(this, new TreePath(this.layers));
173
        Iterator<TreeModelListener> iterator = listeners.iterator();
174
        TreeModelListener listener;
175
        while (iterator.hasNext()) {
176
            listener = iterator.next();
177
            listener.treeStructureChanged(event);
178
        }
179
    }
180

  
84 181
}

Also available in: Unified diff