// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.namemanager.dialog; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.GridLayout; import java.awt.Point; import java.awt.Rectangle; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.KeyStroke; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; import org.openstreetmap.josm.plugins.namemanager.countryData.Country; import org.openstreetmap.josm.plugins.namemanager.countryData.CountryDataMemory; import org.openstreetmap.josm.plugins.namemanager.utils.NameManagerUtils; import org.openstreetmap.josm.tools.ImageProvider; /** * Plugin's dialog box. Singleton class. * * @author Rafal Jachowicz, Harman/Becker Automotive Systems (master's thesis) * */ public final class NameManagerDialog extends JDialog { private static final String TAG_NAME = "Tag name"; private static final String TAG_VALUE = "Tag value"; private static final String ADMINISTRATIVE = "Administrative"; private static final String ADD = "Add"; private static final String EDIT = "Edit"; private static final String DELETE = "Delete"; private static final String TAG_BUILDINGS = "Tag buildings"; private static final String COUNTRY = "Country"; private static NameManagerDialog dialog; private static final int height = 400; private static final int width = 300; /** * serialVersionUID */ private static final long serialVersionUID = 4289136772379693178L; private Dimension dimension = new Dimension(width, height); private Way selectedWay; private List<Way> waysInsideSelectedArea; private JTabbedPane tabPanel; private JComboBox<String> country; private JLabel labelLevel1; private JTextField level1; private JLabel labelLevel2; private JTextField level2; private JLabel labelLevel3; private JTextField level3; private JLabel labelLevel4; private JTextField level4; private JLabel labelLevel5; private JTextField level5; private JLabel labelLevel6; private JTextField level6; private JLabel labelTagNameAM; private AutoCompletingTextField tagNameAM; private JLabel labelTagNameD; private AutoCompletingTextField tagNameD; private JLabel labelTagValueAM; private AutoCompletingTextField tagValueAM; private JCheckBox buildings; private JButton addModifyButton; private JButton deleteButton; private NameManagerDialog() { super((JFrame) Main.parent, "Name Manager", true); Container cp = this.getContentPane(); cp.setLayout(new BorderLayout()); JMenuBar menuBar = new JMenuBar(); JMenu aboutMenu = new JMenu(tr("About")); JMenuItem aboutAppButton = new JMenuItem(tr("About Plugin")); aboutAppButton.addActionListener(e -> { String newline = System.getProperty("line.separator"); JOptionPane.showMessageDialog(NameManagerDialog.this, "Authors:" + newline + "Rafal Jachowicz, Marek Strassenburg-Kleciak" + newline + "Consultant:" + newline + "Stefanie Otte" + newline + "Powered by:" + newline + "Harman Becker Automotive Systems GmbH" + newline + "Neusoft Technology Solutions GmbH", tr("About"), JOptionPane.INFORMATION_MESSAGE); }); aboutMenu.add(aboutAppButton); menuBar.add(aboutMenu); this.setJMenuBar(menuBar); tabPanel = new JTabbedPane(); tabPanel.setTabPlacement(JTabbedPane.TOP); JPanel buttonPanel = new JPanel(new BorderLayout()); JButton saveButton = new JButton(new SaveAction()); JButton cancelButton = new JButton(new CancelAction()); buttonPanel.add(cancelButton, BorderLayout.CENTER); cp.add(buttonPanel, BorderLayout.SOUTH); JPanel administrativePanel = new JPanel(); administrativePanel.setLayout(new BoxLayout(administrativePanel, BoxLayout.PAGE_AXIS)); JPanel levelPanel = new JPanel(new GridLayout(7, 2, 5, 2)); levelPanel.setAlignmentX(CENTER_ALIGNMENT); buildings = new JCheckBox(tr(TAG_BUILDINGS)); buildings.setSelected(false); JLabel labelCountry = new JLabel(" " + tr(COUNTRY)); country = new JComboBox<>(); labelLevel1 = new JLabel(" level1"); level1 = new JTextField(); labelLevel2 = new JLabel(" level2"); level2 = new JTextField(); labelLevel3 = new JLabel(" level3"); level3 = new JTextField(); labelLevel4 = new JLabel(" level4"); level4 = new JTextField(); labelLevel5 = new JLabel(" level5"); level5 = new JTextField(); labelLevel6 = new JLabel(" level6"); level6 = new JTextField(); levelPanel.add(labelCountry); levelPanel.add(country); levelPanel.add(labelLevel1); levelPanel.add(level1); levelPanel.add(labelLevel2); levelPanel.add(level2); levelPanel.add(labelLevel3); levelPanel.add(level3); levelPanel.add(labelLevel4); levelPanel.add(level4); levelPanel.add(labelLevel5); levelPanel.add(level5); levelPanel.add(labelLevel6); levelPanel.add(level6); administrativePanel.add(Box.createRigidArea(new Dimension(0, 20))); administrativePanel.add(buildings); administrativePanel.add(Box.createRigidArea(new Dimension(0, 10))); administrativePanel.add(levelPanel); administrativePanel.add(Box.createRigidArea(new Dimension(0, 10))); administrativePanel.add(saveButton); administrativePanel.add(Box.createRigidArea(new Dimension(0, 20))); JPanel addModifyPanel = new JPanel(); addModifyPanel.setLayout(new BoxLayout(addModifyPanel, BoxLayout.PAGE_AXIS)); labelTagNameAM = new JLabel(tr(TAG_NAME)); tagNameAM = new AutoCompletingTextField(); AutoCompletionList list = new AutoCompletionList(); Main.getLayerManager().getEditLayer().data.getAutoCompletionManager().populateWithKeys(list); tagNameAM.setAutoCompletionList(list); labelTagValueAM = new JLabel(tr(TAG_VALUE)); tagValueAM = new AutoCompletingTextField(); tagNameAM.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent arg0) { if (!"".equals(tagNameAM.getText())) { AutoCompletionList list = tagValueAM.getAutoCompletionList(); if (list == null) { list = new AutoCompletionList(); } list.clear(); Main.getLayerManager().getEditLayer().data.getAutoCompletionManager().populateWithTagValues(list, tagNameAM.getText()); tagValueAM.setAutoCompletionList(list); } } }); addModifyButton = new JButton(new AddModifyAction()); addModifyPanel.add(Box.createRigidArea(new Dimension(0, 20))); addModifyPanel.add(labelTagNameAM); addModifyPanel.add(Box.createRigidArea(new Dimension(0, 10))); addModifyPanel.add(tagNameAM); addModifyPanel.add(Box.createRigidArea(new Dimension(0, 10))); addModifyPanel.add(labelTagValueAM); addModifyPanel.add(Box.createRigidArea(new Dimension(0, 10))); addModifyPanel.add(tagValueAM); addModifyPanel.add(Box.createRigidArea(new Dimension(0, 10))); addModifyPanel.add(addModifyButton); addModifyPanel.add(Box.createRigidArea(new Dimension(0, 170))); JPanel deletePanel = new JPanel(); deletePanel.setLayout(new BoxLayout(deletePanel, BoxLayout.PAGE_AXIS)); labelTagNameD = new JLabel(tr(TAG_NAME)); tagNameD = new AutoCompletingTextField(); tagNameD.setAutoCompletionList(list); deleteButton = new JButton(new DeleteAction()); deletePanel.add(Box.createRigidArea(new Dimension(0, 20))); deletePanel.add(labelTagNameD); deletePanel.add(Box.createRigidArea(new Dimension(0, 10))); deletePanel.add(tagNameD); deletePanel.add(Box.createRigidArea(new Dimension(0, 10))); deletePanel.add(deleteButton); deletePanel.add(Box.createRigidArea(new Dimension(0, 228))); tabPanel.addTab(tr(ADD) + "/" + tr(EDIT), addModifyPanel); tabPanel.addTab(tr(DELETE), deletePanel); tabPanel.addTab(tr(ADMINISTRATIVE), administrativePanel); cp.add(tabPanel, BorderLayout.CENTER); this.setPreferredSize(dimension); this.setSize(dimension); this.setResizable(false); } public void setCountryComboBox() { Set<String> keySetUnsorted = CountryDataMemory.getCountryCache().keySet(); List<String> keySet = new ArrayList<>(keySetUnsorted); Collections.sort(keySet); country.removeAllItems(); for (String string : keySet) { country.addItem(string); } String countryName = (String) country.getSelectedItem(); if (CountryDataMemory.getCountryCache().containsKey(countryName)) { Country countryItem = CountryDataMemory.getCountryCache().get(countryName); labelLevel1.setText(" " + countryItem.getLevel1()); if (" n/a".equals(labelLevel1.getText())) { level1.setEnabled(false); } else { level1.setEnabled(true); } labelLevel2.setText(" " + countryItem.getLevel2()); if (" n/a".equals(labelLevel2.getText())) { level2.setEnabled(false); } else { level2.setEnabled(true); } labelLevel3.setText(" " + countryItem.getLevel3()); if (" n/a".equals(labelLevel3.getText())) { level3.setEnabled(false); } else { level3.setEnabled(true); } labelLevel4.setText(" " + countryItem.getLevel4()); if (" n/a".equals(labelLevel4.getText())) { level4.setEnabled(false); } else { level4.setEnabled(true); } labelLevel5.setText(" " + countryItem.getLevel5()); if (" n/a".equals(labelLevel5.getText())) { level5.setEnabled(false); } else { level5.setEnabled(true); } labelLevel6.setText(" " + countryItem.getLevel6()); if (" n/a".equals(labelLevel6.getText())) { level6.setEnabled(false); } else { level6.setEnabled(true); } } country.addActionListener(e -> { String countryName1 = (String) country.getSelectedItem(); if (CountryDataMemory.getCountryCache().containsKey(countryName1)) { Country countryItem = CountryDataMemory.getCountryCache().get(countryName1); labelLevel1.setText(" " + countryItem.getLevel1()); if (" n/a".equals(labelLevel1.getText())) { level1.setEnabled(false); } else { level1.setEnabled(true); } labelLevel2.setText(" " + countryItem.getLevel2()); if (" n/a".equals(labelLevel2.getText())) { level2.setEnabled(false); } else { level2.setEnabled(true); } labelLevel3.setText(" " + countryItem.getLevel3()); if (" n/a".equals(labelLevel3.getText())) { level3.setEnabled(false); } else { level3.setEnabled(true); } labelLevel4.setText(" " + countryItem.getLevel4()); if (" n/a".equals(labelLevel4.getText())) { level4.setEnabled(false); } else { level4.setEnabled(true); } labelLevel5.setText(" " + countryItem.getLevel5()); if (" n/a".equals(labelLevel5.getText())) { level5.setEnabled(false); } else { level5.setEnabled(true); } labelLevel6.setText(" " + countryItem.getLevel6()); if (" n/a".equals(labelLevel6.getText())) { level6.setEnabled(false); } else { level6.setEnabled(true); } } }); } /** * Gets reference to the singleton object. * * @return Singleton object of the {@link LaneManagerDialog} class. */ public static NameManagerDialog getInstance() { if (dialog == null) { dialog = new NameManagerDialog(); centerDialog(dialog); } dialog.buildings.setSelected(false); return dialog; } /** * This method centers the dialog window on the screen. * * @param dialog * is the {@link LaneManagerDialog} object */ private static void centerDialog(NameManagerDialog dialog) { Window window = NameManagerUtils.getTopWindow(); if (window == null) return; GraphicsConfiguration gc = window.getGraphicsConfiguration(); if (gc != null) { Rectangle screenBounds = gc.getBounds(); Rectangle windowBounds = window.getBounds(); Dimension d = dialog.getPreferredSize(); Point p = new Point(); if (d.width <= windowBounds.width && d.height <= windowBounds.height) { p.x = windowBounds.x + ((windowBounds.width - d.width) / 2); p.y = windowBounds.y + ((windowBounds.height - d.height) / 2); } else { p.x = screenBounds.x + ((screenBounds.width - d.width) / 2); p.y = screenBounds.y + ((screenBounds.height - d.height) / 2); } dialog.setLocation(p); } } public Way getSelectedWay() { return selectedWay; } public void setSelectedWay(Way selectedWay) { this.selectedWay = selectedWay; } @SuppressWarnings("serial") class AddModifyAction extends AbstractAction { AddModifyAction() { putValue(Action.NAME, tr(ADD) + "/" + tr(EDIT)); ImageIcon addModifyIcon = ImageProvider.get("", "addnode"); if (addModifyIcon != null) { putValue(Action.SMALL_ICON, addModifyIcon); } } @Override public void actionPerformed(ActionEvent e) { if (selectedWay != null && waysInsideSelectedArea != null && !waysInsideSelectedArea.isEmpty()) { if (tabPanel.getSelectedIndex() == 0) { for (Way way : waysInsideSelectedArea) { if (!"".equals(tagNameAM.getText()) && !"".equals(tagValueAM.getText())) { way.put(tagNameAM.getText(), tagValueAM.getText()); way.save(); } } } } setVisible(false); } } @SuppressWarnings("serial") class DeleteAction extends AbstractAction { DeleteAction() { putValue(Action.NAME, tr(DELETE)); ImageIcon deleteIcon = ImageProvider.get("", "purge"); if (deleteIcon != null) { putValue(Action.SMALL_ICON, deleteIcon); } } @Override public void actionPerformed(ActionEvent arg0) { if (selectedWay != null && waysInsideSelectedArea != null && !waysInsideSelectedArea.isEmpty()) { if (tabPanel.getSelectedIndex() == 1) { for (Way way : waysInsideSelectedArea) { if (!"".equals(tagNameD.getText())) { way.remove(tagNameD.getText()); way.save(); } } } } setVisible(false); } } @SuppressWarnings("serial") class CancelAction extends AbstractAction { CancelAction() { putValue(Action.NAME, tr("Cancel")); putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)); ImageIcon cancelIcon = ImageProvider.get("", "cancel"); if (cancelIcon != null) { putValue(Action.SMALL_ICON, cancelIcon); } } @Override public void actionPerformed(ActionEvent arg0) { setVisible(false); } } @SuppressWarnings("serial") class SaveAction extends AbstractAction { SaveAction() { putValue(Action.NAME, tr("Save")); putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)); ImageIcon saveIcon = ImageProvider.get("", "save"); if (saveIcon != null) { putValue(Action.SMALL_ICON, saveIcon); } } @Override public void actionPerformed(ActionEvent arg0) { if (selectedWay != null && waysInsideSelectedArea != null && !waysInsideSelectedArea.isEmpty()) { String countryName = (String) country.getSelectedItem(); Country countryItem = null; if (CountryDataMemory.getCountryCache().containsKey(countryName)) { countryItem = CountryDataMemory.getCountryCache().get(countryName); } for (Way way : waysInsideSelectedArea) { if (tabPanel.getSelectedIndex() == 2) { if (way.get("building") != null && !buildings.isSelected()) { continue; } way.put("country", countryName); if (countryItem != null) { way.put("level1", level1.getText()); way.put("level2", level2.getText()); way.put("level3", level3.getText()); way.put("level4", level4.getText()); way.put("level5", level5.getText()); way.put("level6", level6.getText()); } } way.save(); } } setVisible(false); } } public List<Way> getWaysInsideSelectedArea() { return waysInsideSelectedArea; } public void setWaysInsideSelectedArea(List<Way> waysInsideSelectedArea) { this.waysInsideSelectedArea = waysInsideSelectedArea; } }