Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extRasterTools-SE / src / org / gvsig / rastertools / vectorizacion / clip / ClipListener.java @ 31496

History | View | Annotate | Download (11.7 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.rastertools.vectorizacion.clip;
20

    
21
import java.awt.Component;
22
import java.awt.event.ActionEvent;
23
import java.awt.event.ActionListener;
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.NoninvertibleTransformException;
26
import java.awt.geom.Point2D;
27
import java.util.ArrayList;
28

    
29
import javax.swing.JOptionPane;
30
import javax.swing.event.TableModelEvent;
31
import javax.swing.event.TableModelListener;
32

    
33
import org.gvsig.andami.PluginServices;
34
import org.gvsig.andami.ui.mdiManager.IWindow;
35
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
36
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
37
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
38
import org.gvsig.fmap.mapcontrol.MapControl;
39
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
40
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
41
import org.gvsig.fmap.mapcontrol.tools.Behavior.RectangleBehavior;
42
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
43
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
44
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
45
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
46
import org.gvsig.gui.beans.table.TableContainer;
47
import org.gvsig.gui.beans.table.exceptions.NotInitializeException;
48
import org.gvsig.raster.IProcessActions;
49
import org.gvsig.raster.datastruct.Extent;
50
import org.gvsig.raster.grid.GridException;
51
import org.gvsig.raster.grid.filter.FilterTypeException;
52
import org.gvsig.raster.grid.roi.ROI;
53
import org.gvsig.raster.util.RasterToolsUtil;
54
import org.gvsig.rastertools.roi.ui.ROIManagerDialog;
55
import org.gvsig.rastertools.vectorizacion.clip.ui.ClipPanel;
56

    
57

    
58
/**
59
 * Clase para la gesti?n de eventos de los componentes gr?ficos del panel de preproceso
60
 * de vectorizaci?n.
61
 * 
62
 * 12/06/2008
63
 * @author Nacho Brodin nachobrodin@gmail.com
64
 */
65
public class ClipListener implements ActionListener, TableModelListener, ButtonsPanelListener, IProcessActions {
66
        private FLyrRasterSE                     lyr                      = null;
67
        private ClipData                         data                     = null;
68
        private ClipPanel                        panel                    = null;        
69
        private ClipProcess                      process                  = null;
70

    
71
        
72
        /**
73
         * Constructor. Asigna los listeners a los componentes
74
         * @param prepPanel
75
         */
76
        public ClipListener(FLyrRasterSE lyr, ClipPanel prepPanel, ClipData data) {
77
                this.lyr = lyr;
78
                setDataView(prepPanel);
79
                setData(data);
80
        }
81
        
82
        /**
83
         * Acciones de inicializaci?n del componente
84
         */
85
        private void initActions() {
86
                assignFullExtent();
87
                loadROIs();
88
        }
89
        
90
        /**
91
         * Asigna la vista de datos. En este caso es el panel de preprocesado de la vectorizaci?n
92
         * @param prepPanel
93
         */
94
        private void setDataView(ClipPanel prepPanel) {
95
                this.panel = prepPanel;
96
                process = new ClipProcess(this);
97
                process.setSourceLayer(lyr);
98
                
99
                panel.getSelectionAreaPanel().getROI().addActionListener(this);
100
                panel.getSelectionAreaPanel().getButtonBarContainer().getButton(0).addActionListener(this);
101
                panel.getSelectionAreaPanel().getButtonBarContainer().getButton(1).addActionListener(this);
102
                panel.getSelectionAreaPanel().getROISelector().addActionListener(this);
103
                panel.getSelectionAreaPanel().getAreaSelector().addActionListener(this);
104
                panel.getSelectionAreaPanel().getVectorizeAllBBox().addActionListener(this);
105
                panel.getSelectionAreaPanel().getVectorizeOnlyInside().addActionListener(this);
106
                panel.getSelectionAreaPanel().getTableContainer().getModel().addTableModelListener(this);
107
                panel.getComboOutputScale().addActionListener(this);                
108
        }
109
        
110
        /**
111
         * Asigna el modelo de datos de los interfaces
112
         * @param coorData
113
         * @param grayConvData
114
         */
115
        public void setData(ClipData coorData) {
116
                this.data = coorData;
117
                initActions();
118
        }
119
                
120
        /*
121
         * (non-Javadoc)
122
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
123
         */
124
        public void actionPerformed(ActionEvent e) {
125
                if(!panel.isEnableValueChangedEvent())
126
                        return;
127
                //Seleccionar extent completo
128
                if(e.getSource() == panel.getSelectionAreaPanel().getButtonBarContainer().getButton(0)) {
129
                        assignFullExtent();
130
                }
131
                
132
                //Seleccionar ?rea desde la vista
133
                if(e.getSource() == panel.getSelectionAreaPanel().getButtonBarContainer().getButton(1)) {
134
                        selectToolButton();
135
                }
136
                
137
                //Cuadro de seleccionar ROIS
138
                if(e.getSource() == panel.getSelectionAreaPanel().getROI()) {
139
                        ROIManagerDialog roiManagerDialog = new ROIManagerDialog(500,250);
140

    
141
                        try {
142
                                roiManagerDialog.setLayer(lyr);
143
                                roiManagerDialog.getROIsManagerPanel().addButtonPressedListener(this);
144
                        } catch (GridException ex) {
145
                        }
146
                        RasterToolsUtil.addWindow(roiManagerDialog);
147
                }
148
                
149
                if (e.getSource().equals(panel.getSelectionAreaPanel().getROISelector()) ||
150
                                e.getSource().equals(panel.getSelectionAreaPanel().getAreaSelector()) ||
151
                                e.getSource().equals(panel.getSelectionAreaPanel().getVectorizeAllBBox()) ||
152
                                e.getSource().equals(panel.getSelectionAreaPanel().getVectorizeOnlyInside())){
153
                        addROIs();
154
                }
155
                
156
                //Cambio de escala
157
                if(e.getSource() == panel.getComboOutputScale()) {
158
                        data.setScaleSelected(panel.getComboOutputScale().getSelectedIndex());
159
                }
160
                
161
        }
162
        
163
        /**
164
         * Asigna la capa fuente para el proceso
165
         * @param lyr
166
         */
167
        public void setProcessSource(FLyrRasterSE lyr) {
168
                if(process != null)
169
                        process.setSourceLayer(lyr);
170
        }
171
        
172
        /**
173
         * Asigna el interfaz para que el proceso ejectute las acciones de finalizaci?n
174
         * al acabar.
175
         * @param endActions
176
         */
177
        public void setProcessActions(IProcessActions endActions) {
178
                if(process != null)
179
                        process.setProcessActions(endActions);
180
        }
181
        
182
        /**
183
         * Acciones realizadas cuando se acepta la operaci?n
184
         */
185
        public void apply() {
186
                try {
187
                        process.clip(data);
188
                } catch (FilterTypeException e) {
189
                        RasterToolsUtil.messageBoxError("error_cutting", null, e);
190
                }
191
        }
192
                        
193
        /**
194
         * Gesti?n de los eventos de los botones de la ventana de selecci?n de ROIs
195
         */
196
        public void actionButtonPressed(ButtonsPanelEvent e) {
197
                //Al pulsar Aceptar o Aplicar se ejecuta el aceptar del panel
198
                if (e.getButton() == ButtonsPanel.BUTTON_APPLY || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
199
                        loadROIs();
200
                }
201
        }
202

    
203
        /**
204
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
205
         * reales y p?xel. 
206
         */
207
        private void assignFullExtent() {
208
                Point2D ulPx = new Point2D.Double(0, 0);
209
                Point2D lrPx = new Point2D.Double(lyr.getPxWidth(), lyr.getPxHeight());
210

    
211
                //Convertimos a coordenadas reales
212
                Point2D ulWc = new Point2D.Double();
213
                Point2D lrWc = new Point2D.Double();
214
                lyr.getAffineTransform().transform(ulPx, ulWc);
215
                lyr.getAffineTransform().transform(lrPx, lrWc);
216

    
217
                data.setCoorRealFromDouble(ulWc.getX(), ulWc.getY(), lrWc.getX(), lrWc.getY());
218
                data.setCoorPixelFromDouble(ulPx.getX(), ulPx.getY(), lrPx.getX() - 1, lrPx.getY() - 1);
219
        }
220
        
221
        /**
222
         * Acciones que se realizan para seleccionar la tool CutRaster
223
         */
224
        public void selectToolButton() {
225
                // seleccionamos la vista de gvSIG
226
                IWindow[] list = PluginServices.getMDIManager().getAllWindows();
227
                AbstractViewPanel view = null;
228
                for (int i = 0; i < list.length; i++) {
229
                        if(list[i] instanceof DefaultViewPanel)
230
                                view = (AbstractViewPanel)list[i];
231
                }
232
                if (view == null)
233
                        return;
234
        
235
                MapControl m_MapControl = view.getMapControl();
236

    
237
                // Listener de eventos de movimiento que pone las coordenadas del rat?n en
238
                // la barra de estado
239
                StatusBarListener sbl = new StatusBarListener(m_MapControl);
240

    
241
                // Cortar Raster
242
                ClipMouseViewListener clippingMouseViewListener = new ClipMouseViewListener(m_MapControl, data, lyr);
243
                m_MapControl.addBehavior("cutRaster", new Behavior[] {
244
                                new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl)
245
                                }
246
                );
247

    
248
                m_MapControl.setTool("cutRaster");
249
        }
250
        
251
        /**
252
         * Carga las ROIS de la capa sobre la tabla
253
         * @param layer
254
         */
255
        public void loadROIs() {
256
                if (lyr == null)
257
                        return;
258
                TableContainer table = panel.getSelectionAreaPanel().getTableContainer();
259
                try {
260
                        table.removeAllRows();
261
                } catch (NotInitializeException e1) {
262
                        return;
263
                }
264
                ArrayList roisArray = lyr.getRois();
265
                if (roisArray != null) {
266
                        for (int i = 0; i < roisArray.size(); i++) {
267
                                ROI roi = (ROI) roisArray.get(i);
268
        
269
                                Object row[] = {"", "", ""};
270
                                
271
                                boolean active = false;
272
                                                                
273
                                row[0] = new Boolean(active);
274
                                row[1] = roi.getName(); 
275
                                row[2] = new Integer(i);
276
                                try {
277
                                        table.addRow(row);
278
                                } catch (NotInitializeException e) {
279
                                }
280
                        }
281
                }
282
        }
283
        
284
        /**
285
         * Obtiene la lista de ROIs seleccionadas
286
         * @return ArrayList con la lista de ROIs
287
         */
288
        private ArrayList getSelectedROIs() {
289
                if (lyr == null)
290
                        return null;
291

    
292
                ArrayList roisArray = lyr.getRois();
293
                ArrayList selected = new ArrayList();
294
                TableContainer table = panel.getSelectionAreaPanel().getTableContainer();
295
                if (roisArray != null) {
296
                        for (int i = 0; i < roisArray.size(); i++) {
297
                                try {
298
                                        if (((Boolean) table.getModel().getValueAt(i, 0)).booleanValue()) {
299
                                                selected.add(roisArray.get(i));
300
                                        }
301
                                } catch (ArrayIndexOutOfBoundsException e) {
302
                                        //Entra aqu? si se han a?adido ROIs con el cuadro abierto. Pasamos de hacer nada
303
                                }
304
                        }
305
                }
306
                return selected;
307
        } 
308
        
309
        /**
310
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
311
         * reales y p?xel. 
312
         */
313
        private void assignROISExtent() {
314
                ArrayList roiList = getSelectedROIs();
315
                Extent ext = null;
316
                if(roiList != null && roiList.size() > 0) {
317
                        ext = ROI.getROIsMaximunExtent(roiList);
318
                } else
319
                        assignFullExtent();
320
                
321
                if(ext == null)
322
                        return;
323
                
324
                AffineTransform at = lyr.getAffineTransform();
325
                Point2D ulWc = new Point2D.Double(ext.minX(), ext.maxY());
326
                Point2D lrWc = new Point2D.Double(ext.maxX(), ext.minY());
327
                
328
                ulWc = lyr.adjustWorldRequest(ulWc);
329
                lrWc = lyr.adjustWorldRequest(lrWc);
330
                
331
                Point2D ulPx = new Point2D.Double();
332
                Point2D lrPx = new Point2D.Double();
333
                
334
                try {
335
                        at.inverseTransform(ulWc, ulPx);
336
                        at.inverseTransform(lrWc, lrPx);
337
                } catch (NoninvertibleTransformException e) {
338
                        JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "coordenadas_erroneas"));
339
                        return;
340
                }
341

    
342
                data.setCoorRealFromDouble(ulWc.getX(), ulWc.getY(), lrWc.getX(), lrWc.getY());
343
                data.setCoorPixelFromDouble(ulPx.getX(), ulPx.getY(), lrPx.getX() - 1, lrPx.getY() - 1);
344
        }
345
        
346
        
347
        /**
348
         * A?ade o elimina el par?metro selectedrois en funci?n del estado de los
349
         * controles del panel
350
         */
351
        private void addROIs(){
352
                if (panel.getSelectionAreaPanel().getAreaSelector().isSelected()){
353
                        data.setSelectedROIs(null);
354
                }else{
355
                        if(panel.getSelectionAreaPanel().getVectorizeOnlyInside().isSelected()){
356
                                data.setSelectedROIs(getSelectedROIs());
357
                        } else {
358
                                data.setSelectedROIs(null);
359
                        }
360
                }
361
        }
362
        
363
        
364
        
365
        /**
366
         * Gesti?n de eventos producidos en la tabla con la lista de ROIs
367
         * @param e
368
         */
369
        public void tableChanged(TableModelEvent e) {
370
                assignROISExtent();
371
                addROIs();
372
        }
373

    
374
        /*
375
         * (non-Javadoc)
376
         * @see org.gvsig.raster.IProcessActions#interrupted()
377
         */
378
        public void interrupted() {
379
        }
380

    
381
        public void end(Object param) {
382
        }
383

    
384
}