Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / layers / FLayers.java @ 541

History | View | Annotate | Download (11.4 KB)

1
package com.iver.cit.gvsig.fmap.layers;
2

    
3
import com.hardcode.driverManager.DriverLoadException;
4

    
5
import com.hardcode.gdbms.engine.data.DriverException;
6

    
7
import com.iver.cit.gvsig.fmap.ViewPort;
8
import com.iver.cit.gvsig.fmap.core.IGeometry;
9
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
10
import com.iver.cit.gvsig.fmap.operations.Cancellable;
11
import com.iver.cit.gvsig.fmap.operations.QueriedPoint;
12

    
13
import com.iver.utiles.XMLEntity;
14

    
15
import java.awt.Graphics2D;
16
import java.awt.geom.Rectangle2D;
17
import java.awt.image.BufferedImage;
18

    
19
import java.io.File;
20

    
21
import java.util.ArrayList;
22
import java.util.Iterator;
23

    
24

    
25
/**
26
 * Representa un nodo interno en el ?rbol de capas
27
 */
28
public class FLayers extends FLyrDefault implements FLayer {
29
        //ArrayList de Listener registrados.
30
        private ArrayList layerListeners = new ArrayList();
31
        private ArrayList layers = new ArrayList(4);
32

    
33
        /**
34
         * Crea un nuevo FLayers.
35
         */
36
        public FLayers() {
37
                setParentLayer(this);
38
        }
39

    
40
        /**
41
         * A?ade un listener de los eventos de la colecci?n de capas
42
         *
43
         * @param listener DOCUMENT ME!
44
         */
45
        public void addLayerCollectionListener(LayerCollectionListener listener) {
46
                layerListeners.add(listener);
47
        }
48

    
49
        /* (non-Javadoc) Funci?n sobrecargada
50
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#setActive(boolean)
51
         */
52
        public void setActive(boolean bActive) {
53
                FLayer lyr;
54

    
55
                for (int i = 0; i < layers.size(); i++) {
56
                        lyr = ((FLayer) layers.get(i));
57
                        lyr.setActive(bActive);
58
                }
59
        }
60

    
61
        /**
62
         * ELimina un listener de los eventos de la colecci?n de capas
63
         *
64
         * @param listener DOCUMENT ME!
65
         */
66
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
67
                layerListeners.remove(listener);
68
        }
69

    
70
        /**
71
         * DOCUMENT ME!
72
         *
73
         * @param layer DOCUMENT ME!
74
         */
75
        private void doAddLayer(FLayer layer) {
76
                layers.add(layer);
77
        }
78

    
79
        /**
80
         * A?ade una capa al final de la lista de subcapas
81
         *
82
         * @param layer DOCUMENT ME!
83
         *
84
         * @throws CancelationException
85
         */
86
        public void addLayer(FLayer layer) throws CancelationException {
87
                LayerCollectionEvent event = new LayerCollectionEvent(layer);
88

    
89
                callLayerAdding(event);
90

    
91
                doAddLayer(layer);
92

    
93
                callLayerAdded(event);
94
        }
95

    
96
        /**
97
         * Mueve una capa de la posici?n from a la posici?n to. (Se supone que
98
         * est?n dentro del mismo nivel). Para mover entre niveles, usar otro
99
         * m?todo (por hacer)
100
         *
101
         * @param from DOCUMENT ME!
102
         * @param to DOCUMENT ME!
103
         *
104
         * @throws CancelationException
105
         */
106
        public void moveTo(int from, int to) throws CancelationException {
107
                FLayer aux = (FLayer) layers.get(from);
108
                LayerPositionEvent event = new LayerPositionEvent(aux, from, to);
109
                callLayerMoving(event);
110
                layers.remove(from);
111
                layers.add(to, aux);
112
                callLayerMoved(event);
113
        }
114

    
115
        /**
116
         * DOCUMENT ME!
117
         *
118
         * @param lyr DOCUMENT ME!
119
         */
120
        private void doRemoveLayer(FLayer lyr) {
121
                layers.remove(lyr);
122
        }
123

    
124
        /**
125
         * DOCUMENT ME!
126
         *
127
         * @param lyr DOCUMENT ME!
128
         *
129
         * @throws CancelationException DOCUMENT ME!
130
         */
131
        public void removeLayer(FLayer lyr) throws CancelationException {
132
                LayerCollectionEvent event = new LayerCollectionEvent(lyr);
133
                callLayerRemoving(event);
134
                doRemoveLayer(lyr);
135
                callLayerRemoved(event);
136
        }
137

    
138
        /**
139
         * Borra una FLayer del vector a partir del identificador.
140
         *
141
         * @param idLayer
142
         */
143
        public void removeLayer(int idLayer) {
144
                layers.remove(idLayer);
145
        }
146

    
147
        /**
148
         * M?todo de conveniencia para borrar una capa con ese nombre
149
         *
150
         * @param layerName
151
         */
152
        public void removeLayer(String layerName) {
153
                FLayer lyr;
154

    
155
                for (int i = 0; i < layers.size(); i++) {
156
                        lyr = ((FLayer) layers.get(i));
157

    
158
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
159
                                layers.remove(i);
160

    
161
                                break;
162
                        }
163
                }
164
        }
165

    
166
        /**
167
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
168
         * este nodo
169
         *
170
         * @return DOCUMENT ME!
171
         */
172
        public FLayer[] getVisibles() {
173
                ArrayList array = new ArrayList();
174

    
175
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
176
                        if (((FLayer) iter.next()).isVisible()) {
177
                                array.add((FLayer) iter.next());
178
                        }
179
                }
180

    
181
                return (FLayer[]) array.toArray(new FLayer[0]);
182
        }
183

    
184
        /**
185
         * Obtiene el array de capas activas en el sub?rbol que pende de este nodo
186
         *
187
         * @return DOCUMENT ME!
188
         */
189
        public FLayer[] getActives() {
190
                ArrayList ret = new ArrayList();
191

    
192
                for (int i = 0; i < layers.size(); i++) {
193
                        if (((FLayer) layers.get(i)).isActive()) {
194
                                ret.add(layers.get(i));
195
                        }
196
                }
197

    
198
                return (FLayer[]) ret.toArray(new FLayer[0]);
199
        }
200

    
201
        /**
202
         * Obtiene el hijo i-?simo directo de esta colecci?n
203
         *
204
         * @param index DOCUMENT ME!
205
         *
206
         * @return DOCUMENT ME!
207
         */
208
        public FLayer getLayer(int index) {
209
                return (FLayer) layers.get(index);
210
        }
211

    
212
        /**
213
         * M?todo de conveniencia para buscar una capa por su nombre Es conveniente
214
         * usar getLayer(int) siempre que se pueda, es m?s directo.
215
         *
216
         * @param layerName
217
         *
218
         * @return
219
         */
220
        public FLayer getLayer(String layerName) {
221
                FLayer lyr;
222

    
223
                for (int i = 0; i < layers.size(); i++) {
224
                        lyr = ((FLayer) layers.get(i));
225

    
226
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
227
                                return lyr;
228
                        }
229
                }
230

    
231
                return null;
232
        }
233

    
234
        /**
235
         * Obtiene el n?mero de capas que hay en su mismo nivel Es decir, no cuenta
236
         * las subcapas de un FLayers
237
         *
238
         * @return DOCUMENT ME!
239
         */
240
        public int getLayersCount() {
241
                return layers.size();
242
        }
243

    
244
        /**
245
         * Crea una replica del objeto Layers
246
         *
247
         * @return DOCUMENT ME!
248
         *
249
         * @throws DifferentVersionException
250
         * @throws CancelationException
251
         * @throws ClassNotFoundException
252
         * @throws InstantiationException
253
         * @throws IllegalAccessException
254
         */
255
        public FLayers cloneFLayers()
256
                throws DifferentVersionException, CancelationException, 
257
                        ClassNotFoundException, InstantiationException, 
258
                        IllegalAccessException {
259
                return null; //(FLayers)createFromXML(getXMLEntity());
260
        }
261

    
262
        /**
263
         * DOCUMENT ME!
264
         *
265
         * @param image DOCUMENT ME!
266
         * @param g DOCUMENT ME!
267
         * @param viewPort DOCUMENT ME!
268
         * @param cancel
269
         *
270
         * @throws DriverIOException
271
         * @throws DriverLoadException
272
         * @throws DriverException
273
         *
274
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#draw(java.awt.image.BufferedImage,
275
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
276
         */
277
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
278
                Cancellable cancel)
279
                throws DriverIOException, DriverLoadException, DriverException {
280
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
281
                        FLayer lyr = (FLayer) iter.next();
282

    
283
                        //FLayer lyr = (FLayer) capa;
284
                        if (lyr.isVisible()) {
285
                                System.out.println("Dibujando " + lyr.getName());
286
                                lyr.draw(image, g, viewPort, cancel);
287
                        }
288
                }
289
        }
290

    
291
        /**
292
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#getSelectionBounds()
293
         */
294
        public Rectangle2D getSelectionBounds() {
295
                return null;
296
        }
297

    
298
        /**
299
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#createIndex()
300
         */
301
        public void createIndex() {
302
        }
303

    
304
        /**
305
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
306
         */
307
        public Rectangle2D getFullExtent() throws DriverIOException {
308
                Rectangle2D rAux = null;
309
                int i = 0;
310

    
311
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
312
                        FLayer capa = (FLayer) iter.next();
313

    
314
                        if (i == 0) {
315
                                rAux = capa.getFullExtent();
316
                        } else {
317
                                rAux.add(capa.getFullExtent());
318
                        }
319

    
320
                        i++;
321
                }
322

    
323
                return rAux;
324
        }
325

    
326
        /**
327
         * DOCUMENT ME!
328
         *
329
         * @param p DOCUMENT ME!
330
         * @param tolerance DOCUMENT ME!
331
         *
332
         * @throws DriverIOException
333
         *
334
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#selectByPoint(java.awt.geom.Point2D,
335
         *                 double)
336
         */
337
        public void selectByPoint(QueriedPoint p, double tolerance)
338
                throws DriverIOException {
339
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
340
                        FLayer layer = (FLayer) iter.next();
341

    
342
                        if (layer instanceof FLayers) {
343
                                ((FLayers) layer).selectByPoint(p, tolerance);
344
                        } else if (layer instanceof FLyrVect) {
345
                                ((FLyrVect) layer).selectByPoint(p, tolerance);
346
                        }
347
                }
348
        }
349

    
350
        /**
351
         * DOCUMENT ME!
352
         *
353
         * @param rect DOCUMENT ME!
354
         *
355
         * @throws DriverIOException
356
         *
357
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#selectByRect(java.awt.geom.Rectangle2D)
358
         */
359
        public void selectByRect(Rectangle2D rect) throws DriverIOException {
360
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
361
                        FLayer layer = (FLayer) iter.next();
362

    
363
                        if (layer instanceof FLayers) {
364
                                ((FLayers) layer).selectByRect(rect);
365
                        } else if (layer instanceof FLyrVect) {
366
                                ((FLyrVect) layer).selectByRect(rect);
367
                        }
368
                }
369
        }
370

    
371
        /**
372
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#selectByShape(com.iver.cit.gvsig.fmap.core.IGeometry,
373
         *                 int)
374
         */
375
        public void selectByShape(IGeometry g, int relationship) {
376
        }
377

    
378
        /**
379
         * DOCUMENT ME!
380
         *
381
         * @param event DOCUMENT ME!
382
         *
383
         * @throws CancelationException
384
         */
385
        private void callLayerAdding(LayerCollectionEvent event)
386
                throws CancelationException {
387
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
388
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
389
                }
390
        }
391

    
392
        /**
393
         * DOCUMENT ME!
394
         *
395
         * @param event DOCUMENT ME!
396
         *
397
         * @throws CancelationException
398
         */
399
        private void callLayerRemoving(LayerCollectionEvent event)
400
                throws CancelationException {
401
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
402
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
403
                }
404
        }
405

    
406
        /**
407
         * DOCUMENT ME!
408
         *
409
         * @param event DOCUMENT ME!
410
         *
411
         * @throws CancelationException
412
         */
413
        private void callLayerMoving(LayerPositionEvent event)
414
                throws CancelationException {
415
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
416
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
417
                }
418
        }
419

    
420
        /**
421
         * DOCUMENT ME!
422
         *
423
         * @param event DOCUMENT ME!
424
         */
425
        private void callLayerAdded(LayerCollectionEvent event) {
426
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
427
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
428
                }
429
        }
430

    
431
        /**
432
         * DOCUMENT ME!
433
         *
434
         * @param event DOCUMENT ME!
435
         */
436
        private void callLayerRemoved(LayerCollectionEvent event) {
437
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
438
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
439
                }
440
        }
441

    
442
        /**
443
         * DOCUMENT ME!
444
         *
445
         * @param event DOCUMENT ME!
446
         */
447
        private void callLayerMoved(LayerPositionEvent event) {
448
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
449
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
450
                }
451
        }
452

    
453
        /**
454
         * DOCUMENT ME!
455
         *
456
         * @return DOCUMENT ME!
457
         *
458
         * @throws DriverException
459
         *
460
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
461
         */
462
        public XMLEntity getXMLEntity() throws DriverException {
463
                XMLEntity xml = super.getXMLEntity();
464
                xml.putProperty("numLayers", layers.size());
465

    
466
                for (int i = 0; i < layers.size(); i++) {
467
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
468
                }
469

    
470
                return xml;
471
        }
472

    
473
        /**
474
         * DOCUMENT ME!
475
         *
476
         * @param xml DOCUMENT ME!
477
         *
478
         * @throws XMLException
479
         *
480
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
481
         */
482
        public void setXMLEntity(XMLEntity xml) throws XMLException {
483
                super.setXMLEntity(xml);
484

    
485
                int numLayers = xml.getIntProperty("numLayers");
486

    
487
                for (int i = 0; i < numLayers; i++) {
488
                        if (xml.getStringProperty("file") != null) {
489
                                try {
490
                                        layers.add(LayerFactory.createLayer(
491
                                                        xml.getChild(i).getStringProperty("driverName"),
492
                                                        new File(xml.getChild(i).getStringProperty("name")),
493
                                                        getProjection()));
494
                                } catch (DriverLoadException e) {
495
                                        throw new XMLException(e);
496
                                } catch (DriverIOException e) {
497
                                        throw new XMLException(e);
498
                                }
499
                        } else if (true) {
500
                        } else if (true) {
501
                        }
502
                }
503
        }
504
}