[Libreoffice-commits] core.git: Branch 'feature/lok_dialog' - desktop/source include/sfx2 include/vcl sc/inc sc/source sd/source sfx2/source sw/inc sw/source vcl/Library_vcl.mk vcl/source

Jan Holesovsky kendy at collabora.com
Fri Nov 24 17:52:44 UTC 2017


 desktop/source/lib/init.cxx          |  156 +++++++++++++++++++++++++----------
 include/sfx2/lokhelper.hxx           |    4 
 include/sfx2/viewsh.hxx              |    4 
 include/vcl/IDialogRenderable.hxx    |   36 +-------
 include/vcl/ITiledRenderable.hxx     |    6 +
 include/vcl/dialog.hxx               |   13 --
 include/vcl/window.hxx               |   20 +++-
 sc/inc/docuno.hxx                    |    3 
 sc/source/ui/unoobj/docuno.cxx       |    6 +
 sd/source/ui/inc/unomodel.hxx        |    3 
 sd/source/ui/unoidl/unomodel.cxx     |    6 +
 sfx2/source/dialog/basedlgs.cxx      |    8 -
 sfx2/source/dialog/tabdlg.cxx        |    4 
 sfx2/source/view/lokhelper.cxx       |    4 
 sfx2/source/view/viewsh.cxx          |    8 -
 sw/inc/unotxdoc.hxx                  |   15 ---
 sw/source/uibase/uno/unotxdoc.cxx    |  117 --------------------------
 vcl/Library_vcl.mk                   |    1 
 vcl/source/app/IDialogRenderable.cxx |   22 ----
 vcl/source/window/dialog.cxx         |  116 --------------------------
 vcl/source/window/floatwin.cxx       |    2 
 vcl/source/window/window.cxx         |  118 ++++++++++++++++++++++++++
 22 files changed, 308 insertions(+), 364 deletions(-)

New commits:
commit 8b502136d761eb69352b3902b02007e749b6d1be
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Fri Nov 24 18:50:05 2017 +0100

    lokdialog: Move the painting down to Window, and enable Calc and Impress.
    
    Tested with .uno:FormatCellDialog in Calc, Impress not tested.
    
    Change-Id: I6d911c29616988db0625be9e2a63cf2172c69ee8

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index c5b7bd342d6f..5e535e4be11d 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -543,7 +543,7 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis,
                              int nCharCode,
                              int nKeyCode);
 static void doc_postDialogKeyEvent(LibreOfficeKitDocument* pThis,
-                                   unsigned nDialogId,
+                                   unsigned nLOKWindowId,
                                    int nType,
                                    int nCharCode,
                                    int nKeyCode);
@@ -555,7 +555,7 @@ static void doc_postMouseEvent (LibreOfficeKitDocument* pThis,
                                 int nButtons,
                                 int nModifier);
 static void doc_postDialogMouseEvent (LibreOfficeKitDocument* pThis,
-                                      unsigned nDialogId,
+                                      unsigned nLOKWindowId,
                                       int nType,
                                       int nX,
                                       int nY,
@@ -563,7 +563,7 @@ static void doc_postDialogMouseEvent (LibreOfficeKitDocument* pThis,
                                       int nButtons,
                                       int nModifier);
 static void doc_postDialogChildMouseEvent (LibreOfficeKitDocument* pThis,
-                                           unsigned nDialogId,
+                                           unsigned nLOKWindowId,
                                            int nType,
                                            int nX,
                                            int nY,
@@ -610,14 +610,14 @@ static unsigned char* doc_renderFont(LibreOfficeKitDocument* pThis,
                           int* pFontHeight);
 static char* doc_getPartHash(LibreOfficeKitDocument* pThis, int nPart);
 
-static void doc_paintDialog(LibreOfficeKitDocument* pThis, unsigned nDialogId, unsigned char* pBuffer,
+static void doc_paintDialog(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, unsigned char* pBuffer,
                             const int nX, const int nY,
                             const int nWidth, const int nHeight);
 
-static void doc_getDialogInfo(LibreOfficeKitDocument* pThis, unsigned nDialogId,
+static void doc_getDialogInfo(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId,
                               char** pDialogTitle, int* nWidth, int* nHeight);
 
-static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* pThis, unsigned nDialogId, unsigned char* pBuffer, int* nWidth, int* nHeight);
+static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, unsigned char* pBuffer, int* nWidth, int* nHeight);
 
 LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XComponent> &xComponent)
     : mxComponent(xComponent)
@@ -1028,7 +1028,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                 boost::property_tree::ptree aTree;
                 std::stringstream aStream(payload);
                 boost::property_tree::read_json(aStream, aTree);
-                const unsigned nDialogId = aTree.get<unsigned>("dialogId", 0);
+                const unsigned nLOKWindowId = aTree.get<unsigned>("dialogId", 0);
                 if (aTree.get<std::string>("action", "") == "invalidate")
                 {
                     std::string aRectStr = aTree.get<std::string>("rectangle", "");
@@ -1036,7 +1036,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                     // remove all previous dialog part invalidations
                     if (aRectStr.empty())
                     {
-                        removeAll([&nDialogId] (const queue_type::value_type& elem) {
+                        removeAll([&nLOKWindowId] (const queue_type::value_type& elem) {
                                 if (elem.first == LOK_CALLBACK_DIALOG)
                                 {
                                     boost::property_tree::ptree aOldTree;
@@ -1044,7 +1044,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                                     boost::property_tree::read_json(aOldStream, aOldTree);
                                     const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
                                     if (aOldTree.get<std::string>("action", "") == "invalidate" &&
-                                        nDialogId == nOldDialogId)
+                                        nLOKWindowId == nOldDialogId)
                                     {
                                         return true;
                                     }
@@ -1057,7 +1057,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                         // if we have to invalidate all of the dialog, ignore
                         // any part invalidation message
                         const auto& pos = std::find_if(m_queue.rbegin(), m_queue.rend(),
-                                                       [&nDialogId] (const queue_type::value_type& elem)
+                                                       [&nLOKWindowId] (const queue_type::value_type& elem)
                                                        {
                                                            if (elem.first != LOK_CALLBACK_DIALOG)
                                                                return false;
@@ -1067,7 +1067,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                                                            boost::property_tree::read_json(aOldStream, aOldTree);
                                                            const unsigned nOldDialogId = aOldTree.get<unsigned>("dialogId", 0);
                                                            if (aOldTree.get<std::string>("action", "") == "invalidate" &&
-                                                               nDialogId == nOldDialogId &&
+                                                               nLOKWindowId == nOldDialogId &&
                                                                aOldTree.get<std::string>("rectangle", "").empty())
                                                            {
                                                                return true;
@@ -1088,7 +1088,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                         aRectStream >> nLeft >> nComma >> nTop >> nComma >> nWidth >> nComma >> nHeight;
                         tools::Rectangle aNewRect = tools::Rectangle(nLeft, nTop, nLeft + nWidth, nTop + nHeight);
                         bool currentIsRedundant = false;
-                        removeAll([&aNewRect, &nDialogId, &currentIsRedundant] (const queue_type::value_type& elem) {
+                        removeAll([&aNewRect, &nLOKWindowId, &currentIsRedundant] (const queue_type::value_type& elem) {
                                 if (elem.first != LOK_CALLBACK_DIALOG)
                                     return false;
 
@@ -1108,7 +1108,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                                     aOldRectStream >> nOldLeft >> nOldComma >> nOldTop >> nOldComma >> nOldWidth >> nOldComma >> nOldHeight;
                                     tools::Rectangle aOldRect = tools::Rectangle(nOldLeft, nOldTop, nOldLeft + nOldWidth, nOldTop + nOldHeight);
 
-                                    if (nDialogId == nOldDialogId)
+                                    if (nLOKWindowId == nOldDialogId)
                                     {
                                         // new one engulfs the old one?
                                         if (aNewRect.IsInside(aOldRect))
@@ -1321,10 +1321,14 @@ ITiledRenderable* getTiledRenderable(LibreOfficeKitDocument* pThis)
     return dynamic_cast<ITiledRenderable*>(pDocument->mxComponent.get());
 }
 
-IDialogRenderable* getDialogRenderable(LibreOfficeKitDocument* pThis)
+VclPtr<Window> findWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId)
 {
-    LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
-    return dynamic_cast<IDialogRenderable*>(pDocument->mxComponent.get());
+    ITiledRenderable* pRenderable = getTiledRenderable(pThis);
+
+    if (!pRenderable)
+        return VclPtr<Window>();
+
+    return pRenderable->findWindow(nLOKWindowId);
 }
 
 } // anonymous namespace
@@ -2256,18 +2260,31 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis, int nType, int nChar
     pDoc->postKeyEvent(nType, nCharCode, nKeyCode);
 }
 
-static void doc_postDialogKeyEvent(LibreOfficeKitDocument* pThis, unsigned nDialogId, int nType, int nCharCode, int nKeyCode)
+static void doc_postDialogKeyEvent(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, int nType, int nCharCode, int nKeyCode)
 {
     SolarMutexGuard aGuard;
 
-    IDialogRenderable* pDoc = getDialogRenderable(pThis);
-    if (!pDoc)
+    VclPtr<Window> pWindow = findWindow(pThis, nLOKWindowId);
+    if (!pWindow)
     {
-        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering";
+        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
         return;
     }
 
-    pDoc->postDialogKeyEvent(nDialogId, nType, nCharCode, nKeyCode);
+    KeyEvent aEvent(nCharCode, nKeyCode, 0);
+
+    switch (nType)
+    {
+        case LOK_KEYEVENT_KEYINPUT:
+            pWindow->LOKKeyInput(aEvent);
+            break;
+        case LOK_KEYEVENT_KEYUP:
+            pWindow->LOKKeyUp(aEvent);
+            break;
+        default:
+            assert(false);
+            break;
+    }
 }
 
 /** Class to react on finishing of a dispatched command.
@@ -2421,32 +2438,66 @@ static void doc_postMouseEvent(LibreOfficeKitDocument* pThis, int nType, int nX,
     }
 }
 
-static void doc_postDialogMouseEvent(LibreOfficeKitDocument* pThis, unsigned nDialogId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
+static void doc_postDialogMouseEvent(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
 {
     SolarMutexGuard aGuard;
 
-    IDialogRenderable* pDoc = getDialogRenderable(pThis);
-    if (!pDoc)
+    VclPtr<Window> pWindow = findWindow(pThis, nLOKWindowId);
+    if (!pWindow)
     {
-        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering";
+        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
         return;
     }
 
-    pDoc->postDialogMouseEvent(nDialogId, nType, nX, nY, nCount, nButtons, nModifier);
+    Point aPos(nX, nY);
+    MouseEvent aEvent(aPos, nCount, MouseEventModifiers::SIMPLECLICK, nButtons, nModifier);
+
+    switch (nType)
+    {
+        case LOK_MOUSEEVENT_MOUSEBUTTONDOWN:
+            pWindow->LogicMouseButtonDown(aEvent);
+            break;
+        case LOK_MOUSEEVENT_MOUSEBUTTONUP:
+            pWindow->LogicMouseButtonUp(aEvent);
+            break;
+        case LOK_MOUSEEVENT_MOUSEMOVE:
+            pWindow->LogicMouseMove(aEvent);
+            break;
+        default:
+            assert(false);
+            break;
+    }
 }
 
-static void doc_postDialogChildMouseEvent(LibreOfficeKitDocument* pThis, unsigned nDialogId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
+static void doc_postDialogChildMouseEvent(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, int nType, int nX, int nY, int nCount, int nButtons, int nModifier)
 {
     SolarMutexGuard aGuard;
 
-    IDialogRenderable* pDoc = getDialogRenderable(pThis);
-    if (!pDoc)
+    VclPtr<Window> pWindow = findWindow(pThis, nLOKWindowId);
+    if (!pWindow)
     {
-        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering";
+        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
         return;
     }
 
-    pDoc->postDialogChildMouseEvent(nDialogId, nType, nX, nY, nCount, nButtons, nModifier);
+    Point aPos(nX, nY);
+    MouseEvent aEvent(aPos, nCount, MouseEventModifiers::SIMPLECLICK, nButtons, nModifier);
+
+    switch (nType)
+    {
+        case LOK_MOUSEEVENT_MOUSEBUTTONDOWN:
+            pWindow->LogicMouseButtonDownChild(aEvent);
+            break;
+        case LOK_MOUSEEVENT_MOUSEBUTTONUP:
+            pWindow->LogicMouseButtonUpChild(aEvent);
+            break;
+        case LOK_MOUSEEVENT_MOUSEMOVE:
+            pWindow->LogicMouseMoveChild(aEvent);
+            break;
+        default:
+            assert(false);
+            break;
+    }
 }
 
 static void doc_setTextSelection(LibreOfficeKitDocument* pThis, int nType, int nX, int nY)
@@ -3225,14 +3276,25 @@ unsigned char* doc_renderFont(SAL_UNUSED_PARAMETER LibreOfficeKitDocument* /*pTh
     return nullptr;
 }
 
-static void doc_getDialogInfo(LibreOfficeKitDocument* pThis, unsigned nDialogId,
+static void doc_getDialogInfo(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId,
                               char** pDialogTitle, int* nWidth, int* nHeight)
 {
+    // FIXME - I guess we should kill this one, and use only the callback
+    // "created"?
+
     SolarMutexGuard aGuard;
 
-    IDialogRenderable* pDialogRenderable = getDialogRenderable(pThis);
-    OUString aDialogTitle;
-    pDialogRenderable->getDialogInfo(nDialogId, aDialogTitle, *nWidth, *nHeight);
+    VclPtr<Window> pWindow = findWindow(pThis, nLOKWindowId);
+    if (!pWindow)
+    {
+        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
+        return;
+    }
+
+    OUString aDialogTitle(pWindow->GetText());
+    const Size aSize = pWindow->GetSizePixel();
+    *nWidth = aSize.getWidth();
+    *nHeight = aSize.getHeight();
 
     // copy dialog title
     if (!aDialogTitle.isEmpty())
@@ -3243,14 +3305,19 @@ static void doc_getDialogInfo(LibreOfficeKitDocument* pThis, unsigned nDialogId,
     }
 }
 
-static void doc_paintDialog(LibreOfficeKitDocument* pThis, unsigned nDialogId,
+static void doc_paintDialog(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId,
                             unsigned char* pBuffer,
                             const int nX, const int nY,
                             const int nWidth, const int nHeight)
 {
     SolarMutexGuard aGuard;
 
-    IDialogRenderable* pDialogRenderable = getDialogRenderable(pThis);
+    VclPtr<Window> pWindow = findWindow(pThis, nLOKWindowId);
+    if (!pWindow)
+    {
+        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
+        return;
+    }
 
     ScopedVclPtrInstance<VirtualDevice> pDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT);
     pDevice->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
@@ -3262,15 +3329,20 @@ static void doc_paintDialog(LibreOfficeKitDocument* pThis, unsigned nDialogId,
     pDevice->SetMapMode(aMapMode);
 
     comphelper::LibreOfficeKit::setDialogPainting(true);
-    pDialogRenderable->paintDialog(nDialogId, *pDevice.get());
+    pWindow->paintDialog(*pDevice.get());
     comphelper::LibreOfficeKit::setDialogPainting(false);
 }
 
-static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* pThis, unsigned nDialogId, unsigned char* pBuffer, int* nWidth, int* nHeight)
+static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, unsigned char* pBuffer, int* nWidth, int* nHeight)
 {
     SolarMutexGuard aGuard;
 
-    IDialogRenderable* pDialogRenderable = getDialogRenderable(pThis);
+    VclPtr<Window> pWindow = findWindow(pThis, nLOKWindowId);
+    if (!pWindow)
+    {
+        gImpl->maLastExceptionMsg = "Document doesn't support dialog rendering, or window not found.";
+        return;
+    }
 
     ScopedVclPtrInstance<VirtualDevice> pDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT);
     pDevice->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
@@ -3278,7 +3350,9 @@ static void doc_paintActiveFloatingWindow(LibreOfficeKitDocument* pThis, unsigne
     pDevice->SetOutputSizePixelScaleOffsetAndBuffer(Size(*nWidth, *nHeight), Fraction(1.0), Point(), pBuffer);
 
     comphelper::LibreOfficeKit::setDialogPainting(true);
-    pDialogRenderable->paintActiveFloatingWindow(nDialogId, *pDevice.get(), *nWidth, *nHeight);
+    const Size aSize = pWindow->PaintActiveFloatingWindow(*pDevice.get());
+    *nWidth = aSize.getWidth();
+    *nHeight = aSize.getHeight();
     comphelper::LibreOfficeKit::setDialogPainting(false);
 }
 
diff --git a/include/sfx2/lokhelper.hxx b/include/sfx2/lokhelper.hxx
index 170d65a794d0..00288d04faac 100644
--- a/include/sfx2/lokhelper.hxx
+++ b/include/sfx2/lokhelper.hxx
@@ -42,11 +42,11 @@ public:
     /// Same as notifyOtherViews(), but works on a selected "other" view, not on all of them.
     static void notifyOtherView(SfxViewShell* pThisView, SfxViewShell const* pOtherView, int nType, const OString& rKey, const OString& rPayload);
     /// Emits a LOK_CALLBACK_DIALOG
-    static void notifyDialog(vcl::LOKWindowId nDialogId,
+    static void notifyWindow(vcl::LOKWindowId nDialogId,
                              const OUString& rAction,
                              const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>());
     /// Emits a LOK_CALLBACK_DIALOG_CHILD
-    static void notifyDialogChild(vcl::LOKWindowId nDialogId, const OUString& rAction, const Point& rPos);
+    static void notifyWindowChild(vcl::LOKWindowId nDialogId, const OUString& rAction, const Point& rPos);
     /// Emits a LOK_CALLBACK_INVALIDATE_TILES, but tweaks it according to setOptionalFeatures() if needed.
     static void notifyInvalidation(SfxViewShell const* pThisView, const OString& rPayload);
     /// A special value to signify 'infinity'.
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index 3068fb15e2cd..75a7fb7dbc41 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -229,8 +229,8 @@ public:
     void                        UnregisterDlg(vcl::LOKWindowId nDialogId);
 
     // ILibreOfficeKitNotifier
-    virtual void                notifyDialog(const vcl::LOKWindowId& rDialogId, const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>()) const override;
-    virtual void                notifyDialogChild(const vcl::LOKWindowId& rDialogId, const OUString& rAction, const Point& rPos) const override;
+    virtual void                notifyWindow(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>()) const override;
+    virtual void                notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos) const override;
 
     // Focus, KeyInput, Cursor
     virtual void                ShowCursor( bool bOn = true );
diff --git a/include/vcl/IDialogRenderable.hxx b/include/vcl/IDialogRenderable.hxx
index 20515c86d2a6..281d04385aee 100644
--- a/include/vcl/IDialogRenderable.hxx
+++ b/include/vcl/IDialogRenderable.hxx
@@ -11,51 +11,31 @@
 #ifndef INCLUDED_VCL_IDIALOGRENDERABLE_HXX
 #define INCLUDED_VCL_IDIALOGRENDERABLE_HXX
 
+#include <vcl/dllapi.h>
+
 #include <tools/gen.hxx>
-#include <vcl/pointr.hxx>
-#include <vcl/virdev.hxx>
-#include <vcl/window.hxx>
+#include <rtl/ustring.hxx>
 
-#include <map>
+#include <vector>
 
 namespace vcl
 {
 
 typedef std::pair<const OString, const OString> LOKPayloadItem;
 
-class VCL_DLLPUBLIC IDialogRenderable
-{
-public:
-    virtual ~IDialogRenderable();
-
-    virtual void paintDialog(const LOKWindowId& rLOKWindowId, VirtualDevice &rDevice) = 0;
-
-    virtual void getDialogInfo(const LOKWindowId& rLOKWindowId, OUString& rDialogTitle, int& rWidth, int& rHeight) = 0;
-
-    virtual void paintActiveFloatingWindow(const LOKWindowId& rLOKWindowId, VirtualDevice &rDevice,
-                                           int& nOutputWidth, int& nOutputHeight) = 0;
-
-    virtual void postDialogKeyEvent(const LOKWindowId& rLOKWindowId, int nType,
-                                    int nCharCode, int nKeyCode) = 0;
-
-    virtual void postDialogMouseEvent(const LOKWindowId& rLOKWindowId, int nType, int nX, int nY,
-                                      int nCount, int nButtons, int nModifier) = 0;
-
-    virtual void postDialogChildMouseEvent(const LOKWindowId& rLOKWindowId, int nType, int nX, int nY,
-                                           int nCount, int nButtons, int nModifier) = 0;
-};
+typedef sal_uInt32 LOKWindowId;
 
 class VCL_DLLPUBLIC ILibreOfficeKitNotifier
 {
 public:
     virtual ~ILibreOfficeKitNotifier() {}
 
-    // Callbacks
-    virtual void notifyDialog(const LOKWindowId& rLOKWindowId,
+    /// Callbacks
+    virtual void notifyWindow(vcl::LOKWindowId nLOKWindowId,
                               const OUString& rAction,
                               const std::vector<LOKPayloadItem>& rPayload = std::vector<LOKPayloadItem>()) const = 0;
 
-    virtual void notifyDialogChild(const LOKWindowId& rLOKWindowId, const OUString& rAction, const Point& rPos) const = 0;
+    virtual void notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos) const = 0;
 };
 
 } // namespace vcl
diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx
index 7b0720a429b7..016704bb09db 100644
--- a/include/vcl/ITiledRenderable.hxx
+++ b/include/vcl/ITiledRenderable.hxx
@@ -228,6 +228,12 @@ public:
     {
         return OUString();
     }
+
+    /**
+     * Find the window/dialog with the right ID for tunneling of windows,
+     * dialogs or pop-ups.
+     */
+    virtual VclPtr<Window> findWindow(vcl::LOKWindowId nLOKWindowId) const = 0;
 };
 } // namespace vcl
 
diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx
index 4347917b7675..30fae84afa9a 100644
--- a/include/vcl/dialog.hxx
+++ b/include/vcl/dialog.hxx
@@ -78,20 +78,9 @@ public:
     virtual        void    LogicInvalidate(const tools::Rectangle* pRectangle) override;
                    void    InvalidateFloatingWindow(const Point& rPos);
                    void    CloseFloatingWindow();
-                   Size    PaintActiveFloatingWindow(VirtualDevice& rDevice) const;
 
     /// Paints the current dialog to the given virtual device
-    void paintDialog(VirtualDevice& rDevice);
-    void LogicMouseButtonDown(const MouseEvent& rMouseEvent);
-    void LogicMouseButtonUp(const MouseEvent& rMouseEvent);
-    void LogicMouseMove(const MouseEvent& rMouseEvent);
-    void LogicMouseButtonDownChild(const MouseEvent& rMouseEvent);
-    void LogicMouseButtonUpChild(const MouseEvent& rMouseEvent);
-    void LogicMouseMoveChild(const MouseEvent& rMouseEvent);
-
-    void LOKKeyInput(const KeyEvent& rKeyEvent);
-    void LOKKeyUp(const KeyEvent& rKeyEvent);
-    void LOKCursor(const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload);
+    void paintDialog(VirtualDevice& rDevice) override;
 
 protected:
     explicit        Dialog( WindowType nType );
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 3a8d8fd341a0..0b61a46592a8 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -34,6 +34,7 @@
 #include <vcl/salnativewidgets.hxx>
 #include <vcl/uitest/factory.hxx>
 #include <vcl/vclevent.hxx>
+#include <vcl/IDialogRenderable.hxx>
 #include <rtl/ustring.hxx>
 #include <rtl/ref.hxx>
 #include <cppuhelper/weakref.hxx>
@@ -489,8 +490,6 @@ public:
                                         Color const * pPaintColor = nullptr);
 };
 
-typedef sal_uInt32 LOKWindowId;
-
 class VCL_DLLPUBLIC Window : public ::OutputDevice
 {
     friend class ::vcl::Cursor;
@@ -1206,11 +1205,26 @@ public:
 
     void                        SetComponentInterface( css::uno::Reference< css::awt::XWindowPeer > const & xIFace );
 
-    /// Interface to register for dialog tunneling.
+    /// Interface to register for dialog / window tunneling.
     void                                SetLOKNotifier(const vcl::ILibreOfficeKitNotifier* pNotifier);
     const vcl::ILibreOfficeKitNotifier* GetLOKNotifier() const;
     vcl::LOKWindowId                    GetLOKWindowId() const;
 
+    /// Dialog / window tunneling related methods.
+    virtual void paintDialog(VirtualDevice& rDevice);
+    Size PaintActiveFloatingWindow(VirtualDevice& rDevice) const;
+
+    void LogicMouseButtonDown(const MouseEvent& rMouseEvent);
+    void LogicMouseButtonUp(const MouseEvent& rMouseEvent);
+    void LogicMouseMove(const MouseEvent& rMouseEvent);
+    void LogicMouseButtonDownChild(const MouseEvent& rMouseEvent);
+    void LogicMouseButtonUpChild(const MouseEvent& rMouseEvent);
+    void LogicMouseMoveChild(const MouseEvent& rMouseEvent);
+
+    void LOKKeyInput(const KeyEvent& rKeyEvent);
+    void LOKKeyUp(const KeyEvent& rKeyEvent);
+    void LOKCursor(const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload);
+
     /** @name Accessibility
      */
     ///@{
diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx
index 67ee07440884..01fc9d9be960 100644
--- a/sc/inc/docuno.hxx
+++ b/sc/inc/docuno.hxx
@@ -363,6 +363,9 @@ public:
 
     /// @see vcl::ITiledRenderable::getPostItsPos().
     OUString getPostItsPos() override;
+
+    /// @see vcl::ITiledRenderable::findWindow().
+    VclPtr<vcl::Window> findWindow(vcl::LOKWindowId nLOKWindowId) const override;
 };
 
 class ScDrawPagesObj : public cppu::WeakImplHelper<
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 60bd3239cc27..9ee451923ab8 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -1130,6 +1130,12 @@ OUString ScModelObj::getPostItsPos()
     return OUString::fromUtf8(aStream.str().c_str());
 }
 
+VclPtr<vcl::Window> ScModelObj::findWindow(vcl::LOKWindowId nLOKWindowId) const
+{
+    SfxViewShell* pViewShell = SfxViewShell::Current();
+    return pViewShell->GetOpenedDlg(nLOKWindowId);
+}
+
 void ScModelObj::initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& /*rArguments*/)
 {
     SolarMutexGuard aGuard;
diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx
index 404c34c49b72..d93ccdd89da9 100644
--- a/sd/source/ui/inc/unomodel.hxx
+++ b/sd/source/ui/inc/unomodel.hxx
@@ -265,6 +265,9 @@ public:
     /// @see vcl::ITiledRenderable::getPostIts().
     virtual OUString getPostIts() override;
 
+    /// @see vcl::ITiledRenderable::findWindow().
+    VclPtr<vcl::Window> findWindow(vcl::LOKWindowId nLOKWindowId) const override;
+
     // XComponent
 
     /** This dispose implementation releases the resources held by the
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index ab16b1b1419f..ebea82464567 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -2669,6 +2669,12 @@ Pointer SdXImpressDocument::getPointer()
     return pWindow->GetPointer();
 }
 
+VclPtr<vcl::Window> SdXImpressDocument::findWindow(vcl::LOKWindowId nLOKWindowId) const
+{
+    SfxViewShell* pViewShell = SfxViewShell::Current();
+    return pViewShell->GetOpenedDlg(nLOKWindowId);
+}
+
 uno::Reference< i18n::XForbiddenCharacters > SdXImpressDocument::getForbiddenCharsTable()
 {
     uno::Reference< i18n::XForbiddenCharacters > xForb(mxForbiddenCharacters);
diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx
index 18d2a395631d..fba79fdcc1b0 100644
--- a/sfx2/source/dialog/basedlgs.cxx
+++ b/sfx2/source/dialog/basedlgs.cxx
@@ -164,7 +164,7 @@ void SfxModalDialog::dispose()
     SfxViewShell* pViewShell = SfxViewShell::Current();
     if (comphelper::LibreOfficeKit::isActive() && pViewShell)
     {
-        pViewShell->notifyDialog(GetLOKWindowId(), "close");
+        pViewShell->notifyWindow(GetLOKWindowId(), "close");
         pViewShell->UnregisterDlg(GetLOKWindowId());
     }
 
@@ -181,7 +181,7 @@ short SfxModalDialog::Execute()
         const Size aSize = GetOptimalSize();
         std::vector<vcl::LOKPayloadItem> aItems;
         aItems.emplace_back(std::make_pair("size", aSize.toString()));
-        pViewShell->notifyDialog(GetLOKWindowId(), "created", aItems);
+        pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
     }
 
     return ModalDialog::Execute();
@@ -255,7 +255,7 @@ void SfxModelessDialog::StateChanged( StateChangedType nStateChange )
             const Size aOptimalSize = GetOptimalSize();
             std::vector<vcl::LOKPayloadItem> aItems;
             aItems.emplace_back(std::make_pair("size", aOptimalSize.toString()));
-            pViewShell->notifyDialog(GetLOKWindowId(), "created", aItems);
+            pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
         }
 
         pImpl->bConstructed = true;
@@ -393,7 +393,7 @@ void SfxModelessDialog::dispose()
     SfxViewShell* pViewShell = SfxViewShell::Current();
     if (comphelper::LibreOfficeKit::isActive() && pViewShell)
     {
-        pViewShell->notifyDialog(GetLOKWindowId(), "close");
+        pViewShell->notifyWindow(GetLOKWindowId(), "close");
         pViewShell->UnregisterDlg(GetLOKWindowId());
     }
 
diff --git a/sfx2/source/dialog/tabdlg.cxx b/sfx2/source/dialog/tabdlg.cxx
index 7b53bbc32ff3..10cacfb0eee2 100644
--- a/sfx2/source/dialog/tabdlg.cxx
+++ b/sfx2/source/dialog/tabdlg.cxx
@@ -406,7 +406,7 @@ void SfxTabDialog::dispose()
     SfxViewShell* pViewShell = SfxViewShell::Current();
     if (comphelper::LibreOfficeKit::isActive() && pViewShell)
     {
-        pViewShell->notifyDialog(GetLOKWindowId(), "close");
+        pViewShell->notifyWindow(GetLOKWindowId(), "close");
         pViewShell->UnregisterDlg(GetLOKWindowId());
     }
 
@@ -526,7 +526,7 @@ short SfxTabDialog::Execute()
         const Size aSize = GetOptimalSize();
         std::vector<vcl::LOKPayloadItem> aItems;
         aItems.emplace_back(std::make_pair("size", aSize.toString()));
-        pViewShell->notifyDialog(GetLOKWindowId(), "created", aItems);
+        pViewShell->notifyWindow(GetLOKWindowId(), "created", aItems);
     }
 
     return TabDialog::Execute();
diff --git a/sfx2/source/view/lokhelper.cxx b/sfx2/source/view/lokhelper.cxx
index cfd9041ab421..f9543e9d0471 100644
--- a/sfx2/source/view/lokhelper.cxx
+++ b/sfx2/source/view/lokhelper.cxx
@@ -144,7 +144,7 @@ void SfxLokHelper::notifyOtherViews(SfxViewShell* pThisView, int nType, const OS
     }
 }
 
-void SfxLokHelper::notifyDialog(vcl::LOKWindowId nLOKWindowId,
+void SfxLokHelper::notifyWindow(vcl::LOKWindowId nLOKWindowId,
                                 const OUString& rAction,
                                 const std::vector<vcl::LOKPayloadItem>& rPayload)
 {
@@ -172,7 +172,7 @@ void SfxLokHelper::notifyDialog(vcl::LOKWindowId nLOKWindowId,
     }
 }
 
-void SfxLokHelper::notifyDialogChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos)
+void SfxLokHelper::notifyWindowChild(vcl::LOKWindowId nLOKWindowId, const OUString& rAction, const Point& rPos)
 {
     if (SfxLokHelper::getViewsCount() <= 0 || nLOKWindowId == 0)
         return;
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 778a9d9f68b7..c286992d168e 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -1948,14 +1948,14 @@ Reference< view::XRenderable > SfxViewShell::GetRenderable()
     return xRender;
 }
 
-void SfxViewShell::notifyDialog(const vcl::LOKWindowId& rDialogId, const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload) const
+void SfxViewShell::notifyWindow(vcl::LOKWindowId nDialogId, const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload) const
 {
-    SfxLokHelper::notifyDialog(rDialogId, rAction, rPayload);
+    SfxLokHelper::notifyWindow(nDialogId, rAction, rPayload);
 }
 
-void SfxViewShell::notifyDialogChild(const vcl::LOKWindowId& rDialogId, const OUString& rAction, const Point& rPos) const
+void SfxViewShell::notifyWindowChild(vcl::LOKWindowId nDialogId, const OUString& rAction, const Point& rPos) const
 {
-    SfxLokHelper::notifyDialogChild(rDialogId, rAction, rPos);
+    SfxLokHelper::notifyWindowChild(nDialogId, rAction, rPos);
 }
 
 void SfxViewShell::RegisterDlg(vcl::LOKWindowId nDialogId, VclPtr<Dialog> pDlg)
diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
index 85c1d4a4ead6..288f32fa3df7 100644
--- a/sw/inc/unotxdoc.hxx
+++ b/sw/inc/unotxdoc.hxx
@@ -70,7 +70,6 @@
 #include <cppuhelper/implbase.hxx>
 #include <vcl/event.hxx>
 #include <vcl/ITiledRenderable.hxx>
-#include <vcl/IDialogRenderable.hxx>
 #include <com/sun/star/tiledrendering/XTiledRenderable.hpp>
 
 #include "unobaseclass.hxx"
@@ -132,7 +131,6 @@ class SW_DLLPUBLIC SwXTextDocument : public SwXTextDocumentBaseClass,
     public SvxFmMSFactory,
     public SfxBaseModel,
     public vcl::ITiledRenderable,
-    public vcl::IDialogRenderable,
     public css::tiledrendering::XTiledRenderable
 {
 private:
@@ -431,17 +429,8 @@ public:
     /// @see vcl::ITiledRenderable::getPostIts().
     OUString getPostIts() override;
 
-    void paintDialog(const vcl::LOKWindowId& rLOKWindowId, VirtualDevice& rDevice) override;
-    void getDialogInfo(const vcl::LOKWindowId& rLOKWindowId, OUString& rDialogTitle, int& rWidth, int& rHeight) override;
-    void paintActiveFloatingWindow(const vcl::LOKWindowId& rLOKWindowId, VirtualDevice& rDevice, int& nWidth, int& nHeight) override;
-    void postDialogKeyEvent(const vcl::LOKWindowId& rLOKWindowId, int nType,
-                            int nCharCode, int nKeyCode) override;
-
-    void postDialogMouseEvent(const vcl::LOKWindowId& rLOKWindowId, int nType, int nX, int nY,
-                              int nCount, int nButtons, int nModifier) override;
-
-    void postDialogChildMouseEvent(const vcl::LOKWindowId& rLOKWindowId, int nType, int nX, int nY,
-                                   int nCount, int nButtons, int nModifier) override;
+    /// @see vcl::ITiledRenderable::findWindow().
+    VclPtr<vcl::Window> findWindow(vcl::LOKWindowId nLOKWindowId) const override;
 
     // css::tiledrendering::XTiledRenderable
     virtual void SAL_CALL paintTile( const ::css::uno::Any& Parent, ::sal_Int32 nOutputWidth, ::sal_Int32 nOutputHeight, ::sal_Int32 nTilePosX, ::sal_Int32 nTilePosY, ::sal_Int32 nTileWidth, ::sal_Int32 nTileHeight ) override;
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index b593434431d8..15e6f72a45bd 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3639,123 +3639,10 @@ void SAL_CALL SwXTextDocument::paintTile( const ::css::uno::Any& Parent, ::sal_I
     #endif
 }
 
-void SwXTextDocument::paintDialog(const vcl::LOKWindowId& rLOKWindowId, VirtualDevice& rDevice)
+VclPtr<vcl::Window> SwXTextDocument::findWindow(vcl::LOKWindowId nLOKWindowId) const
 {
     SfxViewShell* pViewShell = SfxViewShell::Current();
-    VclPtr<Dialog> pDlg = pViewShell->GetOpenedDlg(rLOKWindowId);
-    if (pDlg)
-        pDlg->paintDialog(rDevice);
-}
-
-void SwXTextDocument::getDialogInfo(const vcl::LOKWindowId& rLOKWindowId, OUString& rDialogTitle, int& rWidth, int& rHeight)
-{
-    SfxViewShell* pViewShell = SfxViewShell::Current();
-    VclPtr<Dialog> pDlg = pViewShell->GetOpenedDlg(rLOKWindowId);
-    if (pDlg)
-    {
-        rDialogTitle = pDlg->GetText();
-        const Size aSize = pDlg->GetOptimalSize();
-        rWidth = aSize.getWidth();
-        rHeight = aSize.getHeight();
-    }
-}
-
-void SwXTextDocument::postDialogKeyEvent(const vcl::LOKWindowId& rLOKWindowId, int nType, int nCharCode, int nKeyCode)
-{
-    SolarMutexGuard aGuard;
-
-    SfxViewShell* pViewShell = SfxViewShell::Current();
-    VclPtr<Dialog> pDialog = pViewShell->GetOpenedDlg(rLOKWindowId);
-    if (pDialog)
-    {
-        KeyEvent aEvent(nCharCode, nKeyCode, 0);
-
-        switch (nType)
-        {
-        case LOK_KEYEVENT_KEYINPUT:
-            pDialog->LOKKeyInput(aEvent);
-            break;
-        case LOK_KEYEVENT_KEYUP:
-            pDialog->LOKKeyUp(aEvent);
-            break;
-        default:
-            assert(false);
-            break;
-        }
-    }
-}
-
-void SwXTextDocument::postDialogMouseEvent(const vcl::LOKWindowId& rLOKWindowId, int nType, int nX, int nY,
-                                           int nCount, int nButtons, int nModifier)
-{
-    SolarMutexGuard aGuard;
-
-    SfxViewShell* pViewShell = SfxViewShell::Current();
-    VclPtr<Dialog> pDialog = pViewShell->GetOpenedDlg(rLOKWindowId);
-    if (pDialog)
-    {
-        Point aPos(nX , nY);
-        MouseEvent aEvent(aPos, nCount, MouseEventModifiers::SIMPLECLICK, nButtons, nModifier);
-
-        switch (nType)
-        {
-        case LOK_MOUSEEVENT_MOUSEBUTTONDOWN:
-            pDialog->LogicMouseButtonDown(aEvent);
-            break;
-        case LOK_MOUSEEVENT_MOUSEBUTTONUP:
-            pDialog->LogicMouseButtonUp(aEvent);
-            break;
-        case LOK_MOUSEEVENT_MOUSEMOVE:
-            pDialog->LogicMouseMove(aEvent);
-            break;
-        default:
-            assert(false);
-            break;
-        }
-    }
-}
-
-
-void SwXTextDocument::postDialogChildMouseEvent(const vcl::LOKWindowId& rLOKWindowId, int nType, int nX, int nY,
-                                                int nCount, int nButtons, int nModifier)
-{
-    SolarMutexGuard aGuard;
-
-    SfxViewShell* pViewShell = SfxViewShell::Current();
-    VclPtr<Dialog> pDialog = pViewShell->GetOpenedDlg(rLOKWindowId);
-    if (pDialog)
-    {
-        Point aPos(nX , nY);
-        MouseEvent aEvent(aPos, nCount, MouseEventModifiers::SIMPLECLICK, nButtons, nModifier);
-
-        switch (nType)
-        {
-        case LOK_MOUSEEVENT_MOUSEBUTTONDOWN:
-            pDialog->LogicMouseButtonDownChild(aEvent);
-            break;
-        case LOK_MOUSEEVENT_MOUSEBUTTONUP:
-            pDialog->LogicMouseButtonUpChild(aEvent);
-            break;
-        case LOK_MOUSEEVENT_MOUSEMOVE:
-            pDialog->LogicMouseMoveChild(aEvent);
-            break;
-        default:
-            assert(false);
-            break;
-        }
-    }
-}
-
-void SwXTextDocument::paintActiveFloatingWindow(const vcl::LOKWindowId& rLOKWindowId, VirtualDevice& rDevice, int& nWidth, int& nHeight)
-{
-    SfxViewShell* pViewShell = SfxViewShell::Current();
-    VclPtr<Dialog> pDialog = pViewShell->GetOpenedDlg(rLOKWindowId);
-    if (pDialog)
-    {
-        const Size aSize = pDialog->PaintActiveFloatingWindow(rDevice);
-        nWidth = aSize.getWidth();
-        nHeight = aSize.getHeight();
-    }
+    return pViewShell->GetOpenedDlg(nLOKWindowId);
 }
 
 void * SAL_CALL SwXTextDocument::operator new( size_t t) throw()
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index 699d6abd67f5..c1f3cc5324e7 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -331,7 +331,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
     vcl/source/app/IconThemeScanner \
     vcl/source/app/IconThemeSelector \
     vcl/source/app/ITiledRenderable \
-    vcl/source/app/IDialogRenderable \
     vcl/source/app/sound \
     vcl/source/app/stdtext \
     vcl/source/app/svapp \
diff --git a/vcl/source/app/IDialogRenderable.cxx b/vcl/source/app/IDialogRenderable.cxx
deleted file mode 100644
index 58ec05265101..000000000000
--- a/vcl/source/app/IDialogRenderable.cxx
+++ /dev/null
@@ -1,22 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- */
-
-#include <vcl/IDialogRenderable.hxx>
-
-namespace vcl
-{
-
-IDialogRenderable::~IDialogRenderable()
-{
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index 3f1997aca9e9..486c15a2f095 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -880,75 +880,16 @@ void Dialog::paintDialog(VirtualDevice& rDevice)
     PaintToDevice(&rDevice, Point(0, 0), Size());
 }
 
-Size Dialog::PaintActiveFloatingWindow(VirtualDevice& rDevice) const
-{
-    Size aRet;
-    ImplSVData* pSVData = ImplGetSVData();
-    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
-    if (pFirstFloat)
-    {
-        // TODO:: run a while loop here and check all the active floating
-        // windows ( chained together, cf. pFirstFloat->mpNextFloat )
-        // For now just assume that the active floating window is the one we
-        // want to render
-        if (pFirstFloat->GetParentDialog() == this)
-        {
-            pFirstFloat->PaintToDevice(&rDevice, Point(0, 0), Size());
-            aRet = ::isLayoutEnabled(pFirstFloat) ? pFirstFloat->get_preferred_size() : pFirstFloat->GetSizePixel();
-        }
-
-        pFirstFloat = nullptr;
-    }
-
-    return aRet;
-}
-
-void Dialog::LogicMouseButtonDownChild(const MouseEvent& rMouseEvent)
-{
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplSVData* pSVData = ImplGetSVData();
-    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
-    if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
-    {
-        ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseButtonDown, &rMouseEvent);
-    }
-}
-
-void Dialog::LogicMouseButtonUpChild(const MouseEvent& rMouseEvent)
-{
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplSVData* pSVData = ImplGetSVData();
-    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
-    if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
-    {
-        ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseButtonUp, &rMouseEvent);
-    }
-}
-
-void Dialog::LogicMouseMoveChild(const MouseEvent& rMouseEvent)
-{
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplSVData* pSVData = ImplGetSVData();
-    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
-    if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
-    {
-        ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseMove, &rMouseEvent);
-    }
-}
-
 void Dialog::InvalidateFloatingWindow(const Point& rPos)
 {
     if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
-        pNotifier->notifyDialogChild(GetLOKWindowId(), "invalidate", rPos);
+        pNotifier->notifyWindowChild(GetLOKWindowId(), "invalidate", rPos);
 }
 
 void Dialog::CloseFloatingWindow()
 {
     if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
-        pNotifier->notifyDialogChild(GetLOKWindowId(), "close", Point(0, 0));
+        pNotifier->notifyWindowChild(GetLOKWindowId(), "close", Point(0, 0));
 }
 
 void Dialog::LogicInvalidate(const tools::Rectangle* pRectangle)
@@ -962,59 +903,10 @@ void Dialog::LogicInvalidate(const tools::Rectangle* pRectangle)
         if (pRectangle)
             aPayload.push_back(std::make_pair(OString("rectangle"), pRectangle->toString()));
 
-        pNotifier->notifyDialog(GetLOKWindowId(), "invalidate", aPayload);
+        pNotifier->notifyWindow(GetLOKWindowId(), "invalidate", aPayload);
     }
 }
 
-void Dialog::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
-{
-    // When we're not doing tiled rendering, then positions must be passed as pixels.
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonDown, &rMouseEvent);
-}
-
-void Dialog::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
-{
-    // When we're not doing tiled rendering, then positions must be passed as pixels.
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonUp, &rMouseEvent);
-}
-
-void Dialog::LogicMouseMove(const MouseEvent& rMouseEvent)
-{
-    // When we're not doing tiled rendering, then positions must be passed as pixels.
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplWindowFrameProc(this, SalEvent::ExternalMouseMove, &rMouseEvent);
-}
-
-void Dialog::LOKKeyInput(const KeyEvent& rKeyEvent)
-{
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplWindowFrameProc(this, SalEvent::ExternalKeyInput, &rKeyEvent);
-}
-
-void Dialog::LOKKeyUp(const KeyEvent& rKeyEvent)
-{
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    ImplWindowFrameProc(this, SalEvent::ExternalKeyUp, &rKeyEvent);
-}
-
-void Dialog::LOKCursor(const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload)
-{
-    assert(comphelper::LibreOfficeKit::isActive());
-
-    if (comphelper::LibreOfficeKit::isDialogPainting())
-        return;
-
-    if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
-        pNotifier->notifyDialog(GetLOKWindowId(), rAction, rPayload);
-}
-
 void Dialog::ensureRepaint()
 {
     // ensure repaint
@@ -1334,7 +1226,7 @@ void Dialog::Resize()
 
     // inform LOK clients
     if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
-        pNotifier->notifyDialog(GetLOKWindowId(), "invalidate");
+        pNotifier->notifyWindow(GetLOKWindowId(), "invalidate");
 }
 
 bool Dialog::set_property(const OString &rKey, const OUString &rValue)
diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx
index b00da3a18a77..f5d9927a2482 100644
--- a/vcl/source/window/floatwin.cxx
+++ b/vcl/source/window/floatwin.cxx
@@ -725,7 +725,7 @@ void FloatingWindow::StartPopupMode( const tools::Rectangle& rRect, FloatWinPopu
     {
         std::vector<vcl::LOKPayloadItem> aItems;
         aItems.emplace_back(std::make_pair("size", rRect.GetSize().toString()));
-        pNotifier->notifyDialog(GetLOKWindowId(), "created", aItems);
+        pNotifier->notifyWindow(GetLOKWindowId(), "created", aItems);
     }
 }
 
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 142712791f4f..3d6fff132ad3 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -64,6 +64,7 @@
 #include <com/sun/star/datatransfer/clipboard/SystemClipboard.hpp>
 #include <com/sun/star/rendering/CanvasFactory.hpp>
 #include <com/sun/star/rendering/XSpriteCanvas.hpp>
+#include <comphelper/lok.hxx>
 #include <comphelper/processfactory.hxx>
 #include <unotools/configmgr.hxx>
 
@@ -3193,6 +3194,123 @@ vcl::LOKWindowId Window::GetLOKWindowId() const
     return mpWindowImpl->mnLOKWindowId;
 }
 
+void Window::paintDialog(VirtualDevice& rDevice)
+{
+    // FIXME are these two necessary?
+    Show();
+    ToTop();
+
+    PaintToDevice(&rDevice, Point(0, 0), Size());
+}
+
+Size Window::PaintActiveFloatingWindow(VirtualDevice& rDevice) const
+{
+    Size aRet;
+    ImplSVData* pSVData = ImplGetSVData();
+    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
+    if (pFirstFloat)
+    {
+        // TODO:: run a while loop here and check all the active floating
+        // windows ( chained together, cf. pFirstFloat->mpNextFloat )
+        // For now just assume that the active floating window is the one we
+        // want to render
+        if (pFirstFloat->GetParentDialog() == this)
+        {
+            pFirstFloat->PaintToDevice(&rDevice, Point(0, 0), Size());
+            aRet = pFirstFloat->GetSizePixel();
+        }
+
+        pFirstFloat = nullptr;
+    }
+
+    return aRet;
+}
+
+void Window::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
+{
+    // When we're not doing tiled rendering, then positions must be passed as pixels.
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonDown, &rMouseEvent);
+}
+
+void Window::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
+{
+    // When we're not doing tiled rendering, then positions must be passed as pixels.
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonUp, &rMouseEvent);
+}
+
+void Window::LogicMouseMove(const MouseEvent& rMouseEvent)
+{
+    // When we're not doing tiled rendering, then positions must be passed as pixels.
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplWindowFrameProc(this, SalEvent::ExternalMouseMove, &rMouseEvent);
+}
+
+void Window::LogicMouseButtonDownChild(const MouseEvent& rMouseEvent)
+{
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplSVData* pSVData = ImplGetSVData();
+    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
+    if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
+    {
+        ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseButtonDown, &rMouseEvent);
+    }
+}
+
+void Window::LogicMouseButtonUpChild(const MouseEvent& rMouseEvent)
+{
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplSVData* pSVData = ImplGetSVData();
+    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
+    if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
+    {
+        ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseButtonUp, &rMouseEvent);
+    }
+}
+
+void Window::LogicMouseMoveChild(const MouseEvent& rMouseEvent)
+{
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplSVData* pSVData = ImplGetSVData();
+    FloatingWindow* pFirstFloat = pSVData->maWinData.mpFirstFloat;
+    if (pFirstFloat && pFirstFloat->GetParentDialog() == this)
+    {
+        ImplWindowFrameProc(pFirstFloat->ImplGetBorderWindow(), SalEvent::ExternalMouseMove, &rMouseEvent);
+    }
+}
+
+void Window::LOKKeyInput(const KeyEvent& rKeyEvent)
+{
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplWindowFrameProc(this, SalEvent::ExternalKeyInput, &rKeyEvent);
+}
+
+void Window::LOKKeyUp(const KeyEvent& rKeyEvent)
+{
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    ImplWindowFrameProc(this, SalEvent::ExternalKeyUp, &rKeyEvent);
+}
+
+void Window::LOKCursor(const OUString& rAction, const std::vector<vcl::LOKPayloadItem>& rPayload)
+{
+    assert(comphelper::LibreOfficeKit::isActive());
+
+    if (comphelper::LibreOfficeKit::isDialogPainting())
+        return;
+
+    if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
+        pNotifier->notifyWindow(GetLOKWindowId(), rAction, rPayload);
+}
+
 void Window::ImplCallDeactivateListeners( vcl::Window *pNew )
 {
     // no deactivation if the newly activated window is my child


More information about the Libreoffice-commits mailing list