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