Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / branches / org.gvsig.raster.tools_dataaccess_refactoring / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / roi / ROIDataModel.java @ 2340

History | View | Annotate | Download (11.5 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
import java.awt.Image;
25
import java.io.File;
26
import java.util.ArrayList;
27
import java.util.Iterator;
28
import java.util.LinkedHashMap;
29
import java.util.List;
30

    
31
import javax.swing.JComboBox;
32
import javax.swing.table.DefaultTableModel;
33

    
34
import org.gvsig.andami.IconThemeHelper;
35
import org.gvsig.andami.PluginServices;
36
import org.gvsig.andami.ui.mdiManager.IWindow;
37
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
38
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
39
import org.gvsig.fmap.dal.coverage.exception.GridException;
40
import org.gvsig.fmap.dal.coverage.exception.ROIException;
41
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
42
import org.gvsig.fmap.dal.exception.DataException;
43
import org.gvsig.fmap.dal.feature.EditableFeature;
44
import org.gvsig.fmap.dal.feature.FeatureStore;
45
import org.gvsig.fmap.geom.Geometry;
46
import org.gvsig.fmap.mapcontext.MapContextLocator;
47
import org.gvsig.fmap.mapcontext.MapContextManager;
48
import org.gvsig.fmap.mapcontext.layers.FLayer;
49
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
50
import org.gvsig.fmap.mapcontext.layers.vectorial.GraphicLayer;
51
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
52
import org.gvsig.fmap.mapcontrol.MapControl;
53
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
54
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
55
import org.gvsig.fmap.mapcontrol.tools.Behavior.PointBehavior;
56
import org.gvsig.fmap.mapcontrol.tools.Behavior.PolygonBehavior;
57
import org.gvsig.fmap.mapcontrol.tools.Behavior.PolylineBehavior;
58
import org.gvsig.gui.beans.table.TableContainer;
59
import org.gvsig.gui.beans.table.exceptions.NotInitializeException;
60
import org.gvsig.gui.beans.table.models.IModel;
61
import org.gvsig.metadata.exceptions.MetadataException;
62
import org.gvsig.raster.fmap.layers.FLyrRaster;
63
import org.gvsig.raster.roi.ROI;
64
import org.gvsig.raster.roi.VectorialROI;
65
import org.gvsig.raster.swing.RasterSwingLibrary;
66
import org.gvsig.raster.swing.roi.ROIPanel;
67
import org.gvsig.raster.swing.roi.ROIPanelDataModel;
68
import org.gvsig.raster.tools.app.basic.tool.roi.ui.listener.DrawMouseViewListener;
69

    
70
/**
71
 * Data model for ROIs panel
72
 * 
73
 * @author Nacho Brodin nachobrodin@gmail.com
74
 */
75
public class ROIDataModel implements ROIPanelDataModel {
76
        private FLayer                      fLayer             = null;
77
        private MapControl                  mapControl         = null;
78
        private AbstractViewPanel           view               = null;
79
        private GraphicLayer                graphicLayer       = null;
80
        private String                      previousTool       = null;
81
        private MapContextManager           mapContextManager  = MapContextLocator.getMapContextManager();
82
        private ROIFeatureManager           roiFeatureManager  = null;
83
        private Image                       curImage           = null;
84
        private LinkedHashMap<String, ROI>  rois               = null;
85
        private ROIPanel                    panel              = null;
86
        private List<FLyrVect>              fLyrsList          = null;
87
        private File                        roiFile            = null;
88
        
89
        public class LayerElement {
90
                private FLyrVect     lyr  = null;
91
                public LayerElement(FLyrVect lyr) {
92
                        this.lyr = lyr;
93
                }
94
                
95
                public FLyrVect getLayer() {
96
                        return lyr;
97
                }
98
                
99
                public String toString() {
100
                        return lyr.getName();
101
                }
102
        }
103
        
104
        public ROIDataModel(List<FLyrVect> vectLayers) {
105
                this.fLyrsList = vectLayers;
106
        }
107
        
108
        public void setROIPanel(ROIPanel panel) {
109
                this.panel = panel;
110
                JComboBox list = panel.getLayerList(ROIPanel.FLYRS_COMBO);
111
                list.removeAllItems();
112
                for (int i = 0; i < fLyrsList.size(); i++) {
113
                        list.addItem(new LayerElement(fLyrsList.get(i)));
114
                }
115
        }
116
        
117
        public ROIPanel getROIPanel() {
118
                return panel;
119
        }
120
        
121
        public RasterDataStore getRasterDataStore() {
122
                return ((FLyrRaster)fLayer).getDataStore();
123
        }
124
        
125
        /**
126
         * Sets the layer 
127
         * @param layer
128
         * @throws GridException 
129
         */
130
        public void setLayer(FLayer layer) throws GridException {
131
                fLayer = layer;
132
                if (view == null) {
133
                        IWindow[] list = PluginServices.getMDIManager().getAllWindows();
134
                        for (int i = 0; i < list.length; i++) {
135
                                if (list[i] instanceof AbstractViewPanel)
136
                                        view = (AbstractViewPanel) list[i];
137
                        }
138
                        if (view == null)
139
                                return;
140
                        mapControl = view.getMapControl();
141
                        graphicLayer = view.getMapControl().getMapContext().getGraphicsLayer();
142

    
143
                        /*
144
                         * Guardar la herramienta actual para recuperarla m?s tarde, por
145
                         * ejemplo al cerrar el contenedor del este panel.
146
                         */
147
                        previousTool = mapControl.getCurrentTool();
148

    
149
                        // Listener de eventos de movimiento que pone las coordenadas del
150
                        // rat?n en la barra de estado
151
                        StatusBarListener sbl = new StatusBarListener(mapControl);
152

    
153
                        DrawMouseViewListener drawMouseViewListener = new DrawMouseViewListener(this);
154
                        mapControl.addBehavior("drawPolygonROI", new Behavior[] {
155
                                        new PolygonBehavior(drawMouseViewListener),
156
                                        new MouseMovementBehavior(sbl) });
157
                        mapControl.addBehavior("drawLineROI", new Behavior[] {
158
                                        new PolylineBehavior(drawMouseViewListener),
159
                                        new MouseMovementBehavior(sbl) });
160
                        mapControl.addBehavior("drawPointROI", new Behavior[] {
161
                                        new PointBehavior(drawMouseViewListener),
162
                                        new MouseMovementBehavior(sbl) });
163
                }
164

    
165
                try {
166
                        roiFeatureManager = new ROIFeatureManager(fLayer.getMetadataID().toString());
167
                } catch (MetadataException e) {
168
                        throw new GridException("Can't create ROI",e); 
169
                }
170
                clearROIs();
171
                loadROIs();
172
        }
173
        
174
        /**
175
         * Elimina todas las filas de la tabla de rois as? como la ROI y objetos
176
         * FGraphic asociados (borr?ndolos tambi?n de la vista) a cada una.
177
         * 
178
         */
179
        public void clearROIs() {
180
                try {
181
                        panel.getTable().removeAllRows();
182
                } catch (NotInitializeException e) {
183
                        RasterSwingLibrary.messageBoxError("error_tabla_rois", this, e);
184
                }
185

    
186
                boolean repaint = roiFeatureManager.clear(graphicLayer);
187

    
188
                if (repaint)
189
                        getMapControl().rePaintDirtyLayers();
190
                getRois().clear();
191
        }
192
        
193
        private LinkedHashMap<String, ROI> getRois() {
194
                if (rois == null)
195
                        rois = new LinkedHashMap<String, ROI>();
196
                return rois;
197
        }
198
        
199
        /**
200
         * Cargar las ROIs asociadas a la capa, si las hay.
201
         * 
202
         * @throws GridException
203
         * 
204
         */
205
        private void loadROIs() throws GridException {
206
                List<ROI> roisArray = null;
207
                try {
208
                        roisArray = ((FLyrRaster) fLayer).getRois();
209
                } catch (ROIException e) {
210
                        RasterSwingLibrary.messageBoxError("problems_loading_rois", this, e);
211
                }
212
                loadROIs(roisArray);
213
        }
214

    
215
        @SuppressWarnings("deprecation")
216
        private void loadROIs(List<ROI> roisArray) throws GridException {
217
                if (roisArray != null) {
218
                        ISymbol symbol = null;
219
                        int nPoints, nPolygons, nLines;
220

    
221
                        FeatureStore store = graphicLayer.getFeatureStore();
222
                        try {
223
                                store.edit();
224

    
225
                                for (Iterator<ROI> iter = roisArray.iterator(); iter.hasNext();) {
226
                                        ROI roi = (ROI) iter.next();
227

    
228
                                        nPoints = 0;
229
                                        nPolygons = 0;
230
                                        nLines = 0;
231

    
232
                                        Object row[] = ((IModel) panel.getTable().getModel()).getNewLine();
233
                                        row[0] = roi.getName();
234
                                        row[4] = roi.getColor();
235

    
236
                                        addROI(roi);
237
                                        VectorialROI vectorialROI = (VectorialROI) roi;
238
                                        for (Iterator<Geometry> iterator = vectorialROI.getGeometries().iterator(); iterator.hasNext();) {
239
                                                Geometry geometry = (Geometry) iterator.next();
240
                                                symbol = mapContextManager.getSymbolManager().createSymbol(geometry.getType(), roi.getColor());
241
                                                switch (geometry.getType()) {
242
                                                case Geometry.TYPES.POINT:
243
                                                        nPoints++;
244
                                                        break;
245
                                                case Geometry.TYPES.SURFACE:
246
                                                        nPolygons++;
247
                                                        break;
248
                                                case Geometry.TYPES.CURVE:
249
                                                        nLines++;
250
                                                        break;
251
                                                }
252
                                                EditableFeature feature = roiFeatureManager.addROIFeature(vectorialROI, graphicLayer, geometry, symbol);
253

    
254
                                                store.insert(feature);
255
                                        }
256
                                        row[1] = new Integer(nPolygons);
257
                                        row[2] = new Integer(nLines);
258
                                        row[3] = new Integer(nPoints);
259
                                        ((DefaultTableModel)panel.getTable().getModel()).addRow(row);
260
                                }
261
                                store.finishEditing();
262
                        } catch (DataException e) {
263
                                throw new GridException("Error loading ROIs from layer " + fLayer.getName(), e);
264
                        }
265
                        selectDrawRoiTool();
266
                        getMapControl().drawGraphics();
267
                }
268
        }
269
        
270
        public void addROI(ROI roi) {
271
                getRois().put(roi.getName(), roi);
272
        }
273
        
274
        public void selectDrawRoiTool() {
275
                if (mapControl != null)
276
                        if (panel.getButton(ROIPanel.POLYGON_BUTTON).isSelected()) {
277
                                Image img = IconThemeHelper.getImageIcon("polygon-cursor").getImage();
278
                                curImage = img;
279
                                mapControl.setTool("drawPolygonROI");
280
                        } else if (panel.getButton(ROIPanel.LINE_BUTTON).isSelected()) {
281
                                Image img = IconThemeHelper.getImageIcon("line-cursor").getImage();
282
                                curImage = img;
283
                                mapControl.setTool("drawLineROI");
284
                        } else if (panel.getButton(ROIPanel.POINT_BUTTON).isSelected()) {
285
                                Image img = IconThemeHelper.getImageIcon("point-cursor").getImage();
286
                                curImage = img;
287
                                mapControl.setTool("drawPointROI");
288
                        }
289
        }
290

    
291
        public void changeRoiName(String currentName, String newName)
292
        throws DataException {
293
                getROI(currentName).setName(newName);
294
                getRois().put(newName, getRois().remove(currentName));
295
                roiFeatureManager.changeROIName(currentName, newName, graphicLayer);
296
        }
297

    
298
        /**
299
         * Elimina la ROI correspondiente al nombre <code>roiName</code> as? como
300
         * sus objetos FGraphic asociados (borr?ndolos tambi?n de la vista). (NO
301
         * elimina la fila correspondiente en la tabla del panel).
302
         * 
303
         * @param roiName
304
         *            Nombre de la ROI a eliminar.
305
         */
306
        public void removeROI(String roiName) {
307
                getRois().remove(roiName);
308
                boolean repaint = roiFeatureManager.removeROI(roiName, graphicLayer);
309
                if (repaint) {
310
                        getMapControl().rePaintDirtyLayers();
311
                }
312
        }
313
        
314
        /**
315
         * Borra de capa GraphicsLayer de mapContext los gr?ficos pertenecientes a
316
         * las rois del panel. Si la GraphicsLayer se queda sin gr?ficos se eliminan
317
         * tambien los s?mbolos de esta.
318
         */
319
        public void clearRoiGraphics() {
320
                roiFeatureManager.clearFeaturesFromGraphicLayer(graphicLayer);
321
        }
322

    
323
        public MapControl getMapControl() {
324
                return mapControl;
325
        }
326
        
327
        public TableContainer getTable() {
328
                return panel.getTable();
329
        }
330
        
331
        public ROI getROI(String roiName) {
332
                return (ROI) getRois().get(roiName);
333
        }
334
        
335
        public GraphicLayer getGraphicLayer() {
336
                return graphicLayer;
337
        }
338
        
339
        public void setPreviousTool() {
340
                if (previousTool != null)
341
                        getMapControl().setTool(previousTool);
342
        }
343
        
344
        public List<ROI> getROIs() {
345
                return new ArrayList<ROI>(getRois().values());
346
        }
347
        
348
        public void setROIs(List<ROI> roisArray) throws GridException {
349
                loadROIs(roisArray);
350
        }
351
        
352
        public FLayer getFLayer() {
353
                return fLayer;
354
        }
355
        
356
        public ROIFeatureManager getRoiFeatureManager() {
357
                return roiFeatureManager;
358
        }
359
        
360
        public Image getToolImage() {
361
                return curImage;
362
        }
363
        
364
        public void setROIFile(File file) {
365
                this.roiFile = file;
366
        }
367
        
368
        public File getROIFile() {
369
                return this.roiFile;
370
        }
371
}