Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSusan Franklin2008-04-07 22:50:29 +0000
committerSusan Franklin2008-04-07 22:50:29 +0000
commitd43337fd504f0c358600367c7d5bb454c8889ffa (patch)
treebfa21a7931f0be13bf288a90818d79b20a017160 /bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox
parent884b551bf759f29a8ffe5a3dfbaf6f96615c116b (diff)
downloadrt.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')
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIActivator.java11
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvUI.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java54
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();
+ }
}

Back to the top