package call.gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import call.AbstractId; import call.Config; import call.Config.Option; import call.ConfigListener; import call.ContactList; import call.ContactScanner; import call.Id; public class MainMenu extends AbstractId implements ActionListener, ConfigListener { private static final String TEXT_MENU_CONNECTION = "Connection"; private static final String TEXT_MENUITEM_CONTACTS_RELOAD = "Reload contacts"; private static final String TEXT_MENUITEM_CONTACTS_ADD = "Add contact"; private static final String TEXT_MENU_VIEW = "View"; private static final String TEXT_MENUITEM_SHOW_CONSOLE = "Show terminal"; private static final String TEXT_MENU_SETTINGS = "Settings"; private static final String TEXT_MENUITEM_SETTINGS_AUDIO = "Audio Devices"; private static final String TEXT_MENU_HELP = "Help"; private static final String TEXT_MENUITEM_HELP_ABOUT = "About"; private final MainWindow main; private final JMenuBar menubar; private JMenuItem itemContactsAdd; private JMenuItem itemContactsReload; private JCheckBoxMenuItem checkboxShowConsole; private JMenuItem itemSettingsAudio; private JMenuItem itemHelpAbout; public MainMenu(MainWindow main) { this.main = main; menubar = new JMenuBar(); menubar.add(createContactsMenu()); menubar.add(createViewMenu()); menubar.add(createSettingsMenu()); menubar.add(createHelpMenu()); // config listener Config.addConfigListener(this); Config.notifyConfigListener(this); } private JMenu createContactsMenu() { JMenu menu = new JMenu(TEXT_MENU_CONNECTION); menu.setMnemonic(KeyEvent.VK_C); itemContactsAdd = new JMenuItem(TEXT_MENUITEM_CONTACTS_ADD, Resources.ICON_CONTACTS_ADD); itemContactsAdd.setMnemonic(KeyEvent.VK_A); itemContactsAdd.addActionListener(this); menu.add(itemContactsAdd); itemContactsReload = new JMenuItem(TEXT_MENUITEM_CONTACTS_RELOAD, Resources.ICON_CONTACTS_RELOAD); itemContactsReload.setMnemonic(KeyEvent.VK_R); itemContactsReload.addActionListener(this); menu.add(itemContactsReload); return menu; } private JMenu createViewMenu() { JMenu menu = new JMenu(TEXT_MENU_VIEW); menu.setMnemonic(KeyEvent.VK_V); checkboxShowConsole = new JCheckBoxMenuItem(TEXT_MENUITEM_SHOW_CONSOLE, Resources.ICON_CONSOLE); checkboxShowConsole.setMnemonic(KeyEvent.VK_O); checkboxShowConsole.addActionListener(this); menu.add(checkboxShowConsole); return menu; } private JMenu createSettingsMenu() { JMenu menu = new JMenu(TEXT_MENU_SETTINGS); menu.setMnemonic(KeyEvent.VK_S); itemSettingsAudio = new JMenuItem(TEXT_MENUITEM_SETTINGS_AUDIO, Resources.ICON_SETTINGS_AUDIO); itemSettingsAudio.setMnemonic(KeyEvent.VK_C); itemSettingsAudio.addActionListener(this); menu.add(itemSettingsAudio); return menu; } private JMenu createHelpMenu() { JMenu menu = new JMenu(TEXT_MENU_HELP); menu.setMnemonic(KeyEvent.VK_H); itemHelpAbout = new JMenuItem(TEXT_MENUITEM_HELP_ABOUT, Resources.ICON_HELP_ABOUT); itemHelpAbout.setMnemonic(KeyEvent.VK_R); itemHelpAbout.addActionListener(this); menu.add(itemHelpAbout); return menu; } public JMenuBar getJMenuBar() { return menubar; } @Override public String getId() { return "MainMenu"; } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof JMenuItem) { JMenuItem source = (JMenuItem) e.getSource(); new Thread(new MenuItemHandler(source), "MainMenu -> MenuItemHandler").start(); } } public class MenuItemHandler implements Runnable { private final JMenuItem source; public MenuItemHandler(JMenuItem source) { this.source = source; } @Override public void run() { switch (source.getText()) { case TEXT_MENUITEM_CONTACTS_RELOAD: ContactList.clear(); ContactScanner.scanNow(); break; case TEXT_MENUITEM_CONTACTS_ADD: String host = JOptionPane.showInputDialog(null, "Host name or IP address:", "", 1); if (host != null && host.length() > 0) { ContactScanner.addHostOfInterest(host); ContactScanner.scanNow(); } break; case TEXT_MENUITEM_SHOW_CONSOLE: JCheckBoxMenuItem checkbox = (JCheckBoxMenuItem) source; Config.SHOW_CONSOLE.setBooleanValue(checkbox.getState()); break; case TEXT_MENUITEM_SETTINGS_AUDIO: SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MainTabs tabs = main.getTabs(); SettingsAudioTab codecs = main.getCodecs(); tabs.addTab(Resources.TABNAME_SETTINGS_AUDIO, codecs.getComponent(), Resources.ICON_SETTINGS_AUDIO); tabs.showTab(Resources.TABNAME_SETTINGS_AUDIO); } }); break; case TEXT_MENUITEM_HELP_ABOUT: SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog( main.getWindow(), "This program is free software: you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation, either version 3 of the License, or\n" + "(at your option) any later version." + "\n\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details." + "\n\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program. If not, write to" + "\n\n" + " The Free Software Foundation, Inc.\n" + " 51 Franklin Street, Fifth Floor\n" + " Boston, MA 02110-1301 USA" , "About", JOptionPane.PLAIN_MESSAGE); } }); break; } } } @Override public void onConfigUpdate(Option option, float value) {} @Override public void onConfigUpdate(Option option, int value) {} @Override public void onConfigUpdate(Option option, boolean value) { if (option.equals(Config.SHOW_CONSOLE)) { if (value != checkboxShowConsole.getState()) checkboxShowConsole.setState(value); } } @Override public void onConfigUpdate(Option option, String value) {} @Override public void onConfigUpdate(Option option, Id value) {} }