Statistics
| Revision:

gvsig-raster / org.gvsig.raster.georeferencing / trunk / org.gvsig.raster.georeferencing / org.gvsig.raster.georeferencing.app / org.gvsig.raster.georeferencing.app.georeferencingclient / src / main / java / org / gvsig / raster / georeferencing / app / georeferencingclient / listener / ApplicationControlsListener.java @ 1717

History | View | Annotate | Download (17.3 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.georeferencing.app.georeferencingclient.listener;
23

    
24
import java.awt.event.ActionEvent;
25
import java.awt.geom.Point2D;
26

    
27
import javax.swing.event.TableModelEvent;
28

    
29
import org.gvsig.andami.PluginServices;
30
import org.gvsig.fmap.dal.coverage.datastruct.GeoPoint;
31
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
32
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
33
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
34
import org.gvsig.fmap.mapcontext.layers.FLayers;
35
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
36
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
37
import org.gvsig.i18n.Messages;
38
import org.gvsig.raster.georeferencing.app.georeferencingclient.Georeferencing;
39
import org.gvsig.raster.georeferencing.app.georeferencingclient.TableWrapper;
40
import org.gvsig.raster.georeferencing.framework.GeoreferencingFrameworkLocator;
41
import org.gvsig.raster.georeferencing.framework.GeoreferencingFrameworkManager;
42
import org.gvsig.raster.georeferencing.swing.GeoreferencingOptionsDataModel;
43
import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingLibrary;
44
import org.gvsig.raster.georeferencing.swing.control.GeorefControlPanel;
45
import org.gvsig.raster.georeferencing.swing.control.GeorefControlPanelListener;
46
import org.gvsig.raster.georeferencing.swing.impl.option.GeorefOptionsDialog;
47
import org.gvsig.raster.georeferencing.swing.view.SynchronizedViews;
48
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
49

    
50
/**
51
 * Listener para los botones de control de la aplicaci?n de georreferenciaci?n.
52
 * F?sicamente est?n en el panel de la tabla de puntos de control.
53
 *
54
 * 25/01/2008
55
 * @author Nacho Brodin nachobrodin@gmail.com
56
 */
57
public class ApplicationControlsListener implements GeorefControlPanelListener {
58

    
59
        private TableWrapper              tableWrapper        = null;
60
        private Georeferencing            appMain             = null;
61
        private boolean                   enableTableEvent    = true;
62
        private GeorefControlPanel        controlPanel        = null;
63
        private GeorefOptionsDialog       optionsDialog       = null;
64
        GeoreferencingFrameworkManager    fManager            = null;
65
        //private GeoPointsPersistence      persistence         = null;
66

    
67
        /**
68
         * Flag que estar? a true despu?s de crear un nuevo punto de control. Volver? a false
69
         * cuando se ejecute el evento de inserci?n de fila en una tabla. Esto es necesario para
70
         * que no se centre el punto sobre la vista despu?s de insertar un nuevo punto. Ya que las
71
         * vistas se van a la posici?n (0,0)
72
         */
73
        private boolean                   newPointCreated     = false;
74

    
75
        /**
76
         * Constructor. Asigna el panel con los controles
77
         * @param tablePanel
78
         */
79
        public ApplicationControlsListener(TableWrapper tableWrapper, Georeferencing appMain) {
80
                this.tableWrapper = tableWrapper;
81
                this.appMain = appMain;
82
                this.controlPanel = appMain.getGeorefControlPanel();
83
                this.controlPanel.setListener(this);
84
                this.fManager = GeoreferencingFrameworkLocator.getManager();
85
        }
86
        
87
        private SynchronizedViews getSyncViews() {
88
                return appMain.getSyncViews();
89
        }
90
        
91
        private GeoreferencingOptionsDataModel getDataModel() {
92
                return appMain.getDataModel();
93
        }
94

    
95
        /**
96
         * Eventos de los botones del cuadro de tabla y selecci?n de fila de tabla
97
         */
98
        public void actionPerformed(ActionEvent e) {
99
                //-------------------------------------
100
                //Finalizaci?n de la georreferenciaci?n
101
                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bEndGeoref)
102
                        endGeoref();
103

    
104
                //-----------------------------------------
105
                //Centrar la vista en el punto seleccionado
106
                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bCenterView) {
107
                        getSyncViews().centerToPoint(tableWrapper.getTable().getSelectedRows()[0]);
108
                }
109

    
110
                //---------------------------------
111
                //Selecci?n de una fila de la tabla
112
                if(e.getActionCommand().equals("SELECT_ROW")) {
113
                        if(getDataModel().isCenterView() && !newPointCreated)
114
                                getSyncViews().centerToPoint(e.getID());
115
                        newPointCreated = false;
116
                }
117

    
118
                //----------------------------------------------------------
119
                //Seleccion de opciones. Se asignan las propiedades al abrir
120
                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bOptions) {
121
                        if(optionsDialog == null)
122
                                optionsDialog = new GeorefOptionsDialog(Georeferencing.DEFAULT_DEGREE, this);
123
                        optionsDialog.setDegree(getDataModel().getDegree());
124
                        optionsDialog.setAlgorithm(getDataModel().getAlgorithm());
125
                        optionsDialog.setBackGroundColor(getDataModel().getBackgroundColor());
126
                        optionsDialog.setTextColor(getDataModel().getTextColor());
127
                        optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getAddErrorsCSVCheck().setSelected(getDataModel().isAddErrorsCSV());
128
                        optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getCenterViewCheck().setSelected(getDataModel().isCenterView());
129
                        optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getShowNumberCheck().setSelected(getDataModel().isShowNumber());
130
                        optionsDialog.setThresholdError(getDataModel().getThreshold());
131
                        optionsDialog.setInterpolationMethod(getDataModel().getInterpolationMethod());
132
                        optionsDialog.setOutFile(getDataModel().getOutFile());
133
                        optionsDialog.setXCellSize(getDataModel().getXCellSize());
134
                        optionsDialog.setYCellSize(getDataModel().getYCellSize());
135
                        fManager.showWindow(optionsDialog, 400, 420, Messages.getText("georeferencing"));
136
                }
137

    
138
                //------------------------------
139
                //Selecci?n de puntos de control
140
                if(e.getSource() == appMain.getGeorefControlPanel().getToolSelectPointButton()) {
141
                        if(appMain.getGeorefControlPanel().getToolSelectPointButton().isSelected()) {
142
                                if(appMain.getViewRaster().getToolSelected() != GeoreferencingSwingLibrary.SELECT_POINT_TOOL) {
143
                                        //No hay filas en la tabla
144
                                        if(tableWrapper.getTable().getRowCount() == 0) {
145
                                                RasterToolsUtil.messageBoxError("no_rows", tableWrapper.getTable());
146
                                                appMain.getGeorefControlPanel().getToolSelectPointButton().setSelected(false);
147
                                                return;
148
                                        }
149

    
150
                                        //No hay filas seleccionadas en la tabla
151
                                        if(tableWrapper.getTable().getSelectedRows() == null) {
152
                                                RasterToolsUtil.messageBoxError("no_rows_selected", tableWrapper.getTable());
153
                                                appMain.getGeorefControlPanel().getToolSelectPointButton().setSelected(false);
154
                                                return;
155
                                        }
156
                                        getSyncViews().selectPointTool(true);
157
                                }
158
                        } else {
159
                                getSyncViews().selectPointTool(false);
160
                        }
161
                }
162

    
163
                //-------
164
                //Testear
165
                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bTest) {
166
                        try {
167
                                appMain.getProcessActions().addTestRasterLayer(
168
                                                appMain.getLayer(), 
169
                                                getDataModel().getAlgorithm(), 
170
                                                getDataModel().getInterpolationMethod(), 
171
                                                getDataModel().getDegree(), 
172
                                                getDataModel().getOutFile(),
173
                                                getDataModel().getXCellSize(),
174
                                                getDataModel().getYCellSize(),
175
                                                tableWrapper.getGeoTransformDataResult());
176
                        } catch (LoadLayerException e1) {
177
                                RasterToolsUtil.messageBoxError("error_loading_layer", tableWrapper.getTable(), e1);
178
                        }
179
                }
180

    
181
                //------------
182
                //Fin del Test
183
                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bEndTest) {
184
                        if(appMain != null && appMain.getProcessActions().getLastTestLayer() != null) {
185
                                appMain.getProcessActions().getLastTestLayer().setRemoveRasterFlag(false);
186
                                appMain.getProcessActions().removeTestRasterLayer();
187
                        }
188
                }
189

    
190
                //------------
191
                //Salvar a CSV
192
//                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bSaveToAscii) {
193
//                        getPersistence().exportToCSV(getPointManager().getPointList(), getOptions().isAddErrorsCSV());
194
//                }
195
//
196
//                //----------------
197
//                //Cargar desde CSV
198
//                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bLoadFromAscii) {
199
//                        setEnableTableEvent(false);
200
//                        getPersistence().importFromCSV(getPointManager(), tablePanel);
201
//                        setEnableTableEvent(true);
202
//                }
203
//
204
//                //------------
205
//                //Salvar a RMF
206
//                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bSaveToXml) {
207
//                        getPersistence().saveToRMF(getPointManager().getPointList(), appMain.getLayer().getDataSource());
208
//                }
209
//
210
//                //----------------
211
//                //Cargar desde RMF
212
//                if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bLoadFromXml) {
213
//                        setEnableTableEvent(false);
214
//                        getPersistence().loadFromRMF(appMain.getLayer().getDataSource(), getPointManager(), tablePanel);
215
//                        setEnableTableEvent(true);
216
//                }
217
        }
218

    
219
        /**
220
         * Acciones de finalizaci?n de georreferenciaci?n. La secuencia de acciones es:
221
         * <UL>
222
         * <LI>Preguntar si est? seguro de finalizar.</LI>
223
         * <LI>Preguntar si se desea salvar la transformaci?n (Solo en caso de ser af?n).</LI>
224
         * <LI>Preguntar si se desea cargar el resultado en la vista (Solo en caso de ser con mapa de referencia).</LI>
225
         * </UL>
226
         */
227
        private void endGeoref() {
228
                if(RasterToolsUtil.messageBoxYesOrNot("ask_end_georef", null)) {
229
                        boolean saveTransform = false;
230
                        if(getDataModel().getAlgorithm() == Georeferencing.AFFINE) {
231
                                if(RasterToolsUtil.messageBoxYesOrNot("ask_save_transformation", null))
232
                                        saveTransform = true;
233
                                else {
234
                                        appMain.getProcessActions().removeTestRasterLayer();
235
                                        fManager.closeAllWindows();
236
                                        return;
237
                                }
238
                        }
239

    
240
                        if(getDataModel().getType() == Georeferencing.WITH_MAP) {
241
                                if(appMain.getProcessActions().getLastTestLayer() != null)
242
                                        appMain.getProcessActions().getLastTestLayer().setRemoveRasterFlag(false);
243

    
244
                                if(RasterToolsUtil.messageBoxYesOrNot("ask_load_view", null)) {
245
                                        FLayers lyrs = appMain.getMapCtrl().getMapContext().getLayers();
246
                                        if(lyrs != null) {
247
                                                try {
248
                                                        if(appMain.getProcessActions().getLastTestLayer() != null){
249
                                                                lyrs.removeLayer(appMain.getProcessActions().getLastTestLayer());
250
                                                                PluginServices.getMainFrame().enableControls();
251
                                                        }
252
                                                } catch(NullPointerException ex){
253
                                                        //No hay raster para eliminar
254
                                                }
255
                                        }
256

    
257
                                        //Cargar en la vista
258
                                        if(getDataModel().getAlgorithm() == Georeferencing.AFFINE) {
259
                                                try {
260
                                                        appMain.getProcessActions().addTestRasterLayer(
261
                                                                        appMain.getLayer(), 
262
                                                                        getDataModel().getAlgorithm(), 
263
                                                                        getDataModel().getInterpolationMethod(), 
264
                                                                        getDataModel().getDegree(), 
265
                                                                        getDataModel().getOutFile(),
266
                                                                        getDataModel().getXCellSize(),
267
                                                                        getDataModel().getYCellSize(),
268
                                                                        tableWrapper.getGeoTransformDataResult());
269
                                                } catch (LoadLayerException e) {
270
                                                        RasterToolsUtil.messageBoxError("error_loading_layer", null, e);
271
                                                }
272
                                        }
273
                                        if(getDataModel().getAlgorithm() == Georeferencing.POLYNOMIAL) {
274
                                                if(appMain.getProcessActions().getLastTestLayer() != null && lyrs != null) {
275
                                                        appMain.getMapCtrl().getMapContext().getLayers().addLayer(appMain.getProcessActions().getLastTestLayer());
276
                                                } else {
277
                                                        RasterToolsUtil.messageBoxInfo("raster_not_created", null);
278
                                                        return;
279
                                                }
280
                                        }
281
                                } else {
282
                                        appMain.getProcessActions().removeTestRasterLayer();
283
                                }
284
                        }
285

    
286
                        if (saveTransform) {
287
                                // Salvar transformaci?n
288
                                if (appMain.getProcessActions().getLastTestLayer() == null) {
289
                                        RasterToolsUtil.messageBoxInfo("raster_not_created", null);
290
                                        return;
291
                                }
292

    
293
                                RasterDataStore store = appMain.getProcessActions().getLastTestLayer().getDataStore();
294
                                try {
295
                                        store.saveGeoreferencingToRmf();
296
                                } catch (RmfSerializerException e) {
297
                                        RasterToolsUtil.messageBoxError("error_salvando_rmf", null, e);
298
                                } 
299
                        }
300
                        
301
                        fManager.closeAllWindows();
302
                }
303
        }
304

    
305
        /**
306
         * Evento de modificaci?n de la tabla de puntos de control. El a?adir, borrar
307
         * o mover puntos dentro de la tabla hace que estos se creen, borren o muevan en
308
         * la lista de GeoPoints.
309
         */
310
        public void tableChanged(TableModelEvent e) {
311
                if(!enableTableEvent)
312
                        return;
313
                setEnableTableEvent(false);
314
                //-----------------------------------
315
                //Inserci?n de nueva fila en la tabla
316
                if(e.getType() == TableModelEvent.INSERT) {
317
                        long id = getSyncViews().addPoint(new Point2D.Double(0, 0), new Point2D.Double(0, 0));
318
                        tableWrapper.initializeRow(e.getFirstRow(), id);
319
                        getSyncViews().calcPointsNumeration();
320

    
321
                        //Activamos la herramienta de pinchar punto en la vista al a?adir punto
322
                        appMain.getGeorefControlPanel().getToolSelectPointButton().setSelected(true);
323
                        getSyncViews().selectPointTool(true);
324

    
325
                        newPointCreated = true;
326
                }
327

    
328
                //-----------------------------
329
                //Eliminado de fila de la tabla
330
                if(e.getType() == TableModelEvent.DELETE) {
331
                        for (int i = e.getLastRow(); i >= e.getFirstRow(); i--)
332
                                appMain.getSyncViews().removePoint(i);
333
                        getSyncViews().calcPointsNumeration();
334
                        tableWrapper.updateErrors();
335
                }
336

    
337
                //-------------------------------------
338
                //Actualizaci?n de una fila de la tabla
339
                if(e.getType() == TableModelEvent.UPDATE) {
340
                        getSyncViews().calcPointsNumeration();
341
                        //Revisamos el flag de activo de cada punto poniendo el valor que pone en la entrada de la tabla
342
                        for (int i = 0; i < tableWrapper.getTable().getRowCount(); i++) {
343
                                boolean active = ((Boolean) tableWrapper.getTable().getValueAt(i, 0)).booleanValue();
344
                                int position = appMain.getSyncViews().getPointPositionByNumber(i);
345
                                if (position < 0)
346
                                        return;
347
                                GeoPoint pt = appMain.getGeoPointList().get(position);
348
                                pt.setActive(active);
349
                                getSyncViews().setVisiblePoint(active, position);
350

    
351
                                //Para la funcionalidad de cambio de coordenadas desde la tabla: reasignamos el valor
352
                                //de las coordenadas por si han cambiado estas
353
                                double[] values = tableWrapper.getCoordinates(i);
354

    
355
                                getSyncViews().setCoordinates(position, values[0], values[1], values[2], values[3]);
356
                        }
357
                        tableWrapper.updateErrors();
358
                }
359

    
360
                setEnableTableEvent(true);
361
        }
362

    
363
        /**
364
         * Eventos de los botones del cuadro de opciones
365
         */
366
        public void actionButtonPressed(ButtonsPanelEvent e) {
367

    
368
                //---------------------------------------------------
369
                //Bot?n de Aplicar y Aceptar en el cuadro de opciones
370
                if (e.getButton() == ButtonsPanel.BUTTON_APPLY || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
371
                        if(optionsDialog != null) {
372

    
373
                                //Asignamos las propiedades seleccionadas
374
                                getDataModel().setAlgorithm(optionsDialog.getAlgorithm());
375
                                getDataModel().setBackGroundColor(optionsDialog.getBackGroundColor());
376
                                getDataModel().setTextColor(optionsDialog.getTextColor());
377
                                getDataModel().setAddErrorsCSV(optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getAddErrorsCSVCheck().isSelected());
378
                                getDataModel().setCenterView(optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getCenterViewCheck().isSelected());
379
                                getDataModel().setShowNumber(optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getShowNumberCheck().isSelected());
380
                                getDataModel().setInterpolationMethod(optionsDialog.getInterpolationMethod());
381
                                getDataModel().setOutFile(optionsDialog.getOptionsPanel(this).getOutFileSelectionPanel().getOutFile());
382

    
383
                                //Recalculamos los errores si ha cambiado el grado
384
                                if(optionsDialog.getDegree() != getDataModel().getDegree()) {
385
                                        getDataModel().setDegree(optionsDialog.getDegree());
386
                                        tableWrapper.updateErrors();
387
                                }
388

    
389
                                try {
390
                                        getDataModel().setThreshold(optionsDialog.getThresholdError());
391
                                        getDataModel().setXCellSize(optionsDialog.getOptionsPanel(this).getCellSizePanel().getXCellSizeValue());
392
                                        getDataModel().setYCellSize(optionsDialog.getOptionsPanel(this).getCellSizePanel().getYCellSizeValue());
393
                                } catch(NumberFormatException exc) {
394
                                        RasterToolsUtil.messageBoxError("error_numeric_format", null, exc);
395
                                }
396

    
397
                                getSyncViews().setGraphicsColor(getDataModel().getTextColor());
398
                                getSyncViews().setBackgroundColor(getDataModel().getBackgroundColor());
399
                                getSyncViews().setActiveNumberPoint(getDataModel().isShowNumber());
400

    
401
                        }
402
                }
403

    
404
                //--------------------------------------------------
405
                // Bot?n de Cerrar y Aceptar en el cuadro de opciones
406
                if (e.getButton() == ButtonsPanel.BUTTON_CANCEL || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
407
                        if(optionsDialog != null) {
408
                                fManager.closeWindow(optionsDialog);
409
                        }
410
                }
411
        }
412

    
413
        /**
414
         * Consulta si est?n activos los eventos de tabla o no
415
         * @return true si est?n activos y false si no lo est?n
416
         */
417
        public boolean isEnableTableEvent() {
418
                return enableTableEvent;
419
        }
420

    
421
        /**
422
         * Activa o desactiva los eventos de tabla
423
         * @param enableTableEvent true para activarlos o false para desactivarlos
424
         */
425
        public void setEnableTableEvent(boolean enableTableEvent) {
426
                this.enableTableEvent = enableTableEvent;
427
        }
428

    
429

    
430
        /**
431
         * Obtiene una instancia del objeto que gestiona la
432
         * persistencia en disco de los puntos de control
433
         * @return GeoPointsPersistence
434
         */
435
        /*public GeoPointsPersistence getPersistence() {
436
                if(persistence == null)
437
                        persistence = new GeoPointsPersistence();
438
                return persistence;
439
        }*/
440
}