/** * Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Paweł Kędzia, Mateusz Kubuszok * * <p>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</p> * * <p>http://www.apache.org/licenses/LICENSE-2.0</p> * * <p>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.</p> */ package com.autoupdater.gui.client.tray; import static com.autoupdater.gui.client.window.tabs.updates.UpdateInformationPanel.*; import static com.autoupdater.gui.config.GuiConfiguration.*; import static javax.imageio.ImageIO.read; import java.awt.AWTException; import java.awt.SystemTray; 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.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.SortedSet; import javax.swing.ImageIcon; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import org.widgetfx.ui.JXTrayIcon; import com.autoupdater.client.models.Program; import com.autoupdater.gui.Resources; import com.autoupdater.gui.client.window.EWindowStatus; import com.autoupdater.gui.client.window.GuiClientWindow; public class TrayHelper { private final SortedSet<Program> programs; private final GuiClientWindow clientWindow; private JXTrayIcon trayIcon; private JMenuItem showHideGUI; private JMenuItem checkUpdates; private JMenuItem installUpdates; private JMenuItem cancelDownload; private JMenuItem exitClient; private Map<Program, JMenuItem> programsLaunchers; private boolean initiatedCorrectly; public TrayHelper(GuiClientWindow clientWindow, SystemTray tray, SortedSet<Program> programs) { this.clientWindow = clientWindow; this.programs = programs; JPopupMenu popup = new JPopupMenu(); addShowHideToPopup(popup); addProgramsToPopup(popup); addControlsToPopup(popup); addExitToPopup(popup); createTray(tray, popup); } public boolean isInitiatedCorrectly() { return initiatedCorrectly; } public TrayIcon getTrayIcon() { return trayIcon; } public JMenuItem getShowHideGUI() { return showHideGUI; } public JMenuItem getCheckUpdates() { return checkUpdates; } public JMenuItem getInstallUpdates() { return installUpdates; } public JMenuItem getCancelDownload() { return cancelDownload; } public JMenuItem getExitClient() { return exitClient; } public Map<Program, JMenuItem> getProgramsLaunchers() { return programsLaunchers; } public void refreshIcons() { for (Program program : programsLaunchers.keySet()) setProgramIcon(program, programsLaunchers.get(program)); } public void setStatus(EWindowStatus status) { for (JMenuItem launcher : programsLaunchers.values()) launcher.setEnabled(status.isRunCommandButtonsEnabled()); checkUpdates.setEnabled(status.isCheckUpdatesButtonEnabled()); installUpdates.setEnabled(status.isInstallUpdatesButtonEnabled()); cancelDownload.setEnabled(status.isCancelDownloadButtonEnabled()); exitClient.setEnabled(status.isProgramAbleToFinish()); } private void addShowHideToPopup(JPopupMenu popup) { showHideGUI = new JMenuItem(clientWindow.isVisible() ? "Hide" : "Show"); showHideGUI.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { clientWindow.setVisible(!clientWindow.isVisible()); } }); popup.add(showHideGUI); } private void addControlsToPopup(JPopupMenu popup) { popup.addSeparator(); checkUpdates = new JMenuItem("Check updates"); popup.add(checkUpdates); installUpdates = new JMenuItem("Install all updates"); popup.add(installUpdates); cancelDownload = new JMenuItem("Cancel downloads"); popup.add(cancelDownload); } private void addProgramsToPopup(JPopupMenu popup) { programsLaunchers = new HashMap<Program, JMenuItem>(); if (programs == null || programs.isEmpty()) return; popup.addSeparator(); for (final Program program : programs) { JMenuItem programLauncher = new JMenuItem("Run " + program.getName() + " (" + (program.isDevelopmentVersion() ? "test" : "release") + ")"); setProgramIcon(program, programLauncher); popup.add(programLauncher); programsLaunchers.put(program, programLauncher); } } private void addExitToPopup(JPopupMenu popup) { popup.addSeparator(); exitClient = new JMenuItem("Exit"); exitClient.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (clientWindow.getStatus() != EWindowStatus.INSTALLING_UPDATES) System.exit(0); } }); popup.add(exitClient); } private void setProgramIcon(Program program, JMenuItem menuItem) { if (program.isNotOutdated()) menuItem.setIcon(new ImageIcon(UP_TO_DATE_IMAGE)); else menuItem.setIcon(new ImageIcon(OUT_OF_DATE_IMAGE)); } private void createTray(SystemTray tray, JPopupMenu popup) { try { trayIcon = new JXTrayIcon(read(Resources.class.getResourceAsStream(TRAY_ICON_URL))); trayIcon.setToolTip(WINDOW_TITLE); trayIcon.setJPopupMenu(popup); trayIcon.setImageAutoSize(true); trayIcon.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { if ((e.getButton() == MouseEvent.BUTTON1)) clientWindow.setVisible(!clientWindow.isVisible()); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); tray.add(trayIcon); initiatedCorrectly = true; } catch (IOException | AWTException e1) { e1.printStackTrace(); initiatedCorrectly = false; } } }