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