import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
/**
* progress bar dialog.
* the first, you must know your app execute times,
* you need implement two method:
*
* process(int times);
* initGuage();
*
* you can implements method:
*
* cleanUp()
* doBefore()
* doAfter()
* @author yin_zhiguo
* yin_zhiguo@hotmail.com
*
*/
public abstract class ProgressBarDialog extends Dialog {
private Label processMessageLabel; //info of process finish
private Button cancelButton; //cancel button
private Composite cancelComposite;
private Label lineLabel;//
private Composite progressBarComposite;//
private CLabel message;//
private ProgressBar progressBar = null; //
private Object result; //
private Shell shell; //
private Display display = null;
protected volatile boolean isClosed = false;//closed state
protected int executeTime = 50;//process times
protected String processMessage = "process......";//procress info
protected String shellTitle = "Progress..."; //
protected Image processImage = SWTUtil.getImageOfMessage();//image
protected boolean mayCancel = true; //cancel
protected int processBarStyle = SWT.SMOOTH; //process bar style
public void setMayCancel(boolean mayCancel) {
this.mayCancel = mayCancel;
}
public void setExecuteTime(int executeTime) {
this.executeTime = executeTime;
}
public void setProcessImage(Image processImage) {
this.processImage = processImage;
}
public void setProcessMessage(String processInfo) {
this.processMessage = processInfo;
}
public ProgressBarDialog(Shell parent) {
super(parent);
}
public abstract void initGuage();
public Object open() {
createContents(); //create window
shell.open();
shell.layout();
//start work
new ProcessThread(executeTime).start();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}
protected void createContents() {
shell = new Shell(getParent(), SWT.TITLE | SWT.PRIMARY_MODAL);
display = shell.getDisplay();
final GridLayout gridLayout = new GridLayout();
gridLayout.verticalSpacing = 10;
shell.setLayout(gridLayout);
shell.setSize(483, 181);
shell.setText(shellTitle);
final Composite composite = new Composite(shell, SWT.NONE);
composite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
composite.setLayout(new GridLayout());
message = new CLabel(composite, SWT.NONE);
message.setImage(processImage);
message.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
message.setText(processMessage);
progressBarComposite = new Composite(shell, SWT.NONE);
progressBarComposite.setLayoutData(new GridData(GridData.FILL,
GridData.CENTER, false, false));
progressBarComposite.setLayout(new FillLayout());
progressBar = new ProgressBar(progressBarComposite, processBarStyle);
progressBar.setMaximum(executeTime);
processMessageLabel = new Label(shell, SWT.NONE);
processMessageLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
lineLabel = new Label(shell, SWT.HORIZONTAL | SWT.SEPARATOR);
lineLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
cancelComposite = new Composite(shell, SWT.NONE);
cancelComposite.setLayoutData(new GridData(GridData.END,
GridData.CENTER, false, false));
final GridLayout gridLayout_1 = new GridLayout();
gridLayout_1.numColumns = 2;
cancelComposite.setLayout(gridLayout_1);
cancelButton = new Button(cancelComposite, SWT.NONE);
cancelButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
isClosed = true;
//System.out.println(isClosed);
}
});
cancelButton.setLayoutData(new GridData(78, SWT.DEFAULT));
cancelButton.setText("cancel");
cancelButton.setEnabled(this.mayCancel);
}
protected abstract String process(int times);
protected void cleanUp()
{
}
protected void doBefore()
{
}
protected void doAfter()
{
}
class ProcessThread extends Thread {
private int max = 0;
private volatile boolean shouldStop = false;
ProcessThread(int max) {
this.max = max;
}
public void run() {
doBefore();
for (final int[] i = new int[] {1}; i[0] <= max; i[0]++)
{
//
final String info = process(i[0]);
if (display.isDisposed()) {
return;
}
display.syncExec(new Runnable() {
public void run() {
if (progressBar.isDisposed()) {
return;
}
//
processMessageLabel.setText(info);
//
progressBar.setSelection(i[0]);
//
if (i[0] == max || isClosed) {
if (isClosed) {
shouldStop = true;//
cleanUp();//
}
shell.close();//
}
}
});
if (shouldStop) {
break;
}
}
doAfter();
}
}
public void setShellTitle(String shellTitle) {
this.shellTitle = shellTitle;
}
public void setProcessBarStyle(boolean pStyle) {
if(pStyle)
this.processBarStyle = SWT.SMOOTH;
else
this.processBarStyle = SWT.NONE;
}
}
class DemoProgressBar extends ProgressBarDialog {
private String[] info = null;
public DemoProgressBar(Shell parent) {
super(parent);
}
@Override
public void initGuage() {
info = new String[100];
for (int i = 0; i < info.length; i++) {
info[i] = "process task " + i + ".";
}
this.setExecuteTime(100);
this.setMayCancel(true);
this.setProcessMessage("please waiting....");
this.setShellTitle("Demo");
}
@Override
protected String process(int arg0) {
try{
Thread.sleep((long)(Math.random() * 300));
}catch(Exception e){e.printStackTrace();}
return info[arg0 - 1];
}
}
class SWTUtil {
private static ImageRegistry imageRegistry = new ImageRegistry();
private static Clipboard clipboard = new Clipboard(Display.getCurrent());
private static final String ___IMAGE_Of_MESSAGE = "";
static{
imageRegistry.put(___IMAGE_Of_MESSAGE, ImageDescriptor.createFromURL(newURL("file:icons/info2.gif")));
}
private SWTUtil(){}
public static URL newURL(String url_name) {
try {
return new URL(url_name);
} catch (MalformedURLException e) {
throw new RuntimeException("Malformed URL " + url_name, e);
}
}
public static void registryImage(String id, String urlName)
{
imageRegistry.put(id, ImageDescriptor.createFromURL(newURL(urlName)));
}
public static Image getImage(String id)
{
return imageRegistry.get(id);
}
public static Clipboard getClipboard() {
return clipboard;
}
public static Image getImageOfMessage()
{
return imageRegistry.get(___IMAGE_Of_MESSAGE);
}
}
class PBDialogDemo extends Shell {
public static void main(String args[]) {
try {
Display display = Display.getDefault();
PBDialogDemo shell = new PBDialogDemo(display, SWT.SHELL_TRIM);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public PBDialogDemo(Display display, int style) {
super(display, style);
createContents();
}
protected void createContents() {
setText("ProgressBar Dialog");
setSize(218, 98);
setLayout(new FillLayout());
final Button openProgressbarDialogButton = new Button(this, SWT.NONE);
openProgressbarDialogButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
DemoProgressBar dpb = new DemoProgressBar(PBDialogDemo.this);
dpb.initGuage();
dpb.open();
}
});
openProgressbarDialogButton.setText("Open ProgressBar Dialog");
}
protected void checkSubclass() {
}
}
|