summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/vcl/dockwin.hxx16
-rw-r--r--svx/source/tbxctrls/tbcontrl.cxx19
-rw-r--r--vcl/source/window/dockmgr.cxx8
-rw-r--r--vcl/source/window/dockwin.cxx1
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);