Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / roi / ui / listener / ROIsTablePanelListener.java @ 2125

History | View | Annotate | Download (12.2 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

    
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 actionButtonPressed(ButtonsPanelEvent e) {
90
        }
91

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

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

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

    
258
        public void valueChanged(ListSelectionEvent e) {
259
                try {
260
                        if (panel.getTable().getSelectedRows().length <= 0) {
261
                                panel.setToolsEnabled(false);
262
                                dataModel.setPreviousTool();
263
                        } else {
264
                                panel.setToolsEnabled(true);
265
                                dataModel.selectDrawRoiTool();
266

    
267
                                int selectedRow = panel.getTable().getSelectedRow();
268
                                roiSelectedName = (String)panel.getTable().getTable().getJTable().getValueAt(selectedRow,0);
269
                        }
270
                } catch (NotInitializeException e1) {
271
                        RasterToolsUtil.messageBoxError("error_rois_table", panel, e1);
272
                }
273
        }
274

    
275
        @SuppressWarnings("deprecation")
276
        public void tableChanged(TableModelEvent e) {
277
                //Cambio de color en una ROI:
278
                try {
279
                        if(e.getColumn() == 4) {
280
                                String roiName = (String)panel.getTable().getTable().getJTable().getValueAt(e.getFirstRow(),0);
281
                                if(dataModel.getMapControl() != null) {
282
                                        ROIFeatureManager roiFeatureManager = dataModel.getRoiFeatureManager();
283
                                        Color color = (Color) panel.getTable().getTable().getJTable().getValueAt(e.getFirstRow(), 4);
284
                                        roiFeatureManager.changeColor(dataModel.getGraphicLayer(), roiName, color);
285
                                        dataModel.getROI(roiName).setColor(color);
286
                                        dataModel.getMapControl().drawGraphics();
287
                                        dataModel.getMapControl().getMapContext().invalidate();
288
                                }
289
                        } else if(e.getColumn() == 0) {
290
                                String newName = (String)panel.getTable().getTable().getJTable().getValueAt(e.getFirstRow(),0);
291
                                dataModel.changeRoiName(roiSelectedName, newName);
292
                                roiSelectedName = newName;
293
                        }
294
                } catch (DataException e1) {
295
                        RasterToolsUtil.messageBoxError(
296
                                        "error_getting_roi_features", panel, e1);
297
                }
298
        }
299
}
300

    
301
/**
302
 * Filtro para el selector de expresiones matem?ticas.
303
 * @author Alejandro Mu?oz (alejandro.munoz@uclm.es)
304
 *
305
 */
306
class ShpFileFilter extends FileFilter {
307

    
308
        final static String exp = "shp";
309
        public boolean accept(File f) {
310
                if (f.isDirectory()) {
311
                        return true;
312
                }
313
                String s = f.getName();
314
                int i = s.lastIndexOf('.');
315

    
316
                if (i > 0 &&  i < s.length() - 1) {
317
                        String extension = s.substring(i+1).toLowerCase();
318
                        if (exp.equals(extension)){
319
                                return true;
320
                        } else {
321
                                return false;
322
                        }
323
                }
324
                return false;
325
        }
326

    
327
        public String getDescription() {
328
                return "Shape file .shp";
329
        }
330

    
331
}