diff options
author | Susan Franklin | 2008-04-07 22:50:29 +0000 |
---|---|---|
committer | Susan Franklin | 2008-04-07 22:50:29 +0000 |
commit | d43337fd504f0c358600367c7d5bb454c8889ffa (patch) | |
tree | bfa21a7931f0be13bf288a90818d79b20a017160 /bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox | |
parent | 884b551bf759f29a8ffe5a3dfbaf6f96615c116b (diff) | |
download | rt.equinox.p2-d43337fd504f0c358600367c7d5bb454c8889ffa.tar.gz rt.equinox.p2-d43337fd504f0c358600367c7d5bb454c8889ffa.tar.xz rt.equinox.p2-d43337fd504f0c358600367c7d5bb454c8889ffa.zip |
Bug 224004 - [ui] Closing Software Updates dialog causes "Restart Eclipse?" prompt to self-dispose
Bug 223581 - [ui] prompted to Restart when downloading multiple features
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox')
3 files changed, 56 insertions, 27 deletions
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIActivator.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIActivator.java index 36b0bd9e2..e60c62e4f 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIActivator.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIActivator.java @@ -18,12 +18,10 @@ import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.core.eventbus.IProvisioningEventBus; import org.eclipse.equinox.internal.provisional.p2.core.eventbus.ProvisioningListener; import org.eclipse.equinox.internal.provisional.p2.engine.*; -import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI; -import org.eclipse.equinox.internal.provisional.p2.ui.ProvUIImages; +import org.eclipse.equinox.internal.provisional.p2.ui.*; import org.eclipse.equinox.internal.provisional.p2.ui.operations.ProvisioningUtil; import org.eclipse.equinox.internal.provisional.p2.ui.viewers.StructuredViewerProvisioningListener; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.eclipse.ui.statushandlers.StatusManager; import org.osgi.framework.*; @@ -119,11 +117,8 @@ public class ProvUIActivator extends AbstractUIPlugin { IProfile selfProfile = ProvisioningUtil.getProfile(IProfileRegistry.SELF); if (selfProfile != null && (selfProfile.getProfileId().equals(event.getProfileId()))) { if (event.getReason() == ProfileEvent.CHANGED) - PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { - public void run() { - ProvUI.requestRestart(false, null); - } - }); + ProvisioningOperationRunner.requestRestart(false); + } } catch (ProvisionException e) { ProvUI.handleException(e, ProvUIMessages.ProvUIActivator_ExceptionDuringProfileChange, StatusManager.LOG); diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvUI.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvUI.java index 03d07b5b4..9ffaea5fb 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvUI.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvUI.java @@ -11,16 +11,12 @@ package org.eclipse.equinox.internal.provisional.p2.ui; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.operations.*; import org.eclipse.core.runtime.*; -import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.internal.p2.ui.ProvUIActivator; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; -import org.eclipse.equinox.internal.p2.ui.dialogs.ApplyProfileChangesDialog; -import org.eclipse.equinox.internal.provisional.configurator.Configurator; import org.eclipse.equinox.internal.provisional.p2.ui.viewers.IUColumnConfig; import org.eclipse.equinox.internal.provisional.p2.ui.viewers.StructuredViewerProvisioningListener; import org.eclipse.jface.dialogs.MessageDialog; @@ -108,20 +104,6 @@ public class ProvUI { iuColumnConfig = columnConfig; } - public static void requestRestart(boolean restartRequired, Shell shell) { - int retCode = ApplyProfileChangesDialog.promptForRestart(shell, restartRequired); - if (retCode == ApplyProfileChangesDialog.PROFILE_APPLYCHANGES) { - Configurator configurator = (Configurator) ServiceHelper.getService(ProvUIActivator.getContext(), Configurator.class.getName()); - try { - configurator.applyConfiguration(); - } catch (IOException e) { - ProvUI.handleException(e, ProvUIMessages.ProvUI_ErrorDuringApplyConfig, StatusManager.LOG | StatusManager.BLOCK); - } - } else if (retCode == ApplyProfileChangesDialog.PROFILE_RESTART) { - PlatformUI.getWorkbench().restart(); - } - } - public static IUndoContext getProvisioningUndoContext() { if (provisioningUndoContext == null) { provisioningUndoContext = new ObjectUndoContext(new Object(), "Provisioning Undo Context"); //$NON-NLS-1$ diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java index 8da34deb1..56ad40495 100644 --- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java +++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java @@ -11,15 +11,22 @@ package org.eclipse.equinox.internal.provisional.p2.ui; +import java.io.IOException; +import java.util.HashSet; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.operations.IUndoableOperation; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.*; +import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; +import org.eclipse.equinox.internal.p2.ui.ProvUIActivator; import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; +import org.eclipse.equinox.internal.p2.ui.dialogs.ApplyProfileChangesDialog; +import org.eclipse.equinox.internal.provisional.configurator.Configurator; import org.eclipse.equinox.internal.provisional.p2.ui.operations.ProvisioningOperation; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.WorkbenchJob; import org.eclipse.ui.statushandlers.StatusManager; @@ -34,6 +41,10 @@ import org.eclipse.ui.statushandlers.StatusManager; */ public class ProvisioningOperationRunner { + static HashSet runningJobs = new HashSet(); + static boolean restartRequested = false; + static boolean restartRequired = false; + /** * Run the provisioning operation synchronously, adding it to the undo history if it * supports undo. Should only be used for operations that run quickly. @@ -109,7 +120,48 @@ public class ProvisioningOperationRunner { job.setPriority(Job.SHORT); } job.setUser(op.isUser()); + runningJobs.add(job); + job.addJobChangeListener(new JobChangeAdapter() { + public void done(IJobChangeEvent event) { + runningJobs.remove(event.getJob()); + if (restartRequested) { + requestRestart(restartRequired); + } + } + }); job.schedule(); return job; } + + public static void requestRestart(boolean force) { + if (isRunningOperations()) { + restartRequested = true; + restartRequired = restartRequired || force; + return; + } + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + public void run() { + if (PlatformUI.getWorkbench().isClosing()) + return; + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window == null) + return; + int retCode = ApplyProfileChangesDialog.promptForRestart(window.getShell(), restartRequired); + if (retCode == ApplyProfileChangesDialog.PROFILE_APPLYCHANGES) { + Configurator configurator = (Configurator) ServiceHelper.getService(ProvUIActivator.getContext(), Configurator.class.getName()); + try { + configurator.applyConfiguration(); + } catch (IOException e) { + ProvUI.handleException(e, ProvUIMessages.ProvUI_ErrorDuringApplyConfig, StatusManager.LOG | StatusManager.BLOCK); + } + } else if (retCode == ApplyProfileChangesDialog.PROFILE_RESTART) { + PlatformUI.getWorkbench().restart(); + } + } + }); + } + + private static boolean isRunningOperations() { + return !runningJobs.isEmpty(); + } } |