Statistics
| Revision:

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

History | View | Annotate | Download (13.4 KB)

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

    
3
import com.iver.cit.gvsig.fmap.DriverException;
4
import com.iver.cit.gvsig.fmap.FMap;
5
import com.iver.cit.gvsig.fmap.ViewPort;
6
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
7
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
8
import com.iver.cit.gvsig.fmap.operations.Cancellable;
9
import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor;
10
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
11

    
12
import com.iver.utiles.StringUtilities;
13
import com.iver.utiles.XMLEntity;
14

    
15
import org.cresques.cts.ICoordTrans;
16

    
17
import java.awt.Graphics2D;
18
import java.awt.geom.Rectangle2D;
19
import java.awt.image.BufferedImage;
20

    
21
import java.io.File;
22

    
23
import java.net.MalformedURLException;
24
import java.net.URL;
25

    
26
import java.util.ArrayList;
27
import java.util.BitSet;
28
import java.util.Iterator;
29

    
30

    
31
/**
32
 * Representa un nodo interno en el ?rbol de capas
33
 */
34
public class FLayers extends FLyrDefault implements VectorialData,
35
        LayerCollection {
36
        //ArrayList de Listener registrados.
37
        private ArrayList layerListeners = new ArrayList();
38
        private ArrayList layers = new ArrayList(4);
39
        private FMap fmap;
40

    
41
        /**
42
         * Crea un nuevo FLayers.
43
         *
44
         * @param fmap
45
         * @param parent
46
         */
47
        public FLayers(FMap fmap, FLayers parent) {
48
                setParentLayer(parent);
49
                this.fmap = fmap;
50
        }
51

    
52
        /**
53
         * A?ade un listener de los eventos de la colecci?n de capas
54
         *
55
         * @param listener
56
         */
57
        public void addLayerCollectionListener(LayerCollectionListener listener) {
58
                layerListeners.add(listener);
59
        }
60

    
61
        /**
62
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllVisibles(boolean)
63
         */
64
        public void setAllVisibles(boolean visible) {
65
                FLayer lyr;
66

    
67
                for (int i = 0; i < layers.size(); i++) {
68
                        lyr = ((FLayer) layers.get(i));
69
                        lyr.setVisible(visible);
70

    
71
                        if (lyr instanceof LayerCollection) {
72
                                ((LayerCollection) lyr).setAllVisibles(visible);
73
                        }
74
                }
75
        }
76

    
77
        /**
78
         * Elimina un listener de los eventos de la colecci?n de capas
79
         *
80
         * @param listener
81
         */
82
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
83
                layerListeners.remove(listener);
84
        }
85

    
86
        /**
87
         * A?ade una capa.
88
         *
89
         * @param layer
90
         */
91
        private void doAddLayer(FLayer layer) {
92
                layers.add(layer);
93
                layer.setParentLayer(this);
94
        }
95

    
96
        /**
97
         * A?ade una capa al final de la lista de subcapas
98
         *
99
         * @param layer
100
         *
101
         * @throws CancelationException
102
         */
103
        public void addLayer(FLayer layer) throws CancelationException {
104
                LayerCollectionEvent event = new LayerCollectionEvent(layer);
105

    
106
                callLayerAdding(event);
107

    
108
                doAddLayer(layer);
109

    
110
                callLayerAdded(event);
111
        }
112

    
113
        /**
114
         * Mueve una capa de la posici?n from a la posici?n to. (Se supone que
115
         * est?n dentro del mismo nivel). Para mover entre niveles, usar otro
116
         * m?todo (por hacer)
117
         *
118
         * @param from origen.
119
         * @param to destino.
120
         *
121
         * @throws CancelationException
122
         */
123
        public void moveTo(int from, int to) throws CancelationException {
124
                FLayer aux = (FLayer) layers.get(from);
125
                LayerPositionEvent event = new LayerPositionEvent(aux, from, to);
126
                callLayerMoving(event);
127
                layers.remove(from);
128
                layers.add(to, aux);
129
                callLayerMoved(event);
130
        }
131

    
132
        /**
133
         * Borra una capa del ArrayList que contiene a las capas.
134
         *
135
         * @param lyr FLayer.
136
         */
137
        private void doRemoveLayer(FLayer lyr) {
138
                layers.remove(lyr);
139
        }
140

    
141
        /**
142
         * Borra una capa de la colecci?n de capas.
143
         *
144
         * @param lyr FLayer
145
         *
146
         * @throws CancelationException
147
         */
148
        public void removeLayer(FLayer lyr) throws CancelationException {
149
                LayerCollectionEvent event = new LayerCollectionEvent(lyr);
150
                callLayerRemoving(event);
151
                doRemoveLayer(lyr);
152
                callLayerRemoved(event);
153
        }
154

    
155
        /**
156
         * Borra una FLayer del vector a partir del identificador.
157
         *
158
         * @param idLayer
159
         */
160
        public void removeLayer(int idLayer) {
161
                layers.remove(idLayer);
162
        }
163

    
164
        /**
165
         * M?todo de conveniencia para borrar una capa con ese nombre
166
         *
167
         * @param layerName
168
         */
169
        public void removeLayer(String layerName) {
170
                FLayer lyr;
171

    
172
                for (int i = 0; i < layers.size(); i++) {
173
                        lyr = ((FLayer) layers.get(i));
174

    
175
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
176
                                layers.remove(i);
177

    
178
                                break;
179
                        }
180
                }
181
        }
182

    
183
        /**
184
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
185
         * este nodo
186
         *
187
         * @return Vector de FLayer.
188
         */
189
        public FLayer[] getVisibles() {
190
                ArrayList array = new ArrayList();
191

    
192
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
193
                        if (((FLayer) iter.next()).isVisible()) {
194
                                array.add((FLayer) iter.next());
195
                        }
196
                }
197

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

    
201
        /**
202
         * Obtiene el hijo i-?simo directo de esta colecci?n
203
         *
204
         * @param index ?ndice.
205
         *
206
         * @return capa seleccionada.
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 nombre.
217
         *
218
         * @return capa seleccionada.
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 n?mero de capas.
239
         */
240
        public int getLayersCount() {
241
                return layers.size();
242
        }
243

    
244
        /**
245
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#draw(java.awt.image.BufferedImage,
246
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
247
         */
248
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
249
                Cancellable cancel) throws DriverException {
250
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
251
                        FLayer lyr = (FLayer) iter.next();
252

    
253
                        if (lyr.isVisible()) {
254
                                lyr.draw(image, g, viewPort, cancel);
255
                        }
256
                }
257

    
258
                if (getVirtualLayers() != null) {
259
                        getVirtualLayers().draw(image, g, viewPort, cancel);
260
                }
261
        }
262

    
263
        /**
264
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
265
         *                 com.iver.cit.gvsig.fmap.ViewPort,
266
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
267
         */
268
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel)
269
                throws DriverException {
270
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
271
                        FLayer lyr = (FLayer) iter.next();
272

    
273
                        if (lyr.isVisible()) {
274
                                lyr.print(g, viewPort, cancel);
275
                        }
276
                }
277
        }
278

    
279
        /**
280
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
281
         */
282
        public Rectangle2D getFullExtent() throws DriverException {
283
                Rectangle2D rAux = null;
284
                int i = 0;
285

    
286
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
287
                        FLayer capa = (FLayer) iter.next();
288

    
289
                        if (i == 0) {
290
                                rAux = capa.getFullExtent();
291
                        } else {
292
                                rAux.add(capa.getFullExtent());
293
                        }
294

    
295
                        i++;
296
                }
297

    
298
                return rAux;
299
        }
300

    
301
        /**
302
         * Llama al m?todo layerAdding de los listeners dados de alta.
303
         *
304
         * @param event
305
         *
306
         * @throws CancelationException
307
         */
308
        private void callLayerAdding(LayerCollectionEvent event)
309
                throws CancelationException {
310
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
311
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
312
                }
313
        }
314

    
315
        /**
316
         * Llama al m?todo layerRemoving de los listeners dados de alta.
317
         *
318
         * @param event
319
         *
320
         * @throws CancelationException
321
         */
322
        private void callLayerRemoving(LayerCollectionEvent event)
323
                throws CancelationException {
324
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
325
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
326
                }
327
        }
328

    
329
        /**
330
         * Llama al m?todo layerMoving de los listeners dados de alta.
331
         *
332
         * @param event
333
         *
334
         * @throws CancelationException
335
         */
336
        private void callLayerMoving(LayerPositionEvent event)
337
                throws CancelationException {
338
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
339
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
340
                }
341
        }
342

    
343
        /**
344
         * Llama al m?todo layerAdded de los listeners dados de alta.
345
         *
346
         * @param event
347
         */
348
        private void callLayerAdded(LayerCollectionEvent event) {
349
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
350
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
351
                }
352
        }
353

    
354
        /**
355
         * Llama al m?todo layerRemoved de los listeners dados de alta.
356
         *
357
         * @param event
358
         */
359
        private void callLayerRemoved(LayerCollectionEvent event) {
360
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
361
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
362
                }
363
        }
364

    
365
        /**
366
         * Llama al m?todo layerMoved de los listeners dados de alta.
367
         *
368
         * @param event
369
         */
370
        private void callLayerMoved(LayerPositionEvent event) {
371
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
372
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
373
                }
374
        }
375

    
376
        /**
377
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
378
         */
379
        public XMLEntity getXMLEntity() {
380
                XMLEntity xml = super.getXMLEntity();
381
                xml.putProperty("numLayers", layers.size());
382

    
383
                String[] s = new String[layers.size()];
384

    
385
                for (int i = 0; i < layers.size(); i++) {
386
                        s[i] = ((FLayer) layers.get(i)).getName();
387
                }
388

    
389
                xml.putProperty("LayerNames", s);
390

    
391
                for (int i = 0; i < layers.size(); i++) {
392
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
393
                }
394

    
395
                return xml;
396
        }
397

    
398
        /**
399
         * DOCUMENT ME!
400
         *
401
         * @param xml DOCUMENT ME!
402
         *
403
         * @throws XMLException
404
         *
405
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
406
         */
407
        public void setXMLEntity(XMLEntity xml) throws XMLException {
408
                super.setXMLEntity(xml);
409

    
410
                int numLayers = xml.getIntProperty("numLayers");
411

    
412
                String[] s = xml.getStringArrayProperty("LayerNames");
413
                try {
414
                        for (int i = 0; i < numLayers; i++) {
415
                                FLayer layer = null;
416
        
417
                                String className = xml.getChild(i).getStringProperty("className");
418
        
419
                                if (className.equals(FLyrVect.class.getName())) {
420
                                        if (xml.getChild(i).contains("file")) {
421
        
422
                                                        layer = LayerFactory.createLayer(s[i],
423
                                                                        xml.getChild(i).getStringProperty("driverName"),
424
                                                                        new File(xml.getChild(i).getStringProperty("file")),
425
                                                                        this.getFMap().getViewPort().getProjection());
426
                                        } else if (true) {
427
                                                //TODO falta por implementar
428
                                        } else if (true) {
429
                                                //TODO falta por implementar
430
                                        }
431
        
432
                                        layer.setXMLEntity(xml.getChild(i));
433
                                } else if (className.equals(FLyrWMS.class.getName())) {
434
                                        try {
435
                                                layer = LayerFactory.createLayer(s[i],
436
                                                                StringUtilities.string2Rect(
437
                                                                        xml.getChild(i).getStringProperty("fullExtent")),
438
                                                                new URL(xml.getChild(i).getStringProperty("host")),
439
                                                                xml.getChild(i).getStringProperty("format"),
440
                                                                xml.getChild(i).getStringProperty("infoLayerQuery"),
441
                                                                xml.getChild(i).getStringProperty("layerQuery"),
442
                                                                xml.getChild(i).getStringProperty("srs"));
443
                                        } catch (MalformedURLException e) {
444
                                                throw new XMLException(e);
445
                                        }
446
                                } else if (className.equals((FLyrRaster.class.getName()))) {
447
                                        //if (xml.getChild(i).contains("file")) {
448
                                        layer = LayerFactory.createLayer(s[i],
449
                                                        xml.getChild(i).getStringProperty("driverName"),
450
                                                        new File(xml.getChild(i).getStringProperty("file")),
451
                                                        this.getFMap().getViewPort().getProjection());
452
        
453
                                        //} else if (true) {
454
                                        //TODO falta por implementar
455
                                        //} else if (true) {
456
                                        //TODO falta por implementar
457
                                        //}
458
                                        //TODO Falta por implementar
459
                                }
460
        
461
                                fmap.getLayers().addLayer(layer);
462
                        }
463
                } catch (DriverException e) {
464
                        throw new XMLException(e);
465
                }
466
                
467
        }
468

    
469
        /**
470
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor,
471
         *                 java.util.BitSet)
472
         */
473
        public void process(FeatureVisitor visitor, BitSet subset)
474
                throws DriverException, VisitException {
475
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
476
                        FLayer layer = (FLayer) iter.next();
477

    
478
                        if (layer instanceof VectorialData) {
479
                                ((VectorialData) layer).process(visitor, subset);
480
                        }
481
                }
482
        }
483

    
484
        /**
485
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
486
         */
487
        public void process(FeatureVisitor visitor)
488
                throws DriverException, VisitException {
489
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
490
                        FLayer layer = (FLayer) iter.next();
491

    
492
                        if (layer.isActive()) {
493
                                if (layer instanceof VectorialData) {
494
                                        ((VectorialData) layer).process(visitor);
495
                                }
496
                        }
497
                }
498
        }
499

    
500
        /**
501
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
502
         */
503
        public FMap getFMap() {
504
                return fmap;
505
        }
506

    
507
        /* (non-Javadoc)
508
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#setCoordTrans(org.cresques.cts.ICoordTrans)
509
         */
510
        public void setCoordTrans(ICoordTrans ct) {
511
                super.setCoordTrans(ct);
512

    
513
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
514
                        FLayer layer = (FLayer) iter.next();
515
                        layer.setCoordTrans(ct);
516
                }
517
        }
518

    
519
        /**
520
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllActives(boolean)
521
         */
522
        public void setAllActives(boolean active) {
523
                FLayer lyr;
524

    
525
                for (int i = 0; i < layers.size(); i++) {
526
                        lyr = ((FLayer) layers.get(i));
527
                        lyr.setActive(active);
528

    
529
                        if (lyr instanceof LayerCollection) {
530
                                ((LayerCollection) lyr).setAllActives(active);
531
                        }
532
                }
533
        }
534

    
535
        /**
536
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#getActives()
537
         */
538
        public FLayer[] getActives() {
539
                ArrayList ret = new ArrayList();
540

    
541
                for (int i = 0; i < layers.size(); i++) {
542
                        if (((FLayer) layers.get(i)).isActive()) {
543
                                ret.add(layers.get(i));
544
                        }
545
                }
546

    
547
                return (FLayer[]) ret.toArray(new FLayer[0]);
548
        }
549
}