[Libreoffice-commits] core.git: Branch 'distro/collabora/co-2021' - 2 commits - desktop/qa sw/qa sw/source

Tomaž Vajngerl (via logerrit) logerrit at kemper.freedesktop.org
Thu Sep 2 09:22:09 UTC 2021


 desktop/qa/desktop_lib/test_desktop_lib.cxx       |    7 ++
 sw/qa/extras/indexing/SearchResultLocatorTest.cxx |   15 ++----
 sw/source/core/inc/SearchResultLocator.hxx        |   19 ++++++-
 sw/source/core/model/SearchResultLocator.cxx      |   31 +++++++-----
 sw/source/uibase/uno/unotxdoc.cxx                 |   55 ++++++++++++++++------
 5 files changed, 87 insertions(+), 40 deletions(-)

New commits:
commit c354786e79b13f0188f5a9626de7b896374e81f5
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Thu Aug 12 22:48:31 2021 +0900
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Thu Sep 2 11:21:45 2021 +0200

    indexing: allow for multiple entries in search indexing data
    
    Change-Id: Idb9bbbaa940b7cd48423c6cc65b9c7d0b94f57dc
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120396
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
    (cherry picked from commit adf65471e889676a600a9c6d0454c75cbd549ad3)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121114
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>

diff --git a/sw/qa/extras/indexing/SearchResultLocatorTest.cxx b/sw/qa/extras/indexing/SearchResultLocatorTest.cxx
index 0b452a6d564e..a1f13ebc32c5 100644
--- a/sw/qa/extras/indexing/SearchResultLocatorTest.cxx
+++ b/sw/qa/extras/indexing/SearchResultLocatorTest.cxx
@@ -53,11 +53,10 @@ void SearchResultLocatorTest::testSearchResultLocator()
     CPPUNIT_ASSERT(pDoc);
 
     sw::search::SearchResultLocator aLocator(pDoc);
-    sw::search::SearchIndexData aData;
-    aData.eType = sw::search::NodeType::WriterNode;
-    aData.nNodeIndex = 14;
+    std::vector<sw::search::SearchIndexData> aDataVector;
+    aDataVector.emplace_back(sw::search::NodeType::WriterNode, 14);
 
-    sw::search::LocationResult aResult = aLocator.find(aData);
+    sw::search::LocationResult aResult = aLocator.find(aDataVector);
     CPPUNIT_ASSERT_EQUAL(size_t(1), aResult.maRectangles.size());
 
     // skip asserting exact values for macOS and Windows because of
@@ -78,12 +77,10 @@ void SearchResultLocatorTest::testSearchResultLocatorForSdrObjects()
     CPPUNIT_ASSERT(pDoc);
 
     sw::search::SearchResultLocator aLocator(pDoc);
-    sw::search::SearchIndexData aData;
-    aData.eType = sw::search::NodeType::SdrObject;
-    aData.aObjectName = u"Circle";
-    aData.nNodeIndex = 1;
+    std::vector<sw::search::SearchIndexData> aDataVector;
+    aDataVector.emplace_back(sw::search::NodeType::SdrObject, 1, u"Circle");
 
-    sw::search::LocationResult aResult = aLocator.find(aData);
+    sw::search::LocationResult aResult = aLocator.find(aDataVector);
     CPPUNIT_ASSERT_EQUAL(size_t(1), aResult.maRectangles.size());
 
     // skip asserting exact values for macOS and Windows because of
diff --git a/sw/source/core/inc/SearchResultLocator.hxx b/sw/source/core/inc/SearchResultLocator.hxx
index 5621a397b85c..cd1b2e4bb5e5 100644
--- a/sw/source/core/inc/SearchResultLocator.hxx
+++ b/sw/source/core/inc/SearchResultLocator.hxx
@@ -25,9 +25,18 @@ enum class NodeType
 
 struct SearchIndexData
 {
-    NodeType eType = NodeType::Undefined;
-    OUString aObjectName;
-    sal_uInt32 nNodeIndex = 0;
+    NodeType meType = NodeType::Undefined;
+    sal_uInt32 mnNodeIndex = 0;
+    OUString maObjectName;
+
+    SearchIndexData() {}
+
+    SearchIndexData(NodeType eType, sal_uInt32 nNodeIndex, OUString const& aObjectName = OUString())
+        : meType(eType)
+        , mnNodeIndex(nNodeIndex)
+        , maObjectName(aObjectName)
+    {
+    }
 };
 
 struct LocationResult
@@ -40,13 +49,15 @@ class SW_DLLPUBLIC SearchResultLocator
 {
     SwDoc* mpDocument;
 
+    void findOne(LocationResult& rResult, SearchIndexData const& rSearchIndexData);
+
 public:
     SearchResultLocator(SwDoc* pDoc)
         : mpDocument(pDoc)
     {
     }
 
-    LocationResult find(SearchIndexData const& rSearchIndexData);
+    LocationResult find(std::vector<SearchIndexData> const& rSearchIndexDataVector);
 };
 
 } // end sw namespace
diff --git a/sw/source/core/model/SearchResultLocator.cxx b/sw/source/core/model/SearchResultLocator.cxx
index d86d518f082a..e98db11befec 100644
--- a/sw/source/core/model/SearchResultLocator.cxx
+++ b/sw/source/core/model/SearchResultLocator.cxx
@@ -23,15 +23,14 @@
 
 namespace sw::search
 {
-LocationResult SearchResultLocator::find(SearchIndexData const& rSearchIndexData)
+void SearchResultLocator::findOne(LocationResult& rResult, SearchIndexData const& rSearchIndexData)
 {
-    LocationResult aResult;
-    if (rSearchIndexData.eType == NodeType::WriterNode)
+    if (rSearchIndexData.meType == NodeType::WriterNode)
     {
         SwNodes const& rNodes = mpDocument->GetNodes();
-        if (rSearchIndexData.nNodeIndex >= rNodes.Count())
-            return aResult;
-        SwNode* pNode = rNodes[rSearchIndexData.nNodeIndex];
+        if (rSearchIndexData.mnNodeIndex >= rNodes.Count())
+            return;
+        SwNode* pNode = rNodes[rSearchIndexData.mnNodeIndex];
 
         auto* pContentNode = pNode->GetContentNode();
         auto* pShell = mpDocument->getIDocumentLayoutAccess().GetCurrentViewShell();
@@ -42,13 +41,13 @@ LocationResult SearchResultLocator::find(SearchIndexData const& rSearchIndexData
                 = pContentNode->getLayoutFrame(pShell->GetLayout(), nullptr, nullptr);
             SwRect const& rArea = pFrame->getFrameArea();
 
-            aResult.mbFound = true;
-            aResult.maRectangles.emplace_back(rArea.Left(), rArea.Top(),
+            rResult.mbFound = true;
+            rResult.maRectangles.emplace_back(rArea.Left(), rArea.Top(),
                                               rArea.Left() + rArea.Width(),
                                               rArea.Top() + rArea.Height());
         }
     }
-    else if (rSearchIndexData.eType == NodeType::SdrObject)
+    else if (rSearchIndexData.meType == NodeType::SdrObject)
     {
         IDocumentDrawModelAccess& rDrawModelAccess = mpDocument->getIDocumentDrawModelAccess();
         auto* pModel = rDrawModelAccess.GetDrawModel();
@@ -60,22 +59,30 @@ LocationResult SearchResultLocator::find(SearchIndexData const& rSearchIndexData
                 SdrObject* pObject = pPage->GetObj(nObject);
                 if (pObject)
                 {
-                    if (pObject->GetName() == rSearchIndexData.aObjectName)
+                    if (pObject->GetName() == rSearchIndexData.maObjectName)
                     {
+
                         auto aLogicRect = pObject->GetLogicRect();
                         auto nLeft = convertMm100ToTwip(aLogicRect.Left());
                         auto nTop = convertMm100ToTwip(aLogicRect.Top());
                         auto nWidth = convertMm100ToTwip(aLogicRect.GetWidth());
                         auto nHeight = convertMm100ToTwip(aLogicRect.GetHeight());
 
-                        aResult.mbFound = true;
-                        aResult.maRectangles.emplace_back(nLeft, nTop, nLeft + nWidth,
+                        rResult.mbFound = true;
+                        rResult.maRectangles.emplace_back(nLeft, nTop, nLeft + nWidth,
                                                           nTop + nHeight);
                     }
                 }
             }
         }
     }
+}
+
+LocationResult SearchResultLocator::find(std::vector<SearchIndexData> const& rSearchIndexDataVector)
+{
+    LocationResult aResult;
+    for (auto const& rSearchIndexData : rSearchIndexDataVector)
+        findOne(aResult, rSearchIndexData);
 
     return aResult;
 }
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 3f029d1b53e6..fa3019a2ebf3 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3425,8 +3425,7 @@ SwXTextDocument::getSearchResultRectangles(const char* pPayload)
     {
         SwDoc* pDoc = m_pDocShell->GetDoc();
 
-        sw::search::SearchIndexData aData;
-
+        std::vector<sw::search::SearchIndexData> aDataVector;
         aWalker.children();
         while (aWalker.isValid())
         {
@@ -3437,21 +3436,28 @@ SwXTextDocument::getSearchResultRectangles(const char* pPayload)
 
                 if (!sType.isEmpty() && !sIndex.isEmpty())
                 {
-                    aData.nNodeIndex = sIndex.toInt32();
-                    aData.eType = sw::search::NodeType(sType.toInt32());
+                    sw::search::SearchIndexData aData;
+                    aData.mnNodeIndex = sIndex.toInt32();
+                    aData.meType = sw::search::NodeType(sType.toInt32());
 
-                    sw::search::SearchResultLocator aLocator(pDoc);
-                    sw::search::LocationResult aResult = aLocator.find(aData);
-                    if (aResult.mbFound)
-                    {
-                        for (auto const & rRect : aResult.maRectangles)
-                            aRectangles.push_back(rRect);
-                    }
+                    aDataVector.push_back(aData);
                 }
             }
             aWalker.next();
         }
         aWalker.parent();
+
+
+        if (!aDataVector.empty())
+        {
+            sw::search::SearchResultLocator aLocator(pDoc);
+            sw::search::LocationResult aResult = aLocator.find(aDataVector);
+            if (aResult.mbFound)
+            {
+                for (auto const & rRect : aResult.maRectangles)
+                    aRectangles.push_back(rRect);
+            }
+        }
     }
 
     return aRectangles;
commit 43d30b5031396d8842b0a70cad7d095ee4be1fdd
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Mon Aug 2 22:27:28 2021 +0900
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Thu Sep 2 11:21:31 2021 +0200

    indexing: use XML as input that is identical to indexing XML
    
    Change-Id: I2242b4bd77220b55e67c2e0f0fe54f008759d282
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120194
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
    (cherry picked from commit 7da5537f6a43c1b82afc5e0c8d18b8d847293fda)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121113
    Tested-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index ba631b855226..be5276c3344b 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -3092,13 +3092,16 @@ void DesktopLOKTest::testRenderSearchResult()
     Scheduler::ProcessEventsToIdle();
 
     unsigned char* pBuffer = nullptr;
-    OString aJSON = "{ \"type\" : 1, \"node_index\" : 19 }";
+    OString aPayload =
+    "<indexing>"
+        "<paragraph type=\"1\" index=\"19\">ABC</paragraph>"
+    "</indexing>";
 
     int nWidth = 0;
     int nHeight = 0;
     size_t nByteSize = 0;
 
-    bool bResult = pDocument->m_pDocumentClass->renderSearchResult(pDocument, aJSON.getStr(), &pBuffer, &nWidth, &nHeight, &nByteSize);
+    bool bResult = pDocument->m_pDocumentClass->renderSearchResult(pDocument, aPayload.getStr(), &pBuffer, &nWidth, &nHeight, &nByteSize);
 
     CPPUNIT_ASSERT(bResult);
     CPPUNIT_ASSERT(pBuffer);
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 6f4a24402ca5..3f029d1b53e6 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -124,7 +124,6 @@
 #include <swruler.hxx>
 #include <docufld.hxx>
 
-
 #include <EnhancedPDFExportHelper.hxx>
 #include <numrule.hxx>
 
@@ -164,6 +163,8 @@
 
 #include <SearchResultLocator.hxx>
 #include <boost/property_tree/json_parser.hpp>
+#include <tools/XmlWalker.hxx>
+
 #define TWIPS_PER_PIXEL 15
 
 using namespace ::com::sun::star;
@@ -3413,23 +3414,45 @@ SwXTextDocument::getSearchResultRectangles(const char* pPayload)
 {
     std::vector<basegfx::B2DRange> aRectangles;
 
-    boost::property_tree::ptree aTree;
-    std::stringstream aStream(pPayload);
-    boost::property_tree::read_json(aStream, aTree);
+    const OString aPayloadString(pPayload);
 
-    sw::search::SearchIndexData aData;
+    SvMemoryStream aStream(const_cast<char *>(aPayloadString.getStr()), aPayloadString.getLength(), StreamMode::READ);
+    tools::XmlWalker aWalker;
+    if (!aWalker.open(&aStream))
+        return aRectangles;
 
-    int nType = aTree.get<int>("type");
+    if (aWalker.name() == "indexing")
+    {
+        SwDoc* pDoc = m_pDocShell->GetDoc();
 
-    aData.nNodeIndex = sal_uInt32(aTree.get<int>("node_index"));
-    aData.eType = sw::search::NodeType(nType);
+        sw::search::SearchIndexData aData;
 
-    SwDoc* pDoc = m_pDocShell->GetDoc();
+        aWalker.children();
+        while (aWalker.isValid())
+        {
+            if (aWalker.name() == "paragraph")
+            {
+                OString sType = aWalker.attribute("type");
+                OString sIndex = aWalker.attribute("index");
+
+                if (!sType.isEmpty() && !sIndex.isEmpty())
+                {
+                    aData.nNodeIndex = sIndex.toInt32();
+                    aData.eType = sw::search::NodeType(sType.toInt32());
 
-    sw::search::SearchResultLocator aLocator(pDoc);
-    sw::search::LocationResult aResult = aLocator.find(aData);
-    if (aResult.mbFound)
-        aRectangles = aResult.maRectangles;
+                    sw::search::SearchResultLocator aLocator(pDoc);
+                    sw::search::LocationResult aResult = aLocator.find(aData);
+                    if (aResult.mbFound)
+                    {
+                        for (auto const & rRect : aResult.maRectangles)
+                            aRectangles.push_back(rRect);
+                    }
+                }
+            }
+            aWalker.next();
+        }
+        aWalker.parent();
+    }
 
     return aRectangles;
 }


More information about the Libreoffice-commits mailing list