weld sidebar text panel

includes

weld SvxFontNameToolBoxControl

Change-Id: Ie48338243600c07f9f8c609701c137175133f8e3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92585
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/svx/source/sidebar/text/TextPropertyPanel.cxx b/svx/source/sidebar/text/TextPropertyPanel.cxx
index 7cc3c79..8944f85 100644
--- a/svx/source/sidebar/text/TextPropertyPanel.cxx
+++ b/svx/source/sidebar/text/TextPropertyPanel.cxx
@@ -20,7 +20,6 @@
#include "TextPropertyPanel.hxx"

#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <vcl/toolbox.hxx>
#include <comphelper/lok.hxx>
#include <sfx2/lokhelper.hxx>

@@ -41,20 +40,33 @@ VclPtr<vcl::Window> TextPropertyPanel::Create (
}

TextPropertyPanel::TextPropertyPanel ( vcl::Window* pParent, const css::uno::Reference<css::frame::XFrame>& rxFrame )
    : PanelLayout(pParent, "SidebarTextPanel", "svx/ui/sidebartextpanel.ui", rxFrame)
    : PanelLayout(pParent, "SidebarTextPanel", "svx/ui/sidebartextpanel.ui", rxFrame, true)
    , mxFont(m_xBuilder->weld_toolbar("font"))
    , mxFontDispatch(new ToolbarUnoDispatcher(*mxFont, *m_xBuilder, rxFrame))
    , mxFontHeight(m_xBuilder->weld_toolbar("fontheight"))
    , mxFontHeightDispatch(new ToolbarUnoDispatcher(*mxFontHeight, *m_xBuilder, rxFrame))
    , mxFontEffects(m_xBuilder->weld_toolbar("fonteffects"))
    , mxFontEffectsDispatch(new ToolbarUnoDispatcher(*mxFontEffects, *m_xBuilder, rxFrame))
    , mxFontAdjust(m_xBuilder->weld_toolbar("fontadjust"))
    , mxFontAdjustDispatch(new ToolbarUnoDispatcher(*mxFontAdjust, *m_xBuilder, rxFrame))
    , mxToolBoxFontColorSw(m_xBuilder->weld_toolbar("colorbar_writer"))
    , mxToolBoxFontColorSwDispatch(new ToolbarUnoDispatcher(*mxToolBoxFontColorSw, *m_xBuilder, rxFrame))
    , mxToolBoxFontColor(m_xBuilder->weld_toolbar("colorbar_others"))
    , mxToolBoxFontColorDispatch(new ToolbarUnoDispatcher(*mxToolBoxFontColor, *m_xBuilder, rxFrame))
    , mxToolBoxBackgroundColor(m_xBuilder->weld_toolbar("colorbar_background"))
    , mxToolBoxBackgroundColorDispatch(new ToolbarUnoDispatcher(*mxToolBoxBackgroundColor, *m_xBuilder, rxFrame))
    , mxResetBar(m_xBuilder->weld_toolbar("resetattr"))
    , mxResetBarDispatch(new ToolbarUnoDispatcher(*mxResetBar, *m_xBuilder, rxFrame))
    , mxPositionBar(m_xBuilder->weld_toolbar("position"))
    , mxPositionBarDispatch(new ToolbarUnoDispatcher(*mxPositionBar, *m_xBuilder, rxFrame))
    , mxSpacingBar(m_xBuilder->weld_toolbar("spacingbar"))
    , mxSpacingBarDispatch(new ToolbarUnoDispatcher(*mxSpacingBar, *m_xBuilder, rxFrame))
{
    get(mpToolBoxFontColorSw, "colorbar_writer");
    get(mpToolBoxFontColor, "colorbar_others");
    get(mpToolBoxBackgroundColor, "colorbar_background");

    bool isMobilePhone = false;
    if (comphelper::LibreOfficeKit::isActive() &&
        comphelper::LibreOfficeKit::isMobilePhone(SfxLokHelper::getView()))
        isMobilePhone = true;
    VclPtr<ToolBox> xSpacingBar;
    get(xSpacingBar, "spacingbar");
    xSpacingBar->Show(!isMobilePhone);
    xSpacingBar->ShowItem(0, !isMobilePhone);
    mxSpacingBar->set_visible(!isMobilePhone);
}

TextPropertyPanel::~TextPropertyPanel()
@@ -64,9 +76,27 @@ TextPropertyPanel::~TextPropertyPanel()

void TextPropertyPanel::dispose()
{
    mpToolBoxFontColorSw.clear();
    mpToolBoxFontColor.clear();
    mpToolBoxBackgroundColor.clear();
    mxResetBarDispatch.reset();
    mxPositionBarDispatch.reset();
    mxSpacingBarDispatch.reset();
    mxToolBoxFontColorSwDispatch.reset();
    mxToolBoxFontColorDispatch.reset();
    mxToolBoxBackgroundColorDispatch.reset();
    mxFontAdjustDispatch.reset();
    mxFontEffectsDispatch.reset();
    mxFontHeightDispatch.reset();
    mxFontDispatch.reset();

    mxResetBar.reset();
    mxPositionBar.reset();
    mxSpacingBar.reset();
    mxToolBoxFontColorSw.reset();
    mxToolBoxFontColor.reset();
    mxToolBoxBackgroundColor.reset();
    mxFontAdjust.reset();
    mxFontEffects.reset();
    mxFontHeight.reset();
    mxFont.reset();

    PanelLayout::dispose();
}
@@ -106,9 +136,9 @@ void TextPropertyPanel::HandleContextChange (
            break;
    }

    mpToolBoxFontColor->Show(!bWriterText);
    mpToolBoxFontColorSw->Show(bWriterText);
    mpToolBoxBackgroundColor->Show(bDrawText);
    mxToolBoxFontColor->set_visible(!bWriterText);
    mxToolBoxFontColorSw->set_visible(bWriterText);
    mxToolBoxBackgroundColor->set_visible(bDrawText);
}

} // end of namespace svx::sidebar
diff --git a/svx/source/sidebar/text/TextPropertyPanel.hxx b/svx/source/sidebar/text/TextPropertyPanel.hxx
index bbfe13f..bfa9054 100644
--- a/svx/source/sidebar/text/TextPropertyPanel.hxx
+++ b/svx/source/sidebar/text/TextPropertyPanel.hxx
@@ -20,11 +20,10 @@
#define INCLUDED_SVX_SOURCE_SIDEBAR_TEXT_TEXTPROPERTYPANEL_HXX

#include <sfx2/sidebar/IContextChangeReceiver.hxx>
#include <sfx2/weldutils.hxx>
#include <vcl/EnumContext.hxx>
#include <svx/sidebar/PanelLayout.hxx>

class ToolBox;

namespace svx { namespace sidebar {

class TextPropertyPanel
@@ -47,9 +46,26 @@ public:
        const css::uno::Reference<css::frame::XFrame>& rxFrame);

private:
    VclPtr<ToolBox> mpToolBoxFontColorSw;
    VclPtr<ToolBox> mpToolBoxFontColor;
    VclPtr<ToolBox> mpToolBoxBackgroundColor;
    std::unique_ptr<weld::Toolbar> mxFont;
    std::unique_ptr<ToolbarUnoDispatcher> mxFontDispatch;
    std::unique_ptr<weld::Toolbar> mxFontHeight;
    std::unique_ptr<ToolbarUnoDispatcher> mxFontHeightDispatch;
    std::unique_ptr<weld::Toolbar> mxFontEffects;
    std::unique_ptr<ToolbarUnoDispatcher> mxFontEffectsDispatch;
    std::unique_ptr<weld::Toolbar> mxFontAdjust;
    std::unique_ptr<ToolbarUnoDispatcher> mxFontAdjustDispatch;
    std::unique_ptr<weld::Toolbar> mxToolBoxFontColorSw;
    std::unique_ptr<ToolbarUnoDispatcher> mxToolBoxFontColorSwDispatch;
    std::unique_ptr<weld::Toolbar> mxToolBoxFontColor;
    std::unique_ptr<ToolbarUnoDispatcher> mxToolBoxFontColorDispatch;
    std::unique_ptr<weld::Toolbar> mxToolBoxBackgroundColor;
    std::unique_ptr<ToolbarUnoDispatcher> mxToolBoxBackgroundColorDispatch;
    std::unique_ptr<weld::Toolbar> mxResetBar;
    std::unique_ptr<ToolbarUnoDispatcher> mxResetBarDispatch;
    std::unique_ptr<weld::Toolbar> mxPositionBar;
    std::unique_ptr<ToolbarUnoDispatcher> mxPositionBarDispatch;
    std::unique_ptr<weld::Toolbar> mxSpacingBar;
    std::unique_ptr<ToolbarUnoDispatcher> mxSpacingBarDispatch;

    vcl::EnumContext maContext;
};
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index 523d281..fef375d 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -31,6 +31,7 @@
#include <vcl/toolbox.hxx>
#include <vcl/customweld.hxx>
#include <vcl/vclptr.hxx>
#include <vcl/weldutils.hxx>
#include <svtools/valueset.hxx>
#include <svtools/ctrlbox.hxx>
#include <svl/style.hxx>
@@ -178,9 +179,41 @@ private:

namespace {

class SvxFontNameBox_Impl final : public InterimItemWindow
class SvxFontNameBox_Impl;
class SvxFontNameBox_Base;

class SvxFontNameToolBoxControl : public cppu::ImplInheritanceHelper< svt::ToolboxController,
                                                                      css::lang::XServiceInfo >
{
public:
    SvxFontNameToolBoxControl();

    // XStatusListener
    virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;

    // XToolbarController
    virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& rParent ) override;

    // XComponent
    virtual void SAL_CALL dispose() override;

    // XServiceInfo
    virtual OUString SAL_CALL getImplementationName() override;
    virtual sal_Bool SAL_CALL supportsService( const OUString& rServiceName ) override;
    virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;

private:
    VclPtr<SvxFontNameBox_Impl> m_xVclBox;
    std::unique_ptr<SvxFontNameBox_Base> m_xWeldBox;
    SvxFontNameBox_Base* m_pBox;
};

class SvxFontNameBox_Base
{
protected:
    SvxFontNameToolBoxControl& m_rCtrl;
    int m_nCharWidth;

    std::unique_ptr<FontNameBox>   m_xWidget;
    const FontList*                pFontList;
    ::std::unique_ptr<FontList>    m_aOwnFontList;
@@ -206,15 +239,12 @@ private:
    }
    void            CheckAndMarkUnknownFont();

    void            SetOptimalSize();

    virtual void    DataChanged( const DataChangedEvent& rDCEvt ) override;
    virtual void    GetFocus() override;

public:
    SvxFontNameBox_Impl(vcl::Window* pParent, const Reference<XDispatchProvider>& rDispatchProvider, const Reference<XFrame>& _xFrame);
    virtual ~SvxFontNameBox_Impl() override;
    virtual void dispose() override;
    SvxFontNameBox_Base(std::unique_ptr<weld::ComboBox> xWidget, const Reference<XDispatchProvider>& rDispatchProvider,
                        const Reference<XFrame>& rFrame, SvxFontNameToolBoxControl& rCtrl);
    virtual ~SvxFontNameBox_Base()
    {
    }

    void            FillList();
    void            Update( const css::awt::FontDescriptor* pFontDesc );
@@ -226,16 +256,19 @@ public:
        nFtCount = pList->GetFontNameCount();
    }

    virtual Reference< css::accessibility::XAccessible > CreateAccessible() override;
    void     SetOwnFontList(::std::unique_ptr<FontList> && _aOwnFontList) { m_aOwnFontList = std::move(_aOwnFontList); }
    void SetOwnFontList(::std::unique_ptr<FontList> && _aOwnFontList) { m_aOwnFontList = std::move(_aOwnFontList); }

    void Enable() {m_xWidget->set_sensitive(true); InterimItemWindow::Enable();}
    void Disable() {m_xWidget->set_sensitive(false); InterimItemWindow::Disable();}
    virtual void set_sensitive(bool bSensitive)
    {
        m_xWidget->set_sensitive(bSensitive);
    }

    void set_active_or_entry_text(const OUString& rText);

    void statusChanged_Impl(const css::frame::FeatureStateEvent& rEvent);

    virtual bool DoKeyInput(const KeyEvent& rKEvt);

    DECL_LINK(SelectHdl, weld::ComboBox&, void);
    DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
    DECL_LINK(ActivateHdl, weld::ComboBox&, bool);
@@ -244,6 +277,50 @@ public:
    DECL_LINK(DumpAsPropertyTreeHdl, boost::property_tree::ptree&, void);
};

class SvxFontNameBox_Impl final : public InterimItemWindow
                                , public SvxFontNameBox_Base
{
private:
    virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
    virtual void GetFocus() override
    {
        if (m_xWidget)
            m_xWidget->grab_focus();
        InterimItemWindow::GetFocus();
    }

    void            SetOptimalSize();

    virtual bool DoKeyInput(const KeyEvent& rKEvt) override;

public:
    SvxFontNameBox_Impl(vcl::Window* pParent, const Reference<XDispatchProvider>& rDispatchProvider,
                        const Reference<XFrame>& rFrame, SvxFontNameToolBoxControl& rCtrl);

    virtual void dispose() override
    {
        m_xWidget.reset();
        InterimItemWindow::dispose();
    }

    virtual ~SvxFontNameBox_Impl() override
    {
        disposeOnce();
    }

    virtual Reference< css::accessibility::XAccessible > CreateAccessible() override;

    virtual void set_sensitive(bool bSensitive) override
    {
        m_xWidget->set_sensitive(bSensitive);
        if (bSensitive)
            InterimItemWindow::Enable();
        else
            InterimItemWindow::Disable();
    }
};


// SelectHdl needs the Modifiers, get them in MouseButtonUp
class SvxFrmValueSet_Impl final : public SvtValueSet
{
@@ -1248,7 +1325,7 @@ boost::property_tree::ptree SvxStyleBox_Impl::DumpAsPropertyTree()
}


static bool lcl_GetDocFontList( const FontList** ppFontList, SvxFontNameBox_Impl* pBox )
static bool lcl_GetDocFontList(const FontList** ppFontList, SvxFontNameBox_Base* pBox)
{
    bool bChanged = false;
    const SfxObjectShell* pDocSh = SfxObjectShell::Current();
@@ -1259,7 +1336,7 @@ static bool lcl_GetDocFontList( const FontList** ppFontList, SvxFontNameBox_Impl
            static_cast<const SvxFontListItem*>(pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST ));
    else
    {
        ::std::unique_ptr<FontList> aFontList(new FontList( pBox->GetParent() ));
        ::std::unique_ptr<FontList> aFontList(new FontList(Application::GetDefaultDevice()));
        *ppFontList = aFontList.get();
        pBox->SetOwnFontList(std::move(aFontList));
        bChanged = true;
@@ -1293,7 +1370,7 @@ static bool lcl_GetDocFontList( const FontList** ppFontList, SvxFontNameBox_Impl
        }

        if ( pBox )
            pBox->Enable();
            pBox->set_sensitive(true);
    }
    else if ( pBox && ( pDocSh || !ppFontList ))
    {
@@ -1304,7 +1381,7 @@ static bool lcl_GetDocFontList( const FontList** ppFontList, SvxFontNameBox_Impl
        // the help window with F1. After closing the help window, we disable the font name
        // combo box. The SfxObjectShell::Current() method returns in that case zero. But the
        // font list hasn't changed and therefore the combo box shouldn't be disabled!
        pBox->Disable();
        pBox->set_sensitive(false);
    }

    // Fill the FontBox, also the new list if necessary
@@ -1318,48 +1395,44 @@ static bool lcl_GetDocFontList( const FontList** ppFontList, SvxFontNameBox_Impl
    return bChanged;
}

SvxFontNameBox_Impl::SvxFontNameBox_Impl(vcl::Window* pParent, const Reference<XDispatchProvider>& rDispatchProvider,
                                         const Reference<XFrame>& _xFrame)
    : InterimItemWindow(pParent, "svx/ui/fontnamebox.ui", "FontNameBox")
    , m_xWidget(new FontNameBox(m_xBuilder->weld_combo_box("fontnamecombobox")))
SvxFontNameBox_Base::SvxFontNameBox_Base(std::unique_ptr<weld::ComboBox> xWidget,
                                         const Reference<XDispatchProvider>& rDispatchProvider,
                                         const Reference<XFrame>& rFrame,
                                         SvxFontNameToolBoxControl& rCtrl)
    : m_rCtrl(rCtrl)
    , m_nCharWidth(xWidget->get_approximate_digit_width() * 15)
    , m_xWidget(new FontNameBox(std::move(xWidget)))
    , pFontList(nullptr)
    , nFtCount(0)
    , bRelease(true)
    , m_xDispatchProvider(rDispatchProvider)
    , m_xFrame(_xFrame)
    , m_xFrame(rFrame)
    , mbCheckingUnknownFont(false)
{
    EnableControls_Impl();
    set_id("fontnamecombobox");

    m_xWidget->connect_changed(LINK(this, SvxFontNameBox_Impl, SelectHdl));
    m_xWidget->connect_key_press(LINK(this, SvxFontNameBox_Impl, KeyInputHdl));
    m_xWidget->connect_entry_activate(LINK(this, SvxFontNameBox_Impl, ActivateHdl));
    m_xWidget->connect_focus_in(LINK(this, SvxFontNameBox_Impl, FocusInHdl));
    m_xWidget->connect_focus_out(LINK(this, SvxFontNameBox_Impl, FocusOutHdl));
    m_xWidget->connect_get_property_tree(LINK(this, SvxFontNameBox_Impl, DumpAsPropertyTreeHdl));
    m_xWidget->connect_changed(LINK(this, SvxFontNameBox_Base, SelectHdl));
    m_xWidget->connect_key_press(LINK(this, SvxFontNameBox_Base, KeyInputHdl));
    m_xWidget->connect_entry_activate(LINK(this, SvxFontNameBox_Base, ActivateHdl));
    m_xWidget->connect_focus_in(LINK(this, SvxFontNameBox_Base, FocusInHdl));
    m_xWidget->connect_focus_out(LINK(this, SvxFontNameBox_Base, FocusOutHdl));
    m_xWidget->connect_get_property_tree(LINK(this, SvxFontNameBox_Base, DumpAsPropertyTreeHdl));

    const Size aLogicalSize(60, 0);
    Size aSize(LogicToPixel(aLogicalSize, MapMode(MapUnit::MapAppFont)));
    // set width in chars low so the size request will not be overridden
    m_xWidget->set_entry_width_chars(1);
    m_xWidget->set_size_request(aSize.Width(), -1);
    m_xWidget->set_size_request(m_nCharWidth, -1);
}

SvxFontNameBox_Impl::SvxFontNameBox_Impl(vcl::Window* pParent, const Reference<XDispatchProvider>& rDispatchProvider,
                                         const Reference<XFrame>& rFrame, SvxFontNameToolBoxControl& rCtrl)
    : InterimItemWindow(pParent, "svx/ui/fontnamebox.ui", "FontNameBox")
    , SvxFontNameBox_Base(m_xBuilder->weld_combo_box("fontnamecombobox"), rDispatchProvider, rFrame, rCtrl)
{
    set_id("fontnamecombobox");
    SetOptimalSize();
}

SvxFontNameBox_Impl::~SvxFontNameBox_Impl()
{
    disposeOnce();
}

void SvxFontNameBox_Impl::dispose()
{
    m_xWidget.reset();
    InterimItemWindow::dispose();
}

void SvxFontNameBox_Impl::FillList()
void SvxFontNameBox_Base::FillList()
{
    if (!m_xWidget) // e.g. disposed
        return;
@@ -1374,7 +1447,7 @@ void SvxFontNameBox_Impl::FillList()
    m_xWidget->select_entry_region(nStartPos, nEndPos);
}

void SvxFontNameBox_Impl::CheckAndMarkUnknownFont()
void SvxFontNameBox_Base::CheckAndMarkUnknownFont()
{
    if (mbCheckingUnknownFont) //tdf#117537 block rentry
        return;
@@ -1404,7 +1477,7 @@ void SvxFontNameBox_Impl::CheckAndMarkUnknownFont()
    mbCheckingUnknownFont = false;
}

void SvxFontNameBox_Impl::Update( const css::awt::FontDescriptor* pFontDesc )
void SvxFontNameBox_Base::Update( const css::awt::FontDescriptor* pFontDesc )
{
    if ( pFontDesc )
    {
@@ -1420,19 +1493,24 @@ void SvxFontNameBox_Impl::Update( const css::awt::FontDescriptor* pFontDesc )
        set_active_or_entry_text(aCurName);
}

void SvxFontNameBox_Impl::set_active_or_entry_text(const OUString& rText)
void SvxFontNameBox_Base::set_active_or_entry_text(const OUString& rText)
{
    m_xWidget->set_active_or_entry_text(rText);
    CheckAndMarkUnknownFont();
}

IMPL_LINK_NOARG(SvxFontNameBox_Impl, FocusInHdl, weld::Widget&, void)
IMPL_LINK_NOARG(SvxFontNameBox_Base, FocusInHdl, weld::Widget&, void)
{
    EnableControls_Impl();
    FillList();
}

IMPL_LINK(SvxFontNameBox_Impl, KeyInputHdl, const KeyEvent&, rKEvt, bool)
IMPL_LINK(SvxFontNameBox_Base, KeyInputHdl, const KeyEvent&, rKEvt, bool)
{
    return DoKeyInput(rKEvt);
}

bool SvxFontNameBox_Base::DoKeyInput(const KeyEvent& rKEvt)
{
    bool bHandled = false;

@@ -1447,17 +1525,24 @@ IMPL_LINK(SvxFontNameBox_Impl, KeyInputHdl, const KeyEvent&, rKEvt, bool)

        case KEY_ESCAPE:
            set_active_or_entry_text(aCurText);
            if ( typeid( *GetParent() ) != typeid( sfx2::sidebar::SidebarToolBox ) )
            if (!m_rCtrl.IsInSidebar())
            {
                ReleaseFocus_Impl();
                bHandled = true;
            }
            EndPreview();
            bHandled = true;
            break;
    }

    return bHandled || ChildKeyInput(rKEvt);
    return bHandled;
}

IMPL_LINK_NOARG(SvxFontNameBox_Impl, FocusOutHdl, weld::Widget&, void)
bool SvxFontNameBox_Impl::DoKeyInput(const KeyEvent& rKEvt)
{
    return SvxFontNameBox_Base::DoKeyInput(rKEvt) || ChildKeyInput(rKEvt);
}

IMPL_LINK_NOARG(SvxFontNameBox_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
    {
@@ -1488,7 +1573,7 @@ void SvxFontNameBox_Impl::DataChanged( const DataChangedEvent& rDCEvt )
    }
}

void SvxFontNameBox_Impl::ReleaseFocus_Impl()
void SvxFontNameBox_Base::ReleaseFocus_Impl()
{
    if ( !bRelease )
    {
@@ -1499,7 +1584,7 @@ void SvxFontNameBox_Impl::ReleaseFocus_Impl()
        m_xFrame->getContainerWindow()->setFocus();
}

void SvxFontNameBox_Impl::EnableControls_Impl()
void SvxFontNameBox_Base::EnableControls_Impl()
{
    SvtFontOptions aFontOpt;
    bool bEnable = aFontOpt.IsFontHistoryEnabled();
@@ -1516,18 +1601,18 @@ void SvxFontNameBox_Impl::EnableControls_Impl()
        m_xWidget->EnableWYSIWYG();
}

IMPL_LINK(SvxFontNameBox_Impl, SelectHdl, weld::ComboBox&, rCombo, void)
IMPL_LINK(SvxFontNameBox_Base, SelectHdl, weld::ComboBox&, rCombo, void)
{
    Select(rCombo.changed_by_direct_pick()); // only when picked from the list
}

IMPL_LINK_NOARG(SvxFontNameBox_Impl, ActivateHdl, weld::ComboBox&, bool)
IMPL_LINK_NOARG(SvxFontNameBox_Base, ActivateHdl, weld::ComboBox&, bool)
{
    Select(true);
    return true;
}

void SvxFontNameBox_Impl::Select(bool bNonTravelSelect)
void SvxFontNameBox_Base::Select(bool bNonTravelSelect)
{
    Sequence< PropertyValue > aArgs( 1 );
    std::unique_ptr<SvxFontItem> pFontItem;
@@ -1578,14 +1663,7 @@ void SvxFontNameBox_Impl::Select(bool bNonTravelSelect)
    }
}

void SvxFontNameBox_Impl::GetFocus()
{
    if (m_xWidget)
        m_xWidget->grab_focus();
    InterimItemWindow::GetFocus();
}

IMPL_LINK(SvxFontNameBox_Impl, DumpAsPropertyTreeHdl, boost::property_tree::ptree&, rTree, void)
IMPL_LINK(SvxFontNameBox_Base, DumpAsPropertyTreeHdl, boost::property_tree::ptree&, rTree, void)
{
    boost::property_tree::ptree aEntries;

@@ -2840,48 +2918,20 @@ VclPtr<vcl::Window> SvxStyleToolBoxControl::CreateItemWindow( vcl::Window *pPare
    return pBox.get();
}

namespace {

class SvxFontNameToolBoxControl : public cppu::ImplInheritanceHelper< svt::ToolboxController,
                                                                      css::lang::XServiceInfo >
{
public:
    SvxFontNameToolBoxControl();

    // XStatusListener
    virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;

    // XToolbarController
    virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& rParent ) override;

    // XComponent
    virtual void SAL_CALL dispose() override;

    // XServiceInfo
    virtual OUString SAL_CALL getImplementationName() override;
    virtual sal_Bool SAL_CALL supportsService( const OUString& rServiceName ) override;
    virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;

private:
    VclPtr<SvxFontNameBox_Impl> m_pBox;
};

}

SvxFontNameToolBoxControl::SvxFontNameToolBoxControl()
{
}

void SvxFontNameBox_Impl::statusChanged_Impl( const css::frame::FeatureStateEvent& rEvent )
void SvxFontNameBox_Base::statusChanged_Impl( const css::frame::FeatureStateEvent& rEvent )
{
    if ( !rEvent.IsEnabled )
    {
        Disable();
        set_sensitive(false);
        Update( nullptr );
    }
    else
    {
        Enable();
        set_sensitive(true);

        css::awt::FontDescriptor aFontDesc;
        if ( rEvent.State >>= aFontDesc )
@@ -2895,28 +2945,62 @@ void SvxFontNameBox_Impl::statusChanged_Impl( const css::frame::FeatureStateEven
void SvxFontNameToolBoxControl::statusChanged( const css::frame::FeatureStateEvent& rEvent )
{
    SolarMutexGuard aGuard;
    ToolBox* pToolBox = nullptr;
    sal_uInt16 nId = 0;
    if ( !getToolboxId( nId, &pToolBox ) )
        return;

    m_pBox->statusChanged_Impl(rEvent);
    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 ) )
            return;
        pToolBox->EnableItem( nId, rEvent.IsEnabled );
    }
}

css::uno::Reference< css::awt::XWindow > SvxFontNameToolBoxControl::createItemWindow( const css::uno::Reference< css::awt::XWindow >& rParent )
{
    SolarMutexGuard aGuard;
    m_pBox = VclPtr<SvxFontNameBox_Impl>::Create(VCLUnoHelper::GetWindow(rParent),
                                                 Reference< XDispatchProvider >(m_xFrame->getController(), UNO_QUERY),
                                                 m_xFrame);
    return VCLUnoHelper::GetInterface( m_pBox );
    uno::Reference< awt::XWindow > xItemWindow;

    if (m_pBuilder)
    {
        SolarMutexGuard aSolarMutexGuard;

        std::unique_ptr<weld::ComboBox> xWidget(m_pBuilder->weld_combo_box("fontnamecombobox"));

        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_pBox = m_xWeldBox.get();
    }
    else
    {
        VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow(rParent);
        if ( pParent )
        {
            SolarMutexGuard aSolarMutexGuard;
            m_xVclBox = VclPtr<SvxFontNameBox_Impl>::Create(pParent,
                                                            Reference<XDispatchProvider>(m_xFrame->getController(), UNO_QUERY),
                                                            m_xFrame, *this);
            m_pBox = m_xVclBox.get();
            xItemWindow = VCLUnoHelper::GetInterface(m_xVclBox);
        }
    }

    return xItemWindow;
}

void SvxFontNameToolBoxControl::dispose()
{
    m_pBox.disposeAndClear();
    ToolboxController::dispose();

    SolarMutexGuard aSolarMutexGuard;
    m_xVclBox.disposeAndClear();
    m_xWeldBox.reset();
    m_pBox = nullptr;
}

OUString SvxFontNameToolBoxControl::getImplementationName()
diff --git a/svx/source/tbxctrls/tbunocontroller.cxx b/svx/source/tbxctrls/tbunocontroller.cxx
index cc638c7..da2c2a1 100644
--- a/svx/source/tbxctrls/tbunocontroller.cxx
+++ b/svx/source/tbxctrls/tbunocontroller.cxx
@@ -172,7 +172,7 @@ private:
};

SvxFontSizeBox_Base::SvxFontSizeBox_Base(std::unique_ptr<weld::ComboBox> xWidget,
                                         const uno::Reference< frame::XFrame >& rFrame,
                                         const uno::Reference<frame::XFrame>& rFrame,
                                         FontHeightToolBoxControl& rCtrl)
    : m_rCtrl(rCtrl)
    , m_bRelease(true)
diff --git a/svx/uiconfig/ui/sidebartextpanel.ui b/svx/uiconfig/ui/sidebartextpanel.ui
index af220dc..a74f8ab 100644
--- a/svx/uiconfig/ui/sidebartextpanel.ui
+++ b/svx/uiconfig/ui/sidebartextpanel.ui
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<!-- Generated with glade 3.22.2 -->
<interface domain="svx">
  <requires lib="gtk+" version="3.18"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkGrid" id="SidebarTextPanel">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="row_homogeneous">True</property>
    <property name="column_homogeneous">True</property>
    <property name="hexpand">True</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="hexpand">True</property>
        <property name="border_width">6</property>
        <property name="orientation">vertical</property>
        <property name="spacing">3</property>
@@ -19,21 +18,39 @@
          <object class="GtkBox" id="box2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="hexpand">True</property>
            <property name="spacing">6</property>
            <child>
              <object class="sfxlo-SidebarToolBox" id="font">
              <object class="GtkToolbar" id="font">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="hexpand">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkToolButton" id="fontname">
                  <object class="GtkToolItem" id=".uno:CharFontName">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:CharFontName</property>
                    <property name="hexpand">True</property>
                    <child>
                      <object class="GtkComboBoxText" id="fontnamecombobox">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="hexpand">True</property>
                        <property name="has_entry">True</property>
                        <property name="popup_fixed_width">False</property>
                        <child internal-child="entry">
                          <object class="GtkEntry">
                            <property name="can_focus">True</property>
                          </object>
                        </child>
                      </object>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">True</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -44,19 +61,32 @@
              </packing>
            </child>
            <child>
              <object class="sfxlo-SidebarToolBox" id="fontheight">
              <object class="GtkToolbar" id="fontheight">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkToolButton" id="fontsize">
                  <object class="GtkToolItem" id=".uno:FontHeight">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:FontHeight</property>
                    <child>
                      <object class="GtkComboBoxText" id="fontsizecombobox">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="has_entry">True</property>
                        <child internal-child="entry">
                          <object class="GtkEntry">
                            <property name="can_focus">True</property>
                          </object>
                        </child>
                      </object>
                    </child>
                  </object>
                  <packing>
                    <property name="expand">True</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -80,73 +110,65 @@
            <property name="can_focus">False</property>
            <property name="spacing">6</property>
            <child>
              <object class="sfxlo-SidebarToolBox" id="fonteffects">
              <object class="GtkToolbar" id="fonteffects">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkToolButton" id="bold">
                  <object class="GtkToolButton" id=".uno:Bold">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Bold</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkToolButton" id="italic">
                  <object class="GtkToolButton" id=".uno:Italic">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Italic</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkMenuToolButton" id="underline">
                  <object class="GtkMenuToolButton" id=".uno:Underline">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Underline</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkToolButton" id="strikeout">
                  <object class="GtkToolButton" id=".uno:Strikeout">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Strikeout</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkToolButton" id="shadowed">
                  <object class="GtkToolButton" id=".uno:Shadowed">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Shadowed</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -157,34 +179,32 @@
              </packing>
            </child>
            <child>
              <object class="sfxlo-SidebarToolBox" id="fontadjust">
              <object class="GtkToolbar" id="fontadjust">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkToolButton" id="grow">
                  <object class="GtkToolButton" id=".uno:Grow">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Grow</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkToolButton" id="shrink">
                  <object class="GtkToolButton" id=".uno:Shrink">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Shrink</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -208,34 +228,32 @@
            <property name="can_focus">False</property>
            <property name="spacing">6</property>
            <child>
              <object class="sfxlo-SidebarToolBox" id="colorbar_writer">
              <object class="GtkToolbar" id="colorbar_writer">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkMenuToolButton" id="fontcolor">
                  <object class="GtkMenuToolButton" id=".uno:FontColor">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:FontColor</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkMenuToolButton" id="highlight">
                  <object class="GtkMenuToolButton" id=".uno:BackColor">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:BackColor</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -246,20 +264,21 @@
              </packing>
            </child>
            <child>
              <object class="sfxlo-SidebarToolBox" id="colorbar_others">
              <object class="GtkToolbar" id="colorbar_others">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkMenuToolButton" id="color">
                  <object class="GtkMenuToolButton" id=".uno:Color">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Color</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -270,20 +289,20 @@
              </packing>
            </child>
            <child>
              <object class="sfxlo-SidebarToolBox" id="colorbar_background">
              <object class="GtkToolbar" id="colorbar_background">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkMenuToolButton" id="backgroundcolor">
                  <object class="GtkMenuToolButton" id=".uno:CharBackColor">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:CharBackColor</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -294,21 +313,21 @@
              </packing>
            </child>
            <child>
              <object class="sfxlo-SidebarToolBox" id="resetattr">
              <object class="GtkToolbar" id="resetattr">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkToolButton" id="resetattributes">
                  <object class="GtkToolButton" id=".uno:ResetAttributes">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:ResetAttributes</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -319,32 +338,32 @@
              </packing>
            </child>
            <child>
              <object class="sfxlo-SidebarToolBox" id="position">
              <object class="GtkToolbar" id="position">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkToolButton" id="superscript">
                  <object class="GtkToolButton" id=".uno:SuperScript">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="action_name">.uno:SuperScript</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkToolButton" id="subscript">
                  <object class="GtkToolButton" id=".uno:SubScript">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="action_name">.uno:SubScript</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -356,20 +375,20 @@
              </packing>
            </child>
            <child>
              <object class="sfxlo-SidebarToolBox" id="spacingbar">
                <property name="visible">False</property>
              <object class="GtkToolbar" id="spacingbar">
                <property name="can_focus">True</property>
                <property name="toolbar_style">icons</property>
                <property name="show_arrow">False</property>
                <property name="icon_size">2</property>
                <child>
                  <object class="GtkToolButton" id="spacing">
                  <object class="GtkMenuToolButton" id=".uno:Spacing">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="is_important">True</property>
                    <property name="action_name">.uno:Spacing</property>
                    <property name="use_underline">True</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="homogeneous">True</property>
                    <property name="homogeneous">False</property>
                  </packing>
                </child>
              </object>
@@ -391,8 +410,6 @@
      <packing>
        <property name="left_attach">0</property>
        <property name="top_attach">0</property>
        <property name="width">1</property>
        <property name="height">1</property>
      </packing>
    </child>
  </object>