mirror of
https://github.com/igniterealtime/Spark.git
synced 2025-12-01 12:27:58 +00:00
SPARK-1330, filetransfer now displays current speed and estimated time of arrivel
new strings:
message.transfer.complete = The file transfer was complete ({0}))
// 0 = filename
message.transfer.progressbar.text.received = {0} received @ {1} {2}
// 0 = amount received
// 1 = current speed
// 2 = estimated time of arrival (eta)
message.transfer.progressbar.text.sent = {0} sent @ {1} {2}
// 0 = amount sent
// 1 = current speed
// 2 = eta
>>note that there are more than 1 whitespaces between some letters<<
git-svn-id: http://svn.igniterealtime.org/svn/repos/spark/trunk@12424 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
committed by
wolf.posdorfer
parent
89d820c654
commit
6c68cf020d
@ -19,26 +19,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui;
|
package org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui;
|
||||||
|
|
||||||
import org.jivesoftware.Spark;
|
|
||||||
import org.jivesoftware.resource.Res;
|
|
||||||
import org.jivesoftware.resource.SparkRes;
|
|
||||||
import org.jivesoftware.smack.XMPPException;
|
|
||||||
import org.jivesoftware.smack.util.StringUtils;
|
|
||||||
import org.jivesoftware.smackx.filetransfer.FileTransfer;
|
|
||||||
import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
|
|
||||||
import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;
|
|
||||||
import org.jivesoftware.spark.SparkManager;
|
|
||||||
import org.jivesoftware.spark.component.FileDragLabel;
|
|
||||||
import org.jivesoftware.spark.ui.ContactItem;
|
|
||||||
import org.jivesoftware.spark.ui.ContactList;
|
|
||||||
import org.jivesoftware.spark.util.ByteFormat;
|
|
||||||
import org.jivesoftware.spark.util.GraphicUtils;
|
|
||||||
import org.jivesoftware.spark.util.ResourceUtils;
|
|
||||||
import org.jivesoftware.spark.util.SwingWorker;
|
|
||||||
import org.jivesoftware.spark.util.URLFileSystem;
|
|
||||||
import org.jivesoftware.spark.util.log.Log;
|
|
||||||
import org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.Downloads;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Cursor;
|
import java.awt.Cursor;
|
||||||
import java.awt.Desktop;
|
import java.awt.Desktop;
|
||||||
@ -58,6 +38,8 @@ import java.net.MalformedURLException;
|
|||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
@ -71,7 +53,25 @@ import javax.swing.JOptionPane;
|
|||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JPopupMenu;
|
import javax.swing.JPopupMenu;
|
||||||
import javax.swing.JProgressBar;
|
import javax.swing.JProgressBar;
|
||||||
import javax.swing.SwingUtilities;
|
|
||||||
|
import org.jivesoftware.Spark;
|
||||||
|
import org.jivesoftware.resource.Res;
|
||||||
|
import org.jivesoftware.resource.SparkRes;
|
||||||
|
import org.jivesoftware.smack.XMPPException;
|
||||||
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
|
import org.jivesoftware.smackx.filetransfer.FileTransfer;
|
||||||
|
import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
|
||||||
|
import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;
|
||||||
|
import org.jivesoftware.spark.SparkManager;
|
||||||
|
import org.jivesoftware.spark.component.FileDragLabel;
|
||||||
|
import org.jivesoftware.spark.ui.ContactItem;
|
||||||
|
import org.jivesoftware.spark.ui.ContactList;
|
||||||
|
import org.jivesoftware.spark.util.ByteFormat;
|
||||||
|
import org.jivesoftware.spark.util.GraphicUtils;
|
||||||
|
import org.jivesoftware.spark.util.ResourceUtils;
|
||||||
|
import org.jivesoftware.spark.util.URLFileSystem;
|
||||||
|
import org.jivesoftware.spark.util.log.Log;
|
||||||
|
import org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.Downloads;
|
||||||
|
|
||||||
public class ReceiveMessage extends JPanel {
|
public class ReceiveMessage extends JPanel {
|
||||||
|
|
||||||
@ -85,7 +85,10 @@ public class ReceiveMessage extends JPanel {
|
|||||||
private JProgressBar progressBar = new JProgressBar();
|
private JProgressBar progressBar = new JProgressBar();
|
||||||
private IncomingFileTransfer transfer;
|
private IncomingFileTransfer transfer;
|
||||||
private TransferButton cancelButton = new TransferButton();
|
private TransferButton cancelButton = new TransferButton();
|
||||||
|
private JLabel progressLabel = new JLabel();
|
||||||
private long bytesRead;
|
private long bytesRead;
|
||||||
|
private long _starttime;
|
||||||
|
private long _endtime;
|
||||||
|
|
||||||
public ReceiveMessage() {
|
public ReceiveMessage() {
|
||||||
setLayout(new GridBagLayout());
|
setLayout(new GridBagLayout());
|
||||||
@ -102,9 +105,6 @@ public class ReceiveMessage extends JPanel {
|
|||||||
|
|
||||||
add(declineButton, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
|
add(declineButton, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
|
||||||
|
|
||||||
// ResourceUtils.resButton(acceptLabel, Res.getString("accept"));
|
|
||||||
// ResourceUtils.resButton(declineLabel, Res.getString("reject"));
|
|
||||||
|
|
||||||
// Decorate Cancel Button
|
// Decorate Cancel Button
|
||||||
decorateCancelButton();
|
decorateCancelButton();
|
||||||
|
|
||||||
@ -215,7 +215,8 @@ public class ReceiveMessage extends JPanel {
|
|||||||
String bareJID = StringUtils.parseBareAddress(requestor);
|
String bareJID = StringUtils.parseBareAddress(requestor);
|
||||||
|
|
||||||
ContactList contactList = SparkManager.getWorkspace().getContactList();
|
ContactList contactList = SparkManager.getWorkspace().getContactList();
|
||||||
final ContactItem contactItem = contactList.getContactItemByJID(bareJID);
|
final ContactItem contactItem = contactList
|
||||||
|
.getContactItemByJID(bareJID);
|
||||||
|
|
||||||
setBackground(new Color(239, 245, 250));
|
setBackground(new Color(239, 245, 250));
|
||||||
acceptButton.setVisible(false);
|
acceptButton.setVisible(false);
|
||||||
@ -223,79 +224,113 @@ public class ReceiveMessage extends JPanel {
|
|||||||
titleLabel.setText(Res.getString("message.negotiate.file.transfer"));
|
titleLabel.setText(Res.getString("message.negotiate.file.transfer"));
|
||||||
titleLabel.setForeground(new Color(65, 139, 179));
|
titleLabel.setForeground(new Color(65, 139, 179));
|
||||||
|
|
||||||
|
|
||||||
add(progressBar, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
|
add(progressBar, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
|
||||||
add(cancelButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
|
add(progressLabel, new GridBagConstraints(1, 3, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
|
||||||
|
add(cancelButton, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
|
||||||
cancelButton.setVisible(true);
|
cancelButton.setVisible(true);
|
||||||
transfer = request.accept();
|
transfer = request.accept();
|
||||||
try {
|
|
||||||
|
|
||||||
final File downloadedFile = new File(Downloads.getDownloadDirectory(), request.getFileName());
|
final File downloadedFile = new File(Downloads.getDownloadDirectory(), request.getFileName());
|
||||||
|
|
||||||
progressBar.setMaximum((int)(request.getFileSize()/SendMessage.getDivisorForByte(request.getFileSize())));
|
|
||||||
progressBar.setStringPainted(true);
|
|
||||||
|
|
||||||
SwingWorker worker = new SwingWorker() {
|
|
||||||
public Object construct() {
|
|
||||||
try {
|
try {
|
||||||
|
_starttime = System.currentTimeMillis();
|
||||||
transfer.recieveFile(downloadedFile);
|
transfer.recieveFile(downloadedFile);
|
||||||
}
|
}
|
||||||
catch (XMPPException e) {
|
catch (XMPPException e) {
|
||||||
Log.error(e);
|
Log.error(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
progressBar.setMaximum(100); // setting it to percent
|
||||||
|
progressBar.setStringPainted(true);
|
||||||
|
|
||||||
try {
|
|
||||||
Thread.sleep(10);
|
|
||||||
}
|
TimerTask updateProgessBar = new TimerTask() {
|
||||||
catch (InterruptedException e) {
|
@Override
|
||||||
Log.error(e);
|
public void run() {
|
||||||
|
if (transfer.getAmountWritten() >= request.getFileSize()
|
||||||
|
|| transfer.getStatus() == FileTransfer.Status.error
|
||||||
|
|| transfer.getStatus() == FileTransfer.Status.refused
|
||||||
|
|| transfer.getStatus() == FileTransfer.Status.cancelled)
|
||||||
|
{
|
||||||
|
this.cancel();
|
||||||
|
_endtime = System.currentTimeMillis();
|
||||||
|
updateonFinished(request, downloadedFile);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
// 100 % = Filesize
|
||||||
|
// x % = Currentsize
|
||||||
|
long p = (transfer.getAmountWritten() * 100 / transfer.getFileSize() );
|
||||||
|
progressBar.setValue(Math.round(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
TimerTask updatePrograssBarText = new TimerTask() {
|
||||||
|
long timenow;
|
||||||
|
long timeearlier;
|
||||||
|
long bytesnow;
|
||||||
|
long bytesearlier;
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (transfer.getAmountWritten() >= request.getFileSize()
|
||||||
|
|| transfer.getStatus() == FileTransfer.Status.error
|
||||||
|
|| transfer.getStatus() == FileTransfer.Status.refused
|
||||||
|
|| transfer.getStatus() == FileTransfer.Status.cancelled)
|
||||||
|
{
|
||||||
|
this.cancel();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
|
||||||
|
timenow = System.currentTimeMillis();
|
||||||
|
bytesnow = transfer.getAmountWritten();
|
||||||
bytesRead = transfer.getAmountWritten();
|
bytesRead = transfer.getAmountWritten();
|
||||||
if (bytesRead == -1) {
|
if (bytesRead == -1) {
|
||||||
bytesRead = 0;
|
bytesRead = 0;
|
||||||
}
|
}
|
||||||
ByteFormat format = new ByteFormat();
|
ByteFormat format = new ByteFormat();
|
||||||
String text = format.format(bytesRead);
|
String text = format.format(bytesRead);
|
||||||
progressBar.setString(text + " received");
|
|
||||||
|
|
||||||
try {
|
|
||||||
SwingUtilities.invokeAndWait(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
progressBar.setValue((int)(bytesRead/SendMessage.getDivisorForByte(transfer.getFileSize())));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
Log.error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
FileTransfer.Status status = transfer.getStatus();
|
FileTransfer.Status status = transfer.getStatus();
|
||||||
if (status == FileTransfer.Status.error ||
|
if (status == FileTransfer.Status.in_progress)
|
||||||
status == FileTransfer.Status.complete || status == FileTransfer.Status.cancelled ||
|
{
|
||||||
status == FileTransfer.Status.refused) {
|
titleLabel.setText(Res.getString("message.receiving.file", contactItem.getDisplayName()));
|
||||||
break;
|
String speed =TransferUtils.calculateSpeed(bytesnow-bytesearlier, timenow-timeearlier);
|
||||||
|
String est = TransferUtils.calculateEstimate(bytesnow, transfer.getFileSize(), _starttime, System.currentTimeMillis());
|
||||||
|
progressLabel.setText(Res.getString("message.transfer.progressbar.text.received", text, speed, est));
|
||||||
}
|
}
|
||||||
else if (status == FileTransfer.Status.negotiating_stream) {
|
else if (status == FileTransfer.Status.negotiating_stream) {
|
||||||
titleLabel.setText(Res.getString("message.negotiate.stream"));
|
titleLabel.setText(Res.getString("message.negotiate.stream"));
|
||||||
}
|
}
|
||||||
else if (status == FileTransfer.Status.in_progress) {
|
bytesearlier = bytesnow;
|
||||||
titleLabel.setText(Res.getString("message.receiving.file", contactItem.getDisplayName()));
|
timeearlier = timenow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Timer timer = new Timer();
|
||||||
|
timer.scheduleAtFixedRate(updateProgessBar, 10, 10);
|
||||||
|
|
||||||
|
Timer timer2 = new Timer();
|
||||||
|
timer2.scheduleAtFixedRate(updatePrograssBarText, 10, 500);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return "ok";
|
private void updateonFinished(final FileTransferRequest request,
|
||||||
}
|
final File downloadedFile) {
|
||||||
|
|
||||||
public void finished() {
|
|
||||||
if (transfer.getAmountWritten() >= request.getFileSize()) {
|
if (transfer.getAmountWritten() >= request.getFileSize()) {
|
||||||
transferDone(request, transfer);
|
transferDone(request, transfer);
|
||||||
|
|
||||||
imageLabel.setFile(downloadedFile);
|
imageLabel.setFile(downloadedFile);
|
||||||
imageLabel.setToolTipText(Res.getString("message.click.to.open"));
|
imageLabel.setToolTipText(Res.getString("message.click.to.open"));
|
||||||
titleLabel.setToolTipText(Res.getString("message.click.to.open"));
|
titleLabel.setToolTipText(Res.getString("message.click.to.open"));
|
||||||
|
String fin = TransferUtils.convertSecondstoHHMMSS(Math.round(_endtime-_starttime)/1000);
|
||||||
|
progressLabel.setText(Res.getString("label.time", fin));
|
||||||
|
|
||||||
imageLabel.addMouseListener(new MouseAdapter() {
|
imageLabel.addMouseListener(new MouseAdapter() {
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
@ -316,6 +351,7 @@ public class ReceiveMessage extends JPanel {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
titleLabel.addMouseListener(new MouseAdapter() {
|
titleLabel.addMouseListener(new MouseAdapter() {
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
if (e.getClickCount() == 2) {
|
if (e.getClickCount() == 2) {
|
||||||
@ -327,20 +363,16 @@ public class ReceiveMessage extends JPanel {
|
|||||||
titleLabel.addMouseListener(new MouseAdapter() {
|
titleLabel.addMouseListener(new MouseAdapter() {
|
||||||
public void mouseEntered(MouseEvent e) {
|
public void mouseEntered(MouseEvent e) {
|
||||||
titleLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
titleLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mouseExited(MouseEvent e) {
|
public void mouseExited(MouseEvent e) {
|
||||||
titleLabel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
|
titleLabel.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
invalidate();
|
invalidate();
|
||||||
validate();
|
validate();
|
||||||
repaint();
|
repaint();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String transferMessage = "";
|
String transferMessage = "";
|
||||||
@ -357,21 +389,16 @@ public class ReceiveMessage extends JPanel {
|
|||||||
transfer.getAmountWritten() < request.getFileSize()) {
|
transfer.getAmountWritten() < request.getFileSize()) {
|
||||||
transferMessage = Res.getString("message.transfer.cancelled");
|
transferMessage = Res.getString("message.transfer.cancelled");
|
||||||
}
|
}
|
||||||
|
else if(transfer.getAmountWritten() >= request.getFileSize())
|
||||||
|
{
|
||||||
|
transferMessage = Res.getString("message.transfer.complete", transfer.getFileName());
|
||||||
|
}
|
||||||
|
|
||||||
setFinishedText(transferMessage);
|
setFinishedText(transferMessage);
|
||||||
showAlert(true);
|
showAlert(true);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
worker.start();
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
Log.error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setFinishedText(String text) {
|
private void setFinishedText(String text) {
|
||||||
acceptButton.setVisible(false);
|
acceptButton.setVisible(false);
|
||||||
@ -568,6 +595,7 @@ public class ReceiveMessage extends JPanel {
|
|||||||
cancelTransfer();
|
cancelTransfer();
|
||||||
acceptButton.setVisible(false);
|
acceptButton.setVisible(false);
|
||||||
declineButton.setVisible(false);
|
declineButton.setVisible(false);
|
||||||
|
cancelButton.setVisible(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -48,9 +48,9 @@ import org.jivesoftware.resource.Res;
|
|||||||
import org.jivesoftware.resource.SparkRes;
|
import org.jivesoftware.resource.SparkRes;
|
||||||
import org.jivesoftware.smack.XMPPException;
|
import org.jivesoftware.smack.XMPPException;
|
||||||
import org.jivesoftware.smackx.filetransfer.FileTransfer;
|
import org.jivesoftware.smackx.filetransfer.FileTransfer;
|
||||||
|
import org.jivesoftware.smackx.filetransfer.FileTransfer.Status;
|
||||||
import org.jivesoftware.smackx.filetransfer.FileTransferManager;
|
import org.jivesoftware.smackx.filetransfer.FileTransferManager;
|
||||||
import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;
|
import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;
|
||||||
import org.jivesoftware.smackx.filetransfer.FileTransfer.Status;
|
|
||||||
import org.jivesoftware.spark.SparkManager;
|
import org.jivesoftware.spark.SparkManager;
|
||||||
import org.jivesoftware.spark.component.FileDragLabel;
|
import org.jivesoftware.spark.component.FileDragLabel;
|
||||||
import org.jivesoftware.spark.ui.ContactItem;
|
import org.jivesoftware.spark.ui.ContactItem;
|
||||||
@ -78,6 +78,8 @@ public class SendMessage extends JPanel {
|
|||||||
private FileTransferManager transferManager;
|
private FileTransferManager transferManager;
|
||||||
private String fullJID;
|
private String fullJID;
|
||||||
private String nickname;
|
private String nickname;
|
||||||
|
private JLabel progressLabel = new JLabel();
|
||||||
|
private long _starttime;
|
||||||
|
|
||||||
public SendMessage() {
|
public SendMessage() {
|
||||||
setLayout(new GridBagLayout());
|
setLayout(new GridBagLayout());
|
||||||
@ -95,8 +97,8 @@ public class SendMessage extends JPanel {
|
|||||||
cancelButton.setIcon(SparkRes.getImageIcon(SparkRes.CANCEL_IMAGE));
|
cancelButton.setIcon(SparkRes.getImageIcon(SparkRes.CANCEL_IMAGE));
|
||||||
retryButton.setIcon(SparkRes.getImageIcon(SparkRes.REFRESH_IMAGE));
|
retryButton.setIcon(SparkRes.getImageIcon(SparkRes.REFRESH_IMAGE));
|
||||||
|
|
||||||
add(cancelButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
|
add(cancelButton, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
|
||||||
add(retryButton, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
|
add(retryButton, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0));
|
||||||
retryButton.setVisible(false);
|
retryButton.setVisible(false);
|
||||||
|
|
||||||
retryButton.addActionListener(new ActionListener() {
|
retryButton.addActionListener(new ActionListener() {
|
||||||
@ -185,24 +187,39 @@ public class SendMessage extends JPanel {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
progressBar.setMaximum((int) (fileSize / getDivisorForByte(fileSize)));
|
progressBar.setMaximum(100);
|
||||||
progressBar.setVisible(false);
|
progressBar.setVisible(false);
|
||||||
progressBar.setStringPainted(true);
|
progressBar.setStringPainted(true);
|
||||||
add(progressBar, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
|
add(progressBar, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
|
||||||
|
add(progressLabel, new GridBagConstraints(1, 3, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 150, 0));
|
||||||
|
|
||||||
|
|
||||||
SwingWorker worker = new SwingWorker() {
|
SwingWorker worker = new SwingWorker() {
|
||||||
|
|
||||||
|
|
||||||
public Object construct() {
|
public Object construct() {
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(10);
|
if(transfer.getBytesSent() >0 && _starttime==0){
|
||||||
|
_starttime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
long starttime = System.currentTimeMillis();
|
||||||
|
long startbyte = transfer.getBytesSent();
|
||||||
|
Thread.sleep(500);
|
||||||
FileTransfer.Status status = transfer.getStatus();
|
FileTransfer.Status status = transfer.getStatus();
|
||||||
if (status == Status.error ||
|
if (status == Status.error ||
|
||||||
status == Status.complete || status == Status.cancelled ||
|
status == Status.complete || status == Status.cancelled ||
|
||||||
status == Status.refused) {
|
status == Status.refused) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
updateBar(transfer, nickname);
|
long endtime = System.currentTimeMillis();
|
||||||
|
long endbyte = transfer.getBytesSent();
|
||||||
|
|
||||||
|
long timediff = endtime-starttime;
|
||||||
|
long bytediff = endbyte-startbyte;
|
||||||
|
|
||||||
|
updateBar(transfer, nickname, TransferUtils.calculateSpeed(bytediff, timediff) );
|
||||||
}
|
}
|
||||||
catch (InterruptedException e) {
|
catch (InterruptedException e) {
|
||||||
Log.error("Unable to sleep thread.", e);
|
Log.error("Unable to sleep thread.", e);
|
||||||
@ -213,7 +230,7 @@ public class SendMessage extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void finished() {
|
public void finished() {
|
||||||
updateBar(transfer, nickname);
|
updateBar(transfer, nickname, "??MB/s");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -250,7 +267,7 @@ public class SendMessage extends JPanel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateBar(final OutgoingFileTransfer transfer, String nickname) {
|
private void updateBar(final OutgoingFileTransfer transfer, String nickname, String kBperSecond) {
|
||||||
FileTransfer.Status status = transfer.getStatus();
|
FileTransfer.Status status = transfer.getStatus();
|
||||||
if (status == Status.negotiating_stream) {
|
if (status == Status.negotiating_stream) {
|
||||||
titleLabel.setText(Res.getString("message.negotiation.file.transfer", nickname));
|
titleLabel.setText(Res.getString("message.negotiation.file.transfer", nickname));
|
||||||
@ -260,6 +277,7 @@ public class SendMessage extends JPanel {
|
|||||||
Log.error("Error occured during file transfer.", transfer.getException());
|
Log.error("Error occured during file transfer.", transfer.getException());
|
||||||
}
|
}
|
||||||
progressBar.setVisible(false);
|
progressBar.setVisible(false);
|
||||||
|
progressLabel.setVisible(false);
|
||||||
titleLabel.setText(Res.getString("message.unable.to.send.file", nickname));
|
titleLabel.setText(Res.getString("message.unable.to.send.file", nickname));
|
||||||
cancelButton.setVisible(false);
|
cancelButton.setVisible(false);
|
||||||
retryButton.setVisible(true);
|
retryButton.setVisible(true);
|
||||||
@ -270,12 +288,16 @@ public class SendMessage extends JPanel {
|
|||||||
showAlert(false);
|
showAlert(false);
|
||||||
if (!progressBar.isVisible()) {
|
if (!progressBar.isVisible()) {
|
||||||
progressBar.setVisible(true);
|
progressBar.setVisible(true);
|
||||||
|
progressLabel.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SwingUtilities.invokeAndWait(new Runnable() {
|
SwingUtilities.invokeAndWait(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
progressBar.setValue((int)(transfer.getBytesSent()/getDivisorForByte(transfer.getFileSize())));
|
// 100 % = Filesize
|
||||||
|
// x % = Currentsize
|
||||||
|
long p = (transfer.getBytesSent() * 100 / transfer.getFileSize() );
|
||||||
|
progressBar.setValue(Math.round(p));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -285,16 +307,22 @@ public class SendMessage extends JPanel {
|
|||||||
|
|
||||||
ByteFormat format = new ByteFormat();
|
ByteFormat format = new ByteFormat();
|
||||||
String bytesSent = format.format(transfer.getBytesSent());
|
String bytesSent = format.format(transfer.getBytesSent());
|
||||||
progressBar.setString(bytesSent + " sent");
|
String est = TransferUtils.calculateEstimate(transfer.getBytesSent(), transfer.getFileSize(), _starttime, System.currentTimeMillis());
|
||||||
|
|
||||||
|
progressLabel.setText(Res.getString("message.transfer.progressbar.text.sent", bytesSent, kBperSecond, est));
|
||||||
}
|
}
|
||||||
else if (status == Status.complete) {
|
else if (status == Status.complete) {
|
||||||
progressBar.setVisible(false);
|
progressBar.setVisible(false);
|
||||||
|
|
||||||
|
String fin = TransferUtils.convertSecondstoHHMMSS(Math.round(System.currentTimeMillis()-_starttime)/1000);
|
||||||
|
progressLabel.setText(Res.getString("label.time", fin));
|
||||||
titleLabel.setText(Res.getString("message.you.have.sent", nickname));
|
titleLabel.setText(Res.getString("message.you.have.sent", nickname));
|
||||||
cancelButton.setVisible(false);
|
cancelButton.setVisible(false);
|
||||||
showAlert(true);
|
showAlert(true);
|
||||||
}
|
}
|
||||||
else if (status == Status.cancelled) {
|
else if (status == Status.cancelled) {
|
||||||
progressBar.setVisible(false);
|
progressBar.setVisible(false);
|
||||||
|
progressLabel.setVisible(false);
|
||||||
titleLabel.setText(Res.getString("message.file.transfer.canceled"));
|
titleLabel.setText(Res.getString("message.file.transfer.canceled"));
|
||||||
cancelButton.setVisible(false);
|
cancelButton.setVisible(false);
|
||||||
retryButton.setVisible(true);
|
retryButton.setVisible(true);
|
||||||
@ -302,6 +330,7 @@ public class SendMessage extends JPanel {
|
|||||||
}
|
}
|
||||||
else if (status == Status.refused) {
|
else if (status == Status.refused) {
|
||||||
progressBar.setVisible(false);
|
progressBar.setVisible(false);
|
||||||
|
progressLabel.setVisible(false);
|
||||||
titleLabel.setText(Res.getString("message.file.transfer.rejected", nickname));
|
titleLabel.setText(Res.getString("message.file.transfer.rejected", nickname));
|
||||||
cancelButton.setVisible(false);
|
cancelButton.setVisible(false);
|
||||||
retryButton.setVisible(true);
|
retryButton.setVisible(true);
|
||||||
@ -363,16 +392,4 @@ public class SendMessage extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static int getDivisorForByte(long filezise) {
|
|
||||||
if (filezise >= 1073741824) // giga
|
|
||||||
{
|
|
||||||
return 1024;
|
|
||||||
} else if (filezise >= 1099511627776L) // tera
|
|
||||||
{
|
|
||||||
return 1048576;
|
|
||||||
} else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,104 @@
|
|||||||
|
package org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides static access to often used Time and Byte functions
|
||||||
|
*
|
||||||
|
* @author wolf.posdorfer
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TransferUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the speed when given a timedifference and bytedifference
|
||||||
|
*
|
||||||
|
* @param bytediff
|
||||||
|
* in bytes
|
||||||
|
* @param timediff
|
||||||
|
* in milliseconds
|
||||||
|
* @return <b>xx,x kB/s</b> or <b>xx,x MB/s</b>
|
||||||
|
*/
|
||||||
|
public static String calculateSpeed(long bytediff, long timediff) {
|
||||||
|
double kB = calculateSpeedLong(bytediff, timediff);
|
||||||
|
|
||||||
|
if (bytediff == 0 && timediff == 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (kB < 1024) {
|
||||||
|
String KB = Double.toString(kB);
|
||||||
|
// Convert 3.1415926535897932384626433832795 to 3.1
|
||||||
|
KB = KB.contains(".") ? KB.substring(0, KB.indexOf(".") + 2) : KB;
|
||||||
|
|
||||||
|
return KB + "kB/s";
|
||||||
|
} else {
|
||||||
|
String MB = Double.toString((kB / 1024.0));
|
||||||
|
// Convert 3.1415926535897932384626433832795 to 3.1
|
||||||
|
MB = MB.contains(".") ? MB.substring(0, MB.indexOf(".") + 2) : MB;
|
||||||
|
|
||||||
|
return MB + "MB/s";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the speed and returns a long in kB/s
|
||||||
|
*
|
||||||
|
* @param bytediff
|
||||||
|
* @param timediff
|
||||||
|
* @return kB/s
|
||||||
|
*/
|
||||||
|
public static double calculateSpeedLong(long bytediff, long timediff) {
|
||||||
|
timediff = timediff == 0 ? 1 : timediff;
|
||||||
|
double kB = ((bytediff / timediff) * 1000.0) / 1024.0;
|
||||||
|
return kB;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the estimated time of arrival
|
||||||
|
*
|
||||||
|
* @param currentsize
|
||||||
|
* in byte
|
||||||
|
* @param totalsize
|
||||||
|
* in byte
|
||||||
|
* @param timestart
|
||||||
|
* in milliseconds
|
||||||
|
* @param timenow
|
||||||
|
* in milliseconds
|
||||||
|
* @return time in (HH:MM:SS)
|
||||||
|
*/
|
||||||
|
public static String calculateEstimate(long currentsize, long totalsize,
|
||||||
|
long timestart, long timenow) {
|
||||||
|
long timediff = timenow - timestart;
|
||||||
|
long sizeleft = totalsize - currentsize;
|
||||||
|
|
||||||
|
// currentsize = timediff
|
||||||
|
// sizeleft = x
|
||||||
|
|
||||||
|
long x = sizeleft * timediff / currentsize;
|
||||||
|
|
||||||
|
// Make it seconds
|
||||||
|
x = x / 1000;
|
||||||
|
|
||||||
|
return convertSecondstoHHMMSS(Math.round(x));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts given Seconds to HH:MM:SS
|
||||||
|
*
|
||||||
|
* @param second
|
||||||
|
* in seconds
|
||||||
|
* @return (HH:MM:SS)
|
||||||
|
*/
|
||||||
|
public static String convertSecondstoHHMMSS(int second) {
|
||||||
|
|
||||||
|
int hours = Math.round(second / 3600);
|
||||||
|
int minutes = Math.round((second / 60) % 60);
|
||||||
|
int seconds = Math.round(second % 60);
|
||||||
|
String hh = hours < 10 ? "0" + hours : "" + hours;
|
||||||
|
String mm = minutes < 10 ? "0" + minutes : "" + minutes;
|
||||||
|
String ss = seconds < 10 ? "0" + seconds : "" + seconds;
|
||||||
|
|
||||||
|
return "(" + hh + ":" + mm + ":" + ss + ")";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -777,6 +777,9 @@ message.supply.valid.timeout = Supply a valid time out value
|
|||||||
message.timeout.error = The timeout must be 5 seconds or greater
|
message.timeout.error = The timeout must be 5 seconds or greater
|
||||||
message.total.downloaded = Total downloaded
|
message.total.downloaded = Total downloaded
|
||||||
message.transfer.cancelled = The file transfer was canceled
|
message.transfer.cancelled = The file transfer was canceled
|
||||||
|
message.transfer.complete = The file transfer was complete ({0}))
|
||||||
|
message.transfer.progressbar.text.received = {0} received @ {1} {2}
|
||||||
|
message.transfer.progressbar.text.sent = {0} sent @ {1} {2}
|
||||||
message.transfer.rate = Transfer rate
|
message.transfer.rate = Transfer rate
|
||||||
message.transfer.refused = The file transfer was refused
|
message.transfer.refused = The file transfer was refused
|
||||||
message.transfer.waiting.on.user = Waiting for {0} to accept file transfer
|
message.transfer.waiting.on.user = Waiting for {0} to accept file transfer
|
||||||
|
|||||||
@ -463,11 +463,14 @@ message.file.transfer.canceled = Sie haben den Dateitransfer abgebrochen.
|
|||||||
message.negotiate.file.transfer = Dateitransfer wird vorbereitet. Bitte warten...
|
message.negotiate.file.transfer = Dateitransfer wird vorbereitet. Bitte warten...
|
||||||
message.negotiate.stream = Verbindungsdaten werden vorbereitet. Bitte warten...
|
message.negotiate.stream = Verbindungsdaten werden vorbereitet. Bitte warten...
|
||||||
message.receiving.file = Sie haben eine Datei von {0} erhalten
|
message.receiving.file = Sie haben eine Datei von {0} erhalten
|
||||||
|
message.received.file = Sie haben eine Datei von {0} erhalten.
|
||||||
message.click.to.open = <EFBFBD>ffnen
|
message.click.to.open = <EFBFBD>ffnen
|
||||||
message.error.during.file.transfer = W<EFBFBD>hrend des Dateitransfers ist ein Fehler aufgetreten.
|
message.error.during.file.transfer = W<EFBFBD>hrend des Dateitransfers ist ein Fehler aufgetreten.
|
||||||
message.transfer.refused = Der Dateitransfer wurde verweigert.
|
message.transfer.refused = Der Dateitransfer wurde verweigert.
|
||||||
message.transfer.cancelled = Der Dateitransfer wurde abgebrochen.
|
message.transfer.cancelled = Der Dateitransfer wurde abgebrochen.
|
||||||
message.received.file = Sie haben eine Datei von {0} erhalten.
|
message.transfer.complete = Der Dateitransfer war erfolgreich ({0}))
|
||||||
|
message.transfer.progressbar.text.received = {0} empfangen @ {1} {2}
|
||||||
|
message.transfer.progressbar.text.sent = {0} gesendet @ {1} {2}
|
||||||
message.file.exists.question = Die Datei existiert bereits. <20>berschreiben?
|
message.file.exists.question = Die Datei existiert bereits. <20>berschreiben?
|
||||||
message.transfer.waiting.on.user = {0} muss den Dateitransfer akzeptieren. Bitte warten...
|
message.transfer.waiting.on.user = {0} muss den Dateitransfer akzeptieren. Bitte warten...
|
||||||
message.negotiation.file.transfer = Dateitransfer mit {0} wird initialisiert. Bitte warten...
|
message.negotiation.file.transfer = Dateitransfer mit {0} wird initialisiert. Bitte warten...
|
||||||
|
|||||||
Reference in New Issue
Block a user