Cancel import wizard confirmation dialog with remind me later button bug Bug 400854
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/sharedinstall/NeedsMigration.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/sharedinstall/NeedsMigration.java
index cf9859f..82f5878 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/sharedinstall/NeedsMigration.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/sharedinstall/NeedsMigration.java
@@ -97,7 +97,7 @@
 		IProfile previousUserProfile = createProfile("previous" + getName());
 		IProfile currentBaseProfile = createProfile("current" + getName());
 		assertOK(installAsRoots(previousUserProfile, new IInstallableUnit[] {sdk1, egit1}, true, planner, engine));
-		assertOK(installAsRoots(currentBaseProfile, new IInstallableUnit[] {eppPackage}, true, planner, engine));
+		assertOK(installAsRoots(currentBaseProfile, new IInstallableUnit[] {eppPackage, sdk1, egit1}, true, planner, engine));
 
 		//All the elements that are in the user profile are included in the base
 		assertFalse(needsMigration(previousUserProfile, currentBaseProfile));
@@ -107,7 +107,7 @@
 		IProfile previousUserProfile = createProfile("previous" + getName());
 		IProfile currentBaseProfile = createProfile("current" + getName());
 		assertOK(installAsRoots(previousUserProfile, new IInstallableUnit[] {sdk1, egit1, cdt1}, true, planner, engine));
-		assertOK(installAsRoots(currentBaseProfile, new IInstallableUnit[] {eppPackage}, true, planner, engine));
+		assertOK(installAsRoots(currentBaseProfile, new IInstallableUnit[] {eppPackage, egit1}, true, planner, engine));
 
 		//Not all the elements that are in the user profile are included in the base
 		assertTrue(needsMigration(previousUserProfile, currentBaseProfile));
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
index 330b225..11b6756 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
@@ -19,10 +19,12 @@
 import java.util.Iterator;
 import java.util.Set;
 import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.preferences.ConfigurationScope;
 import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
 import org.eclipse.equinox.internal.p2.engine.EngineActivator;
 import org.eclipse.equinox.internal.p2.garbagecollector.GarbageCollector;
 import org.eclipse.equinox.internal.p2.metadata.query.UpdateQuery;
+import org.eclipse.equinox.internal.p2.ui.sdk.scheduler.migration.AbstractPage_c;
 import org.eclipse.equinox.internal.p2.ui.sdk.scheduler.migration.ImportFromInstallationWizard_c;
 import org.eclipse.equinox.internal.provisional.p2.updatechecker.*;
 import org.eclipse.equinox.p2.core.IProvisioningAgent;
@@ -42,6 +44,7 @@
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.*;
 import org.eclipse.ui.statushandlers.StatusManager;
+import org.osgi.service.prefs.Preferences;
 
 /**
  * This plug-in is loaded on startup to register with the update checker.
@@ -51,7 +54,7 @@
 public class AutomaticUpdateScheduler implements IStartup {
 
 	private static final String ECLIPSE_P2_SKIP_MIGRATION_WIZARD = "eclipse.p2.skipMigrationWizard"; //$NON-NLS-1$
-	private static final String ECLIPSE_P2_SKIP_MOVED_INSTALL_DETECTION = "eclipse.p2.skipMovedInstallDetection"; //$NON-NLS-1$
+	//	private static final String ECLIPSE_P2_SKIP_MOVED_INSTALL_DETECTION = "eclipse.p2.skipMovedInstallDetection"; //$NON-NLS-1$
 	public static final String MIGRATION_DIALOG_SHOWN = "migrationDialogShown"; //$NON-NLS-1$
 
 	// values are to be picked up from the arrays DAYS and HOURS
@@ -110,7 +113,7 @@
 		scheduleUpdate();
 	}
 
-	//The return value indicates if the migration dialog has been shown or not. It does not indicate whether the migration has completed. 
+	//The return value indicates if the migration dialog has been shown or not. It does not indicate whether the migration has completed.
 	private boolean performMigration(IProvisioningAgent agent, IProfileRegistry registry, IProfile currentProfile) {
 		boolean skipWizard = Boolean.TRUE.toString().equalsIgnoreCase(System.getProperty(ECLIPSE_P2_SKIP_MIGRATION_WIZARD));
 		if (skipWizard)
@@ -143,12 +146,22 @@
 		if (previousProfile == null)
 			return false;
 
+		if (!remindMeLater())
+			return false;
+		
 		if (needsMigration(previousProfile, currentProfile)) {
 			openMigrationWizard(previousProfile);
 		}
 		return true;
 	}
 
+	
+	private boolean remindMeLater() {
+		Preferences prefs = ConfigurationScope.INSTANCE.getNode("org.eclipse.equinox.p2.ui");
+		return prefs.getBoolean(AbstractPage_c.REMIND_ME_LATER, true);
+
+	}
+	
 	private File getInstallFolder() {
 		Location configurationLocation = (Location) ServiceHelper.getService(EngineActivator.getContext(), Location.class.getName(), Location.INSTALL_FILTER);
 		return new File(configurationLocation.getURL().getPath());
@@ -242,7 +255,7 @@
 		return lastShownMigration < lastReset.getTimestamp();
 	}
 
-	//Get the timestamp that we migrated from 
+	//Get the timestamp that we migrated from
 	private long getLastShownMigration() {
 		return AutomaticUpdatePlugin.getDefault().getPreferenceStore().getLong(MIGRATION_DIALOG_SHOWN);
 	}
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/AbstractPage_c.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/AbstractPage_c.java
index b78dbf5..72a4350 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/AbstractPage_c.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/AbstractPage_c.java
@@ -17,7 +17,6 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.jobs.IJobChangeEvent;
 import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.core.runtime.preferences.ConfigurationScope;
 import org.eclipse.equinox.internal.p2.ui.ProvUI;
 import org.eclipse.equinox.internal.p2.ui.ProvUIActivator;
 import org.eclipse.equinox.internal.p2.ui.dialogs.*;
@@ -42,15 +41,12 @@
 import org.eclipse.ui.progress.DeferredTreeContentManager;
 import org.eclipse.ui.progress.WorkbenchJob;
 import org.osgi.framework.BundleContext;
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
 import org.osgi.util.tracker.ServiceTracker;
 
 public abstract class AbstractPage_c extends WizardPage implements Listener {
 
 	protected String currentMessage;
 	//	protected Button destinationBrowseButton;
-	protected Button remindMeButton;
 	protected CheckboxTreeViewer viewer = null;
 	protected Exception finishException;
 	protected boolean entryChanged = false;
@@ -288,37 +284,6 @@
 		Dialog.applyDialogFont(composite);
 	}
 
-	protected void createRemindMeGroup(Composite parent) {
-
-		remindMeButton = new Button(parent, SWT.CHECK);
-		remindMeButton.setText(ProvUIMessages.REMIND_ME_TO_MIGRATE_LATER);
-		remindMeButton.setSelection(true);
-		GridData dataRemindMeButton = new GridData();
-		dataRemindMeButton.horizontalSpan = 3;
-		remindMeButton.setLayoutData(dataRemindMeButton);
-
-		remindMeButton.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-
-				Preferences prefs = ConfigurationScope.INSTANCE.getNode("org.eclipse.equinox.p2.ui"); //$NON-NLS-1$
-				prefs.putBoolean(REMIND_ME_LATER, ((Button) (e.widget)).getSelection());
-
-				try {
-					prefs.flush();
-				} catch (BackingStoreException e1) {
-					// TODO Auto-generated catch block
-					e1.printStackTrace();
-				}
-
-			}
-		});
-
-	}
-
 	//	protected void createDestinationGroup(Composite parent, boolean includeButton) {
 	//		Composite composite = new Composite(parent, SWT.BORDER);
 	//		GridLayout layout = new GridLayout();
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationPage_c.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationPage_c.java
index 53bef0a..6aa83b3 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationPage_c.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationPage_c.java
@@ -56,7 +56,6 @@
 
 	@Override
 	protected void createContents(Composite composite) {
-		createRemindMeGroup(composite);
 		createInstallationTable(composite);
 	}
 
@@ -399,8 +398,7 @@
 			otherInstanceAgent = null;
 			toBeImportedProfile = null;
 		}
-		if (getWizard().performCancel())
-			cleanLocalRepository();
+		cleanLocalRepository();
 	}
 
 	public void cleanLocalRepository() {
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationWizard_c.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationWizard_c.java
index 852a6c8..e860d58 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationWizard_c.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ImportFromInstallationWizard_c.java
@@ -12,7 +12,8 @@
 package org.eclipse.equinox.internal.p2.ui.sdk.scheduler.migration;
 
 import java.util.Collection;
-import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.preferences.ConfigurationScope;
 import org.eclipse.equinox.internal.p2.ui.ProvUIActivator;
 import org.eclipse.equinox.internal.p2.ui.dialogs.ISelectableIUsPage;
 import org.eclipse.equinox.internal.p2.ui.dialogs.InstallWizard;
@@ -26,10 +27,14 @@
 import org.eclipse.equinox.p2.ui.LoadMetadataRepositoryJob;
 import org.eclipse.equinox.p2.ui.ProvisioningUI;
 import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IImportWizard;
 import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
 
 public class ImportFromInstallationWizard_c extends InstallWizard implements IImportWizard {
 	private IProfile toImportFrom;
@@ -82,6 +87,13 @@
 	//Remember the timestamp that we migrated from.
 	private void rememberShownMigration(long timestamp) {
 		AutomaticUpdatePlugin.getDefault().getPreferenceStore().setValue(AutomaticUpdateScheduler.MIGRATION_DIALOG_SHOWN, timestamp);
+		try {
+			Preferences prefs = ConfigurationScope.INSTANCE.getNode("org.eclipse.equinox.p2.ui"); //$NON-NLS-1$
+			prefs.putBoolean(AbstractPage_c.REMIND_ME_LATER, true);
+			prefs.flush();
+		} catch (BackingStoreException e) {
+			StatusManager.getManager().handle(new Status(IStatus.ERROR, AutomaticUpdatePlugin.PLUGIN_ID, 0, ProvUIMessages.ERROR_SAVING_PREFERENCES, e), StatusManager.LOG);
+		}
 	}
 
 	//Purge the profile registry from all the entries that are no longer relevant
@@ -98,4 +110,37 @@
 				}
 		}
 	}
+
+	public boolean performCancel() {
+
+		Preferences prefs = ConfigurationScope.INSTANCE.getNode("org.eclipse.equinox.p2.ui"); //$NON-NLS-1$
+		boolean result = false;
+		MessageDialog dialog = new MessageDialog(getShell(), "Migration dialaog", null, ProvUIMessages.ImportFromInstallationPage_CONFIRMATION_DIALOG, MessageDialog.QUESTION, new String[] {"Yes", "Yes, but remind me later", "No"}, 2);
+
+		int answer = dialog.open();
+		try {
+			switch (answer) {
+				case -1 : // if the user closes the dialog without clicking any button.
+					break;
+				case 0 :
+					result = true;
+					prefs.putBoolean(AbstractPage_c.REMIND_ME_LATER, false);
+					prefs.flush();
+					break;
+				case 1 :
+					result = true;
+					prefs.putBoolean(AbstractPage_c.REMIND_ME_LATER, true);
+					prefs.flush();
+					break;
+				case 2 :
+					result = false;
+					break;
+			}
+		} catch (BackingStoreException e) {
+			StatusManager.getManager().handle(new Status(IStatus.ERROR, AutomaticUpdatePlugin.PLUGIN_ID, 0, ProvUIMessages.ERROR_SAVING_PREFERENCES, e), StatusManager.LOG);
+		}
+		return result;
+
+	}
+
 }
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ProvUIMessages.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ProvUIMessages.java
index e67ae70..08f1d15 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ProvUIMessages.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/ProvUIMessages.java
@@ -33,4 +33,6 @@
 	public static String ImportWizard_WINDOWTITLE;
 	public static String ImportFromInstallationPage_INVALID_DESTINATION;
 	public static String REMIND_ME_TO_MIGRATE_LATER;
+	public static String ERROR_SAVING_PREFERENCES;
+	public static String ImportFromInstallationPage_CONFIRMATION_DIALOG;
 }
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/messages.properties b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/messages.properties
index 0561751..696fca8 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/messages.properties
@@ -10,5 +10,7 @@
 ImportFromInstallationPage_SELECT_COMPONENT=Select at least one available element to be installed.
 ImportWizard_WINDOWTITLE=Import
 ImportFromInstallationPage_INVALID_DESTINATION=Specify the path to a valid application installation.
-ImportFromInstallationPage_DIALOG_TITLE=The application you are running has been updated which caused the plugins you had installed to have been disabled.\nMigrate the software you had previously installed.
+ImportFromInstallationPage_DIALOG_TITLE=Eclipse has been updated. Consequently, the plugins you have installed are disabled. This wizard allows you to migrate the software you had previously installed.
+ImportFromInstallationPage_CONFIRMATION_DIALOG= Canceling this migration wizard will make you loose the ability to import your plugins if eclipse has been update again. Are you sure you want to cancel?
 REMIND_ME_TO_MIGRATE_LATER= Remind me later.
+ERROR_SAVING_PREFERENCES=Error saving preferences.