Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / roi / ROIFeatureManager.java @ 1275

History | View | Annotate | Download (7.54 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.tools.app.basic.tool.roi;
23

    
24

    
25
import java.awt.Color;
26
import java.util.ArrayList;
27
import java.util.Collections;
28
import java.util.HashMap;
29
import java.util.Iterator;
30
import java.util.List;
31
import java.util.Map;
32

    
33
import org.gvsig.fmap.dal.coverage.grid.ROI;
34
import org.gvsig.fmap.dal.exception.DataException;
35
import org.gvsig.fmap.dal.feature.EditableFeature;
36
import org.gvsig.fmap.dal.feature.Feature;
37
import org.gvsig.fmap.dal.feature.FeatureReference;
38
import org.gvsig.fmap.dal.feature.FeatureSet;
39
import org.gvsig.fmap.dal.feature.FeatureStore;
40
import org.gvsig.fmap.geom.Geometry;
41
import org.gvsig.fmap.mapcontext.layers.vectorial.GraphicLayer;
42
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
43
import org.gvsig.tools.dispose.DisposableIterator;
44
import org.slf4j.Logger;
45
import org.slf4j.LoggerFactory;
46

    
47
/**
48
 * Manages a table of ROI with its related list of Features.
49
 * 
50
 * @author <a href="mailto:cordinyana@gvsig.org">C?sar Ordi?ana</a>
51
 */
52
public class ROIFeatureManager {
53
        protected static final Logger logger = LoggerFactory.getLogger(ROIFeatureManager.class);
54
        private Map<String, List<FeatureReference>> roiNameToFeatureList = Collections
55
                        .synchronizedMap(new HashMap<String, List<FeatureReference>>());
56

    
57
        private final Object lock = new Object();
58

    
59
        private final String layerId;
60

    
61
        public ROIFeatureManager(String layerId) {
62
                this.layerId = layerId;
63
        }
64

    
65
        /**
66
         * Returns a read-only {@link Map} of ROI names to {@link FeatureReference}
67
         * {@link List} objects.
68
         * 
69
         * @return the roiNameToFeatureList the table of {@link FeatureReference}
70
         *         objects per {@link ROI}.
71
         */
72
        public Map<String, List<FeatureReference>> getRoiNameToFeatureList() {
73
                return Collections.unmodifiableMap(roiNameToFeatureList);
74
        }
75

    
76
        public EditableFeature addROIFeature(ROI roi, GraphicLayer graphicLayer,
77
                        Geometry geometry, ISymbol symbol) throws DataException {
78
                int symbolPos = graphicLayer.addSymbol(symbol);
79
                EditableFeature feature = createEditableFeature(graphicLayer
80
                                .getFeatureStore(), roi, geometry, symbolPos);
81

    
82
                addROIFeature(roi, feature.getReference());
83

    
84
                return feature;
85
        }
86

    
87
        public void addROIFeature(ROI roi, FeatureReference feature) {
88
                List<FeatureReference> featureList = roiNameToFeatureList.get(roi.getName());
89

    
90
                synchronized (lock) {
91
                        if (featureList == null) {
92
                                featureList = new ArrayList<FeatureReference>();
93
                                roiNameToFeatureList.put(roi.getName(), featureList);
94
                        }
95
                }
96

    
97
                featureList.add(feature);
98
        }
99

    
100
        public boolean clear(GraphicLayer layer) {
101
                return clear(layer, false);
102
        }
103

    
104
        public void clearFeaturesFromGraphicLayer(GraphicLayer layer) {
105
                clear(layer, true);
106
        }
107

    
108
        private boolean clear(GraphicLayer layer, boolean onlyRemoveFromLayer) {
109
                boolean anythingCleared = false;
110

    
111
                for (Iterator<String> iterator = roiNameToFeatureList.keySet()
112
                                .iterator(); iterator.hasNext();) {
113
                        String roiName = iterator.next();
114
                        anythingCleared = anythingCleared
115
                                        || removeROI(roiName, layer, onlyRemoveFromLayer);
116
                }
117

    
118
                return anythingCleared;
119
        }
120

    
121
        public boolean removeROI(String roiName, GraphicLayer layer) {
122
                return removeROI(roiName, layer, false);
123
        }
124

    
125
        private synchronized boolean removeROI(String roiName, GraphicLayer layer,
126
                        boolean onlyRemoveFromLayer) {
127
                //String roiId = getROIId(roiName);
128
                //layer.removeGraphics(roiId);
129
                removeGraphics(layer, getROIPrefix());
130
                return onlyRemoveFromLayer ? true : roiNameToFeatureList.remove(roiName) != null;
131
        }
132
        
133
        public void changeColor(GraphicLayer lyr, String roiName, Color color) {
134
                DisposableIterator iterator = null;
135
                FeatureSet featureSet = null;
136
                FeatureStore store = lyr.getFeatureStore();
137
                try{
138
                        store.beginComplexNotification();
139
                        if (!store.isEditing()){
140
                                store.edit();
141
                        }
142
                        featureSet = store.getFeatureSet();
143
                        for (iterator = featureSet.fastIterator(); iterator.hasNext();) {
144
                                Feature feature = (Feature) iterator.next();
145
                                Object obj = feature.get(GraphicLayer.FEATURE_ATTR_GROUPID);
146
                                if (obj instanceof String && ((String)obj).equals(getROIId(roiName))) {
147
                                        int symbolPos = feature.getInt(GraphicLayer.FEATURE_ATTR_IDSYMBOL);
148
                                        ISymbol symbol = lyr.getSymbol(symbolPos);
149
                                        symbol.setColor(color);
150
                                }
151
                        }
152
                        store.finishEditing();
153
                        store.endComplexNotification();
154
                } catch (DataException e) {
155
                        logger.error("Error clearing all the geometry of the graphic layer", e);
156
                } finally {
157
                        if (featureSet != null) {
158
                                featureSet.dispose();
159
                        }
160
                        if (iterator != null) {
161
                                iterator.dispose();
162
                        }
163
                }
164
        }
165
        
166
        public void removeGraphics(GraphicLayer lyr, String prefix) {
167
                DisposableIterator iterator = null;
168
                FeatureSet featureSet = null;
169
                FeatureStore store = lyr.getFeatureStore();
170
                try{
171
                        store.beginComplexNotification();
172
                        if (!store.isEditing()){
173
                                store.edit();
174
                        }
175
                        featureSet = store.getFeatureSet();
176
                        for (iterator = featureSet.fastIterator(); iterator.hasNext();) {
177
                                Feature feature = (Feature) iterator.next();
178
                                Object obj = feature.get(GraphicLayer.FEATURE_ATTR_GROUPID);
179
                                if (obj instanceof String && ((String)obj).startsWith(prefix)) {
180
                                        featureSet.delete(feature);
181
                                }
182
                        }
183
                        store.finishEditing();
184
                        store.endComplexNotification();
185
                } catch (DataException e) {
186
                        logger.error("Error clearing all the geometry of the graphic layer", e);
187
                } finally {
188
                        if (featureSet != null) {
189
                                featureSet.dispose();
190
                        }
191
                        if (iterator != null) {
192
                                iterator.dispose();
193
                        }
194
                }
195
        }
196

    
197
        public String getROIId(String roiName) {
198
                return getROIPrefix().concat(roiName);
199
        }
200
        
201
        private String getROIPrefix() {
202
                return layerId.concat("-");
203
        }
204

    
205
        public void changeROIName(String oldName, String newName, GraphicLayer layer)
206
                        throws DataException {
207
                List<FeatureReference> featureList = roiNameToFeatureList
208
                                .remove(oldName);
209
                if (featureList != null) {
210
                        roiNameToFeatureList.put(newName, featureList);
211
                        String newroiid = getROIId(newName);
212
                        FeatureStore store = layer.getFeatureStore();
213
                        store.edit();
214
                        for (int i = 0; i < featureList.size(); i++) {
215
                                FeatureReference ref = featureList.get(i);
216
                                EditableFeature editable = ref.getFeature().getEditable();
217
                                editable.set(GraphicLayer.FEATURE_ATTR_GROUPID, newroiid);
218
                                store.update(editable);
219
                        }
220
                        store.finishEditing();
221
                }
222
        }
223

    
224
        public List<FeatureReference> getROIFeatures(String roiName) {
225
                return Collections.unmodifiableList(roiNameToFeatureList.get(roiName));
226
        }
227

    
228
        private EditableFeature createEditableFeature(FeatureStore store, ROI roi,
229
                        Geometry geometry, int symbolPos) throws DataException {
230

    
231
                EditableFeature feature = store.createNewFeature();
232
                feature.set(GraphicLayer.FEATURE_ATTR_GROUPID, getROIId(roi.getName()));
233
                feature.setGeometry(GraphicLayer.FEATURE_ATTR_GEOMETRY, geometry);
234
                feature.setInt(GraphicLayer.FEATURE_ATTR_IDSYMBOL, symbolPos);
235

    
236
                return feature;
237
        }
238
}