Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / branches / org.gvsig.raster.tools_dataaccess_refactoring / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / geolocation / behavior / TranslateBehavior.java @ 2340

History | View | Annotate | Download (8.73 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.tools.app.basic.tool.geolocation.behavior;
23

    
24
import java.awt.AlphaComposite;
25
import java.awt.HeadlessException;
26
import java.awt.Image;
27
import java.awt.event.MouseEvent;
28
import java.awt.geom.AffineTransform;
29
import java.awt.geom.NoninvertibleTransformException;
30
import java.awt.geom.Point2D;
31

    
32
import org.gvsig.andami.IconThemeHelper;
33
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
34
import org.gvsig.fmap.mapcontext.ViewPort;
35
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
36
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
37
import org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener;
38
import org.gvsig.raster.fmap.layers.FLyrRaster;
39
import org.gvsig.raster.swing.RasterSwingLibrary;
40

    
41
/**
42
 * Comportamiento que se aplica a la herramienta de translate. El cursor del rat?n cambiar? cuando
43
 * se encuentre en la zona interior al raster, permitiendo el deformar la imagen al pinchar y
44
 * arrastrar.
45
 *
46
 * Nacho Brodin (nachobrodin@gmail.com)
47
 */
48
public class TranslateBehavior extends TransformationBehavior {
49

    
50
        private final Image handCursor = IconThemeHelper.getImage("hand-cursor");
51

    
52
//        private Cursor                         cur = null;
53
        private boolean                        isMoveable = false;
54

    
55
        /**
56
         * Variable booleana que est? a true si el cursor por defecto est?
57
         * activo y a false si hay otro.
58
         */
59
        private boolean                                                 defaultCursorActive = true;
60

    
61
        /**
62
         * Puntos de inicio y final para el arrastre de la imagen.
63
         */
64
        private Point2D                                                 ptoIni = null;
65
        private Point2D                                                 ptoFin = null;
66

    
67
        /**
68
         * Crea un nuevo RectangleBehavior.
69
         *
70
         * @param zili listener.
71
         */
72
        public TranslateBehavior(GeoRasterBehavior grb, Image curImage, ITransformIO windowIO) {
73
                grBehavior = grb;
74
                defaultImage = curImage;
75
                this.trIO = windowIO;
76
        }
77

    
78
        /**
79
         * Coloca el cursor del rat?n con el icono adecuado cuando entra dentro de la
80
         * imagen.
81
         */
82
        public boolean mouseMoved(MouseEvent e) throws BehaviorException {
83

    
84
                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
85

    
86
                try {
87
                        lyr = grBehavior.getLayer();
88
                        if (lyr == null) {
89
                                setActiveTool(false);
90
                                return false;
91
                        }
92

    
93
                        Point2D pto = vp.toMapPoint(e.getX(), e.getY());
94

    
95
                        try {
96
                                if (lyr.isInside(pto)) {
97
                                        grBehavior.setCursorImage(handCursor);
98
                                        //grBehavior.getMapControl().setCursor(Toolkit.getDefaultToolkit().createCustomCursor(handCursor, new Point(16, 16), ""));
99
                                        defaultCursorActive = false;
100
                                        setActiveTool(true);
101
                                        return true;
102
                                } else {
103
                                        if (!defaultCursorActive) {
104
                                                grBehavior.resetDefaultCursor();
105
                                                defaultCursorActive = true;
106
                                                setActiveTool(false);
107
                                                return false;
108
                                        }
109
                                }
110
                        } catch (HeadlessException e1) {
111
                                e1.printStackTrace();
112
                        } catch (IndexOutOfBoundsException e1) {
113
                                e1.printStackTrace();
114
                        }
115
                } catch(ClassCastException exc){
116
                        RasterSwingLibrary.messageBoxError("error_capa_puntos", this, exc);
117
                }
118
                setActiveTool(false);
119
                return false;
120
        }
121

    
122
        /**
123
         * Si no est? activo el cursor por defecto capturamos el punto
124
         * seleccionado en coordenadas del mundo real.
125
         */
126
        public void mousePressed(MouseEvent e) throws BehaviorException {
127
                if (e.getButton() == MouseEvent.BUTTON1 && !defaultCursorActive) {
128
                        setActiveTool(true);
129
                        lyr = grBehavior.getLayer();
130

    
131
                        if (lyr == null)
132
                                return;
133

    
134
                        ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
135
                        ptoIni = vp.toMapPoint(e.getPoint());
136

    
137
                        isMoveable = true;
138
                }
139
        }
140

    
141
        /**
142
         *  Cuando soltamos el bot?n del rat?n desplazamos la imagen a la posici?n
143
         * de destino calculando el extent nuevamente.
144
         */
145
        public void mouseReleased(MouseEvent e) throws BehaviorException {
146
                if (!isActiveTool())
147
                        return;
148
                if (e.getButton() == MouseEvent.BUTTON1 && isMoveable){
149
                        FLyrRaster lyr = grBehavior.getLayer();
150
                        if (lyr == null)
151
                                return;
152

    
153
                        ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
154
                        ptoFin = vp.toMapPoint(e.getPoint());
155

    
156
                        //Asignamos la nueva matriz de transformaci?n a la capa
157
                        AffineTransform atOld = lyr.getAffineTransform();
158
                        AffineTransform atNew = null;
159

    
160
                        double distX = ptoFin.getX() - ptoIni.getX();
161
                        double distY = ptoFin.getY() - ptoIni.getY();
162

    
163
                        //La nueva matriz de transformaci?n es la vieja m?s la distancia desplazada
164
                        atNew = new AffineTransform(atOld.getScaleX(), atOld.getShearY(),
165
                                                                                atOld.getShearX(), atOld.getScaleY(),
166
                                                                                atOld.getTranslateX() + distX,
167
                                                                                atOld.getTranslateY() + distY);
168
                        lyr.setAffineTransform(atNew);
169

    
170
                        grBehavior.getMapControl().getMapContext().invalidate();
171
                        isMoveable = false;
172
                        super.mouseReleased(e);
173
                }
174

    
175
        }
176

    
177
        /**
178
         * <P>
179
         * Funci?n de pintado del canvas. Pintamos un marco a la imagen para saber
180
         * donde la movemos.
181
         * </P>
182
         * <P>
183
         * Para dibujar el marco alrededor del raster hacemos lo mismo que para pintar el raster
184
         * rotado. En realidad dibujamos un cuadrado y luego le aplicamos las transformaciones necesarias
185
         * para que se vea con la misma forma del raster al que representa.
186
         * </P>
187
         */
188
        public void paintComponent(MapControlDrawer mapControlDrawer) {
189
                if (isMoveable && lyr != null && ptoFin != null && ptoIni != null) {
190
                        try {
191
                                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
192
                                AffineTransform at = (AffineTransform)lyr.getAffineTransform().clone();
193
                                at.preConcatenate(vp.getAffineTransform());
194
                                Extent ext = lyr.getFullRasterExtent();
195

    
196
                                Point2D pt = new Point2D.Double(ext.getULX(), ext.getULY());
197
                                vp.getAffineTransform().transform(pt, pt);
198
                                at.inverseTransform(pt, pt);
199

    
200
                                Point2D size = new Point2D.Double(ext.getLRX(), ext.getLRY());
201
                                vp.getAffineTransform().transform(size, size);
202
                                at.inverseTransform(size, size);
203

    
204
                                double distX = ptoFin.getX() - ptoIni.getX();
205
                                double distY = ptoFin.getY() - ptoIni.getY();
206
                                Point2D d = new Point2D.Double(ext.getULX() + distX, ext.getULY() + distY);
207
                                vp.getAffineTransform().transform(d, d);
208
                                at.inverseTransform(d, d);
209

    
210
                                //Giramos el graphics se dibuja y se vuelve a dejar como estaba
211
                                mapControlDrawer.transform(at);
212
                                mapControlDrawer.setColor(rectangleColor);
213
                                AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
214
                                mapControlDrawer.setComposite(alpha);
215
                                mapControlDrawer.fillRect((int)pt.getX() + (int)d.getX(), (int)pt.getY() + (int)d.getY(), (int)size.getX(), (int)size.getY());
216
                                mapControlDrawer.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
217
                                mapControlDrawer.drawRect((int)pt.getX() + (int)d.getX(), (int)pt.getY() + (int)d.getY(), (int)size.getX(), (int)size.getY());
218
                                mapControlDrawer.transform(at.createInverse());
219
                        } catch (NoninvertibleTransformException e1) {
220
                                RasterSwingLibrary.messageBoxError("error_transformacion1", this, e1);
221
                        }
222
                }
223
        }
224

    
225
        /**
226
         * Esta funci?n repinta el canvas si se est? arrasrtando la imagen para
227
         * poder ver el marco de arrastre.
228
         */
229
        public void mouseDragged(MouseEvent e) throws BehaviorException {
230
                if (!isActiveTool())
231
                        return;
232
                if (isMoveable) {
233
                        ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
234
                        ptoFin = vp.toMapPoint(e.getPoint());
235

    
236
                        //Asignaci?n de las coordenadas temporales al dialogo
237
                        assignTransformToDialog();
238

    
239
                        grBehavior.getMapControl().repaint();
240
                }
241
        }
242

    
243
        /**
244
         * Asigna las coordenadas temporales en el dialogo.
245
         */
246
        public void assignTransformToDialog() {
247
                AffineTransform atNew = null;
248
                double distX = ptoFin.getX() - ptoIni.getX();
249
                double distY = ptoFin.getY() - ptoIni.getY();
250
                AffineTransform atOld = grBehavior.getLayer().getAffineTransform();
251
                //La nueva matriz de transformaci?n es la vieja m?s la distancia desplazada
252
                atNew = new AffineTransform(atOld.getScaleX(), atOld.getShearY(),
253
                                                                        atOld.getShearX(), atOld.getScaleY(),
254
                                                                        atOld.getTranslateX() + distX,
255
                                                                        atOld.getTranslateY() + distY);
256
                trIO.loadTransform(atNew);
257
        }
258

    
259
        /* (non-Javadoc)
260
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#getListener()
261
         */
262
        public ToolListener getListener() {
263
                return null;
264
        }
265
}