Revision: 5934
          http://sourceforge.net/p/jump-pilot/code/5934
Author:   ma15569
Date:     2018-08-28 12:48:05 +0000 (Tue, 28 Aug 2018)
Log Message:
-----------
Reactivated Raster Legend plugin with option to save legend to image

Modified Paths:
--------------
    
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java

Added Paths:
-----------
    core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java

Added: 
core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java 
                        (rev 0)
+++ core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java 
2018-08-28 12:48:05 UTC (rev 5934)
@@ -0,0 +1,383 @@
+package org.openjump.core.rasterimage.styler;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.event.ActionEvent;
+import java.awt.image.BufferedImage;
+import java.awt.image.Raster;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.TreeMap;
+
+import javax.imageio.ImageIO;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JLayeredPane;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+
+import org.apache.log4j.Logger;
+import org.openjump.core.apitools.LayerTools;
+import org.openjump.core.rasterimage.RasterImageLayer;
+import org.openjump.core.rasterimage.RasterSymbology;
+import org.openjump.core.rasterimage.styler.ui.ColorsLabelLegendComponent;
+import org.openjump.core.rasterimage.styler.ui.GradientLabelLegendComponent;
+import org.openjump.core.ui.io.file.FileNameExtensionFilter;
+import org.openjump.core.ui.plugin.layer.pirolraster.RasterImageContextMenu;
+import org.openjump.core.ui.swing.DetachableInternalFrame;
+
+import com.sun.media.jai.codec.TIFFEncodeParam;
+import com.sun.media.jai.codec.TIFFField;
+import com.sun.media.jai.codecimpl.TIFFCodec;
+import com.sun.media.jai.codecimpl.TIFFImageEncoder;
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jump.I18N;
+import com.vividsolutions.jump.task.TaskMonitor;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
+import com.vividsolutions.jump.workbench.WorkbenchContext;
+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.ThreadedPlugIn;
+import com.vividsolutions.jump.workbench.ui.GUIUtil;
+
+/**
+ * Plugin for displaying the raster (ASC, FLT formats) legend. The menu is
+ * actived only if a raster layer is selected.
+ * 
+ * [Giuseppe Aruta 28/08/2018] Reactivated with option to save legend to image
+ * TODO Internazionalize
+ * 
+ * @author GeomaticaEAmbiente
+ */
+public class RasterLegendPlugIn implements ThreadedPlugIn {
+
+    private final String sSaved = I18N
+            
.get("org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.file.saved");
+    private final String sShowLegend = I18N
+            .get("org.openjump.core.ui.plugin.style");
+    private final String SCouldNotSave = I18N
+            
.get("org.openjump.sextante.gui.additionalResults.AdditionalResultsPlugIn.Could-not-save-selected-result");
+    private final String SAVE = I18N
+            .get("deejump.plugin.SaveLegendPlugIn.Save");
+    private final String CLOSE = I18N
+            .get("ui.plugin.imagery.ImageLayerManagerDialog.Close");
+
+    @Override
+    public void initialize(PlugInContext context) throws Exception {
+
+        /* Add item to pop-up menu, only for rasters */
+        final JPopupMenu menu = RasterImageContextMenu.getInstance(context);
+        context.getFeatureInstaller().addPopupMenuPlugin(menu, this, getName(),
+                false, null, createEnableCheck(context.getWorkbenchContext()));
+
+    }
+
+    JScrollPane scrollPane = new JScrollPane();
+    WorkbenchContext wcontext = JUMPWorkbench.getInstance().getContext();
+
+    public static RasterImageLayer rasterImageLayer = new RasterImageLayer();
+
+    public static RasterImageLayer getLayer() {
+        return rasterImageLayer;
+
+    }
+
+    @Override
+    public boolean execute(PlugInContext context) throws Exception {
+
+        rasterImageLayer = (RasterImageLayer) LayerTools.getSelectedLayerable(
+                context, RasterImageLayer.class);
+
+        final RasterSymbology rasterStyler = rasterImageLayer.getSymbology();
+
+        if (rasterStyler.getColorMapEntries_tm().size() > 40) {
+            JOptionPane.showMessageDialog(context.getWorkbenchFrame(),
+                    // bundle.getString("LegendDialog.More40Colors.message"),
+                    "More than 40 colors", RasterStylesExtension.extensionName,
+                    JOptionPane.INFORMATION_MESSAGE);
+            return false;
+        }
+
+        final TreeMap<Double, Color> colorMapEntries = rasterStyler
+                .getColorMapEntries_tm();
+
+        final String type = RasterLegendPlugIn.getLayer().getSymbology()
+                .getColorMapType();
+
+        if (type.equals(RasterSymbology.TYPE_INTERVALS)
+                || type.equals(RasterSymbology.TYPE_SINGLE)) {
+            scrollPane = new JScrollPane(getPanelInterval(colorMapEntries,
+                    rasterImageLayer),
+                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+
+        } else if (type.equals(RasterSymbology.TYPE_RAMP)) {
+            scrollPane = new JScrollPane(getPanelGradient(colorMapEntries,
+                    rasterImageLayer),
+                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+
+        }
+
+        scrollPane.setPreferredSize(new Dimension(300, 400));
+        final JPanel panel = new JPanel();
+        panel.setLayout(new BorderLayout());
+        panel.add(scrollPane, BorderLayout.CENTER);
+        panel.setPreferredSize(scrollPane.getPreferredSize());
+        final DetachableInternalFrame frame = new DetachableInternalFrame();
+        frame.setTitle(getName() + " (" + rasterImageLayer.getName() + ")");
+        frame.setResizable(true);
+        frame.setClosable(true);
+        frame.setIconifiable(true);
+        frame.setMaximizable(true); // frame.setFrameIcon(ICON);
+        frame.setSize(300, 500);
+        frame.setLayer(JLayeredPane.PALETTE_LAYER);
+
+        frame.add(panel, BorderLayout.NORTH);
+
+        final JPanel okPanel = new JPanel();
+        final JButton saveButton = new JButton(SAVE) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public Dimension getPreferredSize() {
+                return new Dimension(100, 25);
+            }
+        };
+
+        final JButton closeButton = new JButton(CLOSE) {
+            private static final long serialVersionUID = 2L;
+
+            @Override
+            public Dimension getPreferredSize() {
+                return new Dimension(100, 25);
+            }
+        };
+
+        saveButton.addActionListener(new java.awt.event.ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                save(scrollPane, rasterImageLayer);
+                // frame.dispose();
+                return;
+            }
+        });
+
+        closeButton.addActionListener(new java.awt.event.ActionListener() {
+
+            @Override
+            public void actionPerformed(ActionEvent e) {
+
+                frame.dispose();
+
+                return;
+            }
+        });
+
+        okPanel.add(saveButton, BorderLayout.WEST);
+        okPanel.add(closeButton, BorderLayout.EAST);
+
+        frame.add(okPanel, BorderLayout.SOUTH);
+        frame.pack();
+        context.getWorkbenchFrame().addInternalFrame(frame, true, true);
+
+        return true;
+
+    }
+
+    @Override
+    public void run(TaskMonitor monitor, PlugInContext context)
+            throws Exception {
+    }
+
+    private JPanel getPanelInterval(TreeMap<Double, Color> colorMapEntry_tm,
+            RasterImageLayer rLayer) throws Exception {
+
+        final ColorsLabelLegendComponent component = new 
ColorsLabelLegendComponent(
+                colorMapEntry_tm, rLayer.getNoDataValue(), rLayer.getName());
+        component.setPreferredSize(new Dimension(200, 400));
+
+        final JPanel panel = new JPanel(new BorderLayout());
+        panel.add(component);
+        panel.setVisible(true);
+
+        return panel;
+
+    }
+
+    private JPanel getPanelGradient(TreeMap<Double, Color> colorMapEntry,
+            RasterImageLayer rLayer) throws Exception {
+
+        final GradientLabelLegendComponent component = new 
GradientLabelLegendComponent(
+                colorMapEntry, rLayer.getNoDataValue(), rLayer.getName());
+        component.setPreferredSize(new Dimension(200, 400));
+        final JPanel panel = new JPanel(new BorderLayout());
+        panel.add(component);
+        panel.setVisible(true);
+
+        return panel;
+
+    }
+
+    @Override
+    public String getName() {
+        return sShowLegend;
+    }
+
+    public Icon getIcon() {
+        return null;
+    }
+
+    public static MultiEnableCheck createEnableCheck(
+            final WorkbenchContext workbenchContext) {
+
+        final MultiEnableCheck multiEnableCheck = new MultiEnableCheck();
+        final EnableCheckFactory checkFactory = new EnableCheckFactory(
+                workbenchContext);
+        multiEnableCheck.add(checkFactory
+                .createWindowWithLayerNamePanelMustBeActiveCheck());
+        multiEnableCheck.add(checkFactory
+                .createExactlyNLayerablesMustBeSelectedCheck(1,
+                        RasterImageLayer.class));
+        multiEnableCheck.add(checkFactory
+                .createRasterImageLayerExactlyNBandsMustExistCheck(1));
+        return multiEnableCheck;
+    }
+
+    public void save(JScrollPane pane, RasterImageLayer rLayer) {
+        FileNameExtensionFilter filter;
+        final JPanel panel = (JPanel) pane.getViewport().getView();
+        final int w = panel.getWidth();
+        final int h = panel.getHeight();
+        final BufferedImage bi = new BufferedImage(w, h,
+                BufferedImage.TYPE_INT_RGB);
+        final Graphics2D g = bi.createGraphics();
+        panel.paint(g);
+
+        filter = new FileNameExtensionFilter("Portable Network Graphics (png)",
+                "png");
+        final JFileChooser fc = new GUIUtil.FileChooserWithOverwritePrompting(
+                "png");
+
+        fc.setFileFilter(filter);
+        fc.addChoosableFileFilter(filter);
+        final int returnVal = fc.showSaveDialog(JUMPWorkbench.getInstance()
+                .getFrame());
+        fc.getWidth();
+        fc.getHeight();
+        if (returnVal == JFileChooser.APPROVE_OPTION) {
+            try {
+                final File file = new File(fc.getSelectedFile() + "-legend"
+                        + ".png");
+                ImageIO.write(bi, "png", file);
+
+                saved(file);
+            } catch (final Exception e) {
+                notsaved();
+                Logger(this.getClass(), e);
+            }
+        }
+    }
+
+    public double cellSizeX(Raster r, Envelope env) throws IOException {
+        return env.getWidth() / r.getWidth();
+    }
+
+    public double cellSizeY(Raster r, Envelope env) throws IOException {
+        return env.getHeight() / r.getHeight();
+    }
+
+    public static BufferedImage joinBufferedImage(BufferedImage img1,
+            BufferedImage img2) {
+
+        // do some calculate first
+        final int offset = 5;
+        final int wid = img1.getWidth() + img2.getWidth() + offset;
+        final int height = Math.max(img1.getHeight(), img2.getHeight())
+                + offset;
+        // create a new buffer and draw two image into the new image
+        final BufferedImage newImage = new BufferedImage(wid, height,
+                BufferedImage.TYPE_INT_ARGB);
+        final Graphics2D g2 = newImage.createGraphics();
+        final Color oldColor = g2.getColor();
+        // fill background
+        g2.setPaint(Color.WHITE);
+        g2.fillRect(0, 0, wid, height);
+        // draw image
+        g2.setColor(oldColor);
+        g2.drawImage(img1, null, 0, 0);
+        g2.drawImage(img2, null, img1.getWidth() + offset, 0);
+        g2.dispose();
+        return newImage;
+    }
+
+    public static void Logger(Class<?> plugin, Exception e) {
+        final Logger LOG = Logger.getLogger(plugin);
+        JUMPWorkbench
+                .getInstance()
+                .getFrame()
+                .warnUser(
+                        plugin.getSimpleName() + " Exception: " + 
e.toString());
+        LOG.error(plugin.getName() + " Exception: ", e);
+    }
+
+    protected void saved(File file) {
+        JUMPWorkbench.getInstance().getFrame()
+                .setStatusMessage(sSaved + " :" + file.getAbsolutePath());
+    }
+
+    protected void notsaved() {
+        JOptionPane.showMessageDialog(null, SCouldNotSave, I18N.get(getName()),
+                JOptionPane.WARNING_MESSAGE);
+    }
+
+    /**
+     * Export an image to GeoTIFF file
+     * 
+     * @param outFileName
+     *            output file name, ex C:/folder/filename.tif
+     * @param layer
+     *            input raster layer. Needed to calculate cell size, envelope
+     *            and no data
+     * @param image
+     *            BufferedImage to save
+     * @return
+     */
+    private boolean exportToGeoTIFFFile(String sFilename, double cellsizeX,
+            double cellsizeY, double nodata, Envelope envelope,
+            BufferedImage image) {
+        try {
+            final FileOutputStream tifOut = new FileOutputStream(sFilename);
+            final TIFFEncodeParam param = new TIFFEncodeParam();
+            param.setCompression(1);
+            final TIFFField[] tiffFields = new TIFFField[3];
+
+            tiffFields[0] = new TIFFField(33550, 12, 2, new double[] {
+                    cellsizeX, cellsizeY });
+            final String noDataS = Double.toString(nodata);
+            final byte[] bytes = noDataS.getBytes();
+            tiffFields[1] = new TIFFField(42113, 1, noDataS.length(), bytes);
+
+            tiffFields[2] = new TIFFField(33922, 12, 6, new double[] { 0.0D,
+                    0.0D, 0.0D, envelope.getMinX(), envelope.getMaxY(), 0.0D 
});
+            param.setExtraFields(tiffFields);
+            final TIFFImageEncoder encoder = (TIFFImageEncoder) TIFFCodec
+                    .createImageEncoder("tiff", tifOut, param);
+            encoder.encode(image);
+            tifOut.close();
+
+        } catch (final Exception e) {
+            return false;
+        }
+        return true;
+    }
+
+}


Property changes on: 
core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Modified: 
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java
===================================================================
--- 
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java  
    2018-08-28 12:46:05 UTC (rev 5933)
+++ 
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java  
    2018-08-28 12:48:05 UTC (rev 5934)
@@ -7,13 +7,13 @@
 
     @Override
     public void configure(PlugInContext pic) throws Exception {
-        
+
         new RasterStylesPlugIn().initialize(pic);
-        
+        new RasterLegendPlugIn().initialize(pic);
+
     }
-    
+
     public static final String extensionName = "Raster Styles";
     public static final String suffixBlackBKey = "_Styles";
-    
+
 }
-


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to