diff options
author | Wu Yan <wuy@openoffice.org> | 2010-05-26 16:38:12 +0800 |
---|---|---|
committer | Wu Yan <wuy@openoffice.org> | 2010-05-26 16:38:12 +0800 |
commit | 3b7fbe601de8cf26b7765d4b920a861d571f1e16 (patch) | |
tree | 205860f5270fe44e4a7cc036f4a4c931b285580d /svx | |
parent | 11586ca1f1cf6bb472b70fb9d3171bc451d6a3a1 (diff) |
findbar01: #111826#, #111827# and make some optimizations for the code
Diffstat (limited to 'svx')
-rw-r--r-- | svx/inc/tbunosearchcontrollers.hxx | 42 | ||||
-rw-r--r-- | svx/source/tbxctrls/tbunosearchcontrollers.cxx | 359 |
2 files changed, 124 insertions, 277 deletions
diff --git a/svx/inc/tbunosearchcontrollers.hxx b/svx/inc/tbunosearchcontrollers.hxx index 3b52852c61fd..aec07042e1fc 100644 --- a/svx/inc/tbunosearchcontrollers.hxx +++ b/svx/inc/tbunosearchcontrollers.hxx @@ -41,6 +41,7 @@ #include <cppuhelper/implbase1.hxx> #include <cppuhelper/weak.hxx> #include <svtools/toolboxcontroller.hxx> +#include <vcl/combobox.hxx> #include <vcl/window.hxx> #include <map> @@ -49,13 +50,26 @@ namespace css = ::com::sun::star ; namespace svx { -class FindTextFieldControl; - -struct ExecuteInfo +class FindTextFieldControl : public ComboBox { - css::uno::Reference< css::frame::XDispatch > xDispatch; - css::util::URL aTargetURL; - css::uno::Sequence< css::beans::PropertyValue > aArgs; +public: + FindTextFieldControl( Window* pParent, WinBits nStyle, + css::uno::Reference< css::frame::XFrame >& xFrame, + css::uno::Reference< css::lang::XMultiServiceFactory >& xServiceManager ); + virtual ~FindTextFieldControl(); + + virtual void Modify(); + virtual long PreNotify( NotifyEvent& rNEvt ); + + void InitControls_Impl(); + void Remember_Impl(const String& rStr); + +private: + + css::uno::Reference< css::frame::XFrame > m_xFrame; + css::uno::Reference< css::lang::XMultiServiceFactory > m_xServiceManager; + sal_Bool m_bToClearTextField; + }; class SearchToolbarControllersManager @@ -119,14 +133,10 @@ public: // XStatusListener virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) throw ( css::uno::RuntimeException ); - sal_Int32 getFontSizePixel( const Window* pWindow ); - - DECL_STATIC_LINK( FindTextToolbarController, ExecuteHdl_Impl, ExecuteInfo* ); DECL_LINK(EditModifyHdl, void*); private: - css::uno::Reference< css::util::XURLTransformer > m_xURLTransformer; FindTextFieldControl* m_pFindTextFieldControl; USHORT m_nDownSearchId; // item position of findbar @@ -171,12 +181,6 @@ public: // XStatusListener virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException ); - DECL_STATIC_LINK( DownSearchToolboxController, ExecuteHdl_Impl, ExecuteInfo* ); - -private : - - css::uno::Reference< css::util::XURLTransformer > m_xURLTransformer; - }; class UpSearchToolboxController : public svt::ToolboxController, @@ -216,12 +220,6 @@ public: // XStatusListener virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& rEvent ) throw ( css::uno::RuntimeException ); - DECL_STATIC_LINK( UpSearchToolboxController, ExecuteHdl_Impl, ExecuteInfo* ); - -private : - - css::uno::Reference< css::util::XURLTransformer > m_xURLTransformer; - }; // protocol handler for "vnd.sun.star.findbar:*" URLs diff --git a/svx/source/tbxctrls/tbunosearchcontrollers.cxx b/svx/source/tbxctrls/tbunosearchcontrollers.cxx index 487c6f2359ef..2399f4d2c27d 100644 --- a/svx/source/tbxctrls/tbunosearchcontrollers.cxx +++ b/svx/source/tbxctrls/tbunosearchcontrollers.cxx @@ -36,7 +36,6 @@ #include <com/sun/star/util/URL.hpp> #include <toolkit/helper/vclunohelper.hxx> -#include <vcl/combobox.hxx> #include <vcl/toolbox.hxx> #include <vcl/svapp.hxx> #include <vos/mutex.hxx> @@ -47,35 +46,33 @@ namespace svx static const ::rtl::OUString SEARCHITEM_SEARCHSTRING = ::rtl::OUString::createFromAscii("SearchItem.SearchString"); static const ::rtl::OUString SEARCHITEM_SEARCHBACKWARD = ::rtl::OUString::createFromAscii("SearchItem.Backward"); +static const ::rtl::OUString COMMAND_EXECUTESEARCH = ::rtl::OUString::createFromAscii(".uno:ExecuteSearch"); static const ::rtl::OUString COMMAND_FINDTEXT = ::rtl::OUString::createFromAscii(".uno:FindText") ; static const ::rtl::OUString COMMAND_DOWNSEARCH = ::rtl::OUString::createFromAscii(".uno:DownSearch"); static const ::rtl::OUString COMMAND_UPSEARCH = ::rtl::OUString::createFromAscii(".uno:UpSearch") ; +static const ::rtl::OUString COMMAND_APPENDSEARCHHISTORY = ::rtl::OUString::createFromAscii("AppendSearchHistory"); -static const ::rtl::OUString COMMAND_APPENDSEARCHHISTORY = ::rtl::OUString::createFromAscii("AppendSearchHistory") ; +static const ::rtl::OUString SERVICENAME_URLTRANSFORMER = ::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer"); +static const sal_Int32 REMEMBER_SIZE = 10; -class FindTextFieldControl : public ComboBox +void impl_executeSearch( const css::uno::Reference< css::lang::XMultiServiceFactory >& rSMgr, css::uno::Reference< css::frame::XFrame >& xFrame, css::uno::Sequence< css::beans::PropertyValue >& lArgs ) { -public: - FindTextFieldControl( Window* pParent, WinBits nStyle, - css::uno::Reference< css::frame::XFrame >& xFrame, - css::uno::Reference< css::lang::XMultiServiceFactory >& xServiceManager ); - virtual ~FindTextFieldControl(); - - virtual void Modify(); - virtual long PreNotify( NotifyEvent& rNEvt ); - - void InitControls_Impl(); - void Remember_Impl(const String& rStr); - -private: - - css::uno::Reference< css::frame::XFrame > m_xFrame; - css::uno::Reference < css::util::XURLTransformer > m_xURLTransformer; - css::uno::Reference< css::lang::XMultiServiceFactory > m_xServiceManager; - - sal_Bool m_bToClearTextField; + css::uno::Reference< css::util::XURLTransformer > xURLTransformer( rSMgr->createInstance(SERVICENAME_URLTRANSFORMER), css::uno::UNO_QUERY ); + if ( xURLTransformer.is() ) + { + css::util::URL aURL; + aURL.Complete = COMMAND_EXECUTESEARCH; + xURLTransformer->parseStrict(aURL); -}; + css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(xFrame, css::uno::UNO_QUERY); + if ( xDispatchProvider.is() ) + { + css::uno::Reference< css::frame::XDispatch > xDispatch = xDispatchProvider->queryDispatch( aURL, ::rtl::OUString(), 0 ); + if ( xDispatch.is() && aURL.Complete.getLength() > 0 ) + xDispatch->dispatch( aURL, lArgs ); + } + } +} FindTextFieldControl::FindTextFieldControl( Window* pParent, WinBits nStyle, css::uno::Reference< css::frame::XFrame >& xFrame, @@ -85,10 +82,6 @@ FindTextFieldControl::FindTextFieldControl( Window* pParent, WinBits nStyle, m_xServiceManager(xServiceManager), m_bToClearTextField(sal_True) { - m_xURLTransformer = css::uno::Reference< css::util::XURLTransformer >( m_xServiceManager->createInstance( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))), - css::uno::UNO_QUERY_THROW ); - InitControls_Impl(); } @@ -107,11 +100,16 @@ void FindTextFieldControl::InitControls_Impl() void FindTextFieldControl::Remember_Impl(const String& rStr) { USHORT nCount = GetEntryCount(); + for (USHORT i=0; i<nCount; ++i) { if ( rStr == GetEntry(i)) return; } + + if (nCount == REMEMBER_SIZE) + RemoveEntry(REMEMBER_SIZE-1); + InsertEntry(rStr, 0); } @@ -126,51 +124,36 @@ long FindTextFieldControl::PreNotify( NotifyEvent& rNEvt ) { long nRet= ComboBox::PreNotify( rNEvt ); - switch ( rNEvt.GetType()) + switch ( rNEvt.GetType() ) { case EVENT_KEYINPUT: { const KeyEvent* pKeyEvent = rNEvt.GetKeyEvent(); - sal_uInt16 nCode = pKeyEvent->GetKeyCode().GetCode(); sal_Bool bCtrl = pKeyEvent->GetKeyCode().IsMod1(); - if (bCtrl && KEY_G== nCode) + sal_Bool bAlt = pKeyEvent->GetKeyCode().IsMod2(); + sal_Bool bShift = pKeyEvent->GetKeyCode().IsShift(); + sal_uInt16 nCode = pKeyEvent->GetKeyCode().GetCode(); + + if ( bCtrl && bAlt && KEY_F == nCode ) GrabFocusToDocument(); - if (KEY_RETURN == nCode) + if ( KEY_RETURN == nCode ) { - vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); - Remember_Impl(GetText()); - css::uno::Reference< css::frame::XDispatch > xDispatch; - css::util::URL aTargetURL; + ::rtl::OUString sFindText = GetText(); + css::uno::Sequence< css::beans::PropertyValue > lArgs(2); - if ( m_xURLTransformer.is() ) - { - aTargetURL.Complete = ::rtl::OUString::createFromAscii(".uno:ExecuteSearch"); - m_xURLTransformer->parseStrict( aTargetURL ); + lArgs[0].Name = SEARCHITEM_SEARCHSTRING; + lArgs[0].Value <<= sFindText; - css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY); - if ( xDispatchProvider.is() ) - xDispatch = xDispatchProvider->queryDispatch( aTargetURL, rtl::OUString(), 0 ); - } + lArgs[1].Name = SEARCHITEM_SEARCHBACKWARD; + if (bShift) + lArgs[1].Value <<= sal_True; + else + lArgs[1].Value <<= sal_False; - if ( xDispatch.is() && aTargetURL.Complete.getLength() > 0 ) - { - ::rtl::OUString sFindText = GetText(); - css::uno::Sequence< css::beans::PropertyValue > aArgs( 2 ); - aArgs[0].Name = SEARCHITEM_SEARCHSTRING; - aArgs[0].Value <<= sFindText; - aArgs[1].Name = SEARCHITEM_SEARCHBACKWARD; - aArgs[1].Value <<= sal_False; - - // Execute dispatch asynchronously - ExecuteInfo* pExecuteInfo = new ExecuteInfo; - pExecuteInfo->xDispatch = xDispatch; - pExecuteInfo->aTargetURL = aTargetURL; - pExecuteInfo->aArgs = aArgs; - Application::PostUserEvent( STATIC_LINK(0, DownSearchToolboxController , ExecuteHdl_Impl), pExecuteInfo ); - } + impl_executeSearch(m_xServiceManager, m_xFrame, lArgs); } break; } @@ -181,6 +164,7 @@ long FindTextFieldControl::PreNotify( NotifyEvent& rNEvt ) SetText( String() ); m_bToClearTextField = sal_False; } + SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) ); break; case EVENT_LOSEFOCUS: @@ -188,7 +172,6 @@ long FindTextFieldControl::PreNotify( NotifyEvent& rNEvt ) { SetText( String( ::rtl::OUString::createFromAscii("Find") ) ); SetControlForeground(COL_GRAY); - m_bToClearTextField = sal_True; } break; @@ -242,7 +225,6 @@ void SearchToolbarControllersManager::registryController( const css::uno::Refere pIt->second[nSize].Name = sCommandURL; pIt->second[nSize].Value <<= xStatusListener; } - } void SearchToolbarControllersManager::freeController( const css::uno::Reference< css::frame::XFrame >& xFrame, const css::uno::Reference< css::frame::XStatusListener >& /*xStatusListener*/, const ::rtl::OUString& sCommandURL ) @@ -290,11 +272,8 @@ css::uno::Reference< css::frame::XStatusListener > SearchToolbarControllersManag FindTextToolbarController::FindTextToolbarController( const css::uno::Reference< css::lang::XMultiServiceFactory >& rServiceManager ) :svt::ToolboxController( rServiceManager, css::uno::Reference< css::frame::XFrame >(), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FindText" )) ) + COMMAND_FINDTEXT ) { - m_xURLTransformer = css::uno::Reference< css::util::XURLTransformer >( m_xServiceManager->createInstance( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))), - css::uno::UNO_QUERY_THROW ); } FindTextToolbarController::~FindTextToolbarController() @@ -402,13 +381,9 @@ css::uno::Reference< css::awt::XWindow > SAL_CALL FindTextToolbarController::cre ToolBox* pToolbar = ( ToolBox* )pParent; m_pFindTextFieldControl = new FindTextFieldControl( pToolbar, WinBits( WB_DROPDOWN | WB_VSCROLL), m_xFrame, m_xServiceManager ); - // Calculate height of the edit field according to the application font height - sal_Int32 nHeight = getFontSizePixel( m_pFindTextFieldControl ); - nHeight += 200; - m_pFindTextFieldControl->SetSizePixel( Size( 100, nHeight )); - + Size aSize(100, m_pFindTextFieldControl->GetTextHeight() + 200); + m_pFindTextFieldControl->SetSizePixel( aSize ); m_pFindTextFieldControl->SetModifyHdl(LINK(this, FindTextToolbarController, EditModifyHdl)); - } xItemWindow = VCLUnoHelper::GetInterface( m_pFindTextFieldControl ); @@ -429,38 +404,6 @@ void SAL_CALL FindTextToolbarController::statusChanged( const css::frame::Featur } } -sal_Int32 FindTextToolbarController::getFontSizePixel( const Window* pWindow ) -{ - const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); - const Font& rFont = rSettings.GetAppFont(); - - // Calculate height of the application font used by window - sal_Int32 nHeight = sal_Int32( rFont.GetHeight() ); - ::Size aPixelSize = pWindow->LogicToPixel( ::Size( 0, nHeight ), MAP_APPFONT ); - return aPixelSize.Height(); -} - -IMPL_STATIC_LINK_NOINSTANCE( FindTextToolbarController, ExecuteHdl_Impl, ExecuteInfo*, pExecuteInfo ) -{ - const sal_uInt32 nRef = Application::ReleaseSolarMutex(); - try - { - // Asynchronous execution as this can lead to our own destruction! - // Framework can recycle our current frame and the layout manager disposes all user interface - // elements if a component gets detached from its frame! - pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, pExecuteInfo->aArgs ); - } - catch ( css::uno::Exception& ) - { - - } - - Application::AcquireSolarMutex( nRef ); - delete pExecuteInfo; - - return 0; -} - IMPL_LINK( FindTextToolbarController, EditModifyHdl, void *, EMPTYARG ) { // enable or disable item DownSearch/UpSearch of findbar @@ -493,11 +436,8 @@ IMPL_LINK( FindTextToolbarController, EditModifyHdl, void *, EMPTYARG ) DownSearchToolboxController::DownSearchToolboxController(const css::uno::Reference< css::lang::XMultiServiceFactory >& rServiceManager ) : svt::ToolboxController( rServiceManager, css::uno::Reference< css::frame::XFrame >(), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DownSearch" )) ) + COMMAND_DOWNSEARCH ) { - m_xURLTransformer = css::uno::Reference< css::util::XURLTransformer >( m_xServiceManager->createInstance( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))), - css::uno::UNO_QUERY_THROW ); } DownSearchToolboxController::~DownSearchToolboxController() @@ -577,89 +517,46 @@ void SAL_CALL DownSearchToolboxController::execute( sal_Int16 /*KeyModifier*/ ) if ( m_bDisposed ) throw css::lang::DisposedException(); - vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); - - css::uno::Reference< css::frame::XDispatch > xDispatch; - css::util::URL aTargetURL; - - if ( m_xURLTransformer.is() ) - { - aTargetURL.Complete = ::rtl::OUString::createFromAscii(".uno:ExecuteSearch"); - m_xURLTransformer->parseStrict( aTargetURL ); - - css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY); - if ( xDispatchProvider.is() ) - xDispatch = xDispatchProvider->queryDispatch( aTargetURL, rtl::OUString(), 0 ); - } - - if ( xDispatch.is() && aTargetURL.Complete.getLength() > 0 ) + ::rtl::OUString sFindText; + Window* pWindow = VCLUnoHelper::GetWindow( getParent() ); + ToolBox* pToolBox = (ToolBox*)pWindow; + if ( pToolBox ) { - ::rtl::OUString sFindText; - Window* pWindow = VCLUnoHelper::GetWindow( getParent() ); - ToolBox* pToolBox = (ToolBox*)pWindow; - if ( pToolBox ) + USHORT nItemCount = pToolBox->GetItemCount(); + for ( USHORT i=0; i<nItemCount; ++i ) { - USHORT nItemCount = pToolBox->GetItemCount(); - for ( USHORT i=0; i<nItemCount; ++i ) + ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i); + if ( sItemCommand.equals( COMMAND_FINDTEXT ) ) { - ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i); - if ( sItemCommand.equals( COMMAND_FINDTEXT ) ) - { - Window* pItemWin = pToolBox->GetItemWindow(i); - if (pItemWin) - sFindText = pItemWin->GetText(); - break; - } + Window* pItemWin = pToolBox->GetItemWindow(i); + if (pItemWin) + sFindText = pItemWin->GetText(); + break; } } + } - css::uno::Sequence< css::beans::PropertyValue > aArgs( 2 ); - aArgs[0].Name = SEARCHITEM_SEARCHSTRING; - aArgs[0].Value <<= sFindText; - aArgs[1].Name = SEARCHITEM_SEARCHBACKWARD; - aArgs[1].Value <<= sal_False; - - // Execute dispatch asynchronously - ExecuteInfo* pExecuteInfo = new ExecuteInfo; - pExecuteInfo->xDispatch = xDispatch; - pExecuteInfo->aTargetURL = aTargetURL; - pExecuteInfo->aArgs = aArgs; - Application::PostUserEvent( STATIC_LINK(0, DownSearchToolboxController , ExecuteHdl_Impl), pExecuteInfo ); - - css::frame::FeatureStateEvent aEvent; - css::util::URL aCommand; - aCommand.Complete = COMMAND_APPENDSEARCHHISTORY; - aEvent.FeatureURL = aCommand; - aEvent.IsEnabled = sal_True; - - css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager()->findController(m_xFrame, COMMAND_FINDTEXT); + css::uno::Sequence< css::beans::PropertyValue > lArgs(2); + lArgs[0].Name = SEARCHITEM_SEARCHSTRING; + lArgs[0].Value <<= sFindText; + lArgs[1].Name = SEARCHITEM_SEARCHBACKWARD; + lArgs[1].Value <<= sal_False; + + impl_executeSearch(m_xServiceManager, m_xFrame, lArgs); + + css::frame::FeatureStateEvent aEvent; + aEvent.FeatureURL.Complete = COMMAND_APPENDSEARCHHISTORY; + css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager()->findController(m_xFrame, COMMAND_FINDTEXT); + if (xStatusListener.is()) xStatusListener->statusChanged( aEvent ); - } } // XStatusListener void SAL_CALL DownSearchToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ ) throw ( css::uno::RuntimeException ) { -} - -IMPL_STATIC_LINK_NOINSTANCE( DownSearchToolboxController, ExecuteHdl_Impl, ExecuteInfo*, pExecuteInfo ) -{ - const sal_uInt32 nRef = Application::ReleaseSolarMutex(); - try - { - // Asynchronous execution as this can lead to our own destruction! - // Framework can recycle our current frame and the layout manager disposes all user interface - // elements if a component gets detached from its frame! - pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, pExecuteInfo->aArgs ); - } - catch ( css::uno::Exception& ) - { - } - - Application::AcquireSolarMutex( nRef ); - delete pExecuteInfo; - - return 0; + vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + if ( m_bDisposed ) + return; } //----------------------------------------------------------------------------------------------------------- @@ -668,11 +565,8 @@ IMPL_STATIC_LINK_NOINSTANCE( DownSearchToolboxController, ExecuteHdl_Impl, Execu UpSearchToolboxController::UpSearchToolboxController( const css::uno::Reference< css::lang::XMultiServiceFactory > & rServiceManager ) :svt::ToolboxController( rServiceManager, css::uno::Reference< css::frame::XFrame >(), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:UpSearch" )) ) + COMMAND_UPSEARCH ) { - m_xURLTransformer = css::uno::Reference< css::util::XURLTransformer >( m_xServiceManager->createInstance( - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))), - css::uno::UNO_QUERY_THROW ); } UpSearchToolboxController::~UpSearchToolboxController() @@ -752,89 +646,46 @@ void SAL_CALL UpSearchToolboxController::execute( sal_Int16 /*KeyModifier*/ ) th if ( m_bDisposed ) throw css::lang::DisposedException(); - vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); - - css::uno::Reference< css::frame::XDispatch > xDispatch; - css::util::URL aTargetURL; - - if ( m_xURLTransformer.is() ) - { - aTargetURL.Complete = ::rtl::OUString::createFromAscii(".uno:ExecuteSearch"); - m_xURLTransformer->parseStrict( aTargetURL ); - - css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( m_xFrame, css::uno::UNO_QUERY); - if ( xDispatchProvider.is() ) - xDispatch = xDispatchProvider->queryDispatch( aTargetURL, rtl::OUString(), 0 ); - } - - if ( xDispatch.is() && aTargetURL.Complete.getLength() > 0 ) + ::rtl::OUString sFindText; + Window* pWindow = VCLUnoHelper::GetWindow( getParent() ); + ToolBox* pToolBox = (ToolBox*)pWindow; + if ( pToolBox ) { - ::rtl::OUString sFindText; - Window* pWindow = VCLUnoHelper::GetWindow( getParent() ); - ToolBox* pToolBox = (ToolBox*)pWindow; - if ( pToolBox ) + USHORT nItemCount = pToolBox->GetItemCount(); + for ( USHORT i=0; i<nItemCount; ++i ) { - USHORT nItemCount = pToolBox->GetItemCount(); - for ( USHORT i=0; i<nItemCount; ++i ) + ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i); + if ( sItemCommand.equals( COMMAND_FINDTEXT ) ) { - ::rtl::OUString sItemCommand = pToolBox->GetItemCommand(i); - if ( sItemCommand.equals( COMMAND_FINDTEXT ) ) - { - Window* pItemWin = pToolBox->GetItemWindow(i); - if (pItemWin) - sFindText = pItemWin->GetText(); - break; - } + Window* pItemWin = pToolBox->GetItemWindow(i); + if (pItemWin) + sFindText = pItemWin->GetText(); + break; } } + } - css::uno::Sequence< css::beans::PropertyValue > aArgs( 2 ); - aArgs[0].Name = SEARCHITEM_SEARCHSTRING; - aArgs[0].Value <<= sFindText; - aArgs[1].Name = SEARCHITEM_SEARCHBACKWARD; - aArgs[1].Value <<= sal_True; - - // Execute dispatch asynchronously - ExecuteInfo* pExecuteInfo = new ExecuteInfo; - pExecuteInfo->xDispatch = xDispatch; - pExecuteInfo->aTargetURL = aTargetURL; - pExecuteInfo->aArgs = aArgs; - Application::PostUserEvent( STATIC_LINK(0, UpSearchToolboxController , ExecuteHdl_Impl), pExecuteInfo ); - - css::frame::FeatureStateEvent aEvent; - css::util::URL aCommand; - aCommand.Complete = COMMAND_APPENDSEARCHHISTORY; - aEvent.FeatureURL = aCommand; - aEvent.IsEnabled = sal_True; - - css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager()->findController(m_xFrame, COMMAND_FINDTEXT); + css::uno::Sequence< css::beans::PropertyValue > lArgs(2); + lArgs[0].Name = SEARCHITEM_SEARCHSTRING; + lArgs[0].Value <<= sFindText; + lArgs[1].Name = SEARCHITEM_SEARCHBACKWARD; + lArgs[1].Value <<= sal_True; + + impl_executeSearch(m_xServiceManager, m_xFrame, lArgs); + + css::frame::FeatureStateEvent aEvent; + aEvent.FeatureURL.Complete = COMMAND_APPENDSEARCHHISTORY; + css::uno::Reference< css::frame::XStatusListener > xStatusListener = SearchToolbarControllersManager::createControllersManager()->findController(m_xFrame, COMMAND_FINDTEXT); + if (xStatusListener.is()) xStatusListener->statusChanged( aEvent ); - } } // XStatusListener void SAL_CALL UpSearchToolboxController::statusChanged( const css::frame::FeatureStateEvent& /*rEvent*/ ) throw ( css::uno::RuntimeException ) { -} - -IMPL_STATIC_LINK_NOINSTANCE( UpSearchToolboxController, ExecuteHdl_Impl, ExecuteInfo*, pExecuteInfo ) -{ - const sal_uInt32 nRef = Application::ReleaseSolarMutex(); - try - { - // Asynchronous execution as this can lead to our own destruction! - // Framework can recycle our current frame and the layout manager disposes all user interface - // elements if a component gets detached from its frame! - pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, pExecuteInfo->aArgs ); - } - catch ( css::uno::Exception& ) - { - } - - Application::AcquireSolarMutex( nRef ); - delete pExecuteInfo; - - return 0; + vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + if ( m_bDisposed ) + return; } //----------------------------------------------------------------------------------------------------------- @@ -907,9 +758,7 @@ css::uno::Sequence< ::rtl::OUString > FindbarDispatcher::getSupportedServiceNam void SAL_CALL FindbarDispatcher::initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw ( css::uno::Exception, css::uno::RuntimeException ) { if ( aArguments.getLength() ) - { aArguments[0] >>= m_xFrame; - } } // XDispatchProvider |