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 / ScaleBehavior.java @ 1174

History | View | Annotate | Download (18.6 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.Image;
26
import java.awt.event.MouseEvent;
27
import java.awt.geom.AffineTransform;
28
import java.awt.geom.NoninvertibleTransformException;
29
import java.awt.geom.Point2D;
30

    
31
import org.gvsig.andami.IconThemeHelper;
32
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
33
import org.gvsig.fmap.mapcontext.ViewPort;
34
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
35
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
36
import org.gvsig.fmap.mapcontrol.tools.Listeners.RectangleListener;
37
import org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener;
38
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
39

    
40

    
41
/**
42
 * Comportamiento que se aplica a la herramienta de scale. El cursor del rat?n cambiar? cuando
43
 * se encuentre en los bordes del raster, permitiendo el escalar la imagen al pinchar y
44
 * arrastrar.
45
 *
46
 * Nacho Brodin (nachobrodin@gmail.com)
47
 *
48
 */
49
public class ScaleBehavior extends TransformationBehavior {
50
        //N?mero de pixeles de ancho del borde donde el cursor se activar?. Son pixeles del canvas de la vista.
51
        //De esta forma da igual la escala a la que est? la imagen siempre tiene la misma precisi?n
52
        private int                                                         PX_SELEC_BASE = 6;
53
        private int                                                         LONG_CORNER_BASE = 12;
54
        private int                                                         PX_SELEC = PX_SELEC_BASE;
55
        private int                                                         LONG_CORNER = LONG_CORNER_BASE;
56

    
57
        private RectangleListener               listener;
58

    
59
        private final Image                     iconHoriz = IconThemeHelper.getImage("hor-arrow-cursor");
60
        private final Image                     iconVert = IconThemeHelper.getImage("ver-arrow-cursor");
61
        private final Image                     iconInclDer = IconThemeHelper.getImage("inclder-arrow-cursor");
62
        private final Image                     iconInclIzq = IconThemeHelper.getImage("inclizq-arrow-cursor");
63

    
64
        /**
65
         * Variable que si est? a true permite que se pinte el marco de la imagen. Se activa al
66
         * comenzar el redimensionado y se desactiva al terminar
67
         */
68
        private boolean                                                 isResizable = false;
69
        /**
70
         * Escala entre la imagen inicial y la final. Esta es la que sea aplicar? al raster visualizado al
71
         * terminar la operaci?n de reescalado. Esta podemos conocerla cuando levantamos el bot?n
72
         * del rat?n dividiendo el nuevo ancho por el inicial
73
         */
74
        private double                                                        escale = 1D;
75

    
76
        /**
77
         * Lista de flags de redimensionado para cada lado del raster
78
         * [0]-arriba
79
         * [1]-abajo
80
         * [2]-derecha
81
         * [3]-izquierda
82
         * [4]-esquina superior derecha
83
         * [5]-esquina superior izquierda
84
         * [6]-esquina inferior derecha
85
         * [7]-esquina inferior izquierda
86
         */
87
        private boolean[]                                                sideActive = {false, false, false, false, false, false, false, false};
88
        private boolean                                                 init = false;
89
        private Point2D                         tmpLr, tmpUl;
90
        private double                                                        initWidth, endWidth;
91

    
92
        /**
93
         * Crea un nuevo RectangleBehavior.
94
         *
95
         * @param zili listener.
96
         */
97
        public ScaleBehavior(GeoRasterBehavior grb, Image curImage, ITransformIO windowIO) {
98
                grBehavior = grb;
99
                defaultImage = curImage;
100
                this.trIO = windowIO;
101
        }
102

    
103
        /**
104
         * Inicializaci?n. Calcula la longitud de la esquina y el ancho en p?xeles
105
         * de la zona de detecci?n del puntero de rat?n. Inicialmente esto est? calculado en
106
         * unidades pixel de la vista pero la detecci?n de puntero, debido a la rotaci?n posible
107
         * del raster ha de hacerse en unidades del raster en disco por ello ha de calcularse
108
         * una escala entre ambas unidades cuando se carga la aplicaci?n.
109
         *
110
         */
111
        private void init() {
112
                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
113
                lyr = grBehavior.getLayer();
114
                if(lyr == null)
115
                        return ;
116

    
117
                Extent ext = lyr.getDataStore().getExtent();
118
                AffineTransform atImg = lyr.getAffineTransform();
119

    
120
                //Establecer una escala entre las coordenadas de la vista y las coordenadas pixel
121
                Point2D ul = new Point2D.Double(ext.getULX(), ext.getULY());
122
                Point2D lr = new Point2D.Double(ext.getLRX(), ext.getLRY());
123
                Point2D ulPx = new Point2D.Double();
124
                Point2D lrPx = new Point2D.Double();
125
                Point2D ulVp = new Point2D.Double();
126
                Point2D lrVp = new Point2D.Double();
127
                double esc = 1;
128
                try {
129
                        atImg.inverseTransform(ul, ulPx);
130
                        atImg.inverseTransform(lr, lrPx);
131
                        ulVp = vp.fromMapPoint(ul);
132
                        lrVp = vp.fromMapPoint(lr);
133
                        esc = Math.abs(lrPx.getX() - ulPx.getX()) / Math.abs(lrVp.getX() - ulVp.getX());
134
                } catch (NoninvertibleTransformException e1) {
135
                        return;
136
                }
137

    
138
                //Escalar PX_SELEC y LONG_CORNER para tenerlo en coordenadas pixel
139

    
140
                PX_SELEC = (int)(PX_SELEC_BASE * esc);
141
                LONG_CORNER = (int)(LONG_CORNER_BASE * esc);
142
                init = true;
143
        }
144

    
145
        /**
146
         * <P>
147
         * Cuando se produce un evento de pintado dibujamos el marco de la imagen para
148
         * que el usuario pueda seleccionar y redimensionar. Pintamos un marco a la imagen para saber
149
         * donde la movemos.
150
         * </P>
151
         * <P>
152
         * Para dibujar el marco alrededor del raster hacemos lo mismo que para pintar el raster
153
         * rotado. En realidad dibujamos un cuadrado y luego le aplicamos las transformaciones necesarias
154
         * para que se vea con la misma forma del raster al que representa.
155
         * </P>
156
         */
157
        public void paintComponent(MapControlDrawer mapControlDrawer) {
158
                if(isResizable && lyr != null) {
159
                        try {
160
                                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
161
                                Point2D ul = new Point2D.Double();
162
                                Point2D lr = new Point2D.Double();
163
                                AffineTransform tr = lyr.getAffineTransform();
164
                                tr.transform(tmpUl, ul);
165
                                tr.transform(tmpLr, lr);
166

    
167
                                AffineTransform at = new AffineTransform(tr.getScaleX(), tr.getShearY(),
168
                                                                                                                 tr.getShearX(), tr.getScaleY(),
169
                                                                                                                 ul.getX(), ul.getY());
170
                                at.preConcatenate(vp.getAffineTransform());
171

    
172
                                vp.getAffineTransform().transform(ul, ul);
173
                                at.inverseTransform(ul, ul);
174

    
175
                                vp.getAffineTransform().transform(lr, lr);
176
                                at.inverseTransform(lr, lr);
177

    
178
                                mapControlDrawer.transform(at);
179
                                mapControlDrawer.setColor(rectangleColor);
180
                                mapControlDrawer.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
181
                                mapControlDrawer.fillRect((int)ul.getX(), (int)ul.getY(), (int)lr.getX(), (int)lr.getY());
182
                                mapControlDrawer.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
183
                                mapControlDrawer.drawRect((int)ul.getX(), (int)ul.getY(), (int)lr.getX(), (int)lr.getY());
184
                                mapControlDrawer.transform(at.createInverse());
185
                        } catch (NoninvertibleTransformException e1) {
186
                                RasterToolsUtil.messageBoxError("error_transformacion1", this, e1);
187
                        }
188
                }
189
        }
190

    
191
        /**
192
         * Reimplementaci?n del m?todo mousePressed de Behavior. Cuando se pulsa
193
         * estando sobre el marco de la imagen activamos la posibilidad de arrastrar
194
         * para redimensionar la imagen.
195
         *
196
         * @param e MouseEvent
197
         */
198
        public void mousePressed(MouseEvent e) {
199
                if (e.getButton() == MouseEvent.BUTTON1) {
200
                        setActiveTool(true);
201
                        isResizable = true;;
202
                        ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
203
                        if(lyr == null)
204
                                lyr = grBehavior.getLayer();
205

    
206
                        if(vp != null && lyr != null) {
207
                                Extent ext = lyr.getFullRasterExtent();
208
                                tmpUl = new Point2D.Double(ext.getULX(), ext.getULY());
209
                                tmpLr = new Point2D.Double(ext.getLRX(), ext.getLRY());
210
                                try {
211
                                        lyr.getAffineTransform().inverseTransform(tmpUl, tmpUl);
212
                                        lyr.getAffineTransform().inverseTransform(tmpLr, tmpLr);
213
                                } catch (NoninvertibleTransformException e1) {
214
                                        e1.printStackTrace();
215
                                }
216
                                initWidth = Math.abs(tmpUl.getX() - tmpLr.getX());
217
                        }
218
                }
219
        }
220

    
221
        /**
222
         * Reimplementaci?n del m?todo mouseReleased de Behavior.
223
         *
224
         * @param e MouseEvent
225
         *
226
         * @throws BehaviorException Excepci?n lanzada cuando el Behavior.
227
         */
228
        public void mouseReleased(MouseEvent e) throws BehaviorException {
229
                resetBorderSelected();
230
                if (e.getButton() == MouseEvent.BUTTON1 && isResizable && lyr != null) {
231
                        endWidth = Math.abs(tmpUl.getX() - tmpLr.getX());
232
                        escale = endWidth / initWidth;
233

    
234
                        AffineTransform tr = (AffineTransform)lyr.getAffineTransform().clone();
235
                        Point2D ul = new Point2D.Double();
236
                        Point2D lr = new Point2D.Double();
237
                        tr.transform(tmpUl, ul);
238
                        tr.transform(tmpLr, lr);
239

    
240
                        AffineTransform esc = new AffineTransform(escale, 0, 0, escale, 0, 0);
241
                        AffineTransform at = new AffineTransform(tr.getScaleX(), tr.getShearY(),
242
                                                                                                        tr.getShearX(), tr.getScaleY(),
243
                                                                                                        ul.getX(), ul.getY());
244
                        esc.preConcatenate(at);
245
                        lyr.setAffineTransform(esc);
246
                        grBehavior.getMapControl().getMapContext().invalidate();
247
                        isResizable = false;
248
                        super.mouseReleased(e);
249
                }
250
        }
251

    
252
        /**
253
         * Al arrastrar cuando se ha pulsado sobre el marco de la imagen recalculamos
254
         * el marco de la imagen
255
         *
256
         * @param e MouseEvent
257
         */
258
        @SuppressWarnings("deprecation")
259
        public void mouseDragged(MouseEvent ev) {
260
                if(isResizable) {
261
                        if(tmpLr == null || tmpUl == null || lyr == null)
262
                                return;
263

    
264
                        setActiveTool(true);
265

    
266
                        ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
267

    
268
                        //Pasamos el punto obtenido a coordenadas del raster
269
                        Point2D e = new Point2D.Double(ev.getX(), ev.getY());
270
                        e = vp.toMapPoint(e);
271
                        try {
272
                                lyr.getAffineTransform().inverseTransform(e, e);
273
                        } catch (NoninvertibleTransformException e1) {
274
                                e1.printStackTrace();
275
                        }
276

    
277
                        double longLadoX = Math.abs(tmpLr.getX() - tmpUl.getX());
278
                        double longLadoY = Math.abs(tmpLr.getY() - tmpUl.getY());
279
                        double coordCentroV = tmpUl.getY() + (Math.abs(tmpLr.getY() - tmpUl.getY()) / 2);
280
                        double coordCentroH = tmpUl.getX() + (Math.abs(tmpLr.getX() - tmpUl.getX()) / 2);
281
                        if(sideActive[2]) {//vertical derecha
282
                                double newLadoX = (e.getX() - tmpUl.getX());
283
                                double newLadoY = (newLadoX * longLadoY) / longLadoX;
284
                                tmpUl = new Point2D.Double(tmpUl.getX(), coordCentroV - (newLadoY / 2));
285
                                tmpLr = new Point2D.Double(e.getX(), coordCentroV + (newLadoY / 2));
286
                        } else if(sideActive[3]) {//vertical izquierda
287
                                double newLadoX = (e.getX() - tmpLr.getX());
288
                                double newLadoY = (newLadoX * longLadoY) / longLadoX;
289
                                tmpLr = new Point2D.Double(tmpLr.getX(), coordCentroV - (newLadoY / 2));
290
                                tmpUl = new Point2D.Double(e.getX(), coordCentroV + (newLadoY/2));
291
                        } else if(sideActive[1]) {//horizontal abajo
292
                                double newLadoY = (e.getY() - tmpUl.getY());
293
                                double newLadoX = (newLadoY * longLadoX) / longLadoY;
294
                                tmpLr = new Point2D.Double(coordCentroH + (newLadoX / 2), e.getY());
295
                                tmpUl = new Point2D.Double(coordCentroH - (newLadoX / 2), tmpUl.getY());
296
                        } else if(sideActive[0]) {//horizontal arriba
297
                                double newLadoY = (tmpLr.getY() - e.getY());
298
                                double newLadoX = (newLadoY * longLadoX) / longLadoY;
299
                                tmpUl = new Point2D.Double(coordCentroH - (newLadoX / 2), e.getY());
300
                                tmpLr = new Point2D.Double(coordCentroH + (newLadoX / 2), tmpLr.getY());
301
                        } else if(sideActive[6]) {//Esquina inferior derecha
302
                                 double rel = longLadoX / longLadoY;
303
                                 double difY = (e.getY() - tmpLr.getY());
304
                                                         double difX = (e.getX() - tmpLr.getX());
305
                                                         if(difX > difY){
306
                                                                 difY = difX / rel;
307
                                                         }else
308
                                                                 difX = difY * rel;
309
                                                         tmpUl = new Point2D.Double(tmpUl.getX(), tmpUl.getY());
310
                                                         tmpLr = new Point2D.Double(tmpLr.getX() + difX, tmpLr.getY() + difY);
311
                        } else if(sideActive[5]) {//Esquina superior izquierda
312
                                 double rel = longLadoX / longLadoY;
313
                                 double difY = (tmpUl.getY() - e.getY());
314
                                                         double difX = (tmpUl.getX() - e.getX());
315
                                                         if(difX > difY){
316
                                                                 difY = difX / rel;
317
                                                         }else
318
                                                                 difX = difY * rel;
319
                                                         tmpUl = new Point2D.Double(tmpUl.getX() - difX, tmpUl.getY() - difY);
320
                                                         tmpLr = new Point2D.Double(tmpLr.getX(), tmpLr.getY());
321
                                } else if(sideActive[4]) {//Esquina superior derecha
322
                                 double rel = longLadoX / longLadoY;
323
                                 double difY = (tmpUl.getY() - e.getY());
324
                                                         double difX = (e.getX() - tmpLr.getX());
325
                                                         if(difX > difY){
326
                                                                 difY = difX / rel;
327
                                                         }else
328
                                                                 difX = difY * rel;
329
                                                         tmpUl = new Point2D.Double(tmpUl.getX(), tmpUl.getY() - difY);
330
                                                         tmpLr = new Point2D.Double(tmpLr.getX() + difX, tmpLr.getY());
331
                                } else if(sideActive[7]) {//Esquina inferior izquierda
332
                                        double rel = longLadoX / longLadoY;
333
                                double difY = (e.getY() - tmpLr.getY());
334
                                                        double difX = (tmpUl.getX() - e.getX());
335
                                                        if(difX > difY)
336
                                                                difY = difX / rel;
337
                                                        else
338
                                                                difX = difY * rel;
339
                                                        tmpUl = new Point2D.Double(tmpUl.getX() - difX, tmpUl.getY());
340
                                                        tmpLr = new Point2D.Double(tmpLr.getX(), tmpLr.getY() + difY);
341
                                }
342

    
343
                        //Asignaci?n de las coordenadas temporales al dialogo
344
                        assignTransformToDialog();
345

    
346
                        grBehavior.getMapControl().repaint();
347
                }
348
        }
349

    
350
        /**
351
         * Asigna las coordenadas temporales en el dialogo.
352
         */
353
        public void assignTransformToDialog() {
354
                Point2D ul = new Point2D.Double();
355
                Point2D lr = new Point2D.Double();
356
                AffineTransform tr = grBehavior.getLayer().getAffineTransform();
357
                tr.transform(tmpUl, ul);
358
                tr.transform(tmpLr, lr);
359
                endWidth = Math.abs(tmpUl.getX() - tmpLr.getX());
360
                escale = endWidth / initWidth;
361
                AffineTransform esc = new AffineTransform(escale, 0, 0, escale, 0, 0);
362
                AffineTransform at = new AffineTransform(tr.getScaleX(), tr.getShearY(),
363
                                                                                                tr.getShearX(), tr.getScaleY(),
364
                                                                                                ul.getX(), ul.getY());
365
                esc.preConcatenate(at);
366
                trIO.loadTransform(esc);
367
        }
368

    
369
        /**
370
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#setListener(org.gvsig.georeferencing.fmap.tools.ToolListener)
371
         */
372
        public void setListener(ToolListener listener) {
373
                this.listener = (RectangleListener) listener;
374
        }
375

    
376
        /**
377
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#getListener()
378
         */
379
        public ToolListener getListener() {
380
                return listener;
381
        }
382

    
383
        /**
384
         * Cuando movemos el rat?n detecta si estamos en el marco de la
385
         * imagen y pone el icono del cursor del rat?n adecuado.
386
         */
387
        @SuppressWarnings("deprecation")
388
        public boolean mouseMoved(MouseEvent ev) throws BehaviorException {
389
                if(!init)
390
                        init();
391

    
392
                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
393
                resetBorderSelected();
394

    
395
                lyr = grBehavior.getLayer();
396
                if(lyr == null) {
397
                        setActiveTool(false);
398
                        return false;
399
                }
400

    
401
                AffineTransform atImg = lyr.getAffineTransform();
402

    
403
                //Pasar coordenadas del punto a coordenadas reales y luego a coordenadas pixel
404
                Point2D e = vp.toMapPoint(ev.getX(), ev.getY());
405
                try {
406
                        atImg.inverseTransform(e, e);
407
                } catch (NoninvertibleTransformException e1) {
408
                        return false;
409
                }
410

    
411
                //Comprobar si est? dentro del raster
412
                Point2D p1 = new Point2D.Double(0, 0);
413
                Point2D p2 = new Point2D.Double(lyr.getDataStore().getWidth(), lyr.getDataStore().getHeight());
414

    
415
                //Fuera del raster
416
                if(e.getX() < p1.getX() || e.getX() > p2.getX() || e.getY() < p1.getY() || e.getY() > p2.getY() ) {
417
                        setActiveTool(false);
418
                        grBehavior.getMapControl().repaint();
419
//                        grBehavior.getMapControl().setCursor(defaultCursor);
420
                        return false;
421
                }
422

    
423
                //Borde izquierdo
424
                if(e.getX() > p1.getX() && e.getX() <= (p1.getX() + PX_SELEC) && e.getY() > (p1.getY() + LONG_CORNER) && e.getY() < (p2.getY() - LONG_CORNER)) {
425
                        setCursor(iconHoriz);
426
                        setActiveTool(true);
427
                        sideActive[3] = true;
428
                        return true;
429
                }
430

    
431
                //Borde derecho
432
                if(e.getX() >= (p2.getX() - PX_SELEC) && e.getX() < p2.getX() && e.getY() > (p1.getY() + LONG_CORNER) && e.getY() < (p2.getY() - LONG_CORNER)) {
433
                        setCursor(iconHoriz);
434
                        setActiveTool(true);
435
                        sideActive[2] = true;
436
                        return true;
437
                }
438

    
439
                //Borde superior
440
                if(e.getY() > p1.getY() && e.getY() <= (p1.getY() + PX_SELEC) && e.getX() > (p1.getX() + LONG_CORNER) && e.getX() < (p2.getX() - LONG_CORNER)) {
441
                        setCursor(iconVert);
442
                        setActiveTool(true);
443
                        sideActive[0] = true;
444
                        return true;
445
                }
446

    
447
                //Borde inferior
448
                if(e.getY() >= (p2.getY() - PX_SELEC) && e.getY() < p2.getY() && e.getX() > (p1.getX() + LONG_CORNER) && e.getX() < (p2.getX() - LONG_CORNER)) {
449
                        setCursor(iconVert);
450
                        setActiveTool(true);
451
                        sideActive[1] = true;
452
                        return true;
453
                }
454

    
455
                //esquina superior izquierda
456
                if ((e.getX() > p1.getX() && e.getX() <= (p1.getX() + LONG_CORNER) && e.getY() > p1.getY() && e.getY() < (p1.getY() + PX_SELEC)) ||
457
                        (e.getX() > p1.getX() && e.getX() <= (p1.getX() + PX_SELEC) && e.getY() > p1.getY() && e.getY() <= (p1.getY() + LONG_CORNER))) {
458
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
459
                                setCursor(iconInclIzq);
460
                        else
461
                                setCursor(iconInclDer);
462
                        setActiveTool(true);
463
                        sideActive[5] = true;
464
                        return true;
465
                }
466

    
467
                //esquina superior derecha
468
                if ((e.getX() >= (p2.getX() - LONG_CORNER) && e.getX() < p2.getX() && e.getY() > p1.getY() && e.getY() < (p1.getY() + PX_SELEC)) ||
469
                        (e.getX() >= (p2.getX() - PX_SELEC) && e.getX() < p2.getX() && e.getY() > p1.getY() && e.getY() <= (p1.getY() + LONG_CORNER))) {
470
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
471
                                setCursor(iconInclDer);
472
                        else
473
                                setCursor(iconInclIzq);
474
                        setActiveTool(true);
475
                        sideActive[4] = true;
476
                        return true;
477
                }
478

    
479
                //esquina inferior izquierda
480
                if ((e.getX() > p1.getX() && e.getX() <= (p1.getX() + LONG_CORNER) && e.getY() >= (p2.getY() - PX_SELEC) && e.getY() < p2.getY()) ||
481
                        (e.getX() > p1.getX() && e.getX() <= (p1.getX() + PX_SELEC) && e.getY() < p2.getY() && e.getY() >= (p2.getY() - LONG_CORNER))) {
482
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
483
                                setCursor(iconInclDer);
484
                        else
485
                                setCursor(iconInclIzq);
486
                        setActiveTool(true);
487
                        sideActive[7] = true;
488
                        return true;
489
                }
490

    
491
                //esquina inferior derecha
492
                if ((e.getX() < p2.getX() && e.getX() >= (p2.getX() - LONG_CORNER) && e.getY() >= (p2.getY() - PX_SELEC) && e.getY() < p2.getY()) ||
493
                        (e.getX() < p2.getX() && e.getX() >= (p2.getX() - PX_SELEC) && e.getY() < p2.getY() && e.getY() >= (p2.getY() - LONG_CORNER))){
494
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
495
                                setCursor(iconInclIzq);
496
                        else
497
                                setCursor(iconInclDer);
498
                        setActiveTool(true);
499
                        sideActive[6] = true;
500
                        return true;
501
                }
502

    
503
                grBehavior.getMapControl().repaint();
504
//                grBehavior.getMapControl().setCursor(defaultCursor);
505
                return false;
506
        }
507

    
508
        /**
509
         * Pone a false todos los elementos del array sideActive. Esto es equivalente
510
         * a eliminar cualquier selecci?n de borde.
511
         */
512
        private void resetBorderSelected() {
513
                for (int i = 0; i < sideActive.length; i++)
514
                        sideActive[i] = false;
515
        }
516

    
517
}