summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@suse.com>2011-09-19 19:09:19 -0400
committerKohei Yoshida <kohei.yoshida@suse.com>2011-09-19 19:56:16 -0400
commit0783e78de2ce265e19b739effbff80c37ee98576 (patch)
treee3f9b3c9c04db7f582a08889bf29353383a3f68f
parent5660bc7573f3529ae25d54867249045bb65d536b (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.hxx8
-rw-r--r--sc/inc/table.hxx41
-rw-r--r--sc/source/core/data/documen3.cxx20
-rw-r--r--sc/source/core/data/table6.cxx118
-rw-r--r--sc/source/ui/unoobj/cellsuno.cxx25
-rw-r--r--sc/source/ui/view/viewfun2.cxx17
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 ||