aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/sip/communicator/plugin/keybindingchooser
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/java/sip/communicator/plugin/keybindingchooser')
-rw-r--r--src/net/java/sip/communicator/plugin/keybindingchooser/chooser/BindingChooser.java44
-rw-r--r--src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java974
2 files changed, 490 insertions, 528 deletions
diff --git a/src/net/java/sip/communicator/plugin/keybindingchooser/chooser/BindingChooser.java b/src/net/java/sip/communicator/plugin/keybindingchooser/chooser/BindingChooser.java
index bd8ff0d..12ba3e2 100644
--- a/src/net/java/sip/communicator/plugin/keybindingchooser/chooser/BindingChooser.java
+++ b/src/net/java/sip/communicator/plugin/keybindingchooser/chooser/BindingChooser.java
@@ -24,6 +24,7 @@ import java.util.*;
import javax.swing.*;
import net.java.sip.communicator.plugin.desktoputil.*;
+import net.java.sip.communicator.plugin.keybindingchooser.KeybindingChooserActivator;
import net.java.sip.communicator.service.keybindings.*;
/**
@@ -51,36 +52,12 @@ public class BindingChooser
// can be selected
private BindingEntry selectedEntry = null; // None selected when null
- private String selectedText = "Press shortcut...";
-
/**
* Keybinding set.
*/
private KeybindingSet set = null;
/**
- * Displays a dialog allowing the user to redefine the keystroke component
- * of key bindings. The top has light blue labels describing the fields and
- * the bottom provides an 'OK' and 'Cancel' option. This uses the default
- * color scheme and indent style. If no entries are selected then the enter
- * key is equivalent to pressing 'OK' and escape is the same as 'Cancel'.
- *
- * @param parent frame to which to apply modal property and center within
- * (centers within screen if null)
- * @param bindings initial mapping of keystrokes to their actions
- * @return redefined mapping of keystrokes to their actions, null if cancel
- * is pressed
- */
- public static LinkedHashMap<KeyStroke, String> showDialog(Component parent,
- Map<KeyStroke, String> bindings)
- {
- BindingChooser display = new BindingChooser();
- display.putAllBindings(bindings);
- return showDialog(parent, display, "Key Bindings", true, display
- .makeAdaptor());
- }
-
- /**
* Adds a collection of new key binding mappings to the end of the listing.
* If any shortcuts are already contained then the previous entries are
* replaced (not triggering the onUpdate method). Disabled shortcuts trigger
@@ -269,22 +246,6 @@ public class BindingChooser
}
/**
- * Sets the message of the selected shortcut field when awaiting user input.
- * By default this is "Press shortcut...".
- *
- * @param message prompt for user input
- */
- public void setSelectedText(String message)
- {
- if (this.selectedEntry != null)
- {
- this.selectedEntry.getField(BindingEntry.Field.SHORTCUT).setText(
- message);
- }
- this.selectedText = message;
- }
-
- /**
* Returns if a binding is currently awaiting input or not.
*
* @return true if a binding is awaiting input, false otherwise
@@ -344,7 +305,8 @@ public class BindingChooser
onUpdate(getBindingIndex(this.selectedEntry), this.selectedEntry,
false);
this.selectedEntry.getField(BindingEntry.Field.SHORTCUT).setText(
- " " + this.selectedText);
+ KeybindingChooserActivator.getResources().getI18NString(
+ "plugin.keybindings.WAITING"));
}
}
diff --git a/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java
index aab01c5..1e9f83f 100644
--- a/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java
+++ b/src/net/java/sip/communicator/plugin/keybindingchooser/globalchooser/GlobalShortcutDialog.java
@@ -1,4 +1,4 @@
-/*
+/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
@@ -15,489 +15,489 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package net.java.sip.communicator.plugin.keybindingchooser.globalchooser;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.util.*;
-import java.util.List;
-
-import javax.swing.*;
-
-import net.java.sip.communicator.plugin.keybindingchooser.*;
-import net.java.sip.communicator.plugin.desktoputil.*;
-import net.java.sip.communicator.plugin.desktoputil.plaf.*;
-import net.java.sip.communicator.service.globalshortcut.*;
-import net.java.sip.communicator.util.skin.*;
-
-import org.jitsi.util.*;
-// disambiguation
-
-/**
- * Dialog to choose the shortcut.
- *
- * @author Sebastien Vincent
- */
-public class GlobalShortcutDialog
- extends SIPCommDialog
- implements ActionListener,
- GlobalShortcutListener
-{
- /**
- * Serial version UID.
- */
- private static final long serialVersionUID = 0L;
-
- /**
- * Text displayed when no shortcut is configured.
- */
- private static final String PRESS_TO_SETUP_SHORTCUT =
- Resources.getString("plugin.keybindings.globalchooser.PRESS_BTN");
-
- /**
- * The global shortcut entry.
- */
- private final GlobalShortcutEntry entry;
-
- /**
- * OK button.
- */
- private final JButton btnOK = new JButton(
- Resources.getString("service.gui.OK"));
-
- /**
- * Cancel button.
- */
- private final JButton btnCancel = new JButton(
- Resources.getString("service.gui.CANCEL"));
-
- /**
- * Enable or not special key for shortcut.
- */
- private final JCheckBox specialBox = new SIPCommCheckBox(
- Resources.getString("plugin.keybindings.globalchooser.ENABLE_SPECIAL"));
-
- /**
- * First shortcut field.
- */
- private final ShortcutField fldShortcut = new ShortcutField(
- PRESS_TO_SETUP_SHORTCUT);
-
- /**
- * Secondary shortcut field.
- */
- private final ShortcutField fldShortcut2 = new ShortcutField(
- PRESS_TO_SETUP_SHORTCUT);
-
- /**
- * Return code.
- */
- private int retCode = 0;
-
- /**
- * Constructor.
- *
- * @param dialog root dialog
- * @param entry the global shortcut entry
- */
- public GlobalShortcutDialog(Dialog dialog, GlobalShortcutEntry entry)
- {
- super(dialog);
-
- setModal(true);
- setTitle("Global shortcut: " + entry.getAction());
- this.entry = entry;
- init();
- }
-
- /**
- * Initialize components.
- */
- private void init()
- {
- TransparentPanel mainPanel = new TransparentPanel(new BorderLayout());
- JPanel btnPanel = new TransparentPanel(
- new FlowLayout(FlowLayout.RIGHT));
- JPanel shortcutPanel = new TransparentPanel(
- new GridLayout(0, 2, 0, 10));
-
- btnOK.addActionListener(this);
- btnCancel.addActionListener(this);
-
- KeyAdapter keyAdapter = new KeyAdapter()
- {
- private KeyEvent buffer = null;
-
- @Override
- public void keyPressed(KeyEvent event)
- {
- if(event.getKeyCode() == KeyEvent.VK_ESCAPE)
- {
- SIPCommTextField field =
- (SIPCommTextField)event.getSource();
-
- AWTKeyStroke ks = null;
-
- if(field == fldShortcut)
- {
- ks = entry.getShortcut();
- }
- else if(field == fldShortcut2)
- {
- ks = entry.getShortcut2();
- }
-
- if(ks == null)
- field.setText(PRESS_TO_SETUP_SHORTCUT);
- else
- {
-
- if(ks.getModifiers() ==
- GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
- {
- field.setText("Special");
- }
- else
- {
- field.setText(GlobalShortcutEntry.getShortcutText(
- entry.getShortcut()));
- }
- }
- btnOK.requestFocusInWindow();
- return;
- }
-
- if(event.getKeyCode() == 0)
- return;
-
- // Reports KEY_PRESSED events on release to support modifiers
- this.buffer = event;
- }
-
- @Override
- public void keyReleased(KeyEvent event)
- {
- if (buffer != null)
- {
- SIPCommTextField field =
- (SIPCommTextField)event.getSource();
- AWTKeyStroke input = KeyStroke.getKeyStrokeForEvent(buffer);
- buffer = null;
-
- GlobalShortcutEntry en = entry;
- List<AWTKeyStroke> kss = new ArrayList<AWTKeyStroke>();
-
- if(field == fldShortcut)
- {
- kss.add(input);
- kss.add(en.getShortcut2());
- }
- else if(field == fldShortcut2)
- {
- kss.add(en.getShortcut());
- kss.add(input);
- }
-
- en.setShortcuts(kss);
- en.setEditShortcut1(false);
- en.setEditShortcut2(false);
- field.setText(GlobalShortcutEntry.getShortcutText(
- input));
- btnOK.requestFocus();
- }
- }
- };
-
- AWTKeyStroke ks = entry.getShortcut();
- AWTKeyStroke ks2 = entry.getShortcut2();
-
- if(ks != null)
- {
- if(ks.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
- {
- fldShortcut.setText(GlobalShortcutEntry.getShortcutText(ks));
- }
- else
- {
- fldShortcut.setText("Special");
- }
- }
-
- if(ks2 != null)
- {
-
- if(ks2.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
- {
- fldShortcut2.setText(GlobalShortcutEntry.getShortcutText(ks2));
- }
- else
- {
- fldShortcut2.setText("Special");
- }
- }
-
- fldShortcut.addKeyListener(keyAdapter);
- fldShortcut2.addKeyListener(keyAdapter);
-
- specialBox.addItemListener(new ItemListener()
- {
- public void itemStateChanged(ItemEvent evt)
- {
- KeybindingChooserActivator.getGlobalShortcutService().
- setSpecialKeyDetection(
- (evt.getStateChange() == ItemEvent.SELECTED),
- GlobalShortcutDialog.this);
- }
- });
-
- shortcutPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10,
- 10));
- shortcutPanel.add(new JLabel("Primary shortcut"));
- shortcutPanel.add(fldShortcut);
- shortcutPanel.add(new JLabel("Secondary shortcut"));
- shortcutPanel.add(fldShortcut2);
-
- if(OSUtils.IS_WINDOWS)
- {
- shortcutPanel.add(new TransparentPanel());
- shortcutPanel.add(specialBox);
- }
-
- mainPanel.add(shortcutPanel, BorderLayout.CENTER);
-
- btnPanel.add(btnOK);
- btnPanel.add(btnCancel);
- mainPanel.add(btnPanel, BorderLayout.SOUTH);
-
- btnOK.requestFocus();
-
- getContentPane().add(mainPanel);
- pack();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void close(boolean isEscaped)
- {
- super.close(isEscaped);
- KeybindingChooserActivator.getGlobalShortcutService().
- setSpecialKeyDetection(false, this);
- }
-
- /**
- * Show the dialog and returns if the user has modified something (create
- * or modify entry).
- *
- * @return true if the user has modified something (create
- * or modify entry), false otherwise.
- */
- public int showDialog()
- {
- setVisible(true);
-
- // as the dialog is modal, wait for OK/Cancel button retCode
- setVisible(false);
- return retCode;
- }
-
- /**
- * {@inheritDoc}
- */
- public void actionPerformed(ActionEvent evt)
- {
- Object obj = evt.getSource();
-
- if(obj == btnOK)
- {
- retCode = 1;
- dispose();
- }
- else if(obj == btnCancel)
- {
- retCode = 0;
- dispose();
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void shortcutReceived(GlobalShortcutEvent evt)
- {
- AWTKeyStroke ksr = evt.getKeyStroke();
-
- if(ksr.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
- {
- return;
- }
-
- if(!fldShortcut.isFocusOwner() && !fldShortcut2.isFocusOwner())
- return;
-
- List<AWTKeyStroke> kss = new ArrayList<AWTKeyStroke>();
-
- if(fldShortcut.isFocusOwner())
- {
- kss.add(ksr);
- kss.add(entry.getShortcut2());
- fldShortcut.setText("Special");
- }
- else if(fldShortcut2.isFocusOwner())
- {
- kss.add(entry.getShortcut());
- kss.add(ksr);
- fldShortcut2.setText("Special");
- }
- entry.setShortcuts(kss);
- KeybindingChooserActivator.getGlobalShortcutService().
- setSpecialKeyDetection(false, this);
- }
-
- /**
- * Clear the text field.
- *
- * @param ui <tt>TextFieldUI</tt> to clear
- */
- public void clearTextField(SIPCommTextFieldUI ui)
- {
- List<AWTKeyStroke> kss = new ArrayList<AWTKeyStroke>();
-
- if(ui == fldShortcut.getUI())
- {
- kss.add(null);
- kss.add(entry.getShortcut2());
- entry.setShortcuts(kss);
- btnOK.requestFocusInWindow();
- }
- else if(ui == fldShortcut2.getUI())
- {
- kss.add(entry.getShortcut());
- kss.add(null);
- entry.setShortcuts(kss);
- btnOK.requestFocusInWindow();
- }
- }
-
- /**
- * A custom call field.
- */
- private class ShortcutField
- extends SIPCommTextField
- implements Skinnable
- {
- /**
- * Serial version UID.
- */
- private static final long serialVersionUID = 0L;
-
- /**
- * The text field ui.
- */
- private ShortcutFieldUI textFieldUI;
-
- /**
- * Creates an instance of the <tt>CallField</tt>.
- *
- * @param text
- */
- public ShortcutField(String text)
- {
- super(text);
-
- textFieldUI = new ShortcutFieldUI();
- textFieldUI.setDeleteButtonEnabled(true);
-
- this.setPreferredSize(new Dimension(200, 23));
- this.setUI(textFieldUI);
- this.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
- this.setOpaque(false);
-
- this.setDragEnabled(true);
-
- loadSkin();
- }
-
- /**
- * Reloads text field UI defs.
- */
- public void loadSkin()
- {
- textFieldUI.loadSkin();
- }
- }
-
- /**
- * A custom text field UI.
- */
- public class ShortcutFieldUI
- extends SIPCommTextFieldUI
- implements Skinnable
- {
- /**
- * Creates a <tt>SIPCommTextFieldUI</tt>.
- */
- public ShortcutFieldUI()
- {
- loadSkin();
- }
-
- /**
- * Adds the custom mouse listeners defined in this class to the installed
- * listeners.
- */
- @Override
- protected void installListeners()
- {
- super.installListeners();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void updateDeleteIcon(MouseEvent evt)
- {
- super.updateDeleteIcon(evt);
-
- Rectangle deleteRect = getDeleteButtonRect();
- if(deleteRect.contains(evt.getX(), evt.getY()) &&
- evt.getID() == MouseEvent.MOUSE_CLICKED)
- {
- clearTextField(this);
- }
- }
-
- /**
- * Implements parent paintSafely method and enables antialiasing.
- * @param g the <tt>Graphics</tt> object that notified us
- */
- @Override
- protected void paintSafely(Graphics g)
- {
- customPaintBackground(g);
- super.paintSafely(g);
- }
-
- /**
- * Paints the background of the associated component.
- * @param g the <tt>Graphics</tt> object used for painting
- */
- @Override
- protected void customPaintBackground(Graphics g)
- {
- Graphics2D g2 = (Graphics2D) g.create();
-
- try
- {
- AntialiasingManager.activateAntialiasing(g2);
- super.customPaintBackground(g2);
- }
- finally
- {
- g2.dispose();
- }
- }
- }
-}
+package net.java.sip.communicator.plugin.keybindingchooser.globalchooser;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import java.util.List;
+
+import javax.swing.*;
+
+import net.java.sip.communicator.plugin.keybindingchooser.*;
+import net.java.sip.communicator.plugin.desktoputil.*;
+import net.java.sip.communicator.plugin.desktoputil.plaf.*;
+import net.java.sip.communicator.service.globalshortcut.*;
+import net.java.sip.communicator.util.skin.*;
+
+import org.jitsi.util.*;
+// disambiguation
+
+/**
+ * Dialog to choose the shortcut.
+ *
+ * @author Sebastien Vincent
+ */
+public class GlobalShortcutDialog
+ extends SIPCommDialog
+ implements ActionListener,
+ GlobalShortcutListener
+{
+ /**
+ * Serial version UID.
+ */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * Text displayed when no shortcut is configured.
+ */
+ private static final String PRESS_TO_SETUP_SHORTCUT =
+ Resources.getString("plugin.keybindings.globalchooser.PRESS_BTN");
+
+ /**
+ * The global shortcut entry.
+ */
+ private final GlobalShortcutEntry entry;
+
+ /**
+ * OK button.
+ */
+ private final JButton btnOK = new JButton(
+ Resources.getString("service.gui.OK"));
+
+ /**
+ * Cancel button.
+ */
+ private final JButton btnCancel = new JButton(
+ Resources.getString("service.gui.CANCEL"));
+
+ /**
+ * Enable or not special key for shortcut.
+ */
+ private final JCheckBox specialBox = new SIPCommCheckBox(
+ Resources.getString("plugin.keybindings.globalchooser.ENABLE_SPECIAL"));
+
+ /**
+ * First shortcut field.
+ */
+ private final ShortcutField fldShortcut = new ShortcutField(
+ PRESS_TO_SETUP_SHORTCUT);
+
+ /**
+ * Secondary shortcut field.
+ */
+ private final ShortcutField fldShortcut2 = new ShortcutField(
+ PRESS_TO_SETUP_SHORTCUT);
+
+ /**
+ * Return code.
+ */
+ private int retCode = 0;
+
+ /**
+ * Constructor.
+ *
+ * @param dialog root dialog
+ * @param entry the global shortcut entry
+ */
+ public GlobalShortcutDialog(Dialog dialog, GlobalShortcutEntry entry)
+ {
+ super(dialog);
+
+ setModal(true);
+ setTitle("Global shortcut: " + entry.getAction());
+ this.entry = entry;
+ init();
+ }
+
+ /**
+ * Initialize components.
+ */
+ private void init()
+ {
+ TransparentPanel mainPanel = new TransparentPanel(new BorderLayout());
+ JPanel btnPanel = new TransparentPanel(
+ new FlowLayout(FlowLayout.RIGHT));
+ JPanel shortcutPanel = new TransparentPanel(
+ new GridLayout(0, 2, 0, 10));
+
+ btnOK.addActionListener(this);
+ btnCancel.addActionListener(this);
+
+ KeyAdapter keyAdapter = new KeyAdapter()
+ {
+ private KeyEvent buffer = null;
+
+ @Override
+ public void keyPressed(KeyEvent event)
+ {
+ if(event.getKeyCode() == KeyEvent.VK_ESCAPE)
+ {
+ SIPCommTextField field =
+ (SIPCommTextField)event.getSource();
+
+ AWTKeyStroke ks = null;
+
+ if(field == fldShortcut)
+ {
+ ks = entry.getShortcut();
+ }
+ else if(field == fldShortcut2)
+ {
+ ks = entry.getShortcut2();
+ }
+
+ if(ks == null)
+ field.setText(PRESS_TO_SETUP_SHORTCUT);
+ else
+ {
+
+ if(ks.getModifiers() ==
+ GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
+ {
+ field.setText("Special");
+ }
+ else
+ {
+ field.setText(GlobalShortcutEntry.getShortcutText(
+ entry.getShortcut()));
+ }
+ }
+ btnOK.requestFocusInWindow();
+ return;
+ }
+
+ if(event.getKeyCode() == 0)
+ return;
+
+ // Reports KEY_PRESSED events on release to support modifiers
+ this.buffer = event;
+ }
+
+ @Override
+ public void keyReleased(KeyEvent event)
+ {
+ if (buffer != null)
+ {
+ SIPCommTextField field =
+ (SIPCommTextField)event.getSource();
+ AWTKeyStroke input = KeyStroke.getKeyStrokeForEvent(buffer);
+ buffer = null;
+
+ GlobalShortcutEntry en = entry;
+ List<AWTKeyStroke> kss = new ArrayList<AWTKeyStroke>();
+
+ if(field == fldShortcut)
+ {
+ kss.add(input);
+ kss.add(en.getShortcut2());
+ }
+ else if(field == fldShortcut2)
+ {
+ kss.add(en.getShortcut());
+ kss.add(input);
+ }
+
+ en.setShortcuts(kss);
+ en.setEditShortcut1(false);
+ en.setEditShortcut2(false);
+ field.setText(GlobalShortcutEntry.getShortcutText(
+ input));
+ btnOK.requestFocus();
+ }
+ }
+ };
+
+ AWTKeyStroke ks = entry.getShortcut();
+ AWTKeyStroke ks2 = entry.getShortcut2();
+
+ if(ks != null)
+ {
+ if(ks.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
+ {
+ fldShortcut.setText(GlobalShortcutEntry.getShortcutText(ks));
+ }
+ else
+ {
+ fldShortcut.setText("Special");
+ }
+ }
+
+ if(ks2 != null)
+ {
+
+ if(ks2.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
+ {
+ fldShortcut2.setText(GlobalShortcutEntry.getShortcutText(ks2));
+ }
+ else
+ {
+ fldShortcut2.setText("Special");
+ }
+ }
+
+ fldShortcut.addKeyListener(keyAdapter);
+ fldShortcut2.addKeyListener(keyAdapter);
+
+ specialBox.addItemListener(new ItemListener()
+ {
+ public void itemStateChanged(ItemEvent evt)
+ {
+ KeybindingChooserActivator.getGlobalShortcutService().
+ setSpecialKeyDetection(
+ (evt.getStateChange() == ItemEvent.SELECTED),
+ GlobalShortcutDialog.this);
+ }
+ });
+
+ shortcutPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10,
+ 10));
+ shortcutPanel.add(new JLabel("Primary shortcut"));
+ shortcutPanel.add(fldShortcut);
+ shortcutPanel.add(new JLabel("Secondary shortcut"));
+ shortcutPanel.add(fldShortcut2);
+
+ if(OSUtils.IS_WINDOWS)
+ {
+ shortcutPanel.add(new TransparentPanel());
+ shortcutPanel.add(specialBox);
+ }
+
+ mainPanel.add(shortcutPanel, BorderLayout.CENTER);
+
+ btnPanel.add(btnOK);
+ btnPanel.add(btnCancel);
+ mainPanel.add(btnPanel, BorderLayout.SOUTH);
+
+ btnOK.requestFocus();
+
+ getContentPane().add(mainPanel);
+ pack();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void close(boolean isEscaped)
+ {
+ super.close(isEscaped);
+ KeybindingChooserActivator.getGlobalShortcutService().
+ setSpecialKeyDetection(false, this);
+ }
+
+ /**
+ * Show the dialog and returns if the user has modified something (create
+ * or modify entry).
+ *
+ * @return true if the user has modified something (create
+ * or modify entry), false otherwise.
+ */
+ public int showDialog()
+ {
+ setVisible(true);
+
+ // as the dialog is modal, wait for OK/Cancel button retCode
+ setVisible(false);
+ return retCode;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void actionPerformed(ActionEvent evt)
+ {
+ Object obj = evt.getSource();
+
+ if(obj == btnOK)
+ {
+ retCode = 1;
+ dispose();
+ }
+ else if(obj == btnCancel)
+ {
+ retCode = 0;
+ dispose();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void shortcutReceived(GlobalShortcutEvent evt)
+ {
+ AWTKeyStroke ksr = evt.getKeyStroke();
+
+ if(ksr.getModifiers() != GlobalShortcutService.SPECIAL_KEY_MODIFIERS)
+ {
+ return;
+ }
+
+ if(!fldShortcut.isFocusOwner() && !fldShortcut2.isFocusOwner())
+ return;
+
+ List<AWTKeyStroke> kss = new ArrayList<AWTKeyStroke>();
+
+ if(fldShortcut.isFocusOwner())
+ {
+ kss.add(ksr);
+ kss.add(entry.getShortcut2());
+ fldShortcut.setText("Special");
+ }
+ else if(fldShortcut2.isFocusOwner())
+ {
+ kss.add(entry.getShortcut());
+ kss.add(ksr);
+ fldShortcut2.setText("Special");
+ }
+ entry.setShortcuts(kss);
+ KeybindingChooserActivator.getGlobalShortcutService().
+ setSpecialKeyDetection(false, this);
+ }
+
+ /**
+ * Clear the text field.
+ *
+ * @param ui <tt>TextFieldUI</tt> to clear
+ */
+ public void clearTextField(SIPCommTextFieldUI ui)
+ {
+ List<AWTKeyStroke> kss = new ArrayList<AWTKeyStroke>();
+
+ if(ui == fldShortcut.getUI())
+ {
+ kss.add(null);
+ kss.add(entry.getShortcut2());
+ entry.setShortcuts(kss);
+ btnOK.requestFocusInWindow();
+ }
+ else if(ui == fldShortcut2.getUI())
+ {
+ kss.add(entry.getShortcut());
+ kss.add(null);
+ entry.setShortcuts(kss);
+ btnOK.requestFocusInWindow();
+ }
+ }
+
+ /**
+ * A custom call field.
+ */
+ private class ShortcutField
+ extends SIPCommTextField
+ implements Skinnable
+ {
+ /**
+ * Serial version UID.
+ */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * The text field ui.
+ */
+ private ShortcutFieldUI textFieldUI;
+
+ /**
+ * Creates an instance of the <tt>CallField</tt>.
+ *
+ * @param text
+ */
+ public ShortcutField(String text)
+ {
+ super(text);
+
+ textFieldUI = new ShortcutFieldUI();
+ textFieldUI.setDeleteButtonEnabled(true);
+
+ this.setPreferredSize(new Dimension(200, 23));
+ this.setUI(textFieldUI);
+ this.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
+ this.setOpaque(false);
+
+ this.setDragEnabled(true);
+
+ loadSkin();
+ }
+
+ /**
+ * Reloads text field UI defs.
+ */
+ public void loadSkin()
+ {
+ textFieldUI.loadSkin();
+ }
+ }
+
+ /**
+ * A custom text field UI.
+ */
+ public class ShortcutFieldUI
+ extends SIPCommTextFieldUI
+ implements Skinnable
+ {
+ /**
+ * Creates a <tt>SIPCommTextFieldUI</tt>.
+ */
+ public ShortcutFieldUI()
+ {
+ loadSkin();
+ }
+
+ /**
+ * Adds the custom mouse listeners defined in this class to the installed
+ * listeners.
+ */
+ @Override
+ protected void installListeners()
+ {
+ super.installListeners();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void updateDeleteIcon(MouseEvent evt)
+ {
+ super.updateDeleteIcon(evt);
+
+ Rectangle deleteRect = getDeleteButtonRect();
+ if(deleteRect.contains(evt.getX(), evt.getY()) &&
+ evt.getID() == MouseEvent.MOUSE_CLICKED)
+ {
+ clearTextField(this);
+ }
+ }
+
+ /**
+ * Implements parent paintSafely method and enables antialiasing.
+ * @param g the <tt>Graphics</tt> object that notified us
+ */
+ @Override
+ protected void paintSafely(Graphics g)
+ {
+ customPaintBackground(g);
+ super.paintSafely(g);
+ }
+
+ /**
+ * Paints the background of the associated component.
+ * @param g the <tt>Graphics</tt> object used for painting
+ */
+ @Override
+ protected void customPaintBackground(Graphics g)
+ {
+ Graphics2D g2 = (Graphics2D) g.create();
+
+ try
+ {
+ AntialiasingManager.activateAntialiasing(g2);
+ super.customPaintBackground(g2);
+ }
+ finally
+ {
+ g2.dispose();
+ }
+ }
+ }
+}