/*
* 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.osdependent.jdic;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.impl.osdependent.*;
import net.java.sip.communicator.service.gui.*;
import org.apache.commons.lang3.tuple.*;
import org.jitsi.util.*;
/**
* The <tt>TrayMenu</tt> is the menu that appears when the user right-click
* on the Systray icon.
*
* @author Nicolas Chamouard
* @author Lubomir Marinov
* @author Yana Stamcheva
*/
public final class TrayMenuFactory
{
/**
* Handles the <tt>ActionEvent</tt> when one of the menu items is selected.
*
* @param evt the event containing the menu item name
*/
private static void actionPerformed(ActionEvent evt)
{
Object source = evt.getSource();
String itemName;
if (source instanceof JMenuItem)
{
JMenuItem menuItem = (JMenuItem) source;
itemName = menuItem.getName();
}
else
{
MenuItem menuItem = (MenuItem) source;
itemName = menuItem.getName();
}
if (itemName.equals("settings"))
{
OsDependentActivator.getUIService()
.getConfigurationContainer().setVisible(true);
}
else if (itemName.equals("service.gui.QUIT"))
{
OsDependentActivator.getShutdownService().beginShutdown();
}
else if (itemName.equals("addContact"))
{
ExportedWindow dialog =
OsDependentActivator.getUIService().getExportedWindow(
ExportedWindow.ADD_CONTACT_WINDOW);
if (dialog != null)
dialog.setVisible(true);
else
OsDependentActivator.getUIService().getPopupDialog()
.showMessagePopupDialog(Resources.getString(
"impl.systray.FAILED_TO_OPEN_ADD_CONTACT_DIALOG"));
}
else if (itemName.equals("service.gui.SHOW"))
{
OsDependentActivator.getUIService().setVisible(true);
OsDependentActivator.getUIService().bringToFront();
changeTrayMenuItem(source, "service.gui.HIDE",
"service.gui.HIDE", "service.gui.icons.SEARCH_ICON_16x16");
}
else if (itemName.equals("service.gui.HIDE"))
{
OsDependentActivator.getUIService().setVisible(false);
changeTrayMenuItem(source, "service.gui.SHOW",
"service.gui.SHOW", "service.gui.icons.SEARCH_ICON_16x16");
}
}
/**
* Adds the given <tt>trayMenuItem</tt> to the given <tt>trayMenu</tt>.
* @param trayMenu the tray menu to which to add the item
* @param trayMenuItem the item to add
*/
private static void add(Object trayMenu, Object trayMenuItem)
{
if (trayMenu instanceof JPopupMenu)
((JPopupMenu) trayMenu).add((JMenuItem) trayMenuItem);
else
((PopupMenu) trayMenu).add((MenuItem) trayMenuItem);
}
/**
* Adds a <tt>PopupMenuListener</tt> to the given <tt>trayMenu</tt>.
* @param trayMenu the tray menu to which to add a popup listener
* @param listener the listener to add
*/
public static void addPopupMenuListener(Object trayMenu,
PopupMenuListener listener)
{
if (trayMenu instanceof JPopupMenu)
((JPopupMenu) trayMenu).addPopupMenuListener(listener);
}
/**
* Adds a separator to the given <tt>trayMenu</tt>.
* @param trayMenu the tray menu to which to add a separator
*/
private static void addSeparator(Object trayMenu)
{
if (trayMenu instanceof JPopupMenu)
((JPopupMenu) trayMenu).addSeparator();
else
((PopupMenu) trayMenu).addSeparator();
}
/**
* Creates a tray menu for the given system tray.
*
* @param tray the system tray for which we're creating a menu
* @param swing indicates if we should create a Swing or an AWT menu
* @return a tray menu for the given system tray (first) and the default
* menu item (second)
*/
public static Pair<Object, Object> createTrayMenu(
SystrayServiceJdicImpl tray,
boolean swing,
boolean accountMenuSupported
)
{
final Object trayMenu = swing ? new JPopupMenu() : new PopupMenu();
ActionListener listener = new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
TrayMenuFactory.actionPerformed(event);
}
};
Boolean showOptions
= OsDependentActivator.getConfigurationService().getBoolean(
"net.java.sip.communicator.impl.gui.main.configforms."
+ "SHOW_OPTIONS_WINDOW",
true);
if (showOptions.booleanValue())
{
add(trayMenu, createTrayMenuItem(
"settings",
(OSUtils.IS_MAC)
? "service.gui.PREFERENCES"
: "service.gui.SETTINGS",
"service.systray.CONFIGURE_ICON", listener, swing));
}
add(trayMenu, createTrayMenuItem("addContact",
"service.gui.ADD_CONTACT",
"service.gui.icons.ADD_CONTACT_16x16_ICON", listener, swing));
addSeparator(trayMenu);
Boolean chatPresenceDisabled
= OsDependentActivator.getConfigurationService().getBoolean(
"net.java.sip.communicator.impl.gui.main.presence."
+ "CHAT_PRESENCE_DISABLED",
false);
if (!chatPresenceDisabled.booleanValue() && accountMenuSupported)
{
add(
trayMenu,
new StatusSubMenu(swing, accountMenuSupported).getMenu());
addSeparator(trayMenu);
}
String showHideName;
String showHideTextId;
String showHideIconId;
if (OsDependentActivator.getUIService().isVisible())
{
showHideName = "service.gui.HIDE";
showHideTextId = "service.gui.HIDE";
showHideIconId = "service.gui.icons.SEARCH_ICON_16x16";
}
else
{
showHideName = "service.gui.SHOW";
showHideTextId = "service.gui.SHOW";
showHideIconId = "service.gui.icons.SEARCH_ICON_16x16";
}
final Object showHideMenuItem = createTrayMenuItem( showHideName,
showHideTextId,
showHideIconId,
listener,
swing);
add(trayMenu, showHideMenuItem);
add(trayMenu, createTrayMenuItem("service.gui.QUIT",
"service.gui.QUIT", "service.systray.QUIT_MENU_ICON", listener,
swing));
OsDependentActivator.getUIService().addWindowListener(
new WindowAdapter()
{
/**
* Invoked when a window is activated.
*/
@Override
public void windowActivated(WindowEvent e)
{
changeTrayMenuItem( showHideMenuItem,
"service.gui.HIDE",
"service.gui.HIDE",
"service.gui.icons.SEARCH_ICON_16x16");
}
/**
* Invoked when a window is de-activated.
*/
@Override
public void windowDeactivated(WindowEvent e)
{
changeTrayMenuItem( showHideMenuItem,
"service.gui.SHOW",
"service.gui.SHOW",
"service.gui.icons.SEARCH_ICON_16x16");
}
});
return Pair.of(trayMenu, showHideMenuItem);
}
/**
* Creates a tray menu with the given <tt>name</tt>, text given by
* <tt>textID</tt> and icon given by <tt>iconID</tt>. The <tt>listener</tt>
* is handling item events and the <tt>swing</tt> value indicates if we
* should create a Swing menu item or and an AWT item.
* @param name the name of the item
* @param textID the identifier of the text in the localization resources
* @param iconID the identifier of the icon in the image resources
* @param listener the <tt>ActionListener</tt> handling action events
* @param swing indicates if we should create a Swing menu item or an AWT
* item
* @return a reference to the newly created item
*/
private static Object createTrayMenuItem( String name,
String textID,
String iconID,
ActionListener listener,
boolean swing)
{
String text = Resources.getString(textID);
Object trayMenuItem;
if (swing)
{
JMenuItem menuItem =
new JMenuItem(text, Resources.getImage(iconID));
menuItem.setName(name);
menuItem.addActionListener(listener);
trayMenuItem = menuItem;
}
else
{
MenuItem menuItem = new MenuItem(text);
menuItem.setName(name);
menuItem.addActionListener(listener);
trayMenuItem = menuItem;
}
return trayMenuItem;
}
/**
* Changes the tray menu item properties, like name, text and icon.
* @param trayItem the tray menu item to change
* @param name the new name of the item
* @param textID the new text identifier
* @param iconID the new icon string identifier
*/
private static void changeTrayMenuItem( Object trayItem,
String name,
String textID,
String iconID)
{
String text = Resources.getString(textID);
if (trayItem instanceof JMenuItem)
{
JMenuItem jmenuItem = (JMenuItem) trayItem;
jmenuItem.setName(name);
jmenuItem.setText(text);
jmenuItem.setIcon(Resources.getImage(iconID));
}
else if (trayItem instanceof MenuItem)
{
MenuItem menuItem = (MenuItem) trayItem;
menuItem.setName(name);
menuItem.setLabel(text);
}
}
/**
* Returns <tt>true</tt> if the given <tt>trayMenu</tt> is visible,
* otherwise returns <tt>false</tt>.
* @param trayMenu the <tt>TrayMenu</tt> to check
* @return <tt>true</tt> if the given <tt>trayMenu</tt> is visible,
* otherwise returns <tt>false</tt>
*/
public static boolean isVisible(Object trayMenu)
{
if (trayMenu instanceof JPopupMenu)
return ((JPopupMenu) trayMenu).isVisible();
return false;
}
}