diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-08-19 15:43:31 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-08-20 12:02:55 +0200 |
commit | 6fea13e7a10272922ffdf74b65add10ecf8cec38 (patch) | |
tree | da51f9e7b05fbb9520f93e9bfa137acda0caa0df /writerfilter | |
parent | fd2a8fc9651037263069aa5f0f97c205d8fc4a1c (diff) |
tdf#76260 cache next page style number
to speed up loading document with lots of footnotes.
Takes the load time from 29s to 27.3s for me
Change-Id: I911e4a7d7db8a2cdff1271d04e5535e76fd137a0
Reviewed-on: https://gerrit.libreoffice.org/77778
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 35 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 5 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.cxx | 65 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.hxx | 7 |
4 files changed, 55 insertions, 57 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 7df87958becf..f69073781964 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -303,15 +303,41 @@ DomainMapper_Impl::~DomainMapper_Impl() uno::Reference< container::XNameContainer > const & DomainMapper_Impl::GetPageStyles() { - if(!m_xPageStyles.is()) + if(!m_xPageStyles1.is()) { uno::Reference< style::XStyleFamiliesSupplier > xSupplier( m_xTextDocument, uno::UNO_QUERY ); if (xSupplier.is()) - xSupplier->getStyleFamilies()->getByName("PageStyles") >>= m_xPageStyles; + xSupplier->getStyleFamilies()->getByName("PageStyles") >>= m_xPageStyles1; } - return m_xPageStyles; + return m_xPageStyles1; } +OUString DomainMapper_Impl::GetUnusedPageStyleName() +{ + static const char DEFAULT_STYLE[] = "Converted"; + if (!m_xNextUnusedPageStyleNo) + { + const uno::Sequence< OUString > aPageStyleNames = GetPageStyles()->getElementNames(); + sal_Int32 nMaxIndex = 0; + // find the highest number x in each style with the name "DEFAULT_STYLE+x" and + // return an incremented name + + for ( const auto& rStyleName : aPageStyleNames ) + { + if ( rStyleName.startsWith( DEFAULT_STYLE ) ) + { + sal_Int32 nIndex = rStyleName.copy( strlen( DEFAULT_STYLE ) ).toInt32(); + if ( nIndex > nMaxIndex ) + nMaxIndex = nIndex; + } + } + m_xNextUnusedPageStyleNo = nMaxIndex + 1; + } + + OUString sPageStyleName = DEFAULT_STYLE + OUString::number( *m_xNextUnusedPageStyleNo ); + *m_xNextUnusedPageStyleNo = *m_xNextUnusedPageStyleNo + 1; + return sPageStyleName; +} uno::Reference< text::XText > const & DomainMapper_Impl::GetBodyText() { @@ -1942,8 +1968,7 @@ void DomainMapper_Impl::PushPageHeaderFooter(bool bHeader, SectionPropertyMap::P uno::Reference< beans::XPropertySet > xPageStyle = pSectionContext->GetPageStyle( - GetPageStyles(), - m_xTextFactory, + *this, eType == SectionPropertyMap::PAGE_FIRST ); if (!xPageStyle.is()) return; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 0d2e5cd17f83..c027faea1d60 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -411,7 +411,9 @@ private: css::uno::Reference<css::beans::XPropertySet> m_xDocumentSettings; css::uno::Reference<css::lang::XMultiServiceFactory> m_xTextFactory; css::uno::Reference<css::uno::XComponentContext> m_xComponentContext; - css::uno::Reference<css::container::XNameContainer> m_xPageStyles; + css::uno::Reference<css::container::XNameContainer> m_xPageStyles1; + // cache next available number, expensive to repeatedly compute + boost::optional<int> m_xNextUnusedPageStyleNo; css::uno::Reference<css::text::XText> m_xBodyText; css::uno::Reference<css::text::XTextContent> m_xEmbedded; @@ -564,6 +566,7 @@ public: } css::uno::Reference<css::container::XNameContainer> const & GetPageStyles(); + OUString GetUnusedPageStyleName(); css::uno::Reference<css::text::XText> const & GetBodyText(); const css::uno::Reference<css::lang::XMultiServiceFactory>& GetTextFactory() const { diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index 1cd31bb56954..395ab2e1be99 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -442,30 +442,11 @@ SectionPropertyMap::SectionPropertyMap( bool bIsFirstSection ) } } -static OUString lcl_FindUnusedPageStyleName( const uno::Sequence< OUString >& rPageStyleNames ) -{ - static const char DEFAULT_STYLE[] = "Converted"; - sal_Int32 nMaxIndex = 0; - // find the highest number x in each style with the name "DEFAULT_STYLE+x" and - // return an incremented name - - for ( const auto& rStyleName : rPageStyleNames ) - { - if ( rStyleName.startsWith( DEFAULT_STYLE ) ) - { - sal_Int32 nIndex = rStyleName.copy( strlen( DEFAULT_STYLE ) ).toInt32(); - if ( nIndex > nMaxIndex ) - nMaxIndex = nIndex; - } - } - - return DEFAULT_STYLE + OUString::number( nMaxIndex + 1 ); -} - -uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const uno::Reference< container::XNameContainer >& xPageStyles, - const uno::Reference < lang::XMultiServiceFactory >& xTextFactory, +uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( DomainMapper_Impl& rDM_Impl, bool bFirst ) { + const uno::Reference< container::XNameContainer >& xPageStyles = rDM_Impl.GetPageStyles(); + const uno::Reference < lang::XMultiServiceFactory >& xTextFactory = rDM_Impl.GetTextFactory(); uno::Reference< beans::XPropertySet > xRet; try { @@ -473,8 +454,7 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const un { if ( m_sFirstPageStyleName.isEmpty() && xPageStyles.is() ) { - uno::Sequence< OUString > aPageStyleNames = xPageStyles->getElementNames(); - m_sFirstPageStyleName = lcl_FindUnusedPageStyleName( aPageStyleNames ); + m_sFirstPageStyleName = rDM_Impl.GetUnusedPageStyleName(); m_aFirstPageStyle.set( xTextFactory->createInstance( "com.sun.star.style.PageStyle" ), uno::UNO_QUERY ); @@ -485,7 +465,7 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const un xPageStyles->insertByName( m_sFirstPageStyleName, uno::makeAny( m_aFirstPageStyle ) ); // Ensure that m_aFollowPageStyle has been created - GetPageStyle( xPageStyles, xTextFactory, false ); + GetPageStyle( rDM_Impl, false ); // Chain m_aFollowPageStyle to be after m_aFirstPageStyle m_aFirstPageStyle->setPropertyValue( "FollowStyle", uno::makeAny( m_sFollowPageStyleName ) ); @@ -500,8 +480,7 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( const un { if ( m_sFollowPageStyleName.isEmpty() && xPageStyles.is() ) { - uno::Sequence< OUString > aPageStyleNames = xPageStyles->getElementNames(); - m_sFollowPageStyleName = lcl_FindUnusedPageStyleName( aPageStyleNames ); + m_sFollowPageStyleName = rDM_Impl.GetUnusedPageStyleName(); m_aFollowPageStyle.set( xTextFactory->createInstance( "com.sun.star.style.PageStyle" ), uno::UNO_QUERY ); xPageStyles->insertByName( m_sFollowPageStyleName, uno::makeAny( m_aFollowPageStyle ) ); @@ -529,8 +508,7 @@ void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance m_bBorderShadows[ePos] = bShadow; } -void SectionPropertyMap::ApplyBorderToPageStyles( const uno::Reference< container::XNameContainer >& xPageStyles, - const uno::Reference < lang::XMultiServiceFactory >& xTextFactory, +void SectionPropertyMap::ApplyBorderToPageStyles( DomainMapper_Impl& rDM_Impl, BorderApply eBorderApply, BorderOffsetFrom eOffsetFrom ) { /* @@ -553,17 +531,17 @@ void SectionPropertyMap::ApplyBorderToPageStyles( const uno::Reference< containe { case BorderApply::ToAllInSection: // all styles if ( !m_sFollowPageStyleName.isEmpty() ) - xFirst = GetPageStyle( xPageStyles, xTextFactory, false ); + xFirst = GetPageStyle( rDM_Impl, false ); if ( !m_sFirstPageStyleName.isEmpty() ) - xSecond = GetPageStyle( xPageStyles, xTextFactory, true ); + xSecond = GetPageStyle( rDM_Impl, true ); break; case BorderApply::ToFirstPageInSection: // first page if ( !m_sFirstPageStyleName.isEmpty() ) - xFirst = GetPageStyle( xPageStyles, xTextFactory, true ); + xFirst = GetPageStyle( rDM_Impl, true ); break; case BorderApply::ToAllButFirstInSection: // left and right if ( !m_sFollowPageStyleName.isEmpty() ) - xFirst = GetPageStyle( xPageStyles, xTextFactory, false ); + xFirst = GetPageStyle( rDM_Impl, false ); break; default: return; @@ -924,11 +902,9 @@ void SectionPropertyMap::CopyLastHeaderFooter( bool bFirstPage, DomainMapper_Imp SectionPropertyMap* pLastContext = rDM_Impl.GetLastSectionContext(); if ( pLastContext ) { - uno::Reference< beans::XPropertySet > xPrevStyle = pLastContext->GetPageStyle( rDM_Impl.GetPageStyles(), - rDM_Impl.GetTextFactory(), + uno::Reference< beans::XPropertySet > xPrevStyle = pLastContext->GetPageStyle( rDM_Impl, bFirstPage ); - uno::Reference< beans::XPropertySet > xStyle = GetPageStyle( rDM_Impl.GetPageStyles(), - rDM_Impl.GetTextFactory(), + uno::Reference< beans::XPropertySet > xStyle = GetPageStyle( rDM_Impl, bFirstPage ); if ( bFirstPage ) @@ -1210,9 +1186,6 @@ bool SectionPropertyMap::FloatingTableConversion( DomainMapper_Impl& rDM_Impl, F void SectionPropertyMap::InheritOrFinalizePageStyles( DomainMapper_Impl& rDM_Impl ) { - const uno::Reference< container::XNameContainer >& xPageStyles = rDM_Impl.GetPageStyles(); - const uno::Reference < lang::XMultiServiceFactory >& xTextFactory = rDM_Impl.GetTextFactory(); - // if no new styles have been created for this section, inherit from the previous section, // otherwise apply this section's settings to the new style. // Ensure that FollowPage is inherited first - otherwise GetPageStyle may auto-create a follow when checking FirstPage. @@ -1223,7 +1196,7 @@ void SectionPropertyMap::InheritOrFinalizePageStyles( DomainMapper_Impl& rDM_Imp else { HandleMarginsHeaderFooter( /*bFirst=*/false, rDM_Impl ); - GetPageStyle( xPageStyles, xTextFactory, /*bFirst=*/false ); + GetPageStyle( rDM_Impl, /*bFirst=*/false ); if ( rDM_Impl.IsNewDoc() && m_aFollowPageStyle.is() ) ApplyProperties_( m_aFollowPageStyle ); } @@ -1234,7 +1207,7 @@ void SectionPropertyMap::InheritOrFinalizePageStyles( DomainMapper_Impl& rDM_Imp else { HandleMarginsHeaderFooter( /*bFirst=*/true, rDM_Impl ); - GetPageStyle( xPageStyles, xTextFactory, /*bFirst=*/true ); + GetPageStyle( rDM_Impl, /*bFirst=*/true ); if ( rDM_Impl.IsNewDoc() && m_aFirstPageStyle.is() ) ApplyProperties_( m_aFirstPageStyle ); @@ -1446,7 +1419,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) ApplyProtectionProperties( xSection, rDM_Impl ); //get the properties and create appropriate page styles - uno::Reference< beans::XPropertySet > xFollowPageStyle = GetPageStyle( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), false ); + uno::Reference< beans::XPropertySet > xFollowPageStyle = GetPageStyle( rDM_Impl, false ); HandleMarginsHeaderFooter(/*bFirstPage=*/false, rDM_Impl ); @@ -1567,7 +1540,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) CopyLastHeaderFooter( true, rDM_Impl ); PrepareHeaderFooterProperties( true ); uno::Reference< beans::XPropertySet > xFirstPageStyle = GetPageStyle( - rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), true ); + rDM_Impl, true ); if ( rDM_Impl.IsNewDoc() ) ApplyProperties_( xFirstPageStyle ); @@ -1576,7 +1549,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) getPropertyName( PROP_TEXT_COLUMNS ), uno::makeAny( xColumns ) ); } - ApplyBorderToPageStyles( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), m_eBorderApply, m_eBorderOffsetFrom ); + ApplyBorderToPageStyles( rDM_Impl, m_eBorderApply, m_eBorderOffsetFrom ); try { @@ -1589,7 +1562,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) if ( m_nBreakType == static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_evenPage) || m_nBreakType == static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_oddPage) ) { OUString* pageStyle = m_bTitlePage ? &m_sFirstPageStyleName : &m_sFollowPageStyleName; - OUString evenOddStyleName = lcl_FindUnusedPageStyleName( rDM_Impl.GetPageStyles()->getElementNames() ); + OUString evenOddStyleName = rDM_Impl.GetUnusedPageStyleName(); uno::Reference< beans::XPropertySet > evenOddStyle( rDM_Impl.GetTextFactory()->createInstance( "com.sun.star.style.PageStyle" ), uno::UNO_QUERY ); diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index 7d994f024a83..af8bb6842e38 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -317,9 +317,7 @@ public: const css::uno::Reference< css::text::XTextRange >& GetStartingRange() const { return m_xStartingRange; } - css::uno::Reference< css::beans::XPropertySet > GetPageStyle( const css::uno::Reference< css::container::XNameContainer >& xStyles, - const css::uno::Reference< css::lang::XMultiServiceFactory >& xTextFactory, - bool bFirst ); + css::uno::Reference< css::beans::XPropertySet > GetPageStyle( DomainMapper_Impl& rDM_Impl, bool bFirst ); const OUString& GetPageStyleName( bool bFirstPage = false ) { @@ -376,8 +374,7 @@ public: void addRelativeWidthShape( css::uno::Reference<css::drawing::XShape> xShape ) { m_xRelativeWidthShapes.push_back( xShape ); } // determine which style gets the borders - void ApplyBorderToPageStyles( const css::uno::Reference< css::container::XNameContainer >& xStyles, - const css::uno::Reference< css::lang::XMultiServiceFactory >& xTextFactory, + void ApplyBorderToPageStyles( DomainMapper_Impl &rDM_Impl, BorderApply eBorderApply, BorderOffsetFrom eOffsetFrom ); void CloseSectionGroup( DomainMapper_Impl& rDM_Impl ); |