Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / FMap.java @ 2976

History | View | Annotate | Download (19.8 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.fmap;
42

    
43
import java.awt.Graphics2D;
44
import java.awt.RenderingHints;
45
import java.awt.Toolkit;
46
import java.awt.geom.Point2D;
47
import java.awt.geom.Rectangle2D;
48
import java.awt.image.BufferedImage;
49
import java.util.ArrayList;
50

    
51
import org.cresques.cts.ICoordTrans;
52
import org.cresques.cts.IProjection;
53
import org.cresques.geo.Projected;
54

    
55
import com.iver.cit.gvsig.fmap.core.IGeometry;
56
import com.iver.cit.gvsig.fmap.layers.CancelationException;
57
import com.iver.cit.gvsig.fmap.layers.FLayer;
58
import com.iver.cit.gvsig.fmap.layers.FLayers;
59
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
60
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
61
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
62
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
63
import com.iver.cit.gvsig.fmap.layers.LegendListener;
64
import com.iver.cit.gvsig.fmap.layers.VectorialAdapter;
65
import com.iver.cit.gvsig.fmap.layers.XMLException;
66
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
67
import com.iver.cit.gvsig.fmap.layers.layerOperations.Selectable;
68
import com.iver.cit.gvsig.fmap.operations.Cancellable;
69
import com.iver.cit.gvsig.fmap.operations.selection.Record;
70
import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor;
71
import com.iver.cit.gvsig.fmap.operations.strategies.SelectByPointVisitor;
72
import com.iver.cit.gvsig.fmap.operations.strategies.SelectByRectVisitor;
73
import com.iver.cit.gvsig.fmap.operations.strategies.SelectedZoomVisitor;
74
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
75
import com.iver.cit.gvsig.fmap.rendering.styling.FStyle2D;
76
import com.iver.utiles.XMLEntity;
77

    
78

    
79
/**
80
 * Modelo del mapa.
81
 *
82
 * @author Fernando Gonz?lez Cort?s
83
 */
84
public class FMap implements Projected {
85
        public static final double[] CHANGEM = {
86
                        1000, 1, 0.01, 0.001, 1609.344, 0.9144, 0.3048, 0.0254
87
                };
88
        public static final double[] CHANGE = {
89
                        100000, 100, 1, 0.1, 160934.4, 91.44, 30.48, 2.54
90
                };
91
        public static final int EQUALS = 0;
92
        public static final int DISJOINT = 1;
93
        public static final int INTERSECTS = 2;
94
        public static final int TOUCHES = 3;
95
        public static final int CROSSES = 4;
96
        public static final int WITHIN = 5;
97
        public static final int CONTAINS = 6;
98
        public static final int OVERLAPS = 7;
99
        private FLayers layers = new FLayers(this, null);
100
    private GraphicLayer tracLayer = new GraphicLayer();
101
        private ViewPort viewPort;
102
        //private ArrayList invalidationListeners = new ArrayList();
103
        private ArrayList legendListeners = new ArrayList();
104
        private EventBuffer eventBuffer = new EventBuffer();
105
    private LayerEventListener layerEventListener=null;
106
        // public static ResourceBundle myResourceBundle = ResourceBundle.getBundle("FMap");
107

    
108
        /**
109
         * Crea un nuevo FMap.
110
         *
111
         * @param vp ViewPort.
112
         */
113
        public FMap(ViewPort vp) {
114
                this.viewPort = vp;
115
                layerEventListener=new LayerEventListener();
116
                layers.addLayerCollectionListener(layerEventListener);
117
                layers.addLayerCollectionListener(eventBuffer);
118

    
119
                if (viewPort != null) {
120
                        viewPort.addViewPortListener(eventBuffer);
121
                }
122
        }
123

    
124
        /**
125
         * A?ade un LegendListener.
126
         *
127
         * @param listener LegendListener a a?adir.
128
         */
129
        public void addLayerListener(LegendListener listener) {
130
        legendListeners.add(listener);
131
        }
132

    
133
        /**
134
         * M?todo ejecutado cuando hay un cambio de leyenda que se quiera reflejar.
135
         *
136
         * @param e LegendChangedEvent.
137
         */
138
        public synchronized void callLegendChanged() {
139
                for(int i=0;i<legendListeners.size();i++){
140
                        ((LegendListener)legendListeners.get(i)).legendChanged(null);
141
                }
142
        //        getLayers().moveTo(0,0);
143
        }
144

    
145
        /**
146
         * Borra un LegendListener.
147
         *
148
         * @param listener LegendListener a borrar.
149
         */
150
        public void removeLayerListener(LegendListener listener) {
151
        legendListeners.remove(listener);
152
        }
153

    
154
        /**
155
         * Devuelve las capas que contiene el mapa.
156
         *
157
         * @return Capas.
158
         */
159
        public FLayers getLayers() {
160
                return layers;
161
        }
162

    
163
        /**
164
         * Dibuja en la imagen que se pasa como par?metro el contenido de las capas
165
         * visibles del mapa y teniendo en cuenta los datos del ViewPort contenido
166
         * en este FMap
167
         *
168
         * @param b Imagen.
169
         */
170
        public void drawLabels(BufferedImage b) {
171
        }
172

    
173
        /**
174
         * M?todo de conveniencia que se usa provisionalmente para
175
         * solicitar un refresco de todo lo que dependa del 
176
         * FMap (MapContext). Esto provocar? un evento de cambio
177
         * de orden de capas que obligar? a redibujar todo lo que 
178
         * depende de FMap (TOC, MapControl, FFrameView, etc).
179
         */
180
        public void invalidate()
181
        {
182
                getLayers().moveTo(0,0);
183
        }
184
        /**
185
         * Imprime el las capas que contiene el FMap sobre el Graphics2D que se
186
         * pasa como par?metro, normalmente es el Graphics de la impresora.
187
         *
188
         * @param g Graphics2D
189
         *
190
         * @throws DriverException
191
         */
192
        public void print(Graphics2D g,double scale) throws DriverException {
193
            RenderingHints renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, 
194
                    RenderingHints.VALUE_ANTIALIAS_ON);
195
            renderHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
196
            g.setRenderingHints(renderHints);
197
        
198
        Cancellable cancel = new Cancellable() {
199
            public boolean isCanceled() {
200
                return false;
201
            }
202
        };
203
                layers.print(g, viewPort, cancel ,scale);
204
        tracLayer.draw(null, g, viewPort, cancel, scale);
205
        }
206

    
207
        /**
208
         * Crea un nuevo FMap con la informaci?n del ViewPort que se pasa como
209
         * par?metro.
210
         *
211
         * @param vp ViewPort.
212
         *
213
         * @return FMap nuevo.
214
         */
215
        public FMap createNewFMap(ViewPort vp) {
216
                FMap ret = new FMap(vp);
217
                ret.layers = this.layers;
218

    
219
                return ret;
220
        }
221

    
222
        /**
223
         * Crea un nuevo FMap totalmente desligado, se replican las capas y el
224
         * ViewPort
225
         *
226
         * @return FMap clonado.
227
         *
228
         * @throws XMLException
229
         */
230
        public FMap cloneFMap() throws XMLException {
231
                return createFromXML(getXMLEntity());
232
        }
233

    
234
        /**
235
         * A?ade la capa que se pasa como par?metro al nodo que se pasa como
236
         * parametro y lanza ProjectionMismatchException si no est?n todas las
237
         * capas de este FMap en la misma proyecci?n. Lanza un
238
         * ChildNotAllowedException si la capa no es un FLayers y no permite hijos
239
         *
240
         * @param vectorial DOCUMENT ME!
241
         */
242

    
243
        /*        public void addLayer(LayerPath parent, FLayer layer)
244
           throws ProjectionMismatchException, ChildrenNotAllowedException {
245
           layers.addLayer(parent, layer);
246
           }
247
           public void removeLayer(LayerPath parent)throws ChildrenNotAllowedException{
248
                   layers.removeLayer(parent);
249
           }
250
         */
251

    
252
        /**
253
         * A?ade una capa al grupo de capas que se sit?a por encima de todas las
254
         * otras capas
255
         *
256
         * @param vectorial FLayer.
257
         */
258
        public void addToTrackLayer(FLayer vectorial) {
259
        }
260

    
261
        /**
262
         * Devuelve la escala de la vista en pantalla.
263
         *
264
         * @return escala de la vista.
265
         */
266
        public long getScaleView() {
267
                //TODO falta implementar un di?logo para poder especificar el usuario los pixels exactos de su pantalla.
268
                Toolkit kit = Toolkit.getDefaultToolkit();
269
                double dpi = kit.getScreenResolution();
270
                IProjection proj = viewPort.getProjection();
271
                
272
                if (viewPort.getImageSize() == null)
273
                    return -1;
274

    
275
                double w = ((viewPort.getImageSize().getWidth() / dpi) * 2.54);
276

    
277
                if (viewPort.getAdjustedExtent() == null) {
278
                        return 0;
279
                }
280

    
281
                if (proj == null) {
282
                        return (long) (viewPort.getAdjustedExtent().getWidth() / w * CHANGE[getViewPort()
283
                                                                                                                                                                        .getMapUnits()]);
284
                }
285

    
286
                return (long) proj.getScale(viewPort.getAdjustedExtent().getMinX(),
287
                        viewPort.getAdjustedExtent().getMaxX(),
288
                        viewPort.getImageSize().getWidth(), dpi);
289
        }
290

    
291
        /**
292
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#setVectorial(com.iver.cit.gvsig.fmap.VectorialAdapter)
293
         */
294
        public void setVectorial(VectorialAdapter v) {
295
        }
296

    
297
        /**
298
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#process(com.iver.cit.gvsig.fmap.FeatureSelectorVisitor)
299
         */
300
        public void process(FeatureVisitor visitor) {
301
        }
302

    
303
        /**
304
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#processSelected(com.iver.cit.gvsig.fmap.FeatureVisitor)
305
         */
306
        public void processSelected(FeatureVisitor visitor) {
307
        }
308

    
309
        /**
310
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#select(com.iver.cit.gvsig.fmap.FeatureSelectorVisitor,
311
         *                 VectorialSubSet)
312
         */
313
        public void select(FeatureVisitor visitor) {
314
        }
315

    
316
        /**
317
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectFromSelection()
318
         */
319
        public void selectFromSelection() {
320
        }
321

    
322
        /**
323
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#createIndex()
324
         */
325
        public void createIndex() {
326
        }
327

    
328
        /**
329
         * @see org.cresques.geo.Projected#getProjection()
330
         */
331
        public IProjection getProjection() {
332
                return getViewPort().getProjection();
333
        }
334

    
335
        /**
336
         * Inserta la proyecci?n.
337
         *
338
         * @param proj Proyecci?n.
339
         */
340
        public void setProjection(IProjection proj) {
341
                getViewPort().setProjection(proj);
342
        }
343

    
344
        /**
345
         * @see org.cresques.geo.Projected#reProject(org.cresques.cts.ICoordTrans)
346
         */
347
        public void reProject(ICoordTrans arg0) {
348
                // TODO implementar reprojecci?n (lo que sea eso)
349
        }
350

    
351
        /**
352
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectByPoint(java.awt.geom.Point2D,
353
         *                 double)
354
         */
355
        public void selectByPoint(Point2D p, double tolerance)
356
                throws DriverException {
357
                Point2D mapPoint = viewPort.toMapPoint((int) p.getX(), (int) p.getY());
358
                SelectByPointVisitor visitor = new SelectByPointVisitor();
359
                visitor.setQueriedPoint(mapPoint);
360
                visitor.setTolerance(getViewPort().toMapDistance(3));
361

    
362
                try {
363
                        layers.process(visitor);
364
                } catch (VisitException e) {
365
                        throw new RuntimeException("No se espera que SelectByPointVisitor lance esta excepci?n",
366
                                e);
367
                }
368
        }
369

    
370
        /**
371
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectByRect(java.awt.geom.Rectangle2D)
372
         */
373
        public void selectByRect(Rectangle2D rect) throws DriverException {
374
                SelectByRectVisitor visitor = new SelectByRectVisitor();
375
                visitor.setRect(rect);
376

    
377
                try {
378
                        layers.process(visitor);
379
                } catch (VisitException e) {
380
                        throw new RuntimeException("No se espera que SelectByRectVisitor lance esta excepci?n",
381
                                e);
382
                }
383
        }
384

    
385
        /**
386
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectByShape(com.iver.cit.gvsig.fmap.fshape.IGeometry,
387
         *                 int)
388
         */
389
        public void selectByShape(IGeometry g, int relationship) {
390
        }
391

    
392
        /**
393
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByPoint(Point2D,
394
         *                 double)
395
         */
396
        public Record[] queryByPoint(Point2D p, double tolerance) {
397
                return null;
398
        }
399

    
400
        /**
401
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByRect(java.awt.geom.Rectangle2D)
402
         */
403
        public Record[] queryByRect(Rectangle2D rect) {
404
                return null;
405
        }
406

    
407
        /**
408
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByShape(com.iver.cit.gvsig.fmap.fshape.IGeometry,
409
         *                 int)
410
         */
411
        public Record[] queryByShape(IGeometry g, int relationship) {
412
                return null;
413
        }
414

    
415
        /**
416
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#getSelectionBounds()
417
         */
418
        public Rectangle2D getSelectionBounds() {
419
                SelectedZoomVisitor visitor = new SelectedZoomVisitor();
420
                
421
                        
422
                                try {
423
                                        layers.process(visitor);
424
                                } catch (DriverException e1) {
425
                                        throw new RuntimeException("No se espera que SelectByPointVisitor lance esta excepci?n",
426
                                                        e1);
427
                                } catch (VisitException e) {
428
                                        throw new RuntimeException("No se espera que SelectByPointVisitor lance esta excepci?n",
429
                                                        e);
430
                }
431
                
432
                return visitor.getSelectBound();
433
        }
434

    
435
        /**
436
         * @see com.iver.cit.gvsig.fmap.operations.LayerOperations#draw(java.awt.image.BufferedImage,
437
         *                 java.awt.Graphics2D, FStyle2D)
438
         */
439
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,double scale)
440
                throws DriverException {
441
                if (viewPort.getExtent() == null) {
442
                        // System.err.println("viewPort.getExtent() = null");
443
                        return;
444
                }
445

    
446
                // System.out.println("Viewport despues: " + viewPort); 
447
                /* if ((viewPort.getImageWidth() <=0) || (viewPort.getImageHeight() <= 0))
448
                   {
449
                           return;
450
                   } */
451
                // M?s c?lidad al texto
452
        RenderingHints renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, 
453
                RenderingHints.VALUE_ANTIALIAS_ON);
454
        renderHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
455
        renderHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
456
        g.setRenderingHints(renderHints);
457

    
458
                layers.draw(image, g, viewPort, cancel,scale);
459
        
460
        tracLayer.draw(image, g, viewPort, cancel, scale);
461

    
462
                /* g.setColor(Color.BLUE);
463
                   GeneralPath shpR = new GeneralPath(viewPort.getExtent());
464
                   shpR.transform(viewPort.getAffineTransform());
465
                   g.draw(shpR); */
466
                System.gc();
467
        }
468
    
469
    public void drawGraphics(BufferedImage image, Graphics2D g, Cancellable cancel,double scale) throws DriverException
470
    {
471
        if (viewPort == null) return;
472
        tracLayer.draw(image, g, viewPort, cancel, scale);
473
    }
474

    
475
        /**
476
         * @see com.iver.cit.gvsig.fmap.operations.LayerOperations#draw(java.awt.image.BufferedImage,
477
         *                 java.awt.Graphics2D, FStyle2D)
478
         */
479
        public void draw(BufferedImage image, Graphics2D g,double scale)
480
                throws DriverException {
481
                draw(image, g, new Cancellable() {
482
                                /**
483
                                 * @see com.iver.cit.gvsig.fmap.operations.Cancellable#isCanceled()
484
                                 */
485
                                public boolean isCanceled() {
486
                                        return false;
487
                                }
488
                        },scale);
489
        }
490

    
491
        /**
492
         * Devuelve el ViewPort.
493
         *
494
         * @return Returns the viewPort.
495
         */
496
        public ViewPort getViewPort() {
497
                return viewPort;
498
        }
499

    
500
        /**
501
         * Inserta un ViewPort.
502
         *
503
         * @param viewPort The viewPort to set.
504
         */
505
        public void setViewPort(ViewPort viewPort) {
506
                if (this.viewPort != null) {
507
                        this.viewPort.removeViewPortListener(eventBuffer);
508
                }
509

    
510
                this.viewPort = viewPort;
511
                viewPort.addViewPortListener(eventBuffer);
512
        }
513

    
514
        /**
515
         * M?todo de conveniencia. Recorre las capas y te da el fullExtent
516
         *
517
         * @return fullExtent de todas las capas.
518
         *
519
         * @throws DriverException
520
         */
521
        public Rectangle2D getFullExtent() throws DriverException {
522
                return layers.getFullExtent();
523
        }
524

    
525
        /**
526
         * Devuelve el XMLEntity.
527
         *
528
         * @return XMLEntity.
529
         * @throws XMLException
530
         */
531
        public XMLEntity getXMLEntity() throws XMLException {
532
                XMLEntity xml = new XMLEntity();
533
                xml.putProperty("className",this.getClass().getName());
534
                xml.addChild(viewPort.getXMLEntity());
535
                xml.addChild(layers.getXMLEntity());
536

    
537
                return xml;
538
        }
539

    
540
        /**
541
         * Crea un nuevo FMAp a partir del XMLEntity.
542
         *
543
         * @param xml XMLEntity
544
         *
545
         * @return Nuevo FMap.
546
         *
547
         * @throws XMLException
548
         */
549
        public static FMap createFromXML03(XMLEntity xml) throws XMLException {
550
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
551
                FMap fmap = new FMap(vp);
552
                fmap.layers.setXMLEntity03(xml.getChild(1));
553

    
554
                return fmap;
555
        }
556

    
557
        /**
558
         * Crea un nuevo FMAp a partir del XMLEntity.
559
         *
560
         * @param xml XMLEntity
561
         *
562
         * @return Nuevo FMap.
563
         *
564
         * @throws XMLException
565
         */
566
        public static FMap createFromXML(XMLEntity xml) throws XMLException {
567
                ViewPort vp = ViewPort.createFromXML(xml.getChild(0));
568
                FMap fmap = new FMap(vp);
569
                fmap.layers.setXMLEntity(xml.getChild(1));
570

    
571
                return fmap;
572
        }
573

    
574
        /**
575
         * A?ade un AtomicEventListener.
576
         *
577
         * @param listener AtomicEventListener.
578
         *
579
         * @return True si se ha a?adido correctamente.
580
         */
581
        public boolean addAtomicEventListener(AtomicEventListener listener) {
582
                return eventBuffer.addAtomicEventListener(listener);
583
        }
584

    
585
        /**
586
         * Borra un AtomicEventListener de la lista de listeners.
587
         *
588
         * @param listener AtomicEventListener a borrar.
589
         *
590
         * @return True si se ha borrado correctamente.
591
         */
592
        public boolean removeAtomicEventListener(AtomicEventListener listener) {
593
                return eventBuffer.removeAtomicEventListener(listener);
594
        }
595

    
596
        /**
597
         * Inicializa los AtomicEvent.
598
         */
599
        public void beginAtomicEvent() {
600
                eventBuffer.beginAtomicEvent();
601
        }
602

    
603
        /**
604
         * Finaliza los AtomicEvent.
605
         */
606
        public void endAtomicEvent() {
607
                eventBuffer.endAtomicEvent();
608
        }
609

    
610
        /**
611
         * Evento Layer.
612
         *
613
         * @author Fernando Gonz?lez Cort?s
614
         */
615
        public class LayerEventListener implements LayerCollectionListener {
616
                /**
617
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerAdded(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
618
                 */
619
                public void layerAdded(LayerCollectionEvent e) {
620
                        // Si es la primera capa, fijamos su extent al ViewPort
621
                        //if (getLayers().getLayersCount() == 1) {
622
                        if (getViewPort().getExtent() == null) {
623
                                FLayer lyr = e.getAffectedLayer();
624

    
625
                                try {
626
                                        getViewPort().setExtent(lyr.getFullExtent());
627
                                } catch (DriverException e1) {
628
                                }
629
                        }
630

    
631
                        //Registramos al FMap como listener del legend de las capas
632
                        FLayer lyr = e.getAffectedLayer();
633

    
634
                        lyr.addLayerListener(eventBuffer);
635

    
636
                        if (lyr instanceof Classifiable) {
637
                                Classifiable c = (Classifiable) lyr;
638
                                c.addLegendListener(eventBuffer);
639
                        }
640

    
641
                        if (lyr instanceof Selectable) {
642
                                Selectable s = (Selectable) lyr;
643
                                s.addSelectionListener(eventBuffer);
644
                        }
645
                }
646

    
647
                /**
648
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerMoved(com.iver.cit.gvsig.fmap.layers.LayerPositionEvent)
649
                 */
650
                public void layerMoved(LayerPositionEvent e) {
651
                }
652

    
653
                /**
654
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerRemoved(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
655
                 */
656
                public void layerRemoved(LayerCollectionEvent e) {
657
                        FLayer lyr = e.getAffectedLayer();
658

    
659
                        lyr.removeLayerListener(eventBuffer);
660

    
661
                        if (lyr instanceof Classifiable) {
662
                                Classifiable c = (Classifiable) lyr;
663
                                c.removeLegendListener(eventBuffer);
664
                        }
665

    
666
                        if (lyr instanceof Selectable) {
667
                                Selectable s = (Selectable) lyr;
668
                                s.addSelectionListener(eventBuffer);
669
                        }
670
                }
671

    
672
                /**
673
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerAdding(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
674
                 */
675
                public void layerAdding(LayerCollectionEvent e)
676
                        throws CancelationException {
677
                }
678

    
679
                /**
680
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerMoving(com.iver.cit.gvsig.fmap.layers.LayerPositionEvent)
681
                 */
682
                public void layerMoving(LayerPositionEvent e)
683
                        throws CancelationException {
684
                }
685

    
686
                /**
687
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerRemoving(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
688
                 */
689
                public void layerRemoving(LayerCollectionEvent e)
690
                        throws CancelationException {
691
                }
692

    
693
                /**
694
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#activationChanged(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
695
                 */
696
                public void activationChanged(LayerCollectionEvent e)
697
                        throws CancelationException {
698
                }
699

    
700
                /**
701
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#visibilityChanged(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
702
                 */
703
                public void visibilityChanged(LayerCollectionEvent e)
704
                        throws CancelationException {
705
                }
706
        }
707

    
708
        public void addAsCollectionListener(FLayers layers2) {
709
                layers2.addLayerCollectionListener(layerEventListener);
710
        }
711
    
712
    public GraphicLayer getGraphicsLayer()
713
    {
714
        return tracLayer;
715
    }
716
}