/* * 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.otr; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.gui.Container; import net.java.sip.communicator.service.protocol.*; /** * @author George Politis * @author Lubomir Marinov */ public class OtrMetaContactMenu extends AbstractPluginComponent implements ActionListener, PopupMenuListener { /** * The last known <tt>MetaContact</tt> to be currently selected and to be * depicted by this instance and the <tt>OtrContactMenu</tt>s it contains. */ private MetaContact currentContact; /** * The indicator which determines whether the <tt>JMenu</tt> of this * <tt>OtrMetaContactMenu</tt> is displayed in the Mac OS X screen menu bar * and thus should work around the known problem of PopupMenuListener not * being invoked. */ private final boolean inMacOSXScreenMenuBar; /** * The <tt>JMenu</tt> which is the component of this plug-in. */ private JMenu menu; /** * The "What's this?" <tt>JMenuItem</tt> which launches help on the subject * of off-the-record messaging. */ private JMenuItem whatsThis; public OtrMetaContactMenu(Container container, PluginComponentFactory parentFactory) { super(container, parentFactory); inMacOSXScreenMenuBar = Container.CONTAINER_CHAT_MENU_BAR.equals(container) && OtrActivator.uiService.useMacOSXScreenMenuBar(); } /* * Implements ActionListener#actionPerformed(ActionEvent). Handles the * invocation of the whatsThis menu item i.e. launches help on the subject * of off-the-record messaging. */ public void actionPerformed(ActionEvent e) { OtrActivator.scOtrEngine.launchHelp(); } /** * Creates an {@link OtrContactMenu} for each {@link Contact} contained in * the <tt>metaContact</tt>. * * @param metaContact The {@link MetaContact} this * {@link OtrMetaContactMenu} refers to. */ private void createOtrContactMenus(MetaContact metaContact) { JMenu menu = getMenu(); // Remove any existing OtrContactMenu items. menu.removeAll(); // Create the new OtrContactMenu items. if (metaContact != null) { Iterator<Contact> contacts = metaContact.getContacts(); if (metaContact.getContactCount() == 1) { Contact contact = contacts.next(); Collection<ContactResource> resources = contact.getResources(); if (contact.supportResources() && resources != null && resources.size() > 0) { for (ContactResource resource : resources) { new OtrContactMenu( OtrContactManager.getOtrContact(contact, resource), inMacOSXScreenMenuBar, menu, true); } } else new OtrContactMenu( OtrContactManager.getOtrContact(contact, null), inMacOSXScreenMenuBar, menu, false); } else while (contacts.hasNext()) { Contact contact = contacts.next(); Collection<ContactResource> resources = contact.getResources(); if (contact.supportResources() && resources != null && resources.size() > 0) { for (ContactResource resource : resources) { new OtrContactMenu( OtrContactManager.getOtrContact( contact, resource), inMacOSXScreenMenuBar, menu, true); } } else new OtrContactMenu( OtrContactManager.getOtrContact(contact, null), inMacOSXScreenMenuBar, menu, true); } } } /* * Implements PluginComponent#getComponent(). Returns the JMenu which is the * component of this plug-in creating it first if it doesn't exist. */ public Component getComponent() { return getMenu(); } /** * Gets the <tt>JMenu</tt> which is the component of this plug-in. If it * still doesn't exist, it's created. * * @return the <tt>JMenu</tt> which is the component of this plug-in */ private JMenu getMenu() { if (menu == null) { menu = new SIPCommMenu(); menu.setText(getName()); if (Container.CONTAINER_CONTACT_RIGHT_BUTTON_MENU .equals(getContainer())) { Icon icon = OtrActivator.resourceService .getImage("plugin.otr.MENU_ITEM_ICON_16x16"); if (icon != null) menu.setIcon(icon); } if (!inMacOSXScreenMenuBar) menu.getPopupMenu().addPopupMenuListener(this); } return menu; } /* * Implements PluginComponent#getName(). */ public String getName() { return OtrActivator.resourceService .getI18NString("plugin.otr.menu.TITLE"); } /* * Implements PopupMenuListener#popupMenuCanceled(PopupMenuEvent). */ public void popupMenuCanceled(PopupMenuEvent e) { createOtrContactMenus(null); } /* * Implements PopupMenuListener#popupMenuWillBecomeInvisible( * PopupMenuEvent). */ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { popupMenuCanceled(e); } /* * Implements PopupMenuListener#popupMenuWillBecomeVisible(PopupMenuEvent). */ public void popupMenuWillBecomeVisible(PopupMenuEvent e) { createOtrContactMenus(currentContact); JMenu menu = getMenu(); menu.addSeparator(); whatsThis = new JMenuItem(); whatsThis.setIcon( OtrActivator.resourceService.getImage( "plugin.otr.HELP_ICON_15x15")); whatsThis.setText( OtrActivator.resourceService.getI18NString( "plugin.otr.menu.WHATS_THIS")); whatsThis.addActionListener(this); menu.add(whatsThis); } /* * Implements PluginComponent#setCurrentContact(MetaContact). */ @Override public void setCurrentContact(MetaContact metaContact) { if (this.currentContact != metaContact) { this.currentContact = metaContact; if (inMacOSXScreenMenuBar) popupMenuWillBecomeVisible(null); else if ((menu != null) && menu.isPopupMenuVisible()) createOtrContactMenus(currentContact); } } }