diff options
author | Kohei Yoshida <kohei.yoshida@suse.com> | 2011-09-19 19:09:19 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@suse.com> | 2011-09-19 19:56:16 -0400 |
commit | 0783e78de2ce265e19b739effbff80c37ee98576 (patch) | |
tree | e3f9b3c9c04db7f582a08889bf29353383a3f68f | |
parent | 5660bc7573f3529ae25d54867249045bb65d536b (diff) |
Let's avoid modifying the selection data during search and replace.
The previous code was modifying the selection data (ScMarkData) in
a not-so-obvious fashion during the search and/or replace. Let's only
modify selection in the view code to avoid surprises. The document
model shouldn't be modifying the view model.
Those methods that were taking a reference to ScMarkData now take a
const reference instead.
-rw-r--r-- | sc/inc/document.hxx | 8 | ||||
-rw-r--r-- | sc/inc/table.hxx | 41 | ||||
-rw-r--r-- | sc/source/core/data/documen3.cxx | 20 | ||||
-rw-r--r-- | sc/source/core/data/table6.cxx | 118 | ||||
-rw-r--r-- | sc/source/ui/unoobj/cellsuno.cxx | 25 | ||||
-rw-r--r-- | sc/source/ui/view/viewfun2.cxx | 17 |
6 files changed, 119 insertions, 110 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 77439d10a503..ca9806385e6c 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -1260,10 +1260,10 @@ public: sal_uInt16 nFormatNo, const ScMarkData& rMark ); void GetAutoFormatData( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScAutoFormatData& rData ); - sal_Bool SearchAndReplace( const SvxSearchItem& rSearchItem, - SCCOL& rCol, SCROW& rRow, SCTAB& rTab, - ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc = NULL ); + bool SearchAndReplace( const SvxSearchItem& rSearchItem, + SCCOL& rCol, SCROW& rRow, SCTAB& rTab, + const ScMarkData& rMark, ScRangeList& rMatchedRanges, + rtl::OUString& rUndoStr, ScDocument* pUndoDoc = NULL ); // determine Col/Row of subsequent calls // (e.g. not found from the beginning, or subsequent tables) diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 347b9cc450fe..9cd3c573a072 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -498,9 +498,9 @@ public: sal_uInt16 nFormatNo ); void GetAutoFormatData(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScAutoFormatData& rData); void ScReplaceTabsStr( String& rStr, const String& rSrch, const String& rRepl ); // from sw - bool SearchAndReplace(const SvxSearchItem& rSearchItem, - SCCOL& rCol, SCROW& rRow, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc); + bool SearchAndReplace( + const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark, + ScRangeList& rMatchedRanges, rtl::OUString& rUndoStr, ScDocument* pUndoDoc); void FindMaxRotCol( RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nX1, SCCOL nX2 ); @@ -819,33 +819,36 @@ private: void GetAutoFormatAttr(SCCOL nCol, SCROW nRow, sal_uInt16 nIndex, ScAutoFormatData& rData); void GetAutoFormatFrame(SCCOL nCol, SCROW nRow, sal_uInt16 nFlags, sal_uInt16 nIndex, ScAutoFormatData& rData); bool SearchCell(const SvxSearchItem& rSearchItem, SCCOL nCol, SCROW nRow, - const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc); + const ScMarkData& rMark, rtl::OUString& rUndoStr, ScDocument* pUndoDoc); bool Search(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, - const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc); - bool SearchAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc); + const ScMarkData& rMark, rtl::OUString& rUndoStr, ScDocument* pUndoDoc); + bool SearchAll(const SvxSearchItem& rSearchItem, const ScMarkData& rMark, + ScRangeList& rMatchedRanges, rtl::OUString& rUndoStr, ScDocument* pUndoDoc); bool Replace(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, - const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc); - bool ReplaceAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc); + const ScMarkData& rMark, rtl::OUString& rUndoStr, ScDocument* pUndoDoc); + bool ReplaceAll( + const SvxSearchItem& rSearchItem, const ScMarkData& rMark, ScRangeList& rMatchedRanges, + rtl::OUString& rUndoStr, ScDocument* pUndoDoc); bool SearchStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark); bool ReplaceStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark, bool bIsUndo); - bool SearchAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark); - bool ReplaceAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark, - ScDocument* pUndoDoc); + bool SearchAllStyle( + const SvxSearchItem& rSearchItem, const ScMarkData& rMark, ScRangeList& rMatchedRanges); + bool ReplaceAllStyle( + const SvxSearchItem& rSearchItem, const ScMarkData& rMark, ScRangeList& rMatchedRanges, + ScDocument* pUndoDoc); bool SearchAndReplaceEmptyCells( const SvxSearchItem& rSearchItem, - SCCOL& rCol, SCROW& rRow, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc); + SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark, ScRangeList& rMatchedRanges, + rtl::OUString& rUndoStr, ScDocument* pUndoDoc); bool SearchRangeForEmptyCell(const ScRange& rRange, const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, - String& rUndoStr, ScDocument* pUndoDoc); - bool SearchRangeForAllEmptyCells(const ScRange& rRange, - const SvxSearchItem& rSearchItem, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc); + rtl::OUString& rUndoStr); + bool SearchRangeForAllEmptyCells( + const ScRange& rRange, const SvxSearchItem& rSearchItem, + ScRangeList& rMatchedRanges, rtl::OUString& rUndoStr, ScDocument* pUndoDoc); // use the global sort parameter: bool IsSorted(SCCOLROW nStart, SCCOLROW nEnd); diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx index 2825e7fa4ce7..2a16408c4617 100644 --- a/sc/source/core/data/documen3.cxx +++ b/sc/source/core/data/documen3.cxx @@ -1176,16 +1176,14 @@ void ScDocument::GetSearchAndReplaceStart( const SvxSearchItem& rSearchItem, } } -sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, - SCCOL& rCol, SCROW& rRow, SCTAB& rTab, - ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc) +bool ScDocument::SearchAndReplace( + const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, SCTAB& rTab, + const ScMarkData& rMark, ScRangeList& rMatchedRanges, + rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { //! getrennte Markierungen pro Tabelle verwalten !!!!!!!!!!!!! - rMark.MarkToMulti(); - - sal_Bool bFound = false; + bool bFound = false; if (rTab >= static_cast<SCTAB>(maTabs.size())) OSL_FAIL("table out of range"); if (VALIDTAB(rTab)) @@ -1198,14 +1196,14 @@ sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, nCommand == SVX_SEARCHCMD_REPLACE_ALL ) { SCTAB nMax = maTabs.size(); - ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end(); + ScMarkData::const_iterator itr = rMark.begin(), itrEnd = rMark.end(); for (; itr != itrEnd && *itr < nMax; ++itr) if (maTabs[*itr]) { nCol = 0; nRow = 0; bFound |= maTabs[*itr]->SearchAndReplace( - rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc ); + rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc); } // Markierung wird innen schon komplett gesetzt @@ -1222,7 +1220,7 @@ sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, if (rMark.GetTableSelect(nTab)) { bFound = maTabs[nTab]->SearchAndReplace( - rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc ); + rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc); if (bFound) { rCol = nCol; @@ -1243,7 +1241,7 @@ sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, if (rMark.GetTableSelect(nTab)) { bFound = maTabs[nTab]->SearchAndReplace( - rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc ); + rSearchItem, nCol, nRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc); if (bFound) { rCol = nCol; diff --git a/sc/source/core/data/table6.cxx b/sc/source/core/data/table6.cxx index e53abba0675e..4edb697ad976 100644 --- a/sc/source/core/data/table6.cxx +++ b/sc/source/core/data/table6.cxx @@ -65,7 +65,7 @@ bool lcl_GetTextWithBreaks( const ScEditCell& rCell, ScDocument* pDoc, String& r } bool ScTable::SearchCell(const SvxSearchItem& rSearchItem, SCCOL nCol, SCROW nRow, - const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc) + const ScMarkData& rMark, rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { bool bFound = false; bool bDoSearch = true; @@ -287,7 +287,7 @@ void ScTable::SkipFilteredRows(SCROW& rRow, SCROW& rLastNonFilteredRow, bool bFo } bool ScTable::Search(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, - const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc) + const ScMarkData& rMark, rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { bool bFound = false; bool bAll = (rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND_ALL) @@ -434,31 +434,30 @@ bool ScTable::Search(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, return bFound; } -bool ScTable::SearchAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc) +bool ScTable::SearchAll(const SvxSearchItem& rSearchItem, const ScMarkData& rMark, + ScRangeList& rMatchedRanges, rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { bool bFound = true; SCCOL nCol = 0; SCROW nRow = -1; + bool bEverFound = false; - ScMarkData aNewMark( rMark ); // Tabellen-Markierungen kopieren - aNewMark.ResetMark(); do { bFound = Search(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc); if (bFound) - aNewMark.SetMultiMarkArea( ScRange( nCol, nRow, nTab ) ); + { + bEverFound = true; + rMatchedRanges.Join(ScRange(nCol, nRow, nTab)); + } } while (bFound); - rMark = aNewMark; // Markierung kopieren - //! pro Tabelle - - return (aNewMark.IsMultiMarked()); + return bEverFound; } bool ScTable::Replace(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, - const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc) + const ScMarkData& rMark, rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { bool bFound = false; SCCOL nCol = rCol; @@ -486,33 +485,32 @@ bool ScTable::Replace(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow return bFound; } -bool ScTable::ReplaceAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc) +bool ScTable::ReplaceAll( + const SvxSearchItem& rSearchItem, const ScMarkData& rMark, ScRangeList& rMatchedRanges, + rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { bool bOldDouble = ScColumn::bDoubleAlloc; // sollte immer sal_False sein? OSL_ENSURE(!bOldDouble,"bDoubleAlloc ???"); ScColumn::bDoubleAlloc = true; // fuer Undo-Doc - bool bFound = true; SCCOL nCol = 0; SCROW nRow = -1; - ScMarkData aNewMark( rMark ); // Tabellen-Markierungen kopieren - aNewMark.ResetMark(); - do + bool bEverFound = false; + while (true) { - bFound = Search(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc); + bool bFound = Search(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc); + if (bFound) - aNewMark.SetMultiMarkArea( ScRange( nCol, nRow, nTab ) ); + { + bEverFound = true; + rMatchedRanges.Join(ScRange(nCol, nRow, nTab)); + } + else + break; } - while (bFound); - ScColumn::bDoubleAlloc = bOldDouble; - - rMark = aNewMark; // Markierung kopieren - //! pro Tabelle - - return (aNewMark.IsMultiMarked()); + return bEverFound; } bool ScTable::SearchStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, @@ -620,16 +618,16 @@ bool ScTable::ReplaceStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& return bRet; } -bool ScTable::SearchAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark) +bool ScTable::SearchAllStyle( + const SvxSearchItem& rSearchItem, const ScMarkData& rMark, ScRangeList& rMatchedRanges) { const ScStyleSheet* pSearchStyle = (const ScStyleSheet*) pDocument->GetStyleSheetPool()->Find( rSearchItem.GetSearchString(), SFX_STYLE_FAMILY_PARA ); bool bSelect = rSearchItem.GetSelection(); bool bBack = rSearchItem.GetBackward(); + bool bEverFound = false; - ScMarkData aNewMark( rMark ); // Tabellen-Markierungen kopieren - aNewMark.ResetMark(); for (SCCOL i=0; i<=MAXCOL; i++) { bool bFound = true; @@ -646,22 +644,21 @@ bool ScTable::SearchAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark nRow = nEndRow; nEndRow = nTemp; } - aNewMark.SetMultiMarkArea( ScRange( i,nRow,nTab, i,nEndRow,nTab ) ); + rMatchedRanges.Join(ScRange(i, nRow, nTab, i, nEndRow, nTab)); nRow = nEndRow + 1; + bEverFound = true; } } } - rMark = aNewMark; // Markierung kopieren - //! pro Tabelle - - return (aNewMark.IsMultiMarked()); + return bEverFound; } -bool ScTable::ReplaceAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark, - ScDocument* pUndoDoc) +bool ScTable::ReplaceAllStyle( + const SvxSearchItem& rSearchItem, const ScMarkData& rMark, ScRangeList& rMatchedRanges, + ScDocument* pUndoDoc) { - bool bRet = SearchAllStyle(rSearchItem, rMark); + bool bRet = SearchAllStyle(rSearchItem, rMark, rMatchedRanges); if (bRet) { const ScStyleSheet* pReplaceStyle = (const ScStyleSheet*) @@ -684,9 +681,9 @@ bool ScTable::ReplaceAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMar return bRet; } -bool ScTable::SearchAndReplace(const SvxSearchItem& rSearchItem, - SCCOL& rCol, SCROW& rRow, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc) +bool ScTable::SearchAndReplace( + const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark, + ScRangeList& rMatchedRanges, rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { sal_uInt16 nCommand = rSearchItem.GetCommand(); bool bFound = false; @@ -706,9 +703,9 @@ bool ScTable::SearchAndReplace(const SvxSearchItem& rSearchItem, else if (nCommand == SVX_SEARCHCMD_REPLACE) bFound = ReplaceStyle(rSearchItem, rCol, rRow, rMark, false); else if (nCommand == SVX_SEARCHCMD_FIND_ALL) - bFound = SearchAllStyle(rSearchItem, rMark); + bFound = SearchAllStyle(rSearchItem, rMark, rMatchedRanges); else if (nCommand == SVX_SEARCHCMD_REPLACE_ALL) - bFound = ReplaceAllStyle(rSearchItem, rMark, pUndoDoc); + bFound = ReplaceAllStyle(rSearchItem, rMark, rMatchedRanges, pUndoDoc); } else { @@ -719,7 +716,7 @@ bool ScTable::SearchAndReplace(const SvxSearchItem& rSearchItem, if (!aSearchOptions.searchString.getLength()) { // Search for empty cells. - return SearchAndReplaceEmptyCells(rSearchItem, rCol, rRow, rMark, rUndoStr, pUndoDoc); + return SearchAndReplaceEmptyCells(rSearchItem, rCol, rRow, rMark, rMatchedRanges, rUndoStr, pUndoDoc); } // reflect UseAsianOptions flag in SearchOptions @@ -735,11 +732,11 @@ bool ScTable::SearchAndReplace(const SvxSearchItem& rSearchItem, if (nCommand == SVX_SEARCHCMD_FIND) bFound = Search(rSearchItem, rCol, rRow, rMark, rUndoStr, pUndoDoc); else if (nCommand == SVX_SEARCHCMD_FIND_ALL) - bFound = SearchAll(rSearchItem, rMark, rUndoStr, pUndoDoc); + bFound = SearchAll(rSearchItem, rMark, rMatchedRanges, rUndoStr, pUndoDoc); else if (nCommand == SVX_SEARCHCMD_REPLACE) bFound = Replace(rSearchItem, rCol, rRow, rMark, rUndoStr, pUndoDoc); else if (nCommand == SVX_SEARCHCMD_REPLACE_ALL) - bFound = ReplaceAll(rSearchItem, rMark, rUndoStr, pUndoDoc); + bFound = ReplaceAll(rSearchItem, rMark, rMatchedRanges, rUndoStr, pUndoDoc); delete pSearchText; pSearchText = NULL; @@ -749,8 +746,8 @@ bool ScTable::SearchAndReplace(const SvxSearchItem& rSearchItem, } bool ScTable::SearchAndReplaceEmptyCells( - const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc) + const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark, + ScRangeList& rMatchedRanges, rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { SCCOL nColStart, nColEnd; SCROW nRowStart, nRowEnd; @@ -800,7 +797,7 @@ bool ScTable::SearchAndReplaceEmptyCells( for ( size_t i = aRanges.size(); i > 0; --i ) { ScRange* p = aRanges[ i - 1 ]; - if (SearchRangeForEmptyCell( *p, rSearchItem, rCol, rRow, rUndoStr, pUndoDoc)) + if (SearchRangeForEmptyCell(*p, rSearchItem, rCol, rRow, rUndoStr)) return true; } } @@ -809,7 +806,7 @@ bool ScTable::SearchAndReplaceEmptyCells( for ( size_t i = 0, nListSize = aRanges.size(); i < nListSize; ++i ) { ScRange* p = aRanges[ i ]; - if (SearchRangeForEmptyCell( *p, rSearchItem, rCol, rRow, rUndoStr, pUndoDoc )) + if (SearchRangeForEmptyCell(*p, rSearchItem, rCol, rRow, rUndoStr)) return true; } } @@ -817,14 +814,11 @@ bool ScTable::SearchAndReplaceEmptyCells( else if (nCommand == SVX_SEARCHCMD_FIND_ALL || nCommand == SVX_SEARCHCMD_REPLACE_ALL) { bool bFound = false; - ScMarkData aNewMark(rMark); - aNewMark.ResetMark(); for ( size_t i = 0, nListSize = aRanges.size(); i < nListSize; ++i ) { ScRange* p = aRanges[ i ]; - bFound |= SearchRangeForAllEmptyCells(*p, rSearchItem, aNewMark, rUndoStr, pUndoDoc); + bFound |= SearchRangeForAllEmptyCells(*p, rSearchItem, rMatchedRanges, rUndoStr, pUndoDoc); } - rMark = aNewMark; return bFound; } return false; @@ -833,7 +827,7 @@ bool ScTable::SearchAndReplaceEmptyCells( namespace { bool lcl_maybeReplaceCellString( - ScColumn& rColObj, SCCOL& rCol, SCROW& rRow, String& rUndoStr, SCCOL nCol, SCROW nRow, const SvxSearchItem& rSearchItem) + ScColumn& rColObj, SCCOL& rCol, SCROW& rRow, rtl::OUString& rUndoStr, SCCOL nCol, SCROW nRow, const SvxSearchItem& rSearchItem) { ScBaseCell* pCell = rColObj.GetCell(nRow); if (!pCell || pCell->GetCellType() == CELLTYPE_NOTE) @@ -845,7 +839,7 @@ bool lcl_maybeReplaceCellString( rSearchItem.GetReplaceString().Len()) { rColObj.Insert(nRow, new ScStringCell(rSearchItem.GetReplaceString())); - rUndoStr = String(); + rUndoStr = rtl::OUString(); } return true; } @@ -856,7 +850,7 @@ bool lcl_maybeReplaceCellString( bool ScTable::SearchRangeForEmptyCell( const ScRange& rRange, const SvxSearchItem& rSearchItem, - SCCOL& rCol, SCROW& rRow, String& rUndoStr, ScDocument* /*pUndoDoc*/) + SCCOL& rCol, SCROW& rRow, rtl::OUString& rUndoStr) { sal_uInt16 nCmd = rSearchItem.GetCommand(); bool bSkipFiltered = rSearchItem.IsSearchFiltered(); @@ -965,8 +959,8 @@ bool ScTable::SearchRangeForEmptyCell( } bool ScTable::SearchRangeForAllEmptyCells( - const ScRange& rRange, const SvxSearchItem& rSearchItem, ScMarkData& rMark, - String& rUndoStr, ScDocument* pUndoDoc) + const ScRange& rRange, const SvxSearchItem& rSearchItem, + ScRangeList& rMatchedRanges, rtl::OUString& rUndoStr, ScDocument* pUndoDoc) { bool bFound = false; bool bReplace = (rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL) && @@ -984,7 +978,7 @@ bool ScTable::SearchRangeForAllEmptyCells( SCROW nLastRow; if (!RowFiltered(nRow, NULL, &nLastRow)) { - rMark.SetMultiMarkArea(ScRange(nCol, nRow, nTab, nCol, nLastRow, nTab)); + rMatchedRanges.Join(ScRange(nCol, nRow, nTab, nCol, nLastRow, nTab)); if (bReplace) { const String& rNewStr = rSearchItem.GetReplaceString(); @@ -1018,7 +1012,7 @@ bool ScTable::SearchRangeForAllEmptyCells( if (!pCell) { // empty cell found - rMark.SetMultiMarkArea(ScRange(nCol, nRow, nTab)); + rMatchedRanges.Join(ScRange(nCol, nRow, nTab)); bFound = true; if (bReplace) @@ -1033,7 +1027,7 @@ bool ScTable::SearchRangeForAllEmptyCells( } else if (pCell->GetCellType() == CELLTYPE_NOTE) { - rMark.SetMultiMarkArea(ScRange(nCol, nRow, nTab)); + rMatchedRanges.Join(ScRange(nCol, nRow, nTab)); bFound = true; if (bReplace) diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx index 52587e58abec..2450ee8a7284 100644 --- a/sc/source/ui/unoobj/cellsuno.cxx +++ b/sc/source/ui/unoobj/cellsuno.cxx @@ -3890,12 +3890,13 @@ uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangesBase::findAll( ScMarkData aMark(*GetMarkData()); - String aDummyUndo; + rtl::OUString aDummyUndo; + ScRangeList aMatchedRanges; SCCOL nCol = 0; SCROW nRow = 0; SCTAB nTab = 0; - sal_Bool bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, - aMark, aDummyUndo, NULL ); + bool bFound = pDoc->SearchAndReplace( + *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aDummyUndo, NULL); if (bFound) { ScRangeList aNewRanges; @@ -3940,9 +3941,10 @@ uno::Reference<uno::XInterface> ScCellRangesBase::Find_Impl( ScDocument::GetSearchAndReplaceStart( *pSearchItem, nCol, nRow ); } - String aDummyUndo; - sal_Bool bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, - aMark, aDummyUndo, NULL ); + rtl::OUString aDummyUndo; + ScRangeList aMatchedRanges; + bool bFound = pDoc->SearchAndReplace( + *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aDummyUndo, NULL); if (bFound) { ScAddress aFoundPos( nCol, nRow, nTab ); @@ -4030,7 +4032,7 @@ sal_Int32 SAL_CALL ScCellRangesBase::replaceAll( const uno::Reference<util::XSea SCCOL nCol = 0; SCROW nRow = 0; - String aUndoStr; + rtl::OUString aUndoStr; ScDocument* pUndoDoc = NULL; if (bUndo) { @@ -4045,10 +4047,13 @@ sal_Int32 SAL_CALL ScCellRangesBase::replaceAll( const uno::Reference<util::XSea if (bUndo) pUndoMark = new ScMarkData(aMark); - sal_Bool bFound(false); + bool bFound = false; if (bUndo) - bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, - aMark, aUndoStr, pUndoDoc ); + { + ScRangeList aMatchedRanges; + bFound = pDoc->SearchAndReplace( + *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aUndoStr, pUndoDoc ); + } if (bFound) { nReplaced = pUndoDoc->GetCellCount(); diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index 506f148b178f..88196cb0d5fb 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -1629,7 +1629,7 @@ void ScViewFunc::SearchAndReplace( const SvxSearchItem* pSearchItem, ScDocument* pUndoDoc = NULL; ScMarkData* pUndoMark = NULL; - String aUndoStr; + rtl::OUString aUndoStr; if (bAddUndo) { pUndoMark = new ScMarkData( rMark ); // Mark is being modified @@ -1656,11 +1656,12 @@ void ScViewFunc::SearchAndReplace( const SvxSearchItem* pSearchItem, if ( nCol == 0 && nRow == 0 && nTab == nStartTab && !pSearchItem->GetBackward() ) bFirst = false; - sal_Bool bFound = false; - while (sal_True) + bool bFound = false; + while (true) { GetFrameWin()->EnterWait(); - if (pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, rMark, aUndoStr, pUndoDoc ) ) + ScRangeList aMatchedRanges; + if (pDoc->SearchAndReplace(*pSearchItem, nCol, nRow, nTab, rMark, aMatchedRanges, aUndoStr, pUndoDoc)) { bFound = sal_True; bFirst = sal_True; @@ -1673,6 +1674,14 @@ void ScViewFunc::SearchAndReplace( const SvxSearchItem* pSearchItem, pUndoDoc = NULL; } + rMark.ResetMark(); + for (size_t i = 0, n = aMatchedRanges.size(); i < n; ++i) + { + const ScRange& r = *aMatchedRanges[i]; + if (r.aStart.Tab() == nTab) + rMark.SetMultiMarkArea(r); + } + break; // break 'while (TRUE)' } else if ( bFirst && (nCommand == SVX_SEARCHCMD_FIND || |