mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
EA-134652 - NPE: CaretImpl.updateOffsetsFromLogicalPosition
another solution
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user