From 28277cfa206c36756998fe3bdb2b00de9cb80b96 Mon Sep 17 00:00:00 2001 From: Andrea Antonello Date: Mon, 20 Feb 2017 15:38:00 +0100 Subject: [PATCH] add feature browser --- .../FeatureBrowserController.java | 177 +++++ .../FeatureBrowserExtension.java | 71 ++ .../featurebrowser/FeatureBrowserView.java | 187 +++++ .../featurebrowser/FeatureBrowserView.xml | 653 ++++++++++++++++++ .../src/main/resources-plugin/config.xml | 20 + 5 files changed, 1108 insertions(+) create mode 100644 org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserController.java create mode 100644 org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserExtension.java create mode 100644 org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.java create mode 100644 org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.xml diff --git a/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserController.java b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserController.java new file mode 100644 index 0000000..94fa3f4 --- /dev/null +++ b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserController.java @@ -0,0 +1,177 @@ +package org.jgrasstools.gvsig.featurebrowser; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.List; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComponent; + +import org.gvsig.fmap.dal.exception.DataException; +import org.gvsig.fmap.dal.feature.Feature; +import org.gvsig.fmap.dal.feature.FeatureSelection; +import org.gvsig.fmap.geom.Geometry; +import org.gvsig.fmap.geom.primitive.Envelope; +import org.gvsig.fmap.mapcontext.MapContext; +import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; +import org.gvsig.tools.swing.api.Component; +import org.gvsig.tools.swing.api.ToolsSwingLocator; +import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager; +import org.jgrasstools.gvsig.base.FeatureUtilities; +import org.jgrasstools.gvsig.base.JGTUtilities; +import org.jgrasstools.gvsig.base.LayerUtilities; + +public class FeatureBrowserController extends FeatureBrowserView implements Component { + + private HashMap name2LayersMap = new HashMap(); + private MapContext currentMapcontext; + private ThreadSafeDialogsManager dialogManager = ToolsSwingLocator.getThreadSafeDialogsManager(); + + private String selectedLayerName; + + private int featureCount = 0; + private int featureSize = 0; + private List features; + private String[] attributesNames; + private FLyrVect selectedLayer; + + public FeatureBrowserController() { + setPreferredSize(new Dimension(600, 300)); + init(); + } + + private void init() { + + // TODO implement buffer part + _bufferLabel.setVisible(false); + _bufferText.setVisible(false); + // end TODO + + setCombos(); + + _layerCombo.addActionListener(new ActionListener(){ + + + public void actionPerformed( ActionEvent e ) { + selectedLayerName = (String) _layerCombo.getSelectedItem(); + + selectedLayer = name2LayersMap.get(selectedLayerName); + if (selectedLayer != null) { + try { + attributesNames = LayerUtilities.getAttributesNames(selectedLayer, false); + + features = FeatureUtilities.getFeatures(selectedLayer.getFeatureStore(), null, null); + featureCount = 1; + featureSize = features.size(); + + updateForFeature(); + + } catch (Exception e1) { + e1.printStackTrace(); + } + } else { + _infoTextArea.setText(""); + } + } + }); + + + _nextButton.addActionListener(new ActionListener(){ + + @Override + public void actionPerformed( ActionEvent e ) { + featureCount++; + if (featureCount > featureSize) { + featureCount = 1; + } + updateForFeature(); + } + }); + _previousButton.addActionListener(new ActionListener(){ + + @Override + public void actionPerformed( ActionEvent e ) { + featureCount--; + if (featureCount < 1) { + featureCount = featureSize; + } + updateForFeature(); + } + }); + } + + private void updateForFeature() { + _featureCountLabel.setText("Feature N." + featureCount + " of " + featureSize); + + Feature feature = features.get(featureCount - 1); + + StringBuilder sb = new StringBuilder(); + for( String attrName : attributesNames ) { + sb.append(attrName).append("=").append(feature.get(attrName).toString()).append("\n"); + } + _infoTextArea.setText(sb.toString()); + + Geometry defaultGeometry = feature.getDefaultGeometry(); + Envelope envelope = defaultGeometry.getEnvelope(); + +// String bufferStr = _bufferText.getText(); +// double buffer = 0; +// try { +// buffer = Double.parseDouble(bufferStr); +// } catch (NumberFormatException e) { +// // ignore +// } + JGTUtilities.zoomTo(envelope); + + try { + FeatureSelection featureSelection = selectedLayer.getFeatureStore().getFeatureSelection(); + featureSelection.deselectAll(); + featureSelection.select(feature); + } catch (DataException e) { + e.printStackTrace(); + } + } + + private void setCombos() { + try { + List vectorLayers = LayerUtilities.getVectorLayers(currentMapcontext); + + if (vectorLayers.size() == name2LayersMap.size()) { + return; + } + + + name2LayersMap = new HashMap(); + String[] names = new String[vectorLayers.size()]; + int count = 0; + for( FLyrVect fLyrVect : vectorLayers ) { + String name = fLyrVect.getName(); + name2LayersMap.put(name, fLyrVect); + names[count++] = name; + } + + Object selectedLayer = _layerCombo.getSelectedItem(); + _layerCombo.setModel(new DefaultComboBoxModel(names)); + if (selectedLayer != null) { + _layerCombo.setSelectedItem(selectedLayer); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public JComponent asJComponent() { + return this; + } + + public void isVisibleTriggered() { + // MapContext newMapcontext = ProjectUtilities.getCurrentMapcontext(); + // if (newMapcontext == currentMapcontext) { + // return; + // } + setCombos(); + } + +} diff --git a/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserExtension.java b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserExtension.java new file mode 100644 index 0000000..f67ffd9 --- /dev/null +++ b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserExtension.java @@ -0,0 +1,71 @@ +/* + * This file is part of JGrasstools (http://www.jgrasstools.org) + * (C) HydroloGIS - www.hydrologis.com + * + * JGrasstools is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jgrasstools.gvsig.featurebrowser; + +import org.gvsig.andami.IconThemeHelper; +import org.gvsig.andami.plugins.Extension; +import org.gvsig.tools.swing.api.ToolsSwingLocator; +import org.gvsig.tools.swing.api.windowmanager.WindowManager; +import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Andrea Antonello (www.hydrologis.com) + */ +public class FeatureBrowserExtension extends Extension { + + private static final String ACTION_FEATUREBROWSE = "feature-browser-tools"; + + private FeatureBrowserController featureBrowserController; + + public void initialize() { + IconThemeHelper.registerIcon("action", "copy", this); + } + + public void postInitialize() { + } + + /** + * Execute the actions associated to this extension. + */ + public void execute( String actionCommand ) { + if (ACTION_FEATUREBROWSE.equalsIgnoreCase(actionCommand)) { + featureBrowserController = new FeatureBrowserController(); + WindowManager windowManager = ToolsSwingLocator.getWindowManager(); + windowManager.showWindow(featureBrowserController.asJComponent(), "Feature Browser", MODE.WINDOW); + } + } + + /** + * Check if tools of this extension are enabled. + */ + public boolean isEnabled() { + return true; + } + + /** + * Check if tools of this extension are visible. + */ + public boolean isVisible() { + if (featureBrowserController != null) + featureBrowserController.isVisibleTriggered(); + return true; + } + +} diff --git a/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.java b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.java new file mode 100644 index 0000000..186bbd7 --- /dev/null +++ b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.java @@ -0,0 +1,187 @@ +package org.jgrasstools.gvsig.featurebrowser; + +import com.jeta.open.i18n.I18NUtils; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.ComponentOrientation; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.border.TitledBorder; + + +public class FeatureBrowserView extends JPanel +{ + JComboBox _layerCombo = new JComboBox(); + JLabel _featureCountLabel = new JLabel(); + JLabel _bufferLabel = new JLabel(); + JTextField _bufferText = new JTextField(); + JButton _previousButton = new JButton(); + JButton _nextButton = new JButton(); + JTextArea _infoTextArea = new JTextArea(); + + /** + * Default constructor + */ + public FeatureBrowserView() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + /** + * Method for recalculating the component orientation for + * right-to-left Locales. + * @param orientation the component orientation to be applied + */ + public void applyComponentOrientation( ComponentOrientation orientation ) + { + // Not yet implemented... + // I18NUtils.applyComponentOrientation(this, orientation); + super.applyComponentOrientation(orientation); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _layerCombo.setName("layerCombo"); + jpanel1.add(_layerCombo,cc.xywh(2,2,18,1)); + + _featureCountLabel.setName("featureCountLabel"); + _featureCountLabel.setText("Feature N."); + jpanel1.add(_featureCountLabel,cc.xywh(2,4,12,1)); + + _bufferLabel.setName("bufferLabel"); + _bufferLabel.setText("Buffer"); + jpanel1.add(_bufferLabel,cc.xywh(2,6,8,1)); + + _bufferText.setName("bufferText"); + jpanel1.add(_bufferText,cc.xywh(10,6,10,1)); + + _previousButton.setActionCommand("previous"); + _previousButton.setName("previousButton"); + _previousButton.setText("previous"); + jpanel1.add(_previousButton,cc.xywh(2,8,8,1)); + + _nextButton.setActionCommand("next"); + _nextButton.setName("nextButton"); + _nextButton.setText("next"); + jpanel1.add(_nextButton,cc.xywh(12,8,8,1)); + + jpanel1.add(createPanel1(),cc.xywh(2,10,18,10)); + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 }); + return jpanel1; + } + + public JPanel createPanel1() + { + JPanel jpanel1 = new JPanel(); + TitledBorder titledborder1 = new TitledBorder(null,"current feature",TitledBorder.DEFAULT_JUSTIFICATION,TitledBorder.DEFAULT_POSITION,null,new Color(49,106,196)); + jpanel1.setBorder(titledborder1); + FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0)","FILL:DEFAULT:GROW(1.0)"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _infoTextArea.setName("infoTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_infoTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xy(1,1)); + + addFillComponents(jpanel1,new int[0],new int[0]); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.xml b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.xml new file mode 100644 index 0000000..acde031 --- /dev/null +++ b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/java/org/jgrasstools/gvsig/featurebrowser/FeatureBrowserView.xml @@ -0,0 +1,653 @@ + + + + + + 2 + 0 + 0 + + + + + + + + 1 + 1 + 1 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.FormComponent + + U45ecd5d8H15a5b9a2eb1NI8000 + CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:NONE + FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE + + + + + + + + + 2 + 2 + 18 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.StandardComponent + + com.jeta.forms.gui.beans.JETABean + javax.swing.JComboBox + + + javax.swing.JComboBox + + + + + + border + + + + + + + + border + + + + + + + + + layerCombo + 949 + + + items + + + 20 + + + + + + + + + + + + + + 2 + 4 + 12 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.StandardComponent + + com.jeta.forms.gui.beans.JETABean + com.jeta.forms.components.label.JETALabel + + + com.jeta.forms.components.label.JETALabel + + + + + + border + + + + + + + + border + + + + + + + + + featureCountLabel + 521 + Feature N. + + + fill + + + 14 + + + + + + + + + + + + + + 2 + 6 + 8 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.StandardComponent + + com.jeta.forms.gui.beans.JETABean + com.jeta.forms.components.label.JETALabel + + + com.jeta.forms.components.label.JETALabel + + + + + + border + + + + + + + + border + + + + + + + + + bufferLabel + 457 + Buffer + + + fill + + + 14 + + + + + + + + + + + + + + 10 + 6 + 10 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.StandardComponent + + com.jeta.forms.gui.beans.JETABean + javax.swing.JTextField + + + javax.swing.JTextField + + + + + + border + + + + + + + + border + + + + + + + + + bufferText + 488 + 20 + + + + + + + + + + + + + + 2 + 8 + 8 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.StandardComponent + + com.jeta.forms.gui.beans.JETABean + javax.swing.JButton + + + javax.swing.JButton + + + + + + border + + + + + + + + border + + + + + + + + + previous + previousButton + 457 + previous + 22 + + + + + + + + + + + + + + 12 + 8 + 8 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.StandardComponent + + com.jeta.forms.gui.beans.JETABean + javax.swing.JButton + + + javax.swing.JButton + + + + + + border + + + + + + + + border + + + + + + + + + next + nextButton + 456 + next + 22 + + + + + + + + + + + + + + 2 + 10 + 18 + 10 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.FormComponent + + embedded.A45ecd5d8Q15a5b9a2eb1PT7ffe + FILL:DEFAULT:GROW(1.0) + FILL:DEFAULT:GROW(1.0) + + + + + + + + + 1 + 1 + 1 + 1 + default + default + 0,0,0,0 + + + com.jeta.forms.gui.form.StandardComponent + + com.jeta.forms.gui.beans.JETABean + javax.swing.JTextArea + + + javax.swing.JTextArea + + + + + + border + + + + + + + + border + + + + + + + + + true + true + infoTextArea + 932 + + + scollBars + 20 + 30 + + + 374 + + + + + + + + + + + + com.jeta.forms.gui.form.GridView + + + + + + border + + + + + + + + border + current feature + + + + + + + + + + + + fill + + + + + scollBars + 21 + 31 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.jeta.forms.gui.form.GridView + + + + + + border + + + + + + + + + + fill + + + + + scollBars + 21 + 31 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/resources-plugin/config.xml b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/resources-plugin/config.xml index 88bc406..d28aee0 100644 --- a/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/resources-plugin/config.xml +++ b/org.jgrasstools.gvsig/org.jgrasstools.gvsig.simpletools/src/main/resources-plugin/config.xml @@ -59,6 +59,26 @@ + + + + + + + + +