Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / geolocation / behavior / ScaleBehavior.java @ 22529

History | View | Annotate | Download (18.6 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.rastertools.geolocation.behavior;
20

    
21
import java.awt.AlphaComposite;
22
import java.awt.Cursor;
23
import java.awt.Graphics;
24
import java.awt.Graphics2D;
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 javax.swing.ImageIcon;
32

    
33
import org.gvsig.raster.datastruct.Extent;
34
import org.gvsig.raster.util.RasterToolsUtil;
35

    
36
import com.iver.cit.gvsig.fmap.ViewPort;
37
import com.iver.cit.gvsig.fmap.tools.BehaviorException;
38
import com.iver.cit.gvsig.fmap.tools.Listeners.RectangleListener;
39
import com.iver.cit.gvsig.fmap.tools.Listeners.ToolListener;
40

    
41

    
42
/**
43
 * Comportamiento que se aplica a la herramienta de scale. El cursor del rat?n cambiar? cuando
44
 * se encuentre en los bordes del raster, permitiendo el escalar la imagen al pinchar y 
45
 * arrastrar.
46
 * 
47
 * Nacho Brodin (nachobrodin@gmail.com)
48
 *
49
 */
50
public class ScaleBehavior extends TransformationBehavior {
51
        //N?mero de pixeles de ancho del borde donde el cursor se activar?. Son pixeles del canvas de la vista.
52
        //De esta forma da igual la escala a la que est? la imagen siempre tiene la misma precisi?n
53
        private int                                                         PX_SELEC_BASE = 6;
54
        private int                                                         LONG_CORNER_BASE = 12;
55
        private int                                                         PX_SELEC = PX_SELEC_BASE;
56
        private int                                                         LONG_CORNER = LONG_CORNER_BASE;
57
        
58
        private RectangleListener listener;
59
        
60
        private final Image iconHoriz = new ImageIcon(getClass().getClassLoader().getResource(
61
                "images/FlechaHorizCursor.gif")).getImage(); 
62
        private final Image iconVert = new ImageIcon(getClass().getClassLoader().getResource(
63
                "images/FlechaVertCursor.gif")).getImage();
64
        private final Image iconInclDer = new ImageIcon(getClass().getClassLoader().getResource(
65
                "images/FlechaInclDerCursor.gif")).getImage();
66
        private final Image iconInclIzq = new ImageIcon(getClass().getClassLoader().getResource(
67
                "images/FlechaInclIzqCursor.gif")).getImage();
68
        
69
        /**
70
         * Variable que si est? a true permite que se pinte el marco de la imagen. Se activa al
71
         * comenzar el redimensionado y se desactiva al terminar
72
         */
73
        private boolean                                                 isResizable = false;
74
        /**
75
         * Escala entre la imagen inicial y la final. Esta es la que sea aplicar? al raster visualizado al
76
         * terminar la operaci?n de reescalado. Esta podemos conocerla cuando levantamos el bot?n
77
         * del rat?n dividiendo el nuevo ancho por el inicial
78
         */
79
        private double                                                        escale = 1D;
80
        
81
        /**
82
         * Lista de flags de redimensionado para cada lado del raster
83
         * [0]-arriba
84
         * [1]-abajo
85
         * [2]-derecha
86
         * [3]-izquierda
87
         * [4]-esquina superior derecha
88
         * [5]-esquina superior izquierda
89
         * [6]-esquina inferior derecha
90
         * [7]-esquina inferior izquierda
91
         */
92
        private boolean[]                                                sideActive = {false, false, false, false, false, false, false, false};
93
        private boolean                                                 init = false;
94
        private Point2D                         tmpLr, tmpUl;
95
        private double                                                        initWidth, endWidth;
96
                
97
        /**
98
         * Crea un nuevo RectangleBehavior.
99
         *
100
         * @param zili listener.
101
         */
102
        public ScaleBehavior(GeoRasterBehavior grb, Cursor cur, ITransformIO windowIO) {
103
                grBehavior = grb;
104
                defaultCursor = cur;
105
                this.trIO = windowIO;
106
        }
107

    
108
        /**
109
         * Inicializaci?n. Calcula la longitud de la esquina y el ancho en p?xeles
110
         * de la zona de detecci?n del puntero de rat?n. Inicialmente esto est? calculado en 
111
         * unidades pixel de la vista pero la detecci?n de puntero, debido a la rotaci?n posible
112
         * del raster ha de hacerse en unidades del raster en disco por ello ha de calcularse
113
         * una escala entre ambas unidades cuando se carga la aplicaci?n.
114
         *
115
         */
116
        private void init() {
117
                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();                
118
                lyr = grBehavior.getLayer();
119
                if(lyr == null) 
120
                        return ;
121
                
122
                Extent ext = lyr.getDataSource().getExtent();
123
                AffineTransform atImg = lyr.getAffineTransform();
124
                                
125
                //Establecer una escala entre las coordenadas de la vista y las coordenadas pixel
126
                Point2D ul = new Point2D.Double(ext.getULX(), ext.getULY());
127
                Point2D lr = new Point2D.Double(ext.getLRX(), ext.getLRY());
128
                Point2D ulPx = new Point2D.Double();
129
                Point2D lrPx = new Point2D.Double();
130
                Point2D ulVp = new Point2D.Double();
131
                Point2D lrVp = new Point2D.Double();
132
                double esc = 1;
133
                try {
134
                        atImg.inverseTransform(ul, ulPx);
135
                        atImg.inverseTransform(lr, lrPx);
136
                        ulVp = vp.fromMapPoint(ul);
137
                        lrVp = vp.fromMapPoint(lr);
138
                        esc = Math.abs(lrPx.getX() - ulPx.getX()) / Math.abs(lrVp.getX() - ulVp.getX());
139
                } catch (NoninvertibleTransformException e1) {
140
                        return;
141
                }
142
                
143
                //Escalar PX_SELEC y LONG_CORNER para tenerlo en coordenadas pixel
144
                
145
                PX_SELEC = (int)(PX_SELEC_BASE * esc);
146
                LONG_CORNER = (int)(LONG_CORNER_BASE * esc);
147
                init = true;
148
        }
149

    
150
        /**
151
         * <P>
152
         * Cuando se produce un evento de pintado dibujamos el marco de la imagen para
153
         * que el usuario pueda seleccionar y redimensionar. Pintamos un marco a la imagen para saber 
154
         * donde la movemos. 
155
         * </P>
156
         * <P>
157
         * Para dibujar el marco alrededor del raster hacemos lo mismo que para pintar el raster
158
         * rotado. En realidad dibujamos un cuadrado y luego le aplicamos las transformaciones necesarias
159
         * para que se vea con la misma forma del raster al que representa.
160
         * </P> 
161
         */
162
        public void paintComponent(Graphics g) {
163
                if(isResizable && lyr != null) {                        
164
                        try {
165
                                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
166
                                Point2D ul = new Point2D.Double();
167
                                Point2D lr = new Point2D.Double();
168
                                AffineTransform tr = lyr.getAffineTransform();
169
                                tr.transform(tmpUl, ul);
170
                                tr.transform(tmpLr, lr);
171
                                
172
                                AffineTransform at = new AffineTransform(tr.getScaleX(), tr.getShearY(), 
173
                                                                                                                 tr.getShearX(), tr.getScaleY(), 
174
                                                                                                                 ul.getX(), ul.getY());
175
                                at.preConcatenate(vp.getAffineTransform());
176
                                                                
177
                                vp.getAffineTransform().transform(ul, ul);
178
                                at.inverseTransform(ul, ul);
179
                                
180
                                vp.getAffineTransform().transform(lr, lr);
181
                                at.inverseTransform(lr, lr);
182
                                
183
                                ((Graphics2D)g).transform(at);
184
                                g.setColor(rectangleColor);
185
                                ((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f));
186
                                g.fillRect((int)ul.getX(), (int)ul.getY(), (int)lr.getX(), (int)lr.getY());
187
                                ((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
188
                                g.drawRect((int)ul.getX(), (int)ul.getY(), (int)lr.getX(), (int)lr.getY());
189
                                ((Graphics2D)g).transform(at.createInverse());
190
                        } catch (NoninvertibleTransformException e1) {
191
                                RasterToolsUtil.messageBoxError("error_transformacion1", this, e1);
192
                        }
193
                }                
194
        }
195

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

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

    
226
        /**
227
         * Reimplementaci?n del m?todo mouseReleased de Behavior.
228
         *
229
         * @param e MouseEvent
230
         *
231
         * @throws BehaviorException Excepci?n lanzada cuando el Behavior.
232
         */
233
        public void mouseReleased(MouseEvent e) throws BehaviorException {
234
                resetBorderSelected();
235
                if (e.getButton() == MouseEvent.BUTTON1 && isResizable && lyr != null) {
236
                        endWidth = Math.abs(tmpUl.getX() - tmpLr.getX());
237
                        escale = endWidth / initWidth;
238
                        
239
                        AffineTransform tr = (AffineTransform)lyr.getAffineTransform().clone();
240
                        Point2D ul = new Point2D.Double();
241
                        Point2D lr = new Point2D.Double();
242
                        tr.transform(tmpUl, ul);
243
                        tr.transform(tmpLr, lr);
244
                        
245
                        AffineTransform esc = new AffineTransform(escale, 0, 0, escale, 0, 0);
246
                        AffineTransform at = new AffineTransform(tr.getScaleX(), tr.getShearY(), 
247
                                                                                                        tr.getShearX(), tr.getScaleY(), 
248
                                                                                                        ul.getX(), ul.getY());
249
                        esc.preConcatenate(at);
250
                        lyr.setAffineTransform(esc);
251
                        grBehavior.getMapControl().getMapContext().invalidate();
252
                        isResizable = false;
253
                        super.mouseReleased(e);
254
                }
255
        }
256
        
257
        /**
258
         * Al arrastrar cuando se ha pulsado sobre el marco de la imagen recalculamos
259
         * el marco de la imagen 
260
         *
261
         * @param e MouseEvent
262
         */
263
        public void mouseDragged(MouseEvent ev) {
264
                if(isResizable) {
265
                        if(tmpLr == null || tmpUl == null || lyr == null)
266
                                return;
267
                        
268
                        setActiveTool(true);
269

    
270
                        ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
271
                        
272
                        //Pasamos el punto obtenido a coordenadas del raster
273
                        Point2D e = new Point2D.Double(ev.getX(), ev.getY());
274
                        e = vp.toMapPoint(e);
275
                        try {
276
                                lyr.getAffineTransform().inverseTransform(e, e);
277
                        } catch (NoninvertibleTransformException e1) {
278
                                e1.printStackTrace();
279
                        }
280
                        
281
                        double longLadoX = Math.abs(tmpLr.getX() - tmpUl.getX());
282
                        double longLadoY = Math.abs(tmpLr.getY() - tmpUl.getY());
283
                        double coordCentroV = tmpUl.getY() + (Math.abs(tmpLr.getY() - tmpUl.getY()) / 2);
284
                        double coordCentroH = tmpUl.getX() + (Math.abs(tmpLr.getX() - tmpUl.getX()) / 2);
285
                        if(sideActive[2]) {//vertical derecha
286
                                double newLadoX = (e.getX() - tmpUl.getX());
287
                                double newLadoY = (newLadoX * longLadoY) / longLadoX;
288
                                tmpUl = new Point2D.Double(tmpUl.getX(), coordCentroV - (newLadoY / 2));
289
                                tmpLr = new Point2D.Double(e.getX(), coordCentroV + (newLadoY / 2));
290
                        } else if(sideActive[3]) {//vertical izquierda
291
                                double newLadoX = (e.getX() - tmpLr.getX());
292
                                double newLadoY = (newLadoX * longLadoY) / longLadoX;
293
                                tmpLr = new Point2D.Double(tmpLr.getX(), coordCentroV - (newLadoY / 2));
294
                                tmpUl = new Point2D.Double(e.getX(), coordCentroV + (newLadoY/2));
295
                        } else if(sideActive[1]) {//horizontal abajo
296
                                double newLadoY = (e.getY() - tmpUl.getY());
297
                                double newLadoX = (newLadoY * longLadoX) / longLadoY;
298
                                tmpLr = new Point2D.Double(coordCentroH + (newLadoX / 2), e.getY());
299
                                tmpUl = new Point2D.Double(coordCentroH - (newLadoX / 2), tmpUl.getY());
300
                        } else if(sideActive[0]) {//horizontal arriba
301
                                double newLadoY = (tmpLr.getY() - e.getY());
302
                                double newLadoX = (newLadoY * longLadoX) / longLadoY;
303
                                tmpUl = new Point2D.Double(coordCentroH - (newLadoX / 2), e.getY());
304
                                tmpLr = new Point2D.Double(coordCentroH + (newLadoX / 2), tmpLr.getY());
305
                        } else if(sideActive[6]) {//Esquina inferior derecha
306
                                 double rel = longLadoX / longLadoY;
307
                                 double difY = (e.getY() - tmpLr.getY());
308
                                                         double difX = (e.getX() - tmpLr.getX());
309
                                                         if(difX > difY){
310
                                                                 difY = difX / rel;
311
                                                         }else
312
                                                                 difX = difY * rel;
313
                                                         tmpUl = new Point2D.Double(tmpUl.getX(), tmpUl.getY());
314
                                                         tmpLr = new Point2D.Double(tmpLr.getX() + difX, tmpLr.getY() + difY);
315
                        } else if(sideActive[5]) {//Esquina superior izquierda
316
                                 double rel = longLadoX / longLadoY;
317
                                 double difY = (tmpUl.getY() - e.getY());
318
                                                         double difX = (tmpUl.getX() - e.getX());
319
                                                         if(difX > difY){
320
                                                                 difY = difX / rel;
321
                                                         }else
322
                                                                 difX = difY * rel;
323
                                                         tmpUl = new Point2D.Double(tmpUl.getX() - difX, tmpUl.getY() - difY);
324
                                                         tmpLr = new Point2D.Double(tmpLr.getX(), tmpLr.getY());
325
                                } else if(sideActive[4]) {//Esquina superior derecha
326
                                 double rel = longLadoX / longLadoY;
327
                                 double difY = (tmpUl.getY() - e.getY());
328
                                                         double difX = (e.getX() - tmpLr.getX());
329
                                                         if(difX > difY){
330
                                                                 difY = difX / rel;
331
                                                         }else
332
                                                                 difX = difY * rel;
333
                                                         tmpUl = new Point2D.Double(tmpUl.getX(), tmpUl.getY() - difY);
334
                                                         tmpLr = new Point2D.Double(tmpLr.getX() + difX, tmpLr.getY());
335
                                } else if(sideActive[7]) {//Esquina inferior izquierda
336
                                        double rel = longLadoX / longLadoY;
337
                                double difY = (e.getY() - tmpLr.getY());
338
                                                        double difX = (tmpUl.getX() - e.getX());
339
                                                        if(difX > difY)
340
                                                                difY = difX / rel;
341
                                                        else
342
                                                                difX = difY * rel;
343
                                                        tmpUl = new Point2D.Double(tmpUl.getX() - difX, tmpUl.getY());
344
                                                        tmpLr = new Point2D.Double(tmpLr.getX(), tmpLr.getY() + difY);
345
                                }
346
                        
347
                        //Asignaci?n de las coordenadas temporales al dialogo
348
                        assignTransformToDialog();
349
                        
350
                        grBehavior.getMapControl().repaint();
351
                }
352
        }
353
        
354
        /**
355
         * Asigna las coordenadas temporales en el dialogo.
356
         */
357
        public void assignTransformToDialog() {
358
                Point2D ul = new Point2D.Double();
359
                Point2D lr = new Point2D.Double();
360
                AffineTransform tr = grBehavior.getLayer().getAffineTransform();
361
                tr.transform(tmpUl, ul);
362
                tr.transform(tmpLr, lr);
363
                endWidth = Math.abs(tmpUl.getX() - tmpLr.getX());
364
                escale = endWidth / initWidth;
365
                AffineTransform esc = new AffineTransform(escale, 0, 0, escale, 0, 0);
366
                AffineTransform at = new AffineTransform(tr.getScaleX(), tr.getShearY(), 
367
                                                                                                tr.getShearX(), tr.getScaleY(), 
368
                                                                                                ul.getX(), ul.getY());
369
                esc.preConcatenate(at);
370
                trIO.loadTransform(esc);        
371
        }
372
        
373
        /**
374
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#setListener(org.gvsig.georeferencing.fmap.tools.ToolListener)
375
         */
376
        public void setListener(ToolListener listener) {
377
                this.listener = (RectangleListener) listener;
378
        }
379

    
380
        /**
381
         * @see com.iver.cit.gvsig.fmap.tools.Behavior.Behavior#getListener()
382
         */
383
        public ToolListener getListener() {
384
                return listener;
385
        }
386
        
387
        /**
388
         * Cuando movemos el rat?n detecta si estamos en el marco de la 
389
         * imagen y pone el icono del cursor del rat?n adecuado.
390
         */
391
        public boolean mouseMoved(MouseEvent ev) throws BehaviorException {
392
                if(!init)
393
                        init();
394
                
395
                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
396
                resetBorderSelected();
397
                
398
                lyr = grBehavior.getLayer();
399
                if(lyr == null) {
400
                        setActiveTool(false);
401
                        return false;
402
                }
403
                
404
                AffineTransform atImg = lyr.getAffineTransform();
405
                                
406
                //Pasar coordenadas del punto a coordenadas reales y luego a coordenadas pixel
407
                Point2D e = vp.toMapPoint(ev.getX(), ev.getY());
408
                try {
409
                        atImg.inverseTransform(e, e);
410
                } catch (NoninvertibleTransformException e1) {
411
                        return false;
412
                }
413
                
414
                //Comprobar si est? dentro del raster
415
                Point2D p1 = new Point2D.Double(0, 0);
416
                Point2D p2 = new Point2D.Double(lyr.getDataSource().getWidth(), lyr.getDataSource().getHeight());
417
                                        
418
                //Fuera del raster
419
                if(e.getX() < p1.getX() || e.getX() > p2.getX() || e.getY() < p1.getY() || e.getY() > p2.getY() ) {
420
                        setActiveTool(false);
421
                        grBehavior.getMapControl().repaint();
422
                        grBehavior.getMapControl().setCursor(defaultCursor);
423
                        return false;
424
                }
425
                
426
                //Borde izquierdo
427
                if(e.getX() > p1.getX() && e.getX() <= (p1.getX() + PX_SELEC) && e.getY() > (p1.getY() + LONG_CORNER) && e.getY() < (p2.getY() - LONG_CORNER)) {
428
                        setCursor(iconHoriz);
429
                        setActiveTool(true);
430
                        sideActive[3] = true;
431
                        return true;
432
                }
433

    
434
                //Borde derecho
435
                if(e.getX() >= (p2.getX() - PX_SELEC) && e.getX() < p2.getX() && e.getY() > (p1.getY() + LONG_CORNER) && e.getY() < (p2.getY() - LONG_CORNER)) {
436
                        setCursor(iconHoriz);
437
                        setActiveTool(true);
438
                        sideActive[2] = true;
439
                        return true;
440
                }
441
                
442
                //Borde superior
443
                if(e.getY() > p1.getY() && e.getY() <= (p1.getY() + PX_SELEC) && e.getX() > (p1.getX() + LONG_CORNER) && e.getX() < (p2.getX() - LONG_CORNER)) {
444
                        setCursor(iconVert);
445
                        setActiveTool(true);
446
                        sideActive[0] = true;
447
                        return true;
448
                }
449
                
450
                //Borde inferior
451
                if(e.getY() >= (p2.getY() - PX_SELEC) && e.getY() < p2.getY() && e.getX() > (p1.getX() + LONG_CORNER) && e.getX() < (p2.getX() - LONG_CORNER)) {
452
                        setCursor(iconVert);
453
                        setActiveTool(true);
454
                        sideActive[1] = true;
455
                        return true;
456
                }
457
                
458
                //esquina superior izquierda
459
                if ((e.getX() > p1.getX() && e.getX() <= (p1.getX() + LONG_CORNER) && e.getY() > p1.getY() && e.getY() < (p1.getY() + PX_SELEC)) ||
460
                        (e.getX() > p1.getX() && e.getX() <= (p1.getX() + PX_SELEC) && e.getY() > p1.getY() && e.getY() <= (p1.getY() + LONG_CORNER))) {
461
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
462
                                setCursor(iconInclIzq);
463
                        else
464
                                setCursor(iconInclDer);
465
                        setActiveTool(true);
466
                        sideActive[5] = true;
467
                        return true;
468
                }
469
                
470
                //esquina superior derecha
471
                if ((e.getX() >= (p2.getX() - LONG_CORNER) && e.getX() < p2.getX() && e.getY() > p1.getY() && e.getY() < (p1.getY() + PX_SELEC)) ||
472
                        (e.getX() >= (p2.getX() - PX_SELEC) && e.getX() < p2.getX() && e.getY() > p1.getY() && e.getY() <= (p1.getY() + LONG_CORNER))) {
473
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
474
                                setCursor(iconInclDer);
475
                        else
476
                                setCursor(iconInclIzq);
477
                        setActiveTool(true);
478
                        sideActive[4] = true;
479
                        return true;
480
                }
481
                
482
                //esquina inferior izquierda
483
                if ((e.getX() > p1.getX() && e.getX() <= (p1.getX() + LONG_CORNER) && e.getY() >= (p2.getY() - PX_SELEC) && e.getY() < p2.getY()) ||
484
                        (e.getX() > p1.getX() && e.getX() <= (p1.getX() + PX_SELEC) && e.getY() < p2.getY() && e.getY() >= (p2.getY() - LONG_CORNER))) {
485
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
486
                                setCursor(iconInclDer);
487
                        else
488
                                setCursor(iconInclIzq);
489
                        setActiveTool(true);
490
                        sideActive[7] = true;
491
                        return true;
492
                }
493
                
494
                //esquina inferior derecha
495
                if ((e.getX() < p2.getX() && e.getX() >= (p2.getX() - LONG_CORNER) && e.getY() >= (p2.getY() - PX_SELEC) && e.getY() < p2.getY()) ||
496
                        (e.getX() < p2.getX() && e.getX() >= (p2.getX() - PX_SELEC) && e.getY() < p2.getY() && e.getY() >= (p2.getY() - LONG_CORNER))){
497
                        if((atImg.getScaleX() * atImg.getScaleY()) < 0)
498
                                setCursor(iconInclIzq);
499
                        else
500
                                setCursor(iconInclDer);
501
                        setActiveTool(true);
502
                        sideActive[6] = true;
503
                        return true;
504
                }
505
                
506
                grBehavior.getMapControl().repaint();
507
                grBehavior.getMapControl().setCursor(defaultCursor);
508
                return false;
509
        }
510
        
511
        /**
512
         * Pone a false todos los elementos del array sideActive. Esto es equivalente 
513
         * a eliminar cualquier selecci?n de borde.
514
         */
515
        private void resetBorderSelected() {
516
                for (int i = 0; i < sideActive.length; i++)
517
                        sideActive[i] = false;
518
        }
519

    
520
}