// License: GPL. For details, see LICENSE file. package com.innovant.josm.plugin.routing.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.ComponentOrientation; import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Map; import java.util.Map.Entry; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; import org.apache.log4j.Logger; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting; import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane; import org.openstreetmap.josm.tools.GBC; import com.innovant.josm.jrt.osm.OsmWayTypes; public class RoutingPreferenceDialog extends DefaultTabPreferenceSetting { /** * Logger */ static Logger logger = Logger.getLogger(RoutingPreferenceDialog.class); private Map<String, String> orig; private DefaultTableModel model; /** * Constructor */ public RoutingPreferenceDialog() { super("routing", tr("Routing Plugin Preferences"), tr("Configure routing preferences.")); readPreferences(); } @Override public void addGui(final PreferenceTabbedPane gui) { JPanel principal = gui.createPreferenceTab(this); JPanel p = new JPanel(); p.setLayout(new GridBagLayout()); model = new DefaultTableModel(new String[] {tr("Highway type"), tr("Speed (Km/h)") }, 0) { private static final long serialVersionUID = 4253339034781567453L; @Override public boolean isCellEditable(int row, int column) { return column != 0; } }; final JTable list = new JTable(model); loadSpeeds(model); JScrollPane scroll = new JScrollPane(list); p.add(scroll, GBC.eol().fill(GBC.BOTH)); scroll.setPreferredSize(new Dimension(200, 200)); JButton add = new JButton(tr("Add")); p.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL)); p.add(add, GBC.std().insets(0, 5, 0, 0)); add.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JPanel p = new JPanel(new GridBagLayout()); p.add(new JLabel(tr("Weight")), GBC.std().insets(0, 0, 5, 0)); JComboBox<String> key = new JComboBox<>(); for (OsmWayTypes pk : OsmWayTypes.values()) { key.addItem(pk.getTag()); } JTextField value = new JTextField(10); p.add(key, GBC.eop().insets(5, 0, 0, 0).fill(GBC.HORIZONTAL)); p.add(new JLabel(tr("Value")), GBC.std().insets(0, 0, 5, 0)); p.add(value, GBC.eol().insets(5, 0, 0, 0).fill(GBC.HORIZONTAL)); int answer = JOptionPane.showConfirmDialog(gui, p, tr("Enter weight values"), JOptionPane.OK_CANCEL_OPTION); if (answer == JOptionPane.OK_OPTION) { model .addRow(new String[] { key.getSelectedItem().toString(), value.getText() }); } } }); JButton delete = new JButton(tr("Delete")); p.add(delete, GBC.std().insets(0, 5, 0, 0)); delete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (list.getSelectedRow() == -1) JOptionPane.showMessageDialog(gui, tr("Please select the row to delete.")); else { Integer i; while ((i = list.getSelectedRow()) != -1) { model.removeRow(i); } } } }); JButton edit = new JButton(tr("Edit")); p.add(edit, GBC.std().insets(5, 5, 5, 0)); edit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { edit(gui, list); } }); JTabbedPane Opciones = new JTabbedPane(); Opciones.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); Opciones.addTab("Profile", null, p, null); // Opciones.addTab("Preferences", new JPanel()); list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) edit(gui, list); } }); principal.add(Opciones, GBC.eol().fill(GBC.BOTH)); } @Override public boolean ok() { for (int i = 0; i < model.getRowCount(); ++i) { String value = model.getValueAt(i, 1).toString(); if (value.length() != 0) { String key = model.getValueAt(i, 0).toString(); String origValue = orig.get(key); if (origValue == null || !origValue.equals(value)) Main.pref.put(key, value); orig.remove(key); // processed. } } for (Entry<String, String> e : orig.entrySet()) { Main.pref.put(e.getKey(), null); } return false; } private void edit(final PreferenceTabbedPane gui, final JTable list) { if (list.getSelectedRowCount() != 1) { JOptionPane.showMessageDialog(gui, tr("Please select the row to edit.")); return; } String v = JOptionPane.showInputDialog(tr("New value for {0}", model .getValueAt(list.getSelectedRow(), 0)), model.getValueAt(list .getSelectedRow(), 1)); if (v != null) model.setValueAt(v, list.getSelectedRow(), 1); } private void loadSpeeds(DefaultTableModel model) { // Read dialog values from preferences readPreferences(); // Put these values in the model for (String tag : orig.keySet()) { model.addRow(new String[] {tag, orig.get(tag)}); } } private void readPreferences() { orig = Main.pref.getAllPrefix("routing.profile.default.speed"); if (orig.size() == 0) { // defaults logger.debug("Loading Default Preferences."); for (OsmWayTypes owt : OsmWayTypes.values()) { Main.pref.putInteger("routing.profile.default.speed." + owt.getTag(), owt.getSpeed()); } orig = Main.pref.getAllPrefix("routing.profile.default.speed"); } else logger.debug("Default preferences already exist."); } /* private String getKeyTag(String tag) { return tag.split(".", 5)[4]; } private String getTypeTag(String tag) { return tag.split(".", 5)[3]; } private String getNameTag(String tag) { return tag.split(".", 5)[2]; } */ }