cui/source/inc/numpages.hxx                          |    2 +
 cui/source/tabpages/numpages.cxx                     |   22 ++++++++++++-------
 include/sfx2/tabdlg.hxx                              |    9 +++++++
 sfx2/source/dialog/tabdlg.cxx                        |   14 ++++++++++++
 sw/qa/uitest/writer_tests2/formatBulletsNumbering.py |   16 ++++++-------
 sw/source/ui/misc/num.cxx                            |    9 +++++++
 sw/source/uibase/inc/num.hxx                         |    1 
 7 files changed, 58 insertions(+), 15 deletions(-)

New commits:
commit 8f9b8b6d5ddcdb4e0422f55d67f38063d53b8c21
Author:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
AuthorDate: Thu Jul 11 10:15:31 2024 +0200
Commit:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
CommitDate: Thu Jul 11 16:36:40 2024 +0200

    Don't save bullet changes when dialog was cancelled
    
    Change-Id: Ia2a7feb2f47a59f7c693e2023f9c2c8b3b934f81
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170336
    Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
    Tested-by: Jenkins

diff --git a/cui/source/inc/numpages.hxx b/cui/source/inc/numpages.hxx
index d90b6b938f7f..acfc0d2a1433 100644
--- a/cui/source/inc/numpages.hxx
+++ b/cui/source/inc/numpages.hxx
@@ -99,6 +99,8 @@ class SvxBulletPickTabPage final : public SfxTabPage
     std::unique_ptr<weld::Button> m_xBtChangeBullet;
     std::unique_ptr<SvxNumValueSet> m_xExamplesVS;
     std::unique_ptr<weld::CustomWeld> m_xExamplesVSWin;
+    css::uno::Sequence<OUString> m_aBulletSymbols;
+    css::uno::Sequence<OUString> m_aBulletSymbolsFonts;
 
     DECL_LINK(NumSelectHdl_Impl, ValueSet*, void);
     DECL_LINK(DoubleClickHdl_Impl, ValueSet*, void);
diff --git a/cui/source/tabpages/numpages.cxx b/cui/source/tabpages/numpages.cxx
index c0495541ca61..08f05c9b9a0f 100644
--- a/cui/source/tabpages/numpages.cxx
+++ b/cui/source/tabpages/numpages.cxx
@@ -394,6 +394,14 @@ void  SvxBulletPickTabPage::ActivatePage(const SfxItemSet& 
rSet)
 
 DeactivateRC SvxBulletPickTabPage::DeactivatePage(SfxItemSet *_pSet)
 {
+    if (IsCancelMode())
+    {
+        // Dialog cancelled, restore previous bullets
+        std::shared_ptr<comphelper::ConfigurationChanges> 
batch(comphelper::ConfigurationChanges::create());
+        
officecfg::Office::Common::BulletsNumbering::DefaultBullets::set(m_aBulletSymbols,
 batch);
+        
officecfg::Office::Common::BulletsNumbering::DefaultBulletsFonts::set(m_aBulletSymbolsFonts,
 batch);
+        batch->commit();
+    }
     if(_pSet)
         FillItemSet(_pSet);
     return DeactivateRC::LeavePage;
@@ -516,15 +524,15 @@ IMPL_LINK_NOARG(SvxBulletPickTabPage, 
ClickAddChangeHdl_Impl, weld::Button&, voi
         _nMask <<= 1;
     }
 
-    css::uno::Sequence<OUString> 
aBulletSymbols(officecfg::Office::Common::BulletsNumbering::DefaultBullets::get());
-    css::uno::Sequence<OUString> 
aBulletSymbolsFonts(officecfg::Office::Common::BulletsNumbering::DefaultBulletsFonts::get());
-    css::uno::Sequence<OUString> aBulletSymbolsList(aBulletSymbols.size());
-    css::uno::Sequence<OUString> 
aBulletSymbolsFontsList(aBulletSymbolsFonts.size());
+    m_aBulletSymbols = 
officecfg::Office::Common::BulletsNumbering::DefaultBullets::get();
+    m_aBulletSymbolsFonts = 
officecfg::Office::Common::BulletsNumbering::DefaultBulletsFonts::get();
+    css::uno::Sequence<OUString> aBulletSymbolsList(m_aBulletSymbols.size());
+    css::uno::Sequence<OUString> 
aBulletSymbolsFontsList(m_aBulletSymbolsFonts.size());
     auto aBulletSymbolsListRange = asNonConstRange(aBulletSymbolsList);
     auto aBulletSymbolsFontsListRange = 
asNonConstRange(aBulletSymbolsFontsList);
 
     sal_uInt16 nIndex = m_xExamplesVS->GetSelectedItemId() - 1;
-    for (size_t i = 0; i < aBulletSymbols.size(); ++i)
+    for (size_t i = 0; i < m_aBulletSymbols.size(); ++i)
     {
         if (i == nIndex)
         {
@@ -533,8 +541,8 @@ IMPL_LINK_NOARG(SvxBulletPickTabPage, 
ClickAddChangeHdl_Impl, weld::Button&, voi
         }
         else
         {
-            aBulletSymbolsListRange[i] = aBulletSymbols[i];
-            aBulletSymbolsFontsListRange[i] = aBulletSymbolsFonts[i];
+            aBulletSymbolsListRange[i] = m_aBulletSymbols[i];
+            aBulletSymbolsFontsListRange[i] = m_aBulletSymbolsFonts[i];
         }
     }
 
diff --git a/include/sfx2/tabdlg.hxx b/include/sfx2/tabdlg.hxx
index 6a207a573027..828054bc562d 100644
--- a/include/sfx2/tabdlg.hxx
+++ b/include/sfx2/tabdlg.hxx
@@ -107,6 +107,11 @@ protected:
     */
     bool PrepareLeaveCurrentPage();
 
+    /** Called before user cancels the dialog.
+        Calls DeactivatePage of all tab pages with IsCancelMode() set to true
+    */
+    void PrepareCancel();
+
     /** save the position of the TabDialog and which tab page is the currently 
active one
      */
     void SavePosAndId();
@@ -192,6 +197,7 @@ private:
     const SfxItemSet* mpSet;
     OUString maUserString;
     bool mbHasExchangeSupport;
+    bool mbCancel;
     std::unordered_map<OUString, css::uno::Any> maAdditionalProperties;
 
     std::unique_ptr<TabPageImpl> mpImpl;
@@ -258,6 +264,9 @@ public:
     }
     virtual void            FillUserData();
     virtual bool            IsReadOnly() const;
+    // Whether the user has canceled the dialog. Allows to restore settings, 
etc.
+    virtual bool IsCancelMode() { return mbCancel; }
+    virtual void SetCancelMode(bool bCancel) { mbCancel = bCancel; }
     virtual void PageCreated (const SfxAllItemSet& aSet);
     virtual void ChangesApplied();
     static const SfxPoolItem* GetItem( const SfxItemSet& rSet, sal_uInt16 
nSlot, bool bDeep = true );
diff --git a/sfx2/source/dialog/tabdlg.cxx b/sfx2/source/dialog/tabdlg.cxx
index ca2f96b5c810..f9ffe206ec59 100644
--- a/sfx2/source/dialog/tabdlg.cxx
+++ b/sfx2/source/dialog/tabdlg.cxx
@@ -149,6 +149,7 @@ SfxTabPage::SfxTabPage(weld::Container* pPage, 
weld::DialogController* pControll
     : BuilderPage(pPage, pController, rUIXMLDescription, rID, 
isLOKMobilePhone())
     , mpSet(rAttrSet)
     , mbHasExchangeSupport(false)
+    , mbCancel(false)
     , mpImpl(new TabPageImpl)
 {
     mpImpl->mpSfxDialogController = 
dynamic_cast<SfxOkDialogController*>(m_pDialogController);
@@ -678,6 +679,19 @@ bool SfxTabDialogController::PrepareLeaveCurrentPage()
     return bEnd;
 }
 
+void SfxTabDialogController::PrepareCancel()
+{
+    for (auto pDataObject : m_pImpl->aData)
+    {
+        if (!pDataObject->xTabPage)
+            continue;
+
+        SfxTabPage* pPage = pDataObject->xTabPage.get();
+        pPage->SetCancelMode(true);
+        pPage->DeactivatePage(nullptr);
+    }
+}
+
 const WhichRangesContainer & SfxTabDialogController::GetInputRanges(const 
SfxItemPool& rPool)
 
 /*  [Description]
diff --git a/sw/qa/uitest/writer_tests2/formatBulletsNumbering.py 
b/sw/qa/uitest/writer_tests2/formatBulletsNumbering.py
index e5ff843fa0f6..d0b78525c1c6 100644
--- a/sw/qa/uitest/writer_tests2/formatBulletsNumbering.py
+++ b/sw/qa/uitest/writer_tests2/formatBulletsNumbering.py
@@ -75,7 +75,7 @@ class formatBulletsNumbering(UITestCase):
                     xindentatmf.executeAction("UP", tuple())
 
 
-                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                     xTabs = xDialog.getChild("tabcontrol")
                     select_pos(xTabs, "4")
                     xalignedatmf = xDialog.getChild("alignedatmf")
@@ -100,7 +100,7 @@ class formatBulletsNumbering(UITestCase):
                 select_by_text(xnumfollowedbylb, "Space")
 
 
-            with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+            with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                 xTabs = xDialog.getChild("tabcontrol")
                 select_pos(xTabs, "4")
                 xnumfollowedbylb = xDialog.getChild("numfollowedbylb")
@@ -130,7 +130,7 @@ class formatBulletsNumbering(UITestCase):
                 xallsame.executeAction("CLICK", tuple())
 
 
-            with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+            with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                 xTabs = xDialog.getChild("tabcontrol")
                 select_pos(xTabs, "5")
                 xnumfmtlb = xDialog.getChild("numfmtlb")
@@ -151,7 +151,7 @@ class formatBulletsNumbering(UITestCase):
             with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="user") as xDialog:
                 pass
 
-            with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+            with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                 xTabs = xDialog.getChild("tabcontrol")
                 select_pos(xTabs, "5")
                 xnumfmtlb = xDialog.getChild("numfmtlb")
@@ -185,7 +185,7 @@ class formatBulletsNumbering(UITestCase):
 
 
                 xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"TAB"})) #TAB to move indent right
-                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                     xTabs = xDialog.getChild("tabcontrol")
                     select_pos(xTabs, "4")
                     xindentatmf = xDialog.getChild("indentatmf")
@@ -193,7 +193,7 @@ class formatBulletsNumbering(UITestCase):
                     self.assertEqual(indentValue < indentValue2 , True)
 
                 xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE": 
"BACKSPACE"}))
-                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                     xTabs = xDialog.getChild("tabcontrol")
                     select_pos(xTabs, "4")
                     xindentatmf = xDialog.getChild("indentatmf")
@@ -214,7 +214,7 @@ class formatBulletsNumbering(UITestCase):
 
 
                 self.xUITest.executeCommand(".uno:DecrementSubLevels")
-                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                     xTabs = xDialog.getChild("tabcontrol")
                     select_pos(xTabs, "4")
                     xindentatmf = xDialog.getChild("indentatmf")
@@ -222,7 +222,7 @@ class formatBulletsNumbering(UITestCase):
                     self.assertEqual(indentValue < indentValue2 , True)
 
                 self.xUITest.executeCommand(".uno:IncrementLevel")
-                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="cancel") as xDialog:
+                with 
self.ui_test.execute_dialog_through_command(".uno:BulletsAndNumberingDialog", 
close_button="ok") as xDialog:
                     xTabs = xDialog.getChild("tabcontrol")
                     select_pos(xTabs, "4")
                     xindentatmf = xDialog.getChild("indentatmf")
diff --git a/sw/source/ui/misc/num.cxx b/sw/source/ui/misc/num.cxx
index 38763d825e29..4905a49eba55 100644
--- a/sw/source/ui/misc/num.cxx
+++ b/sw/source/ui/misc/num.cxx
@@ -870,6 +870,8 @@ 
SwSvxNumBulletTabDialog::SwSvxNumBulletTabDialog(weld::Window* pParent,
     weld::Button* pButton = GetUserButton();
     pButton->connect_clicked(LINK(this, SwSvxNumBulletTabDialog, 
RemoveNumberingHdl));
     pButton->set_sensitive(m_rWrtSh.GetNumRuleAtCurrCursorPos() != nullptr);
+    weld::Button& pCancelButton = GetCancelButton();
+    pCancelButton.connect_clicked(LINK(this, SwSvxNumBulletTabDialog, 
CancelHdl));
     AddTabPage(u"singlenum"_ustr, RID_SVXPAGE_PICK_SINGLE_NUM );
     AddTabPage(u"bullets"_ustr, RID_SVXPAGE_PICK_BULLET );
     AddTabPage(u"outlinenum"_ustr, RID_SVXPAGE_PICK_NUM );
@@ -946,4 +948,11 @@ IMPL_LINK_NOARG(SwSvxNumBulletTabDialog, 
RemoveNumberingHdl, weld::Button&, void
     m_xDialog->response(RET_USER);
 }
 
+IMPL_LINK_NOARG(SwSvxNumBulletTabDialog, CancelHdl, weld::Button&, void)
+{
+    PrepareCancel();
+
+    m_xDialog->response(RET_CANCEL);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/inc/num.hxx b/sw/source/uibase/inc/num.hxx
index 9dfa2bf9ea4f..1799ad3296cc 100644
--- a/sw/source/uibase/inc/num.hxx
+++ b/sw/source/uibase/inc/num.hxx
@@ -124,6 +124,7 @@ class SwSvxNumBulletTabDialog final : public 
SfxTabDialogController
     virtual short   Ok() override;
     virtual void    PageCreated(const OUString& rPageId, SfxTabPage& rPage) 
override;
     DECL_LINK(RemoveNumberingHdl, weld::Button&, void);
+    DECL_LINK(CancelHdl, weld::Button&, void);
 
     std::unique_ptr<weld::ComboBox> m_xDummyCombo;
 

Reply via email to