From a5e3acc3861c9cf95aa5a76785cd9f1a9e55bb6b Mon Sep 17 00:00:00 2001 From: 4pr0n Date: Mon, 7 Apr 2014 21:57:18 -0700 Subject: [PATCH] Notifications on rips when window is hidden #11 --- pom.xml | 2 +- src/main/java/com/rarchives/ripme/App.java | 2 + .../rarchives/ripme/ui/ClipboardUtils.java | 2 +- .../com/rarchives/ripme/ui/MainWindow.java | 162 ++++++++++++------ .../com/rarchives/ripme/ui/UpdateUtils.java | 2 +- 5 files changed, 110 insertions(+), 60 deletions(-) diff --git a/pom.xml b/pom.xml index b0b18606..6551c2fd 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.rarchives.ripme ripme jar - 1.0.9 + 1.0.10 ripme http://rip.rarchives.com diff --git a/src/main/java/com/rarchives/ripme/App.java b/src/main/java/com/rarchives/ripme/App.java index 929f3dfc..d45f4c55 100644 --- a/src/main/java/com/rarchives/ripme/App.java +++ b/src/main/java/com/rarchives/ripme/App.java @@ -25,6 +25,8 @@ public class App { public static final Logger logger = Logger.getLogger(App.class); public static void main(String[] args) throws MalformedURLException { + System.setProperty("apple.laf.useScreenMenuBar", "true"); + System.setProperty("com.apple.mrj.application.apple.menu.about.name", "RipMe"); logger.info("Initialized ripme v" + UpdateUtils.getThisJarVersion()); UpdateUtils.moveUpdatedJar(); if (args.length > 0) { diff --git a/src/main/java/com/rarchives/ripme/ui/ClipboardUtils.java b/src/main/java/com/rarchives/ripme/ui/ClipboardUtils.java index 1cae501b..c6c3cbf4 100644 --- a/src/main/java/com/rarchives/ripme/ui/ClipboardUtils.java +++ b/src/main/java/com/rarchives/ripme/ui/ClipboardUtils.java @@ -71,7 +71,7 @@ class AutoripThread extends Thread { String url = m.group(); if (!rippedURLs.contains(url)) { rippedURLs.add(url); - // TODO Start rip + // TODO Queue rip instead of just starting it MainWindow.ripAlbumStatic(url); } } diff --git a/src/main/java/com/rarchives/ripme/ui/MainWindow.java b/src/main/java/com/rarchives/ripme/ui/MainWindow.java index 55edc01e..0a3b31e5 100644 --- a/src/main/java/com/rarchives/ripme/ui/MainWindow.java +++ b/src/main/java/com/rarchives/ripme/ui/MainWindow.java @@ -13,10 +13,15 @@ import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.SystemTray; import java.awt.TrayIcon; +import java.awt.TrayIcon.MessageType; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; import java.net.MalformedURLException; import java.net.URL; @@ -96,6 +101,7 @@ public class MainWindow implements Runnable, RipStatusHandler { private static JTextField configRetriesText; private static JCheckBox configAutoupdateCheckbox; + private static TrayIcon trayIcon; private static MenuItem trayMenuMain; private static MenuItem trayMenuAbout; private static MenuItem trayMenuExit; @@ -174,63 +180,7 @@ public class MainWindow implements Runnable, RipStatusHandler { } private void createUI(Container pane) { - // System tray - PopupMenu trayMenu = new PopupMenu(); - trayMenuMain = new MenuItem(mainFrame.getTitle()); - trayMenuMain.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - if (mainFrame.isVisible()) { - mainFrame.setVisible(false); - trayMenuMain.setLabel("Show"); - } else { - mainFrame.setVisible(true); - trayMenuMain.setLabel("Hide"); - } - } - }); - trayMenuAbout = new MenuItem("About " + mainFrame.getTitle()); - trayMenuAbout.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - String aboutBlurb = "
Download albums from various websites. rarchives.com"; - JOptionPane.showMessageDialog(null, - aboutBlurb, - mainFrame.getTitle(), - JOptionPane.PLAIN_MESSAGE, - new ImageIcon(mainIcon)); - } - }); - trayMenuExit = new MenuItem("Exit"); - trayMenuExit.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - System.exit(0); - } - }); - trayMenuAutorip = new CheckboxMenuItem("Clipboard Autorip"); - trayMenuAutorip.setState(ClipboardUtils.getClipboardAutoRip()); - trayMenuAutorip.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent arg0) { - ClipboardUtils.setClipboardAutoRip(trayMenuAutorip.getState()); - } - }); - trayMenu.add(trayMenuMain); - trayMenu.add(trayMenuAbout); - trayMenu.addSeparator(); - trayMenu.add(trayMenuAutorip); - trayMenu.addSeparator(); - trayMenu.add(trayMenuExit); - try { - mainIcon = ImageIO.read(getClass().getClassLoader().getResource("icon.png")); - TrayIcon trayIcon = new TrayIcon(mainIcon); - trayIcon.setToolTip(mainFrame.getTitle()); - trayIcon.setPopupMenu(trayMenu); - SystemTray.getSystemTray().add(trayIcon); - } catch (Exception e) { - e.printStackTrace(); - } + setupTrayIcon(); EmptyBorder emptyBorder = new EmptyBorder(5, 5, 5, 5); GridBagConstraints gbc = new GridBagConstraints(); @@ -263,6 +213,7 @@ public class MainWindow implements Runnable, RipStatusHandler { gbc.gridx = 0; statusPanel.add(statusLabel, gbc); gbc.gridy = 1; statusPanel.add(openButton, gbc); + gbc.gridy = 0; JPanel progressPanel = new JPanel(new GridBagLayout()); progressPanel.setBorder(emptyBorder); @@ -484,6 +435,92 @@ public class MainWindow implements Runnable, RipStatusHandler { } }); } + + private void setupTrayIcon() { + mainFrame.addWindowListener(new WindowAdapter() { + public void windowActivated(WindowEvent e) { trayMenuMain.setLabel("Hide"); } + public void windowDeactivated(WindowEvent e) { trayMenuMain.setLabel("Show"); } + public void windowDeiconified(WindowEvent e) { trayMenuMain.setLabel("Hide"); } + public void windowIconified(WindowEvent e) { trayMenuMain.setLabel("Show"); } + }); + PopupMenu trayMenu = new PopupMenu(); + trayMenuMain = new MenuItem("Hide"); + trayMenuMain.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + toggleTrayClick(); + } + }); + trayMenuAbout = new MenuItem("About " + mainFrame.getTitle()); + trayMenuAbout.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + String aboutBlurb = "
Download albums from various websites. rarchives.com"; + JOptionPane.showMessageDialog(null, + aboutBlurb, + mainFrame.getTitle(), + JOptionPane.PLAIN_MESSAGE, + new ImageIcon(mainIcon)); + } + }); + trayMenuExit = new MenuItem("Exit"); + trayMenuExit.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + System.exit(0); + } + }); + trayMenuAutorip = new CheckboxMenuItem("Clipboard Autorip"); + trayMenuAutorip.setState(ClipboardUtils.getClipboardAutoRip()); + trayMenuAutorip.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent arg0) { + ClipboardUtils.setClipboardAutoRip(trayMenuAutorip.getState()); + } + }); + trayMenu.add(trayMenuMain); + trayMenu.add(trayMenuAbout); + trayMenu.addSeparator(); + trayMenu.add(trayMenuAutorip); + trayMenu.addSeparator(); + trayMenu.add(trayMenuExit); + try { + mainIcon = ImageIO.read(getClass().getClassLoader().getResource("icon.png")); + trayIcon = new TrayIcon(mainIcon); + trayIcon.setToolTip(mainFrame.getTitle()); + trayIcon.setImageAutoSize(true); + trayIcon.setPopupMenu(trayMenu); + SystemTray.getSystemTray().add(trayIcon); + trayIcon.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + toggleTrayClick(); + if (mainFrame.getExtendedState() != JFrame.NORMAL) { + mainFrame.setExtendedState(JFrame.NORMAL); + } + mainFrame.setAlwaysOnTop(true); + mainFrame.setAlwaysOnTop(false); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void toggleTrayClick() { + if (mainFrame.getExtendedState() == JFrame.ICONIFIED + || !mainFrame.isActive() + || !mainFrame.isVisible()) { + mainFrame.setVisible(true); + mainFrame.setAlwaysOnTop(true); + mainFrame.setAlwaysOnTop(false); + trayMenuMain.setLabel("Hide"); + } + else { + mainFrame.setVisible(false); + trayMenuMain.setLabel("Show"); + } + } private void appendLog(final String text, final Color color) { SimpleAttributeSet sas = new SimpleAttributeSet(); @@ -547,6 +584,17 @@ public class MainWindow implements Runnable, RipStatusHandler { ripper.setObserver((RipStatusHandler) this); Thread t = new Thread(ripper); t.start(); + if (!mainFrame.isVisible()) { + mainFrame.toFront(); + mainFrame.setAlwaysOnTop(true); + trayIcon.displayMessage(mainFrame.getTitle(), "Started ripping " + ripper.getURL().toExternalForm(), MessageType.INFO); + mainFrame.setAlwaysOnTop(false); + } else if (!mainFrame.isActive()) { + mainFrame.toFront(); + mainFrame.setAlwaysOnTop(true); + trayIcon.displayMessage(mainFrame.getTitle(), "Started ripping " + ripper.getURL().toExternalForm(), MessageType.INFO); + mainFrame.setAlwaysOnTop(false); + } return t; } catch (Exception e) { logger.error("[!] Error while ripping: " + e.getMessage(), e); diff --git a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java index 460cb9ae..5dd97679 100644 --- a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java +++ b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java @@ -17,7 +17,7 @@ import org.jsoup.nodes.Document; public class UpdateUtils { private static final Logger logger = Logger.getLogger(UpdateUtils.class); - private static final String DEFAULT_VERSION = "1.0.9"; + private static final String DEFAULT_VERSION = "1.0.10"; private static final String updateJsonURL = "http://rarchives.com/ripme.json"; private static final String updateJarURL = "http://rarchives.com/ripme.jar"; private static final String mainFileName = "ripme.jar";