[Libreoffice-commits] core.git: sw/source

Michael Stahl (via logerrit) logerrit at kemper.freedesktop.org
Thu Nov 19 10:21:04 UTC 2020


 sw/source/core/view/viewsh.cxx |   50 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 46 insertions(+), 4 deletions(-)

New commits:
commit 3da41647552c21fcc61f5b5dd9f63d64f23f1cf6
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Fri Nov 6 14:11:05 2020 +0100
Commit:     Michael Stahl <michael.stahl at cib.de>
CommitDate: Thu Nov 19 11:20:22 2020 +0100

    sw_fieldmarkhide: move cursor outside of hidden fieldmark when toggling
    
    Change-Id: If76331fa5a65376fd210171b967736f4d356462e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105988
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>

diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 12e67ef4e901..1ef26c9e126f 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -51,6 +51,7 @@
 #include <ptqueue.hxx>
 #include <docsh.hxx>
 #include <pagedesc.hxx>
+#include <bookmrk.hxx>
 #include <ndole.hxx>
 #include <ndindex.hxx>
 #include <accmap.hxx>
@@ -2143,6 +2144,45 @@ void SwViewShell::ApplyViewOptions( const SwViewOption &rOpt )
         rSh.EndAction();
 }
 
+static bool
+IsCursorInFieldmarkHidden(SwPaM const& rCursor, sw::FieldmarkMode const eMode)
+{
+    if (eMode == sw::FieldmarkMode::ShowBoth)
+    {
+        return false;
+    }
+    IDocumentMarkAccess const& rIDMA(*rCursor.GetDoc().getIDocumentMarkAccess());
+    // iterate, for nested fieldmarks
+    for (auto iter = rIDMA.getFieldmarksBegin(); iter != rIDMA.getFieldmarksEnd(); ++iter)
+    {
+        if (*rCursor.GetPoint() <= (**iter).GetMarkStart())
+        {
+            return false;
+        }
+        if (*rCursor.GetPoint() < (**iter).GetMarkEnd())
+        {
+            SwPosition const sepPos(sw::mark::FindFieldSep(
+                        *dynamic_cast<sw::mark::IFieldmark*>(*iter)));
+            if (eMode == sw::FieldmarkMode::ShowResult)
+            {
+                if (*rCursor.GetPoint() <= sepPos
+                    && *rCursor.GetPoint() != (**iter).GetMarkStart())
+                {
+                    return true;
+                }
+            }
+            else
+            {
+                if (sepPos < *rCursor.GetPoint())
+                {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
 void SwViewShell::ImplApplyViewOptions( const SwViewOption &rOpt )
 {
     if (*mpOpt == rOpt)
@@ -2183,7 +2223,7 @@ void SwViewShell::ImplApplyViewOptions( const SwViewOption &rOpt )
     // ( - SwEndPortion must _no_ longer be generated. )
     // - Of course, the screen is something completely different than the printer ...
     bReformat = bReformat || mpOpt->IsFieldName() != rOpt.IsFieldName();
-    bool const isEnableFieldNames(mpOpt->IsFieldName() != rOpt.IsFieldName() && rOpt.IsFieldName());
+    bool const isToggleFieldNames(mpOpt->IsFieldName() != rOpt.IsFieldName());
 
     // The map mode is changed, minima/maxima will be attended by UI
     if( mpOpt->GetZoom() != rOpt.GetZoom() && !IsPreview() )
@@ -2271,14 +2311,16 @@ void SwViewShell::ImplApplyViewOptions( const SwViewOption &rOpt )
         EndAction();
     }
 
-    if (isEnableFieldNames)
+    if (isToggleFieldNames)
     {
         for(SwViewShell& rSh : GetRingContainer())
         {
             if (SwCursorShell *const pSh = dynamic_cast<SwCursorShell *>(&rSh))
             {
-                if (pSh->CursorInsideInputField())
-                {   // move cursor out of input field
+                if ((mpOpt->IsFieldName() && pSh->CursorInsideInputField())
+                    || IsCursorInFieldmarkHidden(*pSh->GetCursor(),
+                            pSh->GetLayout()->GetFieldmarkMode()))
+                {   // move cursor out of field
                     pSh->Left(1, CRSR_SKIP_CHARS);
                 }
             }


More information about the Libreoffice-commits mailing list