Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / layers / FLayers.java @ 745

History | View | Annotate | Download (11.3 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
                if (getVirtualLayers() != null)
280
                        getVirtualLayers().draw(image, g, viewPort, cancel);
281
        }
282

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

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

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

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

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

    
312
                        i++;
313
                }
314

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

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

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

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

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

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

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

    
413
                return xml;
414
        }
415

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

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

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

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

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