Statistics
| Revision:

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

History | View | Annotate | Download (11 KB)

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

    
3
import java.awt.Graphics2D;
4
import java.awt.geom.Rectangle2D;
5
import java.awt.image.BufferedImage;
6
import java.io.File;
7
import java.util.ArrayList;
8
import java.util.BitSet;
9
import java.util.Iterator;
10

    
11
import com.hardcode.driverManager.DriverLoadException;
12
import com.iver.cit.gvsig.fmap.DriverException;
13
import com.iver.cit.gvsig.fmap.FMap;
14
import com.iver.cit.gvsig.fmap.ViewPort;
15
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
16
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
17
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
18
import com.iver.cit.gvsig.fmap.operations.Cancellable;
19
import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor;
20
import com.iver.utiles.XMLEntity;
21

    
22

    
23
/**
24
 * Representa un nodo interno en el ?rbol de capas
25
 */
26
public class FLayers extends FLyrDefault implements VectorialData, LayerCollection{
27
        //ArrayList de Listener registrados.
28
        private ArrayList layerListeners = new ArrayList();
29
        private ArrayList layers = new ArrayList(4);
30
        private FMap fmap;
31
        
32
        /**
33
         * Crea un nuevo FLayers.
34
         */
35
        public FLayers(FMap fmap, FLayers parent) {
36
                setParentLayer(parent);
37
                this.fmap = fmap;
38
        }
39

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

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

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

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

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

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

    
90
                callLayerAdding(event);
91

    
92
                doAddLayer(layer);
93

    
94
                callLayerAdded(event);
95
        }
96

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

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

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

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

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

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

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

    
162
                                break;
163
                        }
164
                }
165
        }
166

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

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

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

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

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

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

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

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

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

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

    
232
                return null;
233
        }
234

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

    
245
        /**
246
         * DOCUMENT ME!
247
         *
248
         * @param image DOCUMENT ME!
249
         * @param g DOCUMENT ME!
250
         * @param viewPort DOCUMENT ME!
251
         * @param cancel
252
         *
253
         * @throws DriverLoadException
254
         * @throws DriverException
255
         *
256
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#draw(java.awt.image.BufferedImage,
257
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
258
         */
259
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
260
                Cancellable cancel)
261
                throws DriverException {
262
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
263
                        FLayer lyr = (FLayer) iter.next();
264

    
265
                        if (lyr.isVisible()) {
266
                                lyr.draw(image, g, viewPort, cancel);
267
                        }
268
                }
269
        }
270

    
271
        /**
272
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.operations.Cancellable)
273
         */
274
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel) throws DriverException{
275
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
276
                        FLayer lyr = (FLayer) iter.next();
277

    
278
                        if (lyr.isVisible()) {
279
                                lyr.print(g, viewPort, cancel);
280
                        }
281
                }
282
        }
283

    
284
        /**
285
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
286
         */
287
        public Rectangle2D getFullExtent() throws DriverException {
288
                Rectangle2D rAux = null;
289
                int i = 0;
290

    
291
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
292
                        FLayer capa = (FLayer) iter.next();
293

    
294
                        if (i == 0) {
295
                                rAux = capa.getFullExtent();
296
                        } else {
297
                                rAux.add(capa.getFullExtent());
298
                        }
299

    
300
                        i++;
301
                }
302

    
303
                return rAux;
304
        }
305
        /**
306
         * DOCUMENT ME!
307
         *
308
         * @param event DOCUMENT ME!
309
         *
310
         * @throws CancelationException
311
         */
312
        private void callLayerAdding(LayerCollectionEvent event)
313
                throws CancelationException {
314
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
315
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
316
                }
317
        }
318

    
319
        /**
320
         * DOCUMENT ME!
321
         *
322
         * @param event DOCUMENT ME!
323
         *
324
         * @throws CancelationException
325
         */
326
        private void callLayerRemoving(LayerCollectionEvent event)
327
                throws CancelationException {
328
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
329
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
330
                }
331
        }
332

    
333
        /**
334
         * DOCUMENT ME!
335
         *
336
         * @param event DOCUMENT ME!
337
         *
338
         * @throws CancelationException
339
         */
340
        private void callLayerMoving(LayerPositionEvent event)
341
                throws CancelationException {
342
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
343
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
344
                }
345
        }
346

    
347
        /**
348
         * DOCUMENT ME!
349
         *
350
         * @param event DOCUMENT ME!
351
         */
352
        private void callLayerAdded(LayerCollectionEvent event) {
353
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
354
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
355
                }
356
        }
357

    
358
        /**
359
         * DOCUMENT ME!
360
         *
361
         * @param event DOCUMENT ME!
362
         */
363
        private void callLayerRemoved(LayerCollectionEvent event) {
364
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
365
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
366
                }
367
        }
368

    
369
        /**
370
         * DOCUMENT ME!
371
         *
372
         * @param event DOCUMENT ME!
373
         */
374
        private void callLayerMoved(LayerPositionEvent event) {
375
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
376
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
377
                }
378
        }
379

    
380
        /**
381
         * DOCUMENT ME!
382
         *
383
         * @return DOCUMENT ME!
384
         *
385
         * @throws DriverException
386
         *
387
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
388
         */
389
        public XMLEntity getXMLEntity() {
390
                XMLEntity xml = super.getXMLEntity();
391
                xml.putProperty("numLayers", layers.size());
392
                String[] s=new String[layers.size()];
393
                for (int i=0;i<layers.size();i++){
394
                        s[i]=((FLayer)layers.get(i)).getName();
395
                }
396
                xml.putProperty("LayerNames",s);
397
                for (int i = 0; i < layers.size(); i++) {
398
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
399
                }
400

    
401
                return xml;
402
        }
403

    
404
        /**
405
         * DOCUMENT ME!
406
         *
407
         * @param xml DOCUMENT ME!
408
         *
409
         * @throws XMLException
410
         * @throws DriverException
411
         *
412
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
413
         */
414
        public void setXMLEntity(XMLEntity xml) throws XMLException, DriverException {
415
                super.setXMLEntity(xml);
416

    
417
                int numLayers = xml.getIntProperty("numLayers");
418
                String[] s=xml.getStringArrayProperty("LayerNames");
419
                for (int i = 0; i < numLayers; i++) {
420
                        if (xml.getStringProperty("file") != null) {
421
                                layers.add(LayerFactory.createLayer(s[i],
422
                                                xml.getChild(i).getStringProperty("driverName"),
423
                                                new File(xml.getChild(i).getStringProperty("name")),
424
                                                getProjection()));
425
                        } else if (true) {
426
                        } else if (true) {
427
                        }
428
                }
429
        }
430

    
431
        /**
432
         * @throws DriverIOException
433
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor, java.util.BitSet)
434
         */
435
        public void process(FeatureVisitor visitor, BitSet subset) throws DriverException {
436
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
437
                        FLayer layer = (FLayer) iter.next();
438
                        
439
                        if (layer instanceof VectorialData) {
440
                                ((VectorialData) layer).process(visitor, subset);
441
                        }
442
                }
443
        }
444

    
445
        /**
446
         * @throws DriverIOException
447
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
448
         */
449
        public void process(FeatureVisitor visitor) throws DriverException {
450
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
451
                        FLayer layer = (FLayer) iter.next();
452
                        if (layer.isActive())
453
                                if (layer instanceof VectorialData) {
454
                                        ((VectorialData) layer).process(visitor);
455
                                }
456
                }
457
        }
458

    
459
        /**
460
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
461
         */
462
        public FMap getFMap() {
463
                return fmap;
464
        }
465
}