diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-10-14 11:38:47 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-10-14 11:38:47 +0200 |
commit | 32d573cdd13126c13e46b4e3684446e888e8b8e6 (patch) | |
tree | f7b257973ede6866760df96ec81b67ecd8704c7b /sd | |
parent | 95f5ca359390d08d13f5e8ee8dc5ffbdaba2836a (diff) |
sd tiled rendering: initial search all
Change-Id: Icee3a07103fad1bf70637fbf23299f50b7ad838d
Diffstat (limited to 'sd')
-rw-r--r-- | sd/inc/Outliner.hxx | 5 | ||||
-rw-r--r-- | 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 cf0a16f0245e..a5bb9667724e 100644 --- a/sd/inc/Outliner.hxx +++ b/sd/inc/Outliner.hxx @@ -350,11 +350,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 e9052842b350..45de02184343 100644 --- a/sd/source/ui/view/Outliner.cxx +++ b/sd/source/ui/view/Outliner.cxx @@ -484,7 +484,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 { @@ -615,11 +615,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 (); @@ -628,7 +649,7 @@ bool Outliner::SearchAndReplaceAll() return true; } -bool Outliner::SearchAndReplaceOnce() +bool Outliner::SearchAndReplaceOnce(std::vector<OString>* pSelections) { DetectChange (); @@ -718,30 +739,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; |