diff options
Diffstat (limited to 'target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java')
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java new file mode 100644 index 000000000..e92f86380 --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/executors/SWTDisplayExecutor.java @@ -0,0 +1,107 @@ +/******************************************************************************* + * Copyright (c) 2011 Wind River Systems, Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tcf.te.ui.internal.executors; + +import org.eclipse.swt.widgets.Display; +import org.eclipse.tcf.te.ui.activator.UIPlugin; +import org.eclipse.tcf.te.runtime.concurrent.interfaces.IExecutor; +import org.eclipse.tcf.te.runtime.concurrent.interfaces.INestableExecutor; +import org.eclipse.tcf.te.runtime.concurrent.interfaces.ISingleThreadedExecutor; +import org.eclipse.tcf.te.runtime.extensions.ExecutableExtension; +import org.eclipse.ui.PlatformUI; + +/** + * SWT display executor implementation utilizing the platform display. + */ +public class SWTDisplayExecutor extends ExecutableExtension implements IExecutor, ISingleThreadedExecutor, INestableExecutor { + + /* (non-Javadoc) + * @see java.util.concurrent.Executor#execute(java.lang.Runnable) + */ + @Override + public void execute(Runnable command) { + // Try the platform display first + if (PlatformUI.isWorkbenchRunning() + && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null + && !PlatformUI.getWorkbench().getDisplay().isDisposed()) { + PlatformUI.getWorkbench().getDisplay().asyncExec(command); + } else { + // Fallback to the display associated with the current thread + Display display = Display.findDisplay(Thread.currentThread()); + // If there is a display associated with the current thread, + // execute the runnable using that display instance. + if (display != null && !display.isDisposed()) { + display.asyncExec(command); + } else { + // There is no display to execute the runnable at. + // Drop execution and write a trace message if enabled + UIPlugin.getTraceHandler().trace("DROPPED display command invocation. No display instance found.!", 1, this); //$NON-NLS-1$ + } + } + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.ISingleThreadedExecutor#isExecutorThread() + */ + @Override + public boolean isExecutorThread() { + return isExecutorThread(Thread.currentThread()); + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.ISingleThreadedExecutor#isExecutorThread(java.lang.Thread) + */ + @Override + public boolean isExecutorThread(Thread thread) { + if (thread != null) { + // Try the platform display first + if (PlatformUI.isWorkbenchRunning() + && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null + && !PlatformUI.getWorkbench().getDisplay().isDisposed()) { + return thread.equals(PlatformUI.getWorkbench().getDisplay().getThread()); + } + + // Fallback to the display associated with the current thread + Display display = Display.findDisplay(thread); + if (display != null && !display.isDisposed()) { + return thread.equals(display.getThread()); + } + } + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.INestableExecutor#getMaxDepth() + */ + @Override + public int getMaxDepth() { + return 1; + } + + /* (non-Javadoc) + * @see org.eclipse.tcf.te.runtime.concurrent.interfaces.INestableExecutor#readAndExecute() + */ + @Override + public boolean readAndExecute() { + // Try the platform display first + if (PlatformUI.isWorkbenchRunning() + && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null + && !PlatformUI.getWorkbench().getDisplay().isDisposed()) { + return PlatformUI.getWorkbench().getDisplay().readAndDispatch(); + } + + // Fallback to the display associated with the current thread + Display display = Display.getCurrent(); + if (display != null && !display.isDisposed()) { + return display.readAndDispatch(); + } + return false; + } +} |