summaryrefslogtreecommitdiff
path: root/sfx2/source/doc/sfxbasemodel.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sfx2/source/doc/sfxbasemodel.cxx')
-rw-r--r--sfx2/source/doc/sfxbasemodel.cxx127
1 files changed, 92 insertions, 35 deletions
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index bf2654a1297e..d24a95332b58 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -102,7 +102,7 @@
//________________________________________________________________________________________________________
#include <sfx2/sfxbasecontroller.hxx>
-#include "viewfac.hxx"
+#include "sfx2/viewfac.hxx"
#include "workwin.hxx"
#include <sfx2/signaturestate.hxx>
#include <sfx2/sfxuno.hxx>
@@ -114,7 +114,7 @@
#include <sfx2/request.hxx>
#include <sfx2/objuno.hxx>
#include <sfx2/printer.hxx>
-#include <basmgr.hxx>
+#include <sfx2/basmgr.hxx>
#include <sfx2/event.hxx>
#include <eventsupplier.hxx>
#include <sfx2/evntconf.hxx>
@@ -125,12 +125,12 @@
#include <sfx2/docfac.hxx>
#include <sfx2/fcontnr.hxx>
#include "sfx2/docstoragemodifylistener.hxx"
-#include "brokenpackageint.hxx"
+#include "sfx2/brokenpackageint.hxx"
#include "graphhelp.hxx"
#include <sfx2/msgpool.hxx>
#include <sfx2/DocumentMetadataAccess.hxx>
-#include <sfxresid.hxx>
+#include <sfx2/sfxresid.hxx>
//________________________________________________________________________________________________________
// const
@@ -1805,10 +1805,9 @@ void SAL_CALL SfxBaseModel::load( const uno::Sequence< beans::PropertyValue >&
SFX_ITEMSET_ARG( pMedium->GetItemSet(), pRepairItem, SfxBoolItem, SID_REPAIRPACKAGE, FALSE );
if ( !pRepairItem || !pRepairItem->GetValue() )
{
- RequestPackageReparation* pRequest = new RequestPackageReparation( aDocName );
- com::sun::star::uno::Reference< com::sun::star::task::XInteractionRequest > xRequest ( pRequest );
- xHandler->handle( xRequest );
- if( pRequest->isApproved() )
+ RequestPackageReparation aRequest( aDocName );
+ xHandler->handle( aRequest.GetRequest() );
+ if( aRequest.isApproved() )
{
// broken package: try second loading and allow repair
pMedium->GetItemSet()->Put( SfxBoolItem( SID_REPAIRPACKAGE, sal_True ) );
@@ -1828,9 +1827,8 @@ void SAL_CALL SfxBaseModel::load( const uno::Sequence< beans::PropertyValue >&
if ( nError == ERRCODE_IO_BROKENPACKAGE )
{
// repair either not allowed or not successful
- NotifyBrokenPackage* pNotifyRequest = new NotifyBrokenPackage( aDocName );
- com::sun::star::uno::Reference< com::sun::star::task::XInteractionRequest > xRequest ( pNotifyRequest );
- xHandler->handle( xRequest );
+ NotifyBrokenPackage aRequest( aDocName );
+ xHandler->handle( aRequest.GetRequest() );
}
}
}
@@ -2385,6 +2383,32 @@ void SAL_CALL SfxBaseModel::removeEventListener( const uno::Reference< XDOCEVENT
m_pData->m_aInterfaceContainer.removeInterface( ::getCppuType((const uno::Reference< XDOCEVENTLISTENER >*)0), aListener );
}
+//--------------------------------------------------------------------------------------------------------
+// XDocumentEventBroadcaster
+//--------------------------------------------------------------------------------------------------------
+// ---------------------------------
+void SAL_CALL SfxBaseModel::addDocumentEventListener( const uno::Reference< document::XDocumentEventListener >& aListener )
+ throw ( uno::RuntimeException )
+{
+ SfxModelGuard aGuard( *this, SfxModelGuard::E_INITIALIZING );
+ m_pData->m_aInterfaceContainer.addInterface( ::getCppuType((const uno::Reference< document::XDocumentEventListener >*)0), aListener );
+}
+
+// ---------------------------------
+void SAL_CALL SfxBaseModel::removeDocumentEventListener( const uno::Reference< document::XDocumentEventListener >& aListener )
+ throw ( uno::RuntimeException )
+{
+ SfxModelGuard aGuard( *this );
+ m_pData->m_aInterfaceContainer.removeInterface( ::getCppuType((const uno::Reference< document::XDocumentEventListener >*)0), aListener );
+}
+
+// ---------------------------------
+void SAL_CALL SfxBaseModel::notifyDocumentEvent( const ::rtl::OUString&, const uno::Reference< frame::XController2 >&, const uno::Any& )
+ throw ( lang::IllegalArgumentException, lang::NoSupportException, uno::RuntimeException )
+{
+ throw lang::NoSupportException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SfxBaseModel controlls all the sent notifications itself!" ) ), uno::Reference< uno::XInterface >() );
+}
+
//________________________________________________________________________________________________________
// SfxListener
//________________________________________________________________________________________________________
@@ -2528,7 +2552,9 @@ void SfxBaseModel::Notify( SfxBroadcaster& rBC ,
break;
}
- postEvent_Impl( pNamedHint->GetEventName() );
+
+ SfxViewEventHint* pViewHint = PTR_CAST( SfxViewEventHint, &rHint );
+ postEvent_Impl( pNamedHint->GetEventName(), pViewHint ? pViewHint->GetController() : uno::Reference< frame::XController2 >() );
}
if ( pSimpleHint )
@@ -2873,8 +2899,32 @@ void SfxBaseModel::impl_store( const ::rtl::OUString& sURL
}
//********************************************************************************************************
+namespace {
+template< typename ListenerT, typename EventT >
+class NotifySingleListenerIgnoreRE
+{
+private:
+ typedef void ( SAL_CALL ListenerT::*NotificationMethod )( const EventT& );
+ NotificationMethod m_pMethod;
+ const EventT& m_rEvent;
+public:
+ NotifySingleListenerIgnoreRE( NotificationMethod method, const EventT& event ) : m_pMethod( method ), m_rEvent( event ) { }
-void SfxBaseModel::postEvent_Impl( ::rtl::OUString aName )
+ void operator()( const uno::Reference<ListenerT>& listener ) const
+ {
+ try
+ {
+ (listener.get()->*m_pMethod)( m_rEvent );
+ }
+ catch( uno::RuntimeException& )
+ {
+ // this exception is ignored to avoid problems with invalid listeners, the listener should be probably thrown away in future
+ }
+ }
+};
+} // anonymous namespace
+
+void SfxBaseModel::postEvent_Impl( const ::rtl::OUString& aName, const uno::Reference< frame::XController2 >& xController )
{
// object already disposed?
if ( impl_isDisposed() )
@@ -2884,34 +2934,41 @@ void SfxBaseModel::postEvent_Impl( ::rtl::OUString aName )
if (!aName.getLength())
return;
- ::cppu::OInterfaceContainerHelper* pIC = m_pData->m_aInterfaceContainer.getContainer(
- ::getCppuType((const uno::Reference< XDOCEVENTLISTENER >*)0) );
- if( pIC )
+ ::cppu::OInterfaceContainerHelper* pIC =
+ m_pData->m_aInterfaceContainer.getContainer( ::getCppuType( (const uno::Reference< document::XDocumentEventListener >*)0 ) );
+ if ( pIC )
+ {
+#ifdef DBG_UTIL
+ ByteString aTmp( "SfxDocumentEvent: " );
+ aTmp += ByteString( String(aName), RTL_TEXTENCODING_UTF8 );
+ DBG_TRACE( aTmp.GetBuffer() );
+#endif
+
+ document::DocumentEvent aDocumentEvent( (frame::XModel*)this, aName, xController, uno::Any() );
+
+ pIC->forEach< document::XDocumentEventListener, NotifySingleListenerIgnoreRE< document::XDocumentEventListener, document::DocumentEvent > >(
+ NotifySingleListenerIgnoreRE< document::XDocumentEventListener, document::DocumentEvent >(
+ &document::XDocumentEventListener::documentEventOccured,
+ aDocumentEvent ) );
+ }
+ pIC = m_pData->m_aInterfaceContainer.getContainer( ::getCppuType( (const uno::Reference< document::XEventListener >*)0 ) );
+ if ( pIC )
{
#ifdef DBG_UTIL
- ByteString aTmp( "SfxEvent: ");
+ ByteString aTmp( "SfxEvent: " );
aTmp += ByteString( String(aName), RTL_TEXTENCODING_UTF8 );
DBG_TRACE( aTmp.GetBuffer() );
#endif
- document::EventObject aEvent( (frame::XModel *)this, aName );
- ::cppu::OInterfaceContainerHelper aIC( m_aMutex );
- uno::Sequence < uno::Reference < uno::XInterface > > aElements = pIC->getElements();
- for ( sal_Int32 nElem=0; nElem<aElements.getLength(); nElem++ )
- aIC.addInterface( aElements[nElem] );
- ::cppu::OInterfaceIteratorHelper aIt( aIC );
- while( aIt.hasMoreElements() )
- {
- try
- {
- ((XDOCEVENTLISTENER *)aIt.next())->notifyEvent( aEvent );
- }
- catch( uno::RuntimeException& )
- {
- aIt.remove();
- }
- }
+
+ document::EventObject aEvent( (frame::XModel*)this, aName );
+
+ pIC->forEach< document::XEventListener, NotifySingleListenerIgnoreRE< document::XEventListener, document::EventObject > >(
+ NotifySingleListenerIgnoreRE< document::XEventListener, document::EventObject >(
+ &document::XEventListener::notifyEvent,
+ aEvent ) );
}
+
}
uno::Reference < container::XIndexAccess > SAL_CALL SfxBaseModel::getViewData() throw(::com::sun::star::uno::RuntimeException)
@@ -3288,7 +3345,7 @@ uno::Reference< ui::XUIConfigurationManager > SAL_CALL SfxBaseModel::getUIConfig
uno::Reference< lang::XMultiServiceFactory > xServiceMgr( ::comphelper::getProcessServiceFactory() );
uno::Sequence< uno::Reference< container::XIndexContainer > > rToolbars;
- sal_Bool bImported = UIConfigurationImporterOOo1x::ImportCustomToolbars(
+ sal_Bool bImported = framework::UIConfigurationImporterOOo1x::ImportCustomToolbars(
xNewUIConfMan, rToolbars, xServiceMgr, xOOo1ConfigStorage );
if ( bImported )
{