package org.python.pydev.debug.ui;
import java.util.List;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
import org.python.pydev.debug.model.PyBreakpoint;
import org.python.pydev.debug.ui.actions.PyBreakpointRulerAction;
import org.python.pydev.shared_ui.editor.BaseEditor;
public class PyToggleTargetAdapter implements IAdapterFactory {
@SuppressWarnings("unchecked")
@Override
public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
if (adaptableObject instanceof ITextEditor && adapterType == IToggleBreakpointsTarget.class) {
ITextEditor iTextEditor = (ITextEditor) adaptableObject;
if (canToggleFor(iTextEditor)) {
return (T) new PyDjangoToggleBreakpointsTarget();
}
return null;
}
return null;
}
public static boolean canToggleFor(ITextEditor iTextEditor) {
if (iTextEditor instanceof BaseEditor) {
IEditorInput editorInput = iTextEditor.getEditorInput();
String name = editorInput.getName();
if (name != null) {
if (name.endsWith(".html") || name.endsWith(".htm") || name.endsWith(".djhtml")) {
//System.err.println("PyToggleTargetAdapter.getAdapter: " + iTextEditor);
return true;
}
}
}
return false;
}
@Override
public Class<?>[] getAdapterList() {
return new Class[] { IToggleBreakpointsTarget.class };
}
}
class PyDjangoToggleBreakpointsTarget implements IToggleBreakpointsTarget, IToggleBreakpointsTargetExtension,
IPyToggleBreakpointsTarget {
PyDjangoToggleBreakpointsTarget() {
}
// --------------- All others point to this 2 methods!
@Override
public void toggleBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
if (part instanceof BaseEditor && selection instanceof TextSelection
&& PyToggleTargetAdapter.canToggleFor((BaseEditor) part)) {
TextSelection textSelection = (TextSelection) selection;
BaseEditor pyEdit = (BaseEditor) part;
int startLine = textSelection.getStartLine();
List<IMarker> markersFromCurrentFile = PyBreakpointRulerAction.getMarkersFromCurrentFile(pyEdit, startLine);
if (markersFromCurrentFile.size() > 0) {
PyBreakpointRulerAction.removeMarkers(markersFromCurrentFile);
} else {
PyBreakpointRulerAction.addBreakpointMarker(pyEdit.getDocument(), startLine + 1, pyEdit,
PyBreakpoint.PY_BREAK_TYPE_DJANGO);
}
}
}
@Override
public boolean canToggleBreakpoints(IWorkbenchPart part, ISelection selection) {
return selection instanceof TextSelection && part instanceof ITextEditor
&& PyToggleTargetAdapter.canToggleFor((ITextEditor) part);
}
@Override
public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
toggleBreakpoints(part, selection);
}
@Override
public boolean canToggleLineBreakpoints(IWorkbenchPart part, ISelection selection) {
return canToggleBreakpoints(part, selection);
}
@Override
public void toggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
toggleBreakpoints(part, selection);
}
@Override
public boolean canToggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) {
return canToggleBreakpoints(part, selection);
}
@Override
public void toggleWatchpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
toggleBreakpoints(part, selection);
}
@Override
public boolean canToggleWatchpoints(IWorkbenchPart part, ISelection selection) {
return canToggleBreakpoints(part, selection);
}
@Override
public void addBreakpointMarker(IDocument document, int line, ITextEditor fTextEditor) {
PyBreakpointRulerAction.addBreakpointMarker(document, line, fTextEditor, PyBreakpoint.PY_BREAK_TYPE_DJANGO);
}
}