EA-134652 - NPE: CaretImpl.updateOffsetsFromLogicalPosition

another solution
This commit is contained in:
Dmitry Batrak
2019-02-20 11:44:40 +03:00
parent d1566676f1
commit f693b13d46
@@ -367,60 +367,60 @@ public class FoldingModelImpl extends InlayModel.SimpleAdapter
myEditor.getGutterComponentEx().repaint();
myEditor.invokeDelayedErrorStripeRepaint();
for (Caret caret : myEditor.getCaretModel().getAllCarets()) {
if (!caret.isValid()) continue;
// There is a possible case that caret position is already visual position aware. But visual position depends on number of folded
// logical lines as well, hence, we can't be sure that target logical position defines correct visual position because fold
// regions have just changed. Hence, we use 'raw' logical position instead.
LogicalPosition caretPosition = caret.getLogicalPosition();
int caretOffset = myEditor.logicalPositionToOffset(caretPosition);
int selectionStart = caret.getSelectionStart();
int selectionEnd = caret.getSelectionEnd();
myEditor.getCaretModel().runBatchCaretOperation(() -> {
for (Caret caret : myEditor.getCaretModel().getAllCarets()) {
// There is a possible case that caret position is already visual position aware. But visual position depends on number of folded
// logical lines as well, hence, we can't be sure that target logical position defines correct visual position because fold
// regions have just changed. Hence, we use 'raw' logical position instead.
LogicalPosition caretPosition = caret.getLogicalPosition();
int caretOffset = myEditor.logicalPositionToOffset(caretPosition);
int selectionStart = caret.getSelectionStart();
int selectionEnd = caret.getSelectionEnd();
LogicalPosition positionToUse = null;
int offsetToUse = -1;
LogicalPosition positionToUse = null;
int offsetToUse = -1;
FoldRegion collapsed = myFoldTree.fetchOutermost(caretOffset);
SavedCaretPosition savedPosition = caret.getUserData(SAVED_CARET_POSITION);
boolean markedForUpdate = caret.getUserData(MARK_FOR_UPDATE) != null;
FoldRegion collapsed = myFoldTree.fetchOutermost(caretOffset);
SavedCaretPosition savedPosition = caret.getUserData(SAVED_CARET_POSITION);
boolean markedForUpdate = caret.getUserData(MARK_FOR_UPDATE) != null;
if (savedPosition != null && savedPosition.isUpToDate(myEditor)) {
int savedOffset = myEditor.logicalPositionToOffset(savedPosition.position);
FoldRegion collapsedAtSaved = myFoldTree.fetchOutermost(savedOffset);
if (collapsedAtSaved == null) {
positionToUse = savedPosition.position;
if (savedPosition != null && savedPosition.isUpToDate(myEditor)) {
int savedOffset = myEditor.logicalPositionToOffset(savedPosition.position);
FoldRegion collapsedAtSaved = myFoldTree.fetchOutermost(savedOffset);
if (collapsedAtSaved == null) {
positionToUse = savedPosition.position;
}
else {
offsetToUse = collapsedAtSaved.getStartOffset();
}
}
else {
offsetToUse = collapsedAtSaved.getStartOffset();
if (collapsed != null && positionToUse == null) {
positionToUse = myEditor.offsetToLogicalPosition(collapsed.getStartOffset());
}
if ((markedForUpdate || moveCaretFromCollapsedRegion) && caret.isUpToDate()) {
if (offsetToUse >= 0) {
caret.moveToOffset(offsetToUse);
}
else if (positionToUse != null) {
caret.moveToLogicalPosition(positionToUse);
}
else {
((CaretImpl)caret).updateVisualPosition();
}
}
caret.putUserData(SAVED_CARET_POSITION, savedPosition);
caret.putUserData(MARK_FOR_UPDATE, null);
if (isOffsetInsideCollapsedRegion(selectionStart) || isOffsetInsideCollapsedRegion(selectionEnd)) {
caret.removeSelection();
} else if (selectionStart < myEditor.getDocument().getTextLength()) {
caret.setSelection(selectionStart, selectionEnd);
}
}
if (collapsed != null && positionToUse == null) {
positionToUse = myEditor.offsetToLogicalPosition(collapsed.getStartOffset());
}
if ((markedForUpdate || moveCaretFromCollapsedRegion) && caret.isUpToDate()) {
if (offsetToUse >= 0) {
caret.moveToOffset(offsetToUse);
}
else if (positionToUse != null) {
caret.moveToLogicalPosition(positionToUse);
}
else {
((CaretImpl)caret).updateVisualPosition();
}
}
caret.putUserData(SAVED_CARET_POSITION, savedPosition);
caret.putUserData(MARK_FOR_UPDATE, null);
if (isOffsetInsideCollapsedRegion(selectionStart) || isOffsetInsideCollapsedRegion(selectionEnd)) {
caret.removeSelection();
} else if (selectionStart < myEditor.getDocument().getTextLength()) {
caret.setSelection(selectionStart, selectionEnd);
}
}
});
if (mySavedCaretShift > 0) {
final ScrollingModel scrollingModel = myEditor.getScrollingModel();
scrollingModel.disableAnimation();