diff options
-rw-r--r-- | desktop/source/lib/init.cxx | 36 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.h | 1 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKit.hxx | 6 | ||||
-rw-r--r-- | include/vcl/ITiledRenderable.hxx | 12 | ||||
-rw-r--r-- | sc/inc/docuno.hxx | 6 | ||||
-rw-r--r-- | sc/qa/unit/tiledrendering/tiledrendering.cxx | 6 | ||||
-rw-r--r-- | sc/source/ui/unoobj/docuno.cxx | 34 | ||||
-rw-r--r-- | sd/qa/unit/tiledrendering/tiledrendering.cxx | 6 | ||||
-rw-r--r-- | sd/source/ui/inc/unomodel.hxx | 3 | ||||
-rw-r--r-- | sd/source/ui/unoidl/unomodel.cxx | 36 | ||||
-rw-r--r-- | sw/inc/unotxdoc.hxx | 4 | ||||
-rw-r--r-- | sw/qa/extras/tiledrendering/tiledrendering.cxx | 6 | ||||
-rw-r--r-- | sw/source/uibase/uno/unotxdoc.cxx | 30 | ||||
-rw-r--r-- | vcl/source/window/window.cxx | 8 |
14 files changed, 96 insertions, 98 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index bc788d243b9e..8d0611c21d07 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -543,6 +543,7 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis, int nCharCode, int nKeyCode); static void doc_postExtTextInputEvent(LibreOfficeKitDocument* pThis, + unsigned nWindowId, int nType, const char* pText); static void doc_postWindowKeyEvent(LibreOfficeKitDocument* pThis, @@ -2298,18 +2299,43 @@ static void doc_postKeyEvent(LibreOfficeKitDocument* pThis, int nType, int nChar pDoc->postKeyEvent(nType, nCharCode, nKeyCode); } -static void doc_postExtTextInputEvent(LibreOfficeKitDocument* pThis, int nType, const char* pText) +static void doc_postExtTextInputEvent(LibreOfficeKitDocument* pThis, unsigned nWindowId, int nType, const char* pText) { SolarMutexGuard aGuard; + VclPtr<vcl::Window> pWindow; + if (nWindowId == 0) + { + ITiledRenderable* pDoc = getTiledRenderable(pThis); + if (!pDoc) + { + gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering"; + return; + } + pWindow = pDoc->getDocWindow(); + } + else + { + pWindow = vcl::Window::FindLOKWindow(nWindowId); + } - ITiledRenderable* pDoc = getTiledRenderable(pThis); - if (!pDoc) + if (!pWindow) { - gImpl->maLastExceptionMsg = "Document doesn't support tiled rendering"; + gImpl->maLastExceptionMsg = "No window found for window id: " + OUString::number(nWindowId); return; } - pDoc->postExtTextInputEvent(nType, OUString::fromUtf8(OString(pText, strlen(pText)))); + switch (nType) + { + case LOK_EXT_TEXTINPUT: + pWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, + OUString::fromUtf8(OString(pText, strlen(pText)))); + break; + case LOK_EXT_TEXTINPUT_END: + pWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); + break; + default: + assert(false && "Unhandled External Text input event!"); + } } static void doc_postWindowKeyEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nType, int nCharCode, int nKeyCode) diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index ebc112fb7bd5..7492fcc7a561 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -302,6 +302,7 @@ struct _LibreOfficeKitDocumentClass /// @see lok::Document::postExtTextInputEvent void (*postExtTextInputEvent) (LibreOfficeKitDocument* pThis, + unsigned nWindowId, int nType, const char* pText); diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index 0983560898a4..55e29ebda1c8 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -540,12 +540,14 @@ public: /** * Post the text input from external input window, like IME * + * @param nWindowId Specify the window id to post the input event to. If + * nWindow is 0, the event is posted into the document * @param nType see LibreOfficeKitExtTextInputType * @param pText Text for LOK_EXT_TEXTINPUT */ - void postExtTextInputEvent(int nType, const char* pText) + void postExtTextInputEvent(unsigned nWindowId, int nType, const char* pText) { - mpDoc->pClass->postExtTextInputEvent(mpDoc, nType, pText); + mpDoc->pClass->postExtTextInputEvent(mpDoc, nWindowId, nType, pText); } #endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx index de3b098a496d..5a7034d476d0 100644 --- a/include/vcl/ITiledRenderable.hxx +++ b/include/vcl/ITiledRenderable.hxx @@ -81,6 +81,11 @@ public: } /** + * Get the vcl::Window for the document being edited + */ + virtual VclPtr<vcl::Window> getDocWindow() = 0; + + /** * Get the hash of the currently displayed part, i.e. sheet in a spreadsheet * or slide in a presentation. */ @@ -103,13 +108,6 @@ public: virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) = 0; /** - * Posts an external text input event - * - * @see lok::Document::postExtTextInputEvent(). - */ - virtual void postExtTextInputEvent(int nType, const OUString& rText) = 0; - - /** * Posts a mouse event on the document. * * @see lok::Document::postMouseEvent(). diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx index 6cf2cc35c360..5e1ce12bd37a 100644 --- a/sc/inc/docuno.hxx +++ b/sc/inc/docuno.hxx @@ -319,15 +319,15 @@ public: /// @see vcl::ITiledRenderable::getPartHash(). virtual OUString getPartHash( int nPart ) override; + /// @see vcl::ITiledRenderable::getDocWindow(). + virtual VclPtr<vcl::Window> getDocWindow() override; + /// @see vcl::ITiledRenderable::initializeForTiledRendering(). virtual void initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments) override; /// @see vcl::ITiledRenderable::postKeyEvent(). virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) override; - /// @see vcl::ITiledRenderable::postExtTextInputEvent(). - virtual void postExtTextInputEvent(int nType, const OUString& rText) override; - /// @see vcl::ITiledRenderable::postMouseEvent(). virtual void postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) override; diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx index d306b32afd46..e70d4f17b3f7 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -33,6 +33,7 @@ #include <sfx2/lokhelper.hxx> #include <svx/svdpage.hxx> #include <vcl/scheduler.hxx> +#include <vcl/vclevent.hxx> #include <chrono> #include <cstddef> @@ -1575,6 +1576,7 @@ void ScTiledRenderingTest::testIMESupport() comphelper::LibreOfficeKit::setActive(); ScModelObj* pModelObj = createDoc("empty.ods"); + VclPtr<vcl::Window> pDocWindow = pModelObj->getDocWindow(); ScDocument* pDoc = pModelObj->GetDocument(); ScTabViewShell* pView = dynamic_cast<ScTabViewShell*>(SfxViewShell::Current()); @@ -1590,9 +1592,9 @@ void ScTiledRenderingTest::testIMESupport() }); for (const auto& aInput: aInputs) { - pModelObj->postExtTextInputEvent(LOK_EXT_TEXTINPUT, aInput); + pDocWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, aInput); } - pModelObj->postExtTextInputEvent(LOK_EXT_TEXTINPUT_END, ""); + pDocWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); // commit the string to the cell pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index d12a063a926a..b64645dfe667 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -549,6 +549,16 @@ OUString ScModelObj::getPartHash( int nPart ) return (pViewData->GetDocument()->GetHashCode(nPart, nHashCode) ? OUString::number(nHashCode) : OUString()); } +VclPtr<vcl::Window> ScModelObj::getDocWindow() +{ + SolarMutexGuard aGuard; + ScViewData* pViewData = ScDocShell::GetViewData(); + VclPtr<vcl::Window> pWindow; + if (pViewData) + pWindow = pViewData->GetActiveWin(); + return pWindow; +} + Size ScModelObj::getDocumentSize() { Size aSize(10, 10); // minimum size @@ -619,30 +629,6 @@ void ScModelObj::postKeyEvent(int nType, int nCharCode, int nKeyCode) } } -void ScModelObj::postExtTextInputEvent(int nType, const OUString& rText) -{ - SolarMutexGuard aGuard; - - ScViewData* pViewData = ScDocShell::GetViewData(); - vcl::Window* pWindow = pViewData->GetActiveWin(); - - if (!pWindow) - return; - - CommandExtTextInputData aTextInputData(rText, nullptr, 0, 0, false); - switch (nType) - { - case LOK_EXT_TEXTINPUT: - pWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, rText); - break; - case LOK_EXT_TEXTINPUT_END: - pWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); - break; - default: - assert(false && "Unhandled External Text input event!"); - } -} - void ScModelObj::postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) { SolarMutexGuard aGuard; diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index 6990b25ae3ce..dbb77a32b3e8 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -49,6 +49,7 @@ #include <DrawViewShell.hxx> #include <pres.hxx> #include <vcl/scheduler.hxx> +#include <vcl/vclevent.hxx> #include <chrono> @@ -1948,6 +1949,7 @@ void SdTiledRenderingTest::testIMESupport() comphelper::LibreOfficeKit::setActive(); SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); + VclPtr<vcl::Window> pDocWindow = pXImpressDocument->getDocWindow(); sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); SdrObject* pObject = pViewShell->GetActualPage()->GetObj(0); SdrTextObj* pTextObj = static_cast<SdrTextObj*>(pObject); @@ -1966,9 +1968,9 @@ void SdTiledRenderingTest::testIMESupport() }); for (const auto& aInput: aInputs) { - pXImpressDocument->postExtTextInputEvent(LOK_EXT_TEXTINPUT, aInput); + pDocWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, aInput); } - pXImpressDocument->postExtTextInputEvent(LOK_EXT_TEXTINPUT_END, ""); + pDocWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); // the cursor should be at position 3rd EditView& rEditView = pView->GetTextEditOutlinerView()->GetEditView(); diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx index 096afe120ccf..67770cc27313 100644 --- a/sd/source/ui/inc/unomodel.hxx +++ b/sd/source/ui/inc/unomodel.hxx @@ -239,6 +239,7 @@ public: virtual int getParts() override; virtual OUString getPartName( int nPart ) override; virtual OUString getPartHash( int nPart ) override; + virtual VclPtr<vcl::Window> getDocWindow() override; virtual void setPartMode( int nPartMode ) override; @@ -246,8 +247,6 @@ public: virtual void initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments) override; /// @see vcl::ITiledRenderable::postKeyEvent(). virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) override; - /// @see vcl::ITiledRenderable::postExtTextInputEvent(). - virtual void postExtTextInputEvent(int nType, const OUString& rText) override; /// @see vcl::ITiledRenderable::postMouseEvent(). virtual void postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) override; /// @see vcl::ITiledRenderable::setTextSelection(). diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx index 973702c926be..50702bed3a3e 100644 --- a/sd/source/ui/unoidl/unomodel.cxx +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -2337,6 +2337,16 @@ OUString SdXImpressDocument::getPartHash( int nPart ) return OUString::number(pPage->GetHashCode()); } +VclPtr<vcl::Window> SdXImpressDocument::getDocWindow() +{ + SolarMutexGuard aGuard; + DrawViewShell* pViewShell = GetViewShell(); + VclPtr<vcl::Window> pWindow; + if (pViewShell) + pWindow = pViewShell->GetActiveWindow(); + return pWindow; +} + void SdXImpressDocument::setPartMode( int nPartMode ) { DrawViewShell* pViewSh = GetViewShell(); @@ -2487,32 +2497,6 @@ void SdXImpressDocument::postKeyEvent(int nType, int nCharCode, int nKeyCode) } } -void SdXImpressDocument::postExtTextInputEvent(int nType, const OUString& rText) -{ - SolarMutexGuard aGuard; - - DrawViewShell* pViewShell = GetViewShell(); - if (!pViewShell) - return; - - vcl::Window* pWindow = pViewShell->GetActiveWindow(); - if (!pWindow) - return; - - CommandExtTextInputData aTextInputData(rText, nullptr, 0, 0, false); - switch (nType) - { - case LOK_EXT_TEXTINPUT: - pWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, rText); - break; - case LOK_EXT_TEXTINPUT_END: - pWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); - break; - default: - assert(false && "Unhandled External Text input event!"); - } -} - void SdXImpressDocument::postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) { SolarMutexGuard aGuard; diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index fe01d4722b6c..472ea5015cd5 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -399,12 +399,12 @@ public: virtual OUString getPartName(int nPart) override; /// @see vcl::ITiledRenderable::getPartHash(). virtual OUString getPartHash(int nPart) override; + /// @see vcl::ITiledRenderable::getDocWindow(). + virtual VclPtr<vcl::Window> getDocWindow() override; /// @see vcl::ITiledRenderable::initializeForTiledRendering(). virtual void initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments) override; /// @see vcl::ITiledRenderable::postKeyEvent(). virtual void postKeyEvent(int nType, int nCharCode, int nKeyCode) override; - /// @see vcl::ITiledRenderable::postExtTextInputEvent(). - virtual void postExtTextInputEvent(int nType, const OUString& rText) override; /// @see vcl::ITiledRenderable::postMouseEvent(). virtual void postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) override; /// @see vcl::ITiledRenderable::setTextSelection(). diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 68fae582f70a..226291ac7422 100644 --- a/sw/qa/extras/tiledrendering/tiledrendering.cxx +++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx @@ -38,6 +38,7 @@ #include <redline.hxx> #include <IDocumentRedlineAccess.hxx> #include <vcl/scheduler.hxx> +#include <vcl/vclevent.hxx> #include <flddat.hxx> static char const DATA_DIRECTORY[] = "/sw/qa/extras/tiledrendering/data/"; @@ -2094,6 +2095,7 @@ void SwTiledRenderingTest::testIMESupport() { comphelper::LibreOfficeKit::setActive(); SwXTextDocument* pXTextDocument = createDoc("dummy.fodt"); + VclPtr<vcl::Window> pDocWindow = pXTextDocument->getDocWindow(); SwView* pView = dynamic_cast<SwView*>(SfxViewShell::Current()); assert(pView); @@ -2108,9 +2110,9 @@ void SwTiledRenderingTest::testIMESupport() }); for (const auto& aInput: aInputs) { - pXTextDocument->postExtTextInputEvent(LOK_EXT_TEXTINPUT, aInput); + pDocWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, aInput); } - pXTextDocument->postExtTextInputEvent(LOK_EXT_TEXTINPUT_END, ""); + pDocWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); // the cursor should be at position 2nd SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false); diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx index 19f7c24b2a37..63f5d0faceba 100644 --- a/sw/source/uibase/uno/unotxdoc.cxx +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -3399,6 +3399,16 @@ OUString SwXTextDocument::getPartHash(int nPart) return OUString::number(sPart.hashCode()); } +VclPtr<vcl::Window> SwXTextDocument::getDocWindow() +{ + SolarMutexGuard aGuard; + VclPtr<vcl::Window> pWindow; + SwView* pView = pDocShell->GetView(); + if (pView) + pWindow = &(pView->GetEditWin()); + return pWindow; +} + void SwXTextDocument::initializeForTiledRendering(const css::uno::Sequence<css::beans::PropertyValue>& rArguments) { SolarMutexGuard aGuard; @@ -3495,26 +3505,6 @@ void SwXTextDocument::postKeyEvent(int nType, int nCharCode, int nKeyCode) } } -void SwXTextDocument::postExtTextInputEvent(int nType, const OUString& rText) -{ - SolarMutexGuard aGuard; - - vcl::Window* pWindow = &(pDocShell->GetView()->GetEditWin()); - - CommandExtTextInputData aTextInputData(rText, nullptr, 0, 0, false); - switch (nType) - { - case LOK_EXT_TEXTINPUT: - pWindow->PostExtTextInputEvent(VclEventId::ExtTextInput, rText); - break; - case LOK_EXT_TEXTINPUT_END: - pWindow->PostExtTextInputEvent(VclEventId::EndExtTextInput, ""); - break; - default: - assert(false && "Unhandled External Text input event!"); - } -} - void SwXTextDocument::postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier) { SolarMutexGuard aGuard; diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index c93e194ab88c..6a9612f36e8e 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -2076,8 +2076,14 @@ void Window::PostExtTextInputEvent(VclEventId nType, const OUString& rText) { case VclEventId::ExtTextInput: { - SalExtTextInputEvent aEvent { rText, nullptr, rText.getLength(), 0 }; + std::unique_ptr<ExtTextInputAttr[]> pAttr(new ExtTextInputAttr[rText.getLength()]); + for (int i = 0; i < rText.getLength(); ++i) { + pAttr[i] = ExtTextInputAttr::NONE; + } + SalExtTextInputEvent aEvent { rText, pAttr.get(), rText.getLength(), EXTTEXTINPUT_CURSOR_OVERWRITE }; ImplWindowFrameProc(this, SalEvent::ExtTextInput, &aEvent); + SalExtTextInputPosEvent evt; + ImplWindowFrameProc(this, SalEvent::ExtTextInputPos, &evt); } break; case VclEventId::EndExtTextInput: |