chart2/source/view/main/DrawModelWrapper.cxx  |    1 +
 include/ucbhelper/resultsethelper.hxx         |    2 +-
 svx/source/sdr/contact/viewcontact.cxx        |   15 +++++++++++++++
 toolkit/source/hatchwindow/documentcloser.cxx |   13 ++++---------
 ucbhelper/source/provider/resultset.cxx       |   16 +++++-----------
 ucbhelper/source/provider/resultsethelper.cxx |   12 ++++--------
 6 files changed, 30 insertions(+), 29 deletions(-)

New commits:
commit 2e162bb1e8521ad8cd8148e0a18adc3eebadd710
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Thu Jan 13 13:13:57 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Fri Jan 14 09:45:43 2022 +0100

    use cache value in ViewContact
    
    Rely on the cached primitives without always rebuilding.
    
    But only enable it for calc and draw right now, by adding a flag
    at the SdrModel level.
    
    Change-Id: I295e5a366b1b21d0f1561e6736bac919082afb5a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128380
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/chart2/source/view/main/DrawModelWrapper.cxx 
b/chart2/source/view/main/DrawModelWrapper.cxx
index aa7a002c967a..ff2171f596a1 100644
--- a/chart2/source/view/main/DrawModelWrapper.cxx
+++ b/chart2/source/view/main/DrawModelWrapper.cxx
@@ -45,6 +45,7 @@ namespace chart
 DrawModelWrapper::DrawModelWrapper()
 :   SdrModel(&ChartItemPool::GetGlobalChartItemPool())
 {
+    SetVOCInvalidationIsReliable(true);
     SetScaleUnit(MapUnit::Map100thMM);
     SetScaleFraction(Fraction(1, 1));
     SetDefaultFontHeight(423);     // 12pt
diff --git a/svx/source/sdr/contact/viewcontact.cxx 
b/svx/source/sdr/contact/viewcontact.cxx
index bd79bc5ed4ac..55af6ab6cd4f 100644
--- a/svx/source/sdr/contact/viewcontact.cxx
+++ b/svx/source/sdr/contact/viewcontact.cxx
@@ -26,6 +26,8 @@
 #include <drawinglayer/primitive2d/PolygonHairlinePrimitive2D.hxx>
 #include <osl/diagnose.h>
 #include <tools/debug.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdmodel.hxx>
 
 namespace sdr::contact
 {
@@ -184,6 +186,8 @@ void ViewContact::ActionChildInserted(ViewContact& rChild)
 // React on changes of the object of this ViewContact
 void ViewContact::ActionChanged()
 {
+    mxViewIndependentPrimitive2DSequence.clear(); // clear cache
+
     // propagate change to all existing VOCs. This will invalidate
     // all drawn visualisations in all known views
     const sal_uInt32 nCount(maViewObjectContactVector.size());
@@ -229,6 +233,17 @@ void ViewContact::createViewIndependentPrimitive2DSequence(
 void ViewContact::getViewIndependentPrimitive2DContainer(
     drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
 {
+    // only some of the top-level apps are any good at reliably invalidating 
us (e.g. writer is not)
+    if (SdrObject* pSdrObj = TryToGetSdrObject())
+        if (pSdrObj->getSdrModelFromSdrObject().IsVOCInvalidationIsReliable())
+        {
+            if (!mxViewIndependentPrimitive2DSequence.empty())
+            {
+                rVisitor.visit(mxViewIndependentPrimitive2DSequence);
+                return;
+            }
+        }
+
     /* Local up-to-date checks. Create new list and compare.
         We cannot just always use the new data because the old data has cached 
bitmaps in it e.g. see the document in tdf#146108.
     */
commit 8960dae3a24f5dd2712f1fe74de0c3b22552b12b
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Fri Jan 14 09:41:29 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Fri Jan 14 09:45:31 2022 +0100

    no need to hold OInterfaceContainerHelper4 by unique_ptr
    
    when empty, it is only a single pointer big anyway
    
    Change-Id: I3e45dd705c4bef3799435617db1a4192d62860e4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128403
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/include/ucbhelper/resultsethelper.hxx 
b/include/ucbhelper/resultsethelper.hxx
index e929531aa586..486d07fe5f89 100644
--- a/include/ucbhelper/resultsethelper.hxx
+++ b/include/ucbhelper/resultsethelper.hxx
@@ -55,7 +55,7 @@ class UCBHELPER_DLLPUBLIC ResultSetImplHelper :
                     css::lang::XServiceInfo,
                     css::ucb::XDynamicResultSet>
 {
-    
std::unique_ptr<comphelper::OInterfaceContainerHelper4<css::lang::XEventListener>>
 m_pDisposeEventListeners;
+    comphelper::OInterfaceContainerHelper4<css::lang::XEventListener> 
m_aDisposeEventListeners;
     bool                         m_bStatic;
     bool                         m_bInitDone;
 
diff --git a/toolkit/source/hatchwindow/documentcloser.cxx 
b/toolkit/source/hatchwindow/documentcloser.cxx
index 10cb6b37ecd6..16df8536f5f1 100644
--- a/toolkit/source/hatchwindow/documentcloser.cxx
+++ b/toolkit/source/hatchwindow/documentcloser.cxx
@@ -46,7 +46,7 @@ class ODocumentCloser : public ::cppu::WeakImplHelper< 
css::lang::XComponent,
 {
     std::mutex m_aMutex;
     css::uno::Reference< css::frame::XFrame > m_xFrame;
-    
std::unique_ptr<::comphelper::OInterfaceContainerHelper4<lang::XEventListener>> 
m_pListenersContainer; // list of listeners
+    ::comphelper::OInterfaceContainerHelper4<lang::XEventListener> 
m_aListenersContainer; // list of listeners
 
     bool m_bDisposed;
 
@@ -170,8 +170,7 @@ void SAL_CALL ODocumentCloser::dispose()
         throw lang::DisposedException();
 
     lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) );
-    if ( m_pListenersContainer )
-        m_pListenersContainer->disposeAndClear( aGuard, aSource );
+    m_aListenersContainer.disposeAndClear( aGuard, aSource );
 
     // TODO: trigger a main thread execution to close the frame
     if ( m_xFrame.is() )
@@ -191,18 +190,14 @@ void SAL_CALL ODocumentCloser::addEventListener( const 
uno::Reference< lang::XEv
     if ( m_bDisposed )
         throw lang::DisposedException(); // TODO
 
-    if ( !m_pListenersContainer )
-        m_pListenersContainer.reset( new 
::comphelper::OInterfaceContainerHelper4<lang::XEventListener>() );
-
-    m_pListenersContainer->addInterface( xListener );
+    m_aListenersContainer.addInterface( xListener );
 }
 
 
 void SAL_CALL ODocumentCloser::removeEventListener( const uno::Reference< 
lang::XEventListener >& xListener )
 {
     std::unique_lock aGuard( m_aMutex );
-    if ( m_pListenersContainer )
-        m_pListenersContainer->removeInterface( xListener );
+    m_aListenersContainer.removeInterface( xListener );
 }
 
 // XServiceInfo
diff --git a/ucbhelper/source/provider/resultset.cxx 
b/ucbhelper/source/provider/resultset.cxx
index 0bc1398b724c..162f32cffabf 100644
--- a/ucbhelper/source/provider/resultset.cxx
+++ b/ucbhelper/source/provider/resultset.cxx
@@ -147,7 +147,7 @@ struct ResultSet_Impl
     uno::Sequence< beans::Property >                m_aProperties;
     rtl::Reference< ResultSetDataSupplier >         m_xDataSupplier;
     std::mutex                          m_aMutex;
-    
std::unique_ptr<comphelper::OInterfaceContainerHelper4<lang::XEventListener>> 
m_pDisposeEventListeners;
+    comphelper::OInterfaceContainerHelper4<lang::XEventListener> 
m_aDisposeEventListeners;
     std::unique_ptr<PropertyChangeListeners>        m_pPropertyChangeListeners;
     sal_Int32                           m_nPos;
     bool                            m_bWasNull;
@@ -236,12 +236,11 @@ void SAL_CALL ResultSet::dispose()
 {
     std::unique_lock aGuard( m_pImpl->m_aMutex );
 
-    if ( m_pImpl->m_pDisposeEventListeners &&
-         m_pImpl->m_pDisposeEventListeners->getLength() )
+    if ( m_pImpl->m_aDisposeEventListeners.getLength() )
     {
         lang::EventObject aEvt;
         aEvt.Source = static_cast< lang::XComponent * >( this );
-        m_pImpl->m_pDisposeEventListeners->disposeAndClear( aGuard, aEvt );
+        m_pImpl->m_aDisposeEventListeners.disposeAndClear( aGuard, aEvt );
         aGuard.lock();
     }
 
@@ -263,11 +262,7 @@ void SAL_CALL ResultSet::addEventListener(
 {
     std::unique_lock aGuard( m_pImpl->m_aMutex );
 
-    if ( !m_pImpl->m_pDisposeEventListeners )
-        m_pImpl->m_pDisposeEventListeners.reset(
-            new 
comphelper::OInterfaceContainerHelper4<lang::XEventListener>());
-
-    m_pImpl->m_pDisposeEventListeners->addInterface( Listener );
+    m_pImpl->m_aDisposeEventListeners.addInterface( Listener );
 }
 
 
@@ -277,8 +272,7 @@ void SAL_CALL ResultSet::removeEventListener(
 {
     std::unique_lock aGuard( m_pImpl->m_aMutex );
 
-    if ( m_pImpl->m_pDisposeEventListeners )
-        m_pImpl->m_pDisposeEventListeners->removeInterface( Listener );
+    m_pImpl->m_aDisposeEventListeners.removeInterface( Listener );
 }
 
 
diff --git a/ucbhelper/source/provider/resultsethelper.cxx 
b/ucbhelper/source/provider/resultsethelper.cxx
index 77c901d62ee7..25ead4bd8a22 100644
--- a/ucbhelper/source/provider/resultsethelper.cxx
+++ b/ucbhelper/source/provider/resultsethelper.cxx
@@ -90,11 +90,11 @@ void SAL_CALL ResultSetImplHelper::dispose()
 {
     std::unique_lock aGuard( m_aMutex );
 
-    if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
+    if ( m_aDisposeEventListeners.getLength() )
     {
         lang::EventObject aEvt;
         aEvt.Source = static_cast< lang::XComponent * >( this );
-        m_pDisposeEventListeners->disposeAndClear( aGuard, aEvt );
+        m_aDisposeEventListeners.disposeAndClear( aGuard, aEvt );
     }
 }
 
@@ -105,10 +105,7 @@ void SAL_CALL ResultSetImplHelper::addEventListener(
 {
     std::unique_lock aGuard( m_aMutex );
 
-    if ( !m_pDisposeEventListeners )
-        m_pDisposeEventListeners.reset(new 
comphelper::OInterfaceContainerHelper4<css::lang::XEventListener>());
-
-    m_pDisposeEventListeners->addInterface( Listener );
+    m_aDisposeEventListeners.addInterface( Listener );
 }
 
 
@@ -118,8 +115,7 @@ void SAL_CALL ResultSetImplHelper::removeEventListener(
 {
     std::unique_lock aGuard( m_aMutex );
 
-    if ( m_pDisposeEventListeners )
-        m_pDisposeEventListeners->removeInterface( Listener );
+    m_aDisposeEventListeners.removeInterface( Listener );
 }
 
 

Reply via email to