Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/propertypages/CBreakpointPropertyPage.java')
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/propertypages/CBreakpointPropertyPage.java525
1 files changed, 525 insertions, 0 deletions
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/propertypages/CBreakpointPropertyPage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/propertypages/CBreakpointPropertyPage.java
new file mode 100644
index 00000000000..006f98937e8
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/propertypages/CBreakpointPropertyPage.java
@@ -0,0 +1,525 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 QNX Software Systems 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:
+ * QNX Software Systems - Initial API and implementation
+ * Nokia - https://bugs.eclipse.org/bugs/show_bug.cgi?id=145606
+ * QNX Software Systems - Catchpoints support https://bugs.eclipse.org/bugs/show_bug.cgi?id=226689
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.propertypages;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICEventBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
+import org.eclipse.cdt.debug.core.model.ICLineBreakpoint2;
+import org.eclipse.cdt.debug.core.model.ICWatchpoint;
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.cdt.debug.ui.breakpoints.CBreakpointUIContributionFactory;
+import org.eclipse.cdt.debug.ui.breakpoints.ICBreakpointsUIContribution;
+import org.eclipse.cdt.debug.ui.preferences.ReadOnlyFieldEditor;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+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.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+
+/**
+ * The preference page used to present the properties of a breakpoint as preferences. A CBreakpointPreferenceStore is used to interface between this page and
+ * the breakpoint.
+ */
+public class CBreakpointPropertyPage extends FieldEditorPreferencePage implements IWorkbenchPropertyPage {
+
+ class BreakpointIntegerFieldEditor extends IntegerFieldEditor {
+
+ public BreakpointIntegerFieldEditor( String name, String labelText, Composite parent ) {
+ super( name, labelText, parent );
+ setErrorMessage( PropertyPageMessages.getString( "CBreakpointPropertyPage.0" ) ); //$NON-NLS-1$
+ }
+
+ /**
+ * @see IntegerFieldEditor#checkState()
+ */
+ @Override
+ protected boolean checkState() {
+ Text control = getTextControl();
+ if ( !control.isEnabled() ) {
+ clearErrorMessage();
+ return true;
+ }
+ return super.checkState();
+ }
+
+ /**
+ * Overrode here to be package visible.
+ */
+ @Override
+ protected void refreshValidState() {
+ super.refreshValidState();
+ }
+
+ /**
+ * Only store if the text control is enabled
+ *
+ * @see FieldEditor#doStore()
+ */
+ @Override
+ protected void doStore() {
+ Text text = getTextControl();
+ if ( text.isEnabled() ) {
+ super.doStore();
+ }
+ }
+
+ /**
+ * Clears the error message from the message line if the error message is the error message from this field editor.
+ */
+ @Override
+ 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 {
+
+ public BreakpointStringFieldEditor( String name, String labelText, Composite parent ) {
+ super( name, labelText, parent );
+ }
+
+ /**
+ * @see StringFieldEditor#checkState()
+ */
+ @Override
+ protected boolean checkState() {
+ Text control = getTextControl();
+ if ( !control.isEnabled() ) {
+ clearErrorMessage();
+ return true;
+ }
+ return super.checkState();
+ }
+
+ @Override
+ protected void doStore() {
+ Text text = getTextControl();
+ if ( text.isEnabled() ) {
+ super.doStore();
+ }
+ }
+
+ /**
+ * @see FieldEditor#refreshValidState()
+ */
+ @Override
+ protected void refreshValidState() {
+ super.refreshValidState();
+ }
+
+ /**
+ * Clears the error message from the message line if the error message is the error message from this field editor.
+ */
+ @Override
+ 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 ReadOnlyFieldEditor {
+ private String fValue;
+
+ public LabelFieldEditor( Composite parent, String title, String value ) {
+ super(title, title, parent);
+ fValue = value;
+ }
+
+ @Override
+ protected void doLoad() {
+ if (textField != null) {
+ textField.setText(fValue);
+ }
+ }
+ @Override
+ protected void doLoadDefault() {
+ // nothing
+ }
+
+ }
+
+ private BooleanFieldEditor fEnabled;
+
+ private BreakpointStringFieldEditor fCondition;
+
+ private Text fIgnoreCountTextControl;
+
+ private BreakpointIntegerFieldEditor fIgnoreCount;
+
+ private IAdaptable fElement;
+
+ /**
+ * The "fake" preference store used to interface between
+ * the breakpoint and the breakpoint preference page.
+ */
+ private CBreakpointPreferenceStore fCBreakpointPreferenceStore;
+
+ /**
+ * Constructor for CBreakpointPropertyPage.
+ *
+ * @param breakpoint
+ */
+ public CBreakpointPropertyPage() {
+ super( GRID );
+ noDefaultAndApplyButton();
+ fCBreakpointPreferenceStore = new CBreakpointPreferenceStore();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
+ */
+ @Override
+ protected void createFieldEditors() {
+ ICBreakpoint breakpoint = getBreakpoint();
+ createMainLabel(breakpoint);
+ createContributetedFieldEditors(breakpoint);
+ createTypeSpecificLabelFieldEditors( breakpoint );
+ createEnabledField( getFieldEditorParent() );
+ IPreferenceStore store = getPreferenceStore();
+ try {
+ String condition = breakpoint.getCondition();
+ if ( condition == null ) {
+ condition = ""; //$NON-NLS-1$
+ }
+ store.setValue( CBreakpointPreferenceStore.CONDITION, condition );
+ createConditionEditor( getFieldEditorParent() );
+ store.setValue( CBreakpointPreferenceStore.ENABLED, breakpoint.isEnabled() );
+ int ignoreCount = breakpoint.getIgnoreCount();
+ store.setValue( CBreakpointPreferenceStore.IGNORE_COUNT, (ignoreCount >= 0) ? ignoreCount : 0 );
+ createIgnoreCountEditor( getFieldEditorParent() );
+ }
+ catch( CoreException ce ) {
+ CDebugUIPlugin.log( ce );
+ }
+ }
+
+ private void createMainLabel(ICBreakpoint breakpoint) {
+ addField( createLabelEditor( getFieldEditorParent(), PropertyPageMessages.getString( "CBreakpointPropertyPage.18" ), //$NON-NLS-1$
+ getBreakpointMainLabel(breakpoint) ) );
+ }
+
+ /**
+ * Method createTypeSpecificLabelFieldEditors.
+ *
+ * @param breakpoint
+ */
+ private void createTypeSpecificLabelFieldEditors( ICBreakpoint breakpoint ) {
+
+ if ( breakpoint instanceof ICFunctionBreakpoint ) {
+ ICFunctionBreakpoint fbrkpt = (ICFunctionBreakpoint)breakpoint;
+ String function = PropertyPageMessages.getString( "CBreakpointPropertyPage.1" ); //$NON-NLS-1$
+ try {
+ function = fbrkpt.getFunction();
+ }
+ catch( CoreException e ) {
+ }
+ catch( NumberFormatException e ) {
+ }
+ if ( function != null ) {
+ addField( createLabelEditor( getFieldEditorParent(), PropertyPageMessages.getString( "CBreakpointPropertyPage.2" ), function ) ); //$NON-NLS-1$
+ }
+ }
+ else if ( breakpoint instanceof ICAddressBreakpoint ) {
+ ICAddressBreakpoint abrkpt = (ICAddressBreakpoint)breakpoint;
+ String address = PropertyPageMessages.getString( "CBreakpointPropertyPage.4" ); //$NON-NLS-1$
+ try {
+ address = abrkpt.getAddress();
+ }
+ catch( CoreException e ) {
+ }
+ if ( address != null ) {
+ addField( createLabelEditor( getFieldEditorParent(), PropertyPageMessages.getString( "CBreakpointPropertyPage.5" ), address ) ); //$NON-NLS-1$
+ }
+ }
+ else if ( breakpoint instanceof ICWatchpoint ) {
+ ICWatchpoint watchpoint = (ICWatchpoint)breakpoint;
+ String expression = ""; //$NON-NLS-1$
+ try {
+ expression = watchpoint.getExpression();
+ }
+ catch( CoreException ce ) {
+ CDebugUIPlugin.log( ce );
+ }
+ IProject project = breakpoint.getMarker().getResource().getProject();
+ if ( project != null ) {
+ addField( createLabelEditor( getFieldEditorParent(), PropertyPageMessages.getString( "CBreakpointPropertyPage.10" ), project.getName() ) ); //$NON-NLS-1$
+ }
+ IResource resource = breakpoint.getMarker().getResource();
+ if ( resource instanceof IFile ) {
+ String filename = resource.getLocation().toOSString();
+ if ( filename != null ) {
+ addField( createLabelEditor( getFieldEditorParent(), PropertyPageMessages.getString( "CBreakpointPropertyPage.20" ), filename ) ); //$NON-NLS-1$
+ }
+ }
+ addField( createLabelEditor( getFieldEditorParent(), PropertyPageMessages.getString( "CBreakpointPropertyPage.14" ), expression ) ); //$NON-NLS-1$
+ }
+ else if ( breakpoint instanceof ILineBreakpoint ) {
+ String fileName = null;
+ try {
+ fileName = breakpoint.getSourceHandle();
+ }
+ catch( CoreException e ) {
+ }
+ if ( fileName != null ) {
+ addField( createLabelEditor( getFieldEditorParent(), PropertyPageMessages.getString( "CBreakpointPropertyPage.7" ), fileName ) ); //$NON-NLS-1$
+ }
+ ILineBreakpoint lBreakpoint = (ILineBreakpoint) breakpoint;
+
+ int lNumber = 0;
+ try {
+ lNumber = lBreakpoint.getLineNumber();
+ } catch (CoreException e) {
+ CDebugUIPlugin.log(e);
+ }
+
+ if (lNumber > 0) {
+ getPreferenceStore().setValue( CBreakpointPreferenceStore.LINE, lNumber);
+ createLineNumberEditor(getFieldEditorParent());
+ }
+ }
+ }
+
+ private String getBreakpointMainLabel(ICBreakpoint breakpoint) {
+ if (breakpoint instanceof ICFunctionBreakpoint)
+ return PropertyPageMessages.getString("CBreakpointPropertyPage.3"); //$NON-NLS-1$
+ if (breakpoint instanceof ICAddressBreakpoint)
+ return PropertyPageMessages.getString("CBreakpointPropertyPage.4"); //$NON-NLS-1$
+ if (breakpoint instanceof ICLineBreakpoint)
+ return PropertyPageMessages.getString("CBreakpointPropertyPage.8"); //$NON-NLS-1$
+ if (breakpoint instanceof ICEventBreakpoint)
+ return PropertyPageMessages.getString("CBreakpointPropertyPage.21"); //$NON-NLS-1$
+ if (breakpoint instanceof ICWatchpoint) {
+ ICWatchpoint watchpoint = (ICWatchpoint) breakpoint;
+ String type = ""; //$NON-NLS-1$
+ try {
+ if (watchpoint.isReadType() && !watchpoint.isWriteType())
+ type = PropertyPageMessages.getString("CBreakpointPropertyPage.11"); //$NON-NLS-1$
+ else if (!watchpoint.isReadType() && watchpoint.isWriteType())
+ type = PropertyPageMessages.getString("CBreakpointPropertyPage.12"); //$NON-NLS-1$
+ else
+ type = PropertyPageMessages.getString("CBreakpointPropertyPage.13"); //$NON-NLS-1$
+
+ } catch (CoreException ce) {
+ CDebugUIPlugin.log(ce);
+ }
+ return type;
+ }
+ // default main label is the label of marker type for the breakpoint
+ String type = ""; //$NON-NLS-1$
+ try {
+ type = breakpoint.getMarker().getType(); // TODO: how to get label?
+ } catch (CoreException ce) {
+ CDebugUIPlugin.log(ce);
+ }
+ return type;
+ }
+ protected void createLineNumberEditor( Composite parent ) {
+ String title = PropertyPageMessages.getString( "CBreakpointPropertyPage.9" ); //$NON-NLS-1$
+ BreakpointIntegerFieldEditor labelFieldEditor =new BreakpointIntegerFieldEditor( CBreakpointPreferenceStore.LINE ,title, parent);
+ labelFieldEditor.setValidRange( 1, Integer.MAX_VALUE );
+ addField( labelFieldEditor );
+ }
+
+
+ protected void createEnabledField( Composite parent ) {
+ fEnabled = new BooleanFieldEditor( CBreakpointPreferenceStore.ENABLED, PropertyPageMessages.getString( "CBreakpointPropertyPage.19" ), parent ); //$NON-NLS-1$
+ addField( fEnabled );
+ }
+
+ protected void createConditionEditor( Composite parent ) {
+ fCondition = new BreakpointStringFieldEditor( CBreakpointPreferenceStore.CONDITION, PropertyPageMessages.getString( "CBreakpointPropertyPage.15" ), parent ); //$NON-NLS-1$
+ fCondition.setEmptyStringAllowed( true );
+ fCondition.setErrorMessage( PropertyPageMessages.getString( "CBreakpointPropertyPage.16" ) ); //$NON-NLS-1$
+ addField( fCondition );
+ }
+
+ protected void createIgnoreCountEditor( Composite parent ) {
+ fIgnoreCount = new BreakpointIntegerFieldEditor( CBreakpointPreferenceStore.IGNORE_COUNT, PropertyPageMessages.getString( "CBreakpointPropertyPage.17" ), parent ); //$NON-NLS-1$
+ fIgnoreCount.setValidRange( 0, Integer.MAX_VALUE );
+ fIgnoreCountTextControl = fIgnoreCount.getTextControl( parent );
+ try {
+ fIgnoreCountTextControl.setEnabled( getBreakpoint().getIgnoreCount() >= 0 );
+ }
+ catch( CoreException ce ) {
+ CDebugUIPlugin.log( ce );
+ }
+ addField( fIgnoreCount );
+ }
+
+ protected FieldEditor createLabelEditor( Composite parent, String title, String value ) {
+ return new LabelFieldEditor( parent, title, value );
+ }
+
+ protected ICBreakpoint getBreakpoint() {
+ IAdaptable element = getElement();
+ return ( element instanceof ICBreakpoint ) ? (ICBreakpoint)element : (ICBreakpoint)element.getAdapter(ICBreakpoint.class);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchPropertyPage#getElement()
+ */
+ @Override
+ public IAdaptable getElement() {
+ return fElement;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
+ */
+ @Override
+ public void setElement( IAdaptable element ) {
+ fElement = element;
+ }
+
+ @Override
+ public IPreferenceStore getPreferenceStore() {
+ return fCBreakpointPreferenceStore;
+ }
+
+ @Override
+ public boolean performOk() {
+ final List changedProperties = new ArrayList( 5 );
+ getPreferenceStore().addPropertyChangeListener( new IPropertyChangeListener() {
+
+ /**
+ * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+ */
+ @Override
+ public void propertyChange( PropertyChangeEvent event ) {
+ changedProperties.add( event.getProperty() );
+ }
+ } );
+ boolean result = super.performOk();
+ setBreakpointProperties( changedProperties );
+ return result;
+ }
+
+ protected void setBreakpointProperties( final List changedProperties ) {
+ IWorkspaceRunnable wr = new IWorkspaceRunnable() {
+
+ @Override
+ public void run( IProgressMonitor monitor ) throws CoreException {
+ ICBreakpoint breakpoint = getBreakpoint();
+ Iterator changed = changedProperties.iterator();
+ while( changed.hasNext() ) {
+ String property = (String)changed.next();
+ if ( property.equals( CBreakpointPreferenceStore.ENABLED ) ) {
+ breakpoint.setEnabled( getPreferenceStore().getBoolean( CBreakpointPreferenceStore.ENABLED ) );
+ }
+ else if ( property.equals( CBreakpointPreferenceStore.IGNORE_COUNT ) ) {
+ breakpoint.setIgnoreCount( getPreferenceStore().getInt( CBreakpointPreferenceStore.IGNORE_COUNT ) );
+ }
+ else if ( property.equals( CBreakpointPreferenceStore.CONDITION ) ) {
+ breakpoint.setCondition( getPreferenceStore().getString( CBreakpointPreferenceStore.CONDITION ) );
+ }
+ else if ( property.equals( CBreakpointPreferenceStore.LINE ) ) {
+ // already workspace runnable, setting markers are safe
+ breakpoint.getMarker().setAttribute(IMarker.LINE_NUMBER, getPreferenceStore().getInt(CBreakpointPreferenceStore.LINE));
+ breakpoint.getMarker().setAttribute(ICLineBreakpoint2.REQUESTED_LINE, getPreferenceStore().getInt(CBreakpointPreferenceStore.LINE));
+ } else {
+ // this allow set attributes contributed by other plugins
+ String value = getPropertyAsString(property);
+ breakpoint.getMarker().setAttribute(property, value);
+ }
+ }
+ }
+ };
+ try {
+ ResourcesPlugin.getWorkspace().run( wr, null );
+ }
+ catch( CoreException ce ) {
+ CDebugUIPlugin.log( ce );
+ }
+ }
+
+ /**
+ * Creates field editors contributed using breakpointUIContribution extension point
+ * @param breakpoint
+ */
+ private void createContributetedFieldEditors(ICBreakpoint breakpoint) {
+ Composite parent = getFieldEditorParent();
+ try {
+ ICBreakpointsUIContribution cons[] = CBreakpointUIContributionFactory.getInstance()
+ .getBreakpointUIContributions(breakpoint);
+ for (ICBreakpointsUIContribution con : cons) {
+
+ FieldEditor fieldEditor = con.getFieldEditor(con.getId(), con.getLabel()+":", parent); //$NON-NLS-1$
+ if (fieldEditor != null)
+ addField(fieldEditor);
+ Object o = breakpoint.getMarker().getAttribute(con.getId());
+ String value = o==null?"":o.toString(); //$NON-NLS-1$
+ getPreferenceStore().setValue(con.getId(), value);
+ }
+ } catch (CoreException ce) {
+ CDebugUIPlugin.log(ce);
+ }
+
+ }
+
+ /**
+ * Return string value of given property or null.
+ */
+ protected String getPropertyAsString(String property) {
+ // currently only supports String and Integer
+ IPreferenceStore store = getPreferenceStore();
+
+ if (store.contains(property)) {
+ String value = store.getString(property);
+ return value;
+ } else return null;
+ }
+}

Back to the top