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: */