📄 pythonbreakpointpage.java
字号:
package org.python.pydev.debug.ui.propertypages;
import java.text.MessageFormat;
import java.util.ArrayList;
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.core.runtime.IStatus;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommand;
import org.eclipse.ui.commands.ICommandManager;
import org.eclipse.ui.commands.IKeySequenceBinding;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.python.pydev.debug.core.PydevDebugPlugin;
import org.python.pydev.debug.model.PyBreakpoint;
import org.python.pydev.debug.model.PyDebugModelPresentation;
public class PythonBreakpointPage extends PropertyPage {
private Button fEnableConditionButton;
private BreakpointConditionEditor fConditionEditor;
private Label fConditionIsTrue;
private Button fConditionHasChanged;
private Label fSuspendWhenLabel;
// Watchpoint editors
private Button fFieldAccess;
private Button fFieldModification;
// Method breakpoint editors
private Button fMethodEntry;
private Button fMethodExit;
private static final String fgMethodBreakpointError= "Must suspend on method entry or exit";//$NON-NLS-1$
protected Button fEnabledButton;
protected Button fHitCountButton;
protected Button fSuspendThreadButton;
protected Button fSuspendVMButton;
protected Text fHitCountText;
protected List fErrorMessages= new ArrayList();
/**
* Attribute used to indicate that a breakpoint should be deleted
* when cancel is pressed.
*/
public static final String ATTR_DELETE_ON_CANCEL = PyDebugModelPresentation.PY_DEBUG_MODEL_ID + ".ATTR_DELETE_ON_CANCEL"; //$NON-NLS-1$
@Override
protected Control createContents(Composite parent) {
noDefaultAndApplyButton();
Composite mainComposite = createComposite(parent, 1);
createLabels(mainComposite);
try {
createEnabledButton(mainComposite);
//createHitCountEditor(mainComposite);
createTypeSpecificEditors(mainComposite);
//createSuspendPolicyEditor(mainComposite); // Suspend policy is considered uncommon. Add it last.
} catch (CoreException e) {
PydevDebugPlugin.log(IStatus.ERROR,e.getLocalizedMessage(),e);
}
setValid(true);
// if this breakpoint is being created, change the shell title to indicate 'creation'
try {
if (getBreakpoint().getMarker().getAttribute(ATTR_DELETE_ON_CANCEL) != null) {
getShell().addShellListener(new ShellListener() {
public void shellActivated(ShellEvent e) {
Shell shell = (Shell)e.getSource();
shell.setText(MessageFormat.format("Create Breakpoint for {0}", new String[]{getName(getBreakpoint())})); //$NON-NLS-1$
shell.removeShellListener(this);
}
public void shellClosed(ShellEvent e) {
}
public void shellDeactivated(ShellEvent e) {
}
public void shellDeiconified(ShellEvent e) {
}
public void shellIconified(ShellEvent e) {
}
});
}
} catch (CoreException e) {
}
return mainComposite;
}
/**
* Creates a fully configured composite with the given number of columns
* @param parent
* @param numColumns
* @return the configured composite
*/
protected Composite createComposite(Composite parent, int numColumns) {
Composite composit= new Composite(parent, SWT.NONE);
composit.setFont(parent.getFont());
GridLayout layout= new GridLayout();
layout.numColumns= numColumns;
layout.marginWidth= 0;
layout.marginHeight= 0;
composit.setLayout(layout);
composit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
return composit;
}
/**
* Creates a fully configured label with the given text.
* @param parent the parent composite
* @param text the test of the returned label
* @return a fully configured label
*/
protected Label createLabel(Composite parent, String text) {
Label label= new Label(parent, SWT.NONE);
label.setText(text);
label.setFont(parent.getFont());
label.setLayoutData(new GridData());
return label;
}
/**
* Creates the labels displayed for the breakpoint.
* @param parent
*/
protected void createLabels(Composite parent) {
PyBreakpoint breakpoint= (PyBreakpoint) getElement();
Composite labelComposite= createComposite(parent, 2);
String typeName = breakpoint.getFile();
if (typeName != null) {
createLabel(labelComposite, "File"); //$NON-NLS-1$
createLabel(labelComposite, typeName);
}
createTypeSpecificLabels(labelComposite);
}
/**
* Creates the button to toggle enablement of the breakpoint
* @param parent
* @throws CoreException
*/
protected void createEnabledButton(Composite parent) throws CoreException {
fEnabledButton= createCheckButton(parent, "&Enabled"); //$NON-NLS-1$
fEnabledButton.setSelection(getBreakpoint().isEnabled());
}
/**
* Allows subclasses to add type specific labels to the common Java
* breakpoint page.
* @param parent
*/
protected void createTypeSpecificLabels(Composite parent) {
// Line number
PyBreakpoint breakpoint = (PyBreakpoint) getBreakpoint();
StringBuffer lineNumber = new StringBuffer(4);
try {
int lNumber = breakpoint.getLineNumber();
if (lNumber > 0) {
lineNumber.append(lNumber);
}
} catch (CoreException ce) {
PydevDebugPlugin.log(IStatus.ERROR,ce.getLocalizedMessage(),ce);
}
if (lineNumber.length() > 0) {
createLabel(parent, "&Line Number:");
createLabel(parent, lineNumber.toString());
}
// Member
/*
try {
IMember member = BreakpointUtils.getMember(breakpoint);
if (member == null) {
return;
}
String label = PropertyPageMessages.JavaLineBreakpointPage_3; //$NON-NLS-1$
String memberName = fJavaLabelProvider.getText(member);
if (breakpoint instanceof IJavaMethodBreakpoint) {
label = PropertyPageMessages.JavaLineBreakpointPage_4; //$NON-NLS-1$
} else if (breakpoint instanceof IJavaWatchpoint) {
label = PropertyPageMessages.JavaLineBreakpointPage_5; //$NON-NLS-1$
}
createLabel(parent, label);
createLabel(parent, memberName);
} catch (CoreException exception) {
PydevDebugPlugin.log(IStatus.ERROR,e.getLocalizedMessage(),exception);
}*/
}
/**
* Allows subclasses to add type specific editors to the common Java
* breakpoint page.
* @param parent
*/
protected void createTypeSpecificEditors(Composite parent) throws CoreException {
PyBreakpoint breakpoint= (PyBreakpoint) getBreakpoint();
if (breakpoint.supportsCondition()) {
createConditionEditor(parent);
}
}
private void validateMethodBreakpoint() {
if (fEnabledButton.getSelection() && !(fMethodEntry.getSelection() || fMethodExit.getSelection())) {
addErrorMessage(fgMethodBreakpointError);
} else {
removeErrorMessage(fgMethodBreakpointError);
}
}
/**
* Creates a fully configured check button with the given text.
* @param parent the parent composite
* @param text the label of the returned check button
* @return a fully configured check button
*/
protected Button createCheckButton(Composite parent, String text) {
Button button= new Button(parent, SWT.CHECK | SWT.LEFT);
button.setText(text);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -