org.chromium.debug.ui.propertypages.JsLineBreakpointPage.java Source code

Java tutorial

Introduction

Here is the source code for org.chromium.debug.ui.propertypages.JsLineBreakpointPage.java

Source

// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.debug.ui.propertypages;

import java.util.ArrayList;
import java.util.List;

import org.chromium.debug.core.ChromiumDebugPlugin;
import org.chromium.debug.core.model.ChromiumLineBreakpoint;
import org.chromium.debug.core.model.IgnoreCountData;
import org.chromium.debug.core.util.ChromiumDebugPluginUtil;
import org.chromium.sdk.Breakpoint;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
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.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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.PropertyPage;

/**
 * A JavaScript line breakpoint property page.
 */
public class JsLineBreakpointPage extends PropertyPage {

    private final List<String> errorMessages = new ArrayList<String>(2);

    private Button enabledCheckbox;

    private Button ignoreCountCheckbox;

    private Text ignoreCountText;

    private Button conditionCheckbox;

    private Text conditionText;

    @Override
    protected Control createContents(Composite parent) {
        noDefaultAndApplyButton();
        Composite mainComposite = createComposite(parent, 2, 1);
        try {
            createBreakpointDataControls(mainComposite);
            createInfoControls(mainComposite);
            createEnabledControls(mainComposite);
            createIgnoreCountControls(mainComposite);
            createConditionControls(mainComposite);
        } catch (CoreException e) {
            ChromiumDebugPlugin.log(e);
        }
        setValid(true);
        return mainComposite;
    }

    @Override
    public boolean performOk() {
        IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
            public void run(IProgressMonitor monitor) throws CoreException {
                storePrefs();
            }
        };
        try {
            ResourcesPlugin.getWorkspace().run(runnable, null, 0, null);
        } catch (CoreException e) {
            ChromiumDebugPlugin.log(e);
        }
        return super.performOk();
    }

    private void storePrefs() throws CoreException {
        ChromiumLineBreakpoint breakpoint = getBreakpoint();
        breakpoint.setEnabled(enabledCheckbox.getSelection());
        int ignoreCountValue;
        try {
            ignoreCountValue = Integer.valueOf(ignoreCountText.getText());
        } catch (NumberFormatException e) {
            ignoreCountValue = Breakpoint.EMPTY_VALUE;
        }
        IgnoreCountData.State ignoreCountState = ignoreCountCheckbox.getSelection() ? IgnoreCountData.State.ENABLED
                : IgnoreCountData.State.DISABLED;
        IgnoreCountData ignoreCountData = new IgnoreCountData(ignoreCountValue, ignoreCountState);
        breakpoint.setIgnoreCountData(ignoreCountData);
        String condition = null;
        if (conditionCheckbox.getSelection()) {
            String text = conditionText.getText().trim();
            if (text.length() > 0) {
                condition = text;
            }
        }
        breakpoint.setCondition(condition);
    }

    private void createBreakpointDataControls(Composite mainComposite) {
        // new Label
    }

    private void createInfoControls(Composite parent) {
        Composite infoComposite = createComposite(parent, 2, 2);
        Label resourceLabel = new Label(infoComposite, SWT.NONE);
        resourceLabel.setText(Messages.JsLineBreakpointPage_ResourceLabel);
        Label resourceNameLabel = new Label(infoComposite, SWT.NONE);
        resourceNameLabel.setText(getBreakpoint().getMarker().getResource().getName());

        Label lineNumberLabel = new Label(infoComposite, SWT.NONE);
        lineNumberLabel.setText(Messages.JsLineBreakpointPage_LineNumberLabel);
        Label lineNumberValueLabel = new Label(infoComposite, SWT.NONE);
        String lineNumber = Messages.JsLineBreakpointPage_UnknownLineNumber;
        try {
            lineNumber = String.valueOf(getBreakpoint().getLineNumber());
        } catch (CoreException e) {
            ChromiumDebugPlugin.log(e);
        }
        lineNumberValueLabel.setText(lineNumber);
    }

    private void createEnabledControls(Composite parent) throws CoreException {
        enabledCheckbox = new Button(parent, SWT.CHECK);
        GridData gd = new GridData();
        gd.horizontalSpan = 2;
        enabledCheckbox.setLayoutData(gd);
        enabledCheckbox.setSelection(getBreakpoint().isEnabled());
        enabledCheckbox.setText(Messages.JavascriptLineBreakpointPage_Enabled);
    }

    private void createIgnoreCountControls(Composite parent) throws CoreException {
        ignoreCountCheckbox = new Button(parent, SWT.CHECK);
        IgnoreCountData ignoreCountData = getBreakpoint().getIgnoreCountData();
        int ignoreCount = ignoreCountData.getValue();
        IgnoreCountData.State state = ignoreCountData.getState();
        if (state == IgnoreCountData.State.RESET) {
            state = IgnoreCountData.State.DISABLED;
        }
        ignoreCountCheckbox.setSelection(state == IgnoreCountData.State.ENABLED);
        ignoreCountCheckbox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                ignoreCountText.setEnabled(ignoreCountCheckbox.getSelection());
                ignoreCountChanged();
            }
        });
        ignoreCountCheckbox.setText(Messages.JavascriptLineBreakpointPage_IgnoreCount);
        ignoreCountText = new Text(parent, SWT.SINGLE | SWT.BORDER);
        ignoreCountText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        ignoreCountText.setTextLimit(10);
        ignoreCountText.setEnabled(ignoreCountCheckbox.getSelection());
        if (ignoreCount > 0) {
            ignoreCountText.setText(String.valueOf(ignoreCount));
        }
        ignoreCountText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                ignoreCountChanged();
            }
        });
    }

    private void ignoreCountChanged() {
        boolean isOn = ignoreCountCheckbox.getSelection();
        if (!isOn) {
            removeErrorMessage(Messages.JavascriptLineBreakpointPage_IgnoreCountErrorMessage);
            return;
        }
        String value = ignoreCountText.getText();
        if (!ChromiumDebugPluginUtil.isInteger(value)) {
            addErrorMessage(Messages.JavascriptLineBreakpointPage_IgnoreCountErrorMessage);
            return;
        }
        int ignoreCount = Integer.valueOf(value);
        if (ignoreCount < 1) {
            addErrorMessage(Messages.JavascriptLineBreakpointPage_IgnoreCountErrorMessage);
        } else {
            removeErrorMessage(Messages.JavascriptLineBreakpointPage_IgnoreCountErrorMessage);
        }
    }

    private void addErrorMessage(String message) {
        errorMessages.remove(message);
        errorMessages.add(message);
        setErrorMessage(message);
    }

    private void removeErrorMessage(String message) {
        errorMessages.remove(message);
        if (errorMessages.isEmpty()) {
            setErrorMessage(null);
        } else {
            setErrorMessage(errorMessages.get(errorMessages.size() - 1));
        }
    }

    @Override
    public void setErrorMessage(String newMessage) {
        super.setErrorMessage(newMessage);
        setValid(newMessage == null);
    }

    private void createConditionControls(Composite parent) {
        conditionCheckbox = new Button(parent, SWT.CHECK);
        conditionCheckbox.setSelection(getBreakpoint().getCondition() != null);
        conditionCheckbox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                conditionText.setEnabled(conditionCheckbox.getSelection());
                conditionChanged();
            }
        });
        conditionCheckbox.setText(Messages.JavascriptLineBreakpointPage_EnableCondition);
        GridData gd = new GridData();
        gd.horizontalSpan = 2;
        conditionCheckbox.setLayoutData(gd);
        conditionText = new Text(parent, SWT.MULTI | SWT.BORDER);
        gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
        conditionText.setLayoutData(gd);
        conditionText.setTextLimit(300);
        conditionText.setFont(JFaceResources.getTextFont());
        conditionText.setEnabled(conditionCheckbox.getSelection());
        conditionText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                conditionChanged();
            }
        });
        conditionText.setText(maskNull(getBreakpoint().getCondition()));
    }

    private static String maskNull(String value) {
        return value == null ? "" : value; //$NON-NLS-1$
    }

    private void conditionChanged() {
        boolean isOn = conditionCheckbox.getSelection();
        if (!isOn) {
            removeErrorMessage(Messages.JavascriptLineBreakpointPage_BreakpointConditionErrorMessage);
            return;
        }
        String value = conditionText.getText();
        if (value == null) {
            addErrorMessage(Messages.JavascriptLineBreakpointPage_BreakpointConditionErrorMessage);
        } else {
            removeErrorMessage(Messages.JavascriptLineBreakpointPage_BreakpointConditionErrorMessage);
        }
    }

    static Composite createComposite(Composite parent, int columns, int horizontalSpan) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(columns, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        composite.setLayout(layout);
        composite.setFont(parent.getFont());
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.horizontalSpan = horizontalSpan;
        composite.setLayoutData(gridData);
        return composite;
    }

    protected ChromiumLineBreakpoint getBreakpoint() {
        return (ChromiumLineBreakpoint) getElement();
    }
}