Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / raster / beans / canvas / layers / StraightLine.java @ 19319

History | View | Annotate | Download (8.31 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 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.raster.beans.canvas.layers;
20

    
21
import java.awt.Color;
22
import java.awt.Cursor;
23
import java.awt.Graphics;
24
import java.awt.Point;
25
import java.awt.event.MouseEvent;
26
import java.awt.geom.Point2D;
27
import java.util.ArrayList;
28

    
29
import org.gvsig.raster.beans.canvas.DrawableElement;
30
import org.gvsig.raster.beans.canvas.GCanvas;
31

    
32
/**
33
 * Representa una linea recta con puntos de arrastre para la ecualizaci?n de
34
 * un histograma y realce lineales y dencity slicing.
35
 *
36
 * 14-oct-2007
37
 * @author Nacho Brodin (nachobrodin@gmail.com)
38
 */
39
public class StraightLine extends DrawableElement {
40

    
41
        /**
42
         * Representa un punto seleccionado sobre el canvas. Este es
43
         * dibujado como un peque?o cuadrado.
44
         *
45
         * 14-oct-2007
46
         * @author Nacho Brodin (nachobrodin@gmail.com)
47
         */
48
        class Square {
49
                private Point2D     ul, lr;
50
                private Point2D     center = null;
51
                private int         width = 6;
52
                private Color       color = Color.WHITE;
53
                
54
                /**
55
                 * Constructor. Calcula las esquinas del cuadrado
56
                 * @param p
57
                 */
58
                public Square(Point p) {
59
                        init(p);
60
                }
61
                
62
                private void init(Point p) {
63
                        ul = new Point2D.Double(p.getX() - (width >> 1), p.getY() - (width >> 1));
64
                        lr = new Point2D.Double(p.getX() + (width >> 1), p.getY() + (width >> 1));
65
                        center = new Point2D.Double(p.getX(), p.getY());
66
                }
67
                
68
                /**
69
                 * Asigna una nueva posici?n al punto
70
                 * @param x
71
                 */
72
                public void setPosition(Point p) {
73
                        init(p);
74
                }
75
                
76
                /**
77
                 * Obtiene el punto central del cuadro
78
                 * @return Point2D
79
                 */
80
                public Point2D getCenter() {
81
                        return center;
82
                }
83
                        
84
                /**
85
                 * Dibuja el cuadrado
86
                 * @param g
87
                 */
88
                protected void paint(Graphics g) {
89
                        g.setColor(color);
90
                        g.drawRect((int)ul.getX(), (int)ul.getY(), (int)width, (int)width);
91
                }
92
                
93
                /**
94
                 * Informa de si el punto pasado por par?metro cae dentro del cuadro o no
95
                 * @param p Punto a comprobar
96
                 * @return true si el punto est? dentro y false si no lo est?
97
                 */
98
                public boolean isInside(Point p) {
99
                        return (p.getX() >= ul.getX() && p.getX() <= lr.getX() && p.getY() >= ul.getY() && p.getY() <= lr.getY());
100
                }
101
                
102
                /**
103
                 * Asigna el color del cuadrado
104
                 * @param c Color
105
                 */
106
                public void setColor(Color c) {
107
                        this.color = c;
108
                }
109
        }
110
        
111
        /**
112
         * Lista de cuadrados que intersectan con la recta
113
         */
114
        private ArrayList        square = new ArrayList();
115
        private int              pointDragged = -1;
116
        
117
        /**
118
         * Constructor. Asigna el color
119
         * @param c
120
         */
121
        public StraightLine(Color c) {
122
                setColor(c);
123
        }
124
        
125
        /*
126
         *  (non-Javadoc)
127
         * @see org.gvsig.gui.beans.canvas.DrawableElement#firstDraw()
128
         */
129
        public void firstDrawActions() {
130
                //El primer dibujado asigna valores a los puntos inicial y final.
131
                //No puede hacerse fuera del paint porque a?n no tiene los datos.
132
                square.clear();
133
                Point beginPoint = new Point(canvas.getCanvasMinX(), canvas.getCanvasMaxY());
134
                square.add(new Square(beginPoint));
135
                Point endPoint = new Point(canvas.getCanvasMaxX(), canvas.getCanvasMinY());
136
                square.add(new Square(endPoint));
137
        }
138
        
139
        /**
140
         * Dibujado de las l?neas y cuadros sobre el canvas
141
         */
142
        public void paint(Graphics g) {
143
                g.setColor(color);
144
                
145
                //Dibujamos una l?nea desde un punto hasta el siguiente
146
                for (int i = 0; i < (square.size() - 1); i++) {
147
                        Square sq = ((Square)square.get(i));
148
                        Square sqNext = ((Square)square.get(i + 1));
149
                        g.drawLine((int)sq.getCenter().getX(), (int)sq.getCenter().getY(), (int)sqNext.getCenter().getX(), (int)sqNext.getCenter().getY());
150
                        sq.setColor(color);
151
                        sq.paint(g);
152
                }
153
                
154
                //Dibujamos el ?ltimo tramo de recta
155
                if(square.size() != 0)
156
                        ((Square)square.get(square.size() - 1)).paint(g);
157
        }
158

    
159
        /**
160
         * Asigna el objeto JComponent donde se pintan los elementos. Inicializa los puntos
161
         * de inicio y fin de l?nea y asigna los listener
162
         * @param canvas
163
         */
164
        public void setCanvas(GCanvas canvas) {
165
                super.setCanvas(canvas);
166
        }
167
        
168
        /**
169
         * Inserta un elemento (cuadrado) en el array entre los dos cuadrados entre los que se
170
         * encuentre el valor de su X, as? siempre est?n ordenados en el array por valor de X. 
171
         * @param element
172
         * @return Devuelve la posici?n del elemento insertado, en caso de no poder insertarse
173
         *         devolver? -1
174
         */
175
        private int insert(Square element) {
176
                for (int i = 0; i < (square.size() - 1); i++) {
177
                        int sqX = (int)((Square)square.get(i)).getCenter().getX();
178
                        int sqNextX = (int)((Square)square.get(i + 1)).getCenter().getX();
179
                        if(element.getCenter().getX() >= sqX && element.getCenter().getX() <= sqNextX) {
180
                                square.add(i + 1, element);
181
                                return i + 1;
182
                        }
183
                }
184
                return -1;
185
        }
186
        
187
        /**
188
         * Se captura el punto a arrastrar, en caso de que no coincida con un punto,
189
         * se inserta
190
         */
191
        public boolean mousePressed(MouseEvent e) {
192
                for (int i = 0; i < square.size(); i++) {
193
                        if (((Square)square.get(i)).isInside(e.getPoint())) {
194
                                pointDragged = i;
195
                                canvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
196
                                return false;
197
                        }
198
                }
199

    
200
                // En caso de que nadie lo este tratando, osea, un cursor normal
201
                if (canvas.getCursor().getType() == Cursor.DEFAULT_CURSOR) {
202
                        pointDragged = insert(new Square(e.getPoint()));
203
                        canvas.repaint();
204
                        canvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
205
                        return false;
206
                }
207
                return true;
208
        }
209

    
210
        /**
211
         * Inicializamos el punto arrastrado a un valor fuera del array
212
         */
213
        public boolean mouseReleased(MouseEvent e) {
214
                pointDragged = -1;
215
                return true;
216
        }
217

    
218
        /**
219
         * Cuando se ha pinchado un punto y se arrastra se define aqu? su comportamiento.
220
         */
221
        public boolean mouseDragged(MouseEvent e) {
222
                if (pointDragged >= 0) {
223
                        canvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
224
                        int minX = canvas.getCanvasMinX();
225
                        int minY = canvas.getCanvasMinY();
226
                        int maxX = canvas.getCanvasMaxX();
227
                        int maxY = canvas.getCanvasMaxY();
228
                        
229
                        //Controlamos que no se salga de los l?mites
230
                        int x = Math.min(Math.max(e.getX(), minX), maxX);
231
                        int y = Math.min(Math.max(e.getY(), minY), maxY);
232
                        Square point = ((Square)square.get(pointDragged)); 
233
                        
234
                        try {
235
                                //El primer punto no se desplaza en X
236
                                if (pointDragged == 0) {
237
                                        point.setPosition(new Point(minX, y));
238
                                        return false;
239
                                }
240
                                //El ?ltimo punto no se desplaza en X
241
                                if (pointDragged == (square.size() - 1)) {
242
                                        point.setPosition(new Point(maxX, y));
243
                                        return false;
244
                                }
245

    
246
                                //Puntos centrales
247
                                point.setPosition(new Point(x, y));
248
                                
249
                                //Arrastra a los de abajo si la X es menor que los inferiores
250
                                for (int i = 0; i < pointDragged; i++) {
251
                                        Square lowPoint = ((Square)square.get(i));
252
                                        if(lowPoint.getCenter().getX() >= x) {
253
                                                lowPoint.setPosition(new Point(x, (int)lowPoint.getCenter().getY()));
254
                                                for (int j = i + 1; square.get(j) != point;) {
255
                                                        square.remove(j);
256
                                                        pointDragged --;
257
                                                }
258
                                                break;
259
                                        }
260
                                }
261
                                
262
                                //Arrastra a los de arriba si la X es mayor que los superiores
263
                                for (int i = square.size() - 1; i > pointDragged; i--) {
264
                                        Square upperPoint = ((Square)square.get(i));
265
                                        if(upperPoint.getCenter().getX() <= x) {
266
                                                upperPoint.setPosition(new Point(x, (int)upperPoint.getCenter().getY()));
267
                                                for (int j = i - 1; square.get(j) != point; ) {
268
                                                        square.remove(j);
269
                                                        j --;
270
                                                }
271
                                                break;
272
                                        }
273
                                }
274
                        } finally {
275
                                // Siempre repintamos
276
                                canvas.repaint();
277
                        }
278
                        return false;
279
                }
280
                return true;
281
        }
282

    
283
        /*
284
         * (non-Javadoc)
285
         * @see org.gvsig.raster.beans.canvas.DrawableElement#mouseMoved(java.awt.event.MouseEvent)
286
         */
287
        public boolean mouseMoved(MouseEvent e) {
288
                for (int i = 0; i < square.size(); i++) {
289
                        if (((Square)square.get(i)).isInside(e.getPoint())) {
290
                                canvas.setCursor(new Cursor(Cursor.MOVE_CURSOR));
291
                                return false;
292
                        }
293
                }
294
                return true;
295
        }
296
}