Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extGeoreferencing / src / org / gvsig / georeferencing / utils / PointManager.java @ 5818

History | View | Annotate | Download (32.1 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 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
package org.gvsig.georeferencing.utils;
20

    
21
import java.awt.Component;
22
import java.awt.geom.Point2D;
23
import java.awt.geom.Rectangle2D;
24

    
25
import javax.swing.JDesktopPane;
26
import javax.swing.JInternalFrame;
27
import javax.swing.JLayeredPane;
28
import javax.swing.JOptionPane;
29
import javax.xml.transform.TransformerException;
30

    
31
import org.gvsig.georeferencing.GeoOperations;
32
import org.gvsig.georeferencing.GeoreferencingToolsModule;
33
import org.gvsig.georeferencing.gui.dialog.GeoreferencingDialog;
34
import org.gvsig.georeferencing.gui.listeners.GeoRasterFrameListener;
35
import org.gvsig.georeferencing.gui.listeners.GeorefPointSelectorListener;
36
import org.gvsig.georeferencing.gui.panels.AdjustGeorefPanel;
37
import org.gvsig.georeferencing.gui.panels.OptionsPanel;
38
import org.gvsig.georeferencing.gui.panels.ZoomControlPanel;
39
import org.gvsig.georeferencing.gui.pointsTable.TablePanelButtons;
40
import org.gvsig.georeferencing.gui.pointsTable.TableControlerPanel;
41
import org.gvsig.georeferencing.gui.pointsTable.TablePointsPanel;
42
import org.gvsig.georeferencing.gui.pointsTable.TablePointsPanel.PointTable;
43
import org.gvsig.georeferencing.gui.selectPoints.DataPointPanel;
44
import org.gvsig.georeferencing.gui.selectPoints.ErrorPointPanel;
45
import org.gvsig.georeferencing.gui.selectPoints.SelectPointsPanel;
46

    
47
import com.iver.andami.PluginServices;
48
import com.iver.andami.ui.mdiFrame.MDIFrame;
49
import com.iver.cit.gvsig.fmap.ViewPort;
50
import com.iver.cit.gvsig.fmap.layers.FLyrGeoRaster;
51
import com.iver.cit.gvsig.fmap.layers.FLyrPoints;
52
import com.iver.cit.gvsig.fmap.layers.GeoPoint;
53
import com.iver.cit.gvsig.fmap.layers.IGeoUi;
54
import com.iver.cit.gvsig.gui.View;
55

    
56
/**
57
 * Gestor de puntos. Contiene metodos para a?adir. borrar, seleccionar,..
58
 * puntos coordinando la capa de puntos y la visualizaci?n del interfaz
59
 * gr?fico.
60
 * 
61
 * @author Nacho Brodin (brodin_ign@gva.es)
62
 *
63
 */
64
public class PointManager{
65

    
66
        //**********************Vars**********************************
67
        private        GeoreferencingDialog                 dialog = null;
68
        
69
        private SelectPointsPanel                         selectPointsPanel = null;
70
        private ErrorPointPanel                         errorPointPanel = null;
71
        private DataPointPanel                                 dataPointPanel = null;
72
        private TableControlerPanel                 tableControlerPanel1 = null;
73
        
74
        private TablePointsPanel                         tablePointsPanel = null;
75
        private TableControlerPanel                 tableControlerPanel2 = null;
76
        private TablePanelButtons                        buttonsExportImportPanel = null;
77
        
78
        private OptionsPanel                                optionsPanel = null;
79
        private ZoomControlPanel                        zoomControlPanelLeft = null;
80
        private ZoomControlPanel                        zoomControlPanelRight = null;
81
        
82
        private FLyrPoints                                         lyrPoints = null;
83
        private        double                                                currentMapX = 0D;
84
        private        double                                                currentMapY = 0D;
85
        private        double                                                currentPixelX = 0D;
86
        private        double                                                currentPixelY = 0D;
87
        private boolean                                         disableAllControls = false;
88
        //**********************End Vars******************************
89
        
90
        //**********************Methods*******************************
91
        /**
92
         * Constructor
93
         */
94
        public PointManager(GeoreferencingDialog dialog, FLyrPoints flyrPoints){
95
                this.dialog = dialog;
96
                this.selectPointsPanel = dialog.getSelectPointsPanel();
97
                this.errorPointPanel = dialog.getSelectPointsPanel().getErrorPointPanel();
98
                this.dataPointPanel = dialog.getSelectPointsPanel().getDataPointPanel();
99
                this.tableControlerPanel1 = dialog.getSelectPointsPanel().getTableControlerPanel();
100
                this.tablePointsPanel = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel();
101
                this.tableControlerPanel2 = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getTableControlerPanel();
102
                this.buttonsExportImportPanel = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getPTablePanelButtons();
103
                this.optionsPanel = dialog.getConectorPanel().getAdjustGeorefPanel().getOptionsPanel();
104
                this.zoomControlPanelLeft = dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft();
105
                this.zoomControlPanelRight = dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight();
106
                this.lyrPoints = flyrPoints;
107
        }
108
        
109
        /**
110
         * Crea un nuevo punto vacio en la capa y lo a?ade al interfaz gr?fico para
111
         * que puedan ser introducidas las coordenadas por el usuario
112
         */
113
        public void newEmptyPoint(){
114
                try{
115
                        //Antes de a?adir un nuevo pto compruba que los textField del anterior no est?n vacios
116
                        if(tableControlerPanel1.getItemCount() > 0)
117
                                selectPointsPanel.checkInfoPointText();
118
                        
119
                        //A?ade un punto vacio a la capa
120
                        lyrPoints.addPoint(null, null);
121
                        
122
                        //A?ade un punto al control de tabla y checkea la activaci?n de los botones
123
                        tableControlerPanel1.addPointToTable(lyrPoints.getCountPoints());
124
                                                        
125
                        //Guardamos el ?ltimo punto seleccionado por si hay que recuperarlo
126
                        selectPointsPanel.setLastIndexSelection(lyrPoints.getCountPoints() - 1);
127
                                                                        
128
                        //resetea los controles de (del, delall, selectFromView y miniimagenes)
129
                        dialog.resetControls(true);
130
                        
131
                        //Desactivamos los controles de las miniimagenes para que no capture los
132
                        //eventos hasta que no se hayan introducido los puntos
133
                        dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(false);
134
                        dialog.getConectorPanel().getAdjustGeorefPanel().setLZoomRight("1:");
135
                        dialog.getConectorPanel().getAdjustGeorefPanel().setLZoomLeft("1:");
136
                                                                        
137
                }catch(NoSuchFieldException exc){
138
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
139
                                PluginServices.getText(this, "coordenadas_vacias"));
140
                }
141
        }
142
        
143
        /**
144
         * A partir de nuevas coordenadas actualiza la vista, minimagen, capa de puntos el
145
         * dialogo y la tabla.
146
         *
147
         */
148
        public void updateData(int nPunto, Point2D pixel, Point2D map, IGeoUi geoUI, View view){
149
                dialog = (GeoreferencingDialog)geoUI;
150
                if(dialog == null)
151
                        return;
152
                if(pixel == null && map == null)
153
                        return;
154
                
155
                //Actualizamos los textBox
156
                if(pixel != null)
157
                        dialog.setPixelText(GeoUtils.tailDecimals(pixel.getX(), 2), GeoUtils.tailDecimals(pixel.getY(), 2));
158
                
159
                if(map != null)
160
                        dialog.setMapCoordText(map.getX(), map.getY());
161
                
162
                //El Checkbox de activaci?n
163
                GeoPoint gp = ((GeoPoint)lyrPoints.getPoint(nPunto - 1));
164
                if(gp != null){
165
                        dataPointPanel.getCbActive().setSelected(gp.active);
166
                        dialog.setEnabled(gp.active);
167
                }
168
            
169
                //Actualizamos la tabla
170
                
171
                while(dialog.getTableRowCount() < nPunto)
172
                        dialog.addTableNew();
173
                if(gp != null)
174
                        dialog.setCheckValueAt(new Boolean(gp.active), nPunto - 1);
175
                dialog.setTableValueAt(String.valueOf(nPunto), nPunto - 1, 1);
176
                
177
                if(pixel != null){        
178
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(pixel.getX()), 5), nPunto - 1, 2);
179
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(pixel.getY()), 5), nPunto - 1, 3);
180
                }
181
                if(map != null){
182
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(map.getX()), 5), nPunto - 1, 4);
183
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(map.getY()), 5), nPunto - 1, 5);
184
                }
185
                
186
                //Actualizamos la capa de puntos
187
                if(pixel != null || map != null)
188
                        lyrPoints.updatePoint(pixel, map, nPunto - 1);
189
                
190
                //Actualizamos la miniimagen
191
                if(view != null){
192
                        ViewPort viewPort = view.getMapControl().getMapContext().getViewPort();
193

    
194
                        if(pixel != null){
195
                                dialog.getZoomControlLeft().setCenterPoint(lyrPoints.getLyrGeoRaster().img2World(pixel));
196
                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setViewPort(viewPort, lyrPoints.getPoint(nPunto - 1).zoomLeft);
197
                                //Si est? extendido hacemos un draw corriente sino es q est? plegado y tocar? asignar el extent de la miniimagen
198
                                if(dialog.isEnlarge())
199
                                        dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().draw();
200
                                
201
                                lyrPoints.setMiniExtent(nPunto - 1, 
202
                                                                                lyrPoints.getLyrGeoRaster().img2World(pixel), 
203
                                                                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().getCanvas().initViewPort(viewPort, lyrPoints.getLyrGeoRaster().img2World(pixel), null, 1),
204
                                                                                false);
205
                        }
206
                        
207
                        if(map != null){
208
                                dialog.getZoomControlRight().setCenterPoint(map);
209
                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().setViewPort(viewPort, lyrPoints.getPoint(nPunto - 1).zoomRight);
210
                                //Si est? extendido hacemos un draw corriente sino es q est? plegado y tocar? asignar el extent de la miniimagen
211
                                if(dialog.isEnlarge())
212
                                        dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().draw();
213
                                
214
                                lyrPoints.setMiniExtent(nPunto - 1, 
215
                                                                                map, 
216
                                                                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().getCanvas().initViewPort(viewPort, map, null, 1),
217
                                                                                true);
218
                        }
219
                                                                        
220
                        //Actualizamos la vista
221
                        view.getMapControl().getMapContext().invalidate();
222
                }
223
                
224
                //Calculamos los errores
225
                try{
226
                        if(pixel != null || map != null)
227
                                setErrors(nPunto - 1);
228
                }catch(ArrayIndexOutOfBoundsException ex){
229
                        //Esta excepci?n ocurre despues de introducir el primer punto ya que map es null
230
                        //En este caso no hacemos nada y no se calcula el error
231
                }
232
            
233
        }
234
        
235
        /**
236
         * Al actualizar un punto debemos recalcular los errores RMS y Total para ello tenemos que
237
         * pedir la transformaci?n de toda la lista de puntos. Esta funci?n calcula esta lista
238
         * transformada y la asigna a un array en la capa de puntos. Esta funci?n tiene en cuenta
239
         * que un punto puede estar inactivo.
240
         */
241
        private void transformPointList(){
242
                try{
243
                        GeoOperations go = new GeoOperations(lyrPoints);
244
                        Point2D[] pointList = new Point2D[lyrPoints.getCountActivePoints()];
245
                        int pActive = 0;
246
                        for(int i=0; i< lyrPoints.getCountPoints(); i++){
247
                                if(lyrPoints.getPoint(i).active){
248
                                        pointList[pActive] = lyrPoints.getPoint(i).pixelPoint;
249
                                        pActive ++;
250
                                }
251
                        }
252
                        
253
                        Point2D[] transformActivePointList = go.transformPoints(pointList);
254
                        Point2D[] transformPointList = new Point2D[lyrPoints.getCountPoints()];
255
                        
256
                        pActive = 0;
257
                        for(int i=0; i< lyrPoints.getCountPoints(); i++){
258
                                if(lyrPoints.getPoint(i).active){
259
                                        transformPointList[i] = transformActivePointList[pActive];
260
                                        pActive ++;
261
                                }else
262
                                        transformPointList[i] = null;
263
                        }
264
                        
265
                        lyrPoints.setTransformPointList(transformPointList);
266
                }catch(NullPointerException e){
267
                        //Si ocurre esta excepci?n es que se est? intentando incluir un punto que se acaba de crear
268
                        //y por lo tanto no tiene el valor asignado todavia por lo que es mejor no hacer nada 
269
                        //y seguir con el proceso
270
                }
271
        }
272
        
273
        /**
274
         * Busca el punto en la capa FLyrPoint que corresponde con la posicion pos
275
         * y carga la informaci?n de este en el panel de informaci?n pasado por par?metro.
276
         * @param pos Posici?n del punto
277
         * @param panel donde se carga la informaci?n
278
         */
279
        public void selectPoint(int pos, GeoreferencingDialog dialog){
280
                GeoPoint pto = null;
281
                try{
282
                        pto = lyrPoints.getPoint(pos);
283
                        if(pto == null)
284
                                return;
285
                }catch(ArrayIndexOutOfBoundsException exc){
286
                        //Todavia no hay puntos por lo que no hacemos nada
287
                        return;
288
                }
289
                
290
                //Actualizamos el valor del combo
291
                try{
292
                        tableControlerPanel1.getCPoint().setSelectedIndex(pos);
293
                }catch(IllegalArgumentException ex){}
294
                try{
295
                        tableControlerPanel2.getCPoint().setSelectedIndex(pos);
296
                }catch(IllegalArgumentException ex){}
297
                
298
                DataPointPanel dpp = dialog.getConectorPanel().getDataPointsTabPanel().getSelectPointsPanel().getDataPointPanel();
299
                
300
                //Llenamos los JTextField con los valores del punto
301
                if(pto.pixelPoint != null){
302
                        dpp.getTX().setText(GeoUtils.tailDecimals(pto.pixelPoint.getX(), 2)+"");
303
                        dpp.getTY().setText(GeoUtils.tailDecimals(pto.pixelPoint.getY(), 2)+"");
304
            }
305
            if(pto.mapPoint != null){
306
                    dpp.getLatitud().setText(GeoUtils.tailDecimals(String.valueOf(pto.mapPoint.getY()), 5));
307
                    dpp.getLongitud().setText(GeoUtils.tailDecimals(String.valueOf(pto.mapPoint.getX()), 5));
308
            }
309
            
310
            //El Checkbox de activaci?n
311
            dataPointPanel.getCbActive().setSelected(pto.active);
312
            dialog.setEnabled(pto.active);
313
                        
314
            //Seleccionamos la fila de la tabla
315
            PointTable table = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getJTable();
316
            try{
317
                    table.getTable().setRowSelectionInterval(pos, pos);
318
            }catch(IllegalArgumentException exc){
319
                    System.err.println("Intervalo erroneo "+pos);
320
            }
321
            
322
            //Cargamos las mini imagenes
323
            dialog.getZoomControlLeft().setCenterPoint(lyrPoints.getCenterPoint(pos, false));
324
            
325
            try{
326
                    ViewPort vpL = GeoUtils.calcZoom(lyrPoints.getMiniExtent(pos, false), lyrPoints.getZoomLeft(pos));
327
                    dialog.getZoomControlLeft().setNewViewPort(vpL);
328
                    dialog.getZoomControlLeft().draw();
329
            }catch(NullPointerException ex){
330
                    //Todavia no hay un viewPort por lo que dar? una excepci?n. 
331
            }
332
                        
333
            dialog.getZoomControlRight().setCenterPoint(lyrPoints.getCenterPoint(pos, true));
334
            try{
335
                    ViewPort vpR = GeoUtils.calcZoom(lyrPoints.getMiniExtent(pos, true), lyrPoints.getZoomRight(pos));
336
                    dialog.getZoomControlRight().setNewViewPort(vpR);
337
                    dialog.getZoomControlRight().draw();
338
            }catch(NullPointerException ex){
339
                    //Todavia no hay un viewPort por lo que dar? una excepci?n
340
            }
341
                        
342
            //Consultamos si hay que centrar la vista sobre el punto seleccionado
343
            
344
                if(dialog.isCenterPoint()){
345
                        try{
346
                                centerView(lyrPoints.getCenterPoint(pos, false));
347
                        }catch(NullPointerException ex){
348
                                //Excepci?n cuando se cargan los puntos desde fichero. No hacemos nada
349
                        }
350
                }
351
                
352
            //Calculamos los errores
353
            if(pto.pixelPoint != null && pto.mapPoint != null)
354
                    setErrors(pos);
355
        }
356
        
357
        /**
358
         * Obtiene los errores en una matriz de Nx3 en la que cada fila es un punto y la
359
         * columna 0 es el error en X, la columna 1 es el error en Y y la columna 2 es el error RMS. 
360
         * @return matriz de errores
361
         */
362
        public double[][] getErrors(){
363
                
364
                transformPointList();
365
                
366
                //Al actualizar un punto debemos recalcular los errores RMS y Total para ello tenemos que
367
                //pedir la transformaci?n de toda la lista de puntos
368
                try{
369
                        GeoOperations go = new GeoOperations(lyrPoints);
370
                        Point2D[] pointList = new Point2D[lyrPoints.length()]; 
371
                        for(int i=0; i< lyrPoints.length(); i++)
372
                                pointList[i] = lyrPoints.getPoint(i).pixelPoint;
373
                        
374
                        Point2D[] transformPointList = go.transformPoints(pointList);
375
                        lyrPoints.setTransformPointList(transformPointList);
376
                }catch(NullPointerException e){
377
                        //Si ocurre esta excepci?n es que se est? intentando incluir un punto que se acaba de crear
378
                        //y por lo tanto no tiene el valor asignado todavia por lo que es mejor no hacer nada 
379
                        //y seguir con el proceso
380
                }
381
                
382
                double[][] err =  new double[lyrPoints.getCountPoints()][3];
383
                for(int i = 0; i<lyrPoints.getCountPoints(); i++){
384
                        err[i][0] = lyrPoints.calcDoubleResX(i);
385
                        err[i][1] = lyrPoints.calcDoubleResY(i);
386
                        err[i][2] = lyrPoints.calcDoubleRMS(i);
387
                }
388
                return err;
389
        }
390
        
391
        /**
392
         * Calcula los errores y los asigna al dialogo y tabla. Hay que tener en cuenta que 
393
         * hay que tener en la capa de puntos la lista de puntos transformados
394
         * @param pos
395
         */
396
        public void setErrors(int pos){
397
                
398
                if(lyrPoints != null){
399
                        transformPointList();
400
                        
401
                        //Calculamos los errores
402
                        double d = lyrPoints.calcDoubleRMS(pos);
403
                        //System.out.println("-->RMS:"+d);
404
                    dialog.setRMS(String.valueOf(GeoUtils.tailDecimals(d, 5)));
405
                    try{
406
                            dialog.setTableValueAt(String.valueOf(GeoUtils.tailDecimals(d, 5)), pos, 8);
407
                    }catch(ArrayIndexOutOfBoundsException e){
408
                            //No asigna el valor a la tabla
409
                    }
410
                    
411
                    d = lyrPoints.calcDoubleResX(pos);
412
                    //System.out.println("-->ResX:"+d);
413
                    dialog.setResX(String.valueOf(GeoUtils.tailDecimals(d, 5)));
414
                    try{
415
                            dialog.setTableValueAt(String.valueOf(GeoUtils.tailDecimals(d, 5)), pos, 6);
416
                    }catch(ArrayIndexOutOfBoundsException e){
417
                            //No asigna el valor a la tabla
418
                    }
419
                    
420
                    d = lyrPoints.calcDoubleResY(pos);
421
                    //System.out.println("-->ResY:"+d);
422
                    dialog.setResY(String.valueOf(GeoUtils.tailDecimals(d, 5)));
423
                    try{
424
                            dialog.setTableValueAt(String.valueOf(GeoUtils.tailDecimals(d, 5)), pos, 7);
425
                    }catch(ArrayIndexOutOfBoundsException e){
426
                            //No asigna el valor a la tabla
427
                    }
428
                    
429
                    d = lyrPoints.calcDoubleTotal();
430
                    //System.out.println("-->Total:"+d);
431
                    dialog.setTotal(String.valueOf(GeoUtils.tailDecimals(d, 5)));
432
                }
433
            
434
        }
435
        
436
        /**
437
         * Elimina el punto seleccionado de la lista de puntos. Obtiene el punto seleccionado
438
         * del combobox del tableControler
439
         */
440
        public void deletePoint(){
441
                int op = JOptionPane.showConfirmDialog((Component)PluginServices.getMainFrame(),
442
                                PluginServices.getText(this, "eliminar_punto"));
443
                if(op == JOptionPane.OK_OPTION){
444
                        if(lyrPoints.length() == 1) //Si solo hay un punto reseteamos
445
                                clearVisualList();
446
                        else{
447
                                int posSelect = tableControlerPanel1.getSelectedIndex();
448
                                if(posSelect == -1)
449
                                        return;
450
                                deleteVisualPoint(posSelect);        
451
                                                                                        
452
                                if(posSelect == 0){
453
                                        selectPointsPanel.setLastIndexSelection(posSelect);
454
                                }else{
455
                                        selectPointsPanel.setLastIndexSelection(posSelect - 1);
456
                                }                                        
457
                        }
458
                }
459
        }
460
        
461
        /**
462
         * Elimina todos los puntos de la capa y resetea el dialogo
463
         */
464
        public void deleteAllPoints(){
465
                int op = JOptionPane.showConfirmDialog((Component)PluginServices.getMainFrame(),
466
                                PluginServices.getText(this, "eliminar_todos_puntos"));
467
                if(op == JOptionPane.OK_OPTION){
468
                        clearVisualList();
469
                }
470
                        
471
        }
472
        
473
        /**
474
         * Elimina un punto de la lista pasado por par?metro y lo elimina del panel 
475
         * @param pos        Posici?n del punto
476
         * @param grd        Panel a limpiar
477
         */
478
        private void deleteVisualPoint(int pos){
479
                lyrPoints.remove(pos);
480
                
481
                //Actualiza los controles de tabla y selector
482
                tableControlerPanel1.setNItems(lyrPoints.length());
483
                tableControlerPanel2.setNItems(lyrPoints.length());
484
                                
485
                //Elimina la fila de la tabla y renumera los puntos
486
                try{
487
                        dialog.removeTableValueAt(pos);
488
                
489
                        for(int i=0;i<lyrPoints.length();i++)
490
                                dialog.setTableValueAt(String.valueOf(i + 1), i, 1);
491
                }catch(ArrayIndexOutOfBoundsException exc){
492
                        //Si intentamos eliminar una fila que no existe no hacemos nada, simplemente no la eliminamos
493
                }
494
                                
495
                //Carga los puntos
496
                if(pos == 0){
497
                        dialog.getSelectPointsPanel().getTableControlerPanel().setSelectedIndex(pos);
498
                        selectPoint(pos, dialog);
499
                }else{
500
                        dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getTableControlerPanel().setSelectedIndex(pos - 1);
501
                        selectPoint(pos - 1, dialog);
502
                }
503
                
504
                //Controlamos las flechas del control de puntos
505
                tableControlerPanel1.checkArrows();
506
                tableControlerPanel2.checkArrows();
507
                
508
                //Redibujamos la vista
509
                View theView = null;
510
                try{
511
                        theView = (View) PluginServices.getMDIManager().getActiveView();
512
                        theView.getMapControl().getMapContext().invalidate();
513
                }catch(ClassCastException exc){
514
                        return;
515
                }
516
        }
517
        
518
        /**
519
         * Desplaza la vista centrando esta sobre el punto pasado como par?metro
520
         * @param center Punto sobre el que se centra la vista
521
         */
522
        private void centerView(Point2D center){
523
                //Obtenemos la vista
524
                View theView = null;
525
                try{
526
                        theView = (View) PluginServices.getMDIManager().getActiveView();
527
                }catch(ClassCastException exc){
528
                }
529
                
530
                //Calculamos el desplazamiento del extext viejo a partir de la diferencia de centros
531
                Rectangle2D oldExtent = theView.getMapControl().getMapContext().getViewPort().getExtent();
532
                double oldCenterX = oldExtent.getMinX() + (oldExtent.getWidth() / 2);
533
                double oldCenterY = oldExtent.getMaxY() - (oldExtent.getHeight() / 2);
534
                double difX = oldCenterX - center.getX();
535
                double difY = oldCenterY - center.getY();
536
                
537
                double minX = oldExtent.getMinX() - difX;
538
                double minY = oldExtent.getMinY() - difY;
539
                
540
                //Asignamos a la vista el nuevo extent
541
                Rectangle2D newExtent = new Rectangle2D.Double(minX, minY, oldExtent.getWidth(), oldExtent.getHeight());
542
                theView.getMapControl().getMapContext().getViewPort().setExtent(newExtent);
543
        }
544
        
545
        /**
546
         * Limpia la lista de puntos .
547
         */
548
        public void clearVisualList(){
549
                AdjustGeorefPanel agp = dialog.getConectorPanel().getAdjustGeorefPanel();
550
                
551
                //Limpiamos la lista de puntos
552
                lyrPoints.clear();
553
                //Limpiamos los controles del Selector de puntos
554
                selectPointsPanel.resetControls(false);
555
                selectPointsPanel.getTableControlerPanel().resetControls();
556
                
557
                //Limpiamos la tabla y sus controles
558
                tablePointsPanel.clearTable();
559
                tablePointsPanel.getTableControlerPanel().resetControls();
560
                                
561
                //Limpiamos las miniimagenes bloqueamos los controles
562
                agp.getZoomLeft().clear();
563
                agp.getZoomRight().clear();
564
                dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(false);
565
                
566
                //Desactivamos los controles de salvar puntos
567
                if(lyrPoints.getCountPoints() == 0)
568
                        dialog.setEnableSaveButtons(false);
569
                
570
                //Actualizamos la vista
571
                View theView = null;
572
                try{
573
                        theView = (View) PluginServices.getMDIManager().getActiveView();
574
                        theView.getMapControl().getMapContext().invalidate();
575
                }catch(ClassCastException exc){
576
                        return;
577
                }
578
        
579
        }
580
        
581
        /**
582
         * Realiza las acciones necesarias cuando se ha seleccionado el primer punto de la georreferenciaci?n. 
583
         * Este primer punto corresponde a las coordenadas en pixeles de la imagen. Los par?metros ya vienen
584
         * validados por quien llama.
585
         * @param tx Coordenada X en formato cadena
586
         * @param ty Coordenada Y en formato cadena
587
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
588
         */
589
        public void selectFirstPoint(String tx, String ty){
590
                //Obtenemos el punto seleccionado en coordenadas de la vista
591
                double x = Double.valueOf(tx).doubleValue();
592
                double y = Double.valueOf(ty).doubleValue();
593
                Point2D pixel = new Point2D.Double();
594
                pixel.setLocation(x, y);
595
                selectFirstPoint(pixel);
596
        }
597
        
598
        /**
599
         * Realiza las acciones necesarias cuando se ha seleccionado el primer punto de la georreferenciaci?n. 
600
         * Este primer punto corresponde a las coordenadas en pixeles de la imagen. Los par?metros ya vienen
601
         * validados por quien llama.
602
         * @param pixel Coordenada X, Y del punto
603
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
604
         */
605
        public void selectFirstPoint(Point2D pixel){
606
                restoreControlsValue();
607
                
608
                View theView = null;
609
                try{
610
                        theView = (View)PluginServices.getMDIManager().getActiveView();
611
                }catch(ClassCastException exc){
612
                        return;
613
                }
614
                
615
                //Obtenemos del dialogo el n? de pto seleccionado y lo actualizamos en la capa de ptos 
616
                int n = Integer.valueOf(dialog.getSelectPointsPanel().getTableControlerPanel().getCPoint().getSelectedItem().toString()).intValue();
617
                updateData(n, pixel, null, dialog, theView);
618
                dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(false);
619
                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setEnabled(true);
620
                
621
                disableAllControls();
622
                
623
                //Consultamos si ha de desactivarse la capa a georreferenciar despu?s del primer punto
624
                //y si es true la desactivamos
625
                if(dialog.isOffLayer())
626
                        lyrPoints.getLyrGeoRaster().setVisible(false);
627
                
628
                //Consultamos si ha de desactivarse la capa de puntos despues del primer punto y si es
629
                //true la desactivamos.
630
                if(dialog.isOffPoints())
631
                        lyrPoints.setHideViewOnly(false);
632
                
633
                GeorefPointSelectorListener.firstPoint = false;
634
        }
635
        
636
        /**
637
         * Realiza las acciones necesarias cuando se ha seleccionado el segundo punto de la georreferenciaci?n. 
638
         * Este segundo punto corresponde a las coordenadas en coordenadas del mundo. Los par?metros ya vienen
639
         * validados por quien llama.
640
         * @param tx Coordenada X en formato cadena
641
         * @param ty Coordenada Y en formato cadena
642
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
643
         */
644
        public void selectSecondPoint(String tx, String ty){
645
                //Obtenemos el punto seleccionado en coordenadas de la vista
646
                double x = Double.valueOf(tx).doubleValue();
647
                double y = Double.valueOf(ty).doubleValue();
648
                Point2D map = new Point2D.Double();
649
                map.setLocation(x, y);
650
                selectSecondPoint(map);
651
        }
652
        
653
        /**
654
         * Realiza las acciones necesarias cuando se ha seleccionado el primer punto de la georreferenciaci?n. 
655
         * Este primer punto corresponde a las coordenadas en pixeles de la imagen. Los par?metros ya vienen
656
         * validados por quien llama.
657
         * @param pixel Coordenada X, Y del punto
658
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
659
         */
660
        public void selectSecondPoint(Point2D map){
661
                View theView = null;
662
                try{
663
                        theView = (View)PluginServices.getMDIManager().getActiveView();
664
                }catch(ClassCastException exc){
665
                        return;
666
                }
667
                
668
                //Deseleccionamos la herramienta de marcado de puntos
669
                theView.getMapControl().setTool(dialog.getLyrPoints().getLastTool());
670
                
671
                //Volvemos a dejar los controles con su valor habitual
672
                dialog.getPointManager().restoreControlsValue();
673
                dialog.setEnableSaveButtons(true);
674
                
675
                //Obtenemos del dialogo el n? de pto seleccionado y lo actualizamos en la capa de ptos
676
                int n = Integer.valueOf(dialog.getSelectPointsPanel().getTableControlerPanel().getCPoint().getSelectedItem().toString()).intValue();
677
                updateData(n, null, map, dialog, theView);
678
                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().draw();
679
                dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(true);
680
                setErrors(n - 1);
681
                
682
                //Consultamos si ha de desactivarse la capa a georreferenciar despu?s del primer punto
683
                //y si es true la volvemos a activar despu?s del segundo punto
684
                if(dialog.isOffLayer())
685
                        lyrPoints.getLyrGeoRaster().setVisible(true);
686
                
687
                //Consultamos si ha de desactivarse la capa de puntos despues del primer punto y si es
688
                //true la activamos despu?s del segundo punto.
689
                if(dialog.isOffPoints())
690
                        lyrPoints.setHideViewOnly(true);
691
                
692
                GeorefPointSelectorListener.firstPoint = true;
693
        }
694
        
695
        /**
696
         * Obtiene la ventana flotante sobre la que ir? el dialogo (GeoreferencingDialog).
697
         * @param obj
698
         * @return JInternalFrame
699
         */
700
        public static JInternalFrame getInternalFrame(Object obj){
701
                JInternalFrame panel = new JInternalFrame();
702
                panel.addInternalFrameListener(new GeoRasterFrameListener());
703
        panel.setClosable(true);
704
        panel.setResizable(false);
705
        panel.setTitle(PluginServices.getText(obj,"georreferenciar"));
706
        return panel;
707
        }
708
        
709
        
710
        public static GeoreferencingDialog initWindow(FLyrGeoRaster lyrGeoRaster, boolean show, Object obj){
711
                GeoreferencingDialog geoDialog = null;
712
                
713
                JInternalFrame panel = PointManager.getInternalFrame(obj);
714
        geoDialog = new GeoreferencingDialog(panel, lyrGeoRaster);             
715
                lyrGeoRaster.getStackZoom().setInitExtent(lyrGeoRaster.getAssignExtent(), true);
716
            lyrGeoRaster.getFLyrPoints().saveState();
717
        lyrGeoRaster.setGeoDialog(geoDialog);
718
        panel.setSize(geoDialog.getWidth() + 12, geoDialog.getHeight() + 10);
719
        panel.getContentPane().add(geoDialog);
720
       
721
        MDIFrame mainFrame = (MDIFrame) PluginServices.getMainFrame();
722
        
723
        JDesktopPane desk = new JDesktopPane();
724
        desk.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
725
              
726
        JLayeredPane lyrPane = mainFrame.getLayeredPane();
727
        lyrPane.add(panel, JDesktopPane.PALETTE_LAYER);    
728
        lyrPane.add(desk, JDesktopPane.OUTLINE_DRAG_MODE);
729
        if(show)
730
                panel.show();
731
        
732
        return geoDialog;
733
        }
734
                        
735
        /**
736
         * Esta funci?n deshabilita todos los controles y guarda sus valores
737
         * de habilitado o deshabilitado para que cuando se ejecute restoreControlsValue
738
         * se vuelvan a quedar como estaba
739
         */
740
        public void disableAllControls(){
741
                if(!disableAllControls){
742
                        disableAllControls = true;
743
                        //Salvamos los estados y desactivamos controles 
744
                        tableControlerPanel1.disableAllControls();
745
                        tablePointsPanel.disableAllControls();
746
                        tableControlerPanel2.disableAllControls();
747
                        dialog.disableAllControls();
748
                        dataPointPanel.getCbActive().setEnabled(false);
749
                        selectPointsPanel.getBExtended().setEnabled(false);
750
                        dialog.getFrame().setClosable(false);
751
                        
752
                        //Desactivamos las herramientas de georreferenciaci?n
753
                        GeoreferencingToolsModule.setEnabled(false);
754
                        dialog.getConectorPanel().getDataPointsTabPanel().getTbPoints().setEnabled(false);
755
                }
756
        }
757
        
758
        /**
759
         * Esta funci?n deja los controles como estaban al ejecutar la funci?n 
760
         * disableAllControls
761
         */
762
        public void restoreControlsValue(){
763
                if(disableAllControls){
764
                        disableAllControls = false;
765
                        //Activamos controles
766
                        tableControlerPanel1.restoreControlsValue();
767
                        tablePointsPanel.restoreControlsValue();
768
                        tableControlerPanel2.restoreControlsValue();
769
                        dialog.restoreControlsValue();
770
                        dataPointPanel.getCbActive().setEnabled(true);
771
                        selectPointsPanel.getBExtended().setEnabled(true);
772
                        dialog.getFrame().setClosable(true);
773
                        
774
                        //Activamos las herramientas de georreferenciaci?n
775
                        GeoreferencingToolsModule.setEnabled(true);
776
                        dialog.getConectorPanel().getDataPointsTabPanel().getTbPoints().setEnabled(true);
777
                }
778
        }
779
        //**********************End Methods***************************
780

    
781
        //**********************Getters & Setters*********************
782
        public FLyrPoints getFlyrPoints() {
783
                return lyrPoints;
784
        }
785

    
786
        public void setFlyrPoints(FLyrPoints flyrPoints) {
787
                this.lyrPoints = flyrPoints;
788
        }
789
        
790
        public GeoreferencingDialog getDialog() {
791
                return dialog;
792
        }
793
        
794
        /**
795
         * Salva en 2 variables de instancia el valor actual en coordenadas del 
796
         * mundo del punto seleccionado. Esto es util para su posterior restauraci?n.
797
         */
798
        public void setCurrentWC() {
799
                int posSelect = 0;
800
                try{
801
                        if(tableControlerPanel1 != null)
802
                                posSelect = tableControlerPanel1.getSelectedIndex();
803
                        if(lyrPoints != null){
804
                                this.currentMapX = lyrPoints.getPoint(posSelect).mapPoint.getX();
805
                                this.currentMapY = lyrPoints.getPoint(posSelect).mapPoint.getY();
806
                        }
807
                }catch(NullPointerException exc){
808
                        //Si tableControler o la capa de puntos son null no salvamos el punto
809
                }
810
        }
811
        
812
        /**
813
         * Asigna nuevos valores al texto de la latitud y longitud.
814
         * @param x        Longitud
815
         * @param y Latitud
816
         */
817
        public void setTempWC(double x, double y){
818
                dataPointPanel.getLongitud().setText(GeoUtils.tailDecimals(String.valueOf(x), 5) + "");
819
                dataPointPanel.getLatitud().setText(GeoUtils.tailDecimals(String.valueOf(y), 5) + "");
820
        }
821
        
822
        /**
823
         * Restaura el ?ltimo valor seleccionado por el usuario de la latitud
824
         * y longitud.
825
         */
826
        public void replaceWC(){
827
                dataPointPanel.getLongitud().setText(GeoUtils.tailDecimals(String.valueOf(currentMapX), 5) + "");
828
                dataPointPanel.getLatitud().setText(GeoUtils.tailDecimals(String.valueOf(currentMapY), 5) + "");
829
        }
830
        
831
        /**
832
         * Salva en 2 variables de instancia el valor actual en coordenadas del 
833
         * mundo del punto seleccionado. Esto es util para su posterior restauraci?n.
834
         */
835
        public void setCurrentPixelCoord() {
836
                int posSelect = 0;
837
                try{
838
                        if(tableControlerPanel1 != null)
839
                                posSelect = tableControlerPanel1.getSelectedIndex();
840
                        if(lyrPoints != null){
841
                                this.currentPixelX = lyrPoints.getPoint(posSelect).pixelPoint.getX();
842
                                this.currentPixelY = lyrPoints.getPoint(posSelect).pixelPoint.getY();
843
                        }
844
                }catch(NullPointerException exc){
845
                        //Si tableControler o la capa de puntos son null no salvamos el punto
846
                }
847
        }
848
        
849
        /**
850
         * Asigna nuevos valores al texto de la latitud y longitud.
851
         * @param x        Longitud
852
         * @param y Latitud
853
         */
854
        public void setTempPixelCoord(double x, double y){
855
                dataPointPanel.getTX().setText(GeoUtils.tailDecimals(String.valueOf(x), 2) + "");
856
                dataPointPanel.getTY().setText(GeoUtils.tailDecimals(String.valueOf(y), 2) + "");
857
        }
858
        
859
        /**
860
         * Restaura el ?ltimo valor seleccionado por el usuario de la latitud
861
         * y longitud.
862
         */
863
        public void replacePixelCoord(){
864
                dataPointPanel.getTX().setText(GeoUtils.tailDecimals(currentPixelX, 2) + "");
865
                dataPointPanel.getTY().setText(GeoUtils.tailDecimals(currentPixelY, 2) + "");
866
        }
867
        
868
        /**
869
         * Consulta si se han desactivado los controles salvando sus valores
870
         * @return true si se han desactivado los controles salvando previamente
871
         * sus valores y false si est?n en estado normal.
872
         */
873
        public boolean isDisableAllControls() {
874
                return disableAllControls;
875
        }
876
        //**********************End Getters & Setters*****************
877
}