LCOV - code coverage report
Current view: top level - libreoffice/sw/source/ui/uiview - viewsrch.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 358 0.0 %
Date: 2012-12-27 Functions: 0 9 0.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10