summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Monastirsky <momonasmon@gmail.com>2017-09-17 23:35:55 +0300
committerMaxim Monastirsky <momonasmon@gmail.com>2017-09-24 15:37:28 +0300
commite867b197540cfc8b75bb1108c8bcd7a0ff65d347 (patch)
tree8dbcdc2d2db4b9f3fb0e302b5d8031386a75c346
parent8bd418a6b8253a9d725981743a0375e2c8bb911e (diff)
tdf#106762 Base SvxColorToolBoxControl on svt::PopupWindowController
This allows us to support tearoff without breaking gtk3/wayland. SvxColorWindow no longer inherits from FloatingWindow, so several call sites need also to be changed to use DockingManager. Change-Id: I5d0bc611bbd2a8b9bfd4335212d0ae7e8fc10593
-rw-r--r--include/svtools/toolbarmenu.hxx5
-rw-r--r--include/svx/colorwindow.hxx3
-rw-r--r--include/svx/tbcontrl.hxx23
-rw-r--r--include/vcl/menubtn.hxx4
-rw-r--r--officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu84
-rw-r--r--reportdesign/source/ui/dlg/Condition.cxx3
-rw-r--r--sc/source/ui/app/scdll.cxx9
-rw-r--r--sd/source/ui/app/sddll.cxx6
-rw-r--r--svtools/source/control/toolbarmenu.cxx13
-rw-r--r--svx/source/tbxctrls/tbcontrl.cxx146
-rw-r--r--svx/uiconfig/ui/colorwindow.ui5
-rw-r--r--svx/util/svxcore.component4
-rw-r--r--sw/source/uibase/app/swmodule.cxx9
-rw-r--r--vcl/source/control/menubtn.cxx16
14 files changed, 233 insertions, 97 deletions
diff --git a/include/svtools/toolbarmenu.hxx b/include/svtools/toolbarmenu.hxx
index 5f990ef0dcad..88174253548a 100644
--- a/include/svtools/toolbarmenu.hxx
+++ b/include/svtools/toolbarmenu.hxx
@@ -50,6 +50,9 @@ public:
ToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
vcl::Window* pParentWindow,
WinBits nBits );
+ ToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
+ vcl::Window* pParentWindow,
+ const OString& rID, const OUString& rUIXMLDescription );
virtual ~ToolbarPopup() override;
virtual void dispose() override;
@@ -64,6 +67,8 @@ protected:
virtual void statusChanged(const css::frame::FeatureStateEvent& Event );
private:
+ void init();
+
css::uno::Reference< css::frame::XFrame > mxFrame;
rtl::Reference< svt::FrameStatusListener > mxStatusListener;
};
diff --git a/include/svx/colorwindow.hxx b/include/svx/colorwindow.hxx
index 3f826fa217e4..a782307df9fa 100644
--- a/include/svx/colorwindow.hxx
+++ b/include/svx/colorwindow.hxx
@@ -21,6 +21,7 @@
#define INCLUDED_SVX_SOURCE_TBXCTRLS_COLORWINDOW_HXX
#include <sfx2/tbxctrl.hxx>
+#include <svtools/toolbarmenu.hxx>
#include <svtools/valueset.hxx>
#include <svl/lstner.hxx>
#include <rtl/ustring.hxx>
@@ -48,7 +49,7 @@ typedef std::function<void(const OUString&, const NamedColor&)> ColorSelectFunct
#define COL_NONE_COLOR TRGB_COLORDATA(0x80, 0xFF, 0xFF, 0xFF)
-class SVX_DLLPUBLIC SvxColorWindow : public SfxPopupWindow
+class SVX_DLLPUBLIC SvxColorWindow : public svtools::ToolbarPopup
{
private:
const sal_uInt16 theSlotId;
diff --git a/include/svx/tbcontrl.hxx b/include/svx/tbcontrl.hxx
index 22fd4e72910f..b9b8eb0db7b1 100644
--- a/include/svx/tbcontrl.hxx
+++ b/include/svx/tbcontrl.hxx
@@ -205,25 +205,34 @@ friend class SfxStyleControllerItem_Impl;
typedef std::function<void(const OUString&, const NamedColor&)> ColorSelectFunction;
-class SVX_DLLPUBLIC SvxColorToolBoxControl : public cppu::ImplInheritanceHelper< SfxToolBoxControl,
+class SVX_DLLPUBLIC SvxColorToolBoxControl : public cppu::ImplInheritanceHelper< svt::PopupWindowController,
css::frame::XSubToolbarController >
{
std::unique_ptr<svx::ToolboxButtonColorUpdater> m_xBtnUpdater;
std::unique_ptr<PaletteManager> m_xPaletteManager;
BorderColorStatus m_aBorderColorStatus;
bool m_bSplitButton;
+ sal_uInt16 m_nSlotId;
ColorSelectFunction m_aColorSelectFunction;
DECL_LINK(SelectedHdl, const NamedColor&, void);
public:
- SFX_DECL_TOOLBOX_CONTROL();
- SvxColorToolBoxControl(sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rToolBox);
+ explicit SvxColorToolBoxControl( const css::uno::Reference<css::uno::XComponentContext>& rContext );
virtual ~SvxColorToolBoxControl() override;
+ // XInitialization
+ virtual void SAL_CALL initialize( const css::uno::Sequence<css::uno::Any>& rArguments ) override;
+
+ // XUpdatable
+ virtual void SAL_CALL update() override;
+
// XStatusListener
virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
- virtual VclPtr<SfxPopupWindow> CreatePopupWindow() override;
- virtual void Select(sal_uInt16 nSelectModifier) override;
+ // XToolbarController
+ virtual void SAL_CALL execute( sal_Int16 nSelectModifier ) override;
+
+ using svt::ToolboxController::createPopupWindow;
+ virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) override;
// XSubToolbarController
virtual sal_Bool SAL_CALL opensSubToolbar() override;
@@ -231,6 +240,10 @@ public:
virtual void SAL_CALL functionSelected( const OUString& rCommand ) override;
virtual void SAL_CALL updateImage() override;
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
void setColorSelectFunction(const ColorSelectFunction& aColorSelectFunction);
void EnsurePaletteManager();
};
diff --git a/include/vcl/menubtn.hxx b/include/vcl/menubtn.hxx
index da725103c1c7..dfbb39962139 100644
--- a/include/vcl/menubtn.hxx
+++ b/include/vcl/menubtn.hxx
@@ -36,7 +36,7 @@ private:
Timer* mpMenuTimer;
VclPtr<PopupMenu> mpMenu;
- VclPtr<FloatingWindow> mpFloatingWindow;
+ VclPtr<Window> mpFloatingWindow;
sal_uInt16 mnCurItemId;
bool mbDelayMenu;
Link<MenuButton*,void> maActivateHdl;
@@ -75,7 +75,7 @@ public:
void SetPopupMenu(PopupMenu* pNewMenu);
PopupMenu* GetPopupMenu() const { return mpMenu; }
- void SetPopover(FloatingWindow* pFloatingWindow);
+ void SetPopover(Window* pWindow);
sal_uInt16 GetCurItemId() const { return mnCurItemId; }
OString GetCurItemIdent() const;
diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
index 64fbbf30f4fc..103d14d1f672 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu
@@ -1221,37 +1221,103 @@
<value>com.sun.star.comp.svx.CurrencyToolBoxControl</value>
</prop>
</node>
- <node oor:name="c4" oor:op="replace" install:module="reportbuilder">
+ <node oor:name="FontColorToolBox" oor:op="replace">
<prop oor:name="Command">
<value>.uno:FontColor</value>
</prop>
<prop oor:name="Module">
- <value>com.sun.star.report.ReportDefinition</value>
+ <value/>
</prop>
<prop oor:name="Controller">
- <value>com.sun.star.report.ReportToolboxController</value>
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
</prop>
</node>
- <node oor:name="c5" oor:op="replace" install:module="reportbuilder">
+ <node oor:name="BackgroundColorToolBox" oor:op="replace">
<prop oor:name="Command">
<value>.uno:BackgroundColor</value>
</prop>
<prop oor:name="Module">
- <value>com.sun.star.report.ReportDefinition</value>
+ <value/>
</prop>
<prop oor:name="Controller">
- <value>com.sun.star.report.ReportToolboxController</value>
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
</prop>
</node>
- <node oor:name="c6" oor:op="replace" install:module="reportbuilder">
+ <node oor:name="ColorToolBox" oor:op="replace">
<prop oor:name="Command">
<value>.uno:Color</value>
</prop>
<prop oor:name="Module">
- <value>com.sun.star.report.ReportDefinition</value>
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
+ </prop>
+ </node>
+ <node oor:name="BackColorToolBox" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:BackColor</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
+ </prop>
+ </node>
+ <node oor:name="CharBackColorToolBox" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:CharBackColor</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
+ </prop>
+ </node>
+ <node oor:name="Extrusion3DColorToolBox" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:Extrusion3DColor</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
+ </prop>
+ </node>
+ <node oor:name="XLineColorToolBox" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:XLineColor</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
+ </prop>
+ </node>
+ <node oor:name="FillColorToolBox" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:FillColor</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
+ </prop>
+ <prop oor:name="Controller">
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
+ </prop>
+ </node>
+ <node oor:name="FrameLineColorToolBox" oor:op="replace">
+ <prop oor:name="Command">
+ <value>.uno:FrameLineColor</value>
+ </prop>
+ <prop oor:name="Module">
+ <value/>
</prop>
<prop oor:name="Controller">
- <value>com.sun.star.report.ReportToolboxController</value>
+ <value>com.sun.star.comp.svx.ColorToolBoxControl</value>
</prop>
</node>
<node oor:name="FontNameToolBox" oor:op="replace">
diff --git a/reportdesign/source/ui/dlg/Condition.cxx b/reportdesign/source/ui/dlg/Condition.cxx
index 8c9b93a2892c..3ac335ebdf1b 100644
--- a/reportdesign/source/ui/dlg/Condition.cxx
+++ b/reportdesign/source/ui/dlg/Condition.cxx
@@ -238,7 +238,8 @@ IMPL_LINK(Condition, DropdownClick, ToolBox*, pToolBox, void)
pToolBox,
m_aColorWrapper);
- m_pColorFloat->StartPopupMode(pToolBox, FloatWinPopupFlags::GrabFocus);
+ m_pColorFloat->EnableDocking();
+ vcl::Window::GetDockingManager()->StartPopupMode(pToolBox, m_pColorFloat, FloatWinPopupFlags::GrabFocus);
}
IMPL_LINK_NOARG( Condition, OnFormatAction, ToolBox*, void )
diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx
index f857c6593888..6d557f7a2d0b 100644
--- a/sc/source/ui/app/scdll.cxx
+++ b/sc/source/ui/app/scdll.cxx
@@ -157,13 +157,7 @@ void ScDLL::Init()
SvxFillToolBoxControl ::RegisterControl(0, pMod);
SvxLineStyleToolBoxControl ::RegisterControl(0, pMod);
SvxLineWidthToolBoxControl ::RegisterControl(0, pMod);
- SvxColorToolBoxControl ::RegisterControl(SID_ATTR_LINE_COLOR, pMod);
- SvxColorToolBoxControl ::RegisterControl(SID_ATTR_FILL_COLOR, pMod);
SvxStyleToolBoxControl ::RegisterControl(SID_STYLE_APPLY, pMod);
- SvxColorToolBoxControl ::RegisterControl(SID_ATTR_CHAR_COLOR, pMod);
- SvxColorToolBoxControl ::RegisterControl(SID_BACKGROUND_COLOR, pMod);
- SvxColorToolBoxControl ::RegisterControl(SID_ATTR_CHAR_BACK_COLOR, pMod);
- SvxColorToolBoxControl ::RegisterControl(SID_FRAME_LINECOLOR, pMod);
SvxClipBoardControl ::RegisterControl(SID_PASTE, pMod );
SvxUndoRedoControl ::RegisterControl(SID_UNDO, pMod );
SvxUndoRedoControl ::RegisterControl(SID_REDO, pMod );
@@ -208,9 +202,6 @@ void ScDLL::Init()
SvxPosSizeStatusBarControl ::RegisterControl(SID_ATTR_SIZE, pMod);
- // CustomShape extrusion controller
- SvxColorToolBoxControl::RegisterControl( SID_EXTRUSION_3D_COLOR, pMod );
-
// Child Windows
ScInputWindowWrapper ::RegisterChildWindow(true, pMod, SfxChildWindowFlags::TASK|SfxChildWindowFlags::FORCEDOCK);
diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx
index b487624c151b..4e2c083d27d8 100644
--- a/sd/source/ui/app/sddll.cxx
+++ b/sd/source/ui/app/sddll.cxx
@@ -181,12 +181,8 @@ void SdDLL::RegisterControllers(SdModule* pMod)
SvxFillToolBoxControl::RegisterControl(0, pMod);
SvxLineStyleToolBoxControl::RegisterControl(0, pMod);
SvxLineWidthToolBoxControl::RegisterControl(0, pMod);
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_LINE_COLOR, pMod);
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_FILL_COLOR, pMod);
SvxStyleToolBoxControl::RegisterControl(0, pMod);
- SvxColorToolBoxControl::RegisterControl( SID_ATTR_CHAR_COLOR, pMod );
- SvxColorToolBoxControl::RegisterControl( SID_ATTR_CHAR_BACK_COLOR, pMod );
SvxGrafModeToolBoxControl::RegisterControl( SID_ATTR_GRAF_MODE, pMod );
SvxGrafRedToolBoxControl::RegisterControl( SID_ATTR_GRAF_RED, pMod );
@@ -221,7 +217,6 @@ void SdDLL::RegisterControllers(SdModule* pMod)
SvxClipBoardControl::RegisterControl( SID_PASTE, pMod );
SvxClipBoardControl::RegisterControl( SID_PASTE_UNFORMATTED, pMod );
- SvxColorToolBoxControl::RegisterControl( SID_EXTRUSION_3D_COLOR, pMod );
svx::ParaLineSpacingPopup::RegisterControl(SID_ATTR_PARA_LINESPACE, pMod);
svx::TextCharacterSpacingPopup::RegisterControl(SID_ATTR_CHAR_KERNING, pMod);
svx::TextUnderlinePopup::RegisterControl(SID_ATTR_CHAR_UNDERLINE, pMod);
@@ -230,7 +225,6 @@ void SdDLL::RegisterControllers(SdModule* pMod)
XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE, pMod );
SdTemplateControl::RegisterControl( SID_STATUS_LAYOUT, pMod );
SvxTableToolBoxControl::RegisterControl(SID_INSERT_TABLE, pMod );
- SvxColorToolBoxControl::RegisterControl(SID_FRAME_LINECOLOR, pMod );
SvxTbxCtlDraw::RegisterControl(SID_INSERT_DRAW, pMod );
EmojiPopup::RegisterControl(SID_EMOJI_CONTROL, pMod );
diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx
index 822a85892564..3a77a9f80225 100644
--- a/svtools/source/control/toolbarmenu.cxx
+++ b/svtools/source/control/toolbarmenu.cxx
@@ -1428,6 +1428,19 @@ ToolbarPopup::ToolbarPopup( const css::uno::Reference<css::frame::XFrame>& rFram
: DockingWindow(pParentWindow, nBits)
, mxFrame( rFrame )
{
+ init();
+}
+
+ToolbarPopup::ToolbarPopup( const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParentWindow,
+ const OString& rID, const OUString& rUIXMLDescription )
+ : DockingWindow(pParentWindow, rID, rUIXMLDescription, rFrame)
+ , mxFrame( rFrame )
+{
+ init();
+}
+
+void ToolbarPopup::init()
+{
vcl::Window* pWindow = GetTopMostParentSystemWindow( this );
if ( pWindow )
static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->AddWindow( this );
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index ad4fd0ea3b24..5d8237f07fa0 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -33,7 +33,6 @@
#include <vcl/vclptr.hxx>
#include <svtools/valueset.hxx>
#include <svtools/ctrlbox.hxx>
-#include <svtools/toolbarmenu.hxx>
#include <svl/style.hxx>
#include <svtools/ctrltool.hxx>
#include <svtools/borderhelper.hxx>
@@ -1251,9 +1250,7 @@ SvxColorWindow::SvxColorWindow(const OUString& rCommand,
vcl::Window* pParentWindow,
std::function<void(const OUString&, const NamedColor&)> const & aFunction):
- SfxPopupWindow( nSlotId, pParentWindow,
- "palette_popup_window", "svx/ui/colorwindow.ui",
- rFrame ),
+ ToolbarPopup( rFrame, pParentWindow, "palette_popup_window", "svx/ui/colorwindow.ui" ),
theSlotId( nSlotId ),
maCommand( rCommand ),
mrPaletteManager( rPaletteManager ),
@@ -1374,11 +1371,12 @@ void SvxColorWindow::dispose()
mpButtonNoneColor.clear();
mpButtonPicker.clear();
mpAutomaticSeparator.clear();
- SfxPopupWindow::dispose();
+ ToolbarPopup::dispose();
}
void SvxColorWindow::KeyInput( const KeyEvent& rKEvt )
{
+ mpColorSet->GrabFocus();
mpColorSet->KeyInput(rKEvt);
}
@@ -1510,6 +1508,7 @@ IMPL_LINK_NOARG(SvxColorWindow, OpenPickerClickHdl, Button*, void)
void SvxColorWindow::StartSelection()
{
mpColorSet->StartSelection();
+ mpRecentColorSet->StartSelection();
}
void SvxColorWindow::SetNoSelection()
@@ -2756,28 +2755,77 @@ com_sun_star_comp_svx_FontNameToolBoxControl_get_implementation(
return cppu::acquire( new SvxFontNameToolBoxControl() );
}
-SvxColorToolBoxControl::SvxColorToolBoxControl(
- sal_uInt16 nSlotId,
- sal_uInt16 nId,
- ToolBox& rTbx ):
- ImplInheritanceHelper( nSlotId, nId, rTbx ),
- m_bSplitButton(typeid(rTbx) != typeid(sfx2::sidebar::SidebarToolBox)),
+SvxColorToolBoxControl::SvxColorToolBoxControl( const css::uno::Reference<css::uno::XComponentContext>& rContext ) :
+ ImplInheritanceHelper( rContext, nullptr, OUString() ),
+ m_bSplitButton(true),
+ m_nSlotId(0),
m_aColorSelectFunction(PaletteManager::DispatchColorCommand)
{
- switch( nSlotId )
+}
+
+namespace {
+
+sal_uInt16 MapCommandToSlotId(const OUString& rCommand)
+{
+ if (rCommand == ".uno:Color")
+ return SID_ATTR_CHAR_COLOR;
+ else if (rCommand == ".uno:FontColor")
+ return SID_ATTR_CHAR_COLOR2;
+ else if (rCommand == ".uno:BackColor")
+ return SID_ATTR_CHAR_COLOR_BACKGROUND;
+ else if (rCommand == ".uno:CharBackColor")
+ return SID_ATTR_CHAR_BACK_COLOR;
+ else if (rCommand == ".uno:BackgroundColor")
+ return SID_BACKGROUND_COLOR;
+ else if (rCommand == ".uno:Extrusion3DColor")
+ return SID_EXTRUSION_3D_COLOR;
+ else if (rCommand == ".uno:XLineColor")
+ return SID_ATTR_LINE_COLOR;
+ else if (rCommand == ".uno:FillColor")
+ return SID_ATTR_FILL_COLOR;
+ else if (rCommand == ".uno:FrameLineColor")
+ return SID_FRAME_LINECOLOR;
+
+ SAL_WARN("svx.tbxcrtls", "Unknown color command: " << rCommand);
+ return 0;
+}
+
+}
+
+void SvxColorToolBoxControl::initialize( const css::uno::Sequence<css::uno::Any>& rArguments )
+{
+ PopupWindowController::initialize( rArguments );
+
+ ToolBox* pToolBox = nullptr;
+ sal_uInt16 nId = 0;
+ if ( !getToolboxId( nId, &pToolBox ) )
+ {
+ SAL_WARN("svx.tbxcrtls", "ToolBox not found!");
+ return;
+ }
+
+ m_nSlotId = MapCommandToSlotId( m_aCommandURL );
+ if ( m_nSlotId == SID_ATTR_LINE_COLOR || m_nSlotId == SID_ATTR_FILL_COLOR ||
+ m_nSlotId == SID_FRAME_LINECOLOR || m_nSlotId == SID_BACKGROUND_COLOR )
+ // Sidebar uses wide buttons for those.
+ m_bSplitButton = typeid( *pToolBox ) != typeid( sfx2::sidebar::SidebarToolBox );
+
+ m_xBtnUpdater.reset( new svx::ToolboxButtonColorUpdater( m_nSlotId, nId, pToolBox ) );
+ pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ( m_bSplitButton ? ToolBoxItemBits::DROPDOWN : ToolBoxItemBits::DROPDOWNONLY ) );
+}
+
+void SvxColorToolBoxControl::update()
+{
+ PopupWindowController::update();
+
+ switch( m_nSlotId )
{
case SID_ATTR_CHAR_COLOR2:
addStatusListener( ".uno:CharColorExt");
- SAL_FALLTHROUGH;
-
- case SID_ATTR_CHAR_COLOR:
- case SID_ATTR_CHAR_BACK_COLOR:
- m_bSplitButton = true;
break;
case SID_ATTR_CHAR_COLOR_BACKGROUND:
addStatusListener( ".uno:CharBackgroundExt");
- m_bSplitButton = true;
break;
case SID_FRAME_LINECOLOR:
@@ -2785,9 +2833,6 @@ SvxColorToolBoxControl::SvxColorToolBoxControl(
addStatusListener( ".uno:BorderBLTR");
break;
}
-
- rTbx.SetItemBits( nId, rTbx.GetItemBits( nId ) | ( m_bSplitButton ? ToolBoxItemBits::DROPDOWN : ToolBoxItemBits::DROPDOWNONLY ) );
- m_xBtnUpdater.reset( new svx::ToolboxButtonColorUpdater( nSlotId, nId, &GetToolBox() ) );
}
void SvxColorToolBoxControl::EnsurePaletteManager()
@@ -2811,7 +2856,7 @@ void SvxColorToolBoxControl::setColorSelectFunction(const ColorSelectFunction& a
m_xPaletteManager->SetColorSelectFunction(aColorSelectFunction);
}
-VclPtr<SfxPopupWindow> SvxColorToolBoxControl::CreatePopupWindow()
+VclPtr<vcl::Window> SvxColorToolBoxControl::createPopupWindow( vcl::Window* pParent )
{
EnsurePaletteManager();
@@ -2819,16 +2864,14 @@ VclPtr<SfxPopupWindow> SvxColorToolBoxControl::CreatePopupWindow()
m_aCommandURL,
*m_xPaletteManager,
m_aBorderColorStatus,
- GetSlotId(),
+ m_nSlotId,
m_xFrame,
- &GetToolBox(),
+ pParent,
m_aColorSelectFunction);
OUString aWindowTitle = vcl::CommandInfoProvider::GetLabelForCommand( m_aCommandURL, m_sModuleName );
pColorWin->SetText( aWindowTitle );
- pColorWin->StartPopupMode(&GetToolBox(), FloatWinPopupFlags::GrabFocus);
pColorWin->StartSelection();
- SetPopupWindow(pColorWin);
if ( m_bSplitButton )
pColorWin->SetSelectedHdl( LINK( this, SvxColorToolBoxControl, SelectedHdl ) );
return pColorWin;
@@ -2843,8 +2886,13 @@ IMPL_LINK(SvxColorToolBoxControl, SelectedHdl, const NamedColor&, rColor, void)
void SvxColorToolBoxControl::statusChanged( const css::frame::FeatureStateEvent& rEvent )
{
+ ToolBox* pToolBox = nullptr;
+ sal_uInt16 nId = 0;
+ if ( !getToolboxId( nId, &pToolBox ) )
+ return;
+
if ( rEvent.FeatureURL.Complete == m_aCommandURL )
- GetToolBox().EnableItem( GetId(), rEvent.IsEnabled );
+ pToolBox->EnableItem( nId, rEvent.IsEnabled );
bool bValue;
if ( !m_bSplitButton )
@@ -2866,23 +2914,21 @@ void SvxColorToolBoxControl::statusChanged( const css::frame::FeatureStateEvent&
m_xPaletteManager->SetLastColor(aColor);
}
else if ( rEvent.State >>= bValue )
- GetToolBox().CheckItem( GetId(), bValue );
+ pToolBox->CheckItem( nId, bValue );
}
-void SvxColorToolBoxControl::Select(sal_uInt16 /*nSelectModifier*/)
+void SvxColorToolBoxControl::execute(sal_Int16 /*nSelectModifier*/)
{
if ( !m_bSplitButton )
{
// Open the popup also when Enter key is pressed.
- css::uno::Reference< css::awt::XWindow > xWin = createPopupWindow();
- if ( xWin.is() )
- xWin->setFocus();
+ createPopupWindow();
return;
}
OUString aCommand = m_aCommandURL;
- switch( GetSlotId() )
+ switch( m_nSlotId )
{
case SID_ATTR_CHAR_COLOR2 :
aCommand = ".uno:CharColorExt";
@@ -2899,7 +2945,7 @@ void SvxColorToolBoxControl::Select(sal_uInt16 /*nSelectModifier*/)
auto aArgs( comphelper::InitPropertySequence( {
{ m_aCommandURL.copy(5), css::uno::makeAny( m_xPaletteManager->GetLastColor().GetColor() ) }
} ) );
- Dispatch( aCommand, aArgs );
+ dispatchCommand( aCommand, aArgs );
OUString sColorName = ("#" + aColor.AsRGBHexString().toAsciiUpperCase());
m_xPaletteManager->AddRecentColor(aColor, sColorName);
@@ -2915,10 +2961,15 @@ sal_Bool SvxColorToolBoxControl::opensSubToolbar()
void SvxColorToolBoxControl::updateImage()
{
- Image aImage = vcl::CommandInfoProvider::GetImageForCommand(m_aCommandURL, m_xFrame, GetToolBox().GetImageSize());
+ ToolBox* pToolBox = nullptr;
+ sal_uInt16 nId = 0;
+ if ( !getToolboxId( nId, &pToolBox ) )
+ return;
+
+ Image aImage = vcl::CommandInfoProvider::GetImageForCommand(m_aCommandURL, m_xFrame, pToolBox->GetImageSize());
if ( !!aImage )
{
- GetToolBox().SetItemImage( GetId(), aImage );
+ pToolBox->SetItemImage( nId, aImage );
EnsurePaletteManager();
m_xBtnUpdater->Update(m_xPaletteManager->GetLastColor(), true);
}
@@ -2933,21 +2984,22 @@ void SvxColorToolBoxControl::functionSelected( const OUString& /*rCommand*/ )
{
}
-SfxToolBoxControl* SvxColorToolBoxControl::CreateImpl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx )
+OUString SvxColorToolBoxControl::getImplementationName()
{
- return new SvxColorToolBoxControl( nSlotId, nId, rTbx );
+ return OUString( "com.sun.star.comp.svx.ColorToolBoxControl" );
}
-void SvxColorToolBoxControl::RegisterControl(sal_uInt16 nSlotId, SfxModule *pMod)
+css::uno::Sequence<OUString> SvxColorToolBoxControl::getSupportedServiceNames()
{
- if ( nSlotId == SID_ATTR_LINE_COLOR )
- SfxToolBoxControl::RegisterToolBoxControl( pMod, SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, typeid(XLineColorItem), nSlotId ) );
- else if ( nSlotId == SID_ATTR_FILL_COLOR )
- SfxToolBoxControl::RegisterToolBoxControl( pMod, SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, typeid(XFillColorItem), nSlotId ) );
- else if ( nSlotId == SID_ATTR_CHAR_BACK_COLOR )
- SfxToolBoxControl::RegisterToolBoxControl( pMod, SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, typeid(SvxBackgroundColorItem), nSlotId ) );
- else
- SfxToolBoxControl::RegisterToolBoxControl( pMod, SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, typeid(SvxColorItem), nSlotId ) );
+ return { "com.sun.star.frame.ToolbarController" };
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
+com_sun_star_comp_svx_ColorToolBoxControl_get_implementation(
+ css::uno::XComponentContext* rContext,
+ css::uno::Sequence<css::uno::Any> const & )
+{
+ return cppu::acquire( new SvxColorToolBoxControl( rContext ) );
}
// class SvxFrameToolBoxControl --------------------------------------------
diff --git a/svx/uiconfig/ui/colorwindow.ui b/svx/uiconfig/ui/colorwindow.ui
index 14a9635f5430..1d983505567b 100644
--- a/svx/uiconfig/ui/colorwindow.ui
+++ b/svx/uiconfig/ui/colorwindow.ui
@@ -27,10 +27,7 @@
<property name="vexpand">True</property>
<property name="border_width">4</property>
<property name="resizable">False</property>
- <property name="destroy_with_parent">True</property>
- <property name="type_hint">popup-menu</property>
- <property name="skip_pager_hint">True</property>
- <property name="deletable">False</property>
+ <property name="type_hint">dock</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
diff --git a/svx/util/svxcore.component b/svx/util/svxcore.component
index 490e39c9e56b..aa1cac6fcae4 100644
--- a/svx/util/svxcore.component
+++ b/svx/util/svxcore.component
@@ -44,6 +44,10 @@
constructor="com_sun_star_comp_svx_FrameToolBoxControl_get_implementation">
<service name="com.sun.star.frame.ToolbarController"/>
</implementation>
+ <implementation name="com.sun.star.comp.svx.ColorToolBoxControl"
+ constructor="com_sun_star_comp_svx_ColorToolBoxControl_get_implementation">
+ <service name="com.sun.star.frame.ToolbarController"/>
+ </implementation>
<implementation name="com.sun.star.comp.svx.CurrencyToolBoxControl"
constructor="com_sun_star_comp_svx_CurrencyToolBoxControl_get_implementation">
<service name="com.sun.star.frame.ToolbarController"/>
diff --git a/sw/source/uibase/app/swmodule.cxx b/sw/source/uibase/app/swmodule.cxx
index 72af465176a9..47567ec52256 100644
--- a/sw/source/uibase/app/swmodule.cxx
+++ b/sw/source/uibase/app/swmodule.cxx
@@ -305,7 +305,6 @@ void SwDLL::RegisterControls()
PageOrientationPopup::RegisterControl(SID_ATTR_PAGE_ORIENTATION, pMod);
PageColumnPopup::RegisterControl(SID_ATTR_PAGE_COLUMN, pMod);
PageSizePopup::RegisterControl(SID_ATTR_PAGE_SIZE, pMod);
- SvxColorToolBoxControl::RegisterControl( SID_EXTRUSION_3D_COLOR, pMod );
SvxClipBoardControl::RegisterControl(SID_PASTE, pMod );
SvxUndoRedoControl::RegisterControl(SID_UNDO, pMod );
@@ -315,16 +314,8 @@ void SwDLL::RegisterControls()
SvxFillToolBoxControl::RegisterControl(SID_ATTR_FILL_STYLE, pMod );
SvxLineStyleToolBoxControl::RegisterControl(SID_ATTR_LINE_STYLE, pMod );
SvxLineWidthToolBoxControl::RegisterControl(SID_ATTR_LINE_WIDTH, pMod );
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_LINE_COLOR, pMod );
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_FILL_COLOR, pMod);
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_CHAR_BACK_COLOR, pMod);
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR, pMod );
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR2, pMod );
- SvxColorToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR_BACKGROUND, pMod );
SvxStyleToolBoxControl::RegisterControl(SID_STYLE_APPLY, pMod );
- SvxColorToolBoxControl::RegisterControl( SID_BACKGROUND_COLOR, pMod );
- SvxColorToolBoxControl::RegisterControl(SID_FRAME_LINECOLOR, pMod );
SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_FRAME_INTERACT, pMod );
SvxColumnsToolBoxControl::RegisterControl(FN_INSERT_FRAME, pMod );
diff --git a/vcl/source/control/menubtn.cxx b/vcl/source/control/menubtn.cxx
index 92a3b96719e0..5771f24ab289 100644
--- a/vcl/source/control/menubtn.cxx
+++ b/vcl/source/control/menubtn.cxx
@@ -18,6 +18,7 @@
*/
#include <vcl/decoview.hxx>
+#include <vcl/dockwin.hxx>
#include <vcl/event.hxx>
#include <vcl/floatwin.hxx>
#include <vcl/menu.hxx>
@@ -55,7 +56,14 @@ void MenuButton::ExecuteMenu()
{
Point aPos(GetParent()->OutputToScreenPixel(GetPosPixel()));
tools::Rectangle aRect(aPos, aSize );
- mpFloatingWindow->StartPopupMode(aRect, FloatWinPopupFlags::Down | FloatWinPopupFlags::GrabFocus);
+ FloatWinPopupFlags nFlags = FloatWinPopupFlags::Down | FloatWinPopupFlags::GrabFocus;
+ if (mpFloatingWindow->GetType() == WindowType::FLOATINGWINDOW)
+ static_cast<FloatingWindow*>(mpFloatingWindow.get())->StartPopupMode(aRect, nFlags);
+ else
+ {
+ mpFloatingWindow->EnableDocking();
+ vcl::Window::GetDockingManager()->StartPopupMode(mpFloatingWindow, aRect, nFlags);
+ }
}
SetPressed(false);
if (mnCurItemId)
@@ -170,12 +178,12 @@ void MenuButton::SetPopupMenu(PopupMenu* pNewMenu)
mpMenu = pNewMenu;
}
-void MenuButton::SetPopover(FloatingWindow* pFloatingWindow)
+void MenuButton::SetPopover(Window* pWindow)
{
- if (pFloatingWindow == mpFloatingWindow)
+ if (pWindow == mpFloatingWindow)
return;
- mpFloatingWindow = pFloatingWindow;
+ mpFloatingWindow = pWindow;
}
//class MenuToggleButton ----------------------------------------------------