Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / branches / org.gvsig.raster.tools_proyeccion_al_vuelo / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / clip / ui / listener / ClippingPanelListener.java @ 5472

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

    
24
import java.awt.Component;
25
import java.awt.Cursor;
26
import java.awt.Dimension;
27
import java.awt.Image;
28
import java.awt.event.ActionEvent;
29
import java.awt.event.ActionListener;
30
import java.awt.geom.AffineTransform;
31
import java.awt.geom.NoninvertibleTransformException;
32
import java.awt.geom.Point2D;
33
import java.io.File;
34
import java.util.EventObject;
35
import java.util.List;
36

    
37
import javax.swing.JOptionPane;
38

    
39
import org.gvsig.andami.PluginServices;
40
import org.gvsig.andami.Utilities;
41
import org.gvsig.andami.ui.mdiManager.IWindow;
42
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
43
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
44
import org.gvsig.fmap.dal.coverage.RasterLocator;
45
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
46
import org.gvsig.fmap.dal.coverage.exception.ROIException;
47
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
48
import org.gvsig.fmap.geom.Geometry;
49
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
50
import org.gvsig.fmap.geom.GeometryLocator;
51
import org.gvsig.fmap.geom.GeometryManager;
52
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
53
import org.gvsig.fmap.geom.operation.GeometryOperationException;
54
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
55
import org.gvsig.fmap.geom.primitive.Envelope;
56
import org.gvsig.fmap.mapcontrol.MapControl;
57
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
58
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
59
import org.gvsig.fmap.mapcontrol.tools.Behavior.MouseMovementBehavior;
60
import org.gvsig.fmap.mapcontrol.tools.Behavior.RectangleBehavior;
61
import org.gvsig.fmap.mapcontrol.tools.Events.EnvelopeEvent;
62
import org.gvsig.fmap.mapcontrol.tools.Listeners.RectangleListener;
63
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
64
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
65
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
66
import org.gvsig.gui.beans.coordinatespanel.CoordinatesEvent;
67
import org.gvsig.gui.beans.coordinatespanel.CoordinatesListener;
68
import org.gvsig.gui.beans.coordinatespanel.CoordinatesPanel;
69
import org.gvsig.gui.beans.datainput.DataInputContainerListener;
70
import org.gvsig.gui.beans.table.models.CheckBoxModel;
71
import org.gvsig.i18n.Messages;
72
import org.gvsig.raster.algorithm.process.DataProcess;
73
import org.gvsig.raster.algorithm.process.IProcessActions;
74
import org.gvsig.raster.fmap.layers.FLyrRaster;
75
import org.gvsig.raster.roi.ROI;
76
import org.gvsig.raster.swing.RasterSwingLibrary;
77
import org.gvsig.raster.swing.RasterSwingLocator;
78
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
79
import org.gvsig.raster.tools.app.basic.raster.process.ClippingProcess;
80
import org.gvsig.raster.tools.app.basic.tool.clip.ClippingData;
81
import org.gvsig.raster.tools.app.basic.tool.clip.ui.ClippingPanel;
82
import org.gvsig.raster.tools.app.basic.tool.clip.ui.panel.ClippingCoordinatesPanel;
83
import org.gvsig.raster.tools.app.basic.tool.clip.ui.panel.ClippingOptionsPanel;
84
import org.gvsig.raster.tools.app.basic.tool.clip.ui.panel.ClippingResolutionPanel;
85
import org.gvsig.raster.tools.app.basic.tool.clip.ui.panel.ClippingSelectionPanel;
86
import org.gvsig.tools.swing.api.ToolsSwingLocator;
87
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
88
import org.slf4j.Logger;
89
import org.slf4j.LoggerFactory;
90

    
91
/**
92
 * <code>ClippingPanelListener</code> es una clase donde se recoger?n y
93
 * tratar?n todos los eventos del panel de recorte
94
 *
95
 * @author BorSanZa - Borja S?nchez Zamorano 
96
 */
97
public class ClippingPanelListener implements ActionListener, RectangleListener, ButtonsPanelListener, CoordinatesListener, DataInputContainerListener, IProcessActions {
98
    
99
    private static final Logger LOG = LoggerFactory.getLogger(ClippingPanelListener.class);
100
    
101
        private Dimension             dim                     = new Dimension();
102
        private AffineTransform       at                      = null;
103
        private ClippingPanel         clippingPanel           = null;
104
        private ClippingData          data                    = null;
105
        private boolean               enableValueChangedEvent = true;
106
        private FLyrRaster            fLayer                  = null;
107
        private MapControl            mapControl              = null;
108
        /**
109
         * Herramienta seleccionada en el momento de la apertura del dialogo
110
         */
111
        private String                 lastTool                = null;
112
        private String                 viewName                = null;
113
        private static ClippingData    lastDataSaved           = null;
114

    
115
        /**
116
         * Crea un nuevo <code>ClippingPanelListener</code> con el
117
         * <code>ClippingPanelListener</code> asociado
118
         * @param panel
119
         */
120
        public ClippingPanelListener(ClippingPanel clippingPanel) {
121
                this.clippingPanel = clippingPanel;
122
        }
123

    
124
        /**
125
         * Asigna el modelo de datos
126
         * @param data
127
         */
128
        public void setData(ClippingData data) {
129
                this.data = data;
130
                if(fLayer != null) {
131
                        data.setPxWidth((int)fLayer.getDataStore().getWidth());
132
                        data.setPxHeight((int)fLayer.getDataStore().getHeight());
133
                }
134
        }
135

    
136
        /**
137
         * Asigna la matriz de transformaci?n entre puntos en coordenadas del raster y
138
         * puntos en coordenadas reales.
139
         * @param AffineTransform
140
         */
141
        private void setAffineTransform(AffineTransform at) {
142
                this.at = at;
143
        }
144

    
145
        /**
146
         * Asigna la dimensi?n del raster
147
         * @param dim
148
         */
149
        public void setDimension(Dimension dim) {
150
                this.dim = dim;
151
        }
152

    
153
        /**
154
         * M?todo que se invoca cuando se disparan los eventos de los botones de
155
         * extensi?n completa o de seleccion de extensi?n con el rat?n
156
         */
157
        public void actionPerformed(ActionEvent e) {
158
                // Bot?n de selecci?n del extent completo
159
                // Modificamos las coordenadas reales y recalculamos las coordenadas pixel
160
                if (e.getSource() == getResolutionPanel().getButtonRestore()) {
161
                        getClippingPanel().restoreStatus(data);
162
                }
163

    
164
                //Load parameters
165
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(0)) {
166
                        if(lastDataSaved != null) {
167
                                data = (ClippingData)lastDataSaved.clone();
168
                                data.addObserver(getClippingPanel());
169
                                data.updateObservers();
170
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
171
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
172
                        } else
173
                                RasterSwingLibrary.messageBoxError(Messages.getText("no_data_saved"), null);
174
                }
175

    
176
                //Save parameters
177
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(1)) {
178
                        lastDataSaved = (ClippingData)data.clone();
179
                }
180
                
181
                //Redondear las coordenadas p?xel
182
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(2)) {
183
                        roundPixels();
184
                        return;
185
                }
186

    
187
                //Bot?n de selecci?n del ?rea m?xima asociada a los ROIs
188
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(3)) {
189
                        try {
190
                                List<ROI> roiList = getFLayer().getRois();
191
                                if(roiList != null && roiList.size() > 0) {
192
                                        Extent ext = RasterLocator.getManager().getRasterUtils().getROIsMaximunExtent(roiList);
193
                                        assignROISExtent(ext, getFLayer());
194
                                } else
195
                                        assignFullExtent();
196
                        } catch (ROIException e1) {
197
                                RasterSwingLibrary.messageBoxError(Messages.getText("problems_loading_rois"), null);
198
                        }
199
                        
200
                        return;
201
                }
202

    
203
                // Bot?n de selecci?n del extent completo
204
                // Modificamos las coordenadas reales y recalculamos las coordenadas pixel
205
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(4)) {
206
                        assignFullExtent();
207
                        return;
208
                }
209

    
210
                // Bot?n de selecci?n de la herramienta de seleccionar desde la vista
211
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(5)) {
212
                        selectToolButton();
213
                        return;
214
                }
215

    
216
        }
217
        
218
        /**
219
         * Round off the pixels value
220
         */
221
        private void roundPixels() {
222
                data.setUlxPx((int)(data.getUlxPx()));
223
                data.setUlyPx((int)(data.getUlyPx()));
224
                data.setLrxPx((int)(data.getLrxPx()));
225
                data.setLryPx((int)(data.getLryPx()));
226
                data.setUrxPx((int)(data.getUrxPx()));
227
                data.setUryPx((int)(data.getUryPx()));
228
                data.setLlxPx((int)(data.getLlxPx()));
229
                data.setLlyPx((int)(data.getLlyPx()));
230
                
231
                Point2D ulWc = new Point2D.Double();
232
                Point2D lrWc = new Point2D.Double();
233
                Point2D llWc = new Point2D.Double();
234
                Point2D urWc = new Point2D.Double();
235
                
236
                at.transform(new Point2D.Double(data.getUlxPx(), data.getUlyPx()), ulWc);
237
                at.transform(new Point2D.Double(data.getLrxPx() + 1, data.getLryPx() + 1), lrWc);
238
                at.transform(new Point2D.Double(data.getLlxPx(), data.getLlyPx() + 1), llWc);
239
                at.transform(new Point2D.Double(data.getUrxPx() + 1, data.getUryPx()), urWc);
240

    
241
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
242
                data.setAffineTransform(at);
243
                data.initSize();
244
                data.updateObservers();
245
        }
246

    
247
        /**
248
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
249
         * reales y p?xel.
250
         */
251
        private void assignROISExtent(Extent ext, FLyrRaster layer) {
252
                AffineTransform at = layer.getAffineTransform();
253
                Point2D ulWc = new Point2D.Double(ext.minX(), ext.maxY());
254
                Point2D lrWc = new Point2D.Double(ext.maxX(), ext.minY());
255
                Point2D llWc = new Point2D.Double(ext.minX(), ext.minY());
256
                Point2D urWc = new Point2D.Double(ext.maxX(), ext.maxY());
257

    
258
                ulWc = getFLayer().adjustWorldRequest(ulWc);
259
                lrWc = getFLayer().adjustWorldRequest(lrWc);
260
                llWc = getFLayer().adjustWorldRequest(llWc);
261
                urWc = getFLayer().adjustWorldRequest(urWc);
262

    
263
                Point2D ulPx = new Point2D.Double();
264
                Point2D lrPx = new Point2D.Double();
265
                Point2D llPx = new Point2D.Double();
266
                Point2D urPx = new Point2D.Double();
267

    
268
                try {
269
                        at.inverseTransform(ulWc, ulPx);
270
                        at.inverseTransform(lrWc, lrPx);
271
                        at.inverseTransform(ulWc, llPx);
272
                        at.inverseTransform(lrWc, urPx);
273
                } catch (NoninvertibleTransformException e) {
274
                        JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), Messages.getText("coordenadas_erroneas"));
275
                        return;
276
                }
277

    
278
                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
279
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
280
                data.setAffineTransform(at);
281
                data.initSize();
282
                getClippingPanel().saveStatus(data);
283

    
284
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
285
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
286
        }
287

    
288
        /**
289
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
290
         * reales y p?xel.
291
         */
292
        private void assignFullExtent() {
293
                Point2D ulPx = new Point2D.Double(0, 0);
294
                Point2D lrPx = new Point2D.Double(dim.width, dim.height);
295
                Point2D urPx = new Point2D.Double(dim.width, 0);
296
                Point2D llPx = new Point2D.Double(0, dim.height);
297

    
298
                //Convertimos nuevamente a coordenadas reales
299
                Point2D ulWc = new Point2D.Double();
300
                Point2D lrWc = new Point2D.Double();
301
                Point2D urWc = new Point2D.Double();
302
                Point2D llWc = new Point2D.Double();
303
                at.transform(ulPx, ulWc);
304
                at.transform(lrPx, lrWc);
305
                at.transform(urPx, urWc);
306
                at.transform(llPx, llWc);
307

    
308
                ulPx = new Point2D.Double(0, 0);
309
                lrPx = new Point2D.Double(dim.width - 1, dim.height - 1);
310
                urPx = new Point2D.Double(dim.width - 1, 0);
311
                llPx = new Point2D.Double(0, dim.height - 1);
312

    
313
                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
314
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
315
                data.setAffineTransform(at);
316
                data.initSize();
317

    
318
                getClippingPanel().saveStatus(data);
319
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
320
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
321
        }
322

    
323
        /**
324
         * Al producirse un evento de perdida de foco o pulsaci?n de "enter" en un campo de texto de coordenadas
325
         * hay que asignar el nuevo valor introducido.
326
         * @param obj
327
         */
328
        private void eventJTextField(CoordinatesEvent e) {
329
                try {
330
                        if (e.getSource() == getCoordinatesPanel().getPixelCoordinates()) {
331
                                if (e.getName().equals("11")) {
332
                                        data.setUlxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue11()).doubleValue());
333
                                        data.setLlxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue11()).doubleValue());
334
                                }
335
                                if (e.getName().equals("12")) {
336
                                        data.setUlyPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue12()).doubleValue());
337
                                        data.setUryPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue12()).doubleValue());
338
                                }
339
                                if (e.getName().equals("21")) {
340
                                        data.setLrxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue21()).doubleValue());
341
                                        data.setUrxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue21()).doubleValue());
342
                                }
343
                                if (e.getName().equals("22")) {
344
                                        data.setLryPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue22()).doubleValue());
345
                                        data.setLlyPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue22()).doubleValue());
346
                                }
347
                                data.updateObservers();
348
                        }
349

    
350
                        if (e.getSource() == getCoordinatesPanel().getRealCoordinates()) {
351
                                if (e.getName().equals("11")) {
352
                                        data.setUlxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue11()).doubleValue());
353
                                        data.setLlxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue11()).doubleValue());
354
                                }
355
                                if (e.getName().equals("12")) {
356
                                        data.setUlyWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue12()).doubleValue());
357
                                        data.setUryWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue12()).doubleValue());
358
                                }
359
                                if (e.getName().equals("21")) {
360
                                        data.setLrxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue21()).doubleValue());
361
                                        data.setUrxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue21()).doubleValue());
362
                                }
363
                                if (e.getName().equals("22")) {
364
                                        data.setLryWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue22()).doubleValue());
365
                                        data.setLlyWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue22()).doubleValue());
366
                                }
367
                                data.updateObservers();
368
                        }
369
                } catch (NumberFormatException ex1) {
370
                        // No hay valores parseables a decimal en las cajas de texto. No hacemos nada
371
                }
372
        }
373

    
374
        
375
        /**
376
         * Recalcula el valor de los campos de coordenadas reales y pixel. Cuando modificamos alg?n campo
377
         * de las coordenadas reales se modifican los pixeles y viceversa.
378
         * @param modifyPx true si se ha modificado alg?n campo de coordenadas pixel y false si se ha modificado
379
         * alg?n campo de las coordenadas reales.
380
         */
381
        private void recalcCoordFields(boolean modifyPx) {
382
                try {
383
                        Point2D ulPx = new Point2D.Double(data.getUlxPx(), data.getUlyPx());
384
                        Point2D lrPx = new Point2D.Double(data.getLrxPx(), data.getLryPx());
385
                        Point2D llPx = new Point2D.Double(data.getLlxPx(), data.getLlyPx());
386
                        Point2D urPx = new Point2D.Double(data.getUrxPx(), data.getUryPx());
387
                        
388
                        Point2D ulWc = new Point2D.Double(data.getUlxWc(), data.getUlyWc());
389
                        Point2D lrWc = new Point2D.Double(data.getLrxWc(), data.getLryWc());
390
                        Point2D llWc = new Point2D.Double(data.getLlxWc(), data.getLlyWc());
391
                        Point2D urWc = new Point2D.Double(data.getUrxWc(), data.getUryWc());
392
                        
393
                        if (modifyPx) {
394
                                at.transform(new Point2D.Double(ulPx.getX(), ulPx.getY()), ulWc);
395
                                at.transform(new Point2D.Double(lrPx.getX() + 1, lrPx.getY() + 1), lrWc);
396
                                at.transform(new Point2D.Double(llPx.getX(), llPx.getY() + 1), llWc);
397
                                at.transform(new Point2D.Double(urPx.getX() + 1, urPx.getY()), urWc);
398

    
399
                                data.setCoorReal(ulWc, lrWc, llWc, urWc);
400
                                data.setAffineTransform(at);
401
                                data.initSize();
402

    
403
                                getClippingPanel().saveStatus(data);
404
                        } else {
405
                                try {
406
                                        at.inverseTransform(ulWc, ulPx);
407
                                        at.inverseTransform(lrWc, lrPx);
408
                                        at.inverseTransform(llWc, llPx);
409
                                        at.inverseTransform(urWc, urPx);
410
                                } catch (NoninvertibleTransformException e) {
411
                                        JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "coordenadas_erroneas"));
412
                                        return;
413
                                }
414

    
415
                                //adjustPoints(ulPx, lrPx);
416
                                //adjustPoints(llPx, urPx);
417
                                lrPx = new Point2D.Double(lrPx.getX() - 1, lrPx.getY() - 1);
418
                                llPx = new Point2D.Double(llPx.getX(), llPx.getY() - 1);
419
                                urPx = new Point2D.Double(urPx.getX() - 1, urPx.getY());
420
                                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
421
                                data.setAffineTransform(at);
422
                                data.initSize();
423
                                getClippingPanel().saveStatus(data);
424
                        }
425
                        
426
                        //Condiciones para activar botones. 
427
                        if(activeButtons(ulPx, lrPx, ulWc, lrWc)) {
428
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
429
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
430
                        } else {
431
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(false);
432
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(false);
433
                        }
434
                        
435
                } catch (NumberFormatException ex) {
436
                        return;
437
                }
438

    
439
        }
440
        
441
        public boolean activeButtons(Point2D ulPx, Point2D lrPx, Point2D ulWc, Point2D lrWc) {
442
                if(ulPx.getX() < lrPx.getX() && ulPx.getY() < lrPx.getY() &&
443
                        ulWc.getX() < lrWc.getX() && ulWc.getY() > lrWc.getY() &&
444
                        (lrPx.getX() - ulPx.getX()) >= 2 && (lrPx.getY() - ulPx.getY()) >= 2 &&
445
                        ulPx.getX() >= 0 && ulPx.getY() >= 0 && 
446
                        ((int)lrPx.getX()) <= (fLayer.getDataStore().getWidth() - 1) &&
447
                        ((int)lrPx.getY()) <= (fLayer.getDataStore().getHeight() - 1)) {
448
                        return true;
449
                }
450
                return false;
451
        }
452
        
453
        /**
454
         * Turns world coordinates into entire numbers to avoid rounds errors 
455
         * @param ul
456
         *        Upper left coordinate
457
         * @param lr
458
         *        Lower right coordinate
459
         */
460
        @SuppressWarnings("unused")
461
        private void adjustPoints(Point2D ul, Point2D lr) {
462
                double a = (ul.getX() - (int)ul.getX());
463
                double b = (ul.getY() - (int)ul.getY());
464
                double c = (lr.getX() - (int)lr.getX());
465
                double d = (lr.getY() - (int)lr.getY());
466
                ul.setLocation(        (a > 0.95 || a < 0.05) ? Math.round(ul.getX()) : ul.getX(), 
467
                                                (b > 0.95 || b < 0.05) ? Math.round(ul.getY()) : ul.getY());
468
                lr.setLocation(        (c > 0.95 || c < 0.05) ? Math.round(lr.getX()) : lr.getX(), 
469
                                                (d > 0.95 || d < 0.05) ? Math.round(lr.getY()) : lr.getY());
470
        }
471

    
472
        /**
473
         * Ajusta las coordenadas especificadas en los par?metros al ?rea m?xima
474
         * del raster en p?xeles
475
         * @param req
476
         */
477
        @SuppressWarnings("unused")
478
        private Point2D adjustPixelRequest(Point2D req) {
479
                req.setLocation(Math.max(0, req.getX()), Math.max(0, req.getY()));
480
                req.setLocation(Math.min(dim.width - 1, req.getX()), Math.min(dim.height - 1, req.getY()));
481
                return req;
482
        }
483

    
484
        /**
485
         * Invocaci?n de los eventos de la ventana de <code>DefaultButtonsPanel</code>
486
         */
487
        public void actionButtonPressed(ButtonsPanelEvent e) {
488
                // Bot?n de Aceptar
489
                if (e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
490
                        accept();
491
                        close();
492
                }
493

    
494
                // Bot?n de Aplicar
495
                if (e.getButton() == ButtonsPanel.BUTTON_APPLY)
496
                        accept();
497

    
498
                // Bot?n de Cerrar
499
                if (e.getButton() == ButtonsPanel.BUTTON_CANCEL)
500
                        close();
501

    
502
                getFLayer().getMapContext().invalidate();
503
        }
504

    
505
        /**
506
         * Cerrar la ventana del recorte
507
         */
508
        private void close() {
509
                try {
510
                        if (getLastTool() != null)
511
                                getMapControl().setTool(getLastTool());
512
                        PluginServices.getMDIManager().closeWindow(getClippingPanel().getClippingDialog());
513
                } catch (ArrayIndexOutOfBoundsException ex) {
514
                        // Si la ventana no se puede eliminar no hacemos nada
515
                }
516
        }
517

    
518
        /**
519
         * Obtener el <code>ClippingPanel</code> asociado
520
         * @return ClippingPanel
521
         */
522
        private ClippingPanel getClippingPanel() {
523
                return clippingPanel;
524
        }
525

    
526
        private ClippingCoordinatesPanel getCoordinatesPanel() {
527
                return getClippingPanel().getCoordinatesPanel();
528
        }
529

    
530
        private ClippingResolutionPanel getResolutionPanel() {
531
                return getClippingPanel().getResolutionPanel();
532
        }
533

    
534
        private ClippingOptionsPanel getOptionsPanel() {
535
                return getClippingPanel().getOptionsPanel();
536
        }
537

    
538
        private ClippingSelectionPanel getSelectionPanel() {
539
                return getClippingPanel().getSelectionPanel();
540
        }
541

    
542
        /**
543
         * Acciones realizadas cuando se acepta en el dialogo. Se obtendr?n los datos
544
         * de recorte desde el dialogo, crearemos el objeto ClippingProcess que
545
         * gestiona el recortado, ajustamos el tama?o del grid de salida y procesamos.
546
         */
547
        private void accept() {
548
                if(data.getPxHeight() == 0 || data.getPxWidth() == 0) {
549
                        RasterSwingLibrary.messageBoxError(RasterToolsUtil.getText(this, "wrong_resolution"), null);
550
                        return;
551
                }
552
                
553
                // Controlamos las coordenadas del recorte que no se salgan de la imagen.
554
                // De ser as? mostramos un error
555
                CoordinatesPanel coordinatesReales = getCoordinatesPanel().getRealCoordinates();
556
                double ulx = 0;
557
                double lrx = 0;
558
                double lry = 0;
559
                double uly = 0;
560
                try {
561
                        ulx = Double.parseDouble(coordinatesReales.getValue11());
562
                        lry = Double.parseDouble(coordinatesReales.getValue22());
563
                        lrx = Double.parseDouble(coordinatesReales.getValue21());
564
                        uly = Double.parseDouble(coordinatesReales.getValue12());
565
                        Envelope ext = getFLayer().getFullEnvelope();
566
                        if (((int) ulx) > ((int) ext.getMaximum(0)) || ((int) lrx) < ((int) ext.getMinimum(0)) || ((int) uly) > ((int) ext.getMaximum(1)) || ((int) lry) < ((int) ext.getMinimum(1))) {
567
                                RasterSwingLibrary.messageBoxError(Messages.getText("coordenadas_erroneas"), null);
568
                                return;
569
                        }
570
                } catch (NumberFormatException e) {
571
                        RasterSwingLibrary.messageBoxError(Messages.getText("coordenadas_erroneas"), null);
572
                        return;
573
                }
574

    
575
                // Seleccionamos las bandas que se usaran en el recorte a partir de la tabla
576
                int countBands = 0;
577
                int rowCount = ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getRowCount();
578
                for (int iRow = 0; iRow < rowCount; iRow++)
579
                        if ((((Boolean) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 0))).booleanValue())
580
                                countBands++;
581

    
582
                int[] drawableBands = new int[countBands];
583
                int i = 0;
584
                for (int iRow = 0; iRow < rowCount; iRow++) {
585
                        if ((((Boolean) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 0))).booleanValue()) {
586
                                int row = ((Integer) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 2)).intValue();
587
                                drawableBands[i++] = row;
588
                        }
589
                }
590

    
591
                /**
592
                 * Donde se va a guardar el fichero
593
                 */
594
                String path;
595
                if (getOptionsPanel().getCbSaveFile().isSelected()) {
596
                        path = getOptionsPanel().getDirectoryTextField().getText();
597
                        File f = new File(path);
598
                        if(!f.exists() || !f.canWrite()) {
599
                                RasterSwingLibrary.messageBoxError(Messages.getText("path_not_valid"), null);
600
                                return;
601
                        }
602
                } else
603
                        path = Utilities.createTempDirectory();
604

    
605
                String file = getOptionsPanel().getFilenameTextField().getText();
606
                if (file.compareTo(RasterLocator.getManager().getFileUtils().getOnlyLayerName()) == 0)
607
                        RasterLocator.getManager().getFileUtils().usesOnlyLayerName();
608

    
609
                if (file == "")
610
                        file = "cutlayer";
611

    
612
                String filename = path + File.separator + file;
613

    
614
                if (new File(filename + ".tif").exists())
615
                        if (!RasterSwingLibrary.messageBoxYesOrNot("raster_error_file_exists", getOptionsPanel()))
616
                                return;
617

    
618
                /**
619
                 * Preparacion para la generacion del proceso del recorte
620
                 */
621
                if (getFLayer() == null){
622
                    return;
623
                }
624
                
625
                double[] pxValues = data.getPxCoordinatesToClip();
626
        boolean pxRound = arePixelsRound(pxValues);
627
        double[] wcValues = data.getWcCoordinatesToClip();
628
        
629
        if (getFLayer().getCoordTrans() != null) {
630

    
631
            GeometryManager geometryManager = GeometryLocator.getGeometryManager();
632
            Envelope envelope = null;
633
            Envelope storeEnvelope = null;
634
            Envelope projectedEnvelope = null;
635
            Extent extent = getFLayer().getDataStore().getExtent();
636

    
637
            try {
638
                // Create envelope with coordinates of clip area
639
                envelope =
640
                    geometryManager.createEnvelope(wcValues[0], wcValues[3], wcValues[2],
641
                        wcValues[1], SUBTYPES.GEOM2D);
642

    
643
            } catch (CreateEnvelopeException e) {
644
                String errorMessage =
645
                    String.format("Can not create envelope with [%1d,%1d,%1d,%1d,%1s] parameters",
646
                        wcValues[0], wcValues[3], wcValues[2], wcValues[1], SUBTYPES.GEOM2D);
647
                LOG.error(errorMessage, e);
648

    
649
                ThreadSafeDialogsManager tsdm = ToolsSwingLocator.getThreadSafeDialogsManager();
650
                tsdm.messageDialog("error_cutting", "_error",
651
                    JOptionPane.ERROR_MESSAGE);
652
                return;
653
            }
654
            
655
            // Get envelope of raster store
656
            try {
657
                storeEnvelope =
658
                    geometryManager.createEnvelope(extent.getMin().getX(), extent.getMin().getY(),
659
                        extent.getMax().getX(), extent.getMax().getY(), SUBTYPES.GEOM2D);
660
            } catch (CreateEnvelopeException e) {
661
                String errorMessage =
662
                    String.format("Can not create envelope with [%1d,%1d,%1d,%1d,%1s] parameters",
663
                        extent.getMin().getX(), extent.getMin().getY(), extent.getMax().getX(),
664
                        extent.getMax().getY(), SUBTYPES.GEOM2D);
665
                LOG.error(errorMessage, e);
666

    
667
                ThreadSafeDialogsManager tsdm = ToolsSwingLocator.getThreadSafeDialogsManager();
668
                tsdm.messageDialog("error_cutting", "_error",
669
                    JOptionPane.ERROR_MESSAGE);
670
                return;
671
            }
672
            
673
            // Reproject to store projection using layer coordinate transform 
674
            projectedEnvelope = envelope.convert(getFLayer().getCoordTrans().getInverted());
675
            try {
676
                // Get instersection to fix projected envelope
677
                Geometry intersection =
678
                    projectedEnvelope.getGeometry().intersection(storeEnvelope.getGeometry());
679
                projectedEnvelope = geometryManager.createEnvelope(SUBTYPES.GEOM2D);
680
                projectedEnvelope.add(intersection);
681
            } catch (GeometryOperationNotSupportedException | GeometryOperationException e) {
682
                String errorMessage =
683
                    String.format(
684
                        "Can not intersects [%1s] projected envelope with [%1s] store envelope",
685
                        projectedEnvelope, storeEnvelope);
686
                LOG.error(errorMessage, e);
687

    
688
                ThreadSafeDialogsManager tsdm = ToolsSwingLocator.getThreadSafeDialogsManager();
689
                tsdm.messageDialog("error_cutting", "_error",
690
                    JOptionPane.ERROR_MESSAGE);
691
                return;
692
            } catch (CreateEnvelopeException e) {
693
                String errorMessage =
694
                    String.format("Can not create envelope with [%1s] parameters", SUBTYPES.GEOM2D);
695
                LOG.error(errorMessage, e);
696

    
697
                ThreadSafeDialogsManager tsdm = ToolsSwingLocator.getThreadSafeDialogsManager();
698
                tsdm.messageDialog("error_cutting", "_error",
699
                    JOptionPane.ERROR_MESSAGE);
700
                return;
701
            }
702

    
703
            wcValues[0] = projectedEnvelope.getLowerCorner().getX();
704
            wcValues[3] = projectedEnvelope.getLowerCorner().getY();
705
            wcValues[2] = projectedEnvelope.getUpperCorner().getX();
706
            wcValues[1] = projectedEnvelope.getUpperCorner().getY();
707
        }
708

    
709
                AffineTransform transf = null;
710
                if(pxRound && 
711
                   ((pxValues[2] - pxValues[0]) == data.getPxWidth()) && 
712
                   ((pxValues[3] - pxValues[1]) == data.getPxHeight()))
713
                        transf = new AffineTransform(at.getScaleX(), at.getShearY(), at.getShearX(), at.getScaleY(), wcValues[0], wcValues[1]);
714
                else
715
                        transf = calcAffineTransform(wcValues[0], wcValues[1], wcValues[2], wcValues[3],
716
                                                                                Math.round(data.getPxWidth()), Math.round(data.getPxHeight()), at);
717
                
718

    
719
                int interpMethod = getResolutionPanel().getSelectedInterpolationMethod();
720

    
721
                // Creamos la interpretaci?n de color para el caso de que la salida tenga
722
                // m?s de una banda por fichero. Siempre creamos RED, GREEN y BLUE
723
                String[] ci = new String[drawableBands.length];
724
                for (int j = 0; j < ci.length; j++) {
725
                        switch (j) {
726
                                case 0:
727
                                        if (ci.length >= 3)
728
                                                ci[j] = ColorInterpretation.RED_BAND;
729
                                        else
730
                                                ci[j] = ColorInterpretation.GRAY_BAND;
731
                                        break;
732
                                case 1:
733
                                        if (ci.length >= 3)
734
                                                ci[j] = ColorInterpretation.GREEN_BAND;
735
                                        else
736
                                                ci[j] = ColorInterpretation.UNDEF_BAND;
737
                                        break;
738
                                case 2:
739
                                        ci[j] = ColorInterpretation.BLUE_BAND;
740
                                        break;
741
                                default:
742
                                        ci[j] = ColorInterpretation.UNDEF_BAND;
743
                                        break;
744
                        }
745
                }
746

    
747
                DataProcess clippingProcess = new ClippingProcess();
748
                clippingProcess.setActions(this);
749
                clippingProcess.addParam("viewname", getViewName());
750
                if(pxRound)
751
                        clippingProcess.addParam("pixelcoordinates", pxValues);
752
                else
753
                        clippingProcess.addParam("realcoordinates", wcValues);
754
                clippingProcess.addParam("suffix", ".tif");
755
                clippingProcess.addParam("filename", filename);
756
                clippingProcess.addParam("layer", getFLayer().getDataStore());
757
                clippingProcess.addParam("drawablebands", drawableBands);
758
                clippingProcess.addParam("onelayerperband", new Boolean(getOptionsPanel().getCbOneLyrPerBand().isSelected()));
759
                clippingProcess.addParam("interpolationmethod", new Integer(interpMethod));
760
                clippingProcess.addParam("affinetransform", transf);
761
                clippingProcess.addParam("colorInterpretation",  RasterLocator.getManager().getDataStructFactory().createColorInterpretation(ci));
762
                clippingProcess.addParam("resolution", new int[]{(int) Math.round(data.getPxWidth()),
763
                                                                                                                 (int) Math.round(data.getPxHeight())});
764
                clippingProcess.addParam("viewProjection", mapControl.getProjection());
765
                clippingProcess.start();
766
        }
767

    
768
        /**
769
         * Calcula la matriz de transformaci?n que se usar? para el nuevo raster generado.
770
         * @param ulx Coordenada X real de la esquina superior izquierda
771
         * @param uly Coordenada Y real de la esquina superior izquierda
772
         * @param lrx Coordenada X real de la esquina inferior derecha
773
         * @param lry Coordenada Y real de la esquina inferior derecha
774
         * @param width Ancho en p?xeles del nuevo raster
775
         * @param height Alto en p?xeles del nuevo raster
776
         * @param trans Matriz de transformaci?n de la nueva capa
777
         * @return Matriz de transformaci?n para el nuevo raster
778
         */
779
        private AffineTransform calcAffineTransform(double ulx, double uly, double lrx, double lry,
780
                                                                                                double width, double height, AffineTransform trans) {
781
                Point2D ul = new Point2D.Double(ulx, uly);
782
                Point2D lr = new Point2D.Double(lrx, lry);
783
                try {
784
                        trans.inverseTransform(ul, ul);
785
                        trans.inverseTransform(lr, lr);
786
                } catch (NoninvertibleTransformException e) {
787
                        JOptionPane.showMessageDialog(null, RasterToolsUtil.getText(this, "coordenadas_erroneas"));
788
                        return new AffineTransform();
789
                }
790
                double w = Math.abs(lr.getX() - ul.getX());
791

    
792
                Point2D ur = new Point2D.Double(ul.getX() + w, ul.getY());
793
                Point2D ll = new Point2D.Double(lr.getX() - w, lr.getY() );
794

    
795
                //Obtenemos la georreferenciaci?n de las cuatro esquinas del nuevo raster
796
                trans.transform(ul, ul);
797
                trans.transform(ur, ur);
798
                trans.transform(lr, lr);
799
                trans.transform(ll, ll);
800

    
801
                double pixelSizeX = (lrx - ulx) / width;
802
                double pixelSizeY = (lry - uly) / height;
803
                double rotX = trans.getShearX();
804
                double rotY = trans.getShearY();
805
                return new AffineTransform(pixelSizeX, rotY, rotX, pixelSizeY, ulx, uly);
806
        }
807
        
808
        /**
809
         * Returns true if the pixels are round
810
         * @param pxValues
811
         * @return
812
         */
813
        private boolean arePixelsRound(double[] pxValues) {
814
                if((((int)pxValues[0]) - pxValues[0]) == 0 &&
815
                   (((int)pxValues[1]) - pxValues[1]) == 0 &&
816
                   (((int)pxValues[2]) - pxValues[2]) == 0 &&
817
                   (((int)pxValues[3]) - pxValues[3]) == 0) {
818
                        return true;
819
                }
820
                return false;
821
        }
822

    
823
        public boolean cancelDrawing() {
824
                return false;
825
        }
826

    
827
        public Cursor getCursor() {
828
                return null;
829
        }
830

    
831
        public void actionValueChanged(CoordinatesEvent e) {
832
                if (e.getSource() == getCoordinatesPanel().getPixelCoordinates()) {
833
                        eventJTextField(e);
834
                        if (e.getName().equals("11") || 
835
                                e.getName().equals("12") || 
836
                                e.getName().equals("21") ||
837
                                e.getName().equals("22"))
838
                                recalcCoordFields(true);
839
                        
840
                }
841
                if (e.getSource() == getCoordinatesPanel().getRealCoordinates()) {
842
                        eventJTextField(e);
843
                        if (e.getName().equals("11") || 
844
                                e.getName().equals("12") || 
845
                                e.getName().equals("21") || 
846
                                e.getName().equals("22"))
847
                                recalcCoordFields(false);
848
                }
849
        }
850

    
851
        public void actionValueChanged(EventObject e) {
852
                if(!enableValueChangedEvent)
853
                        return;
854

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

    
857
                if (e.getSource() == getResolutionPanel().getCCellSize().getDataInputField()) {
858
                        // Cambiamos PS ==> wPx=wWC/PS & hPx=wPx/rel
859
                        double ps = 0;
860
                        try {
861
                                ps = Double.parseDouble(getResolutionPanel().getCCellSize().getValue());
862
                        } catch (NumberFormatException ex) {
863
                                return;
864
                        }
865
                        data.setPxWidth(data.getWcWidth() / ps);
866
                        data.setPxHeight(data.getWcHeight() / ps);
867
                        data.updateObservers();
868
                } else if (e.getSource() == getResolutionPanel().getCWidth().getDataInputField()) {
869
                        // Cambiamos wPx ==> hPx=wPx/rel & PS=wWC/wPx
870
                        double wPx = 0;
871
                        try {
872
                                wPx = Double.parseDouble(getResolutionPanel().getCWidth().getValue());
873
                        } catch (NumberFormatException ex) {
874
                                return;
875
                        }
876
                        data.setPxWidth(wPx);
877
                        data.setPxHeight(Math.round(wPx / data.getRatio()));
878
                        data.updateObservers();
879
                } else if (e.getSource() == getResolutionPanel().getCHeight().getDataInputField()) {
880
                        // Cambiamos hPx ==> wPx=rel*wPx & PS=hWC/hPx
881
                        double hPx = 0;
882
                        try {
883
                                hPx = Double.parseDouble(getResolutionPanel().getCHeight().getValue());
884
                        } catch (NumberFormatException ex) {
885
                                return;
886
                        }
887
                        data.setPxHeight(hPx);
888
                        data.setPxWidth(Math.round(Math.round(hPx * data.getRatio())));
889
                        data.updateObservers();
890
                }
891
                enableValueChangedEvent = true;
892
        }
893

    
894
        /**
895
         * Asigna el valor para la activaci?n y desactivaci?n del evento de cambio de valor en
896
         * las cajas de texto.
897
         * @param enableValueChangedEvent
898
         */
899
        public void setEnableValueChangedEvent(boolean enableValueChangedEvent) {
900
                this.enableValueChangedEvent = enableValueChangedEvent;
901
        }
902

    
903
        public void end(Object params) {
904
                if(        params instanceof Object[] &&
905
                        ((Object[])params).length == 2 &&
906
                        ((Object[])params)[0] instanceof String &&
907
                        ((Object[])params)[1] instanceof Long) {
908

    
909
                        String fName = (String)((Object[])params)[0];
910
                        long milis = ((Long)((Object[])params)[1]).longValue();
911

    
912
                        RasterSwingLocator.getSwingManager().showSummaryProcessDialog(fName, milis);
913
                }
914
        }
915

    
916
        /**
917
         * Obtener la capa de un raster.
918
         * @return
919
         */
920
        public FLyrRaster getFLayer() {
921
                return fLayer;
922
        }
923

    
924
        /**
925
         * Obtiene la ultima herramienta seleccionada antes de cargar el recorte
926
         * @return
927
         */
928
        public String getLastTool() {
929
                return lastTool;
930
        }
931

    
932
        /**
933
         * Obtiene el nombre de la vista
934
         * @return
935
         */
936
        public String getViewName() {
937
                return viewName;
938
        }
939

    
940
        /**
941
         * Establecer la capa para usarla en el recorte
942
         * @param fLayer
943
         */
944
        public void setLayer(FLyrRaster fLayer) {
945
                this.fLayer = fLayer;
946
                AbstractViewPanel view = (AbstractViewPanel) PluginServices.getMDIManager().getActiveWindow();
947
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
948
                mapControl = view.getMapControl();
949

    
950
                lastTool = mapControl.getCurrentTool();
951

    
952
                // Listener de eventos de movimiento que pone las coordenadas del rat?n en
953
                // la barra de estado
954
                StatusBarListener sbl = new StatusBarListener(mapControl);
955

    
956
                // Cortar Raster
957
                ClippingMouseViewListener clippingMouseViewListener = new ClippingMouseViewListener(mapControl, getClippingPanel(), data, fLayer);
958
                mapControl.addBehavior("cutRaster", new Behavior[] {
959
                                new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl)
960
                        }
961
                );
962

    
963
                getSelectionPanel().setLayer(fLayer);
964

    
965
                // Obtener la extension completa de la capa
966

    
967
                setAffineTransform(fLayer.getAffineTransform());
968
                setDimension(new Dimension((int)fLayer.getDataStore().getWidth(), (int)fLayer.getDataStore().getHeight()));
969
                
970
                //Limitaciones del recorte para un servicio remoto
971
                //1-Interpolaci?n deshabilitada. Se hace la petici?n al servidor de los pixeles que queramos
972
                //2-No se pueden intercambiar bandas. Puede hacerse a posteriori cuando ya est? en disco
973
                //3-No se puede seleccionar por coordenadas pixel. Si la fuente es WebMapService puede no tener resoluci?n 
974
                //en pixeles por lo que puede no tener sentido este tipo de selecci?n
975
                if(getFLayer().isRemote()) {
976
                        getResolutionPanel().getComboInterpolation().setEnabled(false);
977
                        getClippingPanel().removeTab(getSelectionPanel());
978
                        getCoordinatesPanel().getPixelCoordinates().setVisible(false);
979
                }
980
        }
981

    
982
        /**
983
         * Acciones que se realizan para seleccionar la tool CutRaster
984
         */
985
        public void selectToolButton() {
986
                // seleccionamos la vista de gvSIG
987
                org.gvsig.app.project.documents.view.gui.AbstractViewPanel theView = null;
988
                try {
989
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
990
                        for (int i = 0; i < allViews.length; i++) {
991
                                if (allViews[i] instanceof org.gvsig.app.project.documents.view.gui.AbstractViewPanel
992
                                                && PluginServices.getMDIManager().getWindowInfo((AbstractViewPanel) allViews[i])
993
                                                                .getTitle().equals(viewName))
994
                                        theView = (org.gvsig.app.project.documents.view.gui.AbstractViewPanel) allViews[i];
995
                        }
996
                        if (theView == null)
997
                                return;
998
                } catch (ClassCastException ex) {
999
                        // RasterToolsUtil.messageBoxError("cant_get_view "), this, ex);
1000
                        return;
1001
                }
1002
                MapControl m_MapControl = theView.getMapControl();
1003

    
1004
                // Listener de eventos de movimiento que pone las coordenadas del rat?n en
1005
                // la barra de estado
1006
                //StatusBarListener sbl = new StatusBarListener(m_MapControl);
1007

    
1008
                // Cortar Raster
1009
                /*ClippingMouseViewListener clippingMouseViewListener = new ClippingMouseViewListener(m_MapControl, getClippingPanel(), data, getFLayer());
1010
                m_MapControl.addMapTool("cutRaster", new Behavior[] {
1011
                                new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl)
1012
                                }
1013
                );*/
1014

    
1015
                m_MapControl.setTool("clipRaster");
1016
        }
1017

    
1018
        /**
1019
         * Obtiene el <code>MapControl</code> de gvSIG
1020
         * @return <code>MapControl</code>
1021
         */
1022
        public MapControl getMapControl() {
1023
                return mapControl;
1024
        }
1025

    
1026

    
1027
        public void rectangle(EnvelopeEvent event) throws BehaviorException {}
1028
        public void interrupted() {}
1029

    
1030
        public Image getImageCursor() {
1031
                return null;
1032
        }
1033

    
1034
        public void updateProgress(int current, int total) {
1035
                
1036
        }
1037
}