org.eclipse.cdt.debug.internal.ui.propertypages.CBreakpointPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.debug.internal.ui.propertypages.CBreakpointPropertyPage.java

Source

/*******************************************************************************
 * 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.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()
         */
        protected boolean checkState() {
            Text control = getTextControl();
            if (!control.isEnabled()) {
                clearErrorMessage();
                return true;
            }
            return super.checkState();
        }

        /**
         * Overrode here to be package visible.
         */
        protected void refreshValidState() {
            super.refreshValidState();
        }

        /**
         * Only store if the text control is enabled
         * 
         * @see FieldEditor#doStore()
         */
        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.
         */
        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()
         */
        protected boolean checkState() {
            Text control = getTextControl();
            if (!control.isEnabled()) {
                clearErrorMessage();
                return true;
            }
            return super.checkState();
        }

        protected void doStore() {
            Text text = getTextControl();
            if (text.isEnabled()) {
                super.doStore();
            }
        }

        /**
         * @see FieldEditor#refreshValidState()
         */
        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.
         */
        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()
     */
    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()
     */
    public IAdaptable getElement() {
        return fElement;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
     */
    public void setElement(IAdaptable element) {
        fElement = element;
    }

    public IPreferenceStore getPreferenceStore() {
        return fCBreakpointPreferenceStore;
    }

    public boolean performOk() {
        final List changedProperties = new ArrayList(5);
        getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {

            /**
             * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
             */
            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() {

            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));
                    } 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;
    }
}