From 5cfe5701f287fcceee39cd2eb8ed403cda6eeea4 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Wed, 14 Oct 2015 15:39:07 +0200 Subject: [PATCH 208/398] LOK: include part numbers in CALLBACK_SEARCH_RESULT_SELECTION payload Without that, the result in Calc/Impress is ambiguous. Change-Id: I8dfd8dafc996102ed583688fddd721c7600dc48c (cherry picked from commit ad280b67f8fda8f832a6a83bc5665df448c6ad00) --- desktop/qa/desktop_lib/test_desktop_lib.cxx | 8 +++++++- include/LibreOfficeKit/LibreOfficeKitEnums.h | 14 ++++++++++---- sc/source/ui/view/viewfun2.cxx | 3 ++- sd/qa/unit/tiledrendering/tiledrendering.cxx | 9 ++++++++- sd/source/ui/view/Outliner.cxx | 6 ++++-- sw/qa/extras/tiledrendering/tiledrendering.cxx | 8 +++++++- sw/source/uibase/uiview/viewsrch.cxx | 3 ++- 7 files changed, 40 insertions(+), 11 deletions(-) diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index e77bc8984bbf..30d8ae7adaf0 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -74,6 +74,7 @@ public: uno::Reference mxComponent; OString m_aTextSelection; std::vector m_aSearchResultSelection; + std::vector m_aSearchResultPart; }; LibLODocument_Impl* DesktopLOKTest::loadDoc(const char* pName, LibreOfficeKitDocumentType eType) @@ -131,7 +132,10 @@ void DesktopLOKTest::callbackImpl(int nType, const char* pPayload) std::stringstream aStream(pPayload); boost::property_tree::read_json(aStream, aTree); for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("searchResultSelection")) - m_aSearchResultSelection.push_back(rValue.second.data().c_str()); + { + m_aSearchResultSelection.push_back(rValue.second.get("rectangles").c_str()); + m_aSearchResultPart.push_back(std::atoi(rValue.second.get("part").c_str())); + } } break; } @@ -269,6 +273,8 @@ void DesktopLOKTest::testSearchCalc() CPPUNIT_ASSERT_EQUAL(static_cast(2), aSelections.size()); // Make sure that we get exactly as many rectangle lists as matches. CPPUNIT_ASSERT_EQUAL(static_cast(2), m_aSearchResultSelection.size()); + // Result is on the first sheet. + CPPUNIT_ASSERT_EQUAL(0, m_aSearchResultPart[0]); closeDoc(); comphelper::LibreOfficeKit::setActive(false); diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h index 0da87699b1b5..459da5d196f4 100644 --- a/include/LibreOfficeKit/LibreOfficeKitEnums.h +++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h @@ -165,14 +165,20 @@ typedef enum * { * "searchString": "...", * "searchResultSelection": [ - * "...", - * "..." + * { + * "part": "...", + * "rectangles": "..." + * }, + * { + * "part": "...", + * "rectangles": "..." + * } * ] * } * * - searchString is the search query - * - searchResultSelection is an array of rectangle list, in - * LOK_CALLBACK_TEXT_SELECTION format. + * - searchResultSelection is an array of part-number and rectangle list + * pairs, in LOK_CALLBACK_SET_PART / LOK_CALLBACK_TEXT_SELECTION format. */ LOK_CALLBACK_SEARCH_RESULT_SELECTION } diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index 2be84a4c8e39..95fd13a1bf93 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -1866,7 +1866,8 @@ bool ScViewFunc::SearchAndReplace( const SvxSearchItem* pSearchItem, for (const Rectangle& rLogicRect : aLogicRects) { boost::property_tree::ptree aSelection; - aSelection.put("", rLogicRect.toString().getStr()); + aSelection.put("part", OString::number(nTab).getStr()); + aSelection.put("rectangles", rLogicRect.toString().getStr()); aSelections.push_back(std::make_pair("", aSelection)); } aTree.add_child("searchResultSelection", aSelections); diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index f35449b12b2c..62ad1cdcad7e 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -80,6 +80,7 @@ private: bool m_bFound; sal_Int32 m_nPart; std::vector m_aSearchResultSelection; + std::vector m_aSearchResultPart; #endif }; @@ -187,11 +188,15 @@ void SdTiledRenderingTest::callbackImpl(int nType, const char* pPayload) case LOK_CALLBACK_SEARCH_RESULT_SELECTION: { m_aSearchResultSelection.clear(); + m_aSearchResultPart.clear(); boost::property_tree::ptree aTree; std::stringstream aStream(pPayload); boost::property_tree::read_json(aStream, aTree); for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("searchResultSelection")) - m_aSearchResultSelection.push_back(rValue.second.data().c_str()); + { + m_aSearchResultSelection.push_back(rValue.second.get("rectangles").c_str()); + m_aSearchResultPart.push_back(std::atoi(rValue.second.get("part").c_str())); + } } break; } @@ -401,6 +406,8 @@ void SdTiledRenderingTest::testSearch() CPPUNIT_ASSERT_EQUAL(true, m_bFound); // This was 0; should be 1 match for "find". CPPUNIT_ASSERT_EQUAL(static_cast(1), m_aSearchResultSelection.size()); + // Result is on the second slide. + CPPUNIT_ASSERT_EQUAL(1, m_aSearchResultPart[0]); // This should trigger the not-found callback. Application::EnableHeadlessMode(false); diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx index 22db187ab7c8..51635d5cba14 100644 --- a/sd/source/ui/view/Outliner.cxx +++ b/sd/source/ui/view/Outliner.cxx @@ -643,7 +643,8 @@ bool Outliner::SearchAndReplaceAll() for (const SearchSelection& rSelection : aSelections) { boost::property_tree::ptree aChild; - aChild.put("", rSelection.m_aRectangles.getStr()); + aChild.put("part", OString::number(rSelection.m_nPage).getStr()); + aChild.put("rectangles", rSelection.m_aRectangles.getStr()); aChildren.push_back(std::make_pair("", aChild)); } aTree.add_child("searchResultSelection", aChildren); @@ -770,7 +771,8 @@ bool Outliner::SearchAndReplaceOnce(std::vector* pSelections) boost::property_tree::ptree aChildren; boost::property_tree::ptree aChild; - aChild.put("", sRectangles.getStr()); + aChild.put("part", OString::number(maCurrentPosition.mnPageIndex).getStr()); + aChild.put("rectangles", sRectangles.getStr()); aChildren.push_back(std::make_pair("", aChild)); aTree.add_child("searchResultSelection", aChildren); diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 5e2b30ab7fde..4598c50e5842 100644 --- a/sw/qa/extras/tiledrendering/tiledrendering.cxx +++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx @@ -72,6 +72,7 @@ private: OString m_aTextSelection; bool m_bFound; std::vector m_aSearchResultSelection; + std::vector m_aSearchResultPart; }; SwTiledRenderingTest::SwTiledRenderingTest() @@ -138,7 +139,10 @@ void SwTiledRenderingTest::callbackImpl(int nType, const char* pPayload) std::stringstream aStream(pPayload); boost::property_tree::read_json(aStream, aTree); for (boost::property_tree::ptree::value_type& rValue : aTree.get_child("searchResultSelection")) - m_aSearchResultSelection.push_back(rValue.second.data().c_str()); + { + m_aSearchResultSelection.push_back(rValue.second.get("rectangles").c_str()); + m_aSearchResultPart.push_back(std::atoi(rValue.second.get("part").c_str())); + } } break; } @@ -477,6 +481,8 @@ void SwTiledRenderingTest::testSearchAll() comphelper::dispatchCommand(".uno:ExecuteSearch", aPropertyValues); // This was 0; should be 2 results in the body text. CPPUNIT_ASSERT_EQUAL(static_cast(2), m_aSearchResultSelection.size()); + // Writer documents are always a single part. + CPPUNIT_ASSERT_EQUAL(0, m_aSearchResultPart[0]); comphelper::LibreOfficeKit::setActive(false); #endif diff --git a/sw/source/uibase/uiview/viewsrch.cxx b/sw/source/uibase/uiview/viewsrch.cxx index 7f1addcc3f6b..53485eb9361b 100644 --- a/sw/source/uibase/uiview/viewsrch.cxx +++ b/sw/source/uibase/uiview/viewsrch.cxx @@ -95,7 +95,8 @@ static void lcl_addContainerToJson(boost::property_tree::ptree& rTree, const OSt for (const OString& rMatch : rMatches) { boost::property_tree::ptree aChild; - aChild.put("", rMatch.getStr()); + aChild.put("part", "0"); + aChild.put("rectangles", rMatch.getStr()); aChildren.push_back(std::make_pair("", aChild)); } -- 2.12.0