Ignore:
Timestamp:
2013-05-10T20:09:24+02:00 (11 years ago)
Author:
akks
Message:

fix #3484: allow setting keyboard shortcuts for specific presets and other toolbar buttons
(preset groups and custom searches are also supported), context menu item "Edit shortcut"

Location:
trunk/src/org/openstreetmap/josm/gui/preferences
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java

    r5933 r5954  
    243243    public final ImageryPreference getImageryPreference() {
    244244        return getSetting(ImageryPreference.class);
     245    }
     246   
     247    public final ShortcutPreference getShortcutPreference() {
     248        return getSetting(ShortcutPreference.class);
    245249    }
    246250
  • trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java

    r5151 r5954  
    1717import java.awt.event.ActionListener;
    1818import java.awt.event.InputEvent;
     19import java.awt.event.KeyEvent;
    1920import java.beans.PropertyChangeEvent;
    2021import java.beans.PropertyChangeListener;
     
    6162import org.openstreetmap.josm.actions.ActionParameter;
    6263import org.openstreetmap.josm.actions.AdaptableAction;
     64import org.openstreetmap.josm.actions.JosmAction;
    6365import org.openstreetmap.josm.actions.ParameterizedAction;
    6466import org.openstreetmap.josm.actions.ParameterizedActionDecorator;
     
    6769import org.openstreetmap.josm.tools.GBC;
    6870import org.openstreetmap.josm.tools.ImageProvider;
     71import org.openstreetmap.josm.tools.Shortcut;
    6972
    7073public class ToolbarPreferences implements PreferenceSettingFactory {
     
    141144        public static ActionDefinition getSeparator() {
    142145            return new ActionDefinition(null);
     146        }
     147       
     148        public boolean hasParameters() {
     149            if (!(getAction() instanceof ParameterizedAction)) return false;
     150            for (Object o: parameters.values()) {
     151                if (o!=null) return true;
     152            }
     153            return false;
    143154        }
    144155    }
     
    295306        private ActionDefinition currentAction = ActionDefinition.getSeparator();
    296307
     308        @Override
    297309        public int getColumnCount() {
    298310            return 2;
    299311        }
    300312
     313        @Override
    301314        public int getRowCount() {
    302315            int adaptable = ((currentAction.getAction() instanceof AdaptableAction) ? 2 : 0);
     
    313326        }
    314327
     328        @Override
    315329        public Object getValueAt(int rowIndex, int columnIndex) {
    316330            if(currentAction.getAction() instanceof AdaptableAction)
     
    375389                add(tr("Remove from toolbar",action.getDisplayName()))
    376390                        .addActionListener(new ActionListener() {
    377                             public void actionPerformed(ActionEvent e) {
     391                            @Override public void actionPerformed(ActionEvent e) {
    378392                                Collection<String> t = new LinkedList<String>(getToolString());
    379393                                ActionParser parser = new ActionParser(null);
     
    389403           
    390404            add(tr("Configure toolbar")).addActionListener(new ActionListener() {
    391                 public void actionPerformed(ActionEvent e) {
     405                @Override public void actionPerformed(ActionEvent e) {
    392406                    final PreferenceDialog p =new PreferenceDialog(Main.parent);
    393407                    p.selectPreferencesTabByName("toolbar");
     
    395409                }
    396410            });
    397            
     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            });
    398422        }
    399423    }
     
    410434    public JToolBar control = new JToolBar();
    411435
     436    @Override
    412437    public PreferenceSetting createPreferenceSetting() {
    413438        return new Settings(rootActionsNode);
     
    417442
    418443        private final class Move implements ActionListener {
     444            @Override
    419445            public void actionPerformed(ActionEvent e) {
    420446                if (e.getActionCommand().equals("<") && actionsTree.getSelectionCount() > 0) {
     
    468494            }
    469495
     496            @Override
    470497            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
    471498                return actions;
    472499            }
    473500
     501            @Override
    474502            public DataFlavor[] getTransferDataFlavors() {
    475503                return flavors;
    476504            }
    477505
     506            @Override
    478507            public boolean isDataFlavorSupported(DataFlavor flavor) {
    479508                return flavors[0] == flavor;
     
    528557        }
    529558
     559        @Override
    530560        public void addGui(PreferenceTabbedPane gui) {
    531561            actionsTree.setCellRenderer(new DefaultTreeCellRenderer() {
     
    568598            selectedList.setCellRenderer(renderer);
    569599            selectedList.addListSelectionListener(new ListSelectionListener(){
     600                @Override
    570601                public void valueChanged(ListSelectionEvent e) {
    571602                    boolean sel = selectedList.getSelectedIndex() != -1;
     
    715746            actionsTree.setDragEnabled(true);
    716747            actionsTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
    717                 public void valueChanged(TreeSelectionEvent e) {
     748                @Override public void valueChanged(TreeSelectionEvent e) {
    718749                    updateEnabledState();
    719750                }
     
    737768            final JPanel p = new JPanel();
    738769            p.setLayout(new LayoutManager(){
     770                @Override
    739771                public void addLayoutComponent(String name, Component comp) {}
     772                @Override
    740773                public void removeLayoutComponent(Component comp) {}
     774                @Override
    741775                public Dimension minimumLayoutSize(Container parent) {
    742776                    Dimension l = left.getMinimumSize();
     
    745779                    return new Dimension(l.width+b.width+10+r.width,l.height+b.height+10+r.height);
    746780                }
     781                @Override
    747782                public Dimension preferredLayoutSize(Container parent) {
    748783                    Dimension l = new Dimension(200, 200); //left.getPreferredSize();
     
    750785                    return new Dimension(l.width+r.width+10+buttons.getPreferredSize().width,Math.max(l.height, r.height));
    751786                }
     787                @Override
    752788                public void layoutContainer(Container parent) {
    753789                    Dimension d = p.getSize();
     
    780816        }
    781817
     818        @Override
    782819        public boolean ok() {
    783820            Collection<String> t = new LinkedList<String>();
     
    884921
    885922        Collection<String> toolStr = Main.pref.getCollection("toolbar", Arrays.asList(deftoolbar));
    886         if (toolStr == null || toolStr.size() == 0) {
     923        if (toolStr == null || toolStr.isEmpty()) {
    887924            toolStr = Arrays.asList(deftoolbar);
    888925        }
     
    947984                control.addSeparator();
    948985            } else {
    949                 final JButton b = control.add(action.getParametrizedAction());
    950                 String tt = action.getDisplayTooltip();
    951                 if (tt != null && !tt.isEmpty())
    952                     b.setToolTipText(tt);
     986                final JButton b = addButtonAndShortcut(action);
     987               
    953988                Icon i = action.getDisplayIcon();
    954989                if (i != null) {
     
    9711006        control.setVisible(control.getComponentCount() != 0);
    9721007    }
     1008   
     1009    private JButton addButtonAndShortcut(ActionDefinition action) {
     1010        Action act = action.getParametrizedAction();
     1011        JButton b = control.add(act);
     1012       
     1013        Shortcut sc = null;
     1014        if (action.getAction() instanceof JosmAction) {
     1015            sc = ((JosmAction) action.getAction()).getShortcut();
     1016            if (sc.getAssignedKey() == KeyEvent.CHAR_UNDEFINED) sc = null;
     1017        }
     1018
     1019        long paramCode = 0;
     1020        if (action.hasParameters()) {
     1021            paramCode =  action.parameters.hashCode();
     1022        }
     1023       
     1024        String tt = action.getDisplayTooltip();
     1025        if (tt==null) tt="";
     1026
     1027        if (sc == null || paramCode != 0) {
     1028            String name = (String) action.getAction().getValue("toolbar");
     1029            if (name==null) name=action.getDisplayName();
     1030            if (paramCode!=0) name = name+paramCode;
     1031            String desc = action.getDisplayName() + ((paramCode==0)?"":action.parameters.toString());
     1032            sc = Shortcut.registerShortcut("toolbar:"+name, tr("Toolbar: {0}", desc),
     1033                KeyEvent.CHAR_UNDEFINED, Shortcut.NONE);
     1034            Main.unregisterShortcut(sc);
     1035            Main.registerActionShortcut(act, sc);
     1036           
     1037            // add shortcut info to the tooltip if needed
     1038            if (sc.getAssignedUser()) {
     1039                if (tt.startsWith("<html>") && tt.endsWith("</html>")) {
     1040                    tt = tt.substring(6,tt.length()-6);
     1041                }
     1042                tt = Main.platform.makeTooltip(tt, sc);
     1043            }
     1044        }
     1045       
     1046        if (!tt.isEmpty()) b.setToolTipText(tt);
     1047        return b;
     1048    }
    9731049
    9741050    private static DataFlavor ACTION_FLAVOR = new DataFlavor(
  • trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java

    r5886 r5954  
    147147    }
    148148
     149    /**
     150     * Show only shortcuts with descriptions coontaing given substring
     151     */
     152    public void filter(String substring) {
     153        filterField.setText(substring);
     154    }
     155
    149156    private class ShortcutTableCellRenderer extends DefaultTableCellRenderer {
    150157
     
    284291            this.panel = panel;
    285292        }
     293        @Override
    286294        public void valueChanged(ListSelectionEvent e) {
    287295            ListSelectionModel lsm = panel.shortcutTable.getSelectionModel(); // can't use e here
     
    313321            }
    314322        }
     323        @Override
    315324        public void actionPerformed(java.awt.event.ActionEvent e) {
    316325            ListSelectionModel lsm = panel.shortcutTable.getSelectionModel();
     
    378387        }
    379388
     389        @Override
    380390        public void changedUpdate(DocumentEvent arg0) { filter(); }
     391        @Override
    381392        public void insertUpdate(DocumentEvent arg0) {  filter(); }
     393        @Override
    382394        public void removeUpdate(DocumentEvent arg0) { filter(); }
    383395    }
  • trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreference.java

    r5070 r5954  
    1818public class ShortcutPreference extends DefaultTabPreferenceSetting {
    1919
     20    private String defaultFilter;
     21           
    2022    public static class Factory implements PreferenceSettingFactory {
    2123        public PreferenceSetting createPreferenceSetting() {
     
    3335        super("shortcuts", tr("Keyboard Shortcuts"), tr("Changing keyboard shortcuts manually."));
    3436    }
    35 
     37   
     38    @Override
    3639    public void addGui(PreferenceTabbedPane gui) {
    3740        JPanel p = gui.createPreferenceTab(this);
     
    3942        PrefJPanel prefpanel = new PrefJPanel(new scListModel());
    4043        p.add(prefpanel, GBC.eol().fill(GBC.BOTH));
    41 
     44        if (defaultFilter!=null) prefpanel.filter(defaultFilter);
    4245    }
    4346
     47    @Override
    4448    public boolean ok() {
    4549        return Shortcut.savePrefs();
     50    }
     51   
     52    public void setDefaultFilter(String substring) {
     53        defaultFilter = substring;
    4654    }
    4755
     
    5462            data = Shortcut.listAll();
    5563        }
     64        @Override
    5665        public int getColumnCount() {
    5766            return columnNames.length;
    5867        }
     68        @Override
    5969        public int getRowCount() {
    6070            return data.size();
     
    6474            return columnNames[col];
    6575        }
     76        @Override
    6677        public Object getValueAt(int row, int col) {
    6778            return (col==0)?  data.get(row).getLongText() : data.get(row);
Note: See TracChangeset for help on using the changeset viewer.