/******************************************************************************* * 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.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; /** * 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; /* (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); fTriggerPointButton.setSelection(isTriggerPoint()); fTriggerPointButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { setDirty(PROP_TRIGGER_POINT); } }); } 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()); 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); } 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 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()); DebugPlugin.getDefault().getBreakpointManager().refreshTriggerpointDisplay(); } }