You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by sk...@apache.org on 2020/05/18 15:08:19 UTC
[netbeans] branch master updated: NETBEANS-2082: do not scroll to
caret after fold collapse, if caret is off-screen.
This is an automated email from the ASF dual-hosted git repository.
skygo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 150a06b NETBEANS-2082: do not scroll to caret after fold collapse, if caret is off-screen.
new 563a638 Merge pull request #2139 from sdedic/bugfix/NETBEANS-2082
150a06b is described below
commit 150a06b191e5f84666080b0168517c30c6b85a61
Author: Svata Dedic <sv...@oracle.com>
AuthorDate: Fri May 15 16:23:12 2020 +0200
NETBEANS-2082: do not scroll to caret after fold collapse, if caret is off-screen.
---
.../modules/editor/fold/ui/FoldViewFactory.java | 35 ++++++++++++----------
.../org/netbeans/api/editor/caret/EditorCaret.java | 12 ++++++++
2 files changed, 32 insertions(+), 15 deletions(-)
diff --git a/ide/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/FoldViewFactory.java b/ide/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/FoldViewFactory.java
index 1c91044..c729e3e 100644
--- a/ide/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/FoldViewFactory.java
+++ b/ide/editor.fold.nbui/src/org/netbeans/modules/editor/fold/ui/FoldViewFactory.java
@@ -260,24 +260,25 @@ public final class FoldViewFactory extends EditorViewFactory implements FoldHier
@Override
public void foldHierarchyChanged(FoldHierarchyEvent evt) {
- if (!collapsedFoldEncountered) {
- // Check if any collapsed fold was added or a collapsed/expanded state changed
- for (int i = evt.getAddedFoldCount() - 1; i >= 0; i--) {
- if (evt.getAddedFold(i).isCollapsed()) {
- collapsedFoldEncountered = true;
- break;
- }
+ boolean collapsedAdded = false;
+ boolean changedToCollapsed = false;
+ // Check if any collapsed fold was added or a collapsed/expanded state changed
+ for (int i = evt.getAddedFoldCount() - 1; i >= 0; i--) {
+ if (evt.getAddedFold(i).isCollapsed()) {
+ collapsedAdded = true;
+ break;
}
- if (!collapsedFoldEncountered) {
- for (int i = evt.getFoldStateChangeCount() - 1; i >= 0; i--) {
- FoldStateChange foldStateChange = evt.getFoldStateChange(i);
- if (foldStateChange.isCollapsedChanged() && foldStateChange.getFold().isCollapsed()) {
- collapsedFoldEncountered = true;
- break;
- }
+ }
+ if (!collapsedAdded) {
+ for (int i = evt.getFoldStateChangeCount() - 1; i >= 0; i--) {
+ FoldStateChange foldStateChange = evt.getFoldStateChange(i);
+ if (foldStateChange.isCollapsedChanged() && foldStateChange.getFold().isCollapsed()) {
+ changedToCollapsed = true;
+ break;
}
}
}
+ collapsedFoldEncountered |= collapsedAdded || changedToCollapsed;
JTextComponent comp = textComponent();
if (collapsedFoldEncountered && comp != null) {
// [TODO] there could be more detailed inspection done among folds
@@ -289,7 +290,11 @@ public final class FoldViewFactory extends EditorViewFactory implements FoldHier
ViewUtils.log(CHANGE_LOG, "CHANGE in FoldViewFactory: <" + // NOI18N
startOffset + "," + endOffset + ">\n"); // NOI18N
}
- comp.putClientProperty("editorcaret.updateRetainsVisibleOnce", Boolean.TRUE);
+ if (collapsedAdded) {
+ // this hint covers a specific case when a fold is created as *initially* collapsed
+ // to maintain caret position on screen, if the caret was visible.
+ comp.putClientProperty("editorcaret.updateRetainsVisibleOnce", Boolean.TRUE);
+ }
fireEvent(EditorViewFactoryChange.createList(startOffset, endOffset,
EditorViewFactoryChange.Type.PARAGRAPH_CHANGE));
}
diff --git a/ide/editor.lib2/src/org/netbeans/api/editor/caret/EditorCaret.java b/ide/editor.lib2/src/org/netbeans/api/editor/caret/EditorCaret.java
index 76a9cd9d..926c5e3 100644
--- a/ide/editor.lib2/src/org/netbeans/api/editor/caret/EditorCaret.java
+++ b/ide/editor.lib2/src/org/netbeans/api/editor/caret/EditorCaret.java
@@ -1999,6 +1999,9 @@ public final class EditorCaret implements Caret {
if (cbounds != null) {
// save relative position of the main caret
maybeSaveCaretOffset(cbounds);
+ if (log) {
+ LOG.fine("EditorCaret.update: forced:true, savedBounds=" + cbounds + ", relativeOffset=" + lastCaretVisualOffset + "\n"); // NOI18N
+ }
}
}
if (!calledFromPaint && !c.isValid() /* && maintainVisible == null */) {
@@ -2025,6 +2028,11 @@ public final class EditorCaret implements Caret {
scroll = scrollToLastCaret;
scrollToLastCaret = false;
}
+ if (lastCaretVisualOffset == -1) {
+ // wasn't able to save the visual offset, the caret was already off screen. Do not scroll just because of fold updates.
+ forceUpdate = false;
+ c.putClientProperty("editorcaret.updateRetainsVisibleOnce", null); // NOI18N
+ }
if (scroll || forceUpdate) {
Rectangle caretBounds;
Rectangle oldCaretBounds;
@@ -2035,6 +2043,10 @@ public final class EditorCaret implements Caret {
caretBounds = lastCaretItem.getCaretBounds();
oldCaretBounds = caretBounds;
}
+ if (log) {
+ LOG.fine("EditorCaret.update: caretBounds=" + caretBounds + "\n"); // NOI18N
+ LOG.fine("EditorCaret.update: oldCaretBounds=" + oldCaretBounds + "\n"); // NOI18N
+ }
if (caretBounds != null) {
Rectangle scrollBounds = new Rectangle(caretBounds); // Must possibly be cloned upon change
if (viewport != null && isWrapping()) {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists