diff options
-rw-r--r-- | include/vcl/dockwin.hxx | 16 | ||||
-rw-r--r-- | svx/source/tbxctrls/tbcontrl.cxx | 19 | ||||
-rw-r--r-- | vcl/source/window/dockmgr.cxx | 8 | ||||
-rw-r--r-- | vcl/source/window/dockwin.cxx | 1 |
4 files changed, 44 insertions, 0 deletions
diff --git a/include/vcl/dockwin.hxx b/include/vcl/dockwin.hxx index d60ed99123ff..85167ebbf318 100644 --- a/include/vcl/dockwin.hxx +++ b/include/vcl/dockwin.hxx @@ -216,6 +216,16 @@ class VCL_DLLPUBLIC DockingWindow class ImplData; private: VclPtr<FloatingWindow> mpFloatWin; + + // in the case when docking window is displayed in popup mode + // there are 2 window instance docking window and floating window + // and to make things work correctly both needs to be invalidated together + // but unfortunatly from any docking window we don't have access to floating window notifier + // so we can use this mnPopUpWinId to store the floating win id when we can to use later + // this was primarily introduced to fix the currency popup window in calc LOK + // if there is any better approach + // FIXME + vcl::LOKWindowId mnLOKPopUpWinId; VclPtr<vcl::Window> mpOldBorderWin; std::unique_ptr<ImplData> mpImplData; Point maFloatPos; @@ -315,6 +325,12 @@ public: bool IsFloatingMode() const; FloatingWindow* GetFloatingWindow() const { return mpFloatWin; } + // These two methods are used when docking window is displayed in popup mode + // By setting this popup window id we can access floating window notifier in docking window + // one of the example can be found in SvxCurrencyList_Impl::PixelInvalidate + void SetPopUpWindowLOKId(vcl::LOKWindowId nLOKPopUpWinId) { mnLOKPopUpWinId = nLOKPopUpWinId; } + vcl::LOKWindowId GetPopUpWindowLOKId() const { return mnLOKPopUpWinId; } + void SetFloatingPos( const Point& rNewPos ); Point GetFloatingPos() const; diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx index 50e3f6760867..57cca78867f4 100644 --- a/svx/source/tbxctrls/tbcontrl.cxx +++ b/svx/source/tbxctrls/tbcontrl.cxx @@ -645,6 +645,8 @@ public: LanguageType& eSelectLanguage ); virtual ~SvxCurrencyList_Impl() override { disposeOnce(); } virtual void dispose() override; + + void PixelInvalidate(const tools::Rectangle* pRectangle) override; }; class SvxStyleToolBoxControl; @@ -2685,15 +2687,32 @@ SvxCurrencyList_Impl::SvxCurrencyList_Impl( if ( nSelectedPos >= 0 ) m_pCurrencyLb->SelectEntryPos( nSelectedPos ); m_pCurrencyLb->Show(); + + auto parentNotifier = GetParentWithLOKNotifier(); + if (parentNotifier) + SetLOKNotifier(parentNotifier->GetLOKNotifier()); } void SvxCurrencyList_Impl::dispose() { + ReleaseLOKNotifier(); m_xControl.clear(); m_pCurrencyLb.disposeAndClear(); ToolbarPopup::dispose(); } +void SvxCurrencyList_Impl::PixelInvalidate(const tools::Rectangle* pRectangle) +{ + const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier(); + if (pNotifier && pRectangle && GetPopUpWindowLOKId() != 0) + { + std::vector<vcl::LOKPayloadItem> aPayload; + aPayload.push_back(std::make_pair(OString("rectangle"), pRectangle->toString())); + pNotifier->notifyWindow(GetPopUpWindowLOKId(), "invalidate", aPayload); + } + svtools::ToolbarPopup::PixelInvalidate(pRectangle); +} + SvxLineWindow_Impl::SvxLineWindow_Impl( svt::ToolboxController& rController, vcl::Window* pParentWindow ) : ToolbarPopup( rController.getFrameInterface(), pParentWindow, WB_STDPOPUP | WB_MOVEABLE | WB_CLOSEABLE ), m_aLineStyleLb( VclPtr<LineListBox>::Create(this) ), diff --git a/vcl/source/window/dockmgr.cxx b/vcl/source/window/dockmgr.cxx index a0825e616467..3d70272ae04a 100644 --- a/vcl/source/window/dockmgr.cxx +++ b/vcl/source/window/dockmgr.cxx @@ -817,6 +817,10 @@ void ImplDockingWindowWrapper::StartPopupMode( ToolBox *pParentToolBox, FloatWin mpFloatWin->StartPopupMode( pParentToolBox, nFlags ); GetWindow()->Show(); + DockingWindow* pDockWin = dynamic_cast< DockingWindow* >(mpDockingWindow.get()); + if (pDockWin) + pDockWin->SetPopUpWindowLOKId(mpFloatWin->GetLOKWindowId()); + if( pParentToolBox->IsKeyEvent() ) { // send HOME key to subtoolbar in order to select first item @@ -838,6 +842,10 @@ void ImplDockingWindowWrapper::StartPopupMode( const tools::Rectangle& rRect, Fl IMPL_LINK_NOARG(ImplDockingWindowWrapper, PopupModeEnd, FloatingWindow*, void) { + DockingWindow* pDockWin = dynamic_cast< DockingWindow* >(mpDockingWindow.get()); + if (pDockWin) + pDockWin->SetPopUpWindowLOKId(0); + GetWindow()->Show( false, ShowFlags::NoFocusChange ); // set parameter for handler before destroying floating window diff --git a/vcl/source/window/dockwin.cxx b/vcl/source/window/dockwin.cxx index 6ac2562d2f41..36cefbc201df 100644 --- a/vcl/source/window/dockwin.cxx +++ b/vcl/source/window/dockwin.cxx @@ -298,6 +298,7 @@ void DockingWindow::ImplInitDockingWindowData() mbIsDeferredInit = false; mbIsCalculatingInitialLayoutSize = false; mpDialogParent = nullptr; + mnLOKPopUpWinId = 0; //To-Do, reuse maResizeTimer maLayoutIdle.SetPriority(TaskPriority::RESIZE); |