[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.0' - desktop/qa desktop/source include/LibreOfficeKit libreofficekit/qa

Henry Castro (via logerrit) logerrit at kemper.freedesktop.org
Thu May 2 08:01:00 UTC 2019


 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 <hcastro at collabora.com>
AuthorDate: Thu Apr 18 18:10:13 2019 -0400
Commit:     Jan Holesovsky <kendy at 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 <hcastro at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/71369
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at 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);


More information about the Libreoffice-commits mailing list