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

History | View | Annotate | Download (17.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.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
                        }
142

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
336
                                newPointCreated = true;
337
                        }
338

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

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

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

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

    
372
                                        getSyncViews().setCoordinates(position, values[0], values[1], values[2], values[3]);
373
                                }
374
                                tableWrapper.updateErrors();
375
                        }
376
                        
377
                        if(e.getEvent() == PagedTableEvent.EVENT_SELECTED_ROWS) {
378
                                if(getDataModel().isCenterView())
379
                                        getSyncViews().centerToPoint(tableWrapper.getTable().getSelectedRows()[0]);
380
                        }
381

    
382
                } finally {
383
                        Georeferencing.enableTableEvent = true;        
384
                }
385
        }
386

    
387
        /**
388
         * Eventos de los botones del cuadro de opciones
389
         */
390
        public void actionButtonPressed(ButtonsPanelEvent e) {
391
                Georeferencing.enableTableEvent = false;
392

    
393
                try {
394
                        //---------------------------------------------------
395
                        //Bot?n de Aplicar y Aceptar en el cuadro de opciones
396
                        if (e.getButton() == ButtonsPanel.BUTTON_APPLY || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
397
                                if(optionsDialog != null) {
398

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

    
409
                                        //Recalculamos los errores si ha cambiado el grado
410
                                        if(optionsDialog.getDegree() != getDataModel().getDegree()) {
411
                                                getDataModel().setDegree(optionsDialog.getDegree());
412
                                                tableWrapper.updateErrors();
413
                                        }
414

    
415
                                        try {
416
                                                getDataModel().setThreshold(optionsDialog.getThresholdError());
417
                                                getDataModel().setXCellSize(optionsDialog.getOptionsPanel(this).getCellSizePanel().getXCellSizeValue());
418
                                                getDataModel().setYCellSize(optionsDialog.getOptionsPanel(this).getCellSizePanel().getYCellSizeValue());
419
                                        } catch(NumberFormatException exc) {
420
                                                RasterToolsUtil.messageBoxError("error_numeric_format", null, exc);
421
                                        }
422

    
423
                                        getSyncViews().setGraphicsColor(getDataModel().getTextColor());
424
                                        getSyncViews().setBackgroundColor(getDataModel().getBackgroundColor());
425
                                        getSyncViews().setActiveNumberPoint(getDataModel().isShowNumber());
426

    
427
                                }
428
                        }
429

    
430
                        //--------------------------------------------------
431
                        // Bot?n de Cerrar y Aceptar en el cuadro de opciones
432
                        if (e.getButton() == ButtonsPanel.BUTTON_CANCEL || e.getButton() == ButtonsPanel.BUTTON_ACCEPT) {
433
                                if(optionsDialog != null) {
434
                                        fManager.closeWindow(optionsDialog);
435
                                }
436
                        }
437

    
438
                } finally {
439
                        Georeferencing.enableTableEvent = true;        
440
                }
441
        }
442
}