Statistics
| Revision:

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

History | View | Annotate | Download (29.8 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 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
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.fmap.layers;
42

    
43
import java.awt.Graphics2D;
44
import java.awt.geom.Rectangle2D;
45
import java.awt.image.BufferedImage;
46
import java.io.File;
47
import java.util.ArrayList;
48
import java.util.Collections;
49
import java.util.ConcurrentModificationException;
50
import java.util.Iterator;
51
import java.util.List;
52

    
53
import org.cresques.cts.ICoordTrans;
54
import org.cresques.cts.IProjection;
55
import org.cresques.cts.ProjectionPool;
56
import org.cresques.cts.gt2.CoordSys;
57
import org.cresques.cts.gt2.CoordTrans;
58

    
59
import com.hardcode.driverManager.Driver;
60
import com.hardcode.driverManager.DriverLoadException;
61
import com.iver.cit.gvsig.fmap.DriverException;
62
import com.iver.cit.gvsig.fmap.FMap;
63
import com.iver.cit.gvsig.fmap.ViewPort;
64
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
65
import com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver;
66
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
67
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
68
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
69
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
70
import com.iver.cit.gvsig.fmap.operations.Cancellable;
71
import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor;
72
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
73
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
74
import com.iver.utiles.IPersistance;
75
import com.iver.utiles.XMLEntity;
76

    
77
/**
78
 * Representa un nodo interno en el ?rbol de capas
79
 */
80
public class FLayers extends FLyrDefault implements VectorialData,
81
        LayerCollection {
82
        //ArrayList de Listener registrados.
83
        private ArrayList layerListeners = new ArrayList();
84
        private List layers = Collections.synchronizedList(new ArrayList());
85
        private FMap fmap;
86

    
87
        /**
88
         * Crea un nuevo FLayers.
89
         *
90
         * @param fmap
91
         * @param parent
92
         */
93
        public FLayers(FMap fmap, FLayers parent) {
94
                setParentLayer(parent);
95
                this.fmap = fmap;
96
        }
97

    
98
        /**
99
         * A?ade un listener de los eventos de la colecci?n de capas
100
         *
101
         * @param listener
102
         */
103
        public void addLayerCollectionListener(LayerCollectionListener listener) {
104
                layerListeners.add(listener);
105
        }
106

    
107
        /**
108
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllVisibles(boolean)
109
         */
110
        public void setAllVisibles(boolean visible) {
111
                FLayer lyr;
112

    
113
                for (int i = 0; i < layers.size(); i++) {
114
                        lyr = ((FLayer) layers.get(i));
115
                        lyr.setVisible(visible);
116

    
117
                        if (lyr instanceof LayerCollection) {
118
                                ((LayerCollection) lyr).setAllVisibles(visible);
119
                        }
120
                }
121
        }
122

    
123
        /**
124
         * Elimina un listener de los eventos de la colecci?n de capas
125
         *
126
         * @param listener
127
         */
128
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
129
                layerListeners.remove(listener);
130
        }
131

    
132
        /**
133
         * A?ade una capa.
134
         *
135
         * @param layer
136
         */
137
        private void doAddLayer(FLayer layer) {
138
                layers.add(layer);
139
                layer.setParentLayer(this);
140
        }
141

    
142
        /**
143
         * A?ade una capa al final de la lista de subcapas
144
         *
145
         * @param layer
146
         *
147
         * @throws CancelationException
148
         */
149
        public void addLayer(FLayer layer) throws CancelationException {
150
                if (layer instanceof FLayers){
151
                        FLayers layers=(FLayers)layer;
152
                        fmap.addAsCollectionListener(layers);
153
                }
154
                callLayerAdding(LayerCollectionEvent.createLayerAddingEvent(layer));
155

    
156
                doAddLayer(layer);
157

    
158
                callLayerAdded(LayerCollectionEvent.createLayerAddedEvent(layer));
159
        }
160

    
161
        /**
162
         * Mueve una capa de la posici?n from a la posici?n to. (Se supone que
163
         * est?n dentro del mismo nivel). Para mover entre niveles, usar otro
164
         * m?todo (por hacer)
165
         *
166
         * @param from origen.
167
         * @param to destino.
168
         *
169
         * @throws CancelationException
170
         */
171
        public void moveTo(int from, int to) throws CancelationException {
172
                int newfrom=layers.size()-from-1;
173
                int newto=layers.size()-to-1;
174
                FLayer aux = (FLayer) layers.get(newfrom);
175
                callLayerMoving(LayerPositionEvent.createLayerMovingEvent(aux, newfrom, newto));
176
                layers.remove(newfrom);
177
                layers.add(newto, aux);
178
                callLayerMoved(LayerPositionEvent.createLayerMovedEvent(aux, newfrom, newto));
179
        }
180

    
181
        /**
182
         * Borra una capa del ArrayList que contiene a las capas.
183
         *
184
         * @param lyr FLayer.
185
         */
186
        private void doRemoveLayer(FLayer lyr) {
187
                        layers.remove(lyr);
188
        }
189

    
190
        /**
191
         * Borra una capa de la colecci?n de capas.
192
         *
193
         * @param lyr FLayer
194
         *
195
         * @throws CancelationException
196
         */
197
        public void removeLayer(FLayer lyr) throws CancelationException {
198
                callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr));
199
                doRemoveLayer(lyr);
200
                callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr));
201
        }
202

    
203
        /**
204
         * Borra una FLayer del vector a partir del identificador.
205
         *
206
         * @param idLayer
207
         */
208
        public void removeLayer(int idLayer) {
209
                FLayer lyr = (FLayer) layers.get(idLayer);
210
                callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr));
211
                layers.remove(idLayer);
212
                callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr));
213
        }
214

    
215
        /**
216
         * M?todo de conveniencia para borrar una capa con ese nombre
217
         *
218
         * @param layerName
219
         */
220
        public void removeLayer(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
                                removeLayer(i);
228

    
229
                                break;
230
                        }
231
                }
232
        }
233

    
234
        /**
235
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
236
         * este nodo
237
         *
238
         * @return Vector de FLayer.
239
         */
240
        public FLayer[] getVisibles() {
241
                ArrayList array = new ArrayList();
242

    
243
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
244
                        if (((FLayer) iter.next()).isVisible()) {
245
                                array.add((FLayer) iter.next());
246
                        }
247
                }
248

    
249
                return (FLayer[]) array.toArray(new FLayer[0]);
250
        }
251

    
252
        /**
253
         * Obtiene el hijo i-?simo directo de esta colecci?n
254
         *
255
         * @param index ?ndice.
256
         *
257
         * @return capa seleccionada.
258
         */
259
        public FLayer getLayer(int index) {
260
                return (FLayer) layers.get(index);
261
        }
262

    
263
        /**
264
         * M?todo de conveniencia para buscar una capa por su nombre Es conveniente
265
         * usar getLayer(int) siempre que se pueda, es m?s directo.
266
         *
267
         * @param layerName nombre.
268
         *
269
         * @return capa seleccionada.
270
         */
271
        public FLayer getLayer(String layerName) {
272
                FLayer lyr;
273
                FLayer lyr2;
274
                ArrayList layerList;                
275
                
276
                for (int i = 0; i < layers.size(); i++) {
277
                        lyr = ((FLayer) layers.get(i));
278

    
279
                        layerList = new ArrayList();
280
                        splitLayerGroup(lyr,layerList);
281
                        for(int j = 0; j<layerList.size(); j++ )
282
                        {
283
                                lyr2 = ((FLayer)layerList.get(j));
284
                                if (lyr2.getName().compareToIgnoreCase(layerName) == 0) {
285
                                        return lyr2;
286
                                }
287
                        }
288
                }
289

    
290
                return null;
291
        }
292
        
293
        // added by Laura
294
        // this is to to split up a layer group in order to get a layer by name
295
        // when there are layergroups.
296
        private void splitLayerGroup(FLayer layer, ArrayList result)
297
        {
298
                int i;
299
                FLayers layerGroup;
300
                if (layer instanceof FLayers)
301
                {
302
                        layerGroup = (FLayers)layer;
303
                        for (i=0; i < layerGroup.getLayersCount(); i++ )
304
                        {
305
                                splitLayerGroup(layerGroup.getLayer(i),result);
306
                        }
307
                }
308
                else
309
                {
310
                        result.add(layer);
311
                }
312
        }
313

    
314
        /**
315
         * Obtiene el n?mero de capas que hay en su mismo nivel Es decir, no cuenta
316
         * las subcapas de un FLayers
317
         *
318
         * @return n?mero de capas.
319
         */
320
        public int getLayersCount() {
321
                return layers.size();
322
        }
323

    
324
        /**
325
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#draw(java.awt.image.BufferedImage,
326
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
327
         */
328
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
329
                Cancellable cancel,double scale) throws DriverException {
330
            //double scale = getFMap().getScaleView();
331
                Iterator iter = layers.iterator();
332
        try
333
        {
334
                    while (iter.hasNext())
335
                    { 
336
                    // for (int i=0; i < layers.size(); i++) {
337
                            FLayer lyr = (FLayer) iter.next();
338
                            // FLayer lyr = (FLayer) layers.get(i);
339
                            if (lyr.isVisible()) {
340
                                                       
341
                                    long t1 = System.currentTimeMillis();
342
                                    // synchronized (this) {
343
                                            //Sincronizaci?n del m?todo dibujar de cada Layer, esto es posible hacerlo de otra forma, 
344
                                            //pero de momento se queda as?, para solucionar el refresco de una misma vista que est? a?adida en el Layout.
345
                                            lyr.draw(image, g, viewPort, cancel,scale);
346
                                            // }
347
                                            long t2 = System.currentTimeMillis();
348
                                            System.out.println("Layer " + lyr.getName() + " "
349
                                                    + (t2-t1) + " milisecs.");        
350
                            }
351
                    }
352
                    if (getVirtualLayers() != null) {
353
                            getVirtualLayers().draw(image, g, viewPort, cancel,scale);
354
                    }
355
        }
356
        catch (ConcurrentModificationException e)
357
        {
358
            System.err.println(e.getMessage());
359
        }
360
        }
361

    
362
        /**
363
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
364
         *                 com.iver.cit.gvsig.fmap.ViewPort,
365
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
366
         */
367
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,double scale)
368
                throws DriverException {
369
        
370
        // TODO: A la hora de imprimir, isWithinScale falla, porque est?
371
        // calculando la escala en pantalla, no para el layout.
372
        // Revisar esto.
373
        
374
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
375
                        FLayer lyr = (FLayer) iter.next();
376
                                        lyr.print(g, viewPort, cancel,scale);
377
                }
378
                 if (getVirtualLayers() != null) {
379
            getVirtualLayers().print( g, viewPort, cancel,scale);
380
        }  
381
        }
382

    
383
        /**
384
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
385
         */
386
        public Rectangle2D getFullExtent() throws DriverException {
387
                Rectangle2D rAux = null;
388
                int i = 0;
389

    
390
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
391
                        FLayer capa = (FLayer) iter.next();
392

    
393
                        if (i == 0) {
394
                                rAux = capa.getFullExtent();
395
                        } else {
396
                                rAux.add(capa.getFullExtent());
397
                        }
398

    
399
                        i++;
400
                }
401

    
402
                return rAux;
403
        }
404

    
405
        /**
406
         * Llama al m?todo layerAdding de los listeners dados de alta.
407
         *
408
         * @param event
409
         *
410
         * @throws CancelationException
411
         */
412
        private void callLayerAdding(LayerCollectionEvent event)
413
                throws CancelationException {
414
            ArrayList aux = (ArrayList) layerListeners.clone();
415
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
416
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
417
                }
418
        }
419

    
420
        /**
421
         * Llama al m?todo layerRemoving de los listeners dados de alta.
422
         *
423
         * @param event
424
         *
425
         * @throws CancelationException
426
         */
427
        private void callLayerRemoving(LayerCollectionEvent event)
428
                throws CancelationException {
429
            ArrayList aux = (ArrayList) layerListeners.clone();
430
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
431
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
432
                }
433
        }
434

    
435
        /**
436
         * Llama al m?todo layerMoving de los listeners dados de alta.
437
         *
438
         * @param event
439
         *
440
         * @throws CancelationException
441
         */
442
        private void callLayerMoving(LayerPositionEvent event)
443
                throws CancelationException {
444
            ArrayList aux = (ArrayList) layerListeners.clone();
445
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
446
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
447
                }
448
        }
449

    
450
        /**
451
         * Llama al m?todo layerAdded de los listeners dados de alta.
452
         *
453
         * @param event
454
         */
455
        private void callLayerAdded(LayerCollectionEvent event) {
456
            ArrayList aux = (ArrayList) layerListeners.clone();
457
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
458
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
459
                }
460
        }
461

    
462
        /**
463
         * Llama al m?todo layerRemoved de los listeners dados de alta.
464
         *
465
         * @param event
466
         */
467
        private void callLayerRemoved(LayerCollectionEvent event) {
468
            ArrayList aux = (ArrayList) layerListeners.clone();
469
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
470
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
471
                }
472
        }
473

    
474
        /**
475
         * Llama al m?todo layerMoved de los listeners dados de alta.
476
         *
477
         * @param event
478
         */
479
        private void callLayerMoved(LayerPositionEvent event) {
480
            ArrayList aux = (ArrayList) layerListeners.clone();
481
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
482
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
483
                }
484
        }
485

    
486
        /**
487
         * @throws XMLException
488
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
489
         */
490
        public XMLEntity getXMLEntity() throws XMLException {
491
                XMLEntity xml = super.getXMLEntity();
492
                xml.putProperty("numLayers", layers.size());
493

    
494
                String[] s = new String[layers.size()];
495

    
496
                for (int i = 0; i < layers.size(); i++) {
497
                        s[i] = ((FLayer) layers.get(i)).getName();
498
                }
499

    
500
                xml.putProperty("LayerNames", s);
501

    
502
                for (int i = 0; i < layers.size(); i++) {
503
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
504
                }
505

    
506
                return xml;
507
        }
508

    
509
        /**
510
         * DOCUMENT ME!
511
         *
512
         * @param xml DOCUMENT ME!
513
         *
514
         * @throws XMLException
515
         *
516
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
517
         */
518
        public void setXMLEntity03(XMLEntity xml) throws XMLException {
519
                super.setXMLEntity03(xml);
520

    
521
                int numLayers = xml.getIntProperty("numLayers");
522

    
523
                String[] s = xml.getStringArrayProperty("LayerNames");
524
                try {
525
                        for (int i = 0; i < numLayers; i++) {
526
                                FLayer layer = null;
527
        
528
                                String className = xml.getChild(i).getStringProperty("className");
529
        
530
                                if (className.equals(FLyrVect.class.getName())) {
531
                                        if (xml.getChild(i).contains("file")) {
532
        
533
                                                        layer = LayerFactory.createLayer(s[i],
534
                                                                        (VectorialFileDriver)LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName")),
535
                                                                        new File(xml.getChild(i).getStringProperty("file")),
536
                                                                        this.getFMap().getViewPort().getProjection());
537
                                                                                                                    
538
                                        } else if (true) {
539
                                                //TODO falta por implementar
540
                                        } else if (true) {
541
                                                //TODO falta por implementar
542
                                        }
543
        
544
                                        layer.setXMLEntity03(xml.getChild(i));
545
                                        // Comprobar que la proyecci?n es la misma que la de FMap
546
                                        // Si no lo es, es una capa que est? reproyectada al vuelo 
547
                                        IProjection proj = layer.getProjection();
548
                                        if (proj != null)
549
                                            if (proj != fmap.getProjection())
550
                                            {
551
                                                        ICoordTrans ct = new CoordTrans((CoordSys) proj,
552
                                                                        (CoordSys) fmap.getProjection());
553
                                                        layer.setCoordTrans(ct);
554
                                                        System.err.println("coordTrans = " +
555
                                                                proj.getAbrev() + " " +
556
                                                                fmap.getProjection().getAbrev());
557
                                            }
558
                                        
559
//                                } else if (className.equals(FLyrWMS.class.getName())) {
560
//                                        try {
561
//                                                layer = LayerFactory.createLayer(s[i],
562
//                                                                StringUtilities.string2Rect(
563
//                                                                        xml.getChild(i).getStringProperty("fullExtent")),
564
//                                                                new URL(xml.getChild(i).getStringProperty("host")),
565
//                                                                xml.getChild(i).getStringProperty("format"),
566
//                                                                xml.getChild(i).getStringProperty("layerQuery"),
567
//                                                                xml.getChild(i).getStringProperty("infoLayerQuery"),
568
//                                                                xml.getChild(i).getStringProperty("srs"));
569
//                                        } catch (MalformedURLException e) {
570
//                                                throw new XMLException(e);
571
//                                        }
572
                                } else if (className.equals((FLyrRaster.class.getName()))) {
573
                                        //if (xml.getChild(i).contains("file")) {
574
                                        /*layer = LayerFactory.createLayer(s[i],
575
                                                        xml.getChild(i).getStringProperty("driverName"),
576
                                                        new File(xml.getChild(i).getStringProperty("file")),
577
                                                        this.getFMap().getViewPort().getProjection());*/
578
                                        layer = new FLyrRaster();
579
                                        layer.setName(s[i]);
580
                                        if (!xml.getChild(i).contains("proj"))
581
                                                ((FLyrRaster)layer).setProjection(this.getFMap().getViewPort().getProjection());
582
                                        layer.setXMLEntity03(xml.getChild(i));
583
                                        try {
584
                                                layer.load();
585
                                        } catch (DriverIOException e) {
586
                                                throw new XMLException(e);
587
                                        }
588
        
589
                                }else if (className.equals((FLayers.class.getName()))) {
590
                                        layer = new FLayers(getFMap(),this);
591
                                        layer.setXMLEntity(xml.getChild(i));
592
                                } else {
593
                                        // Capas Nuevas (externas)
594
                                        try {
595
                                                Class clase = Class.forName(className);
596
                                                layer = (FLayer) clase.newInstance();
597
                                                layer.setName(s[i]);
598
                                                layer.setXMLEntity03(xml.getChild(i));
599
                                                try {
600
                                                        layer.load();
601
                                                } catch (DriverIOException e) {
602
                                                        throw new XMLException(e);
603
                                                }
604
                                        } catch (Exception e) {
605
                                                //e.printStackTrace();
606
                                                throw new XMLException(e);
607
                                        }
608
                                }
609
        
610
                                this.addLayer(layer);
611
                        }
612
                } catch (DriverException e) {
613
                        throw new XMLException(e);
614
                } catch (DriverLoadException e) {
615
            throw new XMLException(e);
616
        }
617
                
618
        }
619

    
620
        /**
621
         * DOCUMENT ME!
622
         *
623
         * @param xml DOCUMENT ME!
624
         *
625
         * @throws XMLException
626
         *
627
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
628
         */
629
        public void setXMLEntity(XMLEntity xml) throws XMLException {
630
                super.setXMLEntity(xml);
631

    
632
                int numLayers = xml.getIntProperty("numLayers");
633

    
634
                String[] s = xml.getStringArrayProperty("LayerNames");
635
                // try {
636
                        for (int i = 0; i < numLayers; i++) {
637
                try {
638
                                FLayer layer = null;
639
        
640
                                String className = xml.getChild(i).getStringProperty("className");
641
        
642
                                if (className.equals(FLyrVect.class.getName())) {
643
                                        String type = xml.getChild(i).getStringProperty("type");
644
                                        if ("vectorial".equals(type)){
645
                                                //String recordsetName = xml.getChild(i).getStringProperty("recordset-name");
646
                        IProjection proj = null;
647
                        if (xml.getChild(i).contains("proj")) {
648
                            proj = ProjectionPool.get(xml.getChild(i).getStringProperty("proj"));                            
649
                        }
650
                        else
651
                        {
652
                            proj = this.getFMap().getViewPort().getProjection();
653
                        }
654
                                                if (xml.getChild(i).contains("file")) {
655
                                                        Driver d;
656
                                                        try {
657
                                                                d = LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName"));
658
                                                        } catch (DriverLoadException e1) {
659
                                                                throw new XMLException(e1);
660
                                                        }
661
                                                        layer = LayerFactory.createLayer(s[i], (VectorialFileDriver) d,
662
                                                                                                                        new File(xml.getChild(i).getStringProperty("file")),
663
                                                                                                                        proj);
664
                                                                                                                                                                    
665
                                                }
666
                        if (xml.getChild(i).contains("db")) {
667
                            
668
                            String driverName = xml.getChild(i).getStringProperty("db");
669
                            VectorialDatabaseDriver driver;
670
                            try {
671
                                driver = (VectorialDatabaseDriver) LayerFactory.getDM().getDriver(driverName);
672
                                driver.setXMLEntity(xml.getChild(i).getChild(2));                            
673
                                layer = LayerFactory.createDBLayer(driver, s[i], proj);
674
                            } catch (DriverLoadException e) {
675
                                e.printStackTrace();
676
                                throw new XMLException(e);
677
                            }                                                                                                                 
678
                        }
679
                        // Clases con algun driver gen?rico creado por otro
680
                        // programador
681
                        if (xml.getChild(i).contains("other")) {
682
                            
683
                            String driverName = xml.getChild(i).getStringProperty("other");
684
                            VectorialDriver driver = null;
685
                            try {                                
686
                                driver = (VectorialDriver) LayerFactory.getDM().getDriver(driverName);
687
                            } catch (DriverLoadException e) {
688
                                // Si no existe ese driver, no pasa nada.
689
                                // Puede que el desarrollador no quiera que
690
                                // aparezca en el cuadro de di?logo y ha metido
691
                                // el jar con sus clases en nuestro directorio lib.
692
                                // Intentamos cargar esa clase "a pelo".
693
                                if (xml.getChild(i).contains("className"))
694
                                {
695
                                    String className2 = xml.getChild(i).getStringProperty("className");
696
                                    try {
697
                                        driver = (VectorialDriver) Class.forName(className2).newInstance();
698
                                    } catch (Exception e1) {
699
                                        throw new XMLException(e1);
700
                                    }
701
                                }
702
                            } catch (NullPointerException npe) {
703
                                // Si no existe ese driver, no pasa nada.
704
                                // Puede que el desarrollador no quiera que
705
                                // aparezca en el cuadro de di?logo y ha metido
706
                                // el jar con sus clases en nuestro directorio lib.
707
                                // Intentamos cargar esa clase "a pelo".
708
                                if (xml.getChild(i).getChild(2).contains("className"))
709
                                {
710
                                    String className2 = xml.getChild(i).getChild(2).getStringProperty("className");
711
                                    try {
712
                                        driver = (VectorialDriver) Class.forName(className2).newInstance();
713
                                    } catch (Exception e1) {
714
                                        throw new XMLException(e1);
715
                                    }
716
                                }
717
                            }
718
                            if (driver instanceof IPersistance)
719
                            {
720
                                IPersistance persist = (IPersistance) driver;
721
                                persist.setXMLEntity(xml.getChild(i).getChild(2));
722
                            }
723
                            layer = LayerFactory.createLayer(s[i], driver, proj);
724
                        }                       
725
                        
726
                        
727
                                        } else if ("raster".equals(type)) {
728
/*                                                if (xml.getChild(i).contains("file")) {
729
                                                        Driver d = LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName"));
730
                                                                                                        layer = LayerFactory.createLayer(s[i],
731
                                                                                                                        ,
732
                                                                                                                        new File(xml.getChild(i).getStringProperty("file")),
733
                                                                                                                        this.getFMap().getViewPort().getProjection());
734
                                                                                                                                                                    
735
                                                }                                                
736
*/                                        }
737
        
738
                                        layer.setXMLEntity(xml.getChild(i));
739

    
740
                                        
741
//                                } else if (className.equals(FLyrWMS.class.getName())) {
742
//                                        try {
743
//                                                layer = LayerFactory.createLayer(s[i],
744
//                                                                StringUtilities.string2Rect(
745
//                                                                        xml.getChild(i).getStringProperty("fullExtent")),
746
//                                                                new URL(xml.getChild(i).getStringProperty("host")),
747
//                                                                xml.getChild(i).getStringProperty("format"),
748
//                                                                xml.getChild(i).getStringProperty("layerQuery"),
749
//                                                                xml.getChild(i).getStringProperty("infoLayerQuery"),
750
//                                                                xml.getChild(i).getStringProperty("srs"));
751
//                                                layer.setXMLEntity(xml.getChild(i));
752
//                                        } catch (MalformedURLException e) {
753
//                                                throw new XMLException(e);
754
//                                        }
755
                                } else if (className.equals((FLyrRaster.class.getName()))) {
756
                                        //if (xml.getChild(i).contains("file")) {
757
                                        /*layer = LayerFactory.createLayer(s[i],
758
                                                        xml.getChild(i).getStringProperty("driverName"),
759
                                                        new File(xml.getChild(i).getStringProperty("file")),
760
                                                        this.getFMap().getViewPort().getProjection());*/
761
                                        layer = new FLyrRaster();
762
                                        layer.setName(s[i]);
763
                                        if (!xml.getChild(i).contains("proj"))
764
                                                ((FLyrRaster)layer).setProjection(this.getFMap().getViewPort().getProjection());
765
                                        layer.setXMLEntity(xml.getChild(i));
766
                                        try {
767
                                                layer.load();
768
                                        } catch (DriverIOException e) {
769
                                                throw new XMLException(e);
770
                                        }
771
        
772
                                }else if (className.equals((FLayers.class.getName()))) {
773
                                        layer = new FLayers(getFMap(),this);
774
                                        layer.setXMLEntity(xml.getChild(i));
775
                                } else {
776
                                        // Capas Nuevas (externas)
777
                                        try {
778
                                                Class clase = Class.forName(className);
779
                                                layer = (FLayer) clase.newInstance();
780
                                                layer.setName(s[i]);
781
                                                layer.setXMLEntity(xml.getChild(i));
782
                                                try {
783
                                                        layer.load();
784
                                                } catch (DriverIOException e) {
785
                                                        throw new XMLException(e);
786
                                                }
787
                                        } catch (Exception e) {
788
                                                //e.printStackTrace();
789
                                                throw new XMLException(e);
790
                                        }
791
                                }
792
        
793
                                this.addLayer(layer);
794
                // Comprobar que la proyecci?n es la misma que la de FMap
795
                // Si no lo es, es una capa que est? reproyectada al vuelo
796
                IProjection proj = layer.getProjection();
797
                if ((proj != null))
798
                    if (proj != getFMap().getProjection())
799
                    {
800
                        ICoordTrans ct = new CoordTrans((CoordSys) proj,
801
                                (CoordSys) getFMap().getProjection());
802
                        // TODO: REVISAR CON LUIS
803
                        // Se lo fijamos a todas, luego cada una que se reproyecte
804
                        // si puede, o que no haga nada
805
                        layer.setCoordTrans(ct);
806
                        // NOTA: DESPU?S DE ESTO DEBER?AMOS CREAR LAS ETIQUETAS
807
                        // SI ES NECESARIO.
808
                        // TODO: REVISAR A FONDO ESTO, PORQUE LAS ETIQUETAS SE CREAN
809
                        // 2 VECES SI HAY REPROYECC?N
810
                        if (layer instanceof FLyrVect)
811
                        {
812
                            FLyrVect lyrVect = (FLyrVect)layer;
813
                            VectorialLegend legend = (VectorialLegend) lyrVect.getLegend();  
814
                            if (legend.getLabelField() != null) {
815
                                lyrVect.createLabelLayer(lyrVect.getRecordset());
816
                            }
817

    
818
                        }
819
                    }        
820
                }catch (Exception e) {
821
                    System.err.println("No se ha podido cargar la capa : "+xml.getChild(i).getStringProperty("name"));
822
                    e.printStackTrace();
823
                }    
824
                        }
825
                /* } catch (DriverException e) {
826
                        throw new XMLException(e);
827
                } */
828
                
829
        }
830

    
831
        /**
832
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor,
833
         *                 FBitSet)
834
         */
835
        public void process(FeatureVisitor visitor, FBitSet subset)
836
                throws DriverException, VisitException {
837
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
838
                        FLayer layer = (FLayer) iter.next();
839

    
840
                        if (layer instanceof VectorialData) {
841
                                ((VectorialData) layer).process(visitor, subset);
842
                        }
843
                }
844
        }
845

    
846
        /**
847
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
848
         */
849
        public void process(FeatureVisitor visitor)
850
                throws DriverException, VisitException {
851
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
852
                        FLayer layer = (FLayer) iter.next();
853

    
854
                        if (layer.isActive()) {
855
                                if (layer instanceof VectorialData) {
856
                                        ((VectorialData) layer).process(visitor);
857
                                }
858
                        }
859
                }
860
        }
861

    
862
        /**
863
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
864
         */
865
        public FMap getFMap() {
866
                return fmap;
867
        }
868

    
869
        /* (non-Javadoc)
870
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#setCoordTrans(org.cresques.cts.ICoordTrans)
871
         */
872
        public void setCoordTrans(ICoordTrans ct) {
873
                super.setCoordTrans(ct);
874

    
875
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
876
                        FLayer layer = (FLayer) iter.next();
877
                        layer.setCoordTrans(ct);
878
                }
879
        }
880

    
881
        /**
882
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllActives(boolean)
883
         */
884
        public void setAllActives(boolean active) {
885
                FLayer lyr;
886

    
887
                for (int i = 0; i < layers.size(); i++) {
888
                        lyr = ((FLayer) layers.get(i));
889
                        lyr.setActive(active);
890

    
891
                        if (lyr instanceof LayerCollection) {
892
                                ((LayerCollection) lyr).setAllActives(active);
893
                        }
894
                }
895
        }
896

    
897
        /**
898
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#getActives()
899
         */
900
        public FLayer[] getActives() {
901
                ArrayList ret = new ArrayList();
902

    
903
                for (int i = 0; i < layers.size(); i++) {
904
                        if (((FLayer) layers.get(i)).isActive()) {
905
                                ret.add(layers.get(i));
906
                        }else{
907
                                if (layers.get(i) instanceof FLayers){
908
                                        FLayer[] lyrs=((FLayers) layers.get(i)).getActives();
909
                                        for (int j=0;j<lyrs.length;j++){
910
                                                ret.add(lyrs[j]);
911
                                        }
912
                                }
913
                        }
914
                }
915

    
916
                return (FLayer[]) ret.toArray(new FLayer[0]);
917
        }
918

    
919
    /* (non-Javadoc)
920
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMinScale()
921
     */
922
    public double getMinScale() {
923
        return -1; // La visibilidad o no la controla cada capa
924
                // dentro de una colecci?n
925
    }
926

    
927
    /* (non-Javadoc)
928
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMaxScale()
929
     */
930
    public double getMaxScale() {
931
        return -1;
932
    }
933
    public void setMinScale(double minScale)
934
    {
935
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
936
                        FLayer lyr = (FLayer) iter.next();
937
                        lyr.setMinScale(minScale);
938
                }
939
    }
940
    public void setMaxScale(double maxScale)
941
    {
942
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
943
                        FLayer lyr = (FLayer) iter.next();
944
                        lyr.setMinScale(maxScale);
945
                }
946
    }
947
    public void setActive(boolean b){
948
            super.setActive(b);
949
            for (int i=0;i<layers.size();i++){
950
                    ((FLayer)layers.get(i)).setActive(b);
951
            }
952
    }
953
    
954
}