sw/inc/calbck.hxx                               |    7 +++++++
 sw/inc/swtable.hxx                              |    3 +++
 sw/source/filter/xml/XMLRedlineImportHelper.cxx |    2 +-
 sw/source/filter/xml/xmlfmt.cxx                 |    8 ++++----
 sw/source/filter/xml/xmlimp.cxx                 |   12 +-----------
 sw/source/filter/xml/xmlimp.hxx                 |    4 ----
 sw/source/filter/xml/xmlmeta.cxx                |    2 +-
 sw/source/filter/xml/xmltbli.cxx                |    4 ++--
 sw/source/filter/xml/xmltexti.cxx               |    4 ++--
 9 files changed, 21 insertions(+), 25 deletions(-)

New commits:
commit 2c4aabb220ad1e8f1cbc75f2361fe17893d7cc29
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Sat Oct 29 11:11:36 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sat Oct 29 18:10:42 2022 +0200

    tdf#126788 speed up GetDocFromXMLImport
    
    we can just static_cast to SwXMLImport, no need to use XUnoTunnel
    
    Change-Id: I5ca1a1e2d63ae632578261630f67c9d164727cef
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142016
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/source/filter/xml/XMLRedlineImportHelper.cxx 
b/sw/source/filter/xml/XMLRedlineImportHelper.cxx
index e681f2025b6c..5b7b008129b5 100644
--- a/sw/source/filter/xml/XMLRedlineImportHelper.cxx
+++ b/sw/source/filter/xml/XMLRedlineImportHelper.cxx
@@ -343,7 +343,7 @@ XMLRedlineImportHelper::~XMLRedlineImportHelper()
             aAny <<= true;
             m_xModelPropertySet->setPropertyValue( g_sShowChanges, aAny );
             // TODO maybe we need some property for the view-setting?
-            SwDoc *const pDoc(SwImport::GetDocFromXMLImport(m_rImport));
+            SwDoc *const pDoc(static_cast<SwXMLImport&>(m_rImport).getDoc());
             assert(pDoc);
             pDoc->GetDocumentRedlineManager().SetHideRedlines(!m_bShowChanges);
         }
diff --git a/sw/source/filter/xml/xmlfmt.cxx b/sw/source/filter/xml/xmlfmt.cxx
index ac12df0779bf..8d21591e12b9 100644
--- a/sw/source/filter/xml/xmlfmt.cxx
+++ b/sw/source/filter/xml/xmlfmt.cxx
@@ -525,7 +525,7 @@ SvXMLImportContext 
*SwXMLItemSetStyleContext_Impl::CreateItemSetContext(
 
     SvXMLImportContext *pContext = nullptr;
 
-    SwDoc* pDoc = SwImport::GetDocFromXMLImport( GetSwImport() );
+    SwDoc* pDoc = GetSwImport().getDoc();
 
     SfxItemPool& rItemPool = pDoc->GetAttrPool();
     switch( GetFamily() )
@@ -615,7 +615,7 @@ void SwXMLItemSetStyleContext_Impl::ConnectPageDesc()
         return;
     m_bPageDescConnected = true;
 
-    SwDoc *pDoc = SwImport::GetDocFromXMLImport( GetSwImport() );
+    SwDoc *pDoc = GetSwImport().getDoc();
 
     // #i40788# - first determine the display name of the page style,
     // then map this name to the corresponding user interface name.
@@ -673,7 +673,7 @@ bool SwXMLItemSetStyleContext_Impl::ResolveDataStyleName()
         {
             if( !m_oItemSet )
             {
-                SwDoc *pDoc = SwImport::GetDocFromXMLImport( GetSwImport() );
+                SwDoc *pDoc = GetSwImport().getDoc();
 
                 SfxItemPool& rItemPool = pDoc->GetAttrPool();
                 m_oItemSet.emplace( rItemPool, aTableBoxSetRange );
@@ -1006,7 +1006,7 @@ void SwXMLImport::FinishStyles()
 void SwXMLImport::UpdateTextCollConditions( SwDoc *pDoc )
 {
     if( !pDoc )
-        pDoc = SwImport::GetDocFromXMLImport( *this );
+        pDoc = getDoc();
 
     const SwTextFormatColls& rColls = *pDoc->GetTextFormatColls();
     const size_t nCount = rColls.size();
diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx
index 62263ce2737f..1fa30ceedfdd 100644
--- a/sw/source/filter/xml/xmlimp.cxx
+++ b/sw/source/filter/xml/xmlimp.cxx
@@ -828,7 +828,7 @@ void SwXMLImport::endDocument()
     // tdf#150753: pDoc may be null e.g. when the package lacks content.xml;
     // we should not forget to tidy up here, including unlocking draw model
     if (!pDoc)
-        pDoc = SwImport::GetDocFromXMLImport(*this);
+        pDoc = getDoc();
     assert(pDoc);
     // SJ: #i49801# -> now permitting repaints
     if (getImportFlags() == SvXMLImportFlags::ALL)
@@ -1632,16 +1632,6 @@ void SwXMLImport::initialize(
     }
 }
 
-SwDoc* SwImport::GetDocFromXMLImport( SvXMLImport const & rImport )
-{
-    auto pTextDoc = 
comphelper::getFromUnoTunnel<SwXTextDocument>(rImport.GetModel());
-    assert( pTextDoc );
-    assert( pTextDoc->GetDocShell() );
-    SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
-    OSL_ENSURE( pDoc, "Where is my document?" );
-    return pDoc;
-}
-
 void SwXMLImport::initXForms()
 {
     // obtain SwDoc
diff --git a/sw/source/filter/xml/xmlimp.hxx b/sw/source/filter/xml/xmlimp.hxx
index d5e988badeb7..22f012c4dbfc 100644
--- a/sw/source/filter/xml/xmlimp.hxx
+++ b/sw/source/filter/xml/xmlimp.hxx
@@ -48,10 +48,6 @@ enum class SfxStyleFamily;
 // for styles, autostyles and settings + meta
 #define PROGRESS_BAR_STEP 20
 
-namespace SwImport {
-    SwDoc* GetDocFromXMLImport( SvXMLImport const & );
-}
-
 // we only need this scoped enum to be flags here, in sw
 namespace o3tl
 {
diff --git a/sw/source/filter/xml/xmlmeta.cxx b/sw/source/filter/xml/xmlmeta.cxx
index 69d07702aa8f..925fea5d9aea 100644
--- a/sw/source/filter/xml/xmlmeta.cxx
+++ b/sw/source/filter/xml/xmlmeta.cxx
@@ -109,7 +109,7 @@ void SwXMLImport::SetStatistics(
 
     SvXMLImport::SetStatistics(i_rStats);
 
-    SwDoc *pDoc = SwImport::GetDocFromXMLImport( *this );
+    SwDoc *pDoc = getDoc();
     SwDocStat aDocStat( pDoc->getIDocumentStatistics().GetDocStat() );
 
     sal_uInt32 nTokens = 0;
diff --git a/sw/source/filter/xml/xmltbli.cxx b/sw/source/filter/xml/xmltbli.cxx
index b2fed3e3376f..e53be9b8ff4f 100644
--- a/sw/source/filter/xml/xmltbli.cxx
+++ b/sw/source/filter/xml/xmltbli.cxx
@@ -1166,7 +1166,7 @@ SwXMLTableContext::SwXMLTableContext( SwXMLImport& 
rImport,
         }
     }
 
-    SwDoc *pDoc = SwImport::GetDocFromXMLImport( GetSwImport() );
+    SwDoc *pDoc = GetSwImport().getDoc();
 
     OUString sTableName;
     if( !aName.isEmpty() )
@@ -2687,7 +2687,7 @@ const SwStartNode *SwXMLTableContext::InsertTableSection(
     }
     else
     {
-        SwDoc* pDoc = SwImport::GetDocFromXMLImport( GetSwImport() );
+        SwDoc* pDoc = GetSwImport().getDoc();
         const SwEndNode *pEndNd = pPrevSttNd ? pPrevSttNd->EndOfSectionNode()
                                              : 
m_pTableNode->EndOfSectionNode();
         // #i78921# - make code robust
diff --git a/sw/source/filter/xml/xmltexti.cxx 
b/sw/source/filter/xml/xmltexti.cxx
index 8c88e8a8b13c..7ec4616f76dd 100644
--- a/sw/source/filter/xml/xmltexti.cxx
+++ b/sw/source/filter/xml/xmltexti.cxx
@@ -220,7 +220,7 @@ uno::Reference< XPropertySet > 
SwXMLTextImportHelper::createAndInsertOLEObject(
     assert(xCursorTunnel.is() && "missing XUnoTunnel for Cursor");
     OTextCursorHelper* pTextCursor = 
comphelper::getFromUnoTunnel<OTextCursorHelper>(xCursorTunnel);
     SAL_WARN_IF(!pTextCursor, "sw.uno", "SwXTextCursor missing");
-    SwDoc *pDoc = SwImport::GetDocFromXMLImport( rImport );
+    SwDoc *pDoc = static_cast<SwXMLImport&>(rImport).getDoc();
 
     SfxItemSetFixed<RES_FRMATR_BEGIN, RES_FRMATR_END> aItemSet( 
pDoc->GetAttrPool() );
     Size aTwipSize( 0, 0 );
@@ -522,7 +522,7 @@ uno::Reference< XPropertySet > 
SwXMLTextImportHelper::createAndInsertOOoLink(
     assert(xCursorTunnel.is() && "missing XUnoTunnel for Cursor");
     OTextCursorHelper* pTextCursor = 
comphelper::getFromUnoTunnel<OTextCursorHelper>(xCursorTunnel);
     OSL_ENSURE( pTextCursor, "SwXTextCursor missing" );
-    SwDoc *pDoc = SwImport::GetDocFromXMLImport( rImport );
+    SwDoc *pDoc = static_cast<SwXMLImport&>(rImport).getDoc();
 
     SfxItemSetFixed<RES_FRMATR_BEGIN, RES_FRMATR_END> aItemSet( 
pDoc->GetAttrPool() );
     Size aTwipSize( 0, 0 );
commit f2ec354bf4f535132d34b206382cceb22ec7f43c
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Sat Oct 29 11:09:40 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sat Oct 29 18:10:32 2022 +0200

    tdf#126788 dynamic_cast -> virtual call
    
    use a virtual method to speed up dynamic_cast to SwTable node
    
    Change-Id: I0e8eb8d671ac7aa1d15f1f4b37fb4c17220fafca
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142014
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 5359973a86d2..26dcd2566fc1 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -38,6 +38,7 @@ class SwAttrSet;
 class SwCellFrame;
 class SwTabFrame;
 class SwRowFrame;
+class SwTable;
 
 /*
     SwModify and SwClient cooperate in propagating attribute changes.
@@ -123,6 +124,7 @@ namespace sw
             virtual const SwCellFrame* DynCastCellFrame() const { return 
nullptr; }
             virtual const SwTabFrame* DynCastTabFrame() const { return 
nullptr; }
             virtual const SwRowFrame* DynCastRowFrame() const { return 
nullptr; }
+            virtual const SwTable* DynCastTable() const { return nullptr; }
     };
     enum class IteratorMode { Exact, UnwrapMulti };
 }
@@ -328,6 +330,11 @@ namespace sw::detail
         return dynamic_cast<const CastDest *>(pSource);
     }
     template<>
+    inline const SwTable* internal_dyn_cast(const sw::WriterListener * pSource)
+    {
+        return pSource->DynCastTable();
+    }
+    template<>
     inline const SwCellFrame* internal_dyn_cast(const sw::WriterListener * 
pSource)
     {
         return pSource->DynCastCellFrame();
diff --git a/sw/inc/swtable.hxx b/sw/inc/swtable.hxx
index e750ee02bd4d..49f5bf8418af 100644
--- a/sw/inc/swtable.hxx
+++ b/sw/inc/swtable.hxx
@@ -154,6 +154,9 @@ public:
 
     // @@@ public copy ctor, but no copy assignment?
     SwTable( const SwTable& rTable );       // no copy of the lines !!
+
+    virtual const SwTable* DynCastTable() const override { return this; }
+
 private:
     // @@@ public copy ctor, but no copy assignment?
     SwTable & operator= (const SwTable &) = delete;

Reply via email to