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 }