# HG changeset patch # User Ed Swartz # Date 1270669039 18000 # Node ID 8e38fdef1ceabfa7da18de19a780a53a85a50c4a # Parent 7a7fb0b5dd0bb13be7601e25b2934cc81bb49361 Bug 11013: choose appropriate launch configs when using Run/Debug As... shortcut diff -r 7a7fb0b5dd0b -r 8e38fdef1cea debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java --- a/debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java Wed Apr 07 12:02:59 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java Wed Apr 07 14:37:19 2010 -0500 @@ -974,6 +974,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(); diff -r 7a7fb0b5dd0b -r 8e38fdef1cea debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/AbstractSymbianLaunchShortcut.java --- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/AbstractSymbianLaunchShortcut.java Wed Apr 07 12:02:59 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/AbstractSymbianLaunchShortcut.java Wed Apr 07 14:37:19 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; @@ -11,19 +12,32 @@ 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.cpp.internal.api.utils.ui.WorkbenchUtils; public abstract class AbstractSymbianLaunchShortcut implements ILaunchShortcut2 { protected abstract void launchProject(IProject project, Executable executable, IPath defaultMMP, String mode); - + + /** + * Override to tell whether this existing configuration matches the type of + * one the shortcut would create. The default implementation returns true + * for all configurations. + */ + protected boolean isSupportedConfiguration(ILaunchConfiguration config) throws CoreException { + return true; + } + public void launch(IEditorPart editor, String mode) { // launch an existing config if one exists ILaunchConfiguration[] configs = getLaunchConfigurations(editor); @@ -31,7 +45,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; } @@ -55,17 +69,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 matches = new ArrayList(); + 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; @@ -86,7 +113,7 @@ if (file != null) { IPath filePath = file.getLocation(); - if ("mmp".equalsIgnoreCase(filePath.getFileExtension())) + if ("mmp".equalsIgnoreCase(filePath.getFileExtension())) //$NON-NLS-1$ { defaultMMP = filePath; } @@ -108,6 +135,27 @@ } } } + + /** + * Show a selection dialog that allows the user to choose one of the specified + * launch configurations. Return the chosen config, or null if the + * user cancelled the dialog. + */ + protected ILaunchConfiguration chooseConfiguration(List 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; @@ -124,7 +172,7 @@ if (file != null) { IPath filePath = file.getLocation(); - if ("mmp".equalsIgnoreCase(filePath.getFileExtension())) + if ("mmp".equalsIgnoreCase(filePath.getFileExtension())) //$NON-NLS-1$ { defaultMMP = filePath; } diff -r 7a7fb0b5dd0b -r 8e38fdef1cea debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/BoardLaunchShortcut.java --- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/BoardLaunchShortcut.java Wed Apr 07 12:02:59 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/BoardLaunchShortcut.java Wed Apr 07 14:37:19 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, diff -r 7a7fb0b5dd0b -r 8e38fdef1cea debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/EmulatorLaunchShortcut.java --- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/EmulatorLaunchShortcut.java Wed Apr 07 12:02:59 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/EmulatorLaunchShortcut.java Wed Apr 07 14:37:19 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, diff -r 7a7fb0b5dd0b -r 8e38fdef1cea debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/LaunchPlugin.java --- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/LaunchPlugin.java Wed Apr 07 12:02:59 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/LaunchPlugin.java Wed Apr 07 14:37:19 2010 -0500 @@ -391,12 +391,16 @@ } String defaultConfigName = getDefaultLaunchConfigName(project, executable); ArrayList configs = new ArrayList(); + // 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) { diff -r 7a7fb0b5dd0b -r 8e38fdef1cea debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/PhoneLaunchShortcut.java --- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/PhoneLaunchShortcut.java Wed Apr 07 12:02:59 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/PhoneLaunchShortcut.java Wed Apr 07 14:37:19 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, diff -r 7a7fb0b5dd0b -r 8e38fdef1cea debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/messages.properties --- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/messages.properties Wed Apr 07 12:02:59 2010 -0500 +++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/messages.properties Wed Apr 07 14:37:19 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.