Ticket #8652: ToggleDialogsPatch_v2.patch

File ToggleDialogsPatch_v2.patch, 20.6 KB (added by akks, 11 years ago)
  • src/org/openstreetmap/josm/actions/DialogsToggleAction.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.actions;
     3
     4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
     5import static org.openstreetmap.josm.tools.I18n.tr;
     6
     7import java.awt.event.ActionEvent;
     8import java.awt.event.KeyEvent;
     9import java.util.ArrayList;
     10import java.util.List;
     11
     12import javax.swing.ButtonModel;
     13
     14import org.openstreetmap.josm.Main;
     15import org.openstreetmap.josm.gui.MainMenu;
     16import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
     17import org.openstreetmap.josm.tools.Shortcut;
     18
     19public class DialogsToggleAction extends JosmAction {
     20    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
     21    private boolean selected;
     22
     23    public DialogsToggleAction() {
     24        super(
     25                tr("Toggle dialogs panel"),
     26                null, /* no icon */
     27                tr("Toggle dialogs panel, maximize mapview"),
     28                Shortcut.registerShortcut("menu:view:dialogspanel", tr("Toggle dialogs panel"),KeyEvent.VK_TAB, Shortcut.DIRECT),
     29                false /* register */
     30        );
     31        putValue("help", ht("/Action/ToggleDialogsPanel"));
     32        putValue("toolbar", "dialogspanel");
     33        Main.toolbar.register(this);
     34        selected = Main.pref.getBoolean("draw.dialogspanel", true);
     35        notifySelectedState();
     36    }
     37
     38    public void addButtonModel(ButtonModel model) {
     39        if (model != null && !buttonModels.contains(model)) {
     40            buttonModels.add(model);
     41        }
     42    }
     43
     44    public void removeButtonModel(ButtonModel model) {
     45        if (model != null && buttonModels.contains(model)) {
     46            buttonModels.remove(model);
     47        }
     48    }
     49
     50    protected void notifySelectedState() {
     51        for (ButtonModel model: buttonModels) {
     52            if (model.isSelected() != selected) {
     53                model.setSelected(selected);
     54            }
     55        }
     56    }
     57
     58    protected void toggleSelectedState() {
     59        selected = !selected;
     60        Main.pref.put("draw.dialogspanel", selected);
     61        notifySelectedState();
     62        setMode();
     63    }
     64
     65    public void initial() {
     66        if(selected) {
     67            setMode();
     68        }
     69    }
     70
     71    protected void setMode() {
     72        if (Main.isDisplayingMapView()) {
     73            Main.map.setDialogsPanelVisible(selected);
     74            Main.toolbar.control.setVisible(selected || Main.pref.getBoolean("toolbar.always-visible", true));
     75            Main.main.menu.setVisible(selected || Main.pref.getBoolean("menu.always-visible", true));
     76        }
     77    }
     78
     79    @Override
     80    public void actionPerformed(ActionEvent e) {
     81        toggleSelectedState();
     82    }
     83}
  • src/org/openstreetmap/josm/actions/mapmode/DrawAction.java

     
    127127                mapFrame, ImageProvider.getCursor("crosshair", null));
    128128
    129129        snappingShortcut = Shortcut.registerShortcut("mapmode:drawanglesnapping",
    130                 tr("Mode: Draw Angle snapping"), KeyEvent.VK_TAB, Shortcut.DIRECT);
     130                tr("Mode: Draw Angle snapping"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE);
    131131        snapChangeAction = new SnapChangeAction();
    132132        snapCheckboxMenuItem = addMenuItem();
    133133        snapHelper.setMenuCheckBox(snapCheckboxMenuItem);
  • src/org/openstreetmap/josm/gui/MainMenu.java

     
    3333import org.openstreetmap.josm.actions.CreateCircleAction;
    3434import org.openstreetmap.josm.actions.CreateMultipolygonAction;
    3535import org.openstreetmap.josm.actions.DeleteAction;
     36import org.openstreetmap.josm.actions.DialogsToggleAction;
    3637import org.openstreetmap.josm.actions.DistributeAction;
    3738import org.openstreetmap.josm.actions.DownloadAction;
    3839import org.openstreetmap.josm.actions.DownloadPrimitiveAction;
     
    6263import org.openstreetmap.josm.actions.OpenFileAction;
    6364import org.openstreetmap.josm.actions.OpenLocationAction;
    6465import org.openstreetmap.josm.actions.OrthogonalizeAction;
     66import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
    6567import org.openstreetmap.josm.actions.PasteAction;
    6668import org.openstreetmap.josm.actions.PasteTagsAction;
     69import org.openstreetmap.josm.actions.PreferenceToggleAction;
    6770import org.openstreetmap.josm.actions.PreferencesAction;
    6871import org.openstreetmap.josm.actions.PurgeAction;
    6972import org.openstreetmap.josm.actions.RedoAction;
     
    9093import org.openstreetmap.josm.actions.WireframeToggleAction;
    9194import org.openstreetmap.josm.actions.ZoomInAction;
    9295import org.openstreetmap.josm.actions.ZoomOutAction;
    93 import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
    94 import org.openstreetmap.josm.actions.PreferenceToggleAction;
    9596import org.openstreetmap.josm.actions.audio.AudioBackAction;
    9697import org.openstreetmap.josm.actions.audio.AudioFasterAction;
    9798import org.openstreetmap.josm.actions.audio.AudioFwdAction;
     
    229230    public final JumpToAction jumpToAct = new JumpToAction();
    230231
    231232    public final TaggingPresetSearchAction presetSearchAction = new TaggingPresetSearchAction();
     233    public final DialogsToggleAction dialogsToggleAction = new DialogsToggleAction();
    232234    public FullscreenToggleAction fullscreenToggleAction = null;
    233235
    234236    /** this menu listener hides unnecessary JSeparators in a menu list but does not remove them.
     
    514516            fullscreen.setAccelerator(fullscreenToggleAction.getShortcut().getKeyStroke());
    515517            fullscreenToggleAction.addButtonModel(fullscreen.getModel());
    516518        }
     519
     520        // -- dialogs panel toggle action
     521        final JCheckBoxMenuItem dialogspanel = new JCheckBoxMenuItem(dialogsToggleAction);
     522        dialogspanel.setAccelerator(dialogsToggleAction.getShortcut().getKeyStroke());
     523        dialogsToggleAction.addButtonModel(dialogspanel.getModel());
     524        viewMenu.add(dialogspanel);
     525
    517526        viewMenu.addSeparator();
    518527        add(viewMenu, info);
    519528        add(viewMenu, infoweb);
  • src/org/openstreetmap/josm/gui/MapFrame.java

     
    99import java.awt.Dimension;
    1010import java.awt.Font;
    1111import java.awt.GridBagLayout;
     12import java.awt.KeyboardFocusManager;
    1213import java.awt.Rectangle;
    1314import java.awt.event.ActionEvent;
    1415import java.awt.event.KeyEvent;
     
    1718import java.util.ArrayList;
    1819import java.util.Collection;
    1920import java.util.HashMap;
     21import java.util.HashSet;
    2022import java.util.List;
    2123import java.util.Map;
    2224import java.util.concurrent.CopyOnWriteArrayList;
     
    7274import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
    7375import org.openstreetmap.josm.tools.Destroyable;
    7476import org.openstreetmap.josm.tools.GBC;
     77import org.openstreetmap.josm.tools.Shortcut;
    7578
    7679/**
    7780 * One Map frame with one dataset behind. This is the container gui class whose
     
    120123     * instead of adding directly to this list.
    121124     */
    122125    private List<ToggleDialog> allDialogs = new ArrayList<ToggleDialog>();
     126    private final JSplitPane splitPane;
    123127    private final JPanel leftPanel;
    124128    private final DialogsPanel dialogsPanel;
    125129
     
    177181
    178182        toolGroup.setSelected(((AbstractButton)toolBarActions.getComponent(0)).getModel(), true);
    179183
    180         JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
     184        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
    181185        dialogsPanel = new DialogsPanel(splitPane);
    182186        splitPane.setLeftComponent(leftPanel);
    183187        splitPane.setRightComponent(dialogsPanel);
     
    233237        // status line below the map
    234238        statusLine = new MapStatus(this);
    235239        MapView.addLayerChangeListener(this);
     240        // unregister TAB key if needed
     241        if (Shortcut.findShortcut(KeyEvent.VK_TAB, 0) != null) {
     242            unregisterTabKey();
     243        }
    236244    }
    237245
    238246    public boolean selectSelectTool(boolean onlyIfModeless) {
     
    255263
    256264        return selectMapMode(mapModeZoom);
    257265    }
     266   
     267    /**
     268     * Free tabulator key (call if someone else needs it)
     269     */
     270    public final void unregisterTabKey() {
     271        System.out.println("Tab key unregistered");
     272        HashSet<KeyStroke> ks = new HashSet<KeyStroke>(1);
     273        ks.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK));
     274        KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
     275        kfm.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, ks);
     276        splitPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, ks);
     277    }
    258278
    259279    /**
    260280     * Called as some kind of destructor when the last layer has been removed.
    261281     * Delegates the call to all Destroyables within this component (e.g. MapModes)
    262282     */
     283    @Override
    263284    public void destroy() {
    264285        MapView.removeLayerChangeListener(this);
    265286        dialogsPanel.destroy();
     
    416437            toToggle = svp;
    417438            panel.add(svp, BorderLayout.WEST);
    418439            jb.addMouseWheelListener(new MouseWheelListener() {
    419 
     440                @Override
    420441                public void mouseWheelMoved(MouseWheelEvent e) {
    421442                    svp.scroll(0, e.getUnitsToScroll() * 5);
    422443                }
     
    543564        return dialogsPanel.getToggleDialog(type);
    544565    }
    545566
     567    public void setDialogsPanelVisible(boolean visible) {
     568        rememberToggleDialogWidth();
     569        dialogsPanel.setVisible(visible);
     570        splitPane.setDividerLocation(visible?splitPane.getWidth()-Main.pref.getInteger("toggleDialogs.width",DEF_TOGGLE_DLG_WIDTH):0);
     571        splitPane.setDividerSize(visible?5:0);
     572    }
     573
    546574    /**
    547575     * Remember the current width of the (possibly resized) toggle dialog area
    548576     */
    549577    public void rememberToggleDialogWidth() {
    550         Main.pref.putInteger("toggleDialogs.width", dialogsPanel.getWidth());
     578        if (dialogsPanel.isVisible()) {
     579            Main.pref.putInteger("toggleDialogs.width", splitPane.getWidth()-splitPane.getDividerLocation());
    551580    }
     581    }
    552582
    553583    /*
    554      * Remove panel from top of MapView by class
    555      */
     584     * Remove panel from top of MapView by class     */
    556585    public void removeTopPanel(Class<?> type) {
    557586        int n = leftPanel.getComponentCount();
    558587        for (int i=0; i<n; i++) {
     
    652681        // After all listeners notice new layer, some buttons will be disabled/enabled
    653682        // and possibly need to be hidden/shown.
    654683        SwingUtilities.invokeLater(new Runnable() {
    655             public void run() {
     684            @Override public void run() {
    656685                validateToolBarsVisibility();
    657686            }
    658687        });
  • src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java

     
    1717import java.awt.event.ActionListener;
    1818import java.awt.event.InputEvent;
    1919import java.awt.event.KeyEvent;
     20import java.awt.event.MouseEvent;
    2021import java.beans.PropertyChangeEvent;
    2122import java.beans.PropertyChangeListener;
    2223import java.io.IOException;
     
    2829import java.util.LinkedList;
    2930import java.util.List;
    3031import java.util.Map;
     32import javax.swing.AbstractAction;
    3133
    3234import javax.swing.Action;
    3335import javax.swing.DefaultListCellRenderer;
     
    3537import javax.swing.Icon;
    3638import javax.swing.ImageIcon;
    3739import javax.swing.JButton;
     40import javax.swing.JCheckBoxMenuItem;
    3841import javax.swing.JComponent;
    3942import javax.swing.JLabel;
    4043import javax.swing.JList;
     
    6467import org.openstreetmap.josm.actions.JosmAction;
    6568import org.openstreetmap.josm.actions.ParameterizedAction;
    6669import org.openstreetmap.josm.actions.ParameterizedActionDecorator;
     70
    6771import org.openstreetmap.josm.gui.tagging.TaggingPreset;
    6872import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
    6973import org.openstreetmap.josm.tools.GBC;
     
    7276
    7377public class ToolbarPreferences implements PreferenceSettingFactory {
    7478
    75 
    7679    private static final String EMPTY_TOOLBAR_MARKER = "<!-empty-!>";
    7780
    7881    public static class ActionDefinition {
     
    382385
    383386    }
    384387
    385     private static class ToolbarPopupMenu extends JPopupMenu {
    386         public ToolbarPopupMenu(final ActionDefinition action) {
     388    private class ToolbarPopupMenu extends JPopupMenu  {
     389        ActionDefinition act;
     390       
     391        public void setActionAndAdapt(ActionDefinition action) {
     392            this.act = action;
     393            doNotHide.setSelected(Main.pref.getBoolean("toolbar.always-visible", true));
     394            remove.setVisible(act!=null);
     395            shortcutEdit.setVisible(act!=null);
     396        }
     397       
     398        JMenuItem remove = new JMenuItem(new AbstractAction(tr("Remove from toolbar")) {
     399            @Override
     400            public void actionPerformed(ActionEvent e) {
     401                Collection<String> t = new LinkedList<String>(getToolString());
     402                ActionParser parser = new ActionParser(null);
     403                // get text definition of current action
     404                String res = parser.saveAction(act);
     405                // remove the button from toolbar preferences
     406                t.remove(res);
     407                Main.pref.putCollection("toolbar", t);
     408                Main.toolbar.refreshToolbarControl();
     409            };
     410        });
    387411
    388             if(action != null) {
    389                 add(tr("Remove from toolbar",action.getDisplayName()))
    390                         .addActionListener(new ActionListener() {
    391                             @Override public void actionPerformed(ActionEvent e) {
    392                                 Collection<String> t = new LinkedList<String>(getToolString());
    393                                 ActionParser parser = new ActionParser(null);
    394                                 // get text definition of current action
    395                                 String res = parser.saveAction(action);
    396                                 // remove the button from toolbar preferences
    397                                 t.remove( res );
    398                                 Main.pref.putCollection("toolbar", t);
    399                                 Main.toolbar.refreshToolbarControl();
    400                             }
    401                 });
     412        JMenuItem configure = new JMenuItem(new AbstractAction(tr("Configure toolbar")) {
     413            @Override
     414            public void actionPerformed(ActionEvent e) {
     415                final PreferenceDialog p = new PreferenceDialog(Main.parent);
     416                p.selectPreferencesTabByName("toolbar");
     417                p.setVisible(true);
    402418            }
     419        });
     420       
     421        JMenuItem shortcutEdit = new JMenuItem(new AbstractAction(tr("Edit shortcut")) {
     422            @Override
     423            public void actionPerformed(ActionEvent e) {
     424                final PreferenceDialog p = new PreferenceDialog(Main.parent);
     425                p.getTabbedPane().getShortcutPreference().setDefaultFilter(act.getDisplayName());
     426                p.selectPreferencesTabByName("shortcuts");
     427                p.setVisible(true);
     428                // refresh toolbar to try using changed shortcuts without restart
     429                Main.toolbar.refreshToolbarControl();
     430            }
     431        });
    403432           
    404             add(tr("Configure toolbar")).addActionListener(new ActionListener() {
    405                 @Override public void actionPerformed(ActionEvent e) {
    406                     final PreferenceDialog p =new PreferenceDialog(Main.parent);
    407                     p.selectPreferencesTabByName("toolbar");
    408                     p.setVisible(true);
    409                 }
    410             });
    411 
    412             add(tr("Edit shortcut")).addActionListener(new ActionListener() {
    413                 @Override public void actionPerformed(ActionEvent e) {
    414                     final PreferenceDialog p =new PreferenceDialog(Main.parent);
    415                     p.getTabbedPane().getShortcutPreference().setDefaultFilter(action.getDisplayName());
    416                     p.selectPreferencesTabByName("shortcuts");
    417                     p.setVisible(true);
    418                     // refresh toolbar to accept changes of shortcuts without restart
    419                     Main.toolbar.refreshToolbarControl();
    420                 }
    421             });
     433        JCheckBoxMenuItem doNotHide = new JCheckBoxMenuItem(new AbstractAction(tr("Do not hide toolbar and menu")) {
     434            @Override
     435            public void actionPerformed(ActionEvent e) {
     436                boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
     437                Main.pref.put("toolbar.always-visible", sel);
     438                Main.pref.put("menu.always-visible", sel);
     439            }
     440        });
     441        {
     442            add(remove);
     443            add(configure);
     444            add(shortcutEdit);
     445            add(doNotHide);
    422446        }
    423     }
     447    };
     448   
     449   
     450    private ToolbarPopupMenu popupMenu = new ToolbarPopupMenu();
     451    private PopupMenuLauncher menuLauncher = new PopupMenuLauncher(popupMenu) {
     452        @Override
     453        public void launch(MouseEvent evt) {
     454            popupMenu.setActionAndAdapt(buttonActions.get(evt.getSource()));
     455            super.launch(evt); //To change body of generated methods, choose Tools | Templates.
     456        }
     457    };
    424458
    425459    /**
    426460     * Key: Registered name (property "toolbar" of action).
     
    432466    private DefaultMutableTreeNode rootActionsNode = new DefaultMutableTreeNode(tr("Actions"));
    433467
    434468    public JToolBar control = new JToolBar();
    435 
     469    private HashMap<Object, ActionDefinition> buttonActions = new HashMap<Object, ActionDefinition>(30);
     470   
    436471    @Override
    437472    public PreferenceSetting createPreferenceSetting() {
    438473        return new Settings(rootActionsNode);
     
    841876
    842877    public ToolbarPreferences() {
    843878        control.setFloatable(false);
    844         control.addMouseListener(new PopupMenuLauncher(new ToolbarPopupMenu(null)));
     879        control.addMouseListener(menuLauncher);
    845880    }
    846881
    847882    private void loadAction(DefaultMutableTreeNode node, MenuElement menu) {
     
    9781013     */
    9791014    public void refreshToolbarControl() {
    9801015        control.removeAll();
     1016        buttonActions.clear();
    9811017
    9821018        for (ActionDefinition action : getDefinedActions()) {
    9831019            if (action.isSeparator()) {
    9841020                control.addSeparator();
    9851021            } else {
    9861022                final JButton b = addButtonAndShortcut(action);
     1023                buttonActions.put(b, action);
    9871024               
    9881025                Icon i = action.getDisplayIcon();
    9891026                if (i != null) {
     
    10001037                        }
    10011038                    });
    10021039                }
    1003                 b.addMouseListener(new PopupMenuLauncher( new ToolbarPopupMenu(action)));
     1040                b.addMouseListener(menuLauncher);
    10041041            }
    10051042        }
    10061043        control.setVisible(control.getComponentCount() != 0);
  • src/org/openstreetmap/josm/tools/Shortcut.java

     
    244244    // and here our modifier groups
    245245    private static Map<Integer, Integer> groups= new HashMap<Integer, Integer>();
    246246
    247     // check if something collides with an existing shortcut
    248     private static Shortcut findShortcut(int requestedKey, int modifier) {
     247    /*
     248     * Check if something collides with an existing shortcut and return Shortcut object
     249     */
     250    public static Shortcut findShortcut(int requestedKey, int modifier) {
    249251        if (modifier == getGroupModifier(NONE))
    250252            return null;
    251253        for (Shortcut sc : shortcuts.values()) {
     
    268270        }
    269271        return l;
    270272    }
    271 
     273   
    272274    public static final int NONE = 5000;
    273275    public static final int MNEMONIC = 5001;
    274276    public static final int RESERVED = 5002;