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