/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 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 javax.swing.event.*; import net.java.sip.communicator.plugin.keybindingchooser.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.globalshortcut.*; import net.java.sip.communicator.service.keybindings.*; import net.java.sip.communicator.util.*; /** * This ConfigurationForm shows the list of global shortcut * * @author Sebastien Vincent */ public class GlobalShortcutConfigForm extends TransparentPanel implements ListSelectionListener { /** * Serial version UID. */ private static final long serialVersionUID = 0L; /** * The logger for this class. */ private static Logger logger = Logger.getLogger( GlobalShortcutConfigForm.class); /** * Displays the registered shortcuts. */ private JTable shortcutsTable = new JTable(); /** * Contains the shortcutsTable. */ private JScrollPane scrollPane = new JScrollPane(); /** * Contains listPanel. */ private JPanel mainPanel = this; /** * Model for the shortcutsTable */ private GlobalShortcutTableModel tableModel = new GlobalShortcutTableModel(); /** * Constructor */ public GlobalShortcutConfigForm() { super(new BorderLayout()); logger.trace("New global shortcut configuration form."); this.initComponents(); } /** * Initialize the swing components. */ private void initComponents() { shortcutsTable.setRowHeight(22); shortcutsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); shortcutsTable.setShowHorizontalLines(false); shortcutsTable.setShowVerticalLines(false); shortcutsTable.setModel(tableModel); shortcutsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); shortcutsTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount() >= 2) { int row = GlobalShortcutConfigForm.this.shortcutsTable. getSelectedRow(); GlobalShortcutEntry en = GlobalShortcutConfigForm.this.tableModel. getEntryAt(row); List<AWTKeyStroke> kss = new ArrayList<AWTKeyStroke>(); GlobalShortcutDialog dialog = new GlobalShortcutDialog((Dialog) GlobalShortcutConfigForm.this.getTopLevelAncestor(), en); kss.add(en.getShortcut()); kss.add(en.getShortcut2()); KeybindingChooserActivator.getGlobalShortcutService(). setEnable(false); int ret = dialog.showDialog(); if(ret == 1) { // ok button clicked kss = new ArrayList<AWTKeyStroke>(); List<GlobalShortcutEntry> lst = tableModel.getEntries(); for(GlobalShortcutEntry ee : lst) { boolean isEntry = (ee == en); AWTKeyStroke s1 = isEntry ? null : ee.getShortcut(); AWTKeyStroke s2 = isEntry ? null : ee.getShortcut2(); if(s1 != null && en.getShortcut() != null && s1.getKeyCode() == en.getShortcut(). getKeyCode() && s1.getModifiers() == en.getShortcut(). getModifiers()) { kss.add(null); kss.add(ee.getShortcut2()); ee.setShortcuts(kss); break; } else if(s2 != null && en.getShortcut2() != null && s2.getKeyCode() == en.getShortcut2(). getKeyCode() && s2.getModifiers() == en.getShortcut2(). getModifiers()) { kss.add(ee.getShortcut()); kss.add(null); ee.setShortcuts(kss); break; } } KeybindingChooserActivator.getGlobalShortcutService(). setEnable(true); GlobalShortcutConfigForm.this.saveConfig(); GlobalShortcutConfigForm.this.refresh(); KeybindingChooserActivator.getGlobalShortcutService(). setEnable(true); } else { en.setShortcuts(kss); } } } }); scrollPane.getViewport().add(this.shortcutsTable); mainPanel.add(this.scrollPane, BorderLayout.CENTER); mainPanel.setPreferredSize(new Dimension(500, 400)); shortcutsTable.getSelectionModel().addListSelectionListener(this); loadConfig(); } /** * Loads configuration. */ private void loadConfig() { KeybindingsService keybindingService = KeybindingChooserActivator.getKeybindingsService(); GlobalKeybindingSet set = keybindingService.getGlobalBindings(); for(Map.Entry<String, List<AWTKeyStroke>> entry : set.getBindings().entrySet()) { String key = entry.getKey(); List<AWTKeyStroke> kss = entry.getValue(); GlobalShortcutEntry gke = null; String desc = null; if(key.equals("answer")) { desc = Resources.getString( "plugin.keybindings.globalchooser.ANSWER_CALL"); } else if(key.equals("hangup")) { desc = Resources.getString( "plugin.keybindings.globalchooser.HANGUP_CALL"); } else if(key.equals("answer_hangup")) { desc = Resources.getString( "plugin.keybindings.globalchooser.ANSWER_HANGUP_CALL"); } else if(key.equals("contactlist")) { desc = Resources.getString( "plugin.keybindings.globalchooser.SHOW_CONTACTLIST"); } else if(key.equals("mute")) { desc = Resources.getString( "plugin.keybindings.globalchooser.MUTE_CALLS"); } else if(key.equals("push_to_talk")) { desc = Resources.getString( "plugin.keybindings.globalchooser.PUSH_TO_TALK"); } else continue; gke = new GlobalShortcutEntry(desc, kss); tableModel.addEntry(gke); } refresh(); } /** * Save configuration. */ public void saveConfig() { KeybindingsService keybindingService = KeybindingChooserActivator.getKeybindingsService(); GlobalShortcutService globalShortcutService = KeybindingChooserActivator.getGlobalShortcutService(); GlobalKeybindingSet globalBindingSet = keybindingService.getGlobalBindings(); Map<String, List<AWTKeyStroke>> gBindings = globalBindingSet.getBindings(); List<GlobalShortcutEntry> entries = tableModel.getEntries(); List<AWTKeyStroke> kss = null; for(GlobalShortcutEntry entry : entries) { String desc = null; if(entry.getAction().equals(Resources.getString( "plugin.keybindings.globalchooser.ANSWER_CALL"))) { desc = "answer"; } else if(entry.getAction().equals(Resources.getString( "plugin.keybindings.globalchooser.HANGUP_CALL"))) { desc = "hangup"; } else if(entry.getAction().equals(Resources.getString( "plugin.keybindings.globalchooser.ANSWER_HANGUP_CALL"))) { desc = "answer_hangup"; } else if(entry.getAction().equals(Resources.getString( "plugin.keybindings.globalchooser.SHOW_CONTACTLIST"))) { desc = "contactlist"; } else if(entry.getAction().equals(Resources.getString( "plugin.keybindings.globalchooser.MUTE_CALLS"))) { desc = "mute"; } else if(entry.getAction().equals(Resources.getString( "plugin.keybindings.globalchooser.PUSH_TO_TALK"))) { desc = "push_to_talk"; } else continue; kss = gBindings.get(desc); kss.clear(); kss.add(entry.getShortcut()); kss.add(entry.getShortcut2()); gBindings.put(desc, kss); } // save in configuration and reload the global shortcuts keybindingService.saveGlobalShortcutFromConfiguration(); globalShortcutService.reloadGlobalShortcuts(); } /** * Required by ListSelectionListener. * * @param e event triggered */ public void valueChanged(ListSelectionEvent e) { } /** * refreshes the table display */ private void refresh() { tableModel.fireTableStructureChanged(); } /** * Indicates if this is an advanced configuration form. * @return <tt>true</tt> if this is an advanced configuration form, * otherwise it returns <tt>false</tt> */ public boolean isAdvanced() { return true; } }