Revision: 5922 http://sourceforge.net/p/jump-pilot/code/5922 Author: ma15569 Date: 2018-08-22 17:00:47 +0000 (Wed, 22 Aug 2018) Log Message: ----------- Added capability to export WMS legend to PNG image file
Modified Paths: -------------- core/trunk/src/org/openjump/core/ui/plugin/wms/WMSLegendPlugIn.java Modified: core/trunk/src/org/openjump/core/ui/plugin/wms/WMSLegendPlugIn.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/wms/WMSLegendPlugIn.java 2018-08-22 15:28:45 UTC (rev 5921) +++ core/trunk/src/org/openjump/core/ui/plugin/wms/WMSLegendPlugIn.java 2018-08-22 17:00:47 UTC (rev 5922) @@ -2,27 +2,38 @@ import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; import java.awt.Font; +import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.util.Iterator; import java.util.List; +import javax.imageio.ImageIO; import javax.swing.BoxLayout; import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JLayeredPane; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; import org.openjump.core.apitools.LayerTools; +import org.openjump.core.ui.io.file.FileNameExtensionFilter; import org.openjump.core.ui.swing.DetachableInternalFrame; import com.vividsolutions.jump.I18N; +import com.vividsolutions.jump.workbench.JUMPWorkbench; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.model.WMSLayer; import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn; @@ -29,6 +40,7 @@ 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.ui.GUIUtil; import com.vividsolutions.jump.workbench.ui.images.IconLoader; import com.vividsolutions.wms.AbstractWMSRequest; import com.vividsolutions.wms.MapLayer; @@ -47,11 +59,12 @@ private static ImageIcon ICON = IconLoader.icon("globe3_13.png"); private JScrollPane scrollPane = new JScrollPane(); + @Override public boolean execute(final PlugInContext context) throws Exception { final WMSLayer layer = (WMSLayer) LayerTools.getSelectedLayerable( context, WMSLayer.class); - DetachableInternalFrame frame = new DetachableInternalFrame(); + final DetachableInternalFrame frame = new DetachableInternalFrame(); frame.setTitle(PANEL + " (" + layer.getName() + ")"); frame.setResizable(true); frame.setClosable(true); @@ -60,13 +73,64 @@ frame.setFrameIcon(ICON); frame.setSize(200, 500); frame.setLayer(JLayeredPane.PALETTE_LAYER); - scrollPane = new JScrollPane(getLegendPanel(context)); - frame.add(scrollPane, BorderLayout.CENTER); + scrollPane = new JScrollPane(getLegendPanel(context), + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + final JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout()); + panel.add(scrollPane, BorderLayout.CENTER); + panel.setPreferredSize(scrollPane.getPreferredSize()); + 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); + // 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); - //Detachable internal frame now opens on left/middle part of the project view - frame.setBounds(context.getLayerViewPanel().getWidth() - 10, 100, - frame.getWidth(), frame.getHeight()); + // Detachable internal frame now opens on left/middle part of the + // project view + // frame.setBounds(context.getLayerViewPanel().getWidth() - 10, 100, + // frame.getWidth(), frame.getHeight()); return true; } @@ -122,23 +186,83 @@ // Modified From Kosmo SAIG. Build the legend panel. For each layer it // displays the layer name at the top and the legend at the bottom + public void save(JScrollPane pane) { + 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() + ".png"); + ImageIO.write(bi, "png", file); + saved(file); + } catch (final Exception e) { + notsaved(); + Logger(this.getClass(), e); + } + } + } + + 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); + } + + private final String sSaved = I18N + .get("org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.file.saved"); + 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"); + public JPanel getLegendPanel(PlugInContext context) throws IOException { - JPanel mainPanel = new JPanel(new GridBagLayout()); - WMSLayer layer = (WMSLayer) LayerTools.getSelectedLayerable(context, - WMSLayer.class); - List<String> names = layer.getLayerNames(); + final JPanel mainPanel = new JPanel(new GridBagLayout()); + final WMSLayer layer = (WMSLayer) LayerTools.getSelectedLayerable( + context, WMSLayer.class); + final List<String> names = layer.getLayerNames(); mainPanel.setBackground(Color.WHITE); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); - for (Iterator<String> iter = names.iterator(); iter.hasNext();) { - String layerName = iter.next(); - MapLayer mapLayer = layer.getService().getCapabilities() + for (final String layerName : names) { + final MapLayer mapLayer = layer.getService().getCapabilities() .getMapLayerByName(layerName); - String layerTitle = StringUtils.isNotEmpty(mapLayer.getTitle()) ? mapLayer - .getTitle() : layerName; - JLabel nameLabel = new JLabel( + final String layerTitle = StringUtils.isNotEmpty(mapLayer + .getTitle()) ? mapLayer.getTitle() : layerName; + final JLabel nameLabel = new JLabel( I18N.getMessage( "org.openjump.core.ui.plugin.queries.SimpleQuery.layer" + ": {0}", //$NON-NLS-1$ new Object[] { layerTitle })); @@ -152,15 +276,16 @@ // URL selectedUrl = null; // selectedUrl = new URL(legendUrl); // image = ImageIO.read(selectedUrl); - LegendRequest req = new LegendRequest(layer.getService(), layerName); - Image image = req.getImage(); - ImageIcon legendIcon = new ImageIcon(image); + final LegendRequest req = new LegendRequest(layer.getService(), + layerName); + final Image image = req.getImage(); + final ImageIcon legendIcon = new ImageIcon(image); if (/* getStyles(context, layerName) != null && */legendIcon != null) { - JLabel labelIcon = new JLabel(legendIcon, JLabel.CENTER); + final JLabel labelIcon = new JLabel(legendIcon, JLabel.CENTER); mainPanel.add(labelIcon, BorderLayout.SOUTH); } else { - JLabel textLabel = new JLabel(MESSAGE); + final JLabel textLabel = new JLabel(MESSAGE); mainPanel.add(textLabel, BorderLayout.SOUTH); } } @@ -169,7 +294,7 @@ } public MultiEnableCheck createEnableCheck(WorkbenchContext workbenchContext) { - EnableCheckFactory checkFactory = new EnableCheckFactory( + final EnableCheckFactory checkFactory = new EnableCheckFactory( workbenchContext); return new MultiEnableCheck().add( @@ -178,20 +303,21 @@ 1, WMSLayer.class)); } + @Override public String getName() { return PLUGIN; } - private String PLUGIN = I18N + private final String PLUGIN = I18N .get("org.openjump.core.ui.plugin.wms.WMSLegendPlugIn"); - private String PANEL = I18N + private final String PANEL = I18N .get("org.openjump.core.ui.plugin.wms.WMSLegendPlugIn.panel"); - private String MESSAGE = I18N + private final String MESSAGE = I18N .get("org.openjump.core.ui.plugin.wms.WMSLegendPlugIn.message"); } class LegendRequest extends AbstractWMSRequest { - private String layerName; + private final String layerName; public LegendRequest(WMService service, String name) { super(service); @@ -198,10 +324,11 @@ layerName = name; } + @Override public URL getURL() throws MalformedURLException { String serverURL = service.getServerUrl(); - String version = service.getVersion(); + final String version = service.getVersion(); if (WMService.WMS_1_0_0.equals(version)) { serverURL = serverURL + "REQUEST=GetLegendGraphic&feature_info&WMTVER=1.0.0"; ------------------------------------------------------------------------------ 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