/** * */ package org.javabuilders.swing.handler.event.background; import java.awt.Component; import java.io.IOException; import java.lang.reflect.Method; import javax.swing.JDialog; import javax.swing.SwingWorker; import org.javabuilders.BuildException; import org.javabuilders.BuildResult; import org.javabuilders.event.BackgroundEvent; import org.javabuilders.event.IBackgroundCallback; import org.javabuilders.event.IBackgroundProcessingHandler; /** * Background processing handler for the Swing domain * * @author Jacek Furmankiewicz */ public class SwingBackgroundProcessingHandler implements IBackgroundProcessingHandler { private static final SwingBackgroundProcessingHandler singleton = new SwingBackgroundProcessingHandler(); /** * @return Singleton */ public static SwingBackgroundProcessingHandler getInstance() { return singleton; } private SwingBackgroundProcessingHandler() { } /* * (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 JDialog progressDialog = event.isBlocking() ? new BackgroundDialog(event, result) : null; SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>() { @Override protected Object doInBackground() throws Exception { Object value = method.invoke(target, event); return value; } @Override protected void done() { if (progressDialog != null) { progressDialog.setVisible(false); progressDialog.dispose(); } // 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.setVisible(true); } } }