xref: /trunk/main/sw/source/ui/uiview/viewsrch.cxx (revision 8ef2f12b)
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 
GetParentWindow(SvxSearchDialog * pSrchDlg)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 
ExecSearch(SfxRequest & rReq,sal_Bool bNoMessage)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(), 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 
SearchAndWrap(sal_Bool bApi)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(), 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(), 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 
SearchAll(sal_uInt16 * pFound)579 sal_Bool SwView::SearchAll(sal_uInt16* pFound)
580 {
581 	SwWait aWait( *GetDocShell(), 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 
Replace()608 void SwView::Replace()
609 {
610 	SwWait aWait( *GetDocShell(), 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 
SwSearchOptions(SwWrtShell * pSh,sal_Bool bBackward)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 
FUNC_Search(const SwSearchOptions & rOptions)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 
GetSearchDialog()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 
StateSearch(SfxItemSet & rSet)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