Changeset 30735 in osm


Ignore:
Timestamp:
2014-10-18T20:09:04+02:00 (10 years ago)
Author:
donvip
Message:

[josm_imagery_xml_bounds] fix sonar issues

Location:
applications/editors/josm/plugins/imagery-xml-bounds
Files:
2 added
23 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/imagery-xml-bounds/.project

    r26776 r30735  
    1313        </buildSpec>
    1414        <natures>
     15                <nature>org.sonar.ide.eclipse.core.sonarNature</nature>
    1516                <nature>org.eclipse.jdt.core.javanature</nature>
    1617        </natures>
  • applications/editors/josm/plugins/imagery-xml-bounds/.settings/org.eclipse.jdt.core.prefs

    r30416 r30735  
    11eclipse.preferences.version=1
     2org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
    23org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
    34org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
     
    67org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
    78org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
     9org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
    810org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
    911org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
     
    1214org.eclipse.jdt.core.compiler.debug.localVariable=generate
    1315org.eclipse.jdt.core.compiler.debug.sourceFile=generate
     16org.eclipse.jdt.core.compiler.doc.comment.support=enabled
    1417org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
    1518org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
     
    2326org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
    2427org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
    25 org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
     28org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
    2629org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
    2730org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
     
    3538org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
    3639org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
     40org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
     41org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
     42org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
     43org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
     44org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
    3745org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
    3846org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
     
    4149org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
    4250org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
     51org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
     52org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
     53org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
     54org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
     55org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
     56org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
     57org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
     58org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
    4359org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
    4460org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
     
    4864org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
    4965org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
     66org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
    5067org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
    5168org.eclipse.jdt.core.compiler.problem.nullReference=warning
     
    6077org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
    6178org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
    62 org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
     79org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
    6380org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
    6481org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
     
    6885org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
    6986org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
     87org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
    7088org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
    7189org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
     
    91109org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
    92110org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
     111org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
    93112org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
    94113org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
  • applications/editors/josm/plugins/imagery-xml-bounds/build.xml

    r30495 r30735  
    55    <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
    66    <property name="plugin.main.version" value="7248"/>
    7        
     7   
    88    <!-- Configure these properties (replace "..." accordingly).
    99         See http://josm.openstreetmap.de/wiki/DevelopersGuide/DevelopingPlugins
  • applications/editors/josm/plugins/imagery-xml-bounds/src/net/boplicity/xmleditor/XmlEditorKit.java

    r26776 r30735  
    1919import javax.swing.text.ViewFactory;
    2020
    21 
    2221/**
    2322 * @author kees
    2423 * @date 12-jan-2006
    25  *
    2624 */
    2725public class XmlEditorKit extends StyledEditorKit {
     
    3028    private ViewFactory xmlViewFactory;
    3129
     30    /**
     31     * Constructs a new {@code XmlEditorKit}.
     32     */
    3233    public XmlEditorKit() {
    3334        xmlViewFactory = new XmlViewFactory();
    3435    }
    35    
     36
    3637    @Override
    3738    public ViewFactory getViewFactory() {
     
    4344        return "text/xml";
    4445    }
    45 
    46    
    4746}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/net/boplicity/xmleditor/XmlTextPane.java

    r26776 r30735  
    2424import javax.swing.text.BadLocationException;
    2525
    26 import net.boplicity.xmleditor.XmlEditorKit;
    27 
    2826
    2927/**
    3028 * JTextPane implementation that can handle xml text. The IndentKeyListener
    3129 * implements smart indenting.
    32  * 
     30 *
    3331 * @author kees
    3432 * @date 27-jan-2006
     
    3735public class XmlTextPane extends JTextPane {
    3836
    39     private static final long serialVersionUID = 6270183148379328084L;
    40     private Logger logger = Logger.getLogger(getClass().getName());
     37    private static final Logger LOGGER = Logger.getLogger(XmlTextPane.class.getName());
     38    private static final Character NEW_LINE = '\n';
    4139
     40    /**
     41     * Constructs a new {@code XmlTextPane}.
     42     */
    4243    public XmlTextPane() {
    43        
     44
    4445        // Set editor kit
    4546        this.setEditorKitForContentType("text/xml", new XmlEditorKit());
    4647        this.setContentType("text/xml");
    47        
     48
    4849        addKeyListener(new IndentKeyListener());
    4950    }
    50    
    51         private class IndentKeyListener implements KeyListener {
    5251
    53                 private boolean enterFlag;
    54                 private final Character NEW_LINE = '\n';
     52    private class IndentKeyListener implements KeyListener {
    5553
    56                 public void keyPressed(KeyEvent event) {
    57                         enterFlag = false;
    58                         if ((event.getKeyCode() == KeyEvent.VK_ENTER)
    59                                         && (event.getModifiers() == 0)) {
    60                                 if (getSelectionStart() == getSelectionEnd()) {
    61                                         enterFlag = true;
    62                                         event.consume();
    63                                 }
    64                         }
    65                 }
     54        private boolean enterFlag;
    6655
    67                 public void keyReleased(KeyEvent event) {
    68                         if ((event.getKeyCode() == KeyEvent.VK_ENTER)
    69                                         && (event.getModifiers() == 0)) {
    70                                 if (enterFlag) {
    71                                         event.consume();
     56        @Override
     57        public void keyPressed(KeyEvent event) {
     58            enterFlag = false;
     59            if ((event.getKeyCode() == KeyEvent.VK_ENTER)
     60                && (event.getModifiers() == 0)
     61                && getSelectionStart() == getSelectionEnd()) {
     62                enterFlag = true;
     63                event.consume();
     64            }
     65        }
    7266
    73                                         int start, end;
    74                                         String text = getText();
     67        @Override
     68        public void keyReleased(KeyEvent event) {
     69            if ((event.getKeyCode() == KeyEvent.VK_ENTER)
     70                && (event.getModifiers() == 0) && enterFlag) {
     71                event.consume();
    7572
    76                                         int caretPosition = getCaretPosition();
    77                                         try {
    78                                                 if (text.charAt(caretPosition) == NEW_LINE) {
    79                                                         caretPosition--;
    80                                                 }
    81                                         } catch (IndexOutOfBoundsException e) {
    82                                         }
     73                int start, end;
     74                String text = getText();
    8375
    84                                         start = text.lastIndexOf(NEW_LINE, caretPosition) + 1;
    85                                         end = start;
    86                                         try {
    87                                                 if (text.charAt(start) != NEW_LINE) {
    88                                                         while ((end < text.length())
    89                                                                         && (Character
    90                                                                                         .isWhitespace(text.charAt(end)))
    91                                                                         && (text.charAt(end) != NEW_LINE)) {
    92                                                                 end++;
    93                                                         }
    94                                                         if (end > start) {
    95                                                                 getDocument()
    96                                                                                 .insertString(
    97                                                                                                 getCaretPosition(),
    98                                                                                                 NEW_LINE
    99                                                                                                                 + text.substring(start,
    100                                                                                                                                 end), null);
    101                                                         } else {
    102                                                                 getDocument().insertString(getCaretPosition(),
    103                                                                                 NEW_LINE.toString(), null);
    104                                                         }
    105                                                 } else {
    106                                                         getDocument().insertString(getCaretPosition(),
    107                                                                         NEW_LINE.toString(), null);
    108                                                 }
    109                                         } catch (IndexOutOfBoundsException e) {
    110                                                 try {
    111                                                         getDocument().insertString(getCaretPosition(),
    112                                                                         NEW_LINE.toString(), null);
    113                                                 } catch (BadLocationException e1) {
    114                                                         logger.log(Level.WARNING, e1.toString());
    115                                                 }
    116                                         } catch (BadLocationException e) {
    117                                                 logger.log(Level.WARNING, e.toString());
    118                                         }
    119                                 }
    120                         }
    121                 }
     76                int caretPosition = getCaretPosition();
     77                try {
     78                    if (text.charAt(caretPosition) == NEW_LINE) {
     79                        caretPosition--;
     80                    }
     81                } catch (IndexOutOfBoundsException e) {
     82                    LOGGER.log(Level.FINE, e.toString());
     83                }
    12284
    123                 public void keyTyped(KeyEvent e) {
    124                 }
    125         }
    126    
     85                start = text.lastIndexOf(NEW_LINE, caretPosition) + 1;
     86                end = start;
     87                try {
     88                    if (text.charAt(start) != NEW_LINE) {
     89                        while ((end < text.length())
     90                                && (Character.isWhitespace(text.charAt(end)))
     91                                && (text.charAt(end) != NEW_LINE)) {
     92                            end++;
     93                        }
     94                        if (end > start) {
     95                            getDocument()
     96                                    .insertString(
     97                                            getCaretPosition(),
     98                                            NEW_LINE
     99                                                    + text.substring(start,
     100                                                            end), null);
     101                        } else {
     102                            getDocument().insertString(getCaretPosition(),
     103                                    NEW_LINE.toString(), null);
     104                        }
     105                    } else {
     106                        getDocument().insertString(getCaretPosition(),
     107                                NEW_LINE.toString(), null);
     108                    }
     109                } catch (IndexOutOfBoundsException e) {
     110                    try {
     111                        getDocument().insertString(getCaretPosition(),
     112                                NEW_LINE.toString(), null);
     113                    } catch (BadLocationException e1) {
     114                        LOGGER.log(Level.WARNING, e1.toString());
     115                    }
     116                } catch (BadLocationException e) {
     117                    LOGGER.log(Level.WARNING, e.toString());
     118                }
     119            }
     120        }
     121
     122        @Override
     123        public void keyTyped(KeyEvent e) {
     124            // Do nothing
     125        }
     126    }
    127127}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/net/boplicity/xmleditor/XmlView.java

    r26776 r30735  
    1818import java.awt.Color;
    1919import java.awt.Graphics;
    20 import java.util.HashMap;
    2120import java.util.LinkedHashMap;
    2221import java.util.Map;
     
    4746public class XmlView extends PlainView {
    4847
    49     private static HashMap<Pattern, Color> patternColors;
     48    private static Map<Pattern, Color> patternColors;
    5049    private static String GENERIC_XML_NAME = "[A-Za-z]+[A-Za-z0-9\\-_]*(:[A-Za-z]+[A-Za-z0-9\\-_]+)?";
    5150    private static String TAG_PATTERN = "(</?" + GENERIC_XML_NAME + ")";
     
    5857    static {
    5958        // NOTE: the order is important!
    60         patternColors = new LinkedHashMap<Pattern, Color>();
     59        patternColors = new LinkedHashMap<>();
    6160        patternColors
    6261                .put(Pattern.compile(TAG_PATTERN), new Color(63, 127, 127));
     
    7170    }
    7271
     72    /**
     73     * Constructs a new {@code XmlView}.
     74     * @param element the element
     75     */
    7376    public XmlView(Element element) {
    7477
     
    8083
    8184    @Override
    82     protected int drawUnselectedText(Graphics graphics, int x, int y, int p0,
    83             int p1) throws BadLocationException {
     85    protected int drawUnselectedText(Graphics graphics, int x, int y, int p0, int p1)
     86            throws BadLocationException {
    8487
    8588        Document doc = getDocument();
     
    8891        Segment segment = getLineBuffer();
    8992
    90         SortedMap<Integer, Integer> startMap = new TreeMap<Integer, Integer>();
    91         SortedMap<Integer, Color> colorMap = new TreeMap<Integer, Color>();
     93        SortedMap<Integer, Integer> startMap = new TreeMap<>();
     94        SortedMap<Integer, Color> colorMap = new TreeMap<>();
    9295
    9396        // Match all regexes on this snippet, store positions
  • applications/editors/josm/plugins/imagery-xml-bounds/src/net/boplicity/xmleditor/XmlViewFactory.java

    r26776 r30735  
    2020import javax.swing.text.ViewFactory;
    2121
    22 
    2322/**
    2423 * @author kees
     
    2827public class XmlViewFactory extends Object implements ViewFactory {
    2928
    30     /**
    31      * @see javax.swing.text.ViewFactory#create(javax.swing.text.Element)
    32      */
     29    @Override
    3330    public View create(Element element) {
    34 
    3531        return new XmlView(element);
    3632    }
    37 
    3833}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/ImageryXmlBoundsPlugin.java

    r30342 r30735  
    3030     * Action showing bounds of the selected closed ways in Selection dialog
    3131     */
    32         private final ShowBoundsAction selectionListAction = new ShowBoundsAction();
     32    private final ShowBoundsAction selectionListAction = new ShowBoundsAction();
    3333
    3434    /**
     
    3737    private final ShowBoundsAction propertiesListAction = new ShowBoundsAction();
    3838   
    39         /**
     39    /**
    4040     * Action showing bounds of the selected multipolygons in Relations dialog
    4141     */
    42         private final ShowBoundsAction relationListAction = new ShowBoundsAction();
     42    private final ShowBoundsAction relationListAction = new ShowBoundsAction();
    4343
    4444    /**
    4545     * Action showing bounds of the current selection
    4646     */
    47         private final ShowBoundsSelectionAction selectionAction = new ShowBoundsSelectionAction();
    48        
    49         /**
    50         * Class modifying the Imagery preferences panel
    51         */
    52         private final XmlBoundsPreferenceSetting preferenceSetting = new XmlBoundsPreferenceSetting();
    53        
    54         /**
    55         * Initializes the plugin.
    56         * @param info
    57         */
    58         public ImageryXmlBoundsPlugin(PluginInformation info) {
    59                 super(info);
    60                 // Allow JOSM to import *.imagery.xml files
    61                 ExtensionFileFilter.importers.add(0, new XmlBoundsImporter());
     47    private final ShowBoundsSelectionAction selectionAction = new ShowBoundsSelectionAction();
     48   
     49    /**
     50    * Class modifying the Imagery preferences panel
     51    */
     52    private final XmlBoundsPreferenceSetting preferenceSetting = new XmlBoundsPreferenceSetting();
     53   
     54    /**
     55    * Initializes the plugin.
     56    * @param info
     57    */
     58    public ImageryXmlBoundsPlugin(PluginInformation info) {
     59        super(info);
     60        // Allow JOSM to import *.imagery.xml files
     61        ExtensionFileFilter.importers.add(0, new XmlBoundsImporter());
    6262        // Allow JOSM to export *.imagery.xml files
    63                 ExtensionFileFilter.exporters.add(0, new XmlBoundsExporter());
     63        ExtensionFileFilter.exporters.add(0, new XmlBoundsExporter());
    6464        // Initialize the selection action
    65                 DataSet.addSelectionListener(selectionAction);
    66                 Main.toolbar.register(selectionAction);
    67                 // Allow JOSM to download *.imagery.xml files
    68                 Main.main.menu.openLocation.addDownloadTaskClass(DownloadXmlBoundsTask.class);
    69         }
    70        
     65        DataSet.addSelectionListener(selectionAction);
     66        Main.toolbar.register(selectionAction);
     67        // Allow JOSM to download *.imagery.xml files
     68        Main.main.menu.openLocation.addDownloadTaskClass(DownloadXmlBoundsTask.class);
     69    }
     70   
    7171    @Override
    7272    public PreferenceSetting getPreferenceSetting() {
     
    7474    }
    7575
    76         @Override
    77         public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
    78                 if (newFrame != null) {
    79                     // Initialize dialogs actions only after the main frame is created
     76    @Override
     77    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
     78        if (newFrame != null) {
     79            // Initialize dialogs actions only after the main frame is created
    8080            newFrame.selectionListDialog.getPopupMenuHandler().addSeparator();
    8181            newFrame.selectionListDialog.getPopupMenuHandler().addAction(selectionListAction);
    8282            newFrame.propertiesDialog.getMembershipPopupMenuHandler().addSeparator();
    8383            newFrame.propertiesDialog.getMembershipPopupMenuHandler().addAction(propertiesListAction);
    84                         newFrame.relationListDialog.getPopupMenuHandler().addSeparator();
    85                         newFrame.relationListDialog.getPopupMenuHandler().addAction(relationListAction);
    86                 } else if (oldFrame != null) {
     84            newFrame.relationListDialog.getPopupMenuHandler().addSeparator();
     85            newFrame.relationListDialog.getPopupMenuHandler().addAction(relationListAction);
     86        } else if (oldFrame != null) {
    8787            // Remove listeners from previous frame to avoid memory leaks
    88                     if (oldFrame.relationListDialog != null) {
    89                         oldFrame.relationListDialog.getPopupMenuHandler().removeAction(relationListAction);
    90                     }
    91                     if (oldFrame.propertiesDialog != null) {
    92                         oldFrame.propertiesDialog.getMembershipPopupMenuHandler().removeAction(propertiesListAction);
    93                     }
    94                     if (oldFrame.selectionListDialog != null) {
    95                         oldFrame.selectionListDialog.getPopupMenuHandler().removeAction(selectionListAction);
    96                     }
    97                 }
    98         }
     88            if (oldFrame.relationListDialog != null) {
     89                oldFrame.relationListDialog.getPopupMenuHandler().removeAction(relationListAction);
     90            }
     91            if (oldFrame.propertiesDialog != null) {
     92                oldFrame.propertiesDialog.getMembershipPopupMenuHandler().removeAction(propertiesListAction);
     93            }
     94            if (oldFrame.selectionListDialog != null) {
     95                oldFrame.selectionListDialog.getPopupMenuHandler().removeAction(selectionListAction);
     96            }
     97        }
     98    }
    9999}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/XmlBoundsConstants.java

    r30342 r30735  
    1616public interface XmlBoundsConstants {
    1717
    18         /**
    19         * Plugin version.
    20         */
    21         public static final String PLUGIN_VERSION = "1.3";
    22        
    23         /**
    24         * XML namespace for JOSM Imagery schema.
    25         */
    26         public static final String XML_NAMESPACE = "http://josm.openstreetmap.de/maps-1.0";
     18    /**
     19    * Plugin version.
     20    */
     21    public static final String PLUGIN_VERSION = "1.3";
     22
     23    /**
     24    * XML namespace for JOSM Imagery schema.
     25    */
     26    public static final String XML_NAMESPACE = "http://josm.openstreetmap.de/maps-1.0";
    2727
    2828    /**
     
    3131    public static final String XML_LOCATION = "https?://josm.openstreetmap.de/maps";
    3232
    33         /**
    34          * XML Schema
    35          */
    36         public static final String XML_SCHEMA = "resource://data/maps.xsd";
    37        
    3833    /**
    39      * XML tags
     34     * XML Schema
    4035     */
     36    public static final String XML_SCHEMA = "resource://data/maps.xsd";
     37
     38    /** XML name tag */
    4139    public static final String XML_NAME = "name";
     40    /** XML type tag */
    4241    public static final String XML_TYPE = "type";
     42    /** XML url tag */
    4343    public static final String XML_URL = "url";
     44    /** XML default tag */
    4445    public static final String XML_DEFAULT = "default";
     46    /** XML eula tag */
    4547    public static final String XML_EULA = "eula";
     48    /** XML attribution-text tag */
    4649    public static final String XML_ATTR_TEXT = "attribution-text";
     50    /** XML attribution-url tag */
    4751    public static final String XML_ATTR_URL = "attribution-url";
     52    /** XML terms-of-use-text tag */
    4853    public static final String XML_TERMS_TEXT = "terms-of-use-text";
     54    /** XML terms-of-use-url tag */
    4955    public static final String XML_TERMS_URL = "terms-of-use-url";
     56    /** XML projections tag */
    5057    public static final String XML_PROJECTIONS = "projections";
     58    /** XML max-zoom tag */
    5159    public static final String XML_MAX_ZOOM = "max-zoom";
     60    /** XML min-zoom tag */
    5261    public static final String XML_MIN_ZOOM = "min-zoom";
     62    /** XML country-code tag */
    5363    public static final String XML_COUNTRY_CODE = "country-code";
    54     public static final String XML_LOGO_IMAGE = "logo-image";// TODO
     64    /** XML logo-image tag */
     65    public static final String XML_LOGO_IMAGE = "logo-image";
     66    /** XML logo-url tag */
    5567    public static final String XML_LOGO_URL = "logo-url";
    5668
     
    6072    public static final String PREFIX = "imagery:";
    6173
    62         /**
    63         * OSM keys, equivalent to those used in XML schema, but prefixed (except for name).
    64         */
    65         public static final String KEY_NAME = XML_NAME;
    66         public static final String KEY_TYPE = PREFIX + XML_TYPE;
    67         public static final String KEY_URL = PREFIX + XML_URL;
    68         public static final String KEY_DEFAULT = PREFIX + XML_DEFAULT;
    69         public static final String KEY_EULA = PREFIX + XML_EULA;
    70         public static final String KEY_ATTR_TEXT = PREFIX + XML_ATTR_TEXT;
    71         public static final String KEY_ATTR_URL = PREFIX + XML_ATTR_URL;
     74    /**
     75    * OSM keys, equivalent to those used in XML schema, but prefixed (except for name).
     76    */
     77    public static final String KEY_NAME = XML_NAME;
     78    public static final String KEY_TYPE = PREFIX + XML_TYPE;
     79    public static final String KEY_URL = PREFIX + XML_URL;
     80    public static final String KEY_DEFAULT = PREFIX + XML_DEFAULT;
     81    public static final String KEY_EULA = PREFIX + XML_EULA;
     82    public static final String KEY_ATTR_TEXT = PREFIX + XML_ATTR_TEXT;
     83    public static final String KEY_ATTR_URL = PREFIX + XML_ATTR_URL;
    7284    public static final String KEY_TERMS_TEXT = PREFIX + XML_TERMS_TEXT;
    73         public static final String KEY_TERMS_URL = PREFIX + XML_TERMS_URL;
    74         public static final String KEY_PROJECTIONS = PREFIX + XML_PROJECTIONS;
    75         public static final String KEY_MAX_ZOOM = PREFIX + XML_MAX_ZOOM;
    76         public static final String KEY_MIN_ZOOM = PREFIX + XML_MIN_ZOOM;
    77         public static final String KEY_COUNTRY_CODE = PREFIX + XML_COUNTRY_CODE;
     85    public static final String KEY_TERMS_URL = PREFIX + XML_TERMS_URL;
     86    public static final String KEY_PROJECTIONS = PREFIX + XML_PROJECTIONS;
     87    public static final String KEY_MAX_ZOOM = PREFIX + XML_MAX_ZOOM;
     88    public static final String KEY_MIN_ZOOM = PREFIX + XML_MIN_ZOOM;
     89    public static final String KEY_COUNTRY_CODE = PREFIX + XML_COUNTRY_CODE;
    7890    public static final String KEY_LOGO_IMAGE = PREFIX + XML_LOGO_IMAGE;// TODO
    7991    public static final String KEY_LOGO_URL = PREFIX + XML_LOGO_URL;
    80        
    81         /**
    82          * File extension.
    83          */
    84         public static final String EXTENSION = "imagery.xml";
    85        
    86         /**
    87          * File encoding.
    88          */
    89         public static final String ENCODING = "UTF-8";
    90        
    91         /**
    92          * File filter used in import/export dialogs.
    93          */
    94         public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(EXTENSION, EXTENSION, tr("Imagery XML Files") + " (*."+EXTENSION+")");
    9592
    96         /**
    97          * Plugin icons.
    98          */
    99         public static ImageIcon XML_ICON_16 = ImageProvider.get("xml_16.png");
    100         public static ImageIcon XML_ICON_24 = ImageProvider.get("xml_24.png");
     93    /**
     94     * File extension.
     95     */
     96    public static final String EXTENSION = "imagery.xml";
     97
     98    /**
     99     * File encoding.
     100     */
     101    public static final String ENCODING = "UTF-8";
     102
     103    /**
     104     * File filter used in import/export dialogs.
     105     */
     106    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
     107            EXTENSION, EXTENSION, tr("Imagery XML Files") + " (*."+EXTENSION+")");
     108
     109    /**
     110     * Plugin 16x16 icon.
     111     */
     112    public static ImageIcon XML_ICON_16 = ImageProvider.get("xml_16.png");
     113
     114    /**
     115     * Plugin 24x24 icon.
     116     */
     117    public static ImageIcon XML_ICON_24 = ImageProvider.get("xml_24.png");
    101118}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/XmlBoundsLayer.java

    r30342 r30735  
    2424/**
    2525 * An "OSM data" layer that cannot be uploaded, merged, and in which real OSM data cannot be imported.
    26  * Its sole purpose is to allow "classic" OSM edition tools to edit Imagery bounds (as XML files) without compromising OSM database integrity.
    27  *
     26 * Its sole purpose is to allow "classic" OSM edition tools to edit Imagery bounds (as XML files)
     27 * without compromising OSM database integrity.
     28 *
    2829 * @author Don-vip
    2930 */
    3031public class XmlBoundsLayer extends OsmDataLayer implements LayerChangeListener, XmlBoundsConstants {
    3132
    32         @Override
    33         public Action[] getMenuEntries() {
    34                 List<Action> result = new ArrayList<Action>();
    35                 for (Action action : super.getMenuEntries()) {
    36                         if (action instanceof LayerSaveAction) {
    37                                 result.add(new BoundsLayerSaveAction(this));
     33    @Override
     34    public Action[] getMenuEntries() {
     35        List<Action> result = new ArrayList<>();
     36        for (Action action : super.getMenuEntries()) {
     37            if (action instanceof LayerSaveAction) {
     38                result.add(new BoundsLayerSaveAction(this));
    3839
    39                         } else if (action instanceof LayerSaveAsAction) {
    40                                 result.add(new BoundsLayerSaveAsAction(this));
    41                                
    42                         } else if (!(action instanceof LayerGpxExportAction) && !(action instanceof ConvertToGpxLayerAction)) {
    43                                 // Add everything else, expect GPX-related action
    44                                 result.add(action);
    45                         }
    46                 }
    47                 result.add(new ShowBoundsAction(this));
    48                 return result.toArray(new Action[0]);
    49         }
     40            } else if (action instanceof LayerSaveAsAction) {
     41                result.add(new BoundsLayerSaveAsAction(this));
    5042
    51         private static final JosmAction[] actionsToDisable = new JosmAction[] {
    52                 Main.main.menu.download,
    53                 Main.main.menu.downloadPrimitive,
    54                 Main.main.menu.downloadReferrers,
    55                 Main.main.menu.upload,
    56                 Main.main.menu.uploadSelection,
    57                 Main.main.menu.update,
    58                 Main.main.menu.updateModified,
    59                 Main.main.menu.updateSelection,
    60                 Main.main.menu.openLocation
    61         };
    62        
    63         private static final Map<JosmAction, Boolean> actionsStates = new HashMap<JosmAction, Boolean>();
    64        
    65         public XmlBoundsLayer(DataSet data) {
    66                 this(data, OsmDataLayer.createNewName(), null);
    67         }
     43            } else if (!(action instanceof LayerGpxExportAction) && !(action instanceof ConvertToGpxLayerAction)) {
     44                // Add everything else, expect GPX-related action
     45                result.add(action);
     46            }
     47        }
     48        result.add(new ShowBoundsAction(this));
     49        return result.toArray(new Action[0]);
     50    }
    6851
    69         public XmlBoundsLayer(DataSet data, String name, File associatedFile) {
    70                 super(data, name, associatedFile);
    71                 MapView.addLayerChangeListener(this);
    72         }
    73        
    74         @Override
    75         public boolean isMergable(Layer other) {
    76                 return other instanceof XmlBoundsLayer;
    77         }
     52    private static final JosmAction[] ACTIONS_TO_DISABLE = new JosmAction[] {
     53        Main.main.menu.download,
     54        Main.main.menu.downloadPrimitive,
     55        Main.main.menu.downloadReferrers,
     56        Main.main.menu.upload,
     57        Main.main.menu.uploadSelection,
     58        Main.main.menu.update,
     59        Main.main.menu.updateModified,
     60        Main.main.menu.updateSelection,
     61        Main.main.menu.openLocation
     62    };
    7863
    79         @Override
    80         public Icon getIcon() {
    81                 return XML_ICON_16;
    82         }
     64    private static final Map<JosmAction, Boolean> ACTIONS_STATES = new HashMap<>();
    8365
    84         @Override
    85         public boolean requiresUploadToServer() {
    86                 return false; // Never !
    87         }
     66    /**
     67     * Constructs a new {@code XmlBoundsLayer}.
     68     * @param data data
     69     */
     70    public XmlBoundsLayer(DataSet data) {
     71        this(data, OsmDataLayer.createNewName(), null);
     72    }
    8873
    89         @Override
    90         public void activeLayerChange(Layer oldLayer, Layer newLayer) {
    91                 if (newLayer == this && !(oldLayer instanceof XmlBoundsLayer)) {
    92                         for (JosmAction action : actionsToDisable) {
    93                                 actionsStates.put(action, action.isEnabled());
    94                                 action.setEnabled(false);
    95                         }
    96                 } else if (oldLayer == this && !(newLayer instanceof XmlBoundsLayer)) {
    97                         for (JosmAction action : actionsToDisable) {
    98                                 action.setEnabled(actionsStates.get(action));
    99                         }
    100                 }
    101         }
     74    /**
     75     * Constructs a new {@code XmlBoundsLayer}.
     76     * @param data data
     77     * @param name Layer name
     78     * @param associatedFile Associated file (can be null)
     79     */
     80    public XmlBoundsLayer(DataSet data, String name, File associatedFile) {
     81        super(data, name, associatedFile);
     82        MapView.addLayerChangeListener(this);
     83    }
    10284
    103         @Override
    104         public void layerAdded(Layer newLayer) {
    105         }
     85    @Override
     86    public boolean isMergable(Layer other) {
     87        return other instanceof XmlBoundsLayer;
     88    }
    10689
    107         @Override
    108         public void layerRemoved(Layer oldLayer) {
    109             if (Main.main.getEditLayer() instanceof XmlBoundsLayer) {
    110                 for (JosmAction action : actionsToDisable) {
     90    @Override
     91    public Icon getIcon() {
     92        return XML_ICON_16;
     93    }
     94
     95    @Override
     96    public boolean requiresUploadToServer() {
     97        return false; // Never !
     98    }
     99
     100    @Override
     101    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
     102        if (newLayer == this && !(oldLayer instanceof XmlBoundsLayer)) {
     103            for (JosmAction action : ACTIONS_TO_DISABLE) {
     104                ACTIONS_STATES.put(action, action.isEnabled());
    111105                action.setEnabled(false);
    112106            }
    113             }
    114         }
     107        } else if (oldLayer == this && !(newLayer instanceof XmlBoundsLayer)) {
     108            for (JosmAction action : ACTIONS_TO_DISABLE) {
     109                action.setEnabled(ACTIONS_STATES.get(action));
     110            }
     111        }
     112    }
     113
     114    @Override
     115    public void layerAdded(Layer newLayer) {
     116        // Do nothing
     117    }
     118
     119    @Override
     120    public void layerRemoved(Layer oldLayer) {
     121        if (Main.main.getEditLayer() instanceof XmlBoundsLayer) {
     122            for (JosmAction action : ACTIONS_TO_DISABLE) {
     123                action.setEnabled(false);
     124            }
     125        }
     126    }
    115127}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/XmlBoundsPreferenceSetting.java

    r30342 r30735  
    1111
    1212/**
    13  *
     13 * Plugin preferences.
    1414 * @author Don-vip
    15  *
    1615 */
    1716public class XmlBoundsPreferenceSetting implements SubPreferenceSetting {
     
    3433    }
    3534
     35    @Override
    3636    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
    3737        return gui.getImageryPreference();
    3838    }
    39 
    4039}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/BoundsLayerSaveAction.java

    r30342 r30735  
    1414
    1515/**
    16  *
     16 * Save the current data.
    1717 * @author Don-vip
    18  *
    1918 */
    20 @SuppressWarnings("serial")
    2119public class BoundsLayerSaveAction extends LayerSaveAction {
    2220
    23         public static class SaveBoundsAction extends SaveActionBase {
     21    /**
     22     * Save the current data.
     23     */
     24    public static class SaveBoundsAction extends SaveActionBase {
    2425
    25                 public SaveBoundsAction() {
    26                 super(tr("Save"), "save", tr("Save the current data."), null);
    27                 putValue("help", ht("/Action/Save"));
    28                 }
     26        /**
     27         * Constructs a new {@code SaveBoundsAction}.
     28         */
     29        public SaveBoundsAction() {
     30            super(tr("Save"), "save", tr("Save the current data."), null);
     31            putValue("help", ht("/Action/Save"));
     32        }
    2933
    30                 @Override public File getFile(Layer layer) {
    31                 File f = layer.getAssociatedFile();
    32                 if (f != null && ! f.exists()) {
    33                     f = null;
    34                 }
    35                 return f == null ? BoundsLayerSaveAsAction.SaveBoundsAsAction.openFileDialog(layer) : f;
    36             }
    37         }
     34        @Override
     35        public File getFile(Layer layer) {
     36            File f = layer.getAssociatedFile();
     37            if (f != null && ! f.exists()) {
     38                f = null;
     39            }
     40            return f == null ? BoundsLayerSaveAsAction.SaveBoundsAsAction.openFileDialog(layer) : f;
     41        }
     42    }
    3843
    39         protected XmlBoundsLayer layer;
     44    protected final XmlBoundsLayer layer;
    4045
    41         public BoundsLayerSaveAction(XmlBoundsLayer layer) {
    42                 super(layer);
    43         }
     46    /**
     47     * Constructs a new {@code BoundsLayerSaveAction}.
     48     * @param layer XML bounds layer
     49     */
     50    public BoundsLayerSaveAction(XmlBoundsLayer layer) {
     51        super(layer);
     52        this.layer = layer;
     53    }
    4454
    4555    @Override
    46         public void actionPerformed(ActionEvent e) {
     56    public void actionPerformed(ActionEvent e) {
    4757        new SaveBoundsAction().doSave(layer);
    4858    }
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/BoundsLayerSaveAsAction.java

    r30342 r30735  
    1414
    1515/**
    16  *
     16 * Save Imagery XML file.
    1717 * @author Don-vip
    18  *
    1918 */
    20 @SuppressWarnings("serial")
    2119public class BoundsLayerSaveAsAction extends LayerSaveAsAction {
    2220
    23         public static class SaveBoundsAsAction extends SaveAsAction {
     21    /**
     22     * Save Imagery XML file
     23     */
     24    public static class SaveBoundsAsAction extends SaveAsAction {
    2425
    25                 @Override public File getFile(Layer layer) {
    26                 return openFileDialog(layer);
    27             }
    28                
    29             public static File openFileDialog(Layer layer) {
    30                 if (layer instanceof XmlBoundsLayer) {
    31                         return createAndOpenSaveFileChooser(tr("Save Imagery XML file"), XmlBoundsConstants.EXTENSION);
    32                 } else {
    33                         return null;
    34                 }
    35             }
    36         }
    37        
    38         protected XmlBoundsLayer layer;
    39        
    40         public BoundsLayerSaveAsAction(XmlBoundsLayer layer) {
    41                 super(layer);
    42                 this.layer = layer;
    43         }
     26        @Override
     27        public File getFile(Layer layer) {
     28            return openFileDialog(layer);
     29        }
    4430
    45         @Override
    46         public void actionPerformed(ActionEvent e) {
    47                 new SaveBoundsAsAction().doSave(layer);
    48         }
     31        /**
     32         * Opens a "File/Save as" dialog if the given layer is an XML bounds layer
     33         * @param layer layer
     34         * @return chosen destination file, or {@code null}
     35         */
     36        public static File openFileDialog(Layer layer) {
     37            if (layer instanceof XmlBoundsLayer) {
     38                return createAndOpenSaveFileChooser(tr("Save Imagery XML file"), XmlBoundsConstants.EXTENSION);
     39            } else {
     40                return null;
     41            }
     42        }
     43    }
     44
     45    protected final XmlBoundsLayer layer;
     46
     47    /**
     48     * Constructs a new {@code BoundsLayerSaveAsAction}.
     49     * @param layer XML Bounds layer
     50     */
     51    public BoundsLayerSaveAsAction(XmlBoundsLayer layer) {
     52        super(layer);
     53        this.layer = layer;
     54    }
     55
     56    @Override
     57    public void actionPerformed(ActionEvent e) {
     58        new SaveBoundsAsAction().doSave(layer);
     59    }
    4960}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/ComputeBoundsAction.java

    r30662 r30735  
    1919import javax.swing.AbstractAction;
    2020
     21import org.openstreetmap.josm.Main;
    2122import org.openstreetmap.josm.data.coor.LatLon;
    2223import org.openstreetmap.josm.data.osm.BBox;
     
    2930
    3031/**
    31  * 
     32 *
    3233 * @author Don-vip
    3334 *
    3435 */
    35 @SuppressWarnings("serial")
    3636public class ComputeBoundsAction extends AbstractAction implements XmlBoundsConstants {
    3737
    38         protected static final DecimalFormat df = new DecimalFormat("#0.0000000", new DecimalFormatSymbols(Locale.UK));
    39 
    40         protected static final String ACTION_NAME = tr("XML Imagery Bounds");
    41        
    42         private final Set<Relation> multipolygons;
    43         private final Set<Way> closedWays;
    44        
    45         public ComputeBoundsAction() {
    46                 this(null);
    47         }
    48        
    49         public ComputeBoundsAction(OsmDataLayer layer) {
    50                 this.multipolygons = new HashSet<Relation>();
    51                 this.closedWays = new HashSet<Way>();
    52                
     38    protected static final DecimalFormat DF = new DecimalFormat("#0.0000000", new DecimalFormatSymbols(Locale.UK));
     39
     40    protected static final String ACTION_NAME = tr("XML Imagery Bounds");
     41
     42    protected static final String EIGHT_SP = "        ";
     43
     44    private final Set<Relation> multipolygons;
     45    private final Set<Way> closedWays;
     46
     47    /**
     48     * Constructs a new {@code ComputeBoundsAction}.
     49     */
     50    public ComputeBoundsAction() {
     51        this(null);
     52    }
     53
     54    /**
     55     * Constructs a new {@code ComputeBoundsAction}.
     56     * @param layer data layer
     57     */
     58    public ComputeBoundsAction(OsmDataLayer layer) {
     59        this.multipolygons = new HashSet<>();
     60        this.closedWays = new HashSet<>();
     61
    5362        putValue(SHORT_DESCRIPTION, tr("Generate Imagery XML bounds for the selection"));
    5463        putValue(NAME, ACTION_NAME);
    5564        try {
    56                 putValue(SMALL_ICON, XML_ICON_24);
     65            putValue(SMALL_ICON, XML_ICON_24);
    5766        } catch (Exception e) {
    58                 e.printStackTrace();
    59         }
    60         setEnabled(false);
    61        
    62                 if (layer != null) {
    63                         List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
    64                         primitives.addAll(layer.data.getRelations());
    65                         primitives.addAll(layer.data.getWays());
    66                         updateOsmPrimitives(primitives);
    67                 }
    68         }
    69        
    70         protected void updateOsmPrimitives(Collection<? extends OsmPrimitive> primitives) {
    71                 multipolygons.clear();
    72                 closedWays.clear();
    73                 // Store selected multipolygons and closed ways
    74                 for (OsmPrimitive value : primitives) {
    75                         if (value instanceof Relation) {
    76                                 Relation r = (Relation) value;
    77                                 if (r.isMultipolygon()) {
    78                                         multipolygons.add(r);
    79                                 }
    80                         } else if (value instanceof Way) {
    81                                 Way w = (Way) value;
    82                                 if (w.isClosed()) {
    83                                         closedWays.add(w);
    84                                 }
    85                         }
    86                 }
    87                 // Remove closed ways already inside a selected multipolygon
    88                 for (Iterator<Way> it = closedWays.iterator(); it.hasNext(); ) {
    89                         processIterator(it);
    90                 }
    91                 // Enable the action if at least one area is found
    92                 setEnabled(!multipolygons.isEmpty() || !closedWays.isEmpty());
    93         }
     67            Main.error(e);
     68        }
     69        setEnabled(false);
     70
     71        if (layer != null) {
     72            List<OsmPrimitive> primitives = new ArrayList<>();
     73            primitives.addAll(layer.data.getRelations());
     74            primitives.addAll(layer.data.getWays());
     75            updateOsmPrimitives(primitives);
     76        }
     77    }
     78
     79    protected void updateOsmPrimitives(Collection<? extends OsmPrimitive> primitives) {
     80        multipolygons.clear();
     81        closedWays.clear();
     82        // Store selected multipolygons and closed ways
     83        for (OsmPrimitive value : primitives) {
     84            if (value instanceof Relation) {
     85                Relation r = (Relation) value;
     86                if (r.isMultipolygon()) {
     87                    multipolygons.add(r);
     88                }
     89            } else if (value instanceof Way) {
     90                Way w = (Way) value;
     91                if (w.isClosed()) {
     92                    closedWays.add(w);
     93                }
     94            }
     95        }
     96        // Remove closed ways already inside a selected multipolygon
     97        for (Iterator<Way> it = closedWays.iterator(); it.hasNext(); ) {
     98            processIterator(it);
     99        }
     100        // Enable the action if at least one area is found
     101        setEnabled(!multipolygons.isEmpty() || !closedWays.isEmpty());
     102    }
    94103
    95104    private void processIterator(Iterator<Way> it) {
    96105        Way way = it.next();
    97106        for (Relation mp : multipolygons) {
    98                 for (RelationMember mb : mp.getMembers()) {
    99                         if (mb.getMember().equals(way)) {
    100                                 it.remove();
    101                                 return;
    102                         }
    103                 }
    104         }
    105     }
    106 
    107         public final String getXml() {
    108                 List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
    109                 primitives.addAll(multipolygons);
    110                 primitives.addAll(closedWays);
    111                 return getXml(primitives.toArray(new OsmPrimitive[0]));
    112         }
    113        
     107            for (RelationMember mb : mp.getMembers()) {
     108                if (mb.getMember().equals(way)) {
     109                    it.remove();
     110                    return;
     111                }
     112            }
     113        }
     114    }
     115
     116    /**
     117     * Replies XML code.
     118     * @return XML code
     119     */
     120    public final String getXml() {
     121        List<OsmPrimitive> primitives = new ArrayList<>();
     122        primitives.addAll(multipolygons);
     123        primitives.addAll(closedWays);
     124        return getXml(primitives.toArray(new OsmPrimitive[0]));
     125    }
     126
    114127    protected static final String startTag(String tag) {
    115128        return "<" + tag + ">";
     
    137150
    138151    protected static final String simpleTag(String tag, String content, String def, boolean escape) {
    139         return startTag(tag) + (content != null 
    140                 ? (escape ? escapeReservedCharacters(content) : content) 
     152        return startTag(tag) + (content != null
     153                ? (escape ? escapeReservedCharacters(content) : content)
    141154                : def
    142155                ) + endTag(tag);
     
    151164    }
    152165
     166    /**
     167     * Escapes HTML entities.
     168     * @param s The string to update
     169     * @return String with escaped entities
     170     */
    153171    public static String escapeReservedCharacters(String s) {
    154172        return s == null ? "" : s.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
    155173    }
    156    
    157         protected static final String getXml(OsmPrimitive ... primitives) {
    158                 List<String> entries = new ArrayList<String>();
    159                 for (OsmPrimitive p : primitives) {
    160                         if (p instanceof Relation) {
    161                                 entries.add(getEntry(p, getMultiPolygonBounds((Relation) p)));
    162                         } else if (p instanceof Way) {
    163                                 entries.add(getEntry(p, getClosedWayBounds((Way) p)));
    164                         }
    165                 }
    166                 return getImagery(entries.toArray(new String[0]));
    167         }
    168 
    169         protected static final String getImagery(String ... entries) {
    170                 String result = "<?xml version=\"1.0\" encoding=\""+ENCODING+"\" ?>\n";
    171                 result += "<!-- Generated with JOSM Imagery XML Plugin version "+PLUGIN_VERSION+" -->\n";
    172                 result += "<imagery xmlns=\""+XML_NAMESPACE+"\">\n";
    173                 for (String entry : entries) {
    174                         result += entry+"\n";
    175                 }
    176             result += "</imagery>";
    177             return result;
    178         }
    179        
    180         protected static final String getEntry(OsmPrimitive p, String bounds) {
    181                 return getEntry(p.get(KEY_NAME), p.get(KEY_TYPE), p.get(KEY_DEFAULT), p.get(KEY_URL), bounds, p.get(KEY_PROJECTIONS), p.get(KEY_LOGO_URL),
    182                         p.get(KEY_EULA), p.get(KEY_ATTR_TEXT), p.get(KEY_ATTR_URL),  p.get(KEY_TERMS_TEXT), p.get(KEY_TERMS_URL), p.get(KEY_COUNTRY_CODE), p.get(KEY_MAX_ZOOM), p.get(KEY_MIN_ZOOM));
    183         }
    184        
    185         protected static final boolean isSet(String tag) {
    186             return tag != null && !tag.isEmpty();
    187         }
    188        
    189         protected static final String getEntry(String name, String type, String def, String url, String bounds, String projections, String logoURL,
    190                 String eula, String attributionText, String attributionUrl, String termsText, String termsUrl, String countryCode, String maxZoom, String minZoom) {
    191                 String result =
    192             "    <entry>\n"+
    193         "        " + simpleTag(XML_NAME, name) + "\n"+
    194         "        " + simpleTag(XML_TYPE, type, "wms") + "\n"+
    195         "        " + simpleTag(XML_URL, url != null ? encodeUrl(url) : "", false) + "\n"+
    196                      bounds+"\n";
    197                 if (projections != null && !projections.isEmpty()) {
    198                         result += "        "+startTag(XML_PROJECTIONS)+"\n";
    199                         int i = 0;
    200                         String[] codes = projections.split(";");
    201                         for (String code : codes) {
    202                                 if (i%6 == 0) {
    203                                         result += "            ";
    204                                 }
    205                                 result += simpleTag("code", code.trim());
    206                                 if (i%6 == 5 || i == codes.length-1 ) {
    207                                         result += "\n";
    208                                 }
    209                                 i++;
    210                         }
    211                         result += "        "+endTag(XML_PROJECTIONS)+"\n";
    212                 }
    213         if (isSet(def) && def.equals("true")) {
    214             result += "        " + simpleTag(XML_DEFAULT, def) + "\n";
    215         }
    216                 if (isSet(eula)) {
    217                         result += "        " + mandatoryTag(XML_EULA, encodeUrl(eula), false) + "\n";
    218                 }
    219                 if (isSet(attributionText)) {
    220             result += "        " + mandatoryTag(XML_ATTR_TEXT, attributionText) + "\n";
    221                 }
    222                 if (isSet(attributionUrl)) {
    223             result += "        " + simpleTag(XML_ATTR_URL, encodeUrl(attributionUrl), false) + "\n";
    224                 }
     174
     175    protected static final String getXml(OsmPrimitive ... primitives) {
     176        List<String> entries = new ArrayList<>();
     177        for (OsmPrimitive p : primitives) {
     178            if (p instanceof Relation) {
     179                entries.add(getEntry(p, getMultiPolygonBounds((Relation) p)));
     180            } else if (p instanceof Way) {
     181                entries.add(getEntry(p, getClosedWayBounds((Way) p)));
     182            }
     183        }
     184        return getImagery(entries.toArray(new String[0]));
     185    }
     186
     187    protected static final String getImagery(String ... entries) {
     188        StringBuilder result = new StringBuilder();
     189        result.append("<?xml version=\"1.0\" encoding=\"").append(ENCODING).append("\" ?>\n");
     190        result.append("<!-- Generated with JOSM Imagery XML Plugin version ").append(PLUGIN_VERSION).append(" -->\n");
     191        result.append("<imagery xmlns=\"").append(XML_NAMESPACE).append("\">\n");
     192        for (String entry : entries) {
     193            result.append(entry).append("\n");
     194        }
     195        result.append("</imagery>");
     196        return result.toString();
     197    }
     198
     199    protected static final String getEntry(OsmPrimitive p, String bounds) {
     200        return getEntry(p.get(KEY_NAME), p.get(KEY_TYPE), p.get(KEY_DEFAULT), p.get(KEY_URL), bounds, p.get(KEY_PROJECTIONS),
     201                p.get(KEY_LOGO_URL), p.get(KEY_EULA), p.get(KEY_ATTR_TEXT), p.get(KEY_ATTR_URL),  p.get(KEY_TERMS_TEXT),
     202                p.get(KEY_TERMS_URL), p.get(KEY_COUNTRY_CODE), p.get(KEY_MAX_ZOOM), p.get(KEY_MIN_ZOOM));
     203    }
     204
     205    protected static final boolean isSet(String tag) {
     206        return tag != null && !tag.isEmpty();
     207    }
     208
     209    protected static final String getEntry(String name, String type, String def, String url, String bounds, String projections,
     210            String logoURL, String eula, String attributionText, String attributionUrl, String termsText, String termsUrl,
     211            String countryCode, String maxZoom, String minZoom) {
     212        StringBuilder result = new StringBuilder();
     213        result.append("    <entry>\n"+
     214        EIGHT_SP + simpleTag(XML_NAME, name) + "\n"+
     215        EIGHT_SP + simpleTag(XML_TYPE, type, "wms") + "\n"+
     216        EIGHT_SP + simpleTag(XML_URL, url != null ? encodeUrl(url) : "", false) + "\n"+
     217                 bounds+"\n");
     218        if (projections != null && !projections.isEmpty()) {
     219            result.append(EIGHT_SP+startTag(XML_PROJECTIONS)+"\n");
     220            int i = 0;
     221            String[] codes = projections.split(";");
     222            for (String code : codes) {
     223                if (i%6 == 0) {
     224                    result.append("            ");
     225                }
     226                result.append(simpleTag("code", code.trim()));
     227                if (i%6 == 5 || i == codes.length-1 ) {
     228                    result.append("\n");
     229                }
     230                i++;
     231            }
     232            result.append(EIGHT_SP+endTag(XML_PROJECTIONS)+"\n");
     233        }
     234        if (isSet(def) && "true".equals(def)) {
     235            result.append(EIGHT_SP + simpleTag(XML_DEFAULT, def) + "\n");
     236        }
     237        if (isSet(eula)) {
     238            result.append(EIGHT_SP + mandatoryTag(XML_EULA, encodeUrl(eula), false) + "\n");
     239        }
     240        if (isSet(attributionText)) {
     241            result.append(EIGHT_SP + mandatoryTag(XML_ATTR_TEXT, attributionText) + "\n");
     242        }
     243        if (isSet(attributionUrl)) {
     244            result.append(EIGHT_SP + simpleTag(XML_ATTR_URL, encodeUrl(attributionUrl), false) + "\n");
     245        }
    225246        if (isSet(termsText)) {
    226             result += "        " + simpleTag(XML_TERMS_TEXT, termsText) + "\n";
     247            result.append(EIGHT_SP + simpleTag(XML_TERMS_TEXT, termsText) + "\n");
    227248        }
    228249        if (isSet(termsUrl)) {
    229             result += "        " + simpleTag(XML_TERMS_URL, encodeUrl(termsUrl), false) + "\n";
     250            result.append(EIGHT_SP + simpleTag(XML_TERMS_URL, encodeUrl(termsUrl), false) + "\n");
    230251        }
    231252        if (isSet(logoURL)) {
    232             result += "        " + simpleTag(XML_LOGO_URL, encodeUrl(logoURL), false) + "\n";
    233         }
    234                 if (isSet(countryCode)) {
    235             result += "        " + simpleTag(XML_COUNTRY_CODE, countryCode) + "\n";
    236                 }
    237                 if ("tms".equals(type)) {
    238                     if (isSet(maxZoom)) {
    239                         result += "        " + simpleTag(XML_MAX_ZOOM, maxZoom) + "\n";
    240                     }
     253            result.append(EIGHT_SP + simpleTag(XML_LOGO_URL, encodeUrl(logoURL), false) + "\n");
     254        }
     255        if (isSet(countryCode)) {
     256            result.append(EIGHT_SP + simpleTag(XML_COUNTRY_CODE, countryCode) + "\n");
     257        }
     258        if ("tms".equals(type)) {
     259            if (isSet(maxZoom)) {
     260                result.append(EIGHT_SP + simpleTag(XML_MAX_ZOOM, maxZoom) + "\n");
     261            }
    241262            if (isSet(minZoom)) {
    242                 result += "        " + simpleTag(XML_MIN_ZOOM, minZoom) + "\n";
    243             }
    244                 }
    245             result += "    </entry>";
    246             return result;
    247         }
    248        
    249         protected static final String encodeUrl(String url) {
    250             return "<![CDATA["+url+"]]>";
    251         }
    252        
    253         protected static final String getBounds(OsmPrimitive p, boolean closeTag) {
    254                 BBox bbox = p.getBBox();
    255                 String result = "        <bounds ";
    256                 result += "min-lat='"+df.format(bbox.getBottomRight().lat())+"' ";
    257                 result += "min-lon='"+df.format(bbox.getTopLeft().lon())+"' ";
    258                 result += "max-lat='"+df.format(bbox.getTopLeft().lat())+"' ";
    259                 result += "max-lon='"+df.format(bbox.getBottomRight().lon())+"'";
    260                 result += closeTag ? " />" : ">\n";
    261                 return result;
    262         }
    263        
    264         protected static final boolean isValidOuterMember(RelationMember mb) {
    265                 return (mb.getRole() == null || mb.getRole().isEmpty() || mb.getRole().equals("outer"))
    266                                 && mb.getMember() instanceof Way && ((Way) mb.getMember()).isClosed();
    267         }
    268        
    269         protected static final String getMultiPolygonBounds(Relation mp) {
    270                 List<Way> outerClosedWays = new ArrayList<Way>();
    271                 for (RelationMember mb : mp.getMembers()) {
    272                         if (isValidOuterMember(mb)) {
    273                                 outerClosedWays.add((Way) mb.getMember());
    274                         }
    275                 }
    276                
    277                 if (outerClosedWays.isEmpty() || (outerClosedWays.size() == 1 && areClosedWayAndBboxEqual(outerClosedWays.get(0), mp.getBBox()))) {
    278                         return getBounds(mp, true);
    279                 } else {
    280                         String result = getBounds(mp, false);
    281                         for (Way way : outerClosedWays) {
    282                                 result += getClosedWayShape(way);
    283                         }
    284                         result += "        </bounds>";
    285                         return result;
    286                 }
    287         }
    288        
    289         protected static final boolean areClosedWayAndBboxEqual(Way way, BBox bBox) {
    290                 if (way.getNodesCount() == 5) {
    291                         Map<Double, List<Integer>> latMap = new HashMap<Double, List<Integer>>();
    292                         Map<Double, List<Integer>> lonMap = new HashMap<Double, List<Integer>>();
    293 
    294                         for (int i=0; i<4; i++) {
    295                                 LatLon c = way.getNode(i).getCoor();
    296                                 if (i > 1) {
    297                                         LatLon b = way.getNode(i-1).getCoor();
    298                                         if (b.lat() != c.lat() && b.lon() !=  c.lon()) {
    299                                                 return false;
    300                                         }
    301                                 }
    302                                 List<Integer> latList = latMap.get(c.lat());
    303                                 if (latList == null) {
    304                                         latList = new ArrayList<Integer>();
    305                                         latMap.put(c.lat(), latList);
    306                                 }
    307                                 latList.add(i);
    308                                 List<Integer> lonList = lonMap.get(c.lon());
    309                                 if (lonList == null) {
    310                                         lonList = new ArrayList<Integer>();
    311                                         lonMap.put(c.lon(), lonList);
    312                                 }
    313                                 lonList.add(i);
    314                         }
    315                        
    316                         return latMap.size() == 2 && lonMap.size() == 2
    317                                         && latMap.containsKey(bBox.getBottomRight().lat()) && latMap.containsKey(bBox.getTopLeft().lat())
    318                                         && lonMap.containsKey(bBox.getBottomRight().lon()) && lonMap.containsKey(bBox.getTopLeft().lon());
    319                 }
    320                 return false;
    321         }
    322 
    323         protected static final String getClosedWayBounds(Way cw) {
    324                 if (areClosedWayAndBboxEqual(cw, cw.getBBox())) {
    325                         return getBounds(cw, true);
    326                 } else {
    327                         return getBounds(cw, false) + getClosedWayShape(cw) + "        </bounds>";
    328                 }
    329         }
    330 
    331         protected static final String getClosedWayShape(Way cw) {
    332                 String result = "            <shape>\n";
    333                 for (int i=0; i<cw.getNodesCount(); i++) {
    334                         if (i%3 == 0) {
    335                                 result += "                ";
    336                         }
    337                         int j = i;
    338                         if(j == cw.getNodesCount())
    339                             j = 0;
    340                         result += "<point ";
    341                         result += "lat='" + df.format(cw.getNode(i).getCoor().lat()) + "' ";
    342                         result += "lon='" + df.format(cw.getNode(i).getCoor().lon()) + "'/>";
    343                         if (i%3 == 2 || i == cw.getNodesCount()-1 ) {
    344                                 result += "\n";
    345                         }
    346                 }
    347                 result += "            </shape>\n";
    348                 return result;
    349         }
    350 
    351         @Override
    352         public void actionPerformed(ActionEvent e) {
    353                 System.out.println(getXml());
    354         }
     263                result.append(EIGHT_SP + simpleTag(XML_MIN_ZOOM, minZoom) + "\n");
     264            }
     265        }
     266        result.append("    </entry>");
     267        return result.toString();
     268    }
     269
     270    protected static final String encodeUrl(String url) {
     271        return "<![CDATA["+url+"]]>";
     272    }
     273
     274    protected static final String getBounds(OsmPrimitive p, boolean closeTag) {
     275        BBox bbox = p.getBBox();
     276        String result = "        <bounds ";
     277        result += "min-lat='"+DF.format(bbox.getBottomRight().lat())+"' ";
     278        result += "min-lon='"+DF.format(bbox.getTopLeft().lon())+"' ";
     279        result += "max-lat='"+DF.format(bbox.getTopLeft().lat())+"' ";
     280        result += "max-lon='"+DF.format(bbox.getBottomRight().lon())+"'";
     281        result += closeTag ? " />" : ">\n";
     282        return result;
     283    }
     284
     285    protected static final boolean isValidOuterMember(RelationMember mb) {
     286        return (mb.getRole() == null || mb.getRole().isEmpty() || "outer".equals(mb.getRole()))
     287                && mb.getMember() instanceof Way && ((Way) mb.getMember()).isClosed();
     288    }
     289
     290    protected static final String getMultiPolygonBounds(Relation mp) {
     291        List<Way> outerClosedWays = new ArrayList<>();
     292        for (RelationMember mb : mp.getMembers()) {
     293            if (isValidOuterMember(mb)) {
     294                outerClosedWays.add((Way) mb.getMember());
     295            }
     296        }
     297
     298        if (outerClosedWays.isEmpty() || (outerClosedWays.size() == 1 && areClosedWayAndBboxEqual(outerClosedWays.get(0), mp.getBBox()))) {
     299            return getBounds(mp, true);
     300        } else {
     301            StringBuilder result = new StringBuilder(getBounds(mp, false));
     302            for (Way way : outerClosedWays) {
     303                result.append(getClosedWayShape(way));
     304            }
     305            result.append("        </bounds>");
     306            return result.toString();
     307        }
     308    }
     309
     310    protected static final boolean areClosedWayAndBboxEqual(Way way, BBox bBox) {
     311        if (way.getNodesCount() == 5) {
     312            Map<Double, List<Integer>> latMap = new HashMap<>();
     313            Map<Double, List<Integer>> lonMap = new HashMap<>();
     314
     315            for (int i=0; i<4; i++) {
     316                LatLon c = way.getNode(i).getCoor();
     317                if (i > 1) {
     318                    LatLon b = way.getNode(i-1).getCoor();
     319                    if (b.lat() != c.lat() && b.lon() !=  c.lon()) {
     320                        return false;
     321                    }
     322                }
     323                List<Integer> latList = latMap.get(c.lat());
     324                if (latList == null) {
     325                    latList = new ArrayList<>();
     326                    latMap.put(c.lat(), latList);
     327                }
     328                latList.add(i);
     329                List<Integer> lonList = lonMap.get(c.lon());
     330                if (lonList == null) {
     331                    lonList = new ArrayList<>();
     332                    lonMap.put(c.lon(), lonList);
     333                }
     334                lonList.add(i);
     335            }
     336
     337            return latMap.size() == 2 && lonMap.size() == 2
     338                    && latMap.containsKey(bBox.getBottomRight().lat()) && latMap.containsKey(bBox.getTopLeft().lat())
     339                    && lonMap.containsKey(bBox.getBottomRight().lon()) && lonMap.containsKey(bBox.getTopLeft().lon());
     340        }
     341        return false;
     342    }
     343
     344    protected static final String getClosedWayBounds(Way cw) {
     345        if (areClosedWayAndBboxEqual(cw, cw.getBBox())) {
     346            return getBounds(cw, true);
     347        } else {
     348            return getBounds(cw, false) + getClosedWayShape(cw) + "        </bounds>";
     349        }
     350    }
     351
     352    protected static final String getClosedWayShape(Way cw) {
     353        StringBuilder result = new StringBuilder("            <shape>\n");
     354        for (int i=0; i<cw.getNodesCount(); i++) {
     355            if (i%3 == 0) {
     356                result.append("                ");
     357            }
     358            int j = i;
     359            if(j == cw.getNodesCount())
     360                j = 0;
     361            result.append("<point ");
     362            result.append("lat='").append(DF.format(cw.getNode(i).getCoor().lat())).append("' ");
     363            result.append("lon='").append(DF.format(cw.getNode(i).getCoor().lon())).append("'/>");
     364            if (i%3 == 2 || i == cw.getNodesCount()-1 ) {
     365                result.append("\n");
     366            }
     367        }
     368        result.append("            </shape>\n");
     369        return result.toString();
     370    }
     371
     372    @Override
     373    public void actionPerformed(ActionEvent e) {
     374        if (Main.isDebugEnabled()) {
     375            Main.debug(getXml());
     376        }
     377    }
    355378}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/EditEntriesAction.java

    r30342 r30735  
    99
    1010import javax.swing.JTable;
    11 import javax.swing.SwingUtilities;
    1211import javax.swing.event.ListSelectionEvent;
    1312import javax.swing.event.ListSelectionListener;
     
    1716import org.openstreetmap.josm.data.imagery.ImageryInfo;
    1817import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference.ImageryProvidersPanel.ImageryDefaultLayerTableModel;
     18import org.openstreetmap.josm.gui.util.GuiHelper;
    1919import org.openstreetmap.josm.plugins.imageryxmlbounds.XmlBoundsConstants;
    2020import org.openstreetmap.josm.plugins.imageryxmlbounds.XmlBoundsLayer;
    2121import org.openstreetmap.josm.plugins.imageryxmlbounds.data.XmlBoundsConverter;
    2222
    23 @SuppressWarnings("serial")
     23/**
     24 * Edit bounds for selected defaults.
     25 */
    2426public class EditEntriesAction extends JosmAction implements XmlBoundsConstants, ListSelectionListener {
    2527
    26         protected static final String ACTION_NAME = tr("Edit");
     28    protected static final String ACTION_NAME = tr("Edit");
    2729
    28         private final JTable defaultTable;
    29         private final ImageryDefaultLayerTableModel defaultModel;
     30    private final JTable defaultTable;
     31    private final ImageryDefaultLayerTableModel defaultModel;
    3032
    31         private final List<ImageryInfo> entries;
     33    private final List<ImageryInfo> entries;
    3234
    33         public EditEntriesAction(JTable defaultTable, ImageryDefaultLayerTableModel defaultModel) {
     35    /**
     36     * Constructs a new {@code EditEntriesAction}.
     37     * @param defaultTable table
     38     * @param defaultModel table model
     39     */
     40    public EditEntriesAction(JTable defaultTable, ImageryDefaultLayerTableModel defaultModel) {
    3441        putValue(SHORT_DESCRIPTION, tr("edit bounds for selected defaults"));
    3542        putValue(NAME, ACTION_NAME);
    3643        try {
    37                 putValue(SMALL_ICON, XML_ICON_24);
     44            putValue(SMALL_ICON, XML_ICON_24);
    3845        } catch (Exception ex) {
    39                 ex.printStackTrace();
     46            Main.error(ex);
    4047        }
    4148        this.defaultModel = defaultModel;
    4249        this.defaultTable = defaultTable;
    4350        this.defaultTable.getSelectionModel().addListSelectionListener(this);
    44         this.entries = new ArrayList<ImageryInfo>();
    45         setEnabled(false);
    46         }
     51        this.entries = new ArrayList<>();
     52        setEnabled(false);
     53    }
    4754
    48         @Override
    49         public void actionPerformed(ActionEvent e) {
    50                 final XmlBoundsLayer layer = new XmlBoundsLayer(
    51                                 XmlBoundsConverter.convertImageryEntries(entries));
     55    @Override
     56    public void actionPerformed(ActionEvent e) {
     57        final XmlBoundsLayer layer = new XmlBoundsLayer(
     58                XmlBoundsConverter.convertImageryEntries(entries));
    5259        final Runnable uiStuff = new Runnable() {
    5360            @Override
     
    5764            }
    5865        };
    59         if (SwingUtilities.isEventDispatchThread()) {
    60             uiStuff.run();
    61         } else {
    62             SwingUtilities.invokeLater(uiStuff);
     66        GuiHelper.runInEDT(uiStuff);
     67    }
     68
     69    @Override
     70    public void valueChanged(ListSelectionEvent e) {
     71        if (!e.getValueIsAdjusting()) {
     72            entries.clear();
     73            for (int row : defaultTable.getSelectedRows()) {
     74                ImageryInfo info = defaultModel.getRow(row);
     75                if (info != null && info.getBounds() != null) {
     76                    entries.add(info);
     77                }
     78            }
     79            setEnabled(!entries.isEmpty());
    6380        }
    64         }
    65 
    66         @Override
    67         public void valueChanged(ListSelectionEvent e) {
    68                 if (!e.getValueIsAdjusting()) {
    69                         entries.clear();
    70                         for (int row : defaultTable.getSelectedRows()) {
    71                                 ImageryInfo info = defaultModel.getRow(row);
    72                                 if (info != null && info.getBounds() != null) {
    73                                         entries.add(info);
    74                                 }
    75                         }
    76                         setEnabled(!entries.isEmpty());
    77                 }
    78         }
     81    }
    7982}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/ShowBoundsAction.java

    r30342 r30735  
    1919
    2020/**
     21 * Show XML bounds.
    2122 * @author Don-vip
    22  *
    2323 */
    24 @SuppressWarnings("serial")
    2524public class ShowBoundsAction extends ComputeBoundsAction implements OsmPrimitiveAction {
    2625
    27         public ShowBoundsAction() {
    28         }
    29        
    30         public ShowBoundsAction(XmlBoundsLayer xmlBoundsLayer) {
    31                 super(xmlBoundsLayer);
    32         }
     26    /**
     27     * Constructs a new {@code ShowBoundsAction}.
     28     */
     29    public ShowBoundsAction() {
     30    }
    3331
    34         @Override
    35         public void actionPerformed(ActionEvent e) {
    36                 XmlTextPane pane = new XmlTextPane();
    37                 Font courierNew = Font.getFont("Courier New");
    38                 if (courierNew != null) {
    39                         pane.setFont(courierNew);
    40                 }
    41                 pane.setText(getXml());
    42                 pane.setEditable(false);
    43                 Box box = Box.createVerticalBox();
    44                 JScrollPane scrollPane = new JScrollPane(pane);
     32    /**
     33     * Constructs a new {@code ShowBoundsAction}.
     34     * @param xmlBoundsLayer XML bounds layer
     35     */
     36    public ShowBoundsAction(XmlBoundsLayer xmlBoundsLayer) {
     37        super(xmlBoundsLayer);
     38    }
     39
     40    @Override
     41    public void actionPerformed(ActionEvent e) {
     42        XmlTextPane pane = new XmlTextPane();
     43        Font courierNew = Font.getFont("Courier New");
     44        if (courierNew != null) {
     45            pane.setFont(courierNew);
     46        }
     47        pane.setText(getXml());
     48        pane.setEditable(false);
     49        Box box = Box.createVerticalBox();
     50        JScrollPane scrollPane = new JScrollPane(pane);
    4551        scrollPane.setPreferredSize(new Dimension(1024, 600));
    4652        box.add(scrollPane);
    4753        JOptionPane.showMessageDialog(Main.parent, box, ACTION_NAME, JOptionPane.PLAIN_MESSAGE);
    48         }
     54    }
    4955
    5056    @Override
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/ShowBoundsSelectionAction.java

    r30342 r30735  
    88
    99/**
    10  * 
     10 *
    1111 * @author Don-vip
    1212 *
    1313 */
    14 @SuppressWarnings("serial")
    1514public class ShowBoundsSelectionAction extends ShowBoundsAction implements SelectionChangedListener {
    1615
    17         public ShowBoundsSelectionAction() {
    18                 putValue("toolbar", "xml-imagery-bounds");
    19         }
     16    /**
     17     * Constructs a new {@code ShowBoundsSelectionAction}.
     18     */
     19    public ShowBoundsSelectionAction() {
     20        putValue("toolbar", "xml-imagery-bounds");
     21    }
    2022
    21         @Override
    22         public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
    23                 updateOsmPrimitives(newSelection);
    24         }
     23    @Override
     24    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
     25        updateOsmPrimitives(newSelection);
     26    }
    2527}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/downloadtask/DownloadXmlBoundsTask.java

    r30342 r30735  
    1717import org.openstreetmap.josm.plugins.imageryxmlbounds.io.JosmServerLocationReader;
    1818
     19/**
     20 * Download imagery XML bounds from JOSM server.
     21 */
    1922public class DownloadXmlBoundsTask extends DownloadOsmTask implements XmlBoundsConstants {
    2023
     
    4952
    5053    protected class DownloadTask extends DownloadOsmTask.DownloadTask {
     54
     55        /**
     56         * Constructs a new {@code DownloadTask}.
     57         * @param newLayer if {@code true}, download to a new layer
     58         * @param reader server reader
     59         * @param progressMonitor progress monitor
     60         */
    5161        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
    5262            super(newLayer, reader, progressMonitor);
    5363        }
    54        
     64
    5565        @Override
    5666        protected OsmDataLayer getEditLayer() {
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/data/XmlBoundsConverter.java

    r30393 r30735  
    88import org.openstreetmap.josm.data.coor.LatLon;
    99import org.openstreetmap.josm.data.imagery.ImageryInfo;
    10 import org.openstreetmap.josm.data.imagery.Shape;
    1110import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryBounds;
    1211import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
     12import org.openstreetmap.josm.data.imagery.Shape;
    1313import org.openstreetmap.josm.data.osm.BBox;
    1414import org.openstreetmap.josm.data.osm.DataSet;
     
    2121
    2222/**
    23  *
     23 * Converts imagery entries to bounds data.
    2424 * @author Don-vip
    25  *
    2625 */
    2726public class XmlBoundsConverter implements XmlBoundsConstants {
    28        
    29         public static DataSet convertImageryEntries(List<ImageryInfo> entries) {
    30                 DataSet dataSet = new DataSet();
    31                
    32                 for (ImageryInfo imagery : entries) {
    33                         if (!imagery.isBlacklisted()) {
    34                                 ImageryBounds bounds = imagery.getBounds();
    35                                 if (bounds != null) {
    36                                         dataSet.addPrimitive(convertImagery(imagery, bounds, dataSet));
    37                                 }
    38                         }
    39                 }
    40                 return dataSet;
    41         }
    42        
    43         private static void safePut(OsmPrimitive p, String key, Object value) {
    44                 if (value != null) {
    45                         if (value instanceof Collection) {
    46                                 String s = "";
    47                                 for (Object elt : (Collection<?>)value) {
    48                                         if (elt != null && elt.toString() != null && !elt.toString().isEmpty()) {
    49                                                 if (!s.isEmpty()) {
    50                                                         s += ";";
    51                                                 }
    52                                                 s += elt.toString();
    53                                         }
    54                                 }
    55                                 if (!s.isEmpty()) {
    56                                         p.put(key, s);
    57                                 }
    58                         } else if (!value.equals(0) && value.toString() != null && !value.toString().isEmpty()) {
    59                                 p.put(key, value.toString());
    60                         }
    61                 }
    62         }
    63        
     27
     28    /**
     29     * Convert a list of imagery entries to a dataset containing associated bounds.
     30     * @param entries imagery entries
     31     * @return dataset containing associated bounds
     32     */
     33    public static DataSet convertImageryEntries(List<ImageryInfo> entries) {
     34        DataSet dataSet = new DataSet();
     35
     36        for (ImageryInfo imagery : entries) {
     37            if (!imagery.isBlacklisted()) {
     38                ImageryBounds bounds = imagery.getBounds();
     39                if (bounds != null) {
     40                    dataSet.addPrimitive(convertImagery(imagery, bounds, dataSet));
     41                }
     42            }
     43        }
     44        return dataSet;
     45    }
     46
     47    private static void safePut(OsmPrimitive p, String key, Object value) {
     48        if (value != null) {
     49            if (value instanceof Collection) {
     50                StringBuilder s = new StringBuilder("");
     51                for (Object elt : (Collection<?>)value) {
     52                    if (elt != null && elt.toString() != null && !elt.toString().isEmpty()) {
     53                        if (s.length() > 0) {
     54                            s.append(";");
     55                        }
     56                        s.append(elt.toString());
     57                    }
     58                }
     59                if (s.length() > 0) {
     60                    p.put(key, s.toString());
     61                }
     62            } else if (!value.equals(0) && value.toString() != null && !value.toString().isEmpty()) {
     63                p.put(key, value.toString());
     64            }
     65        }
     66    }
     67
    6468    private static Node getNode(LatLon latlon, DataSet dataSet) {
    6569        List<Node> nodes = dataSet.searchNodes(new BBox(latlon, latlon));
     
    7377    }
    7478
    75         private static Node getNode(double lat, double lon, DataSet dataSet) {
    76             return getNode(new LatLon(lat, lon), dataSet);
    77         }
    78        
    79         private static void ensureWayIsClosed(Way way) {
    80             if (!way.getNode(0).equals(way.getNode(way.getNodesCount()-1))) {
    81                 way.addNode(way.getNode(0));
    82             }
    83         }
    84        
    85         private static OsmPrimitive convertImagery(ImageryInfo imagery, ImageryBounds bounds, DataSet dataSet) {
    86                 OsmPrimitive osmImagery = null;
    87                 if (bounds.getShapes().isEmpty()) {
    88                         LatLon bottomLeft = bounds.getMin();
    89                         LatLon topRight = bounds.getMax();
    90                         LatLon topLeft = new LatLon(topRight.lat(), bottomLeft.lon());
    91                         LatLon bottomRight = new LatLon(bottomLeft.lat(), topRight.lon());
    92                        
    93                         Way way = new Way();
    94                         for (LatLon ll : new LatLon[]{bottomLeft, topLeft, topRight, bottomRight}) {
    95                                 way.addNode(getNode(ll, dataSet));
    96                         }
    97                         ensureWayIsClosed(way);
    98                         osmImagery = way;
    99                        
    100                 } else {
    101                         Relation relation = new Relation();
    102                         relation.put("type", "multipolygon");
    103                         for (Shape shape : bounds.getShapes()) {
    104                                 Way way = new Way();
    105                                 for (Coordinate coor : shape.getPoints()) {
    106                                         way.addNode(getNode(coor.getLat(), coor.getLon(), dataSet));
    107                                 }
    108                                 ensureWayIsClosed(way);
    109                                 dataSet.addPrimitive(way);
    110                                 relation.addMember(new RelationMember("outer", way));
    111                         }
    112                         osmImagery = relation;
    113                 }
    114                
    115                 safePut(osmImagery, KEY_NAME, imagery.getOriginalName());
    116                 safePut(osmImagery, KEY_TYPE, imagery.getImageryType().getTypeString());
    117                 safePut(osmImagery, KEY_DEFAULT, imagery.isDefaultEntry());
    118                 safePut(osmImagery, KEY_URL, imagery.getUrl());
    119                 safePut(osmImagery, KEY_PROJECTIONS, imagery.getServerProjections());
    120                 safePut(osmImagery, KEY_EULA, imagery.getEulaAcceptanceRequired());
    121                 safePut(osmImagery, KEY_ATTR_TEXT, imagery.getAttributionText(0, null, null));
    122                 safePut(osmImagery, KEY_ATTR_URL, imagery.getAttributionLinkURL());
     79    private static Node getNode(double lat, double lon, DataSet dataSet) {
     80        return getNode(new LatLon(lat, lon), dataSet);
     81    }
     82
     83    private static void ensureWayIsClosed(Way way) {
     84        if (!way.getNode(0).equals(way.getNode(way.getNodesCount()-1))) {
     85            way.addNode(way.getNode(0));
     86        }
     87    }
     88
     89    private static OsmPrimitive convertImagery(ImageryInfo imagery, ImageryBounds bounds, DataSet dataSet) {
     90        OsmPrimitive osmImagery = null;
     91        if (bounds.getShapes().isEmpty()) {
     92            LatLon bottomLeft = bounds.getMin();
     93            LatLon topRight = bounds.getMax();
     94            LatLon topLeft = new LatLon(topRight.lat(), bottomLeft.lon());
     95            LatLon bottomRight = new LatLon(bottomLeft.lat(), topRight.lon());
     96
     97            Way way = new Way();
     98            for (LatLon ll : new LatLon[]{bottomLeft, topLeft, topRight, bottomRight}) {
     99                way.addNode(getNode(ll, dataSet));
     100            }
     101            ensureWayIsClosed(way);
     102            osmImagery = way;
     103
     104        } else {
     105            Relation relation = new Relation();
     106            relation.put("type", "multipolygon");
     107            for (Shape shape : bounds.getShapes()) {
     108                Way way = new Way();
     109                for (Coordinate coor : shape.getPoints()) {
     110                    way.addNode(getNode(coor.getLat(), coor.getLon(), dataSet));
     111                }
     112                ensureWayIsClosed(way);
     113                dataSet.addPrimitive(way);
     114                relation.addMember(new RelationMember("outer", way));
     115            }
     116            osmImagery = relation;
     117        }
     118
     119        safePut(osmImagery, KEY_NAME, imagery.getOriginalName());
     120        safePut(osmImagery, KEY_TYPE, imagery.getImageryType().getTypeString());
     121        safePut(osmImagery, KEY_DEFAULT, imagery.isDefaultEntry());
     122        safePut(osmImagery, KEY_URL, imagery.getUrl());
     123        safePut(osmImagery, KEY_PROJECTIONS, imagery.getServerProjections());
     124        safePut(osmImagery, KEY_EULA, imagery.getEulaAcceptanceRequired());
     125        safePut(osmImagery, KEY_ATTR_TEXT, imagery.getAttributionText(0, null, null));
     126        safePut(osmImagery, KEY_ATTR_URL, imagery.getAttributionLinkURL());
    123127        safePut(osmImagery, KEY_TERMS_TEXT, imagery.getTermsOfUseText());
    124                 safePut(osmImagery, KEY_TERMS_URL, imagery.getTermsOfUseURL());
    125                 safePut(osmImagery, KEY_COUNTRY_CODE, imagery.getCountryCode());
    126                 safePut(osmImagery, KEY_LOGO_URL, imagery.getAttributionImageURL());
     128        safePut(osmImagery, KEY_TERMS_URL, imagery.getTermsOfUseURL());
     129        safePut(osmImagery, KEY_COUNTRY_CODE, imagery.getCountryCode());
     130        safePut(osmImagery, KEY_LOGO_URL, imagery.getAttributionImageURL());
    127131
    128                 if (imagery.getImageryType().equals(ImageryType.TMS)) {
    129                         safePut(osmImagery, KEY_MAX_ZOOM, imagery.getMaxZoom());
    130                         safePut(osmImagery, KEY_MIN_ZOOM, imagery.getMinZoom());
    131                 }
    132                
    133                 return osmImagery;
    134         }
     132        if (imagery.getImageryType().equals(ImageryType.TMS)) {
     133            safePut(osmImagery, KEY_MAX_ZOOM, imagery.getMaxZoom());
     134            safePut(osmImagery, KEY_MIN_ZOOM, imagery.getMinZoom());
     135        }
     136
     137        return osmImagery;
     138    }
    135139}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/io/JosmServerLocationReader.java

    r30342 r30735  
    99import org.openstreetmap.josm.io.OsmTransferException;
    1010
     11/**
     12 * Read XML bounds from JOSM server.
     13 */
    1114public class JosmServerLocationReader extends OsmServerReader {
    1215
    1316    private String url;
    14    
     17
     18    /**
     19     * Constructs a new {@code JosmServerLocationReader}.
     20     * @param url URL to read
     21     */
    1522    public JosmServerLocationReader(String url) {
    1623        this.url = url;
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/io/ValidatingImageryReader.java

    r30495 r30735  
    2121public class ValidatingImageryReader extends ImageryReader implements XmlBoundsConstants {
    2222
    23         public ValidatingImageryReader(String source) throws SAXException, IOException {
    24                 this(source, true);
    25         }
     23    /**
     24     * Constructs a new {@code ValidatingImageryReader}.
     25     * @param source input source URL
     26     * @throws SAXException if a SAX error occurs during parsing
     27     * @throws IOException if any I/O error occurs
     28     */
     29    public ValidatingImageryReader(String source) throws SAXException, IOException {
     30        this(source, true);
     31    }
    2632
    27         public ValidatingImageryReader(String source, boolean validateFirst) throws SAXException, IOException {
    28                 super(source);
    29                 if (validateFirst) {
    30                         validate(source);
    31                 }
    32         }
     33    /**
     34     * Constructs a new {@code ValidatingImageryReader}.
     35     * @param source input source URL
     36     * @param validateFirst if {@code true}, the source if validated first
     37     * @throws SAXException if a SAX error occurs during parsing
     38     * @throws IOException if any I/O error occurs
     39     */
     40    public ValidatingImageryReader(String source, boolean validateFirst) throws SAXException, IOException {
     41        super(source);
     42        if (validateFirst) {
     43            validate(source);
     44        }
     45    }
    3346
    34         public static void validate(String source) throws SAXException, IOException {
     47    /**
     48     * Validates input against the JOSM Maps XSD.
     49     * @param source input source URL
     50     * @throws SAXException if a SAX error occurs during parsing
     51     * @throws IOException if any I/O error occurs
     52     */
     53    public static void validate(String source) throws SAXException, IOException {
    3554        SchemaFactory factory =  SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    3655        Schema schema = factory.newSchema(new StreamSource(new CachedFile(XML_SCHEMA).getInputStream()));
    3756        schema.newValidator().validate(new StreamSource(source));
    38         }
     57    }
    3958}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/io/XmlBoundsExporter.java

    r30342 r30735  
    2121public class XmlBoundsExporter extends FileExporter implements XmlBoundsConstants {
    2222
    23         public XmlBoundsExporter() {
    24                 super(FILE_FILTER);
    25         }
     23    /**
     24     * Constructs a new {@code XmlBoundsExporter}.
     25     */
     26    public XmlBoundsExporter() {
     27        super(FILE_FILTER);
     28    }
    2629
    27         @Override
    28         public void exportData(File file, Layer layer) throws IOException {
    29                 if (layer instanceof OsmDataLayer) {
    30                         Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), ENCODING));
    31                         try {
    32                                 writer.write(new ComputeBoundsAction((OsmDataLayer) layer).getXml());
    33                         } finally {
    34                                 writer.close();
    35                         }
    36                 }
    37         }
     30    @Override
     31    public void exportData(File file, Layer layer) throws IOException {
     32        if (layer instanceof OsmDataLayer) {
     33            try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), ENCODING))) {
     34                writer.write(new ComputeBoundsAction((OsmDataLayer) layer).getXml());
     35            }
     36        }
     37    }
    3838}
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/io/XmlBoundsImporter.java

    r30342 r30735  
    99
    1010import javax.swing.JOptionPane;
    11 import javax.swing.SwingUtilities;
    1211
    1312import org.openstreetmap.josm.Main;
    1413import org.openstreetmap.josm.data.osm.DataSet;
    1514import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     15import org.openstreetmap.josm.gui.util.GuiHelper;
    1616import org.openstreetmap.josm.io.FileImporter;
    1717import org.openstreetmap.josm.io.IllegalDataException;
     
    2828public class XmlBoundsImporter extends FileImporter implements XmlBoundsConstants {
    2929
    30         public XmlBoundsImporter() {
    31                 super(FILE_FILTER);
    32         }
    33        
    34         public DataSet parseDataSet(final String source) throws IOException, SAXException {
    35             return parseDataSet(source, null);
    36         }
     30    public XmlBoundsImporter() {
     31        super(FILE_FILTER);
     32    }
    3733
    38         public DataSet parseDataSet(final File file) throws IOException, SAXException {
     34    public DataSet parseDataSet(final String source) throws IOException, SAXException {
     35        return parseDataSet(source, null);
     36    }
     37
     38    public DataSet parseDataSet(final File file) throws IOException, SAXException {
    3939        return parseDataSet(null, file);
    4040    }
    41        
    42         protected DataSet parseDataSet(final String source, final File file) throws IOException, SAXException {
     41
     42    protected DataSet parseDataSet(final String source, final File file) throws IOException, SAXException {
    4343        ImageryReader reader = null;
    44        
     44
    4545        try {
    4646            reader = new ValidatingImageryReader(source != null ? source : file.getAbsolutePath());
     
    4848            if (JOptionPane.showConfirmDialog(
    4949                    Main.parent,
    50                     tr("Validating error in file {0}:\n{1}\nDo you want to continue without validating the file ?", 
     50                    tr("Validating error in file {0}:\n{1}\nDo you want to continue without validating the file ?",
    5151                            source != null ? source : file.getPath(), e.getLocalizedMessage()),
    5252                    tr("Open Imagery XML file"),
     
    5757            reader = new ImageryReader(source != null ? source : file.getAbsolutePath());
    5858        }
    59        
     59
    6060        return XmlBoundsConverter.convertImageryEntries(reader.parse());
    61         }
    62        
     61    }
     62
    6363    protected void importData(final String source, final String layerName, final File file, ProgressMonitor progressMonitor)
    6464            throws IOException, IllegalDataException {
     
    7878                }
    7979            };
    80             if (SwingUtilities.isEventDispatchThread()) {
    81                 uiStuff.run();
    82             } else {
    83                 SwingUtilities.invokeLater(uiStuff);
    84             }
     80            GuiHelper.runInEDT(uiStuff);
    8581        } catch (SAXException e) {
    8682            e.printStackTrace();
    8783        }
    8884    }
    89        
    90         @Override
    91         public void importData(final File file, ProgressMonitor progressMonitor)
    92                         throws IOException, IllegalDataException {
    93                 importData(null, null, file, progressMonitor);
    94         }
    95        
    96         public void importData(final String source, final String layerName, ProgressMonitor progressMonitor)
    97                 throws IOException, IllegalDataException {
    98             importData(source, layerName, null, progressMonitor);
     85
     86    @Override
     87    public void importData(final File file, ProgressMonitor progressMonitor)
     88            throws IOException, IllegalDataException {
     89        importData(null, null, file, progressMonitor);
    9990    }
    10091
    101         @Override
    102         public void importData(List<File> files, ProgressMonitor progressMonitor)
    103                         throws IOException, IllegalDataException {
    104                 for (File file : files) {
    105                         importData(file, progressMonitor);
    106                 }
    107         }
     92    public void importData(final String source, final String layerName, ProgressMonitor progressMonitor)
     93            throws IOException, IllegalDataException {
     94        importData(source, layerName, null, progressMonitor);
     95    }
     96
     97    @Override
     98    public void importData(List<File> files, ProgressMonitor progressMonitor)
     99            throws IOException, IllegalDataException {
     100        for (File file : files) {
     101            importData(file, progressMonitor);
     102        }
     103    }
    108104}
Note: See TracChangeset for help on using the changeset viewer.