package org.geopublishing.atlasStyler.swing; import java.awt.event.ActionEvent; import java.text.NumberFormat; import javax.swing.AbstractAction; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import org.geopublishing.atlasStyler.ASUtil; import org.geopublishing.atlasStyler.rulesLists.RulesListInterface; import org.geopublishing.atlasViewer.swing.Icons; import org.geotools.styling.FeatureTypeStyle; import org.opengis.filter.Filter; import de.schmitzm.geotools.feature.FeatureUtil; import de.schmitzm.geotools.styling.StyledFeaturesInterface; import de.schmitzm.geotools.styling.StylingUtil; import de.schmitzm.lang.LangUtil; import de.schmitzm.swing.ExceptionDialog; import de.schmitzm.swing.swingworker.AtlasStatusDialog; import de.schmitzm.swing.swingworker.AtlasSwingWorker; public class RulesListPopup extends JPopupMenu { static Filter filterCopied = null; static final Double[] scalesCopied = new Double[2]; private final StylerDialog asd; public RulesListPopup(final RulesListInterface rulesList, StylerDialog asd) { this.asd = asd; // Write the name if the layer as a header of the menu: JMenuItem header = new JMenuItem(rulesList.getTitle()); header.setEnabled(false); add(header); if (!asd.isEasy()) { addSeparator(); addScaleMenuItems(rulesList); addSeparator(); addFilterMenuItems(rulesList); // if (AtlasStyler.getLanguageMode() == // LANGUAGE_MODE.OGC_SINGLELANGUAGE) { // Only in AtlasStyler do we offer to access the XML directly. addSeparator(); addXMLMenuItems(rulesList); // } } } private void addXMLMenuItems(final RulesListInterface rulesList) { add(new AbstractAction(ASUtil.R("RulesListPopup.copyXML"), Icons.ICON_XML) { @Override public void actionPerformed(final ActionEvent e) { // Copy XML to ClipBoard FeatureTypeStyle fts = rulesList.getFTS(); try { String xmlString = StylingUtil.toXMLString(fts); LangUtil.copyToClipboard(xmlString); JOptionPane.showMessageDialog(RulesListPopup.this, ASUtil.R("RulesListPopup.copyXML.done", xmlString.length())); } catch (Exception ee) { ExceptionDialog.show(RulesListPopup.this, ee); } } }); // add(new AbstractAction("Paste from Clipboard", // Icons.ICON_XML) { // // @Override // public void actionPerformed(final ActionEvent e) { // // Copy XML from ClipBoard // FeatureTypeStyle fts = rulesList.getFTS(); // try { // String xmlString = LangUtil.pasteFromClipboard(); // // JOptionPane.showMessageDialog(RulesListPopup.this, // ASUtil.R("RulesListPopup.copyXML.done", // xmlString.length())); // } catch (Exception ee) { // ExceptionDialog.show(RulesListPopup.this, ee); // } // } // }); } private void addFilterMenuItems(final RulesListInterface rulesList) { // Copy Filter final Filter rlFilter = rulesList.getRlFilter(); if (rlFilter != null) { add(new AbstractAction(ASUtil.R("RulesListPopup.CopyFilter"), Icons.ICON_FILTER) { @Override public void actionPerformed(final ActionEvent e) { filterCopied = rlFilter; } }); } // Insert Filter if (filterCopied != null) { add(new AbstractAction(ASUtil.R( "RulesListPopup.InsertFilterIntoRulesList", rulesList.getTitle()), Icons.ICON_FILTER) { @Override public void actionPerformed(final ActionEvent e) { rulesList.setRlFilter(filterCopied); } }); } if (rlFilter != null) { add(new AbstractAction(ASUtil.R("RulesListPopup.RemoveFilter"), Icons.ICON_REMOVE_FILTER) { @Override public void actionPerformed(final ActionEvent e) { rulesList.setRlFilter(null); } }); } } private void addScaleMenuItems(final RulesListInterface rulesList) { if (asd.getPreviewMapPane() != null) { final double previewScaleDenominator = asd.getPreviewMapPane() .getScaleDenominator(); final String pScaleFormatted = NumberFormat.getIntegerInstance() .format(previewScaleDenominator); add(new AbstractAction(ASUtil.R( "RulesListPopup.UseScaleOfPreviewForMin", pScaleFormatted), Icons.ICON_MINSCALE_SMALL) { @Override public void actionPerformed(ActionEvent e) { rulesList.setMinScaleDenominator(previewScaleDenominator); } }); add(new AbstractAction(ASUtil.R( "RulesListPopup.UseScaleOfPreviewForMax", pScaleFormatted), Icons.ICON_MAXSCALE_SMALL) { @Override public void actionPerformed(ActionEvent e) { rulesList.setMaxScaleDenominator(previewScaleDenominator); } }); } final Double minScale = rulesList.getMinScaleDenominator(); final Double maxScale = rulesList.getMaxScaleDenominator(); if (minScale > 0) add(new AbstractAction( ASUtil.R("RulesListPopup.ZoomPreviewToMinPlus1"), Icons.ICON_MINSCALE_SMALL) { @Override public void actionPerformed(ActionEvent e) { if (asd.getPreviewMapPane() != null) asd.getPreviewMapPane().zoomToScaleDenominator( rulesList.getMinScaleDenominator() + 1); } }); add(new AbstractAction( ASUtil.R("RulesListPopup.ZoomPreviewToMaxMinus1"), Icons.ICON_MAXSCALE_SMALL) { @Override public void actionPerformed(ActionEvent e) { if (asd.getPreviewMapPane() != null) asd.getPreviewMapPane().zoomToScaleDenominator( rulesList.getMaxScaleDenominator() - 1); } }); add(new AbstractAction(ASUtil.R("RulesListPopup.CopyMinMaxScale"), Icons.ICON_MINMAXSCALE_SMALL) { @Override public void actionPerformed(final ActionEvent e) { scalesCopied[0] = minScale; scalesCopied[1] = maxScale; } }); if (scalesCopied[0] != null && scalesCopied[1] != null) { add(new AbstractAction(ASUtil.R( "RulesListPopup.InsertMinMaxScaleIntoRulesList", rulesList.getTitle()), Icons.ICON_MINMAXSCALE_SMALL) { @Override public void actionPerformed(final ActionEvent e) { rulesList.setMinScaleDenominator(scalesCopied[0]); rulesList.setMaxScaleDenominator(scalesCopied[1]); } }); } if (minScale != null) { add(new AbstractAction( ASUtil.R("RulesListPopup.ResetMinMaxScaleToZeroAndInfinite"), Icons.ICON_MINMAXSCALE_SMALL) { @Override public void actionPerformed(final ActionEvent e) { rulesList.setMinScaleDenominator(0.0); rulesList.setMaxScaleDenominator(Double.MAX_VALUE); } }); } if (!asd.isEasy() && asd.isVector()) add(new AbstractAction(ASUtil.R("RulesListPopup.GuessMaxScale"), Icons.ICON_MINMAXSCALE_SMALL) { @Override public void actionPerformed(final ActionEvent e) { // try { final StyledFeaturesInterface<?> styledFeatures = asd .getAtlasStylerVector().getStyledFeatures(); AtlasStatusDialog waitDialog = new AtlasStatusDialog( RulesListPopup.this); new AtlasSwingWorker<Void>(waitDialog) { @Override protected Void doInBackground() throws Exception { Double calcAvgNN = FeatureUtil .calcAvgNN(styledFeatures); double maxScaleDenominator = StylingUtil .getMaxScaleDenominator(calcAvgNN, styledFeatures.getGeometryForm()); rulesList.setMinScaleDenominator(0.); rulesList .setMaxScaleDenominator(maxScaleDenominator); return null; } }.executeModalNoEx(); } }); } }