summaryrefslogtreecommitdiff
path: root/sw/source/ui/uiview/viewsrch.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/uiview/viewsrch.cxx')
-rw-r--r--sw/source/ui/uiview/viewsrch.cxx775
1 files changed, 775 insertions, 0 deletions
diff --git a/sw/source/ui/uiview/viewsrch.cxx b/sw/source/ui/uiview/viewsrch.cxx
new file mode 100644
index 000000000000..6be88b8855a1
--- /dev/null
+++ b/sw/source/ui/uiview/viewsrch.cxx
@@ -0,0 +1,775 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#include <string>
+#include <hintids.hxx>
+#include <com/sun/star/util/SearchOptions.hpp>
+#include <svl/cjkoptions.hxx>
+#include <svl/ctloptions.hxx>
+#include <svx/pageitem.hxx>
+#include <svl/whiter.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svl/stritem.hxx>
+#include <svtools/txtcmp.hxx>
+#include <svl/itempool.hxx>
+#include <svl/eitem.hxx>
+#include <svl/srchitem.hxx>
+#include <sal/macros.h>
+#include <sfx2/request.hxx>
+#include <svx/srchdlg.hxx>
+#include <vcl/msgbox.hxx>
+#include <vcl/wrkwin.hxx>
+#include "editeng/unolingu.hxx"
+#include <swmodule.hxx>
+#include <swwait.hxx>
+#include <workctrl.hxx>
+#include <view.hxx>
+#include <wrtsh.hxx>
+#include <swundo.hxx> // fuer Undo-Ids
+#include <uitool.hxx>
+#include <cmdid.h>
+#include <docsh.hxx>
+
+#include <view.hrc>
+#include <SwRewriter.hxx>
+#include <comcore.hrc>
+
+#include "PostItMgr.hxx"
+
+using namespace com::sun::star;
+using namespace ::com::sun::star::i18n;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::i18n;
+
+#define SRCH_ATTR_OFF 0
+#define SRCH_ATTR_ON 1
+#define SRCH_ATTR_SET 2
+
+/*--------------------------------------------------------------------
+ Beschreibung: Search Parameter
+ --------------------------------------------------------------------*/
+
+struct SwSearchOptions
+{
+ SwDocPositions eStart, eEnd;
+ sal_Bool bDontWrap;
+
+ SwSearchOptions( SwWrtShell* pSh, sal_Bool bBackward );
+};
+
+
+inline Window* GetParentWindow( SvxSearchDialog* pSrchDlg )
+{
+ Window* pWin;
+ if( pSrchDlg && pSrchDlg->IsVisible() )
+ pWin = LAYOUT_THIS_WINDOW (pSrchDlg);
+ else
+ pWin = 0;
+ return pWin;
+}
+
+void SwView::ExecSearch(SfxRequest& rReq, sal_Bool bNoMessage)
+{
+ const SfxItemSet* pArgs = rReq.GetArgs();
+ const SfxPoolItem* pItem = 0;
+ const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId();
+ SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
+ sal_Bool bQuiet = sal_False;
+ if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_SEARCH_QUIET, sal_False, &pItem))
+ bQuiet = ((const SfxBoolItem*) pItem)->GetValue();
+
+ sal_Bool bApi = bQuiet | bNoMessage;
+
+ sal_uInt16 nSlot = rReq.GetSlot();
+ if (nSlot == FN_REPEAT_SEARCH && !pSrchItem)
+ {
+ if(bApi)
+ {
+ rReq.SetReturnValue(SfxBoolItem(nSlot, sal_False));
+ nSlot = 0;
+ }
+ }
+ if( pWrtShell->IsBlockMode() )
+ pWrtShell->LeaveBlockMode();
+ switch (nSlot)
+ {
+ // erstmal Nichts tun
+ case SID_SEARCH_ITEM:
+ {
+ delete pSrchItem;
+ pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone();
+ }
+ break;
+
+ case FID_SEARCH_ON:
+ bJustOpened = sal_True;
+ GetViewFrame()->GetBindings().Invalidate(SID_SEARCH_ITEM);
+ break;
+
+ case FID_SEARCH_OFF:
+ if(pArgs)
+ {
+ // Dialog abmelden
+ delete pSrchItem;
+ pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone();
+
+ DELETEZ( pSrchList );
+ DELETEZ( pReplList );
+
+ if ( pWrp )
+ {
+ pSrchDlg = static_cast <SvxSearchDialog*> (pWrp->getDialog ());
+ // die Search / Replace -Items merken wir uns
+ const SearchAttrItemList* pList = pSrchDlg->GetSearchItemList();
+ if( pList && pList->Count() )
+ pSrchList = new SearchAttrItemList( *pList );
+
+ if( 0 != (pList = pSrchDlg->GetReplaceItemList() ) &&
+ pList->Count() )
+ pReplList = new SearchAttrItemList( *pList );
+ }
+ }
+ break;
+
+ case FN_REPEAT_SEARCH:
+ case FID_SEARCH_NOW:
+ {
+ {
+ if(FID_SEARCH_NOW == nSlot && !rReq.IsAPI())
+ SwView::SetMoveType(NID_SRCH_REP);
+ if ( pWrp )
+ {
+ pSrchDlg = static_cast <SvxSearchDialog*> (pWrp->getDialog ());
+ }
+ else
+ pSrchDlg = 0;
+ }
+
+ if (pSrchDlg)
+ {
+ DELETEZ( pSrchList );
+ DELETEZ( pReplList );
+
+ const SearchAttrItemList* pList = pSrchDlg->GetSearchItemList();
+ if( pList && pList->Count() )
+ pSrchList = new SearchAttrItemList( *pList );
+
+ if( 0 != (pList = pSrchDlg->GetReplaceItemList() ) &&
+ pList->Count() )
+ pReplList = new SearchAttrItemList( *pList );
+ }
+
+ if (nSlot == FN_REPEAT_SEARCH)
+ {
+ OSL_ENSURE(pSrchItem, "SearchItem missing");
+ if( !pSrchItem )
+ pSrchItem = new SvxSearchItem(SID_SEARCH_ITEM);
+ }
+ else
+ {
+ // SearchItem aus Request besorgen
+ OSL_ENSURE(pArgs, "Args missing");
+ if ( pArgs )
+ {
+ delete pSrchItem;
+ pSrchItem = (SvxSearchItem*) pArgs->Get(SID_SEARCH_ITEM).Clone();
+ }
+ }
+ switch (pSrchItem->GetCommand())
+ {
+ case SVX_SEARCHCMD_FIND:
+ {
+ sal_Bool bRet = SearchAndWrap(bApi);
+ if( bRet )
+ Scroll(pWrtShell->GetCharRect().SVRect());
+ rReq.SetReturnValue(SfxBoolItem(nSlot, bRet));
+ }
+ break;
+ case SVX_SEARCHCMD_FIND_ALL:
+ {
+ sal_Bool bRet = SearchAll();
+ if( !bRet )
+ {
+ if( !bApi )
+ {
+ Window* pParentWindow = GetParentWindow( pSrchDlg );
+ InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
+ }
+ bFound = sal_False;
+ }
+ rReq.SetReturnValue(SfxBoolItem(nSlot, bRet));
+ }
+ break;
+ case SVX_SEARCHCMD_REPLACE:
+ {
+
+ // 1) Selektion ersetzen (nicht. wenn nur Attribute ersetzt
+ // werden sollen)
+//JP 27.04.95: warum ?
+// was ist, wenn man das gefundene nur attributieren will??
+
+ sal_uInt16 nCmd = SVX_SEARCHCMD_FIND;
+ if( pSrchItem->GetReplaceString().Len() ||
+ !pReplList )
+ {
+ // Verhindern, dass - falls der Suchstring im
+ // Ersetzungsstring enthalten ist - der ersetzte String
+ // noch einmal gefunden wird.
+
+ sal_Bool bBack = pSrchItem->GetBackward();
+ if (bBack)
+ pWrtShell->Push();
+ String aReplace( pSrchItem->GetReplaceString() );
+ SearchOptions aTmp( pSrchItem->GetSearchOptions() );
+ String *pBackRef = ReplaceBackReferences( aTmp, pWrtShell->GetCrsr() );
+ if( pBackRef )
+ pSrchItem->SetReplaceString( *pBackRef );
+ Replace();
+ if( pBackRef )
+ {
+ pSrchItem->SetReplaceString( aReplace );
+ delete pBackRef;
+ }
+ if (bBack)
+ {
+ pWrtShell->Pop();
+ pWrtShell->SwapPam();
+ }
+ }
+ else if( pReplList )
+ nCmd = SVX_SEARCHCMD_REPLACE;
+
+ // 2) Weiter suchen (ohne zu ersetzen!)
+
+ sal_uInt16 nOldCmd = pSrchItem->GetCommand();
+ pSrchItem->SetCommand( nCmd );
+ sal_Bool bRet = SearchAndWrap(bApi);
+ if( bRet )
+ Scroll( pWrtShell->GetCharRect().SVRect());
+ pSrchItem->SetCommand( nOldCmd );
+ rReq.SetReturnValue(SfxBoolItem(nSlot, bRet));
+ }
+ break;
+
+ case SVX_SEARCHCMD_REPLACE_ALL:
+ {
+ SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() );
+ SwCrsrSaveState aSaveCursor( *pWrtShell->GetSwCrsr());
+
+ if( !pSrchItem->GetSelection() )
+ {
+ // bestehende Selektionen aufheben,
+ // wenn nicht in selektierten Bereichen gesucht werden soll
+ (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False);
+ if( DOCPOS_START == aOpts.eEnd )
+ pWrtShell->EndDoc();
+ else
+ pWrtShell->SttDoc();
+ }
+
+ bExtra = sal_False;
+ sal_uLong nFound;
+
+ { //Scope for SwWait-Object
+ SwWait aWait( *GetDocShell(), sal_True );
+ pWrtShell->StartAllAction();
+ nFound = FUNC_Search( aOpts );
+ // #i8288# Now that everything has been replaced, restore the original cursor position.
+ pWrtShell->GetSwCrsr()->RestoreSavePos(); // (position saved by SwCrsrSaveState above)
+ pWrtShell->EndAllAction();
+ }
+
+ rReq.SetReturnValue(SfxBoolItem(nSlot, nFound != 0 && ULONG_MAX != nFound));
+ if( !nFound )
+ {
+ if( !bApi )
+ {
+ Window* pParentWindow = GetParentWindow( pSrchDlg );
+ InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
+ }
+ bFound = sal_False;
+ return;
+ }
+
+ if( !bApi && ULONG_MAX != nFound)
+ {
+ String aText( SW_RES( STR_NB_REPLACED ) );
+ const xub_StrLen nPos = aText.Search( String::CreateFromAscii("XX") );
+ aText.Erase( nPos, 2 );
+ aText.Insert( String::CreateFromInt32( nFound ), nPos );
+ Window* pParentWindow = GetParentWindow( pSrchDlg );
+ InfoBox( pParentWindow, aText ).Execute();
+ }
+ }
+ break;
+ }
+
+ uno::Reference< frame::XDispatchRecorder > xRecorder =
+ GetViewFrame()->GetBindings().GetRecorder();
+ //prevent additional dialogs in recorded macros
+ if ( xRecorder.is() )
+ rReq.AppendItem(SfxBoolItem(SID_SEARCH_QUIET, sal_True));
+
+ rReq.Done();
+ }
+ break;
+ case FID_SEARCH_SEARCHSET:
+ case FID_SEARCH_REPLACESET:
+ {
+ static const sal_uInt16 aNormalAttr[] =
+ {
+/* 0 */ RES_CHRATR_CASEMAP, RES_CHRATR_CASEMAP,
+/* 2 */ RES_CHRATR_COLOR, RES_CHRATR_POSTURE,
+/* 4 */ RES_CHRATR_SHADOWED, RES_CHRATR_WORDLINEMODE,
+/* 6 */ RES_CHRATR_BLINK, RES_CHRATR_BLINK,
+/* 8 */ RES_CHRATR_BACKGROUND, RES_CHRATR_BACKGROUND,
+/*10 */ RES_CHRATR_ROTATE, RES_CHRATR_ROTATE,
+/*12 */ RES_CHRATR_SCALEW, RES_CHRATR_RELIEF,
+// insert position for CJK/CTL attributes!
+/*14 */ RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE,
+/*16 */ RES_PARATR_REGISTER, RES_PARATR_REGISTER,
+/*18 */ RES_PARATR_VERTALIGN, RES_PARATR_VERTALIGN,
+/*20 */ RES_LR_SPACE, RES_UL_SPACE,
+/*22 */ SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP,
+/*24 */ 0
+ };
+
+ static const sal_uInt16 aCJKAttr[] =
+ {
+ RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_WEIGHT,
+ RES_CHRATR_EMPHASIS_MARK, RES_CHRATR_TWO_LINES,
+ RES_PARATR_SCRIPTSPACE, RES_PARATR_FORBIDDEN_RULES
+ };
+ static const sal_uInt16 aCTLAttr[] =
+ {
+ RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_WEIGHT
+ };
+
+ SvUShorts aArr( 0, 16 );
+ aArr.Insert( aNormalAttr,
+ SAL_N_ELEMENTS( aNormalAttr ),
+ 0 );
+ if( SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
+ aArr.Insert( aCTLAttr,
+ SAL_N_ELEMENTS( aCTLAttr ),
+ 14 );
+ SvtCJKOptions aCJKOpt;
+ if( aCJKOpt.IsAnyEnabled() )
+ aArr.Insert( aCJKAttr,
+ SAL_N_ELEMENTS( aCJKAttr ),
+ 14 );
+
+ SfxItemSet aSet( pWrtShell->GetAttrPool(), aArr.GetData() );
+ sal_uInt16 nWhich = SID_SEARCH_SEARCHSET;
+
+ if ( FID_SEARCH_REPLACESET == nSlot )
+ {
+ nWhich = SID_SEARCH_REPLACESET;
+
+ if ( pReplList )
+ {
+ pReplList->Get( aSet );
+ DELETEZ( pReplList );
+ }
+ }
+ else if ( pSrchList )
+ {
+ pSrchList->Get( aSet );
+ DELETEZ( pSrchList );
+ }
+ rReq.SetReturnValue( SvxSetItem( nWhich, aSet ) );
+ }
+ break;
+ default:
+#if OSL_DEBUG_LEVEL > 1
+ if(nSlot)
+ {
+ ByteString sStr( "nSlot: " );
+ sStr += ByteString::CreateFromInt32( nSlot );
+ sStr += " wrong Dispatcher (viewsrch.cxx)";
+ OSL_FAIL(sStr.GetBuffer() );
+ }
+#endif
+ return;
+ }
+}
+
+
+sal_Bool SwView::SearchAndWrap(sal_Bool bApi)
+{
+ SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() );
+
+ // Startposition der Suche fuer WrapAround merken
+ // Start- / EndAction wegen vielleicht bestehender Selektionen
+ // aus 'Suche alle'
+ pWrtShell->StartAllAction();
+ pWrtShell->Push();
+ // falls in selektierten Bereichen gesucht werden soll, duerfen sie
+ // nicht aufgehoben werden
+ if (!pSrchItem->GetSelection())
+ (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False);
+
+ SwWait *pWait = new SwWait( *GetDocShell(), sal_True );
+ if( FUNC_Search( aOpts ) )
+ {
+ bFound = sal_True;
+ if(pWrtShell->IsSelFrmMode())
+ {
+ pWrtShell->UnSelectFrm();
+ pWrtShell->LeaveSelFrmMode();
+ }
+ pWrtShell->Pop();
+ pWrtShell->EndAllAction();
+ delete pWait;
+ return sal_True;
+ }
+ delete pWait, pWait = 0;
+
+ // Suchen in den Sonderbereichen, wenn keine
+ // Suche in Selektionen vorliegt. Bei Suche in Selektionen
+ // wird ohnehin in diesen Sonderbereichen gesucht
+ sal_Bool bHasSrchInOther = bExtra;
+ if (!pSrchItem->GetSelection() && !bExtra )
+ {
+ bExtra = sal_True;
+ if( FUNC_Search( aOpts ) )
+ {
+ bFound = sal_True;
+ pWrtShell->Pop();
+ pWrtShell->EndAllAction();
+ return sal_True;
+ }
+ bExtra = sal_False;
+ }
+ else
+ bExtra = !bExtra;
+
+ const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId();
+ SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
+ pSrchDlg = pWrp ? static_cast <SvxSearchDialog*> (pWrp->getDialog ()) : 0;
+
+ // falls Startposition am Dokumentende / -anfang
+ if (aOpts.bDontWrap)
+ {
+ pWrtShell->EndAllAction();
+ if( !bApi )
+ {
+ Window* pParentWindow = GetParentWindow( pSrchDlg );
+ InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
+ }
+ bFound = sal_False;
+ pWrtShell->Pop();
+ return sal_False;
+ }
+ pWrtShell->EndAllAction();
+ // noch mal mit WrapAround versuchen?
+
+ if( bApi || RET_NO == QueryBox( GetParentWindow( pSrchDlg ),
+ SW_RES( DOCPOS_START == aOpts.eEnd
+ ? MSG_SEARCH_START
+ : MSG_SEARCH_END )
+ ).Execute() )
+ {
+ bFound = sal_False;
+ pWrtShell->Pop();
+ return sal_False;
+ }
+ pWrtShell->StartAllAction();
+ pWrtShell->Pop(sal_False);
+ pWait = new SwWait( *GetDocShell(), sal_True );
+
+ sal_Bool bSrchBkwrd = DOCPOS_START == aOpts.eEnd;
+
+ aOpts.eEnd = bSrchBkwrd ? DOCPOS_START : DOCPOS_END;
+ aOpts.eStart = bSrchBkwrd ? DOCPOS_END : DOCPOS_START;
+
+ if (bHasSrchInOther)
+ {
+ pWrtShell->ClearMark();
+ if (bSrchBkwrd)
+ pWrtShell->EndDoc();
+ else
+ pWrtShell->SttDoc();
+ }
+
+ bFound = 0 != FUNC_Search( aOpts );
+ pWrtShell->EndAllAction();
+ delete pWait;
+ if ( bFound )
+ return bFound;
+ if(!bApi)
+ {
+ Window* pParentWindow = GetParentWindow( pSrchDlg );
+ InfoBox( pParentWindow, SW_RES(MSG_NOT_FOUND)).Execute();
+ }
+ return bFound = sal_False;
+}
+
+
+sal_Bool SwView::SearchAll(sal_uInt16* pFound)
+{
+ SwWait aWait( *GetDocShell(), sal_True );
+ pWrtShell->StartAllAction();
+
+ SwSearchOptions aOpts( pWrtShell, pSrchItem->GetBackward() );
+
+ if (!pSrchItem->GetSelection())
+ {
+ // bestehende Selektionen aufheben,
+ // wenn nicht in selektierten Bereichen gesucht werden soll
+ (pWrtShell->*pWrtShell->fnKillSel)(0, sal_False);
+
+ if( DOCPOS_START == aOpts.eEnd )
+ pWrtShell->EndDoc();
+ else
+ pWrtShell->SttDoc();
+ }
+ bExtra = sal_False;
+ sal_uInt16 nFound = (sal_uInt16)FUNC_Search( aOpts );
+ if(pFound)
+ *pFound = nFound;
+ bFound = 0 != nFound;
+
+ pWrtShell->EndAllAction();
+ return bFound;
+}
+
+
+void SwView::Replace()
+{
+ SwWait aWait( *GetDocShell(), sal_True );
+
+ pWrtShell->StartAllAction();
+
+ if( pSrchItem->GetPattern() ) // Vorlagen?
+ {
+ SwRewriter aRewriter;
+ aRewriter.AddRule(UNDO_ARG1, pSrchItem->GetSearchString());
+ aRewriter.AddRule(UNDO_ARG2, SW_RES(STR_YIELDS));
+ aRewriter.AddRule(UNDO_ARG3, pSrchItem->GetReplaceString());
+
+ pWrtShell->StartUndo(UNDO_UI_REPLACE_STYLE, &aRewriter);
+
+ pWrtShell->SetTxtFmtColl( pWrtShell->GetParaStyle(
+ pSrchItem->GetReplaceString(),
+ SwWrtShell::GETSTYLE_CREATESOME ));
+
+ pWrtShell->EndUndo();
+ }
+ else
+ {
+ if (GetPostItMgr()->HasActiveSidebarWin())
+ GetPostItMgr()->Replace(pSrchItem);
+ sal_Bool bReplaced = pWrtShell->SwEditShell::Replace( pSrchItem->GetReplaceString(),
+ pSrchItem->GetRegExp());
+
+ if( bReplaced && pReplList && pReplList->Count() && pWrtShell->HasSelection() )
+ {
+ SfxItemSet aReplSet( pWrtShell->GetAttrPool(),
+ aTxtFmtCollSetRange );
+ if( pReplList->Get( aReplSet ).Count() )
+ {
+ ::SfxToSwPageDescAttr( *pWrtShell, aReplSet );
+ pWrtShell->SwEditShell::SetAttr( aReplSet );
+ }
+ }
+ }
+
+ pWrtShell->EndAllAction();
+}
+
+
+
+SwSearchOptions::SwSearchOptions( SwWrtShell* pSh, sal_Bool bBackward )
+{
+ eStart = DOCPOS_CURR;
+ if( bBackward )
+ {
+ eEnd = DOCPOS_START;
+ bDontWrap = pSh->IsEndOfDoc();
+ }
+ else
+ {
+ eEnd = DOCPOS_END;
+ bDontWrap = pSh->IsStartOfDoc();
+ }
+}
+
+sal_uLong SwView::FUNC_Search( const SwSearchOptions& rOptions )
+{
+ sal_Bool bDoReplace = pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE ||
+ pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL;
+
+ int eRanges = pSrchItem->GetSelection() ?
+ FND_IN_SEL : bExtra ? FND_IN_OTHER : FND_IN_BODY;
+ if (pSrchItem->GetCommand() == SVX_SEARCHCMD_FIND_ALL ||
+ pSrchItem->GetCommand() == SVX_SEARCHCMD_REPLACE_ALL)
+ eRanges |= FND_IN_SELALL;
+
+ pWrtShell->SttSelect();
+
+ static sal_uInt16 aSearchAttrRange[] = {
+ RES_FRMATR_BEGIN, RES_FRMATR_END-1,
+ RES_CHRATR_BEGIN, RES_CHRATR_END-1,
+ RES_PARATR_BEGIN, RES_PARATR_END-1,
+ SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP,
+ 0 };
+
+ SfxItemSet aSrchSet( pWrtShell->GetAttrPool(), aSearchAttrRange);
+ if( pSrchList && pSrchList->Count() )
+ {
+ pSrchList->Get( aSrchSet );
+
+ /* -- Seitenumbruch mit Seitenvorlage */
+ ::SfxToSwPageDescAttr( *pWrtShell, aSrchSet );
+ }
+
+ SfxItemSet* pReplSet = 0;
+ if( bDoReplace && pReplList && pReplList->Count() )
+ {
+ pReplSet = new SfxItemSet( pWrtShell->GetAttrPool(),
+ aSearchAttrRange );
+ pReplList->Get( *pReplSet );
+
+ /* -- Seitenumbruch mit Seitenvorlage */
+ ::SfxToSwPageDescAttr( *pWrtShell, *pReplSet );
+
+ if( !pReplSet->Count() ) // schade, die Attribute
+ DELETEZ( pReplSet ); // kennen wir nicht
+ }
+
+ //
+ // build SearchOptions to be used
+ //
+ SearchOptions aSearchOpt( pSrchItem->GetSearchOptions() );
+ aSearchOpt.Locale = SvxCreateLocale( (sal_uInt16)GetAppLanguage() );
+ if( !bDoReplace )
+ aSearchOpt.replaceString = aEmptyStr;
+
+ sal_uLong nFound;
+ if( aSrchSet.Count() || ( pReplSet && pReplSet->Count() ))
+ {
+ nFound = pWrtShell->SearchAttr(
+ aSrchSet,
+ !pSrchItem->GetPattern(),
+ rOptions.eStart,
+ rOptions.eEnd,
+ FindRanges(eRanges),
+ pSrchItem->GetSearchString().Len() ? &aSearchOpt : 0,
+ pReplSet );
+ }
+ else if( pSrchItem->GetPattern() )
+ {
+ // Suchen (und ersetzen) von Vorlagen
+ const String sRplStr( pSrchItem->GetReplaceString() );
+ nFound = pWrtShell->SearchTempl( pSrchItem->GetSearchString(),
+ rOptions.eStart,
+ rOptions.eEnd,
+ FindRanges(eRanges),
+ bDoReplace ? &sRplStr : 0 );
+ }
+ else
+ {
+ // Normale Suche
+ nFound = pWrtShell->SearchPattern(aSearchOpt, pSrchItem->GetNotes(),
+ rOptions.eStart,
+ rOptions.eEnd,
+ FindRanges(eRanges),
+ bDoReplace );
+ }
+ pWrtShell->EndSelect();
+ return nFound;
+}
+
+LAYOUT_NS Dialog* SwView::GetSearchDialog()
+{
+ const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId();
+ SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)SfxViewFrame::Current()->GetChildWindow(nId);
+ if ( pWrp )
+ pSrchDlg = pWrp->getDialog ();
+ else
+ pSrchDlg = 0;
+ return pSrchDlg;
+}
+
+void SwView::StateSearch(SfxItemSet &rSet)
+{
+ SfxWhichIter aIter(rSet);
+ sal_uInt16 nWhich = aIter.FirstWhich();
+
+ while(nWhich)
+ {
+ switch(nWhich)
+ {
+ case SID_SEARCH_OPTIONS:
+ {
+ sal_uInt16 nOpt = 0xFFFF;
+ if( GetDocShell()->IsReadOnly() )
+ nOpt &= ~( SEARCH_OPTIONS_REPLACE |
+ SEARCH_OPTIONS_REPLACE_ALL );
+ rSet.Put( SfxUInt16Item( SID_SEARCH_OPTIONS, nOpt));
+ }
+ break;
+ case SID_SEARCH_ITEM:
+ {
+ if ( !pSrchItem )
+ {
+ pSrchItem = new SvxSearchItem( SID_SEARCH_ITEM );
+ pSrchItem->SetFamily(SFX_STYLE_FAMILY_PARA);
+ pSrchItem->SetSearchString( pWrtShell->GetSelTxt() );
+ }
+
+ if( bJustOpened && pWrtShell->IsSelection() )
+ {
+ String aTxt;
+ if( 1 == pWrtShell->GetCrsrCnt() &&
+ ( aTxt = pWrtShell->SwCrsrShell::GetSelTxt() ).Len() )
+ {
+ pSrchItem->SetSearchString( aTxt );
+ pSrchItem->SetSelection( sal_False );
+ }
+ else
+ pSrchItem->SetSelection( sal_True );
+ }
+
+ bJustOpened = sal_False;
+ rSet.Put( *pSrchItem );
+ }
+ break;
+ }
+ nWhich = aIter.NextWhich();
+ }
+}
+
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */