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 214 fernando
package com.iver.cit.gvsig.fmap.layers;
2
3 651 fernando
import com.iver.cit.gvsig.fmap.DriverException;
4 694 fernando
import com.iver.cit.gvsig.fmap.FMap;
5 562 fernando
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 926 fernando
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
11 1005 vcaballero
12 894 vcaballero
import com.iver.utiles.StringUtilities;
13 562 fernando
import com.iver.utiles.XMLEntity;
14 541 vcaballero
15 1005 vcaballero
import org.cresques.cts.ICoordTrans;
16 562 fernando
17 1005 vcaballero
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 214 fernando
/**
32
 * Representa un nodo interno en el ?rbol de capas
33
 */
34 1005 vcaballero
public class FLayers extends FLyrDefault implements VectorialData,
35
        LayerCollection {
36 524 vcaballero
        //ArrayList de Listener registrados.
37
        private ArrayList layerListeners = new ArrayList();
38
        private ArrayList layers = new ArrayList(4);
39 694 fernando
        private FMap fmap;
40 1005 vcaballero
41 524 vcaballero
        /**
42
         * Crea un nuevo FLayers.
43 1005 vcaballero
         *
44
         * @param fmap
45
         * @param parent
46 524 vcaballero
         */
47 694 fernando
        public FLayers(FMap fmap, FLayers parent) {
48
                setParentLayer(parent);
49
                this.fmap = fmap;
50 524 vcaballero
        }
51 257 vcaballero
52 524 vcaballero
        /**
53
         * A?ade un listener de los eventos de la colecci?n de capas
54
         *
55 1005 vcaballero
         * @param listener
56 524 vcaballero
         */
57
        public void addLayerCollectionListener(LayerCollectionListener listener) {
58
                layerListeners.add(listener);
59
        }
60 1005 vcaballero
61
        /**
62
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllVisibles(boolean)
63
         */
64
        public void setAllVisibles(boolean visible) {
65 708 fernando
                FLayer lyr;
66 214 fernando
67 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
68
                        lyr = ((FLayer) layers.get(i));
69 708 fernando
                        lyr.setVisible(visible);
70 1005 vcaballero
71
                        if (lyr instanceof LayerCollection) {
72 708 fernando
                                ((LayerCollection) lyr).setAllVisibles(visible);
73
                        }
74 524 vcaballero
                }
75
        }
76 346 fernando
77 524 vcaballero
        /**
78 1005 vcaballero
         * Elimina un listener de los eventos de la colecci?n de capas
79 524 vcaballero
         *
80 1005 vcaballero
         * @param listener
81 524 vcaballero
         */
82
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
83
                layerListeners.remove(listener);
84
        }
85 214 fernando
86 524 vcaballero
        /**
87 1005 vcaballero
         * A?ade una capa.
88 524 vcaballero
         *
89 1005 vcaballero
         * @param layer
90 524 vcaballero
         */
91
        private void doAddLayer(FLayer layer) {
92
                layers.add(layer);
93 694 fernando
                layer.setParentLayer(this);
94 524 vcaballero
        }
95 270 vcaballero
96 524 vcaballero
        /**
97
         * A?ade una capa al final de la lista de subcapas
98
         *
99 1005 vcaballero
         * @param layer
100 524 vcaballero
         *
101
         * @throws CancelationException
102
         */
103
        public void addLayer(FLayer layer) throws CancelationException {
104
                LayerCollectionEvent event = new LayerCollectionEvent(layer);
105 214 fernando
106 524 vcaballero
                callLayerAdding(event);
107 404 fjp
108 524 vcaballero
                doAddLayer(layer);
109 404 fjp
110 524 vcaballero
                callLayerAdded(event);
111
        }
112 404 fjp
113 524 vcaballero
        /**
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 1005 vcaballero
         * @param from origen.
119
         * @param to destino.
120 524 vcaballero
         *
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 257 vcaballero
132 524 vcaballero
        /**
133 1005 vcaballero
         * Borra una capa del ArrayList que contiene a las capas.
134 524 vcaballero
         *
135 1005 vcaballero
         * @param lyr FLayer.
136 524 vcaballero
         */
137
        private void doRemoveLayer(FLayer lyr) {
138
                layers.remove(lyr);
139
        }
140 214 fernando
141 524 vcaballero
        /**
142 1005 vcaballero
         * Borra una capa de la colecci?n de capas.
143 524 vcaballero
         *
144 1005 vcaballero
         * @param lyr FLayer
145 524 vcaballero
         *
146 1005 vcaballero
         * @throws CancelationException
147 524 vcaballero
         */
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 214 fernando
155 524 vcaballero
        /**
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 257 vcaballero
164 524 vcaballero
        /**
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 214 fernando
172 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
173
                        lyr = ((FLayer) layers.get(i));
174 402 fjp
175 524 vcaballero
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
176
                                layers.remove(i);
177 214 fernando
178 524 vcaballero
                                break;
179
                        }
180
                }
181
        }
182 214 fernando
183 524 vcaballero
        /**
184
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
185
         * este nodo
186
         *
187 1005 vcaballero
         * @return Vector de FLayer.
188 524 vcaballero
         */
189
        public FLayer[] getVisibles() {
190
                ArrayList array = new ArrayList();
191 404 fjp
192 524 vcaballero
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
193
                        if (((FLayer) iter.next()).isVisible()) {
194
                                array.add((FLayer) iter.next());
195
                        }
196
                }
197 404 fjp
198 524 vcaballero
                return (FLayer[]) array.toArray(new FLayer[0]);
199
        }
200 404 fjp
201 524 vcaballero
        /**
202
         * Obtiene el hijo i-?simo directo de esta colecci?n
203
         *
204 1005 vcaballero
         * @param index ?ndice.
205 524 vcaballero
         *
206 1005 vcaballero
         * @return capa seleccionada.
207 524 vcaballero
         */
208
        public FLayer getLayer(int index) {
209
                return (FLayer) layers.get(index);
210
        }
211 242 vcaballero
212 524 vcaballero
        /**
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 1005 vcaballero
         * @param layerName nombre.
217 524 vcaballero
         *
218 1005 vcaballero
         * @return capa seleccionada.
219 524 vcaballero
         */
220
        public FLayer getLayer(String layerName) {
221
                FLayer lyr;
222 242 vcaballero
223 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
224
                        lyr = ((FLayer) layers.get(i));
225 242 vcaballero
226 524 vcaballero
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
227
                                return lyr;
228
                        }
229
                }
230 346 fernando
231 524 vcaballero
                return null;
232
        }
233 346 fernando
234 524 vcaballero
        /**
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 1005 vcaballero
         * @return n?mero de capas.
239 524 vcaballero
         */
240
        public int getLayersCount() {
241
                return layers.size();
242
        }
243 346 fernando
244 524 vcaballero
        /**
245 1056 vcaballero
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#draw(java.awt.image.BufferedImage,
246 524 vcaballero
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
247
         */
248
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
249 1005 vcaballero
                Cancellable cancel) throws DriverException {
250 524 vcaballero
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
251 533 vcaballero
                        FLayer lyr = (FLayer) iter.next();
252 541 vcaballero
253 524 vcaballero
                        if (lyr.isVisible()) {
254
                                lyr.draw(image, g, viewPort, cancel);
255
                        }
256
                }
257 1005 vcaballero
258
                if (getVirtualLayers() != null) {
259 745 fjp
                        getVirtualLayers().draw(image, g, viewPort, cancel);
260 1005 vcaballero
                }
261 524 vcaballero
        }
262
263
        /**
264 1005 vcaballero
         * @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 524 vcaballero
         */
268 1005 vcaballero
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel)
269
                throws DriverException {
270 650 vcaballero
                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 524 vcaballero
        }
278
279
        /**
280
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
281
         */
282 651 fernando
        public Rectangle2D getFullExtent() throws DriverException {
283 524 vcaballero
                Rectangle2D rAux = null;
284
                int i = 0;
285
286
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
287 533 vcaballero
                        FLayer capa = (FLayer) iter.next();
288 524 vcaballero
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 1005 vcaballero
301 524 vcaballero
        /**
302 1005 vcaballero
         * Llama al m?todo layerAdding de los listeners dados de alta.
303 524 vcaballero
         *
304 1005 vcaballero
         * @param event
305 524 vcaballero
         *
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 257 vcaballero
315 524 vcaballero
        /**
316 1005 vcaballero
         * Llama al m?todo layerRemoving de los listeners dados de alta.
317 524 vcaballero
         *
318 1005 vcaballero
         * @param event
319 524 vcaballero
         *
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 257 vcaballero
329 524 vcaballero
        /**
330 1005 vcaballero
         * Llama al m?todo layerMoving de los listeners dados de alta.
331 524 vcaballero
         *
332 1005 vcaballero
         * @param event
333 524 vcaballero
         *
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 353 fernando
343 524 vcaballero
        /**
344 1005 vcaballero
         * Llama al m?todo layerAdded de los listeners dados de alta.
345 524 vcaballero
         *
346 1005 vcaballero
         * @param event
347 524 vcaballero
         */
348
        private void callLayerAdded(LayerCollectionEvent event) {
349
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
350
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
351
                }
352
        }
353 353 fernando
354 524 vcaballero
        /**
355 1005 vcaballero
         * Llama al m?todo layerRemoved de los listeners dados de alta.
356 524 vcaballero
         *
357 1005 vcaballero
         * @param event
358 524 vcaballero
         */
359
        private void callLayerRemoved(LayerCollectionEvent event) {
360
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
361
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
362
                }
363
        }
364 353 fernando
365 435 vcaballero
        /**
366 1005 vcaballero
         * Llama al m?todo layerMoved de los listeners dados de alta.
367 524 vcaballero
         *
368 1005 vcaballero
         * @param event
369 524 vcaballero
         */
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 435 vcaballero
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
378
         */
379 651 fernando
        public XMLEntity getXMLEntity() {
380 524 vcaballero
                XMLEntity xml = super.getXMLEntity();
381
                xml.putProperty("numLayers", layers.size());
382 1005 vcaballero
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 558 vcaballero
                }
388 1005 vcaballero
389
                xml.putProperty("LayerNames", s);
390
391 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
392
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
393 435 vcaballero
                }
394 524 vcaballero
395 435 vcaballero
                return xml;
396
        }
397 341 fernando
398 435 vcaballero
        /**
399 1056 vcaballero
         * DOCUMENT ME!
400
         *
401
         * @param xml DOCUMENT ME!
402
         *
403
         * @throws XMLException
404
         *
405 435 vcaballero
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
406
         */
407 1056 vcaballero
        public void setXMLEntity(XMLEntity xml) throws XMLException {
408 442 vcaballero
                super.setXMLEntity(xml);
409 1005 vcaballero
410 894 vcaballero
                int numLayers = xml.getIntProperty("numLayers");
411 524 vcaballero
412 1005 vcaballero
                String[] s = xml.getStringArrayProperty("LayerNames");
413 1060 fjp
                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 1005 vcaballero
                                        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 1060 fjp
453
                                        //} else if (true) {
454 894 vcaballero
                                        //TODO falta por implementar
455 1060 fjp
                                        //} else if (true) {
456 894 vcaballero
                                        //TODO falta por implementar
457 1060 fjp
                                        //}
458
                                        //TODO Falta por implementar
459 894 vcaballero
                                }
460 1060 fjp
461
                                fmap.getLayers().addLayer(layer);
462 894 vcaballero
                        }
463 1060 fjp
                } catch (DriverException e) {
464
                        throw new XMLException(e);
465 435 vcaballero
                }
466 1060 fjp
467 435 vcaballero
        }
468 562 fernando
469
        /**
470 1005 vcaballero
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor,
471
         *                 java.util.BitSet)
472 562 fernando
         */
473 1005 vcaballero
        public void process(FeatureVisitor visitor, BitSet subset)
474
                throws DriverException, VisitException {
475 562 fernando
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
476
                        FLayer layer = (FLayer) iter.next();
477 1005 vcaballero
478 562 fernando
                        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 1005 vcaballero
        public void process(FeatureVisitor visitor)
488
                throws DriverException, VisitException {
489 562 fernando
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
490
                        FLayer layer = (FLayer) iter.next();
491 1005 vcaballero
492
                        if (layer.isActive()) {
493 661 fjp
                                if (layer instanceof VectorialData) {
494
                                        ((VectorialData) layer).process(visitor);
495
                                }
496 1005 vcaballero
                        }
497 562 fernando
                }
498
        }
499 694 fernando
500
        /**
501
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
502
         */
503
        public FMap getFMap() {
504
                return fmap;
505
        }
506 885 fjp
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 1005 vcaballero
513 885 fjp
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
514
                        FLayer layer = (FLayer) iter.next();
515
                        layer.setCoordTrans(ct);
516 1005 vcaballero
                }
517 885 fjp
        }
518 1005 vcaballero
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 214 fernando
}