[Gvsig_desarrolladores] Re: Propagar evento de eliminación de capa

Francisco José fpenarru en iver.es
Lun Ene 29 11:33:59 CET 2007


Sí, creo que tienes razón.

Es más sencillo añadir ese método para que la capa informe a su driver 
de que va a ser eliminada.

Porque además, no estaría bien que un driver fuera listener de una 
colección de capas. Es mejor que esos modelos no se mezclen.

Salu2.

Saludos.

Juan Lucas Dominguez Rubio escribió:
> Hola. Gracias por la respuesta.
>  
> Creo que los eventos que comentas (layerRemoving, layerRemoved) se generan cada vez que una capa deja de ser hija de su padre, es decir, cuando se elimina del TOC pero también cuando se cambia de posición (arrastrar y soltar) y también cuando se agrupa o desagrupa. Pero a nosotros sólo nos interesa el primer caso, cuando una capa deja de existir en la vista.
>  
> Estamos desarrollando un driver que es subclase de DefaultDBDriver y también estamos modificando la clase WizardJDBC, desde la cual se tiene acceso al padre de la capa en el momento de crearla. El padre es lógicamente el FLayers del TOC y se podría hacer esto:
>  
> FLayers parent = getMapCtrl().getMapContext().getLayers();
> parent.addLayerCollectionListener(driver);
>  
> siendo "driver" el driver que estamos creando (que es subclase de DefaultDBDriver), y por tanto habría que añadir "implements LayerCollectionListener" a DefaultDBDriver, puesto que lo lógico es tratar a todos los drivers de ese tipo de manera homogénea (pero seguimos con el problema de que recibiríamos eventos cuando la capa cambia de padre).
>  
> Tal vez se podría deducir, por la secuencia de eventos (layerRemoved, layerAdded, etc) si la capa ha sido borrada o solamente ha cambiado de padre, pero eso me parece un poco retorcido...
>  
> Juan Lucas Domínguez Rubio
> Prodevelop SL, Valencia (España)
> Tlf.: 96.351.06.12 -- Fax: 96.351.09.68
> http://www.prodevelop.es <http://www.prodevelop.es> 
>
>
> ________________________________
>
> De: Francisco José [mailto:fpenarru en iver.es]
> Enviado el: lun 29/01/2007 8:35
> Para: Juan Lucas Dominguez Rubio; desarrolladores de gvSIG, el SIG libre y multiplataforma de la Generalitat Valenciana
> Asunto: Re: [Gvsig_desarrolladores] Propagar evento de eliminación de capa
>
>
>
> Hola a todos.
>
> Lo que propones tiene sentido (sobre todo, para alguien que como yo, viene del C++).
>
> Sin embargo, sin cambiar nada también se puede hacer lo que apuntas, y de una forma algo más adecuada, creo yo. (Lo mismo pasaría con el wakeUp, que no sería necesario si se hiciese lo siguiente (salvo que alguien diga lo contrario, yo no lo he probado):
>
> Existe un interfaz llamado LayerCollectionListener. Una clase que implemente esto, se pone como escucha de la colección de layers que desee monitorizar: FLayers.
>
> Si haces una clase dentro de tu extensión (o donde sea) que implemente LayerCollectionListener (o herede de LayerListenerAdapter y reimplemente solo las funciones que quieras), verás que recibes un evento (layerRemoving) con un parámetro LayerCollectionEvent al que le puedes pedir la capa que origina el evento (getAffectedLayer).
>
> Ese evento se dispara justo antes de ir a borrar una capa. Si generas una excepción de tipo CancelationException, deberías abortar el borrado de la capa, si lo necesitas.
>
> También tienes el evento layerRemoved, para cuando una capa ya ha sido borrada de la colección.
>
> De esta forma, se evita meter en una clase código del tipo if ... instanceof .... porque suele dar problemas a la hora de tener un modelo extensible.
>
> De todas formas, si no te sirve esta solución, o se estima oportuno por la gente de raster, que son los que metieron wakeUp, pues nada, se pone esa llamada y sin problemas.
>
> Saludos.
>
>
> --
> Francisco José Peñarrubia
> Equipo gvSIG
>
> IVER T.I. S.A.
> c/Salamanca 50
> 46005 Valencia
> Spain
>
>
>
>
>   


-- 
Francisco José Peñarrubia
Equipo gvSIG

IVER T.I. S.A.
c/Salamanca 50
46005 Valencia
Spain





Más información sobre la lista de distribución gvSIG_desarrolladores