/* * 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.impl.gui.main.menus; import java.awt.*; import java.awt.event.*; import java.lang.reflect.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.main.account.*; import net.java.sip.communicator.impl.gui.main.chatroomslist.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.main.contactlist.addgroup.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.muc.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.skin.*; import org.jitsi.service.resources.*; /** * The <tt>FileMenu</tt> is a menu in the main application menu bar that * contains "New account". * * @author Yana Stamcheva * @author Lubomir Marinov * @author Adam Netocny */ public class FileMenu extends SIPCommMenu implements ActionListener, Skinnable { /** * The <tt>Logger</tt> used by the <tt>FileMenu</tt> class and its instances * for logging output. */ private static final Logger logger = Logger.getLogger(FileMenu.class); private final Frame parentWindow; /** * Add new account menu item. */ private JMenuItem newAccountMenuItem; /** * Add new contact menu item. */ private JMenuItem addContactItem; /** * Create group menu item. */ private JMenuItem createGroupItem; /** * Chat rooms menu item. */ private JMenuItem myChatRoomsItem; /** * Close menu item. */ private JMenuItem closeMenuItem; /** * Indicates if this menu is shown for the chat window or the contact list * window. */ private boolean isChatMenu; /** * Creates an instance of <tt>FileMenu</tt>. * @param parentWindow The parent <tt>ChatWindow</tt>. */ public FileMenu(Frame parentWindow) { this(parentWindow, false); } /** * Creates an instance of <tt>FileMenu</tt>. * * @param parentWindow The parent <tt>ChatWindow</tt>. * @param isChatMenu indicates if this menu would be shown for a chat * window */ public FileMenu(Frame parentWindow, boolean isChatMenu) { super(GuiActivator.getResources().getI18NString("service.gui.FILE")); this.isChatMenu = isChatMenu; ResourceManagementService resources = GuiActivator.getResources(); createGroupItem = new JMenuItem( resources.getI18NString("service.gui.CREATE_GROUP")); myChatRoomsItem = new JMenuItem( resources.getI18NString("service.gui.MY_CHAT_ROOMS")); this.parentWindow = parentWindow; // whether the last item added was a separator boolean endsWithSeparator = false; if (ConfigurationUtils.isShowAccountConfig()) { newAccountMenuItem = new JMenuItem( resources.getI18NString("service.gui.NEW_ACCOUNT")); this.add(newAccountMenuItem); newAccountMenuItem.setName("newAccount"); newAccountMenuItem.addActionListener(this); newAccountMenuItem.setMnemonic(resources .getI18nMnemonic("service.gui.NEW_ACCOUNT")); // add separator only if there are other items enabled if(!ConfigurationUtils.isAddContactDisabled() || !ConfigurationUtils.isCreateGroupDisabled() || !ConfigurationUtils.isGoToChatroomDisabled()) { this.addSeparator(); endsWithSeparator = true; } } if (!isChatMenu && !ConfigurationUtils.isAddContactDisabled()) { addContactItem = new JMenuItem( resources.getI18NString("service.gui.ADD_CONTACT") + "..."); this.add(addContactItem); addContactItem.setName("addContact"); addContactItem.addActionListener(this); addContactItem.setMnemonic(resources .getI18nMnemonic("service.gui.ADD_CONTACT")); // if next item is disabled add separator here // only if there is something next if(ConfigurationUtils.isCreateGroupDisabled() && !ConfigurationUtils.isGoToChatroomDisabled()) { this.addSeparator(); endsWithSeparator = true; } else endsWithSeparator = false; } if (!isChatMenu && !ConfigurationUtils.isCreateGroupDisabled()) { this.add(createGroupItem); // add separator if there is something next if(!ConfigurationUtils.isGoToChatroomDisabled()) { this.addSeparator(); endsWithSeparator = true; } } if (!ConfigurationUtils.isGoToChatroomDisabled() && !GuiActivator.getConfigurationService() .getBoolean(MUCService.DISABLED_PROPERTY, false)) { this.add(myChatRoomsItem); endsWithSeparator = false; } registerCloseMenuItem(!endsWithSeparator); // All items are now instantiated and could safely load the skin. loadSkin(); //this.addContactItem.setIcon(new ImageIcon(ImageLoader // .getImage(ImageLoader.ADD_CONTACT_16x16_ICON))); createGroupItem.setName("createGroup"); myChatRoomsItem.setName("myChatRooms"); createGroupItem.addActionListener(this); myChatRoomsItem.addActionListener(this); this.setMnemonic(resources .getI18nMnemonic("service.gui.FILE")); createGroupItem.setMnemonic(resources .getI18nMnemonic("service.gui.CREATE_GROUP")); myChatRoomsItem.setMnemonic(resources .getI18nMnemonic("service.gui.MY_CHAT_ROOMS")); } /** * Loads icons. */ public void loadSkin() { if (newAccountMenuItem != null) newAccountMenuItem.setIcon( new ImageIcon(ImageLoader.getImage( ImageLoader.ADD_ACCOUNT_MENU_ICON))); if (addContactItem != null) addContactItem.setIcon( new ImageIcon(ImageLoader.getImage( ImageLoader.ADD_CONTACT_16x16_ICON))); createGroupItem.setIcon( new ImageIcon(ImageLoader.getImage( ImageLoader.GROUPS_16x16_ICON))); myChatRoomsItem.setIcon( new ImageIcon(ImageLoader.getImage( ImageLoader.CHAT_ROOM_MENU_ICON))); if(closeMenuItem != null) { closeMenuItem.setIcon( new ImageIcon(ImageLoader.getImage( ImageLoader.QUIT_16x16_ICON))); } } /** * Handles the <tt>ActionEvent</tt> when one of the menu items is selected. * @param e the <tt>ActionEvent</tt> that notified us */ public void actionPerformed(ActionEvent e) { JMenuItem menuItem = (JMenuItem) e.getSource(); String itemName = menuItem.getName(); if (itemName.equals("newAccount")) { NewAccountDialog.showNewAccountDialog(); } else if (itemName.equals("addContact")) { AddContactDialog dialog = new AddContactDialog(parentWindow); dialog.setVisible(true); } else if (itemName.equals("createGroup")) { CreateGroupDialog dialog = new CreateGroupDialog(parentWindow); dialog.setVisible(true); } else if (itemName.equals("close")) { closeActionPerformed(); } else if (itemName.equals("myChatRooms")) { ChatRoomTableDialog.showChatRoomTableDialog(); } } /** * Indicates that the close menu has been selected. */ void closeActionPerformed() { GuiActivator.getUIService().beginShutdown(); } /** * Registers the close menu item. * @param addSeparator whether we should add separator before the menu item. */ private void registerCloseMenuItem(boolean addSeparator) { UIService uiService = GuiActivator.getUIService(); if ((uiService == null) || !uiService.useMacOSXScreenMenuBar() || !registerCloseMenuItemMacOSX()) { registerCloseMenuItemNonMacOSX(addSeparator); } } /** * Registers the close menu item for the MacOSX platform. * @return <tt>true</tt> if the operation succeeded, <tt>false</tt> - * otherwise */ private boolean registerCloseMenuItemMacOSX() { return registerMenuItemMacOSX("Quit", this); } /** * Registers the close menu item for the MacOSX platform. * @param menuItemText the name of the item * @param userData the user data * @return <tt>true</tt> if the operation succeeded, <tt>false</tt> - * otherwise */ static boolean registerMenuItemMacOSX(String menuItemText, Object userData) { Exception exception = null; try { Class<?> clazz = Class.forName( "net.java.sip.communicator.impl.gui.main.menus.MacOSX" + menuItemText + "Registration"); Method method = clazz.getMethod("run", new Class[] { Object.class }); Object result = method.invoke(null, new Object[] { userData }); if (result instanceof Boolean) return (Boolean) result; } catch (ClassNotFoundException ex) { exception = ex; } catch (IllegalAccessException ex) { exception = ex; } catch (InvocationTargetException ex) { exception = ex; } catch (NoSuchMethodException ex) { exception = ex; } if (exception != null) logger.error("Failed to register Mac OS X-specific " + menuItemText + " handling.", exception); return false; } /** * Registers the close menu item for all NON-MacOSX platforms. * @param addSeparator whether we should add separator before the menu item. */ private void registerCloseMenuItemNonMacOSX(boolean addSeparator) { closeMenuItem = new JMenuItem( GuiActivator.getResources().getI18NString("service.gui.QUIT")); if(addSeparator) this.addSeparator(); if (!isChatMenu) { this.add(closeMenuItem); closeMenuItem.setName("close"); closeMenuItem.addActionListener(this); closeMenuItem.setMnemonic(GuiActivator.getResources() .getI18nMnemonic("service.gui.QUIT")); } } }