xref: /AOO41X/main/sw/source/ui/uiview/viewsrch.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
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