This commit is contained in:
Alexey Kudravtsev
2012-03-13 12:18:42 +04:00
parent e21d5d9ebb
commit 5869911b40
2 changed files with 69 additions and 57 deletions
@@ -141,6 +141,7 @@ public abstract class LightPlatformCodeInsightTestCase extends LightPlatformTest
*/
protected static void configureFromFileText(@NonNls final String fileName, @NonNls final String fileText) throws IOException {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
final Document fakeDocument = new DocumentImpl(fileText);
@@ -332,6 +333,7 @@ public abstract class LightPlatformCodeInsightTestCase extends LightPlatformTest
bringRealEditorBack();
PsiDocumentManager.getInstance(getProject()).commitAllDocuments();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
final Document document = EditorFactory.getInstance().createDocument(fileText);
@@ -574,10 +576,15 @@ public abstract class LightPlatformCodeInsightTestCase extends LightPlatformTest
new CommentByLineCommentHandler().invoke(getProject(), getEditor(), getFile());
}
private static void doAction(@NotNull String actionId) {
EditorActionManager actionManager = EditorActionManager.getInstance();
EditorActionHandler actionHandler = actionManager.getActionHandler(actionId);
actionHandler.execute(getEditor(), DataManager.getInstance().getDataContext());
private static void doAction(@NotNull final String actionId) {
CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() {
@Override
public void run() {
EditorActionManager actionManager = EditorActionManager.getInstance();
EditorActionHandler actionHandler = actionManager.getActionHandler(actionId);
actionHandler.execute(getEditor(), DataManager.getInstance().getDataContext());
}
}, "", null);
}
protected static DataContext getCurrentEditorDataContext() {
@@ -15,6 +15,7 @@
*/
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.editor.Document;
@@ -32,7 +33,6 @@ 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.vcs.impl.ProjectLevelVcsManagerImpl;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.BeforeAfter;
import com.intellij.util.Consumer;
@@ -108,55 +108,60 @@ public class PreparedFragmentedContent {
}
private void fromFragmentedContent(final FragmentedContent fragmentedContent) {
myOneSide = fragmentedContent.isOneSide();
myIsAddition = fragmentedContent.isAddition();
List<BeforeAfter<TextRange>> expandedRanges =
expand(fragmentedContent.getRanges(), VcsConfiguration.getInstance(myProject).SHORT_DIFF_EXTRA_LINES,
fragmentedContent.getBefore(), fragmentedContent.getAfter());
// add "artificial" empty lines
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
myOneSide = fragmentedContent.isOneSide();
myIsAddition = fragmentedContent.isAddition();
List<BeforeAfter<TextRange>> expandedRanges =
expand(fragmentedContent.getRanges(), VcsConfiguration.getInstance(myProject).SHORT_DIFF_EXTRA_LINES,
fragmentedContent.getBefore(), fragmentedContent.getAfter());
// add "artificial" empty lines
// line starts
BeforeAfter<Integer> lines = new BeforeAfter<Integer>(0,0);
for (BeforeAfter<TextRange> lineNumbers : expandedRanges) {
if (lines.getBefore() > 0 || lines.getAfter() > 0) {
oldConvertor.emptyLine(lines.getBefore());
newConvertor.emptyLine(lines.getAfter());
lines = new BeforeAfter<Integer>(lines.getBefore() + 1, lines.getAfter() + 1);
sbOld.append('\n');
sbNew.append('\n');
// line starts
BeforeAfter<Integer> lines = new BeforeAfter<Integer>(0, 0);
for (BeforeAfter<TextRange> lineNumbers : expandedRanges) {
if (lines.getBefore() > 0 || lines.getAfter() > 0) {
oldConvertor.emptyLine(lines.getBefore());
newConvertor.emptyLine(lines.getAfter());
lines = new BeforeAfter<Integer>(lines.getBefore() + 1, lines.getAfter() + 1);
sbOld.append('\n');
sbNew.append('\n');
}
myLineRanges.add(lines);
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');
}
final TextRange beforeRange = new TextRange(document.getLineStartOffset(lineNumbers.getBefore().getStartOffset()),
document.getLineEndOffset(lineNumbers.getBefore().getEndOffset()));
myBeforeFragments.add(beforeRange);
sbOld.append(document.getText(beforeRange));
final Document document1 = fragmentedContent.getAfter();
if (sbNew.length() > 0) {
sbNew.append('\n');
}
final TextRange afterRange = new TextRange(document1.getLineStartOffset(lineNumbers.getAfter().getStartOffset()),
document1.getLineEndOffset(lineNumbers.getAfter().getEndOffset()));
myAfterFragments.add(afterRange);
sbNew.append(document1.getText(afterRange));
int before = lines.getBefore() + lineNumbers.getBefore().getEndOffset() - lineNumbers.getBefore().getStartOffset() + 1;
int after = lines.getAfter() + lineNumbers.getAfter().getEndOffset() - lineNumbers.getAfter().getStartOffset() + 1;
lines = new BeforeAfter<Integer>(before, after);
}
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);
setTodoHighlighting(fragmentedContent.getBefore(), fragmentedContent.getAfter());
}
myLineRanges.add(lines);
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');
}
final TextRange beforeRange = new TextRange(document.getLineStartOffset(lineNumbers.getBefore().getStartOffset()),
document.getLineEndOffset(lineNumbers.getBefore().getEndOffset()));
myBeforeFragments.add(beforeRange);
sbOld.append(document.getText(beforeRange));
final Document document1 = fragmentedContent.getAfter();
if (sbNew.length() > 0) {
sbNew.append('\n');
}
final TextRange afterRange = new TextRange(document1.getLineStartOffset(lineNumbers.getAfter().getStartOffset()),
document1.getLineEndOffset(lineNumbers.getAfter().getEndOffset()));
myAfterFragments.add(afterRange);
sbNew.append(document1.getText(afterRange));
int before = lines.getBefore() + lineNumbers.getBefore().getEndOffset() - lineNumbers.getBefore().getStartOffset() + 1;
int after = lines.getAfter() + lineNumbers.getAfter().getEndOffset() - lineNumbers.getAfter().getStartOffset() + 1;
lines = new BeforeAfter<Integer>(before, after);
}
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);
setTodoHighlighting(fragmentedContent.getBefore(), fragmentedContent.getAfter());
});
}
public LineNumberConvertor getOldConvertor() {
@@ -249,8 +254,8 @@ public class PreparedFragmentedContent {
myBeforeTodoRanges = beforeTodoRanges;
}
public List<BeforeAfter<TextRange>> expand(List<BeforeAfter<TextRange>> myRanges, final int lines, final Document oldDocument,
final Document document) {
public static List<BeforeAfter<TextRange>> expand(List<BeforeAfter<TextRange>> myRanges, final int lines, final Document oldDocument,
final Document document) {
if (myRanges == null || myRanges.isEmpty()) return Collections.emptyList();
if (lines == -1) {
final List<BeforeAfter<TextRange>> shiftedRanges = new ArrayList<BeforeAfter<TextRange>>(1);
@@ -286,12 +291,12 @@ public class PreparedFragmentedContent {
return zippedRanges;
}
private boolean neighbourOrIntersect(final TextRange a, final TextRange b) {
private static boolean neighbourOrIntersect(final TextRange a, final TextRange b) {
return a.getEndOffset() + 1 == b.getStartOffset() || a.intersects(b);
}
private TextRange expandRange(final TextRange range, final int shift, final int size) {
return new TextRange(Math.max(0, (range.getStartOffset() - shift)), Math.max(0, Math.min(size - 1, range.getEndOffset() + shift)));
private static TextRange expandRange(final TextRange range, final int shift, final int size) {
return new TextRange(Math.max(0, range.getStartOffset() - shift), Math.max(0, Math.min(size - 1, range.getEndOffset() + shift)));
}
private void setHighlighters(final Document oldDocument, final Document document,