Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / clipping / ui / listener / ClippingPanelListener.java @ 23659

History | View | Annotate | Download (29.6 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.clipping.ui.listener;
20

    
21
import java.awt.Component;
22
import java.awt.Cursor;
23
import java.awt.Dimension;
24
import java.awt.event.ActionEvent;
25
import java.awt.event.ActionListener;
26
import java.awt.geom.AffineTransform;
27
import java.awt.geom.NoninvertibleTransformException;
28
import java.awt.geom.Point2D;
29
import java.awt.geom.Rectangle2D;
30
import java.io.File;
31
import java.util.ArrayList;
32
import java.util.EventObject;
33

    
34
import javax.swing.JOptionPane;
35

    
36
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
37
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
38
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
39
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
40
import org.gvsig.gui.beans.coordinatespanel.CoordinatesEvent;
41
import org.gvsig.gui.beans.coordinatespanel.CoordinatesListener;
42
import org.gvsig.gui.beans.coordinatespanel.CoordinatesPanel;
43
import org.gvsig.gui.beans.datainput.DataInputContainerListener;
44
import org.gvsig.gui.beans.table.models.CheckBoxModel;
45
import org.gvsig.raster.IProcessActions;
46
import org.gvsig.raster.RasterLibrary;
47
import org.gvsig.raster.RasterProcess;
48
import org.gvsig.raster.buffer.WriterBufferServer;
49
import org.gvsig.raster.dataset.properties.DatasetColorInterpretation;
50
import org.gvsig.raster.datastruct.Extent;
51
import org.gvsig.raster.grid.roi.ROI;
52
import org.gvsig.raster.hierarchy.IRasterGeoOperations;
53
import org.gvsig.raster.hierarchy.IRasterOperations;
54
import org.gvsig.raster.util.RasterToolsUtil;
55
import org.gvsig.raster.util.process.ClippingProcess;
56
import org.gvsig.rastertools.clipping.ClippingData;
57
import org.gvsig.rastertools.clipping.panels.ClippingCoordinatesPanel;
58
import org.gvsig.rastertools.clipping.panels.ClippingOptionsPanel;
59
import org.gvsig.rastertools.clipping.panels.ClippingResolutionPanel;
60
import org.gvsig.rastertools.clipping.panels.ClippingSelectionPanel;
61
import org.gvsig.rastertools.clipping.ui.ClippingPanel;
62
import org.gvsig.rastertools.saveraster.ui.info.EndInfoDialog;
63

    
64
import com.iver.andami.PluginServices;
65
import com.iver.andami.Utilities;
66
import com.iver.andami.ui.mdiManager.IWindow;
67
import com.iver.cit.gvsig.fmap.MapControl;
68
import com.iver.cit.gvsig.fmap.tools.BehaviorException;
69
import com.iver.cit.gvsig.fmap.tools.Behavior.Behavior;
70
import com.iver.cit.gvsig.fmap.tools.Behavior.MouseMovementBehavior;
71
import com.iver.cit.gvsig.fmap.tools.Behavior.RectangleBehavior;
72
import com.iver.cit.gvsig.fmap.tools.Events.RectangleEvent;
73
import com.iver.cit.gvsig.fmap.tools.Listeners.RectangleListener;
74
import com.iver.cit.gvsig.project.documents.view.gui.View;
75
import com.iver.cit.gvsig.project.documents.view.toolListeners.StatusBarListener;
76
/**
77
 * <code>ClippingPanelListener</code> es una clase donde se recoger?n y
78
 * tratar?n todos los eventos del panel de recorte
79
 *
80
 * @version 19/04/2007
81
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
82
 */
83
public class ClippingPanelListener implements ActionListener, RectangleListener, ButtonsPanelListener, CoordinatesListener, DataInputContainerListener, IProcessActions {
84
        private Dimension       dim                     = new Dimension();
85
        private AffineTransform at                      = null;
86
        private ClippingPanel   clippingPanel           = null;
87
        private ClippingData    data                    = null;
88
        private boolean         enableValueChangedEvent = true;
89

    
90
        private FLyrRasterSE    fLayer                  = null;
91
        private MapControl      mapControl              = null;
92

    
93
        /**
94
         * Herramienta seleccionada en el momento de la apertura del dialogo
95
         */
96
        private String          lastTool                = null;
97

    
98
        private String          viewName                = null;
99
        
100
        /**
101
         * Crea un nuevo <code>ClippingPanelListener</code> con el
102
         * <code>ClippingPanelListener</code> asociado
103
         * @param panel
104
         */
105
        public ClippingPanelListener(ClippingPanel clippingPanel) {
106
                this.clippingPanel = clippingPanel;
107
        }
108
        
109
        /**
110
         * Asigna el modelo de datos
111
         * @param data
112
         */
113
        public void setData(ClippingData data) {
114
                this.data = data;
115
        }
116

    
117
        /**
118
         * Asigna la matriz de transformaci?n entre puntos en coordenadas del raster y
119
         * puntos en coordenadas reales.
120
         * @param AffineTransform
121
         */
122
        private void setAffineTransform(AffineTransform at) {
123
                this.at = at;
124
        }
125

    
126
        /**
127
         * Asigna la dimensi?n del raster
128
         * @param dim
129
         */
130
        public void setDimension(Dimension dim) {
131
                this.dim = dim;
132
        }
133

    
134
        /**
135
         * M?todo que se invoca cuando se disparan los eventos de los botones de
136
         * extensi?n completa o de seleccion de extensi?n con el rat?n
137
         */
138
        public void actionPerformed(ActionEvent e) {
139
                // Bot?n de selecci?n del extent completo
140
                // Modificamos las coordenadas reales y recalculamos las coordenadas pixel
141
                if (e.getSource() == getResolutionPanel().getButtonRestore()) {
142
                        getClippingPanel().restoreStatus(data);
143
                }
144
                
145
                //Bot?n de selecci?n del ?rea m?xima asociada a los ROIs
146
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(0)) {
147
                        ArrayList roiList = getFLayer().getRois();
148
                        if(roiList != null && roiList.size() > 0) {
149
                                Extent ext = ROI.getROIsMaximunExtent(roiList);
150
                                assignROISExtent(ext, getFLayer());
151
                        } else
152
                                assignFullExtent();
153
                        return;
154
                }
155

    
156
                // Bot?n de selecci?n del extent completo
157
                // Modificamos las coordenadas reales y recalculamos las coordenadas pixel
158
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(1)) {
159
                        assignFullExtent();
160
                        return;
161
                }
162

    
163
                // Bot?n de selecci?n de la herramienta de seleccionar desde la vista
164
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(2)) {
165
                        selectToolButton();
166
                        return;
167
                }
168
                
169
        }
170
        
171
        /**
172
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
173
         * reales y p?xel. 
174
         */
175
        private void assignROISExtent(Extent ext, FLyrRasterSE layer) {
176
                AffineTransform at = layer.getAffineTransform();
177
                Point2D ulWc = new Point2D.Double(ext.minX(), ext.maxY());
178
                Point2D lrWc = new Point2D.Double(ext.maxX(), ext.minY());
179
                Point2D llWc = new Point2D.Double(ext.minX(), ext.minY());
180
                Point2D urWc = new Point2D.Double(ext.maxX(), ext.maxY());
181
                
182
                ulWc = getFLayer().adjustWorldRequest(ulWc);
183
                lrWc = getFLayer().adjustWorldRequest(lrWc);
184
                llWc = getFLayer().adjustWorldRequest(llWc);
185
                urWc = getFLayer().adjustWorldRequest(urWc);
186
                
187
                Point2D ulPx = new Point2D.Double();
188
                Point2D lrPx = new Point2D.Double();
189
                Point2D llPx = new Point2D.Double();
190
                Point2D urPx = new Point2D.Double();
191
                
192
                try {
193
                        at.inverseTransform(ulWc, ulPx);
194
                        at.inverseTransform(lrWc, lrPx);
195
                        at.inverseTransform(ulWc, llPx);
196
                        at.inverseTransform(lrWc, urPx);
197
                } catch (NoninvertibleTransformException e) {
198
                        JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "coordenadas_erroneas"));
199
                        return;
200
                }
201

    
202
                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
203
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
204
                data.setAffineTransform(at);
205
                data.initSize();
206
                getClippingPanel().saveStatus(data);
207
                
208
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
209
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
210
        }
211
        
212
        /**
213
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
214
         * reales y p?xel. 
215
         */
216
        private void assignFullExtent() {
217
                Point2D ulPx = new Point2D.Double(0, 0);
218
                Point2D lrPx = new Point2D.Double(dim.width, dim.height);
219
                Point2D urPx = new Point2D.Double(dim.width, 0);
220
                Point2D llPx = new Point2D.Double(0, dim.height);
221

    
222
                //Convertimos nuevamente a coordenadas reales
223
                Point2D ulWc = new Point2D.Double();
224
                Point2D lrWc = new Point2D.Double();
225
                Point2D urWc = new Point2D.Double();
226
                Point2D llWc = new Point2D.Double();
227
                at.transform(ulPx, ulWc);
228
                at.transform(lrPx, lrWc);
229
                at.transform(urPx, urWc);
230
                at.transform(llPx, llWc);
231

    
232
                ulPx = new Point2D.Double(0, 0);
233
                lrPx = new Point2D.Double(dim.width - 1, dim.height - 1);
234
                urPx = new Point2D.Double(dim.width - 1, 0);
235
                llPx = new Point2D.Double(0, dim.height - 1);
236
                
237
                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
238
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
239
                data.setAffineTransform(at);
240
                data.initSize();
241

    
242
                getClippingPanel().saveStatus(data);
243
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
244
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
245
        }
246
                
247
        /**
248
         * Al producirse un evento de perdida de foco o pulsaci?n de "enter" en un campo de texto de coordenadas
249
         * hay que asignar el nuevo valor introducido.
250
         * @param obj
251
         */
252
        private void eventJTextField(CoordinatesEvent e) {
253
                try {
254
                        if (e.getSource() == getCoordinatesPanel().getPixelCoordinates()) {
255
                                if (e.getName().equals("11"))
256
                                        data.setUlxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue11()).doubleValue());
257
                                if (e.getName().equals("12"))
258
                                        data.setUlyPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue12()).doubleValue());
259
                                if (e.getName().equals("21"))
260
                                        data.setLrxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue21()).doubleValue());
261
                                if (e.getName().equals("22"))
262
                                        data.setLryPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue22()).doubleValue());
263
                                data.updateObservers();
264
                        }
265

    
266
                        if (e.getSource() == getCoordinatesPanel().getRealCoordinates()) {
267
                                if (e.getName().equals("11"))
268
                                        data.setUlxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue11()).doubleValue());
269
                                if (e.getName().equals("12"))
270
                                        data.setUlyWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue12()).doubleValue());
271
                                if (e.getName().equals("21"))
272
                                        data.setLrxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue21()).doubleValue());
273
                                if (e.getName().equals("22"))
274
                                        data.setLryWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue22()).doubleValue());
275
                                data.updateObservers();
276
                        }
277
                } catch (NumberFormatException ex1) {
278
                        // No hay valores parseables a decimal en las cajas de texto. No hacemos nada
279
                }
280
        }
281

    
282
        
283

    
284
        /**
285
         * Recalcula el valor de los campos de coordenadas reales y pixel. Cuando modificamos alg?n campo
286
         * de las coordenadas reales se modifican los pixeles y viceversa.
287
         * @param modifyPx true si se ha modificado alg?n campo de coordenadas pixel y false si se ha modificado
288
         * alg?n campo de las coordenadas reales.
289
         */
290
        private void recalcCoordFields(boolean modifyPx) {
291
                try {
292
                        getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(false);
293
                        getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(false);
294

    
295
                        if (modifyPx) {
296
                                Point2D ulPx = new Point2D.Double(data.getUlxPx(), data.getUlyPx());
297
                                Point2D lrPx = new Point2D.Double(data.getLrxPx(), data.getLryPx());
298
                                Point2D llPx = new Point2D.Double(data.getLlxPx(), data.getLlyPx());
299
                                Point2D urPx = new Point2D.Double(data.getUrxPx(), data.getUryPx());
300

    
301
                                //Comprobamos que las esquinas no esten cambiadas de sitio
302
                                if(ulPx.getX() > lrPx.getX()) {
303
                                        double ulTmp = ulPx.getX();
304
                                        ulPx.setLocation(lrPx.getX(), ulPx.getY());
305
                                        lrPx.setLocation(ulTmp, lrPx.getY());
306
                                }
307
                                if(ulPx.getY() > lrPx.getY()) {
308
                                        double ulTmp = ulPx.getY();
309
                                        ulPx.setLocation(ulPx.getX(), lrPx.getY());
310
                                        lrPx.setLocation(lrPx.getX(), ulTmp);
311
                                }
312
                                
313
                                //Ajustamos la selecci?n al ?rea
314
                                ulPx = adjustPixelRequest(ulPx);
315
                                lrPx = adjustPixelRequest(lrPx);
316

    
317
                                Point2D ulWc = new Point2D.Double();
318
                                Point2D lrWc = new Point2D.Double();
319
                                Point2D llWc = new Point2D.Double();
320
                                Point2D urWc = new Point2D.Double();
321
                                at.transform(ulPx, ulWc);
322
                                at.transform(new Point2D.Double(lrPx.getX() + 1, lrPx.getY() + 1), lrWc);
323
                                at.transform(new Point2D.Double(llPx.getX(), llPx.getY() + 1), llWc);
324
                                at.transform(new Point2D.Double(urPx.getX() + 1, urPx.getY()), urWc);
325

    
326
                                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
327
                                data.setCoorReal(ulWc, lrWc, llWc, urWc);
328
                                data.setAffineTransform(at);
329
                                data.initSize();
330

    
331
                                getClippingPanel().saveStatus(data);
332
                                
333
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
334
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
335
                        } else {
336
                                Point2D ulWc = new Point2D.Double(data.getUlxWc(), data.getUlyWc());
337
                                Point2D lrWc = new Point2D.Double(data.getLrxWc(), data.getLryWc());
338
                                Point2D llWc = new Point2D.Double(data.getLlxWc(), data.getLlyWc());
339
                                Point2D urWc = new Point2D.Double(data.getUrxWc(), data.getUryWc());
340
                                
341
                                //Ajustamos la selecci?n al ?rea
342
                                ulWc = getFLayer().adjustWorldRequest(ulWc);
343
                                lrWc = getFLayer().adjustWorldRequest(lrWc);
344
                                llWc = getFLayer().adjustWorldRequest(llWc);
345
                                urWc = getFLayer().adjustWorldRequest(urWc);
346
                                
347
                                Point2D ulPx = new Point2D.Double();
348
                                Point2D lrPx = new Point2D.Double();
349
                                Point2D llPx = new Point2D.Double();
350
                                Point2D urPx = new Point2D.Double();
351
                                
352
                                try {
353
                                        at.inverseTransform(ulWc, ulPx);
354
                                        at.inverseTransform(lrWc, lrPx);
355
                                        at.inverseTransform(llWc, llPx);
356
                                        at.inverseTransform(urWc, urPx);
357
                                } catch (NoninvertibleTransformException e) {
358
                                        JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "coordenadas_erroneas"));
359
                                        return;
360
                                }
361

    
362
                                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
363
                                data.setCoorReal(ulWc, lrWc, llWc, urWc);
364
                                data.setAffineTransform(at);
365
                                data.initSize();
366
                                getClippingPanel().saveStatus(data);
367
                                
368
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
369
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
370
                        }
371
                } catch (NumberFormatException ex) {
372
                        return;
373
                }
374

    
375
        }
376

    
377
        /**
378
         * Ajusta las coordenadas especificadas en los par?metros al ?rea m?xima
379
         * del raster en p?xeles
380
         * @param req
381
         */
382
        private Point2D adjustPixelRequest(Point2D req) {
383
                req.setLocation(Math.max(0, req.getX()), Math.max(0, req.getY()));
384
                req.setLocation(Math.min(dim.width - 1, req.getX()), Math.min(dim.height - 1, req.getY()));
385
                return req;
386
        }
387
        
388
        /**
389
         * Invocaci?n de los eventos de la ventana de <code>DefaultButtonsPanel</code>
390
         */
391
        public void actionButtonPressed(ButtonsPanelEvent e) {
392
                // Bot?n de Aceptar
393
                if (e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
394
                        accept();
395
                        close();
396
                }
397

    
398
                // Bot?n de Aplicar
399
                if (e.getButton() == ButtonsPanel.BUTTON_APPLY) 
400
                        accept();
401

    
402
                // Bot?n de Cerrar
403
                if (e.getButton() == ButtonsPanel.BUTTON_CANCEL)
404
                        close();
405

    
406
                getFLayer().getMapContext().invalidate();
407
        }
408

    
409
        /**
410
         * Cerrar la ventana del recorte
411
         */
412
        private void close() {
413
                try {
414
                        if (getLastTool() != null)
415
                                getMapControl().setTool(getLastTool());
416
                        PluginServices.getMDIManager().closeWindow(getClippingPanel().getClippingDialog());
417
                } catch (ArrayIndexOutOfBoundsException ex) {
418
                        // Si la ventana no se puede eliminar no hacemos nada
419
                }
420
        }
421

    
422
        /**
423
         * Obtener el <code>ClippingPanel</code> asociado
424
         * @return ClippingPanel
425
         */
426
        private ClippingPanel getClippingPanel() {
427
                return clippingPanel;
428
        }
429

    
430
        private ClippingCoordinatesPanel getCoordinatesPanel() {
431
                return getClippingPanel().getCoordinatesPanel();
432
        }
433

    
434
        private ClippingResolutionPanel getResolutionPanel() {
435
                return getClippingPanel().getResolutionPanel();
436
        }
437

    
438
        private ClippingOptionsPanel getOptionsPanel() {
439
                return getClippingPanel().getOptionsPanel();
440
        }
441

    
442
        private ClippingSelectionPanel getSelectionPanel() {
443
                return getClippingPanel().getSelectionPanel();
444
        }
445

    
446
        /**
447
         * Acciones realizadas cuando se acepta en el dialogo. Se obtendr?n los datos
448
         * de recorte desde el dialogo, crearemos el objeto ClippingProcess que
449
         * gestiona el recortado, ajustamos el tama?o del grid de salida y procesamos.
450
         */
451
        private void accept() {
452
                // Controlamos las coordenadas del recorte que no se salgan de la imagen.
453
                // De ser as? mostramos un error
454
                CoordinatesPanel coordinatesReales = getCoordinatesPanel().getRealCoordinates();
455
                double ulx = 0;
456
                double lrx = 0;
457
                double lry = 0;
458
                double uly = 0;
459
                try {
460
                        ulx = Double.parseDouble(coordinatesReales.getValue11());
461
                        lry = Double.parseDouble(coordinatesReales.getValue22());
462
                        lrx = Double.parseDouble(coordinatesReales.getValue21());
463
                        uly = Double.parseDouble(coordinatesReales.getValue12());
464
                        Rectangle2D ext = getFLayer().getFullExtent();
465
                        if (((int) ulx) > ((int) ext.getMaxX()) || ((int) lrx) < ((int) ext.getMinX()) || ((int) uly) > ((int) ext.getMaxY()) || ((int) lry) < ((int) ext.getMinY())) {
466
                                RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "coordenadas_erroneas"), null);
467
                                return;
468
                        }
469
                } catch (NumberFormatException e) {
470
                        RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "coordenadas_erroneas"), null);
471
                        return;
472
                } 
473

    
474
                // Obtenemos las coordenadas del recorte
475
                /*CoordinatesPanel coordinatesPixel = getCoordinatesPanel().getPixelCoordinates();
476
                int[] dValues = new int[4];
477
                try {
478
                        dValues[0] = (int) Math.round(Double.valueOf(coordinatesPixel.getValue11()).doubleValue());
479
                        dValues[1] = (int) Math.round(Double.valueOf(coordinatesPixel.getValue22()).doubleValue());
480
                        dValues[2] = (int) Math.round(Double.valueOf(coordinatesPixel.getValue21()).doubleValue());
481
                        dValues[3] = (int) Math.round(Double.valueOf(coordinatesPixel.getValue12()).doubleValue());
482
                } catch (NumberFormatException exc) {
483
                        // Los valores de las cajas son incorrectos. Terminamos la funci?n
484
                        return;
485
                }*/
486
                double[] wcValues = data.getWcCoordinatesToClip();
487
                double[] pxSize = data.getPxSizeToClip();
488

    
489
                // Seleccionamos las bandas que se usaran en el recorte a partir de la tabla
490
                int countBands = 0;
491
                int rowCount = ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getRowCount();
492
                for (int iRow = 0; iRow < rowCount; iRow++)
493
                        if ((((Boolean) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 0))).booleanValue())
494
                                countBands++;
495

    
496
                int[] drawableBands = new int[countBands];
497
                int i = 0;
498
                for (int iRow = 0; iRow < rowCount; iRow++) {
499
                        if ((((Boolean) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 0))).booleanValue()) {
500
                                int row = ((Integer) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 2)).intValue();
501
                                drawableBands[i++] = row;
502
                        }
503
                }
504

    
505
                /**
506
                 * Donde se va a guardar el fichero
507
                 */
508
                String path;
509
                if (getOptionsPanel().getCbSaveFile().isSelected())
510
                        path = getOptionsPanel().getDirectoryTextField().getText();
511
                else
512
                        path = Utilities.createTempDirectory();
513

    
514
                String file = getOptionsPanel().getFilenameTextField().getText();
515
                if (file.compareTo(RasterLibrary.getOnlyLayerName()) == 0)
516
                        RasterLibrary.usesOnlyLayerName();
517

    
518
                if (file == "")
519
                        file = "cutlayer";
520

    
521
                String filename = path + File.separator + file;
522

    
523
                if (new File(filename + ".tif").exists())
524
                        if (!RasterToolsUtil.messageBoxYesOrNot("raster_error_file_exists", getOptionsPanel()))
525
                                return;
526

    
527
                /**
528
                 * Preparacion para la generacion del proceso del recorte
529
                 */
530
                if (getFLayer() == null)
531
                        return;
532

    
533
                WriterBufferServer dataWriter1 = new WriterBufferServer();
534

    
535
                AffineTransform transf = calcAffineTransform(wcValues[0], wcValues[1], wcValues[2], wcValues[3], 
536
                                                                                                        Math.round(data.getPxWidth()), Math.round(data.getPxHeight()), at);
537

    
538
                int interpMethod = getResolutionPanel().getSelectedInterpolationMethod();
539

    
540
                // Creamos la interpretaci?n de color para el caso de que la salida tenga
541
                // m?s de una banda por fichero. Siempre creamos RED, GREEN y BLUE
542
                String[] ci = new String[drawableBands.length];
543
                for (int j = 0; j < ci.length; j++) {
544
                        switch (j) {
545
                                case 0:
546
                                        if (ci.length >= 3)
547
                                                ci[j] = DatasetColorInterpretation.RED_BAND;
548
                                        else
549
                                                ci[j] = DatasetColorInterpretation.GRAY_BAND;
550
                                        break;
551
                                case 1:
552
                                        if (ci.length >= 3)
553
                                                ci[j] = DatasetColorInterpretation.GREEN_BAND;
554
                                        else
555
                                                ci[j] = DatasetColorInterpretation.UNDEF_BAND;
556
                                        break;
557
                                case 2:
558
                                        ci[j] = DatasetColorInterpretation.BLUE_BAND;
559
                                        break;
560
                                default:
561
                                        ci[j] = DatasetColorInterpretation.UNDEF_BAND;
562
                                        break;
563
                        }
564
                }
565

    
566
                RasterProcess clippingProcess = new ClippingProcess();
567
                clippingProcess.setActions(this);
568
                clippingProcess.addParam("viewname", getViewName());
569
                //clippingProcess.addParam("pixelcoordinates", dValues);
570
                clippingProcess.addParam("realcoordinates", wcValues);
571
                clippingProcess.addParam("filename", filename);
572
                clippingProcess.addParam("datawriter", dataWriter1);
573
                clippingProcess.addParam("layer", getFLayer());
574
                clippingProcess.addParam("drawablebands", drawableBands);
575
                clippingProcess.addParam("onelayerperband", new Boolean(getOptionsPanel().getCbOneLyrPerBand().isSelected()));
576
                clippingProcess.addParam("interpolationmethod", new Integer(interpMethod));
577
                clippingProcess.addParam("affinetransform", transf);
578
                clippingProcess.addParam("colorInterpretation", new DatasetColorInterpretation(ci));
579
                clippingProcess.addParam("resolution", new int[]{(int) Math.round(pxSize[0]),
580
                                                                                                                 (int) Math.round(pxSize[1])});
581
                clippingProcess.start();
582
        }
583

    
584
        /**
585
         * Calcula la matriz de transformaci?n que se usar? para el nuevo raster generado.
586
         * @param ulx Coordenada X real de la esquina superior izquierda
587
         * @param uly Coordenada Y real de la esquina superior izquierda
588
         * @param lrx Coordenada X real de la esquina inferior derecha
589
         * @param lry Coordenada Y real de la esquina inferior derecha
590
         * @param width Ancho en p?xeles del nuevo raster
591
         * @param height Alto en p?xeles del nuevo raster
592
         * @param trans Matriz de transformaci?n de la nueva capa
593
         * @return Matriz de transformaci?n para el nuevo raster
594
         */
595
        private AffineTransform calcAffineTransform(double ulx, double uly, double lrx, double lry, 
596
                                                                                                double width, double height, AffineTransform trans) {
597
                Point2D ul = new Point2D.Double(ulx, uly);
598
                Point2D lr = new Point2D.Double(lrx, lry);
599
                try {
600
                        trans.inverseTransform(ul, ul);
601
                        trans.inverseTransform(lr, lr);
602
                } catch (NoninvertibleTransformException e) {
603
                        JOptionPane.showMessageDialog(null, RasterToolsUtil.getText(this, "coordenadas_erroneas"));
604
                        return new AffineTransform();
605
                }
606
                double w = Math.abs(lr.getX() - ul.getX());
607

    
608
                Point2D ur = new Point2D.Double(ul.getX() + w, ul.getY());
609
                Point2D ll = new Point2D.Double(lr.getX() - w, lr.getY() );
610

    
611
                //Obtenemos la georreferenciaci?n de las cuatro esquinas del nuevo raster
612
                trans.transform(ul, ul);
613
                trans.transform(ur, ur);
614
                trans.transform(lr, lr);
615
                trans.transform(ll, ll);
616

    
617
                double pixelSizeX = (ur.getX() - ul.getX()) / width;
618
                double pixelSizeY = (ll.getY() - ul.getY()) / height;
619
                double rotX = trans.getShearX();
620
                double rotY = trans.getShearY();
621
                return new AffineTransform(pixelSizeX, rotY, rotX, pixelSizeY, ulx, uly);
622
        }
623

    
624
        /*
625
         * (non-Javadoc)
626
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.ToolListener#cancelDrawing()
627
         */
628
        public boolean cancelDrawing() {
629
                return false;
630
        }
631

    
632
        /*
633
         * (non-Javadoc)
634
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.ToolListener#getCursor()
635
         */
636
        public Cursor getCursor() {
637
                return null;
638
        }
639

    
640
        /*
641
         * (non-Javadoc)
642
         * @see org.gvsig.gui.beans.coordinatespanel.CoordinatesListener#actionValueChanged(org.gvsig.gui.beans.coordinatespanel.CoordinatesEvent)
643
         */
644
        public void actionValueChanged(CoordinatesEvent e) {
645
                if (e.getSource() == getCoordinatesPanel().getPixelCoordinates()) {
646
                        eventJTextField(e);
647
                        recalcCoordFields(true);
648
                }
649
                if (e.getSource() == getCoordinatesPanel().getRealCoordinates()) {
650
                        eventJTextField(e);
651
                        recalcCoordFields(false);
652
                }
653
        }
654

    
655
        /*
656
         * (non-Javadoc)
657
         * @see org.gvsig.gui.beans.datainput.DataInputContainerListener#actionValueChanged(java.util.EventObject)
658
         */
659
        public void actionValueChanged(EventObject e) {
660
                if(!enableValueChangedEvent)
661
                        return;
662

    
663
                enableValueChangedEvent = false; //Desactivamos el evento de cambio de valor de las cajas de texto para que no se bucle
664

    
665
                if (e.getSource() == getResolutionPanel().getCCellSize().getDataInputField()) {
666
                        // Cambiamos PS ==> wPx=wWC/PS & hPx=wPx/rel
667
                        double ps = 0;
668
                        try {
669
                                ps = Double.parseDouble(getResolutionPanel().getCCellSize().getValue());
670
                        } catch (NumberFormatException ex) {
671
                                return;
672
                        }
673
                        data.setPxWidth(data.getWcWidth() / ps);
674
                        data.setPxHeight(data.getWcHeight() / ps);
675
                        data.updateObservers();
676
                } else if (e.getSource() == getResolutionPanel().getCWidth().getDataInputField()) {
677
                        // Cambiamos wPx ==> hPx=wPx/rel & PS=wWC/wPx
678
                        double wPx = 0;
679
                        try {
680
                                wPx = Double.parseDouble(getResolutionPanel().getCWidth().getValue());
681
                        } catch (NumberFormatException ex) {
682
                                return;
683
                        }
684
                        data.setPxWidth(wPx);
685
                        data.setPxHeight(Math.round(wPx / data.getRatio()));
686
                        data.updateObservers();
687
                } else if (e.getSource() == getResolutionPanel().getCHeight().getDataInputField()) {
688
                        // Cambiamos hPx ==> wPx=rel*wPx & PS=hWC/hPx
689
                        double hPx = 0;
690
                        try {
691
                                hPx = Double.parseDouble(getResolutionPanel().getCHeight().getValue());
692
                        } catch (NumberFormatException ex) {
693
                                return;
694
                        }
695
                        data.setPxHeight(hPx);
696
                        data.setPxWidth(Math.round(Math.round(hPx * data.getRatio())));
697
                        data.updateObservers();
698
                }
699
                enableValueChangedEvent = true;
700
        }
701

    
702
        /**
703
         * Asigna el valor para la activaci?n y desactivaci?n del evento de cambio de valor en
704
         * las cajas de texto.
705
         * @param enableValueChangedEvent
706
         */
707
        public void setEnableValueChangedEvent(boolean enableValueChangedEvent) {
708
                this.enableValueChangedEvent = enableValueChangedEvent;
709
        }
710

    
711
        /*
712
         * (non-Javadoc)
713
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
714
         */
715
        public void end(Object params) {
716
                if(        params instanceof Object[] &&
717
                        ((Object[])params).length == 2 &&
718
                        ((Object[])params)[0] instanceof String &&
719
                        ((Object[])params)[1] instanceof Long) {
720

    
721
                        String fName = (String)((Object[])params)[0];
722
                        long milis = ((Long)((Object[])params)[1]).longValue();
723

    
724
                        EndInfoDialog.show(fName, milis);
725
                }
726
        }
727
        
728
        /**
729
         * Obtener la capa de un raster.
730
         * @return
731
         */
732
        public FLyrRasterSE getFLayer() {
733
                return fLayer;
734
        }
735
        
736
        /**
737
         * Obtiene la ultima herramienta seleccionada antes de cargar el recorte
738
         * @return
739
         */
740
        public String getLastTool() {
741
                return lastTool;
742
        }
743

    
744
        /**
745
         * Obtiene el nombre de la vista
746
         * @return
747
         */
748
        public String getViewName() {
749
                return viewName;
750
        }        
751

    
752
        /**
753
         * Establecer la capa para usarla en el recorte
754
         * @param fLayer
755
         */
756
        public void setLayer(FLyrRasterSE fLayer) {
757
                this.fLayer = fLayer;
758
                View view = (View) PluginServices.getMDIManager().getActiveWindow();
759
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
760
                mapControl = view.getMapControl();
761

    
762
                lastTool = mapControl.getCurrentTool();
763

    
764
                // Listener de eventos de movimiento que pone las coordenadas del rat?n en
765
                // la barra de estado
766
                StatusBarListener sbl = new StatusBarListener(mapControl);
767

    
768
                // Cortar Raster
769
                ClippingMouseViewListener clippingMouseViewListener = new ClippingMouseViewListener(mapControl, getClippingPanel(), data, fLayer);
770
                mapControl.addMapTool("cutRaster", new Behavior[] {
771
                                new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl)
772
                        }
773
                );
774
                
775
                getSelectionPanel().setLayer(fLayer);
776

    
777
                // Obtener la extension completa de la capa
778

    
779
                if(fLayer instanceof IRasterGeoOperations && fLayer instanceof IRasterOperations) {
780
                        setAffineTransform(((IRasterGeoOperations)fLayer).getAffineTransform());
781
                        setDimension(new Dimension((int)((IRasterOperations)fLayer).getPxWidth(), (int)((IRasterOperations)fLayer).getPxHeight()));
782
                } else {
783
                        RasterToolsUtil.messageBoxError("Error obteniendo el extent.", this);
784
                        return;
785
                }
786

    
787
        }
788

    
789
        /**
790
         * Acciones que se realizan para seleccionar la tool CutRaster
791
         */
792
        public void selectToolButton() {
793
                // seleccionamos la vista de gvSIG
794
                com.iver.cit.gvsig.project.documents.view.gui.View theView = null;
795
                try {
796
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
797
                        for (int i = 0; i < allViews.length; i++) {
798
                                if (allViews[i] instanceof com.iver.cit.gvsig.project.documents.view.gui.View
799
                                                && PluginServices.getMDIManager().getWindowInfo((View) allViews[i])
800
                                                                .getTitle().equals(viewName))
801
                                        theView = (com.iver.cit.gvsig.project.documents.view.gui.View) allViews[i];
802
                        }
803
                        if (theView == null)
804
                                return;
805
                } catch (ClassCastException ex) {
806
                        // RasterToolsUtil.messageBoxError("cant_get_view "), this, ex);
807
                        return;
808
                }
809
                MapControl m_MapControl = theView.getMapControl();
810

    
811
                // Listener de eventos de movimiento que pone las coordenadas del rat?n en
812
                // la barra de estado
813
                //StatusBarListener sbl = new StatusBarListener(m_MapControl);
814

    
815
                // Cortar Raster
816
                /*ClippingMouseViewListener clippingMouseViewListener = new ClippingMouseViewListener(m_MapControl, getClippingPanel(), data, getFLayer());
817
                m_MapControl.addMapTool("cutRaster", new Behavior[] {
818
                                new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl)
819
                                }
820
                );*/
821

    
822
                m_MapControl.setTool("clipRaster");
823
        }
824

    
825
        /**
826
         * Obtiene el <code>MapControl</code> de gvSIG
827
         * @return <code>MapControl</code>
828
         */
829
        public MapControl getMapControl() {
830
                return mapControl;
831
        }
832

    
833

    
834
        public void rectangle(RectangleEvent event) throws BehaviorException {}
835
        public void interrupted() {}
836
}