Statistics
| Revision:

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

History | View | Annotate | Download (12.5 KB)

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