From 08874ccc2e01c0c4a8ffc6dde672b574010ee5c9 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 24 Sep 2014 15:54:12 +0400 Subject: [PATCH] IDEA-130294 Draw line highlighters with no gap to the gutter splitter --- .../editor/impl/EditorGutterComponentImpl.java | 12 ++++++++++++ .../openapi/editor/impl/IterationState.java | 17 +++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java index f773f842f323..f91316cee0c0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java @@ -210,6 +210,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse paintFoldingBackground(g, clip); paintFoldingLines((Graphics2D)g, clip); paintLineMarkers(g, clip, firstVisibleOffset, lastVisibleOffset); + paintEditorBackgrounds(g, clip, firstVisibleOffset, lastVisibleOffset); paintFoldingTree(g, clip, firstVisibleOffset, lastVisibleOffset); paintLineNumbers(g, clip); } @@ -224,6 +225,17 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse } } + private void paintEditorBackgrounds(Graphics g, Rectangle clip, int firstVisibleOffset, int lastVisibleOffset) { + IterationState state = new IterationState(myEditor, firstVisibleOffset, lastVisibleOffset, false, true); + while (!state.atEnd()) { + g.setColor(state.getMergedAttributes().getBackgroundColor()); + int startX = getWhitespaceSeparatorOffset() + 1; + int y = myEditor.visualPositionToXY(myEditor.offsetToVisualPosition(state.getStartOffset())).y; + g.fillRect(startX, y, clip.width - startX, myEditor.getLineHeight()); + state.advance(); + } + } + private void processClose(final MouseEvent e) { final IdeEventQueue queue = IdeEventQueue.getInstance(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java index 7e855923811c..1c88507fbe5a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java @@ -120,6 +120,10 @@ public final class IterationState { private final Color myReadOnlyColor; public IterationState(@NotNull EditorEx editor, int start, int end, boolean useCaretAndSelection) { + this(editor, start, end, useCaretAndSelection, false); + } + + public IterationState(@NotNull EditorEx editor, int start, int end, boolean useCaretAndSelection, boolean useOnlyFullLineHighlighters) { ApplicationManager.getApplication().assertReadAccessAllowed(); myDocument = editor.getDocument(); myStartOffset = start; @@ -173,10 +177,10 @@ public final class IterationState { myCaretRowEnd = caretModel.getVisualLineEnd(); MarkupModelEx editorMarkup = editor.getMarkupModel(); - myView = new HighlighterSweep(editorMarkup, start, myEnd); + myView = new HighlighterSweep(editorMarkup, start, myEnd, useOnlyFullLineHighlighters); final MarkupModelEx docMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(editor.getDocument(), editor.getProject(), true); - myDoc = new HighlighterSweep(docMarkup, start, myEnd); + myDoc = new HighlighterSweep(docMarkup, start, myEnd, useOnlyFullLineHighlighters); myEndOffset = myStartOffset; @@ -188,11 +192,16 @@ public final class IterationState { int i; private final RangeHighlighterEx[] highlighters; - private HighlighterSweep(@NotNull MarkupModelEx markupModel, int start, int end) { + private HighlighterSweep(@NotNull MarkupModelEx markupModel, int start, int end, final boolean onlyFullLine) { // we have to get all highlighters in advance and sort them by affected offsets // since these can be different from the real offsets the highlighters are sorted by in the tree. (See LINES_IN_RANGE perverts) final List list = new ArrayList(); - markupModel.processRangeHighlightersOverlappingWith(start, end, new CommonProcessors.CollectProcessor(list)); + markupModel.processRangeHighlightersOverlappingWith(start, end, new CommonProcessors.CollectProcessor(list) { + @Override + protected boolean accept(RangeHighlighterEx ex) { + return !onlyFullLine || ex.getTargetArea() == HighlighterTargetArea.LINES_IN_RANGE; + } + }); highlighters = list.isEmpty() ? RangeHighlighterEx.EMPTY_ARRAY : list.toArray(new RangeHighlighterEx[list.size()]); Arrays.sort(highlighters, RangeHighlighterEx.BY_AFFECTED_START_OFFSET);