blob: 9ad2b9782120d6f27ec72973ae431b93609d4361 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2016 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.breakpoints;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.jdt.debug.core.IJavaBreakpoint;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jdt.internal.debug.ui.propertypages.PropertyPageMessages;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
/**
* @since 3.6
*/
public class StandardJavaBreakpointEditor extends AbstractJavaBreakpointEditor {
private IJavaBreakpoint fBreakpoint;
private Button fHitCountButton;
private Text fHitCountText;
private Button fSuspendThread;
private Button fSuspendVM;
protected Button fTriggerPointButton;
protected Button fTriggerPointButtonActive;
/**
* Property id for hit count enabled state.
*/
public static final int PROP_HIT_COUNT_ENABLED = 0x1005;
/**
* Property id for breakpoint hit count.
*/
public static final int PROP_HIT_COUNT = 0x1006;
/**
* Property id for suspend policy.
*/
public static final int PROP_SUSPEND_POLICY = 0x1007;
/**
* Property id for trigger point.
*/
public static final int PROP_TRIGGER_POINT = 0x1008;
/**
* Property id for trigger point active state.
*/
public static final int PROP_TRIGER_POINT_ACTIVE = 0x1009;
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public Control createControl(Composite parent) {
createTriggerPointButton(parent);
return createStandardControls(parent);
}
protected Button createCheckButton(Composite parent, String text) {
return SWTFactory.createCheckButton(parent, text, null, false, 1);
}
/**
* Creates the button to toggle Triggering point property of the breakpoint
*
* @param parent
* the parent composite
*/
protected void createTriggerPointButton(Composite parent) {
Composite composite = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, 0, 0, 0);
fTriggerPointButton = createCheckButton(composite, PropertyPageMessages.JavaBreakpointPage_12);
composite = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, 0, 0, 0);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
gd.horizontalIndent = LayoutUtil.getIndent();
composite.setLayoutData(gd);
fTriggerPointButtonActive = createCheckButton(composite, PropertyPageMessages.JavaBreakpointPage_13);
fTriggerPointButton.setSelection(isTriggerPoint());
fTriggerPointButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
fTriggerPointButtonActive.setEnabled(fTriggerPointButton.getSelection());
fTriggerPointButtonActive.setSelection(fTriggerPointButton.getSelection());
setDirty(PROP_TRIGER_POINT_ACTIVE);
setDirty(PROP_TRIGGER_POINT);
}
});
fTriggerPointButtonActive.setEnabled(fTriggerPointButton.getSelection());
fTriggerPointButtonActive.setSelection(isActiveTriggerPoiint());
fTriggerPointButtonActive.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
setDirty(PROP_TRIGER_POINT_ACTIVE);
}
});
}
protected Control createStandardControls(Composite parent) {
Composite composite = SWTFactory.createComposite(parent, parent.getFont(), 4, 1, 0, 0, 0);
fHitCountButton = SWTFactory.createCheckButton(composite, processMnemonics(PropertyPageMessages.JavaBreakpointPage_4), null, false, 1);
fHitCountButton.setLayoutData(new GridData());
fHitCountButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
boolean enabled = fHitCountButton.getSelection();
fHitCountText.setEnabled(enabled);
if(enabled) {
fHitCountText.setFocus();
}
setDirty(PROP_HIT_COUNT_ENABLED);
}
});
fHitCountText = SWTFactory.createSingleText(composite, 1);
GridData gd = (GridData) fHitCountText.getLayoutData();
gd.minimumWidth = 50;
fHitCountText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
setDirty(PROP_HIT_COUNT);
}
});
SWTFactory.createLabel(composite, "", 1); // spacer //$NON-NLS-1$
Composite radios = SWTFactory.createComposite(composite, composite.getFont(), 2, 1, GridData.FILL_HORIZONTAL, 0, 0);
fSuspendThread = SWTFactory.createRadioButton(radios, processMnemonics(PropertyPageMessages.JavaBreakpointPage_7), 1);
fSuspendThread.setLayoutData(new GridData());
fSuspendVM = SWTFactory.createRadioButton(radios, processMnemonics(PropertyPageMessages.JavaBreakpointPage_8), 1);
fSuspendVM.setLayoutData(new GridData());
fSuspendThread.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setDirty(PROP_SUSPEND_POLICY);
}
});
fSuspendVM.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setDirty(PROP_SUSPEND_POLICY);
}
});
composite.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
dispose();
}
});
return composite;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#setInput(java.lang.Object)
*/
@Override
public void setInput(Object breakpoint) throws CoreException {
try {
suppressPropertyChanges(true);
if (breakpoint instanceof IJavaBreakpoint) {
setBreakpoint((IJavaBreakpoint) breakpoint);
} else {
setBreakpoint(null);
}
} finally {
suppressPropertyChanges(false);
}
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#getInput()
*/
@Override
public Object getInput() {
return fBreakpoint;
}
/**
* Sets the breakpoint to edit. The same editor can be used iteratively for different breakpoints.
*
* @param breakpoint the breakpoint to edit or <code>null</code> if none
* @exception CoreException if unable to access breakpoint attributes
*/
protected void setBreakpoint(IJavaBreakpoint breakpoint) throws CoreException {
fBreakpoint = breakpoint;
boolean enabled = false;
boolean hasHitCount = false;
String text = ""; //$NON-NLS-1$
boolean suspendThread = true;
if (breakpoint != null) {
enabled = true;
int hitCount = breakpoint.getHitCount();
if (hitCount > 0) {
text = new Integer(hitCount).toString();
hasHitCount = true;
}
suspendThread= breakpoint.getSuspendPolicy() == IJavaBreakpoint.SUSPEND_THREAD;
}
fHitCountButton.setEnabled(enabled);
fHitCountButton.setSelection(enabled & hasHitCount);
fHitCountText.setEnabled(hasHitCount);
fHitCountText.setText(text);
fSuspendThread.setEnabled(enabled);
fSuspendVM.setEnabled(enabled);
fSuspendThread.setSelection(suspendThread);
fSuspendVM.setSelection(!suspendThread);
fTriggerPointButton.setEnabled(enabled);
fTriggerPointButton.setSelection(isTriggerPoint());
fTriggerPointButtonActive.setEnabled(enabled);
fTriggerPointButtonActive.setSelection(isActiveTriggerPoiint());
setDirty(false);
}
/**
* Returns the current breakpoint being edited or <code>null</code> if none.
*
* @return breakpoint or <code>null</code>
*/
protected IJavaBreakpoint getBreakpoint() {
return fBreakpoint;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#setFocus()
*/
@Override
public void setFocus() {
// do nothing
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#doSave()
*/
@Override
public void doSave() throws CoreException {
if (fBreakpoint != null) {
int suspendPolicy = IJavaBreakpoint.SUSPEND_THREAD;
if(fSuspendVM.getSelection()) {
suspendPolicy = IJavaBreakpoint.SUSPEND_VM;
}
fBreakpoint.setSuspendPolicy(suspendPolicy);
int hitCount = -1;
if (fHitCountButton.getSelection()) {
try {
hitCount = Integer.parseInt(fHitCountText.getText());
}
catch (NumberFormatException e) {
throw new CoreException(new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, PropertyPageMessages.JavaBreakpointPage_0, e));
}
}
fBreakpoint.setHitCount(hitCount);
storeTriggerPoint(fBreakpoint);
storeTriggerPointActive(fBreakpoint);
}
setDirty(false);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#getStatus()
*/
@Override
public IStatus getStatus() {
if (fHitCountButton.getSelection()) {
String hitCountText= fHitCountText.getText();
int hitCount= -1;
try {
hitCount = Integer.parseInt(hitCountText);
} catch (NumberFormatException e1) {
return new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, PropertyPageMessages.JavaBreakpointPage_0, null);
}
if (hitCount < 1) {
return new Status(IStatus.ERROR, JDIDebugUIPlugin.getUniqueIdentifier(), IStatus.ERROR, PropertyPageMessages.JavaBreakpointPage_0, null);
}
}
return Status.OK_STATUS;
}
/**
* Creates and returns a check box button with the given text.
*
* @param parent parent composite
* @param text label
* @param propId property id to fire on modification
* @return check box
*/
protected Button createSusupendPropertyEditor(Composite parent, String text, final int propId) {
Button button = new Button(parent, SWT.CHECK);
button.setFont(parent.getFont());
button.setText(text);
GridData gd = new GridData(SWT.BEGINNING);
button.setLayoutData(gd);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setDirty(propId);
}
});
return button;
}
private boolean isActiveTriggerPoiint() {
try {
if (getBreakpoint() != null) {
return getBreakpoint().isTriggerPointActive();
}
}
catch (CoreException e) {
e.printStackTrace();
}
return false;
}
private boolean isTriggerPoint() {
try {
if (getBreakpoint() != null) {
return getBreakpoint().isTriggerPoint();
}
}
catch (CoreException e) {
e.printStackTrace();
}
return false;
}
/**
* Stores the value of the trigger point state in the breakpoint manager.
*
* @param breakpoint
* the breakpoint to be compared with trigger point in the workspace
* @throws CoreException
* if an exception occurs while setting the enabled state
*/
private void storeTriggerPoint(IJavaBreakpoint breakpoint) throws CoreException {
boolean oldSelection = breakpoint.isTriggerPoint();
if (oldSelection == fTriggerPointButton.getSelection()) {
return;
}
breakpoint.setTriggerPoint(fTriggerPointButton.getSelection());
}
/**
* Stores the value of the trigger point active state in the breakpoint manager.
*
* @param breakpoint
* the breakpoint to be compared with trigger point in the workspace
* @throws CoreException
* if an exception occurs while setting the enabled state
*/
private void storeTriggerPointActive(IJavaBreakpoint breakpoint) throws CoreException {
boolean oldSelection = breakpoint.isTriggerPointActive();
if (oldSelection == fTriggerPointButtonActive.getSelection()) {
return;
}
breakpoint.setTriggerPointActive(fTriggerPointButtonActive.getSelection());
DebugPlugin.getDefault().getBreakpointManager().refreshTriggerpointDisplay();
}
}