/**
*
*/
package org.javabuilders.swt.handler.event.background;
import java.awt.Component;
import java.io.IOException;
import java.lang.reflect.Method;
import org.eclipse.swt.widgets.Display;
import org.javabuilders.BuildException;
import org.javabuilders.BuildResult;
import org.javabuilders.event.BackgroundEvent;
import org.javabuilders.event.IBackgroundCallback;
import org.javabuilders.event.IBackgroundProcessingHandler;
import org.javabuilders.swt.worker.SWTWorker;
/**
* Background processing handler for the Swing domain
* @author Jacek Furmankiewicz
*/
public class SWTBackgroundProcessingHandler implements
IBackgroundProcessingHandler {
private static final SWTBackgroundProcessingHandler singleton = new SWTBackgroundProcessingHandler();
/**
* @return Singleton
*/
public static SWTBackgroundProcessingHandler getInstance() {return singleton;}
private SWTBackgroundProcessingHandler() {}
/* (non-Javadoc)
* @see org.javabuilders.event.IBackgroundProcessingHandler#doInBackground(org.javabuilders.BuildResult, java.lang.Object, java.lang.reflect.Method, org.javabuilders.event.BackgroundEvent, org.javabuilders.event.IBackgroundCallback)
*/
public void doInBackground(final BuildResult result, final Object target,
final Method method, final BackgroundEvent event,
final IBackgroundCallback callbackWhenFinished)
throws IOException, BuildException {
Component component = null;
if (event.getSource() != null && event.getSource() instanceof Component) {
component = (Component)event.getSource();
}
final Component componentForEvent = component;
final boolean enabled = (componentForEvent == null) ? true : componentForEvent.isEnabled();
//show progress dialog only if task is blocking
final BackgroundDialog progressDialog = event.isBlocking() ? new BackgroundDialog(event) : null;
SWTWorker<Object,Object> worker = new SWTWorker<Object, Object> (Display.getDefault()) {
@Override
protected Object doInBackground() throws Exception {
Object value = method.invoke(target, event);
return value;
}
@Override
protected void done() {
if (progressDialog != null && !progressDialog.getShell().isDisposed()) {
progressDialog.getShell().close();
}
//restore enabled state on source
if (componentForEvent != null) {
componentForEvent.setEnabled(enabled);
}
//execute outstanding methods
try {
callbackWhenFinished.done(get());
} catch (Exception e) {
throw new BuildException(e,"Unexpected exception when getting back background method return value");
}
}
};
if (componentForEvent != null) {
componentForEvent.setEnabled(false);
}
worker.execute();
if (progressDialog != null) {
progressDialog.getShell().open();
}
}
}