Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / raster / beans / canvas / GCanvas.java @ 22103

History | View | Annotate | Download (9.08 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;
20

    
21
import java.awt.Color;
22
import java.awt.Cursor;
23
import java.awt.Graphics;
24
import java.awt.event.MouseEvent;
25
import java.awt.event.MouseListener;
26
import java.awt.event.MouseMotionListener;
27
import java.util.ArrayList;
28
import java.util.Iterator;
29

    
30
import javax.swing.JPanel;
31
/**
32
 * Canvas donde se pintan objetos GLine
33
 * 14-oct-2007
34
 * @author Nacho Brodin (nachobrodin@gmail.com)
35
 */
36
public class GCanvas  extends JPanel implements MouseListener, MouseMotionListener {
37
        private static final long   serialVersionUID = 5431466034535083594L;
38
        private Color               backgroundColor = Color.WHITE;
39
        private ArrayList           drawableElements = new ArrayList();
40
        public static final int     DEFAULT_CURSOR = Cursor.DEFAULT_CURSOR;
41
        
42
        private boolean hasMouse = false;
43
        
44
        // Tama?o de los bordes para el canvas
45
        private int               borderX1               = 0;
46
        private int               borderX2               = 0;
47
        private int               borderY1               = 0;
48
        private int               borderY2               = 0;
49
        
50
        private ArrayList           actionCommandListeners = new ArrayList();
51
                
52
        /**
53
         * Contructor.Inicializa el objeto asignando color de fondo. Considera que el objeto
54
         * GLine ya tiene su color asignado.
55
         * @param line Objeto l?nea
56
         * @param backgroundColor
57
         */
58
        public GCanvas(Color backgroundColor) {
59
                this.backgroundColor = backgroundColor;
60
                addMouseListener(this);
61
                addMouseMotionListener(this);
62
        }
63
        
64
        public void addBorder(int x1, int y1, int x2, int y2) {
65
                borderX1 += x1;
66
                borderX2 += x2;
67
                borderY1 += y1;
68
                borderY2 += y2;
69
        }
70
        
71
        /**
72
         * A?adir un listener a la lista de eventos
73
         * @param listener
74
         */
75
        public void addValueChangedListener(IGCanvasListener listener) {
76
                if (!actionCommandListeners.contains(listener))
77
                        actionCommandListeners.add(listener);
78
        }
79

    
80
        /**
81
         * Borrar un listener de la lista de eventos
82
         * @param listener
83
         */
84
        public void removeValueChangedListener(IGCanvasListener listener) {
85
                actionCommandListeners.remove(listener);
86
        }
87
        
88
        /**
89
         * Invocar a los eventos asociados al componente
90
         */
91
        public void callDataChanged(String key, Object value) {
92
                Iterator iterator = actionCommandListeners.iterator();
93
                while (iterator.hasNext()) {
94
                        IGCanvasListener listener = (IGCanvasListener) iterator.next();
95
                        listener.actionDataChanged(new GCanvasEvent(this, key, value));
96
                }
97
        }
98
        
99
        /**
100
         * Invocar a los eventos asociados al componente
101
         */
102
        public void callDataDragged(String key, Object value) {
103
                Iterator iterator = actionCommandListeners.iterator();
104
                while (iterator.hasNext()) {
105
                        IGCanvasListener listener = (IGCanvasListener) iterator.next();
106
                        listener.actionDataDragged(new GCanvasEvent(this, key, value));
107
                }
108
        }
109
        
110
        /**
111
         * A?ade un elemento dibujable a la lista
112
         * @param element
113
         */
114
        public void addDrawableElement(DrawableElement element) {
115
                if (drawableElements.contains(element))
116
                        return;
117
                element.setCanvas(this);
118
                element.firstActions();
119
                drawableElements.add(element);
120
        }
121
        
122
        /**
123
         * Reemplaza un elemento dibujable si encuentra uno de su mismo tipo
124
         * @param element
125
         */
126
        public void replaceDrawableElement(DrawableElement element) {
127
                for (int i = 0; i < drawableElements.size(); i++) {
128
                        if (element.getClass().isAssignableFrom(drawableElements.get(i).getClass())) {
129
                                drawableElements.set(i, element);
130
                                element.setCanvas(this);
131
                                break;
132
                        }
133
                }
134
        }
135

    
136
        /**
137
         * Obtiene todos los elementos dibujable que sean una instancia de c1
138
         * @param c1
139
         * @return ArrayList de DrawableElements
140
         */
141
        public ArrayList getDrawableElements(Class c1) {
142
                ArrayList elements = new ArrayList();
143
                for (int i = 0; i < drawableElements.size(); i++) {
144
                        if (c1.isInstance(drawableElements.get(i)))
145
                                elements.add(drawableElements.get(i));
146
                }
147
                return elements;
148
        }
149
        
150
        /**
151
         * Reemplaza un elemento dibujable si encuentra uno del tipo especificado en el 
152
         * parametro c1
153
         * @param element
154
         * @param c1
155
         */
156
        public void replaceDrawableElement(DrawableElement element, Class cl) {
157
                for (int i = 0; i < drawableElements.size(); i++) {
158
                        if (cl.isInstance(drawableElements.get(i))) {
159
                                drawableElements.set(i, element);
160
                                element.setCanvas(this);
161
                                break;
162
                        }
163
                }
164
        }
165
        
166
        /**
167
         * Elimina un elemento dibujable
168
         * @param Class clase del elemento a eliminar
169
         */
170
        public void removeDrawableElement(Class cl) {
171
                for (int i = 0; i < drawableElements.size(); i++)
172
                        if (cl.isInstance(drawableElements.get(i)))
173
                                drawableElements.remove(i);
174
        }
175
        
176
        /**
177
         * Asigna una lista de elementos dibujables
178
         * @return
179
         */
180
        public void setDrawableElements(ArrayList list) {
181
                drawableElements.clear();
182
                for (int i = 0; i < list.size(); i++)
183
                        if (list.get(i) instanceof DrawableElement)
184
                                drawableElements.add(list.get(i));
185
                repaint();
186
        }
187
                
188
        /**
189
         * Inicializa el fondo y dibuja el gr?fico sobre el canvas.
190
         */
191
        public void paint(Graphics g) {
192
                if (g == null) return;
193
                g.setColor(backgroundColor);
194
                g.fillRect(0, 0, getWidth(), getHeight());
195
                for (int i = 0; i < drawableElements.size(); i++) 
196
                        ((DrawableElement)drawableElements.get(i)).draw(g);
197
        }
198
        
199
        /**
200
         * Ejecuta las acciones antes del primer dibujado de todos
201
         * los elementos dibujables
202
         */
203
        public void execFirstDrawActions() {
204
                for (int i = 0; i < drawableElements.size(); i++) 
205
                        ((DrawableElement)drawableElements.get(i)).firstDrawActions();
206
        }
207
        
208
        /**
209
         * Obtiene la posici?n m?nima en X del canvas donde comenzar a dibujar
210
         * @return
211
         */
212
        public int getCanvasMinX() {
213
                return borderX1;
214
        }
215
        
216
        /**
217
         * Obtiene la posici?n m?nima en Y del canvas donde comenzar a dibujar
218
         * @return
219
         */
220
        public int getCanvasMinY() {
221
                return borderY1;
222
        }
223
        
224
        /**
225
         * Obtiene la posici?n m?xima en X del canvas donde terminar el dibujado
226
         * @return
227
         */
228
        public int getCanvasMaxX() {
229
                return getWidth() - borderX2;
230
        }
231
        
232
        /**
233
         * Obtiene la posici?n m?xima en Y del canvas donde terminar el dibujado
234
         * @return
235
         */
236
        public int getCanvasMaxY() {
237
                return getHeight() - borderY2;
238
        }
239
        
240
        /**
241
         * Obtiene el ancho del canvas sumando a partir de getCanvasX donde termina el ?rea de dibujo
242
         * @return
243
         */
244
        public int getCanvasWidth() {
245
                return getWidth() - (borderX1 + borderX2);
246
        }
247
        
248
        /**
249
         * Obtiene el alto del canvas sumando a partir de getCanvasY donde termina el ?rea de dibujo
250
         * @return
251
         */
252
        public int getCanvasHeight() {
253
                return getHeight() - (borderY1 + borderY2);
254
        }
255

    
256
        /*
257
         * (non-Javadoc)
258
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
259
         */
260
        public void mousePressed(MouseEvent e) {
261
                for (int i = drawableElements.size() - 1; i >= 0 ; i--)
262
                        if (!((DrawableElement) drawableElements.get(i)).mousePressed(e))
263
                                return;
264
        }
265

    
266
        /*
267
         * (non-Javadoc)
268
         * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
269
         */
270
        public void mouseReleased(MouseEvent e) {
271
                for (int i = drawableElements.size() - 1; i >= 0 ; i--)
272
                        if (!((DrawableElement) drawableElements.get(i)).mouseReleased(e))
273
                                return;
274
                this.mouseMoved(e);
275
        }
276

    
277
        /*
278
         * (non-Javadoc)
279
         * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
280
         */
281
        public void mouseDragged(MouseEvent e) {
282
                for (int i = drawableElements.size() - 1; i >= 0 ; i--)
283
                        if (!((DrawableElement) drawableElements.get(i)).mouseDragged(e))
284
                                return;
285
        }
286

    
287
        /*
288
         * (non-Javadoc)
289
         * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
290
         */
291
        public void mouseMoved(MouseEvent e) {
292
                for (int i = drawableElements.size() - 1; i >= 0 ; i--)
293
                        if (!((DrawableElement) drawableElements.get(i)).mouseMoved(e))
294
                                return;
295
                setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
296
        }
297
        
298
        /*
299
         * (non-Javadoc)
300
         * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
301
         */
302
        public void mouseEntered(MouseEvent e) {
303
                hasMouse = true;
304
                repaint();
305
                for (int i = drawableElements.size() - 1; i >= 0 ; i--)
306
                        if (!((DrawableElement) drawableElements.get(i)).mouseEntered(e))
307
                                return;
308
        }
309
        
310
        /*
311
         * (non-Javadoc)
312
         * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
313
         */
314
        public void mouseExited(MouseEvent e) {
315
                hasMouse = false;
316
                repaint();
317
                for (int i = drawableElements.size() - 1; i >= 0 ; i--)
318
                        if (!((DrawableElement) drawableElements.get(i)).mouseExited(e))
319
                                return;
320
        }
321

    
322
        /**
323
         * Devuelve si en ese momento el raton esta sobre el canvas
324
         * @return
325
         */
326
        public boolean isMouse() {
327
                return hasMouse;
328
        }
329

    
330
        public void mouseClicked(MouseEvent e) {}
331
}