summaryrefslogtreecommitdiff
path: root/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/PreparedFragmentedContent.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/vcs-impl/src/com/intellij/openapi/vcs/changes/PreparedFragmentedContent.java')
-rw-r--r--platform/vcs-impl/src/com/intellij/openapi/vcs/changes/PreparedFragmentedContent.java58
1 files changed, 43 insertions, 15 deletions
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 2c2d0634b709..6e8a1a04d135 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
@@ -18,6 +18,8 @@ package com.intellij.openapi.vcs.changes;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diff.DiffContent;
import com.intellij.openapi.diff.SimpleContent;
+import com.intellij.openapi.diff.impl.DiffHighlighterFactory;
+import com.intellij.openapi.diff.impl.DiffHighlighterFactoryImpl;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.highlighter.*;
@@ -35,6 +37,7 @@ import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsConfiguration;
import com.intellij.openapi.vcs.history.VcsRevisionNumber;
import com.intellij.openapi.vcs.impl.ContentRevisionCache;
+import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.BeforeAfter;
import com.intellij.util.Consumer;
@@ -140,6 +143,9 @@ public class PreparedFragmentedContent {
fragmentedContent.getBefore(), fragmentedContent.getAfter());
// add "artificial" empty lines
+ final Document document = fragmentedContent.getBefore();
+ final Document document1 = fragmentedContent.getAfter();
+
// line starts
BeforeAfter<Integer> lines = new BeforeAfter<Integer>(0, 0);
for (BeforeAfter<TextRange> lineNumbers : expandedRanges) {
@@ -155,7 +161,6 @@ public class PreparedFragmentedContent {
oldConvertor.put(lines.getBefore(), lineNumbers.getBefore().getStartOffset());
newConvertor.put(lines.getAfter(), lineNumbers.getAfter().getStartOffset());
- final Document document = fragmentedContent.getBefore();
if (sbOld.length() > 0) {
sbOld.append('\n');
}
@@ -164,7 +169,6 @@ public class PreparedFragmentedContent {
myBeforeFragments.add(beforeRange);
sbOld.append(document.getText(beforeRange));
- final Document document1 = fragmentedContent.getAfter();
if (sbNew.length() > 0) {
sbNew.append('\n');
}
@@ -180,7 +184,23 @@ public class PreparedFragmentedContent {
myLineRanges.add(new BeforeAfter<Integer>(lines.getBefore() == 0 ? 0 : lines.getBefore() - 1,
lines.getAfter() == 0 ? 0 : lines.getAfter() - 1));
- setHighlighters(fragmentedContent.getBefore(), fragmentedContent.getAfter(), expandedRanges);
+ if (!expandedRanges.isEmpty()) {
+ BeforeAfter<TextRange> last = expandedRanges.get(expandedRanges.size() - 1);
+ if (sbOld.length() > 0) {
+ if (document.getLineEndOffset(last.getBefore().getEndOffset()) != document.getTextLength()) {
+ sbOld.append('\n');
+ oldConvertor.emptyLine(lines.getBefore());
+ }
+ }
+ if (sbNew.length() > 0) {
+ if (document1.getLineEndOffset(last.getAfter().getEndOffset()) != document1.getTextLength()) {
+ sbNew.append('\n');
+ newConvertor.emptyLine(lines.getAfter());
+ }
+ }
+ }
+
+ setHighlighters(fragmentedContent.getBefore(), fragmentedContent.getAfter(), expandedRanges, fragmentedContent);
setTodoHighlighting(fragmentedContent.getBefore(), fragmentedContent.getAfter());
}
});
@@ -323,29 +343,37 @@ public class PreparedFragmentedContent {
}
private void setHighlighters(final Document oldDocument, final Document document,
- List<BeforeAfter<TextRange>> ranges) {
- EditorHighlighterFactory editorHighlighterFactory = EditorHighlighterFactory.getInstance();
- final SyntaxHighlighter syntaxHighlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(myFileType, myProject, null);
- final EditorHighlighter highlighter =
- editorHighlighterFactory.createEditorHighlighter(syntaxHighlighter, EditorColorsManager.getInstance().getGlobalScheme());
-
+ List<BeforeAfter<TextRange>> ranges, FragmentedContent fragmentedContent) {
+ EditorHighlighter highlighter = createHighlighter(fragmentedContent.getFileTypeBefore(),
+ fragmentedContent.getFileBefore(),
+ fragmentedContent.getFileAfter(), myProject).createHighlighter();
highlighter.setEditor(new LightHighlighterClient(oldDocument, myProject));
highlighter.setText(oldDocument.getText());
HighlighterIterator iterator = highlighter.createIterator(ranges.get(0).getBefore().getStartOffset());
- FragmentedEditorHighlighter beforeHighlighter =
- new FragmentedEditorHighlighter(iterator, getBeforeFragments(), 1, true);
+ FragmentedEditorHighlighter beforeHighlighter = new FragmentedEditorHighlighter(iterator, getBeforeFragments(), 1, true);
setBeforeHighlighter(beforeHighlighter);
- final EditorHighlighter highlighter1 =
- editorHighlighterFactory.createEditorHighlighter(syntaxHighlighter, EditorColorsManager.getInstance().getGlobalScheme());
+ EditorHighlighter highlighter1 = createHighlighter(fragmentedContent.getFileTypeAfter(),
+ fragmentedContent.getFileAfter(),
+ fragmentedContent.getFileBefore(), myProject).createHighlighter();
highlighter1.setEditor(new LightHighlighterClient(document, myProject));
highlighter1.setText(document.getText());
HighlighterIterator iterator1 = highlighter1.createIterator(ranges.get(0).getAfter().getStartOffset());
- FragmentedEditorHighlighter afterHighlighter =
- new FragmentedEditorHighlighter(iterator1, getAfterFragments(), 1, true);
+ FragmentedEditorHighlighter afterHighlighter = new FragmentedEditorHighlighter(iterator1, getAfterFragments(), 1, true);
setAfterHighlighter(afterHighlighter);
}
+ private DiffHighlighterFactory createHighlighter(FileType contentType,
+ VirtualFile file,
+ VirtualFile otherFile,
+ Project project) {
+ VirtualFile baseFile = file;
+ if (baseFile == null) baseFile = otherFile;
+ if (contentType == null) contentType = myFileType;
+
+ return new DiffHighlighterFactoryImpl(contentType, baseFile, project);
+ }
+
private void setTodoHighlighting(final Document oldDocument, final Document document) {
final ContentRevisionCache cache = ProjectLevelVcsManager.getInstance(myProject).getContentRevisionCache();
final List<Pair<TextRange,TextAttributes>> beforeTodoRanges = myBeforeNumber == null ? Collections.<Pair<TextRange,TextAttributes>>emptyList() :