Bug 11013: choose appropriate launch configs when using Run/Debug As... shortcut and show selection when more than one is available.
authorEd Swartz <ed.swartz@nokia.com>
Wed, 07 Apr 2010 13:22:43 -0500
changeset 1171 651ae39eb566
parent 1170 6326efa5a4bc
child 1172 d1378138ca79
Bug 11013: choose appropriate launch configs when using Run/Debug As... shortcut and show selection when more than one is available.
debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java
debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/AbstractSymbianLaunchShortcut.java
debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/BoardLaunchShortcut.java
debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/EmulatorLaunchShortcut.java
debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/LaunchPlugin.java
debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/PhoneLaunchShortcut.java
debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/messages.properties
--- a/debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java	Wed Apr 07 13:21:07 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java	Wed Apr 07 13:22:43 2010 -0500
@@ -976,6 +976,17 @@
 		return false;
 	}
 	
+	public static boolean isSysTRKConfiguration(ILaunchConfiguration configuration) {
+		try {
+			ILaunchConfigurationType configurationType = configuration.getType();
+			String id = configurationType.getIdentifier();
+			return id.equals(SYS_TRK_LAUNCH_TYPE_ID);
+		} catch (CoreException e) {
+		}
+		
+		return false;
+	}
+	
 	public static boolean isEmulatorConfiguration(ILaunchConfiguration configuration) {
 		try {
 			ILaunchConfigurationType configurationType = configuration.getType();
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/AbstractSymbianLaunchShortcut.java	Wed Apr 07 13:21:07 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/AbstractSymbianLaunchShortcut.java	Wed Apr 07 13:22:43 2010 -0500
@@ -1,5 +1,6 @@
 package com.nokia.cdt.internal.debug.launch;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.cdt.debug.core.executables.Executable;
@@ -12,20 +13,27 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugModelPresentation;
 import org.eclipse.debug.ui.ILaunchShortcut2;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 
 import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
 import com.nokia.cdt.debug.common.internal.executables.SymbianSourceFileRemapping;
+import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;
 
 public abstract class AbstractSymbianLaunchShortcut implements ILaunchShortcut2 {
 
 	protected abstract void launchProject(IProject project, Executable executable, IPath defaultMMP, String mode);
 
+	/** Tell whether this existing configuration matches one the shortcut would create */
+	protected abstract boolean isSupportedConfiguration(ILaunchConfiguration config) throws CoreException;
+	
 	public void launch(IEditorPart editor, String mode) {
 		// launch an existing config if one exists
 		ILaunchConfiguration[] configs = getLaunchConfigurations(editor);
@@ -33,7 +41,7 @@
 			// just launch the first one that supports the mode
 			for (ILaunchConfiguration config : configs) {
 				try {
-					if (config.supportsMode(mode)) {
+					if (config.supportsMode(mode) && isSupportedConfiguration(config)) {
 						DebugUITools.launch(configs[0], mode);
 						return;
 					}
@@ -57,17 +65,30 @@
 		// launch an existing config if one exists
 		ILaunchConfiguration[] configs = getLaunchConfigurations(selection);
 		if (configs.length > 0) {
-			// just launch the first one that supports the mode
-			for (ILaunchConfiguration config : configs) {
+			// find all the ones that support the mode and shortcut (#11013)
+			List<ILaunchConfiguration> matches = new ArrayList<ILaunchConfiguration>();
+			for (int i = 0; i < configs.length; i++) {
+				ILaunchConfiguration config = configs[i];
 				try {
-					if (config.supportsMode(mode)) {
-						DebugUITools.launch(configs[0], mode);
-						return;
+					if (config.supportsMode(mode) && isSupportedConfiguration(config)) {
+						matches.add(config);
 					}
 				} catch (CoreException e) {
 					e.printStackTrace();
 				}
 			}
+			// if only one matches, just launch
+			if (matches.size() > 0) {
+				if (matches.size() == 1 || WorkbenchUtils.isJUnitRunning()) {
+					DebugUITools.launch(matches.get(0), mode);
+				} else {
+					// else, ask the user
+					ILaunchConfiguration selected = chooseConfiguration(matches, mode);
+					if (selected != null)
+						DebugUITools.launch(selected, mode);
+				}
+				return;
+			}
 		}
 		
 		IPath defaultMMP = null;
@@ -88,7 +109,7 @@
 				if (file != null)
 				{
 					IPath filePath = file.getLocation();
-					if ("mmp".equalsIgnoreCase(filePath.getFileExtension()))
+					if ("mmp".equalsIgnoreCase(filePath.getFileExtension())) //$NON-NLS-1$
 					{
 						defaultMMP = filePath;
 					}
@@ -111,6 +132,27 @@
 			}
 		}
 	}
+	
+	/**
+	 * Show a selection dialog that allows the user to choose one of the specified
+	 * launch configurations.  Return the chosen config, or <code>null</code> if the
+	 * user cancelled the dialog.
+	 */
+	protected ILaunchConfiguration chooseConfiguration(List<ILaunchConfiguration> configList, String mode) {
+		IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation();
+		ElementListSelectionDialog dialog = new ElementListSelectionDialog(WorkbenchUtils.getSafeShell(), labelProvider);
+		dialog.setElements(configList.toArray());
+		dialog.setTitle(Messages.getString("AbstractSymbianLaunchShortcut.ChooseConfigTitle"));  //$NON-NLS-1$
+		dialog.setMessage(Messages.getString("AbstractSymbianLaunchShortcut.ChooseConfigLabel"));  //$NON-NLS-1$
+		dialog.setMultipleSelection(false);
+		int result = dialog.open();
+		labelProvider.dispose();
+		if (result == Window.OK) {
+			return (ILaunchConfiguration) dialog.getFirstResult();
+		}
+		return null;
+	}
+
 
 	public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) {
 		IPath defaultMMP = null;
@@ -127,7 +169,7 @@
 				if (file != null)
 				{
 					IPath filePath = file.getLocation();
-					if ("mmp".equalsIgnoreCase(filePath.getFileExtension()))
+					if ("mmp".equalsIgnoreCase(filePath.getFileExtension())) //$NON-NLS-1$
 					{
 						defaultMMP = filePath;
 					}
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/BoardLaunchShortcut.java	Wed Apr 07 13:21:07 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/BoardLaunchShortcut.java	Wed Apr 07 13:22:43 2010 -0500
@@ -18,8 +18,11 @@
 
 import org.eclipse.cdt.debug.core.executables.Executable;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.debug.core.ILaunchConfiguration;
 
+import com.nokia.cdt.debug.cw.symbian.SettingsData;
 import com.nokia.cdt.internal.debug.launch.LaunchPlugin.ILaunchCreationWizardFactory;
 import com.nokia.cdt.internal.debug.launch.wizard.AbstractLaunchWizard;
 import com.nokia.cdt.internal.debug.launch.wizard.ILaunchCreationWizard;
@@ -29,6 +32,15 @@
 
 public class BoardLaunchShortcut extends AbstractSymbianLaunchShortcut {
 	
+	/* (non-Javadoc)
+	 * @see com.nokia.cdt.internal.debug.launch.AbstractSymbianLaunchShortcut#isSupportedConfiguration(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	@Override
+	protected boolean isSupportedConfiguration(ILaunchConfiguration config)
+			throws CoreException {
+		return SettingsData.isStopModeConfiguration(config);
+	}
+	
 	@Override
 	protected void launchProject(IProject project, Executable executable, IPath defaultMMP, String mode) {
 		LaunchPlugin.getDefault().launchProject(project, executable, defaultMMP, mode, 
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/EmulatorLaunchShortcut.java	Wed Apr 07 13:21:07 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/EmulatorLaunchShortcut.java	Wed Apr 07 13:22:43 2010 -0500
@@ -18,8 +18,11 @@
 
 import org.eclipse.cdt.debug.core.executables.Executable;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.debug.core.ILaunchConfiguration;
 
+import com.nokia.cdt.debug.cw.symbian.SettingsData;
 import com.nokia.cdt.internal.debug.launch.LaunchPlugin.ILaunchCreationWizardFactory;
 import com.nokia.cdt.internal.debug.launch.wizard.ILaunchCreationWizard;
 import com.nokia.cdt.internal.debug.launch.wizard.LaunchCreationWizardInstance;
@@ -27,6 +30,16 @@
 
 public class EmulatorLaunchShortcut extends AbstractSymbianLaunchShortcut {
 	
+	/* (non-Javadoc)
+	 * @see com.nokia.cdt.internal.debug.launch.AbstractSymbianLaunchShortcut#isSupportedConfiguration(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	@Override
+	protected boolean isSupportedConfiguration(ILaunchConfiguration config)
+			throws CoreException {
+		
+		return SettingsData.isEmulatorConfiguration(config);
+	}
+	
 	@Override
 	protected void launchProject(IProject project, Executable executable, IPath defaultMMP, String mode) {
 		LaunchPlugin.getDefault().launchProject(project, executable, defaultMMP, mode, 
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/LaunchPlugin.java	Wed Apr 07 13:21:07 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/LaunchPlugin.java	Wed Apr 07 13:22:43 2010 -0500
@@ -391,12 +391,16 @@
 		}
 		String defaultConfigName = getDefaultLaunchConfigName(project, executable);
 		ArrayList<ILaunchConfiguration> configs = new ArrayList<ILaunchConfiguration>();
+		
 		// Try the configurations not from the launch history
+		// EJS 100407: match more than one configuration if possible: there may be several for the same
+		// project and executable (stop mode, run mode, app trk, sys trk, etc).  These will have
+		// suffixes like "(1)", "(2)", etc.  So look for String#contains instead of String#equals.
 		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
 		try {
 			ILaunchConfiguration[] launches = launchManager.getLaunchConfigurations();
 			for (ILaunchConfiguration launchConfiguration : launches) {
-				if (launchConfiguration.getName().equals(defaultConfigName) || 
+				if (launchConfiguration.getName().contains(defaultConfigName) || 
 						launchConfiguration.getAttribute(SettingsData.ATTR_originalName, launchConfiguration.getName()).equals(defaultConfigName))
 				{
 					if (defaultExecutable != null)
@@ -407,7 +411,6 @@
 					}
 					else
 						configs.add(launchConfiguration);
-					break;
 				}					
 			}
 		} catch (CoreException e) { 
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/PhoneLaunchShortcut.java	Wed Apr 07 13:21:07 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/PhoneLaunchShortcut.java	Wed Apr 07 13:22:43 2010 -0500
@@ -18,11 +18,14 @@
 
 import org.eclipse.cdt.debug.core.executables.Executable;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.debug.core.ILaunchConfiguration;
 
 import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
 import com.nokia.carbide.remoteconnections.interfaces.IConnectionTypeProvider;
 import com.nokia.carbide.remoteconnections.interfaces.IService;
+import com.nokia.cdt.debug.cw.symbian.SettingsData;
 import com.nokia.cdt.internal.debug.launch.LaunchPlugin.ILaunchCreationWizardFactory;
 import com.nokia.cdt.internal.debug.launch.newwizard.LaunchWizard;
 import com.nokia.cdt.internal.debug.launch.wizard.ILaunchCreationWizard;
@@ -30,6 +33,15 @@
 
 public class PhoneLaunchShortcut extends AbstractSymbianLaunchShortcut {
 
+	/* (non-Javadoc)
+	 * @see com.nokia.cdt.internal.debug.launch.AbstractSymbianLaunchShortcut#isSupportedConfiguration(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	@Override
+	protected boolean isSupportedConfiguration(ILaunchConfiguration config)
+			throws CoreException {
+		return SettingsData.isAppTRKConfiguration(config) || SettingsData.isSysTRKConfiguration(config);
+	}
+	
 	@Override
 	protected void launchProject(IProject project, Executable executable, IPath defaultMMP, String mode) {
 		LaunchPlugin.getDefault().launchProject(project, executable, defaultMMP, mode, 
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/messages.properties	Wed Apr 07 13:21:07 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/messages.properties	Wed Apr 07 13:22:43 2010 -0500
@@ -1,3 +1,5 @@
+AbstractSymbianLaunchShortcut.ChooseConfigLabel=Select the launch configuration:
+AbstractSymbianLaunchShortcut.ChooseConfigTitle=Choose configuration
 LaunchPlugin.0=Carbide_Sys_TRK
 LaunchPlugin.1=System TRK Debugging
 LaunchPlugin.17=No binaries found for project. Unable to launch.