[Libreoffice-commits] .: 3 commits - sc/inc sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Mon Sep 19 16:56:29 PDT 2011


 sc/inc/document.hxx              |    8 +-
 sc/inc/table.hxx                 |   45 +++++++-------
 sc/source/core/data/documen3.cxx |   20 ++----
 sc/source/core/data/markdata.cxx |    2 
 sc/source/core/data/table6.cxx   |  122 ++++++++++++++++++---------------------
 sc/source/ui/unoobj/cellsuno.cxx |   25 ++++---
 sc/source/ui/view/viewfun2.cxx   |   17 ++++-
 7 files changed, 124 insertions(+), 115 deletions(-)

New commits:
commit 0783e78de2ce265e19b739effbff80c37ee98576
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Mon Sep 19 19:09:19 2011 -0400

    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.

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 77439d1..ca98063 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 347b9cc..9cd3c57 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 2825e7f..2a16408 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 e53abba..4edb697 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 52587e5..2450ee8 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 506f148..88196cb 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 ||
commit 5660bc7573f3529ae25d54867249045bb65d536b
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Mon Sep 19 17:28:52 2011 -0400

    Pass as const reference where possible & indent fix.

diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index efe483d..347b9cc 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -819,9 +819,9 @@ 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, String& rUndoStr, ScDocument* pUndoDoc);
     bool        Search(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
-                        const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc);
+                       const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc);
     bool        SearchAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
                         String& rUndoStr, ScDocument* pUndoDoc);
     bool        Replace(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
@@ -830,9 +830,9 @@ private:
                             String& rUndoStr, ScDocument* pUndoDoc);
 
     bool        SearchStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
-                                ScMarkData& rMark);
+                            const ScMarkData& rMark);
     bool        ReplaceStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
-                                ScMarkData& rMark, bool bIsUndo);
+                             const ScMarkData& rMark, bool bIsUndo);
     bool        SearchAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark);
     bool        ReplaceAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
                                 ScDocument* pUndoDoc);
diff --git a/sc/source/core/data/table6.cxx b/sc/source/core/data/table6.cxx
index 963a75c..e53abba 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, String& 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, String& rUndoStr, ScDocument* pUndoDoc)
 {
     bool bFound = false;
     bool bAll =  (rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND_ALL)
@@ -458,7 +458,7 @@ bool ScTable::SearchAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
 }
 
 bool ScTable::Replace(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
-                        const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc)
+                      const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc)
 {
     bool bFound = false;
     SCCOL nCol = rCol;
@@ -516,7 +516,7 @@ bool ScTable::ReplaceAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
 }
 
 bool ScTable::SearchStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
-                            ScMarkData& rMark)
+                          const ScMarkData& rMark)
 {
     const ScStyleSheet* pSearchStyle = (const ScStyleSheet*)
                                         pDocument->GetStyleSheetPool()->Find(
@@ -596,7 +596,7 @@ bool ScTable::SearchStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW&
 //!     einzelnes Pattern fuer Undo zurueckgeben
 
 bool ScTable::ReplaceStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
-                           ScMarkData& rMark, bool bIsUndo)
+                           const ScMarkData& rMark, bool bIsUndo)
 {
     bool bRet;
     if (bIsUndo)
commit 2bb34a2f93e2c2ec46f48ed736feab9827dbe7c8
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Mon Sep 19 17:17:47 2011 -0400

    Removed an unnecessary anonymous temporary object.

diff --git a/sc/source/core/data/markdata.cxx b/sc/source/core/data/markdata.cxx
index 892d1f6..29d0470 100644
--- a/sc/source/core/data/markdata.cxx
+++ b/sc/source/core/data/markdata.cxx
@@ -82,7 +82,7 @@ ScMarkData& ScMarkData::operator=(const ScMarkData& rData)
     bMarking     = rData.bMarking;
     bMarkIsNeg   = rData.bMarkIsNeg;
 
-    maTabMarked = std::set<SCTAB>(rData.maTabMarked);
+    maTabMarked = rData.maTabMarked;
 
     if (rData.pMultiSel)
     {


More information about the Libreoffice-commits mailing list