// 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.util.ChromiumDebugPluginUtil;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Adapter to create breakpoints in JS files.
*/
public abstract class LineBreakpointAdapter implements IToggleBreakpointsTarget {
public static class ForVirtualProject extends LineBreakpointAdapter {
@Override
protected ITextEditor getEditor(IWorkbenchPart part) {
return getEditorStatic(part);
}
public static ITextEditor getEditorStatic(IWorkbenchPart part) {
if (part instanceof ITextEditor) {
ITextEditor editorPart = (ITextEditor) part;
IResource resource = (IResource) editorPart.getEditorInput().getAdapter(IResource.class);
if (resource != null &&
ChromiumDebugPluginUtil.SUPPORTED_EXTENSIONS.contains(resource.getFileExtension())) {
return editorPart;
}
}
return null;
}
@Override
protected String getDebugModelId() {
return VProjectWorkspaceBridge.DEBUG_MODEL_ID;
}
}
public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection)
throws CoreException {
ITextEditor textEditor = getEditor(part);
if (textEditor != null) {
IResource resource = (IResource) textEditor.getEditorInput().getAdapter(IResource.class);
ITextSelection textSelection = (ITextSelection) selection;
int lineNumber = textSelection.getStartLine();
IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(
getDebugModelId());
for (int i = 0; i < breakpoints.length; i++) {
IBreakpoint breakpoint = breakpoints[i];
if (resource.equals(breakpoint.getMarker().getResource())) {
if (((ILineBreakpoint) breakpoint).getLineNumber() == lineNumber + 1) {
// remove
breakpoint.delete();
return;
}
}
}
// Line numbers start with 0 in V8, with 1 in Eclipse.
ChromiumLineBreakpoint lineBreakpoint = new ChromiumLineBreakpoint(resource, lineNumber + 1,
getDebugModelId());
DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(lineBreakpoint);
}
}
public boolean canToggleLineBreakpoints(IWorkbenchPart part, ISelection selection) {
return getEditor(part) != null;
}
/**
* Returns the editor being used to edit a PDA file, associated with the given
* part, or <code>null</code> if none.
* @param part workbench part
* @return the editor being used to edit a PDA file, associated with the given
* part, or <code>null</code> if none
*/
protected abstract ITextEditor getEditor(IWorkbenchPart part);
protected abstract String getDebugModelId();
public void toggleMethodBreakpoints(IWorkbenchPart part, ISelection selection)
throws CoreException {
// TODO(apavlov): Implement method breakpoints if feasible.
}
public boolean canToggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) {
// TODO(apavlov): Implement method breakpoints if feasible.
return true;
}
public void toggleWatchpoints(IWorkbenchPart part, ISelection selection)
throws CoreException {
// TODO(apavlov): Implement watchpoints if feasible.
}
public boolean canToggleWatchpoints(IWorkbenchPart part, ISelection selection) {
// TODO(apavlov): Implement watchpoints if feasible.
return false;
}
}