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    }