/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * See LICENSE.txt included in this distribution for the specific * language governing permissions and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ package org.opensolaris.opengrok.management.client; import java.awt.AWTException; import java.awt.Image; import java.awt.MenuItem; 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.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import org.opensolaris.opengrok.OpenGrokLogger; /** * * @author Jan S Berg */ public class OpenGrokTrayApp { private static final Logger log = Logger.getLogger(OpenGrokTrayApp.class.getName()); private static TrayIcon trayIcon; private static String cfgfile; private final SettingsPersistence settings; public static final String OPENGROKICONURL = "opengrok.gif"; public static final String INDEXWARNINGICONURL = "opengrok_indexwarning.gif"; public static final String NOCONNECTIONICONURL = "opengrok_noconnection.gif"; private AgentConnection agent = null; private boolean agentConnected = false; private Image opengrokImage; private Image indexWarningImage; private Image noConnectionImage; private Image currentIcon; /** * @param args the command line arguments */ @SuppressWarnings("PMD.SystemPrintln") public static void main(String[] args) { try { for (int i = 0; i < args.length; i++) { if (args[i].equals("-config")) { if (++i < args.length) { cfgfile = args[i]; } else { System.err.println("-config, argument missing: config file"); System.exit(1); } } } OpenGrokTrayApp ogta = new OpenGrokTrayApp(cfgfile); ogta.enableSystemTray(); } catch (IOException ex) { log.severe(ex.getMessage()); log.log(Level.FINE, "main", ex); } } public OpenGrokTrayApp(String cfgfile) throws IOException { settings = new SettingsPersistence(cfgfile); loadImages(); OpenGrokLogger.setupLogger(settings.getProperty(SettingsPersistence.LOGGINGPATHKEY), settings.getFileLogLevel(), settings.getConsoleLogLevel()); if (tryAgentConnect()) { currentIcon = opengrokImage; } else { currentIcon = noConnectionImage; } } private ActionListener getAgentActionListener() { ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { log.info("Got Event " + e.getActionCommand()); trayIcon.displayMessage("OpenGrok Indexer", "Files have been deleted/added", TrayIcon.MessageType.INFO); trayIcon.setImage(indexWarningImage); } }; return actionListener; } private ActionListener getExitListener() { ActionListener exitListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { log.info("Exiting..."); if (agent != null && agent.isConnected()) { agent.unregister(); } System.exit(0); } }; return exitListener; } private ActionListener getConfigurationListener() { ActionListener configListener = new ActionListener() { public void actionPerformed(ActionEvent e) { log.finer("Config..."); ConfigurationsFrame sf; try { sf = new ConfigurationsFrame(agent); sf.setVisible(true); } catch (IOException ex) { log.warning(ex.getLocalizedMessage()); log.log(Level.FINE, "actionPerformed", e); } log.finer("Done config"); } }; return configListener; } private MouseListener getMouseListener() { MouseListener mouseListener = new MouseListener() { @Override public void mouseClicked(MouseEvent e) { log.finest("Tray Icon - Mouse clicked!"); } @Override public void mouseEntered(MouseEvent e) { log.finest("Tray Icon - Mouse entered!"); } @Override public void mouseExited(MouseEvent e) { log.finest("Tray Icon - Mouse exited!"); } @Override public void mousePressed(MouseEvent e) { log.finest("Tray Icon - Mouse pressed!"); } @Override public void mouseReleased(MouseEvent e) { log.finest("Tray Icon - Mouse released!"); } }; return mouseListener; } private WindowListener getNotificationWindowListener() { final WindowListener notificationWindowListener = new WindowListener() { public void windowOpened(WindowEvent arg0) { log.finest("Received window opened"); } public void windowClosing(WindowEvent arg0) { log.finest("Received window closing"); } public void windowClosed(WindowEvent arg0) { log.info("Received window closing"); if (agent != null && agent.isConnected()) { currentIcon = opengrokImage; } else { currentIcon = noConnectionImage; } trayIcon.setImage(currentIcon); } public void windowIconified(WindowEvent arg0) { log.finest("Received window iconified"); } public void windowDeiconified(WindowEvent arg0) { log.finest("Received window deiconified"); } public void windowActivated(WindowEvent arg0) { log.finest("Received window activated"); } public void windowDeactivated(WindowEvent arg0) { log.finest("Received window deactivated"); } }; return notificationWindowListener; } private ActionListener getSettingsListener(final WindowListener settingsWindowListener) { ActionListener settingsListener = new ActionListener() { public void actionPerformed(ActionEvent e) { log.finer("Settings..."); SettingsFrame sf = new SettingsFrame(settings); sf.addWindowListener(settingsWindowListener); sf.setVisible(true); log.finer("Done settings"); } }; return settingsListener; } private WindowListener getSettingsWindowListener() { final WindowListener settingsWindowListener = new WindowListener() { @Override public void windowOpened(WindowEvent arg0) { log.finest("Received window opened"); } @Override public void windowClosing(WindowEvent arg0) { log.finest("Received window closing " + arg0); } @Override public void windowClosed(WindowEvent arg0) { log.info("Received window closing"); if (!agentConnected) { tryAgentConnect(); } if (agentConnected) { currentIcon = opengrokImage; } else { currentIcon = noConnectionImage; } trayIcon.setImage(currentIcon); } @Override public void windowIconified(WindowEvent arg0) { log.finest("Received window iconified"); } public void windowDeiconified(WindowEvent arg0) { log.finest("Received window deiconified"); } public void windowActivated(WindowEvent arg0) { log.finest("Received window activated"); } public void windowDeactivated(WindowEvent arg0) { log.finest("Received window deactivated"); } }; return settingsWindowListener; } private ActionListener getShowNotificationListener(final WindowListener notificationWindowListener) { ActionListener showNotificationsListener = new ActionListener() { public void actionPerformed(ActionEvent e) { log.info("Notifications..."); String notifs = ""; long starttime = 0; long endtime = 0; if (agentConnected && agent != null) { notifs = agent.getFilesInfo(); agent.clearFilesInfo(); starttime = agent.getStartTime(); endtime = agent.getEndTime(); } NotificationsFrame sf = new NotificationsFrame(notifs, starttime, endtime); sf.addWindowListener(notificationWindowListener); sf.setVisible(true); log.finest("Done Notifications"); } }; return showNotificationsListener; } private void loadImages() { java.net.URL imageUrl; imageUrl = OpenGrokTrayApp.class.getResource(OPENGROKICONURL); opengrokImage = Toolkit.getDefaultToolkit().getImage(imageUrl); imageUrl = OpenGrokTrayApp.class.getResource(INDEXWARNINGICONURL); indexWarningImage = Toolkit.getDefaultToolkit().getImage(imageUrl); imageUrl = OpenGrokTrayApp.class.getResource(NOCONNECTIONICONURL); noConnectionImage = Toolkit.getDefaultToolkit().getImage(imageUrl); } private boolean tryAgentConnect() { boolean retval = false; try { if (agent == null) { agent = new AgentConnection(settings.getAgentUrl()); } agent.setUrl(settings.getAgentUrl()); agent.connect(); agent.registerListener(); retval = true; agentConnected = true; } catch (Exception ex) { log.log(Level.WARNING, "Could not connect ", ex); } return retval; } private void enableSystemTray() { if (SystemTray.isSupported()) { SystemTray tray = SystemTray.getSystemTray(); MouseListener mouseListener = getMouseListener(); log.info("Creating listeners"); final ActionListener exitListener = getExitListener(); final WindowListener settingsWindowListener = getSettingsWindowListener(); final WindowListener notificationWindowListener = getNotificationWindowListener(); final ActionListener settingsListener = getSettingsListener(settingsWindowListener); final ActionListener showNotificationsListener = getShowNotificationListener(notificationWindowListener); final ActionListener configListener = this.getConfigurationListener(); log.info("Creating popup and tray icon "); PopupMenu popup = new PopupMenu(); MenuItem exitItem = new MenuItem("Exit"); exitItem.addActionListener(exitListener); MenuItem settingsItem = new MenuItem("Connection Settings"); settingsItem.addActionListener(settingsListener); MenuItem configsItem = new MenuItem("Configurations"); configsItem.addActionListener(configListener); MenuItem notifyItem = new MenuItem("Show notifications"); notifyItem.addActionListener(showNotificationsListener); popup.add(settingsItem); popup.add(configsItem); popup.add(notifyItem); popup.addSeparator(); popup.add(exitItem); trayIcon = new TrayIcon(opengrokImage, "OpenGrok Agent Client", popup); final ActionListener actionListener = getAgentActionListener(); if (agent == null || !agent.isConnected()) { trayIcon.setImage(noConnectionImage); } else { agent.setActionListener(actionListener); } trayIcon.setImageAutoSize(true); trayIcon.addActionListener(actionListener); trayIcon.addMouseListener(mouseListener); try { tray.add(trayIcon); } catch (AWTException e) { log.log(Level.WARNING, "TrayIcon could not be added: " + e.getMessage()); log.log(Level.FINE, "enableSystemTray", e); } log.info("Created, ready for action"); } else { // System Tray is not supported log.severe("System Tray is NOT supported"); } } }