Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / clipping / ui / listener / ClippingPanelListener.java @ 30916

History | View | Annotate | Download (31.2 KB)

1 11352 bsanchez
/* 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 14827 bsanchez
package org.gvsig.rastertools.clipping.ui.listener;
20 11352 bsanchez
21
import java.awt.Component;
22
import java.awt.Cursor;
23 12807 nacho
import java.awt.Dimension;
24 11352 bsanchez
import java.awt.event.ActionEvent;
25
import java.awt.event.ActionListener;
26 12793 nacho
import java.awt.geom.AffineTransform;
27 12807 nacho
import java.awt.geom.NoninvertibleTransformException;
28
import java.awt.geom.Point2D;
29 11352 bsanchez
import java.awt.geom.Rectangle2D;
30
import java.io.File;
31 19930 nbrodin
import java.util.ArrayList;
32 13557 bsanchez
import java.util.EventObject;
33 11352 bsanchez
34
import javax.swing.JOptionPane;
35
36 12425 nacho
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
37 11352 bsanchez
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
38
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
39
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelListener;
40 13557 bsanchez
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 11352 bsanchez
import org.gvsig.gui.beans.table.models.CheckBoxModel;
45 18538 nbrodin
import org.gvsig.raster.IProcessActions;
46 18962 nbrodin
import org.gvsig.raster.RasterLibrary;
47 18538 nbrodin
import org.gvsig.raster.RasterProcess;
48 18857 nbrodin
import org.gvsig.raster.buffer.WriterBufferServer;
49 18042 nbrodin
import org.gvsig.raster.dataset.properties.DatasetColorInterpretation;
50 12383 nacho
import org.gvsig.raster.datastruct.Extent;
51 19930 nbrodin
import org.gvsig.raster.grid.roi.ROI;
52 21044 nbrodin
import org.gvsig.raster.hierarchy.IRasterGeoOperations;
53
import org.gvsig.raster.hierarchy.IRasterOperations;
54 17804 nbrodin
import org.gvsig.raster.util.RasterToolsUtil;
55 19568 bsanchez
import org.gvsig.raster.util.process.ClippingProcess;
56 21015 nbrodin
import org.gvsig.rastertools.clipping.ClippingData;
57 14829 bsanchez
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 14827 bsanchez
import org.gvsig.rastertools.clipping.ui.ClippingPanel;
62 21684 bsanchez
import org.gvsig.rastertools.saveraster.ui.info.EndInfoDialog;
63 11352 bsanchez
64
import com.iver.andami.PluginServices;
65
import com.iver.andami.Utilities;
66 21044 nbrodin
import com.iver.andami.ui.mdiManager.IWindow;
67
import com.iver.cit.gvsig.fmap.MapControl;
68 11352 bsanchez
import com.iver.cit.gvsig.fmap.tools.BehaviorException;
69 21044 nbrodin
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 11352 bsanchez
import com.iver.cit.gvsig.fmap.tools.Events.RectangleEvent;
73
import com.iver.cit.gvsig.fmap.tools.Listeners.RectangleListener;
74 25061 nbrodin
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
75 21044 nbrodin
import com.iver.cit.gvsig.project.documents.view.gui.View;
76
import com.iver.cit.gvsig.project.documents.view.toolListeners.StatusBarListener;
77 11352 bsanchez
/**
78 14846 bsanchez
 * <code>ClippingPanelListener</code> es una clase donde se recoger?n y
79 11408 bsanchez
 * tratar?n todos los eventos del panel de recorte
80 12369 bsanchez
 *
81 11352 bsanchez
 * @version 19/04/2007
82 12369 bsanchez
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
83 11352 bsanchez
 */
84 14829 bsanchez
public class ClippingPanelListener implements ActionListener, RectangleListener, ButtonsPanelListener, CoordinatesListener, DataInputContainerListener, IProcessActions {
85 24783 nbrodin
        private Dimension             dim                     = new Dimension();
86
        private AffineTransform       at                      = null;
87
        private ClippingPanel         clippingPanel           = null;
88
        private ClippingData          data                    = null;
89
        private boolean               enableValueChangedEvent = true;
90 21684 bsanchez
91 24783 nbrodin
        private FLyrRasterSE          fLayer                  = null;
92
        private MapControl            mapControl              = null;
93 21684 bsanchez
94 15929 bsanchez
        /**
95 21044 nbrodin
         * Herramienta seleccionada en el momento de la apertura del dialogo
96
         */
97 24783 nbrodin
        private String                 lastTool                = null;
98 21044 nbrodin
99 24783 nbrodin
        private String                 viewName                = null;
100 21044 nbrodin
101 24783 nbrodin
        private static ClippingData    lastDataSaved           = null;
102
103 21044 nbrodin
        /**
104 14846 bsanchez
         * Crea un nuevo <code>ClippingPanelListener</code> con el
105
         * <code>ClippingPanelListener</code> asociado
106 14071 bsanchez
         * @param panel
107
         */
108 14846 bsanchez
        public ClippingPanelListener(ClippingPanel clippingPanel) {
109
                this.clippingPanel = clippingPanel;
110 14071 bsanchez
        }
111 21044 nbrodin
112
        /**
113
         * Asigna el modelo de datos
114
         * @param data
115
         */
116
        public void setData(ClippingData data) {
117
                this.data = data;
118
        }
119 11408 bsanchez
120 15929 bsanchez
        /**
121 14089 bsanchez
         * Asigna la matriz de transformaci?n entre puntos en coordenadas del raster y
122
         * puntos en coordenadas reales.
123 14071 bsanchez
         * @param AffineTransform
124
         */
125 21044 nbrodin
        private void setAffineTransform(AffineTransform at) {
126 15929 bsanchez
                this.at = at;
127
        }
128 13021 bsanchez
129 15929 bsanchez
        /**
130
         * Asigna la dimensi?n del raster
131
         * @param dim
132
         */
133
        public void setDimension(Dimension dim) {
134
                this.dim = dim;
135
        }
136 11897 bsanchez
137 15929 bsanchez
        /**
138
         * M?todo que se invoca cuando se disparan los eventos de los botones de
139
         * extensi?n completa o de seleccion de extensi?n con el rat?n
140
         */
141 29747 nbrodin
        @SuppressWarnings("unchecked")
142 15929 bsanchez
        public void actionPerformed(ActionEvent e) {
143
                // Bot?n de selecci?n del extent completo
144
                // Modificamos las coordenadas reales y recalculamos las coordenadas pixel
145
                if (e.getSource() == getResolutionPanel().getButtonRestore()) {
146 21044 nbrodin
                        getClippingPanel().restoreStatus(data);
147 15929 bsanchez
                }
148 19930 nbrodin
149 24783 nbrodin
                //Load parameters
150
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(0)) {
151
                        if(lastDataSaved != null) {
152
                                data = (ClippingData)lastDataSaved.clone();
153
                                data.addObserver(getClippingPanel());
154
                                data.updateObservers();
155
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
156
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
157
                        } else
158
                                RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "no_data_saved"), null);
159
                }
160
161
                //Save parameters
162
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(1)) {
163
                        lastDataSaved = (ClippingData)data.clone();
164
                }
165
166 19930 nbrodin
                //Bot?n de selecci?n del ?rea m?xima asociada a los ROIs
167 24783 nbrodin
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(2)) {
168 21044 nbrodin
                        ArrayList roiList = getFLayer().getRois();
169
                        if(roiList != null && roiList.size() > 0) {
170 21737 nbrodin
                                Extent ext = ROI.getROIsMaximunExtent(roiList);
171 21044 nbrodin
                                assignROISExtent(ext, getFLayer());
172
                        } else
173
                                assignFullExtent();
174 19930 nbrodin
                        return;
175
                }
176 14071 bsanchez
177 15929 bsanchez
                // Bot?n de selecci?n del extent completo
178
                // Modificamos las coordenadas reales y recalculamos las coordenadas pixel
179 24783 nbrodin
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(3)) {
180 19930 nbrodin
                        assignFullExtent();
181 15929 bsanchez
                        return;
182
                }
183 13021 bsanchez
184 15929 bsanchez
                // Bot?n de selecci?n de la herramienta de seleccionar desde la vista
185 24783 nbrodin
                if (e.getSource() == getCoordinatesPanel().getButtonBarContainer().getButton(4)) {
186 21044 nbrodin
                        selectToolButton();
187 15929 bsanchez
                        return;
188
                }
189 19930 nbrodin
190 15929 bsanchez
        }
191 19930 nbrodin
192
        /**
193
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
194
         * reales y p?xel.
195
         */
196
        private void assignROISExtent(Extent ext, FLyrRasterSE layer) {
197
                AffineTransform at = layer.getAffineTransform();
198 21015 nbrodin
                Point2D ulWc = new Point2D.Double(ext.minX(), ext.maxY());
199
                Point2D lrWc = new Point2D.Double(ext.maxX(), ext.minY());
200 23612 nbrodin
                Point2D llWc = new Point2D.Double(ext.minX(), ext.minY());
201
                Point2D urWc = new Point2D.Double(ext.maxX(), ext.maxY());
202 19930 nbrodin
203 21737 nbrodin
                ulWc = getFLayer().adjustWorldRequest(ulWc);
204
                lrWc = getFLayer().adjustWorldRequest(lrWc);
205 23612 nbrodin
                llWc = getFLayer().adjustWorldRequest(llWc);
206
                urWc = getFLayer().adjustWorldRequest(urWc);
207 21015 nbrodin
208
                Point2D ulPx = new Point2D.Double();
209
                Point2D lrPx = new Point2D.Double();
210 23612 nbrodin
                Point2D llPx = new Point2D.Double();
211
                Point2D urPx = new Point2D.Double();
212 21015 nbrodin
213 19930 nbrodin
                try {
214 21015 nbrodin
                        at.inverseTransform(ulWc, ulPx);
215
                        at.inverseTransform(lrWc, lrPx);
216 23612 nbrodin
                        at.inverseTransform(ulWc, llPx);
217
                        at.inverseTransform(lrWc, urPx);
218 19930 nbrodin
                } catch (NoninvertibleTransformException e) {
219
                        JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "coordenadas_erroneas"));
220
                        return;
221
                }
222 14089 bsanchez
223 23612 nbrodin
                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
224
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
225
                data.setAffineTransform(at);
226 21015 nbrodin
                data.initSize();
227 21044 nbrodin
                getClippingPanel().saveStatus(data);
228 19930 nbrodin
229
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
230
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
231
        }
232
233 15929 bsanchez
        /**
234 19930 nbrodin
         * Asigna el extent completo a los cuadros de texto donde se introducen las coordenadas
235
         * reales y p?xel.
236
         */
237
        private void assignFullExtent() {
238
                Point2D ulPx = new Point2D.Double(0, 0);
239
                Point2D lrPx = new Point2D.Double(dim.width, dim.height);
240 23612 nbrodin
                Point2D urPx = new Point2D.Double(dim.width, 0);
241
                Point2D llPx = new Point2D.Double(0, dim.height);
242 19930 nbrodin
243
                //Convertimos nuevamente a coordenadas reales
244
                Point2D ulWc = new Point2D.Double();
245
                Point2D lrWc = new Point2D.Double();
246 23612 nbrodin
                Point2D urWc = new Point2D.Double();
247
                Point2D llWc = new Point2D.Double();
248 21015 nbrodin
                at.transform(ulPx, ulWc);
249
                at.transform(lrPx, lrWc);
250 23612 nbrodin
                at.transform(urPx, urWc);
251
                at.transform(llPx, llWc);
252 19930 nbrodin
253 23612 nbrodin
                ulPx = new Point2D.Double(0, 0);
254
                lrPx = new Point2D.Double(dim.width - 1, dim.height - 1);
255
                urPx = new Point2D.Double(dim.width - 1, 0);
256
                llPx = new Point2D.Double(0, dim.height - 1);
257
258
                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
259
                data.setCoorReal(ulWc, lrWc, llWc, urWc);
260
                data.setAffineTransform(at);
261 21015 nbrodin
                data.initSize();
262 23612 nbrodin
263 21044 nbrodin
                getClippingPanel().saveStatus(data);
264 19930 nbrodin
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
265
                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
266
        }
267 21737 nbrodin
268 19930 nbrodin
        /**
269 15929 bsanchez
         * Al producirse un evento de perdida de foco o pulsaci?n de "enter" en un campo de texto de coordenadas
270
         * hay que asignar el nuevo valor introducido.
271
         * @param obj
272
         */
273
        private void eventJTextField(CoordinatesEvent e) {
274
                try {
275 21538 nbrodin
                        if (e.getSource() == getCoordinatesPanel().getPixelCoordinates()) {
276 29747 nbrodin
                                if (e.getName().equals("11")) {
277 21538 nbrodin
                                        data.setUlxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue11()).doubleValue());
278 29747 nbrodin
                                        data.setLlxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue11()).doubleValue());
279
                                }
280
                                if (e.getName().equals("12")) {
281 21538 nbrodin
                                        data.setUlyPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue12()).doubleValue());
282 29747 nbrodin
                                        data.setUryPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue12()).doubleValue());
283
                                }
284
                                if (e.getName().equals("21")) {
285 21538 nbrodin
                                        data.setLrxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue21()).doubleValue());
286 29747 nbrodin
                                        data.setUrxPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue21()).doubleValue());
287
                                }
288
                                if (e.getName().equals("22")) {
289 21538 nbrodin
                                        data.setLryPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue22()).doubleValue());
290 29747 nbrodin
                                        data.setLlyPx(Double.valueOf(getCoordinatesPanel().getPixelCoordinates().getValue22()).doubleValue());
291
                                }
292 21015 nbrodin
                                data.updateObservers();
293 13557 bsanchez
                        }
294 13021 bsanchez
295 21538 nbrodin
                        if (e.getSource() == getCoordinatesPanel().getRealCoordinates()) {
296 13557 bsanchez
                                if (e.getName().equals("11"))
297 21538 nbrodin
                                        data.setUlxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue11()).doubleValue());
298 13557 bsanchez
                                if (e.getName().equals("12"))
299 21538 nbrodin
                                        data.setUlyWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue12()).doubleValue());
300 13557 bsanchez
                                if (e.getName().equals("21"))
301 21538 nbrodin
                                        data.setLrxWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue21()).doubleValue());
302 13557 bsanchez
                                if (e.getName().equals("22"))
303 21538 nbrodin
                                        data.setLryWc(Double.valueOf(getCoordinatesPanel().getRealCoordinates().getValue22()).doubleValue());
304 21015 nbrodin
                                data.updateObservers();
305 15929 bsanchez
                        }
306 13557 bsanchez
                } catch (NumberFormatException ex1) {
307
                        // No hay valores parseables a decimal en las cajas de texto. No hacemos nada
308 11352 bsanchez
                }
309 15929 bsanchez
        }
310 11897 bsanchez
311 15929 bsanchez
        /**
312
         * Recalcula el valor de los campos de coordenadas reales y pixel. Cuando modificamos alg?n campo
313
         * de las coordenadas reales se modifican los pixeles y viceversa.
314
         * @param modifyPx true si se ha modificado alg?n campo de coordenadas pixel y false si se ha modificado
315
         * alg?n campo de las coordenadas reales.
316
         */
317
        private void recalcCoordFields(boolean modifyPx) {
318 21015 nbrodin
                try {
319
                        getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(false);
320
                        getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(false);
321 15680 bsanchez
322 21015 nbrodin
                        if (modifyPx) {
323
                                Point2D ulPx = new Point2D.Double(data.getUlxPx(), data.getUlyPx());
324
                                Point2D lrPx = new Point2D.Double(data.getLrxPx(), data.getLryPx());
325 23612 nbrodin
                                Point2D llPx = new Point2D.Double(data.getLlxPx(), data.getLlyPx());
326
                                Point2D urPx = new Point2D.Double(data.getUrxPx(), data.getUryPx());
327 11352 bsanchez
328 21015 nbrodin
                                //Comprobamos que las esquinas no esten cambiadas de sitio
329
                                if(ulPx.getX() > lrPx.getX()) {
330
                                        double ulTmp = ulPx.getX();
331
                                        ulPx.setLocation(lrPx.getX(), ulPx.getY());
332
                                        lrPx.setLocation(ulTmp, lrPx.getY());
333
                                }
334
                                if(ulPx.getY() > lrPx.getY()) {
335
                                        double ulTmp = ulPx.getY();
336
                                        ulPx.setLocation(ulPx.getX(), lrPx.getY());
337
                                        lrPx.setLocation(lrPx.getX(), ulTmp);
338
                                }
339
340
                                //Ajustamos la selecci?n al ?rea
341
                                ulPx = adjustPixelRequest(ulPx);
342
                                lrPx = adjustPixelRequest(lrPx);
343 11897 bsanchez
344 21015 nbrodin
                                Point2D ulWc = new Point2D.Double();
345
                                Point2D lrWc = new Point2D.Double();
346 23612 nbrodin
                                Point2D llWc = new Point2D.Double();
347
                                Point2D urWc = new Point2D.Double();
348 21015 nbrodin
                                at.transform(ulPx, ulWc);
349 30916 nbrodin
                                /*at.transform(new Point2D.Double(lrPx.getX() + 1, lrPx.getY() + 1), lrWc);
350 23612 nbrodin
                                at.transform(new Point2D.Double(llPx.getX(), llPx.getY() + 1), llWc);
351 30916 nbrodin
                                at.transform(new Point2D.Double(urPx.getX() + 1, urPx.getY()), urWc);*/
352
                                at.transform(lrPx, lrWc);
353
                                at.transform(llPx, llWc);
354
                                at.transform(urPx, urWc);
355 11897 bsanchez
356 23612 nbrodin
                                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
357
                                data.setCoorReal(ulWc, lrWc, llWc, urWc);
358
                                data.setAffineTransform(at);
359 21015 nbrodin
                                data.initSize();
360 23612 nbrodin
361 21044 nbrodin
                                getClippingPanel().saveStatus(data);
362 21015 nbrodin
363
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
364
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
365
                        } else {
366
                                Point2D ulWc = new Point2D.Double(data.getUlxWc(), data.getUlyWc());
367
                                Point2D lrWc = new Point2D.Double(data.getLrxWc(), data.getLryWc());
368 23612 nbrodin
                                Point2D llWc = new Point2D.Double(data.getLlxWc(), data.getLlyWc());
369
                                Point2D urWc = new Point2D.Double(data.getUrxWc(), data.getUryWc());
370 21015 nbrodin
371
                                //Ajustamos la selecci?n al ?rea
372 21737 nbrodin
                                ulWc = getFLayer().adjustWorldRequest(ulWc);
373
                                lrWc = getFLayer().adjustWorldRequest(lrWc);
374 23612 nbrodin
                                llWc = getFLayer().adjustWorldRequest(llWc);
375
                                urWc = getFLayer().adjustWorldRequest(urWc);
376 21015 nbrodin
377
                                Point2D ulPx = new Point2D.Double();
378
                                Point2D lrPx = new Point2D.Double();
379 23612 nbrodin
                                Point2D llPx = new Point2D.Double();
380
                                Point2D urPx = new Point2D.Double();
381 21015 nbrodin
382
                                try {
383
                                        at.inverseTransform(ulWc, ulPx);
384
                                        at.inverseTransform(lrWc, lrPx);
385 23612 nbrodin
                                        at.inverseTransform(llWc, llPx);
386
                                        at.inverseTransform(urWc, urPx);
387 21015 nbrodin
                                } catch (NoninvertibleTransformException e) {
388
                                        JOptionPane.showMessageDialog((Component) PluginServices.getMainFrame(), PluginServices.getText(this, "coordenadas_erroneas"));
389
                                        return;
390 15929 bsanchez
                                }
391 21015 nbrodin
392 30916 nbrodin
                                adjustPoints(ulPx, lrPx);
393
                                adjustPoints(llPx, urPx);
394 23612 nbrodin
                                data.setCoorPixel(ulPx, lrPx, llPx, urPx);
395
                                data.setCoorReal(ulWc, lrWc, llWc, urWc);
396
                                data.setAffineTransform(at);
397 21015 nbrodin
                                data.initSize();
398 21044 nbrodin
                                getClippingPanel().saveStatus(data);
399 21015 nbrodin
400
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY).setEnabled(true);
401
                                getClippingPanel().getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT).setEnabled(true);
402 15929 bsanchez
                        }
403 21015 nbrodin
                } catch (NumberFormatException ex) {
404
                        return;
405 15929 bsanchez
                }
406 13021 bsanchez
407 15929 bsanchez
        }
408 30916 nbrodin
409
        /**
410
         * Turns world coordinates into entire numbers to avoid rounds errors
411
         * @param ul
412
         *        Upper left coordinate
413
         * @param lr
414
         *        Lower right coordinate
415
         */
416
        private void adjustPoints(Point2D ul, Point2D lr) {
417
                double a = (ul.getX() - (int)ul.getX());
418
                double b = (ul.getY() - (int)ul.getY());
419
                double c = (lr.getX() - (int)lr.getX());
420
                double d = (lr.getY() - (int)lr.getY());
421
                ul.setLocation(        (a > 0.95 || a < 0.05) ? Math.round(ul.getX()) : ul.getX(),
422
                                                (b > 0.95 || b < 0.05) ? Math.round(ul.getY()) : ul.getY());
423
                lr.setLocation(        (c > 0.95 || c < 0.05) ? Math.round(lr.getX()) : lr.getX(),
424
                                                (d > 0.95 || d < 0.05) ? Math.round(lr.getY()) : lr.getY());
425
        }
426 12807 nacho
427 15929 bsanchez
        /**
428 21015 nbrodin
         * Ajusta las coordenadas especificadas en los par?metros al ?rea m?xima
429
         * del raster en p?xeles
430
         * @param req
431 15929 bsanchez
         */
432 21015 nbrodin
        private Point2D adjustPixelRequest(Point2D req) {
433
                req.setLocation(Math.max(0, req.getX()), Math.max(0, req.getY()));
434 30916 nbrodin
                req.setLocation(Math.min(dim.width, req.getX()), Math.min(dim.height, req.getY()));
435 21015 nbrodin
                return req;
436 15929 bsanchez
        }
437 21015 nbrodin
438 15929 bsanchez
        /**
439
         * Invocaci?n de los eventos de la ventana de <code>DefaultButtonsPanel</code>
440
         */
441
        public void actionButtonPressed(ButtonsPanelEvent e) {
442
                // Bot?n de Aceptar
443
                if (e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
444
                        accept();
445
                        close();
446
                }
447 13134 bsanchez
448 15929 bsanchez
                // Bot?n de Aplicar
449 17804 nbrodin
                if (e.getButton() == ButtonsPanel.BUTTON_APPLY)
450 15929 bsanchez
                        accept();
451 11352 bsanchez
452 15929 bsanchez
                // Bot?n de Cerrar
453 17804 nbrodin
                if (e.getButton() == ButtonsPanel.BUTTON_CANCEL)
454 15929 bsanchez
                        close();
455 13134 bsanchez
456 21044 nbrodin
                getFLayer().getMapContext().invalidate();
457 15929 bsanchez
        }
458 11384 bsanchez
459 15929 bsanchez
        /**
460
         * Cerrar la ventana del recorte
461
         */
462
        private void close() {
463
                try {
464 21044 nbrodin
                        if (getLastTool() != null)
465
                                getMapControl().setTool(getLastTool());
466 15929 bsanchez
                        PluginServices.getMDIManager().closeWindow(getClippingPanel().getClippingDialog());
467
                } catch (ArrayIndexOutOfBoundsException ex) {
468
                        // Si la ventana no se puede eliminar no hacemos nada
469
                }
470
        }
471 11897 bsanchez
472 15929 bsanchez
        /**
473
         * Obtener el <code>ClippingPanel</code> asociado
474
         * @return ClippingPanel
475
         */
476
        private ClippingPanel getClippingPanel() {
477
                return clippingPanel;
478
        }
479
480
        private ClippingCoordinatesPanel getCoordinatesPanel() {
481 14846 bsanchez
                return getClippingPanel().getCoordinatesPanel();
482 14097 bsanchez
        }
483 15929 bsanchez
484 14829 bsanchez
        private ClippingResolutionPanel getResolutionPanel() {
485 14846 bsanchez
                return getClippingPanel().getResolutionPanel();
486 14097 bsanchez
        }
487 15929 bsanchez
488 14829 bsanchez
        private ClippingOptionsPanel getOptionsPanel() {
489 14846 bsanchez
                return getClippingPanel().getOptionsPanel();
490 14097 bsanchez
        }
491 15929 bsanchez
492 14829 bsanchez
        private ClippingSelectionPanel getSelectionPanel() {
493 14846 bsanchez
                return getClippingPanel().getSelectionPanel();
494 14097 bsanchez
        }
495 11352 bsanchez
496 15929 bsanchez
        /**
497
         * Acciones realizadas cuando se acepta en el dialogo. Se obtendr?n los datos
498
         * de recorte desde el dialogo, crearemos el objeto ClippingProcess que
499
         * gestiona el recortado, ajustamos el tama?o del grid de salida y procesamos.
500
         */
501
        private void accept() {
502
                // Controlamos las coordenadas del recorte que no se salgan de la imagen.
503
                // De ser as? mostramos un error
504 21538 nbrodin
                CoordinatesPanel coordinatesReales = getCoordinatesPanel().getRealCoordinates();
505 15929 bsanchez
                double ulx = 0;
506
                double lrx = 0;
507
                double lry = 0;
508
                double uly = 0;
509
                try {
510
                        ulx = Double.parseDouble(coordinatesReales.getValue11());
511
                        lry = Double.parseDouble(coordinatesReales.getValue22());
512
                        lrx = Double.parseDouble(coordinatesReales.getValue21());
513
                        uly = Double.parseDouble(coordinatesReales.getValue12());
514 21044 nbrodin
                        Rectangle2D ext = getFLayer().getFullExtent();
515 20610 bsanchez
                        if (((int) ulx) > ((int) ext.getMaxX()) || ((int) lrx) < ((int) ext.getMinX()) || ((int) uly) > ((int) ext.getMaxY()) || ((int) lry) < ((int) ext.getMinY())) {
516 23612 nbrodin
                                RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "coordenadas_erroneas"), null);
517 15929 bsanchez
                                return;
518
                        }
519
                } catch (NumberFormatException e) {
520 23612 nbrodin
                        RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "coordenadas_erroneas"), null);
521 15929 bsanchez
                        return;
522 21044 nbrodin
                }
523 11897 bsanchez
524 23612 nbrodin
                double[] wcValues = data.getWcCoordinatesToClip();
525 11897 bsanchez
526 15929 bsanchez
                // Seleccionamos las bandas que se usaran en el recorte a partir de la tabla
527
                int countBands = 0;
528
                int rowCount = ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getRowCount();
529
                for (int iRow = 0; iRow < rowCount; iRow++)
530
                        if ((((Boolean) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 0))).booleanValue())
531
                                countBands++;
532 11352 bsanchez
533 15929 bsanchez
                int[] drawableBands = new int[countBands];
534
                int i = 0;
535
                for (int iRow = 0; iRow < rowCount; iRow++) {
536
                        if ((((Boolean) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 0))).booleanValue()) {
537
                                int row = ((Integer) ((CheckBoxModel) getSelectionPanel().getTableContainer().getModel()).getValueAt(iRow, 2)).intValue();
538
                                drawableBands[i++] = row;
539
                        }
540
                }
541 11352 bsanchez
542 15929 bsanchez
                /**
543
                 * Donde se va a guardar el fichero
544
                 */
545 20610 bsanchez
                String path;
546 23810 nbrodin
                if (getOptionsPanel().getCbSaveFile().isSelected()) {
547 20610 bsanchez
                        path = getOptionsPanel().getDirectoryTextField().getText();
548 23810 nbrodin
                        File f = new File(path);
549
                        if(!f.exists() || !f.canWrite()) {
550
                                RasterToolsUtil.messageBoxError(RasterToolsUtil.getText(this, "path_not_valid"), null);
551
                                return;
552
                        }
553
                } else
554 15929 bsanchez
                        path = Utilities.createTempDirectory();
555 20610 bsanchez
556 15929 bsanchez
                String file = getOptionsPanel().getFilenameTextField().getText();
557 20610 bsanchez
                if (file.compareTo(RasterLibrary.getOnlyLayerName()) == 0)
558 18962 nbrodin
                        RasterLibrary.usesOnlyLayerName();
559 11352 bsanchez
560 20610 bsanchez
                if (file == "")
561
                        file = "cutlayer";
562
563 15929 bsanchez
                String filename = path + File.separator + file;
564 20610 bsanchez
565
                if (new File(filename + ".tif").exists())
566
                        if (!RasterToolsUtil.messageBoxYesOrNot("raster_error_file_exists", getOptionsPanel()))
567 17804 nbrodin
                                return;
568 11384 bsanchez
569 15929 bsanchez
                /**
570
                 * Preparacion para la generacion del proceso del recorte
571
                 */
572 21044 nbrodin
                if (getFLayer() == null)
573 15929 bsanchez
                        return;
574 11384 bsanchez
575 15929 bsanchez
                WriterBufferServer dataWriter1 = new WriterBufferServer();
576 11384 bsanchez
577 30130 nbrodin
                AffineTransform transf = calcAffineTransform(ulx, uly, lrx, lry,
578 21044 nbrodin
                                                                                                        Math.round(data.getPxWidth()), Math.round(data.getPxHeight()), at);
579 11897 bsanchez
580 15929 bsanchez
                int interpMethod = getResolutionPanel().getSelectedInterpolationMethod();
581 20610 bsanchez
582
                // Creamos la interpretaci?n de color para el caso de que la salida tenga
583
                // m?s de una banda por fichero. Siempre creamos RED, GREEN y BLUE
584 18042 nbrodin
                String[] ci = new String[drawableBands.length];
585
                for (int j = 0; j < ci.length; j++) {
586
                        switch (j) {
587 20610 bsanchez
                                case 0:
588
                                        if (ci.length >= 3)
589
                                                ci[j] = DatasetColorInterpretation.RED_BAND;
590
                                        else
591
                                                ci[j] = DatasetColorInterpretation.GRAY_BAND;
592
                                        break;
593
                                case 1:
594
                                        if (ci.length >= 3)
595
                                                ci[j] = DatasetColorInterpretation.GREEN_BAND;
596
                                        else
597
                                                ci[j] = DatasetColorInterpretation.UNDEF_BAND;
598
                                        break;
599
                                case 2:
600
                                        ci[j] = DatasetColorInterpretation.BLUE_BAND;
601
                                        break;
602
                                default:
603
                                        ci[j] = DatasetColorInterpretation.UNDEF_BAND;
604
                                        break;
605 18042 nbrodin
                        }
606
                }
607 20610 bsanchez
608 17600 nbrodin
                RasterProcess clippingProcess = new ClippingProcess();
609
                clippingProcess.setActions(this);
610 21044 nbrodin
                clippingProcess.addParam("viewname", getViewName());
611 30130 nbrodin
                //clippingProcess.addParam("pixelcoordinates", pxValues);
612 23612 nbrodin
                clippingProcess.addParam("realcoordinates", wcValues);
613 17600 nbrodin
                clippingProcess.addParam("filename", filename);
614
                clippingProcess.addParam("datawriter", dataWriter1);
615 21044 nbrodin
                clippingProcess.addParam("layer", getFLayer());
616 17600 nbrodin
                clippingProcess.addParam("drawablebands", drawableBands);
617
                clippingProcess.addParam("onelayerperband", new Boolean(getOptionsPanel().getCbOneLyrPerBand().isSelected()));
618
                clippingProcess.addParam("interpolationmethod", new Integer(interpMethod));
619
                clippingProcess.addParam("affinetransform", transf);
620 18042 nbrodin
                clippingProcess.addParam("colorInterpretation", new DatasetColorInterpretation(ci));
621 23788 nbrodin
                clippingProcess.addParam("resolution", new int[]{(int) Math.round(data.getPxWidth()),
622
                                                                                                                 (int) Math.round(data.getPxHeight())});
623 15929 bsanchez
                clippingProcess.start();
624
        }
625 12030 bsanchez
626 15929 bsanchez
        /**
627
         * Calcula la matriz de transformaci?n que se usar? para el nuevo raster generado.
628
         * @param ulx Coordenada X real de la esquina superior izquierda
629
         * @param uly Coordenada Y real de la esquina superior izquierda
630
         * @param lrx Coordenada X real de la esquina inferior derecha
631
         * @param lry Coordenada Y real de la esquina inferior derecha
632
         * @param width Ancho en p?xeles del nuevo raster
633
         * @param height Alto en p?xeles del nuevo raster
634 21044 nbrodin
         * @param trans Matriz de transformaci?n de la nueva capa
635 15929 bsanchez
         * @return Matriz de transformaci?n para el nuevo raster
636
         */
637 21044 nbrodin
        private AffineTransform calcAffineTransform(double ulx, double uly, double lrx, double lry,
638
                                                                                                double width, double height, AffineTransform trans) {
639 15929 bsanchez
                Point2D ul = new Point2D.Double(ulx, uly);
640
                Point2D lr = new Point2D.Double(lrx, lry);
641
                try {
642 21044 nbrodin
                        trans.inverseTransform(ul, ul);
643
                        trans.inverseTransform(lr, lr);
644 15929 bsanchez
                } catch (NoninvertibleTransformException e) {
645 21044 nbrodin
                        JOptionPane.showMessageDialog(null, RasterToolsUtil.getText(this, "coordenadas_erroneas"));
646 15929 bsanchez
                        return new AffineTransform();
647
                }
648
                double w = Math.abs(lr.getX() - ul.getX());
649 11897 bsanchez
650 15929 bsanchez
                Point2D ur = new Point2D.Double(ul.getX() + w, ul.getY());
651
                Point2D ll = new Point2D.Double(lr.getX() - w, lr.getY() );
652 13021 bsanchez
653 15929 bsanchez
                //Obtenemos la georreferenciaci?n de las cuatro esquinas del nuevo raster
654 21044 nbrodin
                trans.transform(ul, ul);
655
                trans.transform(ur, ur);
656
                trans.transform(lr, lr);
657
                trans.transform(ll, ll);
658 13021 bsanchez
659 15929 bsanchez
                double pixelSizeX = (ur.getX() - ul.getX()) / width;
660
                double pixelSizeY = (ll.getY() - ul.getY()) / height;
661 21044 nbrodin
                double rotX = trans.getShearX();
662
                double rotY = trans.getShearY();
663 15929 bsanchez
                return new AffineTransform(pixelSizeX, rotY, rotX, pixelSizeY, ulx, uly);
664
        }
665 14083 nbrodin
666 15929 bsanchez
        /*
667
         * (non-Javadoc)
668
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.ToolListener#cancelDrawing()
669
         */
670
        public boolean cancelDrawing() {
671
                return false;
672
        }
673 13021 bsanchez
674 15929 bsanchez
        /*
675
         * (non-Javadoc)
676
         * @see com.iver.cit.gvsig.fmap.tools.Listeners.ToolListener#getCursor()
677 15782 bsanchez
         */
678 15929 bsanchez
        public Cursor getCursor() {
679
                return null;
680
        }
681
682 14083 nbrodin
        /*
683
         * (non-Javadoc)
684 15929 bsanchez
         * @see org.gvsig.gui.beans.coordinatespanel.CoordinatesListener#actionValueChanged(org.gvsig.gui.beans.coordinatespanel.CoordinatesEvent)
685 14083 nbrodin
         */
686 15929 bsanchez
        public void actionValueChanged(CoordinatesEvent e) {
687 21538 nbrodin
                if (e.getSource() == getCoordinatesPanel().getPixelCoordinates()) {
688 15929 bsanchez
                        eventJTextField(e);
689
                        recalcCoordFields(true);
690
                }
691 21538 nbrodin
                if (e.getSource() == getCoordinatesPanel().getRealCoordinates()) {
692 15929 bsanchez
                        eventJTextField(e);
693
                        recalcCoordFields(false);
694
                }
695
        }
696 15782 bsanchez
697 15929 bsanchez
        /*
698
         * (non-Javadoc)
699
         * @see org.gvsig.gui.beans.datainput.DataInputContainerListener#actionValueChanged(java.util.EventObject)
700
         */
701
        public void actionValueChanged(EventObject e) {
702
                if(!enableValueChangedEvent)
703
                        return;
704 15782 bsanchez
705 15929 bsanchez
                enableValueChangedEvent = false; //Desactivamos el evento de cambio de valor de las cajas de texto para que no se bucle
706 15782 bsanchez
707 15929 bsanchez
                if (e.getSource() == getResolutionPanel().getCCellSize().getDataInputField()) {
708
                        // Cambiamos PS ==> wPx=wWC/PS & hPx=wPx/rel
709
                        double ps = 0;
710
                        try {
711
                                ps = Double.parseDouble(getResolutionPanel().getCCellSize().getValue());
712
                        } catch (NumberFormatException ex) {
713
                                return;
714
                        }
715 21015 nbrodin
                        data.setPxWidth(data.getWcWidth() / ps);
716
                        data.setPxHeight(data.getWcHeight() / ps);
717
                        data.updateObservers();
718 15929 bsanchez
                } else if (e.getSource() == getResolutionPanel().getCWidth().getDataInputField()) {
719
                        // Cambiamos wPx ==> hPx=wPx/rel & PS=wWC/wPx
720
                        double wPx = 0;
721
                        try {
722
                                wPx = Double.parseDouble(getResolutionPanel().getCWidth().getValue());
723
                        } catch (NumberFormatException ex) {
724
                                return;
725
                        }
726 21015 nbrodin
                        data.setPxWidth(wPx);
727
                        data.setPxHeight(Math.round(wPx / data.getRatio()));
728
                        data.updateObservers();
729 15929 bsanchez
                } else if (e.getSource() == getResolutionPanel().getCHeight().getDataInputField()) {
730
                        // Cambiamos hPx ==> wPx=rel*wPx & PS=hWC/hPx
731
                        double hPx = 0;
732
                        try {
733
                                hPx = Double.parseDouble(getResolutionPanel().getCHeight().getValue());
734
                        } catch (NumberFormatException ex) {
735
                                return;
736
                        }
737 21015 nbrodin
                        data.setPxHeight(hPx);
738
                        data.setPxWidth(Math.round(Math.round(hPx * data.getRatio())));
739
                        data.updateObservers();
740 15782 bsanchez
                }
741 15929 bsanchez
                enableValueChangedEvent = true;
742 14083 nbrodin
        }
743 14527 nbrodin
744
        /**
745 15929 bsanchez
         * Asigna el valor para la activaci?n y desactivaci?n del evento de cambio de valor en
746 14527 nbrodin
         * las cajas de texto.
747
         * @param enableValueChangedEvent
748
         */
749
        public void setEnableValueChangedEvent(boolean enableValueChangedEvent) {
750
                this.enableValueChangedEvent = enableValueChangedEvent;
751
        }
752 15929 bsanchez
753 20650 nbrodin
        /*
754
         * (non-Javadoc)
755
         * @see org.gvsig.raster.IProcessActions#end(java.lang.Object)
756
         */
757 15929 bsanchez
        public void end(Object params) {
758
                if(        params instanceof Object[] &&
759 16167 nbrodin
                        ((Object[])params).length == 2 &&
760
                        ((Object[])params)[0] instanceof String &&
761
                        ((Object[])params)[1] instanceof Long) {
762 15929 bsanchez
763 16167 nbrodin
                        String fName = (String)((Object[])params)[0];
764
                        long milis = ((Long)((Object[])params)[1]).longValue();
765 15929 bsanchez
766 21684 bsanchez
                        EndInfoDialog.show(fName, milis);
767 15929 bsanchez
                }
768
        }
769 21044 nbrodin
770
        /**
771
         * Obtener la capa de un raster.
772
         * @return
773
         */
774
        public FLyrRasterSE getFLayer() {
775
                return fLayer;
776
        }
777
778
        /**
779
         * Obtiene la ultima herramienta seleccionada antes de cargar el recorte
780
         * @return
781
         */
782
        public String getLastTool() {
783
                return lastTool;
784
        }
785 15929 bsanchez
786 21044 nbrodin
        /**
787
         * Obtiene el nombre de la vista
788
         * @return
789
         */
790
        public String getViewName() {
791
                return viewName;
792
        }
793
794
        /**
795
         * Establecer la capa para usarla en el recorte
796
         * @param fLayer
797
         */
798
        public void setLayer(FLyrRasterSE fLayer) {
799
                this.fLayer = fLayer;
800 25061 nbrodin
                BaseView view = (BaseView) PluginServices.getMDIManager().getActiveWindow();
801 21044 nbrodin
                viewName = PluginServices.getMDIManager().getWindowInfo(view).getTitle();
802
                mapControl = view.getMapControl();
803
804
                lastTool = mapControl.getCurrentTool();
805
806
                // Listener de eventos de movimiento que pone las coordenadas del rat?n en
807
                // la barra de estado
808
                StatusBarListener sbl = new StatusBarListener(mapControl);
809
810
                // Cortar Raster
811
                ClippingMouseViewListener clippingMouseViewListener = new ClippingMouseViewListener(mapControl, getClippingPanel(), data, fLayer);
812
                mapControl.addMapTool("cutRaster", new Behavior[] {
813
                                new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl)
814
                        }
815
                );
816
817
                getSelectionPanel().setLayer(fLayer);
818
819
                // Obtener la extension completa de la capa
820
821
                if(fLayer instanceof IRasterGeoOperations && fLayer instanceof IRasterOperations) {
822
                        setAffineTransform(((IRasterGeoOperations)fLayer).getAffineTransform());
823
                        setDimension(new Dimension((int)((IRasterOperations)fLayer).getPxWidth(), (int)((IRasterOperations)fLayer).getPxHeight()));
824
                } else {
825
                        RasterToolsUtil.messageBoxError("Error obteniendo el extent.", this);
826
                        return;
827
                }
828
829
        }
830
831
        /**
832
         * Acciones que se realizan para seleccionar la tool CutRaster
833
         */
834
        public void selectToolButton() {
835
                // seleccionamos la vista de gvSIG
836
                com.iver.cit.gvsig.project.documents.view.gui.View theView = null;
837
                try {
838
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
839
                        for (int i = 0; i < allViews.length; i++) {
840
                                if (allViews[i] instanceof com.iver.cit.gvsig.project.documents.view.gui.View
841
                                                && PluginServices.getMDIManager().getWindowInfo((View) allViews[i])
842
                                                                .getTitle().equals(viewName))
843
                                        theView = (com.iver.cit.gvsig.project.documents.view.gui.View) allViews[i];
844
                        }
845
                        if (theView == null)
846
                                return;
847
                } catch (ClassCastException ex) {
848 22529 bsanchez
                        // RasterToolsUtil.messageBoxError("cant_get_view "), this, ex);
849 21044 nbrodin
                        return;
850
                }
851
                MapControl m_MapControl = theView.getMapControl();
852
853
                // Listener de eventos de movimiento que pone las coordenadas del rat?n en
854
                // la barra de estado
855 23659 nbrodin
                //StatusBarListener sbl = new StatusBarListener(m_MapControl);
856 21044 nbrodin
857
                // Cortar Raster
858 23659 nbrodin
                /*ClippingMouseViewListener clippingMouseViewListener = new ClippingMouseViewListener(m_MapControl, getClippingPanel(), data, getFLayer());
859 21044 nbrodin
                m_MapControl.addMapTool("cutRaster", new Behavior[] {
860
                                new RectangleBehavior(clippingMouseViewListener), new MouseMovementBehavior(sbl)
861
                                }
862 23659 nbrodin
                );*/
863 21044 nbrodin
864 23659 nbrodin
                m_MapControl.setTool("clipRaster");
865 21044 nbrodin
        }
866
867
        /**
868
         * Obtiene el <code>MapControl</code> de gvSIG
869
         * @return <code>MapControl</code>
870
         */
871
        public MapControl getMapControl() {
872
                return mapControl;
873
        }
874
875
876 15929 bsanchez
        public void rectangle(RectangleEvent event) throws BehaviorException {}
877
        public void interrupted() {}
878 11352 bsanchez
}