Main.java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Main {
private DownloadThread downloadThread = null;
private boolean disposed = false;
public Main() {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setText("SWT Smooth ProgressBar Demonstration");
shell.setLayout(new FormLayout());
shell.setBounds(200, 200, 700, 200);
Label downloadLabel = new Label(shell, SWT.NONE);
FormData data0 = new FormData();
data0.left = new FormAttachment(0, 0);
//data0.top = new FormAttachment(localLabel, 15);
//data2.right = new FormAttachment(100, -100);
downloadLabel.setLayoutData(data0);
downloadLabel.setText("FTP file: ");
final Text downloadField = new Text(shell, SWT.SINGLE | SWT.BORDER);
FormData data1 = new FormData();
data1.left = new FormAttachment(downloadLabel, 15);
data1.right = new FormAttachment(100, -100);
downloadField.setLayoutData(data1);
downloadField.setText("ftp://ftp.mozilla.org/pub/mozilla/moz-sol/1.2a-02-09-25/mozilla-sparc-sun-solaris2.7.tar.gz");
Label localLabel = new Label(shell, SWT.NONE);
FormData data2 = new FormData();
data2.left = new FormAttachment(0, 0);
data2.top = new FormAttachment(localLabel, 15);
localLabel.setLayoutData(data2);
localLabel.setText("Save As: ");
final Text localField = new Text(shell, SWT.SINGLE | SWT.BORDER);
FormData data3 = new FormData();
data3.left = new FormAttachment(localLabel, 15);
data3.top = new FormAttachment(downloadField, 5);
data3.right = new FormAttachment(100, -400);
localField.setLayoutData(data3);
localField.setText("c:\temp\tmp.bin");
final Button downloadButton = new Button(shell, SWT.NONE);
FormData data4 = new FormData();
data4.left = new FormAttachment(downloadField, 5);
data4.right = new FormAttachment(100, -5);
downloadButton.setLayoutData(data4);
downloadButton.setText("Download");
Label progressLabel = new Label(shell, SWT.NONE);
progressLabel.setText("Download progress:");
FormData data5 = new FormData();
data5.top = new FormAttachment(localField, 15);
data5.left = new FormAttachment(10, 15);
data5.right = new FormAttachment(90, -15);
progressLabel.setLayoutData(data5);
final ProgressBar progressBar = new ProgressBar(shell, SWT.SMOOTH);
FormData data6 = new FormData();
data6.top = new FormAttachment(localField, 35);
data6.left = new FormAttachment(10, 15);
data6.right = new FormAttachment(90, -15);
progressBar.setLayoutData(data6);
shell.open();
final DownloadListener downloadListener = new DownloadListener() {
public void setMinimum(final int min) {
display.asyncExec(new Runnable() {
public void run() {
if (!disposed) {
progressBar.setMinimum(min);
}
}
});
}
public void setMaximum(final int max) {
display.asyncExec(new Runnable() {
public void run() {
if (!disposed) {
progressBar.setMaximum(max);
}
}
});
}
public void setSelection(final int selection) {
display.asyncExec(new Runnable() {
public void run() {
if (!disposed) {
progressBar.setSelection(selection);
}
}
});
}
public void downloadEnded() {
if (!disposed) {
display.asyncExec(new Runnable() {
public void run() {
System.out.println("disposed = " + disposed);
if (!disposed) {
downloadButton.setText("Download");
}
}
});
}
}
};
downloadButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
try {
Button button = (Button) event.getSource();
if (button.getText().equalsIgnoreCase("download")) {
if (downloadField.getText().trim().equals("")) return;
File localFile = new File(localField.getText());
downloadThread = new DownloadThread(downloadListener,
localFile,
new URL(downloadField.getText()));
downloadThread.start();
downloadButton.setText("Stop");
}
else {
downloadThread.terminate();
}
}
catch(MalformedURLException e) {
e.printStackTrace();
}
};
});
shell.addShellListener(new ShellAdapter() {
public void shellClosed(ShellEvent se) {
disposed = true;
if (downloadThread != null) {
downloadThread.terminate();
}
}
});
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void main(String[] args) {
new Main();
}
}
interface DownloadListener {
public void setMinimum(int min);
public void setMaximum(int max);
public void setSelection(int selection);
public void downloadEnded();
}
class DownloadThread extends Thread
{
private int length = 0;
private URL url = null;
private File localFile = null;
private DownloadListener listener = null;
private boolean terminated = false;
public DownloadThread(DownloadListener listener, File localFile, URL url) {
this.url = url;
this.localFile = localFile;
this.listener = listener;
}
public void terminate() {
terminated = true;
}
public void run() {
try {
System.out.println(url);
URLConnection con = url.openConnection();
System.out.println("Connecting...");
con.connect();
System.out.println("Connected!");
int length = con.getContentLength();
listener.setMinimum(0);
listener.setMaximum(length);
int block = 4096;
int count = 0;
FileOutputStream fos = new FileOutputStream(localFile);
InputStream is = con.getInputStream();
byte[] buff = new byte[block];
int read = 0;
listener.setSelection(0);
while((read = is.read(buff, 0, block)) != -1) {
byte[] bytes;
if(read != buff.length) {
bytes = new byte[read];
System.arraycopy(buff, 0, bytes, 0, read);
}
else {
bytes = buff;
}
fos.write(bytes);
count += read;
if (terminated) {
break;
}
listener.setSelection(count);
}
fos.flush();
fos.close();
listener.downloadEnded();
} catch(Exception e) {
System.out.println("Error downloading file " + url);
e.printStackTrace();
}
}
}