desktop/qa/desktop_lib/test_desktop_lib.cxx | 51 ++++++++++++ desktop/source/lib/init.cxx | 37 ++++++++ desktop/source/lib/lokclipboard.cxx | 10 +- desktop/source/lib/lokclipboard.hxx | 3 include/LibreOfficeKit/LibreOfficeKit.h | 2 include/LibreOfficeKit/LibreOfficeKit.hxx | 4 include/LibreOfficeKit/LibreOfficeKitEnums.h | 3 libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx | 2 libreofficekit/qa/tilebench/tilebench.cxx | 2 9 files changed, 103 insertions(+), 11 deletions(-)
New commits: commit d8ac2024f9ca1275784ee6d40a47a7df325e902b Author: Henry Castro <hcas...@collabora.com> AuthorDate: Thu Apr 18 18:10:13 2019 -0400 Commit: Jan Holesovsky <ke...@collabora.com> CommitDate: Thu May 2 10:00:21 2019 +0200 lok: allow paste content to popup dialog Change-Id: I1893d52df505bc43428c37a624ca05c569ba1bc0 Reviewed-on: https://gerrit.libreoffice.org/70958 Tested-by: Jenkins Reviewed-by: Henry Castro <hcas...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/71369 Reviewed-by: Jan Holesovsky <ke...@collabora.com> Tested-by: Jan Holesovsky <ke...@collabora.com> diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index 3df2a5645471..c2bd188a3001 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -21,7 +21,11 @@ #include <com/sun/star/frame/XStorable.hpp> +#include <vcl/combobox.hxx> #include <vcl/scheduler.hxx> +#include <vcl/svapp.hxx> +#include <vcl/syswin.hxx> +#include <vcl/window.hxx> #include <comphelper/processfactory.hxx> #include <rtl/uri.hxx> #include <sfx2/objsh.hxx> @@ -128,6 +132,7 @@ public: void testInsertCertificate_PEM_DOCX(); void testSignDocument_PEM_PDF(); void testTextSelectionHandles(); + void testDialogPaste(); void testABI(); CPPUNIT_TEST_SUITE(DesktopLOKTest); @@ -180,6 +185,7 @@ public: CPPUNIT_TEST(testSignDocument_PEM_PDF); #endif CPPUNIT_TEST(testTextSelectionHandles); + CPPUNIT_TEST(testDialogPaste); CPPUNIT_TEST(testABI); CPPUNIT_TEST_SUITE_END(); @@ -207,6 +213,23 @@ public: }; +static Control* GetFocusControl(vcl::Window const * pParent) +{ + sal_uInt16 nChildren = pParent->GetChildCount(); + for (sal_uInt16 nChild = 0; nChild < nChildren; ++nChild) + { + vcl::Window* pChild = pParent->GetChild( nChild ); + Control* pCtrl = dynamic_cast<Control*>(pChild); + if (pCtrl && pCtrl->HasControlFocus()) + return pCtrl; + + Control* pSubCtrl = GetFocusControl( pChild ); + if (pSubCtrl) + return pSubCtrl; + } + return nullptr; +} + LibLODocument_Impl* DesktopLOKTest::loadDoc(const char* pName, LibreOfficeKitDocumentType eType) { OUString aFileURL; @@ -2602,6 +2625,34 @@ void DesktopLOKTest::testTextSelectionHandles() comphelper::LibreOfficeKit::setActive(false); } +void DesktopLOKTest::testDialogPaste() +{ + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); + pDocument->pClass->postUnoCommand(pDocument, ".uno:HyperlinkDialog", nullptr, false); + Scheduler::ProcessEventsToIdle(); + + SfxViewShell* pViewShell = SfxViewShell::Current(); + pViewShell->GetViewFrame()->GetBindings().Update(); + + VclPtr<vcl::Window> pWindow(Application::GetActiveTopWindow()); + CPPUNIT_ASSERT(pWindow); + + pDocument->pClass->postWindow(pDocument, pWindow->GetLOKWindowId(), LOK_WINDOW_PASTE, + "{ \"MimeType\" : { \"type\" : \"string\", \"value\" : \"text/plain;charset=utf-8\" }, \"Data\" : { \"type\" : \"[]byte\", \"value\" : \"www.softwarelibre.org.bo\" } }"); + Scheduler::ProcessEventsToIdle(); + + Control* pCtrlFocused = GetFocusControl(pWindow.get()); + CPPUNIT_ASSERT(pCtrlFocused); + ComboBox* pCtrlURL = dynamic_cast<ComboBox*>(pCtrlFocused); + CPPUNIT_ASSERT(pCtrlURL); + CPPUNIT_ASSERT_EQUAL(OUString("www.softwarelibre.org.bo"), pCtrlURL->GetText()); + + static_cast<SystemWindow*>(pWindow.get())->Close(); + Scheduler::ProcessEventsToIdle(); + comphelper::LibreOfficeKit::setActive(false); +} + namespace { size_t documentClassOffset(int i) diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 4a5bdc20fb9b..089f95b91996 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -353,6 +353,15 @@ std::vector<beans::PropertyValue> desktop::jsonToPropertyValuesVector(const char aValue.Value <<= static_cast<sal_Int16>(OString(rValue.c_str()).toInt32()); else if (rType == "unsigned short") aValue.Value <<= static_cast<sal_uInt16>(OString(rValue.c_str()).toUInt32()); + else if (rType == "[]byte") + { + aNodeValue = rPair.second.get_child("value", aNodeNull); + if (aNodeValue != aNodeNull && aNodeValue.size() == 0) + { + uno::Sequence< sal_Int8 > aSeqByte(reinterpret_cast<const sal_Int8*>(rValue.c_str()), rValue.size()); + aValue.Value <<= aSeqByte; + } + } else if (rType == "[]any") { aNodeValue = rPair.second.get_child("value", aNodeNull); @@ -803,7 +812,7 @@ static void doc_paintWindowDPI(LibreOfficeKitDocument* pThis, unsigned nLOKWindo const int nWidth, const int nHeight, const double fDPIScale); -static void doc_postWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, int nAction); +static void doc_postWindow(LibreOfficeKitDocument* pThis, unsigned nLOKWindowId, int nAction, const char* pData); static char* doc_getPartInfo(LibreOfficeKitDocument* pThis, int nPart); @@ -4243,7 +4252,7 @@ static void doc_paintWindowDPI(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKW #endif } -static void doc_postWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nAction) +static void doc_postWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, int nAction, const char* pData) { comphelper::ProfileZone aZone("doc_postWindow"); @@ -4265,6 +4274,30 @@ static void doc_postWindow(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindo else if (FloatingWindow* pFloatWin = dynamic_cast<FloatingWindow*>(pWindow.get())) pFloatWin->EndPopupMode(FloatWinPopupEndFlags::Cancel | FloatWinPopupEndFlags::CloseAll); } + else if (nAction == LOK_WINDOW_PASTE) + { + OUString aMimeType; + css::uno::Sequence<sal_Int8> aData; + std::vector<beans::PropertyValue> aArgs(jsonToPropertyValuesVector(pData)); + { + aArgs.size() == 2 && + aArgs[0].Name == "MimeType" && (aArgs[0].Value >>= aMimeType) && + aArgs[1].Name == "Data" && (aArgs[1].Value >>= aData); + } + + if (!aMimeType.isEmpty() && aData.getLength() > 0) + { + uno::Reference<datatransfer::XTransferable> xTransferable(new LOKTransferable(aMimeType, aData)); + uno::Reference<datatransfer::clipboard::XClipboard> xClipboard(new LOKClipboard); + xClipboard->setContents(xTransferable, uno::Reference<datatransfer::clipboard::XClipboardOwner>()); + pWindow->SetClipboard(xClipboard); + + KeyEvent aEvent(0, KEY_PASTE, 0); + Application::PostKeyEvent(VclEventId::WindowKeyInput, pWindow, &aEvent); + } + else + gImpl->maLastExceptionMsg = "Window command 'paste': wrong parameters."; + } } // CERTIFICATE AND DOCUMENT SIGNING diff --git a/desktop/source/lib/lokclipboard.cxx b/desktop/source/lib/lokclipboard.cxx index 592bd29af608..f31f6ad18e48 100644 --- a/desktop/source/lib/lokclipboard.cxx +++ b/desktop/source/lib/lokclipboard.cxx @@ -29,11 +29,17 @@ OUString SAL_CALL LOKClipboard::getName() } LOKTransferable::LOKTransferable(const char* pMimeType, const char* pData, std::size_t nSize) - : m_aMimeType(pMimeType), + : m_aMimeType(OUString::fromUtf8(pMimeType)), m_aSequence(reinterpret_cast<const sal_Int8*>(pData), nSize) { } +LOKTransferable::LOKTransferable(const OUString& sMimeType, const css::uno::Sequence<sal_Int8>& aSequence) + : m_aMimeType(sMimeType), + m_aSequence(aSequence) +{ +} + uno::Any SAL_CALL LOKTransferable::getTransferData(const datatransfer::DataFlavor& rFlavor) { uno::Any aRet; @@ -51,7 +57,7 @@ std::vector<datatransfer::DataFlavor> LOKTransferable::getTransferDataFlavorsAsV { std::vector<datatransfer::DataFlavor> aRet; datatransfer::DataFlavor aFlavor; - aFlavor.MimeType = OUString::fromUtf8(m_aMimeType.getStr()); + aFlavor.MimeType = m_aMimeType; aFlavor.DataType = cppu::UnoType< uno::Sequence<sal_Int8> >::get(); sal_Int32 nIndex(0); diff --git a/desktop/source/lib/lokclipboard.hxx b/desktop/source/lib/lokclipboard.hxx index 11c676500043..ae83eb6dd2e6 100644 --- a/desktop/source/lib/lokclipboard.hxx +++ b/desktop/source/lib/lokclipboard.hxx @@ -32,7 +32,7 @@ public: /// Represents the contents of LOKClipboard. class LOKTransferable : public cppu::WeakImplHelper<css::datatransfer::XTransferable> { - OString m_aMimeType; + OUString m_aMimeType; css::uno::Sequence<sal_Int8> m_aSequence; /// Provides a list of flavors, used by getTransferDataFlavors() and isDataFlavorSupported(). @@ -40,6 +40,7 @@ class LOKTransferable : public cppu::WeakImplHelper<css::datatransfer::XTransfer public: LOKTransferable(const char* pMimeType, const char* pData, std::size_t nSize); + LOKTransferable(const OUString& sMimeType, const css::uno::Sequence<sal_Int8>& aSequence); css::uno::Any SAL_CALL getTransferData(const css::datatransfer::DataFlavor& rFlavor) override; diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index 1975a8d6ebf6..9fa134b56388 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -294,7 +294,7 @@ struct _LibreOfficeKitDocumentClass const int width, const int height); /// @see lok::Document::postWindow(). - void (*postWindow) (LibreOfficeKitDocument* pThis, unsigned nWindowId, int nAction); + void (*postWindow) (LibreOfficeKitDocument* pThis, unsigned nWindowId, int nAction, const char* pData); /// @see lok::Document::postWindowKeyEvent(). void (*postWindowKeyEvent) (LibreOfficeKitDocument* pThis, diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index 61c2e44b5024..f52e96332b7f 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -188,9 +188,9 @@ public: * * @param nWindowid */ - void postWindow(unsigned nWindowId, int nAction) + void postWindow(unsigned nWindowId, int nAction, const char* pData) { - return mpDoc->pClass->postWindow(mpDoc, nWindowId, nAction); + return mpDoc->pClass->postWindow(mpDoc, nWindowId, nAction, pData); } /** diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h index 68b0b29d7d66..7ff69d1b350b 100644 --- a/include/LibreOfficeKit/LibreOfficeKitEnums.h +++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h @@ -42,7 +42,8 @@ LibreOfficeKitTileMode; typedef enum { - LOK_WINDOW_CLOSE + LOK_WINDOW_CLOSE, + LOK_WINDOW_PASTE } LibreOfficeKitWindowAction; diff --git a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx index d9c709604a28..dee5058f3f54 100644 --- a/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx @@ -423,7 +423,7 @@ gtv_application_window_unregister_child_window(GtvApplicationWindow* window, Gtk LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(LOK_DOC_VIEW(window->lokdocview)); guint dialogId = 0; g_object_get(G_OBJECT(pChildWin), "dialogid", &dialogId, nullptr); - pDocument->pClass->postWindow(pDocument, dialogId, LOK_WINDOW_CLOSE); + pDocument->pClass->postWindow(pDocument, dialogId, LOK_WINDOW_CLOSE, nullptr); } } diff --git a/libreofficekit/qa/tilebench/tilebench.cxx b/libreofficekit/qa/tilebench/tilebench.cxx index 4cb76dd1366e..6cda7348ccaf 100644 --- a/libreofficekit/qa/tilebench/tilebench.cxx +++ b/libreofficekit/qa/tilebench/tilebench.cxx @@ -278,7 +278,7 @@ void testDialog( Document *pDocument, const char *uno_cmd ) } aTimes.emplace_back("post close dialog"); - pDocument->postWindow(nDialogId, LOK_WINDOW_CLOSE); + pDocument->postWindow(nDialogId, LOK_WINDOW_CLOSE, nullptr); aTimes.emplace_back(); pDocument->destroyView(view); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits