Statistics
| Revision:

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

History | View | Annotate | Download (10.9 KB)

1 214 fernando
package com.iver.cit.gvsig.fmap.layers;
2
3 541 vcaballero
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 562 fernando
import java.util.BitSet;
9 541 vcaballero
import java.util.Iterator;
10
11 562 fernando
import com.hardcode.driverManager.DriverLoadException;
12
import com.hardcode.gdbms.engine.data.DriverException;
13
import com.iver.cit.gvsig.fmap.ViewPort;
14
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
15
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
16
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
17
import com.iver.cit.gvsig.fmap.operations.Cancellable;
18
import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor;
19
import com.iver.utiles.XMLEntity;
20 541 vcaballero
21 562 fernando
22 214 fernando
/**
23
 * Representa un nodo interno en el ?rbol de capas
24
 */
25 562 fernando
public class FLayers extends FLyrDefault implements VectorialData, LayerCollection{
26 524 vcaballero
        //ArrayList de Listener registrados.
27
        private ArrayList layerListeners = new ArrayList();
28
        private ArrayList layers = new ArrayList(4);
29 214 fernando
30 524 vcaballero
        /**
31
         * Crea un nuevo FLayers.
32
         */
33
        public FLayers() {
34
                setParentLayer(this);
35
        }
36 257 vcaballero
37 524 vcaballero
        /**
38
         * A?ade un listener de los eventos de la colecci?n de capas
39
         *
40
         * @param listener DOCUMENT ME!
41
         */
42
        public void addLayerCollectionListener(LayerCollectionListener listener) {
43
                layerListeners.add(listener);
44
        }
45 214 fernando
46 562 fernando
        /**
47 524 vcaballero
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#setActive(boolean)
48
         */
49
        public void setActive(boolean bActive) {
50
                FLayer lyr;
51 214 fernando
52 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
53
                        lyr = ((FLayer) layers.get(i));
54
                        lyr.setActive(bActive);
55
                }
56
        }
57 346 fernando
58 524 vcaballero
        /**
59
         * ELimina un listener de los eventos de la colecci?n de capas
60
         *
61
         * @param listener DOCUMENT ME!
62
         */
63
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
64
                layerListeners.remove(listener);
65
        }
66 214 fernando
67 524 vcaballero
        /**
68
         * DOCUMENT ME!
69
         *
70
         * @param layer DOCUMENT ME!
71
         */
72
        private void doAddLayer(FLayer layer) {
73
                layers.add(layer);
74
        }
75 270 vcaballero
76 524 vcaballero
        /**
77
         * A?ade una capa al final de la lista de subcapas
78
         *
79
         * @param layer DOCUMENT ME!
80
         *
81
         * @throws CancelationException
82
         */
83
        public void addLayer(FLayer layer) throws CancelationException {
84
                LayerCollectionEvent event = new LayerCollectionEvent(layer);
85 214 fernando
86 524 vcaballero
                callLayerAdding(event);
87 404 fjp
88 524 vcaballero
                doAddLayer(layer);
89 404 fjp
90 524 vcaballero
                callLayerAdded(event);
91
        }
92 404 fjp
93 524 vcaballero
        /**
94
         * Mueve una capa de la posici?n from a la posici?n to. (Se supone que
95
         * est?n dentro del mismo nivel). Para mover entre niveles, usar otro
96
         * m?todo (por hacer)
97
         *
98
         * @param from DOCUMENT ME!
99
         * @param to DOCUMENT ME!
100
         *
101
         * @throws CancelationException
102
         */
103
        public void moveTo(int from, int to) throws CancelationException {
104
                FLayer aux = (FLayer) layers.get(from);
105
                LayerPositionEvent event = new LayerPositionEvent(aux, from, to);
106
                callLayerMoving(event);
107
                layers.remove(from);
108
                layers.add(to, aux);
109
                callLayerMoved(event);
110
        }
111 257 vcaballero
112 524 vcaballero
        /**
113
         * DOCUMENT ME!
114
         *
115
         * @param lyr DOCUMENT ME!
116
         */
117
        private void doRemoveLayer(FLayer lyr) {
118
                layers.remove(lyr);
119
        }
120 214 fernando
121 524 vcaballero
        /**
122
         * DOCUMENT ME!
123
         *
124
         * @param lyr DOCUMENT ME!
125
         *
126
         * @throws CancelationException DOCUMENT ME!
127
         */
128
        public void removeLayer(FLayer lyr) throws CancelationException {
129
                LayerCollectionEvent event = new LayerCollectionEvent(lyr);
130
                callLayerRemoving(event);
131
                doRemoveLayer(lyr);
132
                callLayerRemoved(event);
133
        }
134 214 fernando
135 524 vcaballero
        /**
136
         * Borra una FLayer del vector a partir del identificador.
137
         *
138
         * @param idLayer
139
         */
140
        public void removeLayer(int idLayer) {
141
                layers.remove(idLayer);
142
        }
143 257 vcaballero
144 524 vcaballero
        /**
145
         * M?todo de conveniencia para borrar una capa con ese nombre
146
         *
147
         * @param layerName
148
         */
149
        public void removeLayer(String layerName) {
150
                FLayer lyr;
151 214 fernando
152 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
153
                        lyr = ((FLayer) layers.get(i));
154 402 fjp
155 524 vcaballero
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
156
                                layers.remove(i);
157 214 fernando
158 524 vcaballero
                                break;
159
                        }
160
                }
161
        }
162 214 fernando
163 524 vcaballero
        /**
164
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
165
         * este nodo
166
         *
167
         * @return DOCUMENT ME!
168
         */
169
        public FLayer[] getVisibles() {
170
                ArrayList array = new ArrayList();
171 404 fjp
172 524 vcaballero
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
173
                        if (((FLayer) iter.next()).isVisible()) {
174
                                array.add((FLayer) iter.next());
175
                        }
176
                }
177 404 fjp
178 524 vcaballero
                return (FLayer[]) array.toArray(new FLayer[0]);
179
        }
180 404 fjp
181 524 vcaballero
        /**
182
         * Obtiene el array de capas activas en el sub?rbol que pende de este nodo
183
         *
184
         * @return DOCUMENT ME!
185
         */
186
        public FLayer[] getActives() {
187
                ArrayList ret = new ArrayList();
188 214 fernando
189 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
190
                        if (((FLayer) layers.get(i)).isActive()) {
191
                                ret.add(layers.get(i));
192
                        }
193
                }
194 217 fernando
195 524 vcaballero
                return (FLayer[]) ret.toArray(new FLayer[0]);
196
        }
197 242 vcaballero
198 524 vcaballero
        /**
199
         * Obtiene el hijo i-?simo directo de esta colecci?n
200
         *
201
         * @param index DOCUMENT ME!
202
         *
203
         * @return DOCUMENT ME!
204
         */
205
        public FLayer getLayer(int index) {
206
                return (FLayer) layers.get(index);
207
        }
208 242 vcaballero
209 524 vcaballero
        /**
210
         * M?todo de conveniencia para buscar una capa por su nombre Es conveniente
211
         * usar getLayer(int) siempre que se pueda, es m?s directo.
212
         *
213
         * @param layerName
214
         *
215
         * @return
216
         */
217
        public FLayer getLayer(String layerName) {
218
                FLayer lyr;
219 242 vcaballero
220 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
221
                        lyr = ((FLayer) layers.get(i));
222 242 vcaballero
223 524 vcaballero
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
224
                                return lyr;
225
                        }
226
                }
227 346 fernando
228 524 vcaballero
                return null;
229
        }
230 346 fernando
231 524 vcaballero
        /**
232
         * Obtiene el n?mero de capas que hay en su mismo nivel Es decir, no cuenta
233
         * las subcapas de un FLayers
234
         *
235
         * @return DOCUMENT ME!
236
         */
237
        public int getLayersCount() {
238
                return layers.size();
239
        }
240 346 fernando
241 524 vcaballero
        /**
242
         * DOCUMENT ME!
243
         *
244
         * @param image DOCUMENT ME!
245
         * @param g DOCUMENT ME!
246
         * @param viewPort DOCUMENT ME!
247
         * @param cancel
248
         *
249
         * @throws DriverIOException
250
         * @throws DriverLoadException
251
         * @throws DriverException
252
         *
253
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#draw(java.awt.image.BufferedImage,
254
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
255
         */
256
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
257
                Cancellable cancel)
258
                throws DriverIOException, DriverLoadException, DriverException {
259
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
260 533 vcaballero
                        FLayer lyr = (FLayer) iter.next();
261 541 vcaballero
262 524 vcaballero
                        if (lyr.isVisible()) {
263
                                lyr.draw(image, g, viewPort, cancel);
264
                        }
265
                }
266
        }
267
268
        /**
269 562 fernando
         * @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)
270 524 vcaballero
         */
271 562 fernando
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel) throws DriverIOException, DriverLoadException, DriverException {
272 650 vcaballero
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
273
                        FLayer lyr = (FLayer) iter.next();
274
275
                        if (lyr.isVisible()) {
276
                                lyr.print(g, viewPort, cancel);
277
                        }
278
                }
279 524 vcaballero
        }
280
281
        /**
282
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
283
         */
284
        public Rectangle2D getFullExtent() throws DriverIOException {
285
                Rectangle2D rAux = null;
286
                int i = 0;
287
288
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
289 533 vcaballero
                        FLayer capa = (FLayer) iter.next();
290 524 vcaballero
291
                        if (i == 0) {
292
                                rAux = capa.getFullExtent();
293
                        } else {
294
                                rAux.add(capa.getFullExtent());
295
                        }
296
297
                        i++;
298
                }
299
300
                return rAux;
301
        }
302
        /**
303
         * DOCUMENT ME!
304
         *
305
         * @param event DOCUMENT ME!
306
         *
307
         * @throws CancelationException
308
         */
309
        private void callLayerAdding(LayerCollectionEvent event)
310
                throws CancelationException {
311
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
312
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
313
                }
314
        }
315 257 vcaballero
316 524 vcaballero
        /**
317
         * DOCUMENT ME!
318
         *
319
         * @param event DOCUMENT ME!
320
         *
321
         * @throws CancelationException
322
         */
323
        private void callLayerRemoving(LayerCollectionEvent event)
324
                throws CancelationException {
325
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
326
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
327
                }
328
        }
329 257 vcaballero
330 524 vcaballero
        /**
331
         * DOCUMENT ME!
332
         *
333
         * @param event DOCUMENT ME!
334
         *
335
         * @throws CancelationException
336
         */
337
        private void callLayerMoving(LayerPositionEvent event)
338
                throws CancelationException {
339
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
340
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
341
                }
342
        }
343 353 fernando
344 524 vcaballero
        /**
345
         * DOCUMENT ME!
346
         *
347
         * @param event DOCUMENT ME!
348
         */
349
        private void callLayerAdded(LayerCollectionEvent event) {
350
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
351
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
352
                }
353
        }
354 353 fernando
355 524 vcaballero
        /**
356
         * DOCUMENT ME!
357
         *
358
         * @param event DOCUMENT ME!
359
         */
360
        private void callLayerRemoved(LayerCollectionEvent event) {
361
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
362
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
363
                }
364
        }
365 353 fernando
366 435 vcaballero
        /**
367 524 vcaballero
         * DOCUMENT ME!
368
         *
369
         * @param event DOCUMENT ME!
370
         */
371
        private void callLayerMoved(LayerPositionEvent event) {
372
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
373
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
374
                }
375
        }
376
377
        /**
378
         * DOCUMENT ME!
379
         *
380
         * @return DOCUMENT ME!
381
         *
382
         * @throws DriverException
383
         *
384 435 vcaballero
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
385
         */
386 524 vcaballero
        public XMLEntity getXMLEntity() throws DriverException {
387
                XMLEntity xml = super.getXMLEntity();
388
                xml.putProperty("numLayers", layers.size());
389 558 vcaballero
                String[] s=new String[layers.size()];
390
                for (int i=0;i<layers.size();i++){
391
                        s[i]=((FLayer)layers.get(i)).getName();
392
                }
393
                xml.putProperty("LayerNames",s);
394 524 vcaballero
                for (int i = 0; i < layers.size(); i++) {
395
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
396 435 vcaballero
                }
397 524 vcaballero
398 435 vcaballero
                return xml;
399
        }
400 341 fernando
401 435 vcaballero
        /**
402 524 vcaballero
         * DOCUMENT ME!
403
         *
404
         * @param xml DOCUMENT ME!
405
         *
406
         * @throws XMLException
407
         *
408 435 vcaballero
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
409
         */
410 487 vcaballero
        public void setXMLEntity(XMLEntity xml) throws XMLException {
411 442 vcaballero
                super.setXMLEntity(xml);
412 524 vcaballero
413
                int numLayers = xml.getIntProperty("numLayers");
414 558 vcaballero
                String[] s=xml.getStringArrayProperty("LayerNames");
415 524 vcaballero
                for (int i = 0; i < numLayers; i++) {
416
                        if (xml.getStringProperty("file") != null) {
417
                                try {
418 558 vcaballero
                                        layers.add(LayerFactory.createLayer(s[i],
419 524 vcaballero
                                                        xml.getChild(i).getStringProperty("driverName"),
420
                                                        new File(xml.getChild(i).getStringProperty("name")),
421
                                                        getProjection()));
422
                                } catch (DriverLoadException e) {
423
                                        throw new XMLException(e);
424
                                } catch (DriverIOException e) {
425
                                        throw new XMLException(e);
426
                                }
427
                        } else if (true) {
428
                        } else if (true) {
429 487 vcaballero
                        }
430 435 vcaballero
                }
431
        }
432 562 fernando
433
        /**
434
         * @throws DriverIOException
435
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor, java.util.BitSet)
436
         */
437
        public void process(FeatureVisitor visitor, BitSet subset) throws DriverIOException {
438
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
439
                        FLayer layer = (FLayer) iter.next();
440
441
                        if (layer instanceof VectorialData) {
442
                                ((VectorialData) layer).process(visitor, subset);
443
                        }
444
                }
445
        }
446
447
        /**
448
         * @throws DriverIOException
449
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
450
         */
451
        public void process(FeatureVisitor visitor) throws DriverIOException {
452
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
453
                        FLayer layer = (FLayer) iter.next();
454
455
                        if (layer instanceof VectorialData) {
456
                                ((VectorialData) layer).process(visitor);
457
                        }
458
                }
459
        }
460 214 fernando
}