[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - include/vcl svx/source vcl/source

Pranam Lashkari (via logerrit) logerrit at kemper.freedesktop.org
Wed Mar 3 13:44:41 UTC 2021


 include/vcl/dockwin.hxx          |   16 ++++++++++++++++
 svx/source/tbxctrls/tbcontrl.cxx |   19 +++++++++++++++++++
 vcl/source/window/dockmgr.cxx    |    8 ++++++++
 vcl/source/window/dockwin.cxx    |    1 +
 4 files changed, 44 insertions(+)

New commits:
commit f1525c89ccf2b80f284bea68bd7a62dfaaff56a4
Author:     Pranam Lashkari <lpranam at collabora.com>
AuthorDate: Tue Mar 2 06:04:40 2021 +0530
Commit:     Pranam Lashkari <lpranam at collabora.com>
CommitDate: Wed Mar 3 14:44:04 2021 +0100

    LOK: added missing PixelInvalidate method for currency list
    
    when docking window is displayed in popup mode,
    there are two windows created docking window and floating window,
    to make the this window work correctly with LOK,
    we have to invalidate the floating window to update floating window,
    as well as docking window.
    
    Change-Id: Ia1b4220646664aa0666a24e34fc14bf41421f9e2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111762
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>

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);


More information about the Libreoffice-commits mailing list