# HG changeset patch # User timkelly # Date 1272377268 18000 # Node ID 9b50c8036532fbf3ff8a7bb87ab922e59d539545 # Parent f1114f700e653e58b9df15c01001005eac8b38d7# Parent 7c4a4568b9c5129d76f15ce8d99ccd560d29f1a3 merge commit diff -r f1114f700e65 -r 9b50c8036532 builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/BuildSettingsUI.java --- 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(); } diff -r f1114f700e65 -r 9b50c8036532 builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/BuilderPreferencePage.java --- 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); diff -r f1114f700e65 -r 9b50c8036532 builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/internal/builder/ui/CarbideCPPProjectSettingsPage.java --- 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(); diff -r f1114f700e65 -r 9b50c8036532 core/com.nokia.carbide.cpp.doc.user/html/reference/trk/wnd_new_connection_wizard.htm --- 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> diff -r f1114f700e65 -r 9b50c8036532 core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/SBSv2Utils.java --- 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; + } } diff -r f1114f700e65 -r 9b50c8036532 core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/internal/api/sdk/ui/BuildPlatformFilterPage.java --- 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); diff -r f1114f700e65 -r 9b50c8036532 debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/DebugRunProcessDialog.java --- 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); diff -r f1114f700e65 -r 9b50c8036532 debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/messages.properties --- 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. diff -r f1114f700e65 -r 9b50c8036532 project/com.nokia.carbide.cpp.project.ui/src/com/nokia/carbide/cpp/internal/project/ui/sharedui/BuilderSelectionComposite.java --- 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; }