Nombres automáticos de capa
Utilización del sistema de generación de nombres automáticos para capas temporales o definitivas
Nombres de capa automáticos
Existen funcionalidades en las que es necesario el uso de capas que se generan como resultado de un proceso. En ocasiones el usuario puede elegir el nombre de estas capas. En otras ocasiones esto no es posible o no es necesario. Las capas temporales se almacenan todas en un mismo directorio por lo que la asignación de nombres automáticos debe hacerse con cuidado.
Método del incremento
En funcionalidades donde es el usuario el que tiene que decidir el nombre de la capa o permitir que se le asigne uno por defecto aparece un JTextField con el nombre por defecto. Si el usuario no lo cambia se asignará este a la nueva capa que se genere y automáticamente se creará un nombre nuevo para el siguiente que lo necesite. Si el usuario cambia el contenido del JTextField se asignará el que él haya elegido.
La clase RasterModule lleva el control de forma estática de los nombres generados automáticamente. El primer nombre ofrecido en una sesión de gvSIG será NewLayer_1. Cuando este se use nos proporcionará NewLayer_2 y así sucesivamente.
Tenemos dos métodos básicos para consulta y uso del nombre propuesto por la librería para nombrar la siguiente capa.
public static String usesOnlyLayerName()
public static String getOnlyLayerName()
Ambos devuelven un nombre de capa no utilizado todavía y único. El primero supone que se utiliza el nombre para nombrar una de nuestras capas y genera el siguiente nombre. El segundo solo consulta cual es el nombre disponible. Por ejemplo:
String file = RasterModule.getOnlyLayerName(); //file vale NewLayer_1
file = RasterModule.getOnlyLayerName(); //file vale NewLayer_1
file = RasterModule.usesOnlyLayerName(); //file vale NewLayer_1
file = RasterModule.usesOnlyLayerName(); //file vale NewLayer_2
file = RasterModule.getOnlyLayerName(); //file vale NewLayer_3
file = RasterModule.getOnlyLayerName(); //file vale NewLayer_3
De esta forma si se tiene un campo de texto con el nombre de capa por defecto se usa getOnlyLayerName() para rellenarlo con el nombre valido actual. Cuando generamos la capa se llama a usesOnlyLayerName() para usarlo, desechar ese nombre y que genere el siguiente válido.
Evento de nombre desechado
Podemos querer ser informados de que un nombre ha sido ya utilizado. Por ejemplo supongamos que tenemos dos funcionalidades abiertas que necesitan de la generación de nombres de capa automáticos. Cuando una de ellas haga uso del nombre en curso la otra debe enterarse de este cambio para actualizar su JTextField con el nombre nuevo. Para poder recoger este evento tendremos que tener una clase que implemente PropertyListener y registrarla después de la creación del JTextField. Normalmente este ProperyListener podrá ser el JPanel donde este el JTextField con el nombre de capa.
RasterModule.addOnlyLayerNameListener(this);
Al implementar el método que informa del evento tendremos que actualizar dentro de ese método el valor del JTextField de esta forma:
/**
* Cuando alguien ha cambiado la propiedad del nombre de la
* capa se actualiza automáticamente
*/
public void actionValueChanged(PropertyEvent e) {
myTextField.setText(RasterModule.getOnlyLayerName());
}
Como el nombre de capa nueva es un valor global para cada sesión esta es tratada de forma estática por lo que es conveniente cuando cerremos el dialogo eliminar el listener que nos informa del cambio de nombre de capa.
/**
* Acciones a ejecutar cuando se cancela
*/
private void close() {
RasterModule.removeOnlyLayerNameListener(getMyPropertyListenerClass());
}
Discriminar tipo de nombre
Cuando queremos necesitemos crear una capa nueva leeremos el nombre del JTextField. Antes de usarlo comprobaremos si el nombre que hay en el JTextField es el generado automáticamente. Si es así ejecutamos el método usesOnlyLayerName() para que genere el siguiente. Si no fuera el generado automáticamente es que el usuario ha introducido un nombre nuevo. Usaremos este directamente.
String file = getMyPropertyListenerPanel().getFilenameTextField().getText();
if(file.compareTo(RasterModule.getOnlyLayerName()) == 0)
RasterModule.usesOnlyLayerName();
Es recomendable, antes de crear la capa consultar si ya existe:
if(new File(layerName).exists())
if(!RasterToolsUtil.messageBoxYesOrNot("raster_error_file_exists", getPanel()))
return;