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

History | View | Annotate | Download (6.17 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, y = 0, w = 0, h = 0;
49
    private Cancellable              cancel = null;
50
    //private Drawer                   drawer = null;
51
    private Timer                    timer  = new Timer(500, this);
52
    
53
    public class MyCancellable implements Cancellable { 
54
            private boolean cancel = false;
55
                public void setCanceled(boolean canceled) {
56
                        this.cancel = canceled;
57
                }
58
                
59
                public boolean isCanceled() {
60
                        return cancel;
61
                }
62
        };
63

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

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

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

    
104
        private double scale = 1;
105
        
106
        private synchronized void setScale(double scale) {
107
                this.scale = scale;
108
        }
109
        
110
        private ToolEvent toolEvent = null;
111
                
112
        public void mouseWheelMoved(MouseWheelEvent e) {
113
                //cancel.setCanceled(true);
114
                if(e.getWheelRotation() < 1) {
115
                        setScale(scale + 0.2);
116
                } else {
117
                        setScale(scale - 0.2);
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
                canvas.repaint();
147
                
148
                x = y = w = h = 0;
149
                
150
                if(toolEvent == null) 
151
                        toolEvent = new ToolEvent(this, getParentView(), null);
152
                toolEvent.setResult(result);
153
                        
154
                timer.restart();
155
//
156
//                cancel.setCanceled(true);
157
//                cancel = new MyCancellable();
158
//                ToolEvent event = new ToolEvent(this, getParentView(), cancel);
159
//                for (int i = 0; i < listeners.size(); i++) {
160
//                        ((ToolListener)listeners.get(i)).endAction(event);
161
//                }
162
//                //BufferedImage img = (BufferedImage)event.getResult();
163
//
164
//                canvas.setActiveMoveRedraw(true);
165
//                setScale(1);
166
        }
167
        
168
        
169
        /*public class Drawer extends Thread {
170
                public void run() {
171
                        cancel = new MyCancellable();
172
                        for (int i = 0; i < listeners.size(); i++) 
173
                                ((ToolListener)listeners.get(i)).endAction(new ToolEvent(this, getParentView(), cancel));
174
                        canvas.setActiveMoveRedraw(true);
175
                        setScale(1);
176
                        //canvas.repaint();
177
                }
178
        }
179
        
180
        public Drawer getDrawer() {
181
                if(drawer == null)
182
                        drawer = new Drawer();
183
                return drawer;
184
        }*/
185

    
186
        public void actionPerformed(ActionEvent e) {
187
                //cancel = new MyCancellable();
188
                for (int i = 0; i < listeners.size(); i++) 
189
                        ((ToolListener)listeners.get(i)).endAction(toolEvent);
190
                canvas.setActiveMoveRedraw(true);
191
                setScale(1);
192
                timer.stop();
193
        }
194
}