org.chromium.debug.ui/src/org/chromium/debug/ui/propertypages/JsLineBreakpointPage.java
changeset 2 e4420d2515f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.debug.ui/src/org/chromium/debug/ui/propertypages/JsLineBreakpointPage.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,259 @@
+// 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.util.ChromiumDebugPluginUtil;
+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());
+    breakpoint.setIgnoreCount(ignoreCountCheckbox.getSelection()
+        ? Integer.valueOf(ignoreCountText.getText())
+        : -1);
+    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);
+    Integer ignoreCount = getBreakpoint().getIgnoreCount();
+    ignoreCountCheckbox.setSelection(ignoreCount != null);
+    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 != null) {
+      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();
+    int ignoreCount = -1;
+    if (!ChromiumDebugPluginUtil.isInteger(value)) {
+      addErrorMessage(Messages.JavascriptLineBreakpointPage_IgnoreCountErrorMessage);
+      return;
+    }
+    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);
+    }
+  }
+
+  private 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();
+  }
+}