miércoles, enero 22, 2014

Agregar una nueva entrada en el menú contextual de la Tabla de Contenido (TOC) y en la barra de herramienta genérica que muestre las propiedades del NetCDF

Por: Daynier Cardoso Roques
El formato de dato NetCDF es un formato de dato científico en el cual se puede almacenar gran cantidad de información. Los archivos de este tipo contienen algunas propiedades que es importante mostrar y configurar con el fin de lograr una correcta visualización. Algunas de estas propiedades son:
  • Sistemas de Coordenadas, por ejemplo Longitud y Latitud
  • Variable Medida, por ejemplo Temperatura, Presión, Nubosidad, etc.
  • X_Dimensión
  • Y_Dimensión
Y en caso de ser un NetCDF 3D o 4D puede tener:
  • Tiempo
  • Altura

Añadiendo la nueva entrada


Para crear una nueva entrada en la Tabla de Contenido (TOC) es necesario crear una clase que herede de la clase abstracta AbstractTocContextMenuAction e implemente la interfaz IGenericToolBarMenuItem lo que permite añadir la nueva entrada en el TOC y en la Barra de Herramienta Genérica. Luego en la nueva clase creada añadimos los siguientes import:
import javax.swing.Icon;
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
import org.gvsig.gui.beans.panelGroup.PanelGroupManager;
import org.gvsig.gui.beans.panelGroup.tabbedPanel.TabbedPanel;
import org.gvsig.raster.gui.IGenericToolBarMenuItem;
import org.gvsig.raster.util.RasterToolsUtil;
import uclv.gvsig.extsdf.raster.NetCDFRasterDataset;
import com.iver.andami.PluginServices;
import com.iver.andami.ui.mdiManager.WindowInfo;
import com.iver.cit.gvsig.fmap.layers.FLayer;
import com.iver.cit.gvsig.panelGroup.PanelGroupDialog;
import com.iver.cit.gvsig.panelGroup.loaders.PanelGroupLoaderFromExtensionPoint;
import com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction;
import com.iver.cit.gvsig.project.documents.view.toc.ITocItem;

La cual deberá implementar los siguientes métodos:

  • boolean isVisisble(TocItem item, FLayer[] selectedItems): Método que será invocado para verificar si el ítem del menú debe ser visible o no. Este método devuelve true si la capa activa es construida a partir de un archivo NetCDF en otro caso devolverá false.

public boolean isVisible(ITocItem item, FLayer[] selectedItems) {
  if ((selectedItems == null) || (selectedItems.length != 1))
    return false;
  FLayer lyr = selectedItems[0];
  if (lyr instanceof FLyrRasterSE) {
    FLyrRasterSE fr = (FLyrRasterSE) lyr;
    return fr.getDataSource().getDataset(0)[0] instanceof NetCDFRasterDataset;          
  }
  return false;
}
  • boolean isEnabled(ITocItem item, FLayer[] selectedItems): Método que será invocado para verificar si el ítem del menú debe estar habilitado o no. Este método devuelve true si la capa activa es construida a partir de un archivo NetCDF en otro caso devolverá false.

public boolean isEnabled(ITocItem item, FLayer[] selectedItems) {
  if ((selectedItems == null) || (selectedItems.length != 1))
    return false;
  FLayer lyr = selectedItems[0];
  if (lyr instanceof FLyrRasterSE) {
    FLyrRasterSE fr = (FLyrRasterSE) lyr;
    return fr.getDataSource().getDataset(0)[0] instanceof NetCDFRasterDataset;          
  }
  return false;
}

  • void execute(ITocItem item, FLayer[] selectedItems): Este método es el encargado de gestionar la apertura de la ventana que mostrará los paneles de propiedades del NetCDF.

public void execute(ITocItem item, FLayer[] selectedItems) {
  ...
  FLayer lyr = getNodeLayer(item);
  ...
  enableEvents = false;
  PanelGroupManager manager = PanelGroupManager.getManager();
  manager.registerPanelGroup(TabbedPanel.class);
  manager.setDefaultType(TabbedPanel.class);
  TabbedPanel panelGroup = (TabbedPanel)manager.getPanelGroup(lyr);
  PanelGroupLoaderFromExtensionPoint loader = new PanelGroupLoaderFromExtensionPoint("NetCDFPropertiesDialog");
  properties = new PanelGroupDialog(lyr.getName(), PluginServices.getText(this,"NetCDF_properties"), 550, 450, (byte) (WindowInfo.MODELESSDIALOG | WindowInfo.RESIZABLE | WindowInfo.MAXIMIZABLE), panelGroup);
  properties.loadPanels(loader);
  enableEvents = true;
  RasterToolsUtil.addWindow(properties);
  ...
}

  • Icon getIcon(): Devuelve el icono del ítem del menú.
  • String getText(): Devuelve el texto que se debe ver en el menú.
  • String getGroup(): Devuelve el nombre del grupo al que pertenece el ítem de menú.
  • String getGroupOrder(): Devuelve el orden del grupo.
  • String getOrder(): Devuelve orden del ítem.

Es importante tener en cuenta que los paneles de propiedades que serán mostrados en la ventana deben registrarse en un nuevo punto de extensión para que los paneles puedan ser cargados luego dentro del método execute().
// Obtiene todos los puntos de extensión del gvSIG
ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();

// Creación del punto de extensión para registrar paneles en el cuadro de propiedades.
if (!extensionPoints.containsKey("NetCDFPropertiesDialog")) {
extensionPoints.put(new ExtensionPoint("NetCDFPropertiesDialog",
"NetCDF Properties registrable panels (register instances of javax.swing.JPanel)"));
}

// Añadimos el panel al cuadro de propiedades.
extensionPoints.add("NetCDFPropertiesDialog", "NetCDF",NetCDFPanel.class);

// Añadimos las entradas del menú del toc de raster
extensionPoints.add("View_TocActions", "NetCDFProperties",PropertiesNetCDFRasterTocMenuEntry.getSingleton());

// Añadimos la entrada en la Barra de Herramienta Genérica
org.gvsig.raster.util.extensionPoints.ExtensionPoint point = org.gvsig.raster.util.extensionPoints.ExtensionPoint.getExtensionPoint("GenericToolBarMenu");
point.register("NetCDFProperties",PropertiesNetCDFRasterTocMenuEntry.getSingleton());

Todos los paneles de propiedades deben implementar la clase abstracta AbstractPanel que contiene los métodos abstracto accept(), apply(), cancel(), los cuales definirán el comportamiento de dichos botones cuando se haga clic sobre ellos. Además los paneles tendrán que implementar el método setReference(Object ref) a través del cual reciben todos los objetos relacionados con dichos paneles como es el caso de el objeto Flayer.

No hay comentarios.:

Publicar un comentario