/* * MediathekView * Copyright (C) 2014 W. Xaver * W.Xaver[at]googlemail.com * http://zdfmediathk.sourceforge.net/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package mediathek.gui; import mSearch.tool.Listener; import mSearch.tool.SysMsg; import mediathek.config.Daten; import mediathek.config.Icons; import mediathek.config.MVConfig; import net.sf.jcarrierpigeon.Notification; import net.sf.jcarrierpigeon.NotificationQueue; import net.sf.jcarrierpigeon.WindowPosition; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public final class MVTray { private int trayState = 0; // 0, 1=Download, 2=Download mit Fehler private SystemTray tray = null; private TrayIcon trayIcon = null; private Daten daten; public MVTray() { } public void beenden() { if (tray != null && trayIcon != null) { tray.remove(trayIcon); } } public MVTray systemTray() { daten = Daten.getInstance(); if (!SystemTray.isSupported()) { SysMsg.sysMsg("Tray wird nicht unterstützt!"); return null; } else { tray = SystemTray.getSystemTray(); trayIcon = new TrayIcon(Icons.ICON_TRAY); trayIcon.setImageAutoSize(true); trayIcon.setToolTip(getInfoTextDownloads()); addListener(); final PopupMenu popup = new PopupMenu(); trayIcon.setPopupMenu(popup); MenuItem itemInfo = new MenuItem("Infos anzeigen"); itemInfo.addActionListener(e -> addNotification(getTextInfos())); popup.add(itemInfo); MenuItem itemRemoveTray = new MenuItem("Trayicon ausblenden"); itemRemoveTray.addActionListener(e -> { daten.getMediathekGui().setVisible(true); // WICHTIG!! MVConfig.add(MVConfig.Configs.SYSTEM_USE_TRAY, Boolean.toString(false)); daten.getMediathekGui().setTray(); Listener.notify(Listener.EREIGNIS_TRAYICON, MVTray.class.getSimpleName()); }); popup.add(itemRemoveTray); popup.addSeparator(); MenuItem itemBeenden = new MenuItem("Programm beenden"); itemBeenden.addActionListener(e -> daten.getMediathekGui().beenden(false, false)); popup.add(itemBeenden); trayIcon.setPopupMenu(popup); try { // if (SystemInfo.isLinux()) { // new HackyLinuxTrayIconInitialiser(trayIcon).execute(); // } else { tray.add(trayIcon); // } return this; } catch (AWTException e) { SysMsg.sysMsg("Tray konnte nicht geladen werden!"); } } return null; } private void addListener() { trayIcon.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { if (e.getClickCount() == 1) { daten.getMediathekGui().setVisible(!daten.getMediathekGui().isVisible()); if (daten.getMediathekGui().isVisible()) { daten.getMediathekGui().toFront(); daten.getMediathekGui().requestFocus(); } } } } }); Listener.addListener(new Listener(Listener.EREIGNIS_TIMER, MVStatusBar.class.getSimpleName()) { int count = 0; @Override public void ping() { ++count; if (count > 3) { // nur alle 3s ändern trayIcon.setToolTip(getInfoTextDownloads()); } // Anzahl, Anz-Abo, Anz-Down, nicht gestarted, laufen, fertig OK, fertig fehler int[] starts = daten.getDownloadInfos().downloadStarts; if (starts[6] > 0) { // es gibt welche mit Fehler if (trayState != 2) { trayState = 2; trayIcon.setImage(Icons.ICON_TRAY_ERROR); } } else if (starts[4] > 0) { // es laufen welche if (trayState != 1) { trayState = 1; trayIcon.setImage(Icons.ICON_TRAY_DOWNLOAD); } } else if (trayState != 0) { trayState = 0; trayIcon.setImage(Icons.ICON_TRAY); } } }); } private String getTextInfos() { String strText = "<html><head></head><body><p>"; strText += "Filmliste erstellt: " + daten.getListeFilme().genDate() + " Uhr "; strText += "<br />"; strText += "Anz. Filme: " + daten.getListeFilme().size(); strText += "<br />"; strText += getInfoTextDownloads(); strText += "</p></body></html>"; return strText; } private String getInfoTextDownloads() { String text; // nicht gestarted, laufen, fertig OK, fertig fehler int[] starts = daten.getDownloadInfos().downloadStarts; text = "Downloads: " + starts[0]; boolean print = false; for (int ii = 1; ii < starts.length; ++ii) { if (starts[ii] > 0) { print = true; break; } } if (print) { text += " [ "; if (starts[4] == 1) { text += "1 läuft"; } else { text += starts[4] + " laufen"; } if (starts[4] > 0) { text += " (" + daten.getDownloadInfos().bandwidthStr + ')'; } if (starts[3] == 1) { text += ", 1 wartet"; } else { text += ", " + starts[3] + " warten"; } if (starts[5] > 0) { if (starts[5] == 1) { text += ", 1 fertig"; } else { text += ", " + starts[5] + " fertig"; } } if (starts[6] > 0) { if (starts[6] == 1) { text += ", 1 fehlerhaft"; } else { text += ", " + starts[6] + " fehlerhaft"; } } text += " ]"; } return text; } private void addNotification(String meldung) { if (Boolean.parseBoolean(MVConfig.get(MVConfig.Configs.SYSTEM_NOTIFICATION))) { final JWindow messageFrame = new JWindow(); messageFrame.setLayout(new BorderLayout()); final JPanel panel = new JPanel(); panel.setBackground(Color.BLACK); messageFrame.setContentPane(panel); final JLabel iconLabel = new JLabel(Icons.ICON_NOTIFICATION); iconLabel.setVerticalAlignment(SwingConstants.TOP); messageFrame.getContentPane().add(iconLabel, BorderLayout.WEST); final JLabel meldungsLabel = new JLabel(meldung); meldungsLabel.setForeground(Color.WHITE); messageFrame.getContentPane().add(meldungsLabel, BorderLayout.CENTER); messageFrame.pack(); messageFrame.setFocusableWindowState(false); Notification notification = new Notification(messageFrame, WindowPosition.BOTTOMRIGHT, 20, 20, 6000); NotificationQueue q = new NotificationQueue(); q.add(notification); } } // public class HackyLinuxTrayIconInitialiser extends SwingWorker<Void, TrayIcon> { // // private static final int MAX_ADD_ATTEMPTS = 4; // private static final long ADD_ICON_DELAY = 200; // private static final long ADD_FAILED_DELAY = 1000; // // private TrayIcon[] icons; // // public HackyLinuxTrayIconInitialiser(TrayIcon... ic) { // icons = ic; // } // // @Override // protected Void doInBackground() { // try { // Method addNotify = TrayIcon.class.getDeclaredMethod("addNotify", (Class<?>[]) null); // addNotify.setAccessible(true); // for (TrayIcon icon : icons) { // for (int attempt = 1; attempt < MAX_ADD_ATTEMPTS; attempt++) { // try { // addNotify.invoke(icon, (Object[]) null); // publish(icon); // pause(ADD_ICON_DELAY); // break; // } catch (NullPointerException | IllegalAccessException | IllegalArgumentException e) { // System.err.println("Failed to add icon. Giving up."); // e.printStackTrace(); // break; // } catch (InvocationTargetException e) { // System.err.println("Failed to add icon, attempt " + attempt); // pause(ADD_FAILED_DELAY); // } // } // } // } catch (NoSuchMethodException | SecurityException e1) { // e1.printStackTrace(); // } // return null; // } // // private void pause(long delay) { // try { // Thread.sleep(delay); // } catch (InterruptedException e1) { // e1.printStackTrace(); // } // } // // @Override // protected void process(List<TrayIcon> icons) { // for (TrayIcon icon : icons) { // try { // tray.add(icon); // } catch (AWTException e) { // e.printStackTrace(); // } // } // } // } }