Changeset 29228 in osm for applications


Ignore:
Timestamp:
2013-02-04T14:58:23+01:00 (12 years ago)
Author:
bastik
Message:

add presets for Poland (by keltoi) and Slovak Republic (by nail), see #josm6466 and #josm8392; add GUI for preset selection

Location:
applications/editors/josm/plugins/roadsigns
Files:
680 added
2 edited
71 moved

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignInputDialog.java

    r23192 r29228  
    1414import java.awt.event.MouseAdapter;
    1515import java.awt.event.MouseEvent;
     16import java.io.IOException;
    1617import java.util.ArrayList;
    1718import java.util.Collection;
     
    2425import java.util.TreeMap;
    2526
     27import javax.swing.AbstractAction;
     28import javax.swing.Action;
    2629import javax.swing.BorderFactory;
     30import javax.swing.Box;
     31import javax.swing.JButton;
    2732import javax.swing.JCheckBox;
     33import javax.swing.JComboBox;
    2834import javax.swing.JComponent;
    2935import javax.swing.JEditorPane;
     
    3137import javax.swing.JPanel;
    3238import javax.swing.JScrollPane;
     39import javax.swing.JTabbedPane;
    3340import javax.swing.JTable;
    3441import javax.swing.JTextField;
     
    5259import org.openstreetmap.josm.gui.MultiSplitLayout;
    5360import org.openstreetmap.josm.gui.MultiSplitPane;
     61import org.openstreetmap.josm.plugins.roadsigns.RoadSignsPlugin.PresetMetaData;
    5462import org.openstreetmap.josm.plugins.roadsigns.Sign.SignParameter;
    5563import org.openstreetmap.josm.plugins.roadsigns.Sign.Tag;
     
    7280 */
    7381class RoadSignInputDialog extends ExtendedDialog {
    74     protected final SignSelection sel;
    75     protected final List<Sign> signs;
     82    protected SignSelection sel;
     83    protected List<Sign> signs;
    7684    protected JTable previewTable;
    7785    protected JCheckBox addTrafficSignTag;
     
    8492    protected JScrollPane scrollInfo;
    8593
    86     public RoadSignInputDialog(List<Sign> signs) {
     94    public RoadSignInputDialog() {
    8795        super(Main.parent, tr("Road Sign Plugin"), new String[] {tr("OK"), tr("Cancel")}, false /* modal */);
    88         this.signs = signs;
     96        this.signs = RoadSignsPlugin.signs;
    8997        sel = new SignSelection();
    9098        setButtonIcons(new String[] { "ok.png", "cancel.png" });
    91         setContent(buildPanel(), false);
     99        final JTabbedPane tabs = new JTabbedPane();
     100        tabs.add(tr("signs"), buildSignsPanel());
     101        Action updateAction = new AbstractAction() {
     102            @Override
     103            public void actionPerformed(ActionEvent e) {
     104                RoadSignInputDialog.this.signs = RoadSignsPlugin.signs;
     105                sel = new SignSelection();
     106                tabs.setComponentAt(0, buildSignsPanel());
     107            }
     108        };
     109        tabs.add(tr("settings"), new SettingsPanel(false, updateAction));
     110        setContent(tabs, false);
    92111    }
    93112
     
    96115        if (i == 0) { // OK Button
    97116            Collection<OsmPrimitive> selPrim = Main.main.getCurrentDataSet().getSelected();
    98             if (selPrim.size() != 0) {
     117            if (!selPrim.isEmpty()) {
    99118                Main.pref.put("plugin.roadsigns.addTrafficSignTag", addTrafficSignTag.isSelected());
    100119
     
    115134            cmds.add(new ChangePropertyCommand(selPrim, key, value));
    116135        }
    117         if (cmds.size() == 0)
     136        if (cmds.isEmpty())
    118137            return null;
    119138        else if (cmds.size() == 1)
     
    123142    }
    124143
    125     private JComponent buildPanel() {
     144    private JComponent buildSignsPanel() {
    126145        String layoutDef =
    127146            "(COLUMN "+
     
    162181                if (e == null || e.getURL() == null)
    163182                    return;
    164                 System.err.println(e.getURL());
     183                System.out.println(e.getURL());
    165184                if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
    166185                    OpenBrowser.displayUrl(e.getURL().toString());
     
    263282        private Pair<Integer, Integer> findIndex(SignWrapper swFind) {
    264283            int selIdx=0;
    265             int combIdx=0;
    266284            for (SignCombination sc : combos) {
    267                 combIdx=0;
     285                int combIdx=0;
    268286                for (SignWrapper sw : sc.signs) {
    269287                    if (swFind == sw) {
     
    717735
    718736            if (sign.wiki != null || sign.loc_wiki != null) {
    719                 String wikiPrefix = Main.main.pref.get("plugin.roadsigns.wikiprefix", "http://wiki.openstreetmap.org/wiki/");
     737                String wikiPrefix = Main.pref.get("plugin.roadsigns.wikiprefix", "http://wiki.openstreetmap.org/wiki/");
    720738                txt.append("<p>");
    721739                if (sign.loc_wiki != null) {
     
    791809        }
    792810    }
     811
     812    public static class SettingsPanel extends JPanel {
     813
     814        private List<PresetMetaData> presetsData;
     815        private JComboBox selectionBox;
     816
     817        public SettingsPanel(boolean standalone, final Action update) {
     818            super(new GridBagLayout());
     819            presetsData = RoadSignsPlugin.getAvailablePresetsMetaData();
     820
     821            selectionBox = new JComboBox(presetsData.toArray());
     822            String code = Main.pref.get("plugin.roadsigns.preset.selection", null);
     823            if (code != null) {
     824                for (PresetMetaData data : presetsData) {
     825                    if (code.equals(data.code)) {
     826                        selectionBox.setSelectedItem(data);
     827                    }
     828                }
     829            }
     830            this.add(new JLabel(tr("Country preset:")), GBC.std().insets(5, 5, 5, 5));
     831            this.add(selectionBox, GBC.eol().insets(0, 5, 5, 5));
     832            if (!standalone) {
     833                JButton apply = new JButton(new AbstractAction(tr("Apply")) {
     834                    @Override
     835                    public void actionPerformed(ActionEvent e) {
     836                        try {
     837                            apply();
     838                        } catch (IOException ex) {
     839                            return;
     840                        }
     841                        update.actionPerformed(null);
     842                    }
     843                });
     844                this.add(apply, GBC.eol().insets(5, 0, 5, 5));
     845            }
     846            this.add(Box.createVerticalGlue(), GBC.eol().fill());
     847        }
     848
     849        public void apply() throws IOException {
     850            RoadSignsPlugin.setSelectedPreset(presetsData.get(selectionBox.getSelectedIndex()));
     851        }
     852    }
     853
    793854}
  • applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignsPlugin.java

    r27868 r29228  
    88import java.awt.event.ActionEvent;
    99import java.awt.event.KeyEvent;
     10import java.io.File;
    1011import java.io.FileInputStream;
    1112import java.io.IOException;
    1213import java.io.InputStream;
     14import java.net.MalformedURLException;
    1315import java.net.URL;
    1416import java.util.ArrayList;
    15 import java.util.Collections;
     17import java.util.Arrays;
     18import java.util.Collection;
    1619import java.util.List;
    1720
     
    2427import org.openstreetmap.josm.Main;
    2528import org.openstreetmap.josm.actions.JosmAction;
     29import org.openstreetmap.josm.data.Preferences.pref;
     30import org.openstreetmap.josm.gui.ExtendedDialog;
    2631import org.openstreetmap.josm.gui.dialogs.properties.PropertiesDialog;
    2732import org.openstreetmap.josm.io.MirroredInputStream;
    2833import org.openstreetmap.josm.plugins.Plugin;
    2934import org.openstreetmap.josm.plugins.PluginInformation;
     35import org.openstreetmap.josm.plugins.roadsigns.RoadSignInputDialog.SettingsPanel;
    3036import org.openstreetmap.josm.tools.Shortcut;
     37import org.openstreetmap.josm.tools.Utils;
    3138
    3239public class RoadSignsPlugin extends Plugin {
    33     private static boolean presetsLoaded = false;
     40    static PresetMetaData selectedPreset;
    3441    public static List<Sign> signs;
    35     static List<String> iconDirs;
     42    public static List<String> iconDirs;
     43
     44    public final static PresetMetaData PRESET_DE = new PresetMetaData("DE", tr("Germany"), "resource://data/roadsignpresetDE.xml", "resource://images/DE/");
     45    public final static PresetMetaData PRESET_PL = new PresetMetaData("PL", tr("Poland"), "resource://data/roadsignpresetPL.xml", "resource://images/PL/");
     46    public final static PresetMetaData PRESET_SK = new PresetMetaData("SK", tr("Slovakia"), "resource://data/roadsignpresetSK.xml", "resource://images/SK/");
     47    public final static Collection<PresetMetaData> DEFAULT_PRESETS = Arrays.asList(PRESET_DE, PRESET_PL, PRESET_SK);
    3648
    3749    public RoadSignsPlugin(PluginInformation info) {
     
    5668
    5769        public void actionPerformed(ActionEvent e) {
    58             loadSignPresets();
    59             RoadSignInputDialog input = new RoadSignInputDialog(signs);
     70            String code = Main.pref.get("plugin.roadsigns.preset.selection", null);
     71            if (code == null) {
     72                ExtendedDialog ed = new ExtendedDialog(Main.parent, tr("Settings"), new String[] { tr("Ok"), tr("Cancel") });
     73                ed.setButtonIcons(new String[] {"ok", "cancel"});
     74                SettingsPanel settings = new SettingsPanel(true, null);
     75                ed.setContent(settings);
     76                ed.showDialog();
     77                if (ed.getValue() != 1) return;
     78                try {
     79                    settings.apply();
     80                } catch (IOException ex) {
     81                    return;
     82                }
     83            }
     84            try {
     85                loadSignPreset();
     86            } catch (IOException ex) {
     87                return;
     88            }
     89            RoadSignInputDialog input = new RoadSignInputDialog();
    6090            input.showDialog();
    6191        }
     
    6393    }
    6494
    65     protected static void loadSignPresets() {
    66         if (presetsLoaded)
    67             return;
    68         presetsLoaded=true;
    69         List<String> files = new ArrayList<String>(
    70                 Main.pref.getCollection("plugin.roadsigns.sources",
    71                     Collections.<String>singletonList("resource://data/defaultroadsignpreset.xml")));
    72         iconDirs = new ArrayList<String>(
    73                 Main.pref.getCollection("plugin.roadsigns.icon.sources", Collections.<String>emptySet()));
    74 
    75         if (Main.pref.getBoolean("plugin.roadsigns.use_default_icon_source", true)) {
    76             iconDirs.add("resource://images/");
    77         }
    78 
    79         for (String source : files) {
    80             try {
    81                 InputStream in = getInputStream(source);
    82                 RoadSignsReader reader = new RoadSignsReader(in);
    83                 signs = reader.parse();
    84 
    85             } catch (IOException ex) {
    86                 ex.printStackTrace();
    87                 JOptionPane.showMessageDialog(
    88                         Main.parent,
    89                         tr("Could not read tagging preset source: ''{0}''",source),
    90                         tr("Error"),
    91                         JOptionPane.ERROR_MESSAGE
    92                 );
    93             } catch (SAXException ex) {
    94                 ex.printStackTrace();
    95                 JOptionPane.showMessageDialog(
    96                         Main.parent,
    97                         tr("Error parsing tagging preset from ''{0}'':\n", source)+ex.getMessage(),
    98                         tr("Error"),
    99                         JOptionPane.ERROR_MESSAGE
    100                 );
    101             }
     95    public static class PresetMetaData {
     96        @pref public String code;
     97        @pref public String display_name;
     98        @pref public String preset_path;
     99        @pref public String icon_path;
     100
     101        public PresetMetaData() {
     102        }
     103
     104        public PresetMetaData(String country_code, String display_name, String preset_path, String icons_path) {
     105            this.code = country_code;
     106            this.display_name = display_name;
     107            this.preset_path = preset_path;
     108            this.icon_path = icons_path;
     109        }
     110
     111        @Override
     112        public String toString() {
     113            return display_name;
     114        }
     115    }
     116
     117    public static void setSelectedPreset(PresetMetaData preset) throws IOException {
     118        Main.pref.put("plugin.roadsigns.preset.selection", preset.code);
     119        loadSignPreset();
     120    }
     121
     122    public static List<PresetMetaData> getAvailablePresetsMetaData() {
     123
     124        List<PresetMetaData> presetsData = Main.pref.getListOfStructs("plugin.roadsigns.presets", DEFAULT_PRESETS, PresetMetaData.class);
     125
     126        String customFile = Main.pref.get("plugin.roadsigns.sources", null);
     127        if (customFile == null) {
     128            // for legacy reasons, try both string and collection preference type
     129            Collection<String> customFiles = Main.pref.getCollection("plugin.roadsigns.sources", null);
     130            if (customFiles != null && !customFiles.isEmpty()) {
     131                customFile = customFiles.iterator().next();
     132            }
     133        }
     134
     135        if (customFile != null) {
     136            // first check, if custom file preference has changed. If yes,
     137            // change the current preset selection to custom directly
     138            String lastCustomFile = Main.pref.get("plugin.roadsigns.sources.last", null);
     139            if (!Utils.equal(customFile, lastCustomFile)) {
     140                Main.pref.put("plugin.roadsigns.sources.last", customFile);
     141                Main.pref.put("plugin.roadsigns.preset.selection", "custom");
     142            }
     143
     144            String customIconDirsStr = Main.pref.get("plugin.roadsigns.icon.sources", null);
     145            Collection<String> customIconDirs = null;
     146            if (customIconDirsStr != null) {
     147                customIconDirs = new ArrayList<String>(Arrays.asList(customIconDirsStr.split(",")));
     148            } else {
     149                customIconDirs = Main.pref.getCollection("plugin.roadsigns.icon.sources", null);
     150            }
     151            if (customIconDirs != null) {
     152                customIconDirs = new ArrayList<String>(customIconDirs);
     153            } else {
     154                customIconDirs = new ArrayList<String>();
     155            }
     156            // add icon directory relative to preset file
     157            if (!customFile.startsWith("resource:")) {
     158                String parentDir = null;
     159                try {
     160                    URL url = new URL(customFile);
     161                    parentDir = url.getPath();
     162                } catch (MalformedURLException ex) {
     163                    File f = new File(customFile);
     164                    parentDir = f.getParent();
     165                }
     166                if (parentDir != null && !parentDir.isEmpty()) {
     167                    customIconDirs.add(parentDir);
     168                }
     169            }
     170            if (Main.pref.getBoolean("plugin.roadsigns.use_default_icon_source", true)) {
     171                customIconDirs.add("resource://images/");
     172            }
     173            PresetMetaData custom = new PresetMetaData("custom", tr("custom"), customFile, Utils.join(",", customIconDirs));
     174            presetsData.add(custom);
     175        } else {
     176            Main.pref.put("plugin.roadsigns.sources.last", null);
     177        }
     178
     179        return presetsData;
     180    }
     181
     182    protected static void loadSignPreset() throws IOException {
     183        List<PresetMetaData> presetsData =  getAvailablePresetsMetaData();
     184        String code = Main.pref.get("plugin.roadsigns.preset.selection", null);
     185        if (selectedPreset != null && selectedPreset.code.equals(code)) return;
     186
     187        for (PresetMetaData data : presetsData) {
     188            if (data.code.equals(code)) {
     189                selectedPreset = data;
     190                break;
     191            }
     192        }
     193        if (selectedPreset == null) {
     194            if (!presetsData.isEmpty()) {
     195                selectedPreset = presetsData.get(0);
     196            } else {
     197                selectedPreset = PRESET_DE;
     198            }
     199        }
     200        iconDirs = Arrays.asList(selectedPreset.icon_path.split(","));
     201        String source = selectedPreset.preset_path;
     202
     203        try {
     204            InputStream in = getInputStream(source);
     205            RoadSignsReader reader = new RoadSignsReader(in);
     206            signs = reader.parse();
     207
     208        } catch (IOException ex) {
     209            ex.printStackTrace();
     210            JOptionPane.showMessageDialog(
     211                    Main.parent,
     212                    tr("Could not read tagging preset source: ''{0}''",source),
     213                    tr("Error"),
     214                    JOptionPane.ERROR_MESSAGE
     215            );
     216            throw ex;
     217        } catch (SAXException ex) {
     218            ex.printStackTrace();
     219            JOptionPane.showMessageDialog(
     220                    Main.parent,
     221                    tr("Error parsing tagging preset from ''{0}'':\n", source)+ex.getMessage(),
     222                    tr("Error"),
     223                    JOptionPane.ERROR_MESSAGE
     224            );
     225            throw new IOException(ex);
    102226        }
    103227    }
Note: See TracChangeset for help on using the changeset viewer.