summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-10-14 11:38:47 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-10-14 11:38:47 +0200
commit32d573cdd13126c13e46b4e3684446e888e8b8e6 (patch)
treef7b257973ede6866760df96ec81b67ecd8704c7b /sd
parent95f5ca359390d08d13f5e8ee8dc5ffbdaba2836a (diff)
sd tiled rendering: initial search all
Change-Id: Icee3a07103fad1bf70637fbf23299f50b7ad838d
Diffstat (limited to 'sd')
-rw-r--r--sd/inc/Outliner.hxx5
-rw-r--r--sd/source/ui/view/Outliner.cxx71
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;