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 @ 1724

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 org.gvsig.andami.PluginServices;
28
import org.gvsig.fmap.dal.coverage.datastruct.GeoPoint;
29
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
30
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
31
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
32
import org.gvsig.fmap.mapcontext.layers.FLayers;
33
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
34
import org.gvsig.gui.beans.buttonspanel.ButtonsPanelEvent;
35
import org.gvsig.i18n.Messages;
36
import org.gvsig.raster.georeferencing.app.georeferencingclient.GeoPointsPersistence;
37
import org.gvsig.raster.georeferencing.app.georeferencingclient.Georeferencing;
38
import org.gvsig.raster.georeferencing.app.georeferencingclient.TableWrapper;
39
import org.gvsig.raster.georeferencing.framework.GeoreferencingFrameworkLocator;
40
import org.gvsig.raster.georeferencing.framework.GeoreferencingFrameworkManager;
41
import org.gvsig.raster.georeferencing.swing.GeoreferencingOptionsDataModel;
42
import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingLibrary;
43
import org.gvsig.raster.georeferencing.swing.control.GeorefControlPanel;
44
import org.gvsig.raster.georeferencing.swing.control.GeorefControlPanelListener;
45
import org.gvsig.raster.georeferencing.swing.impl.option.GeorefOptionsDialog;
46
import org.gvsig.raster.georeferencing.swing.view.SynchronizedViews;
47
import org.gvsig.raster.swing.pagedtable.PagedTableEvent;
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 GeorefControlPanel                controlPanel        = null;
62
        private GeorefOptionsDialog               optionsDialog       = null;
63
        private GeoreferencingFrameworkManager    fManager            = null;
64
        private GeoPointsPersistence              persistence         = null;
65

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

    
74
        /**
75
         * Constructor. Asigna el panel con los controles
76
         * @param tablePanel
77
         */
78
        public ApplicationControlsListener(TableWrapper tableWrapper, Georeferencing appMain) {
79
                this.tableWrapper = tableWrapper;
80
                this.appMain = appMain;
81
                this.controlPanel = appMain.getGeorefControlPanel();
82
                this.controlPanel.setListener(this);
83
                this.fManager = GeoreferencingFrameworkLocator.getManager();
84
                this.persistence = new GeoPointsPersistence();
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
                if(!Georeferencing.enableTableEvent)
100
                        return;
101
                
102
                Georeferencing.enableTableEvent = false;
103
                try {
104
                        //-------------------------------------
105
                        //Finalizaci?n de la georreferenciaci?n
106
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bEndGeoref)
107
                                endGeoref();
108

    
109
                        //-----------------------------------------
110
                        //Centrar la vista en el punto seleccionado
111
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bCenterView) {
112
                                getSyncViews().centerToPoint(tableWrapper.getTable().getSelectedRows()[0]);
113
                        }
114

    
115
                        //---------------------------------
116
                        //Selecci?n de una fila de la tabla
117
                        if(e.getActionCommand().equals("SELECT_ROW")) {
118
                                if(getDataModel().isCenterView() && !newPointCreated)
119
                                        getSyncViews().centerToPoint(e.getID());
120
                                newPointCreated = false;
121
                        }
122

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

    
144
                        //------------------------------
145
                        //Selecci?n de puntos de control
146
                        if(e.getSource() == appMain.getGeorefControlPanel().getToolSelectPointButton()) {
147
                                selectControlPoints();
148
                        }
149

    
150
                        //-------
151
                        //Testear
152
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bTest) {
153
                                try {
154
                                        appMain.getProcessActions().addTestRasterLayer(
155
                                                        getDataModel().getDataStore(), 
156
                                                        getDataModel().getAlgorithm(), 
157
                                                        getDataModel().getInterpolationMethod(), 
158
                                                        getDataModel().getDegree(), 
159
                                                        getDataModel().getOutFile(),
160
                                                        getDataModel().getXCellSize(),
161
                                                        getDataModel().getYCellSize(),
162
                                                        tableWrapper.getGeoTransformDataResult());
163
                                } catch (LoadLayerException e1) {
164
                                        RasterToolsUtil.messageBoxError("error_loading_layer", tableWrapper.getTable(), e1);
165
                                }
166
                        }
167

    
168
                        //------------
169
                        //Fin del Test
170
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bEndTest) {
171
                                if(appMain != null && appMain.getProcessActions().getLastTestLayer() != null) {
172
                                        appMain.getProcessActions().getLastTestLayer().setRemoveRasterFlag(false);
173
                                        appMain.getProcessActions().removeTestRasterLayer();
174
                                }
175
                        }
176

    
177
                        //------------
178
                        //Salvar a CSV
179
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bSaveToAscii) {
180
                                persistence.exportToCSV(getDataModel().getGCPList(), getDataModel().isAddErrorsCSV());
181
                        }
182

    
183
                        //----------------
184
                        //Cargar desde CSV
185
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bLoadFromAscii) {
186
                                persistence.importFromCSV(getSyncViews(), tableWrapper);
187
                        }
188

    
189
                        //------------
190
                        //Salvar a RMF
191
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bSaveToXml) {
192
                                persistence.saveToRMF(getDataModel().getGCPList(), getDataModel().getDataStore());
193
                        }
194

    
195
                        //----------------
196
                        //Cargar desde RMF
197
                        if(controlPanel.getButtonIDPressed(e.getSource()) == GeorefControlPanel.bLoadFromXml) {
198
                                persistence.loadFromRMF(getDataModel().getDataStore(), getSyncViews(), tableWrapper);
199
                        }
200

    
201
                } finally {
202
                        Georeferencing.enableTableEvent = true;        
203
                }
204
        }
205
        
206
        private void selectControlPoints() {
207
                if(appMain.getGeorefControlPanel().getToolSelectPointButton().isSelected()) {
208
                        if(appMain.getViewRaster().getToolSelected() != GeoreferencingSwingLibrary.SELECT_POINT_TOOL) {
209
                                //No hay filas en la tabla
210
                                if(tableWrapper.getTable().getRowCount() == 0) {
211
                                        RasterToolsUtil.messageBoxError("no_rows", tableWrapper.getTable());
212
                                        appMain.getGeorefControlPanel().getToolSelectPointButton().setSelected(false);
213
                                        return;
214
                                }
215

    
216
                                //No hay filas seleccionadas en la tabla
217
                                if(tableWrapper.getTable().getSelectedRows() == null) {
218
                                        RasterToolsUtil.messageBoxError("no_rows_selected", tableWrapper.getTable());
219
                                        appMain.getGeorefControlPanel().getToolSelectPointButton().setSelected(false);
220
                                        return;
221
                                }
222
                                getSyncViews().selectPointTool(true);
223
                        }
224
                } else {
225
                        getSyncViews().selectPointTool(false);
226
                }
227
        }
228

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

    
250
                        if(getDataModel().getType() == Georeferencing.WITH_MAP) {
251
                                if(appMain.getProcessActions().getLastTestLayer() != null)
252
                                        appMain.getProcessActions().getLastTestLayer().setRemoveRasterFlag(false);
253

    
254
                                if(RasterToolsUtil.messageBoxYesOrNot("ask_load_view", null)) {
255
                                        FLayers lyrs = appMain.getMapCtrl().getMapContext().getLayers();
256
                                        if(lyrs != null) {
257
                                                try {
258
                                                        if(appMain.getProcessActions().getLastTestLayer() != null){
259
                                                                lyrs.removeLayer(appMain.getProcessActions().getLastTestLayer());
260
                                                                PluginServices.getMainFrame().enableControls();
261
                                                        }
262
                                                } catch(NullPointerException ex){
263
                                                        //No hay raster para eliminar
264
                                                }
265
                                        }
266

    
267
                                        //Cargar en la vista
268
                                        if(getDataModel().getAlgorithm() == Georeferencing.AFFINE) {
269
                                                try {
270
                                                        appMain.getProcessActions().addTestRasterLayer(
271
                                                                        getDataModel().getDataStore(), 
272
                                                                        getDataModel().getAlgorithm(), 
273
                                                                        getDataModel().getInterpolationMethod(), 
274
                                                                        getDataModel().getDegree(), 
275
                                                                        getDataModel().getOutFile(),
276
                                                                        getDataModel().getXCellSize(),
277
                                                                        getDataModel().getYCellSize(),
278
                                                                        tableWrapper.getGeoTransformDataResult());
279
                                                } catch (LoadLayerException e) {
280
                                                        RasterToolsUtil.messageBoxError("error_loading_layer", null, e);
281
                                                }
282
                                        }
283
                                        if(getDataModel().getAlgorithm() == Georeferencing.POLYNOMIAL) {
284
                                                if(appMain.getProcessActions().getLastTestLayer() != null && lyrs != null) {
285
                                                        appMain.getMapCtrl().getMapContext().getLayers().addLayer(appMain.getProcessActions().getLastTestLayer());
286
                                                } else {
287
                                                        RasterToolsUtil.messageBoxInfo("raster_not_created", null);
288
                                                        return;
289
                                                }
290
                                        }
291
                                } else {
292
                                        appMain.getProcessActions().removeTestRasterLayer();
293
                                }
294
                        }
295

    
296
                        if (saveTransform) {
297
                                // Salvar transformaci?n
298
                                if (appMain.getProcessActions().getLastTestLayer() == null) {
299
                                        RasterToolsUtil.messageBoxInfo("raster_not_created", null);
300
                                        return;
301
                                }
302

    
303
                                RasterDataStore store = appMain.getProcessActions().getLastTestLayer().getDataStore();
304
                                try {
305
                                        store.saveGeoreferencingToRmf();
306
                                } catch (RmfSerializerException e) {
307
                                        RasterToolsUtil.messageBoxError("error_salvando_rmf", null, e);
308
                                } 
309
                        }
310
                        
311
                        fManager.closeAllWindows();
312
                }
313
        }
314

    
315
        /**
316
         * Evento de modificaci?n de la tabla de puntos de control. El a?adir, borrar
317
         * o mover puntos dentro de la tabla hace que estos se creen, borren o muevan en
318
         * la lista de GeoPoints.
319
         */
320
        public void tableChanged(PagedTableEvent e) {
321
                if(!Georeferencing.enableTableEvent)
322
                        return;
323
                Georeferencing.enableTableEvent = false;
324

    
325
                try {
326
                        //-----------------------------------
327
                        //Inserci?n de nueva fila en la tabla
328
                        if(e.getEvent() == PagedTableEvent.EVENT_ADD_ENTRY) {
329
                                long id = getSyncViews().addPoint(new Point2D.Double(0, 0), new Point2D.Double(0, 0));
330
                                tableWrapper.initializeRow(e.getRows()[0], id);
331
                                getSyncViews().calcPointsNumeration();
332

    
333
                                //Activamos la herramienta de pinchar punto en la vista al a?adir punto
334
                                appMain.getGeorefControlPanel().getToolSelectPointButton().setSelected(true);
335
                                getSyncViews().selectPointTool(true);
336

    
337
                                newPointCreated = true;
338
                        }
339

    
340
                        //-----------------------------
341
                        //Eliminado de fila de la tabla
342
                        if(e.getEvent() == PagedTableEvent.EVENT_REMOVE_ENTRY) {
343
                                for (int i = 0; i >= e.getRows().length; i--)
344
                                        appMain.getSyncViews().removePoint(e.getRows()[i]);
345
                                getSyncViews().calcPointsNumeration();
346
                                tableWrapper.updateErrors();
347
                        }
348

    
349
                        //-----------------------------
350
                        //Eliminado todas las filas
351
                        if(e.getEvent() == PagedTableEvent.EVENT_REMOVE_ALL) {
352
                                getSyncViews().removeAllPoints();
353
                        }
354

    
355
                        //-------------------------------------
356
                        //Actualizaci?n de una fila de la tabla
357
                        if(e.getEvent() == PagedTableEvent.EVENT_MODIFY_ENTRY) {
358
                                getSyncViews().calcPointsNumeration();
359
                                //Revisamos el flag de activo de cada punto poniendo el valor que pone en la entrada de la tabla
360
                                for (int i = 0; i < tableWrapper.getTable().getRowCount(); i++) {
361
                                        boolean active = ((Boolean) tableWrapper.getTable().getValueAt(i, 0)).booleanValue();
362
                                        int position = appMain.getSyncViews().getPointPositionByNumber(i);
363
                                        if (position < 0)
364
                                                return;
365
                                        GeoPoint pt = getDataModel().getGCPList().getGeoPoint(position);
366
                                        pt.setActive(active);
367
                                        getSyncViews().setVisiblePoint(active, position);
368

    
369
                                        //Para la funcionalidad de cambio de coordenadas desde la tabla: reasignamos el valor
370
                                        //de las coordenadas por si han cambiado estas
371
                                        double[] values = tableWrapper.getCoordinates(i);
372

    
373
                                        getSyncViews().setCoordinates(position, values[0], values[1], values[2], values[3]);
374
                                }
375
                                tableWrapper.updateErrors();
376
                        }
377

    
378
                } finally {
379
                        Georeferencing.enableTableEvent = true;        
380
                }
381
        }
382

    
383
        /**
384
         * Eventos de los botones del cuadro de opciones
385
         */
386
        public void actionButtonPressed(ButtonsPanelEvent e) {
387
                Georeferencing.enableTableEvent = false;
388

    
389
                try {
390
                        //---------------------------------------------------
391
                        //Bot?n de Aplicar y Aceptar en el cuadro de opciones
392
                        if (e.getButton() == ButtonsPanel.BUTTON_APPLY || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
393
                                if(optionsDialog != null) {
394

    
395
                                        //Asignamos las propiedades seleccionadas
396
                                        getDataModel().setAlgorithm(optionsDialog.getAlgorithm());
397
                                        getDataModel().setBackGroundColor(optionsDialog.getBackGroundColor());
398
                                        getDataModel().setTextColor(optionsDialog.getTextColor());
399
                                        getDataModel().setAddErrorsCSV(optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getAddErrorsCSVCheck().isSelected());
400
                                        getDataModel().setCenterView(optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getCenterViewCheck().isSelected());
401
                                        getDataModel().setShowNumber(optionsDialog.getOptionsPanel(this).getCheckOptionsPanel().getShowNumberCheck().isSelected());
402
                                        getDataModel().setInterpolationMethod(optionsDialog.getInterpolationMethod());
403
                                        getDataModel().setOutFile(optionsDialog.getOptionsPanel(this).getOutFileSelectionPanel().getOutFile());
404

    
405
                                        //Recalculamos los errores si ha cambiado el grado
406
                                        if(optionsDialog.getDegree() != getDataModel().getDegree()) {
407
                                                getDataModel().setDegree(optionsDialog.getDegree());
408
                                                tableWrapper.updateErrors();
409
                                        }
410

    
411
                                        try {
412
                                                getDataModel().setThreshold(optionsDialog.getThresholdError());
413
                                                getDataModel().setXCellSize(optionsDialog.getOptionsPanel(this).getCellSizePanel().getXCellSizeValue());
414
                                                getDataModel().setYCellSize(optionsDialog.getOptionsPanel(this).getCellSizePanel().getYCellSizeValue());
415
                                        } catch(NumberFormatException exc) {
416
                                                RasterToolsUtil.messageBoxError("error_numeric_format", null, exc);
417
                                        }
418

    
419
                                        getSyncViews().setGraphicsColor(getDataModel().getTextColor());
420
                                        getSyncViews().setBackgroundColor(getDataModel().getBackgroundColor());
421
                                        getSyncViews().setActiveNumberPoint(getDataModel().isShowNumber());
422

    
423
                                }
424
                        }
425

    
426
                        //--------------------------------------------------
427
                        // Bot?n de Cerrar y Aceptar en el cuadro de opciones
428
                        if (e.getButton() == ButtonsPanel.BUTTON_CANCEL || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
429
                                if(optionsDialog != null) {
430
                                        System.out.println("---Close");
431
                                        fManager.closeWindow(optionsDialog);
432
                                }
433
                        }
434

    
435
                } finally {
436
                        Georeferencing.enableTableEvent = true;        
437
                }
438
        }
439
}