org.chromium.debug.core/src/org/chromium/debug/core/model/ChromiumLineBreakpoint.java
changeset 2 e4420d2515f1
child 52 f577ea64429e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/ChromiumLineBreakpoint.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,124 @@
+// 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.core.model;
+
+import org.chromium.debug.core.ChromiumDebugPlugin;
+import org.chromium.sdk.Breakpoint;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.LineBreakpoint;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * JavaScript line breakpoint.
+ */
+public class ChromiumLineBreakpoint extends LineBreakpoint {
+
+  /** Ignore count */
+  private static final String IGNORE_COUNT_ATTR = ChromiumDebugPlugin.PLUGIN_ID + ".ignoreCount"; //$NON-NLS-1$
+
+  /** Condition */
+  private static final String CONDITION_ATTR = ChromiumDebugPlugin.PLUGIN_ID + ".condition"; //$NON-NLS-1$
+
+  private Breakpoint browserBreakpoint;
+
+  /**
+   * Default constructor is required for the breakpoint manager to re-create
+   * persisted breakpoints. After instantiating a breakpoint, the setMarker
+   * method is called to restore this breakpoint's attributes.
+   */
+  // FIXME(apavlov): now this does not restore the browserBreakpoint value
+  public ChromiumLineBreakpoint() {
+  }
+
+  public void setBreakpoint(Breakpoint breakpoint) {
+    this.browserBreakpoint = breakpoint;
+  }
+
+  public Breakpoint getBrowserBreakpoint() {
+    return browserBreakpoint;
+  }
+
+  /**
+   * Constructs a line breakpoint on the given resource at the given line number
+   * (line number is 1-based).
+   *
+   * @param resource file on which to set the breakpoint
+   * @param lineNumber 1-based line number of the breakpoint
+   * @throws CoreException if unable to create the breakpoint
+   */
+  public ChromiumLineBreakpoint(final IResource resource, final int lineNumber)
+      throws CoreException {
+    IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+      public void run(IProgressMonitor monitor) throws CoreException {
+        IMarker marker = resource.createMarker(ChromiumDebugPlugin.BP_MARKER);
+        setMarker(marker);
+        marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE);
+        marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
+        marker.setAttribute(IBreakpoint.ID, getModelIdentifier());
+        marker.setAttribute(IMarker.MESSAGE, NLS.bind(
+            Messages.JsLineBreakpoint_MessageMarkerFormat, resource.getName(), lineNumber));
+      }
+    };
+    run(getMarkerRule(resource), runnable);
+  }
+
+  @Override
+  public boolean isEnabled() {
+    try {
+      return super.isEnabled();
+    } catch (CoreException e) {
+      ChromiumDebugPlugin.log(e);
+      return false;
+    }
+  }
+
+  public void setIgnoreCount(int ignoreCount) {
+    setMarkerAttribute(IGNORE_COUNT_ATTR, ignoreCount);
+  }
+
+  private void setMarkerAttribute(String attributeName, Object value) {
+    try {
+      setAttribute(attributeName, value);
+    } catch (CoreException e) {
+      ChromiumDebugPlugin.log(e);
+    }
+  }
+
+  public int getIgnoreCount() {
+    return getMarker().getAttribute(IGNORE_COUNT_ATTR, Breakpoint.EMPTY_VALUE);
+  }
+
+  public void setCondition(String condition) throws CoreException {
+    setMarkerAttribute(CONDITION_ATTR, condition);
+  }
+
+  public String getCondition() {
+    return getMarker().getAttribute(CONDITION_ATTR, null);
+  }
+
+  public String getModelIdentifier() {
+    return ChromiumDebugPlugin.DEBUG_MODEL_ID;
+  }
+
+  public void changed() {
+    if (browserBreakpoint != null) {
+      browserBreakpoint.setCondition(getCondition());
+      browserBreakpoint.setEnabled(isEnabled());
+      browserBreakpoint.setIgnoreCount(getIgnoreCount());
+      browserBreakpoint.flush(null);
+    }
+  }
+
+  public void clear() {
+    if (browserBreakpoint != null) {
+      browserBreakpoint.clear(null);
+    }
+  }
+}