001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.preferences;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.Color;
007 import java.awt.Font;
008 import java.awt.GridBagLayout;
009 import java.awt.event.ActionEvent;
010 import java.awt.event.ActionListener;
011 import java.util.LinkedHashMap;
012 import java.util.Map;
013 import java.util.Map.Entry;
014
015 import javax.swing.BorderFactory;
016 import javax.swing.Box;
017 import javax.swing.JCheckBox;
018 import javax.swing.JLabel;
019 import javax.swing.JPanel;
020 import javax.swing.JSeparator;
021
022 import org.openstreetmap.josm.Main;
023 import org.openstreetmap.josm.gui.util.GuiHelper;
024 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
025 import org.openstreetmap.josm.io.remotecontrol.RemoteControl;
026 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler;
027 import org.openstreetmap.josm.tools.GBC;
028
029 /**
030 * Preference settings for the Remote Control plugin
031 *
032 * @author Frederik Ramm
033 */
034 public class RemoteControlPreference extends DefaultTabPreferenceSetting {
035
036 public static class Factory implements PreferenceSettingFactory {
037
038 @Override
039 public PreferenceSetting createPreferenceSetting() {
040 return new RemoteControlPreference();
041 }
042 }
043
044 private RemoteControlPreference() {
045 super("remotecontrol", tr("Remote Control"), tr("Settings for the remote control feature."));
046 for (PermissionPrefWithDefault p : PermissionPrefWithDefault.getPermissionPrefs()) {
047 JCheckBox cb = new JCheckBox(p.preferenceText);
048 cb.setSelected(p.isAllowed());
049 prefs.put(p, cb);
050 }
051 }
052 private final Map<PermissionPrefWithDefault, JCheckBox> prefs =
053 new LinkedHashMap<PermissionPrefWithDefault, JCheckBox>();
054 private JCheckBox enableRemoteControl;
055 private JCheckBox loadInNewLayer = new JCheckBox(tr("Download objects to new layer"));
056 private JCheckBox alwaysAskUserConfirm = new JCheckBox(tr("Confirm all Remote Control actions manually"));
057
058 @Override
059 public void addGui(final PreferenceTabbedPane gui) {
060
061 JPanel remote = new JPanel(new GridBagLayout());
062
063 final JLabel descLabel = new JLabel("<html>"
064 + tr("Allows JOSM to be controlled from other applications, e.g. from a web browser.")
065 + "</html>");
066 descLabel.setFont(descLabel.getFont().deriveFont(Font.PLAIN));
067 remote.add(descLabel, GBC.eol().insets(5, 5, 0, 10).fill(GBC.HORIZONTAL));
068
069 final JLabel portLabel = new JLabel("<html>" + tr("JOSM will always listen at <b>port 8111</b> on localhost. "
070 + "<br>This port is not configurable because it is referenced by external applications talking to JOSM.") + "</html>");
071 portLabel.setFont(portLabel.getFont().deriveFont(Font.PLAIN));
072 remote.add(portLabel, GBC.eol().insets(5, 5, 0, 10).fill(GBC.HORIZONTAL));
073
074 remote.add(enableRemoteControl = new JCheckBox(tr("Enable remote control"), RemoteControl.PROP_REMOTECONTROL_ENABLED.get()), GBC.eol());
075
076 final JPanel wrapper = new JPanel();
077 wrapper.setLayout(new GridBagLayout());
078 wrapper.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.gray)));
079
080 remote.add(wrapper, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 5, 5));
081
082 wrapper.add(new JLabel(tr("Permitted actions:")), GBC.eol());
083 int INDENT = 15;
084 for (JCheckBox p : prefs.values()) {
085 wrapper.add(p, GBC.eol().insets(INDENT, 5, 0, 0).fill(GBC.HORIZONTAL));
086 }
087
088 wrapper.add(new JSeparator(), GBC.eop().fill(GBC.HORIZONTAL).insets(15, 5, 15, 5));
089 wrapper.add(loadInNewLayer, GBC.eol().fill(GBC.HORIZONTAL));
090 wrapper.add(alwaysAskUserConfirm, GBC.eol().fill(GBC.HORIZONTAL));
091
092 remote.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
093
094 loadInNewLayer.setSelected(Main.pref.getBoolean(RequestHandler.loadInNewLayerKey, RequestHandler.loadInNewLayerDefault));
095 alwaysAskUserConfirm.setSelected(Main.pref.getBoolean(RequestHandler.globalConfirmationKey, RequestHandler.globalConfirmationDefault));
096
097 ActionListener remoteControlEnabled = new ActionListener() {
098
099 @Override
100 public void actionPerformed(ActionEvent e) {
101 GuiHelper.setEnabledRec(wrapper, enableRemoteControl.isSelected());
102 // 'setEnabled(false)' does not work for JLabel with html text, so do it manually
103 // FIXME: use QuadStateCheckBox to make checkboxes unset when disabled
104 }
105 };
106 enableRemoteControl.addActionListener(remoteControlEnabled);
107 remoteControlEnabled.actionPerformed(null);
108 createPreferenceTabWithScrollPane(gui, remote);
109 }
110
111 @Override
112 public boolean ok() {
113 boolean enabled = enableRemoteControl.isSelected();
114 boolean changed = RemoteControl.PROP_REMOTECONTROL_ENABLED.put(enabled);
115 if (enabled) {
116 for (Entry<PermissionPrefWithDefault, JCheckBox> p : prefs.entrySet()) {
117 Main.pref.put(p.getKey().pref, p.getValue().isSelected());
118 }
119 Main.pref.put(RequestHandler.loadInNewLayerKey, loadInNewLayer.isSelected());
120 Main.pref.put(RequestHandler.globalConfirmationKey, alwaysAskUserConfirm.isSelected());
121 }
122 return changed;
123 }
124 }