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 "tbunosearchcontrollers.hxx"
28 #include <svx/dialogs.hrc>
29 #include <svx/dialmgr.hxx>
30
31 #include <com/sun/star/beans/XPropertySet.hpp>
32 #include <com/sun/star/frame/XLayoutManager.hpp>
33 #include <com/sun/star/ui/XUIElement.hpp>
34 #include <com/sun/star/util/URL.hpp>
35
36 #include <toolkit/helper/vclunohelper.hxx>
37 #include <vcl/toolbox.hxx>
38 #include <vcl/svapp.hxx>
39 #include <vos/mutex.hxx>
40
41 namespace svx
42 {
43
44 static const ::rtl::OUString SEARCHITEM_SEARCHSTRING = ::rtl::OUString::createFromAscii("SearchItem.SearchString");
45 static const ::rtl::OUString SEARCHITEM_SEARCHBACKWARD = ::rtl::OUString::createFromAscii("SearchItem.Backward");
46
47 static const ::rtl::OUString COMMAND_EXECUTESEARCH = ::rtl::OUString::createFromAscii(".uno:ExecuteSearch");
48 static const ::rtl::OUString COMMAND_FINDTEXT = ::rtl::OUString::createFromAscii(".uno:FindText");
49 static const ::rtl::OUString COMMAND_DOWNSEARCH = ::rtl::OUString::createFromAscii(".uno:DownSearch");
50 static const ::rtl::OUString COMMAND_UPSEARCH = ::rtl::OUString::createFromAscii(".uno:UpSearch");
51 static const ::rtl::OUString COMMAND_APPENDSEARCHHISTORY = ::rtl::OUString::createFromAscii("AppendSearchHistory");
52
53 static const ::rtl::OUString SERVICENAME_URLTRANSFORMER = ::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer");
54 static const sal_Int32 REMEMBER_SIZE = 10;
55
impl_executeSearch(const css::uno::Reference<css::lang::XMultiServiceFactory> & rSMgr,const css::uno::Reference<css::frame::XFrame> & xFrame,const css::uno::Sequence<css::beans::PropertyValue> & lArgs)56 void impl_executeSearch( const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr, const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Sequence< css::beans::PropertyValue >& lArgs )
57 {
58 css::uno::Reference< css::util::XURLTransformer > xURLTransformer( rSMgr->createInstance(SERVICENAME_URLTRANSFORMER), css::uno::UNO_QUERY );
59 if ( xURLTransformer.is() )
60 {
61 css::util::URL aURL;
62 aURL.Complete = COMMAND_EXECUTESEARCH;
63 xURLTransformer->parseStrict(aURL);
64
65 css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(xFrame, css::uno::UNO_QUERY);
66 if ( xDispatchProvider.is() )
67 {
68 css::uno::Reference< css::frame::XDispatch > xDispatch = xDispatchProvider->queryDispatch( aURL, ::rtl::OUString(), 0 );
69 if ( xDispatch.is() && aURL.Complete.getLength() > 0 )
70 xDispatch->dispatch( aURL, lArgs );
71 }
72 }
73 }
74
FindTextFieldControl(Window * pParent,WinBits nStyle,css::uno::Reference<css::frame::XFrame> & xFrame,css::uno::Reference<css::lang::XMultiServiceFactory> & xServiceManager)75 FindTextFieldControl::FindTextFieldControl( Window* pParent, WinBits nStyle,
76 css::uno::Reference< css::frame::XFrame >& xFrame,
77 css::uno::Reference< css::lang::XMultiServiceFactory >& xServiceManager) :
78 ComboBox( pParent, nStyle ),
79 m_xFrame(xFrame),
80 m_xServiceManager(xServiceManager),
81 m_bToClearTextField(sal_True)
82 {
83 InitControls_Impl();
84 }
85
~FindTextFieldControl()86 FindTextFieldControl::~FindTextFieldControl()
87 {
88 }
89
InitControls_Impl()90 void FindTextFieldControl::InitControls_Impl()
91 {
92 SetText( SVX_RESSTR( RID_SVXSTR_FINDBAR_FIND ) );
93 SetControlForeground(GetSettings().GetStyleSettings().GetDisableColor());
94
95 EnableAutocomplete(sal_True, sal_True);
96 }
97
Remember_Impl(const String & rStr)98 void FindTextFieldControl::Remember_Impl(const String& rStr)
99 {
100 sal_uInt16 nCount = GetEntryCount();
101
102 for (sal_uInt16 i=0; i<nCount; ++i)
103 {
104 if ( rStr == GetEntry(i))
105 return;
106 }
107
108 if (nCount == REMEMBER_SIZE)
109 RemoveEntry(REMEMBER_SIZE-1);
110
111 InsertEntry(rStr, 0);
112 }
113
Modify()114 void FindTextFieldControl::Modify()
115 {
116 ComboBox::Modify();
117
118 SetControlForeground( GetSettings().GetStyleSettings().GetWindowTextColor() );
119 }
120
PreNotify(NotifyEvent & rNEvt)121 long FindTextFieldControl::PreNotify( NotifyEvent& rNEvt )
122 {
123 long nRet= ComboBox::PreNotify( rNEvt );
124
125 switch ( rNEvt.GetType() )
126 {
127 case EVENT_KEYINPUT:
128 {
129 const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
130 sal_Bool bCtrl = pKeyEvent->GetKeyCode().IsMod1();
131 sal_Bool bAlt = pKeyEvent->GetKeyCode().IsMod2();
132 sal_Bool bShift = pKeyEvent->GetKeyCode().IsShift();
133 sal_uInt16 nCode = pKeyEvent->GetKeyCode().GetCode();
134
135 if ( (bCtrl && bAlt && KEY_F == nCode) || KEY_ESCAPE == nCode )
136 {
137 nRet = 1;
138 GrabFocusToDocument();
139 }
140
141 if ( KEY_RETURN == nCode )
142 {
143 Remember_Impl(GetText());
144
145 ::rtl::OUString sFindText = GetText();
146 css::uno::Sequence< css::beans::PropertyValue > lArgs(2);
147
148 lArgs[0].Name = SEARCHITEM_SEARCHSTRING;
149 lArgs[0].Value <<= sFindText;
150
151 lArgs[1].Name = SEARCHITEM_SEARCHBACKWARD;
152 if (bShift)
153 lArgs[1].Value <<= sal_True;
154 else
155 lArgs[1].Value <<= sal_False;
156
157 impl_executeSearch(m_xServiceManager, m_xFrame, lArgs);
158 nRet = 1;
159 }
160 break;
161 }
162
163 case EVENT_GETFOCUS:
164 if ( m_bToClearTextField )
165 {
166 SetText( String() );
167 m_bToClearTextField = sal_False;
168 }
169 SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
170 break;
171
172 case EVENT_LOSEFOCUS:
173 if ( GetText().Len() == 0 )
174 {
175 SetText( SVX_RESSTR( RID_SVXSTR_FINDBAR_FIND ) );
176 SetControlForeground(GetSettings().GetStyleSettings().GetDisableColor());
177 m_bToClearTextField = sal_True;
178 }
179 break;
180 }
181
182 return nRet;
183 }
184
185
186 //-----------------------------------------------------------------------------------------------------------
187 // SearchToolbarControllersManager
188
189 SearchToolbarControllersManager* SearchToolbarControllersManager::m_pInstance = 0;
190
SearchToolbarControllersManager()191 SearchToolbarControllersManager::SearchToolbarControllersManager()
192 {
193 }
194
~SearchToolbarControllersManager()195 SearchToolbarControllersManager::~SearchToolbarControllersManager()
196 {
197 }
198
createControllersManager()199 SearchToolbarControllersManager* SearchToolbarControllersManager::createControllersManager()
200 {
201 if (!m_pInstance)
202 m_pInstance = new SearchToolbarControllersManager();
203
204 return m_pInstance;
205 }
206
registryController(const css::uno::Reference<css::frame::XFrame> & xFrame,const css::uno::Reference<css::frame::XStatusListener> & xStatusListener,const::rtl::OUString & sCommandURL)207 void SearchToolbarControllersManager::registryController( const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Reference< css::frame::XStatusListener >& xStatusListener, const ::rtl::OUString& sCommandURL )
208 {
209 SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
210 if (pIt == aSearchToolbarControllersMap.end())
211 {
212 SearchToolbarControllersVec lControllers(1);
213 lControllers[0].Name = sCommandURL;
214 lControllers[0].Value <<= xStatusListener;
215 aSearchToolbarControllersMap.insert(SearchToolbarControllersMap::value_type(xFrame, lControllers));
216 }
217 else
218 {
219 sal_Int32 nSize = pIt->second.size();
220 for (sal_Int32 i=0; i<nSize; ++i)
221 {
222 if (pIt->second[i].Name.equals(sCommandURL))
223 return;
224 }
225
226 pIt->second.resize(nSize+1);
227 pIt->second[nSize].Name = sCommandURL;
228 pIt->second[nSize].Value <<= xStatusListener;
229 }
230 }
231
freeController(const css::uno::Reference<css::frame::XFrame> & xFrame,const css::uno::Reference<css::frame::XStatusListener> &,const::rtl::OUString & sCommandURL)232 void SearchToolbarControllersManager::freeController( const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Reference< css::frame::XStatusListener >& /*xStatusListener*/, const ::rtl::OUString& sCommandURL )
233 {
234 SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
235 if (pIt != aSearchToolbarControllersMap.end())
236 {
237 for (SearchToolbarControllersVec::iterator pItCtrl=pIt->second.begin(); pItCtrl!=pIt->second.end(); ++pItCtrl)
238 {
239 if (pItCtrl->Name.equals(sCommandURL))
240 {
241 pIt->second.erase(pItCtrl);
242 break;
243 }
244 }
245
246 if (pIt->second.empty())
247 aSearchToolbarControllersMap.erase(pIt);
248 }
249 }
250
findController(const css::uno::Reference<css::frame::XFrame> & xFrame,const::rtl::OUString & sCommandURL)251 css::uno::Reference< css::frame::XStatusListener > SearchToolbarControllersManager::findController( const css::uno::Reference< css::frame::XFrame >& xFrame, const ::rtl::OUString& sCommandURL )
252 {
253 css::uno::Reference< css::frame::XStatusListener > xStatusListener;
254
255 SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
256 if (pIt != aSearchToolbarControllersMap.end())
257 {
258 for (SearchToolbarControllersVec::iterator pItCtrl =pIt->second.begin(); pItCtrl != pIt->second.end(); ++pItCtrl)
259 {
260 if (pItCtrl->Name.equals(sCommandURL))
261 {
262 pItCtrl->Value >>= xStatusListener;
263 break;
264 }
265 }
266 }
267
268 return xStatusListener;
269 }
270
271 //-----------------------------------------------------------------------------------------------------------
272 // FindTextToolbarController
273
FindTextToolbarController(const css::uno::Reference<css::lang::XMultiServiceFactory> & rServiceManager)274 FindTextToolbarController::FindTextToolbarController( const css::uno::Reference< css::lang::XMultiServiceFactory >& rServiceManager )
275 :svt::ToolboxController( rServiceManager,
276 css::uno::Reference< css::frame::XFrame >(),
277 COMMAND_FINDTEXT )
278 {
279 }
280
~FindTextToolbarController()281 FindTextToolbarController::~FindTextToolbarController()
282 {
283 }
284
285 // XInterface
queryInterface(const css::uno::Type & aType)286 css::uno::Any SAL_CALL FindTextToolbarController::queryInterface( const css::uno::Type& aType ) throw ( css::uno::RuntimeException )
287 {
288 css::uno::Any a = ToolboxController::queryInterface( aType );
289 if ( a.hasValue() )
290 return a;
291
292 return ::cppu::queryInterface( aType, static_cast< css::lang::XServiceInfo* >( this ) );
293 }
294
acquire()295 void SAL_CALL FindTextToolbarController::acquire() throw ()
296 {
297 ToolboxController::acquire();
298 }
299
release()300 void SAL_CALL FindTextToolbarController::release() throw ()
301 {
302 ToolboxController::release();
303 }
304
305 // XServiceInfo
getImplementationName()306 ::rtl::OUString SAL_CALL FindTextToolbarController::getImplementationName() throw( css::uno::RuntimeException )
307 {
308 return getImplementationName_Static();
309 }
310
supportsService(const::rtl::OUString & ServiceName)311 sal_Bool SAL_CALL FindTextToolbarController::supportsService( const ::rtl::OUString& ServiceName ) throw( css::uno::RuntimeException )
312 {
313 const css::uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() );
314 const ::rtl::OUString * pArray = aSNL.getConstArray();
315
316 for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
317 if( pArray[i] == ServiceName )
318 return true;
319
320 return false;
321 }
322
getSupportedServiceNames()323 css::uno::Sequence< ::rtl::OUString > SAL_CALL FindTextToolbarController::getSupportedServiceNames() throw( css::uno::RuntimeException )
324 {
325 return getSupportedServiceNames_Static();
326 }
327
getSupportedServiceNames_Static()328 css::uno::Sequence< ::rtl::OUString > FindTextToolbarController::getSupportedServiceNames_Static() throw()
329 {
330 css::uno::Sequence< ::rtl::OUString > aSNS( 1 );
331 aSNS.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ) );
332 return aSNS;
333 }
334
335 // XComponent
dispose()336 void SAL_CALL FindTextToolbarController::dispose() throw ( css::uno::RuntimeException )
337 {
338 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
339
340 SearchToolbarControllersManager::createControllersManager()->freeController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
341
342 svt::ToolboxController::dispose();
343 delete m_pFindTextFieldControl;
344 m_pFindTextFieldControl = 0;
345 }
346
347 // XInitialization
initialize(const css::uno::Sequence<::com::sun::star::uno::Any> & aArguments)348 void SAL_CALL FindTextToolbarController::initialize( const css::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException)
349 {
350 svt::ToolboxController::initialize(aArguments);
351
352 Window* pWindow = VCLUnoHelper::GetWindow( getParent() );
353 ToolBox* pToolBox = (ToolBox*)pWindow;
354 if ( pToolBox )
355 {
356 sal_uInt16 nItemCount = pToolBox->GetItemCount();
357 for ( sal_uInt16 i=0; i<nItemCount; ++i )
358 {
359 ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i);
360 if ( sItemCommand.equals( COMMAND_DOWNSEARCH ) )
361 {
362 pToolBox->EnableItem(i, sal_False);
363 m_nDownSearchId = i;
364 }
365 else if (sItemCommand.equals( COMMAND_UPSEARCH ))
366 {
367 pToolBox->EnableItem(i, sal_False);
368 m_nUpSearchId = i;
369 }
370 }
371 }
372
373 SearchToolbarControllersManager::createControllersManager()->registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
374 }
375
376 // XToolbarController
execute(sal_Int16)377 void SAL_CALL FindTextToolbarController::execute( sal_Int16 /*KeyModifier*/ ) throw ( css::uno::RuntimeException )
378 {
379 }
380
createItemWindow(const css::uno::Reference<css::awt::XWindow> & Parent)381 css::uno::Reference< css::awt::XWindow > SAL_CALL FindTextToolbarController::createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) throw ( css::uno::RuntimeException )
382 {
383 css::uno::Reference< css::awt::XWindow > xItemWindow;
384
385 css::uno::Reference< css::awt::XWindow > xParent( Parent );
386 Window* pParent = VCLUnoHelper::GetWindow( xParent );
387 if ( pParent )
388 {
389 ToolBox* pToolbar = ( ToolBox* )pParent;
390 m_pFindTextFieldControl = new FindTextFieldControl( pToolbar, WinBits( WB_DROPDOWN | WB_VSCROLL), m_xFrame, m_xServiceManager );
391
392 Size aSize(100, m_pFindTextFieldControl->GetTextHeight() + 200);
393 m_pFindTextFieldControl->SetSizePixel( aSize );
394 m_pFindTextFieldControl->SetModifyHdl(LINK(this, FindTextToolbarController, EditModifyHdl));
395 }
396 xItemWindow = VCLUnoHelper::GetInterface( m_pFindTextFieldControl );
397
398 return xItemWindow;
399 }
400
401 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent & rEvent)402 void SAL_CALL FindTextToolbarController::statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException )
403 {
404 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
405 if ( m_bDisposed )
406 return;
407
408 ::rtl::OUString aFeatureURL = rEvent.FeatureURL.Complete;
409 if (aFeatureURL.equalsAscii("AppendSearchHistory"))
410 {
411 m_pFindTextFieldControl->Remember_Impl(m_pFindTextFieldControl->GetText());
412 }
413 }
414
IMPL_LINK(FindTextToolbarController,EditModifyHdl,void *,EMPTYARG)415 IMPL_LINK( FindTextToolbarController, EditModifyHdl, void *, EMPTYARG )
416 {
417 // enable or disable item DownSearch/UpSearch of findbar
418 Window* pWindow = VCLUnoHelper::GetWindow( getParent() );
419 ToolBox* pToolBox = (ToolBox*)pWindow;
420 if ( pToolBox && m_pFindTextFieldControl )
421 {
422 if (m_pFindTextFieldControl->GetText().Len()>0)
423 {
424 if ( !pToolBox->IsItemEnabled(m_nDownSearchId) )
425 pToolBox->EnableItem(m_nDownSearchId, sal_True);
426 if ( !pToolBox->IsItemEnabled(m_nUpSearchId) )
427 pToolBox->EnableItem(m_nUpSearchId, sal_True);
428 }
429 else
430 {
431 if ( pToolBox->IsItemEnabled(m_nDownSearchId) )
432 pToolBox->EnableItem(m_nDownSearchId, sal_False);
433 if ( pToolBox->IsItemEnabled(m_nUpSearchId) )
434 pToolBox->EnableItem(m_nUpSearchId, sal_False);
435 }
436 }
437
438 return 0;
439 }
440
441 //-----------------------------------------------------------------------------------------------------------
442 // class DownSearchToolboxController
443
DownSearchToolboxController(const css::uno::Reference<css::lang::XMultiServiceFactory> & rServiceManager)444 DownSearchToolboxController::DownSearchToolboxController(const css::uno::Reference< css::lang::XMultiServiceFactory >& rServiceManager )
445 : svt::ToolboxController( rServiceManager,
446 css::uno::Reference< css::frame::XFrame >(),
447 COMMAND_DOWNSEARCH )
448 {
449 }
450
~DownSearchToolboxController()451 DownSearchToolboxController::~DownSearchToolboxController()
452 {
453 }
454
455 // XInterface
queryInterface(const css::uno::Type & aType)456 css::uno::Any SAL_CALL DownSearchToolboxController::queryInterface( const css::uno::Type& aType ) throw ( css::uno::RuntimeException )
457 {
458 css::uno::Any a = ToolboxController::queryInterface( aType );
459 if ( a.hasValue() )
460 return a;
461
462 return ::cppu::queryInterface( aType, static_cast< css::lang::XServiceInfo* >( this ) );
463 }
464
acquire()465 void SAL_CALL DownSearchToolboxController::acquire() throw ()
466 {
467 ToolboxController::acquire();
468 }
469
release()470 void SAL_CALL DownSearchToolboxController::release() throw ()
471 {
472 ToolboxController::release();
473 }
474
475 // XServiceInfo
getImplementationName()476 ::rtl::OUString SAL_CALL DownSearchToolboxController::getImplementationName() throw( css::uno::RuntimeException )
477 {
478 return getImplementationName_Static();
479 }
480
supportsService(const::rtl::OUString & ServiceName)481 sal_Bool SAL_CALL DownSearchToolboxController::supportsService( const ::rtl::OUString& ServiceName ) throw( css::uno::RuntimeException )
482 {
483 const css::uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() );
484 const ::rtl::OUString * pArray = aSNL.getConstArray();
485
486 for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
487 if( pArray[i] == ServiceName )
488 return true;
489
490 return false;
491 }
492
getSupportedServiceNames()493 css::uno::Sequence< ::rtl::OUString > SAL_CALL DownSearchToolboxController::getSupportedServiceNames() throw( css::uno::RuntimeException )
494 {
495 return getSupportedServiceNames_Static();
496 }
497
getSupportedServiceNames_Static()498 css::uno::Sequence< ::rtl::OUString > DownSearchToolboxController::getSupportedServiceNames_Static() throw()
499 {
500 css::uno::Sequence< ::rtl::OUString > aSNS( 1 );
501 aSNS.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
502 return aSNS;
503 }
504
505 // XComponent
dispose()506 void SAL_CALL DownSearchToolboxController::dispose() throw ( css::uno::RuntimeException )
507 {
508 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
509
510 SearchToolbarControllersManager::createControllersManager()->freeController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
511
512 svt::ToolboxController::dispose();
513 }
514
515 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)516 void SAL_CALL DownSearchToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException )
517 {
518 svt::ToolboxController::initialize( aArguments );
519 SearchToolbarControllersManager::createControllersManager()->registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
520 }
521
522 // XToolbarController
execute(sal_Int16)523 void SAL_CALL DownSearchToolboxController::execute( sal_Int16 /*KeyModifier*/ ) throw ( css::uno::RuntimeException)
524 {
525 if ( m_bDisposed )
526 throw css::lang::DisposedException();
527
528 ::rtl::OUString sFindText;
529 Window* pWindow = VCLUnoHelper::GetWindow( getParent() );
530 ToolBox* pToolBox = (ToolBox*)pWindow;
531 if ( pToolBox )
532 {
533 sal_uInt16 nItemCount = pToolBox->GetItemCount();
534 for ( sal_uInt16 i=0; i<nItemCount; ++i )
535 {
536 ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i);
537 if ( sItemCommand.equals( COMMAND_FINDTEXT ) )
538 {
539 Window* pItemWin = pToolBox->GetItemWindow(i);
540 if (pItemWin)
541 sFindText = pItemWin->GetText();
542 break;
543 }
544 }
545 }
546
547 css::uno::Sequence< css::beans::PropertyValue > lArgs(2);
548 lArgs[0].Name = SEARCHITEM_SEARCHSTRING;
549 lArgs[0].Value <<= sFindText;
550 lArgs[1].Name = SEARCHITEM_SEARCHBACKWARD;
551 lArgs[1].Value <<= sal_False;
552
553 impl_executeSearch(m_xServiceManager, m_xFrame, lArgs);
554
555 css::frame::FeatureStateEvent aEvent;
556 aEvent.FeatureURL.Complete = COMMAND_APPENDSEARCHHISTORY;
557 css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager()->findController(m_xFrame, COMMAND_FINDTEXT);
558 if (xStatusListener.is())
559 xStatusListener->statusChanged( aEvent );
560 }
561
562 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)563 void SAL_CALL DownSearchToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ ) throw ( css::uno::RuntimeException )
564 {
565 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
566 if ( m_bDisposed )
567 return;
568 }
569
570 //-----------------------------------------------------------------------------------------------------------
571 // class UpSearchToolboxController
572
UpSearchToolboxController(const css::uno::Reference<css::lang::XMultiServiceFactory> & rServiceManager)573 UpSearchToolboxController::UpSearchToolboxController( const css::uno::Reference< css::lang::XMultiServiceFactory > & rServiceManager )
574 :svt::ToolboxController( rServiceManager,
575 css::uno::Reference< css::frame::XFrame >(),
576 COMMAND_UPSEARCH )
577 {
578 }
579
~UpSearchToolboxController()580 UpSearchToolboxController::~UpSearchToolboxController()
581 {
582 }
583
584 // XInterface
queryInterface(const css::uno::Type & aType)585 css::uno::Any SAL_CALL UpSearchToolboxController::queryInterface( const css::uno::Type& aType ) throw ( css::uno::RuntimeException )
586 {
587 css::uno::Any a = ToolboxController::queryInterface( aType );
588 if ( a.hasValue() )
589 return a;
590
591 return ::cppu::queryInterface( aType, static_cast< css::lang::XServiceInfo* >( this ) );
592 }
593
acquire()594 void SAL_CALL UpSearchToolboxController::acquire() throw ()
595 {
596 ToolboxController::acquire();
597 }
598
release()599 void SAL_CALL UpSearchToolboxController::release() throw ()
600 {
601 ToolboxController::release();
602 }
603
604 // XServiceInfo
getImplementationName()605 ::rtl::OUString SAL_CALL UpSearchToolboxController::getImplementationName() throw( css::uno::RuntimeException )
606 {
607 return getImplementationName_Static();
608 }
609
supportsService(const::rtl::OUString & ServiceName)610 sal_Bool SAL_CALL UpSearchToolboxController::supportsService( const ::rtl::OUString& ServiceName ) throw( css::uno::RuntimeException )
611 {
612 const css::uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() );
613 const ::rtl::OUString * pArray = aSNL.getConstArray();
614
615 for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
616 if( pArray[i] == ServiceName )
617 return true;
618
619 return false;
620 }
621
getSupportedServiceNames()622 css::uno::Sequence< ::rtl::OUString > SAL_CALL UpSearchToolboxController::getSupportedServiceNames() throw( css::uno::RuntimeException )
623 {
624 return getSupportedServiceNames_Static();
625 }
626
getSupportedServiceNames_Static()627 css::uno::Sequence< ::rtl::OUString > UpSearchToolboxController::getSupportedServiceNames_Static() throw()
628 {
629 css::uno::Sequence< ::rtl::OUString > aSNS( 1 );
630 aSNS.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ) );
631 return aSNS;
632 }
633
634 // XComponent
dispose()635 void SAL_CALL UpSearchToolboxController::dispose() throw ( css::uno::RuntimeException )
636 {
637 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
638
639 SearchToolbarControllersManager::createControllersManager()->freeController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
640
641 svt::ToolboxController::dispose();
642 }
643
644 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)645 void SAL_CALL UpSearchToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException )
646 {
647 svt::ToolboxController::initialize( aArguments );
648 SearchToolbarControllersManager::createControllersManager()->registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
649 }
650
651 // XToolbarController
execute(sal_Int16)652 void SAL_CALL UpSearchToolboxController::execute( sal_Int16 /*KeyModifier*/ ) throw ( css::uno::RuntimeException )
653 {
654 if ( m_bDisposed )
655 throw css::lang::DisposedException();
656
657 ::rtl::OUString sFindText;
658 Window* pWindow = VCLUnoHelper::GetWindow( getParent() );
659 ToolBox* pToolBox = (ToolBox*)pWindow;
660 if ( pToolBox )
661 {
662 sal_uInt16 nItemCount = pToolBox->GetItemCount();
663 for ( sal_uInt16 i=0; i<nItemCount; ++i )
664 {
665 ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i);
666 if ( sItemCommand.equals( COMMAND_FINDTEXT ) )
667 {
668 Window* pItemWin = pToolBox->GetItemWindow(i);
669 if (pItemWin)
670 sFindText = pItemWin->GetText();
671 break;
672 }
673 }
674 }
675
676 css::uno::Sequence< css::beans::PropertyValue > lArgs(2);
677 lArgs[0].Name = SEARCHITEM_SEARCHSTRING;
678 lArgs[0].Value <<= sFindText;
679 lArgs[1].Name = SEARCHITEM_SEARCHBACKWARD;
680 lArgs[1].Value <<= sal_True;
681
682 impl_executeSearch(m_xServiceManager, m_xFrame, lArgs);
683
684 css::frame::FeatureStateEvent aEvent;
685 aEvent.FeatureURL.Complete = COMMAND_APPENDSEARCHHISTORY;
686 css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager()->findController(m_xFrame, COMMAND_FINDTEXT);
687 if (xStatusListener.is())
688 xStatusListener->statusChanged( aEvent );
689 }
690
691 // XStatusListener
statusChanged(const css::frame::FeatureStateEvent &)692 void SAL_CALL UpSearchToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ ) throw ( css::uno::RuntimeException )
693 {
694 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
695 if ( m_bDisposed )
696 return;
697 }
698
699 //-----------------------------------------------------------------------------------------------------------
700 // class FindbarDispatcher
701
FindbarDispatcher(const css::uno::Reference<css::lang::XMultiServiceFactory> & xFactory)702 FindbarDispatcher::FindbarDispatcher(const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory)
703 : m_xFactory( xFactory )
704 {
705 }
706
~FindbarDispatcher()707 FindbarDispatcher::~FindbarDispatcher()
708 {
709 m_xFactory = NULL;
710 m_xFrame = NULL;
711 }
712
713 // XInterface
queryInterface(const css::uno::Type & aType)714 css::uno::Any SAL_CALL FindbarDispatcher::queryInterface( const css::uno::Type& aType ) throw( css::uno::RuntimeException )
715 {
716 css::uno::Any aReturn( ::cppu::queryInterface( aType,
717 static_cast< css::lang::XServiceInfo* >(this),
718 static_cast< css::lang::XInitialization* >(this),
719 static_cast< css::frame::XDispatchProvider* >(this),
720 static_cast< css::frame::XDispatch* >(this)) );
721
722 if ( aReturn.hasValue() )
723 return aReturn;
724
725 return OWeakObject::queryInterface( aType );
726 }
727
acquire()728 void SAL_CALL FindbarDispatcher::acquire() throw()
729 {
730 OWeakObject::acquire();
731 }
732
release()733 void SAL_CALL FindbarDispatcher::release() throw()
734 {
735 OWeakObject::release();
736 }
737
738 // XServiceInfo
getImplementationName()739 ::rtl::OUString SAL_CALL FindbarDispatcher::getImplementationName() throw( css::uno::RuntimeException )
740 {
741 return getImplementationName_Static();
742 }
743
supportsService(const::rtl::OUString & ServiceName)744 sal_Bool SAL_CALL FindbarDispatcher::supportsService( const ::rtl::OUString& ServiceName ) throw( css::uno::RuntimeException )
745 {
746 return (
747 ServiceName.equalsAscii("com.sun.star.comp.svx.FindbarDispatcher") ||
748 ServiceName.equalsAscii("com.sun.star.frame.ProtocolHandler")
749 );
750 }
751
getSupportedServiceNames()752 css::uno::Sequence< ::rtl::OUString > SAL_CALL FindbarDispatcher::getSupportedServiceNames() throw( css::uno::RuntimeException )
753 {
754 return getSupportedServiceNames_Static();
755 }
756
getSupportedServiceNames_Static()757 css::uno::Sequence< ::rtl::OUString > FindbarDispatcher::getSupportedServiceNames_Static() throw()
758 {
759 css::uno::Sequence< ::rtl::OUString > aSNS( 2 );
760 aSNS.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.FindbarDispatcher" ));
761 aSNS.getArray()[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ProtocolHandler" ));
762 return aSNS;
763 }
764
765 // XInitialization
initialize(const css::uno::Sequence<css::uno::Any> & aArguments)766 void SAL_CALL FindbarDispatcher::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException )
767 {
768 if ( aArguments.getLength() )
769 aArguments[0] >>= m_xFrame;
770 }
771
772 // XDispatchProvider
queryDispatch(const css::util::URL & aURL,const::rtl::OUString &,sal_Int32)773 css::uno::Reference< css::frame::XDispatch > SAL_CALL FindbarDispatcher::queryDispatch( const css::util::URL& aURL, const ::rtl::OUString& /*sTargetFrameName*/, sal_Int32 /*nSearchFlags*/ ) throw( css::uno::RuntimeException )
774 {
775 css::uno::Reference< css::frame::XDispatch > xDispatch;
776
777 if ( aURL.Protocol.equalsAscii("vnd.sun.star.findbar:") )
778 xDispatch = this;
779
780 return xDispatch;
781 }
782
queryDispatches(const css::uno::Sequence<css::frame::DispatchDescriptor> & seqDescripts)783 css::uno::Sequence < css::uno::Reference< css::frame::XDispatch > > SAL_CALL FindbarDispatcher::queryDispatches( const css::uno::Sequence < css::frame::DispatchDescriptor >& seqDescripts ) throw( css::uno::RuntimeException )
784 {
785 sal_Int32 nCount = seqDescripts.getLength();
786 css::uno::Sequence < css::uno::Reference < XDispatch > > lDispatcher( nCount );
787
788 for( sal_Int32 i=0; i<nCount; ++i )
789 lDispatcher[i] = queryDispatch( seqDescripts[i].FeatureURL, seqDescripts[i].FrameName, seqDescripts[i].SearchFlags );
790
791 return lDispatcher;
792 }
793
794 // XDispatch
dispatch(const css::util::URL & aURL,const css::uno::Sequence<css::beans::PropertyValue> &)795 void SAL_CALL FindbarDispatcher::dispatch( const css::util::URL& aURL, const css::uno::Sequence < css::beans::PropertyValue >& /*lArgs*/ ) throw( css::uno::RuntimeException )
796 {
797 //vnd.sun.star.findbar:FocusToFindbar - set cursor to the FindTextFieldControl of the findbar
798 if ( aURL.Path.equalsAscii("FocusToFindbar") )
799 {
800 css::uno::Reference< css::beans::XPropertySet > xPropSet(m_xFrame, css::uno::UNO_QUERY);
801 if(!xPropSet.is())
802 return;
803
804 css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
805 css::uno::Any aValue = xPropSet->getPropertyValue( ::rtl::OUString::createFromAscii("LayoutManager") );
806 aValue >>= xLayoutManager;
807 if (!xLayoutManager.is())
808 return;
809
810 const ::rtl::OUString sResourceURL = ::rtl::OUString::createFromAscii("private:resource/toolbar/findbar");
811 css::uno::Reference< css::ui::XUIElement > xUIElement = xLayoutManager->getElement(sResourceURL);
812 if (!xUIElement.is())
813 return;
814
815 css::uno::Reference< css::awt::XWindow > xWindow(xUIElement->getRealInterface(), css::uno::UNO_QUERY);
816 Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
817 ToolBox* pToolBox = (ToolBox*)pWindow;
818 if ( pToolBox )
819 {
820 sal_uInt16 nItemCount = pToolBox->GetItemCount();
821 for ( sal_uInt16 i=0; i<nItemCount; ++i )
822 {
823 ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i);
824 if ( sItemCommand.equalsAscii(".uno:FindText") )
825 {
826 Window* pItemWin = pToolBox->GetItemWindow( i );
827 if ( pItemWin )
828 {
829 pItemWin->GrabFocus();
830 return;
831 }
832 }
833 }
834 }
835
836 }
837 }
838
addStatusListener(const css::uno::Reference<css::frame::XStatusListener> &,const css::util::URL &)839 void SAL_CALL FindbarDispatcher::addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xControl*/, const css::util::URL& /*aURL*/ ) throw ( css::uno::RuntimeException )
840 {
841 }
842
removeStatusListener(const css::uno::Reference<css::frame::XStatusListener> &,const css::util::URL &)843 void SAL_CALL FindbarDispatcher::removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xControl*/, const css::util::URL& /*aURL*/ ) throw ( css::uno::RuntimeException )
844 {
845 }
846
847 //-----------------------------------------------------------------------------------------------------------
848 // create Instance
849
FindTextToolbarController_createInstance(const css::uno::Reference<css::lang::XMultiServiceFactory> & rSMgr)850 css::uno::Reference< css::uno::XInterface > SAL_CALL FindTextToolbarController_createInstance(
851 const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
852 {
853 return *new FindTextToolbarController( rSMgr );
854 }
855
DownSearchToolboxController_createInstance(const css::uno::Reference<css::lang::XMultiServiceFactory> & rSMgr)856 css::uno::Reference< css::uno::XInterface > SAL_CALL DownSearchToolboxController_createInstance(
857 const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
858 {
859 return *new DownSearchToolboxController( rSMgr );
860 }
861
UpSearchToolboxController_createInstance(const css::uno::Reference<css::lang::XMultiServiceFactory> & rSMgr)862 css::uno::Reference< css::uno::XInterface > SAL_CALL UpSearchToolboxController_createInstance(
863 const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
864 {
865 return *new UpSearchToolboxController( rSMgr );
866 }
867
FindbarDispatcher_createInstance(const css::uno::Reference<css::lang::XMultiServiceFactory> & rSMgr)868 css::uno::Reference< css::uno::XInterface > SAL_CALL FindbarDispatcher_createInstance(
869 const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
870 {
871 return *new FindbarDispatcher( rSMgr );
872 }
873
874 //-----------------------------------------------------------------------------------------------------------
875 }
876