diff --git a/platform/platform-api/src/com/intellij/openapi/editor/highlighter/FragmentedEditorHighlighter.java b/platform/platform-api/src/com/intellij/openapi/editor/highlighter/FragmentedEditorHighlighter.java index ee88d769d6ae..489ab120d88c 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/highlighter/FragmentedEditorHighlighter.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/highlighter/FragmentedEditorHighlighter.java @@ -16,6 +16,8 @@ package com.intellij.openapi.editor.highlighter; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.HighlighterColors; +import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.markup.TextAttributes; @@ -36,12 +38,18 @@ public class FragmentedEditorHighlighter implements EditorHighlighter { private final TreeMap myPieces; private final Document myDocument; private final int myAdditionalOffset; + private TextAttributes myUsualAttributes; + private final boolean myMergeByTextAttributes; public FragmentedEditorHighlighter(HighlighterIterator sourceIterator, List ranges) { - this(sourceIterator, ranges, 0); + this(sourceIterator, ranges, 0, false); } - public FragmentedEditorHighlighter(HighlighterIterator sourceIterator, List ranges, final int additionalOffset) { + public FragmentedEditorHighlighter(HighlighterIterator sourceIterator, + List ranges, + final int additionalOffset, + boolean mergeByTextAttributes) { + myMergeByTextAttributes = mergeByTextAttributes; myDocument = sourceIterator.getDocument(); myPieces = new TreeMap(); myAdditionalOffset = additionalOffset; @@ -58,8 +66,23 @@ public class FragmentedEditorHighlighter implements EditorHighlighter { } while (range.getEndOffset() >= iterator.getEnd()) { int relativeStart = iterator.getStart() - range.getStartOffset(); - myPieces.put(offset + relativeStart, new Element(offset + relativeStart, - offset + (iterator.getEnd() - range.getStartOffset()), iterator.getTokenType(), iterator.getTextAttributes())); + boolean merged = false; + if (myMergeByTextAttributes && ! myPieces.isEmpty()) { + final Integer first = myPieces.descendingKeySet().first(); + final Element element = myPieces.get(first); + if (element.getEnd() >= offset + relativeStart && myPieces.get(first).getAttributes().equals(iterator.getTextAttributes())) { + // merge + merged = true; + myPieces.put(element.getStart(), new Element(element.getStart(), + offset + (iterator.getEnd() - range.getStartOffset()), iterator.getTokenType(), + iterator.getTextAttributes())); + } + } + if (! merged) { + myPieces.put(offset + relativeStart, new Element(offset + relativeStart, + offset + (iterator.getEnd() - range.getStartOffset()), iterator.getTokenType(), + iterator.getTextAttributes())); + } iterator.advance(); if (iterator.atEnd()) return; } @@ -152,6 +175,22 @@ public class FragmentedEditorHighlighter implements EditorHighlighter { return myDocument; } } + + private boolean isUsualAttributes(final TextAttributes ta) { + if (myUsualAttributes == null) { + final EditorColorsManager manager = EditorColorsManager.getInstance(); + final EditorColorsScheme[] schemes = manager.getAllSchemes(); + EditorColorsScheme defaultScheme = schemes[0]; + for (EditorColorsScheme scheme : schemes) { + if (manager.isDefaultScheme(scheme)) { + defaultScheme = scheme; + break; + } + } + myUsualAttributes = defaultScheme.getAttributes(HighlighterColors.TEXT); + } + return myUsualAttributes.equals(ta); + } private static class Element { private final int myStart; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/PreparedFragmentedContent.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/PreparedFragmentedContent.java index dc56cb400b9e..7582b10d7c7a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/PreparedFragmentedContent.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/PreparedFragmentedContent.java @@ -316,7 +316,7 @@ public class PreparedFragmentedContent { highlighter.setText(oldDocument.getText()); HighlighterIterator iterator = highlighter.createIterator(ranges.get(0).getBefore().getStartOffset()); FragmentedEditorHighlighter beforeHighlighter = - new FragmentedEditorHighlighter(iterator, getBeforeFragments(), 1); + new FragmentedEditorHighlighter(iterator, getBeforeFragments(), 1, true); setBeforeHighlighter(beforeHighlighter); final EditorHighlighter highlighter1 = @@ -325,7 +325,7 @@ public class PreparedFragmentedContent { highlighter1.setText(document.getText()); HighlighterIterator iterator1 = highlighter1.createIterator(ranges.get(0).getAfter().getStartOffset()); FragmentedEditorHighlighter afterHighlighter = - new FragmentedEditorHighlighter(iterator1, getAfterFragments(), 1); + new FragmentedEditorHighlighter(iterator1, getAfterFragments(), 1, true); setAfterHighlighter(afterHighlighter); }