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 / ui / listener / ROIsTablePanelListener.java @ 2340

History | View | Annotate | Download (12.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.ui.listener;
23

    
24
import java.awt.Color;
25
import java.awt.event.ActionEvent;
26
import java.awt.event.ActionListener;
27
import java.io.File;
28
import java.util.List;
29

    
30
import javax.swing.JFileChooser;
31
import javax.swing.event.ListSelectionEvent;
32
import javax.swing.event.ListSelectionListener;
33
import javax.swing.event.TableModelEvent;
34
import javax.swing.event.TableModelListener;
35
import javax.swing.filechooser.FileFilter;
36
import javax.swing.table.DefaultTableModel;
37

    
38
import org.cresques.cts.IProjection;
39
import org.gvsig.app.ApplicationLocator;
40
import org.gvsig.app.project.documents.Document;
41
import org.gvsig.app.project.documents.view.BaseViewDocument;
42
import org.gvsig.fmap.dal.DataStoreParameters;
43
import org.gvsig.fmap.dal.coverage.RasterLocator;
44
import org.gvsig.fmap.dal.coverage.exception.FileNotExistsException;
45
import org.gvsig.fmap.dal.coverage.exception.GridException;
46
import org.gvsig.fmap.dal.coverage.exception.ROIException;
47
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
48
import org.gvsig.fmap.dal.exception.DataException;
49
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
50
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
51
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
52
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
53
import org.gvsig.gui.beans.table.exceptions.NotInitializeException;
54
import org.gvsig.gui.beans.table.models.IModel;
55
import org.gvsig.raster.fmap.layers.FLyrRaster;
56
import org.gvsig.raster.roi.ROI;
57
import org.gvsig.raster.roi.ROIReader;
58
import org.gvsig.raster.roi.ROIWriter;
59
import org.gvsig.raster.swing.RasterSwingLibrary;
60
import org.gvsig.raster.swing.roi.ROIPanel;
61
import org.gvsig.raster.tools.app.basic.tool.roi.ROIDataModel;
62
import org.gvsig.raster.tools.app.basic.tool.roi.ROIDataModel.LayerElement;
63
import org.gvsig.raster.tools.app.basic.tool.roi.ROIFeatureManager;
64
import org.gvsig.raster.tools.app.basic.tool.roi.ui.ROIWindow;
65

    
66
/**
67
 * Listener para el panel ROIsTablePanel
68
 *
69
 * @author Diego Guerrero Sevilla (diego.guerrero@uclm.es)
70
 *
71
 */
72
public class ROIsTablePanelListener implements ButtonsPanelListener, ActionListener, ListSelectionListener, TableModelListener {
73
        private ROIPanel       panel              = null;
74
        private ROIDataModel   dataModel          = null;
75
        private String                    roiSelectedName    = "";
76
        private ROIWindow      window             = null;
77
        private File           lastDirectory      = null;
78
        private String         defaultROIFileName = null;
79

    
80
        public ROIsTablePanelListener(
81
                        ROIPanel panel, 
82
                        ROIDataModel dataModel,
83
                        ROIWindow window) {
84
                this.panel = panel;
85
                this.dataModel = dataModel;
86
                this.window = window;
87
        }
88
        
89
        public void setDefaultROIFileName(String defaultROIFileName) {
90
                this.defaultROIFileName = defaultROIFileName;
91
        }
92
        
93
        public void setPathToROI(File ROI) {
94
                this.lastDirectory = ROI;
95
        }
96
        
97
        public void actionButtonPressed(ButtonsPanelEvent e) {
98
        }
99

    
100
        public void actionPerformed(ActionEvent e) {
101
                if (e.getSource() == panel.getButton(ROIPanel.NEW_BUTTON)) {
102
                        String roiName;
103
                        try {
104
                                roiName = "ROI-" + String.valueOf(System.currentTimeMillis());
105
                                Object row [] = ((IModel)panel.getTable().getModel()).getNewLine();
106
                                row[0]= roiName;
107
                                ((DefaultTableModel)panel.getTable().getModel()).addRow(row);
108
                                
109
                                ROI roi = RasterLocator.getManager().createVectorialROI(dataModel.getRasterDataStore());
110
                                roi.setName(roiName);
111
                                roi.setColor((Color)row[4]);
112
                                dataModel.addROI(roi);
113
                                
114
                                panel.getTable().setSelectedIndex(panel.getTable().getRowCount()-1);
115
                                dataModel.selectDrawRoiTool();
116
                                panel.setToolsEnabled(true);
117
                        } catch (NotInitializeException e1) {
118
                                RasterSwingLibrary.messageBoxError("error_tabla_rois", panel, e1);
119
                                window.close();
120
                        }
121
                } else if (e.getSource() == panel.getButton(ROIPanel.DELETE_BUTTON)) {
122
                        try {
123
                                if (panel.getTable().getSelectedRows().length > 0) {
124
                                        String className = (String)panel.getTable().getModel().getValueAt(panel.getTable().getSelectedRow(),0);
125
                                        dataModel.removeROI(className);
126
                                        int selectedRow = panel.getTable().getSelectedRow();
127
                                        ((DefaultTableModel)panel.getTable().getModel()).removeRow(selectedRow);
128
                                        selectedRow = selectedRow >= panel.getTable().getRowCount() ? panel.getTable().getRowCount() - 1 : selectedRow; 
129
                                        panel.getTable().setSelectedIndex(selectedRow);
130
                                }
131
                        } catch (NotInitializeException e1) {
132
                                RasterSwingLibrary.messageBoxError("error_tabla_rois", panel, e1);
133
                                window.close();
134
                        }
135
                } else if (e.getSource() == panel.getButton(ROIPanel.POINT_BUTTON)) {
136
                        panel.getButton(ROIPanel.POINT_BUTTON).setSelected(true);
137
                        panel.getButton(ROIPanel.LINE_BUTTON).setSelected(false);
138
                        panel.getButton(ROIPanel.POLYGON_BUTTON).setSelected(false);
139
                        dataModel.selectDrawRoiTool();
140
                } else if (e.getSource() == panel.getButton(ROIPanel.LINE_BUTTON)) {
141
                        panel.getButton(ROIPanel.LINE_BUTTON).setSelected(true);
142
                        panel.getButton(ROIPanel.POINT_BUTTON).setSelected(false);
143
                        panel.getButton(ROIPanel.POLYGON_BUTTON).setSelected(false);
144
                        dataModel.selectDrawRoiTool();
145
                } else if (e.getSource() == panel.getButton(ROIPanel.POLYGON_BUTTON)) {
146
                        panel.getButton(ROIPanel.POLYGON_BUTTON).setSelected(true);
147
                        panel.getButton(ROIPanel.LINE_BUTTON).setSelected(false);
148
                        panel.getButton(ROIPanel.POINT_BUTTON).setSelected(false);
149
                        dataModel.selectDrawRoiTool();
150
                } else if (e.getSource() == panel.getButton(ROIPanel.EXPORT_BUTTON)) {
151
                        showChooserDialog(ROIPanel.EXPORT_BUTTON);
152
                } else if (e.getSource() == panel.getButton(ROIPanel.IMPORT_BUTTON)) {
153
                        showChooserDialog(ROIPanel.IMPORT_BUTTON);
154
                } else if (e.getSource() == panel.getButton(ROIPanel.REMOVE_ROI_FILE_BUTTON)) {
155
                        if(RasterSwingLibrary.messageBoxYesOrNot("remove_roi_file_link", null)) {
156
                                dataModel.clearROIs();
157
                                removeLinkBetweenFileROIAndLayer();
158
                        }
159
                } else if (e.getSource() == panel.getButton(ROIPanel.ADDFLYR_BUTTON)) {
160
                        Object obj = panel.getLayerList(ROIPanel.FLYRS_COMBO).getSelectedItem();
161
                        if(obj instanceof LayerElement) {
162
                                FLyrVect lyrVect = ((LayerElement)obj).getLayer();
163
                                ROIReader reader = null;
164
                                try {
165
                                        reader = RasterLocator.getManager().createVectorialROIReader(
166
                                                        lyrVect.getFeatureStore(), 
167
                                                        dataModel.getRasterDataStore(), 
168
                                                        getProjectionFromLayer());
169

    
170
                                        List<ROI> rois = reader.read(dataModel.getROIs());
171
                                        dataModel.clearROIs();
172
                                        dataModel.setROIs(rois);
173
                                        
174
                                        DataStoreParameters params = lyrVect.getDataStore().getParameters();
175
                                        if(params instanceof FilesystemStoreParameters)
176
                                                dataModel.setROIFile(((FilesystemStoreParameters)params).getFile());
177
                                } catch (ROIException e1) {
178
                                        RasterSwingLibrary.messageBoxError("error_file_not_valid", panel, e1);
179
                                } catch (GridException e1) {
180
                                        RasterSwingLibrary.messageBoxError("error_file_not_valid", panel, e1);
181
                                }
182
                        }
183
                }
184
        }
185
        
186
        private void removeLinkBetweenFileROIAndLayer() {
187
                try {
188
                        ((FLyrRaster)dataModel.getFLayer()).setROIsFiles(null);
189
                } catch (RmfSerializerException e) {
190
                        RasterSwingLibrary.messageBoxError("error_saving_rois_rmf", panel, e);
191
                }
192
        }
193

    
194
        private void showChooserDialog(int action) {
195
                JFileChooser fileChooser = new JFileChooser();
196
                fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter());
197
                fileChooser.addChoosableFileFilter(new ShpFileFilter());
198
                fileChooser.setSelectedFile(new File(defaultROIFileName));
199
                File oldROIFile = dataModel.getROIFile();
200
                if(oldROIFile != null) {
201
                        fileChooser.setCurrentDirectory(oldROIFile);
202
                        fileChooser.setSelectedFile(oldROIFile);
203
                } else
204
                        fileChooser.setCurrentDirectory(lastDirectory);
205
                if(action == ROIPanel.IMPORT_BUTTON) {
206
                        if (fileChooser.showOpenDialog(panel.getComponent()) == JFileChooser.APPROVE_OPTION) {
207
                                File file = fileChooser.getSelectedFile();
208
                                loadROIFromFile(file);
209
                        }
210
                }
211
                if(action == ROIPanel.EXPORT_BUTTON) {
212
                        if (fileChooser.showSaveDialog(panel.getComponent()) == JFileChooser.APPROVE_OPTION) {
213
                                File file = fileChooser.getSelectedFile();
214
                                saveROIToFile(file);
215
                        }
216
                }
217
        }
218
        
219
        private void saveROIToFile(File file) {
220
                lastDirectory = new File(file.getParent());
221
                if(file.exists()) {
222
                        if(!RasterSwingLibrary.messageBoxYesOrNot("raster_error_file_exists", null))
223
                                return;
224
                }
225
                ROIWriter writer = RasterLocator.getManager().createROIWriter(
226
                                file.getPath(), 
227
                                getProjectionFromLayer());
228
                writer.write(dataModel.getROIs());
229
                dataModel.setROIFile(file);
230
        }
231
        
232
        private void loadROIFromFile(File file) {
233
                lastDirectory = new File(file.getParent());
234
                try {
235
                        ROIReader reader = RasterLocator.getManager().createROIReader( 
236
                                        file.getPath(), 
237
                                        dataModel.getRasterDataStore(), 
238
                                        getProjectionFromLayer());
239
                        dataModel.clearROIs();
240
                        List<ROI> rois = reader.read(dataModel.getROIs());
241
                        dataModel.setROIFile(file);
242
                        dataModel.setROIs(rois);
243
                } catch (FileNotExistsException e1) {
244
                        RasterSwingLibrary.messageBoxError("error_file_not_found", panel, e1);
245
                } catch (ROIException e1) {
246
                        RasterSwingLibrary.messageBoxError("problems_loading_rois", panel, e1);
247
                } catch (GridException e1) {
248
                        RasterSwingLibrary.messageBoxError("problems_loading_rois", panel, e1);
249
                } 
250
        }
251
        
252
        /**
253
         * Gets the projection from the layer or from the view if the 
254
         * layer does not have
255
         * @return
256
         */
257
        private IProjection getProjectionFromLayer() {
258
                IProjection proj = dataModel.getFLayer().getProjection();
259
                if(proj == null) {
260
                        Document doc = ApplicationLocator.getManager().getActiveDocument();
261
                        if(doc instanceof BaseViewDocument)
262
                                proj = ((BaseViewDocument)doc).getProjection();
263
                }
264
                return proj;
265
        }
266

    
267
        public void valueChanged(ListSelectionEvent e) {
268
                try {
269
                        if (panel.getTable().getSelectedRows().length <= 0) {
270
                                panel.setToolsEnabled(false);
271
                                dataModel.setPreviousTool();
272
                        } else {
273
                                panel.setToolsEnabled(true);
274
                                dataModel.selectDrawRoiTool();
275

    
276
                                int selectedRow = panel.getTable().getSelectedRow();
277
                                roiSelectedName = (String)panel.getTable().getTable().getJTable().getValueAt(selectedRow,0);
278
                        }
279
                } catch (NotInitializeException e1) {
280
                        RasterSwingLibrary.messageBoxError("error_rois_table", panel, e1);
281
                }
282
        }
283

    
284
        @SuppressWarnings("deprecation")
285
        public void tableChanged(TableModelEvent e) {
286
                //Cambio de color en una ROI:
287
                try {
288
                        if(e.getColumn() == 4) {
289
                                String roiName = (String)panel.getTable().getTable().getJTable().getValueAt(e.getFirstRow(),0);
290
                                if(dataModel.getMapControl() != null) {
291
                                        ROIFeatureManager roiFeatureManager = dataModel.getRoiFeatureManager();
292
                                        Color color = (Color) panel.getTable().getTable().getJTable().getValueAt(e.getFirstRow(), 4);
293
                                        roiFeatureManager.changeColor(dataModel.getGraphicLayer(), roiName, color);
294
                                        dataModel.getROI(roiName).setColor(color);
295
                                        dataModel.getMapControl().drawGraphics();
296
                                        dataModel.getMapControl().getMapContext().invalidate();
297
                                }
298
                        } else if(e.getColumn() == 0) {
299
                                String newName = (String)panel.getTable().getTable().getJTable().getValueAt(e.getFirstRow(),0);
300
                                dataModel.changeRoiName(roiSelectedName, newName);
301
                                roiSelectedName = newName;
302
                        }
303
                } catch (DataException e1) {
304
                        RasterSwingLibrary.messageBoxError(
305
                                        "error_getting_roi_features", panel, e1);
306
                }
307
        }
308
}
309

    
310
/**
311
 * Filtro para el selector de expresiones matem?ticas.
312
 * @author Alejandro Mu?oz (alejandro.munoz@uclm.es)
313
 *
314
 */
315
class ShpFileFilter extends FileFilter {
316

    
317
        final static String exp = "shp";
318
        public boolean accept(File f) {
319
                if (f.isDirectory()) {
320
                        return true;
321
                }
322
                String s = f.getName();
323
                int i = s.lastIndexOf('.');
324

    
325
                if (i > 0 &&  i < s.length() - 1) {
326
                        String extension = s.substring(i+1).toLowerCase();
327
                        if (exp.equals(extension)){
328
                                return true;
329
                        } else {
330
                                return false;
331
                        }
332
                }
333
                return false;
334
        }
335

    
336
        public String getDescription() {
337
                return "Shape file .shp";
338
        }
339

    
340
}