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 if ( Application::IsAccessibilityEnabled() ) 217 { 218 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 219 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId); 220 if ( pWrp ) 221 { 222 pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow()); 223 pSrchDlg->SetDocWin( (Window*)pEditWin ); 224 pSrchDlg->SetSrchFlag(); 225 } 226 } 227 } 228 break; 229 case SVX_SEARCHCMD_FIND_ALL: 230 { 231 sal_Bool bRet = SearchAll(); 232 if( !bRet ) 233 { 234 if( !bApi ) 235 { 236 Window* pParentWindow = GetParentWindow( pSrchDlg ); 237 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 238 } 239 bFound = sal_False; 240 } 241 rReq.SetReturnValue(SfxBoolItem(nSlot, bRet)); 242 if ( Application::IsAccessibilityEnabled() ) 243 { 244 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 245 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId); 246 247 if ( pWrp ) 248 { 249 pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow()); 250 pSrchDlg->SetDocWin( (Window*)pEditWin ); 251 pSrchDlg->SetSrchFlag(); 252 } 253 } 254 } 255 break; 256 case SVX_SEARCHCMD_REPLACE: 257 { 258 259 // 1) Selektion ersetzen (nicht. wenn nur Attribute ersetzt 260 // werden sollen) 261 //JP 27.04.95: warum ? 262 // was ist, wenn man das gefundene nur attributieren will?? 263 264 sal_uInt16 nCmd = SVX_SEARCHCMD_FIND; 265 if( pSrchItem->GetReplaceString().Len() || 266 !pReplList ) 267 { 268 // Verhindern, dass - falls der Suchstring im 269 // Ersetzungsstring enthalten ist - der ersetzte String 270 // noch einmal gefunden wird. 271 272 sal_Bool bBack = pSrchItem->GetBackward(); 273 if (bBack) 274 pWrtShell->Push(); 275 String aReplace( pSrchItem->GetReplaceString() ); 276 SearchOptions aTmp( pSrchItem->GetSearchOptions() ); 277 String *pBackRef = ReplaceBackReferences( aTmp, pWrtShell->GetCrsr() ); 278 if( pBackRef ) 279 pSrchItem->SetReplaceString( *pBackRef ); 280 Replace(); 281 if( pBackRef ) 282 { 283 pSrchItem->SetReplaceString( aReplace ); 284 delete pBackRef; 285 } 286 if (bBack) 287 { 288 pWrtShell->Pop(); 289 pWrtShell->SwapPam(); 290 } 291 } 292 else if( pReplList ) 293 nCmd = SVX_SEARCHCMD_REPLACE; 294 295 // 2) Weiter suchen (ohne zu ersetzen!) 296 297 sal_uInt16 nOldCmd = pSrchItem->GetCommand(); 298 pSrchItem->SetCommand( nCmd ); 299 sal_Bool bRet = SearchAndWrap(bApi); 300 if( bRet ) 301 Scroll( pWrtShell->GetCharRect().SVRect()); 302 pSrchItem->SetCommand( nOldCmd ); 303 rReq.SetReturnValue(SfxBoolItem(nSlot, bRet)); 304 } 305 { 306 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 307 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId); 308 309 if ( pWrp ) 310 { 311 pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow()); 312 pSrchDlg->SetDocWin( (Window*)pEditWin ); 313 pSrchDlg->SetSrchFlag(); 314 } 315 } 316 break; 317 318 case SVX_SEARCHCMD_REPLACE_ALL: 319 { 320 SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() ); 321 322 323 if( !pSrchItem->GetSelection() ) 324 { 325 // bestehende Selektionen aufheben, 326 // wenn nicht in selektierten Bereichen gesucht werden soll 327 (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False); 328 if( DOCPOS_START == aOpts.eEnd ) 329 pWrtShell->EndDoc(); 330 else 331 pWrtShell->SttDoc(); 332 } 333 334 bExtra = sal_False; 335 sal_uLong nFound; 336 337 { //Scope for SwWait-Object 338 SwWait aWait( *GetDocShell(), sal_True ); 339 pWrtShell->StartAllAction(); 340 nFound = FUNC_Search( aOpts ); 341 pWrtShell->EndAllAction(); 342 } 343 rReq.SetReturnValue(SfxBoolItem(nSlot, nFound != 0 && ULONG_MAX != nFound)); 344 if( !nFound ) 345 { 346 if( !bApi ) 347 { 348 Window* pParentWindow = GetParentWindow( pSrchDlg ); 349 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 350 } 351 bFound = sal_False; 352 return; 353 } 354 355 if( !bApi && ULONG_MAX != nFound) 356 { 357 String aText( SW_RES( STR_NB_REPLACED ) ); 358 const xub_StrLen nPos = aText.Search( String::CreateFromAscii("XX") ); 359 aText.Erase( nPos, 2 ); 360 aText.Insert( String::CreateFromInt32( nFound ), nPos ); 361 Window* pParentWindow = GetParentWindow( pSrchDlg ); 362 InfoBox( pParentWindow, aText ).Execute(); 363 } 364 } 365 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 366 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId); 367 368 if ( pWrp ) 369 { 370 pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow()); 371 pSrchDlg->SetDocWin( (Window*)pEditWin ); 372 pSrchDlg->SetSrchFlag(); 373 } 374 break; 375 } 376 377 uno::Reference< frame::XDispatchRecorder > xRecorder = 378 GetViewFrame()->GetBindings().GetRecorder(); 379 //prevent additional dialogs in recorded macros 380 if ( xRecorder.is() ) 381 rReq.AppendItem(SfxBoolItem(SID_SEARCH_QUIET, sal_True)); 382 383 rReq.Done(); 384 } 385 break; 386 case FID_SEARCH_SEARCHSET: 387 case FID_SEARCH_REPLACESET: 388 { 389 static const sal_uInt16 aNormalAttr[] = 390 { 391 /* 0 */ RES_CHRATR_CASEMAP, RES_CHRATR_CASEMAP, 392 /* 2 */ RES_CHRATR_COLOR, RES_CHRATR_POSTURE, 393 /* 4 */ RES_CHRATR_SHADOWED, RES_CHRATR_WORDLINEMODE, 394 /* 6 */ RES_CHRATR_BLINK, RES_CHRATR_BLINK, 395 /* 8 */ RES_CHRATR_BACKGROUND, RES_CHRATR_BACKGROUND, 396 /*10 */ RES_CHRATR_ROTATE, RES_CHRATR_ROTATE, 397 /*12 */ RES_CHRATR_SCALEW, RES_CHRATR_RELIEF, 398 // insert position for CJK/CTL attributes! 399 /*14 */ RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE, 400 /*16 */ RES_PARATR_REGISTER, RES_PARATR_REGISTER, 401 /*18 */ RES_PARATR_VERTALIGN, RES_PARATR_VERTALIGN, 402 /*20 */ RES_LR_SPACE, RES_UL_SPACE, 403 /*22 */ SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, 404 /*24 */ 0 405 }; 406 407 static const sal_uInt16 aCJKAttr[] = 408 { 409 RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_WEIGHT, 410 RES_CHRATR_EMPHASIS_MARK, RES_CHRATR_TWO_LINES, 411 RES_PARATR_SCRIPTSPACE, RES_PARATR_FORBIDDEN_RULES 412 }; 413 static const sal_uInt16 aCTLAttr[] = 414 { 415 RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_WEIGHT 416 }; 417 418 SvUShorts aArr( 0, 16 ); 419 aArr.Insert( aNormalAttr, 420 sizeof( aNormalAttr ) / sizeof( aNormalAttr[0] ), 421 0 ); 422 if( SW_MOD()->GetCTLOptions().IsCTLFontEnabled() ) 423 aArr.Insert( aCTLAttr, 424 sizeof( aCTLAttr ) / sizeof( aCTLAttr[0] ), 425 14 ); 426 SvtCJKOptions aCJKOpt; 427 if( aCJKOpt.IsAnyEnabled() ) 428 aArr.Insert( aCJKAttr, 429 sizeof( aCJKAttr ) / sizeof( aCJKAttr[0] ), 430 14 ); 431 432 SfxItemSet aSet( pWrtShell->GetAttrPool(), aArr.GetData() ); 433 sal_uInt16 nWhich = SID_SEARCH_SEARCHSET; 434 435 if ( FID_SEARCH_REPLACESET == nSlot ) 436 { 437 nWhich = SID_SEARCH_REPLACESET; 438 439 if ( pReplList ) 440 { 441 pReplList->Get( aSet ); 442 DELETEZ( pReplList ); 443 } 444 } 445 else if ( pSrchList ) 446 { 447 pSrchList->Get( aSet ); 448 DELETEZ( pSrchList ); 449 } 450 rReq.SetReturnValue( SvxSetItem( nWhich, aSet ) ); 451 } 452 break; 453 default: 454 #ifdef DBG_UTIL 455 if(nSlot) 456 { 457 ByteString sStr( "nSlot: " ); 458 sStr += ByteString::CreateFromInt32( nSlot ); 459 sStr += " falscher Dispatcher (viewsrch.cxx)"; 460 DBG_ERROR( sStr.GetBuffer() ); 461 } 462 #endif 463 return; 464 } 465 } 466 467 468 sal_Bool SwView::SearchAndWrap(sal_Bool bApi) 469 { 470 SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() ); 471 472 // Startposition der Suche fuer WrapAround merken 473 // Start- / EndAction wegen vielleicht bestehender Selektionen 474 // aus 'Suche alle' 475 pWrtShell->StartAllAction(); 476 pWrtShell->Push(); 477 // falls in selektierten Bereichen gesucht werden soll, duerfen sie 478 // nicht aufgehoben werden 479 if (!pSrchItem->GetSelection()) 480 (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False); 481 482 SwWait *pWait = new SwWait( *GetDocShell(), sal_True ); 483 if( FUNC_Search( aOpts ) ) 484 { 485 bFound = sal_True; 486 if(pWrtShell->IsSelFrmMode()) 487 { 488 pWrtShell->UnSelectFrm(); 489 pWrtShell->LeaveSelFrmMode(); 490 } 491 pWrtShell->Pop(); 492 pWrtShell->EndAllAction(); 493 delete pWait; 494 return sal_True; 495 } 496 delete pWait, pWait = 0; 497 498 // Suchen in den Sonderbereichen, wenn keine 499 // Suche in Selektionen vorliegt. Bei Suche in Selektionen 500 // wird ohnehin in diesen Sonderbereichen gesucht 501 sal_Bool bHasSrchInOther = bExtra; 502 if (!pSrchItem->GetSelection() && !bExtra ) 503 { 504 bExtra = sal_True; 505 if( FUNC_Search( aOpts ) ) 506 { 507 bFound = sal_True; 508 pWrtShell->Pop(); 509 pWrtShell->EndAllAction(); 510 return sal_True; 511 } 512 bExtra = sal_False; 513 } 514 else 515 bExtra = !bExtra; 516 517 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 518 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId); 519 pSrchDlg = pWrp ? static_cast <SvxSearchDialog*> (pWrp->getDialog ()) : 0; 520 521 // falls Startposition am Dokumentende / -anfang 522 if (aOpts.bDontWrap) 523 { 524 pWrtShell->EndAllAction(); 525 if( !bApi ) 526 { 527 Window* pParentWindow = GetParentWindow( pSrchDlg ); 528 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 529 } 530 bFound = sal_False; 531 pWrtShell->Pop(); 532 return sal_False; 533 } 534 pWrtShell->EndAllAction(); 535 // noch mal mit WrapAround versuchen? 536 537 if( bApi || RET_NO == QueryBox( GetParentWindow( pSrchDlg ), 538 SW_RES( DOCPOS_START == aOpts.eEnd 539 ? MSG_SEARCH_START 540 : MSG_SEARCH_END ) 541 ).Execute() ) 542 { 543 bFound = sal_False; 544 pWrtShell->Pop(); 545 return sal_False; 546 } 547 pWrtShell->StartAllAction(); 548 pWrtShell->Pop(sal_False); 549 pWait = new SwWait( *GetDocShell(), sal_True ); 550 551 sal_Bool bSrchBkwrd = DOCPOS_START == aOpts.eEnd; 552 553 aOpts.eEnd = bSrchBkwrd ? DOCPOS_START : DOCPOS_END; 554 aOpts.eStart = bSrchBkwrd ? DOCPOS_END : DOCPOS_START; 555 556 if (bHasSrchInOther) 557 { 558 pWrtShell->ClearMark(); 559 if (bSrchBkwrd) 560 pWrtShell->EndDoc(); 561 else 562 pWrtShell->SttDoc(); 563 } 564 565 bFound = 0 != FUNC_Search( aOpts ); 566 pWrtShell->EndAllAction(); 567 delete pWait; 568 if ( bFound ) 569 return bFound; 570 if(!bApi) 571 { 572 Window* pParentWindow = GetParentWindow( pSrchDlg ); 573 InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute(); 574 } 575 return bFound = sal_False; 576 } 577 578 579 sal_Bool SwView::SearchAll(sal_uInt16* pFound) 580 { 581 SwWait aWait( *GetDocShell(), sal_True ); 582 pWrtShell->StartAllAction(); 583 584 SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() ); 585 586 if (!pSrchItem->GetSelection()) 587 { 588 // bestehende Selektionen aufheben, 589 // wenn nicht in selektierten Bereichen gesucht werden soll 590 (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False); 591 592 if( DOCPOS_START == aOpts.eEnd ) 593 pWrtShell->EndDoc(); 594 else 595 pWrtShell->SttDoc(); 596 } 597 bExtra = sal_False; 598 sal_uInt16 nFound = (sal_uInt16)FUNC_Search( aOpts ); 599 if(pFound) 600 *pFound = nFound; 601 bFound = 0 != nFound; 602 603 pWrtShell->EndAllAction(); 604 return bFound; 605 } 606 607 608 void SwView::Replace() 609 { 610 SwWait aWait( *GetDocShell(), sal_True ); 611 612 pWrtShell->StartAllAction(); 613 614 if( pSrchItem->GetPattern() ) // Vorlagen? 615 { 616 SwRewriter aRewriter; 617 aRewriter.AddRule(UNDO_ARG1, pSrchItem->GetSearchString()); 618 aRewriter.AddRule(UNDO_ARG2, SW_RES(STR_YIELDS)); 619 aRewriter.AddRule(UNDO_ARG3, pSrchItem->GetReplaceString()); 620 621 pWrtShell->StartUndo(UNDO_UI_REPLACE_STYLE, &aRewriter); // #111827# 622 623 pWrtShell->SetTxtFmtColl( pWrtShell->GetParaStyle( 624 pSrchItem->GetReplaceString(), 625 SwWrtShell::GETSTYLE_CREATESOME )); 626 627 pWrtShell->EndUndo(); // #111827# 628 } 629 else 630 { 631 if (GetPostItMgr()->HasActiveSidebarWin()) 632 GetPostItMgr()->Replace(pSrchItem); 633 sal_Bool bReplaced = pWrtShell->SwEditShell::Replace( pSrchItem->GetReplaceString(), 634 pSrchItem->GetRegExp()); 635 636 if( bReplaced && pReplList && pReplList->Count() && pWrtShell->HasSelection() ) 637 { 638 SfxItemSet aReplSet( pWrtShell->GetAttrPool(), 639 aTxtFmtCollSetRange ); 640 if( pReplList->Get( aReplSet ).Count() ) 641 { 642 ::SfxToSwPageDescAttr( *pWrtShell, aReplSet ); 643 pWrtShell->SwEditShell::SetAttrSet( aReplSet ); 644 } 645 } 646 } 647 648 pWrtShell->EndAllAction(); 649 } 650 651 652 653 SwSearchOptions::SwSearchOptions( SwWrtShell* pSh, sal_Bool bBackward ) 654 { 655 eStart = DOCPOS_CURR; 656 if( bBackward ) 657 { 658 eEnd = DOCPOS_START; 659 bDontWrap = pSh->IsEndOfDoc(); 660 } 661 else 662 { 663 eEnd = DOCPOS_END; 664 bDontWrap = pSh->IsStartOfDoc(); 665 } 666 } 667 668 sal_uLong SwView::FUNC_Search( const SwSearchOptions& rOptions ) 669 { 670 sal_Bool bDoReplace = pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE || 671 pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL; 672 673 int eRanges = pSrchItem->GetSelection() ? 674 FND_IN_SEL : bExtra ? FND_IN_OTHER : FND_IN_BODY; 675 if (pSrchItem->GetCommand() == SVX_SEARCHCMD_FIND_ALL || 676 pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL) 677 eRanges |= FND_IN_SELALL; 678 679 pWrtShell->SttSelect(); 680 681 static sal_uInt16 __READONLY_DATA aSearchAttrRange[] = { 682 RES_FRMATR_BEGIN, RES_FRMATR_END-1, 683 RES_CHRATR_BEGIN, RES_CHRATR_END-1, 684 RES_PARATR_BEGIN, RES_PARATR_END-1, 685 SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, 686 0 }; 687 688 SfxItemSet aSrchSet( pWrtShell->GetAttrPool(), aSearchAttrRange); 689 if( pSrchList && pSrchList->Count() ) 690 { 691 pSrchList->Get( aSrchSet ); 692 693 /* -- Seitenumbruch mit Seitenvorlage */ 694 ::SfxToSwPageDescAttr( *pWrtShell, aSrchSet ); 695 } 696 697 SfxItemSet* pReplSet = 0; 698 if( bDoReplace && pReplList && pReplList->Count() ) 699 { 700 pReplSet = new SfxItemSet( pWrtShell->GetAttrPool(), 701 aSearchAttrRange ); 702 pReplList->Get( *pReplSet ); 703 704 /* -- Seitenumbruch mit Seitenvorlage */ 705 ::SfxToSwPageDescAttr( *pWrtShell, *pReplSet ); 706 707 if( !pReplSet->Count() ) // schade, die Attribute 708 DELETEZ( pReplSet ); // kennen wir nicht 709 } 710 711 // 712 // build SearchOptions to be used 713 // 714 SearchOptions aSearchOpt( pSrchItem->GetSearchOptions() ); 715 aSearchOpt.Locale = SvxCreateLocale( (sal_uInt16)GetAppLanguage() ); 716 if( !bDoReplace ) 717 aSearchOpt.replaceString = aEmptyStr; 718 719 sal_uLong nFound; 720 if( aSrchSet.Count() || ( pReplSet && pReplSet->Count() )) 721 { 722 nFound = pWrtShell->SearchAttr( 723 aSrchSet, 724 !pSrchItem->GetPattern(), 725 rOptions.eStart, 726 rOptions.eEnd, 727 FindRanges(eRanges), 728 pSrchItem->GetSearchString().Len() ? &aSearchOpt : 0, 729 pReplSet ); 730 } 731 else if( pSrchItem->GetPattern() ) 732 { 733 // Suchen (und ersetzen) von Vorlagen 734 const String sRplStr( pSrchItem->GetReplaceString() ); 735 nFound = pWrtShell->SearchTempl( pSrchItem->GetSearchString(), 736 rOptions.eStart, 737 rOptions.eEnd, 738 FindRanges(eRanges), 739 bDoReplace ? &sRplStr : 0 ); 740 } 741 else 742 { 743 // Normale Suche 744 nFound = pWrtShell->SearchPattern(aSearchOpt, pSrchItem->GetNotes(), 745 rOptions.eStart, 746 rOptions.eEnd, 747 FindRanges(eRanges), 748 bDoReplace ); 749 } 750 pWrtShell->EndSelect(); 751 return nFound; 752 } 753 754 LAYOUT_NS Dialog* SwView::GetSearchDialog() 755 { 756 const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId(); 757 SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)SfxViewFrame::Current()->GetChildWindow(nId); 758 if ( pWrp ) 759 pSrchDlg = pWrp->getDialog (); 760 else 761 pSrchDlg = 0; 762 return pSrchDlg; 763 } 764 765 void SwView::StateSearch(SfxItemSet &rSet) 766 { 767 SfxWhichIter aIter(rSet); 768 sal_uInt16 nWhich = aIter.FirstWhich(); 769 770 while(nWhich) 771 { 772 switch(nWhich) 773 { 774 case SID_SEARCH_OPTIONS: 775 { 776 sal_uInt16 nOpt = 0xFFFF; 777 if( GetDocShell()->IsReadOnly() ) 778 nOpt &= ~( SEARCH_OPTIONS_REPLACE | 779 SEARCH_OPTIONS_REPLACE_ALL ); 780 rSet.Put( SfxUInt16Item( SID_SEARCH_OPTIONS, nOpt)); 781 } 782 break; 783 case SID_SEARCH_ITEM: 784 { 785 if ( !pSrchItem ) 786 { 787 pSrchItem = new SvxSearchItem( SID_SEARCH_ITEM ); 788 pSrchItem->SetFamily(SFX_STYLE_FAMILY_PARA); 789 pSrchItem->SetSearchString( pWrtShell->GetSelTxt() ); 790 } 791 792 if( bJustOpened && pWrtShell->IsSelection() ) 793 { 794 String aTxt; 795 if( 1 == pWrtShell->GetCrsrCnt() && 796 ( aTxt = pWrtShell->SwCrsrShell::GetSelTxt() ).Len() ) 797 { 798 pSrchItem->SetSearchString( aTxt ); 799 pSrchItem->SetSelection( sal_False ); 800 } 801 else 802 pSrchItem->SetSelection( sal_True ); 803 } 804 805 bJustOpened = sal_False; 806 rSet.Put( *pSrchItem ); 807 } 808 break; 809 810 /* case SID_SEARCH_REPLACESET: 811 case SID_SEARCH_SEARCHSET: 812 { 813 static sal_uInt16 __READONLY_DATA aSearchAttrRange[] = 814 { 815 RES_CHRATR_CASEMAP, RES_CHRATR_POSTURE, 816 RES_CHRATR_SHADOWED, RES_CHRATR_WORDLINEMODE, 817 RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE, 818 RES_LR_SPACE, RES_UL_SPACE, 819 SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP, 820 0 821 }; 822 823 SfxItemSet aSet(pWrtShell->GetAttrPool(), aSearchAttrRange ); 824 if( SID_SEARCH_REPLACESET==nWhich ) 825 { 826 if( pReplList ) 827 { 828 pReplList->Get( aSet ); 829 DELETEZ( pReplList ); 830 } 831 } 832 else if( pSrchList ) 833 { 834 pSrchList->Get( aSet ); 835 DELETEZ( pSrchList ); 836 } 837 rSet.Put( SvxSetItem( nWhich, aSet )); 838 } 839 break; 840 */ 841 } 842 nWhich = aIter.NextWhich(); 843 } 844 } 845 846 847 848