Statistics
| Revision:

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

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