001package com.dev9.mvnwatcher;
002
003import javax.swing.*;
004import java.awt.*;
005import java.net.URL;
006
007public class MvnSystemNotifications {
008
009    private boolean gui;
010
011    MvnMonitor monitor;
012
013    SystemTray tray;
014    private TrayIcon trayIcon;
015
016    PopupMenu popup = new PopupMenu();
017    MenuItem messageMenu = new MenuItem("Starting...");
018    MenuItem exceptionMenu = new MenuItem("Last Exception");
019
020    private Image IMAGE_OK;
021    private Image IMAGE_FAIL;
022    private Image IMAGE_WORKING;
023
024    private String lastUpdate = "-";
025
026    public String status() {
027        return lastUpdate;
028    }
029
030    public MvnSystemNotifications(MvnMonitor monitor) {
031        this.monitor = monitor;
032    }
033
034    public enum Status {
035        OK, FAIL, WORKING
036    }
037
038    private Image statusToImage(Status status) {
039        switch (status) {
040            case OK:
041                return IMAGE_OK;
042            case FAIL:
043                return IMAGE_FAIL;
044            case WORKING:
045                return IMAGE_WORKING;
046        }
047        return IMAGE_FAIL;
048    }
049
050    private void setupImages() {
051        IMAGE_OK = createImage("/images/OK.png", "Running Normally");
052        IMAGE_FAIL = createImage("/images/FAIL.png", "Build Failing");
053        IMAGE_WORKING = createImage("/images/WORKING.png", "Building...");
054    }
055
056    public void init(boolean useGui) {
057        gui = java.awt.SystemTray.isSupported();
058
059        if (!useGui && gui)
060            gui = false;
061
062        if (gui) {
063
064            tray = SystemTray.getSystemTray();
065
066            setupImages();
067
068            trayIcon = new TrayIcon(IMAGE_WORKING);
069
070            try {
071                tray.add(trayIcon);
072
073                messageMenu.setEnabled(false);
074
075                popup.add(messageMenu);
076
077                MenuItem quitMenu = new MenuItem();
078                quitMenu.setLabel("Quit");
079                quitMenu.addActionListener(e -> monitor.shutdown = true);
080
081                popup.add(quitMenu);
082
083                trayIcon.setPopupMenu(popup);
084            } catch (AWTException e) {
085                System.err.println("Unable to start system tray integration.");
086                e.printStackTrace();
087                gui = false;
088            }
089        }
090    }
091
092    public void update(String message, Status status) {
093        update(message, status, null);
094    }
095
096    public void update(String message, Status status, Exception e) {
097
098        if (message == null)
099            return;
100        if (status == null)
101            return;
102
103        String newMessage;
104
105        if (e == null)
106            newMessage = message + ":" + status.toString();
107        else
108            newMessage = message + ":" + status.toString() + ":" + e.getMessage();
109
110        if (lastUpdate.compareTo(newMessage) == 0) {
111            return;
112        }
113
114        lastUpdate = newMessage;
115
116        if (gui) {
117            trayIcon.setImage(statusToImage(status));
118            trayIcon.setToolTip(message);
119            messageMenu.setLabel(message);
120
121            if (e == null) {
122                if (exceptionMenu.getParent() != null)
123                    popup.remove(exceptionMenu);
124            } else {
125                if (exceptionMenu.getParent() == null)
126                    popup.add(exceptionMenu);
127                exceptionMenu.setLabel(e.getLocalizedMessage());
128            }
129        }
130
131        System.out.println(message);
132        if (e != null)
133            e.printStackTrace();
134    }
135
136
137    //Obtain the image URL
138    private Image createImage(String path, String description) {
139        URL imageURL = MvnSystemNotifications.class.getResource(path);
140
141        if (imageURL == null) {
142            gui = false;
143            System.err.println("Can't boot system tray, resource not found: " + path);
144            return null;
145        } else {
146            return (new ImageIcon(imageURL, description)).getImage();
147        }
148    }
149
150}