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;
+                       }
+               }
+       }
 }


Reply via email to