import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointVariantsProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.java.debugger.breakpoints.properties.JavaBreakpointProperties;
import org.jetbrains.java.debugger.breakpoints.properties.JavaLineBreakpointProperties;
import javax.swing.*;
* Base class for java line-connected exceptions (line, method, field)
* @author egor
*/
-public class JavaLineBreakpointType extends JavaLineBreakpointTypeBase<JavaBreakpointProperties>
+public class JavaLineBreakpointType extends JavaLineBreakpointTypeBase<JavaLineBreakpointProperties>
implements JavaBreakpointType, XLineBreakpointVariantsProvider<JavaLineBreakpointType.JavaBreakpointVariant> {
public JavaLineBreakpointType() {
super("java-line", DebuggerBundle.message("line.breakpoints.tab.title"));
}
@Override
- public List<XBreakpointGroupingRule<XLineBreakpoint<JavaBreakpointProperties>, ?>> getGroupingRules() {
+ public List<XBreakpointGroupingRule<XLineBreakpoint<JavaLineBreakpointProperties>, ?>> getGroupingRules() {
return XDebuggerUtil.getInstance().getGroupingByFileRuleAsList();
}
return properties;
}
}
+
+ @Nullable
+ @Override
+ public TextRange getHighlightRange(JavaLineBreakpointProperties properties, Document document, Project project) {
+ Integer offset = properties.getOffset();
+ if (offset != null) {
+ PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(document);
+ if (file != null) {
+ PsiElement elem = file.findElementAt(offset);
+ NavigatablePsiElement method = PsiTreeUtil.getParentOfType(elem, PsiMethod.class, PsiLambdaExpression.class);
+ if (method != null) {
+ return method.getTextRange();
+ }
+ }
+ }
+ return null;
+ }
}
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.ex.DocumentEx;
+import com.intellij.openapi.util.TextRange;
import org.jetbrains.annotations.NotNull;
/**
int lineNumber = document.getLineNumber(offset);
return document.getLineStartOffset(lineNumber);
}
+
+ @NotNull
+ public static TextRange getLineTextRange(@NotNull Document document, int line) {
+ return TextRange.create(document.getLineStartOffset(line), document.getLineEndOffset(line));
+ }
}
/*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import com.intellij.openapi.editor.ex.MarkupModelEx;
import com.intellij.openapi.editor.ex.RangeHighlighterEx;
import com.intellij.openapi.editor.impl.DocumentMarkupModel;
-import com.intellij.openapi.editor.markup.GutterDraggableObject;
-import com.intellij.openapi.editor.markup.MarkupEditorFilterFactory;
-import com.intellij.openapi.editor.markup.RangeHighlighter;
-import com.intellij.openapi.editor.markup.TextAttributes;
+import com.intellij.openapi.editor.markup.*;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
/**
* @author nik
*/
-public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreakpointBase<XLineBreakpoint<P>, P, LineBreakpointState<P>> implements XLineBreakpoint<P> {
- @Nullable private RangeHighlighterEx myHighlighter;
+public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreakpointBase<XLineBreakpoint<P>, P, LineBreakpointState<P>>
+ implements XLineBreakpoint<P> {
+ @Nullable private RangeHighlighter myHighlighter;
private final XLineBreakpointType<P> myType;
private XSourcePosition mySourcePosition;
private boolean myDisposed;
EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme();
TextAttributes attributes = scheme.getAttributes(DebuggerColors.BREAKPOINT_ATTRIBUTES);
- RangeHighlighterEx highlighter = myHighlighter;
+ RangeHighlighter highlighter = myHighlighter;
if (highlighter != null &&
(!highlighter.isValid()
|| !DocumentUtil.isValidOffset(highlighter.getStartOffset(), document)
MarkupModelEx markupModel;
if (highlighter == null) {
markupModel = (MarkupModelEx)DocumentMarkupModel.forDocument(document, getProject(), true);
- highlighter = markupModel.addPersistentLineHighlighter(getLine(), DebuggerColors.BREAKPOINT_HIGHLIGHTER_LAYER, attributes);
+ TextRange range = myType.getHighlightRange(getProperties(), document, getProject());
+ if (range != null && !range.isEmpty()) {
+ range = range.intersection(DocumentUtil.getLineTextRange(document, getLine()));
+ if (range != null && !range.isEmpty()) {
+ highlighter = markupModel.addRangeHighlighter(range.getStartOffset(), range.getEndOffset(),
+ DebuggerColors.BREAKPOINT_HIGHLIGHTER_LAYER, attributes,
+ HighlighterTargetArea.EXACT_RANGE);
+ }
+ }
+ if (highlighter == null) {
+ highlighter = markupModel.addPersistentLineHighlighter(getLine(), DebuggerColors.BREAKPOINT_HIGHLIGHTER_LAYER, attributes);
+ }
if (highlighter == null) {
return;
}
markupModel = (MarkupModelEx)DocumentMarkupModel.forDocument(document, getProject(), false);
if (markupModel != null) {
// renderersChanged false - we don't change gutter size
- markupModel.fireAttributesChanged(highlighter, false);
+ markupModel.fireAttributesChanged((RangeHighlighterEx)highlighter, false);
}
}
}
}
private boolean canMoveTo(int line, VirtualFile file) {
- return file != null && myType.canPutAt(file, line, getProject()) && getBreakpointManager().findBreakpointAtLine(myType, file, line) == null;
+ return file != null &&
+ myType.canPutAt(file, line, getProject()) &&
+ getBreakpointManager().findBreakpointAtLine(myType, file, line) == null;
}
public void updatePosition() {