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 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 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].GetInputString( 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 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 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 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 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 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 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 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 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 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