Statistics
| Revision:

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

History | View | Annotate | Download (11.2 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
        public void setAllActives(boolean active){
50
                FLayer lyr;
51
                for (int i = 0; i < layers.size(); i++) {
52
                        lyr = ((FLayer) layers.get(i));
53
                        lyr.setActive(active);
54
                        if (lyr instanceof LayerCollection){
55
                                ((LayerCollection) lyr).setAllActives(active);
56
                        }
57
                }
58
        }
59

    
60
        public void setAllVisibles(boolean visible){
61
                FLayer lyr;
62
                for (int i = 0; i < layers.size(); i++) {
63
                        lyr = ((FLayer) layers.get(i));
64
                        lyr.setVisible(visible);
65
                        if (lyr instanceof LayerCollection){
66
                                ((LayerCollection) lyr).setAllVisibles(visible);
67
                        }
68
                }
69
        }
70

    
71
        /**
72
         * ELimina un listener de los eventos de la colecci?n de capas
73
         *
74
         * @param listener DOCUMENT ME!
75
         */
76
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
77
                layerListeners.remove(listener);
78
        }
79

    
80
        /**
81
         * DOCUMENT ME!
82
         *
83
         * @param layer DOCUMENT ME!
84
         */
85
        private void doAddLayer(FLayer layer) {
86
                layers.add(layer);
87
                layer.setParentLayer(this);
88
        }
89

    
90
        /**
91
         * A?ade una capa al final de la lista de subcapas
92
         *
93
         * @param layer DOCUMENT ME!
94
         *
95
         * @throws CancelationException
96
         */
97
        public void addLayer(FLayer layer) throws CancelationException {
98
                LayerCollectionEvent event = new LayerCollectionEvent(layer);
99

    
100
                callLayerAdding(event);
101

    
102
                doAddLayer(layer);
103

    
104
                callLayerAdded(event);
105
        }
106

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

    
126
        /**
127
         * DOCUMENT ME!
128
         *
129
         * @param lyr DOCUMENT ME!
130
         */
131
        private void doRemoveLayer(FLayer lyr) {
132
                layers.remove(lyr);
133
        }
134

    
135
        /**
136
         * DOCUMENT ME!
137
         *
138
         * @param lyr DOCUMENT ME!
139
         *
140
         * @throws CancelationException DOCUMENT ME!
141
         */
142
        public void removeLayer(FLayer lyr) throws CancelationException {
143
                LayerCollectionEvent event = new LayerCollectionEvent(lyr);
144
                callLayerRemoving(event);
145
                doRemoveLayer(lyr);
146
                callLayerRemoved(event);
147
        }
148

    
149
        /**
150
         * Borra una FLayer del vector a partir del identificador.
151
         *
152
         * @param idLayer
153
         */
154
        public void removeLayer(int idLayer) {
155
                layers.remove(idLayer);
156
        }
157

    
158
        /**
159
         * M?todo de conveniencia para borrar una capa con ese nombre
160
         *
161
         * @param layerName
162
         */
163
        public void removeLayer(String layerName) {
164
                FLayer lyr;
165

    
166
                for (int i = 0; i < layers.size(); i++) {
167
                        lyr = ((FLayer) layers.get(i));
168

    
169
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
170
                                layers.remove(i);
171

    
172
                                break;
173
                        }
174
                }
175
        }
176

    
177
        /**
178
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
179
         * este nodo
180
         *
181
         * @return DOCUMENT ME!
182
         */
183
        public FLayer[] getVisibles() {
184
                ArrayList array = new ArrayList();
185

    
186
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
187
                        if (((FLayer) iter.next()).isVisible()) {
188
                                array.add((FLayer) iter.next());
189
                        }
190
                }
191

    
192
                return (FLayer[]) array.toArray(new FLayer[0]);
193
        }
194

    
195
        /**
196
         * Obtiene el array de capas activas en el sub?rbol que pende de este nodo
197
         *
198
         * @return DOCUMENT ME!
199
         */
200
        public FLayer[] getActives() {
201
                ArrayList ret = new ArrayList();
202

    
203
                for (int i = 0; i < layers.size(); i++) {
204
                        if (((FLayer) layers.get(i)).isActive()) {
205
                                ret.add(layers.get(i));
206
                        }
207
                }
208

    
209
                return (FLayer[]) ret.toArray(new FLayer[0]);
210
        }
211

    
212
        /**
213
         * Obtiene el hijo i-?simo directo de esta colecci?n
214
         *
215
         * @param index DOCUMENT ME!
216
         *
217
         * @return DOCUMENT ME!
218
         */
219
        public FLayer getLayer(int index) {
220
                return (FLayer) layers.get(index);
221
        }
222

    
223
        /**
224
         * M?todo de conveniencia para buscar una capa por su nombre Es conveniente
225
         * usar getLayer(int) siempre que se pueda, es m?s directo.
226
         *
227
         * @param layerName
228
         *
229
         * @return
230
         */
231
        public FLayer getLayer(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
                                return lyr;
239
                        }
240
                }
241

    
242
                return null;
243
        }
244

    
245
        /**
246
         * Obtiene el n?mero de capas que hay en su mismo nivel Es decir, no cuenta
247
         * las subcapas de un FLayers
248
         *
249
         * @return DOCUMENT ME!
250
         */
251
        public int getLayersCount() {
252
                return layers.size();
253
        }
254

    
255
        /**
256
         * DOCUMENT ME!
257
         *
258
         * @param image DOCUMENT ME!
259
         * @param g DOCUMENT ME!
260
         * @param viewPort DOCUMENT ME!
261
         * @param cancel
262
         *
263
         * @throws DriverLoadException
264
         * @throws DriverException
265
         *
266
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#draw(java.awt.image.BufferedImage,
267
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
268
         */
269
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
270
                Cancellable cancel)
271
                throws DriverException {
272
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
273
                        FLayer lyr = (FLayer) iter.next();
274

    
275
                        if (lyr.isVisible()) {
276
                                lyr.draw(image, g, viewPort, cancel);
277
                        }
278
                }
279
        }
280

    
281
        /**
282
         * @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)
283
         */
284
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel) throws DriverException{
285
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
286
                        FLayer lyr = (FLayer) iter.next();
287

    
288
                        if (lyr.isVisible()) {
289
                                lyr.print(g, viewPort, cancel);
290
                        }
291
                }
292
        }
293

    
294
        /**
295
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
296
         */
297
        public Rectangle2D getFullExtent() throws DriverException {
298
                Rectangle2D rAux = null;
299
                int i = 0;
300

    
301
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
302
                        FLayer capa = (FLayer) iter.next();
303

    
304
                        if (i == 0) {
305
                                rAux = capa.getFullExtent();
306
                        } else {
307
                                rAux.add(capa.getFullExtent());
308
                        }
309

    
310
                        i++;
311
                }
312

    
313
                return rAux;
314
        }
315
        /**
316
         * DOCUMENT ME!
317
         *
318
         * @param event DOCUMENT ME!
319
         *
320
         * @throws CancelationException
321
         */
322
        private void callLayerAdding(LayerCollectionEvent event)
323
                throws CancelationException {
324
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
325
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
326
                }
327
        }
328

    
329
        /**
330
         * DOCUMENT ME!
331
         *
332
         * @param event DOCUMENT ME!
333
         *
334
         * @throws CancelationException
335
         */
336
        private void callLayerRemoving(LayerCollectionEvent event)
337
                throws CancelationException {
338
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
339
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
340
                }
341
        }
342

    
343
        /**
344
         * DOCUMENT ME!
345
         *
346
         * @param event DOCUMENT ME!
347
         *
348
         * @throws CancelationException
349
         */
350
        private void callLayerMoving(LayerPositionEvent event)
351
                throws CancelationException {
352
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
353
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
354
                }
355
        }
356

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

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

    
379
        /**
380
         * DOCUMENT ME!
381
         *
382
         * @param event DOCUMENT ME!
383
         */
384
        private void callLayerMoved(LayerPositionEvent event) {
385
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
386
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
387
                }
388
        }
389

    
390
        /**
391
         * DOCUMENT ME!
392
         *
393
         * @return DOCUMENT ME!
394
         *
395
         * @throws DriverException
396
         *
397
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
398
         */
399
        public XMLEntity getXMLEntity() {
400
                XMLEntity xml = super.getXMLEntity();
401
                xml.putProperty("numLayers", layers.size());
402
                String[] s=new String[layers.size()];
403
                for (int i=0;i<layers.size();i++){
404
                        s[i]=((FLayer)layers.get(i)).getName();
405
                }
406
                xml.putProperty("LayerNames",s);
407
                for (int i = 0; i < layers.size(); i++) {
408
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
409
                }
410

    
411
                return xml;
412
        }
413

    
414
        /**
415
         * DOCUMENT ME!
416
         *
417
         * @param xml DOCUMENT ME!
418
         *
419
         * @throws XMLException
420
         * @throws DriverException
421
         *
422
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
423
         */
424
        public void setXMLEntity(XMLEntity xml) throws XMLException, DriverException {
425
                super.setXMLEntity(xml);
426

    
427
                int numLayers = xml.getIntProperty("numLayers");
428
                String[] s=xml.getStringArrayProperty("LayerNames");
429
                for (int i = 0; i < numLayers; i++) {
430
                        if (xml.getStringProperty("file") != null) {
431
                                layers.add(LayerFactory.createLayer(s[i],
432
                                                xml.getChild(i).getStringProperty("driverName"),
433
                                                new File(xml.getChild(i).getStringProperty("name")),
434
                                                getProjection()));
435
                        } else if (true) {
436
                        } else if (true) {
437
                        }
438
                }
439
        }
440

    
441
        /**
442
         * @throws DriverIOException
443
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor, java.util.BitSet)
444
         */
445
        public void process(FeatureVisitor visitor, BitSet subset) throws DriverException {
446
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
447
                        FLayer layer = (FLayer) iter.next();
448
                        
449
                        if (layer instanceof VectorialData) {
450
                                ((VectorialData) layer).process(visitor, subset);
451
                        }
452
                }
453
        }
454

    
455
        /**
456
         * @throws DriverIOException
457
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
458
         */
459
        public void process(FeatureVisitor visitor) throws DriverException {
460
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
461
                        FLayer layer = (FLayer) iter.next();
462
                        if (layer.isActive())
463
                                if (layer instanceof VectorialData) {
464
                                        ((VectorialData) layer).process(visitor);
465
                                }
466
                }
467
        }
468

    
469
        /**
470
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
471
         */
472
        public FMap getFMap() {
473
                return fmap;
474
        }
475
}