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

Michael Stahl (via logerrit) logerrit at kemper.freedesktop.org
Sat Dec 7 19:37:38 UTC 2019


 sw/source/core/doc/DocumentContentOperationsManager.cxx |   31 ++++++++++++----
 vcl/unx/gtk3/gtk3gtkinst.cxx                            |    3 +
 2 files changed, 26 insertions(+), 8 deletions(-)

New commits:
commit 522ed1b685f5b7eb52efb9d874dfacc02bf82139
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Fri Dec 6 17:44:26 2019 +0100
Commit:     Michael Stahl <michael.stahl at cib.de>
CommitDate: Sat Dec 7 20:36:43 2019 +0100

    ofz#18563 sw: fix 2 problems with field marks
    
    * sw::CalcBreaks had a thinko in that a separator that had a start but
      no matching end wasn't reported
    
    * DocumentContentOperationsManager::DelFullPara() may apparently be
      called with a rPam having just one position, in which case expanding
      it doesn't work.
    
    Change-Id: I6503498dd38d188799385aa706ffe7dfccfdba08
    Reviewed-on: https://gerrit.libreoffice.org/84662
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>

diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 50b49232d511..6ead169ec498 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -81,6 +81,8 @@
 #include <com/sun/star/i18n/WordType.hpp>
 #include <com/sun/star/i18n/XBreakIterator.hpp>
 #include <com/sun/star/embed/XEmbeddedObject.hpp>
+
+#include <tuple>
 #include <memory>
 
 
@@ -494,7 +496,7 @@ namespace sw
         SwNodes const& rNodes(rPam.GetPoint()->nNode.GetNodes());
         IDocumentMarkAccess const& rIDMA(*rPam.GetDoc()->getIDocumentMarkAccess());
 
-        std::stack<sw::mark::IFieldmark const*> startedFields;
+        std::stack<std::tuple<sw::mark::IFieldmark const*, bool, sal_uLong, sal_Int32>> startedFields;
 
         for (sal_uLong n = nStartNode; n <= nEndNode; ++n)
         {
@@ -534,7 +536,7 @@ namespace sw
                         case CH_TXT_ATR_FIELDSTART:
                         {
                             auto const pFieldMark(rIDMA.getFieldmarkAt(SwPosition(rTextNode, i)));
-                            startedFields.push(pFieldMark);
+                            startedFields.emplace(pFieldMark, false, 0, 0);
                             break;
                         }
                         case CH_TXT_ATR_FIELDSEP:
@@ -545,7 +547,10 @@ namespace sw
                             }
                             else
                             {   // no way to find the field via MarkManager...
-                                assert(startedFields.top()->IsCoveringPosition(SwPosition(rTextNode, i)));
+                                assert(std::get<0>(startedFields.top())->IsCoveringPosition(SwPosition(rTextNode, i)));
+                                std::get<1>(startedFields.top()) = true;
+                                std::get<2>(startedFields.top()) = n;
+                                std::get<3>(startedFields.top()) = i;
                             }
                             break;
                         }
@@ -557,7 +562,7 @@ namespace sw
                             }
                             else
                             {   // fieldmarks must not overlap => stack
-                                assert(startedFields.top() == rIDMA.getFieldmarkAt(SwPosition(rTextNode, i)));
+                                assert(std::get<0>(startedFields.top()) == rIDMA.getFieldmarkAt(SwPosition(rTextNode, i)));
                                 startedFields.pop();
                             }
                             break;
@@ -579,14 +584,22 @@ namespace sw
         }
         while (!startedFields.empty())
         {
-            auto const pField(startedFields.top());
-            startedFields.pop();
-            SwPosition const& rStart(pField->GetMarkStart());
+            SwPosition const& rStart(std::get<0>(startedFields.top())->GetMarkStart());
             std::pair<sal_uLong, sal_Int32> const pos(
                     rStart.nNode.GetIndex(), rStart.nContent.GetIndex());
             auto it = std::lower_bound(rBreaks.begin(), rBreaks.end(), pos);
             assert(it == rBreaks.end() || *it != pos);
             rBreaks.insert(it, pos);
+            if (std::get<1>(startedFields.top()))
+            {
+                std::pair<sal_uLong, sal_Int32> const posSep(
+                    std::get<2>(startedFields.top()),
+                    std::get<3>(startedFields.top()));
+                it = std::lower_bound(rBreaks.begin(), rBreaks.end(), posSep);
+                assert(it == rBreaks.end() || *it != posSep);
+                rBreaks.insert(it, posSep);
+            }
+            startedFields.pop();
         }
     }
 }
@@ -1963,6 +1976,10 @@ bool DocumentContentOperationsManager::DelFullPara( SwPaM& rPam )
 
     {
         SwPaM temp(rPam, nullptr);
+        if (!temp.HasMark())
+        {
+            temp.SetMark();
+        }
         if (SwTextNode *const pNode = temp.Start()->nNode.GetNode().GetTextNode())
         { // rPam may not have nContent set but IsFieldmarkOverlap requires it
             pNode->MakeStartIndex(&temp.Start()->nContent);
commit f6080df9e64b6291202e75354f9458fc0895932e
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Fri Dec 6 15:14:09 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Sat Dec 7 20:36:38 2019 +0100

    return blank ident if empty notebook
    
    Change-Id: Icede4b1458fe858cc6d406b4cbae9f8d579d417b
    Reviewed-on: https://gerrit.libreoffice.org/84660
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 15a6981a4a8f..fc9a04f14025 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -5893,7 +5893,8 @@ public:
 
     virtual OString get_current_page_ident() const override
     {
-        return get_page_ident(get_current_page());
+        const int nPage = get_current_page();
+        return nPage != -1 ? get_page_ident(nPage) : OString();
     }
 
     virtual weld::Container* get_page(const OString& rIdent) const override


More information about the Libreoffice-commits mailing list