Statistics
| Revision:

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

History | View | Annotate | Download (33.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.Point;
45
import java.awt.geom.Rectangle2D;
46
import java.awt.image.BufferedImage;
47
import java.io.File;
48
import java.util.ArrayList;
49
import java.util.Collections;
50
import java.util.ConcurrentModificationException;
51
import java.util.Iterator;
52
import java.util.List;
53

    
54
import org.apache.log4j.Logger;
55
import org.cresques.cts.ICoordTrans;
56
import org.cresques.cts.IProjection;
57
import org.cresques.cts.ProjectionPool;
58
import org.cresques.cts.gt2.CoordSys;
59
import org.cresques.cts.gt2.CoordTrans;
60

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

    
81
/**
82
 * Representa un nodo interno en el ?rbol de capas
83
 */
84
public class FLayers extends FLyrDefault implements VectorialData, LayerCollection, InfoByPoint
85
{
86
        //ArrayList de Listener registrados.
87
        private ArrayList layerCollectionListeners = new ArrayList();
88

    
89

    
90
        private List layers = Collections.synchronizedList(new ArrayList());
91
        private FMap fmap;
92
        private static Logger logger = Logger.getLogger(FLayers.class.getName());
93
        /**
94
         * Crea un nuevo FLayers.
95
         *
96
         * @param fmap
97
         * @param parent
98
         */
99
        public FLayers(FMap fmap, FLayers parent) {
100
                setParentLayer(parent);
101
                this.fmap = fmap;
102
        }
103

    
104
        /**
105
         * A?ade un listener de los eventos de la colecci?n de capas
106
         *
107
         * @param listener
108
         */
109
        public void addLayerCollectionListener(LayerCollectionListener listener) {
110
                layerCollectionListeners.add(listener);
111
        }
112

    
113

    
114
        /**
115
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllVisibles(boolean)
116
         */
117
        public void setAllVisibles(boolean visible) {
118
                FLayer lyr;
119

    
120
                for (int i = 0; i < layers.size(); i++) {
121
                        lyr = ((FLayer) layers.get(i));
122
                        lyr.setVisible(visible);
123

    
124
                        if (lyr instanceof LayerCollection) {
125
                                ((LayerCollection) lyr).setAllVisibles(visible);
126
                        }
127
                }
128
        }
129

    
130
        /**
131
         * Elimina un listener de los eventos de la colecci?n de capas
132
         *
133
         * @param listener
134
         */
135
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
136
                layerCollectionListeners.remove(listener);
137
        }
138

    
139
        /**
140
         * A?ade una capa.
141
         *
142
         * @param layer
143
         */
144
        private void doAddLayer(FLayer layer) {
145
                layers.add(layer);
146
                layer.setParentLayer(this);
147
        }
148

    
149
        /**
150
         * A?ade una capa al final de la lista de subcapas
151
         *
152
         * @param layer
153
         *
154
         * @throws CancelationException
155
         */
156
        public void addLayer(FLayer layer) throws CancelationException {
157
                //Notificamos a la capa que va a ser a?adida
158
                if (layer instanceof FLyrDefault)
159
                        ((FLyrDefault)layer).wakeUp();
160
                
161
                if (layer instanceof FLayers){
162
                        FLayers layers=(FLayers)layer;
163
                        fmap.addAsCollectionListener(layers);
164
                }
165
                callLayerAdding(LayerCollectionEvent.createLayerAddingEvent(layer));
166

    
167
                doAddLayer(layer);
168

    
169
                callLayerAdded(LayerCollectionEvent.createLayerAddedEvent(layer));
170
        }
171

    
172
        /**
173
         * Mueve una capa de la posici?n from a la posici?n to. (Se supone que
174
         * est?n dentro del mismo nivel). Para mover entre niveles, usar otro
175
         * m?todo (por hacer)
176
         *
177
         * @param from origen.
178
         * @param to destino.
179
         *
180
         * @throws CancelationException
181
         */
182
        public void moveTo(int from, int to) throws CancelationException {
183
                int newfrom=layers.size()-from-1;
184
                int newto=layers.size()-to-1;
185
                FLayer aux = (FLayer) layers.get(newfrom);
186
                callLayerMoving(LayerPositionEvent.createLayerMovingEvent(aux, newfrom, newto));
187
                layers.remove(newfrom);
188
                layers.add(newto, aux);
189
                callLayerMoved(LayerPositionEvent.createLayerMovedEvent(aux, newfrom, newto));
190
        }
191

    
192
        /**
193
         * Borra una capa del ArrayList que contiene a las capas.
194
         *
195
         * @param lyr FLayer.
196
         */
197
        private void doRemoveLayer(FLayer lyr) {
198
                        layers.remove(lyr);
199
        }
200

    
201
        /**
202
         * Borra una capa de la colecci?n de capas.
203
         *
204
         * @param lyr FLayer
205
         *
206
         * @throws CancelationException
207
         */
208
        public void removeLayer(FLayer lyr) throws CancelationException {
209
                callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr));
210
                doRemoveLayer(lyr);
211
                callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr));
212
        }
213

    
214
        /**
215
         * Borra una FLayer del vector a partir del identificador.
216
         *
217
         * @param idLayer
218
         */
219
        public void removeLayer(int idLayer) {
220
                FLayer lyr = (FLayer) layers.get(idLayer);
221
                callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr));
222
                layers.remove(idLayer);
223
                callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr));
224
        }
225

    
226
        /**
227
         * M?todo de conveniencia para borrar una capa con ese nombre
228
         *
229
         * @param layerName
230
         */
231
        public void removeLayer(String layerName) {
232
                FLayer lyr;
233

    
234
                for (int i = 0; i < layers.size(); i++) {
235
                        lyr = ((FLayer) layers.get(i));
236

    
237
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
238
                                removeLayer(i);
239

    
240
                                break;
241
                        }
242
                }
243
        }
244

    
245
        /**
246
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
247
         * este nodo
248
         *
249
         * @return Vector de FLayer.
250
         */
251
        public FLayer[] getVisibles() {
252
                ArrayList array = new ArrayList();
253

    
254
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
255
                        if (((FLayer) iter.next()).isVisible()) {
256
                                array.add((FLayer) iter.next());
257
                        }
258
                }
259

    
260
                return (FLayer[]) array.toArray(new FLayer[0]);
261
        }
262

    
263
        /**
264
         * Obtiene el hijo i-?simo (de abajo a arriba) directo de esta colecci?n. 
265
         *
266
         * @param index ?ndice.
267
         *
268
         * @return capa seleccionada.
269
         */
270
        public FLayer getLayer(int index) {
271
                return (FLayer) layers.get(index);
272
        }
273

    
274
        /**
275
         * M?todo de conveniencia para buscar una capa por su nombre Es conveniente
276
         * usar getLayer(int) siempre que se pueda, es m?s directo.
277
         *
278
         * @param layerName nombre.
279
         *
280
         * @return capa seleccionada.
281
         */
282
        public FLayer getLayer(String layerName) {
283
                FLayer lyr;
284
                FLayer lyr2;
285
                ArrayList layerList;
286

    
287
                for (int i = 0; i < layers.size(); i++) {
288
                        lyr = ((FLayer) layers.get(i));
289

    
290
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
291
                                        return lyr;
292
                        }
293

    
294
                        layerList = new ArrayList();
295
                        splitLayerGroup(lyr,layerList);
296
                        for(int j = 0; j<layerList.size(); j++ )
297
                        {
298
                                lyr2 = ((FLayer)layerList.get(j));
299
                                if (lyr2.getName().compareToIgnoreCase(layerName) == 0) {
300
                                        return lyr2;
301
                                }
302
                        }
303
                }
304

    
305
                return null;
306
        }
307

    
308
        // added by Laura
309
        // this is to to split up a layer group in order to get a layer by name
310
        // when there are layergroups.
311
        private void splitLayerGroup(FLayer layer, ArrayList result)
312
        {
313
                int i;
314
                FLayers layerGroup;
315
                if (layer instanceof FLayers)
316
                {
317
                        layerGroup = (FLayers)layer;
318
                        for (i=0; i < layerGroup.getLayersCount(); i++ )
319
                        {
320
                                splitLayerGroup(layerGroup.getLayer(i),result);
321
                        }
322
                }
323
                else
324
                {
325
                        result.add(layer);
326
                }
327
        }
328

    
329
        /**
330
         * Obtiene el n?mero de capas que hay en su mismo nivel Es decir, no cuenta
331
         * las subcapas de un FLayers
332
         *
333
         * @return n?mero de capas.
334
         */
335
        public int getLayersCount() {
336
                return layers.size();
337
        }
338

    
339
        /**
340
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#draw(java.awt.image.BufferedImage,
341
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
342
         */
343
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
344
                Cancellable cancel,double scale) throws DriverException {
345
            //double scale = getFMap().getScaleView();
346
                Iterator iter = layers.iterator();
347
        try
348
        {
349
                    while (iter.hasNext())
350
                    {
351
                    // for (int i=0; i < layers.size(); i++) {
352
                if (cancel.isCanceled())
353
                    break; // M?s que nada porque las capas raster no son interrumpibles por ahora.
354
                            FLayer lyr = (FLayer) iter.next();
355
                            // FLayer lyr = (FLayer) layers.get(i);
356
                    /*        if (lyr instanceof FLyrVect && ((FLyrVect)lyr).isBroken()){
357
                                    continue;
358
                            }
359
                    */
360
                            LayerDrawEvent beforeEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_BEFORE_DRAW);
361
                            fmap.fireLayerDrawingEvent(beforeEvent);
362
                            if (lyr.isVisible()) {
363

    
364
                                    long t1 = System.currentTimeMillis();
365
                                    // synchronized (this) {
366
                                            //Sincronizaci?n del m?todo dibujar de cada Layer, esto es posible hacerlo de otra forma,
367
                                            //pero de momento se queda as?, para solucionar el refresco de una misma vista que est? a?adida en el Layout.
368
                                    try{
369
                                            /* if (lyr instanceof IComposedDrawing)
370
                                            {
371
                                                    // Acumulamos las peticiones hasta que sea
372
                                                    // otro servidor o otro tipo de capa o la ?ltima
373
                                                    // Si hay que dibujar:
374
                                                    lyr.draw(image, g, viewPort, cancel,scale);
375
                                                    // Si hay que acumlar:
376
                                                    lyr.acumulateDrawing(antLayer);
377

378
                                            }
379
                                            else */
380

    
381
                                            lyr.draw(image, g, viewPort, cancel,scale);
382
                                    } catch (DriverException e){
383
                                            // fmap.callNewErrorEvent(new ErrorEvent(lyr.getName(), e));
384
                                            fmap.addLayerError("El tema " + lyr.getName() + " es err?neo.");
385
                                            e.printStackTrace();
386
                                            // this.removeLayer(lyr);
387
                                    }
388
                                            // }
389
                                            long t2 = System.currentTimeMillis();
390
                                            System.out.println("Layer " + lyr.getName() + " "
391
                                                    + (t2-t1) + " milisecs.");
392
                            }
393
                            LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
394
                            fmap.fireLayerDrawingEvent(afterEvent);
395

    
396
                    }
397
                    if (getVirtualLayers() != null) {
398
                            getVirtualLayers().draw(image, g, viewPort, cancel,scale);
399
                    }
400
        }
401
        catch (ConcurrentModificationException e)
402
        {
403
            System.err.println(e.getMessage());
404
        }
405
        }
406

    
407
        /**
408
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
409
         *                 com.iver.cit.gvsig.fmap.ViewPort,
410
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
411
         */
412
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,double scale)
413
                throws DriverException {
414

    
415
        // TODO: A la hora de imprimir, isWithinScale falla, porque est?
416
        // calculando la escala en pantalla, no para el layout.
417
        // Revisar esto.
418

    
419
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
420
                        FLayer lyr = (FLayer) iter.next();
421
                        lyr.print(g, viewPort, cancel,scale);
422

    
423
                }
424
                 if (getVirtualLayers() != null) {
425
            getVirtualLayers().print( g, viewPort, cancel,scale);
426
        }
427
        }
428

    
429
        /**
430
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
431
         */
432
        public Rectangle2D getFullExtent() throws DriverException {
433
                Rectangle2D rAux = null;
434
                boolean first = true;
435

    
436

    
437
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
438
                        FLayer capa = (FLayer) iter.next();
439
                        try{
440
                        if (first) {
441
                                rAux = capa.getFullExtent();
442
                                first=false;
443
                        } else {
444
                                rAux.add(capa.getFullExtent());
445
                        }
446
                        }catch (Exception e) {
447
                                e.printStackTrace();//TODO hay que revisar para determinar el comportamiento que espera el usuario.
448
                        }
449
                }
450

    
451
                return rAux;
452
        }
453

    
454
        /**
455
         * Llama al m?todo layerAdding de los listeners dados de alta.
456
         *
457
         * @param event
458
         *
459
         * @throws CancelationException
460
         */
461
        private void callLayerAdding(LayerCollectionEvent event)
462
                throws CancelationException {
463
            ArrayList aux = (ArrayList) layerCollectionListeners.clone();
464
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
465
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
466
                }
467
        }
468

    
469
        /**
470
         * Llama al m?todo layerRemoving de los listeners dados de alta.
471
         *
472
         * @param event
473
         *
474
         * @throws CancelationException
475
         */
476
        private void callLayerRemoving(LayerCollectionEvent event)
477
                throws CancelationException {
478
            ArrayList aux = (ArrayList) layerCollectionListeners.clone();
479
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
480
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
481
                }
482
        }
483

    
484

    
485
        /**
486
         * Llama al m?todo layerMoving de los listeners dados de alta.
487
         *
488
         * @param event
489
         *
490
         * @throws CancelationException
491
         */
492
        private void callLayerMoving(LayerPositionEvent event)
493
                throws CancelationException {
494
            ArrayList aux = (ArrayList) layerCollectionListeners.clone();
495
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
496
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
497
                }
498
        }
499

    
500
        /**
501
         * Llama al m?todo layerAdded de los listeners dados de alta.
502
         *
503
         * @param event
504
         */
505
        private void callLayerAdded(LayerCollectionEvent event) {
506
            ArrayList aux = (ArrayList) layerCollectionListeners.clone();
507
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
508
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
509
                }
510
        }
511

    
512
        /**
513
         * Llama al m?todo layerRemoved de los listeners dados de alta.
514
         *
515
         * @param event
516
         */
517
        private void callLayerRemoved(LayerCollectionEvent event) {
518
            ArrayList aux = (ArrayList) layerCollectionListeners.clone();
519
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
520
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
521
                }
522
        }
523

    
524
        /**
525
         * Llama al m?todo layerMoved de los listeners dados de alta.
526
         *
527
         * @param event
528
         */
529
        private void callLayerMoved(LayerPositionEvent event) {
530
            ArrayList aux = (ArrayList) layerCollectionListeners.clone();
531
                for (Iterator iter = aux.iterator(); iter.hasNext();) {
532
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
533
                }
534
        }
535

    
536
        /**
537
         * @throws XMLException
538
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
539
         */
540
        public XMLEntity getXMLEntity() throws XMLException {
541
                XMLEntity xml = super.getXMLEntity();
542
                xml.putProperty("numLayers", layers.size());
543

    
544
                String[] s = new String[layers.size()];
545

    
546
                for (int i = 0; i < layers.size(); i++) {
547
                        s[i] = ((FLayer) layers.get(i)).getName();
548
                }
549

    
550
                xml.putProperty("LayerNames", s);
551

    
552
                for (int i = 0; i < layers.size(); i++) {
553
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
554
                }
555

    
556
                return xml;
557
        }
558

    
559
        /**
560
         * DOCUMENT ME!
561
         *
562
         * @param xml DOCUMENT ME!
563
         *
564
         * @throws XMLException
565
         *
566
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
567
         */
568
        public void setXMLEntity03(XMLEntity xml) throws XMLException{
569
                super.setXMLEntity03(xml);
570
                int numLayers = xml.getIntProperty("numLayers");
571

    
572
                String[] s = xml.getStringArrayProperty("LayerNames");
573
                try {
574
                        for (int i = 0; i < numLayers; i++) {
575
                                FLayer layer = null;
576

    
577
                                String className = xml.getChild(i).getStringProperty("className");
578

    
579
                                if (className.equals(FLyrVect.class.getName())) {
580
                                        if (xml.getChild(i).contains("file")) {
581

    
582
                                                        layer = LayerFactory.createLayer(s[i],
583
                                                                        (VectorialFileDriver)LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName")),
584
                                                                        new File(xml.getChild(i).getStringProperty("file")),
585
                                                                        this.getFMap().getViewPort().getProjection());
586

    
587
                                        } else if (true) {
588
                                                //TODO falta por implementar
589
                                        } else if (true) {
590
                                                //TODO falta por implementar
591
                                        }
592

    
593
                                        layer.setXMLEntity03(xml.getChild(i));
594
                                        // Comprobar que la proyecci?n es la misma que la de FMap
595
                                        // Si no lo es, es una capa que est? reproyectada al vuelo
596
                                        IProjection proj = layer.getProjection();
597
                                        if (proj != null)
598
                                            if (proj != fmap.getProjection())
599
                                            {
600
                                                        ICoordTrans ct = new CoordTrans((CoordSys) proj,
601
                                                                        (CoordSys) fmap.getProjection());
602
                                                        layer.setCoordTrans(ct);
603
                                                        System.err.println("coordTrans = " +
604
                                                                proj.getAbrev() + " " +
605
                                                                fmap.getProjection().getAbrev());
606
                                            }
607

    
608
//                                } else if (className.equals(FLyrWMS.class.getName())) {
609
//                                        try {
610
//                                                layer = LayerFactory.createLayer(s[i],
611
//                                                                StringUtilities.string2Rect(
612
//                                                                        xml.getChild(i).getStringProperty("fullExtent")),
613
//                                                                new URL(xml.getChild(i).getStringProperty("host")),
614
//                                                                xml.getChild(i).getStringProperty("format"),
615
//                                                                xml.getChild(i).getStringProperty("layerQuery"),
616
//                                                                xml.getChild(i).getStringProperty("infoLayerQuery"),
617
//                                                                xml.getChild(i).getStringProperty("srs"));
618
//                                        } catch (MalformedURLException e) {
619
//                                                throw new XMLException(e);
620
//                                        }
621
                                } else if (className.equals((FLyrRaster.class.getName()))) {
622
                                        //if (xml.getChild(i).contains("file")) {
623
                                        /*layer = LayerFactory.createLayer(s[i],
624
                                                        xml.getChild(i).getStringProperty("driverName"),
625
                                                        new File(xml.getChild(i).getStringProperty("file")),
626
                                                        this.getFMap().getViewPort().getProjection());*/
627
                                        layer = new FLyrRaster();
628
                                        layer.setName(s[i]);
629
                                        if (!xml.getChild(i).contains("proj"))
630
                                                ((FLyrRaster)layer).setProjection(this.getFMap().getViewPort().getProjection());
631
                                        layer.setXMLEntity03(xml.getChild(i));
632
                                        try {
633
                                                        layer.load();
634

    
635
                                        } catch (DriverIOException e) {
636
                                                throw new XMLException(e);
637
                                        }
638

    
639
                                }else if (className.equals((FLayers.class.getName()))) {
640
                                        layer = new FLayers(getFMap(),this);
641
                                        layer.setXMLEntity(xml.getChild(i));
642
                                } else {
643
                                        // Capas Nuevas (externas)
644
                                        try {
645
                                                Class clase = Class.forName(className);
646
                                                layer = (FLayer) clase.newInstance();
647
                                                layer.setName(s[i]);
648
                                                layer.setXMLEntity03(xml.getChild(i));
649
                                                try {
650
                                                                layer.load();
651
                                                } catch (DriverIOException e) {
652
                                                        throw new XMLException(e);
653
                                                }
654
                                        } catch (Exception e) {
655
                                                //e.printStackTrace();
656
                                                throw new XMLException(e);
657
                                        }
658
                                }
659

    
660
                                this.addLayer(layer);
661
                        }
662
                } catch (DriverException e) {
663
                        throw new XMLException(e);
664
                } catch (DriverLoadException e) {
665
            throw new XMLException(e);
666
        }
667

    
668
        }
669

    
670
        /**
671
         * DOCUMENT ME!
672
         *
673
         * @param xml DOCUMENT ME!
674
         *
675
         * @throws XMLException
676
         *
677
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
678
         */
679
        public void setXMLEntity(XMLEntity xml) throws XMLException{
680
                super.setXMLEntity(xml);
681
                //LoadLayerException loadLayerException=new LoadLayerException();
682
                int numLayers = xml.getIntProperty("numLayers");
683

    
684
                String[] s = xml.getStringArrayProperty("LayerNames");
685
                // try {
686
                fmap.clearErrors();
687
                        for (int i = 0; i < numLayers; i++) {
688
                                FLayer layer = null;
689
                                try {
690

    
691

    
692
                                String className = xml.getChild(i).getStringProperty("className");
693

    
694
                                if (className.equals(FLyrVect.class.getName())) {
695
                                        String type = xml.getChild(i).getStringProperty("type");
696
                                        if ("vectorial".equals(type)){
697
                                                //String recordsetName = xml.getChild(i).getStringProperty("recordset-name");
698
                        IProjection proj = null;
699
                        if (xml.getChild(i).contains("proj")) {
700
                            proj = ProjectionPool.get(xml.getChild(i).getStringProperty("proj"));
701
                        }
702
                        else
703
                        {
704
                            proj = this.getFMap().getViewPort().getProjection();
705
                        }
706
                                                if (xml.getChild(i).contains("file")) {
707
                                                        Driver d;
708
                                                        try {
709
                                                                d = LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName"));
710
                                                        } catch (DriverLoadException e1) {
711
                                                                throw new XMLException(e1);
712
                                                        }
713
                                                        layer = LayerFactory.createLayer(s[i], (VectorialFileDriver) d,
714
                                                                                                                        new File(xml.getChild(i).getStringProperty("file")),
715
                                                                                                                        proj);
716

    
717

    
718
                                                }
719
                        if (xml.getChild(i).contains("db")) {
720

    
721
                            String driverName = xml.getChild(i).getStringProperty("db");
722
                            VectorialDatabaseDriver driver;
723
                            try {
724
                                driver = (VectorialDatabaseDriver) LayerFactory.getDM().getDriver(driverName);
725
                                //Hay que separar la carga de los datos del XMLEntity del load.
726
                                driver.setXMLEntity(xml.getChild(i).getChild(2));
727

    
728
                                layer = LayerFactory.createDBLayer(driver, s[i], proj);
729
                                ((DefaultDBDriver)driver).load();
730
                            } catch (DriverLoadException e) {
731
                                e.printStackTrace();
732
                                throw new XMLException(e);
733
                            }
734

    
735
                        }
736
                        // Clases con algun driver gen?rico creado por otro
737
                        // programador
738
                        if (xml.getChild(i).contains("other")) {
739

    
740
                            String driverName = xml.getChild(i).getStringProperty("other");
741
                            VectorialDriver driver = null;
742
                            try {
743
                                driver = (VectorialDriver) LayerFactory.getDM().getDriver(driverName);
744
                            } catch (DriverLoadException e) {
745
                                // Si no existe ese driver, no pasa nada.
746
                                // Puede que el desarrollador no quiera que
747
                                // aparezca en el cuadro de di?logo y ha metido
748
                                // el jar con sus clases en nuestro directorio lib.
749
                                // Intentamos cargar esa clase "a pelo".
750
                                if (xml.getChild(i).contains("className"))
751
                                {
752
                                    String className2 = xml.getChild(i).getStringProperty("className");
753
                                    try {
754
                                        driver = (VectorialDriver) Class.forName(className2).newInstance();
755
                                    } catch (Exception e1) {
756
                                        throw new XMLException(e1);
757
                                    }
758
                                }
759
                            } catch (NullPointerException npe) {
760
                                // Si no existe ese driver, no pasa nada.
761
                                // Puede que el desarrollador no quiera que
762
                                // aparezca en el cuadro de di?logo y ha metido
763
                                // el jar con sus clases en nuestro directorio lib.
764
                                // Intentamos cargar esa clase "a pelo".
765
                                if (xml.getChild(i).getChild(2).contains("className"))
766
                                {
767
                                    String className2 = xml.getChild(i).getChild(2).getStringProperty("className");
768
                                    try {
769
                                        driver = (VectorialDriver) Class.forName(className2).newInstance();
770
                                    } catch (Exception e1) {
771
                                        throw new XMLException(e1);
772
                                    }
773
                                }
774
                            }
775
                            if (driver instanceof IPersistance)
776
                            {
777
                                IPersistance persist = (IPersistance) driver;
778
                                persist.setXMLEntity(xml.getChild(i).getChild(2));
779
                            }
780
                            layer = LayerFactory.createLayer(s[i], driver, proj);
781
                        }
782

    
783

    
784
                                        } else if ("raster".equals(type)) {
785
/*                                                if (xml.getChild(i).contains("file")) {
786
                                                        Driver d = LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName"));
787
                                                                                                        layer = LayerFactory.createLayer(s[i],
788
                                                                                                                        ,
789
                                                                                                                        new File(xml.getChild(i).getStringProperty("file")),
790
                                                                                                                        this.getFMap().getViewPort().getProjection());
791

792
                                                }
793
*/                                        }
794

    
795
                                        layer.setXMLEntity(xml.getChild(i));
796

    
797
//                                } else if (className.equals(FLyrWMS.class.getName())) {
798
//                                        try {
799
//                                                layer = LayerFactory.createLayer(s[i],
800
//                                                                StringUtilities.string2Rect(
801
//                                                                        xml.getChild(i).getStringProperty("fullExtent")),
802
//                                                                new URL(xml.getChild(i).getStringProperty("host")),
803
//                                                                xml.getChild(i).getStringProperty("format"),
804
//                                                                xml.getChild(i).getStringProperty("layerQuery"),
805
//                                                                xml.getChild(i).getStringProperty("infoLayerQuery"),
806
//                                                                xml.getChild(i).getStringProperty("srs"));
807
//                                                layer.setXMLEntity(xml.getChild(i));
808
//                                        } catch (MalformedURLException e) {
809
//                                                throw new XMLException(e);
810
//                                        }
811
                                } else if (className.equals((FLyrRaster.class.getName()))) {
812
                                        //if (xml.getChild(i).contains("file")) {
813
                                        /*layer = LayerFactory.createLayer(s[i],
814
                                                        xml.getChild(i).getStringProperty("driverName"),
815
                                                        new File(xml.getChild(i).getStringProperty("file")),
816
                                                        this.getFMap().getViewPort().getProjection());*/
817
                                        layer = new FLyrRaster();
818
                                        layer.setName(s[i]);
819
                                        if (!xml.getChild(i).contains("proj"))
820
                                                ((FLyrRaster)layer).setProjection(this.getFMap().getViewPort().getProjection());
821
                                        layer.setXMLEntity(xml.getChild(i));
822
                                        try {
823
                                                layer.load();
824
                                        } catch (DriverIOException e) {
825
                                                throw new XMLException(e);
826
                                        }
827

    
828
                                }else if (className.equals((FLayers.class.getName()))) {
829
                                        layer = new FLayers(getFMap(),this);
830
                                        layer.setXMLEntity(xml.getChild(i));
831
                                } else {
832
                                        // Capas Nuevas (externas)
833
                                                Class clase = Class.forName(className);
834
                                                layer = (FLayer) clase.newInstance();
835
                                                layer.setName(s[i]);
836
                                                layer.setXMLEntity(xml.getChild(i));
837
                                                try {
838
                                                        layer.load();
839
                                                }catch (DriverIOException e) {
840
                                                        throw new XMLException(e);
841
                                                }
842

    
843
                                }
844

    
845
                                this.addLayer(layer);
846
                                logger.debug("capa :"+ layer.getName() +"cargada");
847
                                // Comprobar que la proyecci?n es la misma que la de FMap
848
                // Si no lo es, es una capa que est? reproyectada al vuelo
849
                IProjection proj = layer.getProjection();
850
                if ((proj != null))
851
                    if (proj != getFMap().getProjection())
852
                    {
853
                        ICoordTrans ct = new CoordTrans((CoordSys) proj,
854
                                (CoordSys) getFMap().getProjection());
855
                        // TODO: REVISAR CON LUIS
856
                        // Se lo fijamos a todas, luego cada una que se reproyecte
857
                        // si puede, o que no haga nada
858
                        layer.setCoordTrans(ct);
859
                        // NOTA: DESPU?S DE ESTO DEBER?AMOS CREAR LAS ETIQUETAS
860
                        // SI ES NECESARIO.
861
                        // TODO: REVISAR A FONDO ESTO, PORQUE LAS ETIQUETAS SE CREAN
862
                        // 2 VECES SI HAY REPROYECC?N
863
                        if (layer instanceof FLyrVect)
864
                        {
865
                            FLyrVect lyrVect = (FLyrVect)layer;
866
                            VectorialLegend legend = (VectorialLegend) lyrVect.getLegend();
867
                            if (legend.getLabelField() != null) {
868
                                lyrVect.createLabelLayer(lyrVect.getRecordset());
869
                            }
870

    
871
                        }
872
                    }
873
                }catch (Exception e) {
874
                                fmap.addLayerError(xml.getChild(i).getStringProperty("name"));
875
                                            //loadLayerException.addException(e);
876
                                    /*if (layer!=null){
877
                        layer.setActive(false);
878
                                        layer.setVisible(false);
879
                                        this.addLayer(layer);
880
                        }*/
881
                                        //throw new XMLException(e);
882
                    System.err.println("No se ha podido cargar la capa : "+xml.getChild(i).getStringProperty("name"));
883
                    logger.debug("No se ha podido cargar la capa : "+xml.getChild(i).getStringProperty("name") + ". Raz?n:");
884
                    // logger.debug(e.fillInStackTrace());
885
                    e.printStackTrace();
886
                }
887

    
888
                        }
889
                /* } catch (DriverException e) {
890
                        throw new XMLException(e);
891
                } */
892
                /*if (loadLayerException.getExceptions().size()>0){
893
                        throw loadLayerException;
894
                }*/
895
        }
896

    
897
        /**
898
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor,
899
         *                 FBitSet)
900
         */
901
        public void process(FeatureVisitor visitor, FBitSet subset)
902
                throws DriverException, VisitException {
903
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
904
                        FLayer layer = (FLayer) iter.next();
905

    
906
                        if (layer instanceof VectorialData) {
907
                                ((VectorialData) layer).process(visitor, subset);
908
                        }
909
                }
910
        }
911

    
912
        /**
913
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
914
         */
915
        public void process(FeatureVisitor visitor)
916
                throws DriverException, VisitException {
917
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
918
                        FLayer layer = (FLayer) iter.next();
919

    
920
                        if (layer.isActive()) {
921
                                if (layer instanceof VectorialData) {
922
                                        ((VectorialData) layer).process(visitor);
923
                                }
924
                        }
925
                }
926
        }
927
        /**
928
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor, Rectangle2D)
929
         */
930
        public void process(FeatureVisitor visitor, Rectangle2D rect) throws DriverException, VisitException {
931
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
932
                        FLayer layer = (FLayer) iter.next();
933

    
934
                        if (layer.isActive()) {
935
                                if (layer instanceof VectorialData) {
936
                                        ((VectorialData) layer).process(visitor, rect);
937
                                }
938
                        }
939
                }
940
                
941
        }
942

    
943
        /**
944
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
945
         */
946
        public FMap getFMap() {
947
                return fmap;
948
        }
949

    
950
        /* (non-Javadoc)
951
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#setCoordTrans(org.cresques.cts.ICoordTrans)
952
         */
953
        public void setCoordTrans(ICoordTrans ct) {
954
                super.setCoordTrans(ct);
955

    
956
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
957
                        FLayer layer = (FLayer) iter.next();
958
                        layer.setCoordTrans(ct);
959
                }
960
        }
961

    
962
        /**
963
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllActives(boolean)
964
         */
965
        public void setAllActives(boolean active) {
966
                FLayer lyr;
967

    
968
                for (int i = 0; i < layers.size(); i++) {
969
                        lyr = ((FLayer) layers.get(i));
970
                        lyr.setActive(active);
971

    
972
                        if (lyr instanceof LayerCollection) {
973
                                ((LayerCollection) lyr).setAllActives(active);
974
                        }
975
                }
976
        }
977

    
978
        /**
979
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#getActives()
980
         */
981
        public FLayer[] getActives() {
982
                ArrayList ret = new ArrayList();
983

    
984
                for (int i = 0; i < layers.size(); i++) {
985
                        if (((FLayer) layers.get(i)).isActive()) {
986
                                ret.add(layers.get(i));
987
                        }else{
988
                                if (layers.get(i) instanceof FLayers){
989
                                        FLayer[] lyrs=((FLayers) layers.get(i)).getActives();
990
                                        for (int j=0;j<lyrs.length;j++){
991
                                                ret.add(lyrs[j]);
992
                                        }
993
                                }
994
                        }
995
                }
996

    
997
                return (FLayer[]) ret.toArray(new FLayer[0]);
998
        }
999

    
1000
    /* (non-Javadoc)
1001
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMinScale()
1002
     */
1003
    public double getMinScale() {
1004
        return -1; // La visibilidad o no la controla cada capa
1005
                // dentro de una colecci?n
1006
    }
1007

    
1008
    /* (non-Javadoc)
1009
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMaxScale()
1010
     */
1011
    public double getMaxScale() {
1012
        return -1;
1013
    }
1014
    public void setMinScale(double minScale)
1015
    {
1016
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
1017
                        FLayer lyr = (FLayer) iter.next();
1018
                        lyr.setMinScale(minScale);
1019
                }
1020
    }
1021
    public void setMaxScale(double maxScale)
1022
    {
1023
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
1024
                        FLayer lyr = (FLayer) iter.next();
1025
                        lyr.setMinScale(maxScale);
1026
                }
1027
    }
1028
    public void setActive(boolean b){
1029
            super.setActive(b);
1030
            for (int i=0;i<layers.size();i++){
1031
                    ((FLayer)layers.get(i)).setActive(b);
1032
            }
1033
    }
1034

    
1035
        /* (non-Javadoc)
1036
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#addLayerListener(com.iver.cit.gvsig.fmap.layers.LayerListener)
1037
         */
1038
        public boolean addLayerListener(LayerListener o) {
1039
                for (int i = 0; i < layers.size(); i++) 
1040
                        ((FLayer) layers.get(i)).addLayerListener(o);
1041
                return true;
1042
        }
1043

    
1044
        public String queryByPoint(Point p) throws DriverException {
1045
                int i;
1046
                StringBuffer sb = new StringBuffer();
1047
                
1048
                for (i = 0; i < this.layers.size(); i++){
1049
                        FLayer laCapa = (FLayer) layers.get(i);
1050
                        if (laCapa instanceof FLyrVect){
1051
                                //FLyrVect layer = (FLyrVect) laCapa;
1052
                                //FBitSet newBitSet = layer.queryByPoint(p, tol);
1053
                                //TODO: 
1054
                                // Transformar el BitSet en un texto/dialogo para que el usuario lo visualice.
1055
                //sb.append(new VectorialXMLItem(newBitSet, laCapa));
1056
                        }
1057
                        else if (laCapa instanceof RasterOperations) {
1058
                                try {
1059
                                        RasterOperations layer = (RasterOperations) laCapa;
1060
                                        sb.append(layer.queryByPoint(p));
1061
                                } catch (DriverException e) {
1062
                                        e.printStackTrace(); 
1063
                                }                                
1064
                        }
1065
                        else if (laCapa instanceof InfoByPoint) {
1066
                                try {
1067
                                        InfoByPoint layer = (InfoByPoint) laCapa;
1068
                                        sb.append(layer.queryByPoint(p));
1069
                                } catch (DriverException e) {
1070
                                        e.printStackTrace(); 
1071
                                }
1072
                        }
1073
                }        
1074
                return sb.toString();
1075
        }
1076

    
1077
        
1078

    
1079
}