Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / FMap.java @ 4264

History | View | Annotate | Download (22.9 KB)

1 1100 fjp
/* 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 213 fernando
package com.iver.cit.gvsig.fmap;
42
43 2531 caballero
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 4264 fjp
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
56
57 305 fjp
import com.iver.cit.gvsig.fmap.core.IGeometry;
58 346 fernando
import com.iver.cit.gvsig.fmap.layers.CancelationException;
59 214 fernando
import com.iver.cit.gvsig.fmap.layers.FLayer;
60
import com.iver.cit.gvsig.fmap.layers.FLayers;
61 2901 fjp
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
62 342 fjp
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
63
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener;
64 3772 fjp
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent;
65
import com.iver.cit.gvsig.fmap.layers.LayerDrawingListener;
66 342 fjp
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
67 563 fernando
import com.iver.cit.gvsig.fmap.layers.LegendListener;
68 214 fernando
import com.iver.cit.gvsig.fmap.layers.VectorialAdapter;
69 487 vcaballero
import com.iver.cit.gvsig.fmap.layers.XMLException;
70 3963 caballero
import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData;
71 563 fernando
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
72 681 fernando
import com.iver.cit.gvsig.fmap.layers.layerOperations.Selectable;
73 244 fernando
import com.iver.cit.gvsig.fmap.operations.Cancellable;
74 214 fernando
import com.iver.cit.gvsig.fmap.operations.selection.Record;
75
import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor;
76 1086 vcaballero
import com.iver.cit.gvsig.fmap.operations.strategies.SelectedZoomVisitor;
77 926 fernando
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
78 3772 fjp
import com.iver.cit.gvsig.fmap.rendering.styling.FStyle2D;
79 415 fernando
import com.iver.utiles.XMLEntity;
80 213 fernando
81
/**
82 1034 vcaballero
 * Modelo del mapa.
83 3963 caballero
 *
84 213 fernando
 * @author Fernando Gonz?lez Cort?s
85
 */
86 350 fernando
public class FMap implements Projected {
87 3772 fjp
        public static final double[] CHANGEM = { 1000, 1, 0.01, 0.001, 1609.344,
88
                        0.9144, 0.3048, 0.0254 };
89
90
        public static final double[] CHANGE = { 100000, 100, 1, 0.1, 160934.4,
91
                        91.44, 30.48, 2.54 };
92
93 474 fjp
        public static final int EQUALS = 0;
94 3772 fjp
95 474 fjp
        public static final int DISJOINT = 1;
96 3772 fjp
97 474 fjp
        public static final int INTERSECTS = 2;
98 3772 fjp
99 474 fjp
        public static final int TOUCHES = 3;
100 3772 fjp
101 474 fjp
        public static final int CROSSES = 4;
102 3772 fjp
103 474 fjp
        public static final int WITHIN = 5;
104 3772 fjp
105 474 fjp
        public static final int CONTAINS = 6;
106 3772 fjp
107 474 fjp
        public static final int OVERLAPS = 7;
108 3772 fjp
109 690 fernando
        private FLayers layers = new FLayers(this, null);
110 3772 fjp
111
        private GraphicLayer tracLayer = new GraphicLayer();
112
113 474 fjp
        private ViewPort viewPort;
114 3772 fjp
115
        // private ArrayList invalidationListeners = new ArrayList();
116 2408 caballero
        private ArrayList legendListeners = new ArrayList();
117 3772 fjp
118
        private ArrayList layerDrawingListeners = new ArrayList();
119
120 681 fernando
        private EventBuffer eventBuffer = new EventBuffer();
121 213 fernando
122 3772 fjp
        private LayerEventListener layerEventListener = null;
123
124
        private ArrayList layersError = new ArrayList();
125
126
        private ArrayList errorListeners = new ArrayList();
127
128
        // public static ResourceBundle myResourceBundle =
129
        // ResourceBundle.getBundle("FMap");
130
131 474 fjp
        /**
132
         * Crea un nuevo FMap.
133 3963 caballero
         *
134 3772 fjp
         * @param vp
135
         *            ViewPort.
136 474 fjp
         */
137
        public FMap(ViewPort vp) {
138
                this.viewPort = vp;
139 3772 fjp
                layerEventListener = new LayerEventListener();
140 2608 caballero
                layers.addLayerCollectionListener(layerEventListener);
141 681 fernando
                layers.addLayerCollectionListener(eventBuffer);
142 1034 vcaballero
143
                if (viewPort != null) {
144 1197 fernando
                        viewPort.addViewPortListener(eventBuffer);
145 1034 vcaballero
                }
146 474 fjp
        }
147 1034 vcaballero
148
        /**
149
         * A?ade un LegendListener.
150 3963 caballero
         *
151 3772 fjp
         * @param listener
152
         *            LegendListener a a?adir.
153 476 fernando
         */
154 563 fernando
        public void addLayerListener(LegendListener listener) {
155 3772 fjp
                legendListeners.add(listener);
156 476 fernando
        }
157
158 3772 fjp
        public void addLayerDrawingListener(LayerDrawingListener listener) {
159
                layerDrawingListeners.add(listener);
160
        }
161 3490 jaume
162 3772 fjp
        public void removeLayerDrawListener(LayerDrawingListener listener) {
163
                layerDrawingListeners.remove(listener);
164
        }
165
166
        public void addErrorListener(ErrorListener listener) {
167
                errorListeners.add(listener);
168
        }
169
170
        public void removeErrorListener(LegendListener listener) {
171
                legendListeners.remove(listener);
172
        }
173
174 476 fernando
        /**
175 1034 vcaballero
         * M?todo ejecutado cuando hay un cambio de leyenda que se quiera reflejar.
176 3963 caballero
         *
177 3772 fjp
         * @param e
178
         *            LegendChangedEvent.
179 476 fernando
         */
180 2531 caballero
        public synchronized void callLegendChanged() {
181 3772 fjp
                for (int i = 0; i < legendListeners.size(); i++) {
182
                        ((LegendListener) legendListeners.get(i)).legendChanged(null);
183 2408 caballero
                }
184 3772 fjp
                // getLayers().moveTo(0,0);
185 476 fernando
        }
186
187 3772 fjp
        public synchronized void fireLayerDrawingEvent(LayerDrawEvent e) {
188
                for (int i = 0; i < layerDrawingListeners.size(); i++)
189
                {
190
                        LayerDrawingListener listener = (LayerDrawingListener) layerDrawingListeners.get(i);
191
                        switch (e.getEventType())
192
                        {
193
                                case LayerDrawEvent.LAYER_BEFORE_DRAW:
194
                                        listener.beforeLayerDraw(e);
195
                                        break;
196
                                case LayerDrawEvent.LAYER_AFTER_DRAW:
197
                                        listener.afterLayerDraw(e);
198
                                        break;
199
                                case LayerDrawEvent.GRAPHICLAYER_BEFORE_DRAW:
200
                                        listener.beforeGraphicLayerDraw(e);
201
                                        break;
202
                                case LayerDrawEvent.GRAPHICLAYER_AFTER_DRAW:
203
                                        listener.afterLayerGraphicDraw(e);
204 3963 caballero
                                        break;
205 3772 fjp
                        }
206
                }
207
                // getLayers().moveTo(0,0);
208
        }
209 3490 jaume
210 3772 fjp
        public synchronized void callNewErrorEvent(ErrorEvent e) {
211
                for (int i = 0; i < errorListeners.size(); i++) {
212
                        ((ErrorListener) errorListeners.get(i)).errorThrown(e);
213
                }
214
                // getLayers().moveTo(0,0);
215
        }
216
217 476 fernando
        /**
218 1034 vcaballero
         * Borra un LegendListener.
219 3963 caballero
         *
220 3772 fjp
         * @param listener
221
         *            LegendListener a borrar.
222 476 fernando
         */
223 563 fernando
        public void removeLayerListener(LegendListener listener) {
224 3772 fjp
                legendListeners.remove(listener);
225 476 fernando
        }
226
227
        /**
228 1034 vcaballero
         * Devuelve las capas que contiene el mapa.
229 3963 caballero
         *
230 1034 vcaballero
         * @return Capas.
231 474 fjp
         */
232
        public FLayers getLayers() {
233
                return layers;
234
        }
235 213 fernando
236 474 fjp
        /**
237
         * Dibuja en la imagen que se pasa como par?metro el contenido de las capas
238
         * visibles del mapa y teniendo en cuenta los datos del ViewPort contenido
239
         * en este FMap
240 3963 caballero
         *
241 3772 fjp
         * @param b
242
         *            Imagen.
243 474 fjp
         */
244
        public void drawLabels(BufferedImage b) {
245
        }
246 213 fernando
247 474 fjp
        /**
248 3772 fjp
         * M?todo de conveniencia que se usa provisionalmente para solicitar un
249
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar? un
250
         * evento de cambio de orden de capas que obligar? a redibujar todo lo que
251 1096 fjp
         * depende de FMap (TOC, MapControl, FFrameView, etc).
252
         */
253 3772 fjp
        public void invalidate() {
254
                getLayers().moveTo(0, 0);
255 1096 fjp
        }
256 3772 fjp
257 1096 fjp
        /**
258 3772 fjp
         * Imprime el las capas que contiene el FMap sobre el Graphics2D que se pasa
259
         * como par?metro, normalmente es el Graphics de la impresora.
260 3963 caballero
         *
261 3772 fjp
         * @param g
262
         *            Graphics2D
263 3963 caballero
         *
264 474 fjp
         * @throws DriverException
265
         */
266 3772 fjp
        public void print(Graphics2D g, double scale) throws DriverException {
267
                RenderingHints renderHints = new RenderingHints(
268
                                RenderingHints.KEY_ANTIALIASING,
269
                                RenderingHints.VALUE_ANTIALIAS_ON);
270
                renderHints.put(RenderingHints.KEY_RENDERING,
271
                                RenderingHints.VALUE_RENDER_QUALITY);
272
                g.setRenderingHints(renderHints);
273
274
                Cancellable cancel = new Cancellable() {
275
                        public boolean isCanceled() {
276
                                return false;
277
                        }
278
                };
279
                layers.print(g, viewPort, cancel, scale);
280
                tracLayer.draw(null, g, viewPort, cancel, scale);
281 474 fjp
        }
282 213 fernando
283 474 fjp
        /**
284
         * Crea un nuevo FMap con la informaci?n del ViewPort que se pasa como
285
         * par?metro.
286 3963 caballero
         *
287 3772 fjp
         * @param vp
288
         *            ViewPort.
289 3963 caballero
         *
290 1034 vcaballero
         * @return FMap nuevo.
291 474 fjp
         */
292
        public FMap createNewFMap(ViewPort vp) {
293
                FMap ret = new FMap(vp);
294
                ret.layers = this.layers;
295 213 fernando
296 474 fjp
                return ret;
297
        }
298 213 fernando
299 474 fjp
        /**
300
         * Crea un nuevo FMap totalmente desligado, se replican las capas y el
301
         * ViewPort
302 3963 caballero
         *
303 1034 vcaballero
         * @return FMap clonado.
304 3963 caballero
         *
305 1034 vcaballero
         * @throws XMLException
306 474 fjp
         */
307 1056 vcaballero
        public FMap cloneFMap() throws XMLException {
308 797 vcaballero
                return createFromXML(getXMLEntity());
309 474 fjp
        }
310 213 fernando
311 474 fjp
        /**
312
         * A?ade la capa que se pasa como par?metro al nodo que se pasa como
313 3772 fjp
         * parametro y lanza ProjectionMismatchException si no est?n todas las capas
314
         * de este FMap en la misma proyecci?n. Lanza un ChildNotAllowedException si
315
         * la capa no es un FLayers y no permite hijos
316 3963 caballero
         *
317 3772 fjp
         * @param vectorial
318
         *            DOCUMENT ME!
319 474 fjp
         */
320 473 fjp
321 3772 fjp
        /*
322
         * public void addLayer(LayerPath parent, FLayer layer) throws
323
         * ProjectionMismatchException, ChildrenNotAllowedException {
324
         * layers.addLayer(parent, layer); } public void removeLayer(LayerPath
325
         * parent)throws ChildrenNotAllowedException{ layers.removeLayer(parent); }
326 474 fjp
         */
327 473 fjp
328 474 fjp
        /**
329
         * A?ade una capa al grupo de capas que se sit?a por encima de todas las
330
         * otras capas
331 3963 caballero
         *
332 3772 fjp
         * @param vectorial
333
         *            FLayer.
334 474 fjp
         */
335 563 fernando
        public void addToTrackLayer(FLayer vectorial) {
336 474 fjp
        }
337 473 fjp
338 474 fjp
        /**
339 1034 vcaballero
         * Devuelve la escala de la vista en pantalla.
340 3963 caballero
         *
341 1034 vcaballero
         * @return escala de la vista.
342 474 fjp
         */
343
        public long getScaleView() {
344 3772 fjp
                // TODO falta implementar un di?logo para poder especificar el usuario
345
                // los pixels exactos de su pantalla.
346 474 fjp
                Toolkit kit = Toolkit.getDefaultToolkit();
347
                double dpi = kit.getScreenResolution();
348
                IProjection proj = viewPort.getProjection();
349 3772 fjp
350 1186 fjp
                if (viewPort.getImageSize() == null)
351 3772 fjp
                        return -1;
352 213 fernando
353 474 fjp
                double w = ((viewPort.getImageSize().getWidth() / dpi) * 2.54);
354 214 fernando
355 474 fjp
                if (viewPort.getAdjustedExtent() == null) {
356
                        return 0;
357
                }
358 214 fernando
359 474 fjp
                if (proj == null) {
360
                        return (long) (viewPort.getAdjustedExtent().getWidth() / w * CHANGE[getViewPort()
361 3772 fjp
                                        .getMapUnits()]);
362 474 fjp
                }
363 473 fjp
364 474 fjp
                return (long) proj.getScale(viewPort.getAdjustedExtent().getMinX(),
365 3772 fjp
                                viewPort.getAdjustedExtent().getMaxX(), viewPort.getImageSize()
366
                                                .getWidth(), dpi);
367 474 fjp
        }
368 214 fernando
369 474 fjp
        /**
370
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#setVectorial(com.iver.cit.gvsig.fmap.VectorialAdapter)
371
         */
372
        public void setVectorial(VectorialAdapter v) {
373
        }
374 213 fernando
375 474 fjp
        /**
376 1056 vcaballero
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#process(com.iver.cit.gvsig.fmap.FeatureSelectorVisitor)
377 474 fjp
         */
378
        public void process(FeatureVisitor visitor) {
379
        }
380 213 fernando
381 474 fjp
        /**
382
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#processSelected(com.iver.cit.gvsig.fmap.FeatureVisitor)
383
         */
384
        public void processSelected(FeatureVisitor visitor) {
385
        }
386 213 fernando
387 474 fjp
        /**
388
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#select(com.iver.cit.gvsig.fmap.FeatureSelectorVisitor,
389 3772 fjp
         *      VectorialSubSet)
390 474 fjp
         */
391
        public void select(FeatureVisitor visitor) {
392
        }
393 213 fernando
394 474 fjp
        /**
395
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectFromSelection()
396
         */
397
        public void selectFromSelection() {
398
        }
399 213 fernando
400 474 fjp
        /**
401
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#createIndex()
402
         */
403
        public void createIndex() {
404
        }
405 213 fernando
406 474 fjp
        /**
407
         * @see org.cresques.geo.Projected#getProjection()
408
         */
409
        public IProjection getProjection() {
410 885 fjp
                return getViewPort().getProjection();
411 474 fjp
        }
412 1034 vcaballero
413
        /**
414
         * Inserta la proyecci?n.
415 3963 caballero
         *
416 3772 fjp
         * @param proj
417
         *            Proyecci?n.
418 1034 vcaballero
         */
419
        public void setProjection(IProjection proj) {
420 885 fjp
                getViewPort().setProjection(proj);
421
        }
422 213 fernando
423 474 fjp
        /**
424
         * @see org.cresques.geo.Projected#reProject(org.cresques.cts.ICoordTrans)
425
         */
426
        public void reProject(ICoordTrans arg0) {
427 885 fjp
                // TODO implementar reprojecci?n (lo que sea eso)
428 474 fjp
        }
429 213 fernando
430 474 fjp
        /**
431
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectByPoint(java.awt.geom.Point2D,
432 3772 fjp
         *      double)
433 474 fjp
         */
434 3772 fjp
        /*
435
         * public void selectByPoint(Point2D p, double tolerance) throws
436
         * DriverException { Point2D mapPoint = viewPort.toMapPoint((int) p.getX(),
437
         * (int) p.getY()); SelectByPointVisitor visitor = new
438
         * SelectByPointVisitor(); visitor.setQueriedPoint(mapPoint);
439
         * visitor.setTolerance(getViewPort().toMapDistance(3));
440 3963 caballero
         *
441 3772 fjp
         * try { layers.process(visitor); } catch (VisitException e) { throw new
442
         * RuntimeException("No se espera que SelectByPointVisitor lance esta
443
         * excepci?n", e); } }
444
         */
445 1034 vcaballero
446 474 fjp
        /**
447
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectByRect(java.awt.geom.Rectangle2D)
448
         */
449 3772 fjp
        /*
450
         * public void selectByRect(Rectangle2D rect) throws DriverException {
451
         * FLayer[] actives = layers.getActives(); for (int i=0; i < actives.length;
452
         * i++) { if (actives[i] instanceof FLyrVect) { FLyrVect lyrVect =
453
         * (FLyrVect) actives[i]; FBitSet oldBitSet = lyrVect.getSelection();
454
         * FBitSet newBitSet = lyrVect.queryByRect(rect); newBitSet.xor(oldBitSet);
455
         * lyrVect.setSelection(newBitSet); } }
456
         *  }
457
         */
458 3128 fjp
459 474 fjp
        /**
460
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#selectByShape(com.iver.cit.gvsig.fmap.fshape.IGeometry,
461 3772 fjp
         *      int)
462 474 fjp
         */
463
        public void selectByShape(IGeometry g, int relationship) {
464
        }
465 213 fernando
466 474 fjp
        /**
467 993 fernando
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByPoint(Point2D,
468 3772 fjp
         *      double)
469 474 fjp
         */
470
        public Record[] queryByPoint(Point2D p, double tolerance) {
471
                return null;
472
        }
473 213 fernando
474 474 fjp
        /**
475
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByRect(java.awt.geom.Rectangle2D)
476
         */
477
        public Record[] queryByRect(Rectangle2D rect) {
478
                return null;
479
        }
480 213 fernando
481 474 fjp
        /**
482
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByShape(com.iver.cit.gvsig.fmap.fshape.IGeometry,
483 3772 fjp
         *      int)
484 474 fjp
         */
485
        public Record[] queryByShape(IGeometry g, int relationship) {
486
                return null;
487
        }
488 213 fernando
489 474 fjp
        /**
490
         * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#getSelectionBounds()
491
         */
492
        public Rectangle2D getSelectionBounds() {
493 1086 vcaballero
                SelectedZoomVisitor visitor = new SelectedZoomVisitor();
494 3772 fjp
495
                try {
496
                        layers.process(visitor);
497
                } catch (DriverException e1) {
498
                        throw new RuntimeException(
499
                                        "No se espera que SelectByPointVisitor lance esta excepci?n",
500
                                        e1);
501
                } catch (VisitException e) {
502
                        throw new RuntimeException(
503
                                        "No se espera que SelectByPointVisitor lance esta excepci?n",
504
                                        e);
505 1086 vcaballero
                }
506 3772 fjp
507 1086 vcaballero
                return visitor.getSelectBound();
508 474 fjp
        }
509 213 fernando
510 474 fjp
        /**
511
         * @see com.iver.cit.gvsig.fmap.operations.LayerOperations#draw(java.awt.image.BufferedImage,
512 3772 fjp
         *      java.awt.Graphics2D, FStyle2D)
513 474 fjp
         */
514 3772 fjp
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
515
                        double scale) throws DriverException {
516 474 fjp
                if (viewPort.getExtent() == null) {
517 980 fjp
                        // System.err.println("viewPort.getExtent() = null");
518 474 fjp
                        return;
519
                }
520 3772 fjp
                System.out.println("Viewport despues: " + viewPort.toString());
521
                /*
522
                 * if ((viewPort.getImageWidth() <=0) || (viewPort.getImageHeight() <=
523
                 * 0)) { return; }
524
                 */
525 806 fjp
                // M?s c?lidad al texto
526 3772 fjp
                RenderingHints renderHints = new RenderingHints(
527
                                RenderingHints.KEY_ANTIALIASING,
528
                                RenderingHints.VALUE_ANTIALIAS_ON);
529
                renderHints.put(RenderingHints.KEY_RENDERING,
530
                                RenderingHints.VALUE_RENDER_QUALITY);
531
                renderHints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
532
                                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
533
                g.setRenderingHints(renderHints);
534 244 fernando
535 3772 fjp
                long t1 = System.currentTimeMillis();
536
                layers.draw(image, g, viewPort, cancel, scale);
537
538
                LayerDrawEvent beforeTracLayerEvent = new LayerDrawEvent(tracLayer,
539
                                g, viewPort, LayerDrawEvent.GRAPHICLAYER_BEFORE_DRAW);
540
                fireLayerDrawingEvent(beforeTracLayerEvent);
541
                tracLayer.draw(image, g, viewPort, cancel, scale);
542
                LayerDrawEvent afterTracLayerEvent = new LayerDrawEvent(tracLayer,
543
                                g, viewPort, LayerDrawEvent.GRAPHICLAYER_AFTER_DRAW);
544
                fireLayerDrawingEvent(afterTracLayerEvent);
545 3963 caballero
546 3772 fjp
                long t2 = System.currentTimeMillis();
547 4264 fjp
                System.err.println("Tiempo de dibujado:" + (t2 - t1) +
548
                                " mseg. Memoria libre:" + Runtime.getRuntime().freeMemory() / 1024  + " KB");
549 3772 fjp
                /*
550
                 * g.setColor(Color.BLUE); GeneralPath shpR = new
551
                 * GeneralPath(viewPort.getExtent());
552
                 * shpR.transform(viewPort.getAffineTransform()); g.draw(shpR);
553
                 */
554 1239 fernando
                System.gc();
555 474 fjp
        }
556 244 fernando
557 3772 fjp
        public void drawGraphics(BufferedImage image, Graphics2D g,
558
                        Cancellable cancel, double scale) throws DriverException {
559
                if (viewPort == null)
560
                        return;
561
                tracLayer.draw(image, g, viewPort, cancel, scale);
562
        }
563
564 474 fjp
        /**
565
         * @see com.iver.cit.gvsig.fmap.operations.LayerOperations#draw(java.awt.image.BufferedImage,
566 3772 fjp
         *      java.awt.Graphics2D, FStyle2D)
567 474 fjp
         */
568 3772 fjp
        public void draw(BufferedImage image, Graphics2D g, double scale)
569
                        throws DriverException {
570 1239 fernando
                draw(image, g, new Cancellable() {
571 3772 fjp
                        /**
572
                         * @see com.iver.cit.gvsig.fmap.operations.Cancellable#isCanceled()
573
                         */
574
                        public boolean isCanceled() {
575
                                return false;
576
                        }
577
                }, scale);
578 474 fjp
        }
579 342 fjp
580 474 fjp
        /**
581 1034 vcaballero
         * Devuelve el ViewPort.
582 3963 caballero
         *
583 474 fjp
         * @return Returns the viewPort.
584
         */
585
        public ViewPort getViewPort() {
586
                return viewPort;
587
        }
588 350 fernando
589 474 fjp
        /**
590 1034 vcaballero
         * Inserta un ViewPort.
591 3963 caballero
         *
592 3772 fjp
         * @param viewPort
593
         *            The viewPort to set.
594 474 fjp
         */
595
        public void setViewPort(ViewPort viewPort) {
596 1034 vcaballero
                if (this.viewPort != null) {
597 1197 fernando
                        this.viewPort.removeViewPortListener(eventBuffer);
598 1034 vcaballero
                }
599
600 474 fjp
                this.viewPort = viewPort;
601 1197 fernando
                viewPort.addViewPortListener(eventBuffer);
602 474 fjp
        }
603 342 fjp
604 474 fjp
        /**
605
         * M?todo de conveniencia. Recorre las capas y te da el fullExtent
606 3963 caballero
         *
607 474 fjp
         * @return fullExtent de todas las capas.
608 3963 caballero
         *
609 1034 vcaballero
         * @throws DriverException
610 474 fjp
         */
611 652 fernando
        public Rectangle2D getFullExtent() throws DriverException {
612 474 fjp
                return layers.getFullExtent();
613
        }
614 342 fjp
615 474 fjp
        /**
616 1034 vcaballero
         * Devuelve el XMLEntity.
617 3963 caballero
         *
618 1034 vcaballero
         * @return XMLEntity.
619 1828 fernando
         * @throws XMLException
620 474 fjp
         */
621 1828 fernando
        public XMLEntity getXMLEntity() throws XMLException {
622 474 fjp
                XMLEntity xml = new XMLEntity();
623 3772 fjp
                xml.putProperty("className", this.getClass().getName());
624 474 fjp
                xml.addChild(viewPort.getXMLEntity());
625
                xml.addChild(layers.getXMLEntity());
626 342 fjp
627 474 fjp
                return xml;
628
        }
629 342 fjp
630 474 fjp
        /**
631 1034 vcaballero
         * Crea un nuevo FMAp a partir del XMLEntity.
632 3963 caballero
         *
633 3772 fjp
         * @param xml
634
         *            XMLEntity
635 3963 caballero
         *
636 1034 vcaballero
         * @return Nuevo FMap.
637 3963 caballero
         *
638 1034 vcaballero
         * @throws XMLException
639 474 fjp
         */
640 2183 fernando
        public static FMap createFromXML03(XMLEntity xml) throws XMLException {
641
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
642
                FMap fmap = new FMap(vp);
643
                fmap.layers.setXMLEntity03(xml.getChild(1));
644
645
                return fmap;
646
        }
647
648
        /**
649
         * Crea un nuevo FMAp a partir del XMLEntity.
650 3963 caballero
         *
651 3772 fjp
         * @param xml
652
         *            XMLEntity
653 3963 caballero
         *
654 2183 fernando
         * @return Nuevo FMap.
655 3963 caballero
         *
656 2183 fernando
         * @throws XMLException
657
         */
658 3772 fjp
        public static FMap createFromXML(XMLEntity xml) throws XMLException {
659 474 fjp
                ViewPort vp = ViewPort.createFromXML(xml.getChild(0));
660
                FMap fmap = new FMap(vp);
661 894 vcaballero
                fmap.layers.setXMLEntity(xml.getChild(1));
662 1034 vcaballero
663 474 fjp
                return fmap;
664
        }
665 476 fernando
666
        /**
667 1034 vcaballero
         * A?ade un AtomicEventListener.
668 3963 caballero
         *
669 3772 fjp
         * @param listener
670
         *            AtomicEventListener.
671 3963 caballero
         *
672 1034 vcaballero
         * @return True si se ha a?adido correctamente.
673
         */
674
        public boolean addAtomicEventListener(AtomicEventListener listener) {
675
                return eventBuffer.addAtomicEventListener(listener);
676
        }
677
678
        /**
679
         * Borra un AtomicEventListener de la lista de listeners.
680 3963 caballero
         *
681 3772 fjp
         * @param listener
682
         *            AtomicEventListener a borrar.
683 3963 caballero
         *
684 1034 vcaballero
         * @return True si se ha borrado correctamente.
685
         */
686
        public boolean removeAtomicEventListener(AtomicEventListener listener) {
687
                return eventBuffer.removeAtomicEventListener(listener);
688
        }
689
690
        /**
691
         * Inicializa los AtomicEvent.
692
         */
693
        public void beginAtomicEvent() {
694
                eventBuffer.beginAtomicEvent();
695
        }
696
697
        /**
698
         * Finaliza los AtomicEvent.
699
         */
700
        public void endAtomicEvent() {
701
                eventBuffer.endAtomicEvent();
702
        }
703
704
        /**
705
         * Evento Layer.
706 3963 caballero
         *
707 490 fernando
         * @author Fernando Gonz?lez Cort?s
708 474 fjp
         */
709 476 fernando
        public class LayerEventListener implements LayerCollectionListener {
710
                /**
711 474 fjp
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerAdded(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
712
                 */
713
                public void layerAdded(LayerCollectionEvent e) {
714
                        // Si es la primera capa, fijamos su extent al ViewPort
715 3772 fjp
                        // if (getLayers().getLayersCount() == 1) {
716 1034 vcaballero
                        if (getViewPort().getExtent() == null) {
717
                                FLayer lyr = e.getAffectedLayer();
718 473 fjp
719 474 fjp
                                try {
720
                                        getViewPort().setExtent(lyr.getFullExtent());
721 652 fernando
                                } catch (DriverException e1) {
722 474 fjp
                                }
723
                        }
724 476 fernando
725 3772 fjp
                        // Registramos al FMap como listener del legend de las capas
726 476 fernando
                        FLayer lyr = e.getAffectedLayer();
727 1034 vcaballero
728 727 fernando
                        lyr.addLayerListener(eventBuffer);
729 1034 vcaballero
730 563 fernando
                        if (lyr instanceof Classifiable) {
731
                                Classifiable c = (Classifiable) lyr;
732 681 fernando
                                c.addLegendListener(eventBuffer);
733 476 fernando
                        }
734 1034 vcaballero
735 3963 caballero
                        if (lyr instanceof AlphanumericData) {
736
                                Selectable s=null;
737
                                try {
738
                                        s = ((AlphanumericData) lyr).getRecordset();
739
                                } catch (DriverException e1) {
740
                                        // TODO Auto-generated catch block
741
                                        e1.printStackTrace();
742
                                }
743 681 fernando
                                s.addSelectionListener(eventBuffer);
744
                        }
745 474 fjp
                }
746 473 fjp
747 474 fjp
                /**
748
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerMoved(com.iver.cit.gvsig.fmap.layers.LayerPositionEvent)
749
                 */
750
                public void layerMoved(LayerPositionEvent e) {
751
                }
752 473 fjp
753 474 fjp
                /**
754
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerRemoved(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
755
                 */
756
                public void layerRemoved(LayerCollectionEvent e) {
757 476 fernando
                        FLayer lyr = e.getAffectedLayer();
758
759 727 fernando
                        lyr.removeLayerListener(eventBuffer);
760 1034 vcaballero
761 563 fernando
                        if (lyr instanceof Classifiable) {
762
                                Classifiable c = (Classifiable) lyr;
763 681 fernando
                                c.removeLegendListener(eventBuffer);
764 476 fernando
                        }
765 681 fernando
766
                        if (lyr instanceof Selectable) {
767
                                Selectable s = (Selectable) lyr;
768
                                s.addSelectionListener(eventBuffer);
769
                        }
770 474 fjp
                }
771 473 fjp
772 474 fjp
                /**
773
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerAdding(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
774
                 */
775
                public void layerAdding(LayerCollectionEvent e)
776 3772 fjp
                                throws CancelationException {
777 474 fjp
                }
778 473 fjp
779 474 fjp
                /**
780
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerMoving(com.iver.cit.gvsig.fmap.layers.LayerPositionEvent)
781
                 */
782
                public void layerMoving(LayerPositionEvent e)
783 3772 fjp
                                throws CancelationException {
784 474 fjp
                }
785 473 fjp
786 474 fjp
                /**
787
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#layerRemoving(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
788
                 */
789
                public void layerRemoving(LayerCollectionEvent e)
790 3772 fjp
                                throws CancelationException {
791 474 fjp
                }
792 473 fjp
793 474 fjp
                /**
794
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#activationChanged(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
795
                 */
796
                public void activationChanged(LayerCollectionEvent e)
797 3772 fjp
                                throws CancelationException {
798 474 fjp
                }
799 473 fjp
800 474 fjp
                /**
801
                 * @see com.iver.cit.gvsig.fmap.layers.LayerCollectionListener#visibilityChanged(com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent)
802
                 */
803
                public void visibilityChanged(LayerCollectionEvent e)
804 3772 fjp
                                throws CancelationException {
805 474 fjp
                }
806
        }
807 2608 caballero
808
        public void addAsCollectionListener(FLayers layers2) {
809
                layers2.addLayerCollectionListener(layerEventListener);
810
        }
811 3240 caballero
812 3772 fjp
        public GraphicLayer getGraphicsLayer() {
813
                return tracLayer;
814
        }
815
816 3240 caballero
        public boolean equals(Object arg0) {
817 3772 fjp
                FMap map = (FMap) arg0;
818
                if (super.equals(arg0))
819
                        return true;
820
                if (getLayers() == map.getLayers())
821
                        return true;
822
                boolean isEqual = true;
823
                if (map.getLayers().getLayersCount() == getLayers().getLayersCount()) {
824
                        for (int i = 0; i < getLayers().getLayersCount(); i++) {
825
826
                                if (!getLayers().getLayer(i).getName().equals(
827
                                                map.getLayers().getLayer(i).getName())) {
828
                                        isEqual = false;
829 3240 caballero
                                }
830 3772 fjp
831
                        }
832
                } else {
833
                        isEqual = false;
834 3240 caballero
                }
835
                return isEqual;
836
        }
837 3481 caballero
838
        public void addLayerError(String stringProperty) {
839
                layersError.add(stringProperty);
840
        }
841 3772 fjp
842
        public ArrayList getLayersError() {
843 3481 caballero
                return layersError;
844
        }
845 3772 fjp
846
        public void clearErrors() {
847 3491 jaume
                layersError.clear();
848
        }
849 213 fernando
}