Hola ,
Un desarrollador ha preguntado en la lista de desarrollo de gvSIG cómo se podía añadir una entrada nueva al diálogo de preferencias de gvSIG para gestionar las preferencias de un plugin.
Voy a contar muy deprisa como se podría hacer eso, junto con cómo y dónde se almacenarían esas preferencias.
Empezare por donde deberían almacenarse las preferencias de un plugin. Si tenemos instalado gvSIG 2.1.0 y echamos un vistazo a la carpeta gvSIG de nuestro “HOME”, veremos que allí tenemos una carpeta “plugins”, y dentro una carpeta por cada plugin. No habrá una para cada plugin de gvSIG pero si tendremos una por cada plugin que precise de almacenar preferencias o información que deba actualizarse durante la ejecución de gvSIG. Miremos dentro de la carpeta:
gvSIG/plugins/org.gvsig.coreplugin.app.mainplugin/
de nuestro “HOME”.
Allí encontraremos el fichero “plugin-persistence.dat”. Ahí es donde cada plugin almacena sus datos relacionados con preferencias. El formato de este fichero es similar al de los ficheros de proyecto de gvSIG (.gvsproj), pero almacena otro tipo de información, siendo esta particular de cada plugin.
Si borramos estos ficheros perderemos nuestros valores de preferencias y se inicializaran con los valores por defecto que estén en código. Este fichero va a la par junto con otro que se encuentra en la carpeta del plugin. Echemos un vistazo a la carpeta:
gvSIG/extensiones/org.gvsig.coreplugin.app.mainplugin/
…de nuestra instalación de gvSIG. Allí encontraremos, entre otras cosas, un fichero “plugin-persistence.def” con la definición del fichero “plugin-persistence.dat” almacenado en “HOME/gvSIG…”. Por ejemplo en el caso de “org.gvsig.coreplugin.app.mainplugin”, tendremos algo como:
<?xml version="1.0"?> <definitions> <version>1.0.0</version> <classes> <class name="org.gvsig.coreplugin.app.mainplugin"> <description>Persistence for the core plugin</description> <fields> <field name="showNotificationsInConsole" type="Boolean" defaultValue="false" mandatory="false"> <description></description> </field> <field name="showNotificationsInStatusbar" type="Boolean" defaultValue="true" mandatory="false"> <description></description> </field> </fields> </class> </classes> </definitions>
En el que se define que en las preferencias del plugin habrán dos propiedades de tipo “booleano“, “showNotificationsInConsole” y “showNotificationsInStatusbar” cuyos valores por defecto son “false” y “true” respectivamente.
El primer paso para gestionar las preferencias de nuestro plugin sería crear este fichero con la definición de los atributos que queramos persistir en nuestras preferencias. Para valores “simples“, String, Integer, Double, Boolean… es muy simple su definición, pero también podemos almacenar estructuras de datos mas complejas como “List“, “Map” o “Set“, y si lo precisamos definir nuestras propias estructuras. De momento, creo que para los tipos “simples” bastara con que le echéis un vistazo a los ficheros “plugin-persistence.def” que podéis encontrar en la instalación de gvSIG, y si tenéis alguna duda preguntar por las lista de desarrollo. Si tengo un rato, y creéis que es interesante, ya prepararé un articulo comentando en profundidad todas las posibilidades que tenemos para definir nuestros datos de preferencias en este fichero.
Ah!, una cosa importante… es crítico que donde “<class name=” diga exactamente el nombre de nuestro plugin, si no no cargara esta definición asociada a el.
Bien, voy a asumir que ya habéis creado vuestro fichero “plugin-persistence.def”, y lo tenéis preparado para que se despliegue en la carpeta de la instalación de vuestro plugin. ¿ Y ahora qué hago con él ?
La cosa es muy simple. Veamos una lineas de cogido:
PluginsManager pluginsManager = PluginsLocator.getManager(); PluginServices plugin = pluginsManager.getPlugin(MyClaseExtension.class); DynObject pluginProperties = plugin.getPluginProperties();
Con estas tres lineas forzaríamos a que se cargase el fichero “plugin-persistence.dat”, si existe, y si no existe se crearía una “estructura” vacía con la definición del “plugin-persistence.def” y nos la dejaría en “pluginProperties” para poder acceder a ella. Podríamos hacer:
Boolean showNotificationsInStatusbar = (Boolean) pluginProperties.getDynValue("showNotificationsInStatusbar")
Para acceder a la propiedad “showNotificationsInStatusbar” de nuestro fichero de preferencias. O si quisiésemos podríamos hacer:
pluginProperties.setDynValue("showNotificationsInStatusbar", Boolean.TRUE);
Si quisiésemos asignarle un valor a esa propiedad de nuestras preferencias. En caso de que modifiquemos los valores de las preferencias, podemos forzar a guardarlas en ese momento con:
pluginProperties.savePluginProperties()
O simplemente al cerrarse gvSIG estas se guardaran automáticamente.
Bueno… así sería en plan muy rápido como se guardan o recuperan las preferencias de nuestro plugin. Ahora queda ver cómo podemos añadir al diálogo de preferencias de la aplicación una nueva entrada para gestionar dichas preferencias.
Para crear una entrada en las preferencias de gvSIG tendremos que crear una clase que extienda de “AbstractPreferencePage” y rellenar algunos métodos:
public class MyreferencesPage extends AbstractPreferencePage { private static final Logger logger = LoggerFactory.getLogger(MyPreferencesPage.class); public static final String ID = MyreferencesPage.class.getName(); private MyPreferencesPanel preferences; private DynObject pluginProperties; private PluginServices plugin; public MyPreferencesPage() { initComponents(); } private void initComponents() { I18nManager i18nManager = ToolsLocator.getI18nManager(); PluginsManager pluginManager = PluginsLocator.getManager(); this.plugin = pluginManager.getPlugin(this); this.pluginProperties = this.plugin.getPluginProperties(); this.preferences = new MyPreferencesPanel(); ... this.setLayout(new BorderLayout()); this.add(this.preferences, BorderLayout.NORTH); initializeValues(); } public void storeValues() throws StoreException { // Recogemos los valores de nuestro panel y los // guardamos en "pluginProperties" ... this.plugin.savePluginProperties(); } public void setChangesApplied() { } public String getID() { return ID; } public String getTitle() { I18nManager i18nManager = ToolsLocator.getI18nManager(); return i18nManager.getTranslation("Titulo de nuestro pagina"); } public JPanel getPanel() { return this; } public void initializeValues() { // Cargamos nuestro valores almacenados en las preferencias, // "pluginProperties", en los controles del interfaze de usuario ... Boolean showNotificationsInStatusbar = (Boolean) pluginProperties.getDynValue("showNotificationsInStatusbar"); ...setSelected(showNotificationsInStatusbar.booleanValue()); ... } public void initializeDefaults() { } public ImageIcon getIcon() { return IconThemeHelper.getImageIcon("my-preferences"); } public boolean isValueChanged() { // Si el usuario ha cambiado algun valor de nuestra pagina // retornaremos "true" para forzar a que se recuperen estos y // se guarden. Si no retornaremos false boolean changed = false; ... return changed; } public boolean isResizeable() { // Lo normal es que este metodo retorne siempre true. // Indica que nuestro panel se colacara en el dialogo usando un // layout que lo resizee segun sea necesario. return true; } }
Si quisiésemos que nuestra pagina de preferencias estuviese “bajo” otra en el árbol que aparece en el dialogo de preferencias, no tendríamos mas que añadir en el constructor de nuestra clase una llamada a “setParentID” indicando el identificador de la pagina bajo la que queremos que este la nuestra. Por ejemplo:
public MyPreferencesPage() { setParentID(GeneralPage.id); initComponents(); }
Nos la situaría bajo la entrada “General” del dialogo de preferencias.
Cuando tengamos nuestra clase creada, ya solo es restara registrarla para que gvSIG sea consciente de ella y la presente. Para ello, en el método “initialize” de nuestra extensión usaremos algo parecido a estas lineas de código:
ExtensionPointManager extensionPoints =ToolsLocator.getExtensionPointManager(); ExtensionPoint ep = extensionPoints.add("AplicationPreferences", ""); ep.append("MyPage", "", new MyPreferencesPage());
Y ya solo restara compilarlo todo y ver que pasa.
Espero que os haya servido 😉
Hasta otra!
Joaquin
Pingback: Como gestionar las preferencias de un plugin en gvSIG 2.1 | Geo-How-To News