Revision: 6166
          http://sourceforge.net/p/jump-pilot/code/6166
Author:   ma15569
Date:     2019-04-05 16:08:04 +0000 (Fri, 05 Apr 2019)
Log Message:
-----------
Some enhenced plugin that will add more tools to OpenJUMP ones (poosibly to 
substitute)
CropWarpPlugIn: Crop or Warp a raster to different target objects (any type of 
layer, a single geometry, a view)
KernelAnalysis: a valid plugin to perform a kernel (filter) analysis both on 
single or multiple bands rasters
ManageDataPlugIn: a set of tools to perfom some operations on raster, currently 
done by the NoData Raster tools: filter by nodata, filter by an interval of 
values, change no data, restore nodata tag, change data type (double to 
integer, reduce decimals, etc)

Added Paths:
-----------
    core/trunk/src/org/openjump/core/ui/plugin/raster/CropWarpPlugIn.java
    core/trunk/src/org/openjump/core/ui/plugin/raster/KernelAnalysisPlugIn.java
    core/trunk/src/org/openjump/core/ui/plugin/raster/ManageDataPlugIn.java

Added: core/trunk/src/org/openjump/core/ui/plugin/raster/CropWarpPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/raster/CropWarpPlugIn.java       
                        (rev 0)
+++ core/trunk/src/org/openjump/core/ui/plugin/raster/CropWarpPlugIn.java       
2019-04-05 16:08:04 UTC (rev 6166)
@@ -0,0 +1,513 @@
+package org.openjump.core.ui.plugin.raster;
+
+import it.betastudio.adbtoolbox.libs.FileOperations;
+
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.geom.NoninvertibleTransformException;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.WindowConstants;
+
+import org.openjump.core.apitools.LayerTools;
+import org.openjump.core.rasterimage.RasterImageLayer;
+import org.openjump.core.rasterimage.algorithms.GenericRasterAlgorithm;
+import org.openjump.core.ui.io.file.FileNameExtensionFilter;
+import org.saig.core.gui.swing.sldeditor.util.FormUtils;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jump.I18N;
+import com.vividsolutions.jump.feature.Feature;
+import com.vividsolutions.jump.feature.FeatureUtil;
+import com.vividsolutions.jump.task.TaskMonitor;
+import com.vividsolutions.jump.util.FileUtil;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
+import com.vividsolutions.jump.workbench.model.Category;
+import com.vividsolutions.jump.workbench.model.Layer;
+import com.vividsolutions.jump.workbench.model.Layerable;
+import com.vividsolutions.jump.workbench.model.StandardCategoryNames;
+import com.vividsolutions.jump.workbench.model.WMSLayer;
+import com.vividsolutions.jump.workbench.plugin.EnableCheck;
+import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
+import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
+import com.vividsolutions.jump.workbench.plugin.PlugInContext;
+import com.vividsolutions.jump.workbench.plugin.ThreadedBasePlugIn;
+import com.vividsolutions.jump.workbench.ui.GUIUtil;
+import com.vividsolutions.jump.workbench.ui.MultiInputDialog;
+import com.vividsolutions.jump.workbench.ui.SelectionManager;
+import com.vividsolutions.jump.workbench.ui.SelectionManagerProxy;
+import com.vividsolutions.jump.workbench.ui.Viewport;
+import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
+import com.vividsolutions.jump.workbench.ui.images.IconLoader;
+
+import de.latlon.deejump.wfs.jump.WFSLayer;
+
+public class CropWarpPlugIn extends ThreadedBasePlugIn {
+
+    private final String SELECTED = I18N
+            
.get("jump.plugin.edit.PolygonizerPlugIn.Use-selected-features-only");
+    private final String VIEW = I18N.get("ui.MenuNames.VIEW");
+    private final String LAYER = I18N.get("ui.MenuNames.LAYER");
+    private final String PROCESSING = I18N
+            .get("jump.plugin.edit.NoderPlugIn.processing");
+    private final String CLAYER = I18N.get("ui.GenericNames.Source-Layer");
+    private final String OUTPUT_FILE = I18N
+            .get("driver.DriverManager.file-to-save");
+
+    private final ImageIcon icon16 = IconLoader
+            .icon("fugue/folder-horizontal-open_16.png");
+
+    private JLabel cutLayerLabel, cutObjectLabel;
+    JTextField jTextField_RasterOut = new JTextField();
+    JTextField jTextField_RasterIn = new JTextField();
+    private JPanel cropPanel;
+    private RasterImageLayer rLayer;
+    private JComboBox<String> comboBox = new JComboBox<String>();
+    private JComboBox<String> cropComboBox = new JComboBox<String>();
+    private JComboBox<Object> layerComboBox = new JComboBox<Object>();
+    private JComboBox<RasterImageLayer> layerableComboBox = new 
JComboBox<RasterImageLayer>();
+    private String ACTION;
+    private String CROP;
+    private String path;
+    Envelope envWanted = new Envelope();
+    Envelope fix = new Envelope();
+    GenericRasterAlgorithm IO = new GenericRasterAlgorithm();
+    List<RasterImageLayer> fLayers = new ArrayList<RasterImageLayer>();
+    private MultiInputDialog dialog;
+    public static WorkbenchFrame frame = 
JUMPWorkbench.getInstance().getFrame();
+    private JPanel coordsPanel;
+
+    private final String NAME = RasterMenuNames.C_NAME;
+    private final String Target_OBJECT = RasterMenuNames.C_TARGET_OBJECT;
+    private final String CROP_RASTER = RasterMenuNames.C_CROP_RASTER;
+    private final String CROP_RASTER_TIP = RasterMenuNames.C_CROP_RASTER_TIP;
+    private final String WARP_RASTER = RasterMenuNames.C_WARP_RASTER;
+    private final String WARP_RASTER_TIP = RasterMenuNames.C_WARP_RASTER_TIP;
+    private final String CUT_LAYER = RasterMenuNames.C_CUT_LAYER;
+    private final String WARP_LAYER = RasterMenuNames.C_WARP_LAYER;
+    private final String NO_INTERSECTION = RasterMenuNames.C_NO_INTERSECTION;
+
+    private final String CHECK = RasterMenuNames.Check_field;
+    private final String ACTION_LABEL = RasterMenuNames.Choose_an_action;
+
+    private void updateGUI1(ActionEvent evt, MultiInputDialog dialog) {
+        switch (cropComboBox.getSelectedIndex()) {
+        case 0:
+            cutLayerLabel.setEnabled(true);
+            layerComboBox.setEnabled(true);
+            break;
+        case 1:
+            cutLayerLabel.setEnabled(false);
+            layerComboBox.setEnabled(false);
+            break;
+        case 2:
+            cutLayerLabel.setEnabled(false);
+            layerComboBox.setEnabled(false);
+            break;
+        }
+    }
+
+    private JPanel jBasePanel() {
+        cropPanel = new JPanel(new GridBagLayout());
+        final ArrayList<String> array = new ArrayList<String>();
+        array.add(LAYER);
+        array.add(SELECTED);
+        array.add(VIEW);
+        cropComboBox = new JComboBox<>(new Vector<>(array));
+        cropComboBox.setSelectedItem(array.get(0));
+        cropComboBox.setSize(200, cropComboBox.getPreferredSize().height);
+        cropComboBox.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                updateGUI1(e, dialog);
+                dialog.pack();
+                dialog.repaint();
+            }
+        });
+        cutObjectLabel = new JLabel(Target_OBJECT);
+        FormUtils.addRowInGBL(cropPanel, 1, 0, cutObjectLabel, cropComboBox);
+        final List<Layerable> layerables = JUMPWorkbench.getInstance()
+                .getContext().getLayerManager().getLayerables(Layerable.class);
+        layerComboBox = new JComboBox<>(new Vector<>(layerables));
+        layerComboBox.setSelectedItem(layerables.get(0));
+        layerComboBox.setSize(200, layerComboBox.getPreferredSize().height);
+        cutLayerLabel = new JLabel(CUT_LAYER);
+        FormUtils.addRowInGBL(cropPanel, 2, 0, cutLayerLabel, layerComboBox);
+        return cropPanel;
+    }
+
+    private void setDialogValues(PlugInContext context) throws IOException {
+        dialog.setSideBarDescription(CROP_RASTER_TIP);
+        if (!context.getLayerNamePanel().selectedNodes(RasterImageLayer.class)
+                .isEmpty()) {
+            rLayer = (RasterImageLayer) LayerTools.getSelectedLayerable(
+                    context, RasterImageLayer.class);
+        } else {
+            rLayer = context.getTask().getLayerManager()
+                    .getLayerables(RasterImageLayer.class).get(0);
+        }
+        fLayers = context.getTask().getLayerManager()
+                .getLayerables(RasterImageLayer.class);
+        layerableComboBox = dialog.addLayerableComboBox(CLAYER, rLayer, "",
+                fLayers);
+        layerableComboBox.setSize(200,
+                layerableComboBox.getPreferredSize().height);
+        layerableComboBox.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                dialog.pack();
+                dialog.repaint();
+            }
+        });
+        final ArrayList<String> srsArray = new ArrayList<String>();
+        srsArray.add(CROP_RASTER);
+        srsArray.add(WARP_RASTER);
+        comboBox = dialog.addComboBox(ACTION_LABEL, srsArray.get(0), srsArray,
+                null);
+        comboBox.setSize(200, comboBox.getPreferredSize().height);
+        comboBox.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                updateGUI(e, dialog);
+                dialog.pack();
+                dialog.repaint();
+            }
+        });
+        dialog.addRow("base", jBasePanel(), null, null);
+        final FileNameExtensionFilter filter;
+        filter = new FileNameExtensionFilter("TIF", "tif");
+        dialog.addRow("Save", new JLabel(OUTPUT_FILE + ":"),
+                createOutputFilePanel(filter), saveCheck, null);
+    }
+
+    private final EnableCheck[] saveCheck = new EnableCheck[] { new 
EnableCheck() {
+        @Override
+        public String check(JComponent component) {
+            return jTextField_RasterOut.getText().isEmpty() ? CHECK
+                    .concat(OUTPUT_FILE) : null;
+        }
+    } };
+
+    private final EnableCheck[] cropCheck = new EnableCheck[] { new 
EnableCheck() {
+        @Override
+        public String check(JComponent component) {
+            return fix.isNull() ? NO_INTERSECTION : null;
+        }
+    } };
+
+    private void getDialogValues(MultiInputDialog dialog) {
+        rLayer = (RasterImageLayer) dialog.getLayerable(CLAYER);
+        ACTION = dialog.getText(ACTION_LABEL);
+        CROP = cropComboBox.getSelectedItem().toString();
+        getCroppedEnvelope();
+        path = getOutputFilePath();
+        final int i = path.lastIndexOf('.');
+        if (i > 0) {
+            path = path.substring(0, path.length() - path.length() + i);
+        }
+    }
+
+    @Override
+    public boolean execute(PlugInContext context) throws Exception {
+        reportNothingToUndoYet(context);
+        dialog = new MultiInputDialog(context.getWorkbenchFrame(), NAME, true);
+        setDialogValues(context);
+        GUIUtil.centreOnWindow(dialog);
+        dialog.setVisible(true);
+        dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        if (!dialog.wasOKPressed()) {
+            return false;
+        } else if (dialog.wasOKPressed()) {
+            getDialogValues(dialog);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void run(TaskMonitor monitor, PlugInContext context)
+            throws Exception {
+        monitor.report(PROCESSING);
+        reportNothingToUndoYet(context);
+        final File outFile = FileUtil.addExtensionIfNone(new File(path), 
"tif");
+        if (ACTION.equals(CROP_RASTER)) {
+
+            IO.save_CropToEnvelope(outFile, rLayer, fix);
+
+        } else if (ACTION.equals(WARP_RASTER)) {
+            IO.save_WarpToEnvelope(outFile, rLayer, envWanted);
+        }
+        String catName = StandardCategoryNames.WORKING;
+        try {
+            catName = ((Category) context.getLayerNamePanel()
+                    .getSelectedCategories().toArray()[0]).getName();
+        } catch (final RuntimeException e1) {
+        }
+        IO.load(outFile, catName);
+        return;
+    }
+
+    private void getCroppedEnvelope() {
+        envWanted = new Envelope();
+        fix = new Envelope();
+        if (CROP.equals(LAYER)) {
+            final Layerable slayer = (Layerable) layerComboBox
+                    .getSelectedItem();
+            if (slayer instanceof WMSLayer) {
+                envWanted.expandToInclude(((WMSLayer) slayer).getEnvelope());
+            } else if (slayer instanceof WFSLayer) {
+                envWanted.expandToInclude(((WFSLayer) slayer)
+                        .getFeatureCollectionWrapper().getEnvelope());
+            } else if (slayer instanceof Layer) {
+                envWanted.expandToInclude(((Layer) slayer)
+                        .getFeatureCollectionWrapper().getEnvelope());
+            } else if (slayer instanceof RasterImageLayer) {
+                envWanted.expandToInclude(((RasterImageLayer) slayer)
+                        .getWholeImageEnvelope());
+            }
+            fix = envWanted.intersection(rLayer.getWholeImageEnvelope());
+        } else if (CROP.equals(SELECTED)) {
+            final SelectionManager smgr = ((SelectionManagerProxy) frame
+                    .getActiveInternalFrame()).getSelectionManager();
+            final Collection<Feature> features = smgr
+                    .getFeaturesWithSelectedItems();
+            final Feature feature = features.iterator().next().clone();
+            final GeometryFactory factory = new GeometryFactory();
+            feature.setGeometry(factory.createGeometryCollection(FeatureUtil
+                    .toGeometries(features).toArray(
+                            new Geometry[features.size()])));
+            envWanted = feature.getGeometry().getEnvelopeInternal();
+            fix = envWanted.intersection(rLayer.getWholeImageEnvelope());
+        } else if (CROP.equals(VIEW)) {
+            final Viewport viewport = frame.getContext().getLayerViewPanel()
+                    .getViewport();
+            envWanted = viewport.getEnvelopeInModelCoordinates();
+            fix = envWanted.intersection(rLayer.getWholeImageEnvelope());
+        }
+    }
+
+    private void updateGUI(ActionEvent evt, MultiInputDialog dialog) {
+        switch (comboBox.getSelectedIndex()) {
+        case 0:
+            dialog.setSideBarDescription(CROP_RASTER_TIP);
+            cutLayerLabel.setText(CUT_LAYER);
+            cutObjectLabel.setText(Target_OBJECT);
+            break;
+        case 1:
+            dialog.setSideBarDescription(WARP_RASTER_TIP);
+            cutLayerLabel.setText(WARP_LAYER);
+            cutObjectLabel.setText(Target_OBJECT);
+            break;
+        }
+    }
+
+    public JPanel createOutputFilePanel(FileNameExtensionFilter filter) {
+        JPanel jPanel = new JPanel(new GridBagLayout());
+        jPanel = new javax.swing.JPanel();
+        jTextField_RasterOut = new JTextField();
+        final JButton jButton_Dir = new JButton();
+        jTextField_RasterOut.setText("");
+        jButton_Dir.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent evt) {
+                File outputPathFile = null;
+                final JFileChooser chooser = new 
GUIUtil.FileChooserWithOverwritePrompting();
+                chooser.setDialogTitle(getName());
+                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+                chooser.setSelectedFile(FileOperations.lastVisitedFolder);
+                chooser.setDialogType(JFileChooser.SAVE_DIALOG);
+                GUIUtil.removeChoosableFileFilters(chooser);
+                chooser.setFileFilter(filter);
+                final int ret = chooser.showOpenDialog(null);
+                if (ret == JFileChooser.APPROVE_OPTION) {
+                    outputPathFile = FileUtil.removeExtensionIfAny(chooser
+                            .getSelectedFile());
+                    jTextField_RasterOut.setText(outputPathFile.getPath()
+                            .concat(".tif"));
+                    FileOperations.lastVisitedFolder = outputPathFile;
+                }
+            }
+        });
+        jTextField_RasterOut.setEditable(true);
+        jButton_Dir.setIcon(icon16);
+        jTextField_RasterOut.setPreferredSize(new Dimension(250, 20));
+        FormUtils.addRowInGBL(jPanel, 3, 0, jTextField_RasterOut);
+        FormUtils.addRowInGBL(jPanel, 3, 1, jButton_Dir);
+        return jPanel;
+    }
+
+    public JPanel createInputFilePanel() {
+        final FileNameExtensionFilter filter;
+        filter = new FileNameExtensionFilter("GDAL raster", new String[] {
+                "asc", "bil", "bip", "bsq", "bmp", "ecw", "flt", "gif", "gis",
+                "grd", "img", "jpg", "jpeg", "jp2", "j2k", "lan", "map", "mpr",
+                "mpl", "pdf", "sid", "raw", "xyz", "sid", "tiff", "tif" });
+        JPanel jPanel = new JPanel(new GridBagLayout());
+        jPanel = new javax.swing.JPanel();
+        jTextField_RasterIn = new JTextField();
+        final JButton jButton_Dir = new JButton();
+        jTextField_RasterIn.setText("");
+        jButton_Dir.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent evt) {
+                File outputPathFile = null;
+                final JFileChooser chooser = new 
GUIUtil.FileChooserWithOverwritePrompting();
+                chooser.setDialogTitle(getName());
+                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+                chooser.setSelectedFile(FileOperations.lastVisitedFolder);
+                chooser.setDialogType(JFileChooser.SAVE_DIALOG);
+                GUIUtil.removeChoosableFileFilters(chooser);
+                chooser.setFileFilter(filter);
+                final int ret = chooser.showOpenDialog(null);
+                if (ret == JFileChooser.APPROVE_OPTION) {
+                    outputPathFile = chooser.getSelectedFile();
+                    jTextField_RasterIn.setText(outputPathFile.getPath()
+                            .concat(".tif"));
+                    FileOperations.lastVisitedFolder = outputPathFile;
+                }
+            }
+        });
+        jTextField_RasterIn.setEditable(false);
+        jButton_Dir.setIcon(icon16);
+        jTextField_RasterIn.setPreferredSize(new Dimension(250, 20));
+        FormUtils.addRowInGBL(jPanel, 3, 0, jTextField_RasterIn);
+        FormUtils.addRowInGBL(jPanel, 3, 1, jButton_Dir);
+        return jPanel;
+    }
+
+    public String getOutputFilePath() {
+        return jTextField_RasterOut.getText();
+    }
+
+    @Override
+    public String getName() {
+        return NAME;
+    }
+
+    public static MultiEnableCheck check() {
+        final EnableCheckFactory checkFactory = EnableCheckFactory
+                .getInstance();
+        return new MultiEnableCheck()
+                .add(checkFactory
+                        
.createWindowWithAssociatedTaskFrameMustBeActiveCheck())
+                .add(checkFactory.createAtLeastNLayerablesOfTypeMustExistCheck(
+                        1, RasterImageLayer.class));
+    }
+
+    public static final String MINX_KEY = I18N
+            
.get("org.openjump.core.ui.plugin.layer.pirolraster.RasterImageWizardPanel.minx");
+    public static final String MAXX_KEY = I18N
+            
.get("org.openjump.core.ui.plugin.layer.pirolraster.RasterImageWizardPanel.maxx");
+    public static final String MINY_KEY = I18N
+            
.get("org.openjump.core.ui.plugin.layer.pirolraster.RasterImageWizardPanel.miny");
+    public static final String MAXY_KEY = I18N
+            
.get("org.openjump.core.ui.plugin.layer.pirolraster.RasterImageWizardPanel.maxy");
+    private final JLabel minxLabel = new JLabel();
+    public static JTextField minxTextField = new JTextField();
+    private final JLabel maxxLabel = new JLabel();
+    public static JTextField maxxTextField = new JTextField();
+    private final JLabel minyLabel = new JLabel();
+    public static JTextField minyTextField = new JTextField();
+    private final JLabel maxyLabel = new JLabel();
+    public static JTextField maxyTextField = new JTextField();
+
+    private JPanel jcoordsPanel(MultiInputDialog dialog) {
+        coordsPanel = new JPanel(new GridBagLayout());
+        minxTextField.setPreferredSize(new Dimension(100, 21));
+        minxTextField.setCaretPosition(minxTextField.getText().length());
+        maxxTextField.setPreferredSize(new Dimension(100, 21));
+        maxxTextField.setCaretPosition(maxxTextField.getText().length());
+        minyTextField.setPreferredSize(new Dimension(100, 21));
+        minyTextField.setCaretPosition(minyTextField.getText().length());
+        maxyTextField.setPreferredSize(new Dimension(100, 21));
+        maxyTextField.setCaretPosition(maxyTextField.getText().length());
+
+        minxLabel.setText("X:");
+        maxxLabel.setText("X:");
+        minyLabel.setText("Y:");
+        maxyLabel.setText("Y:");
+
+        final JButton ulbutton = new JButton();
+        ulbutton.setIcon(IconLoader.icon("Select.gif"));
+        ulbutton.setPreferredSize(new Dimension(22, 22));
+        ulbutton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                try {
+                    final Coordinate c1 = frame
+                            .getContext()
+                            .getLayerViewPanel()
+                            .getViewport()
+                            .toModelCoordinate(
+                                    frame.getContext().getLayerViewPanel()
+                                            .getLastClickedPoint());
+                    minxTextField.setText(Double.toString(c1.x));
+                    maxyTextField.setText(Double.toString(c1.y));
+                    dialog.pack();
+                    dialog.repaint();
+                } catch (final NoninvertibleTransformException e1) {
+                    // TODO Auto-generated catch block
+                    e1.printStackTrace();
+                }
+
+            }
+        });
+
+        final JButton lrbutton = new JButton();
+        lrbutton.setIcon(IconLoader.icon("Select.gif"));
+        lrbutton.setPreferredSize(new Dimension(22, 22));
+        ulbutton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                try {
+                    final Coordinate c2 = frame
+                            .getContext()
+                            .getLayerViewPanel()
+                            .getViewport()
+                            .toModelCoordinate(
+                                    frame.getContext().getLayerViewPanel()
+                                            .getLastClickedPoint());
+                    maxxTextField.setText(Double.toString(c2.x));
+                    minyTextField.setText(Double.toString(c2.y));
+                    dialog.pack();
+                    dialog.repaint();
+                } catch (final NoninvertibleTransformException e1) {
+                    // TODO Auto-generated catch block
+                    e1.printStackTrace();
+                }
+
+            }
+        });
+
+        FormUtils.addRowInGBL(coordsPanel, 1, 0, new ImageIcon(getClass()
+                .getResource("lowright.png")), minxLabel, minxTextField,
+                maxyLabel, maxyTextField);
+        FormUtils.addRowInGBL(coordsPanel, 1, 5, lrbutton);
+
+        FormUtils.addRowInGBL(coordsPanel, 0, 0, new ImageIcon(getClass()
+                .getResource("upleft.png")), maxxLabel, maxxTextField,
+                minyLabel, minyTextField);
+        FormUtils.addRowInGBL(coordsPanel, 0, 5, ulbutton);
+        return coordsPanel;
+
+    }
+
+}
\ No newline at end of file


Property changes on: 
core/trunk/src/org/openjump/core/ui/plugin/raster/CropWarpPlugIn.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: 
core/trunk/src/org/openjump/core/ui/plugin/raster/KernelAnalysisPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/raster/KernelAnalysisPlugIn.java 
                        (rev 0)
+++ core/trunk/src/org/openjump/core/ui/plugin/raster/KernelAnalysisPlugIn.java 
2019-04-05 16:08:04 UTC (rev 6166)
@@ -0,0 +1,396 @@
+package org.openjump.core.ui.plugin.raster;
+
+import it.betastudio.adbtoolbox.libs.FileOperations;
+
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+
+import org.openjump.core.apitools.LayerTools;
+import org.openjump.core.rasterimage.RasterImageLayer;
+import org.openjump.core.rasterimage.algorithms.KernelAlgorithm;
+import org.openjump.core.ui.io.file.FileNameExtensionFilter;
+import org.saig.core.gui.swing.sldeditor.util.FormUtils;
+
+import com.vividsolutions.jump.I18N;
+import com.vividsolutions.jump.task.TaskMonitor;
+import com.vividsolutions.jump.util.FileUtil;
+import com.vividsolutions.jump.workbench.model.Category;
+import com.vividsolutions.jump.workbench.plugin.EnableCheck;
+import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
+import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
+import com.vividsolutions.jump.workbench.plugin.PlugInContext;
+import com.vividsolutions.jump.workbench.plugin.ThreadedBasePlugIn;
+import com.vividsolutions.jump.workbench.ui.GUIUtil;
+import com.vividsolutions.jump.workbench.ui.MultiInputDialog;
+import com.vividsolutions.jump.workbench.ui.images.IconLoader;
+
+public class KernelAnalysisPlugIn extends ThreadedBasePlugIn {
+
+    public static String dimension = I18N
+            
.get("org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.dimension");
+
+    private final String CLAYER = RasterMenuNames.Source_Layer;
+    private final String OUTPUT_FILE = RasterMenuNames.Output_file;
+    private final String CHECK = RasterMenuNames.Check_field;
+    private final String KernelAnalysis = RasterMenuNames.KERNEL_NAME;
+    private final String defaultKernels = RasterMenuNames.KERNEL_DEFAULT;
+    private final String PROCESSING = RasterMenuNames.PROCESSING;
+
+    private JComboBox<RasterImageLayer> layerableComboBox = new 
JComboBox<RasterImageLayer>();
+    private RasterImageLayer rLayer;
+    private final ImageIcon icon16 = IconLoader
+            .icon("fugue/folder-horizontal-open_16.png");
+    List<RasterImageLayer> fLayers = new ArrayList<RasterImageLayer>();
+    private JComboBox<String> kernelComboBox = new JComboBox<String>();
+
+    JTextField jTextField_RasterOut = new JTextField();
+
+    private JScrollPane jScrollPane1;
+    private JTable jTable;
+    private DefaultTableModel dtm = null;
+    FileNameExtensionFilter filter;
+    private String path;
+    private String nameKernel;
+
+    public float[] array1d;
+
+    public float[][] array2d;
+
+    final KernelAlgorithm fil = new KernelAlgorithm();
+    String hmKey = new String();
+
+    LinkedHashMap<String, float[]> Map = new LinkedHashMap<String, float[]>();
+    LinkedHashMap<String, String> Map2 = new LinkedHashMap<String, String>();
+
+    @Override
+    public String getName() {
+        return KernelAnalysis;
+    }
+
+    private void setDialogValues(final MultiInputDialog dialog,
+            PlugInContext context) throws IOException {
+        dialog.setSideBarDescription(KernelAnalysis);
+        if (!context.getLayerNamePanel().selectedNodes(RasterImageLayer.class)
+                .isEmpty()) {
+            rLayer = (RasterImageLayer) LayerTools.getSelectedLayerable(
+                    context, RasterImageLayer.class);
+        } else {
+            rLayer = context.getTask().getLayerManager()
+                    .getLayerables(RasterImageLayer.class).get(0);
+        }
+        fLayers = context.getTask().getLayerManager()
+                .getLayerables(RasterImageLayer.class);
+        layerableComboBox = dialog.addLayerableComboBox(CLAYER, rLayer, "",
+                fLayers);
+        layerableComboBox.setSize(200,
+                layerableComboBox.getPreferredSize().height);
+        final ArrayList<String> srsArray = new ArrayList<String>();
+        Map = fil.createDataMap();
+        Map2 = fil.createTextMap();
+        final Iterator<Map.Entry<String, float[]>> itr = Map.entrySet()
+                .iterator();
+        while (itr.hasNext()) {
+            srsArray.add(itr.next().getKey());
+        }
+        kernelComboBox = dialog.addComboBox(defaultKernels, srsArray.get(0),
+                srsArray, null);
+        kernelComboBox.setSize(200, kernelComboBox.getPreferredSize().height);
+        kernelComboBox.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent evt) {
+                fixTable(dialog);
+                jTable.setVisible(true);
+                //  kernelComboBoxActionPerformed(evt);
+            }
+        });
+        jTable = new JTable();
+        jScrollPane1 = new JScrollPane();
+        jTable.setModel(new DefaultTableModel(new Object[][] {
+                { null, null, null, null }, { null, null, null, null },
+                { null, null, null, null }, { null, null, null, null } },
+                new String[] { "Title 1", "Title 2", "Title 3", "Title 4" }));
+        GUIUtil.chooseGoodColumnWidths(jTable);
+        jScrollPane1.setViewportView(jTable);
+        dialog.addRow("Table", jScrollPane1, fillCheck, null);
+        filter = new FileNameExtensionFilter("TIFF", "tif");
+        dialog.addRow("Save", createOutputFilePanel(filter), saveCheck, null);
+        fixComponents(dialog);
+    }
+
+    private void fixComponents(MultiInputDialog dialog) {
+        final String test = 
fil.S_gradientEast;//dialog.getText(defaultKernels);
+        array1d = Map.get(test);
+        final String description = Map2.get(test);
+        final Double dim = Math.sqrt(array1d.length);
+        final int val = dim.intValue();
+        array2d = new float[val][val];
+
+        for (int i = 0; i < val; i++) {
+            System.arraycopy(array1d, (i * val), array2d[i], 0, val);
+        }
+
+        final int columns = array2d[0].length;
+        dtm = new DefaultTableModel(0, columns) {
+            /**
+             * 
+             */
+            private static final long serialVersionUID = 1L;
+
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            @Override
+            public Class getColumnClass(int column) {
+                return Float.class; // number will be displayed right aligned
+            }
+
+            //      @Override
+            //     public boolean isCellEditable(int row, int column) {
+            //all cells false
+            //      return false;
+            //      }
+        };
+
+        for (final float[] rowData : array2d) {
+            final Vector<Object> row = new Vector<Object>(columns);
+            for (final float element : rowData) {
+                row.addElement(new Float(element));
+            }
+
+            dtm.addRow(row);
+        }
+        path = getOutputFilePath();
+        final int it = path.lastIndexOf('.');
+        if (it > 0) {
+            path = path.substring(0, path.length() - path.length() + it);
+        }
+        dialog.setSideBarDescription(description);
+        jTable.setModel(dtm);
+    }
+
+    private void fixTable(MultiInputDialog dialog) {
+        final String test = 
dialog.getText(defaultKernels);//dialog.getText(defaultKernels);
+        array1d = Map.get(test);
+        final String description = Map2.get(test);
+        final Double dim = Math.sqrt(array1d.length);
+        final int val = dim.intValue();
+        array2d = new float[val][val];
+
+        for (int i = 0; i < val; i++) {
+            System.arraycopy(array1d, (i * val), array2d[i], 0, val);
+        }
+
+        final int columns = array2d[0].length;
+        dtm = new DefaultTableModel(0, columns) {
+            /**
+             * 
+             */
+            private static final long serialVersionUID = 1L;
+
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            @Override
+            public Class getColumnClass(int column) {
+                return Float.class; // number will be displayed right aligned
+            }
+        };
+
+        for (final float[] rowData : array2d) {
+            final Vector<Object> row = new Vector<Object>(columns);
+            for (final float element : rowData) {
+                row.addElement(new Float(element));
+            }
+
+            dtm.addRow(row);
+        }
+        path = getOutputFilePath();
+        final int it = path.lastIndexOf('.');
+        if (it > 0) {
+            path = path.substring(0, path.length() - path.length() + it);
+        }
+        dialog.setSideBarDescription(description);
+
+        jTable.setModel(dtm);
+    }
+
+    public float[][] getTableData(JTable table) {
+        final TableModel dtm = table.getModel();
+        final int nRow = dtm.getRowCount(), nCol = dtm.getColumnCount();
+        final float[][] tableData = new float[nRow][nCol];
+        for (int i = 0; i < nRow; i++) {
+            for (int j = 0; j < nCol; j++) {
+                tableData[i][j] = (float) dtm.getValueAt(i, j);
+            }
+        }
+        return tableData;
+    }
+
+    private void getDialogValues(MultiInputDialog dialog) {
+        rLayer = (RasterImageLayer) dialog.getLayerable(CLAYER);
+
+        nameKernel = 
dialog.getText(defaultKernels);//dialog.getText(defaultKernels);
+
+        final float[][] fl2d = getTableData(jTable);
+
+        final int rows = fl2d.length, cols = fl2d[0].length;
+        final float[] mono = new float[(rows * cols)];
+        for (int i = 0; i < rows; i++) {
+            System.arraycopy(fl2d[i], 0, mono, (i * cols), cols);
+        }
+
+        array1d = mono;//Map.get(nameKernel);
+        path = getOutputFilePath();
+        final int it = path.lastIndexOf('.');
+        if (it > 0) {
+            path = path.substring(0, path.length() - path.length() + it);
+        }
+    }
+
+    @Override
+    public boolean execute(PlugInContext context) throws Exception {
+        reportNothingToUndoYet(context);
+        final MultiInputDialog dialog = new MultiInputDialog(
+                context.getWorkbenchFrame(), KernelAnalysis, true);
+        setDialogValues(dialog, context);
+        if (fLayers.isEmpty()) {
+            return false;
+        }
+        GUIUtil.centreOnWindow(dialog);
+        dialog.setVisible(true);
+        if (!dialog.wasOKPressed()) {
+            return false;
+        } else if (dialog.wasOKPressed()) {
+            getDialogValues(dialog);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void run(TaskMonitor monitor, PlugInContext context)
+            throws Exception {
+        monitor.report(PROCESSING);
+        reportNothingToUndoYet(context);
+
+        final File outFile = FileUtil.addExtensionIfNone(new File(path), 
"tif");
+        fil.filterRaster(outFile, rLayer, array1d);
+        String catName = KernelAnalysis;
+        try {
+            catName = ((Category) context.getLayerNamePanel()
+                    .getSelectedCategories().toArray()[0]).getName();
+        } catch (final RuntimeException e1) {
+        }
+        fil.load(outFile, nameKernel, catName);
+
+        return;
+    }
+
+    private final EnableCheck[] saveCheck = new EnableCheck[] { new 
EnableCheck() {
+        @Override
+        public String check(JComponent component) {
+            return jTextField_RasterOut.getText().isEmpty() ? CHECK
+                    .concat(OUTPUT_FILE) : null;
+        }
+    } };
+
+    private final EnableCheck[] fillCheck = new EnableCheck[] { new 
EnableCheck() {
+        @Override
+        public String check(JComponent component) {
+
+            final int nTabRows = jTable.getRowCount();
+            final int nTabCols = jTable.getColumnCount();
+
+            for (int r = 0; r < nTabRows; r++) {
+                for (int c = 0; c < nTabCols; c++) {
+
+                    return jTable.getValueAt(r, c).equals("")
+                            || jTable.getValueAt(r, c).equals(null) ||
+
+                            !isNumeric(jTable.getValueAt(r, c).toString())
+
+                    ? CHECK.concat("Table") : null;
+
+                }
+            }
+            return CHECK;
+
+        }
+    } };
+
+    public static boolean isNumeric(String str) {
+        return str.matches("-?\\d+(\\.\\d+)?"); //match a number with optional 
'-' and decimal.
+    }
+
+    public JPanel createOutputFilePanel(FileNameExtensionFilter filter) {
+        JPanel jPanel = new JPanel(new GridBagLayout());
+        jPanel = new javax.swing.JPanel();
+        final JLabel jLabel3 = new javax.swing.JLabel();
+        jTextField_RasterOut = new JTextField();
+        final JButton jButton_Dir = new JButton();
+        jTextField_RasterOut.setText("");
+        jButton_Dir.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent evt) {
+                File outputPathFile = null;
+                final JFileChooser chooser = new 
GUIUtil.FileChooserWithOverwritePrompting();
+                chooser.setDialogTitle(getName());
+                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+
+                chooser.setSelectedFile(FileOperations.lastVisitedFolder);
+                chooser.setDialogType(JFileChooser.SAVE_DIALOG);
+                GUIUtil.removeChoosableFileFilters(chooser);
+                chooser.setFileFilter(filter);
+                final int ret = chooser.showOpenDialog(null);
+                if (ret == JFileChooser.APPROVE_OPTION) {
+                    outputPathFile = FileUtil.removeExtensionIfAny(chooser
+                            .getSelectedFile());
+                    jTextField_RasterOut.setText(outputPathFile.getPath()
+                            .concat(".tif"));
+                    FileOperations.lastVisitedFolder = outputPathFile;
+                }
+            }
+        });
+        jLabel3.setText(OUTPUT_FILE);
+        jTextField_RasterOut.setEditable(true);
+        jButton_Dir.setIcon(icon16);
+        jTextField_RasterOut.setPreferredSize(new Dimension(250, 20));
+        FormUtils.addRowInGBL(jPanel, 3, 0, OUTPUT_FILE, jTextField_RasterOut);
+        FormUtils.addRowInGBL(jPanel, 3, 2, jButton_Dir);
+        return jPanel;
+    }
+
+    public String getOutputFilePath() {
+        return jTextField_RasterOut.getText();
+    }
+
+    public static MultiEnableCheck check() {
+        final EnableCheckFactory checkFactory = EnableCheckFactory
+                .getInstance();
+        return new MultiEnableCheck()
+                .add(checkFactory
+                        
.createWindowWithAssociatedTaskFrameMustBeActiveCheck())
+                .add(checkFactory.createAtLeastNLayerablesOfTypeMustExistCheck(
+                        1, RasterImageLayer.class));
+    }
+
+}


Property changes on: 
core/trunk/src/org/openjump/core/ui/plugin/raster/KernelAnalysisPlugIn.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: core/trunk/src/org/openjump/core/ui/plugin/raster/ManageDataPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/plugin/raster/ManageDataPlugIn.java     
                        (rev 0)
+++ core/trunk/src/org/openjump/core/ui/plugin/raster/ManageDataPlugIn.java     
2019-04-05 16:08:04 UTC (rev 6166)
@@ -0,0 +1,619 @@
+/*
+* Copyright (C) 2019  Giuseppe Aruta
+* 
+* This program 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 2 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, write to the Free Software
+* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+* 
+* ******************************************************************
+*/
+package org.openjump.core.ui.plugin.raster;
+
+import static com.vividsolutions.jump.I18N.get;
+import it.betastudio.adbtoolbox.libs.FileOperations;
+
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JSpinner;
+import javax.swing.JTextField;
+import javax.swing.SpinnerModel;
+import javax.swing.SpinnerNumberModel;
+
+import org.openjump.core.apitools.LayerTools;
+import org.openjump.core.rasterimage.RasterImageLayer;
+import org.openjump.core.rasterimage.algorithms.GenericRasterAlgorithm;
+import org.openjump.core.ui.io.file.FileNameExtensionFilter;
+import org.openjump.core.ui.util.LayerableUtil;
+import org.saig.core.gui.swing.sldeditor.util.FormUtils;
+
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jump.I18N;
+import com.vividsolutions.jump.task.TaskMonitor;
+import com.vividsolutions.jump.util.FileUtil;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
+import com.vividsolutions.jump.workbench.WorkbenchContext;
+import com.vividsolutions.jump.workbench.model.Category;
+import com.vividsolutions.jump.workbench.model.StandardCategoryNames;
+import com.vividsolutions.jump.workbench.plugin.EnableCheck;
+import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
+import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
+import com.vividsolutions.jump.workbench.plugin.PlugInContext;
+import com.vividsolutions.jump.workbench.plugin.ThreadedBasePlugIn;
+import com.vividsolutions.jump.workbench.ui.GUIUtil;
+import com.vividsolutions.jump.workbench.ui.MultiInputDialog;
+import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
+import com.vividsolutions.jump.workbench.ui.images.IconLoader;
+
+public class ManageDataPlugIn extends ThreadedBasePlugIn {
+    /**
+     * 
+     * @author Giuseppe Aruta 2019_25_03
+     * A comprensive class/plugin to manage data of a single raster layer
+     */
+    public static WorkbenchFrame frame = 
JUMPWorkbench.getInstance().getFrame();
+
+    private final String CHANGE_NODATA = I18N
+            
.get("org.openjump.core.ui.plugin.raster.nodata.ChangeNoDataValuePlugIn.name");
+    private final String CHANGE_INTERVAL_TO_NODATA = I18N
+            
.get("org.openjump.core.ui.plugin.raster.nodata.ChangeRangeValuesToNoDataPlugIn.name");
+    private final String FROM = I18N
+            .get("org.openjump.core.ui.plugin.raster.nodata.from");
+    private final String TO = I18N
+            .get("org.openjump.core.ui.plugin.raster.nodata.to");
+    private final String LOWER_VALUE = I18N
+            .get("com.vividsolutions.jump.util.Frequency.lower-value");
+    private final String UPPER_VALUE = I18N
+            .get("com.vividsolutions.jump.util.Frequency.upper-value");
+    private final String STATISTICS = I18N
+            .get("org.openjump.core.ui.plugin.raster.nodata.CellStatistics");
+    private final String NODATA = I18N
+            .get("org.openjump.core.ui.plugin.raster.nodata.nodata");
+    private final String MIN = I18N
+            .get("org.openjump.core.ui.plugin.raster.nodata.min");
+    private final String MAX = I18N
+            .get("org.openjump.core.ui.plugin.raster.nodata.max");
+    private final String ERROR = I18N.get("ui.GenericNames.Error");
+    private final String SELECT_BAND = I18N
+            
.get("org.openjump.core.ui.plugin.raster.HistogramPlugIn.select-one-band");
+
+    private final ImageIcon icon16 = IconLoader
+            .icon("fugue/folder-horizontal-open_16.png");
+    private JTextField target_nodata, source_nodata, lv_field, uv_field, nd,
+            max, min;
+    private JLabel source_NoData_label, target_NoData_label, lv_label,
+            uv_label;
+    JTextField jTextField_RasterOut = new JTextField();
+    private JPanel mainPanel, rangePanel, resetPanel, decimalPanel;
+    private RasterImageLayer rLayer;
+    private JComboBox<String> comboBox = new JComboBox<String>();
+    private JComboBox<RasterImageLayer> layerableComboBox = new 
JComboBox<RasterImageLayer>();
+    private String UNIT;
+    private JRadioButton radioMin = new JRadioButton();
+    private JRadioButton radioMax = new JRadioButton();
+    boolean minval = true;
+    boolean maxval = false;
+    double min_value, max_value;
+    private String path;
+    private final SpinnerModel dimensionModel = new SpinnerNumberModel(2, // 
initial
+            // value
+            0, // min
+            25, // max
+            1);
+    private JSpinner dimensionSpinner = new JSpinner();
+    private Integer dimension;
+    Envelope envWanted = new Envelope();
+    Envelope fix = new Envelope();
+
+    private final String CLAYER = RasterMenuNames.Source_Layer;
+    private final String OUTPUT_FILE = RasterMenuNames.Output_file;
+    private final String CHECK = RasterMenuNames.Check_field;
+    private final String ACTION = RasterMenuNames.Choose_an_action;
+    private final String CHANGE_NODATA_TIP = RasterMenuNames.CHANGE_NODATA_TIP;
+    private final String CHANGE_INTERVAL_TO_NODATA_TIP = 
RasterMenuNames.CHANGE_INTERVAL_TO_NODATA_TIP;
+    private final String EXTRACT_INTERVAL_TIP = 
RasterMenuNames.EXTRACT_INTERVAL_TIP;
+    private final String EXTRACT_INTERVAL = RasterMenuNames.EXTRACT_INTERVAL;
+    private final String RESET_NODATA_TAG_TIP = 
RasterMenuNames.RESET_NODATA_TAG_TIP;
+    private final String RESET_NODATA_TAG = RasterMenuNames.RESET_NODATA_TAG;
+    private final String SET_DECIMAL = RasterMenuNames.SET_DECIMAL;
+    private final String SET_DECIMAL_TIP = RasterMenuNames.SET_DECIMAL_TIP;
+    private final String RESET_TO_MIN = RasterMenuNames.RESET_TO_MIN;
+    private final String RESET_TO_MAX = RasterMenuNames.RESET_TO_MAX;
+    private final String NAME = RasterMenuNames.DATA_NAME;
+    private final String PROCESSING = RasterMenuNames.PROCESSING;
+    private final static String CHECK_FILE = RasterMenuNames.SINGLE_BAND_EXIST;
+
+    List<RasterImageLayer> fLayers = new ArrayList<RasterImageLayer>();
+
+    public static MultiEnableCheck createEnableCheck(
+            WorkbenchContext workbenchContext) {
+        final EnableCheckFactory checkFactory = new EnableCheckFactory(
+                workbenchContext);
+        return new MultiEnableCheck()
+                .add(checkFactory
+                        
.createWindowWithAssociatedTaskFrameMustBeActiveCheck())
+                .add(checkFactory.createAtLeastNLayerablesOfTypeMustExistCheck(
+                        1, RasterImageLayer.class)).add(new EnableCheck() {
+                    @Override
+                    public String check(JComponent component) {
+                        final List<RasterImageLayer> mLayer = new 
ArrayList<RasterImageLayer>();
+                        final Collection<RasterImageLayer> rlayers = 
workbenchContext
+                                .getLayerManager().getLayerables(
+                                        RasterImageLayer.class);
+                        for (final RasterImageLayer currentLayer : rlayers) {
+                            if (LayerableUtil.isMonoband(currentLayer)) {
+                                mLayer.add(currentLayer);
+                            }
+                        }
+                        if (!mLayer.isEmpty()) {
+                            return null;
+                        }
+                        String msg = null;
+                        if (mLayer.isEmpty()) {
+                            msg = get(CHECK_FILE);
+                        }
+                        return msg;
+                    }
+                });
+    }
+
+    private void setDialogValues(final MultiInputDialog dialog,
+            PlugInContext context) throws IOException {
+        dialog.setSideBarDescription(CHANGE_NODATA_TIP);
+
+        if (!context.getLayerNamePanel().selectedNodes(RasterImageLayer.class)
+                .isEmpty()) {
+            rLayer = (RasterImageLayer) LayerTools.getSelectedLayerable(
+                    context, RasterImageLayer.class);
+        } else {
+            rLayer = context.getTask().getLayerManager()
+                    .getLayerables(RasterImageLayer.class).get(0);
+        }
+        min_value = rLayer.getMetadata().getStats().getMin(0);
+        max_value = rLayer.getMetadata().getStats().getMax(0);
+
+        fLayers = context.getTask().getLayerManager()
+                .getLayerables(RasterImageLayer.class);
+        layerableComboBox = dialog.addLayerableComboBox(CLAYER, rLayer, "",
+                fLayers);
+        layerableComboBox.setSize(200,
+                layerableComboBox.getPreferredSize().height);
+        layerableComboBox.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                updateValues(e, dialog);
+                dialog.pack();
+                dialog.repaint();
+            }
+        });
+        final ArrayList<String> srsArray = new ArrayList<String>();
+        srsArray.add(CHANGE_NODATA);
+        srsArray.add(CHANGE_INTERVAL_TO_NODATA);
+        srsArray.add(EXTRACT_INTERVAL);
+        srsArray.add(RESET_NODATA_TAG);
+        srsArray.add(SET_DECIMAL);
+        comboBox = dialog.addComboBox(ACTION, "", srsArray, null);
+        comboBox.setSize(200, comboBox.getPreferredSize().height);
+        comboBox.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                updateGUI(e, dialog);
+                updateValues(e, dialog);
+                dialog.pack();
+                dialog.repaint();
+            }
+        });
+        dialog.addRow(statisticPanel());
+        dialog.addRow("ChangeNoData", changeNoDataValuePanel(),
+                chengeNoDataCheck, null);
+        dialog.addRow("ChangeData", changeRangeToNoDataPanel(),
+                chengeDataCheck, null);
+        dialog.addRow(resetNoDataPanel());
+        dialog.addRow(decimalPanel());
+        rangePanel.setEnabled(false);
+        rangePanel.setVisible(false);
+        resetPanel.setVisible(false);
+        decimalPanel.setEnabled(false);
+        decimalPanel.setVisible(false);
+        final FileNameExtensionFilter filter;
+        filter = new FileNameExtensionFilter("TIF", "tif");
+        dialog.addRow("Save", createOutputFilePanel(filter), saveCheck, null);
+
+    }
+
+    private final EnableCheck[] chengeDataCheck = new EnableCheck[] {
+            new EnableCheck() {
+                @Override
+                public String check(JComponent component) {
+                    return uv_field.getText().isEmpty() ? CHECK
+                            .concat(UPPER_VALUE) : null;
+                }
+            }, new EnableCheck() {
+                @Override
+                public String check(JComponent component) {
+                    return lv_field.getText().isEmpty() ? CHECK
+                            .concat(LOWER_VALUE) : null;
+                }
+            }, new EnableCheck() {
+                @Override
+                public String check(JComponent component) {
+                    return Double.parseDouble(lv_field.getText()) > Double
+                            .parseDouble(uv_field.getText()) ? ERROR + " :"
+                            + LOWER_VALUE + ">" + UPPER_VALUE + "!" : null;
+                }
+            }
+
+    };
+
+    private final EnableCheck[] chengeNoDataCheck = new EnableCheck[] { new 
EnableCheck() {
+        @Override
+        public String check(JComponent component) {
+            return target_nodata.getText().isEmpty() ? CHECK.concat(TO) : null;
+        }
+    } };
+
+    private final EnableCheck[] saveCheck = new EnableCheck[] { new 
EnableCheck() {
+        @Override
+        public String check(JComponent component) {
+            return jTextField_RasterOut.getText().isEmpty() ? CHECK
+                    .concat(OUTPUT_FILE) : null;
+        }
+    } };
+
+    private void getDialogValues(MultiInputDialog dialog) {
+        rLayer = (RasterImageLayer) dialog.getLayerable(CLAYER);
+        UNIT = dialog.getText(ACTION);
+        if (UNIT.equals(RESET_NODATA_TAG)) {
+            minval = dialog.getBoolean(RESET_TO_MIN);
+            maxval = dialog.getBoolean(RESET_TO_MAX);
+        }
+        dimension = (Integer) dimensionSpinner.getValue();
+        path = getOutputFilePath();
+        final int i = path.lastIndexOf('.');
+        if (i > 0) {
+            path = path.substring(0, path.length() - path.length() + i);
+        }
+    }
+
+    @Override
+    public boolean execute(PlugInContext context) throws Exception {
+        reportNothingToUndoYet(context);
+        final MultiInputDialog dialog = new MultiInputDialog(
+                context.getWorkbenchFrame(), NAME, true);
+        setDialogValues(dialog, context);
+        if (fLayers.isEmpty()) {
+            return false;
+        }
+        GUIUtil.centreOnWindow(dialog);
+        dialog.setVisible(true);
+        if (!dialog.wasOKPressed()) {
+            return false;
+        } else if (dialog.wasOKPressed()) {
+            getDialogValues(dialog);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void run(TaskMonitor monitor, PlugInContext context)
+            throws Exception {
+        monitor.report(PROCESSING);
+        reportNothingToUndoYet(context);
+        final GenericRasterAlgorithm IO = new GenericRasterAlgorithm();
+        int band = 0;
+        if (rLayer.getNumBands() > 1) {
+            final String[] bands = { "0", "1", "2" };
+            final String stringInput = (String) JOptionPane.showInputDialog(
+                    JUMPWorkbench.getInstance().getFrame(), SELECT_BAND,
+                    getName(), JOptionPane.PLAIN_MESSAGE, null, bands, "0");
+            try {
+                band = Integer.parseInt(stringInput);
+            } catch (final NumberFormatException e) {
+                return; // The typed text was not an integer
+                // band = 0;
+            }
+        }
+
+        final File outFile = FileUtil.addExtensionIfNone(new File(path), 
"tif");
+        if (UNIT.equals(CHANGE_NODATA)) {
+            final double newdata = Double.parseDouble(target_nodata.getText());
+            final double olddata = rLayer.getNoDataValue();
+            IO.save_ChangeNoData(outFile, rLayer, band, olddata, newdata);
+        } else if (UNIT.equals(CHANGE_INTERVAL_TO_NODATA)) {
+            final double mindata = Double.parseDouble(lv_field.getText());
+            final double maxdata = Double.parseDouble(uv_field.getText());
+            IO.save_LimitValidData(outFile, rLayer, band, mindata, maxdata);
+        } else if (UNIT.equals(EXTRACT_INTERVAL)) {
+            final double mindata = Double.parseDouble(lv_field.getText());
+            final double maxdata = Double.parseDouble(uv_field.getText());
+            IO.save_ExtractValidData(outFile, rLayer, band, mindata, maxdata);
+        } else if (UNIT.equals(RESET_NODATA_TAG)) {
+            if (minval) {
+                IO.save_ResetNoDataTag(outFile, rLayer, band, 
rLayer.getMetadata()
+                        .getStats().getMin(0));
+            } else if (maxval) {
+                IO.save_ResetNoDataTag(outFile, rLayer, band, 
rLayer.getMetadata()
+                        .getStats().getMax(0));
+            }
+        } else if (UNIT.equals(SET_DECIMAL)) {
+            IO.save_ChangeDecimalValues(outFile, rLayer, band, dimension);
+        }
+        String catName = StandardCategoryNames.WORKING;
+        try {
+            catName = ((Category) context.getLayerNamePanel()
+                    .getSelectedCategories().toArray()[0]).getName();
+        } catch (final RuntimeException e1) {
+        }
+        IO.load(outFile, catName);
+        return;
+    }
+
+    private void updateValues(ActionEvent evt, MultiInputDialog dialog) {
+        final RasterImageLayer rasLayer = (RasterImageLayer) dialog
+                .getLayerable(CLAYER);
+        min.setText(rasLayer.getMetadata().getStats().getMin(0) + "");
+        max.setText(rasLayer.getMetadata().getStats().getMax(0) + "");
+        nd.setText(rasLayer.getNoDataValue() + "");
+        source_nodata.setText(rasLayer.getNoDataValue() + "");
+        lv_field.setText(min_value + "");
+        uv_field.setText(max_value + "");
+    }
+
+    private void updateGUI(ActionEvent evt, MultiInputDialog dialog) {
+        switch (comboBox.getSelectedIndex()) {
+        case 0:
+            dialog.setSideBarDescription(CHANGE_NODATA_TIP);
+            mainPanel.setEnabled(true);
+            mainPanel.setVisible(true);
+            rangePanel.setEnabled(false);
+            rangePanel.setVisible(false);
+            resetPanel.setEnabled(false);
+            resetPanel.setVisible(false);
+            decimalPanel.setVisible(false);
+            decimalPanel.setEnabled(false);
+            break;
+        case 1:
+            dialog.setSideBarDescription(CHANGE_INTERVAL_TO_NODATA_TIP);
+            rangePanel.setEnabled(true);
+            rangePanel.setVisible(true);
+            rangePanel.setBorder(BorderFactory
+                    .createTitledBorder(CHANGE_INTERVAL_TO_NODATA));
+            mainPanel.setEnabled(false);
+            mainPanel.setVisible(false);
+            resetPanel.setEnabled(false);
+            resetPanel.setVisible(false);
+            decimalPanel.setVisible(false);
+            decimalPanel.setEnabled(false);
+            break;
+        case 2:
+            dialog.setSideBarDescription(EXTRACT_INTERVAL_TIP);
+            rangePanel.setEnabled(true);
+            rangePanel.setVisible(true);
+            rangePanel.setBorder(BorderFactory
+                    .createTitledBorder(EXTRACT_INTERVAL));
+            mainPanel.setEnabled(false);
+            mainPanel.setVisible(false);
+            resetPanel.setEnabled(false);
+            resetPanel.setVisible(false);
+            decimalPanel.setEnabled(false);
+            decimalPanel.setVisible(false);
+            break;
+        case 3:
+            dialog.setSideBarDescription(RESET_NODATA_TAG_TIP);
+            resetPanel.setEnabled(true);
+            resetPanel.setVisible(true);
+            mainPanel.setEnabled(false);
+            mainPanel.setVisible(false);
+            rangePanel.setEnabled(false);
+            rangePanel.setVisible(false);
+            decimalPanel.setEnabled(false);
+            decimalPanel.setVisible(false);
+            break;
+        case 4:
+            dialog.setSideBarDescription(SET_DECIMAL_TIP);
+            decimalPanel.setEnabled(true);
+            decimalPanel.setVisible(true);
+            resetPanel.setEnabled(false);
+            resetPanel.setVisible(false);
+            mainPanel.setEnabled(false);
+            mainPanel.setVisible(false);
+            rangePanel.setEnabled(false);
+            rangePanel.setVisible(false);
+            break;
+
+        }
+    }
+
+    private JPanel statisticPanel() {
+        final JPanel jPanel1 = new JPanel(new GridBagLayout());
+        jPanel1.setBorder(BorderFactory.createTitledBorder(STATISTICS));
+        nd = new JTextField(String.valueOf(rLayer.getNoDataValue()));
+        nd.setEditable(false);
+        max = new JTextField(min_value + "");
+        max.setEditable(false);
+        min = new JTextField(max_value + "");
+        min.setEditable(false);
+        final JLabel nd_label = new JLabel(NODATA);
+        final JLabel min_label = new JLabel(MIN);
+        final JLabel max_label = new JLabel(MAX);
+        FormUtils.addRowInGBL(jPanel1, 1, 0, nd_label, nd);
+        FormUtils.addRowInGBL(jPanel1, 1, 2, min_label, min);
+        FormUtils.addRowInGBL(jPanel1, 1, 4, max_label, max);
+        return jPanel1;
+    }
+
+    private JPanel resetNoDataPanel() {
+        resetPanel = new JPanel(new GridBagLayout());
+        resetPanel
+                .setBorder(BorderFactory.createTitledBorder(RESET_NODATA_TAG));
+        radioMin = new JRadioButton(RESET_TO_MIN);
+        radioMin.setSelected(true);
+        radioMax = new JRadioButton(RESET_TO_MAX);
+        final ButtonGroup group = new ButtonGroup();
+        group.add(radioMin);
+        group.add(radioMax);
+        FormUtils.addRowInGBL(resetPanel, 1, 0, radioMin);
+        FormUtils.addRowInGBL(resetPanel, 2, 0, radioMax);
+        return resetPanel;
+    }
+
+    private JPanel decimalPanel() {
+        decimalPanel = new JPanel(new GridBagLayout());
+        decimalPanel.setBorder(BorderFactory.createTitledBorder(SET_DECIMAL));
+        dimensionSpinner = new JSpinner(dimensionModel);
+        dimensionSpinner.setSize(20, 10);
+        FormUtils.addRowInGBL(decimalPanel, 1, 0, dimensionSpinner);
+        return decimalPanel;
+    }
+
+    public JPanel changeNoDataValuePanel() {
+        mainPanel = new JPanel(new GridBagLayout());
+        source_NoData_label = new JLabel(FROM);
+        target_NoData_label = new JLabel(TO);
+        source_nodata = new 
JTextField(String.valueOf(rLayer.getNoDataValue()));
+        source_nodata.setEditable(false);
+        target_nodata = new JTextField(String.valueOf("-99999"));
+        source_nodata.addKeyListener(new java.awt.event.KeyAdapter() {
+            @Override
+            public void keyTyped(KeyEvent e) {
+                final char vChar = e.getKeyChar();
+                if (!(Character.isDigit(vChar) || (vChar == KeyEvent.VK_PERIOD)
+                        || (vChar == KeyEvent.VK_BACK_SPACE) || (vChar == 
KeyEvent.VK_DELETE))) {
+                    e.consume();
+                }
+            }
+        });
+        target_nodata.addKeyListener(new java.awt.event.KeyAdapter() {
+            @Override
+            public void keyTyped(KeyEvent e) {
+                final char vChar = e.getKeyChar();
+                if (!(Character.isDigit(vChar) || (vChar == KeyEvent.VK_PERIOD)
+                        || (vChar == KeyEvent.VK_BACK_SPACE)
+                        || (vChar == KeyEvent.VK_DELETE) || (vChar == 
KeyEvent.VK_MINUS))) {
+                    e.consume();
+                }
+            }
+        });
+        mainPanel.setBorder(BorderFactory.createTitledBorder(CHANGE_NODATA));
+        FormUtils.addRowInGBL(mainPanel, 2, 0, source_NoData_label,
+                source_nodata);
+        FormUtils.addRowInGBL(mainPanel, 2, 3, target_NoData_label,
+                target_nodata);
+        return mainPanel;
+    }
+
+    public JPanel changeRangeToNoDataPanel() {
+        rangePanel = new JPanel(new GridBagLayout());
+        lv_field = new JTextField(String.valueOf(rLayer.getMetadata()
+                .getStats().getMin(0)));
+        lv_field.addKeyListener(new java.awt.event.KeyAdapter() {
+            @Override
+            public void keyTyped(KeyEvent e) {
+                final char vChar = e.getKeyChar();
+                if (!(Character.isDigit(vChar) || (vChar == KeyEvent.VK_PERIOD)
+                        || (vChar == KeyEvent.VK_BACK_SPACE)
+                        || (vChar == KeyEvent.VK_DELETE) || (vChar == 
KeyEvent.VK_MINUS))) {
+                    e.consume();
+                }
+            }
+        });
+        uv_field = new JTextField(String.valueOf(rLayer.getMetadata()
+                .getStats().getMax(0)));
+        uv_field.addKeyListener(new java.awt.event.KeyAdapter() {
+            @Override
+            public void keyTyped(KeyEvent e) {
+                final char vChar = e.getKeyChar();
+                if (!(Character.isDigit(vChar) || (vChar == KeyEvent.VK_PERIOD)
+                        || (vChar == KeyEvent.VK_BACK_SPACE)
+                        || (vChar == KeyEvent.VK_DELETE) || (vChar == 
KeyEvent.VK_MINUS))) {
+                    e.consume();
+                }
+            }
+        });
+        lv_label = new JLabel(LOWER_VALUE);
+        uv_label = new JLabel(UPPER_VALUE);
+        rangePanel.setBorder(BorderFactory
+                .createTitledBorder(CHANGE_INTERVAL_TO_NODATA));
+        FormUtils.addRowInGBL(rangePanel, 2, 0, lv_label, lv_field);
+        FormUtils.addRowInGBL(rangePanel, 2, 2, uv_label, uv_field);
+        return rangePanel;
+    }
+
+    public JPanel createOutputFilePanel(FileNameExtensionFilter filter) {
+        JPanel jPanel = new JPanel(new GridBagLayout());
+        jPanel = new javax.swing.JPanel();
+        final JLabel jLabel3 = new javax.swing.JLabel();
+        jTextField_RasterOut = new JTextField();
+        final JButton jButton_Dir = new JButton();
+        jTextField_RasterOut.setText("");
+        jButton_Dir.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent evt) {
+                File outputPathFile = null;
+                final JFileChooser chooser = new 
GUIUtil.FileChooserWithOverwritePrompting();
+                chooser.setDialogTitle(getName());
+                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+
+                chooser.setSelectedFile(FileOperations.lastVisitedFolder);
+                chooser.setDialogType(JFileChooser.SAVE_DIALOG);
+                GUIUtil.removeChoosableFileFilters(chooser);
+                chooser.setFileFilter(filter);
+                final int ret = chooser.showOpenDialog(null);
+                if (ret == JFileChooser.APPROVE_OPTION) {
+                    outputPathFile = FileUtil.removeExtensionIfAny(chooser
+                            .getSelectedFile());
+                    jTextField_RasterOut.setText(outputPathFile.getPath()
+                            .concat(".tif"));
+                    FileOperations.lastVisitedFolder = outputPathFile;
+                }
+            }
+        });
+        jLabel3.setText(OUTPUT_FILE);
+        jTextField_RasterOut.setEditable(false);
+        jButton_Dir.setIcon(icon16);
+        jTextField_RasterOut.setPreferredSize(new Dimension(250, 20));
+        FormUtils.addRowInGBL(jPanel, 3, 0, OUTPUT_FILE, jTextField_RasterOut);
+        FormUtils.addRowInGBL(jPanel, 3, 2, jButton_Dir);
+        return jPanel;
+    }
+
+    public String getOutputFilePath() {
+        return jTextField_RasterOut.getText();
+    }
+
+    @Override
+    public String getName() {
+        return NAME;
+    }
+
+}
\ No newline at end of file


Property changes on: 
core/trunk/src/org/openjump/core/ui/plugin/raster/ManageDataPlugIn.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property


_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to