Blob Blame History Raw
From fea53bcac5aaf5e18baf90c8bd6f0fb4142e2f63 Mon Sep 17 00:00:00 2001
From: Miklos Vajna <vmiklos@collabora.co.uk>
Date: Wed, 14 Oct 2015 11:38:47 +0200
Subject: [PATCH 206/398] sd tiled rendering: initial search all

Change-Id: Icee3a07103fad1bf70637fbf23299f50b7ad838d
(cherry picked from commit 32d573cdd13126c13e46b4e3684446e888e8b8e6)
---
 sd/inc/Outliner.hxx            |  5 ++-
 sd/source/ui/view/Outliner.cxx | 71 +++++++++++++++++++++++++++++-------------
 2 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/sd/inc/Outliner.hxx b/sd/inc/Outliner.hxx
index 26ad3495357a..f01e244de308 100644
--- a/sd/inc/Outliner.hxx
+++ b/sd/inc/Outliner.hxx
@@ -357,11 +357,14 @@ private:
     bool SearchAndReplaceAll();
 
     /** Do search and replace for next match.
+        @param pSelections
+            When tiled rendering and not 0, then don't emit LOK events, instead
+            assume the caller will do so.
         @return
             The return value specifies whether the search ended (</sal_True>) or
             another call to this method is required (</sal_False>).
     */
-    bool SearchAndReplaceOnce();
+    bool SearchAndReplaceOnce(std::vector<OString>* pSelections = 0);
 
     /** Detect changes of the document or view and react accordingly.  Such
         changes may occur because different calls to
diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx
index 41bf43d253f4..e02e879494b8 100644
--- a/sd/source/ui/view/Outliner.cxx
+++ b/sd/source/ui/view/Outliner.cxx
@@ -490,7 +490,7 @@ bool Outliner::StartSearchAndReplace (const SvxSearchItem* pSearchItem)
         Initialize ( ! mpSearchItem->GetBackward());
 
         const SvxSearchCmd nCommand (mpSearchItem->GetCommand());
-        if (nCommand == SvxSearchCmd::REPLACE_ALL)
+        if (nCommand == SvxSearchCmd::FIND_ALL || nCommand == SvxSearchCmd::REPLACE_ALL)
             bEndOfSearch = SearchAndReplaceAll ();
         else
         {
@@ -621,11 +621,32 @@ bool Outliner::SearchAndReplaceAll()
 
         // Search/replace until the end of the document is reached.
         bool bFoundMatch;
+        std::vector<OString> aSelections;
         do
         {
-            bFoundMatch = ! SearchAndReplaceOnce();
+            bFoundMatch = ! SearchAndReplaceOnce(&aSelections);
         }
         while (bFoundMatch);
+
+        if (mpSearchItem->GetCommand() == SvxSearchCmd::FIND_ALL && pViewShell->GetDoc()->isTiledRendering() && !aSelections.empty())
+        {
+            boost::property_tree::ptree aTree;
+            aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr());
+
+            boost::property_tree::ptree aChildren;
+            for (const OString& rSelection : aSelections)
+            {
+                boost::property_tree::ptree aChild;
+                aChild.put("", rSelection.getStr());
+                aChildren.push_back(std::make_pair("", aChild));
+            }
+            aTree.add_child("searchResultSelection", aChildren);
+
+            std::stringstream aStream;
+            boost::property_tree::write_json(aStream, aTree);
+            OString aPayload = aStream.str().c_str();
+            pViewShell->GetDoc()->libreOfficeKitCallback(LOK_CALLBACK_SEARCH_RESULT_SELECTION, aPayload.getStr());
+        }
     }
 
     RestoreStartPosition ();
@@ -634,7 +655,7 @@ bool Outliner::SearchAndReplaceAll()
     return true;
 }
 
-bool Outliner::SearchAndReplaceOnce()
+bool Outliner::SearchAndReplaceOnce(std::vector<OString>* pSelections)
 {
     DetectChange ();
 
@@ -724,30 +745,38 @@ bool Outliner::SearchAndReplaceOnce()
 
     if (pViewShell && pViewShell->GetDoc()->isTiledRendering() && mbStringFound)
     {
-        // notify LibreOfficeKit about changed page
-        OString aPayload = OString::number(maCurrentPosition.mnPageIndex);
-        pViewShell->GetDoc()->libreOfficeKitCallback(LOK_CALLBACK_SET_PART, aPayload.getStr());
-
-        // also about search result selections
         std::vector<Rectangle> aLogicRects;
         pOutlinerView->GetSelectionRectangles(aLogicRects);
 
-        boost::property_tree::ptree aTree;
-        aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr());
-
         std::vector<OString> aLogicRectStrings;
         std::transform(aLogicRects.begin(), aLogicRects.end(), std::back_inserter(aLogicRectStrings), [](const Rectangle& rRectangle) { return rRectangle.toString(); });
         OString sRectangles = comphelper::string::join("; ", aLogicRectStrings);
-        boost::property_tree::ptree aChildren;
-        boost::property_tree::ptree aChild;
-        aChild.put("", sRectangles.getStr());
-        aChildren.push_back(std::make_pair("", aChild));
-        aTree.add_child("searchResultSelection", aChildren);
-
-        std::stringstream aStream;
-        boost::property_tree::write_json(aStream, aTree);
-        aPayload = aStream.str().c_str();
-        pViewShell->GetDoc()->libreOfficeKitCallback(LOK_CALLBACK_SEARCH_RESULT_SELECTION, aPayload.getStr());
+
+        if (!pSelections)
+        {
+            // notify LibreOfficeKit about changed page
+            OString aPayload = OString::number(maCurrentPosition.mnPageIndex);
+            pViewShell->GetDoc()->libreOfficeKitCallback(LOK_CALLBACK_SET_PART, aPayload.getStr());
+
+            // also about search result selections
+            boost::property_tree::ptree aTree;
+            aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr());
+
+            boost::property_tree::ptree aChildren;
+            boost::property_tree::ptree aChild;
+            aChild.put("", sRectangles.getStr());
+            aChildren.push_back(std::make_pair("", aChild));
+            aTree.add_child("searchResultSelection", aChildren);
+
+            std::stringstream aStream;
+            boost::property_tree::write_json(aStream, aTree);
+            aPayload = aStream.str().c_str();
+            pViewShell->GetDoc()->libreOfficeKitCallback(LOK_CALLBACK_SEARCH_RESULT_SELECTION, aPayload.getStr());
+        }
+        else
+        {
+            pSelections->push_back(sRectangles);
+        }
     }
 
     return mbEndOfSearch;
-- 
2.12.0