[Libreoffice-commits] core.git: include/svtools svx/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Mon Apr 20 17:45:09 UTC 2020


 include/svtools/toolboxcontroller.hxx   |    2 
 svx/source/tbxctrls/tbunocontroller.cxx |  249 ++++++++++++++++++++------------
 2 files changed, 160 insertions(+), 91 deletions(-)

New commits:
commit 96808b8422e94e9db73d582e6846d7423bd1d3db
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Mon Apr 20 12:16:17 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Apr 20 19:44:32 2020 +0200

    weld SvxFontSizeBox_Impl
    
    Change-Id: Ied8ef61226a720acac74db78ae5852cd4e624d14
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92562
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/svtools/toolboxcontroller.hxx b/include/svtools/toolboxcontroller.hxx
index bcf688ded0c6..bf8e2b6b2864 100644
--- a/include/svtools/toolboxcontroller.hxx
+++ b/include/svtools/toolboxcontroller.hxx
@@ -129,6 +129,8 @@ class SVT_DLLPUBLIC ToolboxController :
 
         void enable( bool bEnable );
 
+        bool IsInSidebar() const { return m_bSidebar; }
+
     protected:
         bool getToolboxId( sal_uInt16& rItemId, ToolBox** ppToolBox );
         struct Listener
diff --git a/svx/source/tbxctrls/tbunocontroller.cxx b/svx/source/tbxctrls/tbunocontroller.cxx
index 33cf5c4ed6c8..3e3d9ce2751b 100644
--- a/svx/source/tbxctrls/tbunocontroller.cxx
+++ b/svx/source/tbxctrls/tbunocontroller.cxx
@@ -27,6 +27,7 @@
 
 #include <vcl/event.hxx>
 #include <vcl/svapp.hxx>
+#include <vcl/weldutils.hxx>
 #include <vcl/window.hxx>
 #include <vcl/settings.hxx>
 #include <toolkit/helper/vclunohelper.hxx>
@@ -46,7 +47,9 @@ using namespace ::com::sun::star;
 
 namespace {
 
+class SvxFontSizeBox_Base;
 class SvxFontSizeBox_Impl;
+
 class FontHeightToolBoxControl : public svt::ToolboxController,
                                  public lang::XServiceInfo
 {
@@ -81,40 +84,43 @@ class FontHeightToolBoxControl : public svt::ToolboxController,
         using svt::ToolboxController::dispatchCommand;
 
     private:
-        VclPtr<SvxFontSizeBox_Impl>           m_pBox;
+        VclPtr<SvxFontSizeBox_Impl> m_xVclBox;
+        std::unique_ptr<SvxFontSizeBox_Base> m_xWeldBox;
+        SvxFontSizeBox_Base* m_pBox;
         css::awt::FontDescriptor m_aCurrentFont;
 };
 
-class SvxFontSizeBox_Impl final : public InterimItemWindow
+class SvxFontSizeBox_Base
 {
 public:
-                        SvxFontSizeBox_Impl( vcl::Window* pParent,
-                                             const uno::Reference< frame::XFrame >& _xFrame,
-                                             FontHeightToolBoxControl& rCtrl );
+    SvxFontSizeBox_Base(std::unique_ptr<weld::ComboBox> xWidget,
+                        const uno::Reference< frame::XFrame >& _xFrame,
+                        FontHeightToolBoxControl& rCtrl);
 
-    virtual void        dispose() override;
-    virtual             ~SvxFontSizeBox_Impl() override;
-    void                statusChanged_Impl( long nHeight, bool bErase );
-    void                UpdateFont( const css::awt::FontDescriptor& rCurrentFont );
-    void                SetOptimalSize();
+    virtual ~SvxFontSizeBox_Base()
+    {
+    }
 
-    virtual void        DataChanged( const DataChangedEvent& rDCEvt ) override;
-    virtual void        GetFocus() override;
+    virtual void set_sensitive(bool bSensitive)
+    {
+        m_xWidget->set_sensitive(bSensitive);
+    }
 
-    void Enable() {m_xWidget->set_sensitive(true); InterimItemWindow::Enable();}
-    void Disable() {m_xWidget->set_sensitive(false); InterimItemWindow::Disable();}
+    void statusChanged_Impl(long nHeight, bool bErase);
+    void UpdateFont(const css::awt::FontDescriptor& rCurrentFont);
 
-private:
-    FontHeightToolBoxControl&                  m_rCtrl;
-    OUString                                   m_aCurText;
-    bool                                       m_bRelease;
-    uno::Reference< frame::XFrame >            m_xFrame;
-    std::unique_ptr<FontSizeBox>            m_xWidget;
+protected:
+    FontHeightToolBoxControl& m_rCtrl;
+    OUString m_aCurText;
+    bool m_bRelease;
+    uno::Reference<frame::XFrame> m_xFrame;
+    std::unique_ptr<FontSizeBox> m_xWidget;
 
     void                ReleaseFocus_Impl();
-
     void                Select();
 
+    virtual bool DoKeyInput(const KeyEvent& rKEvt);
+
     DECL_LINK(SelectHdl, weld::ComboBox&, void);
     DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
     DECL_LINK(ActivateHdl, weld::ComboBox&, bool);
@@ -122,48 +128,69 @@ private:
     DECL_LINK(DumpAsPropertyTreeHdl, boost::property_tree::ptree&, void);
 };
 
-SvxFontSizeBox_Impl::SvxFontSizeBox_Impl(
-    vcl::Window*                                      _pParent,
-    const uno::Reference< frame::XFrame >&            _xFrame,
-    FontHeightToolBoxControl&                         _rCtrl ) :
+class SvxFontSizeBox_Impl final : public InterimItemWindow
+                                , public SvxFontSizeBox_Base
+{
+public:
+    SvxFontSizeBox_Impl(vcl::Window* pParent,
+                        const uno::Reference< frame::XFrame >& _xFrame,
+                        FontHeightToolBoxControl& rCtrl);
 
-    InterimItemWindow(_pParent, "svx/ui/fontsizebox.ui", "FontSizeBox"),
+    virtual void dispose() override
+    {
+        m_xWidget.reset();
+        InterimItemWindow::dispose();
+    }
 
-    m_rCtrl             ( _rCtrl ),
-    m_bRelease          ( true ),
-    m_xFrame            ( _xFrame ),
-    m_xWidget(new FontSizeBox(m_xBuilder->weld_combo_box("fontsizecombobox")))
-{
-    m_xWidget->set_value(0);
-    m_xWidget->set_entry_text("");
-    m_xWidget->disable_entry_completion();
+    virtual void GetFocus() override
+    {
+        if (m_xWidget)
+            m_xWidget->grab_focus();
+        InterimItemWindow::GetFocus();
+    }
 
-    m_xWidget->connect_changed(LINK(this, SvxFontSizeBox_Impl, SelectHdl));
-    m_xWidget->connect_key_press(LINK(this, SvxFontSizeBox_Impl, KeyInputHdl));
-    m_xWidget->connect_entry_activate(LINK(this, SvxFontSizeBox_Impl, ActivateHdl));
-    m_xWidget->connect_focus_out(LINK(this, SvxFontSizeBox_Impl, FocusOutHdl));
-    m_xWidget->connect_get_property_tree(LINK(this, SvxFontSizeBox_Impl, DumpAsPropertyTreeHdl));
-}
+    virtual ~SvxFontSizeBox_Impl() override
+    {
+        disposeOnce();
+    }
 
-void SvxFontSizeBox_Impl::dispose()
-{
-    m_xWidget.reset();
-    InterimItemWindow::dispose();
-}
+    void SetOptimalSize();
 
-SvxFontSizeBox_Impl::~SvxFontSizeBox_Impl()
-{
-    disposeOnce();
-}
+    virtual void DataChanged(const DataChangedEvent& rDCEvt) override;
+
+    virtual void set_sensitive(bool bSensitive) override
+    {
+        m_xWidget->set_sensitive(bSensitive);
+        if (bSensitive)
+            InterimItemWindow::Enable();
+        else
+            InterimItemWindow::Disable();
+    }
 
-void SvxFontSizeBox_Impl::GetFocus()
+private:
+    virtual bool DoKeyInput(const KeyEvent& rKEvt) override;
+};
+
+SvxFontSizeBox_Base::SvxFontSizeBox_Base(std::unique_ptr<weld::ComboBox> xWidget,
+                                         const uno::Reference< frame::XFrame >& rFrame,
+                                         FontHeightToolBoxControl& rCtrl)
+    : m_rCtrl(rCtrl)
+    , m_bRelease(true)
+    , m_xFrame(rFrame)
+    , m_xWidget(new FontSizeBox(std::move(xWidget)))
 {
-    if (m_xWidget)
-        m_xWidget->grab_focus();
-    InterimItemWindow::GetFocus();
+    m_xWidget->set_value(0);
+    m_xWidget->set_entry_text("");
+    m_xWidget->disable_entry_completion();
+
+    m_xWidget->connect_changed(LINK(this, SvxFontSizeBox_Base, SelectHdl));
+    m_xWidget->connect_key_press(LINK(this, SvxFontSizeBox_Base, KeyInputHdl));
+    m_xWidget->connect_entry_activate(LINK(this, SvxFontSizeBox_Base, ActivateHdl));
+    m_xWidget->connect_focus_out(LINK(this, SvxFontSizeBox_Base, FocusOutHdl));
+    m_xWidget->connect_get_property_tree(LINK(this, SvxFontSizeBox_Base, DumpAsPropertyTreeHdl));
 }
 
-void SvxFontSizeBox_Impl::ReleaseFocus_Impl()
+void SvxFontSizeBox_Base::ReleaseFocus_Impl()
 {
     if ( !m_bRelease )
     {
@@ -175,19 +202,19 @@ void SvxFontSizeBox_Impl::ReleaseFocus_Impl()
         m_xFrame->getContainerWindow()->setFocus();
 }
 
-IMPL_LINK(SvxFontSizeBox_Impl, SelectHdl, weld::ComboBox&, rCombo, void)
+IMPL_LINK(SvxFontSizeBox_Base, SelectHdl, weld::ComboBox&, rCombo, void)
 {
     if (rCombo.changed_by_direct_pick()) // only when picked from the list
         Select();
 }
 
-IMPL_LINK_NOARG(SvxFontSizeBox_Impl, ActivateHdl, weld::ComboBox&, bool)
+IMPL_LINK_NOARG(SvxFontSizeBox_Base, ActivateHdl, weld::ComboBox&, bool)
 {
     Select();
     return true;
 }
 
-void SvxFontSizeBox_Impl::Select()
+void SvxFontSizeBox_Base::Select()
 {
     sal_Int64 nSelVal = m_xWidget->get_value();
     float fSelVal     = float( nSelVal ) / 10;
@@ -204,7 +231,7 @@ void SvxFontSizeBox_Impl::Select()
     m_rCtrl.dispatchCommand( aArgs );
 }
 
-void SvxFontSizeBox_Impl::statusChanged_Impl( long nPoint, bool bErase )
+void SvxFontSizeBox_Base::statusChanged_Impl( long nPoint, bool bErase )
 {
     if ( !bErase )
     {
@@ -224,31 +251,34 @@ void SvxFontSizeBox_Impl::statusChanged_Impl( long nPoint, bool bErase )
     m_aCurText = m_xWidget->get_active_text();
 }
 
-void SvxFontSizeBox_Impl::UpdateFont( const css::awt::FontDescriptor& rCurrentFont )
+void SvxFontSizeBox_Base::UpdateFont(const css::awt::FontDescriptor& rCurrentFont)
 {
     // filling up the sizes list
     auto nOldVal = m_xWidget->get_value(); // memorize old value
-    const FontList* _pFontList = nullptr;
-    std::unique_ptr<FontList> aHold( new FontList( this ));
-    _pFontList = aHold.get();
+    std::unique_ptr<FontList> xFontList(new FontList(Application::GetDefaultDevice()));
 
-    if ( !rCurrentFont.Name.isEmpty() )
+    if (!rCurrentFont.Name.isEmpty())
     {
-        FontMetric _aFontMetric;
-        _aFontMetric.SetFamilyName( rCurrentFont.Name );
-        _aFontMetric.SetStyleName( rCurrentFont.StyleName );
-        _aFontMetric.SetFontHeight( rCurrentFont.Height );
-        m_xWidget->Fill(&_aFontMetric, _pFontList);
+        FontMetric aFontMetric;
+        aFontMetric.SetFamilyName(rCurrentFont.Name);
+        aFontMetric.SetStyleName(rCurrentFont.StyleName);
+        aFontMetric.SetFontHeight(rCurrentFont.Height);
+        m_xWidget->Fill(&aFontMetric, xFontList.get());
     }
     else
     {
-        m_xWidget->Fill(nullptr, _pFontList);
+        m_xWidget->Fill(nullptr, xFontList.get());
     }
     m_xWidget->set_value(nOldVal); // restore old value
     m_aCurText = m_xWidget->get_active_text(); // memorize to reset at ESC
 }
 
-IMPL_LINK(SvxFontSizeBox_Impl, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+IMPL_LINK(SvxFontSizeBox_Base, KeyInputHdl, const KeyEvent&, rKEvt, bool)
+{
+    return DoKeyInput(rKEvt);
+}
+
+bool SvxFontSizeBox_Base::DoKeyInput(const KeyEvent& rKEvt)
 {
     bool bHandled = false;
 
@@ -263,16 +293,23 @@ IMPL_LINK(SvxFontSizeBox_Impl, KeyInputHdl, const KeyEvent&, rKEvt, bool)
 
         case KEY_ESCAPE:
             m_xWidget->set_entry_text(m_aCurText);
-            if ( typeid( *GetParent() ) != typeid( sfx2::sidebar::SidebarToolBox ) )
+            if (!m_rCtrl.IsInSidebar())
+            {
                 ReleaseFocus_Impl();
-            bHandled = true;
+                bHandled = true;
+            }
             break;
     }
 
-    return bHandled || ChildKeyInput(rKEvt);
+    return bHandled;
+}
+
+bool SvxFontSizeBox_Impl::DoKeyInput(const KeyEvent& rKEvt)
+{
+    return SvxFontSizeBox_Base::DoKeyInput(rKEvt) || ChildKeyInput(rKEvt);
 }
 
-IMPL_LINK_NOARG(SvxFontSizeBox_Impl, FocusOutHdl, weld::Widget&, void)
+IMPL_LINK_NOARG(SvxFontSizeBox_Base, FocusOutHdl, weld::Widget&, void)
 {
     if (!m_xWidget->has_focus()) // a combobox can be comprised of different subwidget so double-check if none of those has focus
         m_xWidget->set_entry_text(m_aCurText);
@@ -283,6 +320,14 @@ void SvxFontSizeBox_Impl::SetOptimalSize()
     SetSizePixel(get_preferred_size());
 }
 
+SvxFontSizeBox_Impl::SvxFontSizeBox_Impl(vcl::Window* pParent,
+                                         const uno::Reference<frame::XFrame>& rFrame,
+                                         FontHeightToolBoxControl& rCtrl)
+    : InterimItemWindow(pParent, "svx/ui/fontsizebox.ui", "FontSizeBox")
+    , SvxFontSizeBox_Base(m_xBuilder->weld_combo_box("fontsizecombobox"), rFrame, rCtrl)
+{
+}
+
 void SvxFontSizeBox_Impl::DataChanged( const DataChangedEvent& rDCEvt )
 {
     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
@@ -292,7 +337,7 @@ void SvxFontSizeBox_Impl::DataChanged( const DataChangedEvent& rDCEvt )
     }
 }
 
-IMPL_LINK(SvxFontSizeBox_Impl, DumpAsPropertyTreeHdl, boost::property_tree::ptree&, rTree, void)
+IMPL_LINK(SvxFontSizeBox_Base, DumpAsPropertyTreeHdl, boost::property_tree::ptree&, rTree, void)
 {
     boost::property_tree::ptree aEntries;
 
@@ -372,7 +417,9 @@ void SAL_CALL FontHeightToolBoxControl::dispose()
     svt::ToolboxController::dispose();
 
     SolarMutexGuard aSolarMutexGuard;
-    m_pBox.disposeAndClear();
+    m_xVclBox.disposeAndClear();
+    m_xWeldBox.reset();
+    m_pBox = nullptr;
 }
 
 // XStatusListener
@@ -382,16 +429,11 @@ void SAL_CALL FontHeightToolBoxControl::statusChanged(
     if ( m_pBox )
     {
         SolarMutexGuard aSolarMutexGuard;
-        if ( rEvent.FeatureURL.Path == "FontHeight" )
+        if (rEvent.FeatureURL.Path == "FontHeight")
         {
-            ToolBox* pToolBox = nullptr;
-            sal_uInt16 nId = 0;
-            if ( !getToolboxId( nId, &pToolBox ) )
-                return;
-
             if ( rEvent.IsEnabled )
             {
-                m_pBox->Enable();
+                m_pBox->set_sensitive(true);
                 frame::status::FontHeight aFontHeight;
                 if ( rEvent.State >>= aFontHeight )
                     m_pBox->statusChanged_Impl( long( 10. * aFontHeight.Height ), false );
@@ -400,11 +442,19 @@ void SAL_CALL FontHeightToolBoxControl::statusChanged(
             }
             else
             {
-                m_pBox->Disable();
+                m_pBox->set_sensitive(false);
                 m_pBox->statusChanged_Impl( long( -1 ), true );
             }
 
-            pToolBox->EnableItem( nId, rEvent.IsEnabled );
+            if (m_pToolbar)
+                m_pToolbar->set_item_sensitive(m_aCommandURL.toUtf8(), rEvent.IsEnabled);
+            else
+            {
+                ToolBox* pToolBox = nullptr;
+                sal_uInt16 nId = 0;
+                if (getToolboxId(nId, &pToolBox))
+                    pToolBox->EnableItem(nId, rEvent.IsEnabled);
+            }
         }
         else if ( rEvent.FeatureURL.Path == "CharFontName" )
         {
@@ -437,16 +487,33 @@ uno::Reference< awt::XWindow > SAL_CALL FontHeightToolBoxControl::createItemWind
 {
     uno::Reference< awt::XWindow > xItemWindow;
 
-    VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent );
-    if ( pParent )
+    if (m_pBuilder)
     {
         SolarMutexGuard aSolarMutexGuard;
-        m_pBox = VclPtr<SvxFontSizeBox_Impl>::Create( pParent, m_xFrame, *this );
+
+        std::unique_ptr<weld::ComboBox> xWidget(m_pBuilder->weld_combo_box("fontsizecombobox"));
+
+        xItemWindow = css::uno::Reference<css::awt::XWindow>(new weld::TransportAsXWindow(xWidget.get()));
+
+        m_xWeldBox.reset(new SvxFontSizeBox_Base(std::move(xWidget), m_xFrame, *this));
+        m_pBox = m_xWeldBox.get();
         //Get the box to fill itself with all its sizes
         m_pBox->UpdateFont(m_aCurrentFont);
-        //Make it size itself to its optimal size re above sizes
-        m_pBox->SetOptimalSize();
-        xItemWindow = VCLUnoHelper::GetInterface( m_pBox );
+    }
+    else
+    {
+        VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xParent );
+        if ( pParent )
+        {
+            SolarMutexGuard aSolarMutexGuard;
+            m_xVclBox = VclPtr<SvxFontSizeBox_Impl>::Create( pParent, m_xFrame, *this );
+            m_pBox = m_xVclBox.get();
+            //Get the box to fill itself with all its sizes
+            m_pBox->UpdateFont(m_aCurrentFont);
+            //Make it size itself to its optimal size re above sizes
+            m_xVclBox->SetOptimalSize();
+            xItemWindow = VCLUnoHelper::GetInterface(m_xVclBox);
+        }
     }
 
     return xItemWindow;


More information about the Libreoffice-commits mailing list