sparksystemtray.java.svn-base

来自「开源项目openfire的完整源程序」· SVN-BASE 代码 · 共 368 行

SVN-BASE
368
字号
/** * $Revision: $ * $Date: $ * * Copyright (C) 2006 Jive Software. All rights reserved. * * This software is published under the terms of the GNU Lesser Public License (LGPL), * a copy of which is included in this distribution. */package org.jivesoftware.spark.plugins;import org.jivesoftware.MainWindow;import org.jivesoftware.MainWindowListener;import org.jivesoftware.Spark;import org.jivesoftware.resource.Default;import org.jivesoftware.resource.Res;import org.jivesoftware.resource.SparkRes;import org.jivesoftware.smack.packet.Presence;import org.jivesoftware.spark.SparkManager;import org.jivesoftware.spark.Workspace;import org.jivesoftware.spark.component.ImageTitlePanel;import org.jivesoftware.spark.component.WrappedLabel;import org.jivesoftware.spark.ui.PresenceListener;import org.jivesoftware.spark.ui.status.StatusBar;import org.jivesoftware.spark.ui.status.StatusItem;import java.awt.AWTException;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.Frame;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Insets;import java.awt.Menu;import java.awt.MenuItem;import java.awt.Point;import java.awt.PopupMenu;import java.awt.SystemTray;import java.awt.Toolkit;import java.awt.TrayIcon;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.Iterator;import javax.swing.AbstractAction;import javax.swing.Action;import javax.swing.BorderFactory;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JPopupMenu;import javax.swing.JScrollPane;/** * Handles tray icon operations inside of Spark. Use to display incoming chat requests, incoming messages * and general notifications. */public final class SparkSystemTray implements ActionListener, MainWindowListener {    private SystemTray systemTray;    private TrayIcon trayIcon;    private JPopupMenu notificationDialog;    private WrappedLabel messageLabel = new WrappedLabel();    private final MenuItem openMenu = new MenuItem(Res.getString("menuitem.open"));    private final MenuItem hideMenu = new MenuItem(Res.getString("menuitem.hide"));    private final MenuItem exitMenu = new MenuItem(Res.getString("menuitem.exit"));    private final MenuItem logoutMenu = new MenuItem(Res.getString("menuitem.logout.no.status"));    // Define DND MenuItems    private final Menu statusMenu = new Menu(Res.getString("menuitem.status"));    private boolean isDisposed;    private ImageTitlePanel headerLabel = new ImageTitlePanel();    private JFrame hideWindow = null;    private ImageIcon availableIcon;    private ImageIcon awayIcon;    private ImageIcon dndIcon;    /**     * Creates a new instance of notifications.     */    public SparkSystemTray() {        if(Spark.isMac()){            return;        }                setupNotificationDialog();        // Handle tray image.        availableIcon = Default.getImageIcon(Default.TRAY_IMAGE);        if (availableIcon == null) {            availableIcon = SparkRes.getImageIcon(SparkRes.TRAY_IMAGE);        }        awayIcon = SparkRes.getImageIcon(SparkRes.MESSAGE_AWAY);        dndIcon = SparkRes.getImageIcon(SparkRes.MESSAGE_DND);        trayIcon = new TrayIcon(availableIcon.getImage());        trayIcon.setImageAutoSize(true);        systemTray = SystemTray.getSystemTray();        setTrayIcon(availableIcon);        trayIcon.setToolTip(Default.getString(Default.APPLICATION_NAME)); // NORES        PopupMenu popupMenu = new PopupMenu(Res.getString("title.tray.information"));        // Add DND Menus        addStatusMenuItems();        // Add Open Menu        openMenu.setFont(new Font("Dialog", Font.BOLD, 11));        popupMenu.add(openMenu);        // Add Hide Menu        popupMenu.add(hideMenu);        popupMenu.addSeparator();        // Add Spark Home Menu        popupMenu.add(statusMenu);        // Add Listeners        openMenu.addActionListener(this);        hideMenu.addActionListener(this);        Action logoutAction = new AbstractAction() {            public void actionPerformed(ActionEvent actionEvent) {                SparkManager.getMainWindow().logout(false);            }        };        logoutAction.putValue(Action.NAME, Res.getString("menuitem.logout.no.status"));        logoutMenu.addActionListener(logoutAction);        if (Spark.isWindows()) {            popupMenu.add(logoutMenu);        }        // Add Exit Menu        popupMenu.add(exitMenu);        exitMenu.addActionListener(this);        SparkManager.getMainWindow().addMainWindowListener(this);        trayIcon.setPopupMenu(popupMenu);        try {            systemTray.add(trayIcon);        }        catch (AWTException e) {            System.out.println("TrayIcon could not be added.");            return;        }        trayIcon.addMouseListener(new MouseAdapter() {            public void mouseClicked(MouseEvent e) {                showMainWindow();            }        });        SparkManager.getSessionManager().addPresenceListener(new PresenceListener() {            public void presenceChanged(Presence presence) {                changePresence(presence);            }        });    }    /**     * Change the presence of the tray.     *     * @param presence the new presence.     */    public void changePresence(Presence presence) {        if (Spark.isMac()) {            return;        }        if (presence.getMode() == Presence.Mode.available || presence.getMode() == Presence.Mode.chat) {            setTrayIcon(availableIcon);        }        else if (presence.getMode() == Presence.Mode.away || presence.getMode() == Presence.Mode.xa) {            setTrayIcon(awayIcon);        }        else {            setTrayIcon(dndIcon);        }        // Get Status Text        if (presence.isAvailable()) {            String status = presence.getStatus();            trayIcon.setToolTip(Default.getString(Default.APPLICATION_NAME) + "\n" + status);        }    }    /**     * Stops the icon from flashing.     */    public void stopFlashing() {        Workspace workspace = SparkManager.getWorkspace();        StatusBar statusBox = workspace.getStatusBar();        Presence presence = statusBox.getPresence();        changePresence(presence);    }    public void actionPerformed(ActionEvent e) {        Object o = e.getSource();        if (!(o instanceof MenuItem)) {            MainWindow window = SparkManager.getMainWindow();            /*            if (window.isVisible() && window.getState() == Frame.NORMAL) {                long now = System.currentTimeMillis();                if (now - madeVisibleTime > 1000) {                    window.setVisible(false);                    return;                }            }            madeVisibleTime = System.currentTimeMillis();            */            showMainWindow();            return;        }        final MenuItem item = (MenuItem)e.getSource();        if (item == openMenu) {            showMainWindow();        }        else if (item == hideMenu) {            SparkManager.getMainWindow().setVisible(false);            hideMenu.setEnabled(false);        }        else if (item == exitMenu) {            isDisposed = true;            SparkManager.getMainWindow().shutdown();        }        else {            final String status = item.getLabel();            // Change Status            Workspace workspace = SparkManager.getWorkspace();            StatusItem statusItem = workspace.getStatusBar().getStatusItem(status);            if (statusItem != null) {                SparkManager.getSessionManager().changePresence(statusItem.getPresence());            }        }    }    /**     * Brings the <code>MainWindow</code> to the front.     */    private void showMainWindow() {        if (hideWindow != null) {            hideWindow.dispose();        }        SparkManager.getMainWindow().setState(Frame.NORMAL);        SparkManager.getMainWindow().setVisible(true);        notificationDialog.setVisible(false);        hideMenu.setEnabled(true);        SparkManager.getMainWindow().toFront();    }    /**     * Add all Registered DND's to MenuItems.     */    private void addStatusMenuItems() {        Workspace workspace = SparkManager.getWorkspace();        StatusBar statusBar = workspace.getStatusBar();        Iterator iter = statusBar.getStatusList().iterator();        while (iter.hasNext()) {            StatusItem item = (StatusItem)iter.next();            final MenuItem menuItem = new MenuItem(item.getText());            menuItem.addActionListener(this);            statusMenu.add(menuItem);        }    }    public void shutdown() {        systemTray.remove(trayIcon);    }    public void mainWindowActivated() {    }    public void mainWindowDeactivated() {    }    /**     * Setup notification dialog.     */    private void setupNotificationDialog() {        notificationDialog = new JPopupMenu();        notificationDialog.setFocusable(false);        notificationDialog.setLayout(new BorderLayout());        final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();        Point newLoc = new Point((int)screenSize.getWidth() - 200, (int)screenSize.getHeight() - 150);        JPanel mainPanel = new JPanel();        mainPanel.setBackground(Color.white);        mainPanel.setLayout(new GridBagLayout());        mainPanel.setBorder(BorderFactory.createLineBorder(Color.black, 1));        // Add Header Label        mainPanel.add(headerLabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));        // Add Message Label        final JScrollPane messageScroller = new JScrollPane(messageLabel);        mainPanel.add(messageScroller, new GridBagConstraints(0, 2, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));        messageScroller.setBackground(Color.white);        messageScroller.setForeground(Color.white);        messageLabel.setBackground(Color.white);        messageScroller.getViewport().setBackground(Color.white);        // JButton okButton = new JButton("Ok");        mainPanel.setPreferredSize(new Dimension(200, 150));        headerLabel.setTitle("Spark"); // NORES        headerLabel.setTitleFont(new Font("Dialog", Font.BOLD, 10));        messageLabel.setFont(new Font("Dialog", Font.PLAIN, 11));        notificationDialog.add(mainPanel, BorderLayout.CENTER);        notificationDialog.pack();        notificationDialog.setPreferredSize(new Dimension(200, 150));        notificationDialog.setLocation(newLoc);        messageLabel.addMouseListener(new MouseAdapter() {            public void mouseClicked(MouseEvent e) {                notificationDialog.setVisible(false);                showMainWindow();            }        });        mainPanel.addMouseListener(new MouseAdapter() {            public void mouseClicked(MouseEvent e) {                notificationDialog.setVisible(false);                showMainWindow();            }        });    }    private void setTrayIcon(ImageIcon icon) {        trayIcon.setImage(icon.getImage());    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?