Statistics
| Revision:

root / trunk / extensions / extGeoreferencing / src / com / iver / cit / gvsig / gui / Panels / ZoomControlPanel.java @ 3044

History | View | Annotate | Download (15.7 KB)

1
package com.iver.cit.gvsig.gui.Panels;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Canvas;
5
import java.awt.Color;
6
import java.awt.Component;
7
import java.awt.Graphics;
8
import java.awt.Graphics2D;
9
import java.awt.GridBagConstraints;
10
import java.awt.GridBagLayout;
11
import java.awt.Image;
12
import java.awt.event.ActionEvent;
13
import java.awt.event.ActionListener;
14
import java.awt.event.MouseEvent;
15
import java.awt.event.MouseListener;
16
import java.awt.event.MouseMotionListener;
17
import java.awt.geom.Point2D;
18
import java.awt.geom.Rectangle2D;
19
import java.awt.image.BufferedImage;
20

    
21
import javax.swing.ImageIcon;
22
import javax.swing.JButton;
23
import javax.swing.JOptionPane;
24
import javax.swing.JPanel;
25

    
26
import com.iver.andami.PluginServices;
27
import com.iver.cit.gvsig.fmap.DriverException;
28
import com.iver.cit.gvsig.fmap.ViewPort;
29
import com.iver.cit.gvsig.fmap.layers.FLayer;
30
import com.iver.cit.gvsig.fmap.layers.FLayers;
31
import com.iver.cit.gvsig.fmap.layers.FLyrGeoRaster;
32
import com.iver.cit.gvsig.fmap.layers.FLyrPoints;
33
import com.iver.cit.gvsig.fmap.operations.Cancellable;
34
import com.iver.cit.gvsig.gui.View;
35
import com.iver.cit.gvsig.gui.Dialogs.GeoreferencingDialog;
36

    
37
/**
38
 * Panel que contiene los controles de zoom de la vista para 
39
 * afinar en la georreferenciaci?n.
40
 * 
41
 * @author Nacho Brodin (brodin_ign@gva.es)
42
 *
43
 */
44
public class ZoomControlPanel extends JPanel implements ActionListener{
45
        private JPanel pImage = null;
46
        private JPanel pControls = null;
47
        private JButton bZoomMas = null;
48
        private JButton bZoomMenos = null;
49

    
50
        private int sX = 140, sY = 140; 
51
        private CanvasZone canvas = null;
52
        private ViewPort viewPort = null;
53
        
54
    private int numberPoint = -1;
55
    
56
    public FLyrPoints lyrPoints = null;
57
    public FLyrGeoRaster lyrGeoRaster = null;
58
    public GeoreferencingDialog dialog = null;
59
    
60
   
61
    
62
        /**
63
         * This is the default constructor
64
         */
65
        public ZoomControlPanel(boolean rightControl) {
66
                super();
67
                initialize(rightControl);
68
        }
69

    
70
        /**
71
         * This method initializes this
72
         * 
73
         * @return void
74
         */
75
        private void initialize(boolean rightControl) {
76
                
77
        GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
78
        if(rightControl)
79
                gridBagConstraints1.gridx = 1;
80
        else
81
                gridBagConstraints1.gridx = 0;
82
        gridBagConstraints1.gridy = 0;
83
        GridBagConstraints gridBagConstraints = new GridBagConstraints();
84
        if(rightControl)
85
                gridBagConstraints.gridx = 0;
86
        else
87
                gridBagConstraints.gridx = 1;
88
        gridBagConstraints.gridy = 0;
89
        this.setLayout(new GridBagLayout());
90
        this.setPreferredSize(new java.awt.Dimension(175,142));
91
        this.setSize(new java.awt.Dimension(175,142));
92
        this.setLocation(new java.awt.Point(0,0));
93
        this.add(getPImage(), gridBagConstraints);
94
        this.add(getPControls(), gridBagConstraints1);        
95
        }
96

    
97
        /**
98
         * Carga las capas de puntos y de raster georreferenciado
99
         *
100
         */
101
        public void loadLayer(){
102
                //Cargamos la capa
103
                View theView = (View) PluginServices.getMDIManager().getActiveView();
104
                for(int i=0;i<theView.getMapControl().getMapContext().getLayers().getLayersCount();i++){
105
                        FLayer lyr = theView.getMapControl().getMapContext().getLayers().getLayer(i);
106
                        if(lyr instanceof FLyrPoints)
107
                                lyrPoints = (FLyrPoints)lyr;
108
                        if(        lyr instanceof FLyrGeoRaster && 
109
                                lyr.getName().startsWith("*") &&
110
                                lyr.isActive())
111
                                lyrGeoRaster = (FLyrGeoRaster)lyr;
112
                }
113
                dialog = lyrGeoRaster.getGeoDialog();
114
        }
115
        
116
        /**
117
         * This method initializes jPanel        
118
         *         
119
         * @return javax.swing.JPanel        
120
         */
121
        private JPanel getPImage() {
122
                if (pImage == null) {
123
                        pImage = new JPanel();
124
                        BorderLayout borderLayout = new BorderLayout();
125
                        pImage.setLayout(borderLayout);
126
                        pImage.setPreferredSize(new java.awt.Dimension(140,140));
127
                        pImage.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
128
                        if(canvas == null){
129
                                canvas = new CanvasZone(sX, sY, this);
130
                                canvas.setVisible(false);
131
                                canvas.addMouseListener(canvas);
132
                                canvas.addMouseMotionListener(canvas);
133
                        }
134
                        pImage.add(canvas, BorderLayout.CENTER);
135
                        
136
                }
137
                return pImage;
138
        }
139

    
140
        /**
141
         * This method initializes jPanel1        
142
         *         
143
         * @return javax.swing.JPanel        
144
         */
145
        private JPanel getPControls() {
146
                if (pControls == null) {
147
                        GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
148
                        gridBagConstraints3.gridx = 0;
149
                        gridBagConstraints3.insets = new java.awt.Insets(5,0,0,0);
150
                        gridBagConstraints3.gridy = 1;
151
                        GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
152
                        gridBagConstraints2.gridx = 0;
153
                        gridBagConstraints2.gridy = 0;
154
                        pControls = new JPanel();
155
                        pControls.setLayout(new GridBagLayout());
156
                        pControls.setPreferredSize(new java.awt.Dimension(33,140));
157
                        pControls.add(getBZoomMas(), gridBagConstraints2);
158
                        pControls.add(getBZoomMenos(), gridBagConstraints3);
159
                }
160
                return pControls;
161
        }
162

    
163
        /**
164
         * This method initializes jButton        
165
         *         
166
         * @return javax.swing.JButton        
167
         */
168
        private JButton getBZoomMas() {
169
                if (bZoomMas == null) {
170
                        bZoomMas = new JButton();
171
                        bZoomMas.setPreferredSize(new java.awt.Dimension(25,25));
172
                        bZoomMas.setIcon(new ImageIcon(getClass().getResource("/com/iver/cit/gvsig/gui/Panels/images/aumentar.png")));
173
                        bZoomMas.addActionListener(this);
174
                }
175
                return bZoomMas;
176
        }
177

    
178
        /**
179
         * This method initializes jButton        
180
         *         
181
         * @return javax.swing.JButton        
182
         */
183
        private JButton getBZoomMenos() {
184
                if (bZoomMenos == null) {
185
                        bZoomMenos = new JButton();
186
                        bZoomMenos.setPreferredSize(new java.awt.Dimension(25,25));
187
                        bZoomMenos.setIcon(new ImageIcon(getClass().getResource("/com/iver/cit/gvsig/gui/Panels/images/disminuir.png")));
188
                        bZoomMenos.addActionListener(this);
189
                }
190
                return bZoomMenos;
191
        }
192

    
193
        /**
194
         * @param viewPort The viewPort to set.
195
         */
196
        public void setViewPort(ViewPort viewPort) {
197
                this.viewPort = viewPort;
198
        }
199
        
200
        /**
201
         *Llama a la funci?n de pintado del canvas con los par?metros que tenga en ese momento
202
         */
203
        public void draw(){
204
                if(canvas != null){
205
                        canvas.setViewPort(this.viewPort);
206
                        canvas.repaint();//.update();
207
                }
208
        }
209
        
210
        /**
211
         * Asigna al canvas la propiedad de visibilidad a verdadero o falso.
212
         * @param visible true para mostrar el canvas y false para ocultarlo
213
         */
214
        public void setVisible(boolean visible){
215
                canvas.setVisible(visible);
216
                if(!visible)
217
                        canvas.setSize(0,0);
218
                else{
219
                        canvas.setSize(sX, sY);
220
                }
221
                canvas.repaint();
222
        }
223
        
224
        /**
225
         * Asigna el punto sobre el que se centrar? el zoom de la minimagen
226
         * @param pto
227
         */
228
        public void setCenterPoint(Point2D pto){
229
                canvas.setCenterPoint(pto);
230
        }
231
        
232
        /**
233
         * Asigna el n?mero de punto que se est? tratando
234
         * @param n
235
         */
236
        public void setNumberPoint(int n){
237
                this.numberPoint = n;
238
        }
239
        
240
        /**
241
         * Recupera el n?mero de punto que se est? tratando
242
         * @param n
243
         */
244
        public int getNumberPoint(){
245
                return this.numberPoint;
246
        }
247
        
248
        /**
249
         * Manejo de los controles zoom m?s y zoom menos
250
         */
251
        public void actionPerformed(ActionEvent e) {
252
                if(e.getSource() == bZoomMas){
253
                        canvas.calcZoom(0.6);
254
                        canvas.repaint();//.update();
255
                }
256
                
257
                if(e.getSource() == bZoomMenos){
258
                        canvas.calcZoom(1.8);
259
                        canvas.repaint();//.update();
260
                }
261
                
262
        }
263
        
264

    
265
        /**
266
         * @return Returns the lyrGeoRaster.
267
         */
268
        public FLyrGeoRaster getLyrGeoRaster() {
269
                return lyrGeoRaster;
270
        }
271

    
272
        /**
273
         * @return Returns the dialog.
274
         */
275
        public GeoreferencingDialog getDialog() {
276
                return dialog;
277
        }        
278
        
279
        /**
280
         * Control que representa la zona de dibujado de la ventana. Este se encarga de
281
         * repintar el contenido sobre el Graphics2D a partir del viewPort que se le pase
282
         * @author Nacho Brodin (brodin_ign@gva.es)
283
         */
284
        class CanvasZone extends Canvas implements MouseListener, MouseMotionListener{
285
                private ZoomControlPanel zoomControl = null;
286
            private int ancho;
287
            private int alto;
288
            private FLayers flayers = null;
289
            private ViewPort viewPort = null;
290
            private ViewPort newViewPort = null;
291
            private Point2D centerPoint = null;
292
            private int zoom = 20;
293
            private boolean dragged = false;
294
            private Image dobleBuffer = null;
295
            private BufferedImage imgTmp = null;
296
            private Graphics dbGraphics = null;
297
            
298
            /**
299
             * Puntos inicial y final para el desplazamiento del punto de control
300
             */
301
            private Point2D ptoIni = null, ptoFin = null;
302
            private Point2D movDragged = null, initCrux = null;
303
              
304

    
305
            public CanvasZone( int anc,int alt, ZoomControlPanel zc) {
306
                    zoomControl = zc;
307
                ancho = anc;
308
                alto = alt;
309
              
310
                this.setSize(ancho, alto);            
311
                this.setBackground(Color.WHITE);
312
                
313
                imgTmp = new BufferedImage(this.ancho, this.alto, BufferedImage.TYPE_INT_ARGB);
314
                dobleBuffer = new BufferedImage(this.ancho, this.alto, BufferedImage.TYPE_INT_ARGB);
315
                dbGraphics = dobleBuffer.getGraphics();
316
            }
317
            
318
            /**
319
             * Asigna el viewPort
320
             * @param vp ViewPort
321
             */
322
            public void setViewPort(ViewPort vp){
323
                    this.viewPort = vp;
324
                    this.initViewPort();
325
            }
326

    
327
            /**
328
             * Calcula el zoom dependiendo del factor de escala pasado por
329
             * par?metro.
330
             */
331
            public void calcZoom(double factor){
332
                    Rectangle2D.Double r = new Rectangle2D.Double();
333
                        double nuevoX = centerPoint.getX() -
334
                                ((newViewPort.getExtent().getWidth() * factor) / 2.0);
335
                        double nuevoY = centerPoint.getY() -
336
                                ((newViewPort.getExtent().getHeight() * factor) / 2.0);
337
                        r.x = nuevoX;
338
                        r.y = nuevoY;
339
                        r.width = newViewPort.getExtent().getWidth() * factor;
340
                        r.height = newViewPort.getExtent().getHeight() * factor;
341
                        newViewPort.setExtent(r);
342
            }
343
            
344
            /**
345
             *Calculamos el viewPort para el zoom de la minimagen
346
             */
347
            public void initViewPort(){
348
                    if(centerPoint != null){
349
                            newViewPort = this.viewPort.cloneViewPort();
350
                            
351
                        //Hallamos la relaci?n entre el pixel y las WC a partir de la imagen de la capa
352
                                double relacionPixelWcWidth =  ((viewPort.getExtent().getMaxX() - viewPort.getExtent().getMinX()) / zoom)/this.getWidth();
353
                                double relacionPixelWcHeight = ((viewPort.getExtent().getMaxY() - viewPort.getExtent().getMinY()) / zoom)/this.getHeight();
354
                                
355
                                double wcOriginX = centerPoint.getX() - ((viewPort.getImageWidth()*relacionPixelWcWidth)/2);
356
                                double wcOriginY = centerPoint.getY() - ((viewPort.getImageHeight()*relacionPixelWcHeight)/2);
357
                                
358
                                double wcDstMinX = wcOriginX; 
359
                                double wcDstMinY = wcOriginY; 
360
                                double wcDstMaxX = wcDstMinX + (viewPort.getImageWidth()*relacionPixelWcWidth);
361
                                double wcDstMaxY = wcDstMinY + (viewPort.getImageHeight()*relacionPixelWcHeight);
362
                                
363
                                double wcDstWidth = wcDstMaxX - wcDstMinX;
364
                                double wcDstHeight = wcDstMaxY - wcDstMinY;
365
                                                                
366
                        Rectangle2D ext = new Rectangle2D.Double(wcDstMinX, wcDstMinY, wcDstWidth, wcDstHeight);
367
                        
368
                        newViewPort.setExtent(ext);
369
                            newViewPort.setImageSize(new java.awt.Dimension(this.getWidth(), this.getHeight()));        
370
                            newViewPort.setScale();
371
                    }
372
            }
373
            
374
            public void loadBuffer(){
375
                                        
376
                    Graphics2D gTmp = (Graphics2D)imgTmp.getGraphics();
377
            
378
                    if(!dragged){
379
                            dbGraphics.setColor( Color.WHITE );
380
                            dbGraphics.fillRect( 0,0,ancho,alto );
381
                        
382
                        try{                            
383
                                if(newViewPort != null){
384
                                        //Si no tenemos las capas las cargamos
385
                                         if(flayers == null){
386
                                                 View theView = (View) PluginServices.getMDIManager().getActiveView();
387
                                                 flayers = theView.getMapControl().getMapContext().getLayers();
388
                                         }
389
                                         //dibujamos
390
                                         flayers.draw(null, (Graphics2D) dbGraphics, newViewPort,new Cancellable() {
391
                                                        public boolean isCanceled() {
392
                                                                return false;
393
                                                        }
394
                                         },flayers.getFMap().getScaleView());
395
                                         flayers.draw(null, gTmp, newViewPort,new Cancellable() {
396
                                                        public boolean isCanceled() {
397
                                                                return false;
398
                                                        }
399
                                         },flayers.getFMap().getScaleView());
400
                                }
401
                        }catch (DriverException e) {
402
                                 e.printStackTrace();
403
                        }
404
                }else{
405
                                double x, y;
406
                                if(movDragged != null){
407
                                        x = (movDragged.getX() - ptoIni.getX()) + initCrux.getX();
408
                                        y = (movDragged.getY() - ptoIni.getY()) + initCrux.getY();
409
                                }else{
410
                                        x = ptoIni.getX() + initCrux.getX();
411
                                        y = ptoIni.getY() + initCrux.getY();
412
                                }
413

    
414
                                dbGraphics.drawImage(imgTmp, 0, 0, null);
415
                        dbGraphics.setColor( Color.RED );
416
                        dbGraphics.drawLine((int)(x - 5), (int)y, (int)(x + 5), (int)y);
417
                        dbGraphics.drawLine((int)x, (int)(y - 5), (int)x, (int)(y + 5));
418
                }
419
            }
420
            
421
            
422
            public void update(Graphics g){
423
                    this.paint(g);
424
            }
425
            
426
            /**
427
             * Dibuja sobre el Graphics2D pasado el viewPort solicitado a
428
             * la lista de capas.
429
             * @param g
430
             */
431
            public void paint( Graphics g ) {
432
                    loadBuffer();
433
                    g.drawImage(dobleBuffer, 0, 0, null);
434
            }
435
            
436
            /**
437
             * Asigna el punto donde se centrar? la vista de la minimagen
438
             * @param pto Punto central.
439
             */
440
            public void setCenterPoint(Point2D pto){
441
                    this.centerPoint = pto;
442
            }
443
                        
444
                /* (non-Javadoc)
445
                 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
446
                 */
447
                public void mouseClicked(MouseEvent ev) {
448
                        
449
                }
450
                
451
                /* (non-Javadoc)
452
                 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
453
                 */
454
                public void mouseEntered(MouseEvent arg0) {
455
                        
456
                }
457
                
458
                /* (non-Javadoc)
459
                 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
460
                 */
461
                public void mouseExited(MouseEvent arg0) {
462
                        
463
                }
464
                
465
                /* (non-Javadoc)
466
                 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
467
                 */
468
                public void mousePressed(MouseEvent ev) {
469
                        ptoIni = ev.getPoint();
470
                        zoomControl.loadLayer();
471
                        initCrux = new Point2D.Double();
472
                        initCrux.setLocation(this.getWidth() / 2, this.getHeight() / 2);//zoomControl.lyrPoints.getPoint(zoomControl.getNumberPoint() - 1).mapPoint;
473
                        
474
                        this.dragged = true;
475
                        repaint();
476
                }
477
                
478
                /* (non-Javadoc)
479
                 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
480
                 */
481
                public void mouseReleased(MouseEvent ev) {
482
                        View theView = (View) PluginServices.getMDIManager().getActiveView();
483
                        ViewPort viewPort = theView.getMapControl().getMapContext().getViewPort();
484
                        ptoFin = ev.getPoint();
485
                        this.dragged = false;
486
                        
487
                        double destX = (ptoFin.getX() * centerPoint.getX()) / ptoIni.getX(); 
488
                        double destY = (ptoFin.getY() * centerPoint.getY()) / ptoIni.getY();
489
                        if(flayers == null)
490
                         flayers = theView.getMapControl().getMapContext().getLayers();
491
                 for(int i=0;i<flayers.getLayersCount();i++){
492
                         FLayer lyr = flayers.getLayer(i);
493
                         if(lyr instanceof FLyrPoints){
494
                                 FLyrPoints lp = (FLyrPoints)lyr;
495
                                 Point2D pixelImg = zoomControl.getLyrGeoRaster().world2Img(destX, destY);
496
                                 if(pixelImg == null){
497
                                             JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
498
                                                             PluginServices.getText(this, "fuera_de_extent"));
499
                                             return;
500
                                      }
501
                                 
502
                                 Point2D map = new Point2D.Double();
503
                                 map.setLocation(destX, destY);
504
                                 lp.updatePoint(pixelImg, map, zoomControl.getNumberPoint() - 1);
505
                                 System.out.println("===>"+pixelImg.getX()+" "+pixelImg.getY()+" "+map.getX()+" "+map.getY());
506
                                 //Actualizamos la ventana
507
                                 zoomControl.getDialog().setPixelText(pixelImg.getX(), pixelImg.getY());
508
                                 zoomControl.getDialog().setMapCoordText(map.getX(), map.getY());
509
                         }
510
                 }
511
                 
512
                        
513
                        repaint();
514
                }
515
                
516
                /* (non-Javadoc)
517
                 * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
518
                 */
519
                public void mouseDragged(MouseEvent ev) {
520
                        this.movDragged = ev.getPoint();
521
                        repaint();
522
                        
523
                }
524
                
525
                /* (non-Javadoc)
526
                 * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
527
                 */
528
                public void mouseMoved(MouseEvent arg0) {
529
                        
530
                }
531
                
532
        }
533

    
534

    
535

    
536
        
537
        
538
 }