Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.fmap.control / src / main / java / org / gvsig / fmap / mapcontrol / LayersTreeModel.java @ 45425

History | View | Annotate | Download (6.02 KB)

1
package org.gvsig.fmap.mapcontrol;
2

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

    
19
public class LayersTreeModel implements TreeModel {
20
    
21
    public static final Logger LOGGER = LoggerFactory.getLogger(LayersTreeModel.class);
22

    
23
    private final List<TreeModelListener> listeners = new ArrayList();
24
    protected FLayers layers;
25
    private Evaluator filter;
26
    private MyEvaluatorData datafilter;
27

    
28
    private static class MyEvaluatorData implements EvaluatorData {
29

    
30
        public FLayer layer = null;
31

    
32
        @Override
33
        public Object getDataValue(String name) {
34
            if (name.equalsIgnoreCase("layer")) {
35
                return layer;
36
            }
37
            return null;
38
        }
39

    
40
        @Override
41
        public Object getContextValue(String name) {
42
            if (name.equalsIgnoreCase("layer")) {
43
                return layer;
44
            }
45
            return null;
46
        }
47

    
48
        @Override
49
        public Iterator getDataValues() {
50
            return Arrays.asList(new FLayer[]{this.layer}).iterator();
51
        }
52

    
53
        @Override
54
        public Iterator getDataNames() {
55
            return Arrays.asList(new String[]{"layer"}).iterator();
56
        }
57

    
58
        @Override
59
        public boolean hasDataValue(String name) {
60
            if (name.equalsIgnoreCase("layer")) {
61
                return true;
62
            }
63
            return false;
64
        }
65

    
66
        @Override
67
        public boolean hasContextValue(String name) {
68
            if (name.equalsIgnoreCase("layer")) {
69
                return true;
70
            }
71
            return false;
72
        }
73

    
74
    }
75

    
76
    public LayersTreeModel(FLayers layers) {
77
        this.layers = layers;
78
    }
79

    
80
    public void setFilter(Evaluator filter) {
81
        this.filter = filter;
82
        this.datafilter = new MyEvaluatorData();
83
    }
84

    
85
    @Override
86
    public Object getRoot() {
87
        return layers;
88
    }
89

    
90
    @Override
91
    public Object getChild(Object parent, int index) {
92
        if (!(parent instanceof FLayers)) {
93
            return null;
94
        }
95
        
96
        int count = 0;
97
        for (int i = 0; i < ((FLayers) parent).getLayersCount(); i++) {
98
            FLayer layer = ((FLayers) parent).getLayer(i);
99
            try {
100
                if(index == count){
101
                    return layer;
102
                }
103
                if (!(layer instanceof FLayers)) {
104
                    this.datafilter.layer = layer;
105
                    if (BooleanUtils.isTrue((Boolean) this.filter.evaluate(this.datafilter))) {
106
                        count++;
107
                    }
108
                } else {
109
                    count++;
110
                }
111
            } catch (Exception ex) {
112
                LOGGER.debug("Can't process layer", ex);
113
                // Do nothing, skyp this layer on error.
114
            }
115
        }
116
        
117
        return null;
118
    }
119

    
120
    @Override
121
    public int getChildCount(Object parent) {
122
        if (!(parent instanceof FLayers)) {
123
            return 0;
124
        }
125
        if (this.filter == null) {
126
            return ((FLayers) parent).getLayersCount();
127
        }
128
        int count = 0;
129
        for (int i = 0; i < ((FLayers) parent).getLayersCount(); i++) {
130
            FLayer layer = ((FLayers) parent).getLayer(i);
131
            try {
132
                if (!(layer instanceof FLayers)) {
133
                    this.datafilter.layer = layer;
134
                    if (BooleanUtils.isTrue((Boolean) this.filter.evaluate(this.datafilter))) {
135
                        count++;
136
                    }
137
                } else {
138
                    count++;
139
                }
140
            } catch (Exception ex) {
141
                LOGGER.debug("Can't process layer", ex);
142
                // Do nothing, skyp this layer on error.
143
            }
144
        }
145
        return count;
146

    
147
    }
148

    
149
    @Override
150
    public boolean isLeaf(Object node) {
151
        return !(node instanceof FLayers);
152
    }
153

    
154
    @Override
155
    public int getIndexOfChild(Object parent, Object child) {
156
        if (this.filter == null) {
157
            for (int i = 0; i < ((FLayers) parent).getLayersCount(); i++) {
158
                FLayer layer = ((FLayers) parent).getLayer(i);
159
                if (child == layer) {
160
                    return i;
161
                }
162
            }
163
            return -1;
164
        }
165
        int count = 0;
166
        for (int i = 0; i < ((FLayers) parent).getLayersCount(); i++) {
167
            FLayer layer = ((FLayers) parent).getLayer(i);
168
            try {
169
                if (!(layer instanceof FLayers)) {
170
                    this.datafilter.layer = layer;
171
                    if (BooleanUtils.isTrue((Boolean) this.filter.evaluate(this.datafilter))) {
172
                        if (child == layer) {
173
                            return count;
174
                        }
175
                        count++;
176
                    }
177
                }
178
            } catch (Exception ex) {
179
                // Do nothing, skyp this layer on error.
180
            }
181
        }
182
        return -1;
183

    
184
    }
185

    
186
    @Override
187
    public void valueForPathChanged(TreePath path, Object value) {
188
    }
189

    
190
    @Override
191
    public void addTreeModelListener(TreeModelListener listener) {
192
        listeners.add(listener);
193
    }
194

    
195
    @Override
196
    public void removeTreeModelListener(TreeModelListener listener) {
197
        listeners.remove(listener);
198
    }
199

    
200
    public void reload() {
201
        TreeModelEvent event = new TreeModelEvent(this, new TreePath(this.layers));
202
        Iterator<TreeModelListener> iterator = listeners.iterator();
203
        TreeModelListener listener;
204
        while (iterator.hasNext()) {
205
            listener = iterator.next();
206
            listener.treeStructureChanged(event);
207
        }
208
    }
209

    
210
}