/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Elliott Baron <ebaron@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.cachegrind;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.linuxtools.internal.valgrind.launch.LaunchConfigurationConstants;
import org.eclipse.linuxtools.valgrind.launch.IValgrindToolPage;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.osgi.framework.Version;
public class CachegrindToolPage extends AbstractLaunchConfigurationTab
implements IValgrindToolPage {
// Cachegrind controls
private Button cacheButton;
private Button branchButton;
private Spinner i1SizeSpinner;
private Spinner i1AssocSpinner;
private Spinner i1LineSizeSpinner;
private Button i1Button;
private Spinner d1SizeSpinner;
private Spinner d1AssocSpinner;
private Spinner d1LineSizeSpinner;
private Button d1Button;
private Spinner l2SizeSpinner;
private Spinner l2AssocSpinner;
private Spinner l2LineSizeSpinner;
private Button l2Button;
private boolean isInitializing = false;
private SelectionListener selectListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateLaunchConfigurationDialog();
}
};
private ModifyListener modifyListener = e -> updateLaunchConfigurationDialog();
@Override
public void createControl(Composite parent) {
Composite top = new Composite(parent, SWT.NONE);
top.setLayout(new GridLayout());
top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Event options
cacheButton = new Button(top, SWT.CHECK);
cacheButton.setText(Messages.getString("CachegrindToolPage.Profile_Cache")); //$NON-NLS-1$
cacheButton.addSelectionListener(selectListener);
branchButton = new Button(top, SWT.CHECK);
branchButton.setText(Messages.getString("CachegrindToolPage.Profile_Branch")); //$NON-NLS-1$
branchButton.addSelectionListener(selectListener);
createVerticalSpacer(top, 1);
Group cacheGroup = new Group(top, SWT.SHADOW_OUT);
cacheGroup.setLayout(new GridLayout(2, false));
cacheGroup.setText(Messages.getString("CachegrindToolPage.Manually_Set_Cache")); //$NON-NLS-1$
// I1 Cache
i1Button = new Button(cacheGroup, SWT.CHECK);
i1Button.setText(Messages.getString("CachegrindToolPage.I1_Cache")); //$NON-NLS-1$
i1Button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
checkI1Enablement();
updateLaunchConfigurationDialog();
}
});
Composite i1Top = new Composite(cacheGroup, SWT.BORDER);
GridLayout i1Layout = new GridLayout(6, false);
i1Layout.horizontalSpacing = 10;
i1Top.setLayout(i1Layout);
Label i1SizeLabel = new Label(i1Top, SWT.NONE);
i1SizeLabel.setText(Messages.getString("CachegrindToolPage.Size")); //$NON-NLS-1$
i1SizeSpinner = new Spinner(i1Top, SWT.BORDER);
i1SizeSpinner.setMaximum(Integer.MAX_VALUE);
i1SizeSpinner.addModifyListener(modifyListener);
Label i1AssocLabel = new Label(i1Top, SWT.NONE);
i1AssocLabel.setText(Messages.getString("CachegrindToolPage.Assoc")); //$NON-NLS-1$
i1AssocSpinner = new Spinner(i1Top, SWT.BORDER);
i1AssocSpinner.setMaximum(Integer.MAX_VALUE);
i1AssocSpinner.addModifyListener(modifyListener);
Label i1LineSizeLabel = new Label(i1Top, SWT.NONE);
i1LineSizeLabel.setText(Messages.getString("CachegrindToolPage.Line_Size")); //$NON-NLS-1$
i1LineSizeSpinner = new Spinner(i1Top, SWT.BORDER);
i1LineSizeSpinner.setMaximum(Integer.MAX_VALUE);
i1LineSizeSpinner.addModifyListener(modifyListener);
// D1 Cache
d1Button = new Button(cacheGroup, SWT.CHECK);
d1Button.setText(Messages.getString("CachegrindToolPage.D1_Cache")); //$NON-NLS-1$
d1Button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
checkD1Enablement();
updateLaunchConfigurationDialog();
}
});
Composite d1Top = new Composite(cacheGroup, SWT.BORDER);
GridLayout d1Layout = new GridLayout(6, false);
d1Layout.horizontalSpacing = 10;
d1Top.setLayout(d1Layout);
Label d1SizeLabel = new Label(d1Top, SWT.NONE);
d1SizeLabel.setText(Messages.getString("CachegrindToolPage.Size")); //$NON-NLS-1$
d1SizeSpinner = new Spinner(d1Top, SWT.BORDER);
d1SizeSpinner.setMaximum(Integer.MAX_VALUE);
d1SizeSpinner.addModifyListener(modifyListener);
Label d1AssocLabel = new Label(d1Top, SWT.NONE);
d1AssocLabel.setText(Messages.getString("CachegrindToolPage.Assoc")); //$NON-NLS-1$
d1AssocSpinner = new Spinner(d1Top, SWT.BORDER);
d1AssocSpinner.setMaximum(Integer.MAX_VALUE);
d1AssocSpinner.addModifyListener(modifyListener);
Label d1LineSizeLabel = new Label(d1Top, SWT.NONE);
d1LineSizeLabel.setText(Messages.getString("CachegrindToolPage.Line_Size")); //$NON-NLS-1$
d1LineSizeSpinner = new Spinner(d1Top, SWT.BORDER);
d1LineSizeSpinner.setMaximum(Integer.MAX_VALUE);
d1LineSizeSpinner.addModifyListener(modifyListener);
// D1 Cache
l2Button = new Button(cacheGroup, SWT.CHECK);
l2Button.setText(Messages.getString("CachegrindToolPage.L2_Cache")); //$NON-NLS-1$
l2Button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
checkL2Enablement();
updateLaunchConfigurationDialog();
}
});
Composite l2Top = new Composite(cacheGroup, SWT.BORDER);
GridLayout l2Layout = new GridLayout(6, false);
l2Layout.horizontalSpacing = 10;
l2Top.setLayout(l2Layout);
Label l2SizeLabel = new Label(l2Top, SWT.NONE);
l2SizeLabel.setText(Messages.getString("CachegrindToolPage.Size")); //$NON-NLS-1$
l2SizeSpinner = new Spinner(l2Top, SWT.BORDER);
l2SizeSpinner.setMaximum(Integer.MAX_VALUE);
l2SizeSpinner.addModifyListener(modifyListener);
Label l2AssocLabel = new Label(l2Top, SWT.NONE);
l2AssocLabel.setText(Messages.getString("CachegrindToolPage.Assoc")); //$NON-NLS-1$
l2AssocSpinner = new Spinner(l2Top, SWT.BORDER);
l2AssocSpinner.setMaximum(Integer.MAX_VALUE);
l2AssocSpinner.addModifyListener(modifyListener);
Label l2LineSizeLabel = new Label(l2Top, SWT.NONE);
l2LineSizeLabel.setText(Messages.getString("CachegrindToolPage.Line_Size")); //$NON-NLS-1$
l2LineSizeSpinner = new Spinner(l2Top, SWT.BORDER);
l2LineSizeSpinner.setMaximum(Integer.MAX_VALUE);
l2LineSizeSpinner.addModifyListener(modifyListener);
}
@Override
public String getName() {
return Messages.getString("CachegrindToolPage.Cachegrind_Options"); //$NON-NLS-1$
}
@Override
public void initializeFrom(ILaunchConfiguration config) {
isInitializing = true;
try
{
cacheButton.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_CACHE_SIM, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_CACHE_SIM));
branchButton.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_BRANCH_SIM, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_BRANCH_SIM));
i1Button.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1));
i1SizeSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_SIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1_SIZE));
i1AssocSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_ASSOC, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1_ASSOC));
i1LineSizeSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_LSIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1_LSIZE));
checkI1Enablement();
d1Button.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1));
d1SizeSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_SIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1_SIZE));
d1AssocSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_ASSOC, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1_ASSOC));
d1LineSizeSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_LSIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1_LSIZE));
checkD1Enablement();
l2Button.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2));
l2SizeSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_SIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2_SIZE));
l2AssocSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_ASSOC, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2_ASSOC));
l2LineSizeSpinner.setSelection(config.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_LSIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2_LSIZE));
checkL2Enablement();
} catch (CoreException e) {
e.printStackTrace();
}
isInitializing = false;
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy config) {
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_CACHE_SIM, cacheButton.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_BRANCH_SIM, branchButton.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1, i1Button.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_SIZE, i1SizeSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_ASSOC, i1AssocSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_LSIZE, i1LineSizeSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1, d1Button.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_SIZE, d1SizeSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_ASSOC, d1AssocSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_LSIZE, d1LineSizeSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2, l2Button.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_SIZE, l2SizeSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_ASSOC, l2AssocSpinner.getSelection());
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_LSIZE, l2LineSizeSpinner.getSelection());
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy config) {
config.setAttribute(LaunchConfigurationConstants.ATTR_TOOL, CachegrindPlugin.TOOL_ID);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_CACHE_SIM, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_CACHE_SIM);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_BRANCH_SIM, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_BRANCH_SIM);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_SIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1_SIZE);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_ASSOC, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1_ASSOC);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_I1_LSIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_I1_LSIZE);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_SIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1_SIZE);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_ASSOC, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1_ASSOC);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_D1_LSIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_D1_LSIZE);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_SIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2_SIZE);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_ASSOC, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2_ASSOC);
config.setAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_L2_LSIZE, CachegrindLaunchConstants.DEFAULT_CACHEGRIND_L2_LSIZE);
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
setErrorMessage(null);
boolean result = false;
try {
result = launchConfig.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_CACHE_SIM, true)
|| launchConfig.getAttribute(CachegrindLaunchConstants.ATTR_CACHEGRIND_BRANCH_SIM, false);
} catch (CoreException e) {
e.printStackTrace();
}
if (!result) {
setErrorMessage(Messages.getString("CachegrindToolPage.At_least_one_of")); //$NON-NLS-1$
}
return result;
}
@Override
public void setValgrindVersion(Version ver) {
// Not used
}
@Override
protected void updateLaunchConfigurationDialog() {
if (!isInitializing) {
super.updateLaunchConfigurationDialog();
}
}
private void checkI1Enablement() {
boolean checked = i1Button.getSelection();
i1SizeSpinner.setEnabled(checked);
i1AssocSpinner.setEnabled(checked);
i1LineSizeSpinner.setEnabled(checked);
}
private void checkD1Enablement() {
boolean checked = d1Button.getSelection();
d1SizeSpinner.setEnabled(checked);
d1AssocSpinner.setEnabled(checked);
d1LineSizeSpinner.setEnabled(checked);
}
private void checkL2Enablement() {
boolean checked = l2Button.getSelection();
l2SizeSpinner.setEnabled(checked);
l2AssocSpinner.setEnabled(checked);
l2LineSizeSpinner.setEnabled(checked);
}
public Button getCacheButton() {
return cacheButton;
}
public Button getBranchButton() {
return branchButton;
}
public Spinner getI1SizeSpinner() {
return i1SizeSpinner;
}
public Spinner getI1AssocSpinner() {
return i1AssocSpinner;
}
public Spinner getI1LineSizeSpinner() {
return i1LineSizeSpinner;
}
public Button getI1Button() {
return i1Button;
}
public Spinner getD1SizeSpinner() {
return d1SizeSpinner;
}
public Spinner getD1AssocSpinner() {
return d1AssocSpinner;
}
public Spinner getD1LineSizeSpinner() {
return d1LineSizeSpinner;
}
public Button getD1Button() {
return d1Button;
}
public Spinner getL2SizeSpinner() {
return l2SizeSpinner;
}
public Spinner getL2AssocSpinner() {
return l2AssocSpinner;
}
public Spinner getL2LineSizeSpinner() {
return l2LineSizeSpinner;
}
public Button getL2Button() {
return l2Button;
}
}