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 / tool / ZoomWheelTool.java @ 1789

History | View | Annotate | Download (5.65 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.tool;
23

    
24
import java.awt.Graphics;
25
import java.awt.event.ActionEvent;
26
import java.awt.event.ActionListener;
27
import java.awt.event.MouseWheelEvent;
28
import java.awt.event.MouseWheelListener;
29
import java.awt.geom.Point2D;
30
import java.awt.geom.Rectangle2D;
31
import javax.swing.Timer;
32

    
33
import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingLibrary;
34
import org.gvsig.raster.georeferencing.swing.view.GeoreferencingView;
35
import org.gvsig.raster.georeferencing.swing.view.ToolEvent;
36
import org.gvsig.raster.georeferencing.swing.view.ToolListener;
37
import org.gvsig.tools.task.Cancellable;
38

    
39
/**
40
 * Herramienta de selecci?n de zoom sobre la vista.
41
 * 
42
 * 17/01/2008
43
 * @author Nacho Brodin (nachobrodin@gmail.com)
44
 */
45
@SuppressWarnings("deprecation")
46
public class ZoomWheelTool extends BaseViewTool implements MouseWheelListener, ActionListener {
47
    private Rectangle2D              result       = null;
48
    private double                   x            = 0;
49
    private double                   y            = 0;
50
    private double                   w            = 0;
51
    private double                   h            = 0;
52
    private Cancellable              cancel       = null;
53
    private Timer                    timer        = new Timer(500, this);
54
    private ToolEvent                toolEvent    = null;
55
    
56
    public class MyCancellable implements Cancellable { 
57
            private boolean cancel = false;
58
                public void setCanceled(boolean canceled) {
59
                        this.cancel = canceled;
60
                }
61
                
62
                public boolean isCanceled() {
63
                        return cancel;
64
                }
65
        };
66

    
67
        /**
68
         * Constructor. Asigna el canvas e inicializa los listeners.
69
         * @param canvas
70
         */
71
        public ZoomWheelTool(ToolListener listener, GeoreferencingView parentView) {
72
                super(parentView.getCanvas(), listener, parentView);
73
                canvas.addMouseWheelListener(this);
74
                type = GeoreferencingSwingLibrary.ZOOM_WHEEL_TOOL;
75
                cancel = new MyCancellable();
76
        }
77
        
78
        /*
79
         * (non-Javadoc)
80
         * @see org.gvsig.rastertools.georeferencing.ui.zoom.IViewTool#draw(java.awt.image.BufferedImage, java.awt.geom.Rectangle2D)
81
         */
82
        public void draw(Graphics g) {
83
        
84
        }
85

    
86
        /*
87
         * (non-Javadoc)
88
         * @see org.gvsig.rastertools.georeferencing.ui.zoom.IViewTool#getResult()
89
         */
90
        public Object getResult() {
91
                return result;
92
        }
93

    
94
        
95
        /**
96
         * Asigna el flag que activa y desactiva la herramienta 
97
         * @param active true para activarla y false para desactivarla
98
         */
99
        public void setActive(boolean active) {
100
                this.active = active;
101
                if(active)
102
                        onTool(new ToolEvent(this, getParentView(), null));
103
                else
104
                        offTool(new ToolEvent(this, getParentView(), null));
105
        }
106

    
107
        private double scale = 1;
108
        
109
        private synchronized void setScale(double scale) {
110
                this.scale = scale;
111
        }
112
        
113
        public void mouseWheelMoved(MouseWheelEvent e) {
114
                if(e.getWheelRotation() < 1) {
115
                        setScale(scale + 0.1);
116
                } else {
117
                        setScale(scale - 0.02);
118
                }
119
                
120
                double centerX = e.getX();
121
                double centerY = e.getY();
122
                w = (canvas.getWidth() / scale);
123
                h = (canvas.getHeight() / scale);
124
                x = e.getX() - (w / 2);
125
                y = e.getY() - (h / 2);
126

    
127
                //Se calcula un desplazamiento para centrar sobre el cursor del rat?n y no sobre el centro de la vista
128
                Point2D iniPoint = new Point2D.Double(w / 2, h / 2);
129
                Point2D endPoint = new Point2D.Double(e.getX() / scale, e.getY() / scale);
130
                double xx = iniPoint.getX() - endPoint.getX();
131
                double yy = iniPoint.getY() - endPoint.getY();
132
                Point2D displacement = new Point2D.Double(xx, yy); 
133
                
134
                Point2D pInit = canvas.viewCoordsToWorld(new Point2D.Double(x + displacement.getX(), y + displacement.getY()));
135
                Point2D pEnd = canvas.viewCoordsToWorld(new Point2D.Double(x + displacement.getX() + w, y + displacement.getY() + h));
136
                if(canvas.getMinxMaxyUL())
137
                        result = new Rectangle2D.Double(pInit.getX(), pEnd.getY(), Math.abs(pInit.getX() - pEnd.getX()), Math.abs(pInit.getY() - pEnd.getY()));
138
                else
139
                        result = new Rectangle2D.Double(pInit.getX(), pInit.getY(), Math.abs(pInit.getX() - pEnd.getX()), Math.abs(pInit.getY() - pEnd.getY()));
140

    
141
                //Reescalado y desplazamiento del canvas para dar sensaci?n de carga r?pida
142
                double shiftX = centerX - (centerX * scale);
143
                double shiftY = centerY - (centerY * scale);
144
                canvas.setActiveMoveRedraw(false);
145
                canvas.setZoomAffineTransform(scale, scale, shiftX, shiftY);
146
                //System.out.println(scale + " " + scale + " " + shiftX + " " + shiftY + " : " + canvas.getAtZoom().toString());
147
                canvas.repaint();
148
                
149
                x = y = w = h = 0;
150
                
151
                if(toolEvent == null) 
152
                        toolEvent = new ToolEvent(this, getParentView(), cancel);
153
                //cancel.setCanceled(true);
154
                
155
                timer.restart();
156
        }
157

    
158
        public void actionPerformed(ActionEvent e) {
159
                //cancel.setCanceled(false);
160
                toolEvent.setResult(result);
161
                for (int i = 0; i < listeners.size(); i++) 
162
                        ((ToolListener)listeners.get(i)).endAction(toolEvent);
163
                canvas.setActiveMoveRedraw(true);
164
                setScale(1);
165
                timer.stop();
166
        }
167
}