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