mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 14:12:10 +02:00
Have CAbstractMainTab share the common portions of CDI CMainTab and DSF CMainTab.
This commit is contained in:
parent
06c10e1f7e
commit
86224bcfa0
3 changed files with 645 additions and 842 deletions
|
@ -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;
|
|||
* </p>
|
||||
*/
|
||||
|
||||
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();
|
||||
|
@ -226,45 +160,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<ICProject> list = new ArrayList<ICProject>(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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<IPath, Boolean> fBinaryExeCache = new HashMap<IPath, Boolean>();
|
||||
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<ICProject> list = new ArrayList<ICProject>(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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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<IPath, Boolean> fBinaryExeCache = new HashMap<IPath, Boolean>();
|
||||
|
||||
/**
|
||||
* 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<ICProject> list = new ArrayList<ICProject>(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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue