/* * prefJPanel.java * * Created on 28. September 2008, 17:47 */ package org.openstreetmap.josm.gui.preferences; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.KeyEvent; import java.util.LinkedHashMap; import java.util.Map; import javax.swing.JEditorPane; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableModel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.tools.Shortcut; /** * This is the keyboard preferences content. * If someone wants to merge it with ShortcutPreference.java, feel free. */ public class PrefJPanel extends javax.swing.JPanel { // table of shortcuts private TableModel model; // comboboxes of modifier groups, mapping selectedIndex to real data private static int[] modifInts = new int[]{ -1, 0, KeyEvent.SHIFT_DOWN_MASK, KeyEvent.CTRL_DOWN_MASK, KeyEvent.ALT_DOWN_MASK, KeyEvent.META_DOWN_MASK, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK, KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK, KeyEvent.CTRL_DOWN_MASK | KeyEvent.META_DOWN_MASK, KeyEvent.ALT_DOWN_MASK | KeyEvent.META_DOWN_MASK, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK }; // and here are the texts fro the comboboxes private static String[] modifList = new String[] { tr("disabled"), tr("no modifier"), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[2]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[3]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[4]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[5]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[6]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[7]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[8]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[9]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[10]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[11]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[12]).getModifiers()), KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, modifInts[13]).getModifiers()) }; // this are the display(!) texts for the checkboxes. Let the JVM do the i18n for us <g>. // Ok, there's a real reason for this: The JVM should know best how the keys are labelled // on the physical keyboard. What language pack is installed in JOSM is completely // independent from the keyboard's labelling. But the operation system's locale // usually matches the keyboard. This even works with my English Windows and my German // keyboard. private static String SHIFT = KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.SHIFT_DOWN_MASK).getModifiers()); private static String CTRL = KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK).getModifiers()); private static String ALT = KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.ALT_DOWN_MASK).getModifiers()); private static String META = KeyEvent.getKeyModifiersText(javax.swing.KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK).getModifiers()); // A list of keys to present the user. Sadly this really is a list of keys Java knows about, // not a list of real physical keys. If someone knows how to get that list? private static Map<Integer, String> keyList = setKeyList(); private static Map<Integer, String> setKeyList() { Map<Integer, String> list = new LinkedHashMap<Integer, String>(); // I hate this, but I found no alternative... for (int i = 0; i < 65534; i++) { String s = KeyEvent.getKeyText(i); if (s != null && s.length() > 0 && !s.contains("Unknown")) { list.put(Integer.valueOf(i), s); //System.out.println(i+": "+s); } } list.put(Integer.valueOf(-1), ""); return list; } /** Creates new form prefJPanel */ // Ain't those auto-generated comments helpful or what? <g> public PrefJPanel(TableModel model) { this.model = model; initComponents(); } private void initComponents() { // Did I mention auto-generated? That's the reason we // have lots of properties here and not some arrays... prefTabPane = new javax.swing.JTabbedPane(); shortcutTab = new javax.swing.JPanel(); listPane = new javax.swing.JPanel(); listScrollPane = new javax.swing.JScrollPane(); shortcutTable = new javax.swing.JTable(); shortcutEditPane = new javax.swing.JPanel(); cbDefault = new javax.swing.JCheckBox(); jLabel4 = new javax.swing.JLabel(); cbShift = new javax.swing.JCheckBox(); cbDisable = new javax.swing.JCheckBox(); cbCtrl = new javax.swing.JCheckBox(); tfKeyLabel = new javax.swing.JLabel(); cbAlt = new javax.swing.JCheckBox(); tfKey = new javax.swing.JComboBox(); cbMeta = new javax.swing.JCheckBox(); jLabel6 = new javax.swing.JLabel(); modifierTab = new javax.swing.JPanel(); editGroupPane = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); bxPrim1 = new javax.swing.JComboBox(); jLabel2 = new javax.swing.JLabel(); bxSec1 = new javax.swing.JComboBox(); jLabel3 = new javax.swing.JLabel(); bxTer1 = new javax.swing.JComboBox(); menuGroupPane = new javax.swing.JPanel(); jLabel7 = new javax.swing.JLabel(); bxPrim2 = new javax.swing.JComboBox(); jLabel8 = new javax.swing.JLabel(); bxSec2 = new javax.swing.JComboBox(); jLabel9 = new javax.swing.JLabel(); bxTer2 = new javax.swing.JComboBox(); hotkeyGroupPane = new javax.swing.JPanel(); jLabel10 = new javax.swing.JLabel(); bxPrim3 = new javax.swing.JComboBox(); jLabel11 = new javax.swing.JLabel(); bxSec3 = new javax.swing.JComboBox(); jLabel12 = new javax.swing.JLabel(); bxTer3 = new javax.swing.JComboBox(); subwindowGroupPane = new javax.swing.JPanel(); jLabel13 = new javax.swing.JLabel(); bxPrim4 = new javax.swing.JComboBox(); jLabel14 = new javax.swing.JLabel(); bxSec4 = new javax.swing.JComboBox(); jLabel15 = new javax.swing.JLabel(); bxTer4 = new javax.swing.JComboBox(); infoTab = new javax.swing.JPanel(); cbAction action = new cbAction(this); bxAction action2 = new bxAction(); setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS)); // If someone wants to move this text into some resource, feel free. infoTab.setLayout(new javax.swing.BoxLayout(shortcutTab, javax.swing.BoxLayout.Y_AXIS)); JEditorPane editor = new JEditorPane(); editor.setEditable(false); editor.setContentType("text/html"); editor.setText( tr("<h1><a name=\"top\">Keyboard Shortcuts</a></h1>")+ tr("<p>Please note that shortcut keys are assigned to the actions when JOSM is started. So you need to <b>restart</b> " +"JOSM to see your changes.</p>")+ tr("<p>Furthermore, the shortcuts are activated when the actions are assigned to a menu entry of a button for the first " +"time. So some of your changes may become active even without restart --- but also without collision handling. " +"This is another reason to <b>restart</b> JOSM after making any changes here.</p>")+ tr("<p>You may notice that the key selection list on the next page lists all keys that exist on all kinds of keyboards " +"Java knows about, not just those keys that exist on your keyboard. Please only use values that correspond to " +"a real key on your keyboard. If your keyboard has no ''Copy'' key (PC keyboard do not have them, Sun keyboards do), " +"then do not use it. Also there are ''keys'' listed that correspond to a shortcut on your keyboard (e.g. '':''/Colon). " +"Please do not use them either, use the base key ('';''/Semicolon on US keyboards, ''.''/Period on German keyboards, etc.) " +"instead. Not doing so may result in conflicts, as there is no way for JOSM to know that Ctrl+Shift+; and Ctrl+: " +"actually is the same thing on an US keyboard.</p>")+ tr("<h1>Modifier Groups</h1>")+ tr("<p>The last page lists the modifier keys JOSM will automatically assign to shortcuts. For every of the four kinds " +"of shortcuts there are three alternatives. JOSM will try those alternatives in the listed order when managing a " +"conflict. If all alternatives result in shortcuts that are already taken, it will assign a random shortcut " +"instead.</p>")+ tr("<p>The pseudo-modifier ''disabled'' will disable the shortcut when encountered.</p>") ); editor.setCaretPosition(0); // scroll up prefTabPane.addTab(tr("Read First"), new JScrollPane(editor)); shortcutTab.setLayout(new javax.swing.BoxLayout(shortcutTab, javax.swing.BoxLayout.Y_AXIS)); listPane.setLayout(new java.awt.GridLayout()); // This is the list of shortcuts: shortcutTable.setModel(model); shortcutTable.getSelectionModel().addListSelectionListener(new cbAction(this)); //shortcutTable.setFillsViewportHeight(true); Java 1.6 shortcutTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); listScrollPane.setViewportView(shortcutTable); listPane.add(listScrollPane); shortcutTab.add(listPane); // and here follows the edit area. I won't object to someone re-designing it, it looks, um, "minimalistic" ;) shortcutEditPane.setLayout(new java.awt.GridLayout(5, 2)); cbDefault.setAction(action); cbDefault.setText(tr("Use default")); shortcutEditPane.add(cbDefault); shortcutEditPane.add(jLabel4); cbShift.setAction(action); cbShift.setText(SHIFT); // see above for why no tr() shortcutEditPane.add(cbShift); cbDisable.setAction(action); cbDisable.setText(tr("Disable")); shortcutEditPane.add(cbDisable); cbCtrl.setAction(action); cbCtrl.setText(CTRL); // see above for why no tr() shortcutEditPane.add(cbCtrl); tfKeyLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); tfKeyLabel.setText(tr("Key:")); shortcutEditPane.add(tfKeyLabel); cbAlt.setAction(action); cbAlt.setText(ALT); // see above for why no tr() shortcutEditPane.add(cbAlt); tfKey.setAction(action); tfKey.setModel(new javax.swing.DefaultComboBoxModel(keyList.values().toArray())); shortcutEditPane.add(tfKey); cbMeta.setAction(action); cbMeta.setText(META); // see above for why no tr() shortcutEditPane.add(cbMeta); jLabel6.setText(tr("Attention: Use real keyboard keys only!")); shortcutEditPane.add(jLabel6); action.actionPerformed(null); // init checkboxes shortcutTab.add(shortcutEditPane); prefTabPane.addTab(tr("Keyboard Shortcuts"), shortcutTab); // next is the modfier group tab. // Would be a nice array if I had done it by hand. But then, it would be finished next year or so... modifierTab.setLayout(new java.awt.GridLayout(0, 1)); JScrollPane modifierScroller = new JScrollPane(modifierTab); editGroupPane.setBorder(javax.swing.BorderFactory.createTitledBorder(tr("Edit Shortcuts"))); editGroupPane.setLayout(new java.awt.GridLayout(3, 5)); jLabel1.setText(tr("Primary modifier:")); editGroupPane.add(jLabel1); bxPrim1.setModel(new javax.swing.DefaultComboBoxModel(modifList)); editGroupPane.add(bxPrim1); jLabel2.setText(tr("Secondary modifier:")); editGroupPane.add(jLabel2); bxSec1.setModel(new javax.swing.DefaultComboBoxModel(modifList)); editGroupPane.add(bxSec1); jLabel3.setText(tr("Tertiary modifier:")); editGroupPane.add(jLabel3); bxTer1.setModel(new javax.swing.DefaultComboBoxModel(modifList)); editGroupPane.add(bxTer1); modifierTab.add(editGroupPane); menuGroupPane.setBorder(javax.swing.BorderFactory.createTitledBorder(tr("Menu Shortcuts"))); menuGroupPane.setLayout(new java.awt.GridLayout(3, 5)); jLabel7.setText(tr("Primary modifier:")); menuGroupPane.add(jLabel7); bxPrim2.setModel(new javax.swing.DefaultComboBoxModel(modifList)); menuGroupPane.add(bxPrim2); jLabel8.setText(tr("Secondary modifier:")); menuGroupPane.add(jLabel8); bxSec2.setModel(new javax.swing.DefaultComboBoxModel(modifList)); menuGroupPane.add(bxSec2); jLabel9.setText(tr("Tertiary modifier:")); menuGroupPane.add(jLabel9); bxTer2.setModel(new javax.swing.DefaultComboBoxModel(modifList)); menuGroupPane.add(bxTer2); modifierTab.add(menuGroupPane); hotkeyGroupPane.setBorder(javax.swing.BorderFactory.createTitledBorder(tr("Hotkey Shortcuts"))); hotkeyGroupPane.setLayout(new java.awt.GridLayout(3, 5)); jLabel10.setText(tr("Primary modifier:")); hotkeyGroupPane.add(jLabel10); bxPrim3.setModel(new javax.swing.DefaultComboBoxModel(modifList)); hotkeyGroupPane.add(bxPrim3); jLabel11.setText(tr("Secondary modifier:")); hotkeyGroupPane.add(jLabel11); bxSec3.setModel(new javax.swing.DefaultComboBoxModel(modifList)); hotkeyGroupPane.add(bxSec3); jLabel12.setText(tr("Tertiary modifier:")); hotkeyGroupPane.add(jLabel12); bxTer3.setModel(new javax.swing.DefaultComboBoxModel(modifList)); hotkeyGroupPane.add(bxTer3); modifierTab.add(hotkeyGroupPane); subwindowGroupPane.setBorder(javax.swing.BorderFactory.createTitledBorder(tr("Subwindow Shortcuts"))); subwindowGroupPane.setLayout(new java.awt.GridLayout(3, 5)); jLabel13.setText(tr("Primary modifier:")); subwindowGroupPane.add(jLabel13); bxPrim4.setModel(new javax.swing.DefaultComboBoxModel(modifList)); subwindowGroupPane.add(bxPrim4); jLabel14.setText(tr("Secondary modifier:")); subwindowGroupPane.add(jLabel14); bxSec4.setModel(new javax.swing.DefaultComboBoxModel(modifList)); subwindowGroupPane.add(bxSec4); jLabel15.setText(tr("Tertiary modifier:")); subwindowGroupPane.add(jLabel15); bxTer4.setModel(new javax.swing.DefaultComboBoxModel(modifList)); subwindowGroupPane.add(bxTer4); initbx(); bxPrim1.setAction(action2); bxSec1.setAction(action2); bxTer1.setAction(action2); bxPrim2.setAction(action2); bxSec2.setAction(action2); bxTer2.setAction(action2); bxPrim3.setAction(action2); bxSec3.setAction(action2); bxTer3.setAction(action2); bxPrim4.setAction(action2); bxSec4.setAction(action2); bxTer4.setAction(action2); modifierTab.add(subwindowGroupPane); prefTabPane.addTab(tr("Modifier Groups"), modifierScroller); add(prefTabPane); } // this allows to edit shortcuts. it: // * sets the edit controls to the selected shortcut // * enabled/disables the controls as needed // * writes the user's changes to the shortcut // And after I finally had it working, I realized that those two methods // are playing ping-pong (politically correct: table tennis, I know) and // even have some duplicated code. Feel free to refactor, If you have // more expirience with GUI coding than I have. private class cbAction extends javax.swing.AbstractAction implements ListSelectionListener { private PrefJPanel panel; public cbAction (PrefJPanel panel) { this.panel = panel; } public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = panel.shortcutTable.getSelectionModel(); // can't use e here if (!lsm.isSelectionEmpty()) { int row = lsm.getMinSelectionIndex(); Shortcut sc = (Shortcut)panel.model.getValueAt(row, -1); panel.cbDefault.setSelected(!sc.getAssignedUser()); panel.cbDisable.setSelected(sc.getKeyStroke() == null); panel.cbShift.setSelected(sc.getAssignedModifier() != -1 && (sc.getAssignedModifier() & KeyEvent.SHIFT_DOWN_MASK) != 0); panel.cbCtrl.setSelected(sc.getAssignedModifier() != -1 && (sc.getAssignedModifier() & KeyEvent.CTRL_DOWN_MASK) != 0); panel.cbAlt.setSelected(sc.getAssignedModifier() != -1 && (sc.getAssignedModifier() & KeyEvent.ALT_DOWN_MASK) != 0); panel.cbMeta.setSelected(sc.getAssignedModifier() != -1 && (sc.getAssignedModifier() & KeyEvent.META_DOWN_MASK) != 0); if (sc.getKeyStroke() != null) { tfKey.setSelectedItem(keyList.get(sc.getKeyStroke().getKeyCode())); } else { tfKey.setSelectedItem(keyList.get(-1)); } if (!sc.isChangeable()) { panel.cbDefault.setEnabled(false); panel.cbDisable.setEnabled(false); panel.cbShift.setEnabled(false); panel.cbCtrl.setEnabled(false); panel.cbAlt.setEnabled(false); panel.cbMeta.setEnabled(false); panel.tfKey.setEnabled(false); } else { panel.cbDefault.setEnabled(true); actionPerformed(null); } } else { panel.cbDefault.setEnabled(false); panel.cbDisable.setEnabled(false); panel.cbShift.setEnabled(false); panel.cbCtrl.setEnabled(false); panel.cbAlt.setEnabled(false); panel.cbMeta.setEnabled(false); panel.tfKey.setEnabled(false); } } public void actionPerformed(java.awt.event.ActionEvent e) { ListSelectionModel lsm = panel.shortcutTable.getSelectionModel(); if (lsm != null && !lsm.isSelectionEmpty()) { if (e != null) { // only if we've been called by a user action int row = lsm.getMinSelectionIndex(); Shortcut sc = (Shortcut)panel.model.getValueAt(row, -1); sc.setAssignedUser(!panel.cbDefault.isSelected()); if (panel.cbDisable.isSelected()) { sc.setAssignedModifier(-1); } else if (panel.tfKey.getSelectedItem().equals("")) { sc.setAssignedModifier(KeyEvent.VK_CANCEL); } else { sc.setAssignedModifier( (panel.cbShift.isSelected() ? KeyEvent.SHIFT_DOWN_MASK : 0) | (panel.cbCtrl.isSelected() ? KeyEvent.CTRL_DOWN_MASK : 0) | (panel.cbAlt.isSelected() ? KeyEvent.ALT_DOWN_MASK : 0) | (panel.cbMeta.isSelected() ? KeyEvent.META_DOWN_MASK : 0) ); for (Map.Entry<Integer, String> entry : keyList.entrySet()) { if (entry.getValue().equals(panel.tfKey.getSelectedItem())) { sc.setAssignedKey(entry.getKey()); } } } valueChanged(null); } boolean state = !panel.cbDefault.isSelected(); panel.cbDisable.setEnabled(state); state = state && !panel.cbDisable.isSelected(); panel.cbShift.setEnabled(state); panel.cbCtrl.setEnabled(state); panel.cbAlt.setEnabled(state); panel.cbMeta.setEnabled(state); panel.tfKey.setEnabled(state); } else { panel.cbDefault.setEnabled(false); panel.cbDisable.setEnabled(false); panel.cbShift.setEnabled(false); panel.cbCtrl.setEnabled(false); panel.cbAlt.setEnabled(false); panel.cbMeta.setEnabled(false); panel.tfKey.setEnabled(false); } } } // this handles the modifier groups private class bxAction extends javax.swing.AbstractAction { public void actionPerformed(java.awt.event.ActionEvent e) { Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT), Integer.toString( modifInts[bxPrim1.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_EDIT), Integer.toString( modifInts[ bxSec1.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_EDIT), Integer.toString( modifInts[ bxTer1.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU), Integer.toString( modifInts[bxPrim2.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_MENU), Integer.toString( modifInts[ bxSec2.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_MENU), Integer.toString( modifInts[ bxTer2.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY), Integer.toString( modifInts[bxPrim3.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_HOTKEY), Integer.toString( modifInts[ bxSec3.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_HOTKEY), Integer.toString( modifInts[ bxTer3.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER), Integer.toString( modifInts[bxPrim4.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_LAYER), Integer.toString( modifInts[ bxSec4.getSelectedIndex()] )); Main.pref.put("shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_LAYER), Integer.toString( modifInts[ bxTer4.getSelectedIndex()] )); } } private void initbx() { setBx(bxPrim1, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_EDIT)); setBx(bxSec1, "shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_EDIT)); setBx(bxTer1, "shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_EDIT)); setBx(bxPrim2, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_MENU)); setBx(bxSec2, "shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_MENU)); setBx(bxTer2, "shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_MENU)); setBx(bxPrim3, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_HOTKEY)); setBx(bxSec3, "shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_HOTKEY)); setBx(bxTer3, "shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_HOTKEY)); setBx(bxPrim4, "shortcut.groups."+(Shortcut.GROUPS_DEFAULT+Shortcut.GROUP_LAYER)); setBx(bxSec4, "shortcut.groups."+(Shortcut.GROUPS_ALT1 +Shortcut.GROUP_LAYER)); setBx(bxTer4, "shortcut.groups."+(Shortcut.GROUPS_ALT2 +Shortcut.GROUP_LAYER)); } private void setBx(javax.swing.JComboBox bx, String key) { int target = Main.pref.getInteger(key, -1); for (int i = 0; i < modifInts.length; i++) { if (modifInts[i] == target) { bx.setSelectedIndex(i); } } } private javax.swing.JComboBox bxPrim1; private javax.swing.JComboBox bxPrim2; private javax.swing.JComboBox bxPrim3; private javax.swing.JComboBox bxPrim4; private javax.swing.JComboBox bxSec1; private javax.swing.JComboBox bxSec2; private javax.swing.JComboBox bxSec3; private javax.swing.JComboBox bxSec4; private javax.swing.JComboBox bxTer1; private javax.swing.JComboBox bxTer2; private javax.swing.JComboBox bxTer3; private javax.swing.JComboBox bxTer4; private javax.swing.JCheckBox cbAlt; private javax.swing.JCheckBox cbCtrl; private javax.swing.JCheckBox cbDefault; private javax.swing.JCheckBox cbDisable; private javax.swing.JCheckBox cbMeta; private javax.swing.JCheckBox cbShift; private javax.swing.JPanel editGroupPane; private javax.swing.JPanel hotkeyGroupPane; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel12; private javax.swing.JLabel jLabel13; private javax.swing.JLabel jLabel14; private javax.swing.JLabel jLabel15; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; private javax.swing.JPanel listPane; private javax.swing.JScrollPane listScrollPane; private javax.swing.JPanel menuGroupPane; private javax.swing.JPanel modifierTab; private javax.swing.JTabbedPane prefTabPane; private javax.swing.JPanel shortcutEditPane; private javax.swing.JPanel shortcutTab; private javax.swing.JTable shortcutTable; private javax.swing.JPanel subwindowGroupPane; private javax.swing.JComboBox tfKey; private javax.swing.JLabel tfKeyLabel; private javax.swing.JPanel infoTab; }