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 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 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 86 FindTextFieldControl::~FindTextFieldControl() 87 { 88 } 89 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 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 114 void FindTextFieldControl::Modify() 115 { 116 ComboBox::Modify(); 117 118 SetControlForeground( GetSettings().GetStyleSettings().GetWindowTextColor() ); 119 } 120 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 191 SearchToolbarControllersManager::SearchToolbarControllersManager() 192 { 193 } 194 195 SearchToolbarControllersManager::~SearchToolbarControllersManager() 196 { 197 } 198 199 SearchToolbarControllersManager* SearchToolbarControllersManager::createControllersManager() 200 { 201 if (!m_pInstance) 202 m_pInstance = new SearchToolbarControllersManager(); 203 204 return m_pInstance; 205 } 206 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 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 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 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 281 FindTextToolbarController::~FindTextToolbarController() 282 { 283 } 284 285 // XInterface 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 295 void SAL_CALL FindTextToolbarController::acquire() throw () 296 { 297 ToolboxController::acquire(); 298 } 299 300 void SAL_CALL FindTextToolbarController::release() throw () 301 { 302 ToolboxController::release(); 303 } 304 305 // XServiceInfo 306 ::rtl::OUString SAL_CALL FindTextToolbarController::getImplementationName() throw( css::uno::RuntimeException ) 307 { 308 return getImplementationName_Static(); 309 } 310 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 323 css::uno::Sequence< ::rtl::OUString > SAL_CALL FindTextToolbarController::getSupportedServiceNames() throw( css::uno::RuntimeException ) 324 { 325 return getSupportedServiceNames_Static(); 326 } 327 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 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 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 377 void SAL_CALL FindTextToolbarController::execute( sal_Int16 /*KeyModifier*/ ) throw ( css::uno::RuntimeException ) 378 { 379 } 380 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 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 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 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 451 DownSearchToolboxController::~DownSearchToolboxController() 452 { 453 } 454 455 // XInterface 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 465 void SAL_CALL DownSearchToolboxController::acquire() throw () 466 { 467 ToolboxController::acquire(); 468 } 469 470 void SAL_CALL DownSearchToolboxController::release() throw () 471 { 472 ToolboxController::release(); 473 } 474 475 // XServiceInfo 476 ::rtl::OUString SAL_CALL DownSearchToolboxController::getImplementationName() throw( css::uno::RuntimeException ) 477 { 478 return getImplementationName_Static(); 479 } 480 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 493 css::uno::Sequence< ::rtl::OUString > SAL_CALL DownSearchToolboxController::getSupportedServiceNames() throw( css::uno::RuntimeException ) 494 { 495 return getSupportedServiceNames_Static(); 496 } 497 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 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 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 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 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 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 580 UpSearchToolboxController::~UpSearchToolboxController() 581 { 582 } 583 584 // XInterface 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 594 void SAL_CALL UpSearchToolboxController::acquire() throw () 595 { 596 ToolboxController::acquire(); 597 } 598 599 void SAL_CALL UpSearchToolboxController::release() throw () 600 { 601 ToolboxController::release(); 602 } 603 604 // XServiceInfo 605 ::rtl::OUString SAL_CALL UpSearchToolboxController::getImplementationName() throw( css::uno::RuntimeException ) 606 { 607 return getImplementationName_Static(); 608 } 609 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 622 css::uno::Sequence< ::rtl::OUString > SAL_CALL UpSearchToolboxController::getSupportedServiceNames() throw( css::uno::RuntimeException ) 623 { 624 return getSupportedServiceNames_Static(); 625 } 626 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 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 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 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 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 702 FindbarDispatcher::FindbarDispatcher(const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory) 703 : m_xFactory( xFactory ) 704 { 705 } 706 707 FindbarDispatcher::~FindbarDispatcher() 708 { 709 m_xFactory = NULL; 710 m_xFrame = NULL; 711 } 712 713 // XInterface 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 728 void SAL_CALL FindbarDispatcher::acquire() throw() 729 { 730 OWeakObject::acquire(); 731 } 732 733 void SAL_CALL FindbarDispatcher::release() throw() 734 { 735 OWeakObject::release(); 736 } 737 738 // XServiceInfo 739 ::rtl::OUString SAL_CALL FindbarDispatcher::getImplementationName() throw( css::uno::RuntimeException ) 740 { 741 return getImplementationName_Static(); 742 } 743 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 752 css::uno::Sequence< ::rtl::OUString > SAL_CALL FindbarDispatcher::getSupportedServiceNames() throw( css::uno::RuntimeException ) 753 { 754 return getSupportedServiceNames_Static(); 755 } 756 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 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 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 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 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 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 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 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 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 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 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