Author: jflesch
Date: 2007-07-06 16:33:03 +0000 (Fri, 06 Jul 2007)
New Revision: 13956

Added:
   trunk/apps/Thaw/src/thaw/plugins/transferLogs/
   trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java
   trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java
   trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java
Modified:
   trunk/apps/Thaw/src/thaw/gui/Table.java
   trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties
   trunk/apps/Thaw/src/thaw/i18n/thaw.properties
   trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties
   trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java
   trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
   trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
   trunk/apps/Thaw/src/thaw/plugins/index/Index.java
   trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
Log:
Rewrite of the transferlogs plugin : better UI ; page per page display

Modified: trunk/apps/Thaw/src/thaw/gui/Table.java
===================================================================
--- trunk/apps/Thaw/src/thaw/gui/Table.java     2007-07-06 16:15:16 UTC (rev 
13955)
+++ trunk/apps/Thaw/src/thaw/gui/Table.java     2007-07-06 16:33:03 UTC (rev 
13956)
@@ -14,6 +14,7 @@
 import javax.swing.JProgressBar;
 import javax.swing.JTextArea;
 import javax.swing.JLabel;
+import javax.swing.JPanel;
 import java.awt.Color;
 import java.awt.Component;
 import javax.swing.ImageIcon;
@@ -44,8 +45,6 @@
        private boolean hasChanged = false;
        private Thread savingThread;

-       private int columnWithKeys = -1;
-
        private boolean statusInProgressBars = true;

        public Table(Config config, String prefix) {
@@ -104,16 +103,19 @@
                setAsListener();
        }

+       private DefaultRenderer renderer;
+
        public void specifyColumnWithKeys(int c) {
-               columnWithKeys = c;
+               renderer.specifyColumnWithKeys(c);
        }

        public void showStatusInProgressBars(boolean v) {
-               statusInProgressBars = v;
+               renderer.showStatusInProgressBars(v);
        }

        public void setDefaultRenderer() {
-               setDefaultRenderer(getColumnClass(0), new DefaultRenderer());
+               renderer = new DefaultRenderer();
+               setDefaultRenderer(getColumnClass(0), renderer);
        }


@@ -149,22 +151,33 @@



-       protected class DefaultRenderer extends DefaultTableCellRenderer {
+       public static class DefaultRenderer extends DefaultTableCellRenderer {
                private final static long serialVersionUID = 20060821;

+               private boolean statusInProgressBars = true;
+               private int columnWithKeys = -1;
+
                private Color softGray;

+
                public DefaultRenderer() {
                        softGray = new Color(240,240,240);
                }

-               public Component getTableCellRendererComponent(final JTable 
table, final Object value,
+               public void showStatusInProgressBars(boolean v) {
+                       statusInProgressBars = v;
+               }
+
+               public void specifyColumnWithKeys(int c) {
+                       columnWithKeys = c;
+               }
+
+               public Component getTableCellRendererComponent(final JTable 
table, Object value,
                                                               final boolean 
isSelected, final boolean hasFocus,
                                                               final int row, 
final int column) {

                        if (value == null)
-                               return 
super.getTableCellRendererComponent(table, "",
-                                                                          
isSelected, hasFocus, row, column);
+                               value = "";

                        if (value instanceof FCPTransferQuery) {
                                final FCPTransferQuery query = 
(FCPTransferQuery)value;
@@ -176,7 +189,9 @@
                        Component cell;

                        if (value instanceof ImageIcon) {
-                               cell = new JLabel(((ImageIcon)value));
+                               return new JLabel(((ImageIcon)value));
+                       } if (value instanceof JPanel) {
+                               cell = (Component)value;
                        } else if(value instanceof Long) {

                                cell = 
super.getTableCellRendererComponent(table,
@@ -189,8 +204,8 @@
                                area.setLineWrap(true);
                                area.setWrapStyleWord(true);

-                               if (getRowHeight(row) < 
area.getPreferredSize().getHeight())
-                                       
setRowHeight((int)area.getPreferredSize().getHeight());
+                               if (table.getRowHeight(row) < 
area.getPreferredSize().getHeight())
+                                       
table.setRowHeight((int)area.getPreferredSize().getHeight());

                                cell = area;


Modified: trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties     2007-07-06 
16:15:16 UTC (rev 13955)
+++ trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties     2007-07-06 
16:33:03 UTC (rev 13956)
@@ -36,6 +36,10 @@

 thaw.common.localPath=Chemin local
 thaw.common.priority=Priorit?
+
+# for page per page
+thaw.common.page=Page
+
 thaw.common.try=Essai
 thaw.common.key=Clef

@@ -479,18 +483,21 @@
 thaw.plugin.transferLogs.copyKey=Copier les clefs li?es aux entr?es 
s?lectionn?es

 thaw.plugin.transferLogs.date=Date
+thaw.plugin.transferLogs.dates=Date(s)
+thaw.plugin.transferLogs.dateStart=D?marr? le:
+thaw.plugin.trasnferLogs.dateEnd=Fini le:
 thaw.plugin.transferLogs.message=Message
 thaw.plugin.transferLogs.key=Clef
+thaw.plugin.transferLogs.file=Fichier
+thaw.plugin.transferLogs.fileSize=Taille
+thaw.plugin.transferLogs.isSuccess=R?ussi
+thaw.plugin.transferLogs.averageSpeed=Vitesse moyenne
 thaw.plugin.transferLogs.isDup=Est-ce que la clef a d?j? ?t? vue ?

-thaw.plugin.transferLogs.download.added=T?l?chargement ajout?
-thaw.plugin.transferLogs.download.failed=T?l?chargement ?chou?
-thaw.plugin.transferLogs.download.successful=T?l?chargement r?ussi
+thaw.plugin.transferLogs.type=Type
+thaw.plugin.transferLogs.type.download=T?l?chargement
+thaw.plugin.transferLogs.type.insertion=Insertion

-thaw.plugin.transferLogs.insertion.added=Insertion ajout?e
-thaw.plugin.transferLogs.insertion.failed=Insertion ?chou?e
-thaw.plugin.transferLogs.insertion.successful=Insertion r?ussie
-
 thaw.plugin.transferLogs.finalStatus=Status final
 thaw.plugin.transferLogs.none=(aucune)


Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties       2007-07-06 16:15:16 UTC 
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties       2007-07-06 16:33:03 UTC 
(rev 13956)
@@ -57,6 +57,9 @@
 thaw.common.no=No
 thaw.common.priority=Priority

+# for page per page
+thaw.common.page=Page
+
 thaw.common.clearFinished=Remove finished transfers
 # The following one *must* specify that this is about the transfer(s) only !
 thaw.common.removeFromTheList=Cancel and remove selected transfers
@@ -492,19 +495,21 @@
 thaw.plugin.transferLogs.copyKey=Copy the keys related to the selected entries

 thaw.plugin.transferLogs.date=Date
+thaw.plugin.transferLogs.dates=Date(s)
+thaw.plugin.transferLogs.dateStart=Started:
+thaw.plugin.transferLogs.dateEnd=Ended:
 thaw.plugin.transferLogs.message=Message
 thaw.plugin.transferLogs.key=Key
+thaw.plugin.transferLogs.file=File
+thaw.plugin.transferLogs.fileSize=File size
+thaw.plugin.transferLogs.isSuccess=Successful
+thaw.plugin.transferLogs.averageSpeed=Average speed
 thaw.plugin.transferLogs.isDup=has the key already been seen ?

-thaw.plugin.transferLogs.download.added=Download added
-thaw.plugin.transferLogs.download.failed=Download failed
-thaw.plugin.transferLogs.download.successful=Download successful
+thaw.plugin.transferLogs.type=Type
+thaw.plugin.transferLogs.type.download=Download
+thaw.plugin.transferLogs.type.insertion=Insertion

-thaw.plugin.transferLogs.insertion.added=Insertion added
-thaw.plugin.transferLogs.insertion.failed=Insertion failed
-thaw.plugin.transferLogs.insertion.successful=Insertion successful
-
-thaw.plugin.transferLogs.finalStatus=Final status
 thaw.plugin.transferLogs.none=(none)

 thaw.plugin.transferLogs.importKeys=Import key list

Modified: trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties    2007-07-06 16:15:16 UTC 
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties    2007-07-06 16:33:03 UTC 
(rev 13956)
@@ -36,6 +36,10 @@

 thaw.common.localPath=Chemin local
 thaw.common.priority=Priorit\u00e9
+
+# for page per page
+thaw.common.page=Page
+
 thaw.common.try=Essai
 thaw.common.key=Clef

@@ -479,18 +483,21 @@
 thaw.plugin.transferLogs.copyKey=Copier les clefs li\u00e9es aux entr\u00e9es 
s\u00e9lectionn\u00e9es

 thaw.plugin.transferLogs.date=Date
+thaw.plugin.transferLogs.dates=Date(s)
+thaw.plugin.transferLogs.dateStart=D\u00e9marr\u00e9 le:
+thaw.plugin.trasnferLogs.dateEnd=Fini le:
 thaw.plugin.transferLogs.message=Message
 thaw.plugin.transferLogs.key=Clef
+thaw.plugin.transferLogs.file=Fichier
+thaw.plugin.transferLogs.fileSize=Taille
+thaw.plugin.transferLogs.isSuccess=R\u00e9ussi
+thaw.plugin.transferLogs.averageSpeed=Vitesse moyenne
 thaw.plugin.transferLogs.isDup=Est-ce que la clef a d\u00e9j\u00e0 
\u00e9t\u00e9 vue ?

-thaw.plugin.transferLogs.download.added=T\u00e9l\u00e9chargement ajout\u00e9
-thaw.plugin.transferLogs.download.failed=T\u00e9l\u00e9chargement 
\u00e9chou\u00e9
-thaw.plugin.transferLogs.download.successful=T\u00e9l\u00e9chargement 
r\u00e9ussi
+thaw.plugin.transferLogs.type=Type
+thaw.plugin.transferLogs.type.download=T\u00e9l\u00e9chargement
+thaw.plugin.transferLogs.type.insertion=Insertion

-thaw.plugin.transferLogs.insertion.added=Insertion ajout\u00e9e
-thaw.plugin.transferLogs.insertion.failed=Insertion \u00e9chou\u00e9e
-thaw.plugin.transferLogs.insertion.successful=Insertion r\u00e9ussie
-
 thaw.plugin.transferLogs.finalStatus=Status final
 thaw.plugin.transferLogs.none=(aucune)


Modified: trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java  2007-07-06 16:15:16 UTC 
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java  2007-07-06 16:33:03 UTC 
(rev 13956)
@@ -45,13 +45,19 @@
 import thaw.fcp.FCPTransferQuery;
 import thaw.fcp.FreenetURIHelper;

+import thaw.plugins.transferLogs.*;

-/**
- * Quick and dirty plugin to log the transfers
- */
+
 public class TransferLogs implements Plugin, ActionListener, Observer {
-       public final static String MAX_DISPLAYED = "1000";
+       public final static byte TRANSFER_TYPE_NULL      = 0;
+       public final static byte TRANSFER_TYPE_DOWNLOAD  = 1;
+       public final static byte TRANSFER_TYPE_INSERTION = 2;

+       public final static String[] TRANSFER_TYPE_NAMES = {
+               I18n.getMessage("thaw.plugin.transferLogs.importedKey"),
+               I18n.getMessage("thaw.common.download"),
+               I18n.getMessage("thaw.common.insertion")
+       };

        private Core core;
        private Hsqldb db;
@@ -60,15 +66,12 @@


        private JButton purgeLogs;
-       private JButton copyKey;

        private JButton importKeys;
        private JButton exportKeys;

+       private TransferTable table;

-       private Table table;
-       private EventListModel model;
-
        public TransferLogs() {

        }
@@ -102,19 +105,18 @@
                JLabel topLabel = new 
JLabel(I18n.getMessage("thaw.plugin.transferLogs.transferLogs"));
                topLabel.setIcon(IconBox.file);

-               model = new EventListModel();
-               model.reloadList();

-               table = new Table(core.getConfig(), "transfer_log_table",
-                                       model);
+               table = new TransferTable(db, core.getConfig());

-               purgeLogs = new 
JButton(I18n.getMessage("thaw.plugin.transferLogs.purgeLogs"), 
IconBox.minDelete);
-               copyKey = new 
JButton(I18n.getMessage("thaw.plugin.transferLogs.copyKey"), IconBox.minCopy );
-               importKeys = new 
JButton(I18n.getMessage("thaw.plugin.transferLogs.importKeys"), 
IconBox.minImportAction);
-               exportKeys = new 
JButton(I18n.getMessage("thaw.plugin.transferLogs.exportKeys"), 
IconBox.minExportAction);

+               purgeLogs  = new 
JButton(I18n.getMessage("thaw.plugin.transferLogs.purgeLogs"),
+                                        IconBox.minDelete);
+               importKeys = new 
JButton(I18n.getMessage("thaw.plugin.transferLogs.importKeys"),
+                                        IconBox.minImportAction);
+               exportKeys = new 
JButton(I18n.getMessage("thaw.plugin.transferLogs.exportKeys"),
+                                        IconBox.minExportAction);
+
                purgeLogs.addActionListener(this);
-               copyKey.addActionListener(this);
                importKeys.addActionListener(this);
                exportKeys.addActionListener(this);

@@ -123,17 +125,16 @@
                buttonPanel.add(purgeLogs);
                buttonPanel.add(importKeys);
                buttonPanel.add(exportKeys);
-               buttonPanel.add(copyKey);

                JPanel southPanel = new JPanel(new BorderLayout());
                southPanel.add(buttonPanel, BorderLayout.WEST);
                southPanel.add(new JLabel(""), BorderLayout.CENTER);

                tab.add(topLabel, BorderLayout.NORTH);
-               tab.add(new JScrollPane(table), BorderLayout.CENTER);
+               tab.add(table.getPanel(), BorderLayout.CENTER);
                tab.add(southPanel, BorderLayout.SOUTH);

-               setAsObserverEverywhere(true);
+               setAsObserverEverywhere();

                
core.getMainWindow().addTab(I18n.getMessage("thaw.plugin.transferLogs.transferLogsShort"),
                                            thaw.gui.IconBox.file,
@@ -145,8 +146,12 @@

        public boolean stop() {
                core.getMainWindow().removeTab(tab);
-               setAsObserverEverywhere(false);
+               core.getQueueManager().deleteObserver(this);

+               /* TODO : delete observers ! */
+               /* Hm should we ? Just remove the observer on the queue should 
be enought ? */
+               /* Others observers will just keep data sync ? */
+
                db.unregisterChild(this);

                return false;
@@ -164,21 +169,44 @@


        protected void createTables() {
-               /*
-                * this db structure is dirty, I know it, and at the moment,
-                * I don't care => I will fix it later
-                */
-               sendQuery("CREATE CACHED TABLE transferEvents ("
+               sendQuery("CREATE CACHED TABLE transferLogs ("
                          + "id INTEGER IDENTITY NOT NULL,"
-                         + "date TIMESTAMP NOT NULL,"
-                         + "msg VARCHAR(500) NOT NULL,"
+                         + "dateStart TIMESTAMP NOT NULL,"
+                         + "dateEnd TIMESTAMP NULL,"
+                         + "transferType TINYINT NOT NULL,"
                          + "key VARCHAR(500) NULL,"
+                         + "filename VARCHAR(128) NULL, "
+                         + "size BIGINT NULL, " /* long */
                          + "isDup BOOLEAN NOT NULL, "
                          + "isSuccess BOOLEAN NOT NULL, "
                          + "PRIMARY KEY (id))");
        }

+       protected boolean isDup(String key) {
+               return isDup(db, key);
+       }

+       public static boolean isDup(Hsqldb db, String key) {
+               try {
+                       synchronized(db.dbLock) {
+
+                               PreparedStatement st;
+
+                               st = 
db.getConnection().prepareStatement("SELECT id FROM transferEvents "+
+                                                                        "WHERE 
LOWER(key) LIKE ? AND isSuccess = TRUE");
+                               st.setString(1, 
FreenetURIHelper.getComparablePart(key)+"%");
+                               ResultSet set = st.executeQuery();
+                               return set.next();
+
+                       }
+               } catch(SQLException e) {
+                       Logger.error(new TransferLogs(), "Unable to know if a 
key is dup in the event because : "+e.toString());
+               }
+
+               return false;
+       }
+
+
        /**
         * Returns no error / Throws no exception.
         * @return false if an exception happened
@@ -198,174 +226,30 @@

        /**
         * Add the current plugin as an observer on all the running query
-        * @param really if set to false, will deleteObserver() instead of 
addObserver()
         */
-       public void setAsObserverEverywhere(boolean really) {
-               if (really)
-                       core.getQueueManager().addObserver(this);
-               else
-                       core.getQueueManager().deleteObserver(this);
-
-
+       public void setAsObserverEverywhere() {
                Vector runningQueue = core.getQueueManager().getRunningQueue();

                synchronized(runningQueue) {
                        for (Iterator it = runningQueue.iterator();
                             it.hasNext();) {
                                FCPTransferQuery query = 
(FCPTransferQuery)it.next();
-
-                               if (really) {
-                                       if (query.isFinished() && 
!isDup(query.getFileKey()))
-                                               notifyEnd(query);
-
-                                       if (query instanceof Observable)
-                                               
((Observable)query).addObserver(this);
-                               } else {
-                                       if (query instanceof Observable)
-                                               
((Observable)query).deleteObserver(this);
-                               }
+                               notifyAddition(query);
                        }
-               }
-       }

-
-       protected boolean isDup(String key) {
-               try {
-                       synchronized(db.dbLock) {
-
-                               PreparedStatement st;
-
-                               st = 
db.getConnection().prepareStatement("SELECT id FROM transferEvents "+
-                                                                        "WHERE 
LOWER(key) LIKE ? AND isSuccess = TRUE");
-                               st.setString(1, 
FreenetURIHelper.getComparablePart(key)+"%");
-                               ResultSet set = st.executeQuery();
-                               return set.next();
-
-                       }
-               } catch(SQLException e) {
-                       Logger.error(this, "Unable to know if a key is dup in 
the event because : "+e.toString());
+                       core.getQueueManager().addObserver(this);
                }
-
-               return false;
        }


-       protected void notifyAddition(FCPTransferQuery query) {
-               String str;
-               String key;

-               if (query.getQueryType() == 0)
-                       return;
-
-               if (query.getQueryType() == 1) {
-                       str = 
I18n.getMessage("thaw.plugin.transferLogs.download.added") + " : "
-                               + query.getFilename();
-                       key = query.getFileKey();
-               } else {
-                       if (query.getPath() == null)
-                               return;
-
-                       str =  
I18n.getMessage("thaw.plugin.transferLogs.insertion.added") + " : "
-                               + query.getPath();
-                       key = null;
-               }
-
-               java.sql.Timestamp date = new java.sql.Timestamp((new 
java.util.Date()).getTime());
-
-               boolean isDup;
-
-               if (key != null)
-                       isDup = isDup(key);
-               else
-                       isDup = false;
-
-               try {
-                       synchronized(db.dbLock) {
-                               PreparedStatement st;
-
-
-                               st = 
db.getConnection().prepareStatement("INSERT INTO transferEvents "+
-                                                                        
"(date, msg, key, isDup, isSuccess) "+
-                                                                        " 
VALUES "+
-                                                                        "(?, 
?, ?, ?, FALSE)");
-                               st.setTimestamp(1, date);
-                               st.setString(2, str);
-                               st.setString(3, key);
-                               st.setBoolean(4, isDup);
-
-                               st.execute();
-                       }
-               } catch(SQLException e) {
-                       Logger.error(this, "Error while adding an event to the 
logs: "+e.toString());
-               }
-
-               model.reloadList();
+       protected void notifyAddition(FCPTransferQuery query) {
+               new Transfer(db, query, table);
+               table.refresh();
        }


-       protected void notifyEnd(FCPTransferQuery query) {
-               String str;
-               String key;

-               if (query.isFinished() && query instanceof Observable)
-                       ((Observable)query).deleteObserver(this);
-
-               if (query.getQueryType() == 0 || !query.isFinished())
-                       return;
-
-               if (query.getQueryType() == 1)
-                       str = "thaw.plugin.transferLogs.download.";
-               else
-                       str = "thaw.plugin.transferLogs.insertion.";
-
-               if (query.isSuccessful())
-                       str = I18n.getMessage(str+"successful");
-               else
-                       str = I18n.getMessage(str+"failed");
-
-               key = query.getFileKey();
-
-               str += " : "+query.getFilename();
-
-               str += "\n" + 
I18n.getMessage("thaw.plugin.transferLogs.finalStatus") + " : 
"+query.getStatus();
-
-               boolean isDup;
-               boolean isSuccess = query.isSuccessful();
-
-               if (key != null)
-                       isDup = isDup(key);
-               else
-                       isDup = false;
-
-               java.sql.Timestamp date = new java.sql.Timestamp((new 
java.util.Date()).getTime());
-
-
-               try {
-                       synchronized(db.dbLock) {
-                               PreparedStatement st;
-
-
-                               st = 
db.getConnection().prepareStatement("INSERT INTO transferEvents "+
-                                                                        
"(date, msg, key, isDup, isSuccess) "+
-                                                                        " 
VALUES "+
-                                                                        "(?, 
?, ?, ?, ?)");
-                               st.setTimestamp(1, date);
-                               st.setString(2, str);
-                               st.setString(3, key);
-                               st.setBoolean(4, isDup);
-                               st.setBoolean(5, isSuccess);
-
-                               st.execute();
-                       }
-               } catch(SQLException e) {
-                       Logger.error(this, "Error while adding an event to the 
logs: "+e.toString());
-               }
-
-
-               model.reloadList();
-       }
-
-
        public void update(Observable o, Object param) {

                if (o instanceof FCPQueueManager) {
@@ -378,167 +262,15 @@

                        if(core.getQueueManager().isInTheQueues(query)
                           && query.isRunning()) { // then it's an addition
-                               if (query instanceof Observable)
-                                       ((Observable)query).addObserver(this);
-                               if 
(core.getQueueManager().isQueueCompletlyLoaded())
-                                       notifyAddition(query);
+                               notifyAddition(query);
                                return;
                        }
                }

-
-               if (o instanceof FCPTransferQuery) {
-                       FCPTransferQuery query = (FCPTransferQuery)o;
-
-                       if (query.isFinished()) {
-                               notifyEnd(query);
-                               return;
-                       }
-               }
        }


-       private class Event {
-               private java.sql.Timestamp date;
-               private String msg;
-               private String key;
-               private boolean isDup;

-               public Event(java.sql.Timestamp date, String message, String 
key, boolean isDup) {
-                       this.date = date;
-                       this.msg = message;
-                       this.key = key;
-                       this.isDup = isDup;
-               }
-
-               public java.sql.Timestamp getDate() {
-                       return date;
-               }
-
-               public String getMsg() {
-                       return msg;
-               }
-
-               public String getKey() {
-                       return key;
-               }
-
-               public boolean isDup() {
-                       return isDup;
-               }
-       }
-
-       private class EventListModel extends 
javax.swing.table.AbstractTableModel {
-               private static final long serialVersionUID = 1L;
-
-               private DateFormat dateFormat;
-
-               public String[] columnNames =
-               {
-                       I18n.getMessage("thaw.plugin.transferLogs.date"),
-                       I18n.getMessage("thaw.plugin.transferLogs.message"),
-                       I18n.getMessage("thaw.plugin.transferLogs.key"),
-                       I18n.getMessage("thaw.plugin.transferLogs.isDup")
-               };
-
-
-               public Vector events = null; /* thaw.plugins.index.File Vector 
*/
-
-
-               public EventListModel() {
-                       super();
-                       dateFormat = DateFormat.getDateTimeInstance();
-               }
-
-               public void reloadList() {
-                       events = null;
-
-                       try {
-                               synchronized(db.dbLock) {
-                                       PreparedStatement st;
-
-                                       st = 
db.getConnection().prepareStatement("SELECT date, msg, key, isDup FROM "+
-                                                                               
 "transferEvents ORDER BY date DESC LIMIT "+MAX_DISPLAYED);
-
-                                       ResultSet set = st.executeQuery();
-
-                                       events = new Vector();
-
-                                       while(set.next()) {
-                                               events.add(new 
Event(set.getTimestamp("date"),
-                                                                    
set.getString("msg"),
-                                                                    
set.getString("key"),
-                                                                    
set.getBoolean("isDup")));
-                                       }
-                               }
-                       } catch(SQLException e) {
-                               Logger.error(this, "Error while getting the 
list of events from the logs: "+e.toString());
-                       }
-
-                       refresh();
-               }
-
-
-               protected void refresh() {
-                       final TableModelEvent event = new TableModelEvent(this);
-                       fireTableChanged(event);
-               }
-
-               public int getRowCount() {
-                       if (events == null)
-                               return 0;
-
-                       return events.size();
-               }
-
-               public int getColumnCount() {
-                       return columnNames.length;
-               }
-
-               public String getColumnName(final int column) {
-                       return columnNames[column];
-
-               }
-
-               public Object getValueAt(final int row, final int column) {
-                       if (events == null)
-                               return null;
-
-                       if (column == 0)
-                               return 
dateFormat.format(((Event)events.get(row)).getDate());
-
-                       if (column == 1)
-                               return ((Event)events.get(row)).getMsg();
-
-                       if (column == 2) {
-                               String key = ((Event)events.get(row)).getKey();
-                               return key != null ? key : 
I18n.getMessage("thaw.plugin.transferLogs.none");
-                       }
-
-                       if (column == 3)
-                               return ((Event)events.get(row)).isDup() ? "X" : 
"";
-
-                       return null;
-               }
-
-
-               public Vector getSelectedRows(Table table) {
-                       int[] selectedRows = table.getSelectedRows();
-
-                       if (selectedRows == null)
-                               return null;
-
-                       Vector r = new Vector();
-
-                       for (int i = 0 ; i < selectedRows.length ; i++) {
-                               r.add(events.get(selectedRows[i]));
-                       }
-
-                       return r;
-               }
-       }
-
-
        private File chooseFile(boolean save) {
                FileChooser fileChooser = new FileChooser();
                
fileChooser.setTitle(I18n.getMessage("thaw.plugin.transferLogs.chooseFile"));
@@ -549,11 +281,16 @@
        }


+       public static java.sql.Timestamp getNow() {
+               return new java.sql.Timestamp((new java.util.Date()).getTime());
+       }
+
+
        private class KeyImporter implements Runnable {
                public KeyImporter() { }

                public void run() {
-                       java.sql.Timestamp date = new java.sql.Timestamp((new 
java.util.Date()).getTime());
+                       java.sql.Timestamp date = getNow();


                        File file  = chooseFile(false);
@@ -569,6 +306,18 @@

                                String strLine;

+                               PreparedStatement st = null;
+
+                               try {
+                                       st = 
db.getConnection().prepareStatement("INSERT INTO transferLogs "+
+                                                                               
 "(dateStart, dateEnd, transferType,"+
+                                                                               
 " key, filename, size, isDup, isSuccess) "+
+                                                                               
 " VALUES "+
+                                                                               
 "(?, ?, 0, ?, ?, NULL, ?, TRUE)");
+                               } catch(SQLException e) {
+                                       Logger.error(this, "Error while 
preparing to import keys : "+e.toString()); 
+                               }
+
                                while ((strLine = br.readLine()) != null)   {
                                        String key = strLine.trim();

@@ -576,21 +325,14 @@
                                                continue;

                                        boolean isDup = isDup(key);
-                                       String str = 
I18n.getMessage("thaw.plugin.transferLogs.importedKey")
-                                               + " : 
"+FreenetURIHelper.getFilenameFromKey(key);

                                        try {
                                                synchronized(db.dbLock) {
-                                                       PreparedStatement st;
-
-                                                       st = 
db.getConnection().prepareStatement("INSERT INTO transferEvents "+
-                                                                               
                 "(date, msg, key, isDup, isSuccess) "+
-                                                                               
                 " VALUES "+
-                                                                               
                 "(?, ?, ?, ?, FALSE)");
                                                        st.setTimestamp(1, 
date);
-                                                       st.setString(2, str);
+                                                       st.setTimestamp(2, 
date);
                                                        st.setString(3, key);
-                                                       st.setBoolean(4, isDup);
+                                                       st.setString(4, 
FreenetURIHelper.getFilenameFromKey(key));
+                                                       st.setBoolean(5, isDup);

                                                        st.execute();
                                                }
@@ -607,7 +349,7 @@
                                Logger.error(this, "(2) Unable to import keys 
because: "+e.toString());
                        }

-                       model.reloadList();
+                       table.refresh();
                }
        }

@@ -628,8 +370,9 @@
                                        PreparedStatement st;

                                        st = 
db.getConnection().prepareStatement("SELECT DISTINCT key "+
-                                                                               
 "FROM transferEvents "+
-                                                                               
 "WHERE key is NOT NULL");
+                                                                               
 "FROM transferLogs "+
+                                                                               
 "WHERE key is NOT NULL"+
+                                                                               
 " AND isSuccess = TRUE");

                                        ResultSet set = st.executeQuery();

@@ -657,35 +400,15 @@

                if (e.getSource() == purgeLogs) {
                        sendQuery("DROP TABLE transferEvents");
+                       sendQuery("DROP TABLE transferLogs");
                        createTables();

-                       model.reloadList();
+                       table.refresh();

                        return;
                }

-               if (e.getSource() == copyKey) {
-                       Vector v = model.getSelectedRows(table);

-                       if (v == null)
-                               return;
-
-                       String str = "";
-
-                       for (Iterator it = v.iterator();
-                            it.hasNext();) {
-                               String key = ((Event)it.next()).getKey();
-
-                               if (key != null)
-                                       str += key + "\n";
-                       }
-
-                       GUIHelper.copyToClipboard(str);
-
-                       return;
-               }
-
-
                if (e.getSource() == importKeys) {
                        Thread th = new Thread(new KeyImporter());
                        th.start();

Modified: trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java      2007-07-06 16:15:16 UTC 
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java      2007-07-06 16:33:03 UTC 
(rev 13956)
@@ -41,7 +41,7 @@
        private JDialog dialog;
        private JButton closeDialog;

-       public final static int DIALOG_X = 300;
+       public final static int DIALOG_X = 400;
        public final static int DIALOG_Y = 500;



Modified: trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java    
2007-07-06 16:15:16 UTC (rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java    
2007-07-06 16:33:03 UTC (rev 13956)
@@ -21,7 +21,7 @@

 public class FileManagementHelper {
        /**
-        * Class implementing IndexAction will automatically do an 
addActionListener if necessary
+        * Class implementing FileAction will automatically do an 
addActionListener if necessary
         */
        public interface FileAction extends ActionListener {


Modified: trunk/apps/Thaw/src/thaw/plugins/index/Index.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/Index.java   2007-07-06 16:15:16 UTC 
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/index/Index.java   2007-07-06 16:33:03 UTC 
(rev 13956)
@@ -786,8 +786,6 @@
                        return 0;
                }

-               Logger.info(this, "Getting lastest version ...");
-
                String key;

                if (specificRev >= 0) {

Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java   
2007-07-06 16:15:16 UTC (rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java   
2007-07-06 16:33:03 UTC (rev 13956)
@@ -1306,7 +1306,7 @@
                        JLabel header = null;
                        JPanel buttonPanel = null;

-                       frame = new 
JDialog(getIndexBrowserPanel().getMainWindow().getMainFrame(), 
I18n.getMessage("thaw.plugins.index.addKeys"));
+                       frame = new 
JDialog(getIndexBrowserPanel().getMainWindow().getMainFrame(), 
I18n.getMessage("thaw.plugin.index.addKeys"));
                        frame.setVisible(false);

                        header = new 
JLabel(I18n.getMessage("thaw.plugin.fetch.keyList"));

Added: trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java                 
        (rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java 2007-07-06 
16:33:03 UTC (rev 13956)
@@ -0,0 +1,427 @@
+package thaw.plugins.transferLogs;
+
+import java.sql.*;
+
+import java.util.Observer;
+import java.util.Observable;
+
+
+import thaw.core.Logger;
+
+import thaw.fcp.FCPTransferQuery;
+import thaw.fcp.FCPClientPut;
+import thaw.fcp.FCPClientGet;
+import thaw.fcp.FreenetURIHelper;
+
+import thaw.plugins.Hsqldb;
+import thaw.plugins.TransferLogs;
+
+
+public class Transfer implements Observer {
+       private Hsqldb db;
+
+       private FCPTransferQuery query;
+
+       private int id;
+
+       private Timestamp dateStart;
+       private Timestamp dateEnd;
+       private byte transferType;
+       private String key;
+       private String filename;
+       private long size;
+       private boolean isDup;
+       private boolean isSuccess;
+
+       private TransferTable table;
+
+
+       public Transfer(Hsqldb db,
+                       FCPTransferQuery query,
+                       TransferTable table) {
+               this.db = db;
+               this.query = query;
+               this.id = -1;
+               this.table = table;
+
+
+               if (!findOrInsertEntry(query))
+                       findOrInsertEntry(query); /* because we need the id of 
the entry */
+
+               if (!query.isFinished()
+                   && query instanceof Observable) {
+                       ((Observable)query).addObserver(this);
+               }
+       }
+
+
+       /**
+        * If found, return true, if inserted returns false.
+        * If found, but some informations in the bdd is not correct, it's 
updated.
+        */
+       private boolean findOrInsertEntry(FCPTransferQuery query) {
+               boolean entryFound;
+
+               entryFound = false;
+
+               Logger.info(this, "Searching corresponding query in the logs 
...");
+
+               synchronized(db.dbLock) {
+                       try {
+                               PreparedStatement st;
+
+                               String qKey = query.getFileKey();
+
+                               if (qKey == null || 
!FreenetURIHelper.isAKey(qKey))
+                                       qKey = null;
+
+                               /* by key first */
+
+                               if (qKey != null) {
+
+                                       st = 
db.getConnection().prepareStatement("SELECT id, dateStart, dateEnd, "+
+                                                                               
 "transferType, "+
+                                                                               
 "key, filename, size, isDup, isSuccess "+
+                                                                               
 "FROM transferLogs "+
+                                                                               
 "WHERE key LIKE ? AND dateEnd IS NULL "+
+                                                                               
 "ORDER BY dateStart DESC "+
+                                                                               
 "LIMIT 1");
+                                       st.setString(1, 
FreenetURIHelper.getComparablePart(qKey)+"%");
+
+                                       ResultSet set = st.executeQuery();
+
+                                       if (set.next()) {
+                                               entryFound        = true;
+                                               this.id           = 
set.getInt("id");
+                                               this.dateStart    = 
set.getTimestamp("dateStart");
+                                               this.dateEnd      = 
set.getTimestamp("dateEnd");
+                                               this.transferType = 
set.getByte("transferType");
+                                               this.key          = 
set.getString("key");
+                                               this.filename     = 
set.getString("filename");
+                                               this.size         = 
set.getLong("size");
+                                               this.isDup        = 
set.getBoolean("isDup");
+                                               this.isSuccess    = 
set.getBoolean("isSuccess");
+                                       }
+                               }
+
+
+                               /* by filename else */
+
+                               String filename = query.getFilename();
+
+                               if (filename != null && entryFound == false) {
+                                       st = 
db.getConnection().prepareStatement("SELECT id, dateStart, dateEnd, "+
+                                                                               
 "transferType, "+
+                                                                               
 "key, filename, size, isDup, isSuccess "+
+                                                                               
 "FROM transferLogs "+
+                                                                               
 "WHERE filename = ? AND dateEnd IS NULL "+
+                                                                               
 "ORDER BY dateStart DESC "+
+                                                                               
 "LIMIT 1");
+                                       st.setString(1, filename);
+
+                                       ResultSet set = st.executeQuery();
+
+                                       if (set.next()) {
+                                               entryFound        = true;
+                                               this.id           = 
set.getInt("id");
+                                               this.dateStart    = 
set.getTimestamp("dateStart");
+                                               this.dateEnd      = 
set.getTimestamp("dateEnd");
+                                               this.transferType = 
set.getByte("transferType");
+                                               this.key          = 
set.getString("key");
+                                               this.filename     = 
set.getString("filename");
+                                               this.size         = 
set.getLong("size");
+                                               this.isDup        = 
set.getBoolean("isDup");
+                                               this.isSuccess    = 
set.getBoolean("isSuccess");
+                                       }
+                               }
+
+
+                               if (qKey == null && filename == null) { /* this 
query would be useless ?! */
+                                       Logger.warning(this, "Query with 
filename & key == null ? can do nothing with that");
+                                       return false;
+                               }
+
+
+                               if (entryFound) { /* we check if we must update 
the entry */
+                                       boolean mustUpdateKey = false;
+                                       boolean mustUpdateDateEnd = false;
+                                       boolean mustUpdateSize = false;
+
+                                       if (this.key == null && qKey != null)
+                                               mustUpdateKey = true;
+
+                                       if (qKey == null && this.key != null)
+                                               qKey = this.key;
+
+                                       if (qKey != null && this.key != null
+                                           && !qKey.equals(this.key)) /* the 
key has changed ? can it happen ? */
+                                               mustUpdateKey = true;
+
+                                       if (query.isFinished() && this.dateEnd 
== null)
+                                               mustUpdateDateEnd = true;
+
+                                       if (query.getFileSize() >= 0
+                                           && query.getFileSize() >= size)
+                                               mustUpdateSize = true;
+
+
+                                       if (mustUpdateKey) {
+                                               updateKey(qKey);
+                                       }
+
+
+                                       if (mustUpdateDateEnd) {
+                                               
updateDateEnd(query.isSuccessful());
+                                       }
+
+                                       if (mustUpdateSize) {
+                                               updateSize(query.getFileSize());
+                                       }
+
+                               } else { /* we insert a new one */
+                                       /* except if this query has already 
ended, because it means we weren't
+                                        * used for this job, so we won't move 
:P */
+                                       if (query.isFinished())
+                                               return false;
+
+                                       /* the main problem here is that when 
we insert a data
+                                        * hsqldb is not able to give us back 
the primary key generated
+                                        * so when this function will return 
false (no entry found => inserted),
+                                        * the constructor will call it again 
to find the primary  key
+                                        */
+
+                                       Timestamp now = TransferLogs.getNow();
+
+                                       st = 
db.getConnection().prepareStatement("INSERT INTO transferLogs "+
+                                                                               
 "(dateStart, dateEnd, transferType, "+
+                                                                               
 " key, filename, size, isDup, isSuccess) "+
+                                                                               
 "VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
+                                       st.setTimestamp(1, now);
+
+                                       if (query.isFinished())
+                                               st.setTimestamp(2, now);
+                                       else
+                                               st.setNull(2, Types.TIMESTAMP);
+
+                                       if (query instanceof FCPClientPut)
+                                               st.setByte(3, 
TransferLogs.TRANSFER_TYPE_INSERTION);
+                                       else
+                                               st.setByte(3, 
TransferLogs.TRANSFER_TYPE_DOWNLOAD);
+
+                                       if (qKey != null)
+                                               st.setString(4, qKey);
+                                       else
+                                               st.setNull(4, Types.VARCHAR);
+
+                                       st.setString(5, filename);
+                                       st.setLong(6, query.getFileSize());
+                                       st.setBoolean(7, TransferLogs.isDup(db, 
query.getFileKey()));
+                                       st.setBoolean(8, query.isFinished() && 
query.isSuccessful());
+                                       st.execute();
+                               }
+
+
+                       } catch(SQLException e) {
+                               Logger.error(this,
+                                            "Error while trying to find a 
specific "+
+                                            "entry in the log: "+e.toString());
+                       }
+               }
+
+               if (entryFound)
+                       Logger.info(this, "Entry found");
+               else
+                       Logger.info(this, "Entry added");
+
+               return entryFound;
+       }
+
+
+       private void updateKey(String qKey) {
+               Logger.info(this, "Updating key in logs");
+               try {
+                       PreparedStatement st = 
db.getConnection().prepareStatement("UPDATE transferLogs SET "+
+                                                                               
   "key = ? WHERE id = ?");
+                       st.setString(1, qKey);
+                       st.setInt(2, this.id);
+                       st.execute();
+               } catch(SQLException e) {
+                       Logger.error(this, "Unable to update key in transfer 
logs because : "+e.toString());
+               }
+       }
+
+       private void updateSize(long size) {
+               Logger.info(this, "Updating file size in logs");
+
+               try {
+                       PreparedStatement st = 
db.getConnection().prepareStatement("UPDATE transferLogs SET "+
+                                                                               
   "size = ? WHERE id = ?");
+                       st.setLong(1, size);
+                       st.setInt(2, this.id);
+                       st.execute();
+               } catch(SQLException e) {
+                       Logger.error(this, "Unable to update size in transfer 
logs because : "+e.toString());
+               }
+       }
+
+
+       private void updateDateEnd(boolean success) {
+               Logger.info(this, "Updating end date in logs");
+
+               try {
+                       PreparedStatement st = 
db.getConnection().prepareStatement("UPDATE transferLogs SET "+
+                                                                               
   "dateEnd = ?, isSuccess = ? "+
+                                                                               
   "WHERE id = ?");
+                       st.setTimestamp(1, TransferLogs.getNow());
+                       st.setBoolean(2, success);
+                       st.setInt(3, this.id);
+                       st.execute();
+               } catch(SQLException e) {
+                       Logger.error(this, "Unable to update dateEnd in 
transfer logs because : "+e.toString());
+               }
+       }
+
+
+       public Transfer(Hsqldb db,
+                       int id,
+                       Timestamp dateStart, Timestamp dateEnd,
+                       byte transferType, String key, String filename, long 
size,
+                       boolean isDup, boolean isSuccess) {
+               this.db           = db;
+               this.id           = id;
+               this.dateStart    = dateStart;
+               this.dateEnd      = dateEnd;
+               this.transferType = transferType;
+               this.key          = key;
+               this.filename     = filename;
+               this.size         = size;
+               this.isDup        = isDup;
+               this.isSuccess    = isSuccess;
+       }
+
+
+       public Timestamp getDateStart() {
+               return dateStart;
+       }
+
+       public Timestamp getDateEnd() {
+               return dateEnd;
+       }
+
+       public byte getTransferTypeByte() {
+               return transferType;
+       }
+
+       public String getTransferTypeStr() {
+               return TransferLogs.TRANSFER_TYPE_NAMES[transferType];
+       }
+
+       public String getKey() {
+               return key;
+       }
+
+       public String getFilename() {
+               return filename;
+       }
+
+       public long getSize() {
+               return size;
+       }
+
+       public boolean isDup() {
+               return isDup;
+       }
+
+       public boolean isSuccess() {
+               return isSuccess;
+       }
+
+       /**
+        * @return a value in byte / s
+        */
+       public long getAverageSpeed() {
+               if (getDateEnd() == null || getSize() <= 0)
+                       return -1;
+
+               long diff = (getDateEnd().getTime() - 
getDateStart().getTime())/1000;
+
+               if (diff <= 0)
+                       return -1;
+
+               return getSize() / diff;
+       }
+
+
+       protected FCPTransferQuery getQuery() {
+               return query;
+       }
+
+       protected int getId() {
+               return id;
+       }
+
+
+       public void delete() {
+               Logger.info(this, "Deleting transfer logs entry ...");
+
+               try {
+                       synchronized(db.dbLock) {
+                               PreparedStatement st;
+
+                               st = 
db.getConnection().prepareStatement("DELETE FROM transferLogs WHERE id = ?");
+                               st.setInt(1, id);
+                               st.execute();
+                       }
+               } catch(SQLException e) {
+                       Logger.error(this, "Can't delete transfer because: 
"+e.toString());
+               }
+       }
+
+
+
+       public boolean equals(Object o) {
+               if (o == null || (!(o instanceof Transfer)))
+                       return false;
+
+               return (id == ((Transfer)o).getId()
+                       || query == ((Transfer)o).getQuery());
+       }
+
+
+       public void update(Observable o,
+                          Object param) {
+               boolean hasChanged;
+
+               if (!(o instanceof FCPTransferQuery) || id < 0) {
+                       return;
+               }
+
+               hasChanged = false;
+
+               final FCPTransferQuery query = (FCPTransferQuery)o;
+
+               if (query.isFinished()) {
+                       o.deleteObserver(this);
+                       updateDateEnd(query.isSuccessful());
+                       hasChanged = true;
+               }
+
+               if (query.getFileKey() != null &&
+                   (this.key == null
+                    || !this.key.equals(query.getFileKey()))) {
+                       updateKey(query.getFileKey());
+                       key = query.getFileKey();
+                       hasChanged = true;
+               }
+
+               if (query.getFileSize() != size) {
+                       updateSize(query.getFileSize());
+                       size = query.getFileSize();
+                       hasChanged = true;
+               }
+
+               if (hasChanged && table != null)
+                       table.refresh();
+       }
+
+}

Added: 
trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java 
                        (rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java 
2007-07-06 16:33:03 UTC (rev 13956)
@@ -0,0 +1,104 @@
+package thaw.plugins.transferLogs;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractButton;
+
+import java.util.Vector;
+import java.util.Iterator;
+
+
+import thaw.gui.GUIHelper;
+
+
+public class TransferManagementHelper {
+
+       public interface TransferAction extends ActionListener {
+
+               /**
+                * Can disable the abstract button if required
+                * @param files can be null
+                */
+               public void setTarget(Vector transfers);
+       }
+
+
+       public static class TransferRemover implements TransferAction {
+               private AbstractButton b;
+               private Vector targets;
+               private TransferTable tt;
+
+               public TransferRemover(AbstractButton b, TransferTable t) {
+                       this.b = b;
+                       this.tt = t;
+
+                       if (b != null) {
+                               b.addActionListener(this);
+                       }
+               }
+
+
+               public void setTarget(Vector transfers) {
+                       targets = transfers;
+               }
+
+               public void actionPerformed(ActionEvent e) {
+                       if (targets == null)
+                               return;
+
+                       if (b == null || e.getSource() == b) {
+
+                               for (Iterator it = targets.iterator();
+                                    it.hasNext(); ) {
+                                       Transfer t = (Transfer)it.next();
+                                       t.delete();
+                               }
+
+                       }
+
+                       if (tt != null)
+                               tt.refresh();
+               }
+       }
+
+
+       public static class TransferKeyCopier implements TransferAction {
+               private AbstractButton b;
+               private Vector targets;
+
+
+               public TransferKeyCopier(AbstractButton b) {
+                       this.b = b;
+
+                       if (b != null) {
+                               b.addActionListener(this);
+                       }
+               }
+
+
+               public void setTarget(Vector transfers) {
+                       targets = transfers;
+               }
+
+
+               public void actionPerformed(ActionEvent e) {
+                       if (targets == null)
+                               return;
+
+                       if (b == null || e.getSource() == b) {
+                               String keys = "";
+
+                               for (Iterator it = targets.iterator();
+                                    it.hasNext(); ) {
+                                       Transfer t = (Transfer)it.next();
+
+                                       if (t.getKey() != null)
+                                               keys += t.getKey() + "\n";
+                               }
+
+                               thaw.gui.GUIHelper.copyToClipboard(keys);
+                       }
+               }
+       }
+}

Added: trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java            
                (rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java    
2007-07-06 16:33:03 UTC (rev 13956)
@@ -0,0 +1,529 @@
+package thaw.plugins.transferLogs;
+
+import javax.swing.event.TableModelEvent;
+
+import java.awt.GridLayout;
+import java.awt.BorderLayout;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.JPanel;
+import javax.swing.JLabel;
+import javax.swing.JComboBox;
+import javax.swing.JTable;
+import javax.swing.JScrollPane;
+import javax.swing.JButton;
+import javax.swing.JTextField;
+import javax.swing.JTextArea;
+import javax.swing.ImageIcon;
+import javax.swing.JComboBox;
+
+import javax.swing.JPopupMenu;
+import javax.swing.JMenuItem;
+
+import java.util.Vector;
+import java.util.Iterator;
+import java.text.DateFormat;
+
+import java.awt.Component;
+import java.awt.Color;
+import javax.swing.JComponent;
+
+import java.sql.*;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import thaw.gui.Table;
+import thaw.gui.IconBox;
+import thaw.core.I18n;
+import thaw.core.Config;
+import thaw.core.Logger;
+
+import thaw.plugins.TransferLogs;
+import thaw.plugins.Hsqldb;
+
+/**
+ * Allow to see entry page per page.
+ * columns : "dates" (start,end), transfer "type", "filename","key already 
seen?" .
+ * A button "details" is added in each row of the column "filename".
+ * Button "details" add in the column "filename" the following informations:
+ * <ul>
+ * <li>Key</li>
+ * <li>Was finished ?</li>
+ * <li>If finished : Average speed</li>
+ * </ul>
+ * <br/>
+ * right click menu : copy key(s) to clipboard
+ */
+public class TransferTable implements MouseListener {
+       public final static int NMB_ELEMENTS_PER_PAGE = 20;
+       public final static int DEFAULT_LINE_HEIGHT = 18;
+
+       public final static String[] COLUMN_NAMES = {
+               I18n.getMessage("thaw.plugin.transferLogs.dates"),
+               I18n.getMessage("thaw.plugin.transferLogs.type"),
+               I18n.getMessage("thaw.plugin.transferLogs.file"),
+               I18n.getMessage("thaw.plugin.transferLogs.isDup")
+       };
+
+
+       private JPanel panel;
+
+       private TransferTableModel model;
+       private PageSelecter pageSelecter;
+       private Table table;
+
+       private JPopupMenu rightClickMenu;
+       private Vector rightClickActions;
+
+       private DateFormat dateFormat;
+
+
+       public TransferTable(Hsqldb db, Config config) {
+               this.dateFormat = DateFormat.getDateTimeInstance();
+
+               rightClickMenu = new JPopupMenu();
+               rightClickActions = new Vector();
+
+               JButton button;
+               JMenuItem item;
+
+               item = new JMenuItem(I18n.getMessage("thaw.common.remove"), 
IconBox.minDelete);
+               rightClickMenu.add(item);
+               rightClickActions.add(new 
TransferManagementHelper.TransferRemover(item, this));
+
+               item = new 
JMenuItem(I18n.getMessage("thaw.common.copyKeysToClipboard"), IconBox.minCopy);
+               rightClickMenu.add(item);
+               rightClickActions.add(new 
TransferManagementHelper.TransferKeyCopier(item));
+
+
+               panel = new JPanel(new BorderLayout(5, 5));
+
+               model = new TransferTableModel(db);
+               pageSelecter = new PageSelecter(db, model);
+               table = new Table(config, "table_transfer_logs", model);
+               table.setDefaultRenderer(table.getColumnClass(0), new 
TransferTableRenderer());
+               table.addMouseListener(this);
+
+               panel.add(new JScrollPane(table), BorderLayout.CENTER);
+               panel.add(pageSelecter.getPanel(), BorderLayout.SOUTH);
+
+               refresh();
+       }
+
+
+       public JPanel getPanel() {
+               return panel;
+       }
+
+
+       protected class TransferTableRenderer extends DefaultTableCellRenderer {
+               private Color softGray;
+               private Color lightBlue;
+
+               public TransferTableRenderer() {
+                       softGray = new Color(240,240,240);
+                       lightBlue = new Color(220, 220, 255);
+               }
+
+               public Component getTableCellRendererComponent(final JTable 
table, Object value,
+                                                              final boolean 
isSelected, final boolean hasFocus,
+                                                              final int row, 
final int column) {
+                       Component cell;
+
+                       if (value instanceof String && 
((String)value).indexOf("\n") >= 0) {
+                               JTextArea area = new JTextArea((String)value);
+                               area.setEditable(false);
+                               area.setLineWrap(false);
+
+                               cell = area;
+
+                       } else if ((value instanceof String) && 
"X".equals((String)value) ) {
+                               return new JLabel(IconBox.minClose);
+                       } else if (value instanceof Integer) {
+                               int val = ((Integer)value).intValue();
+
+                               if (val == 0) {
+                                       value = 
TransferLogs.TRANSFER_TYPE_NAMES[val];
+                                       cell = 
super.getTableCellRendererComponent(table, value, isSelected,
+                                                                               
   hasFocus, row, column);
+                               } else {
+                                       ImageIcon icon;
+
+                                       if (isSelected)
+                                               icon = (val == 
TransferLogs.TRANSFER_TYPE_DOWNLOAD) ?
+                                                       IconBox.downloads : 
IconBox.insertions;
+                                       else
+                                               icon = (val == 
TransferLogs.TRANSFER_TYPE_DOWNLOAD) ?
+                                                       IconBox.minDownloads : 
IconBox.minInsertions;
+
+                                       return new JLabel(icon);
+                               }
+
+                       } else {
+                               cell = 
super.getTableCellRendererComponent(table, value, isSelected,
+                                                                          
hasFocus, row, column);
+                       }
+
+
+                       if (!isSelected) {
+                               if (row % 2 == 0)
+                                       cell.setBackground(Color.WHITE);
+                               else
+                                       cell.setBackground(softGray);
+                       } else {
+                               cell.setBackground(lightBlue);
+                       }
+
+                       if (isSelected) {
+                               if (table.getRowHeight(row) < 
(cell.getPreferredSize().getHeight()+5))
+                                       
table.setRowHeight((int)cell.getPreferredSize().getHeight()+5);
+                       } else {
+                               if (table.getRowHeight(row) != 
DEFAULT_LINE_HEIGHT)
+                                       table.setRowHeight(row, 
DEFAULT_LINE_HEIGHT);
+                       }
+
+                       return cell;
+               }
+
+       }
+
+
+
+       protected class TransferTableModel extends 
javax.swing.table.AbstractTableModel {
+
+               private int page;
+
+               private Vector transfers = null;
+
+               private Hsqldb db;
+
+               public TransferTableModel(Hsqldb db) {
+                       super();
+
+                       this.db = db;
+                       this.page = 0;
+               }
+
+               public int getRowCount() {
+                       if (transfers != null)
+                               return transfers.size();
+                       else
+                               return 0;
+               }
+
+               public int getColumnCount() {
+                       return COLUMN_NAMES.length;
+               }
+
+               public String getColumnName(int col) {
+                       return COLUMN_NAMES[col];
+               }
+
+               public String getAverageSpeed(Transfer t) {
+                       long v = t.getAverageSpeed();
+
+                       if (v < 0)
+                               return I18n.getMessage("thaw.common.unknown");
+
+                       return thaw.gui.GUIHelper.getPrintableSize(v) + "/s";
+               }
+
+               public Object getValueAt(final int row, int column) {
+                       if (transfers == null)
+                               return null;
+
+                       if (row > transfers.size())
+                               return null;
+
+                       Transfer t = (Transfer)transfers.get(row);
+
+                       if (column == 0) { /* dates */
+                               String dates = 
I18n.getMessage("thaw.plugin.transferLogs.dateStart")+" ";
+                               dates += 
dateFormat.format(t.getDateStart())+"\n";
+                               dates += 
I18n.getMessage("thaw.plugin.transferLogs.dateEnd")+" ";
+                               if (t.getDateEnd() != null)
+                                       dates += 
dateFormat.format(t.getDateEnd());
+                               else
+                                       dates += 
I18n.getMessage("thaw.common.unknown");
+                               return dates;
+                       }
+
+                       if (column == 1) { /* type */
+                               return new 
Integer((int)t.getTransferTypeByte());
+                       }
+
+                       if (column == 2) { /* file */
+                               String str = " "+t.getFilename()+"\n";
+                               str += 
I18n.getMessage("thaw.plugin.transferLogs.key")+": ";
+                               str += (t.getKey() != null ? t.getKey() : 
I18n.getMessage("thaw.common.unknown"))+"\n";
+                               str += 
I18n.getMessage("thaw.plugin.transferLogs.fileSize")+": ";
+                               str += 
thaw.gui.GUIHelper.getPrintableSize(t.getSize())+"\n";
+                               str += 
I18n.getMessage("thaw.plugin.transferLogs.isSuccess")+": ";
+                               if (t.getDateEnd() != null)
+                                       str += (t.isSuccess() ? 
I18n.getMessage("thaw.common.yes") : I18n.getMessage("thaw.common.no")) + "\n";
+                               else
+                                       str += 
I18n.getMessage("thaw.common.unknown")+"\n";
+                               str += 
I18n.getMessage("thaw.plugin.transferLogs.averageSpeed")+": ";
+                               str += getAverageSpeed(t);
+                               return str;
+                       }
+
+                       if (column == 3) { /* isDup ? */
+                               return t.isDup() ? "X" : "";
+                       }
+
+
+                       return null;
+               }
+
+               public boolean isCellEditable(final int row, final int column) {
+                       return false;
+               }
+
+
+               public void setPage(int page) {
+                       this.page = page;
+               }
+
+               public int getPage() {
+                       return page;
+               }
+
+
+               public void refresh(int row) {
+                       fireTableChanged(new TableModelEvent(this, row));
+               }
+
+
+               public Vector getRows(int[] rows) {
+                       if (transfers == null)
+                               return null;
+
+                       Vector v = new Vector();
+
+                       for (int i = 0 ; i < rows.length ; i++) {
+                               v.add(transfers.get(rows[i]));
+                       }
+
+                       return v;
+               }
+
+
+               public void refresh() {
+
+                       try {
+                               synchronized(db.dbLock) {
+                                       PreparedStatement st;
+
+                                       int offset = NMB_ELEMENTS_PER_PAGE * 
page;
+
+                                       st = 
db.getConnection().prepareStatement("SELECT id, dateStart, "+
+                                                                               
 "dateEnd, transferType, "+
+                                                                               
 "key, filename, size, "+
+                                                                               
 "isDup, isSuccess "+
+                                                                               
 "FROM transferLogs "+
+                                                                               
 "ORDER BY dateStart DESC "+
+                                                                               
 "LIMIT "+Integer.toString(NMB_ELEMENTS_PER_PAGE)+
+                                                                               
 " OFFSET "+Integer.toString(offset));
+                                       ResultSet res = st.executeQuery();
+
+                                       transfers = new Vector();
+
+                                       while(res.next()) {
+                                               transfers.add(new Transfer(db, 
res.getInt("id"),
+                                                                          
res.getTimestamp("dateStart"),
+                                                                          
res.getTimestamp("dateEnd"),
+                                                                          
res.getByte("transferType"),
+                                                                          
res.getString("key"),
+                                                                          
res.getString("filename"),
+                                                                          
res.getLong("size"),
+                                                                          
res.getBoolean("isDup"),
+                                                                          
res.getBoolean("isSuccess")));
+                                       }
+                               }
+                       } catch(SQLException e) {
+                               Logger.error(this, "Error while reading 
transfer logs: "+e.toString());
+                               return;
+                       }
+
+                       fireTableChanged(new TableModelEvent(this));
+               }
+
+       }
+
+
+       protected class PageSelecter implements ActionListener {
+               private JPanel panel;
+
+               private JButton leftButton;
+               private JComboBox pageSelecter;
+               private JButton rightButton;
+
+               private Hsqldb db;
+               private TransferTableModel model;
+
+               private int pageMax;
+
+
+               public PageSelecter(Hsqldb db, TransferTableModel m) {
+                       this.db = db;
+                       this.model = m;
+
+                       panel = new JPanel(new BorderLayout(5, 5));
+
+                       leftButton = new JButton("<");
+                       pageSelecter = new JComboBox(new String[] { "0" });
+                       rightButton = new JButton(">");
+
+                       leftButton.addActionListener(this);
+                       pageSelecter.addActionListener(this);
+                       rightButton.addActionListener(this);
+
+                       JPanel centerPanel = new JPanel();
+                       centerPanel.add(new 
JLabel(I18n.getMessage("thaw.common.page")));
+                       centerPanel.add(pageSelecter);
+
+
+                       panel.add(leftButton, BorderLayout.WEST);
+                       panel.add(centerPanel, BorderLayout.CENTER);
+                       panel.add(rightButton, BorderLayout.EAST);
+               }
+
+
+               public JPanel getPanel() {
+                       return panel;
+               }
+
+
+               public void refresh() {
+                       int nmb_elements = -1;
+
+                       try {
+                               synchronized(db.dbLock) {
+                                       PreparedStatement st;
+
+                                       st = 
db.getConnection().prepareStatement("SELECT count(id) FROM transferLogs");
+                                       ResultSet res = st.executeQuery();
+                                       res.next();
+
+                                       nmb_elements = res.getInt(1);
+                               }
+                       } catch(SQLException e) {
+                               Logger.error(this, "Unable to compute the 
number of pages in the logs because : "+e.toString());
+                               return;
+                       }
+
+                       pageMax = nmb_elements / NMB_ELEMENTS_PER_PAGE;
+
+                       if (nmb_elements % NMB_ELEMENTS_PER_PAGE == 0)
+                               pageMax--;
+
+                       if (model.getPage() > pageMax)
+                               model.setPage(0);
+
+                       pageSelecter.removeAllItems();
+
+                       for (int i = 0 ; i <= pageMax ; i++)
+                               pageSelecter.addItem(Integer.toString(i));
+
+                       /* should call actionPerformed() */
+                       
pageSelecter.setSelectedItem(Integer.toString(model.getPage()));
+
+                       refreshButtonState();
+               }
+
+
+               private void refreshButtonState() {
+                       leftButton.setEnabled(model.getPage() > 0);
+                       rightButton.setEnabled(model.getPage() < pageMax);
+               }
+
+
+               public void actionPerformed(ActionEvent e) {
+                       int targetPage = -1;
+
+                       if (e.getSource() == leftButton) {
+                               targetPage = model.getPage() - 1;
+                       } else if (e.getSource() == rightButton) {
+                               targetPage = model.getPage() + 1;
+                       } else if (e.getSource() == pageSelecter) {
+                               if (pageSelecter.getSelectedItem() == null
+                                   || !(pageSelecter.getSelectedItem() 
instanceof String))
+                                       return;
+
+                               targetPage = 
Integer.parseInt((String)pageSelecter.getSelectedItem());
+                       }
+
+                       if (targetPage < 0 || targetPage > pageMax)
+                               return;
+
+                       model.setPage(targetPage);
+                       model.refresh();
+
+                       pageSelecter.removeActionListener(this);
+                       
pageSelecter.setSelectedItem(Integer.toString(targetPage));
+                       pageSelecter.addActionListener(this);
+
+                       refreshButtonState();
+               }
+       }
+
+
+       public void refresh() {
+               model.refresh();
+               pageSelecter.refresh();
+       }
+
+
+       private void updateToolbar(Vector selection) {
+
+       }
+
+       private void updateRightClickMenu(Vector selection) {
+               TransferManagementHelper.TransferAction action;
+
+               for(final Iterator it = rightClickActions.iterator();
+                   it.hasNext();) {
+                       action = 
(TransferManagementHelper.TransferAction)it.next();
+                       action.setTarget(selection);
+               }
+       }
+
+
+       public void mouseClicked(final MouseEvent e) {
+               Vector selection;
+
+               int[] selectedRows = table.getSelectedRows();
+
+               if (selectedRows == null)
+                       return;
+
+               selection = model.getRows(selectedRows);
+
+               if (selection == null)
+                       return;
+
+               if (e.getButton() == MouseEvent.BUTTON1) {
+                       updateToolbar(selection);
+               }
+
+               if (e.getButton() == MouseEvent.BUTTON3) {
+                       updateRightClickMenu(selection);
+                       rightClickMenu.show(e.getComponent(), e.getX(), 
e.getY());
+               }
+       }
+
+       public void mouseEntered(final MouseEvent e) { }
+
+       public void mouseExited(final MouseEvent e) { }
+
+       public void mousePressed(final MouseEvent e) { }
+
+       public void mouseReleased(final MouseEvent e) { }
+
+
+}


Reply via email to