Statistics
| Revision:

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

History | View | Annotate | Download (18.7 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

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

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

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

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

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

    
223
        /**
224
         * Reimplementaci?n del m?todo mouseReleased de Behavior.
225
         *
226
         * @param e MouseEvent
227
         *
228
         * @throws BehaviorException Excepci?n lanzada cuando el Behavior.
229
         */
230
        public void mouseReleased(MouseEvent e) throws BehaviorException {
231
                resetBorderSelected();
232
                if (e.getButton() == MouseEvent.BUTTON1 && isResizable && lyr != null) {
233
                        endWidth = Math.abs(tmpUl.getX() - tmpLr.getX());
234
                        escale = endWidth / initWidth;
235
                        
236
                        AffineTransform tr = (AffineTransform)lyr.getAffineTransform().clone();
237
                        Point2D ul = new Point2D.Double();
238
                        Point2D lr = new Point2D.Double();
239
                        tr.transform(tmpUl, ul);
240
                        tr.transform(tmpLr, lr);
241
                        
242
                        AffineTransform esc = new AffineTransform(escale, 0, 0, escale, 0, 0);
243
                        AffineTransform at = new AffineTransform(tr.getScaleX(), tr.getShearY(), 
244
                                                                                                        tr.getShearX(), tr.getScaleY(), 
245
                                                                                                        ul.getX(), ul.getY());
246
                        esc.preConcatenate(at);
247
                        lyr.setAffineTransform(esc);
248
                        grBehavior.getMapControl().getMapContext().invalidate();
249
                        isResizable = false;
250
                }
251
        }
252
        
253
        /**
254
         * Al arrastrar cuando se ha pulsado sobre el marco de la imagen recalculamos
255
         * el marco de la imagen 
256
         *
257
         * @param e MouseEvent
258
         */
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
        public boolean mouseMoved(MouseEvent ev) throws BehaviorException {
388
                if(!init)
389
                        init();
390
                
391
                ViewPort vp = grBehavior.getMapControl().getMapContext().getViewPort();
392
                resetBorderSelected();
393
                
394
                lyr = grBehavior.getLayer();
395
                if(lyr == null) {
396
                        setActiveTool(false);
397
                        return false;
398
                }
399
                
400
                AffineTransform atImg = lyr.getAffineTransform();
401
                                
402
                //Pasar coordenadas del punto a coordenadas reales y luego a coordenadas pixel
403
                Point2D e = vp.toMapPoint(ev.getX(), ev.getY());
404
                try {
405
                        atImg.inverseTransform(e, e);
406
                } catch (NoninvertibleTransformException e1) {
407
                        return false;
408
                }
409
                
410
                //Comprobar si est? dentro del raster
411
                Point2D p1 = new Point2D.Double(0, 0);
412
                Point2D p2 = new Point2D.Double(lyr.getMultiRasterDataset().getWidth()[0], lyr.getMultiRasterDataset().getHeight()[0]);
413
                                        
414
                //Fuera del raster
415
                if(e.getX() < p1.getX() || e.getX() > p2.getX() || e.getY() < p1.getY() || e.getY() > p2.getY() ) {
416
                        setActiveTool(false);
417
                        grBehavior.getMapControl().repaint();
418
                        grBehavior.getMapControl().setCursor(defaultCursor);
419
                        return false;
420
                }
421
                
422
                //Borde izquierdo
423
                if(e.getX() > p1.getX() && e.getX() <= (p1.getX() + PX_SELEC) && e.getY() > (p1.getY() + LONG_CORNER) && e.getY() < (p2.getY() - LONG_CORNER)) {
424
                        setCursor(iconHoriz);
425
                        setActiveTool(true);
426
                        sideActive[3] = true;
427
                        return true;
428
                }
429

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

    
516
}