blob: 5b4bb34f36f16a051ef2a4bc15c0d6ab2d0e5b6b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.debug.internal.ui.propertypages;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ptp.debug.core.model.IPAddressBreakpoint;
import org.eclipse.ptp.debug.core.model.IPBreakpoint;
import org.eclipse.ptp.debug.core.model.IPFunctionBreakpoint;
import org.eclipse.ptp.debug.core.model.IPWatchpoint;
import org.eclipse.ptp.debug.internal.ui.UIDebugManager;
import org.eclipse.ptp.debug.ui.PTPDebugUIPlugin;
import org.eclipse.ptp.ui.model.IElementHandler;
import org.eclipse.ptp.ui.model.IElementSet;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPropertyPage;
/**
* @author clement chu
*
*/
public class PBreakpointPropertyPage extends FieldEditorPreferencePage implements IWorkbenchPropertyPage {
class BreakpointIntegerFieldEditor extends IntegerFieldEditor {
/** Constructor
* @param name
* @param labelText
* @param parent
*/
public BreakpointIntegerFieldEditor(String name, String labelText, Composite parent) {
super(name, labelText, parent);
setErrorMessage(PropertyPageMessages.getString("PBreakpointPropertyPage.0"));
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.StringFieldEditor#checkState()
*/
protected boolean checkState() {
Text control = getTextControl();
if (!control.isEnabled()) {
clearErrorMessage();
return true;
}
return super.checkState();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
*/
protected void refreshValidState() {
super.refreshValidState();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doStore()
*/
protected void doStore() {
Text text = getTextControl();
if (text.isEnabled()) {
super.doStore();
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#clearErrorMessage()
*/
protected void clearErrorMessage() {
if (getPage() != null) {
String message = getPage().getErrorMessage();
if (message != null) {
if (getErrorMessage().equals(message)) {
super.clearErrorMessage();
}
} else {
super.clearErrorMessage();
}
}
}
}
class BreakpointStringFieldEditor extends StringFieldEditor {
/** Constructor
* @param name
* @param labelText
* @param parent
*/
public BreakpointStringFieldEditor(String name, String labelText, Composite parent) {
super(name, labelText, parent);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.StringFieldEditor#checkState()
*/
protected boolean checkState() {
Text control = getTextControl();
if (!control.isEnabled()) {
clearErrorMessage();
return true;
}
return super.checkState();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doStore()
*/
protected void doStore() {
Text text = getTextControl();
if (text.isEnabled()) {
super.doStore();
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
*/
protected void refreshValidState() {
super.refreshValidState();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#clearErrorMessage()
*/
protected void clearErrorMessage() {
if (getPage() != null) {
String message = getPage().getErrorMessage();
if (message != null) {
if (getErrorMessage().equals(message)) {
super.clearErrorMessage();
}
} else {
super.clearErrorMessage();
}
}
}
}
class LabelFieldEditor extends FieldEditor {
private Label titleLabel;
private Label valueLabel;
private Composite basicComposite;
private String value;
private String title;
/** Constructor
* @param parent
* @param title
* @param value
*/
public LabelFieldEditor(Composite parent, String title, String value) {
this.value = value;
this.title = title;
this.createControl(parent);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
*/
protected void adjustForNumColumns(int numColumns) {
((GridData) basicComposite.getLayoutData()).horizontalSpan = numColumns;
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite, int)
*/
protected void doFillIntoGrid(Composite parent, int numColumns) {
basicComposite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.numColumns = 2;
basicComposite.setLayout(layout);
GridData data = new GridData();
data.verticalAlignment = GridData.FILL;
data.horizontalAlignment = GridData.FILL;
basicComposite.setLayoutData(data);
titleLabel = new Label(basicComposite, SWT.NONE);
titleLabel.setText(title);
GridData gd = new GridData();
gd.verticalAlignment = SWT.TOP;
titleLabel.setLayoutData(gd);
valueLabel = new Label(basicComposite, SWT.WRAP);
valueLabel.setText(value);
gd = new GridData();
valueLabel.setLayoutData(gd);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
*/
public int getNumberOfControls() {
return 1;
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doLoad()
*/
protected void doLoad() {}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
*/
protected void doLoadDefault() {}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doStore()
*/
protected void doStore() {}
}
private BooleanFieldEditor enabled;
private BreakpointStringFieldEditor condition;
private Text ignoreCountTextControl;
private BreakpointIntegerFieldEditor ignoreCount;
private IAdaptable element;
private PBreakpointPreferenceStore pBreakpointPreferenceStore;
private UIDebugManager uiDebugManager = null;
/** Constructor
*
*/
public PBreakpointPropertyPage() {
super(GRID);
noDefaultAndApplyButton();
uiDebugManager = PTPDebugUIPlugin.getUIDebugManager();
pBreakpointPreferenceStore = new PBreakpointPreferenceStore();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
*/
protected void createFieldEditors() {
IPBreakpoint breakpoint = getBreakpoint();
try {
createTypeSpecificLabelFieldEditors(breakpoint);
createEnabledField(getFieldEditorParent());
IPreferenceStore store = getPreferenceStore();
String condition = breakpoint.getCondition();
if (condition == null) {
condition = "";
}
store.setValue(PBreakpointPreferenceStore.CONDITION, condition);
createConditionEditor(getFieldEditorParent());
store.setValue(PBreakpointPreferenceStore.ENABLED, breakpoint.isEnabled());
int ignoreCount = breakpoint.getIgnoreCount();
store.setValue(PBreakpointPreferenceStore.IGNORE_COUNT, (ignoreCount >= 0) ? ignoreCount : 0);
createIgnoreCountEditor(getFieldEditorParent());
} catch (CoreException ce) {
PTPDebugUIPlugin.errorDialog(getShell(), "Breakpoint Property Page", "", ce);
}
}
/** Create type specific lable field editors
* @param breakpoint
* @throws CoreException
*/
private void createTypeSpecificLabelFieldEditors(IPBreakpoint breakpoint) throws CoreException {
if (breakpoint instanceof IPFunctionBreakpoint) {
IPFunctionBreakpoint funcBpt = (IPFunctionBreakpoint) breakpoint;
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.18"), PropertyPageMessages.getString("PBreakpointPropertyPage.3")));
String function = funcBpt.getFunction();
if (function != null) {
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.2"), function));
}
} else if (breakpoint instanceof IPAddressBreakpoint) {
IPAddressBreakpoint addrBpt = (IPAddressBreakpoint) breakpoint;
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.18"), PropertyPageMessages.getString("PBreakpointPropertyPage.6")));
String address = addrBpt.getAddress();
if (address != null) {
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.5"), address));
}
} else if (breakpoint instanceof IPWatchpoint) {
IPWatchpoint watchpoint = (IPWatchpoint) breakpoint;
String type = "";
if (watchpoint.isReadType() && !watchpoint.isWriteType())
type = PropertyPageMessages.getString("PBreakpointPropertyPage.11");
else if (!watchpoint.isReadType() && watchpoint.isWriteType())
type = PropertyPageMessages.getString("PBreakpointPropertyPage.12");
else
type = PropertyPageMessages.getString("PBreakpointPropertyPage.13");
String expression = watchpoint.getExpression();
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.18"), type));
String projectName = breakpoint.getMarker().getResource().getLocation().toOSString();
if (projectName != null) {
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.10"), projectName));
}
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.14"), expression));
} else if (breakpoint instanceof ILineBreakpoint) {
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.18"), PropertyPageMessages.getString("PBreakpointPropertyPage.8")));
String fileName = breakpoint.getSourceHandle();
if (fileName != null) {
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.7"), fileName));
}
ILineBreakpoint lineBpt = (ILineBreakpoint) breakpoint;
int lineNumber = lineBpt.getLineNumber();
if (lineNumber > 0) {
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.9"), String.valueOf(lineNumber)));
}
}
// Set
String job_id = breakpoint.getJobId();
String jobName = breakpoint.getJobName();
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.20"), jobName));
String set_id = breakpoint.getSetId();
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.21"), set_id));
//show total number of processes
if (!job_id.equals(IPBreakpoint.GLOBAL)) {
IElementHandler setManager = uiDebugManager.getElementHandler(job_id);
IElementSet elementSet = (IElementSet)setManager.getElementByID(set_id);
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.22"), String.valueOf(elementSet.size())));
String[] setNames = elementSet.getMatchSetIDs();
StringBuffer buffer = new StringBuffer();
for (int i=0; i<setNames.length; i++) {
buffer.append(setNames[i]);
if (i < setNames.length - 1)
buffer.append(",");
}
if (buffer.length() > 0)
addField(createLabelEditor(getFieldEditorParent(), PropertyPageMessages.getString("PBreakpointPropertyPage.23"), buffer.toString()));
}
}
/** Create enabled field
* @param parent
*/
protected void createEnabledField(Composite parent) {
enabled = new BooleanFieldEditor(PBreakpointPreferenceStore.ENABLED, PropertyPageMessages.getString("PBreakpointPropertyPage.19"), parent);
addField(enabled);
}
/** Create condition field
* @param parent
*/
protected void createConditionEditor(Composite parent) {
condition = new BreakpointStringFieldEditor(PBreakpointPreferenceStore.CONDITION, PropertyPageMessages.getString("PBreakpointPropertyPage.15"), parent);
condition.setEmptyStringAllowed(true);
condition.setErrorMessage(PropertyPageMessages.getString("PBreakpointPropertyPage.16"));
addField(condition);
}
/** Create ignore count field
* @param parent
*/
protected void createIgnoreCountEditor(Composite parent) {
ignoreCount = new BreakpointIntegerFieldEditor(PBreakpointPreferenceStore.IGNORE_COUNT, PropertyPageMessages.getString("PBreakpointPropertyPage.17"), parent);
ignoreCount.setValidRange(0, Integer.MAX_VALUE);
ignoreCountTextControl = ignoreCount.getTextControl(parent);
try {
ignoreCountTextControl.setEnabled(getBreakpoint().getIgnoreCount() >= 0);
} catch (CoreException ce) {
PTPDebugUIPlugin.log(ce);
}
addField(ignoreCount);
}
/** Create label field
* @param parent
* @param title
* @param value
* @return
*/
protected FieldEditor createLabelEditor(Composite parent, String title, String value) {
return new LabelFieldEditor(parent, title, value);
}
/** Get breakpoint
* @return
*/
protected IPBreakpoint getBreakpoint() {
IAdaptable element = getElement();
return (element instanceof IPBreakpoint) ? (IPBreakpoint) element : null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPropertyPage#getElement()
*/
public IAdaptable getElement() {
return element;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
*/
public void setElement(IAdaptable element) {
this.element = element;
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#getPreferenceStore()
*/
public IPreferenceStore getPreferenceStore() {
return pBreakpointPreferenceStore;
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/
public boolean performOk() {
final List<String> changedProperties = new ArrayList<String>(5);
getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
changedProperties.add(event.getProperty());
}
});
boolean result = super.performOk();
setBreakpointProperties(changedProperties);
return result;
}
/** Set breakpoint properties
* @param changedProperties
*/
protected void setBreakpointProperties(final List<String> changedProperties) {
IWorkspaceRunnable wr = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
IPBreakpoint breakpoint = getBreakpoint();
Iterator<String> changed = changedProperties.iterator();
while (changed.hasNext()) {
String property = (String) changed.next();
if (property.equals(PBreakpointPreferenceStore.ENABLED)) {
breakpoint.setEnabled(getPreferenceStore().getBoolean(PBreakpointPreferenceStore.ENABLED));
} else if (property.equals(PBreakpointPreferenceStore.IGNORE_COUNT)) {
breakpoint.setIgnoreCount(getPreferenceStore().getInt(PBreakpointPreferenceStore.IGNORE_COUNT));
} else if (property.equals(PBreakpointPreferenceStore.CONDITION)) {
breakpoint.setCondition(getPreferenceStore().getString(PBreakpointPreferenceStore.CONDITION));
}
}
}
};
try {
ResourcesPlugin.getWorkspace().run(wr, null);
} catch (CoreException ce) {
PTPDebugUIPlugin.log(ce);
}
}
}