diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java b/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java index 68f8c3230cbe..5ac08df41882 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffDrawUtil.java @@ -3,6 +3,7 @@ package com.intellij.diff.util; import com.intellij.codeInsight.folding.impl.FoldingUtil; import com.intellij.diff.fragments.DiffFragment; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.EditorColors; @@ -31,6 +32,8 @@ import java.util.List; import static com.intellij.diff.util.DiffUtil.getLineCount; public class DiffDrawUtil { + private static final Logger LOG = Logger.getInstance(DiffDrawUtil.class); + public static final int STRIPE_LAYER = HighlighterLayer.ERROR - 1; public static final int DEFAULT_LAYER = HighlighterLayer.SELECTION - 3; public static final int INLINE_LAYER = HighlighterLayer.SELECTION - 2; @@ -165,7 +168,7 @@ public class DiffDrawUtil { public static int lineToY(@NotNull Editor editor, int line) { Document document = editor.getDocument(); if (line >= getLineCount(document)) { - int y = lineToY(editor, getLineCount(document) - 1); + int y = editor.logicalPositionToXY(editor.offsetToLogicalPosition(document.getTextLength())).y; return y + editor.getLineHeight() * (line - getLineCount(document) + 1); } return editor.logicalPositionToXY(editor.offsetToLogicalPosition(document.getLineStartOffset(line))).y; @@ -237,9 +240,12 @@ public class DiffDrawUtil { int x2 = gutter.getWidth(); int y = r.y; - if (placement == SeparatorPlacement.BOTTOM) y += editor.getLineHeight(); + if (placement == SeparatorPlacement.BOTTOM) { + LOG.warn("BOTTOM gutter line renderers are not supported"); + y += editor.getLineHeight() - 1; + } - drawChunkBorderLine(g2, x1, x2, y - 1, type.getColor(editor), doubleLine, resolved); + drawChunkBorderLine(g2, x1, x2, y, type.getColor(editor), doubleLine, resolved); } @NotNull @@ -323,7 +329,7 @@ public class DiffDrawUtil { @NotNull public static List createLineMarker(@NotNull final Editor editor, int line, @NotNull final TextDiffType type) { if (line == 0) return Collections.emptyList(); - return new LineMarkerBuilder(editor, line - 1, SeparatorPlacement.BOTTOM) + return new LineMarkerBuilder(editor, line, SeparatorPlacement.TOP) .withType(type) .withDefaultRenderer(false) .withDefaultGutterRenderer(false) diff --git a/platform/diff-impl/tests/testData/diff/painting/borderLineMarker.png b/platform/diff-impl/tests/testData/diff/painting/borderLineMarker.png index b3fbf769502a..64986294e8b2 100644 Binary files a/platform/diff-impl/tests/testData/diff/painting/borderLineMarker.png and b/platform/diff-impl/tests/testData/diff/painting/borderLineMarker.png differ diff --git a/platform/diff-impl/tests/testData/diff/painting/emptyRangeLastLineSoftWraps.png b/platform/diff-impl/tests/testData/diff/painting/emptyRangeLastLineSoftWraps.png index d68230c5285a..edb67dee2315 100644 Binary files a/platform/diff-impl/tests/testData/diff/painting/emptyRangeLastLineSoftWraps.png and b/platform/diff-impl/tests/testData/diff/painting/emptyRangeLastLineSoftWraps.png differ diff --git a/platform/diff-impl/tests/testData/diff/painting/lastLineSoftWraps.png b/platform/diff-impl/tests/testData/diff/painting/lastLineSoftWraps.png index e2d2e07998c1..c625d3a47da3 100644 Binary files a/platform/diff-impl/tests/testData/diff/painting/lastLineSoftWraps.png and b/platform/diff-impl/tests/testData/diff/painting/lastLineSoftWraps.png differ diff --git a/platform/diff-impl/tests/testData/diff/painting/lineMarker.png b/platform/diff-impl/tests/testData/diff/painting/lineMarker.png index d9253b610934..65f338d42cd8 100644 Binary files a/platform/diff-impl/tests/testData/diff/painting/lineMarker.png and b/platform/diff-impl/tests/testData/diff/painting/lineMarker.png differ diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java index b2a6fd44a9d7..58474cc90d25 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java @@ -411,12 +411,11 @@ public class EditorPainter implements TextDrawingCallback { if (separatorColor == null && lineSeparatorRenderer == null) { return; } - int line = myDocument.getLineNumber(marker.getLineSeparatorPlacement() == SeparatorPlacement.TOP - ? marker.getStartOffset() - : marker.getEndOffset()); - int visualLine = myView.offsetToVisualLine(myDocument.getLineStartOffset(line), false); - int y = myView.visualLineToY(visualLine) + (marker.getLineSeparatorPlacement() == SeparatorPlacement.TOP ? 0 : myView.getLineHeight()) - - 1 + yShift; + boolean isTop = marker.getLineSeparatorPlacement() == SeparatorPlacement.TOP; + int edgeOffset = isTop ? myDocument.getLineStartOffset(myDocument.getLineNumber(marker.getStartOffset())) + : myDocument.getLineEndOffset(myDocument.getLineNumber(marker.getEndOffset())); + int visualLine = myView.offsetToVisualLine(edgeOffset, !isTop); + int y = myView.visualLineToY(visualLine) + (isTop ? 0 : myView.getLineHeight()) - 1 + yShift; int startX = myCorrector.lineSeparatorStart(clip.x); int endX = myCorrector.lineSeparatorEnd(clip.x + clip.width); g.setColor(separatorColor); diff --git a/platform/platform-tests/testData/editor/painting/softWrapWithWithLineSeparator.png b/platform/platform-tests/testData/editor/painting/softWrapWithWithLineSeparator.png index 79e4f2799d0b..e527324eb0ea 100644 Binary files a/platform/platform-tests/testData/editor/painting/softWrapWithWithLineSeparator.png and b/platform/platform-tests/testData/editor/painting/softWrapWithWithLineSeparator.png differ