diff options
author | Juergen Funk <juergen.funk_ml@cib.de> | 2016-05-13 10:42:17 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2016-06-08 02:16:54 +0000 |
commit | f9bb13419549d621ffd55d9d81e0732a89560e2e (patch) | |
tree | f3f8a64fd254c5e466b466c12d0e627472ce7868 /sfx2 | |
parent | 439b47e84bb12ec1c5cc2332b4c6a9ea59f462ad (diff) |
tdf#99815 use XNotifyingDispatch in sfx2
- move DispatchHelper somewhere public
- use it from generic dispatcher call sites in sfx2
- return result of dispatcher calls (conveyed via
XDispatchResultListener) to calling code, instead of faking it
Change-Id: Ie8041133e99dd99e45819f98798829b96532b9e6
Reviewed-on: https://gerrit.libreoffice.org/24953
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/control/bindings.cxx | 14 | ||||
-rw-r--r-- | sfx2/source/control/statcach.cxx | 30 | ||||
-rw-r--r-- | sfx2/source/control/unoctitm.cxx | 9 | ||||
-rw-r--r-- | sfx2/source/inc/statcach.hxx | 4 |
4 files changed, 41 insertions, 16 deletions
diff --git a/sfx2/source/control/bindings.cxx b/sfx2/source/control/bindings.cxx index 3bdeb277a8fa..cfc899f03dd8 100644 --- a/sfx2/source/control/bindings.cxx +++ b/sfx2/source/control/bindings.cxx @@ -34,6 +34,7 @@ #include <com/sun/star/frame/XDispatchProviderInterceptor.hpp> #include <com/sun/star/frame/XDispatch.hpp> #include <com/sun/star/frame/XDispatchProvider.hpp> +#include <com/sun/star/frame/DispatchResultState.hpp> #include <com/sun/star/frame/XStatusListener.hpp> #include <com/sun/star/frame/FrameSearchFlag.hpp> #include <com/sun/star/frame/XDispatchProviderInterception.hpp> @@ -1014,10 +1015,15 @@ const SfxPoolItem* SfxBindings::Execute_Impl( sal_uInt16 nId, const SfxPoolItem* aReq.AppendItem( **ppItems++ ); // cache binds to an external dispatch provider - pCache->Dispatch( aReq.GetArgs(), nCallMode == SfxCallMode::SYNCHRON ); - SfxPoolItem *pVoid = new SfxVoidItem( nId ); - DeleteItemOnIdle( pVoid ); - return pVoid; + sal_Int16 eRet = pCache->Dispatch( aReq.GetArgs(), nCallMode == SfxCallMode::SYNCHRON ); + SfxPoolItem *pPool; + if ( eRet == css::frame::DispatchResultState::DONTKNOW ) + pPool = new SfxVoidItem( nId ); + else + pPool = new SfxBoolItem( nId, eRet == css::frame::DispatchResultState::SUCCESS); + + DeleteItemOnIdle( pPool ); + return pPool; } // slot is handled internally by SfxDispatcher diff --git a/sfx2/source/control/statcach.cxx b/sfx2/source/control/statcach.cxx index d5165c43db6e..4721b05c1b4d 100644 --- a/sfx2/source/control/statcach.cxx +++ b/sfx2/source/control/statcach.cxx @@ -30,6 +30,8 @@ #include <com/sun/star/frame/XFrame.hpp> #include <com/sun/star/frame/FrameActionEvent.hpp> #include <com/sun/star/frame/FrameAction.hpp> +#include <framework/dispatchhelper.hxx> +#include <com/sun/star/frame/DispatchResultState.hpp> #include <com/sun/star/beans/PropertyValue.hpp> #include <cppuhelper/weak.hxx> #include <svl/eitem.hxx> @@ -162,17 +164,22 @@ void BindDispatch_Impl::Release() } -void BindDispatch_Impl::Dispatch( const uno::Sequence < beans::PropertyValue >& aProps, bool bForceSynchron ) +sal_Int16 BindDispatch_Impl::Dispatch( const css::uno::Sequence < css::beans::PropertyValue >& aProps, bool bForceSynchron ) { + sal_Int16 eRet = css::frame::DispatchResultState::DONTKNOW; + if ( xDisp.is() && aStatus.IsEnabled ) { - sal_Int32 nLength = aProps.getLength(); - uno::Sequence < beans::PropertyValue > aProps2 = aProps; - aProps2.realloc(nLength+1); - aProps2[nLength].Name = "SynchronMode"; - aProps2[nLength].Value <<= bForceSynchron ; - xDisp->dispatch( aURL, aProps2 ); + ::rtl::Reference< ::framework::DispatchHelper > xHelper( new ::framework::DispatchHelper(nullptr)); + css::uno::Any aResult = xHelper->executeDispatch(xDisp, aURL, bForceSynchron, aProps); + + css::frame::DispatchResultEvent aEvent; + aResult >>= aEvent; + + eRet = aEvent.State; } + + return eRet; } @@ -479,17 +486,22 @@ css::uno::Reference< css::frame::XDispatch > SfxStateCache::GetDispatch() const return css::uno::Reference< css::frame::XDispatch > (); } -void SfxStateCache::Dispatch( const SfxItemSet* pSet, bool bForceSynchron ) +sal_Int16 SfxStateCache::Dispatch( const SfxItemSet* pSet, bool bForceSynchron ) { // protect pDispatch against destruction in the call css::uno::Reference < css::frame::XStatusListener > xKeepAlive( pDispatch ); + sal_Int16 eRet = css::frame::DispatchResultState::DONTKNOW; + if ( pDispatch ) { uno::Sequence < beans::PropertyValue > aArgs; if (pSet) TransformItems( nId, *pSet, aArgs ); - pDispatch->Dispatch( aArgs, bForceSynchron ); + + eRet = pDispatch->Dispatch( aArgs, bForceSynchron ); } + + return eRet; } diff --git a/sfx2/source/control/unoctitm.cxx b/sfx2/source/control/unoctitm.cxx index 3c00b5269f86..fbbebfeb152a 100644 --- a/sfx2/source/control/unoctitm.cxx +++ b/sfx2/source/control/unoctitm.cxx @@ -702,7 +702,14 @@ void SAL_CALL SfxDispatchController_Impl::dispatch( const css::util::URL& aURL, { // execute with arguments - call directly pItem = pDispatcher->Execute(GetId(), nCall, xSet.get(), &aInternalSet, nModifier); - bSuccess = (pItem != nullptr); + if ( pItem != nullptr ) + { + if ( dynamic_cast< const SfxBoolItem *>( pItem ) != nullptr ) + bSuccess = dynamic_cast< const SfxBoolItem *>( pItem )->GetValue(); + else if ( dynamic_cast< const SfxVoidItem *>( pItem ) == nullptr ) + bSuccess = true; // all other types are true + } + // else bSuccess = false look to line 664 it is false } else { diff --git a/sfx2/source/inc/statcach.hxx b/sfx2/source/inc/statcach.hxx index c34c0890f5be..d55bb2dc6e5c 100644 --- a/sfx2/source/inc/statcach.hxx +++ b/sfx2/source/inc/statcach.hxx @@ -56,7 +56,7 @@ public: void Release(); const css::frame::FeatureStateEvent& GetStatus() const { return aStatus;} - void Dispatch( const css::uno::Sequence < css::beans::PropertyValue >& aProps, bool bForceSynchron = false ); + sal_Int16 Dispatch( const css::uno::Sequence < css::beans::PropertyValue >& aProps, bool bForceSynchron = false ); }; class SfxStateCache @@ -89,7 +89,7 @@ public: const SfxSlotServer* GetSlotServer( SfxDispatcher &rDispat ) { return GetSlotServer( rDispat, css::uno::Reference< css::frame::XDispatchProvider > () ); } css::uno::Reference< css::frame::XDispatch > GetDispatch() const; - void Dispatch( const SfxItemSet* pSet, bool bForceSynchron = false ); + sal_Int16 Dispatch( const SfxItemSet* pSet, bool bForceSynchron = false ); bool IsControllerDirty() const { return bCtrlDirty; } void ClearCache(); |