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