xref: /trunk/main/svx/source/dialog/srchdlg.cxx (revision b63233d8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <vcl/wrkwin.hxx>
29 #include <vcl/morebtn.hxx>
30 #include <vcl/msgbox.hxx>
31 #include <svl/slstitm.hxx>
32 #include <svl/itemiter.hxx>
33 #include <svl/style.hxx>
34 #include <unotools/searchopt.hxx>
35 #include <sfx2/dispatch.hxx>
36 #include <sfx2/objsh.hxx>
37 #include <sfx2/module.hxx>
38 #include <sfx2/viewsh.hxx>
39 #include <sfx2/basedlgs.hxx>
40 #include <svl/cjkoptions.hxx>
41 #include <com/sun/star/container/XNameAccess.hpp>
42 #include <com/sun/star/i18n/TransliterationModules.hpp>
43 #include <com/sun/star/frame/XDispatch.hpp>
44 #include <com/sun/star/frame/XDispatchProvider.hpp>
45 #include <com/sun/star/beans/PropertyValue.hpp>
46 #include <com/sun/star/frame/XModuleManager.hpp>
47 #include <comphelper/processfactory.hxx>
48 #include <svl/itempool.hxx>
49 #include <svl/intitem.hxx>
50 
51 #include <sfx2/app.hxx>
52 #include <toolkit/helper/vclunohelper.hxx>
53 
54 #define _SVX_SRCHDLG_CXX
55 #include "svx/srchdlg.hxx"
56 
57 #include <svx/dialogs.hrc>
58 #include <svx/svxitems.hrc>
59 #include "srchdlg.hrc"
60 
61 
62 #define	ITEMID_SETITEM		0
63 
64 #include <svl/srchitem.hxx>
65 #include <svx/pageitem.hxx>
66 #include "srchctrl.hxx"
67 #include <svx/dialmgr.hxx>
68 #include "svx/dlgutil.hxx"
69 #include <editeng/brshitem.hxx>
70 #include <tools/resary.hxx>
71 #include <svx/svxdlg.hxx> //CHINA001
72 
73 #ifndef _ACCESSIBLESVXFINDREPLACEDIALOG_HXX_
74 #include <svx/AccessibleSvxFindReplaceDialog.hxx>
75 #endif
76 using namespace com::sun::star::uno;
77 using namespace com::sun::star::accessibility;
78 
79 #include <sfx2/layout-pre.hxx>
80 
81 using namespace com::sun::star::i18n;
82 using namespace com::sun::star;
83 using namespace comphelper;
84 
85 // -----------------------------------------------------------------------
86 
87 #define REMEMBER_SIZE		10
88 
89 #define MODIFY_SEARCH		0x00000001
90 #define MODIFY_REPLACE		0x00000002
91 #define MODIFY_WORD			0x00000004
92 #define MODIFY_EXACT		0x00000008
93 #define MODIFY_BACKWARDS	0x00000010
94 #define MODIFY_SELECTION	0x00000020
95 #define MODIFY_REGEXP		0x00000040
96 #define MODIFY_LAYOUT		0x00000080
97 #define MODIFY_SIMILARITY	0x00000100
98 #define MODIFY_FORMULAS		0x00000200
99 #define MODIFY_VALUES		0x00000400
100 #define MODIFY_CALC_NOTES   0x00000800
101 #define MODIFY_ROWS			0x00001000
102 #define MODIFY_COLUMNS		0x00002000
103 #define MODIFY_ALLTABLES    0x00004000
104 #define MODIFY_NOTES        0x00008000
105 
106 SV_IMPL_VARARR(SrchAttrItemList, SearchAttrItem);
107 
108 //#define NotifyApp( nId )
109 //    rBindings.ExecuteSynchron( nId, (const SfxPoolItem**)&pSearchItem, 0L )
110 
111 #define GetCheckBoxValue( rBox )								\
112 	rBox.IsEnabled() ? rBox.IsChecked() : sal_False
113 
114 #if ENABLE_LAYOUT
115 #undef SVX_RES
116 #define SVX_RES(x) #x
117 #endif /* ENABLE_LAYOUT */
118 
119 struct SearchDlg_Impl
120 {
121 	FixedText	aSearchFormats;
122 	FixedText	aReplaceFormats;
123 
124     sal_Bool        bMultiLineEdit   : 1,
125                 bSaveToModule    : 1,
126                 bFocusOnSearch   : 1,
127                 bDeltaCalculated : 1;
128 	sal_uInt16*		pRanges;
129 	Timer		aSelectionTimer;
130 
131     uno::Reference< frame::XDispatch > xCommand1Dispatch;
132     uno::Reference< frame::XDispatch > xCommand2Dispatch;
133     util::URL   aCommand1URL;
134     util::URL   aCommand2URL;
135 
136 #if ENABLE_LAYOUT
SearchDlg_ImplSearchDlg_Impl137     SearchDlg_Impl( layout::Context* pParent ) :
138 #else /* !ENABLE_LAYOUT */
139         SearchDlg_Impl( Window* pParent ) :
140 #endif /* !ENABLE_LAYOUT */
141         aSearchFormats  ( pParent, SVX_RES( FT_SEARCH_FORMATS ) ),
142         aReplaceFormats ( pParent, SVX_RES( FT_REPLACE_FORMATS ) ),
143         bMultiLineEdit  ( sal_False ),
144         bSaveToModule   ( sal_True ),
145         bFocusOnSearch  ( sal_True ),
146         bDeltaCalculated( sal_False ),
147         pRanges         ( NULL )
148         {
149             aCommand1URL.Complete = aCommand1URL.Main = rtl::OUString::createFromAscii("vnd.sun.search:SearchViaComponent1");
150             aCommand1URL.Protocol = rtl::OUString::createFromAscii("vnd.sun.search:");
151             aCommand1URL.Path = rtl::OUString::createFromAscii("SearchViaComponent1");
152             aCommand2URL.Complete = aCommand2URL.Main = rtl::OUString::createFromAscii("vnd.sun.search:SearchViaComponent2");
153             aCommand2URL.Protocol = rtl::OUString::createFromAscii("vnd.sun.search:");
154             aCommand2URL.Path = rtl::OUString::createFromAscii("SearchViaComponent2");
155         }
~SearchDlg_ImplSearchDlg_Impl156 	~SearchDlg_Impl() { delete[] pRanges; }
157 };
158 
159 // -----------------------------------------------------------------------
160 
ListToStrArr_Impl(sal_uInt16 nId,SvStringsDtor & rStrLst,ComboBox & rCBox)161 void ListToStrArr_Impl( sal_uInt16 nId, SvStringsDtor& rStrLst, ComboBox& rCBox )
162 {
163 	SfxStringListItem* pSrchItem =
164 		(SfxStringListItem*)SFX_APP()->GetItem( nId );
165 	List* pLst = pSrchItem ? pSrchItem->GetList() : 0;
166 
167 	if ( pLst )
168 		for ( sal_uInt16 i = 0; i < pLst->Count(); ++i )
169 		{
170 			String* pTmp = new String( *(String*)( pLst->GetObject(i) ) );
171 			rStrLst.Insert( pTmp, rStrLst.Count() );
172 			rCBox.InsertEntry( *pTmp );
173 		}
174 }
175 
176 // -----------------------------------------------------------------------
177 
StrArrToList_Impl(sal_uInt16 nId,const SvStringsDtor & rStrLst)178 void StrArrToList_Impl( sal_uInt16 nId, const SvStringsDtor& rStrLst )
179 {
180 	DBG_ASSERT( rStrLst.Count(), "vorher abpruefen!!" );
181 	List aLst;
182 
183 	for ( sal_uInt16 i = 0; i < rStrLst.Count(); ++i )
184 		aLst.Insert( rStrLst[ i ], LIST_APPEND );
185 
186 	SFX_APP()->PutItem( SfxStringListItem( nId, &aLst ) );
187 }
188 
189 // class SearchAttrItemList ----------------------------------------------
190 
SearchAttrItemList(const SearchAttrItemList & rList)191 SearchAttrItemList::SearchAttrItemList( const SearchAttrItemList& rList ) :
192 
193 	SrchAttrItemList( (sal_uInt8)rList.Count() )
194 
195 {
196 	SrchAttrItemList::Insert( &rList, 0 );
197     SearchAttrItem* _pData = (SearchAttrItem*)GetData();
198 
199     for ( sal_uInt16 i = Count(); i; --i, ++_pData )
200         if ( !IsInvalidItem( _pData->pItem ) )
201             _pData->pItem = _pData->pItem->Clone();
202 }
203 
204 // -----------------------------------------------------------------------
205 
~SearchAttrItemList()206 SearchAttrItemList::~SearchAttrItemList()
207 {
208 	Clear();
209 }
210 
211 // -----------------------------------------------------------------------
212 
Put(const SfxItemSet & rSet)213 void SearchAttrItemList::Put( const SfxItemSet& rSet )
214 {
215 	if ( !rSet.Count() )
216 		return;
217 
218 	SfxItemPool* pPool = rSet.GetPool();
219 	SfxItemIter aIter( rSet );
220 	SearchAttrItem aItem;
221 	const SfxPoolItem* pItem = aIter.GetCurItem();
222 	sal_uInt16 nWhich;
223 
224 	while ( sal_True )
225 	{
226 		// nur testen, ob vorhanden ist ?
227 		if( IsInvalidItem( pItem ) )
228 		{
229 			nWhich = rSet.GetWhichByPos( aIter.GetCurPos() );
230 			aItem.pItem = (SfxPoolItem*)pItem;
231 		}
232 		else
233 		{
234 			nWhich = pItem->Which();
235 			aItem.pItem = pItem->Clone();
236 		}
237 
238 		aItem.nSlot = pPool->GetSlotId( nWhich );
239 		Insert( aItem );
240 
241 		if ( aIter.IsAtEnd() )
242 			break;
243 		pItem = aIter.NextItem();
244 	}
245 }
246 
247 // -----------------------------------------------------------------------
248 
Get(SfxItemSet & rSet)249 SfxItemSet& SearchAttrItemList::Get( SfxItemSet& rSet )
250 {
251 	SfxItemPool* pPool = rSet.GetPool();
252     SearchAttrItem* _pData = (SearchAttrItem*)GetData();
253 
254     for ( sal_uInt16 i = Count(); i; --i, ++_pData )
255         if ( IsInvalidItem( _pData->pItem ) )
256             rSet.InvalidateItem( pPool->GetWhich( _pData->nSlot ) );
257 		else
258             rSet.Put( *_pData->pItem );
259 	return rSet;
260 }
261 
262 // -----------------------------------------------------------------------
263 
Clear()264 void SearchAttrItemList::Clear()
265 {
266     SearchAttrItem* _pData = (SearchAttrItem*)GetData();
267 
268     for ( sal_uInt16 i = Count(); i; --i, ++_pData )
269         if ( !IsInvalidItem( _pData->pItem ) )
270             delete _pData->pItem;
271 	SrchAttrItemList::Remove( 0, Count() );
272 }
273 
274 // -----------------------------------------------------------------------
275 
276 // l"oscht die Pointer auf die Items
Remove(sal_uInt16 nPos,sal_uInt16 nLen)277 void SearchAttrItemList::Remove( sal_uInt16 nPos, sal_uInt16 nLen )
278 {
279 	if ( nPos + nLen > Count() )
280 		nLen = Count() - nPos;
281     SearchAttrItem* _pData = (SearchAttrItem*)GetData() + nPos;
282 
283     for ( sal_uInt16 n = nLen; n; --n, ++_pData )
284         if ( !IsInvalidItem( _pData->pItem ) )
285             delete _pData->pItem;
286 
287 	SrchAttrItemList::Remove( nPos, nLen );
288 }
289 
290 #if ENABLE_LAYOUT
291 #undef SfxModelessDialog
292 #define SfxModelessDialog(bindings, child, parent, id) SfxDialog (parent, "find-and-replace.xml", id, bindings, child)
293 #define SVX_RES_PLAIN(x) ResId (x, DIALOG_MGR ())
294 #define THIS_SVX_RES(x) this, #x
295 #else /* !ENABLE_LAYOUT */
296 #define SVX_RES_PLAIN SVX_RES
297 #define THIS_SVX_RES SVX_RES
298 #endif /* !ENABLE_LAYOUT */
299 
300 #undef INI_LIST
301 #define INI_LIST() \
302 	mpDocWin		(NULL),										\
303 	mbSuccess		(sal_False),									\
304 	aSearchText 	( this, SVX_RES( FT_SEARCH ) ),							\
305 	aSearchLB		( this, SVX_RES( ED_SEARCH ) ),							\
306 	aSearchTmplLB	( this, SVX_RES( LB_SEARCH ) ),							\
307 	aSearchAttrText ( this, SVX_RES( FT_SEARCH_ATTR ) ),						\
308 	aReplaceText	( this, SVX_RES( FT_REPLACE ) ),							\
309 	aReplaceLB		( this, SVX_RES( ED_REPLACE ) ),							\
310 	aReplaceTmplLB	( this, SVX_RES( LB_REPLACE ) ),							\
311 	aReplaceAttrText( this, SVX_RES( FT_REPLACE_ATTR ) ),						\
312     aSearchBtn      ( this, SVX_RES( BTN_SEARCH ) ),                          \
313 	aSearchAllBtn	( this, SVX_RES( BTN_SEARCH_ALL ) ),						\
314     aSearchCmdLine  ( this, SVX_RES( FL_SEARCH_COMMAND ) ),                   \
315     aReplaceBtn     ( this, SVX_RES( BTN_REPLACE ) ),                         \
316     aReplaceAllBtn  ( this, SVX_RES( BTN_REPLACE_ALL ) ),                     \
317     aSearchComponentFL( this, SVX_RES( FL_SEARCH_COMPONENT ) ), \
318     aSearchComponent1PB( this, SVX_RES( BTN_COMPONENT_1 ) ), \
319     aSearchComponent2PB( this, SVX_RES( BTN_COMPONENT_2 ) ), \
320     aMatchCaseCB    ( this, SVX_RES( CB_MATCH_CASE ) ),                       \
321     aWordBtn        ( this, SVX_RES( CB_WHOLE_WORDS ) ),                      \
322     aButtonsFL      ( this, SVX_RES( FL_BUTTONS ) ),                          \
323     pMoreBtn        ( new MoreButton( this, SVX_RES( BTN_MORE ) ) ),          \
324     aHelpBtn        ( this, SVX_RES( BTN_HELP ) ),                            \
325     aCloseBtn       ( this, SVX_RES( BTN_CLOSE ) ),                           \
326     aOptionsFL      ( this, SVX_RES( FL_OPTIONS ) ),                          \
327     aSelectionBtn   ( this, SVX_RES( CB_SELECTIONS ) ),                       \
328     aBackwardsBtn   ( this, SVX_RES( CB_BACKWARDS ) ),                        \
329     aRegExpBtn      ( this, SVX_RES( CB_REGEXP ) ),                           \
330     aSimilarityBox  ( this, SVX_RES( CB_SIMILARITY) ),                        \
331     aSimilarityBtn  ( this, SVX_RES( PB_SIMILARITY) ),                        \
332     aLayoutBtn      ( this, SVX_RES( CB_LAYOUTS ) ),                          \
333     aNotesBtn       ( this, SVX_RES( CB_NOTES ) ),                            \
334     aJapMatchFullHalfWidthCB( this, SVX_RES( CB_JAP_MATCH_FULL_HALF_WIDTH ) ),\
335     aJapOptionsCB   ( this, SVX_RES( CB_JAP_SOUNDS_LIKE ) ),                  \
336     aJapOptionsBtn  ( this, SVX_RES( PB_JAP_OPTIONS ) ),                      \
337     aAttributeBtn   ( this, SVX_RES( BTN_ATTRIBUTE ) ),                       \
338 	aFormatBtn		( this, SVX_RES( BTN_FORMAT ) ),							\
339 	aNoFormatBtn	( this, SVX_RES( BTN_NOFORMAT ) ),						\
340     aCalcFL         ( this, SVX_RES( FL_CALC ) ),                             \
341     aCalcSearchInFT ( this, SVX_RES( FT_CALC_SEARCHIN ) ),                    \
342     aCalcSearchInLB ( this, SVX_RES( LB_CALC_SEARCHIN ) ),                    \
343     aCalcSearchDirFT( this, SVX_RES( FT_CALC_SEARCHDIR ) ),                   \
344     aRowsBtn        ( this, SVX_RES( RB_CALC_ROWS ) ),                        \
345     aColumnsBtn     ( this, SVX_RES( RB_CALC_COLUMNS ) ),                     \
346     aAllSheetsCB    ( this, SVX_RES( CB_ALL_SHEETS ) ),                       \
347     rBindings       ( rBind ),                                              \
348     bWriter         ( sal_False ),                                              \
349     bSearch         ( sal_True ),                                               \
350 	bFormat 		( sal_False ),												\
351 	nOptions		( USHRT_MAX ),											\
352 	bSet			( sal_False ),												\
353 	bReadOnly		( sal_False ),												\
354 	bConstruct		( sal_True ),												\
355 	nModifyFlag		( 0 ),													\
356     aCalcStr        ( THIS_SVX_RES( STR_WORDCALC ) ),                       \
357     pImpl           ( NULL ),                                               \
358 	pSearchList 	( NULL ),												\
359 	pReplaceList	( new SearchAttrItemList ),                             \
360 	pSearchItem 	( NULL ),												\
361 	pSearchController		( NULL ),										\
362 	pOptionsController		( NULL ),										\
363 	pFamilyController		( NULL ),										\
364 	pSearchSetController	( NULL ),										\
365 	pReplaceSetController	( NULL ),										\
366 	nTransliterationFlags	( 0x00000000 )
367 
368 // class SvxSearchDialog -------------------------------------------------
369 
SvxSearchDialog(Window * pParent,SfxBindings & rBind)370 SvxSearchDialog::SvxSearchDialog( Window* pParent, SfxBindings& rBind ) :
371 
372 	SfxModelessDialog( &rBind, NULL, pParent, SVX_RES( RID_SVXDLG_SEARCH ) ),
373 
374 	INI_LIST()
375 
376 {
377 	Construct_Impl();
378 }
379 
380 // -----------------------------------------------------------------------
381 
SvxSearchDialog(Window * pParent,SfxChildWindow * pChildWin,SfxBindings & rBind)382 SvxSearchDialog::SvxSearchDialog( Window* pParent, SfxChildWindow* pChildWin, SfxBindings& rBind ) :
383 
384 	SfxModelessDialog( &rBind, pChildWin, pParent, SVX_RES( RID_SVXDLG_SEARCH ) ),
385 
386 	INI_LIST()
387 
388 {
389 	Construct_Impl();
390 }
391 
392 #undef INI_LIST
393 #if ENABLE_LAYOUT
394 #undef SVX_RES
395 #define SVX_RES(x) ResId (x, DIALOG_MGR ())
396 #endif
397 
398 // -----------------------------------------------------------------------
399 
~SvxSearchDialog()400 SvxSearchDialog::~SvxSearchDialog()
401 {
402 	Hide();
403 
404 	rBindings.EnterRegistrations();
405 	delete pSearchController;
406 	delete pOptionsController;
407 	delete pFamilyController;
408 	delete pSearchSetController;
409 	delete pReplaceSetController;
410 	rBindings.LeaveRegistrations();
411 
412 	delete pSearchItem;
413 	delete pImpl;
414 	delete pSearchList;
415 	delete pReplaceList;
416 	delete pMoreBtn;
417 }
418 
419 #if ENABLE_LAYOUT
420 #undef Window
421 #define Window layout::Window
422 #endif /* ENABLE_LAYOUT */
423 
lcl_MoveDown(Window & rWindow,sal_Int32 nOffset)424 void lcl_MoveDown( Window& rWindow, sal_Int32 nOffset )
425 {
426     Point aPos(rWindow.GetPosPixel());
427     aPos.Y() += nOffset;
428     rWindow.SetPosPixel(aPos);
429 }
430 
Construct_Impl()431 void SvxSearchDialog::Construct_Impl()
432 {
433 #if ENABLE_LAYOUT
434     SetHelpId (".uno:SearchDialog");
435 #endif /* ENABLE_LAYOUT */
436 
437 	// temporary to avoid incompatibility
438 	pImpl = new SearchDlg_Impl( this );
439 #if !ENABLE_LAYOUT
440 	pImpl->aSelectionTimer.SetTimeout( 500 );
441 	pImpl->aSelectionTimer.SetTimeoutHdl(
442 		LINK( this, SvxSearchDialog, TimeoutHdl_Impl ) );
443 #endif /* !ENABLE_LAYOUT */
444 	EnableControls_Impl( 0 );
445 
446 	// alten Text des aWordBtn's merken
447     aCalcStr += sal_Unicode('#');
448     aCalcStr += aWordBtn.GetText();
449 
450 	aLayoutStr = SVX_RESSTR( RID_SVXSTR_SEARCH_STYLES );
451 	aStylesStr = aLayoutBtn.GetText();
452 
453 	// gemerkte Such-Strings von der Applikation holen
454 	ListToStrArr_Impl( SID_SEARCHDLG_SEARCHSTRINGS,
455 					   aSearchStrings, aSearchLB 	);
456 	ListToStrArr_Impl( SID_SEARCHDLG_REPLACESTRINGS,
457 					   aReplaceStrings, aReplaceLB 	);
458 
459     pMoreBtn->SetMoreText( String( SVX_RES( STR_MORE_BTN ) ) );
460     pMoreBtn->SetLessText( String( SVX_RES( STR_LESS_BTN ) ) );
461 
462     FreeResource();
463 	InitControls_Impl();
464 
465 	// Attribut-Sets nur einmal im Ctor() besorgen
466     const SfxPoolItem* ppArgs[] = { pSearchItem, 0 };
467 	const SvxSetItem* pSrchSetItem =
468         (const SvxSetItem*) rBindings.GetDispatcher()->Execute( FID_SEARCH_SEARCHSET, SFX_CALLMODE_SLOT, ppArgs );
469 
470 	if ( pSrchSetItem )
471 		InitAttrList_Impl( &pSrchSetItem->GetItemSet(), 0 );
472 
473 	const SvxSetItem* pReplSetItem =
474         (const SvxSetItem*)rBindings.GetDispatcher()->Execute( FID_SEARCH_REPLACESET, SFX_CALLMODE_SLOT, ppArgs );
475 
476 	if ( pReplSetItem )
477 		InitAttrList_Impl( 0, &pReplSetItem->GetItemSet() );
478 
479 	// Controller erzeugen und gleich aktualisieren
480 	rBindings.EnterRegistrations();
481 	pSearchController =
482 		new SvxSearchController( SID_SEARCH_ITEM, rBindings, *this );
483 	pOptionsController =
484 		new SvxSearchController( SID_SEARCH_OPTIONS, rBindings, *this );
485 	rBindings.LeaveRegistrations();
486     rBindings.GetDispatcher()->Execute( FID_SEARCH_ON, SFX_CALLMODE_SLOT, ppArgs );
487 	pImpl->aSelectionTimer.Start();
488 
489 
490     SvtCJKOptions aCJKOptions;
491     if(!aCJKOptions.IsJapaneseFindEnabled())
492     {
493         aJapOptionsCB.Check( sal_False );
494         aJapOptionsCB.Hide();
495         aJapOptionsBtn.Hide();
496     }
497     if(!aCJKOptions.IsCJKFontEnabled())
498     {
499         aJapMatchFullHalfWidthCB.Hide();
500     }
501 
502 	aSimilarityBtn.SetAccessibleRelationLabeledBy(&aSimilarityBox);
503 	aSimilarityBtn.SetAccessibleRelationMemberOf(&aOptionsFL);
504 	aJapOptionsBtn.SetAccessibleRelationLabeledBy(&aJapOptionsCB);
505 	aJapOptionsBtn.SetAccessibleRelationMemberOf(&aOptionsFL);
506 	aRowsBtn.SetAccessibleRelationMemberOf(&aCalcSearchDirFT);
507     aColumnsBtn.SetAccessibleRelationMemberOf(&aCalcSearchDirFT);
508 
509     //component extension - show component search buttons if the commands
510     // vnd.sun.star::SearchViaComponent1 and 2 are supported
511     const uno::Reference< frame::XFrame >xFrame = rBindings.GetActiveFrame();
512     const uno::Reference< frame::XDispatchProvider > xDispatchProv(xFrame, uno::UNO_QUERY);
513     rtl::OUString sTarget = rtl::OUString::createFromAscii("_self");
514 
515     bool bSearchComponent1 = false;
516     bool bSearchComponent2 = false;
517     if(xDispatchProv.is() &&
518             (pImpl->xCommand1Dispatch = xDispatchProv->queryDispatch(pImpl->aCommand1URL, sTarget, 0)).is())
519     {
520         bSearchComponent1 = true;
521     }
522     if(xDispatchProv.is() &&
523             (pImpl->xCommand2Dispatch = xDispatchProv->queryDispatch(pImpl->aCommand2URL, sTarget, 0)).is())
524     {
525         bSearchComponent2 = true;
526     }
527 
528     if( bSearchComponent1 || bSearchComponent2 )
529     {
530         //get the labels of the FixedLine and the buttons
531         // "/org.openoffice.Office.Common/SearchOptions/ComponentSearchGroupLabel
532         // "/org.openoffice.Office.Common/SearchOptions/ComponentSearchCommandLabel1
533         // "/org.openoffice.Office.Common/SearchOptions/ComponentSearchCommandLabel2
534         try
535         {
536             uno::Reference< lang::XMultiServiceFactory >  xMgr = getProcessServiceFactory();
537             uno::Reference< lang::XMultiServiceFactory > xConfigurationProvider(xMgr->createInstance(
538                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider"))),
539                     uno::UNO_QUERY);
540             uno::Sequence< uno::Any > aArgs(1);
541             ::rtl::OUString sPath(RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/SearchOptions/"));
542             aArgs[0] <<= sPath;
543 
544             uno::Reference< uno::XInterface > xIFace = xConfigurationProvider->createInstanceWithArguments(
545                         ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationUpdateAccess")),
546                         aArgs);
547             uno::Reference< container::XNameAccess> xDirectAccess(xIFace, uno::UNO_QUERY);
548             if(xDirectAccess.is())
549             {
550                 ::rtl::OUString sTemp;
551                 ::rtl::OUString sProperty(RTL_CONSTASCII_USTRINGPARAM( "ComponentSearchGroupLabel"));
552                 uno::Any aRet = xDirectAccess->getByName(sProperty);
553                 aRet >>= sTemp;
554                 aSearchComponentFL.SetText( sTemp );
555                 aRet = xDirectAccess->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ComponentSearchCommandLabel1")));
556                 aRet >>= sTemp;
557                 aSearchComponent1PB.SetText( sTemp );
558                 aRet = xDirectAccess->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ComponentSearchCommandLabel2")));
559                 aRet >>= sTemp;
560                 aSearchComponent2PB.SetText( sTemp );
561             }
562         }
563         catch(uno::Exception&){}
564 
565         if(aSearchComponent1PB.GetText().Len() && bSearchComponent1 )
566         {
567             aSearchComponentFL.Show();
568             aSearchComponent1PB.Show();
569         }
570         if( aSearchComponent2PB.GetText().Len() )
571         {
572             if(!aSearchComponent1PB.IsVisible())
573             {
574                 aSearchComponent2PB.SetPosPixel(aSearchComponent1PB.GetPosPixel());
575             }
576             aSearchComponentFL.Show();
577             aSearchComponent2PB.Show();
578         }
579         if( aSearchComponentFL.IsVisible() && aSearchComponent1PB.IsVisible() )
580         {
581 
582             //dialog must be resized
583             Size aDlgSize(GetSizePixel());
584             sal_Int32 nOffset = aSearchCmdLine.GetPosPixel().Y() - aSearchAllBtn.GetPosPixel().Y()
585                 - aButtonsFL.GetPosPixel().Y() + aSearchComponent2PB.GetPosPixel().Y();
586 
587             aDlgSize.Height() += nOffset;
588             Window* aWindows[] =
589             {
590                 &aOptionsFL,
591                 &aSelectionBtn,
592                 &aBackwardsBtn,
593                 &aRegExpBtn,
594                 &aSimilarityBox,
595                 &aSimilarityBtn,
596                 &aLayoutBtn,
597                 &aNotesBtn,
598                 &aJapMatchFullHalfWidthCB,
599                 &aJapOptionsCB,
600                 &aJapOptionsBtn,
601                 &aAttributeBtn,
602                 &aFormatBtn,
603                 &aNoFormatBtn,
604                 &aCalcFL,
605                 &aCalcSearchInFT,
606                 &aCalcSearchInLB,
607                 &aCalcSearchDirFT,
608                 &aRowsBtn,
609                 &aColumnsBtn,
610                 &aAllSheetsCB,
611                 &aButtonsFL,
612                 &aHelpBtn,
613                 &aCloseBtn,
614                 pMoreBtn,
615                 0
616             };
617             sal_Int32 nWindow = 0;
618             do
619             {
620                 lcl_MoveDown( *aWindows[nWindow], nOffset );
621             }
622             while(aWindows[++nWindow]);
623 
624             SetSizePixel(aDlgSize);
625         }
626     }
627 }
628 
629 // -----------------------------------------------------------------------
630 
Close()631 sal_Bool SvxSearchDialog::Close()
632 {
633 	// remember strings speichern
634 	if ( aSearchStrings.Count() )
635 		StrArrToList_Impl( SID_SEARCHDLG_SEARCHSTRINGS, aSearchStrings );
636 
637 	if ( aReplaceStrings.Count() )
638 		StrArrToList_Impl( SID_SEARCHDLG_REPLACESTRINGS, aReplaceStrings );
639 
640 	// save settings to configuration
641 	SvtSearchOptions aOpt;
642 	aOpt.SetWholeWordsOnly			( aWordBtn				  .IsChecked() );
643 	aOpt.SetBackwards				( aBackwardsBtn			  .IsChecked() );
644 	aOpt.SetUseRegularExpression	( aRegExpBtn			  .IsChecked() );
645 	//aOpt.SetMatchCase				( aMatchCaseCB			  .IsChecked() );
646 	aOpt.SetSearchForStyles			( aLayoutBtn			  .IsChecked() );
647 	aOpt.SetSimilaritySearch		( aSimilarityBox		  .IsChecked() );
648     //aOpt.SetMatchFullHalfWidthForms   ( !aJapMatchFullHalfWidthCB.IsChecked() );
649 	aOpt.SetUseAsianOptions			( aJapOptionsCB		  	  .IsChecked() );
650     	aOpt.SetNotes                   ( aNotesBtn               .IsChecked() );
651 
652     const SfxPoolItem* ppArgs[] = { pSearchItem, 0 };
653     rBindings.GetDispatcher()->Execute( FID_SEARCH_OFF, SFX_CALLMODE_SLOT, ppArgs );
654     rBindings.Execute( SID_SEARCH_DLG );
655 
656 	return sal_True;
657 }
658 
659 // -----------------------------------------------------------------------
660 
GetTransliterationFlags() const661 sal_Int32 SvxSearchDialog::GetTransliterationFlags() const
662 {
663     if (!aMatchCaseCB.IsChecked())
664 		nTransliterationFlags |=  TransliterationModules_IGNORE_CASE;
665 	else
666 		nTransliterationFlags &= ~TransliterationModules_IGNORE_CASE;
667     if ( !aJapMatchFullHalfWidthCB.IsChecked())
668 		nTransliterationFlags |=  TransliterationModules_IGNORE_WIDTH;
669 	else
670 		nTransliterationFlags &= ~TransliterationModules_IGNORE_WIDTH;
671 	return nTransliterationFlags;
672 }
673 
674 // -----------------------------------------------------------------------
675 
ApplyTransliterationFlags_Impl(sal_Int32 nSettings)676 void SvxSearchDialog::ApplyTransliterationFlags_Impl( sal_Int32 nSettings )
677 {
678 	nTransliterationFlags = nSettings;
679 	sal_Bool bVal = 0 != (nSettings & TransliterationModules_IGNORE_CASE);
680     aMatchCaseCB            .Check(!bVal );
681 	bVal = 0 != (nSettings & TransliterationModules_IGNORE_WIDTH);
682     aJapMatchFullHalfWidthCB.Check( !bVal );
683 }
684 
685 // -----------------------------------------------------------------------
686 
Activate()687 void SvxSearchDialog::Activate()
688 {
689 	// apply possible transliteration changes of the SvxSearchItem member
690 	DBG_ASSERT( pSearchItem, "SearchItem missing" );
691 	if (pSearchItem)
692 	{
693 		aMatchCaseCB            .Check( pSearchItem->GetExact() );
694         aJapMatchFullHalfWidthCB.Check( !pSearchItem->IsMatchFullHalfWidthForms() );
695 	}
696 }
697 
698 // -----------------------------------------------------------------------
699 
InitControls_Impl()700 void SvxSearchDialog::InitControls_Impl()
701 {
702 	// CaseSensitives AutoComplete
703 	aSearchLB.EnableAutocomplete( sal_True, sal_True );
704 	aSearchLB.Show();
705 	aReplaceLB.EnableAutocomplete( sal_True, sal_True );
706 	aReplaceLB.Show();
707 
708 	aFormatBtn.Disable();
709 	aAttributeBtn.Disable();
710 
711 	aSearchLB.SetModifyHdl( LINK( this, SvxSearchDialog, ModifyHdl_Impl ) );
712 	aReplaceLB.SetModifyHdl( LINK( this, SvxSearchDialog, ModifyHdl_Impl ) );
713 
714 	Link aLink = LINK( this, SvxSearchDialog, FocusHdl_Impl );
715 	aSearchLB.SetGetFocusHdl( aLink );
716 	pImpl->aSearchFormats.SetGetFocusHdl( aLink );
717 
718 	aReplaceLB.SetGetFocusHdl( aLink );
719 	pImpl->aReplaceFormats.SetGetFocusHdl( aLink );
720 
721 	aLink = LINK( this, SvxSearchDialog, LoseFocusHdl_Impl );
722 	aSearchLB.SetLoseFocusHdl( aLink );
723 	aReplaceLB.SetLoseFocusHdl( aLink );
724 
725 	aSearchTmplLB.SetLoseFocusHdl( aLink );
726 	aReplaceTmplLB.SetLoseFocusHdl( aLink );
727 
728 	aLink = LINK( this, SvxSearchDialog, CommandHdl_Impl );
729 	aSearchBtn.SetClickHdl( aLink );
730 	aSearchAllBtn.SetClickHdl( aLink );
731 	aReplaceBtn.SetClickHdl( aLink );
732 	aReplaceAllBtn.SetClickHdl( aLink );
733 	aCloseBtn.SetClickHdl( aLink );
734 	aSimilarityBtn.SetClickHdl( aLink );
735 	aJapOptionsBtn.SetClickHdl( aLink );
736     aSearchComponent1PB.SetClickHdl( aLink );
737     aSearchComponent2PB.SetClickHdl( aLink );
738 
739 	aLink = LINK( this, SvxSearchDialog, FlagHdl_Impl );
740 	aWordBtn.SetClickHdl( aLink );
741 	aSelectionBtn.SetClickHdl( aLink );
742 	aMatchCaseCB.SetClickHdl( aLink );
743 	aRegExpBtn.SetClickHdl( aLink );
744     aBackwardsBtn.SetClickHdl( aLink );
745     aNotesBtn.SetClickHdl( aLink );
746 	aSimilarityBox.SetClickHdl( aLink );
747 	aJapOptionsCB.SetClickHdl( aLink );
748 	aJapMatchFullHalfWidthCB.SetClickHdl( aLink );
749 
750 	aLayoutBtn.SetClickHdl( LINK( this, SvxSearchDialog, TemplateHdl_Impl ) );
751 	aFormatBtn.SetClickHdl( LINK( this, SvxSearchDialog, FormatHdl_Impl ) );
752 	aNoFormatBtn.SetClickHdl(
753 		LINK( this, SvxSearchDialog, NoFormatHdl_Impl ) );
754 	aAttributeBtn.SetClickHdl(
755 		LINK( this, SvxSearchDialog, AttributeHdl_Impl ) );
756 
757     // check if buttontext is to wide
758     long nTxtW = Max( pMoreBtn->GetCtrlTextWidth( pMoreBtn->GetMoreText() ),
759                       pMoreBtn->GetCtrlTextWidth( pMoreBtn->GetLessText() ) );
760     nTxtW += ( pMoreBtn->GetTextHeight() * 2 ); // add image size + offset
761     long nBtnW = pMoreBtn->GetSizePixel().Width();
762     if ( nTxtW > nBtnW )
763     {
764         // broaden the button
765         const long nMinDelta = 10;
766         long nDelta = Max( nTxtW - nBtnW, nMinDelta );
767         Size aNewSize = pMoreBtn->GetSizePixel();
768         aNewSize.Width() += nDelta;
769         pMoreBtn->SetSizePixel( aNewSize );
770     }
771 }
772 
773 // -----------------------------------------------------------------------
774 
CalculateDelta_Impl()775 void SvxSearchDialog::CalculateDelta_Impl()
776 {
777     DBG_ASSERT( pSearchItem, "no search item" );
778 
779     bool bDrawApp = false;
780     bool bCalcApp = false;
781     bool bWriterApp = false;
782     bool bImpressApp = false;
783     const uno::Reference< frame::XFrame > xFrame = rBindings.GetActiveFrame();
784     uno::Reference< frame::XModuleManager > xModuleManager(
785         ::comphelper::getProcessServiceFactory()->createInstance(
786             DEFINE_CONST_UNICODE("com.sun.star.frame.ModuleManager") ), uno::UNO_QUERY );
787     if ( xModuleManager.is() )
788     {
789         try
790         {
791             ::rtl::OUString aModuleIdentifier = xModuleManager->identify( xFrame );
792             bCalcApp = aModuleIdentifier.equalsAscii( "com.sun.star.sheet.SpreadsheetDocument" );
793             bDrawApp = aModuleIdentifier.equalsAscii( "com.sun.star.drawing.DrawingDocument" );
794             bImpressApp = aModuleIdentifier.equalsAscii( "com.sun.star.presentation.PresentationDocument" );
795             bWriterApp = aModuleIdentifier.equalsAscii( "com.sun.star.text.TextDocument" );
796         }
797         catch ( uno::Exception& )
798         {
799         }
800     }
801 
802     if ( pImpl->bDeltaCalculated )
803         return;
804     else
805         pImpl->bDeltaCalculated = sal_True;
806 
807     sal_uIntPtr nDelta = 187, nOffset = 0;
808     SvtCJKOptions aCJKOptions;
809 
810     pMoreBtn->AddWindow( &aOptionsFL );
811     if ( !bDrawApp )
812         pMoreBtn->AddWindow( &aLayoutBtn );
813     if ( bWriterApp )
814         pMoreBtn->AddWindow( &aNotesBtn );
815 	else
816 	{
817 		aNotesBtn.Hide();
818         nOffset = !bDrawApp ? 13 : 0;
819 	}
820     pMoreBtn->AddWindow( &aBackwardsBtn );
821     if ( !bDrawApp )
822         pMoreBtn->AddWindow( &aRegExpBtn );
823     pMoreBtn->AddWindow( &aSimilarityBox );
824     pMoreBtn->AddWindow( &aSimilarityBtn );
825     pMoreBtn->AddWindow( &aSelectionBtn );
826 
827     if ( aCJKOptions.IsCJKFontEnabled() )
828         pMoreBtn->AddWindow( &aJapMatchFullHalfWidthCB );
829     else
830         nOffset += 13;
831     if ( aCJKOptions.IsJapaneseFindEnabled() )
832     {
833         pMoreBtn->AddWindow( &aJapOptionsCB );
834         pMoreBtn->AddWindow( &aJapOptionsBtn );
835     }
836     else
837         nOffset += 17;
838 
839     if ( bWriter )
840     {
841         pMoreBtn->AddWindow( &aAttributeBtn );
842         pMoreBtn->AddWindow( &aFormatBtn );
843         pMoreBtn->AddWindow( &aNoFormatBtn );
844     }
845 
846     if (bDrawApp || bImpressApp)
847     {
848         // "Find All" button is hidden--align "Find" vertically to the
849         // search listbox
850         Point aNewPt(aSearchBtn.GetPosPixel());
851         const Size aBtnSz(aSearchBtn.GetSizePixel());
852         const Size aLBSz(aSearchLB.GetSizePixel());
853         const int nOff((aLBSz.Height() - aBtnSz.Height()) / 2);
854         aNewPt.Y() = aSearchLB.GetPosPixel().Y() + nOff;
855         aSearchBtn.SetPosPixel(aNewPt);
856     }
857 
858     if ( bDrawApp )
859     {
860         // Draw App: "Regular expressions" and "Search for Styles" check boxes are hidden
861         // so align the other buttons
862         const long nAppFontHeight = 13; // checkbox height + space between in APPFONT
863         long nH = LogicToPixel( Size( 0, nAppFontHeight ), MAP_APPFONT ).Height();
864 
865         Point aNewPos = aSimilarityBox.GetPosPixel();
866         aNewPos.Y() -= nH;
867         aSimilarityBox.SetPosPixel( aNewPos );
868         aNewPos = aSimilarityBtn.GetPosPixel();
869         aNewPos.Y() -= nH;
870         aSimilarityBtn.SetPosPixel( aNewPos );
871         nH *= 3;
872         nOffset += ( 3 * nAppFontHeight );
873         if ( aCJKOptions.IsCJKFontEnabled() )
874         {
875             aNewPos = aJapMatchFullHalfWidthCB.GetPosPixel();
876             aNewPos.Y() -= nH;
877             aJapMatchFullHalfWidthCB.SetPosPixel( aNewPos );
878         }
879         if ( aCJKOptions.IsJapaneseFindEnabled() )
880         {
881             aNewPos = aJapOptionsCB.GetPosPixel();
882             aNewPos.Y() -= nH;
883             aJapOptionsCB.SetPosPixel( aNewPos );
884             aNewPos = aJapOptionsBtn.GetPosPixel();
885             aNewPos.Y() -= nH;
886             aJapOptionsBtn.SetPosPixel( aNewPos );
887         }
888     }
889 
890     if ( bCalcApp || bImpressApp )
891     {
892         Window* pWins[] =
893         {
894             &aCalcFL, &aCalcSearchInFT, &aCalcSearchInLB, &aCalcSearchDirFT,
895             &aRowsBtn, &aColumnsBtn, &aAllSheetsCB, &aJapMatchFullHalfWidthCB,
896 			&aJapOptionsCB, &aJapOptionsBtn
897         };
898         Window** pCurrent = pWins;
899         sal_uInt32 i = 0;
900         const sal_uInt32 nCalcCtrlCount = 7;
901         if ( nOffset > 0 )
902         {
903             long nH = LogicToPixel( Size( 0, nOffset ), MAP_APPFONT ).Height();
904             for ( i = 0; i < sizeof( pWins ) / sizeof( pWins[ 0 ] ); ++i, ++pCurrent )
905             {
906                 if ( ( bCalcApp && i < nCalcCtrlCount )
907                     || ( i == nCalcCtrlCount && aCJKOptions.IsCJKFontEnabled() )
908                     || ( i > nCalcCtrlCount && aCJKOptions.IsJapaneseFindEnabled() ) )
909 				{
910 					Point aNewPos = (*pCurrent)->GetPosPixel();
911 					aNewPos.Y() -= nH;
912 					(*pCurrent)->SetPosPixel( aNewPos );
913 				}
914             }
915         }
916 
917         if ( bCalcApp)
918         {
919             pCurrent = pWins;
920             for ( i = 0; i < nCalcCtrlCount; ++i, ++pCurrent )
921                 pMoreBtn->AddWindow( *pCurrent );
922         }
923         else
924             nOffset += 64;
925     }
926     else
927         nOffset += 64;
928 
929     pMoreBtn->SetDelta( nDelta - nOffset );
930     pMoreBtn->Show();
931     pMoreBtn->Enable();
932 }
933 
934 #if ENABLE_LAYOUT
935 #undef Window
936 #define Window ::Window
937 #endif /* ENABLE_LAYOUT */
938 
939 // -----------------------------------------------------------------------
940 
Init_Impl(int bSearchPattern)941 void SvxSearchDialog::Init_Impl( int bSearchPattern )
942 {
943 	DBG_ASSERT( pSearchItem, "SearchItem == 0" );
944 	bWriter = ( pSearchItem->GetAppFlag() == SVX_SEARCHAPP_WRITER );
945 
946 	pImpl->bMultiLineEdit = sal_False;
947 
948 	if ( !pImpl->bMultiLineEdit )
949 	{
950 		pImpl->aSearchFormats.Hide();
951 		aSearchAttrText.Show();
952 		pImpl->aReplaceFormats.Hide();
953 		aReplaceAttrText.Show();
954 	}
955 	else
956 	{
957 		String aText = aSearchAttrText.GetText();
958 		aSearchAttrText.Hide();
959 
960 		if ( aText.Len() )
961 			pImpl->aSearchFormats.SetText( aText );
962 		pImpl->aSearchFormats.Show();
963 		aText = aReplaceAttrText.GetText();
964 		aReplaceAttrText.Hide();
965 
966 		if ( aText.Len() )
967 			pImpl->aReplaceFormats.SetText( aText );
968 		pImpl->aReplaceFormats.Show();
969 	}
970 
971 	if ( ( nModifyFlag & MODIFY_WORD ) == 0 )
972  		aWordBtn.Check( pSearchItem->GetWordOnly() );
973 	if ( ( nModifyFlag & MODIFY_EXACT ) == 0 )
974 		aMatchCaseCB.Check( pSearchItem->GetExact() );
975     if ( ( nModifyFlag & MODIFY_BACKWARDS ) == 0 )
976         aBackwardsBtn.Check( pSearchItem->GetBackward() );
977     if ( ( nModifyFlag & MODIFY_NOTES ) == 0 )
978         aNotesBtn.Check( pSearchItem->GetNotes() );
979 	if ( ( nModifyFlag & MODIFY_SELECTION ) == 0 )
980 		aSelectionBtn.Check( pSearchItem->GetSelection() );
981 	if ( ( nModifyFlag & MODIFY_REGEXP ) == 0 )
982 		aRegExpBtn.Check( pSearchItem->GetRegExp() );
983 	if ( ( nModifyFlag & MODIFY_LAYOUT ) == 0 )
984 		aLayoutBtn.Check( pSearchItem->GetPattern() );
985 	if (aNotesBtn.IsChecked())
986 		aLayoutBtn.Disable();
987 	aSimilarityBox.Check( pSearchItem->IsLevenshtein() );
988 	if( aJapOptionsCB.IsVisible() )
989 		aJapOptionsCB.Check( pSearchItem->IsUseAsianOptions() );
990 	ApplyTransliterationFlags_Impl( pSearchItem->GetTransliterationFlags() );
991 
992     CalculateDelta_Impl();
993 
994 	bool bDraw = sal_False;
995     if ( pSearchItem->GetAppFlag() == SVX_SEARCHAPP_CALC )
996 	{
997         Link aLink = LINK( this, SvxSearchDialog, FlagHdl_Impl );
998         aCalcSearchInLB.SetSelectHdl( aLink );
999 		aRowsBtn.SetClickHdl( aLink );
1000 		aColumnsBtn.SetClickHdl( aLink );
1001         aAllSheetsCB.SetClickHdl( aLink );
1002 
1003 		switch ( pSearchItem->GetCellType() )
1004 		{
1005 			case SVX_SEARCHIN_FORMULA:
1006 				if ( ( nModifyFlag & MODIFY_FORMULAS ) == 0 )
1007                     aCalcSearchInLB.SelectEntryPos( SVX_SEARCHIN_FORMULA );
1008 				break;
1009 
1010 			case SVX_SEARCHIN_VALUE:
1011 				if ( ( nModifyFlag & MODIFY_VALUES ) == 0 )
1012                     aCalcSearchInLB.SelectEntryPos( SVX_SEARCHIN_VALUE );
1013 				break;
1014 
1015 			case SVX_SEARCHIN_NOTE:
1016                 if ( ( nModifyFlag & MODIFY_CALC_NOTES ) == 0 )
1017                     aCalcSearchInLB.SelectEntryPos( SVX_SEARCHIN_NOTE );
1018 				break;
1019 		}
1020 		aWordBtn.SetText( aCalcStr.GetToken( 0, '#' ) );
1021 
1022 		if ( pSearchItem->GetRowDirection() &&
1023 			 ( nModifyFlag & MODIFY_ROWS ) == 0 )
1024 			aRowsBtn.Check();
1025 		else if ( !pSearchItem->GetRowDirection() &&
1026 				  ( nModifyFlag & MODIFY_COLUMNS ) == 0 )
1027 			aColumnsBtn.Check();
1028 
1029 		if ( ( nModifyFlag & MODIFY_ALLTABLES ) == 0 )
1030             aAllSheetsCB.Check( pSearchItem->IsAllTables() );
1031 
1032 		// nur im Writer Suche nach Formatierung
1033 		aFormatBtn.Hide();
1034 		aNoFormatBtn.Hide();
1035 		aAttributeBtn.Hide();
1036 	}
1037 	else
1038 	{
1039 		aWordBtn.SetText( aCalcStr.GetToken( 1, '#' ) );
1040 
1041 		if ( pSearchItem->GetAppFlag() == SVX_SEARCHAPP_DRAW )
1042 		{
1043 			aSearchAllBtn.Hide();
1044 
1045 			aRegExpBtn.Hide();
1046 			aLayoutBtn.Hide();
1047 
1048 			// nur im Writer Suche nach Formatierung
1049 			aFormatBtn.Hide();
1050 			aNoFormatBtn.Hide();
1051 			aAttributeBtn.Hide();
1052 			bDraw = sal_True;
1053 		}
1054 		else
1055 		{
1056 			if ( !pSearchList )
1057 			{
1058 				// Attribut-Sets besorgen, wenn noch nicht geschehen
1059                 const SfxPoolItem* ppArgs[] = { pSearchItem, 0 };
1060 				const SvxSetItem* pSrchSetItem =
1061                 (const SvxSetItem*)rBindings.GetDispatcher()->Execute( FID_SEARCH_SEARCHSET, SFX_CALLMODE_SLOT, ppArgs );
1062 
1063 				if ( pSrchSetItem )
1064 					InitAttrList_Impl( &pSrchSetItem->GetItemSet(), 0 );
1065 
1066 				const SvxSetItem* pReplSetItem =
1067                 (const SvxSetItem*)rBindings.GetDispatcher()->Execute( FID_SEARCH_REPLACESET, SFX_CALLMODE_SLOT, ppArgs );
1068 
1069 				if ( pReplSetItem )
1070 					InitAttrList_Impl( 0, &pReplSetItem->GetItemSet() );
1071 			}
1072 /*
1073 			aFormatBtn.Show();
1074 			aNoFormatBtn.Show();
1075 			aAttributeBtn.Show();
1076 */
1077 		}
1078 //       pMoreBtn->SetState( sal_False );
1079 //       pMoreBtn->Hide();
1080 	}
1081 
1082     if ( 0 && !bDraw ) //!!!!!
1083 	{
1084 		aRegExpBtn.Show();
1085 		aLayoutBtn.Show();
1086 	}
1087 
1088 	// "Ahnlichkeitssuche?
1089 	if ( ( nModifyFlag & MODIFY_SIMILARITY ) == 0 )
1090 		aSimilarityBox.Check( pSearchItem->IsLevenshtein() );
1091 	bSet = sal_True;
1092 
1093 	pImpl->bSaveToModule = sal_False;
1094 	FlagHdl_Impl( &aSimilarityBox );
1095 	FlagHdl_Impl( &aJapOptionsCB );
1096 	pImpl->bSaveToModule = sal_True;
1097 
1098 	bool bDisableSearch = sal_False;
1099 	SfxViewShell* pViewShell = SfxViewShell::Current();
1100 
1101 	if ( pViewShell )
1102 	{
1103 		sal_Bool bText = !bSearchPattern;
1104 
1105 		if ( pViewShell->HasSelection( bText ) )
1106 			EnableControl_Impl( &aSelectionBtn );
1107 		else
1108 		{
1109 			aSelectionBtn.Check( sal_False );
1110 			aSelectionBtn.Disable();
1111 		}
1112 	}
1113 
1114 	// Patternsuche und es wurden keine AttrSets "ubergeben
1115 	if ( bSearchPattern )
1116 	{
1117 		SfxObjectShell* pShell = SfxObjectShell::Current();
1118 
1119 		if ( pShell && pShell->GetStyleSheetPool() )
1120 		{
1121 			// Vorlagen beschaffen
1122 			aSearchTmplLB .Clear();
1123 			aReplaceTmplLB.Clear();
1124 			SfxStyleSheetBasePool* pStylePool = pShell->GetStyleSheetPool();
1125 			pStylePool->SetSearchMask( pSearchItem->GetFamily(),
1126 									   SFXSTYLEBIT_ALL );
1127 			SfxStyleSheetBase* pBase = pStylePool->First();
1128 
1129 			while ( pBase )
1130 			{
1131 				if ( pBase->IsUsed() )
1132 					aSearchTmplLB.InsertEntry( pBase->GetName() );
1133 				aReplaceTmplLB.InsertEntry( pBase->GetName() );
1134 				pBase = pStylePool->Next();
1135 			}
1136 			aSearchTmplLB.SelectEntry( pSearchItem->GetSearchString() );
1137 			aReplaceTmplLB.SelectEntry( pSearchItem->GetReplaceString() );
1138 
1139 		}
1140 		aSearchTmplLB.Show();
1141 
1142 		if ( bConstruct )
1143 			// nur nach dem Erzeugen den Fokus grappen
1144 			aSearchTmplLB.GrabFocus();
1145 		aReplaceTmplLB.Show();
1146 		aSearchLB.Hide();
1147 		aReplaceLB.Hide();
1148 
1149 		aWordBtn.Disable();
1150 		aRegExpBtn.Disable();
1151 		aMatchCaseCB.Disable();
1152 
1153 		bDisableSearch = !aSearchTmplLB.GetEntryCount();
1154 	}
1155 	else
1156 	{
1157 		bool bSetSearch = ( ( nModifyFlag & MODIFY_SEARCH ) == 0 );
1158 		bool bSetReplace = ( ( nModifyFlag & MODIFY_REPLACE ) == 0 );
1159 
1160 		if ( pSearchItem->GetSearchString().Len() && bSetSearch )
1161 			aSearchLB.SetText( pSearchItem->GetSearchString() );
1162 		else if ( aSearchStrings.Count() )
1163 		{
1164 			bool bAttributes =
1165 				( ( pSearchList && pSearchList->Count() ) ||
1166 				  ( pReplaceList && pReplaceList->Count() ) );
1167 
1168 			if ( bSetSearch && !bAttributes )
1169 				aSearchLB.SetText( *aSearchStrings[ 0 ] );
1170 
1171 			String aReplaceTxt = pSearchItem->GetReplaceString();
1172 
1173 			if ( aReplaceStrings.Count() )
1174 				aReplaceTxt = *aReplaceStrings[ 0 ];
1175 
1176 			if ( bSetReplace && !bAttributes )
1177 				aReplaceLB.SetText( aReplaceTxt );
1178 		}
1179 		aSearchLB.Show();
1180 
1181 		if ( bConstruct )
1182 			// nur nach dem Erzeugen den Fokus grappen
1183 			aSearchLB.GrabFocus();
1184 		aReplaceLB.Show();
1185 		aSearchTmplLB.Hide();
1186 		aReplaceTmplLB.Hide();
1187 
1188 		EnableControl_Impl( &aRegExpBtn );
1189 		EnableControl_Impl( &aMatchCaseCB );
1190 
1191 		if ( aRegExpBtn.IsChecked() )
1192 			aWordBtn.Disable();
1193 		else
1194 			EnableControl_Impl( &aWordBtn );
1195 
1196 		String aSrchAttrTxt;
1197 
1198 		if ( pImpl->bMultiLineEdit )
1199 			aSrchAttrTxt = pImpl->aSearchFormats.GetText();
1200 		else
1201 			aSrchAttrTxt = aSearchAttrText.GetText();
1202 
1203 		bDisableSearch = !aSearchLB.GetText().Len() && !aSrchAttrTxt.Len();
1204 	}
1205 	FocusHdl_Impl( &aSearchLB );
1206 
1207 	if ( bDisableSearch )
1208 	{
1209 		aSearchBtn.Disable();
1210 		aSearchAllBtn.Disable();
1211 		aReplaceBtn.Disable();
1212 		aReplaceAllBtn.Disable();
1213         aSearchComponentFL.Enable(sal_False);
1214         aSearchComponent1PB.Enable(sal_False);
1215         aSearchComponent2PB.Enable(sal_False);
1216     }
1217 	else
1218 	{
1219 		EnableControl_Impl( &aSearchBtn );
1220 		EnableControl_Impl( &aReplaceBtn );
1221 		if (!bWriter || (bWriter && !aNotesBtn.IsChecked()))
1222 		{
1223 			EnableControl_Impl( &aSearchAllBtn );
1224 			EnableControl_Impl( &aReplaceAllBtn );
1225 		}
1226 		if (bWriter && pSearchItem->GetNotes())
1227 		{
1228 			aSearchAllBtn.Disable();
1229 			aReplaceAllBtn.Disable();
1230 		}
1231 	}
1232 
1233 	if ( ( !pImpl->bMultiLineEdit && aSearchAttrText.GetText().Len() ) ||
1234 			( pImpl->bMultiLineEdit && pImpl->aSearchFormats.GetText().Len() ) )
1235 		EnableControl_Impl( &aNoFormatBtn );
1236 	else
1237 		aNoFormatBtn.Disable();
1238 
1239 	if ( !pSearchList )
1240 	{
1241 		aAttributeBtn.Disable();
1242 		aFormatBtn.Disable();
1243 	}
1244 
1245 	if ( aLayoutBtn.IsChecked() )
1246 	{
1247 		pImpl->bSaveToModule = sal_False;
1248 		TemplateHdl_Impl( &aLayoutBtn );
1249 		pImpl->bSaveToModule = sal_True;
1250 	}
1251 }
1252 
1253 // -----------------------------------------------------------------------
1254 
InitAttrList_Impl(const SfxItemSet * pSSet,const SfxItemSet * pRSet)1255 void SvxSearchDialog::InitAttrList_Impl( const SfxItemSet* pSSet,
1256 										 const SfxItemSet* pRSet )
1257 {
1258 	if ( !pSSet && !pRSet )
1259 		return;
1260 
1261 	if ( !pImpl->pRanges && pSSet )
1262 	{
1263 		sal_sSize nCnt = 0;
1264 		const sal_uInt16* pPtr = pSSet->GetRanges();
1265 		const sal_uInt16* pTmp = pPtr;
1266 
1267 		while( *pPtr )
1268 		{
1269 			nCnt += ( *(pPtr+1) - *pPtr ) + 1;
1270 			pPtr += 2;
1271 		}
1272 		nCnt = pPtr - pTmp + 1;
1273 		pImpl->pRanges = new sal_uInt16[nCnt];
1274 		memcpy( pImpl->pRanges, pTmp, sizeof(sal_uInt16) * nCnt );
1275 	}
1276 
1277 	// sorge daf"ur, das die Texte der Attribute richtig stehen
1278 	String aDesc;
1279 
1280 	if ( pSSet )
1281 	{
1282 		delete pSearchList;
1283 		pSearchList = new SearchAttrItemList;
1284 
1285 		if ( pSSet->Count() )
1286 		{
1287 			pSearchList->Put( *pSSet );
1288 
1289 			if ( !pImpl->bMultiLineEdit )
1290 				aSearchAttrText.SetText( BuildAttrText_Impl( aDesc, sal_True ) );
1291 			else
1292 				pImpl->aSearchFormats.SetText( BuildAttrText_Impl( aDesc, sal_True ) );
1293 
1294 			if ( aDesc.Len() )
1295 				bFormat |= sal_True;
1296 		}
1297 	}
1298 
1299 	if ( pRSet )
1300 	{
1301 		delete pReplaceList;
1302 		pReplaceList = new SearchAttrItemList;
1303 
1304 		if ( pRSet->Count() )
1305 		{
1306 			pReplaceList->Put( *pRSet );
1307 
1308 			if ( !pImpl->bMultiLineEdit )
1309 				aReplaceAttrText.SetText( BuildAttrText_Impl( aDesc, sal_False ) );
1310 			else
1311 				pImpl->aReplaceFormats.SetText( BuildAttrText_Impl( aDesc, sal_False ) );
1312 
1313 			if ( aDesc.Len() )
1314 				bFormat |= sal_True;
1315 		}
1316 	}
1317 }
1318 
1319 // -----------------------------------------------------------------------
1320 
IMPL_LINK(SvxSearchDialog,FlagHdl_Impl,Control *,pCtrl)1321 IMPL_LINK( SvxSearchDialog, FlagHdl_Impl, Control *, pCtrl )
1322 {
1323     if ( pCtrl && !bSet )
1324         SetModifyFlag_Impl( pCtrl );
1325 	else
1326 		bSet = sal_False;
1327 
1328     if ( pCtrl == &aSimilarityBox )
1329 	{
1330 		sal_Bool bIsChecked = aSimilarityBox.IsChecked();
1331 
1332 		if ( bIsChecked )
1333 		{
1334 			aSimilarityBtn.Enable();
1335 			aRegExpBtn.Check( sal_False );
1336 			aRegExpBtn.Disable();
1337 			EnableControl_Impl( &aWordBtn );
1338 
1339 			if ( aLayoutBtn.IsChecked() )
1340 			{
1341 				EnableControl_Impl( &aMatchCaseCB );
1342 				aLayoutBtn.Check( sal_False );
1343 			}
1344 			aRegExpBtn.Disable();
1345 			aLayoutBtn.Disable();
1346 			aFormatBtn.Disable();
1347 			aNoFormatBtn.Disable();
1348 			aAttributeBtn.Disable();
1349 		}
1350 		else
1351 		{
1352 			EnableControl_Impl( &aRegExpBtn );
1353 			if (!aNotesBtn.IsChecked())
1354 				EnableControl_Impl( &aLayoutBtn );
1355 			EnableControl_Impl( &aFormatBtn );
1356 			EnableControl_Impl( &aAttributeBtn );
1357 			aSimilarityBtn.Disable();
1358 		}
1359 		pSearchItem->SetLevenshtein( bIsChecked );
1360 	}
1361 	else
1362 	if ( pCtrl == &aNotesBtn)
1363 	{
1364 		if (aNotesBtn.IsChecked())
1365 		{
1366 			aLayoutBtn.Disable();
1367 			aSearchAllBtn.Disable();
1368 			aReplaceAllBtn.Disable();
1369 		}
1370 		else
1371 		{
1372 			EnableControl_Impl( &aLayoutBtn );
1373 			ModifyHdl_Impl( &aSearchLB );
1374 		}
1375 	}
1376 	else
1377 	{
1378 		if ( aLayoutBtn.IsChecked() && !bFormat )
1379 		{
1380 			aWordBtn.Check( sal_False );
1381 			aWordBtn.Disable();
1382 			aRegExpBtn.Check( sal_False );
1383 			aRegExpBtn.Disable();
1384 			aMatchCaseCB.Check( sal_False );
1385 			aMatchCaseCB.Disable();
1386 			aNotesBtn.Disable();
1387 
1388 			if ( aSearchTmplLB.GetEntryCount() )
1389 			{
1390 				EnableControl_Impl( &aSearchBtn );
1391 				EnableControl_Impl( &aSearchAllBtn );
1392 				EnableControl_Impl( &aReplaceBtn );
1393 				EnableControl_Impl( &aReplaceAllBtn );
1394 			}
1395 		}
1396 		else
1397 		{
1398 			EnableControl_Impl( &aRegExpBtn );
1399 			EnableControl_Impl( &aMatchCaseCB );
1400 			EnableControl_Impl( &aNotesBtn );
1401 
1402 			if ( aRegExpBtn.IsChecked() )
1403 			{
1404 				aWordBtn.Check( sal_False );
1405 				aWordBtn.Disable();
1406 				aSimilarityBox.Disable();
1407 				aSimilarityBtn.Disable();
1408 			}
1409 			else
1410 			{
1411 				EnableControl_Impl( &aWordBtn );
1412 				EnableControl_Impl( &aSimilarityBox );
1413 			}
1414 
1415 			// Such-String vorhanden? dann Buttons enablen
1416 			bSet = sal_True;
1417 			ModifyHdl_Impl( &aSearchLB );
1418 		}
1419 	}
1420 
1421     if ( &aAllSheetsCB == pCtrl )
1422 	{
1423         if ( aAllSheetsCB.IsChecked() )
1424 			aSearchAllBtn.Disable();
1425 		else
1426 		{
1427 			bSet = sal_True;
1428 			ModifyHdl_Impl( &aSearchLB );
1429 		}
1430 	}
1431 
1432     if ( &aJapOptionsCB == pCtrl )
1433 	{
1434 		sal_Bool bEnableJapOpt = aJapOptionsCB.IsChecked();
1435 		aMatchCaseCB			.Enable(!bEnableJapOpt );
1436 		aJapMatchFullHalfWidthCB.Enable(!bEnableJapOpt );
1437 		aJapOptionsBtn			.Enable( bEnableJapOpt );
1438 	}
1439 
1440 	if ( pImpl->bSaveToModule )
1441 		SaveToModule_Impl();
1442 	return 0;
1443 }
1444 
1445 // -----------------------------------------------------------------------
1446 
IMPL_LINK(SvxSearchDialog,CommandHdl_Impl,Button *,pBtn)1447 IMPL_LINK( SvxSearchDialog, CommandHdl_Impl, Button *, pBtn )
1448 {
1449 	bool bInclusive = ( aLayoutBtn.GetText() == aLayoutStr );
1450 
1451 	if ( ( pBtn == &aSearchBtn )	||
1452 		 ( pBtn == &aSearchAllBtn ) ||
1453 		 ( pBtn == &aReplaceBtn )	||
1454 		 ( pBtn == &aReplaceAllBtn ) )
1455 	{
1456 		if ( aLayoutBtn.IsChecked() && !bInclusive )
1457 		{
1458 			pSearchItem->SetSearchString ( aSearchTmplLB.GetSelectEntry() );
1459 			pSearchItem->SetReplaceString( aReplaceTmplLB.GetSelectEntry() );
1460 		}
1461 		else
1462 		{
1463 			pSearchItem->SetSearchString ( aSearchLB.GetText() );
1464 			pSearchItem->SetReplaceString( aReplaceLB.GetText() );
1465 
1466 			if ( pBtn == &aReplaceBtn )
1467 				Remember_Impl( aReplaceLB.GetText(), sal_False );
1468 			else
1469 			{
1470 				Remember_Impl( aSearchLB.GetText(), sal_True );
1471 
1472 				if ( pBtn == &aReplaceAllBtn )
1473 					Remember_Impl( aReplaceLB.GetText(), sal_False );
1474 			}
1475 		}
1476 
1477 		pSearchItem->SetRegExp( sal_False );
1478 		pSearchItem->SetLevenshtein( sal_False );
1479 		if (GetCheckBoxValue( aRegExpBtn ))
1480 			pSearchItem->SetRegExp( sal_True );
1481 		else if (GetCheckBoxValue( aSimilarityBox ))
1482 			pSearchItem->SetLevenshtein( sal_True );
1483 
1484 		pSearchItem->SetWordOnly( GetCheckBoxValue( aWordBtn ) );
1485         pSearchItem->SetBackward( GetCheckBoxValue( aBackwardsBtn ) );
1486         pSearchItem->SetNotes( GetCheckBoxValue( aNotesBtn ) );
1487 		pSearchItem->SetPattern( GetCheckBoxValue( aLayoutBtn ) );
1488 		pSearchItem->SetSelection( GetCheckBoxValue( aSelectionBtn ) );
1489 
1490 		pSearchItem->SetUseAsianOptions( GetCheckBoxValue( aJapOptionsCB ) );
1491 		sal_Int32 nFlags = GetTransliterationFlags();
1492 		if( !pSearchItem->IsUseAsianOptions())
1493             nFlags &= (TransliterationModules_IGNORE_CASE |
1494 					   TransliterationModules_IGNORE_WIDTH );
1495 		pSearchItem->SetTransliterationFlags( nFlags );
1496 
1497 		if ( !bWriter )
1498 		{
1499             if ( aCalcSearchInLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
1500                 pSearchItem->SetCellType( aCalcSearchInLB.GetSelectEntryPos() );
1501 
1502 			pSearchItem->SetRowDirection( aRowsBtn.IsChecked() );
1503             pSearchItem->SetAllTables( aAllSheetsCB.IsChecked() );
1504 		}
1505 
1506 		if ( pBtn == &aSearchBtn )
1507 			pSearchItem->SetCommand( SVX_SEARCHCMD_FIND );
1508 		else if ( pBtn == &aSearchAllBtn )
1509 			pSearchItem->SetCommand( SVX_SEARCHCMD_FIND_ALL );
1510 		else if ( pBtn == &aReplaceBtn )
1511 			pSearchItem->SetCommand( SVX_SEARCHCMD_REPLACE );
1512 		else if ( pBtn == &aReplaceAllBtn )
1513 			pSearchItem->SetCommand( SVX_SEARCHCMD_REPLACE_ALL );
1514 
1515 		// wenn nach Vorlagen gesucht wird, dann Format-Listen l"oschen
1516 		if ( !bFormat && pSearchItem->GetPattern() )
1517 		{
1518 			if ( pSearchList )
1519 				pSearchList->Clear();
1520 
1521 			if ( pReplaceList )
1522 				pReplaceList->Clear();
1523 		}
1524 		nModifyFlag = 0;
1525         const SfxPoolItem* ppArgs[] = { pSearchItem, 0 };
1526         rBindings.ExecuteSynchron( FID_SEARCH_NOW, ppArgs, 0L );
1527 	}
1528 	else if ( pBtn == &aCloseBtn )
1529 	{
1530 		if ( !aLayoutBtn.IsChecked() || bInclusive )
1531 		{
1532 			String aStr( aSearchLB.GetText() );
1533 
1534 			if ( aStr.Len() )
1535 				Remember_Impl( aStr, sal_True );
1536 			aStr = aReplaceLB.GetText();
1537 
1538 			if ( aStr.Len() )
1539 				Remember_Impl( aStr, sal_False );
1540 		}
1541 		SaveToModule_Impl();
1542 		Close();
1543 	}
1544 	else if ( pBtn == &aSimilarityBtn )
1545 	{
1546 //CHINA001 		SvxSearchSimilarityDialog* pDlg =
1547 //CHINA001 			new SvxSearchSimilarityDialog( this,
1548 //CHINA001 										   pSearchItem->IsLEVRelaxed(),
1549 //CHINA001 										   pSearchItem->GetLEVOther(),
1550 //CHINA001 										   pSearchItem->GetLEVShorter(),
1551 //CHINA001 										   pSearchItem->GetLEVLonger() );
1552 		SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1553 		if(pFact)
1554 		{
1555 			AbstractSvxSearchSimilarityDialog* pDlg = pFact->CreateSvxSearchSimilarityDialog( LAYOUT_THIS_WINDOW (this),
1556 																		pSearchItem->IsLEVRelaxed(),
1557 																		pSearchItem->GetLEVOther(),
1558 																		pSearchItem->GetLEVShorter(),
1559 																		pSearchItem->GetLEVLonger() );
1560 			DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
1561 			if ( pDlg && pDlg->Execute() == RET_OK )
1562 			{
1563 				pSearchItem->SetLEVRelaxed( pDlg->IsRelaxed() );
1564 				pSearchItem->SetLEVOther( pDlg->GetOther() );
1565 				pSearchItem->SetLEVShorter( pDlg->GetShorter() );
1566 				pSearchItem->SetLEVLonger( pDlg->GetLonger() );
1567 				SaveToModule_Impl();
1568 			}
1569 			delete pDlg;
1570 		}
1571 	}
1572 	else if ( pBtn == &aJapOptionsBtn )
1573 	{
1574 		SfxItemSet aSet( SFX_APP()->GetPool() );
1575 		pSearchItem->SetTransliterationFlags( GetTransliterationFlags() );
1576         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1577 		if(pFact)
1578 		{
1579 			AbstractSvxJSearchOptionsDialog* aDlg = pFact->CreateSvxJSearchOptionsDialog( LAYOUT_THIS_WINDOW (this), aSet,
1580 					pSearchItem->GetTransliterationFlags() );
1581 			DBG_ASSERT(aDlg, "Dialogdiet fail!");//CHINA001
1582 			int nRet = aDlg->Execute(); //CHINA001 int nRet = aDlg.Execute();
1583 			if (RET_OK == nRet) //! true only if FillItemSet of SvxJSearchOptionsPage returns true
1584 			{
1585 				sal_Int32 nFlags = aDlg->GetTransliterationFlags(); //CHINA001 sal_Int32 nFlags = aDlg.GetTransliterationFlags();
1586 				pSearchItem->SetTransliterationFlags( nFlags );
1587 				ApplyTransliterationFlags_Impl( nFlags );
1588 			}
1589 			delete aDlg; //add for CHINA001
1590 		}
1591 	}
1592     else if(pBtn == &aSearchComponent1PB || pBtn == &aSearchComponent2PB )
1593     {
1594         uno::Sequence < beans::PropertyValue > aArgs(2);
1595         beans::PropertyValue* pArgs = aArgs.getArray();
1596         pArgs[0].Name = ::rtl::OUString::createFromAscii("SearchString");
1597         pArgs[0].Value <<= ::rtl::OUString(aSearchLB.GetText());
1598         pArgs[1].Name = ::rtl::OUString::createFromAscii("ParentWindow");
1599         pArgs[1].Value <<= VCLUnoHelper::GetInterface( LAYOUT_THIS_WINDOW (this) );
1600         if(pBtn == &aSearchComponent1PB)
1601         {
1602             if ( pImpl->xCommand1Dispatch.is() )
1603                 pImpl->xCommand1Dispatch->dispatch(pImpl->aCommand1URL, aArgs);
1604         }
1605         else
1606         {
1607             if ( pImpl->xCommand2Dispatch.is() )
1608                 pImpl->xCommand2Dispatch->dispatch(pImpl->aCommand2URL, aArgs);
1609         }
1610     }
1611 
1612 	return 0;
1613 }
1614 
1615 // -----------------------------------------------------------------------
1616 
IMPL_LINK(SvxSearchDialog,ModifyHdl_Impl,ComboBox *,pEd)1617 IMPL_LINK( SvxSearchDialog, ModifyHdl_Impl, ComboBox *, pEd )
1618 {
1619 	if ( !bSet )
1620 		SetModifyFlag_Impl( pEd );
1621 	else
1622 		bSet = sal_False;
1623 
1624 	if ( pEd == &aSearchLB || pEd == &aReplaceLB )
1625 	{
1626 		xub_StrLen nLBTxtLen = aSearchLB.GetText().Len(), nTxtLen;
1627 
1628 		if ( !pImpl->bMultiLineEdit )
1629 		   nTxtLen = aSearchAttrText.GetText().Len();
1630 		else
1631 			nTxtLen = pImpl->aSearchFormats.GetText().Len();
1632 
1633 		if ( nLBTxtLen || nTxtLen )
1634 		{
1635 			EnableControl_Impl( &aSearchBtn );
1636 			EnableControl_Impl( &aReplaceBtn );
1637 			if (!bWriter || (bWriter && !aNotesBtn.IsChecked()))
1638 			{
1639 				EnableControl_Impl( &aSearchAllBtn );
1640 				EnableControl_Impl( &aReplaceAllBtn );
1641 			}
1642 		}
1643 		else
1644 		{
1645             aSearchComponentFL.Enable(sal_False);
1646             aSearchComponent1PB.Enable(sal_False);
1647             aSearchComponent2PB.Enable(sal_False);
1648             aSearchBtn.Disable();
1649 			aSearchAllBtn.Disable();
1650 			aReplaceBtn.Disable();
1651 			aReplaceAllBtn.Disable();
1652 		}
1653 	}
1654 	return 0;
1655 }
1656 
1657 // -----------------------------------------------------------------------
1658 
IMPL_LINK(SvxSearchDialog,TemplateHdl_Impl,Button *,EMPTYARG)1659 IMPL_LINK( SvxSearchDialog, TemplateHdl_Impl, Button *, EMPTYARG )
1660 {
1661 	if ( pImpl->bSaveToModule )
1662 		SaveToModule_Impl();
1663 
1664 	if ( bFormat )
1665 		return 0;
1666 	String sDesc;
1667 
1668 	if ( aLayoutBtn.IsChecked() )
1669 	{
1670 		if ( !pFamilyController )
1671 		{
1672 			sal_uInt16 nId = 0;
1673 
1674 			// Vorlagen-Controller enablen
1675 			switch ( pSearchItem->GetFamily() )
1676 			{
1677 				case SFX_STYLE_FAMILY_CHAR:
1678 					nId = SID_STYLE_FAMILY1; break;
1679 
1680 				case SFX_STYLE_FAMILY_PARA:
1681 					nId = SID_STYLE_FAMILY2; break;
1682 
1683 				case SFX_STYLE_FAMILY_FRAME:
1684 					nId = SID_STYLE_FAMILY3; break;
1685 
1686 				case SFX_STYLE_FAMILY_PAGE:
1687 					nId = SID_STYLE_FAMILY4; break;
1688 
1689 				case SFX_STYLE_FAMILY_ALL:
1690 					break;
1691 
1692 				default:
1693 					DBG_ERROR( "StyleSheetFamily wurde geaendert?" );
1694 			}
1695 
1696 			rBindings.EnterRegistrations();
1697 			pFamilyController =
1698 				new SvxSearchController( nId, rBindings, *this );
1699 			rBindings.LeaveRegistrations();
1700 			aSearchTmplLB.Clear();
1701 			aReplaceTmplLB.Clear();
1702 
1703 			aSearchTmplLB.Show();
1704 			aReplaceTmplLB.Show();
1705 			aSearchLB.Hide();
1706 			aReplaceLB.Hide();
1707 
1708 			if ( !pImpl->bMultiLineEdit )
1709 			{
1710 				aSearchAttrText.SetText( sDesc );
1711 				aReplaceAttrText.SetText( sDesc );
1712 			}
1713 			else
1714 			{
1715 				pImpl->aSearchFormats.SetText( sDesc );
1716 				pImpl->aReplaceFormats.SetText( sDesc );
1717 			}
1718 		}
1719 		aFormatBtn.Disable();
1720 		aNoFormatBtn.Disable();
1721 		aAttributeBtn.Disable();
1722 		aSimilarityBox.Disable();
1723 		aSimilarityBtn.Disable();
1724 	}
1725 	else
1726 	{
1727 		// Vorlagen-Controller disablen
1728 		rBindings.EnterRegistrations();
1729 		DELETEZ( pFamilyController );
1730 		rBindings.LeaveRegistrations();
1731 
1732 		aSearchLB.Show();
1733 		aReplaceLB.Show();
1734 		aSearchTmplLB.Hide();
1735 		aReplaceTmplLB.Hide();
1736 
1737 		if ( !pImpl->bMultiLineEdit )
1738 		{
1739 			aSearchAttrText.SetText( BuildAttrText_Impl( sDesc, sal_True ) );
1740 			aReplaceAttrText.SetText( BuildAttrText_Impl( sDesc, sal_False ) );
1741 		}
1742 		else
1743 		{
1744 			pImpl->aSearchFormats.SetText( BuildAttrText_Impl( sDesc, sal_True ) );
1745 			pImpl->aReplaceFormats.SetText( BuildAttrText_Impl( sDesc, sal_False ) );
1746 		}
1747 
1748 		EnableControl_Impl( &aFormatBtn );
1749 		EnableControl_Impl( &aAttributeBtn );
1750 		EnableControl_Impl( &aSimilarityBox );
1751 
1752 		FocusHdl_Impl( bSearch ? &aSearchLB : &aReplaceLB );
1753 	}
1754 	bSet = sal_True;
1755 	pImpl->bSaveToModule = sal_False;
1756 	FlagHdl_Impl( &aLayoutBtn );
1757 	pImpl->bSaveToModule = sal_True;
1758 	return 0;
1759 }
1760 
1761 // -----------------------------------------------------------------------
1762 
Remember_Impl(const String & rStr,sal_Bool _bSearch)1763 void SvxSearchDialog::Remember_Impl( const String &rStr,sal_Bool _bSearch )
1764 {
1765 	if ( !rStr.Len() )
1766 		return;
1767 
1768     SvStringsDtor* pArr = _bSearch ? &aSearchStrings : &aReplaceStrings;
1769     ComboBox* pListBox = _bSearch ? &aSearchLB : &aReplaceLB;
1770 
1771 	// identische Strings ignorieren
1772 	for ( sal_uInt16 i = 0; i < pArr->Count(); ++i )
1773 	{
1774 		if ( COMPARE_EQUAL == (*pArr)[i]->CompareTo( rStr ) )
1775 			return;
1776 	}
1777 
1778 	// bei maximaler Belegung "altesten Eintrag l"oschen (ListBox und Array)
1779 	String* pInsStr;
1780 
1781 	if ( pArr->Count() >= REMEMBER_SIZE )
1782 	{
1783 		pInsStr = (*pArr)[REMEMBER_SIZE - 1];
1784 		pListBox->RemoveEntry( sal_uInt16(REMEMBER_SIZE - 1) );
1785 		pArr->Remove( REMEMBER_SIZE - 1 );
1786 		*pInsStr = rStr;
1787 	}
1788 	else
1789 		pInsStr = new String( rStr );
1790 
1791 	pArr->Insert( pInsStr, 0 );
1792 	pListBox->InsertEntry( *pInsStr, 0 );
1793 }
1794 
1795 // -----------------------------------------------------------------------
1796 
TemplatesChanged_Impl(SfxStyleSheetBasePool & rPool)1797 void SvxSearchDialog::TemplatesChanged_Impl( SfxStyleSheetBasePool& rPool )
1798 {
1799 //	SetUpdateMode( sal_False );
1800 	String aOldSrch( aSearchTmplLB .GetSelectEntry() );
1801 	String aOldRepl( aReplaceTmplLB.GetSelectEntry() );
1802 	aSearchTmplLB .Clear();
1803 	aReplaceTmplLB.Clear();
1804 	rPool.SetSearchMask( pSearchItem->GetFamily(), SFXSTYLEBIT_ALL );
1805 	aSearchTmplLB.SetUpdateMode( sal_False );
1806 	aReplaceTmplLB.SetUpdateMode( sal_False );
1807 	SfxStyleSheetBase* pBase = rPool.First();
1808 
1809 	while ( pBase )
1810 	{
1811 		if ( pBase->IsUsed() )
1812 			aSearchTmplLB.InsertEntry( pBase->GetName() );
1813 		aReplaceTmplLB.InsertEntry( pBase->GetName() );
1814 		pBase = rPool.Next();
1815 	}
1816 	aSearchTmplLB.SetUpdateMode( sal_True );
1817 	aReplaceTmplLB.SetUpdateMode( sal_True );
1818 	aSearchTmplLB.SelectEntryPos(0);
1819 
1820 	if ( aOldSrch.Len() )
1821 		aSearchTmplLB .SelectEntry( aOldSrch );
1822 	aReplaceTmplLB.SelectEntryPos(0);
1823 
1824 	if ( aOldRepl.Len() )
1825 		aReplaceTmplLB.SelectEntry( aOldRepl );
1826 
1827 	if ( aSearchTmplLB.GetEntryCount() )
1828 	{
1829 		EnableControl_Impl( &aSearchBtn );
1830 		EnableControl_Impl( &aSearchAllBtn );
1831 		EnableControl_Impl( &aReplaceBtn );
1832 		EnableControl_Impl( &aReplaceAllBtn );
1833 	}
1834 //	FlagHdl_Impl(0);
1835 //	SetUpdateMode( sal_True );
1836 }
1837 
1838 // -----------------------------------------------------------------------
1839 
EnableControls_Impl(const sal_uInt16 nFlags)1840 void SvxSearchDialog::EnableControls_Impl( const sal_uInt16 nFlags )
1841 {
1842 	if ( nFlags == nOptions )
1843 		return;
1844 	else
1845 		nOptions = nFlags;
1846 
1847 	if ( !nOptions )
1848 	{
1849 		if ( IsVisible() )
1850 		{
1851 			Hide();
1852 			return;
1853 		}
1854 	}
1855 	else if ( !IsVisible() )
1856 		Show();
1857 	bool bNoSearch = sal_True;
1858 
1859     sal_Bool bEnableSearch = ( SEARCH_OPTIONS_SEARCH & nOptions ) != 0;
1860     aSearchBtn.Enable(bEnableSearch);
1861 
1862     if( bEnableSearch )
1863         bNoSearch = sal_False;
1864 
1865 
1866     if ( ( SEARCH_OPTIONS_SEARCH_ALL & nOptions ) != 0 )
1867 	{
1868 		aSearchAllBtn.Enable();
1869 		bNoSearch = sal_False;
1870 	}
1871 	else
1872 		aSearchAllBtn.Disable();
1873 	if ( ( SEARCH_OPTIONS_REPLACE & nOptions ) != 0 )
1874 	{
1875 		aReplaceBtn.Enable();
1876 		aReplaceText.Enable();
1877 		aReplaceLB.Enable();
1878 		aReplaceTmplLB.Enable();
1879 		bNoSearch = sal_False;
1880 	}
1881 	else
1882 	{
1883 		aReplaceBtn.Disable();
1884 		aReplaceText.Disable();
1885 		aReplaceLB.Disable();
1886 		aReplaceTmplLB.Disable();
1887 	}
1888 	if ( ( SEARCH_OPTIONS_REPLACE_ALL & nOptions ) != 0 )
1889 	{
1890 		aReplaceAllBtn.Enable();
1891 		bNoSearch = sal_False;
1892 	}
1893 	else
1894 		aReplaceAllBtn.Disable();
1895     aSearchComponentFL.Enable(!bNoSearch);
1896     aSearchComponent1PB.Enable(!bNoSearch);
1897     aSearchComponent2PB.Enable(!bNoSearch);
1898     aSearchBtn.Enable( !bNoSearch );
1899 	aSearchText.Enable( !bNoSearch );
1900 	aSearchLB.Enable( !bNoSearch );
1901 
1902 	if ( ( SEARCH_OPTIONS_WHOLE_WORDS & nOptions ) != 0 )
1903 		aWordBtn.Enable();
1904 	else
1905 		aWordBtn.Disable();
1906 	if ( ( SEARCH_OPTIONS_BACKWARDS & nOptions ) != 0 )
1907 		aBackwardsBtn.Enable();
1908 	else
1909 		aBackwardsBtn.Disable();
1910     //!if ( ( SEARCH_OPTIONS_NOTES & nOptions ) != 0 )
1911         aNotesBtn.Enable();
1912     //!else
1913     //!    aNotesBtn.Disable();
1914 	if ( ( SEARCH_OPTIONS_REG_EXP & nOptions ) != 0 )
1915 		aRegExpBtn.Enable();
1916 	else
1917 		aRegExpBtn.Disable();
1918 	if ( ( SEARCH_OPTIONS_EXACT & nOptions ) != 0 )
1919 		aMatchCaseCB.Enable();
1920 	else
1921 		aMatchCaseCB.Disable();
1922 	if ( ( SEARCH_OPTIONS_SELECTION & nOptions ) != 0 )
1923 		aSelectionBtn.Enable();
1924 	else
1925 		aSelectionBtn.Disable();
1926 	if ( ( SEARCH_OPTIONS_FAMILIES & nOptions ) != 0 )
1927 		aLayoutBtn.Enable();
1928 	else
1929 		aLayoutBtn.Disable();
1930 	if ( ( SEARCH_OPTIONS_FORMAT & nOptions ) != 0 )
1931 	{
1932 		aAttributeBtn.Enable();
1933 		aFormatBtn.Enable();
1934 		aNoFormatBtn.Enable();
1935 	}
1936 	else
1937 	{
1938 		aAttributeBtn.Disable();
1939 		aFormatBtn.Disable();
1940 		aNoFormatBtn.Disable();
1941 	}
1942 /*
1943 	if ( ( SEARCH_OPTIONS_MORE & nOptions ) != 0 &&
1944 		 pSearchItem && pSearchItem->GetAppFlag() == SVX_SEARCHAPP_CALC )
1945 		pMoreBtn->Enable();
1946 	else
1947 	{
1948 		pMoreBtn->SetState( sal_False );
1949 		pMoreBtn->Disable();
1950 	}
1951 */
1952 	if ( ( SEARCH_OPTIONS_SIMILARITY & nOptions ) != 0 )
1953 	{
1954 		aSimilarityBox.Enable();
1955 		aSimilarityBtn.Enable();
1956 	}
1957 	else
1958 	{
1959 		aSimilarityBox.Disable();
1960 		aSimilarityBtn.Disable();
1961 	}
1962 
1963 	if ( pSearchItem )
1964 		Init_Impl( pSearchItem->GetPattern() &&
1965 				   ( !pSearchList || !pSearchList->Count() ) );
1966 }
1967 
1968 // -----------------------------------------------------------------------
1969 
EnableControl_Impl(Control * pCtrl)1970 void SvxSearchDialog::EnableControl_Impl( Control* pCtrl )
1971 {
1972 	if ( &aSearchBtn == pCtrl && ( SEARCH_OPTIONS_SEARCH & nOptions ) != 0 )
1973 	{
1974         aSearchComponentFL.Enable();
1975         aSearchComponent1PB.Enable();
1976         aSearchComponent2PB.Enable();
1977         aSearchBtn.Enable();
1978 		return;
1979 	}
1980 	if ( &aSearchAllBtn == pCtrl &&
1981 		 ( SEARCH_OPTIONS_SEARCH_ALL & nOptions ) != 0 )
1982 	{
1983         aSearchAllBtn.Enable( ( bWriter || !aAllSheetsCB.IsChecked() ) );
1984 		return;
1985 	}
1986 	if ( &aReplaceBtn == pCtrl && ( SEARCH_OPTIONS_REPLACE & nOptions ) != 0 )
1987 	{
1988 		aReplaceBtn.Enable();
1989 		return;
1990 	}
1991 	if ( &aReplaceAllBtn == pCtrl &&
1992 		 ( SEARCH_OPTIONS_REPLACE_ALL & nOptions ) != 0 )
1993 	{
1994 		aReplaceAllBtn.Enable();
1995 		return;
1996 	}
1997 	if ( &aWordBtn == pCtrl && ( SEARCH_OPTIONS_WHOLE_WORDS & nOptions ) != 0 )
1998 	{
1999 		aWordBtn.Enable();
2000 		return;
2001 	}
2002     if ( &aBackwardsBtn == pCtrl && ( SEARCH_OPTIONS_BACKWARDS & nOptions ) != 0 )
2003     {
2004         aBackwardsBtn.Enable();
2005         return;
2006     }
2007     if ( &aNotesBtn == pCtrl /*! && ( SEARCH_OPTIONS_NOTES & nOptions ) != 0 */ )
2008     {
2009         aNotesBtn.Enable();
2010         return;
2011     }
2012 	if ( &aRegExpBtn == pCtrl && ( SEARCH_OPTIONS_REG_EXP & nOptions ) != 0
2013 		&& !aSimilarityBox.IsChecked())
2014 	{
2015 		aRegExpBtn.Enable();
2016 		return;
2017 	}
2018 	if ( &aMatchCaseCB == pCtrl && ( SEARCH_OPTIONS_EXACT & nOptions ) != 0 )
2019 	{
2020 		if (!aJapOptionsCB.IsChecked())
2021 			aMatchCaseCB.Enable();
2022 		return;
2023 	}
2024 	if ( &aSelectionBtn == pCtrl && ( SEARCH_OPTIONS_SELECTION & nOptions ) != 0 )
2025 	{
2026 		aSelectionBtn.Enable();
2027 		return;
2028 	}
2029 	if ( &aLayoutBtn == pCtrl && ( SEARCH_OPTIONS_FAMILIES & nOptions ) != 0 )
2030 	{
2031 		aLayoutBtn.Enable();
2032 		return;
2033 	}
2034 	if ( 	&aAttributeBtn == pCtrl
2035 		 && ( SEARCH_OPTIONS_FORMAT & nOptions ) != 0
2036 		 && pSearchList )
2037 	{
2038 		aAttributeBtn.Enable( pImpl->bFocusOnSearch );
2039 	}
2040 	if ( &aFormatBtn == pCtrl && ( SEARCH_OPTIONS_FORMAT & nOptions ) != 0 )
2041 	{
2042 		aFormatBtn.Enable();
2043 		return;
2044 	}
2045 	if ( &aNoFormatBtn == pCtrl && ( SEARCH_OPTIONS_FORMAT & nOptions ) != 0 )
2046 	{
2047 		aNoFormatBtn.Enable();
2048 		return;
2049 	}
2050 	if ( &aSimilarityBox == pCtrl &&
2051 		 ( SEARCH_OPTIONS_SIMILARITY & nOptions ) != 0 )
2052 	{
2053 		aSimilarityBox.Enable();
2054 
2055 		if ( aSimilarityBox.IsChecked() )
2056 			aSimilarityBtn.Enable();
2057 	}
2058 }
2059 
2060 // -----------------------------------------------------------------------
2061 
SetItem_Impl(const SvxSearchItem * pItem)2062 void SvxSearchDialog::SetItem_Impl( const SvxSearchItem* pItem )
2063 {
2064 	if ( pItem )
2065 	{
2066 		delete pSearchItem;
2067 		pSearchItem = (SvxSearchItem*)pItem->Clone();
2068 		Init_Impl( pSearchItem->GetPattern() &&
2069 				   ( !pSearchList || !pSearchList->Count() ) );
2070 	}
2071 }
2072 
2073 // -----------------------------------------------------------------------
2074 
IMPL_LINK(SvxSearchDialog,FocusHdl_Impl,Control *,pCtrl)2075 IMPL_LINK( SvxSearchDialog, FocusHdl_Impl, Control *, pCtrl )
2076 {
2077 	xub_StrLen nTxtLen;
2078 
2079 	if ( !pImpl->bMultiLineEdit )
2080 		nTxtLen = aSearchAttrText.GetText().Len();
2081 	else
2082 		nTxtLen = pImpl->aSearchFormats.GetText().Len();
2083 
2084 	if ( pCtrl == &aSearchLB || pCtrl == &pImpl->aSearchFormats )
2085 	{
2086 		if ( pCtrl->HasChildPathFocus() )
2087 			pImpl->bFocusOnSearch = sal_True;
2088 		pCtrl = &aSearchLB;
2089 		bSearch = sal_True;
2090 
2091 		if( nTxtLen )
2092 			EnableControl_Impl( &aNoFormatBtn );
2093 		else
2094 			aNoFormatBtn.Disable();
2095 		EnableControl_Impl( &aAttributeBtn );
2096 	}
2097 	else
2098 	{
2099 		pImpl->bFocusOnSearch = sal_False;
2100 		pCtrl = &aReplaceLB;
2101 		bSearch = sal_False;
2102 
2103 		if ( ( !pImpl->bMultiLineEdit && aReplaceAttrText.GetText().Len() ) ||
2104 				( pImpl->bMultiLineEdit && pImpl->aReplaceFormats.GetText().Len() ) )
2105 			EnableControl_Impl( &aNoFormatBtn );
2106 		else
2107 			aNoFormatBtn.Disable();
2108 		aAttributeBtn.Disable();
2109 	}
2110 	bSet = sal_True;
2111 
2112 	aSearchLB.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
2113 
2114 	ModifyHdl_Impl( (ComboBox*)pCtrl );
2115 
2116 	aLayoutBtn.SetText( bFormat && nTxtLen ? aLayoutStr : aStylesStr );
2117 	return 0;
2118 }
2119 
2120 // -----------------------------------------------------------------------
2121 
IMPL_LINK(SvxSearchDialog,LoseFocusHdl_Impl,Control *,EMPTYARG)2122 IMPL_LINK( SvxSearchDialog, LoseFocusHdl_Impl, Control *, EMPTYARG )
2123 {
2124 	SaveToModule_Impl();
2125 	return 0;
2126 }
2127 
2128 // -----------------------------------------------------------------------
2129 
IMPL_LINK(SvxSearchDialog,FormatHdl_Impl,Button *,EMPTYARG)2130 IMPL_LINK( SvxSearchDialog, FormatHdl_Impl, Button *, EMPTYARG )
2131 {
2132 	SfxObjectShell* pSh = SfxObjectShell::Current();
2133 
2134 	DBG_ASSERT( pSh, "no DocShell" );
2135 
2136 	if ( !pSh || !pImpl->pRanges )
2137 		return 0;
2138 
2139 	sal_sSize nCnt = 0;
2140 	const sal_uInt16* pPtr = pImpl->pRanges;
2141 	const sal_uInt16* pTmp = pPtr;
2142 
2143 	while( *pTmp )
2144 		pTmp++;
2145 	nCnt = pTmp - pPtr + 7;
2146 	sal_uInt16* pWhRanges = new sal_uInt16[nCnt];
2147 	sal_uInt16 nPos = 0;
2148 
2149 	while( *pPtr )
2150 	{
2151 		pWhRanges[nPos++] = *pPtr++;
2152 	}
2153 
2154 	pWhRanges[nPos++] = SID_ATTR_PARA_MODEL;
2155 	pWhRanges[nPos++] = SID_ATTR_PARA_MODEL;
2156 
2157 	sal_uInt16 nBrushWhich = pSh->GetPool().GetWhich(SID_ATTR_BRUSH);
2158 	pWhRanges[nPos++] = nBrushWhich;
2159 	pWhRanges[nPos++] = nBrushWhich;
2160 	pWhRanges[nPos++] = SID_PARA_BACKGRND_DESTINATION;
2161 	pWhRanges[nPos++] = SID_PARA_BACKGRND_DESTINATION;
2162 	pWhRanges[nPos] = 0;
2163 	SfxItemPool& rPool = pSh->GetPool();
2164 	SfxItemSet aSet( rPool, pWhRanges );
2165 	String aTxt;
2166 
2167 	aSet.InvalidateAllItems();
2168 	aSet.Put(SvxBrushItem(nBrushWhich));
2169 	aSet.Put(SfxUInt16Item(SID_PARA_BACKGRND_DESTINATION, PARA_DEST_CHAR));
2170 
2171 	if ( bSearch )
2172 	{
2173 		aTxt = SVX_RESSTR( RID_SVXSTR_SEARCH );
2174 		pSearchList->Get( aSet );
2175 	}
2176 	else
2177 	{
2178 		aTxt = SVX_RESSTR( RID_SVXSTR_REPLACE );
2179 		pReplaceList->Get( aSet );
2180 	}
2181 	aSet.DisableItem(SID_ATTR_PARA_MODEL);
2182 	aSet.DisableItem(rPool.GetWhich(SID_ATTR_PARA_PAGEBREAK));
2183 	aSet.DisableItem(rPool.GetWhich(SID_ATTR_PARA_KEEP));
2184 
2185 	//CHINA001 SvxSearchFormatDialog* pDlg = new SvxSearchFormatDialog( this, aSet );
2186 	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
2187 	if(pFact)
2188 	{
2189 		SfxAbstractTabDialog* pDlg = pFact->CreateTabItemDialog( LAYOUT_THIS_WINDOW (this), aSet, RID_SVXDLG_SEARCHFORMAT );
2190 		DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
2191 		aTxt.Insert( pDlg->GetText(), 0 );
2192 		pDlg->SetText( aTxt );
2193 
2194 		if ( pDlg->Execute() == RET_OK )
2195 		{
2196 			DBG_ASSERT( pDlg->GetOutputItemSet(), "invalid Output-Set" );
2197 			SfxItemSet aOutSet( *pDlg->GetOutputItemSet() );
2198 
2199 			SearchAttrItemList* pList = bSearch ? pSearchList : pReplaceList;
2200 
2201 			SearchAttrItem* pAItem;
2202 			const SfxPoolItem* pItem;
2203 			for( sal_uInt16 n = 0; n < pList->Count(); ++n )
2204 				if( !IsInvalidItem( (pAItem = &pList->GetObject(n))->pItem ) &&
2205 					SFX_ITEM_SET == aOutSet.GetItemState(
2206 						pAItem->pItem->Which(), sal_False, &pItem ) )
2207 				{
2208 					delete pAItem->pItem;
2209 					pAItem->pItem = pItem->Clone();
2210 					aOutSet.ClearItem( pAItem->pItem->Which() );
2211 				}
2212 
2213 			if( aOutSet.Count() )
2214 				pList->Put( aOutSet );
2215 
2216 			PaintAttrText_Impl(); // AttributText in GroupBox setzen
2217 		}
2218 		delete pDlg;
2219 	}
2220 	delete[] pWhRanges;
2221 	return 0;
2222 }
2223 
2224 // -----------------------------------------------------------------------
2225 
IMPL_LINK(SvxSearchDialog,NoFormatHdl_Impl,Button *,EMPTYARG)2226 IMPL_LINK( SvxSearchDialog, NoFormatHdl_Impl, Button *, EMPTYARG )
2227 {
2228 	aLayoutBtn.SetText( aStylesStr );
2229 	bFormat = sal_False;
2230 	aLayoutBtn.Check( sal_False );
2231 
2232 	if ( bSearch )
2233 	{
2234 		if ( !pImpl->bMultiLineEdit )
2235 			aSearchAttrText.SetText( String() );
2236 		else
2237 			pImpl->aSearchFormats.SetText( String() );
2238 		pSearchList->Clear();
2239 	}
2240 	else
2241 	{
2242 		if ( !pImpl->bMultiLineEdit )
2243 			aReplaceAttrText.SetText( String() );
2244 		else
2245 			pImpl->aReplaceFormats.SetText( String() );
2246 		pReplaceList->Clear();
2247 	}
2248 	pImpl->bSaveToModule = sal_False;
2249 	TemplateHdl_Impl( &aLayoutBtn );
2250 	pImpl->bSaveToModule = sal_True;
2251 	aNoFormatBtn.Disable();
2252 	return 0;
2253 }
2254 
2255 // -----------------------------------------------------------------------
2256 
IMPL_LINK(SvxSearchDialog,AttributeHdl_Impl,Button *,EMPTYARG)2257 IMPL_LINK( SvxSearchDialog, AttributeHdl_Impl, Button *, EMPTYARG )
2258 {
2259 	if ( !pSearchList || !pImpl->pRanges )
2260 		return 0;
2261 
2262 	//CHINA001 SvxSearchAttributeDialog* pDlg = new SvxSearchAttributeDialog( this, *pSearchList, pImpl->pRanges );
2263 	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
2264 	if(pFact)
2265 	{
2266 		VclAbstractDialog* pDlg = pFact->CreateSvxSearchAttributeDialog( LAYOUT_THIS_WINDOW (this), *pSearchList, pImpl->pRanges );
2267 		DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
2268 		pDlg->Execute();
2269 		delete pDlg;
2270 	}
2271 	PaintAttrText_Impl();
2272 	return 0;
2273 }
2274 
2275 // -----------------------------------------------------------------------
2276 
IMPL_LINK(SvxSearchDialog,TimeoutHdl_Impl,Timer *,pTimer)2277 IMPL_LINK( SvxSearchDialog, TimeoutHdl_Impl, Timer *, pTimer )
2278 {
2279     SfxViewShell* pViewShell = SfxViewShell::Current();
2280 
2281     if ( pViewShell )
2282     {
2283         if ( pViewShell->HasSelection( aSearchLB.IsVisible() ) )
2284             EnableControl_Impl( &aSelectionBtn );
2285         else
2286         {
2287             aSelectionBtn.Check( sal_False );
2288             aSelectionBtn.Disable();
2289         }
2290     }
2291 
2292     pTimer->Start();
2293     return 0;
2294 }
2295 
2296 // -----------------------------------------------------------------------
2297 
GetSearchItems(SfxItemSet & rSet)2298 void SvxSearchDialog::GetSearchItems( SfxItemSet& rSet )
2299 {
2300 	xub_StrLen nLen;
2301 
2302 	if ( !pImpl->bMultiLineEdit )
2303 		nLen = aSearchAttrText.GetText().Len();
2304 	else
2305 		nLen = pImpl->aSearchFormats.GetText().Len();
2306 
2307 	if ( nLen && pSearchList )
2308 		pSearchList->Get( rSet );
2309 }
2310 
2311 // -----------------------------------------------------------------------
2312 
GetReplaceItems(SfxItemSet & rSet)2313 void SvxSearchDialog::GetReplaceItems( SfxItemSet& rSet )
2314 {
2315 	xub_StrLen nLen;
2316 
2317 	if ( !pImpl->bMultiLineEdit )
2318 		nLen = aReplaceAttrText.GetText().Len();
2319 	else
2320 		nLen = pImpl->aReplaceFormats.GetText().Len();
2321 
2322 	if ( nLen && pReplaceList )
2323 		pReplaceList->Get( rSet );
2324 }
2325 
2326 // -----------------------------------------------------------------------
2327 
BuildAttrText_Impl(String & rStr,sal_Bool bSrchFlag) const2328 String& SvxSearchDialog::BuildAttrText_Impl( String& rStr,
2329 											 sal_Bool bSrchFlag ) const
2330 {
2331 	if ( rStr.Len() )
2332 		rStr.Erase();
2333 
2334 	SfxObjectShell* pSh = SfxObjectShell::Current();
2335 	DBG_ASSERT( pSh, "no DocShell" );
2336 
2337 	if ( !pSh )
2338 		return rStr;
2339 
2340 	SfxItemPool& rPool = pSh->GetPool();
2341 	SearchAttrItemList* pList = bSrchFlag ? pSearchList : pReplaceList;
2342 
2343 	if ( !pList )
2344 		return rStr;
2345 
2346 	// Metrik abfragen
2347 	SfxMapUnit eMapUnit = SFX_MAPUNIT_CM;
2348 	FieldUnit eFieldUnit = pSh->GetModule()->GetFieldUnit();
2349 	switch ( eFieldUnit )
2350 	{
2351 		case FUNIT_MM:			eMapUnit = SFX_MAPUNIT_MM; break;
2352 		case FUNIT_CM:
2353 		case FUNIT_M:
2354 		case FUNIT_KM:			eMapUnit = SFX_MAPUNIT_CM; break;
2355 		case FUNIT_TWIP:		eMapUnit = SFX_MAPUNIT_TWIP; break;
2356 		case FUNIT_POINT:
2357 		case FUNIT_PICA:		eMapUnit = SFX_MAPUNIT_POINT; break;
2358 		case FUNIT_INCH:
2359 		case FUNIT_FOOT:
2360 		case FUNIT_MILE:		eMapUnit = SFX_MAPUNIT_INCH; break;
2361 		case FUNIT_100TH_MM:	eMapUnit = SFX_MAPUNIT_100TH_MM; break;
2362         default: ;//prevent warning
2363 	}
2364 
2365 	ResStringArray aAttrNames( SVX_RES( RID_ATTR_NAMES ) );
2366 
2367 	for ( sal_uInt16 i = 0; i < pList->Count(); ++i )
2368 	{
2369 		const SearchAttrItem& rItem = pList->GetObject(i);
2370 
2371 		if ( rStr.Len() )
2372 			rStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ", " ) );
2373 
2374 		if ( !IsInvalidItem( rItem.pItem ) )
2375 		{
2376 			String aStr;
2377 			rPool.GetPresentation( *rItem.pItem,
2378 									SFX_ITEM_PRESENTATION_COMPLETE,
2379 									eMapUnit, aStr );
2380 			rStr += aStr;
2381 		}
2382 		else if ( rItem.nSlot == SID_ATTR_BRUSH_CHAR )
2383 		{
2384 			//Sonderbehandlung fuer Zeichenhintergrund
2385 			rStr += SVX_RESSTR( RID_SVXITEMS_BRUSH_CHAR );
2386 		}
2387 		else
2388 		{
2389 		    sal_uInt32 nId  = aAttrNames.FindIndex( rItem.nSlot );
2390 		    if ( RESARRAY_INDEX_NOTFOUND != nId )
2391     		    rStr += aAttrNames.GetString( nId );
2392 		}
2393 	}
2394 	return rStr;
2395 }
2396 
2397 // -----------------------------------------------------------------------
2398 
PaintAttrText_Impl()2399 void SvxSearchDialog::PaintAttrText_Impl()
2400 {
2401 	String aDesc;
2402 	BuildAttrText_Impl( aDesc, bSearch );
2403 
2404 	if ( !bFormat && aDesc.Len() )
2405 		bFormat = sal_True;
2406 
2407 	if ( bSearch )
2408 	{
2409 		if ( !pImpl->bMultiLineEdit )
2410 			aSearchAttrText.SetText( aDesc );
2411 		else
2412 			pImpl->aSearchFormats.SetText( aDesc );
2413 		FocusHdl_Impl( &aSearchLB );
2414 	}
2415 	else
2416 	{
2417 		if ( !pImpl->bMultiLineEdit )
2418 			aReplaceAttrText.SetText( aDesc );
2419 		else
2420 			pImpl->aReplaceFormats.SetText( aDesc );
2421 		FocusHdl_Impl( &aReplaceLB );
2422 	}
2423 }
2424 
2425 // -----------------------------------------------------------------------
2426 
SetModifyFlag_Impl(const Control * pCtrl)2427 void SvxSearchDialog::SetModifyFlag_Impl( const Control* pCtrl )
2428 {
2429 	if ( &aSearchLB == (ComboBox*)pCtrl )
2430 		nModifyFlag |= MODIFY_SEARCH;
2431 	else if ( &aReplaceLB == (ComboBox*)pCtrl )
2432 		nModifyFlag |= MODIFY_REPLACE;
2433 	else if ( &aWordBtn == (CheckBox*)pCtrl )
2434 		nModifyFlag |= MODIFY_WORD;
2435 	else if ( &aMatchCaseCB == (CheckBox*)pCtrl )
2436 		nModifyFlag |= MODIFY_EXACT;
2437 	else if ( &aBackwardsBtn == (CheckBox*)pCtrl )
2438 		nModifyFlag |= MODIFY_BACKWARDS;
2439     else if ( &aNotesBtn == (CheckBox*)pCtrl )
2440         nModifyFlag |= MODIFY_NOTES;
2441 	else if ( &aSelectionBtn == (CheckBox*)pCtrl )
2442 		nModifyFlag |= MODIFY_SELECTION;
2443 	else if ( &aRegExpBtn == (CheckBox*)pCtrl )
2444 		nModifyFlag |= MODIFY_REGEXP;
2445 	else if ( &aLayoutBtn == (CheckBox*)pCtrl )
2446 		nModifyFlag |= MODIFY_LAYOUT;
2447 	else if ( &aSimilarityBox == (CheckBox*)pCtrl )
2448 		nModifyFlag |= MODIFY_SIMILARITY;
2449     else if ( &aCalcSearchInLB == (ListBox*)pCtrl )
2450     {
2451 		nModifyFlag |= MODIFY_FORMULAS;
2452 		nModifyFlag |= MODIFY_VALUES;
2453         nModifyFlag |= MODIFY_CALC_NOTES;
2454     }
2455 	else if ( &aRowsBtn == (RadioButton*)pCtrl )
2456 		nModifyFlag |= MODIFY_ROWS;
2457 	else if ( &aColumnsBtn == (RadioButton*)pCtrl )
2458 		nModifyFlag |= MODIFY_COLUMNS;
2459     else if ( &aAllSheetsCB == (CheckBox*)pCtrl )
2460 		nModifyFlag |= MODIFY_ALLTABLES;
2461 }
2462 
2463 // -----------------------------------------------------------------------
2464 
SaveToModule_Impl()2465 void SvxSearchDialog::SaveToModule_Impl()
2466 {
2467 	if ( !pSearchItem )
2468 		return;
2469 
2470 	if ( aLayoutBtn.IsChecked() )
2471 	{
2472 		pSearchItem->SetSearchString ( aSearchTmplLB.GetSelectEntry() );
2473 		pSearchItem->SetReplaceString( aReplaceTmplLB.GetSelectEntry() );
2474 	}
2475 	else
2476 	{
2477 		pSearchItem->SetSearchString ( aSearchLB.GetText() );
2478 		pSearchItem->SetReplaceString( aReplaceLB.GetText() );
2479 		Remember_Impl( aSearchLB.GetText(), sal_True );
2480 	}
2481 
2482 	pSearchItem->SetRegExp( sal_False );
2483 	pSearchItem->SetLevenshtein( sal_False );
2484 	if (GetCheckBoxValue( aRegExpBtn ))
2485 		pSearchItem->SetRegExp( sal_True );
2486 	else if (GetCheckBoxValue( aSimilarityBox ))
2487 		pSearchItem->SetLevenshtein( sal_True );
2488 
2489 	pSearchItem->SetWordOnly( GetCheckBoxValue( aWordBtn ) );
2490     pSearchItem->SetBackward( GetCheckBoxValue( aBackwardsBtn ) );
2491     pSearchItem->SetNotes( GetCheckBoxValue( aNotesBtn ) );
2492 	pSearchItem->SetPattern( GetCheckBoxValue( aLayoutBtn ) );
2493 	pSearchItem->SetSelection( GetCheckBoxValue( aSelectionBtn ) );
2494 
2495 	pSearchItem->SetUseAsianOptions( GetCheckBoxValue( aJapOptionsCB ) );
2496 	sal_Int32 nFlags = GetTransliterationFlags();
2497 	if( !pSearchItem->IsUseAsianOptions())
2498 		nFlags &= (TransliterationModules_IGNORE_CASE |
2499 				   TransliterationModules_IGNORE_WIDTH );
2500 	pSearchItem->SetTransliterationFlags( nFlags );
2501 
2502 	if ( !bWriter )
2503 	{
2504         if ( aCalcSearchInLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
2505             pSearchItem->SetCellType( aCalcSearchInLB.GetSelectEntryPos() );
2506 
2507 		pSearchItem->SetRowDirection( aRowsBtn.IsChecked() );
2508         pSearchItem->SetAllTables( aAllSheetsCB.IsChecked() );
2509 	}
2510 
2511 	pSearchItem->SetCommand( SVX_SEARCHCMD_FIND );
2512 	nModifyFlag = 0;
2513     const SfxPoolItem* ppArgs[] = { pSearchItem, 0 };
2514     rBindings.GetDispatcher()->Execute( SID_SEARCH_ITEM, SFX_CALLMODE_SLOT, ppArgs );
2515 }
2516 
2517 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >
GetComponentInterface(sal_Bool bCreate)2518 		SvxSearchDialog::GetComponentInterface( sal_Bool bCreate )
2519 {
2520     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xPeer
2521 		(Window::GetComponentInterface(false));
2522 	if ( !xPeer.is() && bCreate )
2523     {
2524 		::com::sun::star::awt::XWindowPeer* mxPeer = new VCLXSvxFindReplaceDialog(this);
2525 		SetComponentInterface(mxPeer);
2526 		return mxPeer;
2527     }
2528 	else
2529 		return xPeer;
2530 }
2531 
2532 // class SvxSearchDialogWrapper ------------------------------------------
2533 
2534 SFX_IMPL_CHILDWINDOW(SvxSearchDialogWrapper, SID_SEARCH_DLG);
2535 
2536 // -----------------------------------------------------------------------
2537 
SvxSearchDialogWrapper(Window * _pParent,sal_uInt16 nId,SfxBindings * pBindings,SfxChildWinInfo * pInfo)2538 SvxSearchDialogWrapper::SvxSearchDialogWrapper( Window* _pParent, sal_uInt16 nId,
2539 												SfxBindings* pBindings,
2540 												SfxChildWinInfo* pInfo )
2541     : SfxChildWindow( _pParent, nId )
2542     , dialog (new SvxSearchDialog (_pParent, this, *pBindings))
2543 {
2544     pWindow = LAYOUT_THIS_WINDOW (dialog);
2545 	dialog->Initialize( pInfo );
2546 
2547 	pBindings->Update( SID_SEARCH_ITEM );
2548 	pBindings->Update( SID_SEARCH_OPTIONS );
2549 	pBindings->Update( SID_SEARCH_SEARCHSET );
2550 	pBindings->Update( SID_SEARCH_REPLACESET );
2551 	eChildAlignment = SFX_ALIGN_NOALIGNMENT;
2552 	dialog->bConstruct = sal_False;
2553 }
2554 
~SvxSearchDialogWrapper()2555 SvxSearchDialogWrapper::~SvxSearchDialogWrapper ()
2556 {
2557 #if ENABLE_LAYOUT
2558     delete dialog;
2559     pWindow = 0;
2560 #endif /* ENABLE_LAYOUT */
2561 }
2562 
getDialog()2563 SvxSearchDialog *SvxSearchDialogWrapper::getDialog ()
2564 {
2565     return dialog;
2566 }
2567 
2568 // -----------------------------------------------------------------------
2569 
GetInfo() const2570 SfxChildWinInfo SvxSearchDialogWrapper::GetInfo() const
2571 {
2572 	SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();
2573 	aInfo.bVisible = sal_False;
2574 	return aInfo;
2575 }
2576 
2577