tdf#125846 - Remove the terminate listener of an embedded object only once
Otherwise, all remaining listeners will be checked, leading to performance issues when closing a document with many objects like formulas. Change-Id: I99b4b536e40af8a9045c7da6356cca87d3c88b02 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211697 Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de> Tested-by: Jenkins
This commit is contained in:
@@ -156,7 +156,7 @@ DocumentHolder::DocumentHolder( uno::Reference< uno::XComponentContext > xContex
|
|||||||
m_bReadOnly( false ),
|
m_bReadOnly( false ),
|
||||||
m_bWaitForClose( false ),
|
m_bWaitForClose( false ),
|
||||||
m_bAllowClosing( false ),
|
m_bAllowClosing( false ),
|
||||||
m_bDesktopTerminated( false ),
|
m_bTerminateListenerRegistered( false ),
|
||||||
m_nNoBorderResizeReact( 0 ),
|
m_nNoBorderResizeReact( 0 ),
|
||||||
m_nNoResizeReact( 0 )
|
m_nNoResizeReact( 0 )
|
||||||
{
|
{
|
||||||
@@ -165,6 +165,7 @@ DocumentHolder::DocumentHolder( uno::Reference< uno::XComponentContext > xContex
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
xDesktop->addTerminateListener( this );
|
xDesktop->addTerminateListener( this );
|
||||||
|
m_bTerminateListenerRegistered = true;
|
||||||
}
|
}
|
||||||
catch ( const uno::Exception& )
|
catch ( const uno::Exception& )
|
||||||
{
|
{
|
||||||
@@ -198,8 +199,7 @@ DocumentHolder::~DocumentHolder()
|
|||||||
m_xInterceptor.clear();
|
m_xInterceptor.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !m_bDesktopTerminated )
|
FreeOffice();
|
||||||
FreeOffice();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -233,6 +233,10 @@ void DocumentHolder::CloseFrame()
|
|||||||
|
|
||||||
void DocumentHolder::FreeOffice()
|
void DocumentHolder::FreeOffice()
|
||||||
{
|
{
|
||||||
|
// tdf#125846 - deregister listener only once since a second removal would check all listeners
|
||||||
|
if (!m_bTerminateListenerRegistered)
|
||||||
|
return;
|
||||||
|
m_bTerminateListenerRegistered = false;
|
||||||
try {
|
try {
|
||||||
uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create( m_xContext );
|
uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create( m_xContext );
|
||||||
xDesktop->removeTerminateListener( this );
|
xDesktop->removeTerminateListener( this );
|
||||||
@@ -1152,8 +1156,8 @@ void SAL_CALL DocumentHolder::notifyTermination( const lang::EventObject& aSourc
|
|||||||
{
|
{
|
||||||
OSL_ENSURE( !m_xComponent.is(), "Just a disaster..." );
|
OSL_ENSURE( !m_xComponent.is(), "Just a disaster..." );
|
||||||
|
|
||||||
|
m_bTerminateListenerRegistered = false;
|
||||||
uno::Reference< frame::XDesktop > xDesktop( aSource.Source, uno::UNO_QUERY );
|
uno::Reference< frame::XDesktop > xDesktop( aSource.Source, uno::UNO_QUERY );
|
||||||
m_bDesktopTerminated = true;
|
|
||||||
if ( xDesktop.is() )
|
if ( xDesktop.is() )
|
||||||
xDesktop->removeTerminateListener( static_cast<frame::XTerminateListener*>(this) );
|
xDesktop->removeTerminateListener( static_cast<frame::XTerminateListener*>(this) );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ private:
|
|||||||
|
|
||||||
bool m_bWaitForClose;
|
bool m_bWaitForClose;
|
||||||
bool m_bAllowClosing;
|
bool m_bAllowClosing;
|
||||||
bool m_bDesktopTerminated;
|
bool m_bTerminateListenerRegistered;
|
||||||
|
|
||||||
sal_Int32 m_nNoBorderResizeReact;
|
sal_Int32 m_nNoBorderResizeReact;
|
||||||
sal_Int32 m_nNoResizeReact;
|
sal_Int32 m_nNoResizeReact;
|
||||||
|
|||||||
Reference in New Issue
Block a user