From fea53bcac5aaf5e18baf90c8bd6f0fb4142e2f63 Mon Sep 17 00:00:00 2001 From: Miklos Vajna 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 () or another call to this method is required (). */ - bool SearchAndReplaceOnce(); + bool SearchAndReplaceOnce(std::vector* 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 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* 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 aLogicRects; pOutlinerView->GetSelectionRectangles(aLogicRects); - boost::property_tree::ptree aTree; - aTree.put("searchString", mpSearchItem->GetSearchString().toUtf8().getStr()); - std::vector 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