IDEA-59220 IAE at com.intellij.openapi.editor.impl.DocumentImpl.a

Corrected caret positioning during auto-hard wrap
This commit is contained in:
Denis Zhdanov
2010-10-06 17:46:22 +04:00
parent 632c82a7f1
commit a96ea8d35d
2 changed files with 12 additions and 7 deletions
@@ -158,9 +158,15 @@ public class AutoHardWrapHandler {
}
final int[] wrapIntroducedSymbolsNumber = new int[1];
final int[] caretOffsetDiff = new int[1];
final int baseCaretOffset = caretModel.getOffset();
DocumentListener listener = new DocumentListener() {
@Override
public void beforeDocumentChange(DocumentEvent event) {
if (event.getOffset() <= baseCaretOffset) {
caretOffsetDiff[0] += event.getNewLength() - event.getOldLength();
}
if (event.getNewLength() <= 0) {
// There is a possible case that document fragment is removed because of auto-formatting. We don't want to process such events.
return;
@@ -188,12 +194,7 @@ public class AutoHardWrapHandler {
change.change.setStart(wrapOffset);
change.change.setEnd(wrapOffset + wrapIntroducedSymbolsNumber[0]);
int newCaretOffset = caretOffset;
if (wrapOffset <= caretOffset && newCaretOffset + wrapIntroducedSymbolsNumber[0] < document.getTextLength()) {
newCaretOffset += wrapIntroducedSymbolsNumber[0];
}
newCaretOffset = Math.min(document.getLineEndOffset(line + 1), newCaretOffset);
caretModel.moveToOffset(newCaretOffset);
caretModel.moveToOffset(baseCaretOffset + caretOffsetDiff[0]);
}
private static class AutoWrapChange {
@@ -468,7 +468,9 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
return null; // suppress events in shutdown hook
}
DocumentEvent event = new DocumentEventImpl(this, offset, oldString, newString, myModificationStamp, wholeTextReplaced);
//System.out.printf("%nbefore change: offset=%d, old text='%s', new text='%s', document modification stamp=%d%nDocument:'%s'%n",
// event.getOffset(), event.getOldFragment(), event.getNewFragment(), event.getDocument().getModificationStamp(),
event.getDocument().getText());
for (int i = myDocumentListeners.size() - 1; i >= 0; i--) {
try {
myDocumentListeners.get(i).beforeDocumentChange(event);
@@ -484,6 +486,8 @@ public class DocumentImpl extends UserDataHolderBase implements DocumentEx {
@SuppressWarnings({"ForLoopReplaceableByForEach"})
private void changedUpdate(DocumentEvent event, long newModificationStamp) {
//System.out.printf("after change: new modification stamp=%d%ndocument='%s'%n", event.getDocument().getModificationStamp(),
// event.getDocument().getText());
if (ShutDownTracker.isShutdownHookRunning()) {
return; // suppress events in shutdown hook
}