merge commit RCL_2_4
authortimkelly
Tue, 27 Apr 2010 09:07:48 -0500
branchRCL_2_4
changeset 1292 9b50c8036532
parent 1291 f1114f700e65 (current diff)
parent 1289 7c4a4568b9c5 (diff)
child 1295 5e60bd109662
merge commit
--- a/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/BuildSettingsUI.java	Tue Apr 27 09:07:35 2010 -0500
+++ b/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/BuildSettingsUI.java	Tue Apr 27 09:07:48 2010 -0500
@@ -33,6 +33,7 @@
 
 	private Shell shell;
 	private TabFolder tabFolder;
+	private boolean wantsSBSv1;
 	private boolean wantsSBSv2;
 	private boolean projectSetting;
 	
@@ -66,8 +67,9 @@
 	private Label extraArgsLabel;
 	private Text  extraArgsText;
 
-	public BuildSettingsUI(Shell shell, boolean wantsSBSv2, boolean projectSetting) {
+	public BuildSettingsUI(Shell shell, boolean wantsSBSv1, boolean wantsSBSv2, boolean projectSetting) {
 		this.shell = shell;
+		this.wantsSBSv1 = wantsSBSv1;
 		this.wantsSBSv2 = wantsSBSv2;
 		this.projectSetting = projectSetting;
 	}
@@ -81,7 +83,7 @@
 		
 		// for project settings we show either sbsv1 or sbsv2.  for workspace prefs
 		// we potentially show both
-		if ((projectSetting && !wantsSBSv2) || !projectSetting) {
+		if (wantsSBSv1) {
 			createSBSv1TabComposite();
 		}
 		
--- a/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/BuilderPreferencePage.java	Tue Apr 27 09:07:35 2010 -0500
+++ b/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/BuilderPreferencePage.java	Tue Apr 27 09:07:48 2010 -0500
@@ -36,19 +36,22 @@
 	}
 	
 	protected Control createContents(Composite parent) {
-		buildSettingsUI = new BuildSettingsUI(parent.getShell(), SBSv2Utils.enableSBSv2Support(), false);
+		buildSettingsUI = new BuildSettingsUI(parent.getShell(), SBSv2Utils.enableSBSv1Support(), SBSv2Utils.enableSBSv2Support(), false);
 		Control control = buildSettingsUI.createControl(parent);
 		
-		buildSettingsUI.setDefaultCleanLevelv1(getCleanLevel());
 		buildSettingsUI.setBuildTestComponents(isBuildingTestComps());
-		buildSettingsUI.setManageDependencies(manageDependencies());
 		buildSettingsUI.setUseIncrementalBuilder(useIncrementalBuilder());
 		buildSettingsUI.setUseConcurrentBuilding(useConcurrentBuilding());
 		buildSettingsUI.setNumConcurrentBuildJobs(concurrentBuildJobs());
-		buildSettingsUI.setPromptForMMPChangedAction(promptForMMPChangedAction());
-		buildSettingsUI.setDefaultMMPChangedAction(defaultMMPChangedAction());
 		buildSettingsUI.setUseBuiltInEnvVars(useBuiltInX86Vars());
-		buildSettingsUI.setDontPromtTrackDeps(promtDontTrackDependencies());
+		
+		if (SBSv2Utils.enableSBSv1Support()) {
+			buildSettingsUI.setDefaultCleanLevelv1(getCleanLevel());
+			buildSettingsUI.setManageDependencies(manageDependencies());
+			buildSettingsUI.setPromptForMMPChangedAction(promptForMMPChangedAction());
+			buildSettingsUI.setDefaultMMPChangedAction(defaultMMPChangedAction());
+			buildSettingsUI.setDontPromtTrackDeps(promtDontTrackDependencies());
+		}
 		
 		if (SBSv2Utils.enableSBSv2Support()) {
 			buildSettingsUI.setDefaultCleanLevelv2(getCleanLevelv2());
@@ -76,16 +79,19 @@
 	@Override
 	protected void performApply() {
 		IPreferenceStore store = CarbideBuilderPlugin.getDefault().getPreferenceStore();
-		store.setValue(BuilderPreferenceConstants.PREF_CLEAN_LEVEL, buildSettingsUI.getDefaultCleanLevelv1());
 		store.setValue(BuilderPreferenceConstants.PREF_BUILD_TEST_COMPS, buildSettingsUI.getBuildTestComponents());
-		store.setValue(BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES, buildSettingsUI.getManageDependencies());
 		store.setValue(BuilderPreferenceConstants.PREF_USE_INCREMENTAL_BUILDER, buildSettingsUI.getUseIncrementalBuilder());
 		store.setValue(BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING, buildSettingsUI.getUseConcurrentBuilding());
 		store.setValue(BuilderPreferenceConstants.PREF_CONCURRENT_BUILD_JOBS, buildSettingsUI.getNumConcurrentBuildJobs());
-		store.setValue(BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT, buildSettingsUI.getPromptForMMPChangedAction());
-		store.setValue(BuilderPreferenceConstants.PREF_DEFAULT_MMP_CHANGED_ACTION, buildSettingsUI.getDefaultMMPChangedAction());
 		store.setValue(BuilderPreferenceConstants.PREF_USE_BUILIN_X86_VARS, buildSettingsUI.getUseBuiltInEnvVars());
-		store.setValue(BuilderPreferenceConstants.PREF_DONT_PROMPT_FOR_DEPENDENCY_MISMATCH, buildSettingsUI.getDontPromtTrackDeps()); // global setting only
+		
+		if (SBSv2Utils.enableSBSv1Support()) {
+			store.setValue(BuilderPreferenceConstants.PREF_CLEAN_LEVEL, buildSettingsUI.getDefaultCleanLevelv1());
+			store.setValue(BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES, buildSettingsUI.getManageDependencies());
+			store.setValue(BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT, buildSettingsUI.getPromptForMMPChangedAction());
+			store.setValue(BuilderPreferenceConstants.PREF_DEFAULT_MMP_CHANGED_ACTION, buildSettingsUI.getDefaultMMPChangedAction());
+			store.setValue(BuilderPreferenceConstants.PREF_DONT_PROMPT_FOR_DEPENDENCY_MISMATCH, buildSettingsUI.getDontPromtTrackDeps()); // global setting only
+		}
 		
 		if (SBSv2Utils.enableSBSv2Support()) {
 			store.setValue(BuilderPreferenceConstants.PREF_CLEAN_LEVEL_V2, buildSettingsUI.getDefaultCleanLevelv2());
@@ -98,16 +104,19 @@
 	}
 	
 	protected void performDefaults() {
-		buildSettingsUI.setDefaultCleanLevelv1(0);
 		buildSettingsUI.setBuildTestComponents(true);
-		buildSettingsUI.setManageDependencies(true);
 		buildSettingsUI.setUseIncrementalBuilder(false);
 		buildSettingsUI.setUseConcurrentBuilding(true);
 		buildSettingsUI.setNumConcurrentBuildJobs(4);
-		buildSettingsUI.setPromptForMMPChangedAction(true);
-		buildSettingsUI.setDefaultMMPChangedAction(0);
 		buildSettingsUI.setUseBuiltInEnvVars(true);
-		buildSettingsUI.setDontPromtTrackDeps(false);
+
+		if (SBSv2Utils.enableSBSv1Support()) {
+			buildSettingsUI.setDefaultCleanLevelv1(0);
+			buildSettingsUI.setManageDependencies(true);
+			buildSettingsUI.setPromptForMMPChangedAction(true);
+			buildSettingsUI.setDefaultMMPChangedAction(0);
+			buildSettingsUI.setDontPromtTrackDeps(false);
+		}
 
 		if (SBSv2Utils.enableSBSv2Support()) {
 			buildSettingsUI.setDefaultCleanLevelv2(0);
--- a/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/CarbideCPPProjectSettingsPage.java	Tue Apr 27 09:07:35 2010 -0500
+++ b/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/CarbideCPPProjectSettingsPage.java	Tue Apr 27 09:07:48 2010 -0500
@@ -154,7 +154,7 @@
 			sbsv2Project = CarbideBuilderPlugin.getBuildManager().isCarbideSBSv2Project(project);
 		}
 
-		buildSettingsUI = new BuildSettingsUI(parent.getShell(), sbsv2Project, true);
+		buildSettingsUI = new BuildSettingsUI(parent.getShell(), !sbsv2Project, sbsv2Project, true);
 		buildSettingsUI.createControl(optionsGroup);
 
 		noDefaultAndApplyButton();
--- a/core/com.nokia.carbide.cpp.doc.user/html/reference/trk/wnd_new_connection_wizard.htm	Tue Apr 27 09:07:35 2010 -0500
+++ b/core/com.nokia.carbide.cpp.doc.user/html/reference/trk/wnd_new_connection_wizard.htm	Tue Apr 27 09:07:48 2010 -0500
@@ -37,17 +37,17 @@
   </tr>
   <tr>
     <td><strong>Connection Name</strong></td>
-    <td><p>Enter a name for the connection.</p>    </td>
+    <td><p>Enter a name to identify the connection.</p>    </td>
   </tr>
   <tr>
     <td><strong>Connection Settings</strong></td>
     <td><p>Displays COM Port, Baud Rate, IP Addresss, Channel and Port settings according to the chosen connection type.</p>
-      <ul><li>Bluetooth - select which COM port to use </li>
-        <li>PlatSim - shows what IP address it will use </li>
-        <li>Serial - select which COM port and baud rate to use. </li>
-        <li>TPC IP - enter your IP address </li>
-        <li> TCP IP Musti - enter your IP address, Musti channel, Port number </li>
-        <li>USB - select which COM port to use</li>
+      <ul>
+        <li>Bluetooth - select which serial COM port to use </li>
+        <li>PlatSim - select Platsim executable and instance to use </li>
+        <li>Serial - select which serial COM port and baud rate to use. </li>
+        <li>TPC IP - enter your IP address, Musti channel, Port number </li>
+        <li>USB - select which serial COM port to use</li>
     </ul></td>
   </tr>
 </table>
--- a/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/SBSv2Utils.java	Tue Apr 27 09:07:35 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/SBSv2Utils.java	Tue Apr 27 09:07:48 2010 -0500
@@ -40,6 +40,7 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.helpers.DefaultHandler;
 
+import com.nokia.carbide.cpp.sdk.core.ISDKManager;
 import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext;
 import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
 import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
@@ -55,6 +56,7 @@
 	private static final String SBSV2_FILTERED_CONFIGS_STORE = "sbsv2FilteredConfigs"; //$NON-NLS-1$
 	private static final String SBSV2_FILTERED_CONFIGS_STORE_INITED = "sbsv2FilteredConfigsInited"; //$NON-NLS-1$
 	private static final String SBSV2_FILTERED_CONFIGS_DELIMETER = ";"; //$NON-NLS-1$
+	private static final long VALID_ABLD_SIZE = 1024;
 
 	/** Path, to and including the SBS script */ 
 	protected static IPath sbsPath; 
@@ -257,6 +259,20 @@
 	}
 
 	/**
+	 * Whether or not to display SBSv1 builder UI
+	 * @return true if SBSv1 is available, false otherwise
+	 */
+	public static boolean enableSBSv1Support() {
+		if (!enableSBSv2Support())
+			return true;
+		
+		if (isSBSv1Supported())
+			return true;
+		
+		return false;
+	}
+	
+	/**
 	 * Whether or not to display SBSv2 builder UI
 	 * @return true if SBSv2 is installed, false otherwise
 	 */
@@ -463,4 +479,17 @@
 		}
 		return newOutputDir;
 	}
+
+	private static boolean isSBSv1Supported() {
+		ISDKManager sdkMgr = SDKCorePlugin.getSDKManager();
+		for (ISymbianSDK sdk : sdkMgr.getSDKList()) {
+			File abld = new File(sdk.getEPOCROOT(), "epoc32/tools/abld.pl"); //$NON-NLS-1$
+			if (abld.exists()) {
+				long size = abld.length();
+				if (size >= VALID_ABLD_SIZE)
+					return true;
+			}
+		}
+		return false;
+	}
 }
--- a/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/BuildPlatformFilterPage.java	Tue Apr 27 09:07:35 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/BuildPlatformFilterPage.java	Tue Apr 27 09:07:48 2010 -0500
@@ -63,13 +63,15 @@
 			sbsv2TabItem.setControl(sbsv2Tab);
 		}
 		
-		TabItem sbsv1TabItem = new TabItem(tabFolder, SWT.NONE);
-		sbsv1TabItem.setText(Messages.getString("BuildPlatformFilterPage.SBSv1TabText")); //$NON-NLS-1$
-		sbsv1TabItem.setToolTipText(Messages.getString("BuildPlatformFilterPage.SBSv1TabToolTip")); //$NON-NLS-1$
-
-		sbsv1Tab = new SBSv1PlatformFilterComposite(tabFolder);
-		sbsv1Tab.createControls();
-		sbsv1TabItem.setControl(sbsv1Tab);
+		if (SBSv2Utils.enableSBSv1Support()) {
+			TabItem sbsv1TabItem = new TabItem(tabFolder, SWT.NONE);
+			sbsv1TabItem.setText(Messages.getString("BuildPlatformFilterPage.SBSv1TabText")); //$NON-NLS-1$
+			sbsv1TabItem.setToolTipText(Messages.getString("BuildPlatformFilterPage.SBSv1TabToolTip")); //$NON-NLS-1$
+	
+			sbsv1Tab = new SBSv1PlatformFilterComposite(tabFolder);
+			sbsv1Tab.createControls();
+			sbsv1TabItem.setControl(sbsv1Tab);
+		}
 
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(super.getControl(), SDKUIHelpIds.SDK_BUILD_FILTER_PAGE);
 		
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/DebugRunProcessDialog.java	Tue Apr 27 09:07:35 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/DebugRunProcessDialog.java	Tue Apr 27 09:07:48 2010 -0500
@@ -19,7 +19,10 @@
 
 import java.io.File;
 import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent;
@@ -44,6 +47,8 @@
 import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -64,8 +69,10 @@
 import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
 import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
 import com.nokia.carbide.cdt.builder.project.ISISBuilderInfo;
+import com.nokia.cdt.internal.debug.launch.LaunchPlugin;
 import com.nokia.cdt.internal.debug.launch.newwizard.LaunchWizardData.EExeSelection;
 import com.nokia.cpp.internal.api.utils.core.PathUtils;
+import com.nokia.cpp.internal.api.utils.core.TextUtils;
 import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils;
 
 /**
@@ -73,7 +80,7 @@
  */
 public class DebugRunProcessDialog extends AbstractLaunchSettingsDialog implements ICProjectDescriptionListener {
 	private ComboViewer projectExecutableViewer;
-	private Text remoteProgramEntry;
+	private ComboViewer remoteProgramViewer;
 	private Button projectExecutableRadioButton;
 	private Button remoteExecutableRadioButton;
 	private Button attachToProcessRadioButton;
@@ -85,6 +92,9 @@
 	private Button sisBrowse;
 	private Composite installPackageUI;
 	
+	private List<IPath> remotePathEntries = new ArrayList<IPath>();
+	private List<IPath> projectGeneratedRemotePaths;
+	
 	protected DebugRunProcessDialog(Shell shell, LaunchWizardData data) {
 		super(shell, data);
 	}
@@ -100,6 +110,14 @@
 				data.isDebug() ? LaunchWizardHelpIds.WIZARD_DIALOG_CHANGE_DEBUG_PROCESS : 
 					LaunchWizardHelpIds.WIZARD_DIALOG_CHANGE_RUN_PROCESS);
 
+		loadRemoteProgramEntries();
+		
+		composite.addDisposeListener(new DisposeListener() {
+			
+			public void widgetDisposed(DisposeEvent e) {
+				saveRemoteProgramEntries();
+			}
+		});
 
 		createProcessSelector(composite);
 		
@@ -115,6 +133,47 @@
 		return composite;
 	}
 
+	// pref key for paths the user has manually entered
+	final static String USER_REMOTE_PATHS = "user.remote.paths"; //$NON-NLS-1$
+
+	/**
+	 * 
+	 */
+	protected void saveRemoteProgramEntries() {
+		// in case user was typing, ensure that entry is present
+		if(remoteProgramViewer != null) {
+			IPath currentPath = PathUtils.createPath(remoteProgramViewer.getCombo().getText().trim());
+			remotePathEntries.remove(currentPath);
+			remotePathEntries.add(0, currentPath);	// MRU
+		}
+
+		// make a set, removing user dupes, and also removing the entries we added
+		Set<IPath> uniqueRemotePathEntries = new LinkedHashSet<IPath>(remotePathEntries);
+		if (projectGeneratedRemotePaths != null)
+			uniqueRemotePathEntries.removeAll(projectGeneratedRemotePaths);
+		
+		// truncate size, removing from end
+		List<IPath> mruPathEntries = new ArrayList<IPath>(uniqueRemotePathEntries);
+		while (mruPathEntries.size() > 10) {
+			mruPathEntries.remove(mruPathEntries.size() - 1);
+		}
+		
+		String pathSoup = TextUtils.catenateStrings(mruPathEntries.toArray(), "|"); //$NON-NLS-1$
+		LaunchPlugin.getDefault().getPreferenceStore().setValue(USER_REMOTE_PATHS, pathSoup);
+	}
+
+	/**
+	 * 
+	 */
+	protected void loadRemoteProgramEntries() {
+		String pathSoup = LaunchPlugin.getDefault().getPreferenceStore().getString(USER_REMOTE_PATHS);
+		if (pathSoup != null) {
+			String[] paths = pathSoup.split("\\|"); //$NON-NLS-1$
+			for (String path : paths)
+				remotePathEntries.add(PathUtils.createPath(path));
+		}
+	}
+
 
 	private void createProcessSelector(Composite composite) {
 		Label label;
@@ -179,6 +238,8 @@
 		GridDataFactory.fillDefaults().applyTo(installPackageCheckbox);
 		
 		installPackageCheckbox.setText(Messages.getString("DebugRunProcessDialog.InstallBeforeLaunchLabel")); //$NON-NLS-1$
+		installPackageCheckbox.setToolTipText(Messages.getString("DebugRunProcessDialog.SISCheckboxTooltip")); //$NON-NLS-1$
+		
 		installPackageUI = new Composite(composite, SWT.NONE);
 		GridDataFactory.fillDefaults().indent(INDENT, 0).applyTo(installPackageUI);
 		
@@ -363,21 +424,47 @@
 	protected void initUI() {
 		List<IPath> exes = data.getLaunchableExes();
 		projectExecutableViewer.setInput(exes);
+		
+		// this path may either be a project-relative or remote path
 		IPath exeSelectionPath = data.getExeSelectionPath();
 		if (exeSelectionPath.equals(Path.EMPTY) && !exes.isEmpty())
 			exeSelectionPath = exes.get(0);
+		
 		if (!Path.EMPTY.equals(exeSelectionPath)) {
+			// keep previous path if possible...
+			IPath remotePath = exeSelectionPath;
+			if (data.getExes().contains(remotePath)) {
+				// unless that was actually a host-side path, which should be converted
+				remotePath = createSuggestedRemotePath(exeSelectionPath);
+			} else {
+				// selection is already a remote path; map back to project if possible
+				IPath projPath = getHostFileForRemoteLocation(exeSelectionPath);
+				if (projPath != null) {
+					exeSelectionPath = projPath;
+				}
+				else {
+					// remote path does not correspond to anything; select some project exe so
+					// the combo isn't empty
+					exeSelectionPath = exes.get(0);
+				}
+			}
 			projectExecutableViewer.setSelection(new StructuredSelection(exeSelectionPath));
-			IPath remotePath = createSuggestedRemotePath(exeSelectionPath);
-			remoteProgramEntry.setText(PathUtils.convertPathToWindows(remotePath));
+			
+			if (remoteProgramViewer != null) {
+				if (!remotePathEntries.contains(remotePath)) {
+					remotePathEntries.add(0, remotePath);	// MRU
+					remoteProgramViewer.add(remotePath);
+				}
+				remoteProgramViewer.setSelection(new StructuredSelection(remotePath));
+			}
 		}
 		
 		if (data.getExeSelection() == EExeSelection.USE_PROJECT_EXECUTABLE && exeSelectionPath != null) {
-			projectExecutableRadioButton.forceFocus();
+			projectExecutableViewer.getControl().forceFocus();
 		}
 		
 		if (data.getExeSelection() == EExeSelection.USE_REMOTE_EXECUTABLE && exeSelectionPath != null) {
-			remoteExecutableRadioButton.forceFocus();
+			remoteProgramViewer.getControl().forceFocus();
 		}
 		
 		if (data.getExeSelection() == EExeSelection.ATTACH_TO_PROCESS) {
@@ -395,6 +482,27 @@
 		return PathUtils.createPath("C:/sys/bin").append(filename); //$NON-NLS-1$
 	}
 
+
+	/**
+	 * Get the host-side file for a given remote location.  Opposite of
+	 * {@link #createSuggestedRemotePath(IPath)}.
+	 * @param path
+	 * @return host path or <code>null</code>
+	 */
+	private IPath getHostFileForRemoteLocation(IPath path) {
+		for (IPath exe : data.getExes()) {
+			// no... we don't have any knowledge (yet) of the actual install path,
+			// so comparing the exact path will fail if the user edited it.
+			// IPath remoteSuggested = createSuggestedRemotePath(exe);
+			
+			// be pretty loose in the matching for now 
+			if (exe.lastSegment().equalsIgnoreCase(path.lastSegment())) {
+				return exe;
+			}
+		}
+		return null;
+	}
+
 	/**
 	 * Allow selecting an executable detected to be built by the program.
 	 * @param radioGroup
@@ -404,10 +512,13 @@
 		GridDataFactory.fillDefaults().grab(false, false).applyTo(projectExecutableRadioButton);
 		projectExecutableRadioButton.setText(Messages.getString("DebugRunProcessDialog.LaunchProjectExeLabel")); //$NON-NLS-1$
 		projectExecutableRadioButton.setData(UID, "radio_project_executable"); //$NON-NLS-1$
+		projectExecutableRadioButton.setToolTipText(Messages.getString("DebugRunProcessDialog.LaunchProjectExecutableRadioTooltip")); //$NON-NLS-1$
+
 		
 		projectExecutableViewer = new ComboViewer(radioGroup, SWT.READ_ONLY);
 		GridDataFactory.fillDefaults().grab(true, false).applyTo(projectExecutableViewer.getControl());
 		projectExecutableViewer.getControl().setData(UID, "combo_project_executable"); //$NON-NLS-1$
+		projectExecutableViewer.getControl().setToolTipText(Messages.getString("DebugRunProcessDialog.LaunchProjectExecutableSelectorTooltip")); //$NON-NLS-1$
 		
 		projectExecutableViewer.setContentProvider(new ArrayContentProvider());
 		projectExecutableViewer.setLabelProvider(new LabelProvider() {
@@ -432,12 +543,15 @@
 			public void selectionChanged(SelectionChangedEvent event) {
 				Object sel = ((IStructuredSelection) event.getSelection()).getFirstElement();
 				if (sel instanceof IPath) {
-					data.setExeSelectionPath((IPath) sel); 
+					if (projectExecutableRadioButton.getSelection()) {
+						data.setExeSelectionPath((IPath) sel);
+					}
 					
 					// track the default remote program from the executable, for easy editing
-					if (remoteProgramEntry != null) {
+					if (remoteProgramViewer != null && !remoteExecutableRadioButton.getSelection()) {
 						IPath exeSelectionPath = createSuggestedRemotePath(data.getExeSelectionPath());
-						remoteProgramEntry.setText(PathUtils.convertPathToWindows(exeSelectionPath)); 
+						// path should already be in model
+						remoteProgramViewer.setSelection(new StructuredSelection(exeSelectionPath)); 
 					}
 					
 					validate();
@@ -471,11 +585,33 @@
 		remoteExecutableRadioButton.setText(Messages.getString("DebugRunProcessDialog.LaunchRemoteProgLabel")); //$NON-NLS-1$
 		
 		remoteExecutableRadioButton.setData(UID, "radio_remote_program"); //$NON-NLS-1$
+		remoteExecutableRadioButton.setToolTipText(Messages.getString("DebugRunProcessDialog.LaunchRemoteProgramRadioTooltip")); //$NON-NLS-1$
 		
-		remoteProgramEntry = new Text(radioGroup, SWT.BORDER);
-		GridDataFactory.fillDefaults().grab(true, false).applyTo(remoteProgramEntry);
+		remoteProgramViewer = new ComboViewer(radioGroup, SWT.BORDER);
+		GridDataFactory.fillDefaults().grab(true, false).applyTo(remoteProgramViewer.getControl());
+		
+		projectGeneratedRemotePaths = new ArrayList<IPath>();
+		for (IPath launchable : data.getLaunchableExes()) {
+			projectGeneratedRemotePaths.add(createSuggestedRemotePath(launchable));
+		}
+		
+		// add the entries before the user MRU entries
+		remotePathEntries.addAll(0, projectGeneratedRemotePaths);
 		
-		remoteProgramEntry.setData(UID, "text_remote_program"); //$NON-NLS-1$
+		remoteProgramViewer.setContentProvider(new ArrayContentProvider());
+		remoteProgramViewer.setLabelProvider(new LabelProvider() {
+			@Override
+			public String getText(Object element) {
+				if (element instanceof IPath)
+					return PathUtils.convertPathToWindows((IPath) element);
+				return super.getText(element);
+			}
+		});
+		remoteProgramViewer.setInput(remotePathEntries);
+		remoteProgramViewer.getCombo().setVisibleItemCount(Math.min(10, remotePathEntries.size()));
+		
+		remoteProgramViewer.setData(UID, "combo_remote_program"); //$NON-NLS-1$
+		remoteProgramViewer.getControl().setToolTipText(Messages.getString("DebugRunProcessDialog.LaunchRemoteProgramSelectorTooltip")); //$NON-NLS-1$
 		
 		remoteExecutableRadioButton.addSelectionListener(new SelectionAdapter() {
 			@Override
@@ -485,23 +621,48 @@
 
 		});
 		
-		remoteProgramEntry.addModifyListener(new ModifyListener() {
+		remoteProgramViewer.getCombo().addModifyListener(new ModifyListener() {
 			public void modifyText(ModifyEvent e) {
-				data.setExeSelectionPath(new Path(remoteProgramEntry.getText().trim()));
+				IPath path = PathUtils.createPath(remoteProgramViewer.getCombo().getText().trim());
+				if (remoteExecutableRadioButton.getSelection()) {
+					data.setExeSelectionPath(path);
+				}
+				
+				if (!projectExecutableRadioButton.getSelection()) {
+					IPath projPath = getHostFileForRemoteLocation(path);
+					if (projPath != null) {
+						projectExecutableViewer.setSelection(new StructuredSelection(projPath));
+					}
+				}
+				
 				validate();
 			}
 		});
+		
+		remoteProgramViewer.getCombo().addFocusListener(new FocusAdapter() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)
+			 */
+			@Override
+			public void focusLost(FocusEvent e) {
+				IPath path = PathUtils.createPath(remoteProgramViewer.getCombo().getText().trim());
+				
+				// MRU behavior
+				remotePathEntries.remove(path);
+				remotePathEntries.add(0, path);
+			}
+		});
 	}
 
 	private void handleRemoteExecutableRadioSelected() {
 		if (remoteExecutableRadioButton.getSelection()) {
-			remoteProgramEntry.setEnabled(true);
+			remoteProgramViewer.getControl().setEnabled(true);
 			data.setExeSelection(EExeSelection.USE_REMOTE_EXECUTABLE);
-			IPath path = PathUtils.createPath(remoteProgramEntry.getText());
+			IPath path = PathUtils.createPath(remoteProgramViewer.getCombo().getText());
 			data.setExeSelectionPath(path);
 			validate();
 		} else {
-			remoteProgramEntry.setEnabled(false);
+			remoteProgramViewer.getControl().setEnabled(false);
 			// another button becomes active and sets the new launch process
 		}
 	}
@@ -516,7 +677,8 @@
 		attachToProcessRadioButton.setText(Messages.getString("DebugRunProcessDialog.AttachLabel")); //$NON-NLS-1$
 		
 		attachToProcessRadioButton.setData(UID, "radio_attach_to_process"); //$NON-NLS-1$
-		
+		attachToProcessRadioButton.setToolTipText(Messages.getString("DebugRunProcessDialog.AttachProcessRadioTooltip")); //$NON-NLS-1$
+
 		Label label = new Label(radioGroup, SWT.WRAP);
 		GridDataFactory.fillDefaults().grab(false, false).align(SWT.LEFT, SWT.CENTER).applyTo(label);
 		
--- a/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/messages.properties	Tue Apr 27 09:07:35 2010 -0500
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/messages.properties	Tue Apr 27 09:07:48 2010 -0500
@@ -16,6 +16,7 @@
 DebugRunProcessDialog.AllFilterName=All Files
 DebugRunProcessDialog.AttachAddlMsg=(selected at launch time)
 DebugRunProcessDialog.AttachLabel=&Attach to process:
+DebugRunProcessDialog.AttachProcessRadioTooltip=Attach to a running program at launch time.
 DebugRunProcessDialog.BrowseLabel=Browse...
 DebugRunProcessDialog.ChangeProcessMsg=Change {0} Process
 DebugRunProcessDialog.DebugConfigureMsg=Configure how to debug the program.  The initial settings reflect the debug capabilities of the selected device and the SIS builder settings.
@@ -24,12 +25,17 @@
 DebugRunProcessDialog.FilePathError=The executable path should end in a filename.
 DebugRunProcessDialog.InstallBeforeLaunchLabel=Install package before launch
 DebugRunProcessDialog.InstallFilterName=Installation Files
+DebugRunProcessDialog.LaunchProjectExecutableRadioTooltip=Launch a program built by the project.
+DebugRunProcessDialog.LaunchProjectExecutableSelectorTooltip=Select one of the executables built from the project.\n\nThis will be copied or installed to the device and then launched.
 DebugRunProcessDialog.LaunchProjectExeLabel=Launch project &executable:
-DebugRunProcessDialog.LaunchRemoteProgLabel=Launch &remote program:
+DebugRunProcessDialog.LaunchRemoteProgLabel=Launch program on &device:
+DebugRunProcessDialog.LaunchRemoteProgramRadioTooltip=Launch a specific program on the device.
+DebugRunProcessDialog.LaunchRemoteProgramSelectorTooltip=Select the device-side program to launch.\n\nThis is an executable installed or copied from the project or a custom path (e.g. used when debugging a DLL).
 DebugRunProcessDialog.ModeLabel={0} method:
 DebugRunProcessDialog.NoExesError=The project builds no executables.
 DebugRunProcessDialog.NoneItem=None
 DebugRunProcessDialog.RunConfigureMsg=Configure how to run the program.
+DebugRunProcessDialog.SISCheckboxTooltip=When checked, Carbide installs a SIS package for the active build configuration.\n\nWhen unchecked, Carbide copies the files built by the current project to the device.\nYou can manually edit these in the advanced settings.
 DebugRunProcessDialog.SISConfigLinkText=Modify SIS builder settings for build configuration
 DebugRunProcessDialog.SISFileExistError=The SIS file ''{0}'' does not exist.
 DebugRunProcessDialog.SISFileLabel=SIS File to Install:
@@ -46,7 +52,7 @@
 DebugRunProcessSection.NoRemoteExeError=No remote executable is selected.
 DebugRunProcessSection.Title={0} process
 LaunchWizard.AdvancedLabel=Edit advanced settings before launch
-LaunchWizard.AdvancedTip=Before finishing the wizard, edit settings in the ''{0} Configurations'' dialog.
+LaunchWizard.AdvancedTip=When finishing the wizard, edit settings in the ''{0} Configurations'' dialog before launching.
 LaunchWizard.EditLabel=Edit
 LaunchWizard.EditTip=Click to accept settings and edit advanced settings.
 LaunchWizard.FinishTip=Click to accept settings and launch the program.
--- a/project/com.nokia.carbide.cpp.project.ui/src/com/nokia/carbide/cpp/internal/project/ui/sharedui/BuilderSelectionComposite.java	Tue Apr 27 09:07:35 2010 -0500
+++ b/project/com.nokia.carbide.cpp.project.ui/src/com/nokia/carbide/cpp/internal/project/ui/sharedui/BuilderSelectionComposite.java	Tue Apr 27 09:07:48 2010 -0500
@@ -69,11 +69,16 @@
 		builderCombo.setToolTipText(Messages.getString("NewProjectPage.builderToolTip")); //$NON-NLS-1$
 		builderCombo.setLayoutData(new GridData());
 		builderCombo.setData(".uid", "builderCombo"); //$NON-NLS-1$ //$NON-NLS-2$
-		builderCombo.add(Messages.getString("NewProjectPage.sbsv1")); //$NON-NLS-1$
+		if (SBSv2Utils.enableSBSv1Support()) {
+			builderCombo.add(Messages.getString("NewProjectPage.sbsv1")); //$NON-NLS-1$
+		}
 		builderCombo.add(Messages.getString("NewProjectPage.sbsv2")); //$NON-NLS-1$
 		builderCombo.setData(".uid", "builderCombo"); //$NON-NLS-1$ //$NON-NLS-2$
 		builderCombo.select(0);
-
+		if (!SBSv2Utils.enableSBSv1Support()) {
+			// hide the whole composite if only SBSvw is enabled
+			this.setVisible(false);
+		}
     }
 
     /**
@@ -85,18 +90,32 @@
 		useSBSv2Builder = true;
 		IStatus status = null;
 		if (builderCombo != null && builderCombo.getSelectionIndex() == 1) { 
-			
-			if (SBSv2Utils.getSBSBinDirectory() == null){
-				status = new Status(Status.ERROR, ProjectUIPlugin.PLUGIN_ID, "The Symbian Build System (sbs) cannot be found on the PATH. Carbide needs a valid SBS installation on the PATH to use the SBSv2 builder."); 
+			int index = builderCombo.getSelectionIndex();
+			String selection = builderCombo.getItem(index);
+			if (selection.equals(Messages.getString("NewProjectPage.sbsv1"))) { //$NON-NLS-1$
+				if (!SBSv2Utils.enableSBSv1Support()) {
+					status = new Status(Status.ERROR, ProjectUIPlugin.PLUGIN_ID, "SBSv1 is not supported on this system.");
+				}
+				useSBSv2Builder = false;
 			}
-			// check the raptor version
-			else if (SDKCorePlugin.getSDKManager().getSBSv2Version(false).getMajor() == 0){
-				// Try to scan again....
-				if (SDKCorePlugin.getSDKManager().getSBSv2Version(true).getMajor() == 0){
-					status = new Status(Status.WARNING, ProjectUIPlugin.PLUGIN_ID, "SBS version cannot be determined, some SBS functionality may not work. Please check your SBS installation.");
+			else if (selection.equals(Messages.getString("NewProjectPage.sbsv2"))) { //$NON-NLS-1$
+				
+				// if SBSv2 is selected, make sure SBS bin directory exists
+				if (SBSv2Utils.getSBSBinDirectory() == null){
+					status = new Status(Status.ERROR, ProjectUIPlugin.PLUGIN_ID, "The Symbian Build System (sbs) cannot be found on the PATH. Carbide needs a valid SBS installation on the PATH to use the SBSv2 builder.");
 				}
+				
+				// check the raptor version
+				else if (SDKCorePlugin.getSDKManager().getSBSv2Version(false).getMajor() == 0){
+					// Try to scan again....
+					if (SDKCorePlugin.getSDKManager().getSBSv2Version(true).getMajor() == 0){
+						status = new Status(Status.WARNING, ProjectUIPlugin.PLUGIN_ID, "SBS version cannot be determined, some SBS functionality may not work. Please check your SBS installation.");
+					}
+				}
+
+			} else {
+				useSBSv2Builder = false;
 			}
-
 		} else {
 			useSBSv2Builder = false;
 		}