diff options
author | Vasily Melenchuk <vasily.melenchuk@cib.de> | 2020-05-15 18:36:08 +0300 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2020-06-11 13:17:43 +0200 |
commit | 91f583f8e497506ad5146d9bc74b54af1853fafb (patch) | |
tree | 61f2fa00e3a65ee99f72b10b2becfd5e826b00d7 /writerfilter | |
parent | 1f81d22eef92bab7b8552fb57178bb408c681882 (diff) |
tdf#120394: docx import: support for w:styleLink
Previous implementation for w:numStyleLink was referring
just ordinal styles, but there can be another abstract
list marked with w:styleLink which should be used in
given context.
Change-Id: Ic5d4fe8bfd41b19e2f65d74defb6961e38ec9a9d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94332
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95892
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.cxx | 38 | ||||
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.hxx | 6 |
2 files changed, 28 insertions, 16 deletions
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index 5a74e421a31b..be74368bfcf7 100644 --- a/writerfilter/source/dmapper/NumberingManager.cxx +++ b/writerfilter/source/dmapper/NumberingManager.cxx @@ -1068,6 +1068,12 @@ void ListsManager::lcl_sprm( Sprm& rSprm ) m_pCurrentDefinition->SetNumStyleLink(sStyleName); } break; + case NS_ooxml::LN_CT_AbstractNum_styleLink: + { + OUString sStyleName = rSprm.getValue()->getString(); + m_pCurrentDefinition->SetStyleLink(sStyleName); + } + break; case NS_ooxml::LN_EG_RPrBase_rFonts: //contains font properties case NS_ooxml::LN_EG_RPrBase_color: case NS_ooxml::LN_EG_RPrBase_u: @@ -1106,21 +1112,17 @@ void ListsManager::lcl_entry(writerfilter::Reference<Properties>::Pointer_t ref AbstractListDef::Pointer ListsManager::GetAbstractList( sal_Int32 nId ) { - AbstractListDef::Pointer pAbstractList; - - int nLen = m_aAbstractLists.size( ); - int i = 0; - while ( !pAbstractList.get( ) && i < nLen ) + for (const auto& listDef : m_aAbstractLists) { - if ( m_aAbstractLists[i]->GetId( ) == nId ) + if (listDef->GetId( ) == nId) { - if ( m_aAbstractLists[i]->GetNumStyleLink().getLength() > 0 ) + if (listDef->GetNumStyleLink().getLength() > 0) { // If the abstract num has a style linked, check the linked style's number id. StyleSheetTablePtr pStylesTable = m_rDMapper.GetStyleSheetTable( ); const StyleSheetEntryPtr pStyleSheetEntry = - pStylesTable->FindStyleSheetByISTD( m_aAbstractLists[i]->GetNumStyleLink() ); + pStylesTable->FindStyleSheetByISTD(listDef->GetNumStyleLink() ); const StyleSheetPropertyMap* pStyleSheetProperties = dynamic_cast<const StyleSheetPropertyMap*>(pStyleSheetEntry ? pStyleSheetEntry->pProperties.get() : nullptr); @@ -1130,20 +1132,24 @@ AbstractListDef::Pointer ListsManager::GetAbstractList( sal_Int32 nId ) ListDef::Pointer pList = GetList( pStyleSheetProperties->GetNumId() ); if ( pList!=nullptr ) return pList->GetAbstractDefinition(); - else - pAbstractList = m_aAbstractLists[i]; } + // In stylesheet we did not found anything useful. Try to find base abstractnum having this stylelink + for (const auto & baseListDef : m_aAbstractLists) + { + if (baseListDef->GetStyleLink() == listDef->GetNumStyleLink()) + { + return baseListDef; + } + } } - else - { - pAbstractList = m_aAbstractLists[i]; - } + + // Standalone abstract list + return listDef; } - i++; } - return pAbstractList; + return nullptr; } ListDef::Pointer ListsManager::GetList( sal_Int32 nId ) diff --git a/writerfilter/source/dmapper/NumberingManager.hxx b/writerfilter/source/dmapper/NumberingManager.hxx index 88ce887869a1..3d70257029f4 100644 --- a/writerfilter/source/dmapper/NumberingManager.hxx +++ b/writerfilter/source/dmapper/NumberingManager.hxx @@ -133,6 +133,9 @@ private: // The style name linked to. OUString m_sNumStyleLink; + // This absract numbering is a base definition for this style + OUString m_sStyleLink; + /// list id to use for all derived numbering definitions boost::optional<OUString> m_oListId; @@ -160,6 +163,9 @@ public: void SetNumStyleLink(const OUString& sValue) { m_sNumStyleLink = sValue; }; const OUString& GetNumStyleLink() const { return m_sNumStyleLink; }; + void SetStyleLink(const OUString& sValue) { m_sStyleLink = sValue; }; + const OUString& GetStyleLink() const { return m_sStyleLink; }; + const OUString& MapListId(OUString const& rId); }; |