diff: fix IDEA-97563 and related issues

This commit is contained in:
Aleksey Pivovarov
2014-06-16 11:49:31 +04:00
parent 803f4a6918
commit 9c2daf694d
2 changed files with 38 additions and 21 deletions
@@ -544,25 +544,34 @@ public class LineStatusTracker {
myApplication.assertWriteAccessAllowed();
synchronized (myLock) {
TextRange currentTextRange = getCurrentTextRange(range);
TextRange currentTextRange = getCurrentTextRangeWithMagic(range);
if (range.getType() == Range.INSERTED) {
myDocument
.replaceString(currentTextRange.getStartOffset(), Math.min(currentTextRange.getEndOffset() + 1, myDocument.getTextLength()), "");
}
else if (range.getType() == Range.DELETED) {
String upToDateContent = getUpToDateContent(range);
String upToDateContent = getUpToDateContentWithMagic(range);
myDocument.insertString(currentTextRange.getStartOffset(), upToDateContent);
}
else {
String upToDateContent = getUpToDateContent(range);
String upToDateContent = getUpToDateContentWithMagic(range);
myDocument.replaceString(currentTextRange.getStartOffset(), Math.min(currentTextRange.getEndOffset() + 1, myDocument.getTextLength()),
upToDateContent);
}
}
}
public String getUpToDateContentWithMagic(Range range) {
synchronized (myLock) {
TextRange textRange = getUpToDateRangeWithMagic(range);
final int startOffset = textRange.getStartOffset();
final int endOffset = Math.min(textRange.getEndOffset() + 1, myUpToDateDocument.getTextLength());
return myUpToDateDocument.getCharsSequence().subSequence(startOffset, endOffset).toString();
}
}
public String getUpToDateContent(Range range) {
synchronized (myLock) {
TextRange textRange = getUpToDateRange(range);
@@ -576,25 +585,23 @@ public class LineStatusTracker {
return myProject;
}
TextRange getCurrentTextRangeWithMagic(Range range) {
return getRangeWithMagic(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument);
}
TextRange getUpToDateRangeWithMagic(Range range) {
return getRangeWithMagic(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument);
}
TextRange getCurrentTextRange(Range range) {
return getRange(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument, false);
return getRange(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument);
}
TextRange getUpToDateRange(Range range) {
return getRange(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument, false);
return getRange(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument);
}
TextRange getCurrentTextRangeWithEndSymbol(Range range) {
return getRange(range.getType(), range.getOffset1(), range.getOffset2(), Range.DELETED, myDocument, true);
}
// a hack
TextRange getUpToDateRangeWithEndSymbol(Range range) {
return getRange(range.getType(), range.getUOffset1(), range.getUOffset2(), Range.INSERTED, myUpToDateDocument, true);
}
private static TextRange getRange(byte rangeType, int offset1, int offset2, byte emptyRangeCondition, Document document,
final boolean keepEnd) {
private static TextRange getRangeWithMagic(byte rangeType, int offset1, int offset2, byte emptyRangeCondition, Document document) {
if (rangeType == emptyRangeCondition) {
int lineStartOffset;
if (offset1 == 0) {
@@ -612,14 +619,24 @@ public class LineStatusTracker {
int endOffset = document.getLineEndOffset(offset2 - 1);
if (startOffset > 0) {
-- startOffset;
if (! keepEnd) {
-- endOffset;
}
-- endOffset;
}
return new TextRange(startOffset, endOffset);
}
}
private static TextRange getRange(byte rangeType, int offset1, int offset2, byte emptyRangeCondition, Document document) {
if (rangeType == emptyRangeCondition) {
int lineStartOffset = offset1 < document.getLineCount() ? document.getLineStartOffset(offset1) : document.getTextLength();
return new TextRange(lineStartOffset, lineStartOffset);
}
else {
int startOffset = document.getLineStartOffset(offset1);
int endOffset = document.getLineEndOffset(offset2 - 1);
return new TextRange(startOffset, endOffset);
}
}
public static LineStatusTracker createOn(@Nullable VirtualFile virtualFile, final Document doc, final Project project) {
final Document document = new DocumentImpl("",true);
return new LineStatusTracker(doc, document, project, virtualFile);
@@ -56,10 +56,10 @@ public class ShowLineStatusRangeDiffAction extends BaseLineStatusRangeAction {
public DiffContent[] getContents() {
return new DiffContent[]{
createDiffContent(myLineStatusTracker.getUpToDateDocument(),
myLineStatusTracker.getUpToDateRangeWithEndSymbol(myRange),
myLineStatusTracker.getUpToDateRange(myRange),
null),
createDiffContent(myLineStatusTracker.getDocument(),
myLineStatusTracker.getCurrentTextRangeWithEndSymbol(myRange),
myLineStatusTracker.getCurrentTextRange(myRange),
myLineStatusTracker.getVirtualFile())};
}