User: rt Date: 2007-07-24 12:04:35+0000 Modified: dba/dbaccess/source/core/dataaccess/databasedocument.cxx
Log: INTEGRATION: CWS dba23b (1.32.20); FILE MERGED 2007/07/07 20:21:50 fs 1.32.20.2: during #i78593#: don't re-create the Settings property bag when it's not necessary 2007/06/28 09:02:47 fs 1.32.20.1: #i78362# controllers and current controller now maintained by the DatabaseDocument, not by the ModelImpl (since they're an XModel aspect) File Changes: Directory: /dba/dbaccess/source/core/dataaccess/ ================================================ File [changed]: databasedocument.cxx Url: http://dba.openoffice.org/source/browse/dba/dbaccess/source/core/dataaccess/databasedocument.cxx?r1=1.32&r2=1.33 Delta lines: +71 -42 --------------------- --- databasedocument.cxx 2007-04-16 16:23:47+0000 1.32 +++ databasedocument.cxx 2007-07-24 12:04:32+0000 1.33 @@ -82,6 +82,9 @@ #ifndef _URLOBJ_HXX #include <tools/urlobj.hxx> #endif +#ifndef TOOLS_DIAGNOSE_EX_H +#include <tools/diagnose_ex.h> +#endif #ifndef _ERRCODE_HXX #include <tools/errcode.hxx> #endif @@ -252,8 +255,7 @@ clearObjectContainer( m_pImpl->m_xTableDefinitions); clearObjectContainer( m_pImpl->m_xCommandDefinitions); - m_pImpl->m_aContainer.clear(); - m_pImpl->lateInit(); + m_pImpl->reset(); } catch(const Exception&) { @@ -338,9 +340,7 @@ void SAL_CALL ODatabaseDocument::connectController( const Reference< XController >& _xController ) throw (RuntimeException) { ModelMethodGuard aGuard( *this ); - OSL_ENSURE(m_pImpl.is(),"Impl is NULL"); - - m_pImpl->m_aControllers.push_back(_xController); + m_aControllers.push_back( _xController ); } // ----------------------------------------------------------------------------- void SAL_CALL ODatabaseDocument::disconnectController( const Reference< XController >& _xController ) throw (RuntimeException) @@ -348,15 +348,15 @@ ModelMethodGuard aGuard( *this ); OSL_ENSURE(m_pImpl.is(),"Impl is NULL"); - ControllerArray::iterator pos = ::std::find( m_pImpl->m_aControllers.begin(), m_pImpl->m_aControllers.end(), _xController ); - OSL_ENSURE( pos != m_pImpl->m_aControllers.end(), "ODatabaseDocument::disconnectController: don't know this controller!" ); - if ( pos != m_pImpl->m_aControllers.end() ) - m_pImpl->m_aControllers.erase( pos ); + Controllers::iterator pos = ::std::find( m_aControllers.begin(), m_aControllers.end(), _xController ); + OSL_ENSURE( pos != m_aControllers.end(), "ODatabaseDocument::disconnectController: don't know this controller!" ); + if ( pos != m_aControllers.end() ) + m_aControllers.erase( pos ); - if ( m_pImpl->m_xCurrentController == _xController ) - m_pImpl->m_xCurrentController = NULL; + if ( m_xCurrentController == _xController ) + m_xCurrentController = NULL; - if ( m_pImpl->m_aControllers.empty() ) + if ( m_aControllers.empty() ) { // if this was the last view, close the document as a whole // #i51157# / 2006-03-16 / [EMAIL PROTECTED] @@ -400,7 +400,7 @@ ModelMethodGuard aGuard( *this ); OSL_ENSURE(m_pImpl.is(),"Impl is NULL"); - return m_pImpl->m_xCurrentController.is() ? m_pImpl->m_xCurrentController : ( m_pImpl->m_aControllers.empty() ? Reference< XController >() : *m_pImpl->m_aControllers.begin() ); + return m_xCurrentController.is() ? m_xCurrentController : ( m_aControllers.empty() ? Reference< XController >() : *m_aControllers.begin() ); } // ----------------------------------------------------------------------------- void SAL_CALL ODatabaseDocument::setCurrentController( const Reference< XController >& _xController ) throw (NoSuchElementException, RuntimeException) @@ -408,7 +408,7 @@ ModelMethodGuard aGuard( *this ); OSL_ENSURE(m_pImpl.is(),"Impl is NULL"); - m_pImpl->m_xCurrentController = _xController; + m_xCurrentController = _xController; } // ----------------------------------------------------------------------------- Reference< XInterface > SAL_CALL ODatabaseDocument::getCurrentSelection( ) throw (RuntimeException) @@ -752,17 +752,17 @@ } return xContainer; } + // ----------------------------------------------------------------------------- void ODatabaseDocument::impl_closeControllerFrames( sal_Bool _bDeliverOwnership ) { - ::std::vector< Reference< XController> > aCopy = m_pImpl->m_aControllers; + Controllers aCopy = m_aControllers; - ::std::vector< Reference< XController> >::iterator aIter = aCopy.begin(); - ::std::vector< Reference< XController> >::iterator aEnd = aCopy.end(); - for ( ;aIter != aEnd ; ++aIter ) - { - if ( aIter->is() ) + for ( Controllers::iterator aIter = aCopy.begin(); aIter != aCopy.end() ; ++aIter ) { + if ( !aIter->is() ) + continue; + try { Reference< XCloseable> xFrame( (*aIter)->getFrame(), UNO_QUERY ); @@ -772,10 +772,37 @@ catch( const CloseVetoException& ) { throw; } catch( const Exception& ) { - OSL_ENSURE( sal_False, "ODatabaseDocument::impl_closeControllerFrames: caught an unexpected exception!" ); + DBG_UNHANDLED_EXCEPTION(); + } } +} + +// ----------------------------------------------------------------------------- +struct DisposeControllerFrame : public ::std::unary_function< Reference< XController >, void > +{ + void operator()( const Reference< XController >& _rxController ) const + { + try + { + if ( !_rxController.is() ) + return; + + Reference< XFrame > xFrame( _rxController->getFrame() ); + ::comphelper::disposeComponent( xFrame ); } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); } + }; +}; + +// ----------------------------------------------------------------------------- +void ODatabaseDocument::impl_disposeControllerFrames_nothrow() +{ + Controllers aCopy; + aCopy.swap( m_aControllers ); // ensure m_aControllers is empty afterwards + ::std::for_each( aCopy.begin(), aCopy.end(), DisposeControllerFrame() ); } // ----------------------------------------------------------------------------- @@ -1083,7 +1110,7 @@ return; } - DBG_ASSERT( m_pImpl->m_aControllers.empty(), "ODatabaseDocument::disposing: there still are controllers!" ); + DBG_ASSERT( m_aControllers.empty(), "ODatabaseDocument::disposing: there still are controllers!" ); // normally, nobody should explicitly dispose, but only XCloseable::close the document. And upon // closing, our controllers are closed, too @@ -1108,7 +1135,8 @@ // now, at the latest, the controller array should be empty. Controllers are // expected to listen for our disposal, and disconnect then - DBG_ASSERT( m_pImpl->m_aControllers.empty(), "ODatabaseDocument::disposing: there still are controllers!" ); + DBG_ASSERT( m_aControllers.empty(), "ODatabaseDocument::disposing: there still are controllers!" ); + impl_disposeControllerFrames_nothrow(); } m_pImpl.clear(); @@ -1189,18 +1217,19 @@ } // ----------------------------------------------------------------------------- struct CreateAny : public ::std::unary_function< Reference<XController>, Any> - { +{ Any operator() (const Reference<XController>& lhs) const { return makeAny(lhs); } - }; +}; + // XModel2 Reference< XEnumeration > SAL_CALL ODatabaseDocument::getControllers( ) throw (RuntimeException) { ModelMethodGuard aGuard( *this ); - uno::Sequence< Any> aController(m_pImpl->m_aControllers.size()); - ::std::transform(m_pImpl->m_aControllers.begin(),m_pImpl->m_aControllers.end(),aController.getArray(),CreateAny()); + uno::Sequence< Any> aController( m_aControllers.size() ); + ::std::transform( m_aControllers.begin(), m_aControllers.end(), aController.getArray(), CreateAny() ); return new ::comphelper::OAnyEnumeration(aController); } // ----------------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
