sw/source/uibase/shells/textfld.cxx |   49 +++++++++++++++++++++++++++++++++++-
 1 file changed, 48 insertions(+), 1 deletion(-)

New commits:
commit 6dfa1fc2fa9a7cdbbaf5ecd27528c95f744e0db4
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Thu Apr 27 17:03:48 2023 -0400
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Tue May 2 13:48:17 2023 +0200

    tdf#86630 sw page number wizard: allow wizard to be re-run
    
    First delete what a previous run of the wizard inserted,
    then re-insert the page number.
    
    Change-Id: I1cbf1a7a40e71a13a06a174fd662eccfe8298e28
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151148
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/source/uibase/shells/textfld.cxx 
b/sw/source/uibase/shells/textfld.cxx
index 2c0474cf4f6a..64694b0ab07b 100644
--- a/sw/source/uibase/shells/textfld.cxx
+++ b/sw/source/uibase/shells/textfld.cxx
@@ -1050,10 +1050,24 @@ FIELD_INSERT:
 
                 const size_t nPageDescIndex = rSh.GetCurPageDesc();
                 const SwPageDesc& rDesc = rSh.GetPageDesc(nPageDescIndex);
+                const bool bHeader = !pDlg->GetPageNumberPosition();
                 const bool bHeaderAlreadyOn = 
rDesc.GetMaster().GetHeader().IsActive();
                 const bool bFooterAlreadyOn = 
rDesc.GetMaster().GetFooter().IsActive();
                 const bool bIsSinglePage = rDesc.GetFollow() != &rDesc;
                 const size_t nMirrorPagesNeeded = rDesc.IsFirstShared() ? 2 : 
3;
+                const OUString sBookmarkName = 
OUString::Concat("PageNumWizard_")
+                    + (bHeader ? "HEADER" : "FOOTER") + "_" + rDesc.GetName();
+                IDocumentMarkAccess& rIDMA = *rSh.getIDocumentMarkAccess();
+
+                // Allow wizard to be re-run: delete previously 
wizard-inserted page number.
+                // Try before creating non-shared header: avoid coping ODD 
bookmark onto EVEN page.
+                IDocumentMarkAccess::const_iterator_t ppMark = rIDMA.findMark(
+                    sBookmarkName + OUString::number(rSh.GetVirtPageNum()));
+                if (ppMark != rIDMA.getAllMarksEnd() && *ppMark)
+                {
+                    SwPaM aDeleteOldPageNum((*ppMark)->GetMarkStart(), 
(*ppMark)->GetMarkEnd());
+                    
rDoc->getIDocumentContentOperations().DeleteAndJoin(aDeleteOldPageNum);
+                }
 
                 SvxPageItem aPageItem(SID_ATTR_PAGE);
                 aPageItem.SetNumType(pDlg->GetPageNumberType());
@@ -1068,7 +1082,6 @@ FIELD_INSERT:
                                                           { &aPageItem });
 
                 // Insert header/footer
-                const bool bHeader = !pDlg->GetPageNumberPosition();
                 if (bHeader && !bHeaderAlreadyOn)
                     rSh.ChangeHeaderOrFooter(rDesc.GetName(), bHeader, 
/*On=*/true, /*Warn=*/false);
                 else if (!bHeader && !bFooterAlreadyOn)
@@ -1145,6 +1158,15 @@ FIELD_INSERT:
                     assert(bInHF && "shouldn't have a problem going to text 
when no mirroring");
                 }
 
+                // Allow wizard to be re-run: delete previously 
wizard-inserted page number.
+                // Now that the cursor may have moved to a different page, try 
delete again.
+                ppMark = rIDMA.findMark(sBookmarkName + 
OUString::number(rSh.GetVirtPageNum()));
+                if (ppMark != rIDMA.getAllMarksEnd() && *ppMark)
+                {
+                    SwPaM aDeleteOldPageNum((*ppMark)->GetMarkStart(), 
(*ppMark)->GetMarkEnd());
+                    
rDoc->getIDocumentContentOperations().DeleteAndJoin(aDeleteOldPageNum);
+                }
+
                 SwTextNode* pTextNode = 
rSh.GetCursor()->GetPoint()->GetNode().GetTextNode();
 
                 // Insert new line if there is already text in header/footer
@@ -1188,11 +1210,27 @@ FIELD_INSERT:
                             OUString(), OUString(), SVX_NUM_PAGEDESC);
                 aMgr.InsertField(aData);
 
+                SwPaM aNewBookmarkPaM(*rSh.GetCursor()->Start());
+                aNewBookmarkPaM.SetMark();
+                rSh.GetCursor()->Left(1);
+                *aNewBookmarkPaM.Start() = *rSh.GetCursor()->Start();
+                rIDMA.makeMark(aNewBookmarkPaM,
+                               sBookmarkName + 
OUString::number(rSh.GetVirtPageNum()),
+                               IDocumentMarkAccess::MarkType::BOOKMARK,
+                               sw::mark::InsertMode::New);
+
                 // Mirror on the even pages
                 if (!bSkipMirror && bCreateMirror
                     && rSh.SetCursorInHdFt(nPageDescIndex, bHeader, 
/*Even=*/true))
                 {
                     assert(nEvenPage && "what? no even page and yet we got 
here?");
+                    ppMark = rIDMA.findMark(sBookmarkName + 
OUString::number(rSh.GetVirtPageNum()));
+                    if (ppMark != rIDMA.getAllMarksEnd() && *ppMark)
+                    {
+                        SwPaM aDeleteOldPageNum((*ppMark)->GetMarkStart(), 
(*ppMark)->GetMarkEnd());
+                        
rDoc->getIDocumentContentOperations().DeleteAndJoin(aDeleteOldPageNum);
+                    }
+
                     pTextNode = 
rSh.GetCursor()->GetPoint()->GetNode().GetTextNode();
 
                     // Insert new line if there is already text in 
header/footer
@@ -1215,6 +1253,15 @@ FIELD_INSERT:
                     // Insert page number
                     SwFieldMgr aEvenMgr(pShell);
                     aEvenMgr.InsertField(aData);
+
+                    SwPaM aNewEvenBookmarkPaM(*rSh.GetCursor()->Start());
+                    aNewEvenBookmarkPaM.SetMark();
+                    rSh.GetCursor()->Left(1);
+                    *aNewEvenBookmarkPaM.Start() = *rSh.GetCursor()->Start();
+                    rIDMA.makeMark(aNewEvenBookmarkPaM,
+                                   sBookmarkName + 
OUString::number(rSh.GetVirtPageNum()),
+                                   IDocumentMarkAccess::MarkType::BOOKMARK,
+                                   sw::mark::InsertMode::New);
                 }
 
                 rSh.SwCursorShell::Pop(SwCursorShell::PopMode::DeleteCurrent);

Reply via email to