blob: 28509195bf8a34beb27b43dcb31684fa15b6240b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2018 Red Hat, Inc. and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Elliott Baron <ebaron@redhat.com> - initial API and implementation
* Martin Oberhuber (Wind River) - [354342] make valgrind version changeable
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.launch;
import java.util.Arrays;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.ResourceLocator;
import org.eclipse.linuxtools.profiling.launch.ConfigUtils;
import org.eclipse.linuxtools.valgrind.launch.IValgrindToolPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
import org.osgi.framework.Version;
public class ValgrindOptionsTab extends AbstractLaunchConfigurationTab {
protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
// General controls
protected Button traceChildrenButton;
protected Button childSilentButton;
protected Button runFreeresButton;
protected Text otherOptionsText;
protected Button demangleButton;
protected Spinner numCallersSpinner;
protected Button errorLimitButton;
protected Button showBelowMainButton;
protected Spinner maxStackFrameSpinner;
protected Button mainStackSizeButton;
protected Spinner mainStackSizeSpinner;
protected Button dSymUtilButton;
protected List suppFileList;
protected String tool;
protected String[] tools;
protected Composite top;
protected Composite mainStackSizeTop;
protected ScrolledComposite scrollTop;
protected Combo toolsCombo;
protected TabFolder optionsFolder;
protected TabItem toolTab;
protected ILaunchConfigurationWorkingCopy launchConfigurationWorkingCopy;
protected ILaunchConfiguration launchConfiguration;
protected IValgrindToolPage dynamicTab;
protected Composite dynamicTabHolder;
protected boolean isInitializing = false;
protected boolean initDefaults = false;
protected Exception ex;
/**
* @since 1.2
*/
protected boolean noToolCombo;
private Version valgrindVersion;
private boolean checkVersion;
public ValgrindOptionsTab() {
this(true);
}
public ValgrindOptionsTab(boolean checkVersion) {
this.checkVersion = checkVersion;
this.tools = ValgrindLaunchPlugin.getDefault().getRegisteredToolIDs();
if (tools != null && tools.length > 0)
this.tool = tools[0];
}
private SelectionListener selectListener = SelectionListener
.widgetSelectedAdapter(e -> updateLaunchConfigurationDialog());
private ModifyListener modifyListener = e -> updateLaunchConfigurationDialog();
@Override
public void createControl(Composite parent) {
// Check for exception
if (ex != null) {
setErrorMessage(ex.getLocalizedMessage());
}
scrollTop = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
scrollTop.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
scrollTop.setExpandVertical(true);
scrollTop.setExpandHorizontal(true);
setControl(scrollTop);
top = new Composite(scrollTop, SWT.NONE);
top.setLayout(new GridLayout());
createVerticalSpacer(top, 1);
// provide the tool combo if it is not excluded
if (!noToolCombo)
createToolCombo(top);
createVerticalSpacer(top, 1);
optionsFolder = new TabFolder(top, SWT.BORDER);
optionsFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
// "general" tab
TabItem generalTab = new TabItem(optionsFolder, SWT.NONE);
generalTab.setText(Messages.getString("ValgrindOptionsTab.General")); //$NON-NLS-1$
Composite generalTop = new Composite(optionsFolder, SWT.NONE);
generalTop.setLayout(new GridLayout());
generalTop.setLayoutData(new GridData(GridData.FILL_BOTH));
createBasicOptions(generalTop);
createVerticalSpacer(generalTop, 1);
createErrorOptions(generalTop);
createVerticalSpacer(generalTop, 1);
createOtherOptions(generalTop);
generalTab.setControl(generalTop);
TabItem suppTab = new TabItem(optionsFolder, SWT.NONE);
suppTab.setText(Messages.getString("ValgrindOptionsTab.Suppressions")); //$NON-NLS-1$
Composite suppTop = new Composite(optionsFolder, SWT.NONE);
suppTop.setLayout(new GridLayout());
suppTop.setLayoutData(new GridData(GridData.FILL_BOTH));
createSuppressionsOption(suppTop);
suppTab.setControl(suppTop);
toolTab = new TabItem(optionsFolder, SWT.NONE);
toolTab.setText(Messages.getString("ValgrindOptionsTab.Tool")); //$NON-NLS-1$
dynamicTabHolder = new Composite(optionsFolder, SWT.NONE);
dynamicTabHolder.setLayout(new GridLayout());
dynamicTabHolder.setLayoutData(new GridData(GridData.FILL_BOTH));
toolTab.setControl(dynamicTabHolder);
scrollTop.setContent(top);
recomputeSize();
updateLaunchConfigurationDialog();
}
private void recomputeSize() {
Point point = top.computeSize(SWT.DEFAULT, SWT.DEFAULT);
top.setSize(point);
scrollTop.setMinSize(point);
}
private void createToolCombo(Composite top) {
Composite comboTop = new Composite(top, SWT.NONE);
comboTop.setLayout(new GridLayout(2, false));
Label toolLabel = new Label(comboTop, SWT.NONE);
toolLabel.setText(Messages.getString("ValgrindOptionsTab.Tool_to_run")); //$NON-NLS-1$
toolsCombo = new Combo(comboTop, SWT.READ_ONLY);
String[] names = new String[tools.length];
for (int i = 0; i < names.length; i++) {
names[i] = capitalize(getPlugin().getToolName(tools[i]));
}
toolsCombo.setItems(names);
toolsCombo.addModifyListener(e -> {
// user selected change, set defaults in new tool
if (!isInitializing) {
initDefaults = true;
int ix = toolsCombo.getSelectionIndex();
tool = tools[ix];
handleToolChanged();
updateLaunchConfigurationDialog();
}
});
}
private String capitalize(String str) {
if (str.length() > 0) {
char[] buf = str.toCharArray();
buf[0] = Character.toUpperCase(buf[0]);
str = String.valueOf(buf);
}
return str;
}
private void createBasicOptions(Composite top) {
Group basicGroup = new Group(top, SWT.NONE);
basicGroup.setLayout(new GridLayout());
basicGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
basicGroup.setText(Messages.getString("ValgrindOptionsTab.Basic_Options")); //$NON-NLS-1$
Composite basicTop = new Composite(basicGroup, SWT.NONE);
basicTop.setLayout(new GridLayout(2, true));
basicTop.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
traceChildrenButton = new Button(basicTop, SWT.CHECK);
traceChildrenButton.setText(Messages.getString("ValgrindOptionsTab.trace_children")); //$NON-NLS-1$
traceChildrenButton.addSelectionListener(selectListener);
traceChildrenButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Must be on to prevent mangled XML output
childSilentButton = new Button(basicTop, SWT.CHECK);
childSilentButton.setText(Messages.getString("ValgrindOptionsTab.child_silent")); //$NON-NLS-1$
childSilentButton.setSelection(true);
childSilentButton.setEnabled(false);
childSilentButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
runFreeresButton = new Button(basicTop, SWT.CHECK);
runFreeresButton.setText(Messages.getString("ValgrindOptionsTab.run_freeres")); //$NON-NLS-1$
runFreeresButton.addSelectionListener(selectListener);
runFreeresButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
private void createOtherOptions(Composite basicTop) {
Composite otherOptionsGroup = new Composite(basicTop, SWT.NONE);
otherOptionsGroup.setLayout(new GridLayout());
otherOptionsGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
Label label = new Label(otherOptionsGroup, SWT.WRAP);
label.setText(Messages.getString("ValgrindOptionsTab.ExtraOptionsLabel")); //$NON-NLS-1$
// Tooltip: Specify any other valgrind options, separated by space. Escaping of spaces is not supported.
label.setToolTipText(Messages.getString("ValgrindOptionsTab.ExtraOptionsTooltip")); //$NON-NLS-1$
otherOptionsText = new Text(otherOptionsGroup, SWT.BORDER);
otherOptionsText.setToolTipText(Messages.getString("ValgrindOptionsTab.ExtraOptionsTooltip")); //$NON-NLS-1$
otherOptionsText.addModifyListener(modifyListener);
otherOptionsText.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
}
private void createErrorOptions(Composite top) {
Group errorGroup = new Group(top, SWT.NONE);
errorGroup.setLayout(new GridLayout());
errorGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
errorGroup.setText(Messages.getString("ValgrindOptionsTab.Error_Options")); //$NON-NLS-1$
Composite errorTop = new Composite(errorGroup, SWT.NONE);
errorTop.setLayout(new GridLayout(2, true));
errorTop.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
demangleButton = new Button(errorTop, SWT.CHECK);
demangleButton.setText(Messages.getString("ValgrindOptionsTab.demangle")); //$NON-NLS-1$
demangleButton.addSelectionListener(selectListener);
demangleButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite numCallersTop = new Composite(errorTop, SWT.NONE);
numCallersTop.setLayout(new GridLayout(2, false));
Label numCallersLabel = new Label(numCallersTop, SWT.NONE);
numCallersLabel.setText(Messages.getString("ValgrindOptionsTab.num_callers")); //$NON-NLS-1$
numCallersSpinner = new Spinner(numCallersTop, SWT.BORDER);
numCallersSpinner.setMaximum(50);
numCallersSpinner.addModifyListener(modifyListener);
numCallersSpinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
errorLimitButton = new Button(errorTop, SWT.CHECK);
errorLimitButton.setText(Messages.getString("ValgrindOptionsTab.limit_errors")); //$NON-NLS-1$
errorLimitButton.addSelectionListener(selectListener);
errorLimitButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
showBelowMainButton = new Button(errorTop, SWT.CHECK);
showBelowMainButton.setText(Messages.getString("ValgrindOptionsTab.show_errors_below_main")); //$NON-NLS-1$
showBelowMainButton.addSelectionListener(selectListener);
showBelowMainButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite maxStackFrameTop = new Composite(errorTop, SWT.NONE);
maxStackFrameTop.setLayout(new GridLayout(2, false));
Label maxStackFrameLabel = new Label(maxStackFrameTop, SWT.NONE);
maxStackFrameLabel.setText(Messages.getString("ValgrindOptionsTab.max_size_of_stack_frame")); //$NON-NLS-1$
maxStackFrameSpinner = new Spinner(maxStackFrameTop, SWT.BORDER);
maxStackFrameSpinner.setMaximum(Integer.MAX_VALUE);
maxStackFrameSpinner.addModifyListener(modifyListener);
maxStackFrameSpinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
//Option only visible for valgrind > 3.4.0
mainStackSizeTop = new Composite(errorTop, SWT.NONE);
GridLayout mainStackSizeLayout = new GridLayout(2, false);
mainStackSizeLayout.marginHeight = mainStackSizeLayout.marginWidth = 0;
mainStackSizeTop.setLayout(mainStackSizeLayout);
mainStackSizeButton = new Button(mainStackSizeTop, SWT.CHECK);
mainStackSizeButton.setText(Messages.getString("ValgrindOptionsTab.Main_stack_size")); //$NON-NLS-1$
mainStackSizeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
checkMainStackEnablement();
updateLaunchConfigurationDialog();
}));
mainStackSizeSpinner = new Spinner(mainStackSizeTop, SWT.BORDER);
mainStackSizeSpinner.setMaximum(Integer.MAX_VALUE);
mainStackSizeSpinner.addModifyListener(modifyListener);
mainStackSizeSpinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mainStackSizeTop.setVisible(false);
//Option only visible for valgrind > 3.6.0
dSymUtilButton = new Button(errorTop, SWT.CHECK);
dSymUtilButton.setText(Messages.getString("ValgrindOptionsTab.dsymutil")); //$NON-NLS-1$
dSymUtilButton.addSelectionListener(selectListener);
dSymUtilButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
dSymUtilButton.setVisible(false);
}
private void updateErrorOptions() {
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
mainStackSizeTop.setVisible(true);
} else {
mainStackSizeTop.setVisible(false);
}
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_6_0) >= 0) {
dSymUtilButton.setVisible(true);
} else {
dSymUtilButton.setVisible(false);
}
}
private void createSuppressionsOption(Composite top) {
Composite browseTop = new Composite(top, SWT.BORDER);
browseTop.setLayout(new GridLayout(2, false));
GridData browseData = new GridData(GridData.FILL_BOTH);
browseTop.setLayoutData(browseData);
Label suppFileLabel = new Label(browseTop, SWT.NONE);
suppFileLabel.setText(Messages.getString("ValgrindOptionsTab.suppressions_file")); //$NON-NLS-1$
createVerticalSpacer(browseTop, 1);
suppFileList = new List(browseTop, SWT.BORDER);
suppFileList.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite buttonTop = new Composite(browseTop, SWT.NONE);
GridLayout buttonLayout = new GridLayout();
buttonLayout.marginWidth = buttonLayout.marginHeight = 0;
buttonTop.setLayout(buttonLayout);
buttonTop.setLayoutData(new GridData(SWT.CENTER, SWT.BEGINNING, false, false));
Button workspaceBrowseButton = createPushButton(buttonTop, Messages.getString("ValgrindOptionsTab.Workspace"), null); //$NON-NLS-1$
workspaceBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
dialog.setTitle(Messages.getString("ValgrindOptionsTab.Select_a_Resource")); //$NON-NLS-1$
dialog.setMessage(Messages.getString("ValgrindOptionsTab.Select_a_Suppressions_File")); //$NON-NLS-1$
dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
if (dialog.open() == IDialogConstants.OK_ID) {
IResource resource = (IResource) dialog.getFirstResult();
String arg = resource.getFullPath().toString();
String fileLoc = VariablesPlugin.getDefault().getStringVariableManager()
.generateVariableExpression("workspace_loc", arg); //$NON-NLS-1$
suppFileList.add(fileLoc);
updateLaunchConfigurationDialog();
}
}));
Button fileBrowseButton = createPushButton(buttonTop, Messages.getString("ValgrindOptionsTab.File_System"), null); //$NON-NLS-1$
fileBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
String filePath = null;
FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
filePath = dialog.open();
if (filePath != null) {
suppFileList.add(filePath);
updateLaunchConfigurationDialog();
}
}));
Button removeButton = createPushButton(buttonTop, Messages.getString("ValgrindOptionsTab.Supp_remove"), null); //$NON-NLS-1$
removeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
int[] selected = suppFileList.getSelectionIndices();
if (selected.length > 0) {
suppFileList.remove(selected);
updateLaunchConfigurationDialog();
}
}));
}
private void handleToolChanged() {
try {
// create dynamicTab
loadDynamicArea();
if (launchConfigurationWorkingCopy == null) {
if (launchConfiguration.isWorkingCopy()) {
launchConfigurationWorkingCopy = (ILaunchConfigurationWorkingCopy) launchConfiguration;
} else {
launchConfigurationWorkingCopy = launchConfiguration.getWorkingCopy();
}
}
// setDefaults called on this tab so call on dynamicTab OR
// user changed tool, not just restoring state
if (initDefaults) {
dynamicTab.setDefaults(launchConfigurationWorkingCopy);
}
initDefaults = false;
dynamicTab.initializeFrom(launchConfigurationWorkingCopy);
// change name of tool TabItem
toolTab.setText(dynamicTab.getName());
optionsFolder.layout(true);
// adjust minimum size for ScrolledComposite
recomputeSize();
} catch (CoreException e) {
ex = e;
}
}
private void loadDynamicArea() throws CoreException {
for (Control child : dynamicTabHolder.getChildren()) {
child.dispose();
}
loadDynamicTab();
if (dynamicTab == null) {
throw new CoreException(new Status(IStatus.ERROR, ValgrindLaunchPlugin.PLUGIN_ID, Messages.getString("ValgrindOptionsTab.No_options_tab_found") + tool)); //$NON-NLS-1$
}
dynamicTab.setLaunchConfigurationDialog(getLaunchConfigurationDialog());
dynamicTab.setValgrindVersion(valgrindVersion);
dynamicTab.createControl(dynamicTabHolder);
dynamicTabHolder.layout(true);
}
private void loadDynamicTab() throws CoreException {
dynamicTab = getToolPage(tool);
}
protected IValgrindToolPage getToolPage(String tool) throws CoreException {
return getPlugin().getToolPage(tool);
}
public IValgrindToolPage getDynamicTab() {
return dynamicTab;
}
private ValgrindLaunchPlugin getPlugin() {
return ValgrindLaunchPlugin.getDefault();
}
@Override
public String getName() {
return Messages.getString("ValgrindOptionsTab.Valgrind_Options"); //$NON-NLS-1$
}
@Override
public Image getImage() {
return ResourceLocator.imageDescriptorFromBundle(ValgrindLaunchPlugin.PLUGIN_ID, "icons/valgrind-icon.png") //$NON-NLS-1$
.get().createImage();
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
isInitializing = true;
getControl().setRedraw(false);
launchConfiguration = configuration;
launchConfigurationWorkingCopy = null;
if (checkVersion) {
try {
IProject project;
try {
project = ConfigUtils.getProject(ConfigUtils.getProjectName(configuration));
} catch (Exception e1) {
// no project is still a possibility the validator handles
project = null;
}
valgrindVersion = getPlugin().getValgrindVersion(project);
} catch (CoreException e) {
ex = e;
}
}
updateErrorOptions();
try {
if (!noToolCombo) {
tool = configuration.getAttribute(LaunchConfigurationConstants.ATTR_TOOL, LaunchConfigurationConstants.DEFAULT_TOOL);
int select = -1;
for (int i = 0; i < tools.length && select < 0; i++) {
if (tool.equals(tools[i])) {
select = i;
}
}
if (select != -1) {
toolsCombo.select(select);
}
}
handleToolChanged();
otherOptionsText.setText(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_EXTRA_OPTIONS, "")); //$NON-NLS-1$
traceChildrenButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_TRACECHILD, LaunchConfigurationConstants.DEFAULT_GENERAL_TRACECHILD));
runFreeresButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_FREERES, LaunchConfigurationConstants.DEFAULT_GENERAL_FREERES));
demangleButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_DEMANGLE, LaunchConfigurationConstants.DEFAULT_GENERAL_DEMANGLE));
numCallersSpinner.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_NUMCALLERS, LaunchConfigurationConstants.DEFAULT_GENERAL_NUMCALLERS));
errorLimitButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_ERRLIMIT, LaunchConfigurationConstants.DEFAULT_GENERAL_ERRLIMIT));
showBelowMainButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_BELOWMAIN, LaunchConfigurationConstants.DEFAULT_GENERAL_BELOWMAIN));
maxStackFrameSpinner.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAXFRAME, LaunchConfigurationConstants.DEFAULT_GENERAL_MAXFRAME));
java.util.List<String> suppFiles = configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_SUPPFILES, LaunchConfigurationConstants.DEFAULT_GENERAL_SUPPFILES);
suppFileList.setItems(suppFiles.toArray(new String[suppFiles.size()]));
// 3.4.0 specific
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
mainStackSizeButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAINSTACK_BOOL, LaunchConfigurationConstants.DEFAULT_GENERAL_MAINSTACK_BOOL));
mainStackSizeSpinner.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAINSTACK, LaunchConfigurationConstants.DEFAULT_GENERAL_MAINSTACK));
checkMainStackEnablement();
}
// 3.6.0 specific
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_6_0) >= 0) {
dSymUtilButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.ATTR_GENERAL_DSYMUTIL, LaunchConfigurationConstants.DEFAULT_GENERAL_DSYMUTIL));
}
} catch (CoreException e) {
ex = e;
}
getControl().setRedraw(true);
isInitializing = false;
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
setErrorMessage(null);
// Try to initialize the dynamic tab for validation
if (dynamicTab == null) {
try {
loadDynamicTab();
} catch (CoreException e) {
// Do nothing
}
}
boolean result = false;
if (ex != null) {
setErrorMessage(ex.getLocalizedMessage());
}
else if (result = isGeneralValid() && dynamicTab != null) {
result = dynamicTab.isValid(launchConfig);
setErrorMessage(dynamicTab.getErrorMessage());
}
return result;
}
private boolean isGeneralValid() {
String[] suppFiles = suppFileList.getItems();
boolean result = true;
for (int i = 0; i < suppFiles.length && result; i++) {
try {
IPath suppfile = getPlugin().parseWSPath(suppFiles[i]);
if (!suppfile.toFile().exists()) {
setErrorMessage(NLS.bind(Messages.getString("ValgrindOptionsTab.suppressions_file_doesnt_exist"), suppFiles[i])); //$NON-NLS-1$
result = false;
}
} catch (CoreException e) {
// should only occur if there's a cycle in variable substitution
e.printStackTrace();
}
}
return result;
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(LaunchConfigurationConstants.ATTR_TOOL, tool);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_TRACECHILD, traceChildrenButton.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_FREERES, runFreeresButton.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_DEMANGLE, demangleButton.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_NUMCALLERS, numCallersSpinner.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_ERRLIMIT, errorLimitButton.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_BELOWMAIN, showBelowMainButton.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAXFRAME, maxStackFrameSpinner.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_SUPPFILES, Arrays.asList(suppFileList.getItems()));
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_EXTRA_OPTIONS, otherOptionsText.getText());
// 3.4.0 specific
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAINSTACK_BOOL, mainStackSizeButton.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAINSTACK, mainStackSizeSpinner.getSelection());
}
// 3.6.0 specific
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_6_0) >= 0) {
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_DSYMUTIL, dSymUtilButton.getSelection());
configuration.setAttribute(LaunchConfigurationConstants.ATTR_FULLPATH_AFTER, LaunchConfigurationConstants.DEFAULT_FULLPATH_AFTER);
}
if (dynamicTab != null) {
dynamicTab.performApply(configuration);
}
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
launchConfigurationWorkingCopy = configuration;
if (noToolCombo)
configuration.setAttribute(LaunchConfigurationConstants.ATTR_TOOL, tool);
else
configuration.setAttribute(LaunchConfigurationConstants.ATTR_TOOL, LaunchConfigurationConstants.DEFAULT_TOOL);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_TRACECHILD, LaunchConfigurationConstants.DEFAULT_GENERAL_TRACECHILD);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_FREERES, LaunchConfigurationConstants.DEFAULT_GENERAL_FREERES);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_DEMANGLE, LaunchConfigurationConstants.DEFAULT_GENERAL_DEMANGLE);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_NUMCALLERS, LaunchConfigurationConstants.DEFAULT_GENERAL_NUMCALLERS);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_ERRLIMIT, LaunchConfigurationConstants.DEFAULT_GENERAL_ERRLIMIT);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_BELOWMAIN, LaunchConfigurationConstants.DEFAULT_GENERAL_BELOWMAIN);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAXFRAME, LaunchConfigurationConstants.DEFAULT_GENERAL_MAXFRAME);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_SUPPFILES, LaunchConfigurationConstants.DEFAULT_GENERAL_SUPPFILES);
// 3.4.0 specific
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAINSTACK_BOOL, LaunchConfigurationConstants.DEFAULT_GENERAL_MAINSTACK_BOOL);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_MAINSTACK, LaunchConfigurationConstants.DEFAULT_GENERAL_MAINSTACK);
}
// 3.6.0 specific
if (valgrindVersion == null || valgrindVersion.compareTo(ValgrindLaunchPlugin.VER_3_6_0) >= 0) {
configuration.setAttribute(LaunchConfigurationConstants.ATTR_GENERAL_DSYMUTIL, LaunchConfigurationConstants.DEFAULT_GENERAL_DSYMUTIL);
configuration.setAttribute(LaunchConfigurationConstants.ATTR_FULLPATH_AFTER, LaunchConfigurationConstants.DEFAULT_FULLPATH_AFTER);
}
if (dynamicTab != null) {
dynamicTab.setDefaults(configuration);
initDefaults = false;
}
}
@Override
public void dispose() {
if (dynamicTab != null) {
dynamicTab.dispose();
}
super.dispose();
}
@Override
protected void updateLaunchConfigurationDialog() {
if (!isInitializing) {
super.updateLaunchConfigurationDialog();
}
}
private void checkMainStackEnablement() {
mainStackSizeSpinner.setEnabled(mainStackSizeButton.getSelection());
}
public Button getTraceChildrenButton() {
return traceChildrenButton;
}
public Button getChildSilentButton() {
return childSilentButton;
}
public Button getRunFreeresButton() {
return runFreeresButton;
}
public Button getDemangleButton() {
return demangleButton;
}
public Spinner getNumCallersSpinner() {
return numCallersSpinner;
}
public Button getErrorLimitButton() {
return errorLimitButton;
}
public Button getShowBelowMainButton() {
return showBelowMainButton;
}
public Spinner getMaxStackFrameSpinner() {
return maxStackFrameSpinner;
}
public Button getMainStackSizeButton() {
return mainStackSizeButton;
}
public Spinner getMainStackSizeSpinner() {
return mainStackSizeSpinner;
}
public List getSuppFileList() {
return suppFileList;
}
public Combo getToolsCombo() {
return toolsCombo;
}
public String[] getTools() {
return tools;
}
public Text getExtraOptionsText() {
return otherOptionsText;
}
}