/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.io; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.swt.widgets.Display; import org.xmind.ui.internal.ToolkitPlugin; public class UIJobChangeListener implements IJobChangeListener { private Display display; private boolean syncExecute; public UIJobChangeListener() { this(false); } public UIJobChangeListener(boolean syncExecute) { this(Display.getCurrent(), syncExecute); } public UIJobChangeListener(Display display) { this(display, false); } public UIJobChangeListener(Display display, boolean syncExecute) { this.display = display; this.syncExecute = syncExecute; } protected boolean isSyncExecute() { return syncExecute; } protected Display getDisplay() { return display; } private void runInUIThread(final Runnable runnable) { if (display != null && !display.isDisposed()) { Runnable runnable2 = new Runnable() { public void run() { SafeRunner.run(new SafeRunnable() { public void run() throws Exception { runnable.run(); } }); } }; if (isSyncExecute()) { display.syncExec(runnable2); } else { display.asyncExec(runnable2); } } else { try { runnable.run(); } catch (Throwable e) { ToolkitPlugin.getDefault().getLog().log( new Status(IStatus.ERROR, ToolkitPlugin.PLUGIN_ID, "Error occurred when running in UI thread.", //$NON-NLS-1$ e)); } } } public final void aboutToRun(final IJobChangeEvent event) { runInUIThread(new Runnable() { public void run() { doAboutToRun(event); } }); } public final void awake(final IJobChangeEvent event) { runInUIThread(new Runnable() { public void run() { doAwake(event); } }); } public final void done(final IJobChangeEvent event) { runInUIThread(new Runnable() { public void run() { doDone(event); } }); } public final void running(final IJobChangeEvent event) { runInUIThread(new Runnable() { public void run() { doRunning(event); } }); } public final void scheduled(final IJobChangeEvent event) { runInUIThread(new Runnable() { public void run() { doScheduled(event); } }); } public final void sleeping(final IJobChangeEvent event) { runInUIThread(new Runnable() { public void run() { doSleeping(event); } }); } /** * Called safely in UI thread * * @param event */ protected void doAboutToRun(IJobChangeEvent event) { //subclasses may override } /** * Called safely in UI thread * * @param event */ protected void doAwake(IJobChangeEvent event) { //subclasses may override } /** * Called safely in UI thread * * @param event */ protected void doDone(IJobChangeEvent event) { //subclasses may override } /** * Called safely in UI thread * * @param event */ protected void doRunning(IJobChangeEvent event) { //subclasses may override } /** * Called safely in UI thread * * @param event */ protected void doScheduled(IJobChangeEvent event) { //subclasses may override } /** * Called safely in UI thread * * @param event */ protected void doSleeping(IJobChangeEvent event) { //subclasses may override } }