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_sw.hxx" 26 27 28 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers 29 #include <hintids.hxx> 30 #include <com/sun/star/util/SearchOptions.hpp> 31 #include <svl/cjkoptions.hxx> 32 #include <svl/ctloptions.hxx> 33 #include <svx/pageitem.hxx> 34 #include <svl/whiter.hxx> 35 #include <sfx2/dispatch.hxx> 36 #include <svl/stritem.hxx> 37 #include <svtools/txtcmp.hxx> 38 #include <svl/itempool.hxx> 39 #include <svl/eitem.hxx> 40 #include <svl/srchitem.hxx> 41 #include <sfx2/request.hxx> 42 #include <svx/srchdlg.hxx> 43 #include <vcl/msgbox.hxx> 44 #include <vcl/wrkwin.hxx> 45 #include "editeng/unolingu.hxx" 46 #include <swmodule.hxx> 47 #include <swwait.hxx> 48 #include <workctrl.hxx> 49 #include <view.hxx> 50 #include <wrtsh.hxx> 51 #include <swundo.hxx> // fuer Undo-Ids 52 #include <uitool.hxx> 53 #include <cmdid.h> 54 #include <docsh.hxx> 55 56 #include <view.hrc> 57 #include <SwRewriter.hxx> 58 #include <comcore.hrc> 59 60 #include "PostItMgr.hxx" 61 62 using namespace com::sun::star; 63 using namespace ::com::sun::star::i18n; 64 using namespace ::com::sun::star::lang; 65 using namespace ::com::sun::star::util; 66 using namespace ::com::sun::star::i18n; 67 68 #define SRCH_ATTR_OFF 0 69 #define SRCH_ATTR_ON 1 70 #define SRCH_ATTR_SET 2 71 72 /*-------------------------------------------------------------------- 73 Beschreibung: Search Parameter 74 --------------------------------------------------------------------*/ 75 76 struct SwSearchOptions 77 { 78 SwDocPositions eStart, eEnd; 79 sal_Bool bDontWrap; 80 81 SwSearchOptions( SwWrtShell* pSh, sal_Bool bBackward ); 82 }; 83 84 85 inline Window* GetParentWindow( SvxSearchDialog* pSrchDlg ) 86 { 87 Window* pWin; 88 if( pSrchDlg && pSrchDlg->IsVisible() ) 89 pWin = LAYOUT_THIS_WINDOW (pSrchDlg); 90 else 91 pWin = 0; 92 return pWin; 93 } 94 95 96 /*-----------------12.04.97 13:04------------------- 97 98 --------------------------------------------------*/ 99 100 101 void SwView::ExecSearch(SfxRequest& rReq, sal_Bool bNoMessage) 102 { 103 const SfxItemSet* pArgs = rReq.GetArgs(); 104 const SfxPoolItem* pItem = 0; 105 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 106 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId); 107 sal_Bool bQuiet = sal_False; 108 if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_SEARCH_QUIET, sal_False, &pItem)) 109 bQuiet = ((const SfxBoolItem*) pItem)->GetValue(); 110 111 sal_Bool bApi = bQuiet | bNoMessage; 112 113 sal_uInt16 nSlot = rReq.GetSlot(); 114 if (nSlot == FN_REPEAT_SEARCH && !pSrchItem) 115 { 116 if(bApi) 117 { 118 rReq.SetReturnValue(SfxBoolItem(nSlot, sal_False)); 119 nSlot = 0; 120 } 121 } 122 if( pWrtShell->IsBlockMode() ) 123 pWrtShell->LeaveBlockMode(); 124 switch (nSlot) 125 { 126 // erstmal Nichts tun 127 case SID_SEARCH_ITEM: 128 { 129 delete pSrchItem; 130 pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone(); 131 } 132 break; 133 134 case FID_SEARCH_ON: 135 bJustOpened = sal_True; 136 GetViewFrame()->GetBindings().Invalidate(SID_SEARCH_ITEM); 137 break; 138 139 case FID_SEARCH_OFF: 140 if(pArgs) 141 { 142 // Dialog abmelden 143 delete pSrchItem; 144 pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone(); 145 146 DELETEZ( pSrchList ); 147 DELETEZ( pReplList ); 148 149 if ( pWrp ) 150 { 151 pSrchDlg = static_cast <SvxSearchDialog*> (pWrp->getDialog ()); 152 // die Search / Replace -Items merken wir uns 153 const SearchAttrItemList* pList = pSrchDlg->GetSearchItemList(); 154 if( pList && pList->Count() ) 155 pSrchList = new SearchAttrItemList( *pList ); 156 157 if( 0 != (pList = pSrchDlg->GetReplaceItemList() ) && 158 pList->Count() ) 159 pReplList = new SearchAttrItemList( *pList ); 160 } 161 } 162 break; 163 164 case FN_REPEAT_SEARCH: 165 case FID_SEARCH_NOW: 166 { 167 { 168 if(FID_SEARCH_NOW == nSlot && !rReq.IsAPI()) 169 SwView::SetMoveType(NID_SRCH_REP); 170 if ( pWrp ) 171 { 172 pSrchDlg = static_cast <SvxSearchDialog*> (pWrp->getDialog ()); 173 } 174 else 175 pSrchDlg = 0; 176 } 177 178 if (pSrchDlg) 179 { 180 DELETEZ( pSrchList ); 181 DELETEZ( pReplList ); 182 183 const SearchAttrItemList* pList = pSrchDlg->GetSearchItemList(); 184 if( pList && pList->Count() ) 185 pSrchList = new SearchAttrItemList( *pList ); 186 187 if( 0 != (pList = pSrchDlg->GetReplaceItemList() ) && 188 pList->Count() ) 189 pReplList = new SearchAttrItemList( *pList ); 190 } 191 192 if (nSlot == FN_REPEAT_SEARCH) 193 { 194 ASSERT(pSrchItem, "Search-Item fehlt"); 195 if( !pSrchItem ) 196 pSrchItem = new SvxSearchItem(SID_SEARCH_ITEM); 197 } 198 else 199 { 200 // SearchItem aus Request besorgen 201 ASSERT(pArgs, "Args fehlen"); 202 if ( pArgs ) 203 { 204 delete pSrchItem; 205 pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone(); 206 } 207 } 208 switch (pSrchItem->GetCommand()) 209 { 210 case SVX_SEARCHCMD_FIND: 211 { 212 sal_Bool bRet = SearchAndWrap(bApi); 213 if( bRet ) 214 Scroll(pWrtShell->GetCharRect().SVRect()); 215 rReq.SetReturnValue(SfxBoolItem(nSlot, bRet)); 216 } 217 break; 218 case SVX_SEARCHCMD_FIND_ALL: 219 { 220 sal_Bool bRet = SearchAll(); 221 if( !bRet ) 222 { 223 if( !bApi ) 224 { 225 Window* pParentWindow = GetParentWindow( pSrchDlg ); 226 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 227 } 228 bFound = sal_False; 229 } 230 rReq.SetReturnValue(SfxBoolItem(nSlot, bRet)); 231 } 232 break; 233 case SVX_SEARCHCMD_REPLACE: 234 { 235 236 // 1) Selektion ersetzen (nicht. wenn nur Attribute ersetzt 237 // werden sollen) 238 //JP 27.04.95: warum ? 239 // was ist, wenn man das gefundene nur attributieren will?? 240 241 sal_uInt16 nCmd = SVX_SEARCHCMD_FIND; 242 if( pSrchItem->GetReplaceString().Len() || 243 !pReplList ) 244 { 245 // Verhindern, dass - falls der Suchstring im 246 // Ersetzungsstring enthalten ist - der ersetzte String 247 // noch einmal gefunden wird. 248 249 sal_Bool bBack = pSrchItem->GetBackward(); 250 if (bBack) 251 pWrtShell->Push(); 252 String aReplace( pSrchItem->GetReplaceString() ); 253 SearchOptions aTmp( pSrchItem->GetSearchOptions() ); 254 String *pBackRef = ReplaceBackReferences( aTmp, pWrtShell->GetCrsr() ); 255 if( pBackRef ) 256 pSrchItem->SetReplaceString( *pBackRef ); 257 Replace(); 258 if( pBackRef ) 259 { 260 pSrchItem->SetReplaceString( aReplace ); 261 delete pBackRef; 262 } 263 if (bBack) 264 { 265 pWrtShell->Pop(); 266 pWrtShell->SwapPam(); 267 } 268 } 269 else if( pReplList ) 270 nCmd = SVX_SEARCHCMD_REPLACE; 271 272 // 2) Weiter suchen (ohne zu ersetzen!) 273 274 sal_uInt16 nOldCmd = pSrchItem->GetCommand(); 275 pSrchItem->SetCommand( nCmd ); 276 sal_Bool bRet = SearchAndWrap(bApi); 277 if( bRet ) 278 Scroll( pWrtShell->GetCharRect().SVRect()); 279 pSrchItem->SetCommand( nOldCmd ); 280 rReq.SetReturnValue(SfxBoolItem(nSlot, bRet)); 281 } 282 break; 283 284 case SVX_SEARCHCMD_REPLACE_ALL: 285 { 286 SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() ); 287 288 289 if( !pSrchItem->GetSelection() ) 290 { 291 // bestehende Selektionen aufheben, 292 // wenn nicht in selektierten Bereichen gesucht werden soll 293 (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False); 294 if( DOCPOS_START == aOpts.eEnd ) 295 pWrtShell->EndDoc(); 296 else 297 pWrtShell->SttDoc(); 298 } 299 300 bExtra = sal_False; 301 sal_uLong nFound; 302 303 { //Scope for SwWait-Object 304 SwWait aWait( *GetDocShell(), sal_True ); 305 pWrtShell->StartAllAction(); 306 nFound = FUNC_Search( aOpts ); 307 pWrtShell->EndAllAction(); 308 } 309 rReq.SetReturnValue(SfxBoolItem(nSlot, nFound != 0 && ULONG_MAX != nFound)); 310 if( !nFound ) 311 { 312 if( !bApi ) 313 { 314 Window* pParentWindow = GetParentWindow( pSrchDlg ); 315 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 316 } 317 bFound = sal_False; 318 return; 319 } 320 321 if( !bApi && ULONG_MAX != nFound) 322 { 323 String aText( SW_RES( STR_NB_REPLACED ) ); 324 const xub_StrLen nPos = aText.Search( String::CreateFromAscii("XX") ); 325 aText.Erase( nPos, 2 ); 326 aText.Insert( String::CreateFromInt32( nFound ), nPos ); 327 Window* pParentWindow = GetParentWindow( pSrchDlg ); 328 InfoBox( pParentWindow, aText ).Execute(); 329 } 330 } 331 break; 332 } 333 334 uno::Reference< frame::XDispatchRecorder > xRecorder = 335 GetViewFrame()->GetBindings().GetRecorder(); 336 //prevent additional dialogs in recorded macros 337 if ( xRecorder.is() ) 338 rReq.AppendItem(SfxBoolItem(SID_SEARCH_QUIET, sal_True)); 339 340 rReq.Done(); 341 } 342 break; 343 case FID_SEARCH_SEARCHSET: 344 case FID_SEARCH_REPLACESET: 345 { 346 static const sal_uInt16 aNormalAttr[] = 347 { 348 /* 0 */ RES_CHRATR_CASEMAP, RES_CHRATR_CASEMAP, 349 /* 2 */ RES_CHRATR_COLOR, RES_CHRATR_POSTURE, 350 /* 4 */ RES_CHRATR_SHADOWED, RES_CHRATR_WORDLINEMODE, 351 /* 6 */ RES_CHRATR_BLINK, RES_CHRATR_BLINK, 352 /* 8 */ RES_CHRATR_BACKGROUND, RES_CHRATR_BACKGROUND, 353 /*10 */ RES_CHRATR_ROTATE, RES_CHRATR_ROTATE, 354 /*12 */ RES_CHRATR_SCALEW, RES_CHRATR_RELIEF, 355 // insert position for CJK/CTL attributes! 356 /*14 */ RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE, 357 /*16 */ RES_PARATR_REGISTER, RES_PARATR_REGISTER, 358 /*18 */ RES_PARATR_VERTALIGN, RES_PARATR_VERTALIGN, 359 /*20 */ RES_LR_SPACE, RES_UL_SPACE, 360 /*22 */ SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, 361 /*24 */ 0 362 }; 363 364 static const sal_uInt16 aCJKAttr[] = 365 { 366 RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_WEIGHT, 367 RES_CHRATR_EMPHASIS_MARK, RES_CHRATR_TWO_LINES, 368 RES_PARATR_SCRIPTSPACE, RES_PARATR_FORBIDDEN_RULES 369 }; 370 static const sal_uInt16 aCTLAttr[] = 371 { 372 RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_WEIGHT 373 }; 374 375 SvUShorts aArr( 0, 16 ); 376 aArr.Insert( aNormalAttr, 377 sizeof( aNormalAttr ) / sizeof( aNormalAttr[0] ), 378 0 ); 379 if( SW_MOD()->GetCTLOptions().IsCTLFontEnabled() ) 380 aArr.Insert( aCTLAttr, 381 sizeof( aCTLAttr ) / sizeof( aCTLAttr[0] ), 382 14 ); 383 SvtCJKOptions aCJKOpt; 384 if( aCJKOpt.IsAnyEnabled() ) 385 aArr.Insert( aCJKAttr, 386 sizeof( aCJKAttr ) / sizeof( aCJKAttr[0] ), 387 14 ); 388 389 SfxItemSet aSet( pWrtShell->GetAttrPool(), aArr.GetData() ); 390 sal_uInt16 nWhich = SID_SEARCH_SEARCHSET; 391 392 if ( FID_SEARCH_REPLACESET == nSlot ) 393 { 394 nWhich = SID_SEARCH_REPLACESET; 395 396 if ( pReplList ) 397 { 398 pReplList->Get( aSet ); 399 DELETEZ( pReplList ); 400 } 401 } 402 else if ( pSrchList ) 403 { 404 pSrchList->Get( aSet ); 405 DELETEZ( pSrchList ); 406 } 407 rReq.SetReturnValue( SvxSetItem( nWhich, aSet ) ); 408 } 409 break; 410 default: 411 #ifdef DBG_UTIL 412 if(nSlot) 413 { 414 ByteString sStr( "nSlot: " ); 415 sStr += ByteString::CreateFromInt32( nSlot ); 416 sStr += " falscher Dispatcher (viewsrch.cxx)"; 417 DBG_ERROR( sStr.GetBuffer() ); 418 } 419 #endif 420 return; 421 } 422 } 423 424 425 sal_Bool SwView::SearchAndWrap(sal_Bool bApi) 426 { 427 SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() ); 428 429 // Startposition der Suche fuer WrapAround merken 430 // Start- / EndAction wegen vielleicht bestehender Selektionen 431 // aus 'Suche alle' 432 pWrtShell->StartAllAction(); 433 pWrtShell->Push(); 434 // falls in selektierten Bereichen gesucht werden soll, duerfen sie 435 // nicht aufgehoben werden 436 if (!pSrchItem->GetSelection()) 437 (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False); 438 439 SwWait *pWait = new SwWait( *GetDocShell(), sal_True ); 440 if( FUNC_Search( aOpts ) ) 441 { 442 bFound = sal_True; 443 if(pWrtShell->IsSelFrmMode()) 444 { 445 pWrtShell->UnSelectFrm(); 446 pWrtShell->LeaveSelFrmMode(); 447 } 448 pWrtShell->Pop(); 449 pWrtShell->EndAllAction(); 450 delete pWait; 451 return sal_True; 452 } 453 delete pWait, pWait = 0; 454 455 // Suchen in den Sonderbereichen, wenn keine 456 // Suche in Selektionen vorliegt. Bei Suche in Selektionen 457 // wird ohnehin in diesen Sonderbereichen gesucht 458 sal_Bool bHasSrchInOther = bExtra; 459 if (!pSrchItem->GetSelection() && !bExtra ) 460 { 461 bExtra = sal_True; 462 if( FUNC_Search( aOpts ) ) 463 { 464 bFound = sal_True; 465 pWrtShell->Pop(); 466 pWrtShell->EndAllAction(); 467 return sal_True; 468 } 469 bExtra = sal_False; 470 } 471 else 472 bExtra = !bExtra; 473 474 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 475 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId); 476 pSrchDlg = pWrp ? static_cast <SvxSearchDialog*> (pWrp->getDialog ()) : 0; 477 478 // falls Startposition am Dokumentende / -anfang 479 if (aOpts.bDontWrap) 480 { 481 pWrtShell->EndAllAction(); 482 if( !bApi ) 483 { 484 Window* pParentWindow = GetParentWindow( pSrchDlg ); 485 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 486 } 487 bFound = sal_False; 488 pWrtShell->Pop(); 489 return sal_False; 490 } 491 pWrtShell->EndAllAction(); 492 // noch mal mit WrapAround versuchen? 493 494 if( bApi || RET_NO == QueryBox( GetParentWindow( pSrchDlg ), 495 SW_RES( DOCPOS_START == aOpts.eEnd 496 ? MSG_SEARCH_START 497 : MSG_SEARCH_END ) 498 ).Execute() ) 499 { 500 bFound = sal_False; 501 pWrtShell->Pop(); 502 return sal_False; 503 } 504 pWrtShell->StartAllAction(); 505 pWrtShell->Pop(sal_False); 506 pWait = new SwWait( *GetDocShell(), sal_True ); 507 508 sal_Bool bSrchBkwrd = DOCPOS_START == aOpts.eEnd; 509 510 aOpts.eEnd = bSrchBkwrd ? DOCPOS_START : DOCPOS_END; 511 aOpts.eStart = bSrchBkwrd ? DOCPOS_END : DOCPOS_START; 512 513 if (bHasSrchInOther) 514 { 515 pWrtShell->ClearMark(); 516 if (bSrchBkwrd) 517 pWrtShell->EndDoc(); 518 else 519 pWrtShell->SttDoc(); 520 } 521 522 bFound = 0 != FUNC_Search( aOpts ); 523 pWrtShell->EndAllAction(); 524 delete pWait; 525 if ( bFound ) 526 return bFound; 527 if(!bApi) 528 { 529 Window* pParentWindow = GetParentWindow( pSrchDlg ); 530 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 531 } 532 return bFound = sal_False; 533 } 534 535 536 sal_Bool SwView::SearchAll(sal_uInt16* pFound) 537 { 538 SwWait aWait( *GetDocShell(), sal_True ); 539 pWrtShell->StartAllAction(); 540 541 SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() ); 542 543 if (!pSrchItem->GetSelection()) 544 { 545 // bestehende Selektionen aufheben, 546 // wenn nicht in selektierten Bereichen gesucht werden soll 547 (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False); 548 549 if( DOCPOS_START == aOpts.eEnd ) 550 pWrtShell->EndDoc(); 551 else 552 pWrtShell->SttDoc(); 553 } 554 bExtra = sal_False; 555 sal_uInt16 nFound = (sal_uInt16)FUNC_Search( aOpts ); 556 if(pFound) 557 *pFound = nFound; 558 bFound = 0 != nFound; 559 560 pWrtShell->EndAllAction(); 561 return bFound; 562 } 563 564 565 void SwView::Replace() 566 { 567 SwWait aWait( *GetDocShell(), sal_True ); 568 569 pWrtShell->StartAllAction(); 570 571 if( pSrchItem->GetPattern() ) // Vorlagen? 572 { 573 SwRewriter aRewriter; 574 aRewriter.AddRule(UNDO_ARG1, pSrchItem->GetSearchString()); 575 aRewriter.AddRule(UNDO_ARG2, SW_RES(STR_YIELDS)); 576 aRewriter.AddRule(UNDO_ARG3, pSrchItem->GetReplaceString()); 577 578 pWrtShell->StartUndo(UNDO_UI_REPLACE_STYLE, &aRewriter); // #111827# 579 580 pWrtShell->SetTxtFmtColl( pWrtShell->GetParaStyle( 581 pSrchItem->GetReplaceString(), 582 SwWrtShell::GETSTYLE_CREATESOME )); 583 584 pWrtShell->EndUndo(); // #111827# 585 } 586 else 587 { 588 if (GetPostItMgr()->HasActiveSidebarWin()) 589 GetPostItMgr()->Replace(pSrchItem); 590 sal_Bool bReplaced = pWrtShell->SwEditShell::Replace( pSrchItem->GetReplaceString(), 591 pSrchItem->GetRegExp()); 592 593 if( bReplaced && pReplList && pReplList->Count() && pWrtShell->HasSelection() ) 594 { 595 SfxItemSet aReplSet( pWrtShell->GetAttrPool(), 596 aTxtFmtCollSetRange ); 597 if( pReplList->Get( aReplSet ).Count() ) 598 { 599 ::SfxToSwPageDescAttr( *pWrtShell, aReplSet ); 600 pWrtShell->SwEditShell::SetAttr( aReplSet ); 601 } 602 } 603 } 604 605 pWrtShell->EndAllAction(); 606 } 607 608 609 610 SwSearchOptions::SwSearchOptions( SwWrtShell* pSh, sal_Bool bBackward ) 611 { 612 eStart = DOCPOS_CURR; 613 if( bBackward ) 614 { 615 eEnd = DOCPOS_START; 616 bDontWrap = pSh->IsEndOfDoc(); 617 } 618 else 619 { 620 eEnd = DOCPOS_END; 621 bDontWrap = pSh->IsStartOfDoc(); 622 } 623 } 624 625 sal_uLong SwView::FUNC_Search( const SwSearchOptions& rOptions ) 626 { 627 sal_Bool bDoReplace = pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE || 628 pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL; 629 630 int eRanges = pSrchItem->GetSelection() ? 631 FND_IN_SEL : bExtra ? FND_IN_OTHER : FND_IN_BODY; 632 if (pSrchItem->GetCommand() == SVX_SEARCHCMD_FIND_ALL || 633 pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL) 634 eRanges |= FND_IN_SELALL; 635 636 pWrtShell->SttSelect(); 637 638 static sal_uInt16 __READONLY_DATA aSearchAttrRange[] = { 639 RES_FRMATR_BEGIN, RES_FRMATR_END-1, 640 RES_CHRATR_BEGIN, RES_CHRATR_END-1, 641 RES_PARATR_BEGIN, RES_PARATR_END-1, 642 SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, 643 0 }; 644 645 SfxItemSet aSrchSet( pWrtShell->GetAttrPool(), aSearchAttrRange); 646 if( pSrchList && pSrchList->Count() ) 647 { 648 pSrchList->Get( aSrchSet ); 649 650 /* -- Seitenumbruch mit Seitenvorlage */ 651 ::SfxToSwPageDescAttr( *pWrtShell, aSrchSet ); 652 } 653 654 SfxItemSet* pReplSet = 0; 655 if( bDoReplace && pReplList && pReplList->Count() ) 656 { 657 pReplSet = new SfxItemSet( pWrtShell->GetAttrPool(), 658 aSearchAttrRange ); 659 pReplList->Get( *pReplSet ); 660 661 /* -- Seitenumbruch mit Seitenvorlage */ 662 ::SfxToSwPageDescAttr( *pWrtShell, *pReplSet ); 663 664 if( !pReplSet->Count() ) // schade, die Attribute 665 DELETEZ( pReplSet ); // kennen wir nicht 666 } 667 668 // 669 // build SearchOptions to be used 670 // 671 SearchOptions aSearchOpt( pSrchItem->GetSearchOptions() ); 672 aSearchOpt.Locale = SvxCreateLocale( (sal_uInt16)GetAppLanguage() ); 673 if( !bDoReplace ) 674 aSearchOpt.replaceString = aEmptyStr; 675 676 sal_uLong nFound; 677 if( aSrchSet.Count() || ( pReplSet && pReplSet->Count() )) 678 { 679 nFound = pWrtShell->SearchAttr( 680 aSrchSet, 681 !pSrchItem->GetPattern(), 682 rOptions.eStart, 683 rOptions.eEnd, 684 FindRanges(eRanges), 685 pSrchItem->GetSearchString().Len() ? &aSearchOpt : 0, 686 pReplSet ); 687 } 688 else if( pSrchItem->GetPattern() ) 689 { 690 // Suchen (und ersetzen) von Vorlagen 691 const String sRplStr( pSrchItem->GetReplaceString() ); 692 nFound = pWrtShell->SearchTempl( pSrchItem->GetSearchString(), 693 rOptions.eStart, 694 rOptions.eEnd, 695 FindRanges(eRanges), 696 bDoReplace ? &sRplStr : 0 ); 697 } 698 else 699 { 700 // Normale Suche 701 nFound = pWrtShell->SearchPattern(aSearchOpt, pSrchItem->GetNotes(), 702 rOptions.eStart, 703 rOptions.eEnd, 704 FindRanges(eRanges), 705 bDoReplace ); 706 } 707 pWrtShell->EndSelect(); 708 return nFound; 709 } 710 711 LAYOUT_NS Dialog* SwView::GetSearchDialog() 712 { 713 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 714 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)SfxViewFrame::Current()->GetChildWindow(nId); 715 if ( pWrp ) 716 pSrchDlg = pWrp->getDialog (); 717 else 718 pSrchDlg = 0; 719 return pSrchDlg; 720 } 721 722 void SwView::StateSearch(SfxItemSet &rSet) 723 { 724 SfxWhichIter aIter(rSet); 725 sal_uInt16 nWhich = aIter.FirstWhich(); 726 727 while(nWhich) 728 { 729 switch(nWhich) 730 { 731 case SID_SEARCH_OPTIONS: 732 { 733 sal_uInt16 nOpt = 0xFFFF; 734 if( GetDocShell()->IsReadOnly() ) 735 nOpt &= ~( SEARCH_OPTIONS_REPLACE | 736 SEARCH_OPTIONS_REPLACE_ALL ); 737 rSet.Put( SfxUInt16Item( SID_SEARCH_OPTIONS, nOpt)); 738 } 739 break; 740 case SID_SEARCH_ITEM: 741 { 742 if ( !pSrchItem ) 743 { 744 pSrchItem = new SvxSearchItem( SID_SEARCH_ITEM ); 745 pSrchItem->SetFamily(SFX_STYLE_FAMILY_PARA); 746 pSrchItem->SetSearchString( pWrtShell->GetSelTxt() ); 747 } 748 749 if( bJustOpened && pWrtShell->IsSelection() ) 750 { 751 String aTxt; 752 if( 1 == pWrtShell->GetCrsrCnt() && 753 ( aTxt = pWrtShell->SwCrsrShell::GetSelTxt() ).Len() ) 754 { 755 pSrchItem->SetSearchString( aTxt ); 756 pSrchItem->SetSelection( sal_False ); 757 } 758 else 759 pSrchItem->SetSelection( sal_True ); 760 } 761 762 bJustOpened = sal_False; 763 rSet.Put( *pSrchItem ); 764 } 765 break; 766 767 /* case SID_SEARCH_REPLACESET: 768 case SID_SEARCH_SEARCHSET: 769 { 770 static sal_uInt16 __READONLY_DATA aSearchAttrRange[] = 771 { 772 RES_CHRATR_CASEMAP, RES_CHRATR_POSTURE, 773 RES_CHRATR_SHADOWED, RES_CHRATR_WORDLINEMODE, 774 RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE, 775 RES_LR_SPACE, RES_UL_SPACE, 776 SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, 777 0 778 }; 779 780 SfxItemSet aSet(pWrtShell->GetAttrPool(), aSearchAttrRange ); 781 if( SID_SEARCH_REPLACESET==nWhich ) 782 { 783 if( pReplList ) 784 { 785 pReplList->Get( aSet ); 786 DELETEZ( pReplList ); 787 } 788 } 789 else if( pSrchList ) 790 { 791 pSrchList->Get( aSet ); 792 DELETEZ( pSrchList ); 793 } 794 rSet.Put( SvxSetItem( nWhich, aSet )); 795 } 796 break; 797 */ 798 } 799 nWhich = aIter.NextWhich(); 800 } 801 } 802 803 804 805