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