Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "tbunosearchcontrollers.hxx"
22 : #include <svx/dialogs.hrc>
23 : #include <svx/dialmgr.hxx>
24 :
25 : #include <comphelper/processfactory.hxx>
26 : #include <com/sun/star/beans/XPropertySet.hpp>
27 : #include <com/sun/star/frame/XLayoutManager.hpp>
28 : #include <com/sun/star/text/XTextRange.hpp>
29 : #include <com/sun/star/ui/XUIElement.hpp>
30 : #include <com/sun/star/util/URL.hpp>
31 : #include <com/sun/star/util/URLTransformer.hpp>
32 :
33 : #include <toolkit/helper/vclunohelper.hxx>
34 : #include <vcl/toolbox.hxx>
35 : #include <vcl/svapp.hxx>
36 : #include <osl/mutex.hxx>
37 : #include <rtl/instance.hxx>
38 :
39 : namespace svx
40 : {
41 :
42 : static const char SEARCHITEM_SEARCHSTRING[] = "SearchItem.SearchString";
43 : static const char SEARCHITEM_SEARCHBACKWARD[] = "SearchItem.Backward";
44 : static const char SEARCHITEM_SEARCHFLAGS[] = "SearchItem.SearchFlags";
45 :
46 : static const char COMMAND_EXECUTESEARCH[] = ".uno:ExecuteSearch";
47 : static const char COMMAND_FINDTEXT[] = ".uno:FindText";
48 : static const char COMMAND_DOWNSEARCH[] = ".uno:DownSearch";
49 : static const char COMMAND_UPSEARCH[] = ".uno:UpSearch";
50 : static const char COMMAND_APPENDSEARCHHISTORY[] = "AppendSearchHistory";
51 :
52 : static const sal_Int32 REMEMBER_SIZE = 10;
53 :
54 0 : 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 )
55 : {
56 0 : css::uno::Reference< css::util::XURLTransformer > xURLTransformer( css::util::URLTransformer::create(::comphelper::getComponentContext(rSMgr)) );
57 0 : css::util::URL aURL;
58 0 : aURL.Complete = rtl::OUString(COMMAND_EXECUTESEARCH);
59 0 : xURLTransformer->parseStrict(aURL);
60 :
61 0 : css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(xFrame, css::uno::UNO_QUERY);
62 0 : if ( xDispatchProvider.is() )
63 : {
64 0 : css::uno::Reference< css::frame::XDispatch > xDispatch = xDispatchProvider->queryDispatch( aURL, ::rtl::OUString(), 0 );
65 0 : if ( xDispatch.is() && !aURL.Complete.isEmpty() )
66 0 : xDispatch->dispatch( aURL, lArgs );
67 0 : }
68 0 : }
69 :
70 0 : FindTextFieldControl::FindTextFieldControl( Window* pParent, WinBits nStyle,
71 : css::uno::Reference< css::frame::XFrame >& xFrame,
72 : css::uno::Reference< css::lang::XMultiServiceFactory >& xServiceManager) :
73 : ComboBox( pParent, nStyle ),
74 : m_xFrame(xFrame),
75 0 : m_xServiceManager(xServiceManager)
76 : {
77 0 : SetPlaceholderText(SVX_RESSTR(RID_SVXSTR_FINDBAR_FIND));
78 0 : EnableAutocomplete(sal_True, sal_True);
79 0 : }
80 :
81 0 : FindTextFieldControl::~FindTextFieldControl()
82 : {
83 0 : }
84 :
85 0 : void FindTextFieldControl::Remember_Impl(const String& rStr)
86 : {
87 0 : sal_uInt16 nCount = GetEntryCount();
88 :
89 0 : for (sal_uInt16 i=0; i<nCount; ++i)
90 : {
91 0 : if ( rStr == GetEntry(i))
92 0 : return;
93 : }
94 :
95 0 : if (nCount == REMEMBER_SIZE)
96 0 : RemoveEntry(REMEMBER_SIZE-1);
97 :
98 0 : InsertEntry(rStr, 0);
99 : }
100 :
101 0 : void FindTextFieldControl::SetTextToSelected_Impl()
102 : {
103 0 : OUString aString;
104 :
105 : try
106 : {
107 0 : css::uno::Reference<css::frame::XController> xController(m_xFrame->getController(), css::uno::UNO_QUERY_THROW);
108 0 : css::uno::Reference<css::frame::XModel> xModel(xController->getModel(), css::uno::UNO_QUERY_THROW);
109 0 : css::uno::Reference<css::container::XIndexAccess> xIndexAccess(xModel->getCurrentSelection(), css::uno::UNO_QUERY_THROW);
110 0 : if (xIndexAccess->getCount() > 0)
111 : {
112 0 : css::uno::Reference<css::text::XTextRange> xTextRange(xIndexAccess->getByIndex(0), css::uno::UNO_QUERY_THROW);
113 0 : aString = xTextRange->getString();
114 0 : }
115 : }
116 0 : catch ( ... )
117 : {
118 : }
119 :
120 0 : if ( aString.getLength() != 0 )
121 : {
122 0 : SetText( aString );
123 0 : GetModifyHdl().Call(this); // FIXME why SetText doesn't trigger this?
124 0 : }
125 0 : }
126 :
127 0 : long FindTextFieldControl::PreNotify( NotifyEvent& rNEvt )
128 : {
129 0 : long nRet= ComboBox::PreNotify( rNEvt );
130 :
131 0 : switch ( rNEvt.GetType() )
132 : {
133 : case EVENT_KEYINPUT:
134 : {
135 0 : const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
136 0 : sal_Bool bShift = pKeyEvent->GetKeyCode().IsShift();
137 0 : sal_Bool bMod1 = pKeyEvent->GetKeyCode().IsMod1();
138 0 : sal_uInt16 nCode = pKeyEvent->GetKeyCode().GetCode();
139 :
140 0 : if ( KEY_ESCAPE == nCode )
141 : {
142 0 : nRet = 1;
143 0 : GrabFocusToDocument();
144 :
145 : // hide the findbar
146 0 : css::uno::Reference< css::beans::XPropertySet > xPropSet(m_xFrame, css::uno::UNO_QUERY);
147 0 : if (xPropSet.is())
148 : {
149 0 : css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
150 0 : css::uno::Any aValue = xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ) ) );
151 0 : aValue >>= xLayoutManager;
152 0 : if (xLayoutManager.is())
153 : {
154 0 : const ::rtl::OUString sResourceURL( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/findbar" ) );
155 0 : xLayoutManager->hideElement( sResourceURL );
156 0 : xLayoutManager->destroyElement( sResourceURL );
157 0 : }
158 0 : }
159 : }
160 :
161 0 : if ( KEY_RETURN == nCode || (bMod1 && (KEY_G == nCode)) || (KEY_F3 == nCode) )
162 : {
163 0 : Remember_Impl(GetText());
164 :
165 0 : ::rtl::OUString sFindText = GetText();
166 0 : css::uno::Sequence< css::beans::PropertyValue > lArgs(3);
167 :
168 0 : lArgs[0].Name = rtl::OUString(SEARCHITEM_SEARCHSTRING);
169 0 : lArgs[0].Value <<= sFindText;
170 :
171 0 : lArgs[1].Name = rtl::OUString(SEARCHITEM_SEARCHBACKWARD);
172 0 : if (bShift)
173 0 : lArgs[1].Value <<= sal_True;
174 : else
175 0 : lArgs[1].Value <<= sal_False;
176 :
177 0 : lArgs[2].Name = rtl::OUString(SEARCHITEM_SEARCHFLAGS);
178 0 : lArgs[2].Value <<= (sal_Int32)0;
179 :
180 0 : impl_executeSearch(m_xServiceManager, m_xFrame, lArgs);
181 0 : nRet = 1;
182 : }
183 0 : break;
184 : }
185 :
186 : case EVENT_GETFOCUS:
187 0 : SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
188 0 : break;
189 : }
190 :
191 0 : return nRet;
192 : }
193 :
194 :
195 : //-----------------------------------------------------------------------------------------------------------
196 : // SearchToolbarControllersManager
197 :
198 0 : SearchToolbarControllersManager::SearchToolbarControllersManager()
199 : {
200 0 : }
201 :
202 0 : SearchToolbarControllersManager::~SearchToolbarControllersManager()
203 : {
204 0 : }
205 :
206 : namespace
207 : {
208 : class theSearchToolbarControllersManager
209 : : public rtl::Static<SearchToolbarControllersManager,
210 : theSearchToolbarControllersManager>
211 : {
212 : };
213 : }
214 :
215 0 : SearchToolbarControllersManager& SearchToolbarControllersManager::createControllersManager()
216 : {
217 0 : return theSearchToolbarControllersManager::get();
218 : }
219 :
220 0 : void SearchToolbarControllersManager::saveSearchHistory(const FindTextFieldControl* pFindTextFieldControl)
221 : {
222 0 : sal_uInt16 nECount( pFindTextFieldControl->GetEntryCount() );
223 0 : m_aSearchStrings.resize( nECount );
224 0 : for( sal_uInt16 i=0; i<nECount; ++i )
225 : {
226 0 : m_aSearchStrings[i] = pFindTextFieldControl->GetEntry(i);
227 : }
228 0 : }
229 :
230 0 : void SearchToolbarControllersManager::loadSearchHistory(FindTextFieldControl* pFindTextFieldControl)
231 : {
232 0 : for( sal_uInt16 i=0; i<m_aSearchStrings.size(); ++i )
233 : {
234 0 : pFindTextFieldControl->InsertEntry(m_aSearchStrings[i],i);
235 : }
236 0 : }
237 :
238 0 : void SearchToolbarControllersManager::registryController( const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Reference< css::frame::XStatusListener >& xStatusListener, const ::rtl::OUString& sCommandURL )
239 : {
240 0 : SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
241 0 : if (pIt == aSearchToolbarControllersMap.end())
242 : {
243 0 : SearchToolbarControllersVec lControllers(1);
244 0 : lControllers[0].Name = sCommandURL;
245 0 : lControllers[0].Value <<= xStatusListener;
246 0 : aSearchToolbarControllersMap.insert(SearchToolbarControllersMap::value_type(xFrame, lControllers));
247 : }
248 : else
249 : {
250 0 : sal_Int32 nSize = pIt->second.size();
251 0 : for (sal_Int32 i=0; i<nSize; ++i)
252 : {
253 0 : if (pIt->second[i].Name.equals(sCommandURL))
254 0 : return;
255 : }
256 :
257 0 : pIt->second.resize(nSize+1);
258 0 : pIt->second[nSize].Name = sCommandURL;
259 0 : pIt->second[nSize].Value <<= xStatusListener;
260 : }
261 : }
262 :
263 0 : void SearchToolbarControllersManager::freeController( const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Reference< css::frame::XStatusListener >& /*xStatusListener*/, const ::rtl::OUString& sCommandURL )
264 : {
265 0 : SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
266 0 : if (pIt != aSearchToolbarControllersMap.end())
267 : {
268 0 : for (SearchToolbarControllersVec::iterator pItCtrl=pIt->second.begin(); pItCtrl!=pIt->second.end(); ++pItCtrl)
269 : {
270 0 : if (pItCtrl->Name.equals(sCommandURL))
271 : {
272 0 : pIt->second.erase(pItCtrl);
273 0 : break;
274 : }
275 : }
276 :
277 0 : if (pIt->second.empty())
278 0 : aSearchToolbarControllersMap.erase(pIt);
279 : }
280 0 : }
281 :
282 0 : css::uno::Reference< css::frame::XStatusListener > SearchToolbarControllersManager::findController( const css::uno::Reference< css::frame::XFrame >& xFrame, const ::rtl::OUString& sCommandURL )
283 : {
284 0 : css::uno::Reference< css::frame::XStatusListener > xStatusListener;
285 :
286 0 : SearchToolbarControllersMap::iterator pIt = aSearchToolbarControllersMap.find(xFrame);
287 0 : if (pIt != aSearchToolbarControllersMap.end())
288 : {
289 0 : for (SearchToolbarControllersVec::iterator pItCtrl =pIt->second.begin(); pItCtrl != pIt->second.end(); ++pItCtrl)
290 : {
291 0 : if (pItCtrl->Name.equals(sCommandURL))
292 : {
293 0 : pItCtrl->Value >>= xStatusListener;
294 0 : break;
295 : }
296 : }
297 : }
298 :
299 0 : return xStatusListener;
300 : }
301 :
302 : //-----------------------------------------------------------------------------------------------------------
303 : // FindTextToolbarController
304 :
305 0 : FindTextToolbarController::FindTextToolbarController( const css::uno::Reference< css::lang::XMultiServiceFactory >& rServiceManager )
306 : :svt::ToolboxController( rServiceManager,
307 : css::uno::Reference< css::frame::XFrame >(),
308 0 : rtl::OUString(COMMAND_FINDTEXT) )
309 : {
310 0 : }
311 :
312 0 : FindTextToolbarController::~FindTextToolbarController()
313 : {
314 0 : }
315 :
316 : // XInterface
317 0 : css::uno::Any SAL_CALL FindTextToolbarController::queryInterface( const css::uno::Type& aType ) throw ( css::uno::RuntimeException )
318 : {
319 0 : css::uno::Any a = ToolboxController::queryInterface( aType );
320 0 : if ( a.hasValue() )
321 0 : return a;
322 :
323 0 : return ::cppu::queryInterface( aType, static_cast< css::lang::XServiceInfo* >( this ) );
324 : }
325 :
326 0 : void SAL_CALL FindTextToolbarController::acquire() throw ()
327 : {
328 0 : ToolboxController::acquire();
329 0 : }
330 :
331 0 : void SAL_CALL FindTextToolbarController::release() throw ()
332 : {
333 0 : ToolboxController::release();
334 0 : }
335 :
336 : // XServiceInfo
337 0 : ::rtl::OUString SAL_CALL FindTextToolbarController::getImplementationName() throw( css::uno::RuntimeException )
338 : {
339 0 : return getImplementationName_Static();
340 : }
341 :
342 0 : sal_Bool SAL_CALL FindTextToolbarController::supportsService( const ::rtl::OUString& ServiceName ) throw( css::uno::RuntimeException )
343 : {
344 0 : const css::uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() );
345 0 : const ::rtl::OUString * pArray = aSNL.getConstArray();
346 :
347 0 : for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
348 0 : if( pArray[i] == ServiceName )
349 0 : return true;
350 :
351 0 : return false;
352 : }
353 :
354 0 : css::uno::Sequence< ::rtl::OUString > SAL_CALL FindTextToolbarController::getSupportedServiceNames() throw( css::uno::RuntimeException )
355 : {
356 0 : return getSupportedServiceNames_Static();
357 : }
358 :
359 0 : css::uno::Sequence< ::rtl::OUString > FindTextToolbarController::getSupportedServiceNames_Static() throw()
360 : {
361 0 : css::uno::Sequence< ::rtl::OUString > aSNS( 1 );
362 0 : aSNS.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ) );
363 0 : return aSNS;
364 : }
365 :
366 : // XComponent
367 0 : void SAL_CALL FindTextToolbarController::dispose() throw ( css::uno::RuntimeException )
368 : {
369 0 : SolarMutexGuard aSolarMutexGuard;
370 :
371 0 : SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
372 :
373 0 : svt::ToolboxController::dispose();
374 0 : SearchToolbarControllersManager::createControllersManager().saveSearchHistory(m_pFindTextFieldControl);
375 0 : delete m_pFindTextFieldControl;
376 0 : m_pFindTextFieldControl = 0;
377 0 : }
378 :
379 : // XInitialization
380 0 : void SAL_CALL FindTextToolbarController::initialize( const css::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException)
381 : {
382 0 : svt::ToolboxController::initialize(aArguments);
383 :
384 0 : Window* pWindow = VCLUnoHelper::GetWindow( getParent() );
385 0 : ToolBox* pToolBox = (ToolBox*)pWindow;
386 0 : if ( pToolBox )
387 : {
388 0 : sal_uInt16 nItemCount = pToolBox->GetItemCount();
389 0 : for ( sal_uInt16 i=0; i<nItemCount; ++i )
390 : {
391 0 : ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i);
392 0 : if ( sItemCommand == COMMAND_DOWNSEARCH )
393 : {
394 0 : pToolBox->EnableItem(i, sal_False);
395 0 : m_nDownSearchId = i;
396 : }
397 0 : else if ( sItemCommand == COMMAND_UPSEARCH )
398 : {
399 0 : pToolBox->EnableItem(i, sal_False);
400 0 : m_nUpSearchId = i;
401 : }
402 0 : }
403 : }
404 :
405 0 : SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
406 0 : }
407 :
408 : // XToolbarController
409 0 : void SAL_CALL FindTextToolbarController::execute( sal_Int16 /*KeyModifier*/ ) throw ( css::uno::RuntimeException )
410 : {
411 0 : }
412 :
413 0 : css::uno::Reference< css::awt::XWindow > SAL_CALL FindTextToolbarController::createItemWindow( const css::uno::Reference< css::awt::XWindow >& Parent ) throw ( css::uno::RuntimeException )
414 : {
415 0 : css::uno::Reference< css::awt::XWindow > xItemWindow;
416 :
417 0 : css::uno::Reference< css::awt::XWindow > xParent( Parent );
418 0 : Window* pParent = VCLUnoHelper::GetWindow( xParent );
419 0 : if ( pParent )
420 : {
421 0 : ToolBox* pToolbar = ( ToolBox* )pParent;
422 0 : m_pFindTextFieldControl = new FindTextFieldControl( pToolbar, WinBits( WB_DROPDOWN | WB_VSCROLL), m_xFrame, m_xServiceManager );
423 :
424 0 : Size aSize(250, m_pFindTextFieldControl->GetTextHeight() + 200);
425 0 : m_pFindTextFieldControl->SetSizePixel( aSize );
426 0 : m_pFindTextFieldControl->SetModifyHdl(LINK(this, FindTextToolbarController, EditModifyHdl));
427 0 : SearchToolbarControllersManager::createControllersManager().loadSearchHistory(m_pFindTextFieldControl);
428 : }
429 0 : xItemWindow = VCLUnoHelper::GetInterface( m_pFindTextFieldControl );
430 :
431 0 : return xItemWindow;
432 : }
433 :
434 : // XStatusListener
435 0 : void SAL_CALL FindTextToolbarController::statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException )
436 : {
437 0 : SolarMutexGuard aSolarMutexGuard;
438 0 : if ( m_bDisposed )
439 0 : return;
440 :
441 0 : ::rtl::OUString aFeatureURL = rEvent.FeatureURL.Complete;
442 0 : if ( aFeatureURL == "AppendSearchHistory" )
443 : {
444 0 : m_pFindTextFieldControl->Remember_Impl(m_pFindTextFieldControl->GetText());
445 0 : }
446 : }
447 :
448 0 : IMPL_LINK_NOARG(FindTextToolbarController, EditModifyHdl)
449 : {
450 : // enable or disable item DownSearch/UpSearch of findbar
451 0 : Window* pWindow = VCLUnoHelper::GetWindow( getParent() );
452 0 : ToolBox* pToolBox = (ToolBox*)pWindow;
453 0 : if ( pToolBox && m_pFindTextFieldControl )
454 : {
455 0 : if (m_pFindTextFieldControl->GetText().Len()>0)
456 : {
457 0 : if ( !pToolBox->IsItemEnabled(m_nDownSearchId) )
458 0 : pToolBox->EnableItem(m_nDownSearchId, sal_True);
459 0 : if ( !pToolBox->IsItemEnabled(m_nUpSearchId) )
460 0 : pToolBox->EnableItem(m_nUpSearchId, sal_True);
461 : }
462 : else
463 : {
464 0 : if ( pToolBox->IsItemEnabled(m_nDownSearchId) )
465 0 : pToolBox->EnableItem(m_nDownSearchId, sal_False);
466 0 : if ( pToolBox->IsItemEnabled(m_nUpSearchId) )
467 0 : pToolBox->EnableItem(m_nUpSearchId, sal_False);
468 : }
469 : }
470 :
471 0 : return 0;
472 : }
473 :
474 : //-----------------------------------------------------------------------------------------------------------
475 : // class UpDownSearchToolboxController
476 :
477 0 : UpDownSearchToolboxController::UpDownSearchToolboxController( const css::uno::Reference< css::lang::XMultiServiceFactory > & rServiceManager, Type eType )
478 : : svt::ToolboxController( rServiceManager,
479 : css::uno::Reference< css::frame::XFrame >(),
480 : (eType == UP) ? rtl::OUString( COMMAND_UPSEARCH ): rtl::OUString( COMMAND_DOWNSEARCH ) ),
481 0 : meType( eType )
482 : {
483 0 : }
484 :
485 0 : UpDownSearchToolboxController::~UpDownSearchToolboxController()
486 : {
487 0 : }
488 :
489 : // XInterface
490 0 : css::uno::Any SAL_CALL UpDownSearchToolboxController::queryInterface( const css::uno::Type& aType ) throw ( css::uno::RuntimeException )
491 : {
492 0 : css::uno::Any a = ToolboxController::queryInterface( aType );
493 0 : if ( a.hasValue() )
494 0 : return a;
495 :
496 0 : return ::cppu::queryInterface( aType, static_cast< css::lang::XServiceInfo* >( this ) );
497 : }
498 :
499 0 : void SAL_CALL UpDownSearchToolboxController::acquire() throw ()
500 : {
501 0 : ToolboxController::acquire();
502 0 : }
503 :
504 0 : void SAL_CALL UpDownSearchToolboxController::release() throw ()
505 : {
506 0 : ToolboxController::release();
507 0 : }
508 :
509 : // XServiceInfo
510 0 : ::rtl::OUString SAL_CALL UpDownSearchToolboxController::getImplementationName() throw( css::uno::RuntimeException )
511 : {
512 0 : return getImplementationName_Static( meType );
513 : }
514 :
515 0 : sal_Bool SAL_CALL UpDownSearchToolboxController::supportsService( const ::rtl::OUString& ServiceName ) throw( css::uno::RuntimeException )
516 : {
517 0 : const css::uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() );
518 0 : const ::rtl::OUString * pArray = aSNL.getConstArray();
519 :
520 0 : for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
521 0 : if( pArray[i] == ServiceName )
522 0 : return true;
523 :
524 0 : return false;
525 : }
526 :
527 0 : css::uno::Sequence< ::rtl::OUString > SAL_CALL UpDownSearchToolboxController::getSupportedServiceNames() throw( css::uno::RuntimeException )
528 : {
529 0 : return getSupportedServiceNames_Static();
530 : }
531 :
532 0 : css::uno::Sequence< ::rtl::OUString > UpDownSearchToolboxController::getSupportedServiceNames_Static() throw()
533 : {
534 0 : css::uno::Sequence< ::rtl::OUString > aSNS( 1 );
535 0 : aSNS.getArray()[0] = ::rtl::OUString("com.sun.star.frame.ToolbarController");
536 0 : return aSNS;
537 : }
538 :
539 : // XComponent
540 0 : void SAL_CALL UpDownSearchToolboxController::dispose() throw ( css::uno::RuntimeException )
541 : {
542 0 : SolarMutexGuard aSolarMutexGuard;
543 :
544 0 : SearchToolbarControllersManager::createControllersManager().freeController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
545 :
546 0 : svt::ToolboxController::dispose();
547 0 : }
548 :
549 : // XInitialization
550 0 : void SAL_CALL UpDownSearchToolboxController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException )
551 : {
552 0 : svt::ToolboxController::initialize( aArguments );
553 0 : SearchToolbarControllersManager::createControllersManager().registryController(m_xFrame, css::uno::Reference< css::frame::XStatusListener >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY), m_aCommandURL);
554 0 : }
555 :
556 : // XToolbarController
557 0 : void SAL_CALL UpDownSearchToolboxController::execute( sal_Int16 /*KeyModifier*/ ) throw ( css::uno::RuntimeException )
558 : {
559 0 : if ( m_bDisposed )
560 0 : throw css::lang::DisposedException();
561 :
562 0 : ::rtl::OUString sFindText;
563 0 : Window* pWindow = VCLUnoHelper::GetWindow( getParent() );
564 0 : ToolBox* pToolBox = (ToolBox*)pWindow;
565 0 : if ( pToolBox )
566 : {
567 0 : sal_uInt16 nItemCount = pToolBox->GetItemCount();
568 0 : for ( sal_uInt16 i=0; i<nItemCount; ++i )
569 : {
570 0 : ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i);
571 0 : if ( sItemCommand == COMMAND_FINDTEXT )
572 : {
573 0 : Window* pItemWin = pToolBox->GetItemWindow(i);
574 0 : if (pItemWin)
575 0 : sFindText = pItemWin->GetText();
576 : break;
577 : }
578 0 : }
579 : }
580 :
581 0 : css::uno::Sequence< css::beans::PropertyValue > lArgs(3);
582 0 : lArgs[0].Name = rtl::OUString(SEARCHITEM_SEARCHSTRING);
583 0 : lArgs[0].Value <<= sFindText;
584 0 : lArgs[1].Name = rtl::OUString(SEARCHITEM_SEARCHBACKWARD);
585 0 : lArgs[1].Value <<= sal_Bool( meType == UP );
586 0 : lArgs[2].Name = rtl::OUString(SEARCHITEM_SEARCHFLAGS);
587 0 : lArgs[2].Value <<= (sal_Int32)0;
588 :
589 0 : impl_executeSearch(m_xServiceManager, m_xFrame, lArgs);
590 :
591 0 : css::frame::FeatureStateEvent aEvent;
592 0 : aEvent.FeatureURL.Complete = rtl::OUString(COMMAND_APPENDSEARCHHISTORY);
593 0 : css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager().findController(m_xFrame, COMMAND_FINDTEXT);
594 0 : if (xStatusListener.is())
595 0 : xStatusListener->statusChanged( aEvent );
596 0 : }
597 :
598 : // XStatusListener
599 0 : void SAL_CALL UpDownSearchToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ ) throw ( css::uno::RuntimeException )
600 : {
601 0 : SolarMutexGuard aSolarMutexGuard;
602 0 : if ( m_bDisposed )
603 0 : return;
604 : }
605 :
606 : //-----------------------------------------------------------------------------------------------------------
607 : // class FindbarDispatcher
608 :
609 0 : FindbarDispatcher::FindbarDispatcher(const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory)
610 0 : : m_xFactory( xFactory )
611 : {
612 0 : }
613 :
614 0 : FindbarDispatcher::~FindbarDispatcher()
615 : {
616 0 : m_xFactory = NULL;
617 0 : m_xFrame = NULL;
618 0 : }
619 :
620 : // XInterface
621 0 : css::uno::Any SAL_CALL FindbarDispatcher::queryInterface( const css::uno::Type& aType ) throw( css::uno::RuntimeException )
622 : {
623 : css::uno::Any aReturn( ::cppu::queryInterface( aType,
624 : static_cast< css::lang::XServiceInfo* >(this),
625 : static_cast< css::lang::XInitialization* >(this),
626 : static_cast< css::frame::XDispatchProvider* >(this),
627 0 : static_cast< css::frame::XDispatch* >(this)) );
628 :
629 0 : if ( aReturn.hasValue() )
630 0 : return aReturn;
631 :
632 0 : return OWeakObject::queryInterface( aType );
633 : }
634 :
635 0 : void SAL_CALL FindbarDispatcher::acquire() throw()
636 : {
637 0 : OWeakObject::acquire();
638 0 : }
639 :
640 0 : void SAL_CALL FindbarDispatcher::release() throw()
641 : {
642 0 : OWeakObject::release();
643 0 : }
644 :
645 : // XServiceInfo
646 0 : ::rtl::OUString SAL_CALL FindbarDispatcher::getImplementationName() throw( css::uno::RuntimeException )
647 : {
648 0 : return getImplementationName_Static();
649 : }
650 :
651 0 : sal_Bool SAL_CALL FindbarDispatcher::supportsService( const ::rtl::OUString& ServiceName ) throw( css::uno::RuntimeException )
652 : {
653 : return (
654 0 : ServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.comp.svx.FindbarDispatcher")) ||
655 0 : ServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.frame.ProtocolHandler"))
656 0 : );
657 : }
658 :
659 0 : css::uno::Sequence< ::rtl::OUString > SAL_CALL FindbarDispatcher::getSupportedServiceNames() throw( css::uno::RuntimeException )
660 : {
661 0 : return getSupportedServiceNames_Static();
662 : }
663 :
664 0 : css::uno::Sequence< ::rtl::OUString > FindbarDispatcher::getSupportedServiceNames_Static() throw()
665 : {
666 0 : css::uno::Sequence< ::rtl::OUString > aSNS( 2 );
667 0 : aSNS.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.FindbarDispatcher" ));
668 0 : aSNS.getArray()[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ProtocolHandler" ));
669 0 : return aSNS;
670 : }
671 :
672 : // XInitialization
673 0 : void SAL_CALL FindbarDispatcher::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException )
674 : {
675 0 : if ( aArguments.getLength() )
676 0 : aArguments[0] >>= m_xFrame;
677 0 : }
678 :
679 : // XDispatchProvider
680 0 : 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 )
681 : {
682 0 : css::uno::Reference< css::frame::XDispatch > xDispatch;
683 :
684 0 : if ( aURL.Protocol == "vnd.sun.star.findbar:" )
685 0 : xDispatch = this;
686 :
687 0 : return xDispatch;
688 : }
689 :
690 0 : 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 )
691 : {
692 0 : sal_Int32 nCount = seqDescripts.getLength();
693 0 : css::uno::Sequence < css::uno::Reference < XDispatch > > lDispatcher( nCount );
694 :
695 0 : for( sal_Int32 i=0; i<nCount; ++i )
696 0 : lDispatcher[i] = queryDispatch( seqDescripts[i].FeatureURL, seqDescripts[i].FrameName, seqDescripts[i].SearchFlags );
697 :
698 0 : return lDispatcher;
699 : }
700 :
701 : // XDispatch
702 0 : void SAL_CALL FindbarDispatcher::dispatch( const css::util::URL& aURL, const css::uno::Sequence < css::beans::PropertyValue >& /*lArgs*/ ) throw( css::uno::RuntimeException )
703 : {
704 : //vnd.sun.star.findbar:FocusToFindbar - set cursor to the FindTextFieldControl of the findbar
705 0 : if ( aURL.Path == "FocusToFindbar" )
706 : {
707 0 : css::uno::Reference< css::beans::XPropertySet > xPropSet(m_xFrame, css::uno::UNO_QUERY);
708 0 : if(!xPropSet.is())
709 : return;
710 :
711 0 : css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
712 0 : css::uno::Any aValue = xPropSet->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )) );
713 0 : aValue >>= xLayoutManager;
714 0 : if (!xLayoutManager.is())
715 : return;
716 :
717 0 : const ::rtl::OUString sResourceURL( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/findbar" ) );
718 0 : css::uno::Reference< css::ui::XUIElement > xUIElement = xLayoutManager->getElement(sResourceURL);
719 0 : if (!xUIElement.is())
720 : {
721 : // show the findbar if necessary
722 0 : xLayoutManager->createElement( sResourceURL );
723 0 : xLayoutManager->showElement( sResourceURL );
724 0 : xUIElement = xLayoutManager->getElement( sResourceURL );
725 0 : if ( !xUIElement.is() )
726 : return;
727 : }
728 :
729 0 : css::uno::Reference< css::awt::XWindow > xWindow(xUIElement->getRealInterface(), css::uno::UNO_QUERY);
730 0 : Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
731 0 : ToolBox* pToolBox = (ToolBox*)pWindow;
732 0 : if ( pToolBox )
733 : {
734 0 : sal_uInt16 nItemCount = pToolBox->GetItemCount();
735 0 : for ( sal_uInt16 i=0; i<nItemCount; ++i )
736 : {
737 0 : ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i);
738 0 : if ( sItemCommand == COMMAND_FINDTEXT )
739 : {
740 0 : Window* pItemWin = pToolBox->GetItemWindow( i );
741 0 : if ( pItemWin )
742 : {
743 0 : FindTextFieldControl* pFindTextFieldControl = dynamic_cast<FindTextFieldControl*>(pItemWin);
744 0 : if ( pFindTextFieldControl )
745 0 : pFindTextFieldControl->SetTextToSelected_Impl();
746 0 : pItemWin->GrabFocus();
747 : return;
748 : }
749 : }
750 0 : }
751 0 : }
752 :
753 : }
754 : }
755 :
756 0 : void SAL_CALL FindbarDispatcher::addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xControl*/, const css::util::URL& /*aURL*/ ) throw ( css::uno::RuntimeException )
757 : {
758 0 : }
759 :
760 0 : void SAL_CALL FindbarDispatcher::removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xControl*/, const css::util::URL& /*aURL*/ ) throw ( css::uno::RuntimeException )
761 : {
762 0 : }
763 :
764 : //-----------------------------------------------------------------------------------------------------------
765 : // create Instance
766 :
767 0 : css::uno::Reference< css::uno::XInterface > SAL_CALL FindTextToolbarController_createInstance(
768 : const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
769 : {
770 0 : return *new FindTextToolbarController( rSMgr );
771 : }
772 :
773 0 : css::uno::Reference< css::uno::XInterface > SAL_CALL DownSearchToolboxController_createInstance(
774 : const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
775 : {
776 0 : return *new UpDownSearchToolboxController( rSMgr, UpDownSearchToolboxController::DOWN );
777 : }
778 :
779 0 : css::uno::Reference< css::uno::XInterface > SAL_CALL UpSearchToolboxController_createInstance(
780 : const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
781 : {
782 0 : return *new UpDownSearchToolboxController( rSMgr, UpDownSearchToolboxController::UP );
783 : }
784 :
785 0 : css::uno::Reference< css::uno::XInterface > SAL_CALL FindbarDispatcher_createInstance(
786 : const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr )
787 : {
788 0 : return *new FindbarDispatcher( rSMgr );
789 : }
790 :
791 : //-----------------------------------------------------------------------------------------------------------
792 : }
793 :
794 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|