sw/inc/strings.hrc              |    1 +
 sw/inc/swundo.hxx               |    3 ++-
 sw/source/core/doc/docnum.cxx   |   15 +++++++++++++++
 sw/source/core/draw/dview.cxx   |    5 +++++
 sw/source/core/inc/UndoCore.hxx |   14 ++++++++++++++
 sw/source/core/undo/undobj.cxx  |    3 +++
 sw/source/core/undo/unoutl.cxx  |   24 ++++++++++++++++++++++++
 7 files changed, 64 insertions(+), 1 deletion(-)

New commits:
commit 6e879d5f142766c941d1c3bafd17f67b78c1c9f4
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Thu Aug 5 11:16:58 2021 +0300
Commit:     Thorsten Behrens <thorsten.behr...@allotropia.de>
CommitDate: Thu Aug 5 18:34:09 2021 +0200

    tdf#99932: sw: fix for invalid anchor location for FLY_AT_CHAR mode
    
    In such case anchor position depends on LastCharRect which can be
    invalid because of happened frame movement, resize, etc.
    
    Change-Id: I3d3c6318ee1ce5f4043e21ab091417d283c4260c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120059
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>

diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx
index 276fbf922c9a..aa116d3d7bb7 100644
--- a/sw/source/core/draw/dview.cxx
+++ b/sw/source/core/draw/dview.cxx
@@ -236,6 +236,11 @@ void SwDrawView::AddCustomHdl()
         // #i28701# - use last character rectangle saved at object
         // in order to avoid a format of the anchor frame
         SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj 
)->GetAnchoredObj( pObj );
+
+        // Invalidate/recalc LastCharRect which can contain invalid frame 
offset because
+        // of later frame changes
+        pAnchoredObj->CheckCharRectAndTopOfLine(false);
+
         SwRect aAutoPos = pAnchoredObj->GetLastCharRect();
         if ( aAutoPos.Height() )
         {
commit 4edf3a964e764dcc40be729b8305476c5b968f1c
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Fri Jul 23 14:28:04 2021 +0300
Commit:     Thorsten Behrens <thorsten.behr...@allotropia.de>
CommitDate: Thu Aug 5 18:33:54 2021 +0200

    sw: undo/redo for outline modification
    
    Outline changes done via "Tools"->"Chapter Numbering" were
    not tracked by undo/redo before.
    
    Change-Id: I764dda526d2b17ecbb62eca0d6a9fb0b368c4a69
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119405
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>

diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc
index 4d374a5591f5..a6b502742989 100644
--- a/sw/inc/strings.hrc
+++ b/sw/inc/strings.hrc
@@ -453,6 +453,7 @@
 #define STR_TEXT_CORRECTION                     NC_("STR_TEXT_CORRECTION", 
"Text Correction")
 #define STR_OUTLINE_LR                          NC_("STR_OUTLINE_LR", 
"Promote/demote outline")
 #define STR_OUTLINE_UD                          NC_("STR_OUTLINE_UD", "Move 
outline")
+#define STR_OUTLINE_EDIT                        NC_("STR_OUTLINE_EDIT", 
"Modify outline")
 #define STR_INSNUM                              NC_("STR_INSNUM", "Insert 
numbering")
 #define STR_NUMUP                               NC_("STR_NUMUP", "Promote 
level")
 #define STR_NUMDOWN                             NC_("STR_NUMDOWN", "Demote 
level")
diff --git a/sw/inc/swundo.hxx b/sw/inc/swundo.hxx
index 90fa6c51d055..cda4ec02c49f 100644
--- a/sw/inc/swundo.hxx
+++ b/sw/inc/swundo.hxx
@@ -164,7 +164,8 @@ enum class SwUndoId
     UI_TABLE_DELETE,                   // 133
     CONFLICT,                          // 134
 
-    INSERT_FORM_FIELD                  // 135
+    INSERT_FORM_FIELD,                 // 135
+    OUTLINE_EDIT,                      // 136
 };
 
 OUString GetUndoComment(SwUndoId eId);
diff --git a/sw/source/core/doc/docnum.cxx b/sw/source/core/doc/docnum.cxx
index fad2322f07d9..430d19220329 100644
--- a/sw/source/core/doc/docnum.cxx
+++ b/sw/source/core/doc/docnum.cxx
@@ -114,6 +114,16 @@ static sal_uInt8 GetUpperLvlChg( sal_uInt8 nCurLvl, 
sal_uInt8 nLevel, sal_uInt16
 
 void SwDoc::SetOutlineNumRule( const SwNumRule& rRule )
 {
+    if (GetIDocumentUndoRedo().DoesUndo())
+    {
+        GetIDocumentUndoRedo().StartUndo(SwUndoId::OUTLINE_EDIT, nullptr);
+        if (mpOutlineRule)
+        {
+            GetIDocumentUndoRedo().AppendUndo(
+                std::make_unique<SwUndoOutlineEdit>(*mpOutlineRule, rRule, 
*this));
+        }
+    }
+
     if( mpOutlineRule )
         (*mpOutlineRule) = rRule;
     else
@@ -158,6 +168,11 @@ void SwDoc::SetOutlineNumRule( const SwNumRule& rRule )
 
     getIDocumentFieldsAccess().UpdateExpFields(nullptr, true);
 
+    if (GetIDocumentUndoRedo().DoesUndo())
+    {
+        GetIDocumentUndoRedo().EndUndo(SwUndoId::OUTLINE_EDIT, nullptr);
+    }
+
     getIDocumentState().SetModified();
 }
 
diff --git a/sw/source/core/inc/UndoCore.hxx b/sw/source/core/inc/UndoCore.hxx
index 1fcfae22f6e2..62fcccd0231c 100644
--- a/sw/source/core/inc/UndoCore.hxx
+++ b/sw/source/core/inc/UndoCore.hxx
@@ -25,6 +25,7 @@
 #include <o3tl/deleter.hxx>
 #include <rtl/ustring.hxx>
 #include <redline.hxx>
+#include <numrule.hxx>
 
 #include <memory>
 #include <vector>
@@ -221,6 +222,19 @@ public:
     virtual void RepeatImpl( ::sw::RepeatContext & ) override;
 };
 
+class SwUndoOutlineEdit final : public SwUndo, private SwUndRng
+{
+    SwNumRule m_aNewNumRule;
+    SwNumRule m_aOldNumRule;
+
+public:
+    SwUndoOutlineEdit(const SwNumRule& rOldRule, const SwNumRule& rNewRule, 
const SwDoc& rDoc);
+
+    virtual void UndoImpl(::sw::UndoRedoContext&) override;
+    virtual void RedoImpl(::sw::UndoRedoContext&) override;
+    virtual void RepeatImpl(::sw::RepeatContext&) override;
+};
+
 const int nUndoStringLength = 20;
 
 /**
diff --git a/sw/source/core/undo/undobj.cxx b/sw/source/core/undo/undobj.cxx
index a9566b770ae8..ba32c509b019 100644
--- a/sw/source/core/undo/undobj.cxx
+++ b/sw/source/core/undo/undobj.cxx
@@ -337,6 +337,9 @@ OUString GetUndoComment(SwUndoId eId)
         case SwUndoId::OUTLINE_UD:
             pId = STR_OUTLINE_UD;
             break;
+        case SwUndoId::OUTLINE_EDIT:
+            pId = STR_OUTLINE_EDIT;
+            break;
         case SwUndoId::INSNUM:
             pId = STR_INSNUM;
             break;
diff --git a/sw/source/core/undo/unoutl.cxx b/sw/source/core/undo/unoutl.cxx
index fc2e437a7459..2144c7dd78cf 100644
--- a/sw/source/core/undo/unoutl.cxx
+++ b/sw/source/core/undo/unoutl.cxx
@@ -46,4 +46,28 @@ void SwUndoOutlineLeftRight::RepeatImpl(::sw::RepeatContext 
& rContext)
     rContext.GetDoc().OutlineUpDown(rContext.GetRepeatPaM(), m_nOffset);
 }
 
+
+SwUndoOutlineEdit::SwUndoOutlineEdit(const SwNumRule& rOldRule, const 
SwNumRule& rNewRule,
+                                     const SwDoc& rDoc)
+    : SwUndo(SwUndoId::OUTLINE_EDIT, &rDoc)
+    , m_aNewNumRule(rNewRule)
+    , m_aOldNumRule(rOldRule)
+{
+}
+
+void SwUndoOutlineEdit::UndoImpl(::sw::UndoRedoContext& rContext)
+{
+    rContext.GetDoc().SetOutlineNumRule(m_aOldNumRule);
+}
+
+void SwUndoOutlineEdit::RedoImpl(::sw::UndoRedoContext& rContext)
+{
+    rContext.GetDoc().SetOutlineNumRule(m_aNewNumRule);
+}
+
+void SwUndoOutlineEdit::RepeatImpl(::sw::RepeatContext& rContext)
+{
+    rContext.GetDoc().SetOutlineNumRule(m_aNewNumRule);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to