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 @ 2314

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.RasterToolsUtil;
62
import org.gvsig.raster.tools.app.basic.tool.roi.ROIDataModel;
63
import org.gvsig.raster.tools.app.basic.tool.roi.ROIDataModel.LayerElement;
64
import org.gvsig.raster.tools.app.basic.tool.roi.ROIFeatureManager;
65
import org.gvsig.raster.tools.app.basic.tool.roi.ui.ROIWindow;
66

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

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

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

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

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

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

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

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

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

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

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

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

    
341
}