use welded color window in unwelded toolbars

Change-Id: I024d352029722d67b423d2ebd92de7ce0e9f868b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86541
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/svx/colorwindow.hxx b/include/svx/colorwindow.hxx
index 67e5aeb..201b1e1 100644
--- a/include/svx/colorwindow.hxx
+++ b/include/svx/colorwindow.hxx
@@ -109,6 +109,8 @@ public:
    void SetSelectedHdl( const Link<const NamedColor&, void>& rLink ) { maSelectedLink = rLink; }
};

class SvxColorToolBoxControl;

class SVX_DLLPUBLIC MenuOrToolMenuButton
{
private:
@@ -117,12 +119,18 @@ private:
    // or
    weld::Toolbar* m_pToolbar;
    OString m_aIdent;
    // or
    SvxColorToolBoxControl* m_pControl;
    VclPtr<ToolBox> m_xToolBox;
    sal_uInt16 m_nId;
public:
    MenuOrToolMenuButton(weld::MenuButton* pMenuButton);
    MenuOrToolMenuButton(weld::Toolbar* pToolbar, const OString& rIdent);
    MenuOrToolMenuButton(SvxColorToolBoxControl* pControl, ToolBox* pToolbar, sal_uInt16 nId);
    ~MenuOrToolMenuButton();

    bool get_active() const;
    void set_active(bool bActive) const;
    void set_inactive() const;
    weld::Widget* get_widget() const;
};

diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index 2f11f9f..b891cd5 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -2017,12 +2017,11 @@ IMPL_LINK(ColorWindow, SelectHdl, SvtValueSet*, pColorSet, void)
            mxPaletteManager->ReloadRecentColorSet(*mxRecentColorSet);
    }

    if (maMenuButton.get_active())
        maMenuButton.set_active(false);

    maSelectedLink.Call(aNamedColor);

    maColorSelectFunction(maCommand, aNamedColor);

    maMenuButton.set_inactive();
}

IMPL_LINK_NOARG(SvxColorWindow, SelectPaletteHdl, ListBox&, void)
@@ -2075,8 +2074,7 @@ IMPL_LINK(ColorWindow, AutoColorClickHdl, weld::Button&, rButton, void)
    mxRecentColorSet->SetNoSelection();
    mpDefaultButton = &rButton;

    if (maMenuButton.get_active())
        maMenuButton.set_active(false);
    maMenuButton.set_inactive();

    maSelectedLink.Call(aNamedColor);

@@ -2105,8 +2103,7 @@ IMPL_LINK_NOARG(SvxColorWindow, OpenPickerClickHdl, Button*, void)

IMPL_LINK_NOARG(ColorWindow, OpenPickerClickHdl, weld::Button&, void)
{
    if (maMenuButton.get_active())
        maMenuButton.set_active(false);
    maMenuButton.set_inactive();
    mxPaletteManager->PopupColorPicker(mpParentWindow, maCommand, GetSelectEntryColor().first);
}

@@ -3469,23 +3466,34 @@ VclPtr<vcl::Window> SvxColorToolBoxControl::createPopupWindow( vcl::Window* pPar
{
    EnsurePaletteManager();

    VclPtrInstance<SvxColorWindow> pColorWin(
                            m_aCommandURL,
                            m_xPaletteManager,
                            m_aColorStatus,
                            m_nSlotId,
                            m_xFrame,
                            pParent,
                            false,
                            m_aColorSelectFunction);
    const css::uno::Reference<css::awt::XWindow> xParent = m_xFrame->getContainerWindow();
    weld::Window* pParentFrame = Application::GetFrameWeld(xParent);

    auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(m_aCommandURL, m_sModuleName);
    OUString aWindowTitle = vcl::CommandInfoProvider::GetLabelForCommand(aProperties);
    pColorWin->SetText( aWindowTitle );
    pColorWin->StartSelection();
    ToolBox* pToolBox = nullptr;
    sal_uInt16 nId = 0;
    getToolboxId(nId, &pToolBox);

    auto xPopover = std::make_unique<ColorWindow>(
                        m_aCommandURL,
                        m_xPaletteManager,
                        m_aColorStatus,
                        m_nSlotId,
                        m_xFrame,
                        pParentFrame,
                        MenuOrToolMenuButton(this, pToolBox, nId),
                        m_aColorSelectFunction);

    if ( m_bSplitButton )
        pColorWin->SetSelectedHdl( LINK( this, SvxColorToolBoxControl, SelectedHdl ) );
    return pColorWin;
        xPopover->SetSelectedHdl( LINK( this, SvxColorToolBoxControl, SelectedHdl ) );

    EnsurePaletteManager();

    mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent,
        std::move(xPopover));

    mxInterimPopover->Show();

    return mxInterimPopover;
}

IMPL_LINK(SvxColorToolBoxControl, SelectedHdl, const NamedColor&, rColor, void)
@@ -4349,6 +4357,7 @@ void ColorListBox::ShowPreview(const NamedColor &rColor)
MenuOrToolMenuButton::MenuOrToolMenuButton(weld::MenuButton* pMenuButton)
    : m_pMenuButton(pMenuButton)
    , m_pToolbar(nullptr)
    , m_pControl(nullptr)
{
}

@@ -4356,6 +4365,20 @@ MenuOrToolMenuButton::MenuOrToolMenuButton(weld::Toolbar* pToolbar, const OStrin
    : m_pMenuButton(nullptr)
    , m_pToolbar(pToolbar)
    , m_aIdent(rIdent)
    , m_pControl(nullptr)
{
}

MenuOrToolMenuButton::MenuOrToolMenuButton(SvxColorToolBoxControl* pControl, ToolBox* pToolbar, sal_uInt16 nId)
    : m_pMenuButton(nullptr)
    , m_pToolbar(nullptr)
    , m_pControl(pControl)
    , m_xToolBox(pToolbar)
    , m_nId(nId)
{
}

MenuOrToolMenuButton::~MenuOrToolMenuButton()
{
}

@@ -4363,24 +4386,35 @@ bool MenuOrToolMenuButton::get_active() const
{
    if (m_pMenuButton)
        return m_pMenuButton->get_active();
    return m_pToolbar->get_menu_item_active(m_aIdent);
    if (m_pToolbar)
        return m_pToolbar->get_menu_item_active(m_aIdent);
    return m_xToolBox->GetDownItemId() == m_nId;
}

void MenuOrToolMenuButton::set_active(bool bActive) const
void MenuOrToolMenuButton::set_inactive() const
{
    if (m_pMenuButton)
    {
        m_pMenuButton->set_active(bActive);
        if (m_pMenuButton->get_active())
            m_pMenuButton->set_active(false);
        return;
    }
    m_pToolbar->set_menu_item_active(m_aIdent, bActive);
    if (m_pToolbar)
    {
        if (m_pToolbar->get_menu_item_active(m_aIdent))
            m_pToolbar->set_menu_item_active(m_aIdent, false);
        return;
    }
    m_pControl->EndPopupMode();
}

weld::Widget* MenuOrToolMenuButton::get_widget() const
{
    if (m_pMenuButton)
        return m_pMenuButton;
    return m_pToolbar;
    if (m_pToolbar)
        return m_pToolbar;
    return m_xToolBox->GetFrameWeld();
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */