net.java.sip.communicator.impl.osdependent.jdic.TrayMenuFactory.java Source code

Java tutorial

Introduction

Here is the source code for net.java.sip.communicator.impl.osdependent.jdic.TrayMenuFactory.java

Source

/*
 * 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;
    }
}