summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorVasily Melenchuk <vasily.melenchuk@cib.de>2020-05-15 18:36:08 +0300
committerAndras Timar <andras.timar@collabora.com>2020-06-11 13:17:43 +0200
commit91f583f8e497506ad5146d9bc74b54af1853fafb (patch)
tree61f2fa00e3a65ee99f72b10b2becfd5e826b00d7 /writerfilter
parent1f81d22eef92bab7b8552fb57178bb408c681882 (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.cxx38
-rw-r--r--writerfilter/source/dmapper/NumberingManager.hxx6
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);
};