Changeset 4971 in josm


Ignore:
Timestamp:
Feb 17, 2012 11:07:13 PM (15 months ago)
Author:
stoecker
Message:

rework Shortcut handling a bit more, replace conflict handling with 'move out of way' to fix cascading conflicts, drop old group names for more descriptive names, sadly this deprecates the old group values again :-(

Location:
trunk/src/org/openstreetmap/josm
Files:
5 edited
1 copied

Legend:

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

    r4967 r4971  
    126126    } 
    127127 
    128     private JComboBox bxPrim1 = new JComboBox(); 
    129     private JComboBox bxPrim2 = new JComboBox(); 
    130     private JComboBox bxPrim3 = new JComboBox(); 
    131     private JComboBox bxPrim4 = new JComboBox(); 
    132     private JComboBox bxSec1 = new JComboBox(); 
    133     private JComboBox bxSec2 = new JComboBox(); 
    134     private JComboBox bxSec3 = new JComboBox(); 
    135     private JComboBox bxSec4 = new JComboBox(); 
    136     private JComboBox bxTer1 = new JComboBox(); 
    137     private JComboBox bxTer2 = new JComboBox(); 
    138     private JComboBox bxTer3 = new JComboBox(); 
    139     private JComboBox bxTer4 = new JComboBox(); 
    140128    private JCheckBox cbAlt = new JCheckBox(); 
    141129    private JCheckBox cbCtrl = new JCheckBox(); 
     
    158146 
    159147    private void initComponents() { 
    160         JPanel editGroupPane = new JPanel(); 
    161         JPanel hotkeyGroupPane = new JPanel(); 
    162  
    163148        JPanel listPane = new JPanel(); 
    164149        JScrollPane listScrollPane = new JScrollPane(); 
    165         JPanel menuGroupPane = new JPanel(); 
    166         JPanel modifierTab = new JPanel(); 
    167150        JTabbedPane prefTabPane = new JTabbedPane(); 
    168151        JPanel shortcutEditPane = new JPanel(); 
    169152        JPanel shortcutTab = new JPanel(); 
    170         JPanel subwindowGroupPane = new JPanel(); 
    171153        JPanel infoTab = new JPanel(); 
    172154 
    173155        CbAction action = new CbAction(this); 
    174         BxAction action2 = new BxAction(); 
    175156 
    176157        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     
    183164        editor.setText( 
    184165                tr("<h1><a name=\"top\">Keyboard Shortcuts</a></h1>")+ 
     166                tr("<br>")+ 
    185167                tr("<p>Please note that shortcut keys are assigned to the actions when JOSM is started. So you need to <b>restart</b> " 
    186                         +"JOSM to see your changes.</p>")+ 
    187                         tr("<p>Furthermore, the shortcuts are activated when the actions are assigned to a menu entry of a button for the first " 
    188                                 +"time. So some of your changes may become active even without restart --- but also without collision handling. " 
    189                                 +"This is another reason to <b>restart</b> JOSM after making any changes here.</p>")+ 
    190                                 tr("<p>You may notice that the key selection list on the next page lists all keys that exist on all kinds of keyboards " 
    191                                         +"Java knows about, not just those keys that exist on your keyboard. Please only use values that correspond to " 
    192                                         +"a real key on your keyboard. If your keyboard has no ''Copy'' key (PC keyboard do not have them, Sun keyboards do), " 
    193                                         +"then do not use it. Also there are ''keys'' listed that correspond to a shortcut on your keyboard (e.g. '':''/Colon). " 
    194                                         +"Please do not use them either, use the base key ('';''/Semicolon on US keyboards, ''.''/Period on German keyboards, etc.) " 
    195                                         +"instead. Not doing so may result in conflicts, as there is no way for JOSM to know that Ctrl+Shift+; and Ctrl+: " 
    196                                         +"actually is the same thing on an US keyboard.</p>")+ 
    197                                         tr("<h1>Modifier Groups</h1>")+ 
    198                                         tr("<p>The last page lists the modifier keys JOSM will automatically assign to shortcuts. For every of the four kinds " 
    199                                                 +"of shortcuts there are three alternatives. JOSM will try those alternatives in the listed order when managing a " 
    200                                                 +"conflict. If all alternatives result in shortcuts that are already taken, it will assign a random shortcut " 
    201                                                 +"instead.</p>")+ 
    202                                                 tr("<p>The pseudo-modifier ''disabled'' will disable the shortcut when encountered.</p>") 
     168                    +"JOSM to see your changes.</p>")+ 
     169                tr("<br>")+ 
     170                tr("<p>Furthermore, the shortcuts are activated when the actions are assigned to a menu entry of a button for the first " 
     171                    +"time. So some of your changes may become active even without restart --- but also without collision handling. " 
     172                    +"This is another reason to <b>restart</b> JOSM after making any changes here.</p>")+ 
     173                tr("<br>")+ 
     174                tr("<p>You may notice that the key selection list on the next page lists all keys that exist on all kinds of keyboards " 
     175                    +"Java knows about, not just those keys that exist on your keyboard. Please only use values that correspond to " 
     176                    +"a real key on your keyboard. If your keyboard has no ''Copy'' key (PC keyboard do not have them, Sun keyboards do), " 
     177                    +"then do not use it. Also there are ''keys'' listed that correspond to a shortcut on your keyboard (e.g. '':''/Colon). " 
     178                    +"Please do not use them either, use the base key ('';''/Semicolon on US keyboards, ''.''/Period on German keyboards, etc.) " 
     179                    +"instead. Not doing so may result in conflicts, as there is no way for JOSM to know that Ctrl+Shift+; and Ctrl+: " 
     180                    +"actually is the same thing on an US keyboard.</p>") 
    203181        ); 
    204182        editor.setCaretPosition(0); // scroll up 
     
    240218        cbMeta.setText(META); // see above for why no tr() 
    241219 
    242  
    243220        shortcutEditPane.add(cbDefault); 
    244221        shortcutEditPane.add(new JLabel()); 
     
    258235 
    259236        prefTabPane.addTab(tr("Keyboard Shortcuts"), shortcutTab); 
    260  
    261         // next is the modfier group tab. 
    262         // Would be a nice array if I had done it by hand. But then, it would be finished next year or so... 
    263         modifierTab.setLayout(new java.awt.GridLayout(0, 1)); 
    264         JScrollPane modifierScroller = new JScrollPane(modifierTab); 
    265  
    266         editGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Edit Shortcuts"))); 
    267         editGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    268  
    269         JComboBox[] bxArray = new JComboBox[] { 
    270                     bxPrim1,bxSec1,bxTer1,bxPrim2,bxSec2,bxTer2, 
    271                     bxPrim3,bxSec3,bxTer3,bxPrim4,bxSec4,bxTer4}; 
    272         for (JComboBox bxi: bxArray) bxi.setModel(new DefaultComboBoxModel(modifList)); 
    273  
    274         editGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    275         editGroupPane.add(bxPrim1); 
    276         editGroupPane.add(new JLabel(tr("Secondary modifier:"))); 
    277         editGroupPane.add(bxSec1); 
    278         editGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    279         editGroupPane.add(bxTer1); 
    280         modifierTab.add(editGroupPane); 
    281  
    282         menuGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Menu Shortcuts"))); 
    283         menuGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    284         menuGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    285         menuGroupPane.add(bxPrim2); 
    286         menuGroupPane.add(new JLabel(tr("Secondary modifier:"))); 
    287         menuGroupPane.add(bxSec2); 
    288         menuGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    289         menuGroupPane.add(bxTer2); 
    290         modifierTab.add(menuGroupPane); 
    291  
    292         hotkeyGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Hotkey Shortcuts"))); 
    293         hotkeyGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    294         hotkeyGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    295         hotkeyGroupPane.add(bxPrim3); 
    296         hotkeyGroupPane.add(new JLabel((tr("Secondary modifier:")))); 
    297         hotkeyGroupPane.add(bxSec3); 
    298         hotkeyGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    299         hotkeyGroupPane.add(bxTer3); 
    300         modifierTab.add(hotkeyGroupPane); 
    301  
    302         subwindowGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Subwindow Shortcuts"))); 
    303         subwindowGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    304         subwindowGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    305         subwindowGroupPane.add(bxPrim4); 
    306         subwindowGroupPane.add(new JLabel(tr("Secondary modifier:"))); 
    307         subwindowGroupPane.add(bxSec4); 
    308         subwindowGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    309         subwindowGroupPane.add(bxTer4); 
    310  
    311         initbx(); 
    312         for (JComboBox bxi: bxArray) bxi.setAction(action2); 
    313  
    314         modifierTab.add(subwindowGroupPane); 
    315  
    316         prefTabPane.addTab(tr("Modifier Groups"), modifierScroller); 
    317237 
    318238        add(prefTabPane); 
     
    433353    } 
    434354 
    435     // this handles the modifier groups 
    436     private class BxAction extends AbstractAction { 
    437         public void actionPerformed(java.awt.event.ActionEvent e) { 
    438             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT),    modifInts[bxPrim1.getSelectedIndex()]); 
    439             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT),    modifInts[ bxSec1.getSelectedIndex()]); 
    440             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT),    modifInts[ bxTer1.getSelectedIndex()]); 
    441  
    442             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU),    modifInts[bxPrim2.getSelectedIndex()]); 
    443             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU),    modifInts[ bxSec2.getSelectedIndex()]); 
    444             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU),    modifInts[ bxTer2.getSelectedIndex()]); 
    445  
    446             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY),  modifInts[bxPrim3.getSelectedIndex()]); 
    447             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY),  modifInts[ bxSec3.getSelectedIndex()]); 
    448             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY),  modifInts[ bxTer3.getSelectedIndex()]); 
    449  
    450             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER),   modifInts[bxPrim4.getSelectedIndex()]); 
    451             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER),   modifInts[ bxSec4.getSelectedIndex()]); 
    452             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER),   modifInts[ bxTer4.getSelectedIndex()]); 
    453         } 
    454     } 
    455  
    456     private void initbx() { 
    457         HashMap<Integer, Integer> groups = Main.platform.initShortcutGroups(false); 
    458         setBx(bxPrim1, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT); 
    459         setBx(bxSec1,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT); 
    460         setBx(bxTer1,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT); 
    461  
    462         setBx(bxPrim2, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU); 
    463         setBx(bxSec2,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU); 
    464         setBx(bxTer2,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU); 
    465  
    466         setBx(bxPrim3, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY); 
    467         setBx(bxSec3,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY); 
    468         setBx(bxTer3,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY); 
    469  
    470         setBx(bxPrim4, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER); 
    471         setBx(bxSec4,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER); 
    472         setBx(bxTer4,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER); 
    473     } 
    474     private void setBx(JComboBox bx, HashMap<Integer, Integer> groups, int key) { 
    475         int target = Main.pref.getInteger("shortcut.groups."+key, groups.get(key)); 
    476         for (int i = 0; i < modifInts.length; i++) { 
    477             if (modifInts[i] == target) { 
    478                 bx.setSelectedIndex(i); 
    479             } 
    480         } 
    481     } 
    482  
    483  
    484      class FilterFieldAdapter implements DocumentListener { 
     355    class FilterFieldAdapter implements DocumentListener { 
    485356        public void filter() { 
    486357            String expr = filterField.getText().trim(); 
  • trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java

    r4968 r4971  
    126126    } 
    127127 
    128     private JComboBox bxPrim1 = new JComboBox(); 
    129     private JComboBox bxPrim2 = new JComboBox(); 
    130     private JComboBox bxPrim3 = new JComboBox(); 
    131     private JComboBox bxPrim4 = new JComboBox(); 
    132     private JComboBox bxSec1 = new JComboBox(); 
    133     private JComboBox bxSec2 = new JComboBox(); 
    134     private JComboBox bxSec3 = new JComboBox(); 
    135     private JComboBox bxSec4 = new JComboBox(); 
    136     private JComboBox bxTer1 = new JComboBox(); 
    137     private JComboBox bxTer2 = new JComboBox(); 
    138     private JComboBox bxTer3 = new JComboBox(); 
    139     private JComboBox bxTer4 = new JComboBox(); 
    140128    private JCheckBox cbAlt = new JCheckBox(); 
    141129    private JCheckBox cbCtrl = new JCheckBox(); 
     
    158146 
    159147    private void initComponents() { 
    160         JPanel editGroupPane = new JPanel(); 
    161         JPanel hotkeyGroupPane = new JPanel(); 
    162  
    163148        JPanel listPane = new JPanel(); 
    164149        JScrollPane listScrollPane = new JScrollPane(); 
    165         JPanel menuGroupPane = new JPanel(); 
    166         JPanel modifierTab = new JPanel(); 
    167150        JTabbedPane prefTabPane = new JTabbedPane(); 
    168151        JPanel shortcutEditPane = new JPanel(); 
    169152        JPanel shortcutTab = new JPanel(); 
    170         JPanel subwindowGroupPane = new JPanel(); 
    171153        JPanel infoTab = new JPanel(); 
    172154 
    173155        CbAction action = new CbAction(this); 
    174         BxAction action2 = new BxAction(); 
    175156 
    176157        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     
    183164        editor.setText( 
    184165                tr("<h1><a name=\"top\">Keyboard Shortcuts</a></h1>")+ 
     166                tr("<br>")+ 
    185167                tr("<p>Please note that shortcut keys are assigned to the actions when JOSM is started. So you need to <b>restart</b> " 
    186                         +"JOSM to see your changes.</p>")+ 
    187                         tr("<p>Furthermore, the shortcuts are activated when the actions are assigned to a menu entry of a button for the first " 
    188                                 +"time. So some of your changes may become active even without restart --- but also without collision handling. " 
    189                                 +"This is another reason to <b>restart</b> JOSM after making any changes here.</p>")+ 
    190                                 tr("<p>You may notice that the key selection list on the next page lists all keys that exist on all kinds of keyboards " 
    191                                         +"Java knows about, not just those keys that exist on your keyboard. Please only use values that correspond to " 
    192                                         +"a real key on your keyboard. If your keyboard has no ''Copy'' key (PC keyboard do not have them, Sun keyboards do), " 
    193                                         +"then do not use it. Also there are ''keys'' listed that correspond to a shortcut on your keyboard (e.g. '':''/Colon). " 
    194                                         +"Please do not use them either, use the base key ('';''/Semicolon on US keyboards, ''.''/Period on German keyboards, etc.) " 
    195                                         +"instead. Not doing so may result in conflicts, as there is no way for JOSM to know that Ctrl+Shift+; and Ctrl+: " 
    196                                         +"actually is the same thing on an US keyboard.</p>")+ 
    197                                         tr("<h1>Modifier Groups</h1>")+ 
    198                                         tr("<p>The last page lists the modifier keys JOSM will automatically assign to shortcuts. For every of the four kinds " 
    199                                                 +"of shortcuts there are three alternatives. JOSM will try those alternatives in the listed order when managing a " 
    200                                                 +"conflict. If all alternatives result in shortcuts that are already taken, it will assign a random shortcut " 
    201                                                 +"instead.</p>")+ 
    202                                                 tr("<p>The pseudo-modifier ''disabled'' will disable the shortcut when encountered.</p>") 
     168                    +"JOSM to see your changes.</p>")+ 
     169                tr("<br>")+ 
     170                tr("<p>Furthermore, the shortcuts are activated when the actions are assigned to a menu entry of a button for the first " 
     171                    +"time. So some of your changes may become active even without restart --- but also without collision handling. " 
     172                    +"This is another reason to <b>restart</b> JOSM after making any changes here.</p>")+ 
     173                tr("<br>")+ 
     174                tr("<p>You may notice that the key selection list on the next page lists all keys that exist on all kinds of keyboards " 
     175                    +"Java knows about, not just those keys that exist on your keyboard. Please only use values that correspond to " 
     176                    +"a real key on your keyboard. If your keyboard has no ''Copy'' key (PC keyboard do not have them, Sun keyboards do), " 
     177                    +"then do not use it. Also there are ''keys'' listed that correspond to a shortcut on your keyboard (e.g. '':''/Colon). " 
     178                    +"Please do not use them either, use the base key ('';''/Semicolon on US keyboards, ''.''/Period on German keyboards, etc.) " 
     179                    +"instead. Not doing so may result in conflicts, as there is no way for JOSM to know that Ctrl+Shift+; and Ctrl+: " 
     180                    +"actually is the same thing on an US keyboard.</p>") 
    203181        ); 
    204182        editor.setCaretPosition(0); // scroll up 
     
    240218        cbMeta.setText(META); // see above for why no tr() 
    241219 
    242  
    243220        shortcutEditPane.add(cbDefault); 
    244221        shortcutEditPane.add(new JLabel()); 
     
    258235 
    259236        prefTabPane.addTab(tr("Keyboard Shortcuts"), shortcutTab); 
    260  
    261         // next is the modfier group tab. 
    262         // Would be a nice array if I had done it by hand. But then, it would be finished next year or so... 
    263         modifierTab.setLayout(new java.awt.GridLayout(0, 1)); 
    264         JScrollPane modifierScroller = new JScrollPane(modifierTab); 
    265  
    266         editGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Edit Shortcuts"))); 
    267         editGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    268  
    269         JComboBox[] bxArray = new JComboBox[] { 
    270                     bxPrim1,bxSec1,bxTer1,bxPrim2,bxSec2,bxTer2, 
    271                     bxPrim3,bxSec3,bxTer3,bxPrim4,bxSec4,bxTer4}; 
    272         for (JComboBox bxi: bxArray) bxi.setModel(new DefaultComboBoxModel(modifList)); 
    273  
    274         editGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    275         editGroupPane.add(bxPrim1); 
    276         editGroupPane.add(new JLabel(tr("Secondary modifier:"))); 
    277         editGroupPane.add(bxSec1); 
    278         editGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    279         editGroupPane.add(bxTer1); 
    280         modifierTab.add(editGroupPane); 
    281  
    282         menuGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Menu Shortcuts"))); 
    283         menuGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    284         menuGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    285         menuGroupPane.add(bxPrim2); 
    286         menuGroupPane.add(new JLabel(tr("Secondary modifier:"))); 
    287         menuGroupPane.add(bxSec2); 
    288         menuGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    289         menuGroupPane.add(bxTer2); 
    290         modifierTab.add(menuGroupPane); 
    291  
    292         hotkeyGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Hotkey Shortcuts"))); 
    293         hotkeyGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    294         hotkeyGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    295         hotkeyGroupPane.add(bxPrim3); 
    296         hotkeyGroupPane.add(new JLabel((tr("Secondary modifier:")))); 
    297         hotkeyGroupPane.add(bxSec3); 
    298         hotkeyGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    299         hotkeyGroupPane.add(bxTer3); 
    300         modifierTab.add(hotkeyGroupPane); 
    301  
    302         subwindowGroupPane.setBorder(BorderFactory.createTitledBorder(tr("Subwindow Shortcuts"))); 
    303         subwindowGroupPane.setLayout(new java.awt.GridLayout(3, 5)); 
    304         subwindowGroupPane.add(new JLabel(tr("Primary modifier:"))); 
    305         subwindowGroupPane.add(bxPrim4); 
    306         subwindowGroupPane.add(new JLabel(tr("Secondary modifier:"))); 
    307         subwindowGroupPane.add(bxSec4); 
    308         subwindowGroupPane.add(new JLabel(tr("Tertiary modifier:"))); 
    309         subwindowGroupPane.add(bxTer4); 
    310  
    311         initbx(); 
    312         for (JComboBox bxi: bxArray) bxi.setAction(action2); 
    313  
    314         modifierTab.add(subwindowGroupPane); 
    315  
    316         prefTabPane.addTab(tr("Modifier Groups"), modifierScroller); 
    317237 
    318238        add(prefTabPane); 
     
    433353    } 
    434354 
    435     // this handles the modifier groups 
    436     private class BxAction extends AbstractAction { 
    437         public void actionPerformed(java.awt.event.ActionEvent e) { 
    438             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT),    modifInts[bxPrim1.getSelectedIndex()]); 
    439             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT),    modifInts[ bxSec1.getSelectedIndex()]); 
    440             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT),    modifInts[ bxTer1.getSelectedIndex()]); 
    441  
    442             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU),    modifInts[bxPrim2.getSelectedIndex()]); 
    443             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU),    modifInts[ bxSec2.getSelectedIndex()]); 
    444             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU),    modifInts[ bxTer2.getSelectedIndex()]); 
    445  
    446             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY),  modifInts[bxPrim3.getSelectedIndex()]); 
    447             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY),  modifInts[ bxSec3.getSelectedIndex()]); 
    448             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY),  modifInts[ bxTer3.getSelectedIndex()]); 
    449  
    450             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER),   modifInts[bxPrim4.getSelectedIndex()]); 
    451             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER),   modifInts[ bxSec4.getSelectedIndex()]); 
    452             Main.pref.putInteger("shortcut.groups."+(Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER),   modifInts[ bxTer4.getSelectedIndex()]); 
    453         } 
    454     } 
    455  
    456     private void initbx() { 
    457         HashMap<Integer, Integer> groups = Main.platform.initShortcutGroups(false); 
    458         setBx(bxPrim1, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT); 
    459         setBx(bxSec1,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_EDIT); 
    460         setBx(bxTer1,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_EDIT); 
    461  
    462         setBx(bxPrim2, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU); 
    463         setBx(bxSec2,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_MENU); 
    464         setBx(bxTer2,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_MENU); 
    465  
    466         setBx(bxPrim3, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY); 
    467         setBx(bxSec3,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_HOTKEY); 
    468         setBx(bxTer3,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_HOTKEY); 
    469  
    470         setBx(bxPrim4, groups, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER); 
    471         setBx(bxSec4,  groups, Shortcut.GROUPS_ALT1   +Shortcut.GROUP_LAYER); 
    472         setBx(bxTer4,  groups, Shortcut.GROUPS_ALT2   +Shortcut.GROUP_LAYER); 
    473     } 
    474     private void setBx(JComboBox bx, HashMap<Integer, Integer> groups, int key) { 
    475         int target = Main.pref.getInteger("shortcut.groups."+key, groups.get(key)); 
    476         for (int i = 0; i < modifInts.length; i++) { 
    477             if (modifInts[i] == target) { 
    478                 bx.setSelectedIndex(i); 
    479             } 
    480         } 
    481     } 
    482  
    483  
    484      class FilterFieldAdapter implements DocumentListener { 
     355    class FilterFieldAdapter implements DocumentListener { 
    485356        public void filter() { 
    486357            String expr = filterField.getText().trim(); 
  • trunk/src/org/openstreetmap/josm/tools/PlatformHook.java

    r4897 r4971  
    5454 
    5555    /** 
    56       * The initShortcutGroups hook will be called by the 
    57       * Shortcut class if it detects that there are no 
    58       * groups in teh config file. So that will happen 
    59       * once on each JOSM installation only. 
    60       * 
    61       * Please note that ShorCut will load its config on demand, 
    62       * that is, at the moment the first shortcut is registered. 
    63       * 
    64       * In this hook, you have to fill the preferences with 
    65       * data, not the internal structures! Also, do not try 
    66       * to register any shortcuts from within. 
    67       */ 
    68     public HashMap<Integer, Integer> initShortcutGroups(boolean load); 
    69  
    70     /** 
    7156      * The initSystemShortcuts hook will be called by the 
    7257      * Shortcut class after the modifier groups have been read 
  • trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java

    r4926 r4971  
    7070        // Ain't that KISS? 
    7171        Runtime.getRuntime().exec("open " + url); 
    72     } 
    73     @Override 
    74     public HashMap<Integer, Integer>  initShortcutGroups(boolean load) { 
    75         HashMap<Integer, Integer> groups = new HashMap<Integer, Integer>(); 
    76  
    77         // Everything but Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU is guesswork. 
    78         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_NONE,    -1); 
    79         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY,  KeyEvent.CTRL_DOWN_MASK); 
    80         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU,    KeyEvent.META_DOWN_MASK); 
    81         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT,    0); 
    82         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER,   KeyEvent.ALT_DOWN_MASK); 
    83         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT,  0); 
    84         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MNEMONIC,KeyEvent.ALT_DOWN_MASK); 
    85         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT2, KeyEvent.ALT_DOWN_MASK); 
    86         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT3, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    87  
    88         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_NONE,       -1); 
    89         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    90         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MENU,       KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    91         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_EDIT,       KeyEvent.SHIFT_DOWN_MASK); 
    92         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_LAYER,      KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
    93         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT,     KeyEvent.SHIFT_DOWN_MASK); 
    94         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK); 
    95         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT2,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
    96         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT3,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    97  
    98         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_NONE,       -1); 
    99         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); 
    100         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MENU,       KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); 
    101         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_EDIT,       KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
    102         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_LAYER,      KeyEvent.SHIFT_DOWN_MASK); 
    103         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT,     KeyEvent.CTRL_DOWN_MASK); 
    104         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK); 
    105         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT2,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.CTRL_DOWN_MASK); 
    106         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT3,    KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); 
    107  
    108         return groups; 
    10972    } 
    11073 
  • trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java

    r4926 r4971  
    3737            } 
    3838        } 
    39     } 
    40  
    41     protected void setupGroup(HashMap<Integer, Integer> groups, boolean load, int group, int value) { 
    42         if(load) 
    43             groups.put(group, Main.pref.getInteger("shortcut.groups."+group, value)); 
    44         else 
    45             groups.put(group, value); 
    46     } 
    47  
    48     @Override 
    49     public HashMap<Integer, Integer>  initShortcutGroups(boolean load) { 
    50         HashMap<Integer, Integer> groups = new HashMap<Integer, Integer>(); 
    51  
    52         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_NONE,    -1); 
    53         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY,  KeyEvent.CTRL_DOWN_MASK); 
    54         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU,    KeyEvent.CTRL_DOWN_MASK); 
    55         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT,    0); 
    56         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER,   KeyEvent.ALT_DOWN_MASK); 
    57         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT,  0); 
    58         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MNEMONIC,KeyEvent.ALT_DOWN_MASK); 
    59         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT2, KeyEvent.ALT_DOWN_MASK); 
    60         setupGroup(groups, load, Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_DIRECT3, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    61  
    62         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_NONE,       -1); 
    63         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    64         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MENU,       KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    65         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_EDIT,       KeyEvent.SHIFT_DOWN_MASK); 
    66         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_LAYER,      KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
    67         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT,     KeyEvent.SHIFT_DOWN_MASK); 
    68         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK); 
    69         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT2,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
    70         setupGroup(groups, load, Shortcut.GROUPS_ALT1+Shortcut.GROUP_DIRECT3,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
    71  
    72         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_NONE,       -1); 
    73         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); 
    74         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MENU,       KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); 
    75         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_EDIT,       KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
    76         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_LAYER,      KeyEvent.SHIFT_DOWN_MASK); 
    77         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT,     KeyEvent.CTRL_DOWN_MASK); 
    78         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK); 
    79         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT2,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.CTRL_DOWN_MASK); 
    80         setupGroup(groups, load, Shortcut.GROUPS_ALT2+Shortcut.GROUP_DIRECT3,    KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); 
    81  
    82         return groups; 
    8339    } 
    8440 
  • trunk/src/org/openstreetmap/josm/tools/Shortcut.java

    r4956 r4971  
    3737 */ 
    3838public class Shortcut { 
    39     @Deprecated 
    40     public static final int SHIFT_DEFAULT = 1; 
    4139    private String shortText;        // the unique ID of the shortcut 
    4240    private String longText;         // a human readable description that will be shown in the preferences 
     
    160158    private boolean isSame(int isKey, int isModifier) { 
    161159        // -1 --- an unassigned shortcut is different from any other shortcut 
    162         return( isKey == assignedKey && isModifier == assignedModifier && assignedModifier != getGroupModifier(GROUP_NONE)); 
     160        return( isKey == assignedKey && isModifier == assignedModifier && assignedModifier != getGroupModifier(NONE)); 
    163161    } 
    164162 
     
    176174    } 
    177175 
    178     private void saveDefault(int modifier) { 
     176    private void saveDefault() { 
    179177        Main.pref.getCollection("shortcut.entry."+shortText, Arrays.asList(new String[]{longText, 
    180178        String.valueOf(requestedKey), String.valueOf(requestedGroup), String.valueOf(requestedKey), 
    181         String.valueOf(modifier), String.valueOf(true), String.valueOf(false)})); 
     179        String.valueOf(getGroupModifier(requestedGroup)), String.valueOf(true), String.valueOf(false)})); 
    182180    } 
    183181 
     
    246244 
    247245    // and here our modifier groups 
    248     private static Map<Integer, Integer> groups; 
     246    private static Map<Integer, Integer> groups= new HashMap<Integer, Integer>(); 
    249247 
    250248    // check if something collides with an existing shortcut 
     
    273271    } 
    274272 
    275     // try to find an unused shortcut 
    276     private static Shortcut findRandomShortcut(String shortText, String longText, int requestedKey, int requestedGroup) { 
    277         int[] mods = {getGroupModifier(requestedGroup + GROUPS_DEFAULT), getGroupModifier(requestedGroup + GROUPS_ALT1), getGroupModifier(requestedGroup + GROUPS_ALT2)}; 
    278         for (int m : mods) { 
    279             for (int k = KeyEvent.VK_A; k < KeyEvent.VK_Z; k++) { // we'll limit ourself to 100% safe keys 
    280                 if ( findShortcut(k, m) == null ) 
    281                     return new Shortcut(shortText, longText, requestedKey, requestedGroup, k, m, false, false); 
    282             } 
    283         } 
    284         return new Shortcut(shortText, longText, requestedKey, requestedGroup, requestedKey, getGroupModifier(GROUP_NONE), false, false); 
    285     } 
    286  
    287     // use these constants to request shortcuts 
    288     /** 
    289      * no shortcut. 
    290      */ 
    291     public static final int GROUP_NONE = 0; 
    292     /** 
    293      * a button action, will use another modifier than MENU on system with a meta key. 
    294      */ 
    295     public static final int GROUP_HOTKEY = 1; 
    296     /** 
    297      * a menu action, e.g. "ctrl-e" (export). 
    298      */ 
    299     public static final int GROUP_MENU = 2; 
    300     /** 
    301      * direct edit key, e.g. "a" (add). 
    302      */ 
    303     public static final int GROUP_EDIT = 3; 
    304     /** 
    305      * toggle one of the right-hand-side windows, e.g. "alt-l" (layers). 
    306      */ 
    307     public static final int GROUP_LAYER = 4; 
    308     /** 
    309      * for non-letter keys, preferable without modifier, e.g. F5. 
    310      */ 
    311     public static final int GROUP_DIRECT = 5; 
    312     /** 
    313      * for use with {@see #setMnemonic} only! 
    314      */ 
    315     public static final int GROUP_MNEMONIC = 6; 
    316     /** 
    317      * for direct access, with alt modifier. 
    318      */ 
    319     public static final int GROUP_DIRECT2 = 7; 
    320     /** 
    321      * for direct access, remaining modifiers. 
    322      */ 
    323     public static final int GROUP_DIRECT3 = 8; 
    324     public static final int GROUP_RESERVED = 1000; 
    325     public static final int GROUPS_DEFAULT = 0; 
    326     public static final int GROUPS_ALT1 = 100; 
    327     public static final int GROUPS_ALT2 = 200; 
     273    public static final int NONE = 5000; 
     274    public static final int MNEMONIC = 5001; 
     275    public static final int RESERVED = 5002; 
     276    public static final int DIRECT = 5003; 
     277    public static final int ALT = 5004; 
     278    public static final int SHIFT = 5005; 
     279    public static final int CTRL = 5006; 
     280    public static final int ALT_SHIFT = 5007; 
     281    public static final int ALT_CTRL = 5008; 
     282    public static final int CTRL_SHIFT = 5009; 
     283    public static final int ALT_CTRL_SHIFT = 5010; 
     284 
     285    /* old */ 
     286    @Deprecated public static final int GROUP_NONE = 0; 
     287    @Deprecated public static final int GROUP_HOTKEY = 1; 
     288    @Deprecated public static final int GROUP_MENU = 2; 
     289    @Deprecated public static final int GROUP_EDIT = 3; 
     290    @Deprecated public static final int GROUP_LAYER = 4; 
     291    @Deprecated public static final int GROUP_DIRECT = 5; 
     292    @Deprecated public static final int GROUP_MNEMONIC = 6; 
     293    @Deprecated public static final int GROUP_DIRECT2 = 7; 
     294    @Deprecated public static final int GROUP_DIRECT3 = 8; 
     295    @Deprecated public static final int GROUPS_DEFAULT = 0; 
     296    @Deprecated public static final int GROUPS_ALT1 = 100; 
     297    @Deprecated public static final int GROUPS_ALT2 = 200; 
     298    @Deprecated public static final int SHIFT_DEFAULT = 1; 
    328299 
    329300    // bootstrap 
     
    332303        if (initdone) return; 
    333304        initdone = true; 
    334         groups = Main.platform.initShortcutGroups(true); 
     305        groups.put(NONE, -1); 
     306        groups.put(MNEMONIC, KeyEvent.ALT_DOWN_MASK); 
     307        groups.put(DIRECT, 0); 
     308        groups.put(ALT, KeyEvent.ALT_DOWN_MASK); 
     309        groups.put(SHIFT, KeyEvent.SHIFT_DOWN_MASK); 
     310        groups.put(CTRL, KeyEvent.CTRL_DOWN_MASK); 
     311        groups.put(ALT_SHIFT, KeyEvent.ALT_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK); 
     312        groups.put(ALT_CTRL, KeyEvent.ALT_DOWN_MASK|KeyEvent.CTRL_DOWN_MASK); 
     313        groups.put(CTRL_SHIFT, KeyEvent.CTRL_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK); 
     314        groups.put(ALT_CTRL_SHIFT, KeyEvent.ALT_DOWN_MASK|KeyEvent.CTRL_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK); 
     315 
     316        /* old */ 
     317        groups.put(GROUPS_DEFAULT+GROUP_NONE,    -1); 
     318        groups.put(GROUPS_DEFAULT+GROUP_HOTKEY,  KeyEvent.CTRL_DOWN_MASK); 
     319        groups.put(GROUPS_DEFAULT+GROUP_MENU,    KeyEvent.CTRL_DOWN_MASK); 
     320        groups.put(GROUPS_DEFAULT+GROUP_EDIT,    0); 
     321        groups.put(GROUPS_DEFAULT+GROUP_LAYER,   KeyEvent.ALT_DOWN_MASK); 
     322        groups.put(GROUPS_DEFAULT+GROUP_DIRECT,  0); 
     323        groups.put(GROUPS_DEFAULT+GROUP_MNEMONIC,KeyEvent.ALT_DOWN_MASK); 
     324        groups.put(GROUPS_DEFAULT+GROUP_DIRECT2, KeyEvent.ALT_DOWN_MASK); 
     325        groups.put(GROUPS_DEFAULT+GROUP_DIRECT3, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
     326 
     327        groups.put(GROUPS_ALT1+GROUP_NONE,       -1); 
     328        groups.put(GROUPS_ALT1+GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
     329        groups.put(GROUPS_ALT1+GROUP_MENU,       KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
     330        groups.put(GROUPS_ALT1+GROUP_EDIT,       KeyEvent.SHIFT_DOWN_MASK); 
     331        groups.put(GROUPS_ALT1+GROUP_LAYER,      KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
     332        groups.put(GROUPS_ALT1+GROUP_DIRECT,     KeyEvent.SHIFT_DOWN_MASK); 
     333        groups.put(GROUPS_ALT1+GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK); 
     334        groups.put(GROUPS_ALT1+GROUP_DIRECT2,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
     335        groups.put(GROUPS_ALT1+GROUP_DIRECT3,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); 
     336 
     337        groups.put(GROUPS_ALT2+GROUP_NONE,       -1); 
     338        groups.put(GROUPS_ALT2+GROUP_HOTKEY,     KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); 
     339        groups.put(GROUPS_ALT2+GROUP_MENU,       KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); 
     340        groups.put(GROUPS_ALT2+GROUP_EDIT,       KeyEvent.ALT_DOWN_MASK  | KeyEvent.SHIFT_DOWN_MASK); 
     341        groups.put(GROUPS_ALT2+GROUP_LAYER,      KeyEvent.SHIFT_DOWN_MASK); 
     342        groups.put(GROUPS_ALT2+GROUP_DIRECT,     KeyEvent.CTRL_DOWN_MASK); 
     343        groups.put(GROUPS_ALT2+GROUP_MNEMONIC,   KeyEvent.ALT_DOWN_MASK); 
     344        groups.put(GROUPS_ALT2+GROUP_DIRECT2,    KeyEvent.ALT_DOWN_MASK  | KeyEvent.CTRL_DOWN_MASK); 
     345        groups.put(GROUPS_ALT2+GROUP_DIRECT3,    KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); 
     346 
    335347        // (1) System reserved shortcuts 
    336348        Main.platform.initSystemShortcuts(); 
     
    401413            return null; 
    402414        } 
    403         potentialShortcut = new Shortcut(shortText, longText, key, GROUP_RESERVED, key, modifier, true, false); 
     415        potentialShortcut = new Shortcut(shortText, longText, key, RESERVED, key, modifier, true, false); 
    404416        shortcuts.put(shortText, potentialShortcut); 
    405417        return potentialShortcut; 
     
    458470        } 
    459471        else if (defaultModifier == null) { // garbage in, no shortcut out 
    460             defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT); 
     472            defaultModifier = getGroupModifier(NONE); 
    461473        } 
    462474        return defaultModifier; 
    463475    } 
    464476 
     477    private static int[] mods = {ALT_CTRL, ALT_SHIFT, CTRL_SHIFT, ALT_CTRL_SHIFT}; 
     478    private static int[] keys = {KeyEvent.VK_F1, KeyEvent.VK_F2, KeyEvent.VK_F3, KeyEvent.VK_F4, 
     479                                 KeyEvent.VK_F5, KeyEvent.VK_F6, KeyEvent.VK_F7, KeyEvent.VK_F8, 
     480                                 KeyEvent.VK_F9, KeyEvent.VK_F10, KeyEvent.VK_F11, KeyEvent.VK_F12}; 
    465481    // and now the workhorse. same parameters as above, just one more: if originalShortcut is not null and 
    466482    // is different from the shortcut that will be assigned, a popup warning will be displayed to the user. 
     
    475491            Shortcut sc = shortcuts.get(shortText); 
    476492            sc.setLongText(longText); // or set by the platformHook, in this case the original longText doesn't match the real action 
    477             sc.saveDefault(defaultModifier); 
     493            sc.saveDefault(); 
    478494            return sc; 
    479495        } 
    480         Shortcut conflictsWith = null; 
    481         Shortcut potentialShortcut = findShortcut(requestedKey, defaultModifier); 
    482         if (potentialShortcut != null) { // 3 stage conflict handling 
    483             conflictsWith = potentialShortcut; 
    484             defaultModifier = getGroupModifier(requestedGroup + GROUPS_ALT1); 
    485             if (defaultModifier == null) { // garbage in, no shortcut out 
    486                 defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT); 
    487             } 
    488             potentialShortcut = findShortcut(requestedKey, defaultModifier); 
    489             if (potentialShortcut != null) { 
    490                 defaultModifier = getGroupModifier(requestedGroup + GROUPS_ALT2); 
    491                 if (defaultModifier == null) { // garbage in, no shortcut out 
    492                     defaultModifier = getGroupModifier(GROUP_NONE + GROUPS_DEFAULT); 
     496        Shortcut conflict = findShortcut(requestedKey, defaultModifier); 
     497        if (conflict != null) { 
     498            for (int m : mods) { 
     499                for (int k : keys) { 
     500                    int newmodifier = getGroupModifier(m); 
     501                    if ( findShortcut(k, m) == null ) { 
     502                        Shortcut newsc = new Shortcut(shortText, longText, requestedKey, m, k, newmodifier, false, false); 
     503                        System.out.println(tr("Silent shortcut conflict: ''{0}'' moved by ''{1}'' to ''{2}''.", 
     504                            shortText, conflict.getShortText(), newsc.getKeyText())); 
     505                        newsc.saveDefault(); 
     506                        shortcuts.put(shortText, newsc); 
     507                        return newsc; 
     508                    } 
    493509                } 
    494                 potentialShortcut = findShortcut(requestedKey, defaultModifier); 
    495                 if (potentialShortcut != null) { // if all 3 modifiers for a group are used, we give up 
    496                     potentialShortcut = findRandomShortcut(shortText, longText, requestedKey, requestedGroup); 
    497                 } else { 
    498                     potentialShortcut = new Shortcut(shortText, longText, requestedKey, requestedGroup, requestedKey, defaultModifier, false, false); 
    499                 } 
    500             } else { 
    501                 potentialShortcut = new Shortcut(shortText, longText, requestedKey, requestedGroup, requestedKey, defaultModifier, false, false); 
    502             } 
    503             if (originalShortcut != null && !originalShortcut.isSame(potentialShortcut)) { 
    504                 displayWarning(conflictsWith, potentialShortcut, shortText, longText); 
    505             } else if (originalShortcut == null) { 
    506                 System.out.println("Silent shortcut conflict: '"+shortText+"' moved by '"+conflictsWith.getShortText()+"' to '"+potentialShortcut.getKeyText()+"'."); 
    507510            } 
    508511        } else { 
    509             potentialShortcut = new Shortcut(shortText, longText, requestedKey, requestedGroup, requestedKey, defaultModifier, true, false); 
    510         } 
    511  
    512         potentialShortcut.saveDefault(defaultModifier); 
    513         shortcuts.put(shortText, potentialShortcut); 
    514         return potentialShortcut; 
    515     } 
    516  
    517     // a lengthy warning message 
    518     private static void displayWarning(Shortcut conflictsWith, Shortcut potentialShortcut, String shortText, String longText) { 
    519         JOptionPane.showMessageDialog(Main.parent, 
    520                 tr("Setting the keyboard shortcut ''{0}'' for the action ''{1}'' ({2}) failed\n"+ 
    521                         "because the shortcut is already taken by the action ''{3}'' ({4}).\n\n", 
    522                         conflictsWith.getKeyText(), longText, shortText, 
    523                         conflictsWith.getLongText(), conflictsWith.getShortText())+ 
    524                         (potentialShortcut.getKeyText().equals("") ? 
    525                                 tr("This action will have no shortcut.\n\n") 
    526                                 : 
    527                                     tr("Using the shortcut ''{0}'' instead.\n\n", potentialShortcut.getKeyText()) 
    528                                 )+ 
    529                                 tr("(Hint: You can edit the shortcuts in the preferences.)"), 
    530                                 tr("Error"), 
    531                                 JOptionPane.ERROR_MESSAGE 
    532                 ); 
     512            Shortcut newsc = new Shortcut(shortText, longText, requestedKey, requestedGroup, requestedKey, defaultModifier, true, false); 
     513            newsc.saveDefault(); 
     514            shortcuts.put(shortText, newsc); 
     515            return newsc; 
     516        } 
     517 
     518        return null; 
    533519    } 
    534520 
Note: See TracChangeset for help on using the changeset viewer.