diff options
6 files changed, 387 insertions, 285 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/META-INF/MANIFEST.MF index 3267cdd8b..a50610791 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/META-INF/MANIFEST.MF +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/META-INF/MANIFEST.MF @@ -25,5 +25,6 @@ Export-Package: org.eclipse.tcf.te.runtime.stepper, org.eclipse.tcf.te.runtime.stepper.iterators,
org.eclipse.tcf.te.runtime.stepper.job,
org.eclipse.tcf.te.runtime.stepper.nls;x-internal:=true,
+ org.eclipse.tcf.te.runtime.stepper.services,
org.eclipse.tcf.te.runtime.stepper.stepper,
org.eclipse.tcf.te.runtime.stepper.steps
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepperService.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepperService.java index 02d1b7af3..0073d7994 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepperService.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/interfaces/IStepperService.java @@ -58,4 +58,12 @@ public interface IStepperService extends IService { * @return <code>true</code> if the operation is enabled.
*/
public boolean isEnabled(Object context, String operation);
+
+ /**
+ * Returns <code>true</code> if the given operation can be canceled.
+ * @param context The context. Must not be <code>null</code>.
+ * @param operation The operation. Must not be <code>null</code>.
+ * @return <code>true</code> if the operation can be canceled.
+ */
+ public boolean isCancelable(Object context, String operation);
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/job/StepperJob.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/job/StepperJob.java index 520ee27e4..bd388b989 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/job/StepperJob.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/job/StepperJob.java @@ -37,6 +37,56 @@ public class StepperJob extends Job { private ICallback jobCallback = null; private boolean isFinished = false; private boolean isCanceled = false; + private final boolean isCancelable; + + private class NotCancelableProgressMonitor implements IProgressMonitor { + + private final IProgressMonitor monitor; + + public NotCancelableProgressMonitor(IProgressMonitor monitor) { + this.monitor = monitor; + } + + @Override + public void beginTask(String name, int totalWork) { + monitor.beginTask(name, totalWork); + } + + @Override + public void done() { + monitor.done(); + } + + @Override + public void internalWorked(double work) { + monitor.internalWorked(work); + } + + @Override + public boolean isCanceled() { + return false; + } + + @Override + public void setCanceled(boolean value) { + monitor.setCanceled(false); + } + + @Override + public void setTaskName(String name) { + monitor.setTaskName(name); + } + + @Override + public void subTask(String name) { + monitor.subTask(name); + } + + @Override + public void worked(int work) { + monitor.worked(work); + } + } /** * Constructor. @@ -47,7 +97,7 @@ public class StepperJob extends Job { * @param stepGroupId The step group id to execute. * @param operation The operation to execute. */ - public StepperJob(String name, IStepContext stepContext, IPropertiesContainer data, String stepGroupId, String operation) { + public StepperJob(String name, IStepContext stepContext, IPropertiesContainer data, String stepGroupId, String operation, boolean isCancelable) { super(name); setPriority(Job.INTERACTIVE); @@ -60,6 +110,7 @@ public class StepperJob extends Job { this.data = data; this.stepGroupId = stepGroupId; this.operation = operation; + this.isCancelable = isCancelable; if (stepContext.getContextObject() instanceof ISchedulingRule) { setRule((ISchedulingRule)stepContext.getContextObject()); @@ -92,12 +143,23 @@ public class StepperJob extends Job { return jobCallback; } + /** + * Return <code>true</code> if thsi job is cancelable. + */ + public boolean isCancelable() { + return isCancelable; + } + /* (non-Javadoc) * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) */ @Override protected final IStatus run(IProgressMonitor monitor) { + if (!isCancelable) { + monitor = new NotCancelableProgressMonitor(monitor); + } + // The stepper instance to be used IStepper stepper = new Stepper(getName()); IStatus status = Status.OK_STATUS; @@ -134,7 +196,7 @@ public class StepperJob extends Job { } public boolean isCanceled() { - return isCanceled; + return isCanceled && isCancelable; } /* (non-Javadoc) @@ -142,7 +204,9 @@ public class StepperJob extends Job { */ @Override protected void canceling() { - super.canceling(); - isCanceled = true; + if (isCancelable) { + super.canceling(); + isCanceled = true; + } } } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/services/AbstractStepperService.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/services/AbstractStepperService.java new file mode 100644 index 000000000..49af424b1 --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.stepper/src/org/eclipse/tcf/te/runtime/stepper/services/AbstractStepperService.java @@ -0,0 +1,28 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.runtime.stepper.services;
+
+import org.eclipse.tcf.te.runtime.services.AbstractService;
+import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperService;
+
+/**
+ * AbstractStepperService
+ */
+public abstract class AbstractStepperService extends AbstractService implements IStepperService {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperService#isCancelable(java.lang.Object, java.lang.String)
+ */
+ @Override
+ public boolean isCancelable(Object context, String operation) {
+ return OPERATION_CONNECT.equals(operation);
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java index 3d4c3e93b..f5826bbcb 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/activator/UIPlugin.java @@ -1,279 +1,280 @@ -/******************************************************************************* - * Copyright (c) 2011, 2012 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.tcf.ui.activator; - -import java.net.URL; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.swt.graphics.Image; -import org.eclipse.tcf.protocol.Protocol; -import org.eclipse.tcf.te.core.async.AsyncCallbackCollector; -import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil; -import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; -import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer; -import org.eclipse.tcf.te.runtime.properties.PropertiesContainer; -import org.eclipse.tcf.te.runtime.services.ServiceManager; -import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext; -import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperService; -import org.eclipse.tcf.te.runtime.stepper.job.StepperJob; -import org.eclipse.tcf.te.tcf.core.Tcf; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorModel; -import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel; -import org.eclipse.tcf.te.tcf.locator.model.Model; -import org.eclipse.tcf.te.tcf.ui.internal.ImageConsts; -import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchListener; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - - -/** - * The activator class controls the plug-in life cycle - */ -public class UIPlugin extends AbstractUIPlugin { - // The shared instance - private static UIPlugin plugin; - // The workbench listener instance - private IWorkbenchListener listener; - // Reference to the workbench listener - /* default */ final ListenerList listeners = new ListenerList(); - - /** - * Constructor. - */ - public UIPlugin() { - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static UIPlugin getDefault() { - return plugin; - } - - /** - * Convenience method which returns the unique identifier of this plugin. - */ - public static String getUniqueIdentifier() { - if (getDefault() != null && getDefault().getBundle() != null) { - return getDefault().getBundle().getSymbolicName(); - } - return "org.eclipse.tcf.te.tcf.ui"; //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - - // Create and register the workbench listener instance - listener = new IWorkbenchListener() { - - @Override - public boolean preShutdown(IWorkbench workbench, boolean forced) { - boolean proceedShutdown = true; - - // If there are workbench listener registered here, than - // invoke them now before closing all the channels. - Object[] candidates = listeners.getListeners(); - for (Object listener : candidates) { - if (!(listener instanceof IWorkbenchListener)) continue; - proceedShutdown &= ((IWorkbenchListener)listener).preShutdown(workbench, forced); - if (!proceedShutdown && !forced) break; - } - - if (proceedShutdown || forced) { - // Terminate the scanner - final ILocatorModel model = Model.getModel(true); - if (model != null) model.getScanner().terminate(); - - // Disconnect all connected connections via the stepper service - if (model != null) { - final AsyncCallbackCollector collector = new AsyncCallbackCollector(); - - Runnable runnable = new Runnable() { - @Override - public void run() { - // Get all peer model objects - IPeerModel[] peers = model.getPeers(); - // Loop them and check if disconnect is available - for (IPeerModel peerModel : peers) { - IStepperService service = ServiceManager.getInstance().getService(peerModel, IStepperService.class); - if (service != null) { - String stepGroupId = service.getStepGroupId(peerModel, IStepperService.OPERATION_DISCONNECT); - IStepContext stepContext = service.getStepContext(peerModel, IStepperService.OPERATION_DISCONNECT); - String name = service.getStepGroupName(peerModel, IStepperService.OPERATION_DISCONNECT); - boolean isEnabled = service.isEnabled(peerModel, IStepperService.OPERATION_DISCONNECT); - - if (isEnabled && stepGroupId != null && stepContext != null) { - IPropertiesContainer data = new PropertiesContainer(); - StepperJob job = new StepperJob(name != null ? name : "", //$NON-NLS-1$ - stepContext, - data, - stepGroupId, - IStepperService.OPERATION_DISCONNECT); - - ICallback callback = new AsyncCallbackCollector.SimpleCollectorCallback(collector); - job.setJobCallback(callback); - - job.schedule(); - } - } - } - - collector.initDone(); - } - }; - - Assert.isTrue(!Protocol.isDispatchThread()); - Protocol.invokeAndWait(runnable); - - ExecutorsUtil.waitAndExecute(0, collector.getConditionTester()); - } - - // Close all channels now - Tcf.getChannelManager().closeAll(!Protocol.isDispatchThread()); - } - - return proceedShutdown; - } - - @Override - public void postShutdown(IWorkbench workbench) { - // If there are workbench listener registered here, than invoke them now. - Object[] candidates = listeners.getListeners(); - for (Object listener : candidates) { - if (!(listener instanceof IWorkbenchListener)) continue; - ((IWorkbenchListener)listener).postShutdown(workbench); - } - } - }; - PlatformUI.getWorkbench().addWorkbenchListener(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext context) throws Exception { - plugin = null; - if (listener != null) { PlatformUI.getWorkbench().removeWorkbenchListener(listener); listener = null; } - super.stop(context); - } - - /** - * Adds the given workbench listener. - * <p> - * Has not effect if the same listener is already registered. - * - * @param listener The listener. Must not be <code>null</code>. - */ - public void addListener(IWorkbenchListener listener) { - Assert.isNotNull(listener); - listeners.add(listener); - } - - /** - * Removes the given workbench listener. - * <p> - * Has no effect if the same listener was not already registered. - * - * @param listener The listener. Must not be <code>null</code>. - */ - public void removeListener(IWorkbenchListener listener) { - Assert.isNotNull(listener); - listeners.remove(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry) - */ - @Override - protected void initializeImageRegistry(ImageRegistry registry) { - URL url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OBJ + "peer.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.PEER, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OBJ + "peer_discovered.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.PEER_DISCOVERED, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OBJ + "discovery_root.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.DISCOVERY_ROOT, ImageDescriptor.createFromURL(url)); - - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "gold_ovr.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.GOLD_OVR, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "green_ovr.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.GREEN_OVR, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "grey_ovr.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.GREY_OVR, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "red_ovr.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.RED_OVR, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "redX_ovr.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.RED_X_OVR, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "link_ovr.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.LINK_OVR, ImageDescriptor.createFromURL(url)); - - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_DTOOL + "run_exc.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.RUN_DISABLED, ImageDescriptor.createFromURL(url)); - url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_ETOOL + "run_exc.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.RUN_ENABLED, ImageDescriptor.createFromURL(url)); - } - - /** - * Loads the image registered under the specified key from the image - * registry and returns the <code>Image</code> object instance. - * - * @param key The key the image is registered with. - * @return The <code>Image</code> object instance or <code>null</code>. - */ - public static Image getImage(String key) { - return getDefault().getImageRegistry().get(key); - } - - /** - * Loads the image registered under the specified key from the image - * registry and returns the <code>ImageDescriptor</code> object instance. - * - * @param key The key the image is registered with. - * @return The <code>ImageDescriptor</code> object instance or <code>null</code>. - */ - public static ImageDescriptor getImageDescriptor(String key) { - return getDefault().getImageRegistry().getDescriptor(key); - } - - /** - * Loads the image given by the specified image descriptor from the image - * registry. If the image has been loaded ones before already, the cached - * <code>Image</code> object instance is returned. Otherwise, the <code> - * Image</code> object instance will be created and cached before returned. - * - * @param descriptor The image descriptor. - * @return The corresponding <code>Image</code> object instance or <code>null</code>. - */ - public static Image getSharedImage(AbstractImageDescriptor descriptor) { - ImageRegistry registry = getDefault().getImageRegistry(); - - String imageKey = descriptor.getDecriptorKey(); - Image image = registry.get(imageKey); - if (image == null) { - registry.put(imageKey, descriptor); - image = registry.get(imageKey); - } - - return image; - } -} +/*******************************************************************************
+ * Copyright (c) 2011, 2012 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.tcf.ui.activator;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.tcf.protocol.Protocol;
+import org.eclipse.tcf.te.core.async.AsyncCallbackCollector;
+import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil;
+import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
+import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
+import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
+import org.eclipse.tcf.te.runtime.services.ServiceManager;
+import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepContext;
+import org.eclipse.tcf.te.runtime.stepper.interfaces.IStepperService;
+import org.eclipse.tcf.te.runtime.stepper.job.StepperJob;
+import org.eclipse.tcf.te.tcf.core.Tcf;
+import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorModel;
+import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
+import org.eclipse.tcf.te.tcf.locator.model.Model;
+import org.eclipse.tcf.te.tcf.ui.internal.ImageConsts;
+import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class UIPlugin extends AbstractUIPlugin {
+ // The shared instance
+ private static UIPlugin plugin;
+ // The workbench listener instance
+ private IWorkbenchListener listener;
+ // Reference to the workbench listener
+ /* default */ final ListenerList listeners = new ListenerList();
+
+ /**
+ * Constructor.
+ */
+ public UIPlugin() {
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static UIPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Convenience method which returns the unique identifier of this plugin.
+ */
+ public static String getUniqueIdentifier() {
+ if (getDefault() != null && getDefault().getBundle() != null) {
+ return getDefault().getBundle().getSymbolicName();
+ }
+ return "org.eclipse.tcf.te.tcf.ui"; //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+
+ // Create and register the workbench listener instance
+ listener = new IWorkbenchListener() {
+
+ @Override
+ public boolean preShutdown(IWorkbench workbench, boolean forced) {
+ boolean proceedShutdown = true;
+
+ // If there are workbench listener registered here, than
+ // invoke them now before closing all the channels.
+ Object[] candidates = listeners.getListeners();
+ for (Object listener : candidates) {
+ if (!(listener instanceof IWorkbenchListener)) continue;
+ proceedShutdown &= ((IWorkbenchListener)listener).preShutdown(workbench, forced);
+ if (!proceedShutdown && !forced) break;
+ }
+
+ if (proceedShutdown || forced) {
+ // Terminate the scanner
+ final ILocatorModel model = Model.getModel(true);
+ if (model != null) model.getScanner().terminate();
+
+ // Disconnect all connected connections via the stepper service
+ if (model != null) {
+ final AsyncCallbackCollector collector = new AsyncCallbackCollector();
+
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ // Get all peer model objects
+ IPeerModel[] peers = model.getPeers();
+ // Loop them and check if disconnect is available
+ for (IPeerModel peerModel : peers) {
+ IStepperService service = ServiceManager.getInstance().getService(peerModel, IStepperService.class);
+ if (service != null) {
+ String stepGroupId = service.getStepGroupId(peerModel, IStepperService.OPERATION_DISCONNECT);
+ IStepContext stepContext = service.getStepContext(peerModel, IStepperService.OPERATION_DISCONNECT);
+ String name = service.getStepGroupName(peerModel, IStepperService.OPERATION_DISCONNECT);
+ boolean isEnabled = service.isEnabled(peerModel, IStepperService.OPERATION_DISCONNECT);
+
+ if (isEnabled && stepGroupId != null && stepContext != null) {
+ IPropertiesContainer data = new PropertiesContainer();
+ StepperJob job = new StepperJob(name != null ? name : "", //$NON-NLS-1$
+ stepContext,
+ data,
+ stepGroupId,
+ IStepperService.OPERATION_DISCONNECT,
+ false);
+
+ ICallback callback = new AsyncCallbackCollector.SimpleCollectorCallback(collector);
+ job.setJobCallback(callback);
+
+ job.schedule();
+ }
+ }
+ }
+
+ collector.initDone();
+ }
+ };
+
+ Assert.isTrue(!Protocol.isDispatchThread());
+ Protocol.invokeAndWait(runnable);
+
+ ExecutorsUtil.waitAndExecute(0, collector.getConditionTester());
+ }
+
+ // Close all channels now
+ Tcf.getChannelManager().closeAll(!Protocol.isDispatchThread());
+ }
+
+ return proceedShutdown;
+ }
+
+ @Override
+ public void postShutdown(IWorkbench workbench) {
+ // If there are workbench listener registered here, than invoke them now.
+ Object[] candidates = listeners.getListeners();
+ for (Object listener : candidates) {
+ if (!(listener instanceof IWorkbenchListener)) continue;
+ ((IWorkbenchListener)listener).postShutdown(workbench);
+ }
+ }
+ };
+ PlatformUI.getWorkbench().addWorkbenchListener(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ if (listener != null) { PlatformUI.getWorkbench().removeWorkbenchListener(listener); listener = null; }
+ super.stop(context);
+ }
+
+ /**
+ * Adds the given workbench listener.
+ * <p>
+ * Has not effect if the same listener is already registered.
+ *
+ * @param listener The listener. Must not be <code>null</code>.
+ */
+ public void addListener(IWorkbenchListener listener) {
+ Assert.isNotNull(listener);
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes the given workbench listener.
+ * <p>
+ * Has no effect if the same listener was not already registered.
+ *
+ * @param listener The listener. Must not be <code>null</code>.
+ */
+ public void removeListener(IWorkbenchListener listener) {
+ Assert.isNotNull(listener);
+ listeners.remove(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry)
+ */
+ @Override
+ protected void initializeImageRegistry(ImageRegistry registry) {
+ URL url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OBJ + "peer.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.PEER, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OBJ + "peer_discovered.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.PEER_DISCOVERED, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OBJ + "discovery_root.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.DISCOVERY_ROOT, ImageDescriptor.createFromURL(url));
+
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "gold_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.GOLD_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "green_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.GREEN_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "grey_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.GREY_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "red_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.RED_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "redX_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.RED_X_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "link_ovr.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.LINK_OVR, ImageDescriptor.createFromURL(url));
+
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_DTOOL + "run_exc.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.RUN_DISABLED, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_ETOOL + "run_exc.gif"); //$NON-NLS-1$
+ registry.put(ImageConsts.RUN_ENABLED, ImageDescriptor.createFromURL(url));
+ }
+
+ /**
+ * Loads the image registered under the specified key from the image
+ * registry and returns the <code>Image</code> object instance.
+ *
+ * @param key The key the image is registered with.
+ * @return The <code>Image</code> object instance or <code>null</code>.
+ */
+ public static Image getImage(String key) {
+ return getDefault().getImageRegistry().get(key);
+ }
+
+ /**
+ * Loads the image registered under the specified key from the image
+ * registry and returns the <code>ImageDescriptor</code> object instance.
+ *
+ * @param key The key the image is registered with.
+ * @return The <code>ImageDescriptor</code> object instance or <code>null</code>.
+ */
+ public static ImageDescriptor getImageDescriptor(String key) {
+ return getDefault().getImageRegistry().getDescriptor(key);
+ }
+
+ /**
+ * Loads the image given by the specified image descriptor from the image
+ * registry. If the image has been loaded ones before already, the cached
+ * <code>Image</code> object instance is returned. Otherwise, the <code>
+ * Image</code> object instance will be created and cached before returned.
+ *
+ * @param descriptor The image descriptor.
+ * @return The corresponding <code>Image</code> object instance or <code>null</code>.
+ */
+ public static Image getSharedImage(AbstractImageDescriptor descriptor) {
+ ImageRegistry registry = getDefault().getImageRegistry();
+
+ String imageKey = descriptor.getDecriptorKey();
+ Image image = registry.get(imageKey);
+ if (image == null) {
+ registry.put(imageKey, descriptor);
+ image = registry.get(imageKey);
+ }
+
+ return image;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/handler/StepperCommandHandler.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/handler/StepperCommandHandler.java index 5aacb23d1..3a1de5382 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/handler/StepperCommandHandler.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/handler/StepperCommandHandler.java @@ -80,8 +80,8 @@ public class StepperCommandHandler extends AbstractHandler implements IExecutabl stepContext,
data,
stepGroupId,
- operation);
-
+ operation,
+ service.isCancelable(element, operation));
job.schedule();
}
}
|