// License: GPL. For details, see LICENSE file.
package org.openstreetmap.hot.sds;
import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.lang.reflect.Method;
import javax.swing.BorderFactory;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.gui.MainMenu;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.gui.preferences.PreferenceDialog;
@SuppressWarnings("serial")
public class SdsMenu extends JMenu implements LayerChangeListener, ActiveLayerChangeListener {
private JMenuItem saveItem;
private JMenuItem loadItem;
private JMenuItem prefsItem;
private JMenuItem aboutItem;
private JMenu menu;
public SdsMenu(final SeparateDataStorePlugin thePlugin) {
MainMenu mm = Main.main.menu;
menu = mm.addMenu("SDS", tr("SDS"), KeyEvent.VK_S, mm.getDefaultMenuPos(), null);
saveItem = new JMenuItem(new SdsSaveAction());
menu.add(saveItem);
loadItem = new JMenuItem(new SdsLoadAction(thePlugin));
menu.add(loadItem);
menu.addSeparator();
prefsItem = new JMenuItem(new SdsPreferencesAction());
menu.add(prefsItem);
menu.addSeparator();
aboutItem = new JMenuItem(new SdsAboutAction());
menu.add(aboutItem);
Main.getLayerManager().addLayerChangeListener(this);
Main.getLayerManager().addActiveLayerChangeListener(this);
setEnabledState();
}
void setEnabledState() {
boolean en = Main.getLayerManager().getActiveLayer() instanceof OsmDataLayer;
loadItem.setEnabled(en);
saveItem.setEnabled(en);
}
@Override
public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
setEnabledState();
}
@Override
public void layerOrderChanged(LayerOrderChangeEvent e) { }
@Override
public void layerAdded(LayerAddEvent e) {
setEnabledState();
}
@Override
public void layerRemoving(LayerRemoveEvent e) {
setEnabledState();
}
private static class SdsAboutAction extends JosmAction {
SdsAboutAction() {
super(tr("About"), "sds", tr("Information about SDS."), null, true);
}
@Override
public void actionPerformed(ActionEvent e) {
JPanel about = new JPanel();
JTextArea l = new JTextArea();
l.setLineWrap(true);
l.setWrapStyleWord(true);
l.setEditable(false);
l.setText(
"Separate Data Store\n\nThis plugin provides access to a \"Separate Data Store\" server. " +
"Whenever data is loaded from the OSM API, " +
"it queries the SDS for additional tags that have been stored for the objects just loaded, " +
"and adds these tags. When you upload data to JOSM, SDS tags will again be separated and, " +
"instead of sending them to OSM, they will be uploaded to SDS." +
"\n\n" +
"This depends on SDS tags starting with a special prefix, which can be configured in the SDS preferences." +
"\n\n" +
"Using the SDS server will usually require an account to be set up there, which is completely independent of your OSM account.");
l.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
l.setOpaque(false);
l.setPreferredSize(new Dimension(500, 300));
JScrollPane sp = new JScrollPane(l);
sp.setBorder(null);
sp.setOpaque(false);
about.add(sp);
about.setPreferredSize(new Dimension(500, 300));
JOptionPane.showMessageDialog(Main.parent, about, tr("About SDS..."),
JOptionPane.INFORMATION_MESSAGE, null);
}
}
private static final class SdsPreferencesAction extends JosmAction implements Runnable {
private SdsPreferencesAction() {
super(tr("Preferences..."), "preference", tr("Open a preferences dialog for SDS."),
null, true);
putValue("help", ht("/Action/Preferences"));
}
/**
* Launch the preferences dialog.
*/
@Override
public void actionPerformed(ActionEvent e) {
run();
}
@Override
public void run() {
PreferenceDialog pd = new PreferenceDialog(Main.parent);
// unusual reflection mechanism to cater for older JOSM versions where
// the selectPreferencesTabByName method was not public
try {
Method sptbn = pd.getClass().getMethod("selectPreferencesTabByName", String.class);
sptbn.invoke(pd, "sds");
} catch (Exception ex) {
Main.trace(ex);
}
pd.setVisible(true);
}
}
}