KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > jftp > gui > base > DownloadList


1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15  */

16 package net.sf.jftp.gui.base;
17
18 import java.awt.BorderLayout JavaDoc;
19 import java.awt.event.ActionEvent JavaDoc;
20 import java.awt.event.ActionListener JavaDoc;
21 import java.util.Enumeration JavaDoc;
22 import java.util.Hashtable JavaDoc;
23
24 import javax.swing.ImageIcon JavaDoc;
25 import javax.swing.JLabel JavaDoc;
26 import javax.swing.JList JavaDoc;
27 import javax.swing.JScrollPane JavaDoc;
28
29 import net.sf.jftp.JFtp;
30 import net.sf.jftp.config.Settings;
31 import net.sf.jftp.gui.base.dir.DirCellRenderer;
32 import net.sf.jftp.gui.base.dir.DirEntry;
33 import net.sf.jftp.gui.framework.HImage;
34 import net.sf.jftp.gui.framework.HImageButton;
35 import net.sf.jftp.gui.framework.HPanel;
36 import net.sf.jftp.net.ConnectionHandler;
37 import net.sf.jftp.net.DataConnection;
38 import net.sf.jftp.net.HttpTransfer;
39 import net.sf.jftp.net.Transfer;
40 import net.sf.jftp.system.LocalIO;
41 import net.sf.jftp.system.UpdateDaemon;
42 import net.sf.jftp.system.logging.Log;
43
44
45 public class DownloadList extends HPanel implements ActionListener JavaDoc
46 {
47     //private HImageButton rotate = new HImageButton(Settings.cmdImage,"rotate","Toggle selected transfer...",this);
48
//private int rotator = 0;
49
//private static final String SEP = "--> ";
50
public Hashtable JavaDoc sizeCache = new Hashtable JavaDoc();
51
52     //private JTextArea text = new JTextArea();
53
private JList JavaDoc text = new JList JavaDoc();
54     private Hashtable JavaDoc downloads = new Hashtable JavaDoc();
55     //private boolean working = false;
56
private long oldtime = 0;
57     private HImageButton resume = new HImageButton(Settings.resumeImage,
58                                                    "resume",
59                                                    "Resume selected transfer...",
60                                                    this);
61     private HImageButton pause = new HImageButton(Settings.pauseImage, "pause",
62                                                   "Pause selected transfer...",
63                                                   this);
64     private HImageButton cancel = new HImageButton(Settings.deleteImage,
65                                                    "delete",
66                                                    "Cancel selected transfer...",
67                                                    this);
68     private HImageButton clear = new HImageButton(Settings.clearImage, "clear",
69                                                   "Remove old/stalled items from output...",
70                                                   this);
71
72     public DownloadList()
73     {
74         setLayout(new BorderLayout JavaDoc());
75         
76         resume.setRolloverIcon(new ImageIcon JavaDoc(HImage.getImage(this, Settings.resumeImage2)));
77         resume.setRolloverEnabled(true);
78         pause.setRolloverIcon(new ImageIcon JavaDoc(HImage.getImage(this, Settings.pauseImage2)));
79         pause.setRolloverEnabled(true);
80         clear.setRolloverIcon(new ImageIcon JavaDoc(HImage.getImage(this, Settings.clearImage2)));
81         clear.setRolloverEnabled(true);
82         cancel.setRolloverIcon(new ImageIcon JavaDoc(HImage.getImage(this, Settings.deleteImage2)));
83         cancel.setRolloverEnabled(true);
84         
85
86         text.setCellRenderer(new DirCellRenderer());
87
88         HPanel cmdP = new HPanel();
89
90         // cmdP.add(rotate);
91
cmdP.add(clear);
92
93         cmdP.add(new JLabel JavaDoc(" "));
94
95         cmdP.add(resume);
96         cmdP.add(pause);
97
98         cmdP.add(new JLabel JavaDoc(" "));
99
100         cmdP.add(cancel);
101
102         clear.setSize(24, 24);
103         clear.setBorder(true);
104         cancel.setSize(24, 24);
105         cancel.setBorder(true);
106
107         // rotate.setSize(24,24);
108
// rotate.setBorder(true);
109
resume.setSize(24, 24);
110         resume.setBorder(true);
111         pause.setSize(24, 24);
112         pause.setBorder(true);
113
114         //*** MY ADDITIONS
115
clear.setToolTipText("Remove old/stalled items from output...");
116
117         resume.setToolTipText("Resume selected transfer...");
118         pause.setToolTipText("Pause selected transfer...");
119         cancel.setToolTipText("Cancel selected transfer...");
120
121         //***
122
JScrollPane JavaDoc dP = new JScrollPane JavaDoc(text);
123         add("South", cmdP);
124         add("Center", dP);
125     }
126
127     public void fresh()
128     {
129         downloads = new Hashtable JavaDoc();
130         updateArea();
131     }
132
133     public void actionPerformed(ActionEvent JavaDoc e)
134     {
135         if(e.getActionCommand().equals("delete"))
136         {
137             deleteCon();
138         }
139         else if(e.getActionCommand().equals("clear") ||
140                     (e.getSource() == AppMenuBar.clearItems))
141         {
142             //FtpConnection con = JFtp.getControlConnection();
143
//JFtp.getConnectionHandler().fireProgressClear(con);
144
fresh();
145         }
146
147         // else if(e.getActionCommand().equals("rotate"))
148
// {
149
// rotator++;
150
// if(rotator >= downloads.size()) rotator = 0;
151
// }
152
else if(e.getActionCommand().equals("pause"))
153         {
154             pauseCon();
155         }
156         else if(e.getActionCommand().equals("resume"))
157         {
158             resumeCon();
159         }
160     }
161
162     private void deleteCon()
163     {
164         try
165         {
166             String JavaDoc cmd = getActiveItem();
167
168             if(cmd == null)
169             {
170                 return;
171             }
172
173             if((cmd.indexOf(Transfer.QUEUED) >= 0) ||
174                    (cmd.indexOf(Transfer.PAUSED) >= 0))
175             {
176                 cmd = getFile(cmd);
177
178                 try
179                 {
180                     Transfer d = (Transfer) JFtp.getConnectionHandler()
181                                                 .getConnections().get(cmd);
182
183                     if(d == null)
184                     {
185                         return;
186                     }
187
188                     d.work = false;
189                     d.pause = false;
190                 }
191                 catch(Exception JavaDoc ex)
192                 {
193                     ex.printStackTrace();
194                 }
195             }
196             else
197             {
198                 cmd = getFile(cmd);
199
200                 ConnectionHandler h = JFtp.getConnectionHandler();
201
202                 //Enumeration e =h.getConnections().keys();
203
//while(e.hasMoreElements()) Log.out("available transfer: " + (String) e.nextElement());
204
Object JavaDoc o = h.getConnections().get(cmd);
205
206                 Log.out("aborting transfer: " + cmd);
207                 Log.out("connection handler present: " + h + ", pool size: " +
208                         h.getConnections().size());
209
210                 if(o instanceof HttpTransfer)
211                 {
212                     Transfer d = (Transfer) o;
213                     d.work = false;
214                     updateList(cmd, DataConnection.FAILED, -1, -1);
215
216                     return;
217                 }
218                 else
219                 {
220                     Transfer d = (Transfer) o;
221
222                     DataConnection con = d.getDataConnection();
223                     con.getCon().work = false;
224
225                     try
226                     {
227                         con.sock.close();
228
229                         //con.getCon().abort();
230
//if(Settings.getEnableMultiThreading()) con.getCon().disconnect();
231
}
232                     catch(Exception JavaDoc ex)
233                     {
234                         ex.printStackTrace();
235
236                         //System.out.println("no socket close");
237
}
238                 }
239
240                 LocalIO.pause(500);
241                 updateList(getRawFile(getActiveItem()), DataConnection.FAILED,
242                            -1, -1);
243             }
244         }
245         catch(Exception JavaDoc ex)
246         {
247             Log.debug("Action is not supported for this connection.");
248             ex.printStackTrace();
249         }
250     }
251
252     // fake pause, it disconnects instead
253
private void pauseCon()
254     {
255         try
256         {
257             String JavaDoc cmd = getActiveItem();
258
259             if(cmd == null)
260             {
261                 return;
262             }
263
264             if((cmd.indexOf(DataConnection.GET) >= 0) ||
265                    (cmd.indexOf(DataConnection.PUT) >= 0))
266             {
267                 cmd = getFile(cmd);
268
269                 Object JavaDoc o = JFtp.getConnectionHandler().getConnections().get(cmd);
270
271                 if(o == null)
272                 {
273                     return;
274                 }
275
276                 Transfer d = (Transfer) o;
277                 d.pause = true;
278
279                 DataConnection con = d.getDataConnection();
280
281                 try
282                 {
283                     con.sock.close();
284                 }
285                 catch(Exception JavaDoc ex)
286                 {
287                     ex.printStackTrace();
288                 }
289
290                 d.prepare();
291             }
292         }
293         catch(Exception JavaDoc ex)
294         {
295             Log.debug("Action is not supported for this connection.");
296         }
297     }
298
299     private void resumeCon()
300     {
301         try
302         {
303             String JavaDoc cmd = getActiveItem();
304
305             if(cmd == null)
306             {
307                 return;
308             }
309
310             if((cmd.indexOf(Transfer.PAUSED) >= 0) ||
311                    (cmd.indexOf(Transfer.QUEUED) >= 0))
312             {
313                 cmd = getFile(cmd);
314
315                 try
316                 {
317                     Object JavaDoc o = JFtp.getConnectionHandler().getConnections().get(cmd);
318
319                     if(o == null)
320                     {
321                         return;
322                     }
323
324                     Transfer d = (Transfer) o;
325                     d.work = true;
326                     d.pause = false;
327                 }
328                 catch(Exception JavaDoc ex)
329                 {
330                     ex.printStackTrace();
331                 }
332             }
333         }
334         catch(Exception JavaDoc ex)
335         {
336             Log.debug("Action is not supported for this connection.");
337         }
338     }
339
340     private String JavaDoc getActiveItem()
341     {
342         String JavaDoc tmp = (String JavaDoc) text.getSelectedValue().toString();
343
344         if(tmp == null)
345         {
346             return "";
347         }
348         else
349         {
350             return tmp;
351         }
352     }
353
354     public synchronized void updateList(String JavaDoc file, String JavaDoc type, long bytes,
355                                         long size)
356     {
357         String JavaDoc message = type + ": <" + file + "> ";
358
359         if(!safeUpdate())
360         {
361             if(!type.startsWith(DataConnection.DFINISHED) &&
362                    !type.startsWith(DataConnection.FINISHED) &&
363                    !type.startsWith(DataConnection.FAILED) &&
364                    !type.startsWith(Transfer.PAUSED) &&
365                    !type.startsWith(Transfer.REMOVED))
366             {
367                 return;
368             }
369         }
370
371         // directory
372
int count = 0;
373
374         if(type.startsWith(DataConnection.GETDIR) ||
375                type.startsWith(DataConnection.PUTDIR) ||
376                type.startsWith(DataConnection.PUTDIR) ||
377                type.startsWith(DataConnection.DFINISHED))
378         {
379             //System.out.println(type);
380
String JavaDoc tmp = type.substring(type.indexOf(":") + 1);
381             type = type.substring(0, type.indexOf(":"));
382             count = Integer.parseInt(tmp);
383             message = type + ": <" + file + "> ";
384         }
385
386         // ---------------
387
//System.out.print(size+":");
388
String JavaDoc tmp;
389         long s = (long) (size / 1024);
390
391         if(s > 0)
392         {
393             tmp = Long.toString(s);
394         }
395         else
396         {
397             tmp = "?";
398         }
399
400         //System.out.println(message);
401
if(type.equals(DataConnection.GET) || type.equals(DataConnection.PUT))
402         {
403             message = message + (int) (bytes / 1024) + " / " + tmp + " kb";
404         }
405         else if(type.equals(DataConnection.GETDIR) ||
406                     type.equals(DataConnection.PUTDIR))
407         {
408             message = message + (int) (bytes / 1024) + " kb of file #" + count;
409         }
410         else if(type.startsWith(DataConnection.DFINISHED))
411         {
412             message = message + " " + count + " files.";
413         }
414
415         if(type.equals(DataConnection.FINISHED) ||
416                type.startsWith(DataConnection.DFINISHED))
417         {
418             try
419             {
420                 JFtp.getConnectionHandler().removeConnection(file);
421             }
422             catch(Exception JavaDoc ex)
423             {
424                 // SMB does not need this
425
}
426
427             UpdateDaemon.updateCall();
428         }
429         else if(type.equals(DataConnection.FAILED))
430         {
431             UpdateDaemon.updateCall();
432         }
433
434         downloads.put(file, message);
435
436         updateArea();
437     }
438
439     private synchronized DirEntry[] toArray()
440     {
441         DirEntry[] f = new DirEntry[downloads.size()];
442         int i = 0;
443
444         Enumeration JavaDoc k = downloads.elements();
445
446         while(k.hasMoreElements())
447         {
448             String JavaDoc tmp = (String JavaDoc) k.nextElement();
449             DirEntry d = new DirEntry(tmp, null);
450
451             if(getFile(tmp).endsWith("/"))
452             {
453                 d.setDirectory();
454             }
455
456             d.setNoRender();
457             f[i] = d;
458             i++;
459         }
460
461         return f;
462     }
463
464     private synchronized void updateArea()
465     {
466         int idx = text.getSelectedIndex();
467
468         DirEntry[] f = toArray();
469
470         text.setListData(f);
471
472         if((f.length == 1) && (idx < 0))
473         {
474             text.setSelectedIndex(0);
475         }
476         else
477         {
478             text.setSelectedIndex(idx);
479         }
480     }
481
482     private String JavaDoc getFile(String JavaDoc msg)
483     {
484         String JavaDoc f = msg.substring(msg.indexOf("<") + 1);
485         f = f.substring(0, f.lastIndexOf(">"));
486
487         //System.out.println(f);
488
return getRealName(f);
489     }
490
491     private String JavaDoc getRealName(String JavaDoc file)
492     {
493         //System.out.println(">>>"+file);
494
try
495         {
496             Enumeration JavaDoc e = JFtp.getConnectionHandler().getConnections().keys();
497
498             while(e.hasMoreElements())
499             {
500                 String JavaDoc tmp = (String JavaDoc) e.nextElement();
501
502                 //System.out.println(tmp);
503
if(tmp.endsWith(file))
504                 {
505                     return tmp;
506                 }
507             }
508         }
509         catch(Exception JavaDoc ex)
510         {
511             // SMB does not need this
512
}
513
514         return file;
515     }
516
517     private String JavaDoc getRawFile(String JavaDoc msg)
518     {
519         String JavaDoc f = msg.substring(msg.indexOf("<") + 1);
520         f = f.substring(0, f.lastIndexOf(">"));
521
522         //System.out.println(f);
523
return f;
524     }
525
526     private boolean safeUpdate()
527     {
528         long time = System.currentTimeMillis();
529
530         if((time - oldtime) < Settings.refreshDelay)
531         {
532             return false;
533         }
534
535         oldtime = time;
536
537         return true;
538     }
539 }
540
Popular Tags