root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / layers / FLayers.java @ 472
History | View | Annotate | Download (12.5 KB)
1 | 214 | fernando | package com.iver.cit.gvsig.fmap.layers; |
---|---|---|---|
2 | |||
3 | 387 | fjp | import java.awt.Graphics2D; |
4 | import java.awt.geom.Rectangle2D; |
||
5 | import java.awt.image.BufferedImage; |
||
6 | 442 | vcaballero | import java.io.File; |
7 | 387 | fjp | import java.util.ArrayList; |
8 | import java.util.Iterator; |
||
9 | |||
10 | 442 | vcaballero | import com.hardcode.driverManager.DriverLoadException; |
11 | 470 | fjp | import com.hardcode.gdbms.engine.data.DriverException; |
12 | 287 | vcaballero | import com.iver.cit.gvsig.fmap.ViewPort; |
13 | 305 | fjp | import com.iver.cit.gvsig.fmap.core.IGeometry; |
14 | 287 | vcaballero | import com.iver.cit.gvsig.fmap.drivers.DriverIOException; |
15 | import com.iver.cit.gvsig.fmap.operations.Cancellable; |
||
16 | import com.iver.cit.gvsig.fmap.operations.QueriedPoint; |
||
17 | 415 | fernando | import com.iver.utiles.XMLEntity; |
18 | 214 | fernando | |
19 | 353 | fernando | |
20 | 214 | fernando | /**
|
21 | * Representa un nodo interno en el ?rbol de capas
|
||
22 | */
|
||
23 | 228 | fernando | public class FLayers extends FLyrDefault implements FLayer { |
24 | 247 | vcaballero | //ArrayList de Listener registrados.
|
25 | 257 | vcaballero | private ArrayList layerListeners = new ArrayList(); |
26 | 242 | vcaballero | private ArrayList layers = new ArrayList(4); |
27 | 214 | fernando | |
28 | 257 | vcaballero | /**
|
29 | * Crea un nuevo FLayers.
|
||
30 | */
|
||
31 | public FLayers() {
|
||
32 | 387 | fjp | setParentLayer(this);
|
33 | 247 | vcaballero | } |
34 | 257 | vcaballero | |
35 | 242 | vcaballero | /**
|
36 | * A?ade un listener de los eventos de la colecci?n de capas
|
||
37 | *
|
||
38 | * @param listener DOCUMENT ME!
|
||
39 | */
|
||
40 | public void addLayerCollectionListener(LayerCollectionListener listener) { |
||
41 | 257 | vcaballero | layerListeners.add(listener); |
42 | 242 | vcaballero | } |
43 | 214 | fernando | |
44 | 405 | fjp | /* (non-Javadoc) Funci?n sobrecargada
|
45 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#setActive(boolean)
|
||
46 | */
|
||
47 | public void setActive(boolean bActive) |
||
48 | { |
||
49 | FLayer lyr; |
||
50 | for (int i = 0; i < layers.size(); i++) |
||
51 | { |
||
52 | lyr = ((FLayer) layers.get(i)); |
||
53 | lyr.setActive(bActive); |
||
54 | } |
||
55 | } |
||
56 | 242 | vcaballero | /**
|
57 | * ELimina un listener de los eventos de la colecci?n de capas
|
||
58 | *
|
||
59 | * @param listener DOCUMENT ME!
|
||
60 | */
|
||
61 | public void removeLayerCollectionListener(LayerCollectionListener listener) { |
||
62 | 257 | vcaballero | layerListeners.remove(listener); |
63 | 242 | vcaballero | } |
64 | 214 | fernando | |
65 | 387 | fjp | private void doAddLayer(FLayer layer){ |
66 | 353 | fernando | layers.add(layer); |
67 | } |
||
68 | |||
69 | 242 | vcaballero | /**
|
70 | 387 | fjp | * A?ade una capa al final de la lista de subcapas
|
71 | * @throws CancelationException
|
||
72 | 242 | vcaballero | *
|
73 | 346 | fernando | * @throws CancelationException
|
74 | 242 | vcaballero | */
|
75 | 387 | fjp | public void addLayer(FLayer layer) throws CancelationException |
76 | { |
||
77 | 353 | fernando | LayerCollectionEvent event = new LayerCollectionEvent(layer);
|
78 | 346 | fernando | |
79 | 353 | fernando | callLayerAdding(event); |
80 | |||
81 | 387 | fjp | doAddLayer(layer); |
82 | 353 | fernando | |
83 | callLayerAdded(event); |
||
84 | |||
85 | 242 | vcaballero | } |
86 | 214 | fernando | |
87 | 242 | vcaballero | /**
|
88 | * Mueve una capa de la posici?n from a la posici?n to.
|
||
89 | 387 | fjp | * (Se supone que est?n dentro del mismo nivel). Para mover
|
90 | * entre niveles, usar otro m?todo (por hacer)
|
||
91 | 242 | vcaballero | *
|
92 | * @param from DOCUMENT ME!
|
||
93 | * @param to DOCUMENT ME!
|
||
94 | 346 | fernando | *
|
95 | * @throws CancelationException
|
||
96 | 242 | vcaballero | */
|
97 | 387 | fjp | public void moveTo(int from, int to) |
98 | throws CancelationException {
|
||
99 | FLayer aux = (FLayer) layers.get(from); |
||
100 | LayerPositionEvent event = new LayerPositionEvent(aux, from, to);
|
||
101 | 353 | fernando | callLayerMoving(event); |
102 | 387 | fjp | layers.remove(from); |
103 | layers.add(to, aux); |
||
104 | 353 | fernando | callLayerMoved(event); |
105 | } |
||
106 | 270 | vcaballero | |
107 | 387 | fjp | private void doRemoveLayer(FLayer lyr) { |
108 | layers.remove(lyr); |
||
109 | 242 | vcaballero | } |
110 | 353 | fernando | |
111 | 387 | fjp | public void removeLayer(FLayer lyr) throws CancelationException |
112 | { |
||
113 | LayerCollectionEvent event = new LayerCollectionEvent(lyr);
|
||
114 | callLayerRemoving(event); |
||
115 | doRemoveLayer(lyr); |
||
116 | callLayerRemoved(event); |
||
117 | } |
||
118 | 242 | vcaballero | /**
|
119 | 387 | fjp | * Borra una FLayer del vector a partir del identificador.
|
120 | 242 | vcaballero | *
|
121 | 387 | fjp | * @param idLayer
|
122 | 242 | vcaballero | */
|
123 | 387 | fjp | public void removeLayer(int idLayer) { |
124 | layers.remove(idLayer); |
||
125 | 242 | vcaballero | } |
126 | 404 | fjp | /**
|
127 | * M?todo de conveniencia para borrar una capa con ese nombre
|
||
128 | *
|
||
129 | * @param layerName
|
||
130 | */
|
||
131 | public void removeLayer(String layerName) { |
||
132 | FLayer lyr; |
||
133 | 214 | fernando | |
134 | 404 | fjp | for (int i = 0; i < layers.size(); i++) { |
135 | lyr = ((FLayer) layers.get(i)); |
||
136 | |||
137 | if (lyr.getName().compareToIgnoreCase(layerName) == 0) { |
||
138 | layers.remove(i); |
||
139 | |||
140 | break;
|
||
141 | } |
||
142 | } |
||
143 | } |
||
144 | |||
145 | 242 | vcaballero | /**
|
146 | * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
|
||
147 | * este nodo
|
||
148 | *
|
||
149 | * @return DOCUMENT ME!
|
||
150 | */
|
||
151 | public FLayer[] getVisibles() { |
||
152 | ArrayList array = new ArrayList(); |
||
153 | 257 | vcaballero | |
154 | 242 | vcaballero | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
155 | if (((FLayer) iter.next()).isVisible()) {
|
||
156 | array.add((FLayer) iter.next()); |
||
157 | } |
||
158 | } |
||
159 | 214 | fernando | |
160 | 402 | fjp | return (FLayer[])array.toArray(new FLayer[0]); |
161 | 242 | vcaballero | } |
162 | 214 | fernando | |
163 | 242 | vcaballero | /**
|
164 | * Obtiene el array de capas activas en el sub?rbol que pende de este nodo
|
||
165 | *
|
||
166 | * @return DOCUMENT ME!
|
||
167 | */
|
||
168 | public FLayer[] getActives() { |
||
169 | 402 | fjp | ArrayList ret = new ArrayList(); |
170 | 257 | vcaballero | |
171 | 402 | fjp | for (int i = 0; i < layers.size(); i++) { |
172 | if (((FLayer) layers.get(i)).isActive()) {
|
||
173 | ret.add(layers.get(i)); |
||
174 | 242 | vcaballero | } |
175 | } |
||
176 | 214 | fernando | |
177 | 402 | fjp | return (FLayer[])ret.toArray(new FLayer[0]); |
178 | |||
179 | 242 | vcaballero | } |
180 | 214 | fernando | |
181 | 242 | vcaballero | /**
|
182 | * Obtiene el hijo i-?simo directo de esta colecci?n
|
||
183 | *
|
||
184 | * @param index DOCUMENT ME!
|
||
185 | *
|
||
186 | * @return DOCUMENT ME!
|
||
187 | */
|
||
188 | 403 | fjp | public FLayer getLayer(int index) { |
189 | 242 | vcaballero | return (FLayer) layers.get(index);
|
190 | } |
||
191 | 404 | fjp | /**
|
192 | * M?todo de conveniencia para buscar una capa por su nombre
|
||
193 | * Es conveniente usar getLayer(int) siempre que se pueda, es m?s
|
||
194 | * directo.
|
||
195 | * @param layerName
|
||
196 | * @return
|
||
197 | */
|
||
198 | public FLayer getLayer(String layerName) { |
||
199 | FLayer lyr; |
||
200 | 214 | fernando | |
201 | 404 | fjp | for (int i = 0; i < layers.size(); i++) { |
202 | lyr = ((FLayer) layers.get(i)); |
||
203 | |||
204 | if (lyr.getName().compareToIgnoreCase(layerName) == 0) { |
||
205 | return lyr;
|
||
206 | } |
||
207 | } |
||
208 | |||
209 | return null; |
||
210 | } |
||
211 | |||
212 | 242 | vcaballero | /**
|
213 | 387 | fjp | * Obtiene el n?mero de capas que hay en su mismo nivel
|
214 | * Es decir, no cuenta las subcapas de un FLayers
|
||
215 | 242 | vcaballero | *
|
216 | * @return DOCUMENT ME!
|
||
217 | */
|
||
218 | 387 | fjp | public int getLayersCount() { |
219 | 402 | fjp | return layers.size(); }
|
220 | 214 | fernando | |
221 | 402 | fjp | |
222 | 242 | vcaballero | /**
|
223 | * Crea una replica del objeto Layers
|
||
224 | *
|
||
225 | * @return DOCUMENT ME!
|
||
226 | 435 | vcaballero | * @throws DifferentVersionException
|
227 | * @throws CancelationException
|
||
228 | * @throws IllegalAccessException
|
||
229 | * @throws InstantiationException
|
||
230 | * @throws ClassNotFoundException
|
||
231 | 242 | vcaballero | */
|
232 | 435 | vcaballero | public FLayers cloneFLayers() throws DifferentVersionException, CancelationException, ClassNotFoundException, InstantiationException, IllegalAccessException { |
233 | 442 | vcaballero | return null;//(FLayers)createFromXML(getXMLEntity()); |
234 | 242 | vcaballero | } |
235 | 217 | fernando | |
236 | 242 | vcaballero | /**
|
237 | * DOCUMENT ME!
|
||
238 | *
|
||
239 | * @param image DOCUMENT ME!
|
||
240 | * @param g DOCUMENT ME!
|
||
241 | * @param viewPort DOCUMENT ME!
|
||
242 | 244 | fernando | * @param cancel
|
243 | 242 | vcaballero | * @throws DriverIOException
|
244 | 470 | fjp | * @throws DriverException
|
245 | * @throws DriverLoadException
|
||
246 | 242 | vcaballero | *
|
247 | * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#draw(java.awt.image.BufferedImage,
|
||
248 | * java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
|
||
249 | */
|
||
250 | 257 | vcaballero | public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, |
251 | 470 | fjp | Cancellable cancel) throws DriverIOException, DriverLoadException, DriverException {
|
252 | 242 | vcaballero | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
253 | LayerOperations capa = (LayerOperations) iter.next(); |
||
254 | 387 | fjp | FLayer lyr = (FLayer) capa; |
255 | 242 | vcaballero | |
256 | 387 | fjp | if (lyr.isVisible())
|
257 | { |
||
258 | System.out.println("Dibujando " + lyr.getName()); |
||
259 | capa.draw(image, g, viewPort, cancel); |
||
260 | } |
||
261 | 242 | vcaballero | } |
262 | } |
||
263 | |||
264 | /**
|
||
265 | * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#getSelectionBounds()
|
||
266 | */
|
||
267 | public Rectangle2D getSelectionBounds() { |
||
268 | return null; |
||
269 | } |
||
270 | |||
271 | /**
|
||
272 | * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#createIndex()
|
||
273 | */
|
||
274 | public void createIndex() { |
||
275 | } |
||
276 | |||
277 | /**
|
||
278 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
|
||
279 | */
|
||
280 | 346 | fernando | public Rectangle2D getFullExtent() throws DriverIOException { |
281 | Rectangle2D rAux = null; |
||
282 | int i = 0; |
||
283 | |||
284 | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
||
285 | 342 | fjp | LayerOperations capa = (LayerOperations) iter.next(); |
286 | 346 | fernando | |
287 | if (i == 0) { |
||
288 | rAux = capa.getFullExtent(); |
||
289 | } else {
|
||
290 | 387 | fjp | rAux.add(capa.getFullExtent()); |
291 | 346 | fernando | } |
292 | |||
293 | 342 | fjp | i++; |
294 | } |
||
295 | 346 | fernando | |
296 | return rAux;
|
||
297 | 242 | vcaballero | } |
298 | |||
299 | /**
|
||
300 | 455 | fernando | * @throws DriverIOException
|
301 | 242 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.FLayer#selectByPoint(java.awt.geom.Point2D,
|
302 | * double)
|
||
303 | */
|
||
304 | 455 | fernando | public void selectByPoint(QueriedPoint p, double tolerance) throws DriverIOException { |
305 | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
||
306 | FLayer layer = (FLayer) iter.next(); |
||
307 | if (layer instanceof FLayers){ |
||
308 | ((FLayers) layer).selectByPoint(p, tolerance); |
||
309 | }else if (layer instanceof FLyrVect){ |
||
310 | ((FLyrVect) layer).selectByPoint(p, tolerance); |
||
311 | } |
||
312 | } |
||
313 | 242 | vcaballero | } |
314 | |||
315 | /**
|
||
316 | 455 | fernando | * @throws DriverIOException
|
317 | 242 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.FLayer#selectByRect(java.awt.geom.Rectangle2D)
|
318 | */
|
||
319 | 455 | fernando | public void selectByRect(Rectangle2D rect) throws DriverIOException { |
320 | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
||
321 | FLayer layer = (FLayer) iter.next(); |
||
322 | if (layer instanceof FLayers){ |
||
323 | ((FLayers) layer).selectByRect(rect); |
||
324 | }else if (layer instanceof FLyrVect){ |
||
325 | ((FLyrVect) layer).selectByRect(rect); |
||
326 | } |
||
327 | } |
||
328 | 242 | vcaballero | } |
329 | |||
330 | /**
|
||
331 | 305 | fjp | * @see com.iver.cit.gvsig.fmap.layers.FLayer#selectByShape(com.iver.cit.gvsig.fmap.core.IGeometry,
|
332 | 242 | vcaballero | * int)
|
333 | */
|
||
334 | 305 | fjp | public void selectByShape(IGeometry g, int relationship) { |
335 | 242 | vcaballero | } |
336 | 257 | vcaballero | |
337 | /**
|
||
338 | * DOCUMENT ME!
|
||
339 | *
|
||
340 | * @param event DOCUMENT ME!
|
||
341 | 346 | fernando | *
|
342 | * @throws CancelationException
|
||
343 | 257 | vcaballero | */
|
344 | 353 | fernando | private void callLayerAdding(LayerCollectionEvent event) |
345 | 346 | fernando | throws CancelationException {
|
346 | 257 | vcaballero | for (Iterator iter = layerListeners.iterator(); iter.hasNext();) { |
347 | 353 | fernando | ((LayerCollectionListener) iter.next()).layerAdding(event); |
348 | 257 | vcaballero | } |
349 | 247 | vcaballero | } |
350 | 257 | vcaballero | |
351 | /**
|
||
352 | * DOCUMENT ME!
|
||
353 | *
|
||
354 | * @param event DOCUMENT ME!
|
||
355 | 346 | fernando | *
|
356 | * @throws CancelationException
|
||
357 | 257 | vcaballero | */
|
358 | 353 | fernando | private void callLayerRemoving(LayerCollectionEvent event) |
359 | 346 | fernando | throws CancelationException {
|
360 | 257 | vcaballero | for (Iterator iter = layerListeners.iterator(); iter.hasNext();) { |
361 | 353 | fernando | ((LayerCollectionListener) iter.next()).layerRemoving(event); |
362 | 257 | vcaballero | } |
363 | } |
||
364 | |||
365 | /**
|
||
366 | * DOCUMENT ME!
|
||
367 | *
|
||
368 | * @param event DOCUMENT ME!
|
||
369 | 346 | fernando | *
|
370 | * @throws CancelationException
|
||
371 | 257 | vcaballero | */
|
372 | 353 | fernando | private void callLayerMoving(LayerPositionEvent event) |
373 | 346 | fernando | throws CancelationException {
|
374 | 257 | vcaballero | for (Iterator iter = layerListeners.iterator(); iter.hasNext();) { |
375 | 353 | fernando | ((LayerCollectionListener) iter.next()).layerMoving(event); |
376 | } |
||
377 | } |
||
378 | |||
379 | /**
|
||
380 | * DOCUMENT ME!
|
||
381 | *
|
||
382 | * @param event DOCUMENT ME!
|
||
383 | */
|
||
384 | private void callLayerAdded(LayerCollectionEvent event) { |
||
385 | for (Iterator iter = layerListeners.iterator(); iter.hasNext();) { |
||
386 | ((LayerCollectionListener) iter.next()).layerAdded(event); |
||
387 | } |
||
388 | } |
||
389 | |||
390 | /**
|
||
391 | * DOCUMENT ME!
|
||
392 | *
|
||
393 | * @param event DOCUMENT ME!
|
||
394 | */
|
||
395 | private void callLayerRemoved(LayerCollectionEvent event) { |
||
396 | for (Iterator iter = layerListeners.iterator(); iter.hasNext();) { |
||
397 | ((LayerCollectionListener) iter.next()).layerRemoved(event); |
||
398 | } |
||
399 | } |
||
400 | |||
401 | /**
|
||
402 | * DOCUMENT ME!
|
||
403 | *
|
||
404 | * @param event DOCUMENT ME!
|
||
405 | */
|
||
406 | private void callLayerMoved(LayerPositionEvent event) { |
||
407 | for (Iterator iter = layerListeners.iterator(); iter.hasNext();) { |
||
408 | 342 | fjp | ((LayerCollectionListener) iter.next()).layerMoved(event); |
409 | 257 | vcaballero | } |
410 | } |
||
411 | 435 | vcaballero | |
412 | /**
|
||
413 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
|
||
414 | */
|
||
415 | public XMLEntity getXMLEntity() {
|
||
416 | XMLEntity xml=super.getXMLEntity();
|
||
417 | xml.putProperty("numLayers",layers.size());
|
||
418 | for (int i=0;i<layers.size();i++){ |
||
419 | xml.addChild(((FLayer)layers.get(i)).getXMLEntity()); |
||
420 | } |
||
421 | return xml;
|
||
422 | } |
||
423 | 341 | fernando | |
424 | 435 | vcaballero | /**
|
425 | * @throws DifferentVersionException
|
||
426 | * @throws CancelationException
|
||
427 | * @throws IllegalAccessException
|
||
428 | * @throws InstantiationException
|
||
429 | * @throws ClassNotFoundException
|
||
430 | 442 | vcaballero | * @throws DriverIOException
|
431 | * @throws DriverLoadException
|
||
432 | 435 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
|
433 | */
|
||
434 | 442 | vcaballero | public void setXMLEntity(XMLEntity xml) throws DifferentVersionException, CancelationException, ClassNotFoundException, InstantiationException, IllegalAccessException, DriverLoadException, DriverIOException { |
435 | super.setXMLEntity(xml);
|
||
436 | 435 | vcaballero | int numLayers=xml.getIntProperty("numLayers"); |
437 | for (int i=0;i<numLayers;i++){ |
||
438 | 442 | vcaballero | if (xml.getStringProperty("file")!=null){ |
439 | layers.add(LayerFactory.createLayer(xml.getChild(i).getStringProperty("driverName"),new File(xml.getChild(i).getStringProperty("name")),getProjection())); |
||
440 | }else if(true){ |
||
441 | |||
442 | }else if (true){ |
||
443 | |||
444 | } |
||
445 | 435 | vcaballero | } |
446 | } |
||
447 | |||
448 | |||
449 | |||
450 | 214 | fernando | } |