summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-08-19 15:43:31 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-08-20 12:02:55 +0200
commit6fea13e7a10272922ffdf74b65add10ecf8cec38 (patch)
treeda51f9e7b05fbb9520f93e9bfa137acda0caa0df /writerfilter
parentfd2a8fc9651037263069aa5f0f97c205d8fc4a1c (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.cxx35
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx5
-rw-r--r--writerfilter/source/dmapper/PropertyMap.cxx65
-rw-r--r--writerfilter/source/dmapper/PropertyMap.hxx7
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 );