LCOV - code coverage report
Current view: top level - libreoffice/svx/source/tbxctrls - tbunosearchcontrollers.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 385 0.0 %
Date: 2012-12-27 Functions: 0 66 0.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10