1 16 package net.sf.jftp.gui.base; 17 18 import java.awt.BorderLayout ; 19 import java.awt.event.ActionEvent ; 20 import java.awt.event.ActionListener ; 21 import java.util.Enumeration ; 22 import java.util.Hashtable ; 23 24 import javax.swing.ImageIcon ; 25 import javax.swing.JLabel ; 26 import javax.swing.JList ; 27 import javax.swing.JScrollPane ; 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 46 { 47 public Hashtable sizeCache = new Hashtable (); 51 52 private JList text = new JList (); 54 private Hashtable downloads = new Hashtable (); 55 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 ()); 75 76 resume.setRolloverIcon(new ImageIcon (HImage.getImage(this, Settings.resumeImage2))); 77 resume.setRolloverEnabled(true); 78 pause.setRolloverIcon(new ImageIcon (HImage.getImage(this, Settings.pauseImage2))); 79 pause.setRolloverEnabled(true); 80 clear.setRolloverIcon(new ImageIcon (HImage.getImage(this, Settings.clearImage2))); 81 clear.setRolloverEnabled(true); 82 cancel.setRolloverIcon(new ImageIcon (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(clear); 92 93 cmdP.add(new JLabel (" ")); 94 95 cmdP.add(resume); 96 cmdP.add(pause); 97 98 cmdP.add(new JLabel (" ")); 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 resume.setSize(24, 24); 110 resume.setBorder(true); 111 pause.setSize(24, 24); 112 pause.setBorder(true); 113 114 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 JScrollPane dP = new JScrollPane (text); 123 add("South", cmdP); 124 add("Center", dP); 125 } 126 127 public void fresh() 128 { 129 downloads = new Hashtable (); 130 updateArea(); 131 } 132 133 public void actionPerformed(ActionEvent 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 fresh(); 145 } 146 147 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 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 ex) 192 { 193 ex.printStackTrace(); 194 } 195 } 196 else 197 { 198 cmd = getFile(cmd); 199 200 ConnectionHandler h = JFtp.getConnectionHandler(); 201 202 Object 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 } 232 catch(Exception ex) 233 { 234 ex.printStackTrace(); 235 236 } 238 } 239 240 LocalIO.pause(500); 241 updateList(getRawFile(getActiveItem()), DataConnection.FAILED, 242 -1, -1); 243 } 244 } 245 catch(Exception ex) 246 { 247 Log.debug("Action is not supported for this connection."); 248 ex.printStackTrace(); 249 } 250 } 251 252 private void pauseCon() 254 { 255 try 256 { 257 String 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 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 ex) 286 { 287 ex.printStackTrace(); 288 } 289 290 d.prepare(); 291 } 292 } 293 catch(Exception 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 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 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 ex) 329 { 330 ex.printStackTrace(); 331 } 332 } 333 } 334 catch(Exception ex) 335 { 336 Log.debug("Action is not supported for this connection."); 337 } 338 } 339 340 private String getActiveItem() 341 { 342 String tmp = (String ) 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 file, String type, long bytes, 355 long size) 356 { 357 String 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 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 String 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 String 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 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 ex) 423 { 424 } 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 k = downloads.elements(); 445 446 while(k.hasMoreElements()) 447 { 448 String tmp = (String ) 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 getFile(String msg) 483 { 484 String f = msg.substring(msg.indexOf("<") + 1); 485 f = f.substring(0, f.lastIndexOf(">")); 486 487 return getRealName(f); 489 } 490 491 private String getRealName(String file) 492 { 493 try 495 { 496 Enumeration e = JFtp.getConnectionHandler().getConnections().keys(); 497 498 while(e.hasMoreElements()) 499 { 500 String tmp = (String ) e.nextElement(); 501 502 if(tmp.endsWith(file)) 504 { 505 return tmp; 506 } 507 } 508 } 509 catch(Exception ex) 510 { 511 } 513 514 return file; 515 } 516 517 private String getRawFile(String msg) 518 { 519 String f = msg.substring(msg.indexOf("<") + 1); 520 f = f.substring(0, f.lastIndexOf(">")); 521 522 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 |