blob: 61768c8a150f31ed6d5cff4b0a26290f44ac8ead [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <string> // HACK: prevent conflict between STLPORT and Workshop headers
#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 <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;
}
/*-----------------12.04.97 13:04-------------------
--------------------------------------------------*/
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)
{
ASSERT(pSrchItem, "Search-Item fehlt");
if( !pSrchItem )
pSrchItem = new SvxSearchItem(SID_SEARCH_ITEM);
}
else
{
// SearchItem aus Request besorgen
ASSERT(pArgs, "Args fehlen");
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));
if ( Application::IsAccessibilityEnabled() )
{
const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId();
SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
if ( pWrp )
{
pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow());
pSrchDlg->SetDocWin( (Window*)pEditWin );
pSrchDlg->SetSrchFlag();
}
}
}
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));
if ( Application::IsAccessibilityEnabled() )
{
const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId();
SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
if ( pWrp )
{
pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow());
pSrchDlg->SetDocWin( (Window*)pEditWin );
pSrchDlg->SetSrchFlag();
}
}
}
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));
}
{
const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId();
SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
if ( pWrp )
{
pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow());
pSrchDlg->SetDocWin( (Window*)pEditWin );
pSrchDlg->SetSrchFlag();
}
}
break;
case SVX_SEARCHCMD_REPLACE_ALL:
{
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_uLong nFound;
{ //Scope for SwWait-Object
SwWait aWait( *GetDocShell(), true );
pWrtShell->StartAllAction();
nFound = FUNC_Search( aOpts );
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();
}
}
const sal_uInt16 nId = SvxSearchDialogWrapper::GetChildWindowId();
SvxSearchDialogWrapper *pWrp = (SvxSearchDialogWrapper*)GetViewFrame()->GetChildWindow(nId);
if ( pWrp )
{
pSrchDlg = (SvxSearchDialog*)(pWrp->GetWindow());
pSrchDlg->SetDocWin( (Window*)pEditWin );
pSrchDlg->SetSrchFlag();
}
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,
sizeof( aNormalAttr ) / sizeof( aNormalAttr[0] ),
0 );
if( SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
aArr.Insert( aCTLAttr,
sizeof( aCTLAttr ) / sizeof( aCTLAttr[0] ),
14 );
SvtCJKOptions aCJKOpt;
if( aCJKOpt.IsAnyEnabled() )
aArr.Insert( aCJKAttr,
sizeof( aCJKAttr ) / sizeof( aCJKAttr[0] ),
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:
#ifdef DBG_UTIL
if(nSlot)
{
ByteString sStr( "nSlot: " );
sStr += ByteString::CreateFromInt32( nSlot );
sStr += " falscher Dispatcher (viewsrch.cxx)";
DBG_ERROR( 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(), 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(), 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(), 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(), 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); // #111827#
pWrtShell->SetTxtFmtColl( pWrtShell->GetParaStyle(
pSrchItem->GetReplaceString(),
SwWrtShell::GETSTYLE_CREATESOME ));
pWrtShell->EndUndo(); // #111827#
}
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::SetAttrSet( 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 __READONLY_DATA 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;
/* case SID_SEARCH_REPLACESET:
case SID_SEARCH_SEARCHSET:
{
static sal_uInt16 __READONLY_DATA aSearchAttrRange[] =
{
RES_CHRATR_CASEMAP, RES_CHRATR_POSTURE,
RES_CHRATR_SHADOWED, RES_CHRATR_WORDLINEMODE,
RES_PARATR_LINESPACING, RES_PARATR_HYPHENZONE,
RES_LR_SPACE, RES_UL_SPACE,
SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP,
0
};
SfxItemSet aSet(pWrtShell->GetAttrPool(), aSearchAttrRange );
if( SID_SEARCH_REPLACESET==nWhich )
{
if( pReplList )
{
pReplList->Get( aSet );
DELETEZ( pReplList );
}
}
else if( pSrchList )
{
pSrchList->Get( aSet );
DELETEZ( pSrchList );
}
rSet.Put( SvxSetItem( nWhich, aSet ));
}
break;
*/
}
nWhich = aIter.NextWhich();
}
}