Statistics
| Revision:

gvsig-raster / org.gvsig.raster.georeferencing / trunk / org.gvsig.raster.georeferencing / org.gvsig.raster.georeferencing.swing / org.gvsig.raster.georeferencing.swing.impl / src / main / java / org / gvsig / raster / georeferencing / swing / impl / view / ViewControl.java @ 1752

History | View | Annotate | Download (24.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.swing.impl.view;
23

    
24
import java.awt.BorderLayout;
25
import java.awt.GridBagConstraints;
26
import java.awt.GridBagLayout;
27
import java.awt.Insets;
28
import java.awt.event.ActionEvent;
29
import java.awt.event.ActionListener;
30
import java.awt.geom.Point2D;
31
import java.awt.geom.Rectangle2D;
32
import java.awt.image.BufferedImage;
33
import java.util.ArrayList;
34
import java.util.List;
35

    
36
import javax.swing.JButton;
37
import javax.swing.JPanel;
38
import javax.swing.JToggleButton;
39

    
40
import org.gvsig.andami.IconThemeHelper;
41
import org.gvsig.i18n.Messages;
42
import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingLibrary;
43
import org.gvsig.raster.georeferencing.swing.exception.InvalidRequestException;
44
import org.gvsig.raster.georeferencing.swing.impl.GeoreferencingSwingImplLibrary;
45
import org.gvsig.raster.georeferencing.swing.impl.layer.ZoomCursorGraphicLayer;
46
import org.gvsig.raster.georeferencing.swing.impl.tool.BaseViewTool;
47
import org.gvsig.raster.georeferencing.swing.impl.tool.PanTool;
48
import org.gvsig.raster.georeferencing.swing.impl.tool.ZoomRectangleTool;
49
import org.gvsig.raster.georeferencing.swing.view.GeoreferencingView;
50
import org.gvsig.raster.georeferencing.swing.view.IViewRequestManager;
51
import org.gvsig.raster.georeferencing.swing.view.IGraphicLayer;
52
import org.gvsig.raster.georeferencing.swing.view.ToolEvent;
53
import org.gvsig.raster.georeferencing.swing.view.ToolListener;
54
import org.gvsig.raster.georeferencing.swing.view.ViewEvent;
55
import org.gvsig.raster.georeferencing.swing.view.ViewListener;
56

    
57
/**
58
 * <P>
59
 * Control de zoom. Muestra una imagen contenida en un buffer con controles de aumento
60
 * y disminuci?n del zoom de la misma. 
61
 * </P><P>
62
 * El visualizador mostrar? el buffer de datos pasado en <code>setDrawParams</code>. 
63
 * En esta llamada asignamos tambi?n el Extent del ?rea de datos, tama?o de pixel y punto
64
 * del buffer que coincidir? con el centro del control de zoom. De esta forma la imagen 
65
 * visualizada se centra sobre este punto. En caso de no tener informaci?n geogr?fica del
66
 * buffer de datos a visualizar el Extent coincidir? con su tama?o en p?xeles y el tama?o
67
 * de pixel ser? de 1. El punto donde queramos centrar en este caso se dar? tambi?n en 
68
 * coordenadas pixel.
69
 * </P><P>
70
 * Hay dos usos posibles en este control al accionar el bot?n de zoom: el primero de ellos, en
71
 * caso de que no haya ning?n listener del control de zoom registrado. En este caso se
72
 * aplicar? un escalado sobre los datos del buffer pasado por par?metro. En el caso de que
73
 * haya un listener registrado (IExtensionBuffer) no se aplicar? un escalado sobre el buffer
74
 * sino que se aplicar? una escala de 1.0 y se ejecutar? el m?todo request del interfaz 
75
 * registrado para que el cliente reciba notificaci?n del nuevo extent. 
76
 * </P>
77
 * <P>
78
 * En la inicializaci?n podemos solicitar que los controles de zoom est?n a la izquierda, 
79
 * a la derecha o no esten.
80
 * </p>
81
 *                 
82
 * 21/12/2007
83
 * @author Nacho Brodin nachobrodin@gmail.com
84
 */
85
public class ViewControl extends JPanel  implements ActionListener, ToolListener {
86
        private static final long        serialVersionUID    = 1L;
87
        //Lista de controles
88
        public static final int          ZOOM_INCREASE       = 0;
89
        public static final int          ZOOM_DECREASE       = 1;
90
        public static final int          SELECT_ZOOM_AREA    = 2;
91
        public static final int          FULL_VIEW           = 3;
92
        public static final int          PREV_ZOOM           = 4;
93
        public static final int          PAN                 = 5;
94
        public static final int          LOCATOR             = 6;
95
        
96
        public static final int          RIGHT_CONTROL       = 1;
97
        public static final int          LEFT_CONTROL        = 2;
98
        public static final int          NOCONTROL           = 0;
99
        
100
        private final double             SCALE               = 0.5;
101
        
102
        private int                      controlsPosition;
103
        private CanvasZone               canvas              = null;
104
        private JPanel                   buttons             = null;
105
        private JButton                                  bZoomMas            = null;
106
        private JButton                                  bZoomMenos          = null;
107
        private JToggleButton            bSelectZoomArea     = null;
108
        private JToggleButton            bMove               = null;
109
        private JButton                                  bFullView           = null;
110
        private JButton                                  bPrevZoom           = null;
111
        private JButton                                  bCenterLocator      = null;
112
        private double                   stepScale           = 2;
113
        private IViewRequestManager      extReq              = null;
114
        private ViewRecord               zoomRecord          = null;
115
        private List<BaseViewTool>       toolList            = null;
116
    private ViewListener             viewListener        = null;
117
    private ViewEvent                viewEvent           = null;
118
        
119
        /**
120
         * Constructor. Crea el panel y asigna el lado donde se crear?n los botones
121
         * @param right true para los botones a derecha y false para la izquierda
122
         */
123
        public ViewControl(int control, GeoreferencingView parentView) {
124
                this.controlsPosition = control;
125
                toolList = new ArrayList<BaseViewTool>();
126
                
127
                init();
128
        }
129
        
130
        /**
131
         * Asigna el listener de eventos de la vista
132
         * @param listener
133
         */
134
        public void setViewListener(ViewListener listener) {
135
                this.viewListener = listener;
136
                viewEvent = new ViewEvent(this);
137
                getCanvas().setViewListener(viewListener);
138
        }
139
                
140
        /**
141
         * A?ade una tool a la vista de zoom
142
         * @param tool
143
         */
144
        public void addTool(BaseViewTool tool) {
145
                if(!toolList.contains(tool)) 
146
                        toolList.add(tool);
147
        }
148
        
149
        /**
150
         * A?ade una tool a la vista de zoom
151
         * @param tool
152
         */
153
        public void replaceTool(BaseViewTool tool) {
154
                for (int i = 0; i < toolList.size(); i++) {
155
                        if(toolList.get(i).getClass().isInstance(tool)) {
156
                                toolList.remove(i);
157
                                break;
158
                        }
159
                        toolList.add(tool);
160
                }
161
        }
162
        
163
        /**
164
         * Obtiene la tool seleccionada
165
         * @return
166
         */
167
        public BaseViewTool getToolSelected() {
168
                return getCanvas().getSelectedTool();
169
        }
170
        
171
        /**
172
         * Selecciona una herramienta a partir de su clase. Si el argumento es null
173
         * elimina cualquier herramienta seleccionada.
174
         * @param tool
175
         */
176
        /*public void selectTool(Class<?> tool, boolean select) {
177
                //Si tool es null se desactivan todas y ponemos la seleccionada en el canvas a null
178
                if(tool == null) {
179
                        for (int i = 0; i < toolList.size(); i++)
180
                                ((BaseViewTool)toolList.get(i)).setActive(false);
181
                        getCanvas().setSelectedTool(null);
182
                        return;
183
                }
184
                
185
                //Si seleccionamos una esta se activa, se asigna al canvas y las otras se desactivan
186
                if(select) {
187
                        for (int i = 0; i < toolList.size(); i++) {
188
                                if(tool.isInstance(toolList.get(i))) {
189
                                        ((BaseViewTool)toolList.get(i)).setActive(true);
190
                                        getCanvas().setSelectedTool((BaseViewTool)toolList.get(i));
191
                                        if(viewListener != null)
192
                                                viewListener.addingTool(viewEvent);
193
                                } else
194
                                        ((BaseViewTool)toolList.get(i)).setActive(false);
195
                        }
196
                        return;
197
                }
198
                //Si quitamos una esta se desactiva y si es la del canvas se quita tambi?n
199
                for (int i = 0; i < toolList.size(); i++) {
200
                        if(tool.isInstance(toolList.get(i))) {
201
                                ((BaseViewTool)toolList.get(i)).setActive(false);
202
                                if(tool.isInstance(getCanvas().getSelectedTool()))
203
                                        getCanvas().setSelectedTool(null);
204
                        }
205
                }
206
        }*/
207

    
208
        public void enableTool(int tool) {
209
                if(tool < 0) {
210
                        disableAllTools();
211
                        return;
212
                }
213

    
214
                for (int i = 0; i < toolList.size(); i++) {
215
                        if(toolList.get(i).getToolType() == tool) {
216
                                ((BaseViewTool)toolList.get(i)).setActive(true);
217
                                getCanvas().setSelectedTool((BaseViewTool)toolList.get(i));
218
                                if(viewListener != null)
219
                                        viewListener.addingTool(viewEvent);
220
                        }
221
                }
222
                return;
223
        }
224

    
225
        /**
226
         * Selecciona una herramienta a partir de su clase deseleccionando cualquier
227
         * otra que estuviera activa. Si el argumento es null
228
         * elimina cualquier herramienta seleccionada.
229
         * @param tool
230
         */
231
        public void selectUniqueTool(Class<?> tool) {
232
                if(tool == null) {
233
                        for (int i = 0; i < toolList.size(); i++)
234
                                ((BaseViewTool)toolList.get(i)).setActive(false);
235
                        getCanvas().setSelectedTool(null);
236
                        return;
237
                }
238
                for (int i = 0; i < toolList.size(); i++) {
239
                        if(tool.isInstance(toolList.get(i))) {
240
                                ((BaseViewTool)toolList.get(i)).setActive(true);
241
                                getCanvas().setSelectedTool((BaseViewTool)toolList.get(i));
242
                                if(viewListener != null)
243
                                        viewListener.addingTool(viewEvent);
244
                        } else
245
                                ((BaseViewTool)toolList.get(i)).setActive(false);
246
                }
247
        }
248
        
249
        /**
250
         * Registra un listener a la tool especificada por el par?metro de la llamada.
251
         * @param tool Clase de la tool a la que queremos registrar el listener
252
         * @return true si se ha registrado con ?xito y false si no se ha hecho
253
         */
254
        public boolean registerToolListener(Class<?> tool, ToolListener listener) {
255
                if(tool == null)
256
                        return false;
257
                for (int i = 0; i < toolList.size(); i++) {
258
                        if(tool.isInstance(toolList.get(i))) {
259
                                ((BaseViewTool)toolList.get(i)).addToolListener(listener);
260
                                return true;
261
                        }
262
                }
263
                return false;
264
        }
265
        
266
        /**
267
         * Desactiva las herramientas temporalmente. Guarda el estado en el que estaban
268
         * para restaurarlo cuando se invoque a awake
269
         */
270
        public void sleepTools() {
271
                for (int i = 0; i < toolList.size(); i++) 
272
                        ((BaseViewTool)toolList.get(i)).sleep();
273
        }
274
        
275
        public void disableAllTools() {
276
                for (int i = 0; i < toolList.size(); i++) {
277
                        ((BaseViewTool)toolList.get(i)).setActive(false);
278
                }
279
                getBMove().setSelected(false);
280
                getBSelectZoomArea().setSelected(false);
281
                getCanvas().setSelectedTool(null);
282
        }
283
        
284
        /**
285
         * Disables a tool in this view
286
         * @param enable
287
         */
288
        public void disableTool(int tool) {
289
                for (int i = 0; i < toolList.size(); i++) {
290
                        if(toolList.get(i).getToolType() == tool) {
291
                                ((BaseViewTool)toolList.get(i)).setActive(false);
292
                        }
293
                }
294
        }
295
        
296
        /**
297
         * Recupera el estado de activaci?n que ten?a antes de la ?ltima invocaci?n 
298
         * de sleep
299
         */
300
        public void awakeTools() {
301
                for (int i = 0; i < toolList.size(); i++) 
302
                        ((BaseViewTool)toolList.get(i)).awake();
303
        }
304
        
305
        /**
306
         * Inicializaci?n de los componetes
307
         */
308
        private void init() {
309
                BorderLayout layout = new BorderLayout();
310
                setLayout(layout); 
311
                
312
                if(controlsPosition == LEFT_CONTROL)
313
                        add(getButtonsPanel(), BorderLayout.WEST);
314
                if(controlsPosition == RIGHT_CONTROL)
315
                        add(getButtonsPanel(), BorderLayout.EAST);
316
                
317
                add(getCanvas(), BorderLayout.CENTER);
318
        }
319
        
320
        /**
321
         * Oculta el bot?n indicado en el par?metro
322
         * @param b Constante definida en ZoomControl
323
         */
324
        public void hideButton(int b) {
325
                switch (b) {
326
                case ZOOM_INCREASE: this.getBZoomMas().setVisible(false);
327
                        break;
328
                case ZOOM_DECREASE: this.getBZoomMenos().setVisible(false);
329
                        break;
330
                case SELECT_ZOOM_AREA: this.getBSelectZoomArea().setVisible(false);
331
                        break;
332
                case FULL_VIEW: this.getBFullView().setVisible(false);
333
                        break;
334
                case PREV_ZOOM: this.getBPrevZoom().setVisible(false);
335
                        break;
336
                case PAN: this.getBMove().setVisible(false);
337
                        break;
338
                case LOCATOR: this.getBCenterLocator().setVisible(false);
339
                        break;
340
                default:
341
                        break;
342
                }
343
        }
344
        
345
        /**
346
         * Muestra el bot?n indicado en el par?metro
347
         * @param b Constante definida en ZoomControl
348
         */
349
        public void showButton(int b) {
350
                switch (b) {
351
                case ZOOM_INCREASE: this.getBZoomMas().setVisible(true);
352
                        break;
353
                case ZOOM_DECREASE: this.getBZoomMenos().setVisible(true);
354
                        break;
355
                case SELECT_ZOOM_AREA: this.getBSelectZoomArea().setVisible(true);
356
                        break;
357
                case FULL_VIEW: this.getBFullView().setVisible(true);
358
                        break;
359
                case PREV_ZOOM: this.getBPrevZoom().setVisible(true);
360
                        break;
361
                case PAN: this.getBMove().setVisible(true);
362
                        break;
363
                case LOCATOR: this.getBCenterLocator().setVisible(true);
364
                        break;
365
                default:
366
                        break;
367
                }
368
        }
369
        
370
        /**
371
         * Asigna una capa gr?fica
372
         * @param layer IGraphicLayer
373
         */
374
        public void setGraphicLayer(IGraphicLayer layer) {
375
                getCanvas().setGraphicLayer(layer);
376
        }
377
        
378
        /**
379
         * Obtiene el panel de dibujado del zoom
380
         * @return Canvas Zone
381
         */
382
        public CanvasZone getCanvas() {
383
                if(canvas == null) {
384
                        canvas = new CanvasZone();
385
                        canvas.setViewListener(viewListener);
386
                        canvas.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
387
                }
388
                return canvas;
389
        }
390
        
391
        /**
392
         * Obtiene el panel con los botones de zoom
393
         * @return 
394
         */
395
        public JPanel getButtonsPanel() {
396
                if(buttons == null) {
397
                        buttons = new JPanel();
398
                        GridBagLayout l = new GridBagLayout();
399
                        GridBagConstraints gbc = new GridBagConstraints();
400
                        gbc.insets = new Insets(5, 0, 3, 3);
401
                        buttons.setLayout(l);
402
                        
403
                        buttons.add(getBZoomMas(), gbc);
404
                        gbc.gridy = 1;
405
                        buttons.add(getBZoomMenos(), gbc);
406
                        gbc.gridy = 2;
407
                        buttons.add(getBSelectZoomArea(), gbc);
408
                        gbc.gridy = 3;
409
                        buttons.add(getBFullView(), gbc);
410
                        gbc.gridy = 4;
411
                        buttons.add(getBPrevZoom(), gbc);
412
                        gbc.gridy = 5;
413
                        buttons.add(getBMove(), gbc);
414
                        gbc.gridy = 6;
415
                        buttons.add(getBCenterLocator(), gbc);
416
                }
417
                return buttons;
418
        }
419
        
420
        /**
421
         * Crea el bot?n de zoom m?s
422
         * @return JButton
423
         */
424
        public JButton getBZoomMas() {
425
                if (bZoomMas == null) {
426
                        bZoomMas = new JButton();
427
                        bZoomMas.setToolTipText(Messages.getText("zoom_mas"));
428
                        bZoomMas.setPreferredSize(new java.awt.Dimension(25,25));
429
                        try{
430
                                bZoomMas.setIcon(IconThemeHelper.getImageIcon("increase-icon"));
431
                        }catch(NullPointerException e){
432
                                //Sin icono
433
                        }
434
                        bZoomMas.addActionListener(this);
435
                }
436
                return bZoomMas;
437
        }
438
        
439
        /**
440
         * Crea el bot?n de centrar el localizador
441
         * @return JButton
442
         */
443
        public JButton getBCenterLocator() {
444
                if (bCenterLocator == null) {
445
                        bCenterLocator = new JButton();
446
                        bCenterLocator.setToolTipText(Messages.getText("center_locator"));
447
                        bCenterLocator.setPreferredSize(new java.awt.Dimension(25,25));
448
                        try{
449
                                bCenterLocator.setIcon(IconThemeHelper.getImageIcon("centerlocator-icon"));
450
                        }catch(NullPointerException e){
451
                                //Sin icono
452
                        }
453
                        bCenterLocator.addActionListener(this);
454
                }
455
                return bCenterLocator;
456
        }
457

    
458
        /**
459
         * Crea el bot?n de zoom menos
460
         * @return JButton
461
         */
462
        public JButton getBZoomMenos() {
463
                if (bZoomMenos == null) {
464
                        bZoomMenos = new JButton();
465
                        bZoomMenos.setToolTipText(Messages.getText("zoom_menos"));
466
                        bZoomMenos.setPreferredSize(new java.awt.Dimension(25,25));
467
                        try{
468
                                bZoomMenos.setIcon(IconThemeHelper.getImageIcon("decrease-icon"));
469
                        }catch(NullPointerException e){
470
                                //Sin icono
471
                        }
472
                        bZoomMenos.addActionListener(this);
473
                }
474
                return bZoomMenos;
475
        }
476
        
477
        /**
478
         * Crea el bot?n de selecci?n de zoom por ?rea
479
         * @return JButton
480
         */
481
        public JToggleButton getBSelectZoomArea() {
482
                if (bSelectZoomArea == null) {
483
                        bSelectZoomArea = new JToggleButton();
484
                        bSelectZoomArea.setToolTipText(Messages.getText("select_zoom_area"));
485
                        bSelectZoomArea.setPreferredSize(new java.awt.Dimension(25,25));
486
                        try{
487
                                bSelectZoomArea.setIcon(IconThemeHelper.getImageIcon("selectzoomarea-icon"));
488
                        }catch(NullPointerException e){
489
                                //Sin icono
490
                        }
491
                        bSelectZoomArea.addActionListener(this);
492
                }
493
                return bSelectZoomArea;
494
        }
495
        
496
        /**
497
         * Crea el bot?n de desplazamiento de imagen
498
         * @return JToggleButton
499
         */
500
        public JToggleButton getBMove() {
501
                if (bMove == null) {
502
                        bMove = new JToggleButton();
503
                        bMove.setToolTipText(Messages.getText("move_image"));
504
                        bMove.setPreferredSize(new java.awt.Dimension(25,25));
505
                        try{
506
                                bMove.setIcon(IconThemeHelper.getImageIcon("hand-icon"));
507
                        }catch(NullPointerException e){
508
                                //Sin icono
509
                        }
510
                        bMove.addActionListener(this);
511
                }
512
                return bMove;
513
        }
514
        
515
        /**
516
         * Crea el bot?n de zoom m?s
517
         * @return
518
         */
519
        public JButton getBPrevZoom() {
520
                if (bPrevZoom == null) {
521
                        bPrevZoom = new JButton();
522
                        bPrevZoom.setToolTipText(Messages.getText("prev_zoom"));
523
                        bPrevZoom.setPreferredSize(new java.awt.Dimension(25,25));
524
                        try{
525
                                bPrevZoom.setIcon(IconThemeHelper.getImageIcon("prevzoom-icon"));
526
                        }catch(NullPointerException e){
527
                                //Sin icono
528
                        }
529
                        bPrevZoom.addActionListener(this);
530
                }
531
                return bPrevZoom;
532
        }
533
        
534
        /**
535
         * Crea el bot?n de zoom completo. El zoom completo inicializa al primer zoom 
536
         * que recibi? en caso de que no se est? usando un IExtensionRequest, ya que no tendr?a conocimiento
537
         * del tama?o total de capa, sino solo del buffer que tiene en ese momento. En caso de usar un 
538
         * IExtensionRequest entonces se har? la petici?n correspondiente al interfaz.  
539
         * @return JButton
540
         */
541
        public JButton getBFullView() {
542
                if (bFullView == null) {
543
                        bFullView = new JButton();
544
                        bFullView.setToolTipText(Messages.getText("full_view"));
545
                        bFullView.setPreferredSize(new java.awt.Dimension(25,25));
546
                        try{
547
                                bFullView.setIcon(IconThemeHelper.getImageIcon("fullview-icon"));
548
                        }catch(NullPointerException e){
549
                                //Sin icono
550
                        }
551
                        bFullView.addActionListener(this);
552
                }
553
                return bFullView;
554
        }
555
        
556
        /**
557
         * Asigna los par?metros de dibujado
558
         * @param img Buffer con un ?rea de datos
559
         * @param ext Rectangle2D del ?rea de datos dada 
560
         * @param pixelSize Tama?o de pixel
561
         * @param center Punto del ?rea de datos donde se quiere centrar el dibujado del buffer
562
         */
563
        public void setDrawParams(BufferedImage img, Rectangle2D ext, double pixelSize, Point2D center) {
564
                getZoomRecord().setRequest(ext);
565
                getCanvas().setDrawParams(img, ext, pixelSize, center) ;
566
        }
567
        
568
        /**
569
         * Asigna un nuevo centro de visualizaci?n. Vuelve a realizar la petici?n
570
         * @param center
571
         */
572
        public void setCenter(Point2D center) {
573
                Rectangle2D ext = getCanvas().getExtent();
574
                double diffX = center.getX() - ext.getCenterX();
575
                double diffY = center.getY() - ext.getCenterY();
576
                ext.setRect(ext.getX() + diffX, ext.getY() + diffY, ext.getWidth(), ext.getHeight());
577
                try {
578
                        getCanvas().setForceRequest(true);
579
                        if(extReq != null)
580
                                extReq.request(ext);
581
                } catch (InvalidRequestException e) {
582
                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this);
583
                }
584
        }
585
                
586
        /**
587
         * Registra un objeto IExtensionRequest para que no se aplique un escalado sobre
588
         * el buffer pasado por par?metro. Alternativamente a la aplicaci?n de este escalado
589
         * se ejecutar? el m?todo request del interfaz para que el cliente pueda pasar un 
590
         * nuevo buffer con escala 1:1 y con la extensi?n correspondiente al zoom, Es decir, se 
591
         * deja en manos del cliente la aplicaci?n del zoom.
592
         * @param er
593
         */
594
        public void setExtensionRequest(IViewRequestManager er) {
595
                this.extReq = er;
596
        }
597
        
598
        /**
599
         * Obtiene el objeto IExtensionRequest
600
         * @param er
601
         */
602
        public IViewRequestManager getExtensionRequest() {
603
                return extReq;
604
        }
605
        
606
        /**
607
         * Obtiene el historico de zooms
608
         * @return ZoomRecord
609
         */
610
        public ViewRecord getZoomRecord() {
611
                if(zoomRecord == null) {
612
                        zoomRecord = new ViewRecord();
613
                        //zoomRecord.setRequest(new Integer(FULL_VIEW));
614
                }
615
                return zoomRecord;
616
        }
617

    
618
        /**
619
         * Eventos de los botones zoom m?s y zoom menos.
620
         */
621
        public void actionPerformed(ActionEvent e) {
622
                //Centrar el localizador
623
                if(e.getSource() == bCenterLocator) {
624
                        List<IGraphicLayer> graphicLayers = getCanvas().getGraphicLayers();
625
                        for (int i = 0; i < graphicLayers.size(); i++) {
626
                                if(graphicLayers.get(i) instanceof ZoomCursorGraphicLayer) { 
627
                                        ((ZoomCursorGraphicLayer)graphicLayers.get(i)).setCursorPosition(getCanvas().getWidth() / 2, canvas.getHeight() / 2);
628
                                        ((ZoomCursorGraphicLayer)graphicLayers.get(i)).resetCursorSize();
629
                                }
630
                        }
631
                }
632
                
633
                if(extReq == null) {
634
                        if(e.getSource() == bZoomMas)
635
                                getCanvas().setZoom(canvas.getZoom() * stepScale);
636

    
637
                        if(e.getSource() == bZoomMenos)
638
                                getCanvas().setZoom(canvas.getZoom() / stepScale);
639
                        
640
                        if(e.getSource() == bFullView) 
641
                                getCanvas().setZoom(1);
642

    
643
                } else {
644
                        double width = 0, height = 0;
645
                        getCanvas().setZoom(1);
646
                        
647
                        //Zoom Todo
648
                        if(e.getSource() == bFullView) {
649
                                try {
650
                                        extReq.fullExtent();
651
                                } catch (InvalidRequestException e1) {
652
                                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this);
653
                                }
654
                                return;
655
                        }
656
                        
657
                        //Zoom Anterior
658
                        if(e.getSource() == bPrevZoom) {
659
                                Object request = getZoomRecord().getRequest();
660
                                if(request != null) {
661
                                        if(request instanceof Rectangle2D) {
662
                                                try {
663
                                                        extReq.request((Rectangle2D)request);
664
                                                } catch (InvalidRequestException e1) {
665
                                                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this);
666
                                                }
667
                                        }
668
                                        if(request instanceof Integer && ((Integer)request).intValue() == FULL_VIEW) {
669
                                                try {
670
                                                        extReq.fullExtent();
671
                                                } catch (InvalidRequestException e1) {
672
                                                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this);
673
                                                }
674
                                        }
675
                                        getZoomRecord().getRequest(); //El que hemos metido al hacer zoom previo no sirve por lo que hay que sacarlo
676
                                }
677
                                return;
678
                        }
679
                        
680
                        width = getCanvas().getCanvasExtent().getWidth();
681
                        height = getCanvas().getCanvasExtent().getHeight();
682
                        
683
                        //Desplazamiento
684
                        if(e.getSource() == bMove) {
685
                                if(getBMove().isSelected()) {
686
                                        for (int i = 0; i < toolList.size(); i++)
687
                                                ((BaseViewTool)toolList.get(i)).setActive(false);
688
                                        getBSelectZoomArea().setSelected(false);
689
                                        enableTool(GeoreferencingSwingLibrary.PAN_TOOL);
690
                                } else
691
                                        disableTool(GeoreferencingSwingLibrary.PAN_TOOL);
692
                        }
693
                        
694
                        //Zoom por selecci?n de ?rea
695
                        if(e.getSource() == bSelectZoomArea) {
696
                                if(getBSelectZoomArea().isSelected()) {
697
                                        for (int i = 0; i < toolList.size(); i++)
698
                                                ((BaseViewTool)toolList.get(i)).setActive(false);
699
                                        getBMove().setSelected(false);
700
                                        enableTool(GeoreferencingSwingLibrary.ZOOM_RECTANGLE_TOOL);
701
                                } else
702
                                        disableTool(GeoreferencingSwingLibrary.ZOOM_RECTANGLE_TOOL);
703
                        }
704
                        
705
                        //Zoom m?s
706
                        if(e.getSource() == bZoomMas) {
707
                                width = getCanvas().getCanvasExtent().getWidth() * SCALE;
708
                                height = getCanvas().getCanvasExtent().getHeight() * SCALE;
709
                        }
710
                        
711
                        //Zoom menos
712
                        if(e.getSource() == bZoomMenos) {
713
                                width = getCanvas().getCanvasExtent().getWidth() / SCALE;
714
                                height = getCanvas().getCanvasExtent().getHeight() / SCALE;
715
                        }
716
                        //C?digo com?n a bZoomMas y bZoomMenos
717
                        double x = getCanvas().getCenter().getX() - (width / 2);
718
                        double y = getCanvas().getCenter().getY() - (height / 2);
719
                        Rectangle2D request = new Rectangle2D.Double(x, y, width, height);
720
                        try {
721
                                extReq.request(request);
722
                        } catch (InvalidRequestException e1) {
723
                                GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this);
724
                        }
725
                }
726
        }
727
        
728
        /**
729
         * Recarga la vista con los par?metros de tama?o y
730
         * extensi?n actuales
731
         */
732
        public void reload() {
733
                double width = getCanvas().getCanvasExtent().getWidth();
734
                double height = getCanvas().getCanvasExtent().getHeight();
735
                double x = getCanvas().getCenter().getX() - (width / 2);
736
                double y = getCanvas().getCenter().getY() - (height / 2);
737
                Rectangle2D request = new Rectangle2D.Double(x, y, width, height);
738
                try {
739
                        getCanvas().setForceRequest(true);
740
                        if(extReq != null)
741
                                extReq.request(request);
742
                } catch (InvalidRequestException e1) {
743
                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this);
744
                }
745
        }
746
        
747
        /** 
748
         * Obtiene el ancho del canvas
749
         * @return 
750
         */
751
        public int getCanvasWith() {
752
                return getCanvas().getVisibleRect().width;
753
        }
754
        
755
        /**
756
         * Obtiene el alto del canvas
757
         * @return
758
         */
759
        public int getCanvasHeight() {
760
                return getCanvas().getVisibleRect().height;
761
        }
762

    
763
        /**
764
         * Evento de finalizaci?n de la tool que maneja el viewControl y de la capa con el 
765
         * cursor gr?fico que controla el ?rea de la miniimagen asociada
766
         */
767
        public void endAction(ToolEvent ev) {
768
                if(ev.getSource() instanceof ZoomRectangleTool || ev.getSource() instanceof PanTool) {
769
                        if(getCanvas().getSelectedTool().getResult() instanceof Rectangle2D) {
770
                                Rectangle2D extent = (Rectangle2D)getCanvas().getSelectedTool().getResult();
771
                                try {
772
                                        if(extReq != null)
773
                                                extReq.request(extent);
774
                                } catch (InvalidRequestException e1) {
775
                                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this);
776
                                }
777
                        }
778
                }
779
        }
780
        
781
        /*
782
         * (non-Javadoc)
783
         * @see org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolListener#activeTool(org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolEvent)
784
         */
785
        public void onTool(ToolEvent ev) {}
786
        
787
        /*
788
         * (non-Javadoc)
789
         * @see org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolListener#offTool(org.gvsig.rastertools.georeferencing.ui.zoom.tools.ToolEvent)
790
         */
791
        public void offTool(ToolEvent ev) {}
792

    
793
}