svx/source/tbxctrls/tbcontrl.cxx |   30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

New commits:
commit c2a77967cf16a9465f86b5aed62497141fbef535
Author:     Justin Luth <jl...@mail.com>
AuthorDate: Fri Jul 7 11:34:07 2023 -0400
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Wed Jul 12 21:05:45 2023 +0200

    tdf#125504 SvxStyleBox: don't use disposed DispatchProvider
    
    .uno:StyleApply in the notebookbar was doing nothing
    because the view switching from print preview caused
    the saved XDispatchProvider to become disposed.
    
    Thanks to Maxim, my patch is completely re-written.
    
    Change-Id: I655c393def75f966a97ac7a04395aee19befd132
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154196
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <jl...@mail.com>

diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index 0c16e26dbb06..0d862f8964f8 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -142,7 +142,6 @@ class SvxStyleBox_Base
 {
 public:
     SvxStyleBox_Base(std::unique_ptr<weld::ComboBox> xWidget, OUString  
rCommand, SfxStyleFamily eFamily,
-                     const Reference<XDispatchProvider>& rDispatchProvider,
                      const Reference<XFrame>& _xFrame, OUString 
aClearFormatKey,
                      OUString aMoreKey, bool bInSpecialMode, 
SvxStyleToolBoxControl& rCtrl);
 
@@ -237,7 +236,6 @@ protected:
     int                             m_nMaxUserDrawFontWidth;
     int                             m_nLastItemWithMenu;
     bool                            bRelease;
-    Reference< XDispatchProvider >  m_xDispatchProvider;
     Reference< XFrame >             m_xFrame;
     OUString                        m_aCommand;
     OUString                        aClearFormatKey;
@@ -257,7 +255,7 @@ class SvxStyleBox_Impl final : public InterimItemWindow
                              , public SvxStyleBox_Base
 {
 public:
-    SvxStyleBox_Impl(vcl::Window* pParent, const OUString& rCommand, 
SfxStyleFamily eFamily, const Reference< XDispatchProvider >& rDispatchProvider,
+    SvxStyleBox_Impl(vcl::Window* pParent, const OUString& rCommand, 
SfxStyleFamily eFamily,
                      const Reference< XFrame >& _xFrame,const OUString& 
rClearFormatKey, const OUString& rMoreKey, bool bInSpecialMode, 
SvxStyleToolBoxControl& rCtrl);
 
     virtual ~SvxStyleBox_Impl() override
@@ -864,7 +862,6 @@ class SfxStyleControllerItem_Impl : public SfxStatusListener
 SvxStyleBox_Base::SvxStyleBox_Base(std::unique_ptr<weld::ComboBox> xWidget,
                                    OUString aCommand,
                                    SfxStyleFamily eFamily,
-                                   const Reference< XDispatchProvider >& 
rDispatchProvider,
                                    const Reference< XFrame >& _xFrame,
                                    OUString _aClearFormatKey,
                                    OUString _aMoreKey,
@@ -877,7 +874,6 @@ 
SvxStyleBox_Base::SvxStyleBox_Base(std::unique_ptr<weld::ComboBox> xWidget,
     , m_nMaxUserDrawFontWidth(0)
     , m_nLastItemWithMenu(-1)
     , bRelease( true )
-    , m_xDispatchProvider( rDispatchProvider )
     , m_xFrame(_xFrame)
     , m_aCommand(std::move( aCommand ))
     , aClearFormatKey(std::move( _aClearFormatKey ))
@@ -909,14 +905,13 @@ IMPL_LINK(SvxStyleBox_Base, CustomGetSizeHdl, 
OutputDevice&, rArg, Size)
 SvxStyleBox_Impl::SvxStyleBox_Impl(vcl::Window* pParent,
                                    const OUString& rCommand,
                                    SfxStyleFamily eFamily,
-                                   const Reference< XDispatchProvider >& 
rDispatchProvider,
                                    const Reference< XFrame >& _xFrame,
                                    const OUString& rClearFormatKey,
                                    const OUString& rMoreKey,
                                    bool bInSpec, SvxStyleToolBoxControl& rCtrl)
     : InterimItemWindow(pParent, "svx/ui/applystylebox.ui", "ApplyStyleBox")
-    , SvxStyleBox_Base(m_xBuilder->weld_combo_box("applystyle"), rCommand, 
eFamily,
-                       rDispatchProvider, _xFrame, rClearFormatKey, rMoreKey, 
bInSpec, rCtrl)
+    , SvxStyleBox_Base(m_xBuilder->weld_combo_box("applystyle"), rCommand, 
eFamily, _xFrame,
+                       rClearFormatKey, rMoreKey, bInSpec, rCtrl)
 {
     InitControlBase(m_xWidget.get());
 
@@ -947,15 +942,14 @@ IMPL_LINK(SvxStyleBox_Base, MenuSelectHdl, const 
OUString&, rMenuIdent, void)
                                    comphelper::makePropertyValue("Family",
                                                                  sal_Int16( 
eStyleFamily )) };
 
+    const Reference<XDispatchProvider> xProvider(m_xFrame, UNO_QUERY);
     if (rMenuIdent == "update")
     {
-        SfxToolBoxControl::Dispatch( m_xDispatchProvider,
-            ".uno:StyleUpdateByExample", aArgs );
+        SfxToolBoxControl::Dispatch(xProvider, ".uno:StyleUpdateByExample", 
aArgs);
     }
     else if (rMenuIdent == "edit")
     {
-        SfxToolBoxControl::Dispatch( m_xDispatchProvider,
-            ".uno:EditStyle", aArgs );
+        SfxToolBoxControl::Dispatch(xProvider, ".uno:EditStyle", aArgs);
     }
 }
 
@@ -995,8 +989,8 @@ void SvxStyleBox_Base::Select(bool bNonTravelSelect)
             bClear = true;
             //not only apply default style but also call 'ClearFormatting'
             Sequence< PropertyValue > aEmptyVals;
-            SfxToolBoxControl::Dispatch( m_xDispatchProvider, 
".uno:ResetAttributes",
-                aEmptyVals);
+            const Reference<XDispatchProvider> xProvider(m_xFrame, UNO_QUERY);
+            SfxToolBoxControl::Dispatch(xProvider, ".uno:ResetAttributes", 
aEmptyVals);
         }
         else if (aSearchEntry == aMoreKey && m_xWidget->get_active() == 
(m_xWidget->get_count() - 1))
         {
@@ -1048,15 +1042,17 @@ void SvxStyleBox_Base::Select(bool bNonTravelSelect)
     pArgs[0].Value  <<= aSearchEntry;
     pArgs[1].Name   = "Family";
     pArgs[1].Value  <<= sal_Int16( eStyleFamily );
+
+    const Reference<XDispatchProvider> xProvider(m_xFrame, UNO_QUERY);
     if( bCreateNew )
     {
         pArgs[0].Name   = "Param";
-        SfxToolBoxControl::Dispatch( m_xDispatchProvider, 
".uno:StyleNewByExample", aArgs);
+        SfxToolBoxControl::Dispatch(xProvider, ".uno:StyleNewByExample", 
aArgs);
     }
     else
     {
         pArgs[0].Name   = "Template";
-        SfxToolBoxControl::Dispatch( m_xDispatchProvider, m_aCommand, aArgs );
+        SfxToolBoxControl::Dispatch(xProvider, m_aCommand, aArgs);
     }
 }
 
@@ -3348,7 +3344,6 @@ css::uno::Reference<css::awt::XWindow> 
SvxStyleToolBoxControl::createItemWindow(
         pImpl->m_xWeldBox.reset(new SvxStyleBox_Base(std::move(xWidget),
                                                      ".uno:StyleApply",
                                                      SfxStyleFamily::Para,
-                                                     Reference< 
XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
                                                      m_xFrame,
                                                      pImpl->aClearForm,
                                                      pImpl->aMore,
@@ -3365,7 +3360,6 @@ css::uno::Reference<css::awt::XWindow> 
SvxStyleToolBoxControl::createItemWindow(
             pImpl->m_xVclBox = VclPtr<SvxStyleBox_Impl>::Create(pParent,
                                                                 
".uno:StyleApply",
                                                                 
SfxStyleFamily::Para,
-                                                                Reference< 
XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
                                                                 m_xFrame,
                                                                 
pImpl->aClearForm,
                                                                 pImpl->aMore,

Reply via email to