Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / geolocation / behavior / TranslateBehavior.java @ 1174

History | View | Annotate | Download (8.76 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.Point;
28
import java.awt.Toolkit;
29
import java.awt.event.MouseEvent;
30
import java.awt.geom.AffineTransform;
31
import java.awt.geom.NoninvertibleTransformException;
32
import java.awt.geom.Point2D;
33

    
34
import org.gvsig.andami.IconThemeHelper;
35
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
36
import org.gvsig.fmap.mapcontext.ViewPort;
37
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
38
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
39
import org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener;
40
import org.gvsig.raster.fmap.layers.FLyrRaster;
41
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
42

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

    
52
        private final Image handCursor = IconThemeHelper.getImage("hand-cursor");
53

    
54
//        private Cursor                         cur = null;
55
        private boolean                        isMoveable = false;
56

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

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

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

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

    
86
                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
87

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

    
95
                        Point2D pto = vp.toMapPoint(e.getX(), e.getY());
96

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

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

    
133
                        if (lyr == null)
134
                                return;
135

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

    
139
                        isMoveable = true;
140
                }
141
        }
142

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

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

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

    
162
                        double distX = ptoFin.getX() - ptoIni.getX();
163
                        double distY = ptoFin.getY() - ptoIni.getY();
164

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

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

    
177
        }
178

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

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

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

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

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

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

    
238
                        //Asignaci?n de las coordenadas temporales al dialogo
239
                        assignTransformToDialog();
240

    
241
                        grBehavior.getMapControl().repaint();
242
                }
243
        }
244

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

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