From 86224bcfa011835e14de644a03f26b35e02ad824 Mon Sep 17 00:00:00 2001 From: Ken Ryall Date: Tue, 9 Mar 2010 05:26:19 +0000 Subject: [PATCH] Have CAbstractMainTab share the common portions of CDI CMainTab and DSF CMainTab. --- .../gdb/internal/ui/launching/CMainTab.java | 325 +-------- .../cdt/launch/ui/CAbstractMainTab.java | 540 +++++++++++++++ .../org/eclipse/cdt/launch/ui/CMainTab.java | 622 +++--------------- 3 files changed, 645 insertions(+), 842 deletions(-) create mode 100644 launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CAbstractMainTab.java diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java index 50a8880ef30..3bb979175c9 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CMainTab.java @@ -11,16 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.launching; -import java.io.IOException; -import java.util.ArrayList; - import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.IBinaryParser; -import org.eclipse.cdt.core.ICDescriptor; -import org.eclipse.cdt.core.ICExtensionReference; -import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; -import org.eclipse.cdt.core.model.CModelException; -import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; @@ -28,6 +19,7 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; import org.eclipse.cdt.dsf.gdb.launching.LaunchMessages; +import org.eclipse.cdt.launch.ui.CAbstractMainTab; import org.eclipse.cdt.ui.CElementLabelProvider; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -43,7 +35,6 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; @@ -53,11 +44,8 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.dialogs.TwoPaneElementSelector; /** @@ -68,7 +56,7 @@ import org.eclipse.ui.dialogs.TwoPaneElementSelector; *

*/ -public class CMainTab extends CLaunchConfigurationTab { +public class CMainTab extends CAbstractMainTab { /** * Tab identifier used for ordering of tabs added using the @@ -79,41 +67,22 @@ public class CMainTab extends CLaunchConfigurationTab { */ public static final String TAB_ID = "org.eclipse.cdt.dsf.gdb.launch.mainTab"; //$NON-NLS-1$ - // Project UI widgets - protected Label fProjLabel; - protected Text fProjText; - protected Button fProjButton; - - // Main class UI widgets - protected Label fProgLabel; - protected Text fProgText; - protected Button fSearchButton; - - // Core file UI widgets - /** @since 2.0 */ - protected Label fCoreLabel; - /** @since 2.0 */ - protected Text fCoreText; - /** @since 2.0 */ - protected Button fCoreButton; - private final boolean fDontCheckProgram; private final boolean fSpecifyCoreFile; - - protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ - - private String filterPlatform = EMPTY_STRING; + private final boolean fIncludeBuildSettings; public static final int DONT_CHECK_PROGRAM = 2; public static final int SPECIFY_CORE_FILE = 4; + public static final int INCLUDE_BUILD_SETTINGS = 8; public CMainTab() { - this(0); + this(INCLUDE_BUILD_SETTINGS); } public CMainTab(int flags) { fDontCheckProgram = (flags & DONT_CHECK_PROGRAM) != 0; fSpecifyCoreFile = (flags & SPECIFY_CORE_FILE) != 0; + fIncludeBuildSettings = (flags & INCLUDE_BUILD_SETTINGS) != 0; } /* @@ -137,48 +106,13 @@ public class CMainTab extends CLaunchConfigurationTab { if (fSpecifyCoreFile) { createCoreFileGroup(comp, 1); } + if (fIncludeBuildSettings){ + createBuildOptionGroup(comp, 1); + } GdbUIPlugin.setDialogShell(parent.getShell()); } - protected void createProjectGroup(Composite parent, int colSpan) { - Composite projComp = new Composite(parent, SWT.NONE); - GridLayout projLayout = new GridLayout(); - projLayout.numColumns = 2; - projLayout.marginHeight = 0; - projLayout.marginWidth = 0; - projComp.setLayout(projLayout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = colSpan; - projComp.setLayoutData(gd); - - fProjLabel = new Label(projComp, SWT.NONE); - fProjLabel.setText(LaunchMessages.getString("CMainTab.&ProjectColon")); //$NON-NLS-1$ - gd = new GridData(); - gd.horizontalSpan = 2; - fProjLabel.setLayoutData(gd); - - fProjText = new Text(projComp, SWT.SINGLE | SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL); - fProjText.setLayoutData(gd); - fProjText.addModifyListener(new ModifyListener() { - - public void modifyText(ModifyEvent evt) { - updateLaunchConfigurationDialog(); - } - }); - - fProjButton = createPushButton(projComp, LaunchMessages.getString("Launch.common.Browse_1"), null); //$NON-NLS-1$ - fProjButton.addSelectionListener(new SelectionAdapter() { - - @Override - public void widgetSelected(SelectionEvent evt) { - handleProjectButtonSelected(); - updateLaunchConfigurationDialog(); - } - }); - } - protected void createExeFileGroup(Composite parent, int colSpan) { Composite mainComp = new Composite(parent, SWT.NONE); GridLayout mainLayout = new GridLayout(); @@ -225,45 +159,6 @@ public class CMainTab extends CLaunchConfigurationTab { } }); } - - /** @since 2.0 */ - protected void createCoreFileGroup(Composite parent, int colSpan) { - Composite coreComp = new Composite(parent, SWT.NONE); - GridLayout coreLayout = new GridLayout(); - coreLayout.numColumns = 3; - coreLayout.marginHeight = 0; - coreLayout.marginWidth = 0; - coreComp.setLayout(coreLayout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = colSpan; - coreComp.setLayoutData(gd); - fCoreLabel = new Label(coreComp, SWT.NONE); - fCoreLabel.setText(LaunchMessages.getString("CMainTab.CoreFile_path")); //$NON-NLS-1$ - gd = new GridData(); - gd.horizontalSpan = 3; - fCoreLabel.setLayoutData(gd); - fCoreText = new Text(coreComp, SWT.SINGLE | SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL); - fCoreText.setLayoutData(gd); - fCoreText.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent evt) { - updateLaunchConfigurationDialog(); - } - }); - - Button browseForCoreButton; - browseForCoreButton = createPushButton(coreComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$ - browseForCoreButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent evt) { - String text = handleBrowseButtonSelected(); - if (text != null) { - fCoreText.setText(text); - } - updateLaunchConfigurationDialog(); - } - }); - } /* * (non-Javadoc) @@ -275,26 +170,7 @@ public class CMainTab extends CLaunchConfigurationTab { updateProjectFromConfig(config); updateProgramFromConfig(config); updateCoreFromConfig(config); - } - - protected void updateProjectFromConfig(ILaunchConfiguration config) { - String projectName = EMPTY_STRING; - try { - projectName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); - } catch (CoreException ce) { - GdbUIPlugin.log(ce); - } - fProjText.setText(projectName); - } - - protected void updateProgramFromConfig(ILaunchConfiguration config) { - String programName = EMPTY_STRING; - try { - programName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, EMPTY_STRING); - } catch (CoreException ce) { - GdbUIPlugin.log(ce); - } - fProgText.setText(programName); + updateBuildOptionFromConfig(config); } /** @since 2.0 */ @@ -315,22 +191,13 @@ public class CMainTab extends CLaunchConfigurationTab { * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ + @Override public void performApply(ILaunchConfigurationWorkingCopy config) { + super.performApply(config); ICProject cProject = this.getCProject(); if (cProject != null && cProject.exists()) { config.setMappedResources(new IResource[] { cProject.getProject() }); - try { // Only initialize the build config ID once. - if (config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, "").length() == 0)//$NON-NLS-1$ - { - ICProjectDescription projDes = CCorePlugin.getDefault().getProjectDescription(cProject.getProject()); - if (projDes != null) - { - String buildConfigID = projDes.getActiveConfiguration().getId(); - config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, buildConfigID); - } - } - } catch (CoreException e) { e.printStackTrace(); } } else { config.setMappedResources(null); } @@ -345,6 +212,7 @@ public class CMainTab extends CLaunchConfigurationTab { /** * Show a dialog that lists all main types */ + @Override protected void handleSearchButtonSelected() { if (getCProject() == null) { @@ -415,135 +283,6 @@ public class CMainTab extends CLaunchConfigurationTab { } - /** - * Show a dialog that lets the user select a file. - */ - protected String handleBrowseButtonSelected() { - FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); - fileDialog.setFileName(fProgText.getText()); - return fileDialog.open(); - } - - /** - * Iterate through and suck up all of the executable files that we can find. - */ - protected IBinary[] getBinaryFiles(final ICProject cproject) { - final Display display; - if (cproject == null || !cproject.exists()) { - return null; - } - if (getShell() == null) { - display = GdbUIPlugin.getShell().getDisplay(); - } else { - display = getShell().getDisplay(); - } - final Object[] ret = new Object[1]; - BusyIndicator.showWhile(display, new Runnable() { - - public void run() { - try { - ret[0] = cproject.getBinaryContainer().getBinaries(); - } catch (CModelException e) { - GdbUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ - } - } - }); - - return (IBinary[])ret[0]; - } - - /** - * Show a dialog that lets the user select a project. This in turn provides context for the main - * type, allowing the user to key a main type name, or constraining the search for main types to - * the specified project. - */ - protected void handleProjectButtonSelected() { - String currentProjectName = fProjText.getText(); - ICProject project = chooseCProject(); - if (project == null) { - return; - } - - String projectName = project.getElementName(); - fProjText.setText(projectName); - if (currentProjectName.length() == 0) - { - // New project selected for the first time, set the program name default too. - IBinary[] bins = getBinaryFiles(project); - if (bins != null && bins.length == 1) { - fProgText.setText(bins[0].getResource().getProjectRelativePath().toOSString()); - } - - } - } - - /** - * Realize a C Project selection dialog and return the first selected project, or null if there - * was none. - */ - protected ICProject chooseCProject() { - try { - ICProject[] projects = getCProjects(); - - ILabelProvider labelProvider = new CElementLabelProvider(); - ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider); - dialog.setTitle(LaunchMessages.getString("CMainTab.Project_Selection")); //$NON-NLS-1$ - dialog.setMessage(LaunchMessages.getString("CMainTab.Choose_project_to_constrain_search_for_program")); //$NON-NLS-1$ - dialog.setElements(projects); - - ICProject cProject = getCProject(); - if (cProject != null) { - dialog.setInitialSelections(new Object[]{cProject}); - } - if (dialog.open() == Window.OK) { - return (ICProject)dialog.getFirstResult(); - } - } catch (CModelException e) { - GdbUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ - } - return null; - } - - /** - * Return an array a ICProject whose platform match that of the runtime env. - */ - protected ICProject[] getCProjects() throws CModelException { - ICProject cproject[] = CoreModel.getDefault().getCModel().getCProjects(); - ArrayList list = new ArrayList(cproject.length); - - for (int i = 0; i < cproject.length; i++) { - ICDescriptor cdesciptor = null; - try { - cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject)cproject[i].getResource(), false); - if (cdesciptor != null) { - String projectPlatform = cdesciptor.getPlatform(); - if (filterPlatform.equals("*") //$NON-NLS-1$ - || projectPlatform.equals("*") //$NON-NLS-1$ - || filterPlatform.equalsIgnoreCase(projectPlatform) == true) { - list.add(cproject[i]); - } - } else { - list.add(cproject[i]); - } - } catch (CoreException e) { - list.add(cproject[i]); - } - } - return list.toArray(new ICProject[list.size()]); - } - - /** - * Return the ICProject corresponding to the project name in the project name text field, or - * null if the text does not match a project name. - */ - protected ICProject getCProject() { - String projectName = fProjText.getText().trim(); - if (projectName.length() < 1) { - return null; - } - return CoreModel.getDefault().getCModel().getCProject(projectName); - } - /* * (non-Javadoc) * @@ -625,34 +364,6 @@ public class CMainTab extends CLaunchConfigurationTab { return true; } - /** - * @param project - * @param exePath - * @return - * @throws CoreException - */ - protected boolean isBinary(IProject project, IPath exePath) throws CoreException { - ICExtensionReference[] parserRef = CCorePlugin.getDefault().getBinaryParserExtensions(project); - for (int i = 0; i < parserRef.length; i++) { - try { - IBinaryParser parser = (IBinaryParser)parserRef[i].createExtension(); - IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath); - if (exe != null) { - return true; - } - } catch (ClassCastException e) { - } catch (IOException e) { - } - } - IBinaryParser parser = CCorePlugin.getDefault().getDefaultBinaryParser(); - try { - IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath); - return exe != null; - } catch (ClassCastException e) { - } catch (IOException e) { - } - return false; - } /* * (non-Javadoc) * @@ -666,6 +377,7 @@ public class CMainTab extends CLaunchConfigurationTab { // corresponding text boxes) // plus getContext will use this to base context from if set. config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, EMPTY_STRING); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, EMPTY_STRING); ICElement cElement = null; @@ -763,13 +475,4 @@ public class CMainTab extends CLaunchConfigurationTab { return LaunchImages.get(LaunchImages.IMG_VIEW_MAIN_TAB); } - /* - * (non-Javadoc) - * - * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog() - */ - @Override - protected void updateLaunchConfigurationDialog() { - super.updateLaunchConfigurationDialog(); - } } diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CAbstractMainTab.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CAbstractMainTab.java new file mode 100644 index 00000000000..b357863f1c9 --- /dev/null +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CAbstractMainTab.java @@ -0,0 +1,540 @@ +package org.eclipse.cdt.launch.ui; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.ICDescriptor; +import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; +import org.eclipse.cdt.launch.LaunchUtils; +import org.eclipse.cdt.launch.internal.ui.LaunchMessages; +import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; +import org.eclipse.cdt.ui.CElementLabelProvider; +import org.eclipse.cdt.ui.newui.CDTPropertyManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.dialogs.ElementListSelectionDialog; +import org.eclipse.ui.dialogs.PreferencesUtil; + +/** + * @since 6.1 + */ +public abstract class CAbstractMainTab extends CLaunchConfigurationTab { + + + protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ + + protected String filterPlatform = EMPTY_STRING; + + /** + * @since 6.0 + */ + protected Combo fBuildConfigCombo; + /** @since 6.1 */ + protected Button fDisableBuildButton; + /** @since 6.1 */ + protected Button fEnableBuildButton; + /** @since 6.1 */ + protected Button fWorkspaceSettingsButton; + /** @since 6.1 */ + protected Link fWorkpsaceSettingsLink; + protected final Map fBinaryExeCache = new HashMap(); + protected Label fProjLabel; + protected Text fProjText; + protected Button fProjButton; + + protected Label fProgLabel; + protected Text fProgText; + protected Button fSearchButton; + + // Core file UI widgets + /** @since 2.0 */ + protected Label fCoreLabel; + /** @since 2.0 */ + protected Text fCoreText; + /** @since 2.0 */ + protected Button fCoreButton; + + /** + * Name of most recently checked program; avoid constantly checking binary. + * See bug 277663. + */ + protected String fPreviouslyCheckedProgram; + /** + * Validity result of most recently checked program; avoid constantly + * checking binary. See bug 277663. N/A if fPreviouslyCheckedProgram = null; + */ + protected boolean fPreviouslyCheckedProgramIsValid; + /** + * Validity error message of most recently checked program; avoid constantly + * checking binary. See bug 277663. N/A if fPreviouslyCheckedProgram = null. + */ + protected String fPreviouslyCheckedProgramErrorMsg; + + public CAbstractMainTab() { + super(); + } + + abstract protected void handleSearchButtonSelected(); + + /** + * @since 6.0 + */ + protected void createProjectGroup(Composite parent, int colSpan) { + Composite projComp = new Composite(parent, SWT.NONE); + GridLayout projLayout = new GridLayout(); + projLayout.numColumns = 2; + projLayout.marginHeight = 0; + projLayout.marginWidth = 0; + projComp.setLayout(projLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + projComp.setLayoutData(gd); + + fProjLabel = new Label(projComp, SWT.NONE); + fProjLabel.setText(LaunchMessages.getString("CMainTab.&ProjectColon")); //$NON-NLS-1$ + gd = new GridData(); + gd.horizontalSpan = 2; + fProjLabel.setLayoutData(gd); + + fProjText = new Text(projComp, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + fProjText.setLayoutData(gd); + fProjText.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent evt) { + // if project changes, invalidate program name cache + fPreviouslyCheckedProgram = null; + + updateBuildConfigCombo(""); //$NON-NLS-1$ + updateLaunchConfigurationDialog(); + } + }); + + fProjButton = createPushButton(projComp, LaunchMessages.getString("Launch.common.Browse_1"), null); //$NON-NLS-1$ + fProjButton.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent evt) { + handleProjectButtonSelected(); + updateLaunchConfigurationDialog(); + } + }); + } + + /** + * Return the ICProject corresponding to the project name in the project name text field, or + * null if the text does not match a project name. + */ + protected ICProject getCProject() { + String projectName = fProjText.getText().trim(); + if (projectName.length() < 1) { + return null; + } + return CoreModel.getDefault().getCModel().getCProject(projectName); + } + + /** + * Show a dialog that lets the user select a project. This in turn provides context for the main + * type, allowing the user to key a main type name, or constraining the search for main types to + * the specified project. + */ + protected void handleProjectButtonSelected() { + String currentProjectName = fProjText.getText(); + ICProject project = chooseCProject(); + if (project == null) { + return; + } + + String projectName = project.getElementName(); + fProjText.setText(projectName); + if (currentProjectName.length() == 0) + { + // New project selected for the first time, set the program name default too. + IBinary[] bins = getBinaryFiles(project); + if (bins != null && bins.length == 1) { + fProgText.setText(bins[0].getResource().getProjectRelativePath().toOSString()); + } + + } + } + + /** + * Return an array a ICProject whose platform match that of the runtime env. + */ + protected ICProject[] getCProjects() throws CModelException { + ICProject cproject[] = CoreModel.getDefault().getCModel().getCProjects(); + ArrayList list = new ArrayList(cproject.length); + + for (int i = 0; i < cproject.length; i++) { + ICDescriptor cdesciptor = null; + try { + cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject)cproject[i].getResource(), false); + if (cdesciptor != null) { + String projectPlatform = cdesciptor.getPlatform(); + if (filterPlatform.equals("*") //$NON-NLS-1$ + || projectPlatform.equals("*") //$NON-NLS-1$ + || filterPlatform.equalsIgnoreCase(projectPlatform) == true) { + list.add(cproject[i]); + } + } else { + list.add(cproject[i]); + } + } catch (CoreException e) { + list.add(cproject[i]); + } + } + return list.toArray(new ICProject[list.size()]); + } + + /** + * Realize a C Project selection dialog and return the first selected project, or null if there + * was none. + */ + protected ICProject chooseCProject() { + try { + ICProject[] projects = getCProjects(); + + ILabelProvider labelProvider = new CElementLabelProvider(); + ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider); + dialog.setTitle(LaunchMessages.getString("CMainTab.Project_Selection")); //$NON-NLS-1$ + dialog.setMessage(LaunchMessages.getString("CMainTab.Choose_project_to_constrain_search_for_program")); //$NON-NLS-1$ + dialog.setElements(projects); + + ICProject cProject = getCProject(); + if (cProject != null) { + dialog.setInitialSelections(new Object[]{cProject}); + } + if (dialog.open() == Window.OK) { + return (ICProject)dialog.getFirstResult(); + } + } catch (CModelException e) { + LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ + } + return null; + } + + /** + * @since 6.0 + */ + protected void updateBuildConfigCombo(String selectedConfigID) { + if (fBuildConfigCombo != null) + { + fBuildConfigCombo.removeAll(); + fBuildConfigCombo.add(LaunchMessages.getString("CMainTab.Use_Active")); //$NON-NLS-1$ + fBuildConfigCombo.setData("0", ""); //$NON-NLS-1$ //$NON-NLS-2$ + fBuildConfigCombo.select(0); + ICProject cproject = getCProject(); + if (cproject != null){ + + ICProjectDescription projDes = CDTPropertyManager.getProjectDescription(cproject.getProject()); + if (projDes != null) + { + int selIndex = 0; + ICConfigurationDescription[] configurations = projDes.getConfigurations(); + ICConfigurationDescription selectedConfig = projDes.getConfigurationById(selectedConfigID); + for (int i = 0; i < configurations.length; i++) { + String configName = configurations[i].getName(); + fBuildConfigCombo.add(configName); + fBuildConfigCombo.setData(Integer.toString(i + 1), configurations[i].getId()); + if (selectedConfig != null && selectedConfigID.equals(configurations[i].getId())) + selIndex = i + 1; + } + fBuildConfigCombo.select(selIndex); + } + + } + + } + } + + /** + * @since 6.0 + */ + protected void createBuildConfigCombo(Composite parent, int colspan) { + Composite comboComp = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + comboComp.setLayout(layout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colspan; + comboComp.setLayoutData(gd); + Label dlabel = new Label(comboComp, SWT.NONE); + dlabel.setText(LaunchMessages.getString("CMainTab.Build_Config")); //$NON-NLS-1$ + fBuildConfigCombo = new Combo(comboComp, SWT.READ_ONLY | SWT.DROP_DOWN); + fBuildConfigCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + fBuildConfigCombo.addSelectionListener(new SelectionListener() { + public void widgetSelected(SelectionEvent e) { + updateLaunchConfigurationDialog(); + } + + public void widgetDefaultSelected(SelectionEvent e) { + updateLaunchConfigurationDialog(); + } + }); + } + + /** @since 6.1 */ + protected void createBuildOptionGroup(final Composite parent, int colSpan) { + Group buildGroup = new Group(parent, SWT.NONE); + GridData gridData = new GridData(GridData.FILL_HORIZONTAL); + gridData.horizontalSpan = colSpan; + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 2; + gridLayout.marginHeight = 5; + gridLayout.marginWidth = 5; + gridLayout.makeColumnsEqualWidth= true; + buildGroup.setLayoutData(gridData); + buildGroup.setLayout(gridLayout); + buildGroup.setText(LaunchMessages.getString("CMainTab.Build_options")); //$NON-NLS-1$ + + createBuildConfigCombo(buildGroup, 2); + + fEnableBuildButton = new Button(buildGroup, SWT.RADIO); + fEnableBuildButton.setText(LaunchMessages.getString("CMainTab.Enable_build_button_label")); //$NON-NLS-1$ + fEnableBuildButton.setToolTipText(LaunchMessages.getString("CMainTab.Enable_build_button_tooltip")); //$NON-NLS-1$ + fEnableBuildButton.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + fDisableBuildButton = new Button(buildGroup, SWT.RADIO); + fDisableBuildButton.setText(LaunchMessages.getString("CMainTab.Disable_build_button_label")); //$NON-NLS-1$ + fDisableBuildButton.setToolTipText(LaunchMessages.getString("CMainTab.Disable_build_button_tooltip")); //$NON-NLS-1$ + fDisableBuildButton.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + fWorkspaceSettingsButton = new Button(buildGroup, SWT.RADIO); + fWorkspaceSettingsButton.setText(LaunchMessages.getString("CMainTab.Workspace_settings_button_label")); //$NON-NLS-1$ + fWorkspaceSettingsButton.setToolTipText(LaunchMessages.getString("CMainTab.Workspace_settings_button_tooltip")); //$NON-NLS-1$ + fWorkspaceSettingsButton.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + fWorkpsaceSettingsLink = new Link(buildGroup, SWT.NONE); //$NON-NLS-1$ + fWorkpsaceSettingsLink.setText(LaunchMessages.getString("CMainTab.Workspace_settings_link_label")); //$NON-NLS-1$ + fWorkpsaceSettingsLink.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + PreferencesUtil.createPreferenceDialogOn( + parent.getShell(), + LaunchMessages.getString("CMainTab.Workspace_settings_page_id"), //$NON-NLS-1$ + null, + null).open(); + } + }); + + } + + /** @since 6.1 */ + protected void updateBuildOptionFromConfig(ILaunchConfiguration config) { + int buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_USE_WORKSPACE_SETTING; + try { + buildBeforeLaunchValue = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, buildBeforeLaunchValue); + } catch (CoreException e) { + LaunchUIPlugin.log(e); + } + + if (fDisableBuildButton != null) + fDisableBuildButton.setSelection(buildBeforeLaunchValue == ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED); + if (fEnableBuildButton != null) + fEnableBuildButton.setSelection(buildBeforeLaunchValue == ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_ENABLED); + if (fWorkspaceSettingsButton != null) + fWorkspaceSettingsButton.setSelection(buildBeforeLaunchValue == ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_USE_WORKSPACE_SETTING); + } + + /** + * Show a dialog that lets the user select a file. + * + * @since 6.0 + */ + protected String handleBrowseButtonSelected() { + FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); + fileDialog.setFileName(fProgText.getText()); + return fileDialog.open(); + } + + /** @since 2.0 */ + protected void createCoreFileGroup(Composite parent, int colSpan) { + Composite coreComp = new Composite(parent, SWT.NONE); + GridLayout coreLayout = new GridLayout(); + coreLayout.numColumns = 3; + coreLayout.marginHeight = 0; + coreLayout.marginWidth = 0; + coreComp.setLayout(coreLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + coreComp.setLayoutData(gd); + fCoreLabel = new Label(coreComp, SWT.NONE); + fCoreLabel.setText(LaunchMessages.getString("CMainTab.CoreFile_path")); //$NON-NLS-1$ + gd = new GridData(); + gd.horizontalSpan = 3; + fCoreLabel.setLayoutData(gd); + fCoreText = new Text(coreComp, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + fCoreText.setLayoutData(gd); + fCoreText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + Button browseForCoreButton; + browseForCoreButton = createPushButton(coreComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$ + browseForCoreButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + String text = handleBrowseButtonSelected(); + if (text != null) { + fCoreText.setText(text); + } + updateLaunchConfigurationDialog(); + } + }); + } + + /** + * @param project + * @param exePath + * @return + * @throws CoreException + */ + protected boolean isBinary(IProject project, IPath exePath) throws CoreException { + try { + Boolean binValue = fBinaryExeCache.get(exePath); + if (binValue == null) + { + IBinaryObject exe = LaunchUtils.getBinary(project, exePath); + binValue = exe != null; + fBinaryExeCache.put(exePath, binValue); + } + return binValue; + } catch (ClassCastException e) { + } + return false; + } + + /** + * Iterate through and suck up all of the executable files that we can find. + */ + protected IBinary[] getBinaryFiles(final ICProject cproject) { + final Display display; + if (cproject == null || !cproject.exists()) { + return null; + } + if (getShell() == null) { + display = LaunchUIPlugin.getShell().getDisplay(); + } else { + display = getShell().getDisplay(); + } + final Object[] ret = new Object[1]; + BusyIndicator.showWhile(display, new Runnable() { + + public void run() { + try { + ret[0] = cproject.getBinaryContainer().getBinaries(); + } catch (CModelException e) { + LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ + } + } + }); + + return (IBinary[])ret[0]; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) + */ + public void performApply(ILaunchConfigurationWorkingCopy config) { + if (fBuildConfigCombo != null) { + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, (String)fBuildConfigCombo.getData(Integer.toString(fBuildConfigCombo.getSelectionIndex()))); + } + + if (fDisableBuildButton != null) { + int buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_USE_WORKSPACE_SETTING; + if (fDisableBuildButton.getSelection()) { + buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED; + } else if (fEnableBuildButton.getSelection()) { + buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_ENABLED; + } + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, buildBeforeLaunchValue); + } + } + + protected void updateProjectFromConfig(ILaunchConfiguration config) { + String projectName = EMPTY_STRING; + String configName = EMPTY_STRING; + try { + projectName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); + configName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, EMPTY_STRING); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fProjText.setText(projectName); + updateBuildConfigCombo(configName); + } + + protected void updateProgramFromConfig(ILaunchConfiguration config) { + if (fProgText != null) + { + String programName = EMPTY_STRING; + try { + programName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, EMPTY_STRING); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fProgText.setText(programName); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog() + */ + @Override + protected void updateLaunchConfigurationDialog() { + super.updateLaunchConfigurationDialog(); + } + +} \ No newline at end of file diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java index f76630c5f52..66bb5f51a50 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java @@ -12,29 +12,18 @@ *******************************************************************************/ package org.eclipse.cdt.launch.ui; -import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; -import java.util.List; -import java.util.Map; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.ICDescriptor; -import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; -import org.eclipse.cdt.core.model.CModelException; -import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; -import org.eclipse.cdt.launch.LaunchUtils; import org.eclipse.cdt.launch.internal.ui.LaunchImages; import org.eclipse.cdt.launch.internal.ui.LaunchMessages; import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; import org.eclipse.cdt.ui.CElementLabelProvider; -import org.eclipse.cdt.ui.newui.CDTPropertyManager; import org.eclipse.cdt.utils.pty.PTY; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -52,26 +41,18 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.dialogs.ElementListSelectionDialog; -import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.dialogs.TwoPaneElementSelector; /** @@ -84,7 +65,7 @@ import org.eclipse.ui.dialogs.TwoPaneElementSelector; * @since 2.0 */ -public class CMainTab extends CLaunchConfigurationTab { +public class CMainTab extends CAbstractMainTab { /** * Tab identifier used for ordering of tabs added using the @@ -95,16 +76,6 @@ public class CMainTab extends CLaunchConfigurationTab { */ public static final String TAB_ID = "org.eclipse.cdt.cdi.launch.mainTab"; //$NON-NLS-1$ - // Project UI widgets - protected Label fProjLabel; - protected Text fProjText; - protected Button fProjButton; - - // Main class UI widgets - protected Label fProgLabel; - protected Text fProgText; - protected Button fSearchButton; - // Core file UI widgets /** @since 6.0 */ protected Label fCoreLabel; @@ -113,56 +84,17 @@ public class CMainTab extends CLaunchConfigurationTab { /** @since 6.0 */ protected Button fCoreButton; - /** - * @since 6.0 - */ - protected Combo fBuildConfigCombo; - // Build option UI widgets - /** @since 6.1 */ - protected Button fDisableBuildButton; - /** @since 6.1 */ - protected Button fEnableBuildButton; - /** @since 6.1 */ - protected Button fWorkspaceSettingsButton; - /** @since 6.1 */ - protected Link fWorkpsaceSettingsLink; - private final boolean fWantsTerminalOption; protected Button fTerminalButton; private final boolean dontCheckProgram; private final boolean fSpecifyCoreFile; - - protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ - - private String filterPlatform = EMPTY_STRING; public static final int WANTS_TERMINAL = 1; public static final int DONT_CHECK_PROGRAM = 2; /** @since 6.0 */ public static final int SPECIFY_CORE_FILE = 4; - private final Map fBinaryExeCache = new HashMap(); - - /** - * Name of most recently checked program; avoid constantly checking binary. - * See bug 277663. - */ - private String fPreviouslyCheckedProgram; - - /** - * Validity result of most recently checked program; avoid constantly - * checking binary. See bug 277663. N/A if fPreviouslyCheckedProgram = null; - */ - private boolean fPreviouslyCheckedProgramIsValid; - - /** - * Validity error message of most recently checked program; avoid constantly - * checking binary. See bug 277663. N/A if fPreviouslyCheckedProgram = null. - */ - private String fPreviouslyCheckedProgramErrorMsg; - - public CMainTab() { this(WANTS_TERMINAL); } @@ -205,252 +137,6 @@ public class CMainTab extends CLaunchConfigurationTab { LaunchUIPlugin.setDialogShell(parent.getShell()); } - /** - * @since 6.0 - */ - protected void createProjectGroup(Composite parent, int colSpan) { - Composite projComp = new Composite(parent, SWT.NONE); - GridLayout projLayout = new GridLayout(); - projLayout.numColumns = 2; - projLayout.marginHeight = 0; - projLayout.marginWidth = 0; - projComp.setLayout(projLayout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = colSpan; - projComp.setLayoutData(gd); - - fProjLabel = new Label(projComp, SWT.NONE); - fProjLabel.setText(LaunchMessages.getString("CMainTab.&ProjectColon")); //$NON-NLS-1$ - gd = new GridData(); - gd.horizontalSpan = 2; - fProjLabel.setLayoutData(gd); - - fProjText = new Text(projComp, SWT.SINGLE | SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL); - fProjText.setLayoutData(gd); - fProjText.addModifyListener(new ModifyListener() { - - public void modifyText(ModifyEvent evt) { - // if project changes, invalidate program name cache - fPreviouslyCheckedProgram = null; - - updateBuildConfigCombo(EMPTY_STRING); - updateLaunchConfigurationDialog(); - } - }); - - fProjButton = createPushButton(projComp, LaunchMessages.getString("Launch.common.Browse_1"), null); //$NON-NLS-1$ - fProjButton.addSelectionListener(new SelectionAdapter() { - - @Override - public void widgetSelected(SelectionEvent evt) { - handleProjectButtonSelected(); - updateLaunchConfigurationDialog(); - } - }); - } - - /** - * @since 6.0 - */ - protected void updateBuildConfigCombo(String selectedConfigID) { - if (fBuildConfigCombo != null) - { - fBuildConfigCombo.removeAll(); - fBuildConfigCombo.add(LaunchMessages.getString("CMainTab.Use_Active")); //$NON-NLS-1$ - fBuildConfigCombo.setData("0", EMPTY_STRING); //$NON-NLS-1$ - fBuildConfigCombo.select(0); - ICProject cproject = getCProject(); - if (cproject != null){ - - ICProjectDescription projDes = CDTPropertyManager.getProjectDescription(cproject.getProject()); - if (projDes != null) - { - int selIndex = 0; - ICConfigurationDescription[] configurations = projDes.getConfigurations(); - ICConfigurationDescription selectedConfig = projDes.getConfigurationById(selectedConfigID); - for (int i = 0; i < configurations.length; i++) { - String configName = configurations[i].getName(); - fBuildConfigCombo.add(configName); - fBuildConfigCombo.setData(Integer.toString(i + 1), configurations[i].getId()); - if (selectedConfig != null && selectedConfigID.equals(configurations[i].getId())) - selIndex = i + 1; - } - fBuildConfigCombo.select(selIndex); - } - - } - - } - } - - /** - * @since 6.0 - */ - protected void createBuildConfigCombo(Composite parent, int colspan) { - Composite comboComp = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(2, false); - comboComp.setLayout(layout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = colspan; - comboComp.setLayoutData(gd); - Label dlabel = new Label(comboComp, SWT.NONE); - dlabel.setText(LaunchMessages.getString("CMainTab.Build_Config")); //$NON-NLS-1$ - fBuildConfigCombo = new Combo(comboComp, SWT.READ_ONLY | SWT.DROP_DOWN); - fBuildConfigCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - fBuildConfigCombo.addSelectionListener(new SelectionListener() { - public void widgetSelected(SelectionEvent e) { - updateLaunchConfigurationDialog(); - } - - public void widgetDefaultSelected(SelectionEvent e) { - updateLaunchConfigurationDialog(); - } - }); - } - - protected void createExeFileGroup(Composite parent, int colSpan) { - Composite mainComp = new Composite(parent, SWT.NONE); - GridLayout mainLayout = new GridLayout(); - mainLayout.numColumns = 3; - mainLayout.marginHeight = 0; - mainLayout.marginWidth = 0; - mainComp.setLayout(mainLayout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = colSpan; - mainComp.setLayoutData(gd); - fProgLabel = new Label(mainComp, SWT.NONE); - fProgLabel.setText(LaunchMessages.getString("CMainTab.C/C++_Application")); //$NON-NLS-1$ - gd = new GridData(); - gd.horizontalSpan = 3; - fProgLabel.setLayoutData(gd); - fProgText = new Text(mainComp, SWT.SINGLE | SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL); - fProgText.setLayoutData(gd); - fProgText.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent evt) { - updateLaunchConfigurationDialog(); - } - }); - - fSearchButton = createPushButton(mainComp, LaunchMessages.getString("CMainTab.Search..."), null); //$NON-NLS-1$ - fSearchButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent evt) { - handleSearchButtonSelected(); - updateLaunchConfigurationDialog(); - } - }); - - Button fBrowseForBinaryButton; - fBrowseForBinaryButton = createPushButton(mainComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$ - fBrowseForBinaryButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent evt) { - handleBinaryBrowseButtonSelected(); - updateLaunchConfigurationDialog(); - } - }); - } - - /** @since 6.1 */ - protected void createBuildOptionGroup(final Composite parent, int colSpan) { - Group buildGroup = new Group(parent, SWT.NONE); - GridData gridData = new GridData(GridData.FILL_HORIZONTAL); - gridData.horizontalSpan = colSpan; - GridLayout gridLayout = new GridLayout(); - gridLayout.numColumns = 2; - gridLayout.marginHeight = 5; - gridLayout.marginWidth = 5; - gridLayout.makeColumnsEqualWidth= true; - buildGroup.setLayoutData(gridData); - buildGroup.setLayout(gridLayout); - buildGroup.setText(LaunchMessages.getString("CMainTab.Build_options")); //$NON-NLS-1$ - - createBuildConfigCombo(buildGroup, 2); - - fEnableBuildButton = new Button(buildGroup, SWT.RADIO); - fEnableBuildButton.setText(LaunchMessages.getString("CMainTab.Enable_build_button_label")); //$NON-NLS-1$ - fEnableBuildButton.setToolTipText(LaunchMessages.getString("CMainTab.Enable_build_button_tooltip")); //$NON-NLS-1$ - fEnableBuildButton.addSelectionListener(new SelectionAdapter() { - - public void widgetSelected(SelectionEvent evt) { - updateLaunchConfigurationDialog(); - } - }); - - fDisableBuildButton = new Button(buildGroup, SWT.RADIO); - fDisableBuildButton.setText(LaunchMessages.getString("CMainTab.Disable_build_button_label")); //$NON-NLS-1$ - fDisableBuildButton.setToolTipText(LaunchMessages.getString("CMainTab.Disable_build_button_tooltip")); //$NON-NLS-1$ - fDisableBuildButton.addSelectionListener(new SelectionAdapter() { - - public void widgetSelected(SelectionEvent evt) { - updateLaunchConfigurationDialog(); - } - }); - - fWorkspaceSettingsButton = new Button(buildGroup, SWT.RADIO); - fWorkspaceSettingsButton.setText(LaunchMessages.getString("CMainTab.Workspace_settings_button_label")); //$NON-NLS-1$ - fWorkspaceSettingsButton.setToolTipText(LaunchMessages.getString("CMainTab.Workspace_settings_button_tooltip")); //$NON-NLS-1$ - fWorkspaceSettingsButton.addSelectionListener(new SelectionAdapter() { - - public void widgetSelected(SelectionEvent evt) { - updateLaunchConfigurationDialog(); - } - }); - - fWorkpsaceSettingsLink = new Link(buildGroup, SWT.NONE); //$NON-NLS-1$ - fWorkpsaceSettingsLink.setText(LaunchMessages.getString("CMainTab.Workspace_settings_link_label")); //$NON-NLS-1$ - fWorkpsaceSettingsLink.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - PreferencesUtil.createPreferenceDialogOn( - parent.getShell(), - LaunchMessages.getString("CMainTab.Workspace_settings_page_id"), //$NON-NLS-1$ - null, - null).open(); - } - }); - - } - /** @since 6.0 */ - protected void createCoreFileGroup(Composite parent, int colSpan) { - Composite coreComp = new Composite(parent, SWT.NONE); - GridLayout coreLayout = new GridLayout(); - coreLayout.numColumns = 3; - coreLayout.marginHeight = 0; - coreLayout.marginWidth = 0; - coreComp.setLayout(coreLayout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = colSpan; - coreComp.setLayoutData(gd); - fCoreLabel = new Label(coreComp, SWT.NONE); - fCoreLabel.setText(LaunchMessages.getString("CMainTab.CoreFile_path")); //$NON-NLS-1$ - gd = new GridData(); - gd.horizontalSpan = 3; - fCoreLabel.setLayoutData(gd); - fCoreText = new Text(coreComp, SWT.SINGLE | SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL); - fCoreText.setLayoutData(gd); - fCoreText.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent evt) { - updateLaunchConfigurationDialog(); - } - }); - - Button browseForCoreButton; - browseForCoreButton = createPushButton(coreComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$ - browseForCoreButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent evt) { - String text = handleBrowseButtonSelected(); - if (text != null) { - fCoreText.setText(text); - } - updateLaunchConfigurationDialog(); - } - }); - } - protected boolean wantsTerminalOption() { return fWantsTerminalOption; } @@ -503,32 +189,6 @@ public class CMainTab extends CLaunchConfigurationTab { } } - protected void updateProjectFromConfig(ILaunchConfiguration config) { - String projectName = EMPTY_STRING; - String configName = EMPTY_STRING; - try { - projectName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); - configName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, EMPTY_STRING); - } catch (CoreException ce) { - LaunchUIPlugin.log(ce); - } - fProjText.setText(projectName); - updateBuildConfigCombo(configName); - } - - protected void updateProgramFromConfig(ILaunchConfiguration config) { - if (fProgText != null) - { - String programName = EMPTY_STRING; - try { - programName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, EMPTY_STRING); - } catch (CoreException ce) { - LaunchUIPlugin.log(ce); - } - fProgText.setText(programName); - } - } - /** @since 6.0 */ protected void updateCoreFromConfig(ILaunchConfiguration config) { if (fCoreText != null) { @@ -542,29 +202,13 @@ public class CMainTab extends CLaunchConfigurationTab { } } - /** @since 6.1 */ - protected void updateBuildOptionFromConfig(ILaunchConfiguration config) { - int buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_USE_WORKSPACE_SETTING; - try { - buildBeforeLaunchValue = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, buildBeforeLaunchValue); - } catch (CoreException e) { - LaunchUIPlugin.log(e); - } - - if (fDisableBuildButton != null) - fDisableBuildButton.setSelection(buildBeforeLaunchValue == ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED); - if (fEnableBuildButton != null) - fEnableBuildButton.setSelection(buildBeforeLaunchValue == ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_ENABLED); - if (fWorkspaceSettingsButton != null) - fWorkspaceSettingsButton.setSelection(buildBeforeLaunchValue == ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_USE_WORKSPACE_SETTING); - } - /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void performApply(ILaunchConfigurationWorkingCopy config) { + super.performApply(config); ICProject cProject = this.getCProject(); if (cProject != null && cProject.exists()) { @@ -577,9 +221,6 @@ public class CMainTab extends CLaunchConfigurationTab { config.setMappedResources(null); } config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText()); - if (fBuildConfigCombo != null) { - config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, (String)fBuildConfigCombo.getData(Integer.toString(fBuildConfigCombo.getSelectionIndex()))); - } if (fProgText != null) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, fProgText.getText()); } @@ -590,15 +231,6 @@ public class CMainTab extends CLaunchConfigurationTab { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, fTerminalButton.getSelection()); } - if (fDisableBuildButton != null) { - int buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_USE_WORKSPACE_SETTING; - if (fDisableBuildButton.getSelection()) { - buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED; - } else if (fEnableBuildButton.getSelection()) { - buildBeforeLaunchValue = ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_ENABLED; - } - config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, buildBeforeLaunchValue); - } } /** @@ -674,6 +306,95 @@ public class CMainTab extends CLaunchConfigurationTab { } + /** + * @since 6.0 + */ + protected void createProjectGroup(Composite parent, int colSpan) { + Composite projComp = new Composite(parent, SWT.NONE); + GridLayout projLayout = new GridLayout(); + projLayout.numColumns = 2; + projLayout.marginHeight = 0; + projLayout.marginWidth = 0; + projComp.setLayout(projLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + projComp.setLayoutData(gd); + + fProjLabel = new Label(projComp, SWT.NONE); + fProjLabel.setText(LaunchMessages.getString("CMainTab.&ProjectColon")); //$NON-NLS-1$ + gd = new GridData(); + gd.horizontalSpan = 2; + fProjLabel.setLayoutData(gd); + + fProjText = new Text(projComp, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + fProjText.setLayoutData(gd); + fProjText.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent evt) { + // if project changes, invalidate program name cache + fPreviouslyCheckedProgram = null; + + updateBuildConfigCombo(""); //$NON-NLS-1$ + updateLaunchConfigurationDialog(); + } + }); + + fProjButton = createPushButton(projComp, LaunchMessages.getString("Launch.common.Browse_1"), null); //$NON-NLS-1$ + fProjButton.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent evt) { + handleProjectButtonSelected(); + updateLaunchConfigurationDialog(); + } + }); + } + + protected void createExeFileGroup(Composite parent, int colSpan) { + Composite mainComp = new Composite(parent, SWT.NONE); + GridLayout mainLayout = new GridLayout(); + mainLayout.numColumns = 3; + mainLayout.marginHeight = 0; + mainLayout.marginWidth = 0; + mainComp.setLayout(mainLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + mainComp.setLayoutData(gd); + fProgLabel = new Label(mainComp, SWT.NONE); + fProgLabel.setText(LaunchMessages.getString("CMainTab.C/C++_Application")); //$NON-NLS-1$ + gd = new GridData(); + gd.horizontalSpan = 3; + fProgLabel.setLayoutData(gd); + fProgText = new Text(mainComp, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + fProgText.setLayoutData(gd); + fProgText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + fSearchButton = createPushButton(mainComp, LaunchMessages.getString("CMainTab.Search..."), null); //$NON-NLS-1$ + fSearchButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + handleSearchButtonSelected(); + updateLaunchConfigurationDialog(); + } + }); + + Button fBrowseForBinaryButton; + fBrowseForBinaryButton = createPushButton(mainComp, LaunchMessages.getString("Launch.common.Browse_2"), null); //$NON-NLS-1$ + fBrowseForBinaryButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + handleBinaryBrowseButtonSelected(); + updateLaunchConfigurationDialog(); + } + }); + } + /** * Show a dialog that lets the user select a project. This in turn provides context for the main * type, allowing the user to key a main type name, or constraining the search for main types to @@ -694,137 +415,6 @@ public class CMainTab extends CLaunchConfigurationTab { } } - /** - * Show a dialog that lets the user select a file. - * - * @since 6.0 - */ - protected String handleBrowseButtonSelected() { - FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); - fileDialog.setFileName(fProgText.getText()); - return fileDialog.open(); - } - - /** - * Iterate through and suck up all of the executable files that we can find. - */ - protected IBinary[] getBinaryFiles(final ICProject cproject) { - final Display display; - if (cproject == null || !cproject.exists()) { - return null; - } - if (getShell() == null) { - display = LaunchUIPlugin.getShell().getDisplay(); - } else { - display = getShell().getDisplay(); - } - final Object[] ret = new Object[1]; - BusyIndicator.showWhile(display, new Runnable() { - - public void run() { - try { - ret[0] = cproject.getBinaryContainer().getBinaries(); - } catch (CModelException e) { - LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ - } - } - }); - - return (IBinary[])ret[0]; - } - - /** - * Show a dialog that lets the user select a project. This in turn provides context for the main - * type, allowing the user to key a main type name, or constraining the search for main types to - * the specified project. - */ - protected void handleProjectButtonSelected() { - String currentProjectName = fProjText.getText(); - ICProject project = chooseCProject(); - if (project == null) { - return; - } - - String projectName = project.getElementName(); - fProjText.setText(projectName); - if (currentProjectName.length() == 0) - { - // New project selected for the first time, set the program name default too. - IBinary[] bins = getBinaryFiles(project); - if (bins != null && bins.length == 1) { - fProgText.setText(bins[0].getResource().getProjectRelativePath().toOSString()); - } - - } - } - - /** - * Realize a C Project selection dialog and return the first selected project, or null if there - * was none. - */ - protected ICProject chooseCProject() { - try { - ICProject[] projects = getCProjects(); - - ILabelProvider labelProvider = new CElementLabelProvider(); - ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider); - dialog.setTitle(LaunchMessages.getString("CMainTab.Project_Selection")); //$NON-NLS-1$ - dialog.setMessage(LaunchMessages.getString("CMainTab.Choose_project_to_constrain_search_for_program")); //$NON-NLS-1$ - dialog.setElements(projects); - - ICProject cProject = getCProject(); - if (cProject != null) { - dialog.setInitialSelections(new Object[]{cProject}); - } - if (dialog.open() == Window.OK) { - return (ICProject)dialog.getFirstResult(); - } - } catch (CModelException e) { - LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ - } - return null; - } - - /** - * Return an array a ICProject whose platform match that of the runtime env. - */ - protected ICProject[] getCProjects() throws CModelException { - ICProject cproject[] = CoreModel.getDefault().getCModel().getCProjects(); - List list = new ArrayList(cproject.length); - - for (int i = 0; i < cproject.length; i++) { - ICDescriptor cdesciptor = null; - try { - cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject)cproject[i].getResource(), false); - if (cdesciptor != null) { - String projectPlatform = cdesciptor.getPlatform(); - if (filterPlatform.equals("*") //$NON-NLS-1$ - || projectPlatform.equals("*") //$NON-NLS-1$ - || filterPlatform.equalsIgnoreCase(projectPlatform) == true) { - list.add(cproject[i]); - } - } else { - list.add(cproject[i]); - } - } catch (CoreException e) { - list.add(cproject[i]); - } - } - return list.toArray(new ICProject[list.size()]); - } - - /** - * Return the ICProject corresponding to the project name in the project name text field, or - * null if the text does not match a project name. - */ - protected ICProject getCProject() { - String projectName = fProjText.getText().trim(); - if (projectName.length() < 1) { - return null; - } - return CoreModel.getDefault().getCModel().getCProject(projectName); - } - /* * (non-Javadoc) * @@ -937,26 +527,6 @@ public class CMainTab extends CLaunchConfigurationTab { return true; } - /** - * @param project - * @param exePath - * @return - * @throws CoreException - */ - protected boolean isBinary(IProject project, IPath exePath) throws CoreException { - try { - Boolean binValue = fBinaryExeCache.get(exePath); - if (binValue == null) - { - IBinaryObject exe = LaunchUtils.getBinary(project, exePath); - binValue = exe != null; - fBinaryExeCache.put(exePath, binValue); - } - return binValue; - } catch (ClassCastException e) { - } - return false; - } /* * (non-Javadoc) * @@ -1073,7 +643,6 @@ public class CMainTab extends CLaunchConfigurationTab { return TAB_ID; } - /* * (non-Javadoc) * @@ -1093,13 +662,4 @@ public class CMainTab extends CLaunchConfigurationTab { return LaunchImages.get(LaunchImages.IMG_VIEW_MAIN_TAB); } - /* - * (non-Javadoc) - * - * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog() - */ - @Override - protected void updateLaunchConfigurationDialog() { - super.updateLaunchConfigurationDialog(); - } }