svx/source/tbxctrls/tbcontrl.cxx |   37 +++++++++++++------------------------
 1 file changed, 13 insertions(+), 24 deletions(-)

New commits:
commit 24c04a2c13c2bf110c4b600f03236c35a5ddfd14
Author:     Justin Luth <jl...@mail.com>
AuthorDate: Fri Jul 7 12:27:52 2023 -0400
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Wed Jul 12 21:03:46 2023 +0200

    tdf#125504 SvxFontNameBox: don't use disposed DispatchProvider
    
    .uno:CharFontName 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: I5ac1aa870de2f4ac922f076a5401f1264d6b085f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154195
    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 da8493c75059..0c16e26dbb06 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -340,7 +340,6 @@ protected:
     vcl::Font                      aCurFont;
     sal_uInt16                     nFtCount;
     bool                           bRelease;
-    Reference< XDispatchProvider > m_xDispatchProvider;
     Reference< XFrame >            m_xFrame;
     bool            mbCheckingUnknownFont;
 
@@ -351,17 +350,16 @@ protected:
     void            EndPreview()
     {
         Sequence< PropertyValue > aArgs;
-        SfxToolBoxControl::Dispatch( m_xDispatchProvider,
-                                         ".uno:CharEndPreviewFontName",
-                                         aArgs );
+        const Reference<XDispatchProvider> xProvider(m_xFrame, UNO_QUERY);
+        SfxToolBoxControl::Dispatch(xProvider, ".uno:CharEndPreviewFontName", 
aArgs);
     }
 
     bool            CheckFontIsAvailable(std::u16string_view fontname);
     void            CheckAndMarkUnknownFont();
 
 public:
-    SvxFontNameBox_Base(std::unique_ptr<weld::ComboBox> xWidget, const 
Reference<XDispatchProvider>& rDispatchProvider,
-                        const Reference<XFrame>& rFrame, 
SvxFontNameToolBoxControl& rCtrl);
+    SvxFontNameBox_Base(std::unique_ptr<weld::ComboBox> xWidget, const 
Reference<XFrame>& rFrame,
+                        SvxFontNameToolBoxControl& rCtrl);
     virtual ~SvxFontNameBox_Base()
     {
         m_xListener->dispose();
@@ -423,7 +421,7 @@ private:
     virtual bool DoKeyInput(const KeyEvent& rKEvt) override;
 
 public:
-    SvxFontNameBox_Impl(vcl::Window* pParent, const 
Reference<XDispatchProvider>& rDispatchProvider,
+    SvxFontNameBox_Impl(vcl::Window* pParent,
                         const Reference<XFrame>& rFrame, 
SvxFontNameToolBoxControl& rCtrl);
 
     virtual void dispose() override
@@ -1717,7 +1715,6 @@ static bool lcl_GetDocFontList(const FontList** 
ppFontList, SvxFontNameBox_Base*
 }
 
 SvxFontNameBox_Base::SvxFontNameBox_Base(std::unique_ptr<weld::ComboBox> 
xWidget,
-                                         const Reference<XDispatchProvider>& 
rDispatchProvider,
                                          const Reference<XFrame>& rFrame,
                                          SvxFontNameToolBoxControl& rCtrl)
     : m_xListener(new 
comphelper::ConfigurationListener("/org.openoffice.Office.Common/Font/View"))
@@ -1728,7 +1725,6 @@ 
SvxFontNameBox_Base::SvxFontNameBox_Base(std::unique_ptr<weld::ComboBox> xWidget
     , pFontList(nullptr)
     , nFtCount(0)
     , bRelease(true)
-    , m_xDispatchProvider(rDispatchProvider)
     , m_xFrame(rFrame)
     , mbCheckingUnknownFont(false)
 {
@@ -1744,10 +1740,10 @@ 
SvxFontNameBox_Base::SvxFontNameBox_Base(std::unique_ptr<weld::ComboBox> xWidget
     m_xWidget->set_entry_width_chars(COMBO_WIDTH_IN_CHARS + 5);
 }
 
-SvxFontNameBox_Impl::SvxFontNameBox_Impl(vcl::Window* pParent, const 
Reference<XDispatchProvider>& rDispatchProvider,
-                                         const Reference<XFrame>& rFrame, 
SvxFontNameToolBoxControl& rCtrl)
+SvxFontNameBox_Impl::SvxFontNameBox_Impl(vcl::Window* pParent, const 
Reference<XFrame>& rFrame,
+                                         SvxFontNameToolBoxControl& rCtrl)
     : InterimItemWindow(pParent, "svx/ui/fontnamebox.ui", "FontNameBox")
-    , SvxFontNameBox_Base(m_xBuilder->weld_combo_box("fontnamecombobox"), 
rDispatchProvider, rFrame, rCtrl)
+    , SvxFontNameBox_Base(m_xBuilder->weld_combo_box("fontnamecombobox"), 
rFrame, rCtrl)
 {
     set_id("fontnamecombobox");
     SetOptimalSize();
@@ -1969,6 +1965,7 @@ void SvxFontNameBox_Base::Select(bool bNonTravelSelect)
         pArgs[0].Value  = a;
     }
 
+    const Reference<XDispatchProvider> xProvider(m_xFrame, UNO_QUERY);
     if (bNonTravelSelect)
     {
         CheckAndMarkUnknownFont();
@@ -1980,9 +1977,7 @@ void SvxFontNameBox_Base::Select(bool bNonTravelSelect)
         if (pFontItem)
         {
             pArgs[0].Name   = "CharFontName";
-            SfxToolBoxControl::Dispatch( m_xDispatchProvider,
-                                         ".uno:CharFontName",
-                                         aArgs );
+            SfxToolBoxControl::Dispatch(xProvider, ".uno:CharFontName", aArgs);
         }
     }
     else
@@ -1990,9 +1985,7 @@ void SvxFontNameBox_Base::Select(bool bNonTravelSelect)
         if (pFontItem)
         {
             pArgs[0].Name   = "CharPreviewFontName";
-            SfxToolBoxControl::Dispatch( m_xDispatchProvider,
-                                         ".uno:CharPreviewFontName",
-                                         aArgs );
+            SfxToolBoxControl::Dispatch(xProvider, ".uno:CharPreviewFontName", 
aArgs);
         }
     }
 }
@@ -3445,9 +3438,7 @@ css::uno::Reference<css::awt::XWindow> 
SvxFontNameToolBoxControl::createItemWind
 
         xItemWindow = css::uno::Reference<css::awt::XWindow>(new 
weld::TransportAsXWindow(xWidget.get()));
 
-        m_xWeldBox.reset(new SvxFontNameBox_Base(std::move(xWidget),
-                                                 
Reference<XDispatchProvider>(m_xFrame->getController(), UNO_QUERY),
-                                                 m_xFrame, *this));
+        m_xWeldBox.reset(new SvxFontNameBox_Base(std::move(xWidget), m_xFrame, 
*this));
         m_pBox = m_xWeldBox.get();
     }
     else
@@ -3456,9 +3447,7 @@ css::uno::Reference<css::awt::XWindow> 
SvxFontNameToolBoxControl::createItemWind
         if ( pParent )
         {
             SolarMutexGuard aSolarMutexGuard;
-            m_xVclBox = VclPtr<SvxFontNameBox_Impl>::Create(pParent,
-                                                            
Reference<XDispatchProvider>(m_xFrame->getController(), UNO_QUERY),
-                                                            m_xFrame, *this);
+            m_xVclBox = VclPtr<SvxFontNameBox_Impl>::Create(pParent, m_xFrame, 
*this);
             m_pBox = m_xVclBox.get();
             xItemWindow = VCLUnoHelper::GetInterface(m_xVclBox);
         }

Reply via email to