Author: jflesch
Date: 2007-06-23 22:53:59 +0000 (Sat, 23 Jun 2007)
New Revision: 13743
Added:
trunk/apps/Thaw/src/thaw/gui/TransferProgressBar.java
Modified:
trunk/apps/Thaw/src/thaw/gui/SysTrayIcon.java
trunk/apps/Thaw/src/thaw/gui/Table.java
trunk/apps/Thaw/src/thaw/i18n/thaw.properties
trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
Log:
When you right-click on the tray icon, now, it displays a dialog with all the
running transfers
Modified: trunk/apps/Thaw/src/thaw/gui/SysTrayIcon.java
===================================================================
--- trunk/apps/Thaw/src/thaw/gui/SysTrayIcon.java 2007-06-23 21:06:34 UTC
(rev 13742)
+++ trunk/apps/Thaw/src/thaw/gui/SysTrayIcon.java 2007-06-23 22:53:59 UTC
(rev 13743)
@@ -130,4 +130,23 @@
}
}
+
+ /**
+ * Return the mouse position on the screen
+ * put here just to keep all the code >= java 1.5 in the same class
+ */
+ public java.awt.Point getMousePosition() {
+ try {
+ Object pointerInfo =
Class.forName("java.awt.MouseInfo").getMethod("getPointerInfo",
(Class[])null).invoke(null, (Object[]) null);
+
+ java.awt.Point location =
(java.awt.Point)Class.forName("java.awt.PointerInfo").getMethod("getLocation",
(Class[])null).invoke(pointerInfo, (Object[])null);
+
+ return location;
+ } catch(Exception e) {
+ Logger.warning(this, "Error while setting popup menu :
"+e.toString());
+ return null;
+ }
+
+ }
+
}
Modified: trunk/apps/Thaw/src/thaw/gui/Table.java
===================================================================
--- trunk/apps/Thaw/src/thaw/gui/Table.java 2007-06-23 21:06:34 UTC (rev
13742)
+++ trunk/apps/Thaw/src/thaw/gui/Table.java 2007-06-23 22:53:59 UTC (rev
13743)
@@ -168,35 +168,8 @@
if (value instanceof FCPTransferQuery) {
final FCPTransferQuery query =
(FCPTransferQuery)value;
- final JProgressBar bar = new JProgressBar(0,
100);
+ final JProgressBar bar = new
TransferProgressBar(query, statusInProgressBars);
- int progress;
-
- bar.setStringPainted(true);
- bar.setBorderPainted(false);
-
- if ((query instanceof FCPClientPut &&
(query.getTransferWithTheNodeProgression() < 100))
- || ((query instanceof FCPClientGet) &&
(query.getTransferWithTheNodeProgression() > 0)))
- progress =
query.getTransferWithTheNodeProgression();
- else
- progress = query.getProgression();
-
- bar.setValue(progress);
-
- if(query.isFinished() && !query.isSuccessful())
-
bar.setString(I18n.getMessage("thaw.common.failed"));
-
- if(query.isFinished() && query.isSuccessful())
-
bar.setString(I18n.getMessage("thaw.common.finished"));
-
- if(!query.isFinished()) {
- if (statusInProgressBars)
- bar.setString(query.getStatus()
+
- " [
"+Integer.toString(progress)+"% ]");
- else
-
bar.setString(Integer.toString(progress)+"%");
- }
-
return bar;
}
Added: trunk/apps/Thaw/src/thaw/gui/TransferProgressBar.java
===================================================================
--- trunk/apps/Thaw/src/thaw/gui/TransferProgressBar.java
(rev 0)
+++ trunk/apps/Thaw/src/thaw/gui/TransferProgressBar.java 2007-06-23
22:53:59 UTC (rev 13743)
@@ -0,0 +1,48 @@
+package thaw.gui;
+
+import javax.swing.JProgressBar;
+
+import thaw.fcp.FCPTransferQuery;
+import thaw.fcp.FCPClientPut;
+import thaw.fcp.FCPClientGet;
+
+import thaw.core.I18n;
+
+public class TransferProgressBar extends JProgressBar {
+
+ public TransferProgressBar(FCPTransferQuery q) {
+ this(q, true);
+ }
+
+ public TransferProgressBar(FCPTransferQuery query, boolean
statusInProgressBar) {
+ super(0, 100);
+
+ int progress;
+
+ setStringPainted(true);
+ setBorderPainted(false);
+
+ if ((query instanceof FCPClientPut &&
(query.getTransferWithTheNodeProgression() < 100))
+ || ((query instanceof FCPClientGet) &&
(query.getTransferWithTheNodeProgression() > 0)))
+ progress = query.getTransferWithTheNodeProgression();
+ else
+ progress = query.getProgression();
+
+ setValue(progress);
+
+ if(query.isFinished() && !query.isSuccessful())
+ setString(I18n.getMessage("thaw.common.failed"));
+
+ if(query.isFinished() && query.isSuccessful())
+ setString(I18n.getMessage("thaw.common.finished"));
+
+ if(!query.isFinished()) {
+ if (statusInProgressBar)
+ setString(query.getStatus() +
+ " [
"+Integer.toString(progress)+"% ]");
+ else
+ setString(Integer.toString(progress)+"%");
+ }
+ }
+
+}
Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2007-06-23 21:06:34 UTC
(rev 13742)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2007-06-23 22:53:59 UTC
(rev 13743)
@@ -498,3 +498,4 @@
thaw.plugin.trayIcon.pluginName=Tray icon
+thaw.plugin.trayIcon.dialogTitle=Thaw transfers
Modified: trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java 2007-06-23 21:06:34 UTC
(rev 13742)
+++ trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java 2007-06-23 22:53:59 UTC
(rev 13743)
@@ -1,22 +1,49 @@
package thaw.plugins;
+import java.util.Comparator;
+import java.util.Collections;
+import java.util.Vector;
+import java.util.Iterator;
+
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import javax.swing.JProgressBar;
+import javax.swing.JLabel;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JScrollPane;
+import javax.swing.JPanel;
+
+import java.awt.Toolkit;
+
+import java.awt.GridLayout;
+import java.awt.BorderLayout;
+
import thaw.core.Core;
import thaw.core.Logger;
import thaw.core.I18n;
+import thaw.fcp.FCPTransferQuery;
+
import thaw.gui.SysTrayIcon;
+import thaw.gui.TransferProgressBar;
+import thaw.gui.IconBox;
-
-public class TrayIcon implements thaw.core.Plugin, MouseListener,
WindowListener {
+public class TrayIcon implements thaw.core.Plugin, MouseListener,
WindowListener, ActionListener {
private Core core;
private SysTrayIcon icon;
+ private JDialog dialog;
+ private JButton closeDialog;
+ public final static int DIALOG_X = 300;
+ public final static int DIALOG_Y = 500;
+
public TrayIcon() {
}
@@ -64,6 +91,150 @@
core.getMainWindow().setNonIconified();
}
+
+ private class QueryComparator implements Comparator {
+ public QueryComparator() {
+
+ }
+
+ public int compare(final Object o1, final Object o2) {
+ int result = 0;
+
+ if(!(o1 instanceof FCPTransferQuery)
+ || !(o2 instanceof FCPTransferQuery))
+ return 0;
+
+ final FCPTransferQuery q1 = (FCPTransferQuery)o1;
+ final FCPTransferQuery q2 = (FCPTransferQuery)o2;
+
+
+ if((q1.getProgression() <= 0)
+ && (q2.getProgression() <= 0)) {
+ if(q1.isRunning() && !q2.isRunning())
+ return 1;
+
+ if(q2.isRunning() && !q1.isRunning())
+ return -1;
+ }
+
+ result = (new
Integer(q1.getProgression())).compareTo(new Integer(q2.getProgression()));
+
+ return result;
+ }
+
+
+ public boolean equals(final Object obj) {
+ return true;
+ }
+
+ public int hashCode(){
+ return super.hashCode();
+ }
+ }
+
+
+ private JPanel getTransferPanel(FCPTransferQuery q) {
+ JPanel p = new JPanel(new GridLayout(2, 1));
+
+ String txt = q.getFilename();
+
+ if (txt == null)
+ txt = q.getFileKey();
+
+ if (txt == null)
+ txt = "?";
+
+ javax.swing.ImageIcon icon;
+
+ if (q.getQueryType() == 2)
+ icon = IconBox.minInsertions;
+ else
+ icon = IconBox.minDownloads;
+
+ JLabel l = new JLabel(txt);
+ l.setIcon(icon);
+
+ p.add(l);
+ p.add(new TransferProgressBar(q));
+
+ return p;
+ }
+
+
+ private void realDisplayFrame(int x, int y) {
+ dialog = new JDialog((java.awt.Frame)null,
+
I18n.getMessage("thaw.plugin.trayIcon.dialogTitle"));
+ dialog.getContentPane().setLayout(new BorderLayout(5, 5));
+ dialog.setUndecorated(true);
+ dialog.setResizable(true);
+
+ JPanel panel = new JPanel(new BorderLayout(10, 10));
+ panel.add(new JLabel(" "), BorderLayout.CENTER);
+
+ Vector queries = core.getQueueManager().getRunningQueue();
+
+ JPanel north;
+
+ Vector newQueries = new Vector();
+
+ synchronized(queries) {
+ for (Iterator it = queries.iterator();
+ it.hasNext();) {
+ newQueries.add(it.next());
+ }
+ }
+
+ Collections.sort(newQueries, new QueryComparator());
+
+
+ north = new JPanel(new GridLayout(queries.size(), 1, 10, 10));
+
+ for (Iterator it = newQueries.iterator();
+ it.hasNext();) {
+
north.add(getTransferPanel((FCPTransferQuery)it.next()));
+ }
+
+
+ JPanel northNorth = new JPanel(new BorderLayout());
+ northNorth.add(new JLabel(" "), BorderLayout.CENTER);
+
+ closeDialog = new JButton(IconBox.minClose);
+ closeDialog.addActionListener(this);
+ northNorth.add(closeDialog, BorderLayout.EAST);
+
+ dialog.getContentPane().add(northNorth, BorderLayout.NORTH);
+ dialog.getContentPane().add(panel, BorderLayout.CENTER);
+
+ panel.add(north,
+ BorderLayout.NORTH);
+
+ dialog.getContentPane().add(new JScrollPane(panel,
+
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
+
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),
+ BorderLayout.CENTER);
+
+ dialog.setLocation(x, y);
+
+ dialog.setSize(DIALOG_X, DIALOG_Y);
+ dialog.setPreferredSize(new java.awt.Dimension(DIALOG_X,
DIALOG_Y));
+ dialog.validate();
+
+ dialog.setVisible(true);
+ }
+
+ public void displayFrame(int x, int y) {
+ java.awt.Dimension d =
Toolkit.getDefaultToolkit().getScreenSize();
+ int screen_x = (int)d.getWidth();
+ int screen_y = (int)d.getHeight();
+
+ if (x+DIALOG_X >= screen_x)
+ x -= DIALOG_X;
+ if (y+DIALOG_Y >= screen_y)
+ y -= DIALOG_Y;
+
+ realDisplayFrame(x, y);
+ }
+
public void windowActivated(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowClosing(WindowEvent e) { }
@@ -78,11 +249,33 @@
public void mouseClicked(MouseEvent e) {
- switchMainWindowVisibility();
+ if (dialog != null) {
+ dialog.setVisible(false);
+ dialog = null;
+ return;
+ }
+
+ if (e.getButton() == MouseEvent.BUTTON1)
+ switchMainWindowVisibility();
+ else if (e.getButton() == MouseEvent.BUTTON3) {
+ if (dialog == null) {
+ java.awt.Point p = icon.getMousePosition();
+ displayFrame(((int)p.getX()), ((int)p.getY()));
+ }
+ }
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getSource() == closeDialog) {
+ if (dialog != null) {
+ dialog.setVisible(false);
+ dialog = null;
+ }
+ }
+ }
}