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 | } |