xref: /AOO41X/main/sc/source/core/data/table6.cxx (revision 133efdc14496caaf90c15e33666ab1c0c1e2fbea) !
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 // INCLUDE ---------------------------------------------------------------
28 
29 #include <com/sun/star/i18n/TransliterationModules.hpp>
30 
31 #include <unotools/textsearch.hxx>
32 #include <svl/srchitem.hxx>
33 #include <editeng/editobj.hxx>
34 
35 #include "table.hxx"
36 #include "collect.hxx"
37 #include "cell.hxx"
38 #include "document.hxx"
39 #include "stlpool.hxx"
40 #include "markdata.hxx"
41 #include "editutil.hxx"
42 #include "detfunc.hxx"
43 #include "postit.hxx"
44 
45 //--------------------------------------------------------------------------
46 
47 
lcl_GetTextWithBreaks(const ScEditCell & rCell,ScDocument * pDoc,String & rVal)48 sal_Bool lcl_GetTextWithBreaks( const ScEditCell& rCell, ScDocument* pDoc, String& rVal )
49 {
50     //  sal_True = more than 1 paragraph
51 
52     const EditTextObject* pData = NULL;
53     rCell.GetData( pData );
54     EditEngine& rEngine = pDoc->GetEditEngine();
55     rEngine.SetText( *pData );
56     rVal = rEngine.GetText( LINEEND_LF );
57     return ( rEngine.GetParagraphCount() > 1 );
58 }
59 
SearchCell(const SvxSearchItem & rSearchItem,SCCOL nCol,SCROW nRow,const ScMarkData & rMark,String & rUndoStr,ScDocument * pUndoDoc)60 sal_Bool ScTable::SearchCell(const SvxSearchItem& rSearchItem, SCCOL nCol, SCROW nRow,
61                             const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc)
62 {
63     sal_Bool    bFound = sal_False;
64     sal_Bool    bDoSearch = sal_True;
65     sal_Bool    bDoBack = rSearchItem.GetBackward();
66 
67     String  aString;
68     ScBaseCell* pCell;
69     if (rSearchItem.GetSelection())
70         bDoSearch = rMark.IsCellMarked(nCol, nRow);
71     if ( bDoSearch && ((pCell = aCol[nCol].GetCell( nRow )) != NULL) )
72     {
73         sal_Bool bMultiLine = sal_False;
74         CellType eCellType = pCell->GetCellType();
75         switch (rSearchItem.GetCellType())
76         {
77             case SVX_SEARCHIN_FORMULA:
78             {
79                 if ( eCellType == CELLTYPE_FORMULA )
80                     ((ScFormulaCell*)pCell)->GetFormula( aString,
81                        formula::FormulaGrammar::GRAM_NATIVE_UI);
82                 else if ( eCellType == CELLTYPE_EDIT )
83                     bMultiLine = lcl_GetTextWithBreaks(
84                         *(const ScEditCell*)pCell, pDocument, aString );
85                 else
86                     aCol[nCol].GetInputString( nRow, aString );
87             }
88             break;
89             case SVX_SEARCHIN_VALUE:
90                 if ( eCellType == CELLTYPE_EDIT )
91                     bMultiLine = lcl_GetTextWithBreaks(
92                         *(const ScEditCell*)pCell, pDocument, aString );
93                 else
94                     aCol[nCol].GetString( nRow, aString );
95                 break;
96             case SVX_SEARCHIN_NOTE:
97                 {
98                     if(const ScPostIt* pNote = pCell->GetNote())
99                     {
100                         aString = pNote->GetText();
101                         bMultiLine = pNote->HasMultiLineText();
102                     }
103                 }
104                 break;
105             default:
106                 break;
107         }
108         xub_StrLen nStart = 0;
109         xub_StrLen nEnd = aString.Len();
110         ::com::sun::star::util::SearchResult aSearchResult;
111         if (pSearchText)
112         {
113             if ( bDoBack )
114             {
115                 xub_StrLen nTemp=nStart; nStart=nEnd; nEnd=nTemp;
116                 bFound = (sal_Bool)(pSearchText->SearchBkwrd(aString, &nStart, &nEnd, &aSearchResult));
117                 // change results to definition before 614:
118                 --nEnd;
119             }
120             else
121             {
122                 bFound = (sal_Bool)(pSearchText->SearchFrwrd(aString, &nStart, &nEnd, &aSearchResult));
123                 // change results to definition before 614:
124                 --nEnd;
125             }
126 
127             if (bFound && rSearchItem.GetWordOnly())
128                 bFound = (nStart == 0 && nEnd == aString.Len() - 1);
129         }
130         else
131         {
132             DBG_ERROR("pSearchText == NULL");
133             return bFound;
134         }
135 
136         sal_uInt8 cMatrixFlag = MM_NONE;
137         if ( bFound &&
138             ( (rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE)
139             ||(rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL) ) &&
140                 // #60558# Matrix nicht zerreissen, nur Matrixformel ersetzen
141                 !( (eCellType == CELLTYPE_FORMULA &&
142                 ((cMatrixFlag = ((ScFormulaCell*)pCell)->GetMatrixFlag()) == MM_REFERENCE))
143                 // kein UndoDoc => Matrix nicht wiederherstellbar => nicht ersetzen
144                 || (cMatrixFlag != MM_NONE && !pUndoDoc) )
145             )
146         {
147             if ( cMatrixFlag == MM_NONE && rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE )
148                 rUndoStr = aString;
149             else if (pUndoDoc)
150             {
151                 ScAddress aAdr( nCol, nRow, nTab );
152                 ScBaseCell* pUndoCell = pCell->CloneWithoutNote( *pUndoDoc );
153                 pUndoDoc->PutCell( aAdr, pUndoCell);
154             }
155             sal_Bool bRepeat = !rSearchItem.GetWordOnly();
156             do
157             {
158                 //  wenn der gefundene Text leer ist, nicht weitersuchen,
159                 //  sonst wuerde man nie mehr aufhoeren (#35410#)
160                 if ( nEnd < nStart || nEnd == STRING_MAXLEN )
161                     bRepeat = sal_False;
162 
163                 String sReplStr = rSearchItem.GetReplaceString();
164                 if (rSearchItem.GetRegExp())
165                 {
166                     String sFndStr = aString.Copy(nStart, nEnd-nStart+1);
167                     pSearchText->ReplaceBackReferences( sReplStr, aString, aSearchResult );
168                     aString.Erase(nStart, nEnd-nStart+1);
169                     aString.Insert(sReplStr, nStart);
170                 }
171                 else
172                 {
173                     aString.Erase(nStart, nEnd - nStart + 1);
174                     aString.Insert(rSearchItem.GetReplaceString(), nStart);
175                 }
176 
177                         //  Indizes anpassen
178                 if (bDoBack)
179                 {
180                     nEnd = nStart;
181                     nStart = 0;
182                 }
183                 else
184                 {
185                     nStart = sal::static_int_cast<xub_StrLen>( nStart + sReplStr.Len() );
186                     nEnd = aString.Len();
187                 }
188 
189                         //  weitersuchen ?
190                 if (bRepeat)
191                 {
192                     if ( rSearchItem.GetCommand() != SVX_SEARCHCMD_REPLACE_ALL || nStart >= nEnd )
193                         bRepeat = sal_False;
194                     else if (bDoBack)
195                     {
196                         xub_StrLen nTemp=nStart; nStart=nEnd; nEnd=nTemp;
197                         bRepeat = ((sal_Bool)(pSearchText->SearchBkwrd(aString, &nStart, &nEnd, &aSearchResult)));
198                         // change results to definition before 614:
199                         --nEnd;
200                     }
201                     else
202                     {
203                         bRepeat = ((sal_Bool)(pSearchText->SearchFrwrd(aString, &nStart, &nEnd, &aSearchResult)));
204                         // change results to definition before 614:
205                         --nEnd;
206                     }
207                 }
208             }
209             while (bRepeat);
210             if (rSearchItem.GetCellType() == SVX_SEARCHIN_NOTE)
211             {
212                 // NB: rich text format is lost.
213                 // This is also true of Cells.
214                 if( ScPostIt* pNote = pCell->GetNote() )
215                     pNote->SetText( ScAddress( nCol, nRow, nTab ), aString );
216             }
217             else if ( cMatrixFlag != MM_NONE )
218             {   // #60558# Matrix nicht zerreissen
219                 if ( aString.Len() > 2 )
220                 {   // {} raus, erst hier damit auch "{=" durch "{=..." ersetzt werden kann
221                     if ( aString.GetChar( aString.Len()-1 ) == '}' )
222                         aString.Erase( aString.Len()-1, 1 );
223                     if ( aString.GetChar(0) == '{' )
224                         aString.Erase( 0, 1 );
225                 }
226                 ScAddress aAdr( nCol, nRow, nTab );
227                 ScFormulaCell* pFCell = new ScFormulaCell( pDocument, aAdr,
228                     aString,formula::FormulaGrammar::GRAM_NATIVE_UI, cMatrixFlag );
229                 SCCOL nMatCols;
230                 SCROW nMatRows;
231                 ((ScFormulaCell*)pCell)->GetMatColsRows( nMatCols, nMatRows );
232                 pFCell->SetMatColsRows( nMatCols, nMatRows );
233                 aCol[nCol].Insert( nRow, pFCell );
234             }
235             else if ( bMultiLine && aString.Search('\n') != STRING_NOTFOUND )
236                 PutCell( nCol, nRow, new ScEditCell( aString, pDocument ) );
237             else
238                 aCol[nCol].SetString(nRow, nTab, aString);
239             // pCell is invalid now (deleted)
240         }
241     }
242     return bFound;
243 }
244 
Search(const SvxSearchItem & rSearchItem,SCCOL & rCol,SCROW & rRow,const ScMarkData & rMark,String & rUndoStr,ScDocument * pUndoDoc)245 sal_Bool ScTable::Search(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
246                         const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc)
247 {
248     sal_Bool bFound = sal_False;
249     sal_Bool bAll =  (rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND_ALL)
250                ||(rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL);
251     SCCOL nCol = rCol;
252     SCROW nRow = rRow;
253     SCCOL nLastCol;
254     SCROW nLastRow;
255     GetLastDataPos(nLastCol, nLastRow);
256     if (!bAll && rSearchItem.GetBackward())
257     {
258         nCol = Min(nCol, (SCCOL)(nLastCol + 1));
259         nRow = Min(nRow, (SCROW)(nLastRow + 1));
260         if (rSearchItem.GetRowDirection())
261         {
262             nCol--;
263             while (!bFound && ((SCsROW)nRow >= 0))
264             {
265                 while (!bFound && ((SCsCOL)nCol >= 0))
266                 {
267                     bFound = SearchCell(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc);
268                     if (!bFound)
269                     {
270                         sal_Bool bIsEmpty;
271                         do
272                         {
273                             nCol--;
274                             if ((SCsCOL)nCol >= 0)
275                                 bIsEmpty = aCol[nCol].IsEmptyData();
276                             else
277                                 bIsEmpty = sal_True;
278                         }
279                         while (((SCsCOL)nCol >= 0) && bIsEmpty);
280                     }
281                 }
282                 if (!bFound)
283                 {
284                     nCol = nLastCol;
285                     nRow--;
286                 }
287             }
288         }
289         else
290         {
291             nRow--;
292             while (!bFound && ((SCsCOL)nCol >= 0))
293             {
294                 while (!bFound && ((SCsROW)nRow >= 0))
295                 {
296                     bFound = SearchCell(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc);
297                     if (!bFound)
298                     {
299                          if (!aCol[nCol].GetPrevDataPos(nRow))
300                             nRow = -1;
301                     }
302                 }
303                 if (!bFound)
304                 {
305                     sal_Bool bIsEmpty;
306                     nRow = nLastRow;
307                     do
308                     {
309                         nCol--;
310                         if ((SCsCOL)nCol >= 0)
311                             bIsEmpty = aCol[nCol].IsEmptyData();
312                         else
313                             bIsEmpty = sal_True;
314                     }
315                     while (((SCsCOL)nCol >= 0) && bIsEmpty);
316                 }
317             }
318         }
319     }
320     else
321     {
322         if (!bAll && rSearchItem.GetRowDirection())
323         {
324             nCol++;
325             while (!bFound && (nRow <= nLastRow))
326             {
327                 while (!bFound && (nCol <= nLastCol))
328                 {
329                     bFound = SearchCell(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc);
330                     if (!bFound)
331                     {
332                         nCol++;
333                         while ((nCol <= nLastCol) && aCol[nCol].IsEmptyData()) nCol++;
334                     }
335                 }
336                 if (!bFound)
337                 {
338                     nCol = 0;
339                     nRow++;
340                 }
341             }
342         }
343         else
344         {
345             nRow++;
346             while (!bFound && (nCol <= nLastCol))
347             {
348                 while (!bFound && (nRow <= nLastRow))
349                 {
350                     bFound = SearchCell(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc);
351                     if (!bFound)
352                     {
353                          if (!aCol[nCol].GetNextDataPos(nRow))
354                             nRow = MAXROW + 1;
355                     }
356                 }
357                 if (!bFound)
358                 {
359                     nRow = 0;
360                     nCol++;
361                     while ((nCol <= nLastCol) && aCol[nCol].IsEmptyData()) nCol++;
362                 }
363             }
364         }
365     }
366     if (bFound)
367     {
368         rCol = nCol;
369         rRow = nRow;
370     }
371     return bFound;
372 }
373 
SearchAll(const SvxSearchItem & rSearchItem,ScMarkData & rMark,String & rUndoStr,ScDocument * pUndoDoc)374 sal_Bool ScTable::SearchAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
375                         String& rUndoStr, ScDocument* pUndoDoc)
376 {
377     sal_Bool bFound = sal_True;
378     SCCOL nCol = 0;
379     SCROW nRow = -1;
380 
381     ScMarkData aNewMark( rMark );   // Tabellen-Markierungen kopieren
382     aNewMark.ResetMark();
383     do
384     {
385         bFound = Search(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc);
386         if (bFound)
387             aNewMark.SetMultiMarkArea( ScRange( nCol, nRow, nTab ) );
388     }
389     while (bFound);
390 
391     rMark = aNewMark;       //  Markierung kopieren
392                             //! pro Tabelle
393 
394     return (aNewMark.IsMultiMarked());
395 }
396 
Replace(const SvxSearchItem & rSearchItem,SCCOL & rCol,SCROW & rRow,const ScMarkData & rMark,String & rUndoStr,ScDocument * pUndoDoc)397 sal_Bool ScTable::Replace(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
398                         const ScMarkData& rMark, String& rUndoStr, ScDocument* pUndoDoc)
399 {
400     sal_Bool bFound = sal_False;
401     SCCOL nCol = rCol;
402     SCROW nRow = rRow;
403     if (rSearchItem.GetBackward())
404     {
405         if (rSearchItem.GetRowDirection())
406             nCol += 1;
407         else
408             nRow += 1;
409     }
410     else
411     {
412         if (rSearchItem.GetRowDirection())
413             nCol -= 1;
414         else
415             nRow -= 1;
416     }
417     bFound = Search(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc);
418     if (bFound)
419     {
420         rCol = nCol;
421         rRow = nRow;
422     }
423     return bFound;
424 }
425 
ReplaceAll(const SvxSearchItem & rSearchItem,ScMarkData & rMark,String & rUndoStr,ScDocument * pUndoDoc)426 sal_Bool ScTable::ReplaceAll(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
427                             String& rUndoStr, ScDocument* pUndoDoc)
428 {
429     sal_Bool bOldDouble = ScColumn::bDoubleAlloc;       // sollte immer sal_False sein?
430     DBG_ASSERT(!bOldDouble,"bDoubleAlloc ???");
431     ScColumn::bDoubleAlloc = sal_True;                  // fuer Undo-Doc
432 
433     sal_Bool bFound = sal_True;
434     SCCOL nCol = 0;
435     SCROW nRow = -1;
436 
437     ScMarkData aNewMark( rMark );   // Tabellen-Markierungen kopieren
438     aNewMark.ResetMark();
439     do
440     {
441         bFound = Search(rSearchItem, nCol, nRow, rMark, rUndoStr, pUndoDoc);
442         if (bFound)
443             aNewMark.SetMultiMarkArea( ScRange( nCol, nRow, nTab ) );
444     }
445     while (bFound);
446 
447     ScColumn::bDoubleAlloc = bOldDouble;
448 
449     rMark = aNewMark;       //  Markierung kopieren
450                             //! pro Tabelle
451 
452     return (aNewMark.IsMultiMarked());
453 }
454 
SearchStyle(const SvxSearchItem & rSearchItem,SCCOL & rCol,SCROW & rRow,ScMarkData & rMark)455 sal_Bool ScTable::SearchStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
456                             ScMarkData& rMark)
457 {
458     const ScStyleSheet* pSearchStyle = (const ScStyleSheet*)
459                                         pDocument->GetStyleSheetPool()->Find(
460                                         rSearchItem.GetSearchString(), SFX_STYLE_FAMILY_PARA );
461 
462     SCsCOL nCol = rCol;
463     SCsROW nRow = rRow;
464     sal_Bool bFound = sal_False;
465 
466     sal_Bool bSelect = rSearchItem.GetSelection();
467     sal_Bool bRows = rSearchItem.GetRowDirection();
468     sal_Bool bBack = rSearchItem.GetBackward();
469     short nAdd = bBack ? -1 : 1;
470 
471     if (bRows)                                      // zeilenweise
472     {
473         nRow += nAdd;
474         do
475         {
476             SCsROW nNextRow = aCol[nCol].SearchStyle( nRow, pSearchStyle, bBack, bSelect, rMark );
477             if (!ValidRow(nNextRow))
478             {
479                 nRow = bBack ? MAXROW : 0;
480                 nCol = sal::static_int_cast<SCsCOL>( nCol + nAdd );
481             }
482             else
483             {
484                 nRow = nNextRow;
485                 bFound = sal_True;
486             }
487         }
488         while (!bFound && ValidCol(nCol));
489     }
490     else                                            // spaltenweise
491     {
492         SCsROW nNextRows[MAXCOLCOUNT];
493         SCsCOL i;
494         for (i=0; i<=MAXCOL; i++)
495         {
496             SCsROW nSRow = nRow;
497             if (bBack)  { if (i>=nCol) --nSRow; }
498             else        { if (i<=nCol) ++nSRow; }
499             nNextRows[i] = aCol[i].SearchStyle( nSRow, pSearchStyle, bBack, bSelect, rMark );
500         }
501         if (bBack)                          // rueckwaerts
502         {
503             nRow = -1;
504             for (i=MAXCOL; i>=0; i--)
505                 if (nNextRows[i]>nRow)
506                 {
507                     nCol = i;
508                     nRow = nNextRows[i];
509                     bFound = sal_True;
510                 }
511         }
512         else                                // vorwaerts
513         {
514             nRow = MAXROW+1;
515             for (i=0; i<=MAXCOL; i++)
516                 if (nNextRows[i]<nRow)
517                 {
518                     nCol = i;
519                     nRow = nNextRows[i];
520                     bFound = sal_True;
521                 }
522         }
523     }
524 
525     if (bFound)
526     {
527         rCol = (SCCOL) nCol;
528         rRow = (SCROW) nRow;
529     }
530     return bFound;
531 }
532 
533 //!     einzelnes Pattern fuer Undo zurueckgeben
534 
ReplaceStyle(const SvxSearchItem & rSearchItem,SCCOL & rCol,SCROW & rRow,ScMarkData & rMark,sal_Bool bIsUndo)535 sal_Bool ScTable::ReplaceStyle(const SvxSearchItem& rSearchItem, SCCOL& rCol, SCROW& rRow,
536                            ScMarkData& rMark, sal_Bool bIsUndo)
537 {
538     sal_Bool bRet;
539     if (bIsUndo)
540         bRet = sal_True;
541     else
542         bRet = SearchStyle(rSearchItem, rCol, rRow, rMark);
543     if (bRet)
544     {
545         const ScStyleSheet* pReplaceStyle = (const ScStyleSheet*)
546                                         pDocument->GetStyleSheetPool()->Find(
547                                         rSearchItem.GetReplaceString(), SFX_STYLE_FAMILY_PARA );
548 
549         if (pReplaceStyle)
550             ApplyStyle( rCol, rRow, *pReplaceStyle );
551         else
552         {
553             DBG_ERROR("pReplaceStyle==0");
554         }
555     }
556 
557     return bRet;
558 }
559 
SearchAllStyle(const SvxSearchItem & rSearchItem,ScMarkData & rMark)560 sal_Bool ScTable::SearchAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark)
561 {
562     const ScStyleSheet* pSearchStyle = (const ScStyleSheet*)
563                                         pDocument->GetStyleSheetPool()->Find(
564                                         rSearchItem.GetSearchString(), SFX_STYLE_FAMILY_PARA );
565     sal_Bool bSelect = rSearchItem.GetSelection();
566     sal_Bool bBack = rSearchItem.GetBackward();
567 
568     ScMarkData aNewMark( rMark );   // Tabellen-Markierungen kopieren
569     aNewMark.ResetMark();
570     for (SCCOL i=0; i<=MAXCOL; i++)
571     {
572         sal_Bool bFound = sal_True;
573         SCsROW nRow = 0;
574         SCsROW nEndRow;
575         while (bFound && nRow <= MAXROW)
576         {
577             bFound = aCol[i].SearchStyleRange( nRow, nEndRow, pSearchStyle, bBack, bSelect, rMark );
578             if (bFound)
579             {
580                 if (nEndRow<nRow)
581                 {
582                     SCsROW nTemp = nRow;
583                     nRow = nEndRow;
584                     nEndRow = nTemp;
585                 }
586                 aNewMark.SetMultiMarkArea( ScRange( i,nRow,nTab, i,nEndRow,nTab ) );
587                 nRow = nEndRow + 1;
588             }
589         }
590     }
591 
592     rMark = aNewMark;       //  Markierung kopieren
593                             //! pro Tabelle
594 
595     return (aNewMark.IsMultiMarked());
596 }
597 
ReplaceAllStyle(const SvxSearchItem & rSearchItem,ScMarkData & rMark,ScDocument * pUndoDoc)598 sal_Bool ScTable::ReplaceAllStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark,
599                                 ScDocument* pUndoDoc)
600 {
601     sal_Bool bRet = SearchAllStyle(rSearchItem, rMark);
602     if (bRet)
603     {
604         const ScStyleSheet* pReplaceStyle = (const ScStyleSheet*)
605                                         pDocument->GetStyleSheetPool()->Find(
606                                         rSearchItem.GetReplaceString(), SFX_STYLE_FAMILY_PARA );
607 
608         if (pReplaceStyle)
609         {
610             if (pUndoDoc)
611                 pDocument->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab,
612                                             IDF_ATTRIB, sal_True, pUndoDoc, &rMark );
613             ApplySelectionStyle( *pReplaceStyle, rMark );
614         }
615         else
616         {
617             DBG_ERROR("pReplaceStyle==0");
618         }
619     }
620 
621     return bRet;
622 }
623 
SearchAndReplace(const SvxSearchItem & rSearchItem,SCCOL & rCol,SCROW & rRow,ScMarkData & rMark,String & rUndoStr,ScDocument * pUndoDoc)624 sal_Bool ScTable::SearchAndReplace(const SvxSearchItem& rSearchItem,
625                                 SCCOL& rCol, SCROW& rRow, ScMarkData& rMark,
626                                 String& rUndoStr, ScDocument* pUndoDoc)
627 {
628     sal_uInt16 nCommand = rSearchItem.GetCommand();
629     sal_Bool bFound = sal_False;
630     if ( ValidColRow(rCol, rRow) ||
631          ((nCommand == SVX_SEARCHCMD_FIND || nCommand == SVX_SEARCHCMD_REPLACE) &&
632            (((rCol == MAXCOLCOUNT || rCol == -1) && VALIDROW(rRow)) ||
633             ((rRow == MAXROWCOUNT || rRow == -1) && VALIDCOL(rCol))
634            )
635          )
636        )
637     {
638         sal_Bool bStyles = rSearchItem.GetPattern();
639         if (bStyles)
640         {
641             if (nCommand == SVX_SEARCHCMD_FIND)
642                 bFound = SearchStyle(rSearchItem, rCol, rRow, rMark);
643             else if (nCommand == SVX_SEARCHCMD_REPLACE)
644                 bFound = ReplaceStyle(rSearchItem, rCol, rRow, rMark, sal_False);
645             else if (nCommand == SVX_SEARCHCMD_FIND_ALL)
646                 bFound = SearchAllStyle(rSearchItem, rMark);
647             else if (nCommand == SVX_SEARCHCMD_REPLACE_ALL)
648                 bFound = ReplaceAllStyle(rSearchItem, rMark, pUndoDoc);
649         }
650         else
651         {
652             //  SearchParam no longer needed - SearchOptions contains all settings
653             com::sun::star::util::SearchOptions aSearchOptions = rSearchItem.GetSearchOptions();
654             aSearchOptions.Locale = *ScGlobal::GetLocale();
655 
656             //  #107259# reflect UseAsianOptions flag in SearchOptions
657             //  (use only ignore case and width if asian options are disabled).
658             //  This is also done in SvxSearchDialog CommandHdl, but not in API object.
659             if ( !rSearchItem.IsUseAsianOptions() )
660                 aSearchOptions.transliterateFlags &=
661                     ( com::sun::star::i18n::TransliterationModules_IGNORE_CASE |
662                       com::sun::star::i18n::TransliterationModules_IGNORE_WIDTH );
663 
664             pSearchText = new utl::TextSearch( aSearchOptions );
665 
666             if (nCommand == SVX_SEARCHCMD_FIND)
667                 bFound = Search(rSearchItem, rCol, rRow, rMark, rUndoStr, pUndoDoc);
668             else if (nCommand == SVX_SEARCHCMD_FIND_ALL)
669                 bFound = SearchAll(rSearchItem, rMark, rUndoStr, pUndoDoc);
670             else if (nCommand == SVX_SEARCHCMD_REPLACE)
671                 bFound = Replace(rSearchItem, rCol, rRow, rMark, rUndoStr, pUndoDoc);
672             else if (nCommand == SVX_SEARCHCMD_REPLACE_ALL)
673                 bFound = ReplaceAll(rSearchItem, rMark, rUndoStr, pUndoDoc);
674 
675             delete pSearchText;
676             pSearchText = NULL;
677         }
678     }
679     return bFound;
680 }
681 
682 
683 
684 
685 
686 
687