include/svtools/popupwindowcontroller.hxx | 15 include/svtools/toolbarmenu.hxx | 41 +- include/svx/tbcontrl.hxx | 11 officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu | 11 sc/source/ui/app/scdll.cxx | 1 sd/source/ui/app/sddll.cxx | 1 svtools/source/control/toolbarmenu.cxx | 123 +++--- svtools/source/control/toolbarmenuimp.hxx | 6 svtools/source/uno/popupwindowcontroller.cxx | 122 +++--- svx/source/tbxctrls/tbcontrl.cxx | 181 +++++----- svx/util/svxcore.component | 4 sw/source/uibase/app/swmodule.cxx | 1 vcl/source/window/dockmgr.cxx | 81 +++- 13 files changed, 321 insertions(+), 277 deletions(-)
New commits: commit 944f81c544ff5b9e47d5e0764814d19df71b1764 Author: Maxim Monastirsky <[email protected]> Date: Wed Oct 5 12:29:35 2016 +0300 SvxFrameWindow_Impl: Try to fix size calculation Change-Id: I7119f46a483615636cef57432a2c536af8ecd4c5 diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx index bc26442..d542370 100644 --- a/svx/source/tbxctrls/tbcontrl.cxx +++ b/svx/source/tbxctrls/tbcontrl.cxx @@ -105,8 +105,6 @@ // don't make more than 15 entries visible at once #define MAX_STYLES_ENTRIES 15 -static void lcl_CalcSizeValueSet( vcl::Window &rWin, ValueSet &rValueSet, const Size &aItemSize ); - // namespaces using namespace ::editeng; using namespace ::com::sun::star; @@ -256,10 +254,11 @@ private: ImageList aImgList; bool bParagraphMode; + void InitImageList(); + void CalcSizeValueSet(); DECL_LINK( SelectHdl, ValueSet*, void ); protected: - virtual void Resize() override; virtual void GetFocus() override; public: @@ -1603,18 +1602,7 @@ SvxFrameWindow_Impl::SvxFrameWindow_Impl (const Reference< XFrame >& rFrame, vcl bParagraphMode(false) { AddStatusListener(".uno:BorderReducedMode"); - aImgList = ImageList( SVX_RES( RID_SVXIL_FRAME ) ); - - if( pParentWindow->GetDPIScaleFactor() > 1 ) - { - for (short i = 0; i < aImgList.GetImageCount(); i++) - { - OUString rImageName = aImgList.GetImageName(i); - BitmapEx b = aImgList.GetImage(rImageName).GetBitmapEx(); - b.Scale(pParentWindow->GetDPIScaleFactor(), pParentWindow->GetDPIScaleFactor()); - aImgList.ReplaceImage(rImageName, Image(b)); - } - } + InitImageList(); /* * 1 2 3 4 @@ -1637,8 +1625,7 @@ SvxFrameWindow_Impl::SvxFrameWindow_Impl (const Reference< XFrame >& rFrame, vcl aFrameSet->SetColCount( 4 ); aFrameSet->SetSelectHdl( LINK( this, SvxFrameWindow_Impl, SelectHdl ) ); - - lcl_CalcSizeValueSet( *this, *aFrameSet.get(), Size( 20 * pParentWindow->GetDPIScaleFactor(), 20 * pParentWindow->GetDPIScaleFactor() )); + CalcSizeValueSet(); SetHelpId( HID_POPUP_FRAME ); SetText( SVX_RESSTR(RID_SVXSTR_FRAME) ); @@ -1673,7 +1660,7 @@ void SvxFrameWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt ) if( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) ) { - aImgList = ImageList( SVX_RES( RID_SVXIL_FRAME ) ); + InitImageList(); sal_uInt16 nNumOfItems = aFrameSet->GetItemCount(); @@ -1808,12 +1795,6 @@ IMPL_LINK_NOARG(SvxFrameWindow_Impl, SelectHdl, ValueSet*, void) mpController->dispatchCommand( ".uno:SetBorderStyle", aArgs ); } -void SvxFrameWindow_Impl::Resize() -{ - const Size aSize(this->GetOutputSizePixel()); - aFrameSet->SetPosSizePixel(Point(2,2), Size(aSize.Width() - 4, aSize.Height() - 4)); -} - void SvxFrameWindow_Impl::statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException ) { @@ -1844,13 +1825,39 @@ void SvxFrameWindow_Impl::statusChanged( const css::frame::FeatureStateEvent& rE if ( bResize ) { - lcl_CalcSizeValueSet( *this, *aFrameSet.get(), Size( 20, 20 )); + CalcSizeValueSet(); } } } } } +void SvxFrameWindow_Impl::CalcSizeValueSet() +{ + Size aItemSize( 20 * GetParent()->GetDPIScaleFactor(), 20 * GetParent()->GetDPIScaleFactor() ); + Size aSize = aFrameSet->CalcWindowSizePixel( aItemSize ); + aFrameSet->SetPosSizePixel( Point( 2, 2 ), aSize ); + aSize.Width() += 4; + aSize.Height() += 4; + SetOutputSizePixel( aSize ); +} + +void SvxFrameWindow_Impl::InitImageList() +{ + aImgList = ImageList( SVX_RES( RID_SVXIL_FRAME ) ); + + if( GetParent()->GetDPIScaleFactor() > 1 ) + { + for (short i = 0; i < aImgList.GetImageCount(); i++) + { + OUString rImageName = aImgList.GetImageName(i); + BitmapEx b = aImgList.GetImage(rImageName).GetBitmapEx(); + b.Scale(GetParent()->GetDPIScaleFactor(), GetParent()->GetDPIScaleFactor()); + aImgList.ReplaceImage(rImageName, Image(b)); + } + } +} + static Color lcl_mediumColor( Color aMain, Color /*aDefault*/ ) { return SvxBorderLine::threeDMediumColor( aMain ); @@ -3076,14 +3083,6 @@ void SvxCurrencyToolBoxControl::Select( sal_uInt16 nSelectModifier ) SfxToolBoxControl::Select( nSelectModifier ); } -static void lcl_CalcSizeValueSet( vcl::Window &rWin, ValueSet &rValueSet, const Size &aItemSize ) -{ - Size aSize = rValueSet.CalcWindowSizePixel( aItemSize ); - aSize.Width() += 4; - aSize.Height() += 4; - rWin.SetOutputSizePixel( aSize ); -} - Reference< css::accessibility::XAccessible > SvxFontNameBox_Impl::CreateAccessible() { FillList(); commit c26afa7812d5b9f8e25f64ebab8515f5b59238c1 Author: Maxim Monastirsky <[email protected]> Date: Wed Oct 5 01:58:06 2016 +0300 Base SvxFrameWindow_Impl on ToolbarPopup Change-Id: I2061125068bd94b5cdc46aa18a7aa7e21726e22c diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx index ed9a38e..bc26442 100644 --- a/svx/source/tbxctrls/tbcontrl.cxx +++ b/svx/source/tbxctrls/tbcontrl.cxx @@ -31,6 +31,7 @@ #include <svtools/valueset.hxx> #include <svtools/ctrlbox.hxx> #include <svtools/popupwindowcontroller.hxx> +#include <svtools/toolbarmenu.hxx> #include <svl/style.hxx> #include <svtools/ctrltool.hxx> #include <svtools/borderhelper.hxx> @@ -247,12 +248,11 @@ void SvxFrmValueSet_Impl::MouseButtonUp( const MouseEvent& rMEvt ) ValueSet::MouseButtonUp(rMEvt); } -class SvxFrameWindow_Impl : public SfxPopupWindow +class SvxFrameWindow_Impl : public svtools::ToolbarPopup { - using FloatingWindow::StateChanged; - private: VclPtr<SvxFrmValueSet_Impl> aFrameSet; + rtl::Reference< svt::ToolboxController > mpController; ImageList aImgList; bool bParagraphMode; @@ -263,14 +263,11 @@ protected: virtual void GetFocus() override; public: - SvxFrameWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow ); + SvxFrameWindow_Impl( const Reference< XFrame >& rFrame, vcl::Window* pParentWindow, svt::ToolboxController* pController ); virtual ~SvxFrameWindow_Impl() override; virtual void dispose() override; - void StartSelection(); - - virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, - const SfxPoolItem* pState ) override; + virtual void statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException ) override; virtual void DataChanged( const DataChangedEvent& rDCEvt ) override; }; @@ -1599,12 +1596,12 @@ Color BorderColorStatus::GetColor() } -SvxFrameWindow_Impl::SvxFrameWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow ) : - SfxPopupWindow( nId, rFrame, pParentWindow, WB_STDPOPUP | WB_OWNERDRAWDECORATION | WB_CLOSEABLE | WB_MOVEABLE ), +SvxFrameWindow_Impl::SvxFrameWindow_Impl (const Reference< XFrame >& rFrame, vcl::Window* pParentWindow, svt::ToolboxController* pController ) : + ToolbarPopup( rFrame, pParentWindow, WB_STDPOPUP | WB_MOVEABLE | WB_CLOSEABLE ), aFrameSet ( VclPtr<SvxFrmValueSet_Impl>::Create(this, WinBits( WB_ITEMBORDER | WB_DOUBLEBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT )) ), + mpController( pController ), bParagraphMode(false) { - BindListener(); AddStatusListener(".uno:BorderReducedMode"); aImgList = ImageList( SVX_RES( RID_SVXIL_FRAME ) ); @@ -1656,20 +1653,23 @@ SvxFrameWindow_Impl::~SvxFrameWindow_Impl() void SvxFrameWindow_Impl::dispose() { - UnbindListener(); + mpController.clear(); aFrameSet.disposeAndClear(); - SfxPopupWindow::dispose(); + ToolbarPopup::dispose(); } void SvxFrameWindow_Impl::GetFocus() { if (aFrameSet) + { aFrameSet->GrabFocus(); + aFrameSet->StartSelection(); + } } void SvxFrameWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt ) { - SfxPopupWindow::DataChanged( rDCEvt ); + ToolbarPopup::DataChanged( rDCEvt ); if( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) ) { @@ -1805,9 +1805,7 @@ IMPL_LINK_NOARG(SvxFrameWindow_Impl, SelectHdl, ValueSet*, void) aFrameSet->SetNoSelection(); } - SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ), - ".uno:SetBorderStyle", - aArgs ); + mpController->dispatchCommand( ".uno:SetBorderStyle", aArgs ); } void SvxFrameWindow_Impl::Resize() @@ -1816,16 +1814,15 @@ void SvxFrameWindow_Impl::Resize() aFrameSet->SetPosSizePixel(Point(2,2), Size(aSize.Width() - 4, aSize.Height() - 4)); } -void SvxFrameWindow_Impl::StateChanged( - sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) +void SvxFrameWindow_Impl::statusChanged( const css::frame::FeatureStateEvent& rEvent ) + throw ( css::uno::RuntimeException ) { - if ( pState && nSID == SID_BORDER_REDUCED_MODE) + if ( rEvent.FeatureURL.Complete == ".uno:BorderReducedMode" ) { - const SfxBoolItem* pItem = dynamic_cast<const SfxBoolItem*>( pState ); - - if ( pItem ) + bool bValue; + if ( rEvent.State >>= bValue ) { - bParagraphMode = pItem->GetValue(); + bParagraphMode = bValue; //initial calls mustn't insert or remove elements if(aFrameSet->GetItemCount()) { @@ -1852,12 +1849,6 @@ void SvxFrameWindow_Impl::StateChanged( } } } - SfxPopupWindow::StateChanged( nSID, eState, pState ); -} - -void SvxFrameWindow_Impl::StartSelection() -{ - aFrameSet->StartSelection(); } static Color lcl_mediumColor( Color aMain, Color /*aDefault*/ ) @@ -2932,7 +2923,7 @@ void SvxFrameToolBoxControl::initialize( const css::uno::Sequence< css::uno::Any VclPtr<vcl::Window> SvxFrameToolBoxControl::createPopupWindow( vcl::Window* pParent ) { - return VclPtr<SvxFrameWindow_Impl>::Create( 0, m_xFrame, pParent ); + return VclPtr<SvxFrameWindow_Impl>::Create( m_xFrame, pParent, this ); } OUString SvxFrameToolBoxControl::getImplementationName() commit 0ef0e08f2f0e2f59cf7a64cd981f42c5e141f9b4 Author: Maxim Monastirsky <[email protected]> Date: Wed Oct 5 09:56:50 2016 +0300 Split some stuff from ToolbarMenu to a base class i.e. implement "todo: move to new base class that will replace SfxPopupWindow" Change-Id: I1b300e1e0c6423bf27d9dae7d75703b988afb154 diff --git a/include/svtools/toolbarmenu.hxx b/include/svtools/toolbarmenu.hxx index 408b2f4..e2b47f4 100644 --- a/include/svtools/toolbarmenu.hxx +++ b/include/svtools/toolbarmenu.hxx @@ -36,15 +36,39 @@ #include <vcl/dockwin.hxx> class ValueSet; +namespace svt { class FrameStatusListener; } namespace svtools { class ToolbarMenuEntry; struct ToolbarMenu_Impl; -class SVT_DLLPUBLIC ToolbarMenu : public DockingWindow +class SVT_DLLPUBLIC ToolbarPopup : public DockingWindow +{ + friend class ToolbarPopupStatusListener; +public: + ToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, + vcl::Window* pParentWindow, + WinBits nBits ); + virtual ~ToolbarPopup() override; + virtual void dispose() override; + +protected: + void AddStatusListener( const OUString& rCommandURL ); + + bool IsInPopupMode(); + void EndPopupMode(); + + // Forwarded from XStatusListener (subclasses must override this one to get the status updates): + virtual void statusChanged(const css::frame::FeatureStateEvent& Event ) throw (css::uno::RuntimeException, std::exception); + +private: + css::uno::Reference< css::frame::XFrame > mxFrame; + rtl::Reference< svt::FrameStatusListener > mxStatusListener; +}; + +class SVT_DLLPUBLIC ToolbarMenu : public ToolbarPopup { - friend class ToolbarMenuStatusListener; friend struct ToolbarMenu_Impl; public: ToolbarMenu(const css::uno::Reference<css::frame::XFrame>& rFrame, @@ -92,25 +116,12 @@ public: protected: virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override; - // todo: move to new base class that will replace SfxPopupWindow - void AddStatusListener( const OUString& rCommandURL ); - - bool IsInPopupMode(); - void EndPopupMode(); - - // Forwarded from XStatusListener (subclasses must override this one to get - // the status updates): - virtual void statusChanged(const css::frame::FeatureStateEvent& Event ) throw (css::uno::RuntimeException, std::exception); - void StateChanged( StateChangedType nType ) override; void DataChanged( const DataChangedEvent& rDCEvt ) override; private: DECL_LINK( HighlightHdl, ValueSet*, void ); - void initStatusListener(); - - void implInit(const css::uno::Reference<css::frame::XFrame>& rFrame); void initWindow(); Size implCalcSize(); diff --git a/svtools/source/control/toolbarmenu.cxx b/svtools/source/control/toolbarmenu.cxx index 214416b..897c423 100644 --- a/svtools/source/control/toolbarmenu.cxx +++ b/svtools/source/control/toolbarmenu.cxx @@ -30,6 +30,7 @@ #include <vcl/toolbox.hxx> #include <vcl/settings.hxx> +#include <svtools/framestatuslistener.hxx> #include <svtools/valueset.hxx> #include <svtools/toolbarmenu.hxx> #include "toolbarmenuimp.hxx" @@ -181,9 +182,8 @@ Reference< XAccessible > ToolbarMenuEntry::getAccessibleChild( sal_Int32 index ) } -ToolbarMenu_Impl::ToolbarMenu_Impl( ToolbarMenu& rMenu, const css::uno::Reference< css::frame::XFrame >& xFrame ) +ToolbarMenu_Impl::ToolbarMenu_Impl( ToolbarMenu& rMenu ) : mrMenu( rMenu ) -, mxFrame( xFrame ) , mnCheckPos(0) , mnImagePos(0) , mnTextPos(0) @@ -403,24 +403,15 @@ IMPL_LINK_NOARG( ToolbarMenu, HighlightHdl, ValueSet*, void ) mpImpl->notifyHighlightedEntry(); } -ToolbarMenu::ToolbarMenu( const Reference< XFrame >& rFrame, vcl::Window* pParentWindow, WinBits nBits ) - : DockingWindow(pParentWindow, nBits) -{ - implInit(rFrame); -} - -void ToolbarMenu::implInit(const Reference< XFrame >& rFrame) +ToolbarMenu::ToolbarMenu( const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParentWindow, WinBits nBits ) + : ToolbarPopup(rFrame, pParentWindow, nBits) { - mpImpl.reset( new ToolbarMenu_Impl( *this, rFrame ) ); + mpImpl.reset( new ToolbarMenu_Impl( *this ) ); const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); SetControlBackground( rStyleSettings.GetMenuColor() ); initWindow(); - - vcl::Window* pWindow = GetTopMostParentSystemWindow( this ); - if ( pWindow ) - static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->AddWindow( this ); } @@ -431,16 +422,6 @@ ToolbarMenu::~ToolbarMenu() void ToolbarMenu::dispose() { - vcl::Window* pWindow = GetTopMostParentSystemWindow( this ); - if ( pWindow ) - static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->RemoveWindow( this ); - - if ( mpImpl->mxStatusListener.is() ) - { - mpImpl->mxStatusListener->dispose(); - mpImpl->mxStatusListener.clear(); - } - mpImpl->mxAccessible.clear(); std::unique_ptr<ToolbarMenu_Impl> pImpl = std::move(mpImpl); @@ -448,7 +429,7 @@ void ToolbarMenu::dispose() pImpl->maEntryVector.clear(); - DockingWindow::dispose(); + ToolbarPopup::dispose(); } @@ -704,7 +685,7 @@ void ToolbarMenu::GetFocus() if( mpImpl && mpImpl->mnHighlightedEntry == -1 ) implChangeHighlightEntry( 0 ); - DockingWindow::GetFocus(); + ToolbarPopup::GetFocus(); } @@ -713,7 +694,7 @@ void ToolbarMenu::LoseFocus() if( mpImpl && mpImpl->mnHighlightedEntry != -1 ) implChangeHighlightEntry( -1 ); - DockingWindow::LoseFocus(); + ToolbarPopup::LoseFocus(); } @@ -1377,13 +1358,13 @@ void ToolbarMenu::Paint(vcl::RenderContext& rRenderContext, const Rectangle&) void ToolbarMenu::RequestHelp( const HelpEvent& rHEvt ) { - DockingWindow::RequestHelp( rHEvt ); + ToolbarPopup::RequestHelp( rHEvt ); } void ToolbarMenu::StateChanged( StateChangedType nType ) { - DockingWindow::StateChanged( nType ); + ToolbarPopup::StateChanged( nType ); if ( ( nType == StateChangedType::ControlForeground ) || ( nType == StateChangedType::ControlBackground ) ) { @@ -1395,7 +1376,7 @@ void ToolbarMenu::StateChanged( StateChangedType nType ) void ToolbarMenu::DataChanged( const DataChangedEvent& rDCEvt ) { - DockingWindow::DataChanged( rDCEvt ); + ToolbarPopup::DataChanged( rDCEvt ); if ( (rDCEvt.GetType() == DataChangedEventType::FONTS) || (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) || @@ -1428,69 +1409,89 @@ Reference< css::accessibility::XAccessible > ToolbarMenu::CreateAccessible() } -// todo: move to new base class that will replace SfxPopupWindo -void ToolbarMenu::AddStatusListener( const OUString& rCommandURL ) -{ - initStatusListener(); - mpImpl->mxStatusListener->addStatusListener( rCommandURL ); -} - - -void ToolbarMenu::statusChanged( const css::frame::FeatureStateEvent& /*Event*/ ) throw ( css::uno::RuntimeException, std::exception ) -{ -} - - -class ToolbarMenuStatusListener : public svt::FrameStatusListener +class ToolbarPopupStatusListener : public svt::FrameStatusListener { public: - ToolbarMenuStatusListener( const css::uno::Reference< css::frame::XFrame >& xFrame, - ToolbarMenu& rToolbarMenu ); + ToolbarPopupStatusListener( const css::uno::Reference< css::frame::XFrame >& xFrame, + ToolbarPopup& rToolbarPopup ); virtual void SAL_CALL dispose() throw (css::uno::RuntimeException, std::exception) override; virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) throw ( css::uno::RuntimeException, std::exception ) override; - VclPtr<ToolbarMenu> mpMenu; + VclPtr<ToolbarPopup> mpPopup; }; -ToolbarMenuStatusListener::ToolbarMenuStatusListener( +ToolbarPopupStatusListener::ToolbarPopupStatusListener( const css::uno::Reference< css::frame::XFrame >& xFrame, - ToolbarMenu& rToolbarMenu ) + ToolbarPopup& rToolbarPopup ) : svt::FrameStatusListener( ::comphelper::getProcessComponentContext(), xFrame ) -, mpMenu( &rToolbarMenu ) +, mpPopup( &rToolbarPopup ) { } -void SAL_CALL ToolbarMenuStatusListener::dispose() throw (css::uno::RuntimeException, std::exception) +void SAL_CALL ToolbarPopupStatusListener::dispose() throw (css::uno::RuntimeException, std::exception) { - mpMenu.clear(); + mpPopup.clear(); svt::FrameStatusListener::dispose(); } -void SAL_CALL ToolbarMenuStatusListener::statusChanged( const css::frame::FeatureStateEvent& Event ) throw ( css::uno::RuntimeException, std::exception ) +void SAL_CALL ToolbarPopupStatusListener::statusChanged( const css::frame::FeatureStateEvent& Event ) throw ( css::uno::RuntimeException, std::exception ) { - if( mpMenu ) - mpMenu->statusChanged( Event ); + if( mpPopup ) + mpPopup->statusChanged( Event ); } +ToolbarPopup::ToolbarPopup( const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParentWindow, WinBits nBits ) + : DockingWindow(pParentWindow, nBits) + , mxFrame( rFrame ) +{ + vcl::Window* pWindow = GetTopMostParentSystemWindow( this ); + if ( pWindow ) + static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->AddWindow( this ); +} + +ToolbarPopup::~ToolbarPopup() +{ + disposeOnce(); +} + +void ToolbarPopup::dispose() +{ + vcl::Window* pWindow = GetTopMostParentSystemWindow( this ); + if ( pWindow ) + static_cast<SystemWindow*>(pWindow)->GetTaskPaneList()->RemoveWindow( this ); + + if ( mxStatusListener.is() ) + { + mxStatusListener->dispose(); + mxStatusListener.clear(); + } + + mxFrame.clear(); + DockingWindow::dispose(); +} -void ToolbarMenu::initStatusListener() +void ToolbarPopup::AddStatusListener( const OUString& rCommandURL ) { - if( !mpImpl->mxStatusListener.is() ) - mpImpl->mxStatusListener.set( new ToolbarMenuStatusListener( mpImpl->mxFrame, *this ) ); + if( !mxStatusListener.is() ) + mxStatusListener.set( new ToolbarPopupStatusListener( mxFrame, *this ) ); + + mxStatusListener->addStatusListener( rCommandURL ); } +void ToolbarPopup::statusChanged( const css::frame::FeatureStateEvent& /*Event*/ ) throw ( css::uno::RuntimeException, std::exception ) +{ +} -bool ToolbarMenu::IsInPopupMode() +bool ToolbarPopup::IsInPopupMode() { return GetDockingManager()->IsInPopupMode(this); } - -void ToolbarMenu::EndPopupMode() +void ToolbarPopup::EndPopupMode() { GetDockingManager()->EndPopupMode(this); } diff --git a/svtools/source/control/toolbarmenuimp.hxx b/svtools/source/control/toolbarmenuimp.hxx index 2a16414..6943fba 100644 --- a/svtools/source/control/toolbarmenuimp.hxx +++ b/svtools/source/control/toolbarmenuimp.hxx @@ -40,8 +40,6 @@ #include <memory> #include <vector> -#include <svtools/framestatuslistener.hxx> - namespace svtools { struct ToolbarMenu_Impl; @@ -241,8 +239,6 @@ struct ToolbarMenu_Impl { ToolbarMenu& mrMenu; - css::uno::Reference< css::frame::XFrame > mxFrame; - rtl::Reference< svt::FrameStatusListener > mxStatusListener; rtl::Reference< ToolbarMenuAcc > mxAccessible; css::uno::Reference< css::accessibility::XAccessible > mxOldSelection; @@ -260,7 +256,7 @@ struct ToolbarMenu_Impl Link<ToolbarMenu*,void> maSelectHdl; - ToolbarMenu_Impl( ToolbarMenu& rMenu, const css::uno::Reference< css::frame::XFrame >& xFrame ); + ToolbarMenu_Impl( ToolbarMenu& rMenu ); ~ToolbarMenu_Impl(); void setAccessible( ToolbarMenuAcc* pAccessible ); commit fd22d2d9e1935f19a900a339995827bc7a795cb7 Author: Maxim Monastirsky <[email protected]> Date: Tue Oct 4 23:13:56 2016 +0300 Base SvxFrameToolBoxControl on PopupWindowController Change-Id: I7666c7c5c99b1705bc8ece2913c2cdf9fdecced3 diff --git a/include/svx/tbcontrl.hxx b/include/svx/tbcontrl.hxx index 6785370..1067fa0 100644 --- a/include/svx/tbcontrl.hxx +++ b/include/svx/tbcontrl.hxx @@ -254,17 +254,6 @@ public: void setColorSelectFunction(const ColorSelectFunction& aColorSelectFunction); }; -class SVX_DLLPUBLIC SvxFrameToolBoxControl : public SfxToolBoxControl -{ -public: - SFX_DECL_TOOLBOX_CONTROL(); - SvxFrameToolBoxControl(sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rToolBox); - - virtual VclPtr<SfxPopupWindow> CreatePopupWindow() override; - virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState, - const SfxPoolItem* pState) override; -}; - class SVX_DLLPUBLIC SvxFrameLineStyleToolBoxControl : public SfxToolBoxControl { public: diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu index 096ed33..9f0e3ec 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/Controller.xcu @@ -1082,6 +1082,17 @@ <value>com.sun.star.comp.sfx2.ClassificationCategoriesController</value> </prop> </node> + <node oor:name="com.sun.star.comp.svx.FrameToolBoxControl" oor:op="replace"> + <prop oor:name="Command"> + <value>.uno:SetBorderStyle</value> + </prop> + <prop oor:name="Module"> + <value/> + </prop> + <prop oor:name="Controller"> + <value>com.sun.star.comp.svx.FrameToolBoxControl</value> + </prop> + </node> <node oor:name="c4" oor:op="replace" install:module="reportbuilder"> <prop oor:name="Command"> <value>.uno:FontColor</value> diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx index 355552d..abc587c 100644 --- a/sc/source/ui/app/scdll.cxx +++ b/sc/source/ui/app/scdll.cxx @@ -167,7 +167,6 @@ void ScDLL::Init() SvxColorToolBoxControl ::RegisterControl(SID_ATTR_CHAR_COLOR, pMod); SvxColorToolBoxControl ::RegisterControl(SID_BACKGROUND_COLOR, pMod); SvxColorToolBoxControl ::RegisterControl(SID_ATTR_CHAR_BACK_COLOR, pMod); - SvxFrameToolBoxControl ::RegisterControl(SID_ATTR_BORDER, pMod); SvxFrameLineStyleToolBoxControl ::RegisterControl(SID_FRAME_LINESTYLE, pMod); SvxColorToolBoxControl ::RegisterControl(SID_FRAME_LINECOLOR, pMod); SvxClipBoardControl ::RegisterControl(SID_PASTE, pMod ); diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx index c63d2b6..035fda3 100644 --- a/sd/source/ui/app/sddll.cxx +++ b/sd/source/ui/app/sddll.cxx @@ -237,7 +237,6 @@ void SdDLL::RegisterControllers(SdModule* pMod) SvxTableToolBoxControl::RegisterControl(SID_INSERT_TABLE, pMod ); SvxFrameLineStyleToolBoxControl::RegisterControl(SID_FRAME_LINESTYLE, pMod ); SvxColorToolBoxControl::RegisterControl(SID_FRAME_LINECOLOR, pMod ); - SvxFrameToolBoxControl::RegisterControl(SID_ATTR_BORDER, pMod ); SvxTbxCtlDraw::RegisterControl(SID_INSERT_DRAW, pMod ); EmojiPopup::RegisterControl(SID_EMOJI_CONTROL, pMod ); diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx index cba6820..ed9a38e 100644 --- a/svx/source/tbxctrls/tbcontrl.cxx +++ b/svx/source/tbxctrls/tbcontrl.cxx @@ -30,6 +30,7 @@ #include <vcl/vclptr.hxx> #include <svtools/valueset.hxx> #include <svtools/ctrlbox.hxx> +#include <svtools/popupwindowcontroller.hxx> #include <svl/style.hxx> #include <svtools/ctrltool.hxx> #include <svtools/borderhelper.hxx> @@ -115,7 +116,6 @@ using namespace ::com::sun::star::lang; SFX_IMPL_TOOLBOX_CONTROL( SvxStyleToolBoxControl, SfxTemplateItem ); SFX_IMPL_TOOLBOX_CONTROL( SvxFontNameToolBoxControl, SvxFontItem ); -SFX_IMPL_TOOLBOX_CONTROL( SvxFrameToolBoxControl, SvxBoxItem ); SFX_IMPL_TOOLBOX_CONTROL( SvxFrameLineStyleToolBoxControl, SvxLineItem ); SFX_IMPL_TOOLBOX_CONTROL( SvxSimpleUndoRedoController, SfxStringItem ); SFX_IMPL_TOOLBOX_CONTROL( SvxCurrencyToolBoxControl, SfxBoolItem ); @@ -1600,7 +1600,7 @@ Color BorderColorStatus::GetColor() SvxFrameWindow_Impl::SvxFrameWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow ) : - SfxPopupWindow( nId, rFrame, pParentWindow, WinBits( WB_STDPOPUP | WB_OWNERDRAWDECORATION ) ), + SfxPopupWindow( nId, rFrame, pParentWindow, WB_STDPOPUP | WB_OWNERDRAWDECORATION | WB_CLOSEABLE | WB_MOVEABLE ), aFrameSet ( VclPtr<SvxFrmValueSet_Impl>::Create(this, WinBits( WB_ITEMBORDER | WB_DOUBLEBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT )) ), bParagraphMode(false) { @@ -2898,40 +2898,61 @@ void SvxColorToolBoxControl::RegisterControl(sal_uInt16 nSlotId, SfxModule *pMod // class SvxFrameToolBoxControl -------------------------------------------- -SvxFrameToolBoxControl::SvxFrameToolBoxControl( - sal_uInt16 nSlotId, - sal_uInt16 nId, - ToolBox& rTbx ) - : SfxToolBoxControl( nSlotId, nId, rTbx ) +class SvxFrameToolBoxControl : public svt::PopupWindowController +{ +public: + explicit SvxFrameToolBoxControl( const css::uno::Reference< css::uno::XComponentContext >& rContext ); + + // XInitialization + virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& rArguments ) throw ( css::uno::Exception, css::uno::RuntimeException, std::exception ) override; + + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() throw ( css::uno::RuntimeException, std::exception ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw ( css::uno::RuntimeException, std::exception ) override; + +private: + virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) override; + using svt::ToolboxController::createPopupWindow; +}; + +SvxFrameToolBoxControl::SvxFrameToolBoxControl( const css::uno::Reference< css::uno::XComponentContext >& rContext ) + : svt::PopupWindowController( rContext, nullptr, OUString() ) { - rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) ); } -VclPtr<SfxPopupWindow> SvxFrameToolBoxControl::CreatePopupWindow() +void SvxFrameToolBoxControl::initialize( const css::uno::Sequence< css::uno::Any >& rArguments ) + throw ( css::uno::Exception, css::uno::RuntimeException, std::exception ) { - VclPtr<SvxFrameWindow_Impl> pFrameWin = VclPtr<SvxFrameWindow_Impl>::Create( - GetSlotId(), m_xFrame, &GetToolBox() ); + svt::PopupWindowController::initialize( rArguments ); + ToolBox* pToolBox = nullptr; + sal_uInt16 nId = 0; + if ( getToolboxId( nId, &pToolBox ) ) + pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY ); +} - pFrameWin->StartPopupMode( &GetToolBox(), - FloatWinPopupFlags::GrabFocus | - FloatWinPopupFlags::AllowTearOff | - FloatWinPopupFlags::NoAppFocusClose ); - pFrameWin->StartSelection(); - SetPopupWindow( pFrameWin ); +VclPtr<vcl::Window> SvxFrameToolBoxControl::createPopupWindow( vcl::Window* pParent ) +{ + return VclPtr<SvxFrameWindow_Impl>::Create( 0, m_xFrame, pParent ); +} - return pFrameWin; +OUString SvxFrameToolBoxControl::getImplementationName() + throw ( css::uno::RuntimeException, std::exception ) +{ + return OUString( "com.sun.star.comp.svx.FrameToolBoxControl" ); } -void SvxFrameToolBoxControl::StateChanged( - sal_uInt16, SfxItemState eState, const SfxPoolItem* ) +css::uno::Sequence< OUString > SvxFrameToolBoxControl::getSupportedServiceNames() + throw ( css::uno::RuntimeException, std::exception ) { - sal_uInt16 nId = GetId(); - ToolBox& rTbx = GetToolBox(); + return { "com.sun.star.frame.ToolbarController" }; +} - rTbx.EnableItem( nId, SfxItemState::DISABLED != eState ); - rTbx.SetItemState( nId, (SfxItemState::DONTCARE == eState) - ? TRISTATE_INDET - : TRISTATE_FALSE ); +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +com_sun_star_comp_svx_FrameToolBoxControl_get_implementation( + css::uno::XComponentContext* rContext, + css::uno::Sequence<css::uno::Any> const & ) +{ + return cppu::acquire( new SvxFrameToolBoxControl( rContext ) ); } SvxFrameLineStyleToolBoxControl::SvxFrameLineStyleToolBoxControl( diff --git a/svx/util/svxcore.component b/svx/util/svxcore.component index 1e6d1c7..8c8d42d 100644 --- a/svx/util/svxcore.component +++ b/svx/util/svxcore.component @@ -40,6 +40,10 @@ <implementation name="com.sun.star.comp.svx.FontworkCharacterSpacingController"> <service name="com.sun.star.frame.ToolbarController"/> </implementation> + <implementation name="com.sun.star.comp.svx.FrameToolBoxControl" + constructor="com_sun_star_comp_svx_FrameToolBoxControl_get_implementation"> + <service name="com.sun.star.frame.ToolbarController"/> + </implementation> <implementation name="com.sun.star.comp.Svx.GraphicExportHelper" constructor="com_sun_star_comp_Svx_GraphicExportHelper_get_implementation"> <service name="com.sun.star.document.BinaryStreamResolver"/> diff --git a/sw/source/uibase/app/swmodule.cxx b/sw/source/uibase/app/swmodule.cxx index eaa726b..6ca46d4 100644 --- a/sw/source/uibase/app/swmodule.cxx +++ b/sw/source/uibase/app/swmodule.cxx @@ -320,7 +320,6 @@ void SwDLL::RegisterControls() SvxColorToolBoxControl::RegisterControl(SID_ATTR_CHAR_COLOR_BACKGROUND, pMod ); SvxStyleToolBoxControl::RegisterControl(SID_STYLE_APPLY, pMod ); SvxColorToolBoxControl::RegisterControl( SID_BACKGROUND_COLOR, pMod ); - SvxFrameToolBoxControl::RegisterControl(SID_ATTR_BORDER, pMod ); SvxFrameLineStyleToolBoxControl::RegisterControl(SID_FRAME_LINESTYLE, pMod ); SvxColorToolBoxControl::RegisterControl(SID_FRAME_LINECOLOR, pMod ); commit c700ed71f457a141c8033d2ab863bf884c50fa96 Author: Maxim Monastirsky <[email protected]> Date: Tue Oct 4 22:18:35 2016 +0300 PopupWindowController: Tearoff support Change-Id: I2baaaa13f3d127dc1619c971b66091d3326fafbc diff --git a/svtools/source/uno/popupwindowcontroller.cxx b/svtools/source/uno/popupwindowcontroller.cxx index d299416..09b6885 100644 --- a/svtools/source/uno/popupwindowcontroller.cxx +++ b/svtools/source/uno/popupwindowcontroller.cxx @@ -40,23 +40,22 @@ public: ~PopupWindowControllerImpl(); void SetPopupWindow( vcl::Window* pPopupWindow, ToolBox* pToolBox ); + void SetFloatingWindow(); DECL_LINK( WindowEventListener, VclWindowEvent&, void ); private: - VclPtr<vcl::Window> mpPopupWindow; + VclPtr<vcl::Window> mpPopupWindow, mpFloatingWindow; VclPtr<ToolBox> mpToolBox; }; PopupWindowControllerImpl::PopupWindowControllerImpl() -: mpPopupWindow( nullptr ) -, mpToolBox( nullptr ) { } PopupWindowControllerImpl::~PopupWindowControllerImpl() { - if( mpPopupWindow ) - SetPopupWindow(nullptr,nullptr); + SetPopupWindow(nullptr,nullptr); + SetFloatingWindow(); } void PopupWindowControllerImpl::SetPopupWindow( vcl::Window* pPopupWindow, ToolBox* pToolBox ) @@ -75,15 +74,53 @@ void PopupWindowControllerImpl::SetPopupWindow( vcl::Window* pPopupWindow, ToolB } } +void PopupWindowControllerImpl::SetFloatingWindow() +{ + if( mpFloatingWindow ) + { + mpFloatingWindow->RemoveEventListener( LINK( this, PopupWindowControllerImpl, WindowEventListener ) ); + mpFloatingWindow.disposeAndClear(); + } + mpFloatingWindow = mpPopupWindow; + mpPopupWindow.clear(); +} + IMPL_LINK( PopupWindowControllerImpl, WindowEventListener, VclWindowEvent&, rWindowEvent, void ) { switch( rWindowEvent.GetId() ) { - case VCLEVENT_WINDOW_CLOSE: case VCLEVENT_WINDOW_ENDPOPUPMODE: + { + EndPopupModeData* pData = static_cast< EndPopupModeData* >( rWindowEvent.GetData() ); + if( pData && pData->mbTearoff ) + { + vcl::Window::GetDockingManager()->SetFloatingMode( mpPopupWindow.get(), true ); + vcl::Window::GetDockingManager()->SetPosSizePixel( mpPopupWindow.get(), + pData->maFloatingPos.X(), + pData->maFloatingPos.Y(), + 0, 0, + PosSizeFlags::Pos ); + SetFloatingWindow(); + mpFloatingWindow->Show( true, ShowFlags::NoFocusChange | ShowFlags::NoActivate ); + } SetPopupWindow(nullptr,nullptr); break; - + } + case VCLEVENT_WINDOW_PREPARETOGGLEFLOATING: + { + if ( mpFloatingWindow && rWindowEvent.GetWindow() == mpFloatingWindow.get() ) + { + bool* pData = static_cast< bool* >( rWindowEvent.GetData() ); + *pData = false; + } + break; + } + case VCLEVENT_WINDOW_CLOSE: + { + SetPopupWindow(nullptr,nullptr); + SetFloatingWindow(); + break; + } case VCLEVENT_WINDOW_SHOW: { if( mpPopupWindow ) @@ -133,6 +170,7 @@ sal_Bool SAL_CALL PopupWindowController::supportsService( const OUString& Servic // XComponent void SAL_CALL PopupWindowController::dispose() throw (RuntimeException, std::exception) { + mxImpl.reset(); svt::ToolboxController::dispose(); } @@ -153,12 +191,22 @@ Reference< awt::XWindow > SAL_CALL PopupWindowController::createPopupWindow() th vcl::Window* pWin = createPopupWindow( pItemWindow ? pItemWindow : pToolBox ); if( pWin ) { + FloatWinPopupFlags eFloatFlags = FloatWinPopupFlags::GrabFocus | + FloatWinPopupFlags::AllMouseButtonClose | + FloatWinPopupFlags::NoMouseUpClose; + + WinBits nWinBits; + if ( pWin->GetType() == WINDOW_DOCKINGWINDOW ) + nWinBits = static_cast< DockingWindow* >( pWin )->GetFloatStyle(); + else + nWinBits = pWin->GetStyle(); + + if ( nWinBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ) + eFloatFlags |= FloatWinPopupFlags::AllowTearOff; + pWin->EnableDocking(); mxImpl->SetPopupWindow(pWin,pToolBox); - vcl::Window::GetDockingManager()->StartPopupMode( pToolBox, pWin, - FloatWinPopupFlags::GrabFocus | - FloatWinPopupFlags::AllMouseButtonClose | - FloatWinPopupFlags::NoMouseUpClose ); + vcl::Window::GetDockingManager()->StartPopupMode( pToolBox, pWin, eFloatFlags ); } } return Reference< awt::XWindow >(); commit da80f6e8499c9b0cf7711a30eb895f71719639cb Author: Maxim Monastirsky <[email protected]> Date: Sat Oct 1 22:15:53 2016 +0300 PopupWindowController: Small cleanup Change-Id: Iedbc8ddaf97f515fecc012322f0c1621317de076 diff --git a/include/svtools/popupwindowcontroller.hxx b/include/svtools/popupwindowcontroller.hxx index f2fa65f..44794fa 100644 --- a/include/svtools/popupwindowcontroller.hxx +++ b/include/svtools/popupwindowcontroller.hxx @@ -50,9 +50,6 @@ public: virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw( css::uno::RuntimeException, std::exception ) override; virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( css::uno::RuntimeException, std::exception ) override = 0; - // XInitialization - virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw (css::uno::Exception, css::uno::RuntimeException, std::exception) override; - // XComponent virtual void SAL_CALL dispose() throw (css::uno::RuntimeException, std::exception) override; @@ -60,9 +57,8 @@ public: virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) throw ( css::uno::RuntimeException, std::exception ) override; // XToolbarController - virtual void SAL_CALL execute( sal_Int16 KeyModifier ) throw (css::uno::RuntimeException, std::exception) override; virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createPopupWindow() throw (css::uno::RuntimeException, std::exception) override; - virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) throw (css::uno::RuntimeException, std::exception) override; + private: std::unique_ptr< PopupWindowControllerImpl > mxImpl; }; diff --git a/svtools/source/uno/popupwindowcontroller.cxx b/svtools/source/uno/popupwindowcontroller.cxx index 62ccb56..d299416 100644 --- a/svtools/source/uno/popupwindowcontroller.cxx +++ b/svtools/source/uno/popupwindowcontroller.cxx @@ -24,7 +24,6 @@ #include <vcl/svapp.hxx> #include <svtools/popupwindowcontroller.hxx> -#include <svtools/toolbarmenu.hxx> using namespace ::com::sun::star; using namespace css::uno; @@ -92,10 +91,6 @@ IMPL_LINK( PopupWindowControllerImpl, WindowEventListener, VclWindowEvent&, rWin if( mpToolBox ) mpToolBox->CallEventListeners( VCLEVENT_DROPDOWN_OPEN, static_cast<void*>(mpPopupWindow) ); mpPopupWindow->CallEventListeners( VCLEVENT_WINDOW_GETFOCUS ); - - svtools::ToolbarMenu* pToolbarMenu = dynamic_cast< svtools::ToolbarMenu* >( mpPopupWindow.get() ); - if( pToolbarMenu ) - pToolbarMenu->highlightFirstEntry(); break; } break; @@ -135,24 +130,12 @@ sal_Bool SAL_CALL PopupWindowController::supportsService( const OUString& Servic return cppu::supportsService(this, ServiceName); } -// XInitialization -void SAL_CALL PopupWindowController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw (css::uno::Exception, css::uno::RuntimeException, std::exception) -{ - svt::ToolboxController::initialize( aArguments ); - if( !m_aCommandURL.isEmpty() ) - addStatusListener( m_aCommandURL ); -} - // XComponent void SAL_CALL PopupWindowController::dispose() throw (RuntimeException, std::exception) { - if( !m_aCommandURL.isEmpty() ) - removeStatusListener( m_aCommandURL ); - svt::ToolboxController::dispose(); } - // XStatusListener void SAL_CALL PopupWindowController::statusChanged( const frame::FeatureStateEvent& rEvent ) throw ( RuntimeException, std::exception ) { @@ -161,11 +144,6 @@ void SAL_CALL PopupWindowController::statusChanged( const frame::FeatureStateEve } // XToolbarController -void SAL_CALL PopupWindowController::execute( sal_Int16 KeyModifier ) throw (RuntimeException, std::exception) -{ - svt::ToolboxController::execute( KeyModifier ); -} - Reference< awt::XWindow > SAL_CALL PopupWindowController::createPopupWindow() throw (RuntimeException, std::exception) { VclPtr< ToolBox > pToolBox = dynamic_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ).get() ); @@ -186,12 +164,6 @@ Reference< awt::XWindow > SAL_CALL PopupWindowController::createPopupWindow() th return Reference< awt::XWindow >(); } -Reference< awt::XWindow > SAL_CALL PopupWindowController::createItemWindow( const Reference< awt::XWindow >& /*Parent*/ ) - throw (RuntimeException, std::exception) -{ - return Reference< awt::XWindow >(); -} - } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit a7331e2485a92492ad88893e029c3d895abb7a8a Author: Maxim Monastirsky <[email protected]> Date: Fri Sep 30 14:36:29 2016 +0300 PopupWindowController: Use ImplInheritanceHelper Change-Id: I82b9ebf69b6b35b3a5e1e8a5dc5bb84eff1feb19 diff --git a/include/svtools/popupwindowcontroller.hxx b/include/svtools/popupwindowcontroller.hxx index a6e78da..f2fa65f 100644 --- a/include/svtools/popupwindowcontroller.hxx +++ b/include/svtools/popupwindowcontroller.hxx @@ -24,6 +24,7 @@ #include <com/sun/star/lang/XServiceInfo.hpp> +#include <cppuhelper/implbase.hxx> #include <svtools/toolboxcontroller.hxx> #include <vcl/vclptr.hxx> @@ -33,7 +34,8 @@ namespace svt { class PopupWindowControllerImpl; -class SVT_DLLPUBLIC PopupWindowController : public svt::ToolboxController, public css::lang::XServiceInfo +class SVT_DLLPUBLIC PopupWindowController : public cppu::ImplInheritanceHelper< svt::ToolboxController, + css::lang::XServiceInfo > { public: PopupWindowController( const css::uno::Reference< css::uno::XComponentContext >& rxContext, @@ -43,11 +45,6 @@ public: virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) = 0; - // XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) throw (css::uno::RuntimeException, std::exception) override; - virtual void SAL_CALL acquire() throw () override; - virtual void SAL_CALL release() throw () override; - // XServiceInfo virtual OUString SAL_CALL getImplementationName() throw( css::uno::RuntimeException, std::exception ) override = 0; virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw( css::uno::RuntimeException, std::exception ) override; diff --git a/svtools/source/uno/popupwindowcontroller.cxx b/svtools/source/uno/popupwindowcontroller.cxx index b328242..62ccb56 100644 --- a/svtools/source/uno/popupwindowcontroller.cxx +++ b/svtools/source/uno/popupwindowcontroller.cxx @@ -18,7 +18,6 @@ */ #include <cppuhelper/supportsservice.hxx> -#include <cppuhelper/queryinterface.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <vcl/toolbox.hxx> @@ -121,7 +120,7 @@ IMPL_LINK( PopupWindowControllerImpl, WindowEventListener, VclWindowEvent&, rWin PopupWindowController::PopupWindowController( const Reference< uno::XComponentContext >& rxContext, const Reference< frame::XFrame >& xFrame, const OUString& aCommandURL ) -: svt::ToolboxController( rxContext, xFrame, aCommandURL ) +: ImplInheritanceHelper( rxContext, xFrame, aCommandURL ) , mxImpl( new PopupWindowControllerImpl() ) { } @@ -130,27 +129,6 @@ PopupWindowController::~PopupWindowController() { } -// XInterface -Any SAL_CALL PopupWindowController::queryInterface( const Type& aType ) -throw (RuntimeException, std::exception) -{ - Any a( ToolboxController::queryInterface( aType ) ); - if ( a.hasValue() ) - return a; - - return ::cppu::queryInterface( aType, static_cast< lang::XServiceInfo* >( this )); -} - -void SAL_CALL PopupWindowController::acquire() throw () -{ - ToolboxController::acquire(); -} - -void SAL_CALL PopupWindowController::release() throw () -{ - ToolboxController::release(); -} - // XServiceInfo sal_Bool SAL_CALL PopupWindowController::supportsService( const OUString& ServiceName ) throw(RuntimeException, std::exception) { commit 6128a8311d37514c49c2fe3ba80f850a51de37d6 Author: Maxim Monastirsky <[email protected]> Date: Thu Sep 29 23:07:35 2016 +0300 Add title-based tearoff to DockingManager Using FloatingWindow with WB_OWNERDRAWDECORATION as a toolbar dropdown is just a recipe for troubles. One example is https://lists.freedesktop.org/archives/libreoffice/2016-June/074431.html So fake the title to allow tearoff, instead of using a "real" title for it. Change-Id: I4fe00b9505686d91b9715e832ddb9f4b38f6554f diff --git a/vcl/source/window/dockmgr.cxx b/vcl/source/window/dockmgr.cxx index 984e5af..9caf5cc 100644 --- a/vcl/source/window/dockmgr.cxx +++ b/vcl/source/window/dockmgr.cxx @@ -454,6 +454,13 @@ Rectangle DockingManager::GetPosSizePixel( const vcl::Window *pWindow ) #define POPUP_DRAGHEIGHT (POPUP_DRAGGRIP+POPUP_DRAGBORDER+POPUP_DRAGBORDER) #define POPUP_DRAGWIDTH 20 +enum class TearOffStyle +{ + Grip, + Title, + None +}; + class ImplPopupFloatWin : public FloatingWindow { private: @@ -463,12 +470,11 @@ private: bool mbTrackingEnabled; Point maDelta; Point maTearOffPosition; - bool mbGripAtBottom; - bool mbHasGrip; + TearOffStyle meTearOffStyle; void ImplSetBorder(); public: - ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWrapper* pDockingWin, bool bHasGrip ); + ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWrapper* pDockingWin, TearOffStyle eStyle ); virtual ~ImplPopupFloatWin() override; virtual void dispose() override; @@ -484,12 +490,11 @@ public: Point GetToolboxPosition() const; Point GetTearOffPosition() const; void DrawGrip(vcl::RenderContext& rRenderContext); + void DrawTitle(vcl::RenderContext& rRenderContext); void DrawBorder(vcl::RenderContext& rRenderContext); - - bool hasGrip() const { return mbHasGrip; } }; -ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWrapper* pDockingWin, bool bHasGrip ) : +ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWrapper* pDockingWin, TearOffStyle eStyle ) : FloatingWindow( pParent, WB_NOBORDER | WB_SYSTEMWINDOW | WB_NOSHADOW) { mpWindowImpl->mbToolbarFloatingWindow = true; // indicate window type, required for accessibility @@ -498,8 +503,7 @@ ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWra mbHighlight = false; mbMoving = false; mbTrackingEnabled = false; - mbGripAtBottom = true; - mbHasGrip = bHasGrip; + meTearOffStyle = eStyle; ImplSetBorder(); } @@ -533,8 +537,10 @@ void ImplPopupFloatWin::ImplSetBorder() // by setting those members the method SetOutputSizePixel() can // be used to set the proper window size mpWindowImpl->mnTopBorder = 1; - if( hasGrip() ) + if( meTearOffStyle == TearOffStyle::Grip ) mpWindowImpl->mnTopBorder += POPUP_DRAGHEIGHT+2; + else if( meTearOffStyle == TearOffStyle::Title ) + mpWindowImpl->mnTopBorder += GetSettings().GetStyleSettings().GetTitleHeight()+2; mpWindowImpl->mnBottomBorder = 1; mpWindowImpl->mnLeftBorder = 1; mpWindowImpl->mnRightBorder = 1; @@ -548,24 +554,23 @@ void ImplPopupFloatWin::Resize() Rectangle ImplPopupFloatWin::GetDragRect() const { - Rectangle aRect; - if( hasGrip() ) + if( meTearOffStyle == TearOffStyle::Grip ) { - aRect = Rectangle( 1,1, GetOutputSizePixel().Width()-1, 2+POPUP_DRAGHEIGHT ); - if( mbGripAtBottom ) - { - int height = GetOutputSizePixel().Height(); - aRect.Top() = height - 3 - POPUP_DRAGHEIGHT; - aRect.Bottom() = aRect.Top() + 1 + POPUP_DRAGHEIGHT; - } + return Rectangle( 1, GetOutputSizePixel().Height() - 3 - POPUP_DRAGHEIGHT, + GetOutputSizePixel().Width() - 1, GetOutputSizePixel().Height() - 1 ); } - return aRect; + else if( meTearOffStyle == TearOffStyle::Title ) + { + return Rectangle( 1, 1, GetOutputSizePixel().Width() - 1, GetSettings().GetStyleSettings().GetTitleHeight() + 2 ); + } + + return Rectangle(); } Point ImplPopupFloatWin::GetToolboxPosition() const { // return inner position where a toolbox could be placed - Point aPt( 1, 1 + ((mbGripAtBottom || !hasGrip()) ? 0 : GetDragRect().getHeight()) ); // grip + border + Point aPt( 1, 1 + ( meTearOffStyle != TearOffStyle::Title ? 0 : GetDragRect().getHeight()) ); // grip + border return aPt; } @@ -691,13 +696,33 @@ void ImplPopupFloatWin::DrawGrip(vcl::RenderContext& rRenderContext) rRenderContext.SetFillColor(); } +void ImplPopupFloatWin::DrawTitle(vcl::RenderContext &rRenderContext) +{ + Rectangle aRect(GetDragRect()); + aRect.Left() += 2; + aRect.Right() -= 2; + + DrawTextFlags nTextStyle = DrawTextFlags::Left | DrawTextFlags::VCenter | DrawTextFlags::EndEllipsis | DrawTextFlags::Clip; + rRenderContext.SetTextColor(GetSettings().GetStyleSettings().GetButtonTextColor()); + SetPointFont(rRenderContext, GetSettings().GetStyleSettings().GetTitleFont()); + rRenderContext.DrawText(aRect, GetText(), nTextStyle); +} + void ImplPopupFloatWin::Paint(vcl::RenderContext& rRenderContext, const Rectangle&) { Rectangle aRect(Point(), GetOutputSizePixel()); - rRenderContext.DrawWallpaper(aRect, Wallpaper(rRenderContext.GetSettings().GetStyleSettings().GetFaceGradientColor())); - DrawBorder(rRenderContext); - if (hasGrip()) + + if (meTearOffStyle == TearOffStyle::Grip) + { + rRenderContext.DrawWallpaper(aRect, Wallpaper(rRenderContext.GetSettings().GetStyleSettings().GetFaceGradientColor())); DrawGrip(rRenderContext); + } + else if ( meTearOffStyle == TearOffStyle::Title ) + { + rRenderContext.DrawWallpaper(aRect, Wallpaper(rRenderContext.GetSettings().GetStyleSettings().GetFaceColor())); + DrawTitle(rRenderContext); + } + DrawBorder(rRenderContext); } void ImplPopupFloatWin::MouseMove( const MouseEvent& rMEvt ) @@ -1085,7 +1110,15 @@ void ImplDockingWindowWrapper::StartPopupMode( ToolBox *pParentToolBox, FloatWin mpOldBorderWin = nullptr; // no border window found // the new parent for popup mode - VclPtrInstance<ImplPopupFloatWin> pWin( mpParent, this, bool(nFlags & FloatWinPopupFlags::AllowTearOff) ); + TearOffStyle eStyle = TearOffStyle::None; + if ( nFlags & FloatWinPopupFlags::AllowTearOff ) + { + if ( dynamic_cast< ToolBox* >( GetWindow() ) ) + eStyle = TearOffStyle::Grip; + else + eStyle = TearOffStyle::Title; + } + VclPtrInstance<ImplPopupFloatWin> pWin( mpParent, this, eStyle ); pWin->SetPopupModeEndHdl( LINK( this, ImplDockingWindowWrapper, PopupModeEnd ) ); pWin->SetText( GetWindow()->GetText() ); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
