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