Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 52620 Details for
Bug 157059
[launching] extensible launch options
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
work in progress
launching_7.txt (text/plain), 117.28 KB, created by
Michael Rennie
on 2006-10-24 14:19:50 EDT
(
hide
)
Description:
work in progress
Filename:
MIME Type:
Creator:
Michael Rennie
Created:
2006-10-24 14:19:50 EDT
Size:
117.28 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jdt.debug.tests >Index: tests/org/eclipse/jdt/debug/tests/core/LaunchDelegateTests.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/LaunchDelegateTests.java,v >retrieving revision 1.6 >diff -u -r1.6 LaunchDelegateTests.java >--- tests/org/eclipse/jdt/debug/tests/core/LaunchDelegateTests.java 20 Oct 2006 21:57:28 -0000 1.6 >+++ tests/org/eclipse/jdt/debug/tests/core/LaunchDelegateTests.java 24 Oct 2006 18:18:51 -0000 >@@ -16,7 +16,7 @@ > import org.eclipse.debug.core.ILaunch; > import org.eclipse.debug.core.ILaunchConfigurationType; > import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; >-import org.eclipse.debug.core.ILaunchDelegateProxy; >+import org.eclipse.debug.core.ILaunchDelegate; > import org.eclipse.debug.core.ILaunchManager; > import org.eclipse.debug.core.sourcelookup.ISourcePathComputer; > import org.eclipse.jdt.debug.testplugin.AlternateDelegate; >@@ -79,8 +79,8 @@ > HashSet modes = new HashSet(); > modes.add("alternate"); > modes.add(ILaunchManager.DEBUG_MODE); >- assertTrue("Should support mixed mode (alternate/debug)", type.supportsModeCombination(modes)); >- ILaunchDelegateProxy[] delegates = type.getDelegates(modes); >+ assertTrue("Should support mixed mode (alternate/debug)", type.supportsModes(modes)); >+ ILaunchDelegate[] delegates = type.getDelegates(modes); > assertTrue("missing delegate", delegates.length > 0); > assertEquals("Wrong number of delegates", 1, delegates.length); > assertTrue("Wrong delegate", delegates[0].getDelegate() instanceof AlternateDelegate); >@@ -96,8 +96,8 @@ > assertNotNull("Missing java application launch config type", type); > HashSet modes = new HashSet(); > modes.add(ILaunchManager.DEBUG_MODE); >- assertTrue("Should support mode (debug)", type.supportsModeCombination(modes)); >- ILaunchDelegateProxy[] delegates = type.getDelegates(modes); >+ assertTrue("Should support mode (debug)", type.supportsModes(modes)); >+ ILaunchDelegate[] delegates = type.getDelegates(modes); > assertTrue("missing delegate", delegates.length > 0); > assertEquals("Wrong number of delegates", 1, delegates.length); > assertTrue("Wrong delegate", delegates[0].getDelegate().getClass().getName().endsWith("JavaLaunchDelegate")); >@@ -113,8 +113,8 @@ > assertNotNull("Missing java application launch config type", type); > HashSet modes = new HashSet(); > modes.add("alternate"); >- assertTrue("Should support mode (alternate)", type.supportsModeCombination(modes)); >- ILaunchDelegateProxy[] delegates = type.getDelegates(modes); >+ assertTrue("Should support mode (alternate)", type.supportsModes(modes)); >+ ILaunchDelegate[] delegates = type.getDelegates(modes); > assertTrue("missing delegate", delegates.length > 0); > assertEquals("Wrong number of delegates", 1, delegates.length); > assertTrue("Wrong delegate", delegates[0].getDelegate() instanceof AlternateDelegate); >#P org.eclipse.debug.core >Index: core/org/eclipse/debug/internal/core/LaunchDelegate.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchDelegate.java,v >retrieving revision 1.3 >diff -u -r1.3 LaunchDelegate.java >--- core/org/eclipse/debug/internal/core/LaunchDelegate.java 20 Oct 2006 21:57:17 -0000 1.3 >+++ core/org/eclipse/debug/internal/core/LaunchDelegate.java 24 Oct 2006 18:18:53 -0000 >@@ -11,9 +11,7 @@ > package org.eclipse.debug.internal.core; > > import java.util.ArrayList; >-import java.util.Collection; > import java.util.HashSet; >-import java.util.Iterator; > import java.util.List; > import java.util.Set; > >@@ -22,7 +20,7 @@ > import org.eclipse.core.runtime.IStatus; > import org.eclipse.core.runtime.Status; > import org.eclipse.debug.core.DebugPlugin; >-import org.eclipse.debug.core.ILaunchDelegateProxy; >+import org.eclipse.debug.core.ILaunchDelegate; > import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; > > import com.ibm.icu.text.MessageFormat; >@@ -47,7 +45,7 @@ > * > * @since 3.3 > */ >-public final class LaunchDelegate implements ILaunchDelegateProxy { >+public final class LaunchDelegate implements ILaunchDelegate { > > /** > * The configuration element for this delegate >@@ -59,9 +57,9 @@ > */ > private ILaunchConfigurationDelegate fDelegate = null; > >- //lists of cached entries >+ //a listing of sets of >+ private List fLaunchModes = null; > private HashSet fModes = null; >- private HashSet fOptions = null; > private String fType = null; > > /** >@@ -72,6 +70,9 @@ > fElement = element; > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.core.ILaunchDelegateProxy#getDelegate() >+ */ > public ILaunchConfigurationDelegate getDelegate() throws CoreException { > if(fDelegate == null) { > Object obj = fElement.createExecutableExtension(IConfigurationElementConstants.DELEGATE); >@@ -84,6 +85,9 @@ > return fDelegate; > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.core.ILaunchDelegateProxy#getId() >+ */ > public String getId() { > return fElement.getAttribute(IConfigurationElementConstants.ID); > } >@@ -103,25 +107,16 @@ > } > return fType; > } >- >- public Set getOptions() { >- if(fOptions == null) { >- fOptions = new HashSet(); >- String option = fElement.getAttribute(IConfigurationElementConstants.OPTIONS); >- if(option != null) { >- String[] options = option.split(","); //$NON-NLS-1$ >- for(int i = 0; i < options.length; i++) { >- fOptions.add(options[i].trim()); >- } >- } >- } >- return fOptions; >- } > >- public Set getModes() { >+ /** >+ * Parese a list of modes and creates a new set of them >+ * @param element the configuraiton element to read from >+ * @return a set of launch modes created form a comma seperated list >+ */ >+ private Set getModes(IConfigurationElement element) { > if (fModes == null) { > fModes = new HashSet(); >- String modes = fElement.getAttribute(IConfigurationElementConstants.MODES); >+ String modes = element.getAttribute(IConfigurationElementConstants.MODES); > if (modes != null) { > String[] strings = modes.split(","); //$NON-NLS-1$ > for (int i = 0; i < strings.length; i++) { >@@ -132,6 +127,34 @@ > return fModes; > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.core.ILaunchDelegateProxy#getModes() >+ */ >+ public List getModes() { >+ if(fLaunchModes == null) { >+ fLaunchModes = new ArrayList(); >+ IConfigurationElement[] children = fElement.getChildren(IConfigurationElementConstants.MODES_COMBINATION); >+ for (int i = 0; i < children.length; i++) { >+ fLaunchModes.add(getModes(children[i])); >+ } >+ if(fLaunchModes.size() == 0) { >+ //try to get the modes from the old definition and make each one >+ //a seperate set of one element >+ String modes = fElement.getAttribute(IConfigurationElementConstants.MODES); >+ if (modes != null) { >+ String[] strings = modes.split(","); //$NON-NLS-1$ >+ HashSet modeset = null; >+ for (int i = 0; i < strings.length; i++) { >+ modeset = new HashSet(); >+ modeset.add(strings[i].trim()); >+ fLaunchModes.add(modeset); >+ } >+ } >+ } >+ } >+ return fLaunchModes; >+ } >+ > /** > * Returns the human readable name for this launch delegate > * @return the human readable name for this launch delegate, or <code>null</code> if none >@@ -164,55 +187,4 @@ > public String getSourcePathComputerId() { > return fElement.getAttribute(IConfigurationElementConstants.SOURCE_PATH_COMPUTER); > } >- >- /** >- * Returns all combinations of supported options. >- * >- * @return combinations of supported options >- */ >- private Collection getOptionSets() { >- Set optionSets = new HashSet(); >- optionSets.add(new HashSet()); // seed with the empty option set >- Object[] options = getOptions().toArray(); >- boolean grew = false; >- do { >- grew = false; >- Set[] sets = (Set[]) optionSets.toArray(new Set[optionSets.size()]); >- for (int i = 0; i < sets.length; i++) { >- Set optionSet = sets[i]; >- for (int j = 0; j < options.length; j++) { >- Object option = options[j]; >- Set newOptionSet = new HashSet(optionSet); >- if (newOptionSet.add(option)) { >- if (optionSets.add(newOptionSet)) { >- grew = true; >- } >- } >- } >- } >- } while (grew); >- return optionSets; >- } >- >- /** >- * Returns all supported launch mode combinations as sets of modes. >- * >- * @return all supported launch mode combinations >- */ >- List getModeCombinations() { >- Collection optionSets = getOptionSets(); >- Object[] modes = getModes().toArray(); >- List combinations = new ArrayList(optionSets.size() * modes.length); >- Iterator iterator = optionSets.iterator(); >- while (iterator.hasNext()) { >- Set optionSet = (Set) iterator.next(); >- for (int i = 0; i < modes.length; i++) { >- Object mode = modes[i]; >- Set set = new HashSet(optionSet); >- set.add(mode); >- combinations.add(set); >- } >- } >- return combinations; >- } > } >Index: core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java,v >retrieving revision 1.2 >diff -u -r1.2 IConfigurationElementConstants.java >--- core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java 20 Oct 2006 22:02:12 -0000 1.2 >+++ core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java 24 Oct 2006 18:18:52 -0000 >@@ -82,6 +82,11 @@ > public static final String MODES = "modes"; //$NON-NLS-1$ > > /** >+ * the modesCombination node name for a configuraiton element >+ */ >+ public static final String MODES_COMBINATION = "modesCombination"; //$NON-NLS-1$ >+ >+ /** > * the mode node name for a configuration element > */ > public static final String MODE = "mode"; //$NON-NLS-1$ >Index: core/org/eclipse/debug/internal/core/DebugCoreMessages.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java,v >retrieving revision 1.16 >diff -u -r1.16 DebugCoreMessages.java >--- core/org/eclipse/debug/internal/core/DebugCoreMessages.java 19 Oct 2006 21:37:52 -0000 1.16 >+++ core/org/eclipse/debug/internal/core/DebugCoreMessages.java 24 Oct 2006 18:18:52 -0000 >@@ -29,6 +29,8 @@ > > public static String LaunchConfigurationInfo_35; > >+ public static String LaunchConfigurationType_6; >+ > public static String LaunchConfigurationType_7; > > public static String LaunchOption_0; >Index: core/org/eclipse/debug/internal/core/LaunchManager.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java,v >retrieving revision 1.172 >diff -u -r1.172 LaunchManager.java >--- core/org/eclipse/debug/internal/core/LaunchManager.java 23 Oct 2006 01:16:21 -0000 1.172 >+++ core/org/eclipse/debug/internal/core/LaunchManager.java 24 Oct 2006 18:18:53 -0000 >@@ -67,6 +67,7 @@ > import org.eclipse.core.runtime.ListenerList; > import org.eclipse.core.runtime.Platform; > import org.eclipse.core.runtime.PlatformObject; >+import org.eclipse.core.runtime.Preferences; > import org.eclipse.core.runtime.SafeRunner; > import org.eclipse.core.runtime.Status; > import org.eclipse.core.variables.VariablesPlugin; >@@ -76,6 +77,7 @@ > import org.eclipse.debug.core.ILaunchConfiguration; > import org.eclipse.debug.core.ILaunchConfigurationListener; > import org.eclipse.debug.core.ILaunchConfigurationType; >+import org.eclipse.debug.core.ILaunchDelegate; > import org.eclipse.debug.core.ILaunchListener; > import org.eclipse.debug.core.ILaunchManager; > import org.eclipse.debug.core.ILaunchMode; >@@ -112,6 +114,21 @@ > */ > public class LaunchManager extends PlatformObject implements ILaunchManager, IResourceChangeListener { > >+ >+ /** >+ * Constants for xml node names >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ protected static final String MODES = "modes"; //$NON-NLS-1$ >+ protected static final String TYPEID = "typeid"; //$NON-NLS-1$ >+ protected static final String ID = "id"; //$NON-NLS-1$ >+ protected static final String DELEGATE = "delegate"; //$NON-NLS-1$ >+ protected static final String PREFERRED_DELEGATES = "preferredDelegates"; //$NON-NLS-1$ >+ protected static final String PREF_PREFERRED_DELEGATES = DebugPlugin.getUniqueIdentifier() + ".PREFERRED_DELEGATES"; //$NON-NLS-1$ >+ > /** > * Constant to define debug.core for the status codes > * >@@ -131,7 +148,7 @@ > * > * @since 3.2 > */ >- private static final String EMPTY_STRING = ""; //$NON-NLS-1$ >+ protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ > > /** > * Status code for which a UI prompter is registered. >@@ -462,6 +479,36 @@ > } > > /** >+ * Internal class used to hold information about a preferred delegate >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ class PreferredDelegate { >+ private ILaunchDelegate fDelegate = null; >+ private String fTypeid = null; >+ private Set fModes = null; >+ >+ public PreferredDelegate(ILaunchDelegate delegate, String typeid, Set modes) { >+ fDelegate = delegate; >+ fTypeid = typeid; >+ fModes = modes; >+ } >+ >+ public String getTypeId() { >+ return fTypeid; >+ } >+ >+ public Set getModes() { >+ return fModes; >+ } >+ >+ public ILaunchDelegate getDelegate() { >+ return fDelegate; >+ } >+ } >+ >+ /** > * Types of notifications > */ > public static final int ADDED = 0; >@@ -557,6 +604,15 @@ > private HashMap fLaunchDelegates = null; > > /** >+ * Initial startup cache of preferred delegate so that the debug prefs are only parsed once >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ private Set fPreferredDelegates = null; >+ >+ /** > * Collection of launches > */ > private List fLaunches= new ArrayList(10); >@@ -1383,6 +1439,91 @@ > } > > /** >+ * This method is used to initialize a simple listing of all preferred delegates, which is then used by each >+ * <code>ILaunchConfigurationType</code> to find if they have preferred delegates. Once an <code>ILaunchConfigurationType</code> >+ * has used this listing to initialize its preferred delegates ti will maintain changes to its preferred delegate, which are >+ * then written back to the pref sotre only when the launch manager shuts down. >+ * >+ * <p> >+ * This cache is not synchronized with the runtime preferred delegates stored in launch configuration types. >+ * </p> >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ private synchronized void initializePreferredDelegates() { >+ if(fPreferredDelegates == null) { >+ fPreferredDelegates = new HashSet(); >+ Preferences prefs = DebugPlugin.getDefault().getPluginPreferences(); >+ String preferred = prefs.getString(LaunchManager.PREF_PREFERRED_DELEGATES); >+ if(!EMPTY_STRING.equals(preferred)) { >+ try { >+ Element root = DebugPlugin.parseDocument(preferred); >+ NodeList nodes = root.getElementsByTagName(LaunchManager.DELEGATE); >+ Element element = null; >+ String tid = null, mod = null, did = null; >+ String[] modes = null; >+ Set modeset = null; >+ LaunchDelegate[] extensions = null; >+ ILaunchDelegate delegate = null; >+ for(int i = 0; i < nodes.getLength(); i++) { >+ element = (Element) nodes.item(i); >+ tid = element.getAttribute(LaunchManager.TYPEID); >+ if(!EMPTY_STRING.equals(tid)) { >+ //get the modes >+ mod = element.getAttribute(LaunchManager.MODES); >+ modes = mod.split(","); //$NON-NLS-1$ >+ modeset = new HashSet(); >+ for(int j = 0; j < modes.length; j++) { >+ modeset.add(modes[j].trim()); >+ } >+ //get the delegate id and the delegate >+ did = element.getAttribute(LaunchManager.ID); >+ extensions = getLaunchDelegates(); >+ for(int j = 0; j < extensions.length; j++) { >+ if(!EMPTY_STRING.equals(did) && did.equals(extensions[j].getId()) >+ && tid.equals(extensions[j].getLaunchConfigurationTypeId()) >+ && extensions[j].getModes().contains(modeset)) { >+ delegate = extensions[j]; >+ break; >+ } >+ } >+ //take tid, modeset, delegate and create entry >+ if(delegate != null & !EMPTY_STRING.equals(tid) & modeset != null) { >+ fPreferredDelegates.add(new PreferredDelegate(delegate, tid, modeset)); >+ } >+ } >+ } >+ } >+ catch (CoreException e) {DebugPlugin.log(e);} >+ } >+ } >+ } >+ >+ /** >+ * Allows internal access to a preferred delegate for a given type and mode set >+ * @param typeid the id of the <code>ILaunchConfigurationType</code> to find a delegate for >+ * @param modes ther set of modes for the delegate >+ * @return the preferred delegate for the specified type id and mode set, or <code>null</code> if none >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ protected ILaunchDelegate getPreferredDelegate(String typeid, Set modes) { >+ initializePreferredDelegates(); >+ PreferredDelegate pd = null; >+ for(Iterator iter = fPreferredDelegates.iterator(); iter.hasNext();) { >+ pd = (PreferredDelegate) iter.next(); >+ if(pd.getModes().equals(modes) & pd.getTypeId().equals(typeid)) { >+ return pd.getDelegate(); >+ } >+ } >+ return null; >+ } >+ >+ /** > * Returns all launch configurations that are stored locally. > * > * @return collection of launch configurations stored locally >@@ -1634,7 +1775,7 @@ > sourceContainerTypes = new HashMap(); > for (int i = 0; i < extensions.length; i++) { > sourceContainerTypes.put( >- extensions[i].getAttribute("id"), //$NON-NLS-1$ >+ extensions[i].getAttribute(ID), > new SourceContainerType(extensions[i])); > } > extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugPlugin.getUniqueIdentifier(), DebugPlugin.EXTENSION_POINT_SOURCE_PATH_COMPUTERS); >@@ -1642,7 +1783,7 @@ > sourcePathComputers = new HashMap(); > for (int i = 0; i < extensions.length; i++) { > sourcePathComputers.put( >- extensions[i].getAttribute("id"), //$NON-NLS-1$ >+ extensions[i].getAttribute(ID), > new SourcePathComputer(extensions[i])); > } > } >@@ -1663,7 +1804,7 @@ > String id = null; > for (int i= 0; i < infos.length; i++) { > configurationElement = infos[i]; >- id = configurationElement.getAttribute("id"); //$NON-NLS-1$ >+ id = configurationElement.getAttribute(ID); > if (id != null) { > fSourceLocators.put(id,configurationElement); > } else { >@@ -2015,12 +2156,68 @@ > } > } > >+ persistPreferredLaunchDelegates(); > clearAllLaunchConfigurations(); > > ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); > } > > /** >+ * Saves the listings of preferred launch delegates from all of the launch configuration types >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ private void persistPreferredLaunchDelegates() { >+ Preferences prefs = DebugPlugin.getDefault().getPluginPreferences(); >+ try { >+ Document doc = DebugPlugin.newDocument(); >+ Element root = doc.createElement(PREFERRED_DELEGATES); >+ doc.appendChild(root); >+ ILaunchConfigurationType[] types = getLaunchConfigurationTypes(); >+ Map preferred = null; >+ Element child = null; >+ ILaunchDelegate delegate = null; >+ Set modes = null; >+ String modestr = EMPTY_STRING; >+ for(int i = 0; i < types.length; i++) { >+ preferred = ((LaunchConfigurationType)types[i]).getPreferredDelegates(); >+ if(preferred != null && preferred.size() > 0) { >+ for(Iterator iter = preferred.keySet().iterator(); iter.hasNext();) { >+ modes = (Set) iter.next(); >+ delegate = (ILaunchDelegate) preferred.get(modes); >+ child = doc.createElement(DELEGATE); >+ child.setAttribute(ID, delegate.getId()); >+ child.setAttribute(TYPEID, types[i].getIdentifier()); >+ for(Iterator iter2 = modes.iterator(); iter2.hasNext();) { >+ modestr += iter2.next(); >+ if(iter2.hasNext()) { >+ modestr += ","; //$NON-NLS-1$ >+ } >+ } >+ child.setAttribute(MODES, modes.toString()); >+ root.appendChild(child); >+ } >+ } >+ } >+ String pref = null; >+ if(root.hasChildNodes()) { >+ pref = serializeDocument(doc); >+ } >+ if(pref != null) { >+ prefs.setValue(PREF_PREFERRED_DELEGATES, pref); >+ } >+ if(prefs.needsSaving()) { >+ DebugPlugin.getDefault().savePluginPreferences(); >+ } >+ } >+ catch (CoreException e) {DebugPlugin.log(e);} >+ catch (IOException ioe) {DebugPlugin.log(ioe);} >+ catch (TransformerException te) {DebugPlugin.log(te);} >+ } >+ >+ /** > * finds and terminates any running launch configurations associated with the given resource > * @param resource the resource to search for launch configurations and hence launches for > * @since 3.2 >Index: core/org/eclipse/debug/internal/core/LaunchConfigurationType.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java,v >retrieving revision 1.36 >diff -u -r1.36 LaunchConfigurationType.java >--- core/org/eclipse/debug/internal/core/LaunchConfigurationType.java 20 Oct 2006 21:57:17 -0000 1.36 >+++ core/org/eclipse/debug/internal/core/LaunchConfigurationType.java 24 Oct 2006 18:18:53 -0000 >@@ -13,6 +13,7 @@ > > import java.util.ArrayList; > import java.util.Collections; >+import java.util.HashMap; > import java.util.HashSet; > import java.util.Hashtable; > import java.util.Iterator; >@@ -31,7 +32,7 @@ > import org.eclipse.debug.core.ILaunchConfigurationMigrationDelegate; > import org.eclipse.debug.core.ILaunchConfigurationType; > import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; >-import org.eclipse.debug.core.ILaunchDelegateProxy; >+import org.eclipse.debug.core.ILaunchDelegate; > import org.eclipse.debug.core.ILaunchManager; > import org.eclipse.debug.core.ILaunchMode; > import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; >@@ -55,7 +56,7 @@ > * a listing of modes contributed to this launch configuration type > * @since 3.3 > * >- * <p> >+ * <p> > * <strong>EXPERIMENTAL</strong>. This field has been added as > * part of a work in progress. There is no guarantee that this API will > * remain unchanged during the 3.3 release cycle. Please do not use this API >@@ -65,6 +66,15 @@ > private Set fModes = null; > > /** >+ * A set of sets containing all of the supported mode combinations of this type >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ private Set fModeCombinations = null; >+ >+ /** > * the default source path computer for this config type > * @since 3.3 > * >@@ -88,9 +98,21 @@ > * be different delegates for different modes (since 3.0). > * Map of modes (Set of modes) to list of delegates > */ >- private Map fDelegates; >+ private Map fDelegates = null; > >- private LaunchDelegate fSourceProvider; >+ /** >+ * The source provider cache entry >+ */ >+ private LaunchDelegate fSourceProvider = null; >+ >+ /** >+ * A map of preferred launch delegates for mode combinations >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ private Map fPreferredDelegates = null; > > /** > * Constructs a new launch configuration type on the >@@ -129,7 +151,7 @@ > public ILaunchConfigurationDelegate getDelegate(String mode) throws CoreException { > Set modes = new HashSet(); > modes.add(mode); >- ILaunchDelegateProxy[] delegates = getDelegates(modes); >+ ILaunchDelegate[] delegates = getDelegates(modes); > if (delegates.length > 0) { > return delegates[0].getDelegate(); > } >@@ -147,40 +169,100 @@ > throw new CoreException(status); > } > >- public ILaunchDelegateProxy[] getDelegates(Set modes) throws CoreException { >+ /* (non-Javadoc) >+ * @see org.eclipse.debug.core.ILaunchConfigurationType#getDelegates(java.util.Set) >+ */ >+ public ILaunchDelegate[] getDelegates(Set modes) throws CoreException { > initializeDelegates(); >- Object[] theModes = modes.toArray(); >- for (int i = 0; i < theModes.length; i++) { >- String mode = (String) theModes[i]; >- if (!supportsMode(mode)) { >- throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, >- MessageFormat.format(DebugCoreMessages.LaunchConfigurationType_9, new String[] {mode, getIdentifier()}), null)); >- } >- } >+ initializePreferredDelegates(); > List delegates = (List) fDelegates.get(modes); > if (delegates == null) { > delegates = Collections.EMPTY_LIST; > } >- return (ILaunchDelegateProxy[]) delegates.toArray(new ILaunchDelegateProxy[delegates.size()]); >+ return (ILaunchDelegate[]) delegates.toArray(new ILaunchDelegate[delegates.size()]); >+ } >+ >+ /** >+ * @see org.eclipse.debug.core.ILaunchConfigurationType#setPreferredDelegate(java.util.Set, org.eclipse.debug.core.ILaunchDelegateProxy) >+ */ >+ public void setPreferredDelegate(Set modes, ILaunchDelegate delegate) { >+ if(fPreferredDelegates == null) { >+ fPreferredDelegates = new HashMap(); >+ } >+ fPreferredDelegates.put(modes, delegate); >+ } >+ >+ /** >+ * @see org.eclipse.debug.core.ILaunchConfigurationType#getPreferredDelegate(java.util.Set) >+ */ >+ public ILaunchDelegate getPreferredDelegate(Set modes) { >+ initializePreferredDelegates(); >+ return (ILaunchDelegate) fPreferredDelegates.get(modes); > } > >+ /** >+ * Internal use method to allow access to the listing of preferred delegates >+ * @return the map opf preferred delegates >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ public Map getPreferredDelegates() { >+ initializePreferredDelegates(); >+ return fPreferredDelegates; >+ } >+ >+ /** >+ * This method is used to initialize the listing of preferred launch delegates for this type >+ * >+ * <p> >+ * Undecide if this code should live in the launch manager and have it load a listing of all perferred launch >+ * delegates that each config type could then query as needed when looking for their preferrred delegate. >+ * Seems like it would be alot less work... >+ * </p> >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ private synchronized void initializePreferredDelegates() { >+ if(fPreferredDelegates == null) { >+ fPreferredDelegates = new HashMap(); >+ initializeDelegates(); >+ LaunchManager lm = (LaunchManager) DebugPlugin.getDefault().getLaunchManager(); >+ ILaunchDelegate delegate = null; >+ Set modes = null; >+ for(Iterator iter = fDelegates.keySet().iterator(); iter.hasNext();) { >+ modes = (Set) iter.next(); >+ delegate = lm.getPreferredDelegate(getIdentifier(), modes); >+ if(delegate != null) { >+ fPreferredDelegates.put(modes, delegate); >+ } >+ } >+ } >+ } >+ >+ /** >+ * Initializes the listing of launch delegates for this type >+ */ > private synchronized void initializeDelegates() { > if (fDelegates == null) { > // initialize delegate > fDelegates = new Hashtable(); > LaunchDelegate[] launchDelegates = getLaunchDelegateExtensions(); >+ LaunchDelegate delegate = null; >+ List modelist = null; > for (int i = 0; i < launchDelegates.length; i++) { >- LaunchDelegate delegate = launchDelegates[i]; >- List combintaions = delegate.getModeCombinations(); >- Iterator iterator = combintaions.iterator(); >- while (iterator.hasNext()) { >- Set combination = (Set) iterator.next(); >- registerDelegate(delegate, combination); >+ delegate = launchDelegates[i]; >+ modelist = delegate.getModes(); >+ for(int j = 0; j < modelist.size(); j++) { >+ //cache the delegate based on its set of modes and delegate >+ registerDelegate(delegate, (Set) modelist.get(j)); > } > } >- } >+ } > } >- >+ > /** > * Returns all launch delegate extensions registered for this configuration type. > * >@@ -190,6 +272,11 @@ > return ((LaunchManager) DebugPlugin.getDefault().getLaunchManager()).getLaunchDelegates(getIdentifier()); > } > >+ /** >+ * Caches a delegate keyed using the set of modes that it supports >+ * @param delegate the delegate to cache >+ * @param modes the set of modes that the specified delegate supports >+ */ > private void registerDelegate(LaunchDelegate delegate, Set modes) { > List delegatesForModes = (List) fDelegates.get(modes); > if (delegatesForModes == null) { >@@ -289,13 +376,34 @@ > if(fModes == null) { > fModes = new HashSet(); > LaunchDelegate[] delegates = getLaunchDelegateExtensions(); >+ List modesets = null; > for(int i= 0; i < delegates.length; i++) { >- fModes.addAll(delegates[i].getModes()); >+ modesets = delegates[i].getModes(); >+ for(Iterator iter = modesets.iterator(); iter.hasNext();) { >+ fModes.addAll((Set) iter.next()); >+ } > } > } > return fModes; > } >- >+ >+ /** >+ * @see org.eclipse.debug.core.ILaunchConfigurationType#getSupportedModeCombinations() >+ */ >+ public Set getSupportedModeCombinations() { >+ if(fModeCombinations == null) { >+ initializeDelegates(); >+ fModeCombinations = new HashSet(); >+ fModeCombinations = fDelegates.keySet(); >+ } >+ //return a clone or bad things happen >+ HashSet set = new HashSet(); >+ for(Iterator iter = fModeCombinations.iterator(); iter.hasNext();) { >+ set.add(new HashSet((Set) iter.next())); >+ } >+ return set; >+ } >+ > /** > * determines if the specified candidate is suitable for migration by loading it delegate. > * @param candidate the candidate to inspect for migration suitability >@@ -368,7 +476,17 @@ > * @see org.eclipse.debug.core.ILaunchConfigurationType#supportsMode(java.lang.String) > */ > public boolean supportsMode(String mode) { >- return getSupportedModes().contains(mode); >+ if(fModeCombinations == null) { >+ getSupportedModeCombinations(); >+ } >+ Set modes = null; >+ for(Iterator iter = fModeCombinations.iterator(); iter.hasNext();) { >+ modes = (Set) iter.next(); >+ if(modes.size() == 1 && modes.contains(mode)) { >+ return true; >+ } >+ } >+ return false; > } > > /* (non-Javadoc) >@@ -386,25 +504,13 @@ > } > > /* (non-Javadoc) >- * @see org.eclipse.debug.core.ILaunchConfigurationType#getSupportedModeCombinations() >- */ >- public Set[] getSupportedModeCombinations() { >- initializeDelegates(); >- Set combinations = fDelegates.keySet(); >- Set[] sets = (Set[])combinations.toArray(new Set[combinations.size()]); >- Set[] copy = new Set[sets.length]; >- for (int i = 0; i < copy.length; i++) { >- copy[i] = new HashSet(sets[i]); >- } >- return copy; >- } >- >- /* (non-Javadoc) > * @see org.eclipse.debug.core.ILaunchConfigurationType#supportsModeCombination(java.util.Set) > */ >- public boolean supportsModeCombination(Set modes) { >- initializeDelegates(); >- return fDelegates.containsKey(modes); >+ public boolean supportsModes(Set modes) { >+ if(fModeCombinations == null) { >+ getSupportedModeCombinations(); >+ } >+ return fModeCombinations.contains(modes); > } > > } >Index: core/org/eclipse/debug/internal/core/DebugCoreMessages.properties >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties,v >retrieving revision 1.69 >diff -u -r1.69 DebugCoreMessages.properties >--- core/org/eclipse/debug/internal/core/DebugCoreMessages.properties 19 Oct 2006 21:37:52 -0000 1.69 >+++ core/org/eclipse/debug/internal/core/DebugCoreMessages.properties 24 Oct 2006 18:18:52 -0000 >@@ -65,6 +65,7 @@ > LaunchConfigurationType_Launch_delegate_for__0__does_not_implement_required_interface_ILaunchConfigurationDelegate__1=Launch delegate for {0} does not implement required interface ILaunchConfigurationDelegate. > LaunchConfigurationType_9=Launch mode {0} not supported for configuration type {1} > LaunchConfigurationType_7=Launch mode not supported: {0} >+LaunchConfigurationType_6=Launch mode combination {0} not supported for configuration type {1}. > LaunchConfigurationType_10=There is no launch delegate registered for configuration type {0}, mode {1} > WatchExpression_0=(Watch expressions not supported) > NullStreamsProxy_0=Null Stream Monitor >Index: core/org/eclipse/debug/internal/core/LaunchConfiguration.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java,v >retrieving revision 1.89 >diff -u -r1.89 LaunchConfiguration.java >--- core/org/eclipse/debug/internal/core/LaunchConfiguration.java 23 Oct 2006 13:53:16 -0000 1.89 >+++ core/org/eclipse/debug/internal/core/LaunchConfiguration.java 24 Oct 2006 18:18:53 -0000 >@@ -46,7 +46,7 @@ > import org.eclipse.debug.core.ILaunchConfiguration; > import org.eclipse.debug.core.ILaunchConfigurationType; > import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; >-import org.eclipse.debug.core.ILaunchDelegateProxy; >+import org.eclipse.debug.core.ILaunchDelegate; > import org.eclipse.debug.core.IStatusHandler; > import org.eclipse.debug.core.Launch; > import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; >@@ -600,25 +600,29 @@ > * @see org.eclipse.debug.core.ILaunchConfiguration#launch(java.lang.String, org.eclipse.core.runtime.IProgressMonitor, boolean, boolean) > */ > public ILaunch launch(String mode, IProgressMonitor monitor, boolean build, boolean register) throws CoreException { >+ if (monitor == null) { >+ monitor = new NullProgressMonitor(); >+ } > // bug 28245 - force the delegate to load in case it is interested in launch notifications > Set modes = getModes(); > modes.add(mode); >- ILaunchDelegateProxy[] delegates = getType().getDelegates(modes); >+ ILaunchDelegate[] delegates = getType().getDelegates(modes); > ILaunchConfigurationDelegate delegate = null; > if (delegates.length == 1) { > delegate = delegates[0].getDelegate(); > } else if (delegates.length == 0) { >+ monitor.setCanceled(true); > IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(promptStatus); > handler.handleStatus(delegateNotAvailable, new Object[] {this, mode}); >- // no delegates TODO: >- IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), >- DebugPlugin.INTERNAL_ERROR, "No launch delegate", null); //$NON-NLS-1$ >+ IStatus status = new Status(IStatus.CANCEL, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "No launch delegate found, cancelling launch and returning", null); //$NON-NLS-1$ > throw new CoreException(status); > } else { >- // multiple delegates TODO: >- IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), >- DebugPlugin.INTERNAL_ERROR, "Duplicate launch delegates", null); //$NON-NLS-1$ >- throw new CoreException(status); >+ ILaunchDelegate del = getType().getPreferredDelegate(modes); >+ if(del == null) { >+ IStatus status = new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR, "Duplicate launch delegates", null); //$NON-NLS-1$ >+ throw new CoreException(status); >+ } >+ delegate = del.getDelegate(); > } > > ILaunchConfigurationDelegate2 delegate2 = null; >@@ -651,9 +655,7 @@ > String attribute = getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, (String)null); > launch.setAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING, attribute); > >- if (monitor == null) { >- monitor= new NullProgressMonitor(); >- } >+ > // perform initial pre-launch sanity checks > if (delegate2 != null) { > if (!(delegate2.preLaunchCheck(this, mode, monitor))) { >Index: core/org/eclipse/debug/core/ILaunchDelegateProxy.java >=================================================================== >RCS file: core/org/eclipse/debug/core/ILaunchDelegateProxy.java >diff -N core/org/eclipse/debug/core/ILaunchDelegateProxy.java >--- core/org/eclipse/debug/core/ILaunchDelegateProxy.java 20 Oct 2006 21:57:17 -0000 1.1 >+++ /dev/null 1 Jan 1970 00:00:00 -0000 >@@ -1,79 +0,0 @@ >-/******************************************************************************* >- * Copyright (c) 2006 IBM Corporation and others. >- * All rights reserved. This program and the accompanying materials >- * are made available under the terms of the Eclipse Public License v1.0 >- * which accompanies this distribution, and is available at >- * http://www.eclipse.org/legal/epl-v10.html >- * >- * Contributors: >- * IBM Corporation - initial API and implementation >- *******************************************************************************/ >-package org.eclipse.debug.core; >- >-import java.util.Set; >- >-import org.eclipse.core.runtime.CoreException; >-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; >- >-/** >- * A proxy to a launch configuration delegate. Represents a >- * launch delegate contributed to the <code>org.eclipse.debug.core.launchDelegates</code> >- * extension point. >- * >- * @since 3.3 >- * <p> >- * <strong>EXPERIMENTAL</strong>. This interface has been added as >- * part of a work in progress. There is no guarantee that this API will >- * remain unchanged during the 3.3 release cycle. Please do not use this API >- * without consulting with the Platform/Debug team. >- * </p> >- */ >-public interface ILaunchDelegateProxy { >- >- /** >- * Returns this delegate's unique identifier. >- * >- * @return launch delegate identifier >- */ >- public String getId(); >- >- /** >- * Returns a human readable name for this launch delegate >- * or <code>null</code> if none. >- * >- * @return name or <code>null</code> >- */ >- public String getName(); >- >- /** >- * Returns the name of the plug-in that contributed this delegate. >- * >- * @return contributor name >- */ >- public String getContributorName(); >- >- /** >- * Returns the delegate that performs the actual launch. >- * Causes the delegate to be instantiated. >- * >- * @return launch delegate >- * @exception CoreException if unable to instantiate the delegate >- */ >- public ILaunchConfigurationDelegate getDelegate() throws CoreException; >- >- /** >- * Returns the launch modes this delegate supports. >- * >- * @return launch modes as a set of launch mode identifiers >- */ >- public Set getModes(); >- >- /** >- * Returns the launch modes this delegate supports in combination with >- * its modes specified by <code>getModes()</code>. >- * >- * @return launch options as a set of launch mode identifiers >- */ >- public Set getOptions(); >- >-} >Index: core/org/eclipse/debug/core/ILaunchConfigurationType.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java,v >retrieving revision 1.29 >diff -u -r1.29 ILaunchConfigurationType.java >--- core/org/eclipse/debug/core/ILaunchConfigurationType.java 20 Oct 2006 21:57:17 -0000 1.29 >+++ core/org/eclipse/debug/core/ILaunchConfigurationType.java 24 Oct 2006 18:18:52 -0000 >@@ -148,22 +148,30 @@ > * without consulting with the Platform/Debug team. > * </p> > */ >- public ILaunchDelegateProxy[] getDelegates(Set modes) throws CoreException; >+ public ILaunchDelegate[] getDelegates(Set modes) throws CoreException; > > /** >- * Returns a collection of all supported launch mode combinations for >- * this launch configuration type. >+ * Returns the preferred launch delegate for this type in the specified mode set >+ * @param modes the set of modes to support >+ * @return the preferred delegate proxy or <code>null</code> if none >+ * @throws CoreException > * >- * @return all supported launch mode combinations > * @since 3.3 >- * <p> >- * <strong>EXPERIMENTAL</strong>. This method has been added as >- * part of a work in progress. There is no guarantee that this API will >- * remain unchanged during the 3.3 release cycle. Please do not use this API >- * without consulting with the Platform/Debug team. >- * </p> >+ * >+ * EXPERIMENTAL > */ >- public Set[] getSupportedModeCombinations(); >+ public ILaunchDelegate getPreferredDelegate(Set modes) throws CoreException; >+ >+ /** >+ * Allows the preferred launch delegate to be setfor this type with the specifie set of modes >+ * @param delegate the delegate proxy to set as the default one >+ * @throws CoreException >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ public void setPreferredDelegate(Set modes, ILaunchDelegate delegate) throws CoreException; > > /** > * Returns whether this launch configuration supports the specified launch >@@ -179,7 +187,7 @@ > * without consulting with the Platform/Debug team. > * </p> > */ >- public boolean supportsModeCombination(Set modes); >+ public boolean supportsModes(Set modes); > > /** > * Returns the unique identifier for this type of launch configuration >@@ -237,12 +245,31 @@ > * Returns all of the registered supported modes for this launch configuration type. > * This method does not return null. > * >+ * <p> >+ * The returned set does not convey any mode combination capability nor does it describe how or what the type can launch, all this method does is return >+ * a set of strings of all the modes in some way associated with this type >+ * </p> >+ * > * @return the set of all supported modes > * @since 3.2 >+ * >+ * @deprecated Since 3.3 all modes are provided as sets and not individual strings. The method <code>getSupportedModeCombinations</code> >+ * should be used instead to retrive the complete listing of supported modes and their allowable combinations. > */ > public Set getSupportedModes(); > > /** >+ * Returns a <code>java.util.Set</code> of <code>java.util.Set</code>s containing all of the supported mode combinations >+ * for this type >+ * @return a set of sets of all the supported mode combinations supported by this type >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ public Set getSupportedModeCombinations(); >+ >+ /** > * Returns whether this launch configuration type is public. Public configuration > * types are available for use by the user, for example, the user can create new > * configurations based on public types through the UI. Private types are not >Index: schema/launchModes.exsd >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/schema/launchModes.exsd,v >retrieving revision 1.10 >diff -u -r1.10 launchModes.exsd >--- schema/launchModes.exsd 17 Oct 2006 20:08:37 -0000 1.10 >+++ schema/launchModes.exsd 24 Oct 2006 18:18:53 -0000 >@@ -1,120 +1,118 @@ >-<?xml version='1.0' encoding='UTF-8'?> >-<!-- Schema file written by PDE --> >-<schema targetNamespace="org.eclipse.debug.core"> >-<annotation> >- <appInfo> >- <meta.schema plugin="org.eclipse.debug.core" id="launchModes" name="Launch Modes"/> >- </appInfo> >- <documentation> >- This extension point provides a mechanism for contributing launch modes to the debug platform. The debug platform defines modes for "run", "debug", and "profile". >- </documentation> >- </annotation> >- >- <element name="extension"> >- <complexType> >- <sequence> >- <element ref="launchMode" minOccurs="0" maxOccurs="unbounded"/> >- </sequence> >- <attribute name="point" type="string" use="required"> >- <annotation> >- <documentation> >- a fully qualified identifier of the target extension point >- </documentation> >- </annotation> >- </attribute> >- </complexType> >- </element> >- >- <element name="launchMode"> >- <annotation> >- <appInfo> >- <meta.element labelAttribute="name"/> >- </appInfo> >- </annotation> >- <complexType> >- <sequence> >- </sequence> >- <attribute name="mode" type="string" use="required"> >- <annotation> >- <documentation> >- specifies a unique identifier for this launch mode. The launch modes contributed by the debug plaform are "run", "debug", and "profile". >- </documentation> >- </annotation> >- </attribute> >- <attribute name="label" type="string" use="required"> >- <annotation> >- <documentation> >- A human-readable label that describes the launch mode >- </documentation> >- <appInfo> >- <meta.attribute translatable="true"/> >- </appInfo> >- </annotation> >- </attribute> >- <attribute name="launchAsLabel" type="string"> >- <annotation> >- <documentation> >- A human-readable label to be used in a launch cascade menu. For example "Run As". This attribute was added in 3.2 to allow the label to be properly externalized. When unspecified, a default label is created via concatenation. >- </documentation> >- <appInfo> >- <meta.attribute translatable="true"/> >- </appInfo> >- </annotation> >- </attribute> >- </complexType> >- </element> >- >- <annotation> >- <appInfo> >- <meta.section type="since"/> >- </appInfo> >- <documentation> >- 3.0 >- </documentation> >- </annotation> >- >- <annotation> >- <appInfo> >- <meta.section type="examples"/> >- </appInfo> >- <documentation> >- The following is an example of a launch delegate extension point: >- >-<p> >-<pre> >- <extension point="org.eclipse.debug.core.launchModes"> >- <launchMode >- mode="profile" >- label="Profile"> >- </launchMode> >- </extension> >-</pre> >-</p> >- >-In the example above, the profile launch mode is contributed. >- </documentation> >- </annotation> >- >- <annotation> >- <appInfo> >- <meta.section type="apiInfo"/> >- </appInfo> >- <documentation> >- >- </documentation> >- </annotation> >- >- <annotation> >- <appInfo> >- <meta.section type="copyright"/> >- </appInfo> >- <documentation> >- Copyright (c) 2000, 2005 IBM Corporation and others.<br> >-All rights reserved. This program and the accompanying materials are made >-available under the terms of the Eclipse Public License v1.0 which >-accompanies this distribution, and is available at >-<a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> >- </documentation> >- </annotation> >- >-</schema> >+<?xml version='1.0' encoding='UTF-8'?> >+<!-- Schema file written by PDE --> >+<schema targetNamespace="org.eclipse.debug.core"> >+<annotation> >+ <appInfo> >+ <meta.schema plugin="org.eclipse.debug.core" id="launchModes" name="Launch Modes"/> >+ </appInfo> >+ <documentation> >+ This extension point provides a mechanism for contributing launch modes to the debug platform. The debug platform defines modes for "run", "debug", and "profile". >+ </documentation> >+ </annotation> >+ >+ <element name="extension"> >+ <complexType> >+ <sequence> >+ <element ref="launchMode" minOccurs="1" maxOccurs="unbounded"/> >+ </sequence> >+ <attribute name="point" type="string" use="required"> >+ <annotation> >+ <documentation> >+ a fully qualified identifier of the target extension point >+ </documentation> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="launchMode"> >+ <annotation> >+ <appInfo> >+ <meta.element labelAttribute="name"/> >+ </appInfo> >+ </annotation> >+ <complexType> >+ <attribute name="mode" type="string" use="required"> >+ <annotation> >+ <documentation> >+ specifies a unique identifier for this launch mode. The launch modes contributed by the debug plaform are "run", "debug", and "profile". >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="label" type="string" use="required"> >+ <annotation> >+ <documentation> >+ A human-readable label that describes the launch mode >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="launchAsLabel" type="string"> >+ <annotation> >+ <documentation> >+ A human-readable label to be used in a launch cascade menu. For example "Run As". This attribute was added in 3.2 to allow the label to be properly externalized. When unspecified, a default label is created via concatenation. >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="since"/> >+ </appInfo> >+ <documentation> >+ 3.0 >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="examples"/> >+ </appInfo> >+ <documentation> >+ The following is an example of a launch delegate extension point: >+ >+<p> >+<pre> >+ <extension point="org.eclipse.debug.core.launchModes"> >+ <launchMode >+ mode="profile" >+ label="Profile"> >+ </launchMode> >+ </extension> >+</pre> >+</p> >+ >+In the example above, the profile launch mode is contributed. >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="apiInfo"/> >+ </appInfo> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="copyright"/> >+ </appInfo> >+ <documentation> >+ Copyright (c) 2000, 2005 IBM Corporation and others.<br> >+All rights reserved. This program and the accompanying materials are made >+available under the terms of the Eclipse Public License v1.0 which >+accompanies this distribution, and is available at >+<a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> >+ </documentation> >+ </annotation> >+ >+</schema> >Index: schema/launchDelegates.exsd >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.core/schema/launchDelegates.exsd,v >retrieving revision 1.12 >diff -u -r1.12 launchDelegates.exsd >--- schema/launchDelegates.exsd 23 Oct 2006 15:12:41 -0000 1.12 >+++ schema/launchDelegates.exsd 24 Oct 2006 18:18:53 -0000 >@@ -1,185 +1,217 @@ >-<?xml version='1.0' encoding='UTF-8'?> >-<!-- Schema file written by PDE --> >-<schema targetNamespace="org.eclipse.debug.core"> >-<annotation> >- <appInfo> >- <meta.schema plugin="org.eclipse.debug.core" id="launchDelegates" name="Launch Delegates"/> >- </appInfo> >- <documentation> >- This extension point provides a mechanism for contributing a launch delegate to an existing launch configuration type for one or more launch modes. Since launch modes are extensible, it may be neccessary to contribute additional launch delegates to an existing launch configuration type. Each launch delegate is contributed for a specific launch configuration type. A launch delegate supports one or more launch modes, and specifies a delegate responsible for the implementation of launching. >- </documentation> >- </annotation> >- >- <element name="extension"> >- <complexType> >- <sequence> >- <element ref="launchDelegate" minOccurs="1" maxOccurs="unbounded"/> >- </sequence> >- <attribute name="point" type="string" use="required"> >- <annotation> >- <documentation> >- a fully qualified identifier of the target extension point >- </documentation> >- </annotation> >- </attribute> >- <attribute name="id" type="string"> >- <annotation> >- <documentation> >- an optional identifier of the extension instance >- </documentation> >- </annotation> >- </attribute> >- <attribute name="name" type="string"> >- <annotation> >- <documentation> >- an optional name of the extension instance >- </documentation> >- </annotation> >- </attribute> >- </complexType> >- </element> >- >- <element name="launchDelegate"> >- <annotation> >- <appInfo> >- <meta.element labelAttribute="name"/> >- </appInfo> >- </annotation> >- <complexType> >- <attribute name="id" type="string" use="required"> >- <annotation> >- <documentation> >- specifies a unique identifier for this launch delegate. >- </documentation> >- </annotation> >- </attribute> >- <attribute name="name" type="string"> >- <annotation> >- <documentation> >- A human readable name for this delegate. This attribute was added in the 3.3. release. >- >-<p> >-<strong>EXPERIMENTAL</strong>. This attribute has been added as >-part of a work in progress. There is no guarantee that this API will >-remain unchanged during the 3.3 release cycle. Please do not use this API >-without consulting with the Platform/Debug team. >-</p> >- </documentation> >- <appInfo> >- <meta.attribute translatable="true"/> >- </appInfo> >- </annotation> >- </attribute> >- <attribute name="delegate" type="string" use="required"> >- <annotation> >- <documentation> >- specifies the fully qualified name of the Java class that implements <code>ILaunchConfigurationDelegate</code>. >-Launch configuration instances of this delegate's type will delegate to instances of this class to perform launching. >- </documentation> >- <appInfo> >- <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.ILaunchConfigurationDelegate"/> >- </appInfo> >- </annotation> >- </attribute> >- <attribute name="modes" type="string"> >- <annotation> >- <documentation> >- A comma-separated list of the launch modes this lauch delegate supports. >- </documentation> >- </annotation> >- </attribute> >- <attribute name="type" type="string"> >- <annotation> >- <documentation> >- identifier of an existing launch configuration type that this launch delegate is capable of launching. >- </documentation> >- </annotation> >- </attribute> >- <attribute name="sourcePathComputerId" type="string"> >- <annotation> >- <documentation> >- The unique identifier of a sourcePathComputer extension that is used to compute a default source lookup path for launch configurations of this type. Since 3.1, this attribute cab be specified in a launchDelegate extension when unspecified in the assocaited launchConfigurationType extension. Only one source path computer can be specified per launch configuration type. >- </documentation> >- </annotation> >- </attribute> >- <attribute name="sourceLocatorId" type="string"> >- <annotation> >- <documentation> >- The unique identifier of a sourceLocator extension that is used to create the source locator for sessions launched using launch configurations of this type. Since 3.1, this attribute can be specified in a launchDelegate extension when unspecified in the assocaited launchConfigurationType extension. Only one source locater can be specified per launch configuration type. >- </documentation> >- </annotation> >- </attribute> >- <attribute name="options" type="string"> >- <annotation> >- <documentation> >- A comma-separated list of launch modes this launch delegate supports in combination with its supported modes. This attribute was added in the 3.3 release to allow configurations to be launched in a mixed mode. >- >-<p> >-<strong>EXPERIMENTAL</strong>. This attribute has been added as >-part of a work in progress. There is no guarantee that this API will >-remain unchanged during the 3.3 release cycle. Please do not use this API >-without consulting with the Platform/Debug team. >-</p> >- </documentation> >- </annotation> >- </attribute> >- </complexType> >- </element> >- >- <annotation> >- <appInfo> >- <meta.section type="since"/> >- </appInfo> >- <documentation> >- 3.0 >- </documentation> >- </annotation> >- >- <annotation> >- <appInfo> >- <meta.section type="examples"/> >- </appInfo> >- <documentation> >- The following is an example of a launch delegate extension point: >- >-<p> >-<pre> >- <extension point="org.eclipse.debug.core.launchDelegates"> >- <launchDelegate >- id="com.example.ExampleProfileDelegate" >- delegate="com.example.ExampleProfileDelegate" >- type="org.eclipse.jdt.launching.localJavaApplication" >- modes="profile" >- options"run, debug"> >- </launchDelegate> >- </extension> >-</pre> >-</p> >- >-In the example above, the specified launch delegate is contributed to launch Java applications in profile mode. The delegate supports mixed mode launching. The delegate supports profiling when launching in run or debug mode. >- </documentation> >- </annotation> >- >- <annotation> >- <appInfo> >- <meta.section type="apiInfo"/> >- </appInfo> >- <documentation> >- Value of the attribute <b>delegate</b> must be a fully qualified name of a Java class that implements the interface <b>org.eclipse.debug.core.model.ILaunchConfigurationDelegate</b>. >- </documentation> >- </annotation> >- >- <annotation> >- <appInfo> >- <meta.section type="copyright"/> >- </appInfo> >- <documentation> >- Copyright (c) 2000, 2005 IBM Corporation and others.<br> >-All rights reserved. This program and the accompanying materials are made >-available under the terms of the Eclipse Public License v1.0 which >-accompanies this distribution, and is available at >-<a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> >- </documentation> >- </annotation> >- >-</schema> >+<?xml version='1.0' encoding='UTF-8'?> >+<!-- Schema file written by PDE --> >+<schema targetNamespace="org.eclipse.debug.core"> >+<annotation> >+ <appInfo> >+ <meta.schema plugin="org.eclipse.debug.core" id="launchDelegates" name="Launch Delegates"/> >+ </appInfo> >+ <documentation> >+ This extension point provides a mechanism for contributing a launch delegate to an existing launch configuration type for one or more launch modes. Since launch modes are extensible, it may be neccessary to contribute additional launch delegates to an existing launch configuration type. Each launch delegate is contributed for a specific launch configuration type. A launch delegate supports one or more launch modes, and specifies a delegate responsible for the implementation of launching. >+ </documentation> >+ </annotation> >+ >+ <element name="extension"> >+ <complexType> >+ <sequence> >+ <element ref="launchDelegate" minOccurs="1" maxOccurs="unbounded"/> >+ </sequence> >+ <attribute name="point" type="string" use="required"> >+ <annotation> >+ <documentation> >+ a fully qualified identifier of the target extension point >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="id" type="string"> >+ <annotation> >+ <documentation> >+ an optional identifier of the extension instance >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string"> >+ <annotation> >+ <documentation> >+ an optional name of the extension instance >+ </documentation> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="launchDelegate"> >+ <annotation> >+ <appInfo> >+ <meta.element labelAttribute="name"/> >+ </appInfo> >+ </annotation> >+ <complexType> >+ <sequence minOccurs="0" maxOccurs="unbounded"> >+ <element ref="modeCombination" minOccurs="1" maxOccurs="unbounded"/> >+ </sequence> >+ <attribute name="id" type="string" use="required"> >+ <annotation> >+ <documentation> >+ specifies a unique identifier for this launch delegate. >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string"> >+ <annotation> >+ <documentation> >+ A human readable name for this delegate. This attribute was added in the 3.3. release. >+ >+<p> >+<strong>EXPERIMENTAL</strong>. This attribute has been added as >+part of a work in progress. There is no guarantee that this API will >+remain unchanged during the 3.3 release cycle. Please do not use this API >+without consulting with the Platform/Debug team. >+</p> >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="delegate" type="string" use="required"> >+ <annotation> >+ <documentation> >+ specifies the fully qualified name of the Java class that implements <code>ILaunchConfigurationDelegate</code>. >+Launch configuration instances of this delegate's type will delegate to instances of this class to perform launching. >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="java" basedOn="org.eclipse.debug.core.model.ILaunchConfigurationDelegate"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="modes" type="string"> >+ <annotation> >+ <documentation> >+ A comma-separated list of the launch modes this delegate supports. >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="type" type="string"> >+ <annotation> >+ <documentation> >+ identifier of an existing launch configuration type that this launch delegate is capable of launching. >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="sourcePathComputerId" type="string"> >+ <annotation> >+ <documentation> >+ The unique identifier of a sourcePathComputer extension that is used to compute a default source lookup path for launch configurations of this type. Since 3.1, this attribute cab be specified in a launchDelegate extension when unspecified in the assocaited launchConfigurationType extension. Only one source path computer can be specified per launch configuration type. >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="sourceLocatorId" type="string"> >+ <annotation> >+ <documentation> >+ The unique identifier of a sourceLocator extension that is used to create the source locator for sessions launched using launch configurations of this type. Since 3.1, this attribute can be specified in a launchDelegate extension when unspecified in the assocaited launchConfigurationType extension. Only one source locater can be specified per launch configuration type. >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="options" type="string"> >+ <annotation> >+ <documentation> >+ A comma-separated list of launch modes this launch delegate supports in combination with its supported modes. This attribute was added in the 3.3 release to allow configurations to be launched in a mixed mode. >+ >+<p> >+<strong>EXPERIMENTAL</strong>. This attribute has been added as >+part of a work in progress. There is no guarantee that this API will >+remain unchanged during the 3.3 release cycle. Please do not use this API >+without consulting with the Platform/Debug team. >+</p> >+ </documentation> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="modeCombination"> >+ <annotation> >+ <documentation> >+ This element represents a collection of mode combinations that this delegate can launch. Each entry of a modeCombination is a comma seperated listing of a single combination of modes the delegate supports. >+ >+For example, a delegate that supports debugging, profiling and code coverage might have a modeCombination of: >+ >+[debug, profile, coverage] >+ >+since 3.3 >+ >+EXPERIMENTAL >+ </documentation> >+ </annotation> >+ <complexType> >+ <attribute name="modes" type="string" use="required"> >+ <annotation> >+ <documentation> >+ the modes attribute represents a comma seperated listing of a combination of modes that the associated delegate can launch >+ >+since 3.3 >+ >+EXPERIMENTAL >+ </documentation> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="since"/> >+ </appInfo> >+ <documentation> >+ 3.0 >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="examples"/> >+ </appInfo> >+ <documentation> >+ The following is an example of a launch delegate extension point: >+ >+<p> >+<pre> >+ <extension point="org.eclipse.debug.core.launchDelegates"> >+ <launchDelegate >+ id="com.example.ExampleProfileDelegate" >+ delegate="com.example.ExampleProfileDelegate" >+ type="org.eclipse.jdt.launching.localJavaApplication"> >+ </launchDelegate> >+ <modeCombination modes="run, profile"></modeCombination> >+ <modeCombination modes="debug, profile, coverage"></modeCombination> >+ </extension> >+</pre> >+</p> >+ >+In the example above, the specified launch delegate is contributed to launch Java applications in profile mode. The delegate supports mixed mode launching. The delegate supports profiling when launching in run or debug mode, with code coverage in debug mode only. >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="apiInfo"/> >+ </appInfo> >+ <documentation> >+ Value of the attribute <b>delegate</b> must be a fully qualified name of a Java class that implements the interface <b>org.eclipse.debug.core.model.ILaunchConfigurationDelegate</b>. >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="copyright"/> >+ </appInfo> >+ <documentation> >+ Copyright (c) 2000, 2005 IBM Corporation and others.<br> >+All rights reserved. This program and the accompanying materials are made >+available under the terms of the Eclipse Public License v1.0 which >+accompanies this distribution, and is available at >+<a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> >+ </documentation> >+ </annotation> >+ >+</schema> >Index: core/org/eclipse/debug/core/ILaunchDelegate.java >=================================================================== >RCS file: core/org/eclipse/debug/core/ILaunchDelegate.java >diff -N core/org/eclipse/debug/core/ILaunchDelegate.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ core/org/eclipse/debug/core/ILaunchDelegate.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,72 @@ >+/******************************************************************************* >+ * Copyright (c) 2006 IBM Corporation and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * IBM Corporation - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.debug.core; >+ >+import java.util.List; >+ >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; >+ >+/** >+ * A proxy to a launch configuration delegate. Represents a >+ * launch delegate contributed to the <code>org.eclipse.debug.core.launchDelegates</code> >+ * extension point. >+ * >+ * @since 3.3 >+ * <p> >+ * <strong>EXPERIMENTAL</strong>. This interface has been added as >+ * part of a work in progress. There is no guarantee that this API will >+ * remain unchanged during the 3.3 release cycle. Please do not use this API >+ * without consulting with the Platform/Debug team. >+ * </p> >+ */ >+public interface ILaunchDelegate { >+ >+ /** >+ * Returns this delegate's unique identifier. >+ * >+ * @return launch delegate identifier >+ */ >+ public String getId(); >+ >+ /** >+ * Returns a human readable name for this launch delegate >+ * or <code>null</code> if none. >+ * >+ * @return name or <code>null</code> >+ */ >+ public String getName(); >+ >+ /** >+ * Returns the name of the plug-in that contributed this delegate. >+ * >+ * @return contributor name >+ */ >+ public String getContributorName(); >+ >+ /** >+ * Returns the delegate that performs the actual launch. >+ * Causes the delegate to be instantiated. >+ * >+ * @return launch delegate >+ * @exception CoreException if unable to instantiate the delegate >+ */ >+ public ILaunchConfigurationDelegate getDelegate() throws CoreException; >+ >+ /** >+ * Returns the complete set of launch modes as a list of sets. >+ * If no modes are available an empty list is returned, never <code>null</code> >+ * @return the complete set of launch modes for this delegate as a list >+ * of sets >+ */ >+ public List getModes(); >+ >+} >#P org.eclipse.debug.ui >Index: ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.java,v >retrieving revision 1.20 >diff -u -r1.20 DebugPreferencesMessages.java >--- ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.java 14 Aug 2006 16:35:13 -0000 1.20 >+++ ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.java 24 Oct 2006 18:18:57 -0000 >@@ -49,6 +49,10 @@ > public static String DebugPreferencePage_26; > public static String DebugPreferencePage_27; > >+ public static String LaunchDelegatesPreferencePage_0; >+ >+ public static String LaunchDelegatesPreferencePage_1; >+ > public static String LaunchingPreferencePage_1; > public static String LaunchingPreferencePage_2; > public static String LaunchingPreferencePage_3; >Index: ui/org/eclipse/debug/internal/ui/preferences/PerspectivePreferencePage.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/PerspectivePreferencePage.java,v >retrieving revision 1.14 >diff -u -r1.14 PerspectivePreferencePage.java >--- ui/org/eclipse/debug/internal/ui/preferences/PerspectivePreferencePage.java 20 Oct 2006 21:39:45 -0000 1.14 >+++ ui/org/eclipse/debug/internal/ui/preferences/PerspectivePreferencePage.java 24 Oct 2006 18:18:57 -0000 >@@ -13,7 +13,6 @@ > > import java.io.IOException; > import java.io.StringReader; >-import com.ibm.icu.text.MessageFormat; > import java.util.ArrayList; > import java.util.HashMap; > import java.util.Iterator; >@@ -47,6 +46,7 @@ > import org.eclipse.swt.events.SelectionAdapter; > import org.eclipse.swt.events.SelectionEvent; > import org.eclipse.swt.graphics.Font; >+import org.eclipse.swt.graphics.Point; > import org.eclipse.swt.layout.GridData; > import org.eclipse.swt.layout.GridLayout; > import org.eclipse.swt.widgets.Combo; >@@ -71,6 +71,8 @@ > import org.xml.sax.SAXException; > import org.xml.sax.helpers.DefaultHandler; > >+import com.ibm.icu.text.MessageFormat; >+ > /** > * Provides one place to set perspective preferences > * >@@ -254,32 +256,32 @@ > HashMap map = (HashMap) fTypeInformationMapping.get(typeobj); > if(map == null) { > map = new HashMap(); >- }//end if >+ } > map.put(mode, (perspective != null ? perspective : IDebugUIConstants.PERSPECTIVE_NONE)); > fTypeInformationMapping.put(typeobj, map); >- }//end if >- }// end if >- }// end if >- }// end for >- }// end try >+ } >+ } >+ } >+ } >+ } > catch (ParserConfigurationException e) {DebugUIPlugin.log(e);} > catch (SAXException e) {DebugUIPlugin.log(e);} > catch (IOException e) {DebugUIPlugin.log(e);} >- }// end if >+ } > perspec.load(); > suspend.load(); > TreeItem item = findLastSelected(getPreferenceStore().getString(LAST_SELECTED_CONFIGTYPE)); > if (item != null) { > fTree.setSelection(new TreeItem[] { item }); >- }// end if >+ } > else { > if(fTree.getItemCount() > 0) { > fTree.setSelection(new TreeItem[] { fTree.getItem(0) }); > } >- }// end else >+ } > fCurrentType = (ILaunchConfigurationType) ((IStructuredSelection) fViewer.getSelection()).getFirstElement(); > buildComboBoxes(fCurrentType); >- }// restoreState >+ } > > /** > * Sets the default perspectives for the modes of an ILaunchConfiguration >@@ -373,9 +375,18 @@ > } > } > } >- fPerspectiveComp.layout(); >+ fPerspectiveComp.layout(new Control[] {fComboPlaceHolder}); >+ resizeShell(); > } > >+ private void resizeShell() { >+ Point pnt = this.getShell().getSize(); >+ Point p = this.getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT); >+ if(pnt.x < p.x) { >+ this.getShell().setSize(p); >+ } >+ } >+ > /** > * Handles the change in selection from the launch configuration listing > * >Index: ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.properties >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.properties,v >retrieving revision 1.91 >diff -u -r1.91 DebugPreferencesMessages.properties >--- ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.properties 14 Aug 2006 16:35:13 -0000 1.91 >+++ ui/org/eclipse/debug/internal/ui/preferences/DebugPreferencesMessages.properties 24 Oct 2006 18:18:57 -0000 >@@ -123,3 +123,5 @@ > LaunchConfigurationsPreferencePage_1=Launch Configurations > LaunchConfigurationsPreferencePage_2=Delete configurations when associated project is deleted > LaunchConfigurationsPreferencePage_3=Apply window &working set(s) >+LaunchDelegatesPreferencePage_0=Launch Delegates >+LaunchDelegatesPreferencePage_1=The settings on this page are used to select a preferred launch delegate in the event there are duplicates. >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchModesDialog.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchModesDialog.java,v >retrieving revision 1.2 >diff -u -r1.2 SelectLaunchModesDialog.java >--- ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchModesDialog.java 20 Oct 2006 21:57:05 -0000 1.2 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchModesDialog.java 24 Oct 2006 18:18:57 -0000 >@@ -12,6 +12,7 @@ > > import java.util.ArrayList; > import java.util.Arrays; >+import java.util.Iterator; > import java.util.List; > import java.util.Set; > >@@ -68,29 +69,32 @@ > public void removeListener(ILabelProviderListener listener) {} > } > >- private static final String SETTINGS_ID = IDebugUIConstants.PLUGIN_ID + ".SELECT_LAUNCH_OPTIONS_DIALOG"; //$NON-NLS-1$ >+ private static final String SETTINGS_ID = IDebugUIConstants.PLUGIN_ID + ".SELECT_LAUNCH_MODES_DIALOG"; //$NON-NLS-1$ > > private CheckboxTableViewer fTableViewer = null; > private Table fTable = null; >- private List fValidCombinations; >+ private List fValidModes = null; > > /** > * Constructor > * @param parentShell the parent shell >- * @param message the message for the dialog >- * @param options the listing of arrays of options (each entry in the list must be an <code>Set</code> of options) >+ * @param mode the current mode context >+ * @param configuration the current launch configuration context >+ * >+ * @throws CoreException > */ > public SelectLaunchModesDialog(Shell parentShell, String mode, ILaunchConfiguration configuration) throws CoreException { > super(parentShell); > super.setMessage(LaunchConfigurationsMessages.SelectLaunchOptionsDialog_2); > super.setTitle(LaunchConfigurationsMessages.SelectLaunchOptionsDialog_3); > setShellStyle(getShellStyle() | SWT.RESIZE); >- Set[] combinations = configuration.getType().getSupportedModeCombinations(); >- fValidCombinations = new ArrayList(); >- for (int i = 0; i < combinations.length; i++) { >- Set set = combinations[i]; >- if (set.contains(mode)) { >- fValidCombinations.add(set); >+ fValidModes = new ArrayList(); >+ Set modes = configuration.getType().getSupportedModeCombinations(); >+ Set modeset = null; >+ for(Iterator iter = modes.iterator(); iter.hasNext();) { >+ modeset = (Set) iter.next(); >+ if(modeset.contains(mode)) { >+ fValidModes.add(modeset); > } > } > } >@@ -107,7 +111,7 @@ > fTableViewer = new CheckboxTableViewer(fTable); > fTableViewer.setLabelProvider(new OptionsLabelProvider()); > fTableViewer.setContentProvider(new ArrayContentProvider()); >- fTableViewer.setInput(fValidCombinations.toArray()); >+ fTableViewer.setInput(fValidModes.toArray()); > fTableViewer.addCheckStateListener(new ICheckStateListener() { > public void checkStateChanged(CheckStateChangedEvent event) { > fTableViewer.setAllChecked(false); >@@ -115,7 +119,7 @@ > } > }); > Dialog.applyDialogFont(comp); >- PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IDebugHelpContextIds.SELECT_LAUNCH_OPTIONS_DIALOG); >+ PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IDebugHelpContextIds.SELECT_LAUNCH_MODES_DIALOG); > return comp; > } > >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties,v >retrieving revision 1.158 >diff -u -r1.158 LaunchConfigurationsMessages.properties >--- ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties 20 Oct 2006 21:57:05 -0000 1.158 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties 24 Oct 2006 18:18:57 -0000 >@@ -56,6 +56,8 @@ > LaunchConfigurationTabGroupViewer_9=The file associated with this launch configuration is read-only and cannot be modified.\n > LaunchConfigurationTabGroupViewer_13=Select a supported <a>launch mode</a>. > LaunchConfigurationTabGroupViewer_14=Mixed launch mode not supported: {0} >+LaunchConfigurationTabGroupViewer_15=Select a preferred <a>launch delegate</a>. >+LaunchConfigurationTabGroupViewer_16=There are duplicate launch delegates for mixed mode: {0} > > LaunchConfigurationDialog_Create__manage__and_run_launch_configurations_8=Create, manage, and run configurations > LaunchConfigurationDialog_Dele_te_14=De&lete >@@ -172,3 +174,6 @@ > SelectLaunchOptionsDialog_2=A plug-in that once provided the ability to launch the saved set of launch options for the current launch configuration is no longer available. As such, you must select a valid set of launch options that can be launched > SelectLaunchOptionsDialog_3=Select Launch Mode > SelectLaunchOptionsDialog_4=&Select a supported mode combination: >+SelectLaunchDelegatesDialog_0=There is more than one launch delegate capable of launching the current configuration in the current mode. Please select which launch delegate you would like to use to continue launching. >+SelectLaunchDelegatesDialog_1=Select Launch Delegate >+SelectLaunchDelegatesDialog_2=Select a &preferred launch delegate: >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationDialog.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationDialog.java,v >retrieving revision 1.177 >diff -u -r1.177 LaunchConfigurationDialog.java >--- ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationDialog.java 17 Oct 2006 20:09:19 -0000 1.177 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationDialog.java 24 Oct 2006 18:18:56 -0000 >@@ -68,7 +68,7 @@ > public void updateButtons() { > // Launch button > getTabViewer().refresh(); >- getButton(ID_LAUNCH_BUTTON).setEnabled(getTabViewer().canLaunch() & getTabViewer().canLaunchWithOptions()); >+ getButton(ID_LAUNCH_BUTTON).setEnabled(getTabViewer().canLaunch() & getTabViewer().canLaunchWithModes() & !getTabViewer().hasDuplicateDelegates()); > > } > >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java,v >retrieving revision 1.69 >diff -u -r1.69 LaunchConfigurationTabGroupViewer.java >--- ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java 20 Oct 2006 21:57:05 -0000 1.69 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java 24 Oct 2006 18:18:56 -0000 >@@ -11,6 +11,7 @@ > package org.eclipse.debug.internal.ui.launchConfigurations; > > >+import java.util.HashSet; > import java.util.List; > import java.util.Set; > >@@ -23,6 +24,7 @@ > import org.eclipse.debug.core.ILaunchConfiguration; > import org.eclipse.debug.core.ILaunchConfigurationType; > import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; >+import org.eclipse.debug.core.ILaunchDelegate; > import org.eclipse.debug.internal.ui.DebugUIPlugin; > import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; > import org.eclipse.debug.internal.ui.SWTUtil; >@@ -284,9 +286,10 @@ > > Composite blComp = SWTUtil.createComposite(mainComp, mainComp.getFont(), 2, 1, GridData.FILL_HORIZONTAL); > Composite linkComp = SWTUtil.createComposite(blComp, blComp.getFont(), 1, 1, GridData.FILL_HORIZONTAL); >-// a link for launch options >+ >+ //a link for launch options > fOptionsLink = new Link(linkComp, SWT.NONE); >- fOptionsLink.setText(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_13); >+ > fOptionsLink.setFont(linkComp.getFont()); > gd = new GridData(GridData.BEGINNING); > fOptionsLink.setLayoutData(gd); >@@ -294,23 +297,37 @@ > public void widgetSelected(SelectionEvent e) { > //collect the options available > try { >- SelectLaunchModesDialog sld = new SelectLaunchModesDialog(getShell(), >- getLaunchConfigurationDialog().getMode(), getWorkingCopy()); >- if(sld.open() == IDialogConstants.OK_ID) { >- //set the options to the config >- Object[] res = sld.getResult(); >- if(res != null) { >- Set modes = (Set) res[0]; >- modes.remove(getLaunchConfigurationDialog().getMode()); >- ILaunchConfigurationWorkingCopy wc = getWorkingCopy(); >- wc.setModes(modes); >- refresh(); >- refreshStatus(); >+ if(!canLaunchWithModes()) { >+ SelectLaunchModesDialog sld = new SelectLaunchModesDialog(getShell(), >+ getLaunchConfigurationDialog().getMode(), getWorkingCopy()); >+ if(sld.open() == IDialogConstants.OK_ID) { >+ //set the options to the config >+ Object[] res = sld.getResult(); >+ if(res != null) { >+ Set modes = (Set) res[0]; >+ modes.remove(getLaunchConfigurationDialog().getMode()); >+ ILaunchConfigurationWorkingCopy wc = getWorkingCopy(); >+ wc.setModes(modes); >+ refresh(); >+ refreshStatus(); >+ } > } > } >- } catch (CoreException ex) { >- // TODO: >- } >+ else if(hasDuplicateDelegates()) { >+ Set modes = new HashSet(); >+ modes.add(getLaunchConfigurationDialog().getMode()); >+ modes.addAll(getWorkingCopy().getModes()); >+ SelectLaunchDelegatesDialog sld = new SelectLaunchDelegatesDialog(getShell(), fTabType.getDelegates(modes)); >+ if(sld.open() == IDialogConstants.OK_ID) { >+ Object[] res = sld.getResult(); >+ if(res != null) { >+ fTabType.setPreferredDelegate(modes, (ILaunchDelegate) res[0]); >+ refresh(); >+ refreshStatus(); >+ } >+ } >+ } >+ } catch (CoreException ex) {} > } > public void widgetDefaultSelected(SelectionEvent e) {} > }); >@@ -348,17 +365,6 @@ > } > > /** >- * Shows/hides the options link on the top of the viewer >- * @param show true if the link should be visible, false otherwise >- * @since 3.3 >- * >- * EXPERIMENTAL >- */ >- protected void showOptionsLink(boolean show) { >- fOptionsLink.setVisible(show); >- } >- >- /** > * Simple method to create a spacer in the page > * > * @param composite the composite to add the spacer to >@@ -525,7 +531,6 @@ > if (fInitializingTabs) { > return; > } >- > ILaunchConfigurationTab[] tabs = getTabs(); > if (!fInitializingTabs && tabs != null) { > // update the working copy from the active tab >@@ -540,7 +545,13 @@ > item = fTabFolder.getItem(i); > setTabIcon(item, error, tabs[i]); > } >- fOptionsLink.setVisible(!canLaunchWithOptions()); >+ if(!canLaunchWithModes()) { >+ fOptionsLink.setText(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_13); >+ } >+ else if(hasDuplicateDelegates()) { >+ fOptionsLink.setText(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_15); >+ } >+ fOptionsLink.setVisible(!canLaunchWithModes() || hasDuplicateDelegates()); > } > } > >@@ -1032,7 +1043,7 @@ > * </p> > * @return > */ >- public boolean canLaunchWithOptions() { >+ public boolean canLaunchWithModes() { > if(fInitializingTabs) { > return false; > } >@@ -1042,7 +1053,7 @@ > if(wc != null) { > Set modes = wc.getModes(); > modes.add(getLaunchConfigurationDialog().getMode()); >- return wc.getType().supportsModeCombination(modes); >+ return wc.getType().supportsModes(modes); > } > } catch (CoreException e) { > } >@@ -1050,6 +1061,35 @@ > } > > /** >+ * Returns if the type currently showing in the tab group viewer has duplicate launch delegates for the given set of modes. >+ * >+ * The given set of modes comprises the current mode that the launch dialog was opened in as well as any modes that have been set on the launch >+ * configuration. >+ * @return the true if there are duplicates, false otherwise >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+ public boolean hasDuplicateDelegates() { >+ if(fInitializingTabs) { >+ return false; >+ } >+ try { >+ ILaunchConfiguration config = getWorkingCopy(); >+ if(config != null) { >+ Set modes = config.getModes(); >+ modes.add(getLaunchConfigurationDialog().getMode()); >+ if(fTabType.getDelegates(modes).length > 1) { >+ return fTabType.getPreferredDelegate(modes) == null; >+ } >+ } >+ } >+ catch(CoreException ce) {DebugUIPlugin.log(ce);} >+ return false; >+ } >+ >+ /** > * Returns the current error message or <code>null</code> if none. > */ > public String getErrorMesssage() { >@@ -1076,7 +1116,6 @@ > return message; > } > >- //EXPERIMENTAL > ILaunchConfigurationTab[] allTabs = getTabs(); > for (int i = 0; i < allTabs.length; i++) { > ILaunchConfigurationTab tab = allTabs[i]; >@@ -1098,7 +1137,8 @@ > return LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_9; > } > } >- if(!canLaunchWithOptions()) { >+ //EXPERIMENTAL >+ if(!canLaunchWithModes()) { > try { > Set modes = getWorkingCopy().getModes(); > modes.add(getLaunchConfigurationDialog().getMode()); >@@ -1108,6 +1148,15 @@ > return e.getMessage(); > } > } >+ if(hasDuplicateDelegates()) { >+ try { >+ Set modes = getWorkingCopy().getModes(); >+ modes.add(getLaunchConfigurationDialog().getMode()); >+ List names = LaunchConfigurationPresentationManager.getDefault().getLaunchModeNames(modes); >+ return MessageFormat.format(LaunchConfigurationsMessages.LaunchConfigurationTabGroupViewer_16, new String[] {names.toString()}); >+ } >+ catch (CoreException e) {DebugUIPlugin.log(e);} >+ } > return null; > } > >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateNotAvailableHandler.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateNotAvailableHandler.java,v >retrieving revision 1.1 >diff -u -r1.1 LaunchDelegateNotAvailableHandler.java >--- ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateNotAvailableHandler.java 17 Oct 2006 20:09:19 -0000 1.1 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchDelegateNotAvailableHandler.java 24 Oct 2006 18:18:57 -0000 >@@ -17,6 +17,7 @@ > import org.eclipse.debug.core.IStatusHandler; > import org.eclipse.debug.internal.ui.DebugUIPlugin; > import org.eclipse.debug.ui.DebugUITools; >+import org.eclipse.swt.widgets.Shell; > > /** > * This class provides a mechanism to prompt users in the UI thread from debug.core in the case where >@@ -35,12 +36,15 @@ > if(source instanceof Object[]) { > Object[] infos = (Object[]) source; > if(infos.length == 2) { >- ILaunchConfiguration config = (ILaunchConfiguration) infos[0]; >- String mode = (String) infos[1]; >- DebugUITools.openLaunchConfigurationEditDialog(DebugUIPlugin.getShell(), >- config, >- DebugUITools.getLaunchGroup(config, mode).getIdentifier(), >- null); >+ final ILaunchConfiguration config = (ILaunchConfiguration) infos[0]; >+ final String mode = (String) infos[1]; >+ final Shell shell = DebugUIPlugin.getShell(); >+ Runnable runnable = new Runnable() { >+ public void run() { >+ DebugUITools.openLaunchConfigurationDialog(shell, config, DebugUITools.getLaunchGroup(config, mode).getIdentifier(), null); >+ } >+ }; >+ DebugUIPlugin.getStandardDisplay().asyncExec(runnable); > } > } > return Status.OK_STATUS; >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.java,v >retrieving revision 1.40 >diff -u -r1.40 LaunchConfigurationsMessages.java >--- ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.java 20 Oct 2006 21:57:05 -0000 1.40 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.java 24 Oct 2006 18:18:57 -0000 >@@ -95,6 +95,10 @@ > > public static String LaunchConfigurationTabGroupViewer_14; > >+ public static String LaunchConfigurationTabGroupViewer_15; >+ >+ public static String LaunchConfigurationTabGroupViewer_16; >+ > public static String LaunchConfigurationTabGroupViewer_9; > public static String LaunchConfigurationTabGroupViewer_13; > public static String PerspectiveManager_Error_1; >@@ -210,6 +214,12 @@ > > public static String CollapseAllLaunchConfigurationAction_2; > >+ public static String SelectLaunchDelegatesDialog_0; >+ >+ public static String SelectLaunchDelegatesDialog_1; >+ >+ public static String SelectLaunchDelegatesDialog_2; >+ > public static String SelectLaunchOptionsDialog_2; > > public static String SelectLaunchOptionsDialog_3; >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java,v >retrieving revision 1.184 >diff -u -r1.184 LaunchConfigurationsDialog.java >--- ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java 17 Oct 2006 20:09:19 -0000 1.184 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java 24 Oct 2006 18:18:57 -0000 >@@ -526,7 +526,7 @@ > IStructuredSelection selection = (IStructuredSelection)fLaunchConfigurationView.getViewer().getSelection(); > Object target = selection.getFirstElement(); > if (target instanceof ILaunchConfiguration) { >- if (getTabViewer().canLaunch() & getTabViewer().canLaunchWithOptions()) { >+ if (getTabViewer().canLaunch() & getTabViewer().canLaunchWithModes() & !getTabViewer().hasDuplicateDelegates()) { > handleLaunchPressed(); > } > } else { >@@ -1431,7 +1431,7 @@ > getDeleteAction().setEnabled(getDeleteAction().isEnabled()); > getDuplicateAction().setEnabled(getDuplicateAction().isEnabled()); > getTabViewer().refresh(); >- getButton(ID_LAUNCH_BUTTON).setEnabled(getTabViewer().canLaunch() & getTabViewer().canLaunchWithOptions()); >+ getButton(ID_LAUNCH_BUTTON).setEnabled(getTabViewer().canLaunch() & getTabViewer().canLaunchWithModes() & !getTabViewer().hasDuplicateDelegates()); > } > > /* (non-Javadoc) >Index: plugin.properties >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/plugin.properties,v >retrieving revision 1.220 >diff -u -r1.220 plugin.properties >--- plugin.properties 17 Oct 2006 20:09:19 -0000 1.220 >+++ plugin.properties 24 Oct 2006 18:18:56 -0000 >@@ -19,6 +19,7 @@ > ConsoleFont.label= Console font > ConsoleLineTrackersExtensionName= Console Line Trackers > LaunchingPreferencePage.name=Launching >+LaunchDelegatesPreferencePage.name=Launch Delegates > ViewManagementPreferencePage.name=View Management > ConsolePreferencePage.name=Console > DebugModelContextBindingsName=Debug Model Context Bindings >Index: plugin.xml >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/plugin.xml,v >retrieving revision 1.378 >diff -u -r1.378 plugin.xml >--- plugin.xml 17 Oct 2006 20:09:19 -0000 1.378 >+++ plugin.xml 24 Oct 2006 18:18:56 -0000 >@@ -145,6 +145,15 @@ > name="%LaunchConfigurationsPage.name"> > <keywordReference id="org.eclipse.debug.ui.launchconfigurations"/> > </page> >+ <page >+ category="org.eclipse.debug.ui.LaunchingPreferencePage" >+ class="org.eclipse.debug.internal.ui.preferences.LaunchDelegatesPreferencePage" >+ id="org.eclipse.debug.ui.LaunchDelegatesPreferencePage" >+ name="%LaunchDelegatesPreferencePage.name"> >+ <keywordReference >+ id="org.eclipse.debug.ui.launchDelegatesKeywords"> >+ </keywordReference> >+ </page> > </extension> > <extension > point="org.eclipse.ui.actionSets"> >@@ -2293,6 +2302,10 @@ > <keyword > id="org.eclipse.debug.ui.launchconfigurations" > label="%preferenceKeywords.launchConfigurations"/> >+ <keyword >+ id="org.eclipse.debug.ui.launchDelegatesKeywords" >+ label="launch delegate duplicate run debug profile mode configuration"> >+ </keyword> > </extension> > <extension > point="org.eclipse.ui.importWizards"> >Index: ui/org/eclipse/debug/internal/ui/IDebugHelpContextIds.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugHelpContextIds.java,v >retrieving revision 1.58 >diff -u -r1.58 IDebugHelpContextIds.java >--- ui/org/eclipse/debug/internal/ui/IDebugHelpContextIds.java 17 Oct 2006 20:09:19 -0000 1.58 >+++ ui/org/eclipse/debug/internal/ui/IDebugHelpContextIds.java 24 Oct 2006 18:18:56 -0000 >@@ -73,6 +73,7 @@ > public static final String LAUNCHING_PREFERENCE_PAGE = PREFIX + "launching_preference_page_context"; //$NON-NLS-1$ > public static final String LAUNCH_CONFIGURATION_PREFERENCE_PAGE = PREFIX + "launch_configuration_preference_page_context"; //$NON-NLS-1$ > public static final String VIEW_MANAGEMENT_PREFERENCE_PAGE = PREFIX + "view_management_preference_page_context"; //$NON-NLS-1$ >+ public static final String LAUNCH_DELEGATES_PREFERENCE_PAGE = PREFIX + "launch_delegate_preferencef_page_context"; //$NON-NLS-1$ > > // Dialogs > public static final String LAUNCH_CONFIGURATION_DIALOG = PREFIX + "launch_configuration_dialog"; //$NON-NLS-1$ >@@ -97,7 +98,8 @@ > public static final String MAX_DETAILS_LENGTH_DIALOG = PREFIX + "max_details_length_dialog_context"; //$NON-NLS-1$ > public static final String SELECT_DEFAULT_WORKINGSET_DIALOG = PREFIX + "select_breakpoint_workingset_dialog"; //$NON-NLS-1$ > public static final String DELETE_ASSOCIATED_LAUNCH_CONFIGS_DIALOG = PREFIX + "delete_associated_launch_configs_dialog"; //$NON-NLS-1$ >- public static final String SELECT_LAUNCH_OPTIONS_DIALOG = PREFIX + "select_launch_options_dialog"; //$NON-NLS-1$ >+ public static final String SELECT_LAUNCH_MODES_DIALOG = PREFIX + "select_launch_modes_dialog"; //$NON-NLS-1$ >+ public static final String SELECT_LAUNCH_DELEGATES_DIALOG = PREFIX + "select_launch_delegates_dialog"; //$NON-NLS-1$ > > // Property pages > public static final String PROCESS_PROPERTY_PAGE = PREFIX + "process_property_page_context"; //$NON-NLS-1$ >Index: ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchDelegatesDialog.java >=================================================================== >RCS file: ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchDelegatesDialog.java >diff -N ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchDelegatesDialog.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchDelegatesDialog.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,143 @@ >+package org.eclipse.debug.internal.ui.launchConfigurations; >+ >+import java.util.Arrays; >+ >+import org.eclipse.debug.core.ILaunchDelegate; >+import org.eclipse.debug.internal.ui.DebugUIPlugin; >+import org.eclipse.debug.internal.ui.IDebugHelpContextIds; >+import org.eclipse.debug.internal.ui.SWTUtil; >+import org.eclipse.debug.ui.IDebugUIConstants; >+import org.eclipse.jface.dialogs.Dialog; >+import org.eclipse.jface.dialogs.IDialogSettings; >+import org.eclipse.jface.viewers.ArrayContentProvider; >+import org.eclipse.jface.viewers.CheckStateChangedEvent; >+import org.eclipse.jface.viewers.CheckboxTableViewer; >+import org.eclipse.jface.viewers.ICheckStateListener; >+import org.eclipse.jface.viewers.ILabelProvider; >+import org.eclipse.jface.viewers.ILabelProviderListener; >+import org.eclipse.swt.SWT; >+import org.eclipse.swt.graphics.Image; >+import org.eclipse.swt.graphics.Point; >+import org.eclipse.swt.layout.GridData; >+import org.eclipse.swt.widgets.Composite; >+import org.eclipse.swt.widgets.Control; >+import org.eclipse.swt.widgets.Shell; >+import org.eclipse.swt.widgets.Table; >+import org.eclipse.ui.PlatformUI; >+import org.eclipse.ui.dialogs.SelectionDialog; >+ >+import com.ibm.icu.text.MessageFormat; >+ >+public class SelectLaunchDelegatesDialog extends SelectionDialog { >+ >+ /** >+ * Builds labels for list control >+ */ >+ class DelegatesLabelProvider implements ILabelProvider { >+ public Image getImage(Object element) {return null;} >+ public String getText(Object element) { >+ if(element instanceof ILaunchDelegate) { >+ ILaunchDelegate ldp = (ILaunchDelegate) element; >+ String name = ldp.getName(); >+ if(name == null) { >+ name = ldp.getContributorName(); >+ } >+ return name; >+ } >+ return element.toString(); >+ } >+ public void addListener(ILabelProviderListener listener) {} >+ public void dispose() {} >+ public boolean isLabelProperty(Object element, String property) {return false;} >+ public void removeListener(ILabelProviderListener listener) {} >+ } >+ >+ private static final String SETTINGS_ID = IDebugUIConstants.PLUGIN_ID + ".SELECT_LAUNCH_DELEGATES_DIALOG"; //$NON-NLS-1$ >+ >+ private CheckboxTableViewer fTableViewer = null; >+ private Table fTable = null; >+ private ILaunchDelegate[] fDelegates = null; >+ >+ /** >+ * Constructor >+ * @param parentShell the parent shell >+ * @param delegates the current delegates context >+ * >+ * @throws CoreException >+ */ >+ public SelectLaunchDelegatesDialog(Shell parentShell, ILaunchDelegate[] delegates) { >+ super(parentShell); >+ super.setMessage(MessageFormat.format(LaunchConfigurationsMessages.SelectLaunchDelegatesDialog_0, new String[] {})); >+ super.setTitle(LaunchConfigurationsMessages.SelectLaunchDelegatesDialog_1); >+ setShellStyle(getShellStyle() | SWT.RESIZE); >+ fDelegates = delegates; >+ } >+ >+ /** >+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) >+ */ >+ protected Control createDialogArea(Composite parent) { >+ initializeDialogUnits(parent); >+ Composite comp = (Composite) super.createDialogArea(parent); >+ SWTUtil.createLabel(comp, LaunchConfigurationsMessages.SelectLaunchDelegatesDialog_2, 1); >+ fTable = new Table(comp, SWT.BORDER | SWT.SINGLE | SWT.CHECK); >+ fTable.setLayoutData(new GridData(GridData.FILL_BOTH)); >+ fTableViewer = new CheckboxTableViewer(fTable); >+ fTableViewer.setLabelProvider(new DelegatesLabelProvider()); >+ fTableViewer.setContentProvider(new ArrayContentProvider()); >+ fTableViewer.setInput(fDelegates); >+ fTableViewer.addCheckStateListener(new ICheckStateListener() { >+ public void checkStateChanged(CheckStateChangedEvent event) { >+ fTableViewer.setAllChecked(false); >+ fTableViewer.setChecked(event.getElement(), true); >+ } >+ }); >+ Dialog.applyDialogFont(comp); >+ PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IDebugHelpContextIds.SELECT_LAUNCH_DELEGATES_DIALOG); >+ return comp; >+ } >+ >+ /** >+ * @see org.eclipse.jface.dialogs.Dialog#okPressed() >+ */ >+ protected void okPressed() { >+ Object[] o = fTableViewer.getCheckedElements(); >+ if(o.length > 0) { >+ setResult(Arrays.asList(o)); >+ } >+ super.okPressed(); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.dialogs.SelectionDialog#getDialogBoundsSettings() >+ */ >+ protected IDialogSettings getDialogBoundsSettings() { >+ IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings(); >+ IDialogSettings section = settings.getSection(SETTINGS_ID); >+ if (section == null) { >+ section = settings.addNewSection(SETTINGS_ID); >+ } >+ return section; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.dialogs.Dialog#getInitialSize() >+ */ >+ protected Point getInitialSize() { >+ IDialogSettings settings = getDialogBoundsSettings(); >+ if(settings != null) { >+ try { >+ int width = settings.getInt("DIALOG_WIDTH"); //$NON-NLS-1$ >+ int height = settings.getInt("DIALOG_HEIGHT"); //$NON-NLS-1$ >+ if(width > 0 & height > 0) { >+ return new Point(width, height); >+ } >+ } >+ catch (NumberFormatException nfe) { >+ return new Point(350, 400); >+ } >+ } >+ return new Point(350, 400); >+ } >+ >+} >Index: ui/org/eclipse/debug/internal/ui/preferences/LaunchDelegatesPreferencePage.java >=================================================================== >RCS file: ui/org/eclipse/debug/internal/ui/preferences/LaunchDelegatesPreferencePage.java >diff -N ui/org/eclipse/debug/internal/ui/preferences/LaunchDelegatesPreferencePage.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ ui/org/eclipse/debug/internal/ui/preferences/LaunchDelegatesPreferencePage.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,282 @@ >+/******************************************************************************* >+ * Copyright (c) 2006 IBM Corporation and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * IBM Corporation - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.debug.internal.ui.preferences; >+ >+import java.util.HashMap; >+import java.util.HashSet; >+import java.util.Iterator; >+import java.util.Map; >+import java.util.Set; >+ >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.debug.core.DebugPlugin; >+import org.eclipse.debug.core.ILaunchConfigurationType; >+import org.eclipse.debug.core.ILaunchDelegate; >+import org.eclipse.debug.internal.core.LaunchManager; >+import org.eclipse.debug.internal.ui.DebugUIPlugin; >+import org.eclipse.debug.internal.ui.DefaultLabelProvider; >+import org.eclipse.debug.internal.ui.IDebugHelpContextIds; >+import org.eclipse.debug.internal.ui.SWTUtil; >+import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPresentationManager; >+import org.eclipse.jface.preference.PreferencePage; >+import org.eclipse.jface.viewers.ArrayContentProvider; >+import org.eclipse.jface.viewers.CheckStateChangedEvent; >+import org.eclipse.jface.viewers.CheckboxTableViewer; >+import org.eclipse.jface.viewers.ICheckStateListener; >+import org.eclipse.jface.viewers.ISelectionChangedListener; >+import org.eclipse.jface.viewers.IStructuredSelection; >+import org.eclipse.jface.viewers.ITreeContentProvider; >+import org.eclipse.jface.viewers.SelectionChangedEvent; >+import org.eclipse.jface.viewers.TreeViewer; >+import org.eclipse.jface.viewers.Viewer; >+import org.eclipse.swt.SWT; >+import org.eclipse.swt.layout.GridData; >+import org.eclipse.swt.widgets.Composite; >+import org.eclipse.swt.widgets.Control; >+import org.eclipse.swt.widgets.Table; >+import org.eclipse.swt.widgets.Tree; >+import org.eclipse.ui.IWorkbench; >+import org.eclipse.ui.IWorkbenchPreferencePage; >+import org.eclipse.ui.PlatformUI; >+import org.eclipse.ui.model.WorkbenchViewerComparator; >+ >+/** >+ * This class provides a preference page for selecting and changing preferred launch delegates for those of them >+ * that have conflicting delegates. >+ * >+ * Delegates are considered to be conflicting if they are for the same launc configuraiton type, and apply to the same >+ * mode sets. >+ * >+ * @since 3.3 >+ * >+ * EXPERIMENTAL >+ */ >+public class LaunchDelegatesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { >+ >+ class DuplicateDelegate { >+ private ILaunchConfigurationType fType = null; >+ private ILaunchDelegate[] fDelegates = null; >+ private Set fModes = null; >+ >+ public DuplicateDelegate(ILaunchConfigurationType type, ILaunchDelegate[] delegates, Set modes) { >+ fModes = modes; >+ fType = type; >+ fDelegates = delegates; >+ } >+ >+ public ILaunchConfigurationType getType() { >+ return fType; >+ } >+ public ILaunchDelegate[] getDelegates() { >+ return fDelegates; >+ } >+ public Set getModeSet() { >+ return fModes; >+ } >+ } >+ >+ /** >+ * label provider to extend the default one >+ */ >+ class LabelProvider extends DefaultLabelProvider { >+ public String getText(Object element) { >+ if(element instanceof ILaunchConfigurationType) { >+ return super.getText(element); >+ } >+ else if(element instanceof DuplicateDelegate) { >+ DuplicateDelegate dd = (DuplicateDelegate) element; >+ return LaunchConfigurationPresentationManager.getDefault().getLaunchModeNames(dd.getModeSet()).toString(); >+ } >+ else if(element instanceof ILaunchDelegate){ >+ return ((ILaunchDelegate) element).getName(); >+ } >+ return element.toString(); >+ } >+ } >+ >+ /** >+ * This class is used to provide content to the tree >+ */ >+ class TreeProvider implements ITreeContentProvider { >+ public Object[] getChildren(Object parentElement) { >+ if(parentElement instanceof ILaunchConfigurationType) { >+ ILaunchConfigurationType type = (ILaunchConfigurationType) parentElement; >+ Set dupes = (Set) fDuplicates.get(type); >+ if(dupes != null) { >+ return dupes.toArray(); >+ } >+ return null; >+ } >+ return null; >+ } >+ public boolean hasChildren(Object element) { >+ return element instanceof ILaunchConfigurationType; >+ } >+ public Object[] getElements(Object inputElement) { >+ if(inputElement instanceof Map) { >+ return ((Map)inputElement).keySet().toArray(); >+ } >+ return null; >+ } >+ public Object getParent(Object element) {return null;} >+ public void dispose() {} >+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {} >+ } >+ >+ private TreeViewer fTreeViewer = null; >+ private CheckboxTableViewer fTableViewer = null; >+ private Map fDuplicates = null; >+ private Map fDupeSelections = null; >+ private boolean fDirty = false; >+ >+ /** >+ * Constructor >+ */ >+ public LaunchDelegatesPreferencePage() { >+ setTitle(DebugPreferencesMessages.LaunchDelegatesPreferencePage_0); >+ } >+ >+ /** >+ * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite) >+ */ >+ public void createControl(Composite parent) { >+ super.createControl(parent); >+ PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCH_DELEGATES_PREFERENCE_PAGE); >+ getDefaultsButton().setEnabled(false); >+ } >+ >+ /** >+ * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) >+ */ >+ protected Control createContents(Composite parent) { >+ Composite comp = SWTUtil.createComposite(parent, parent.getFont(), 2, 1, GridData.FILL_BOTH); >+ SWTUtil.createWrapLabel(comp, DebugPreferencesMessages.LaunchDelegatesPreferencePage_1, 2, 300); >+ >+ //tree >+ Tree tree = new Tree(comp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE); >+ GridData gd = new GridData(GridData.FILL_BOTH); >+ gd.grabExcessHorizontalSpace = false; >+ tree.setLayoutData(gd); >+ fTreeViewer = new TreeViewer(tree); >+ fTreeViewer.setComparator(new WorkbenchViewerComparator()); >+ fTreeViewer.setContentProvider(new TreeProvider()); >+ fTreeViewer.setLabelProvider(new LabelProvider()); >+ fTreeViewer.setInput(fDuplicates); >+ fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { >+ public void selectionChanged(SelectionChangedEvent event) { >+ Object obj = ((IStructuredSelection) event.getSelection()).getFirstElement(); >+ if(obj instanceof DuplicateDelegate) { >+ fTableViewer.setAllChecked(false); >+ DuplicateDelegate dd = (DuplicateDelegate) obj; >+ fTableViewer.setInput(dd.getDelegates()); >+ obj = fDupeSelections.get(dd); >+ if(obj != null) { >+ fTableViewer.setChecked(obj, true); >+ } >+ } >+ else { >+ fTableViewer.setInput(null); >+ } >+ } >+ }); >+ >+ //table >+ Table table = new Table(comp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK | SWT.SINGLE); >+ gd = new GridData(GridData.FILL_BOTH); >+ table.setLayoutData(gd); >+ fTableViewer = new CheckboxTableViewer(table); >+ fTableViewer.setComparator(new WorkbenchViewerComparator()); >+ fTableViewer.setLabelProvider(new LabelProvider()); >+ fTableViewer.setContentProvider(new ArrayContentProvider()); >+ fTableViewer.addCheckStateListener(new ICheckStateListener() { >+ public void checkStateChanged(CheckStateChangedEvent event) { >+ fDirty = true; >+ Object element = event.getElement(); >+ boolean checked = event.getChecked(); >+ fTableViewer.setAllChecked(false); >+ fTableViewer.setChecked(element, checked); >+ //persist the selection >+ Object obj = ((IStructuredSelection) fTreeViewer.getSelection()).getFirstElement(); >+ if(obj instanceof DuplicateDelegate) { >+ fDupeSelections.remove(obj); >+ if(checked) { >+ fDupeSelections.put(obj, element); >+ } >+ } >+ } >+ }); >+ //make a size good enough to see it all at the onset >+ comp.setSize(400, 500); >+ >+ return comp; >+ } >+ >+ /** >+ * @see org.eclipse.jface.preference.PreferencePage#performOk() >+ */ >+ public boolean performOk() { >+ if(fDirty && fDupeSelections != null && fDupeSelections.size() > 0) { >+ fDirty = false; >+ DuplicateDelegate dd = null; >+ ILaunchDelegate delegate = null; >+ for(Iterator iter = fDupeSelections.keySet().iterator(); iter.hasNext();) { >+ dd = (DuplicateDelegate) iter.next(); >+ delegate = (ILaunchDelegate) fDupeSelections.get(dd); >+ try { >+ dd.getType().setPreferredDelegate(dd.getModeSet(), delegate); >+ } >+ catch (CoreException e) {DebugUIPlugin.log(e);} >+ } >+ } >+ return super.performOk(); >+ } >+ >+ /** >+ * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) >+ */ >+ public void init(IWorkbench workbench) { >+ //init a listing of duplicate delegates arranged by type >+ try { >+ LaunchManager lm = (LaunchManager) DebugPlugin.getDefault().getLaunchManager(); >+ ILaunchConfigurationType[] types = lm.getLaunchConfigurationTypes(); >+ fDuplicates = new HashMap(); >+ fDupeSelections = new HashMap(); >+ Set modes = null; >+ ILaunchDelegate[] delegates = null; >+ Set modeset = null; >+ Set tmp = null; >+ ILaunchDelegate prefdelegate = null; >+ DuplicateDelegate dd = null; >+ for(int i = 0; i < types.length; i++) { >+ modes = types[i].getSupportedModeCombinations(); >+ for(Iterator iter = modes.iterator(); iter.hasNext();) { >+ modeset = (Set) iter.next(); >+ delegates = types[i].getDelegates(modeset); >+ if(delegates.length > 1) { >+ tmp = (Set) fDuplicates.get(types[i]); >+ if(tmp == null) { >+ tmp = new HashSet(); >+ } >+ dd = new DuplicateDelegate(types[i], delegates, modeset); >+ tmp.add(dd); >+ fDuplicates.put(types[i], tmp); >+ prefdelegate = types[i].getPreferredDelegate(modeset); >+ if(prefdelegate != null) { >+ fDupeSelections.put(dd, prefdelegate); >+ } >+ } >+ } >+ } >+ } >+ catch(CoreException e) {DebugUIPlugin.log(e);} >+ } >+ >+} >#P org.eclipse.jdt.doc.user >Index: contexts_Debugger.xml >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.doc.user/contexts_Debugger.xml,v >retrieving revision 1.90 >diff -u -r1.90 contexts_Debugger.xml >--- contexts_Debugger.xml 17 Oct 2006 20:08:49 -0000 1.90 >+++ contexts_Debugger.xml 24 Oct 2006 18:18:59 -0000 >@@ -487,6 +487,11 @@ > <topic label="Running and Debugging" href="tasks/task-running_and_debugging.htm"/> > <topic label="Creating a Java application launch configuration" href="tasks/tasks-java-local-configuration.htm"/> > </context> >+ <context id="select_launch_delegates_dialog"> >+ <description>This dialog allows you to select a delegate to continue launching in the event there is more than one delegate available to launch a particular type in a given mode.</description> >+ <topic label="Running and Debugging" href="tasks/task-running_and_debugging.htm"/> >+ <topic label="Creating a Java application launch configuration" href="tasks/tasks-java-local-configuration.htm"/> >+ </context> > > > >@@ -728,30 +733,53 @@ > </context> > <context id="launch_history_preference_page_context" > > <description>On this page, you can modify launch history and favorites.</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="debug_action_groups_views_preference_page_context" > > <description>On this page, you can enable and disable actions associated with a debugger. When a group of actions is disabled, the actions will not appear in debug views.</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="simple_variable_preference_page_context"> > <description>One this page, you can create and configure simple launch variables which you can reference in launch configurations that support variables.</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="table_renderings_preference_page_context"> > <description>On this page, you can configure the memory loading mode in table renderings. </description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="perspective_preference_page_context"> > <description>On this page, you can configure the perspectives used when running and debugging.</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="launching_preference_page_context"> > <description>On this page, you can configure launch options.</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="launch_configuration_preference_page_context"> > <description>On this page, you can configure the filters used in the launch dialog and migrate launch configurations.</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="view_management_preference_page_context"> > <description>On this page, you can select the perspectives that debug related views will be opened in automatically.</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > <context id="resetMemoryMonitor_preference_page_context" > > <description>On this page, you can configure the reset memory monitor behavior. </description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> >+ </context> >+ <context id="launch_delegate_preferencef_page_context"> >+ <description>On this page, you can select default launch delegates in the event there are duplicates</description> >+ <topic label="Debug Preferences" href="reference/preferences/ref-debug.htm"/> >+ <topic label="Debugger Concepts" href="concepts/cdebugger.htm"/> > </context> > > <!--
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 157059
:
50306
|
50933
|
51706
|
51719
|
51935
|
51964
|
52144
|
52498
|
52620
|
53657
|
54555
|
54562
|
54584