From 408f2a1c09a6563caf193384df8e1cac6e153fbb Mon Sep 17 00:00:00 2001 From: Vasily Melenchuk Date: Sun, 14 Jun 2020 14:47:57 +0300 Subject: tdf#133605: docx import: use ilvl value for list level import Previous implementation was not aware about ilvl value which declares a level number it is defining. So LO was able correctly handle only lists were levels are defined in increasing order starting from zero. Same problem was also with override lists: if we just override only one some random level (for example ilvl=2 in bugdoc) it was applied to level 0. Change-Id: If1f466fcbae0c82a8601e5b638e541d75aab665c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96268 Tested-by: Jenkins Reviewed-by: Thorsten Behrens --- writerfilter/source/dmapper/NumberingManager.cxx | 23 +++++++++++------------ writerfilter/source/dmapper/NumberingManager.hxx | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) (limited to 'writerfilter') diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index 713313fbba74..5a33327597c8 100644 --- a/writerfilter/source/dmapper/NumberingManager.cxx +++ b/writerfilter/source/dmapper/NumberingManager.cxx @@ -366,11 +366,14 @@ ListLevel::Pointer AbstractListDef::GetLevel( sal_uInt16 nLvl ) return pLevel; } -void AbstractListDef::AddLevel( ) +void AbstractListDef::AddLevel( sal_uInt16 nLvl ) { + if ( nLvl >= m_aLevels.size() ) + m_aLevels.resize( nLvl+1 ); + ListLevel::Pointer pLevel( new ListLevel ); m_pCurrentLevel = pLevel; - m_aLevels.push_back( pLevel ); + m_aLevels[nLvl] = pLevel; } uno::Sequence> AbstractListDef::GetPropertyValues(bool bDefaults) @@ -381,7 +384,8 @@ uno::Sequence> AbstractListDef::GetPropertyV int nLevels = m_aLevels.size( ); for ( int i = 0; i < nLevels; i++ ) { - aResult[i] = m_aLevels[i]->GetProperties(bDefaults); + if (m_aLevels[i]) + aResult[i] = m_aLevels[i]->GetProperties(bDefaults); } return result; @@ -700,14 +704,11 @@ void ListsManager::lcl_attribute( Id nName, Value& rVal ) AbstractListDef::SetValue( nName ); break; case NS_ooxml::LN_CT_NumLvl_ilvl: - { //add a new level to the level vector and make it the current one - m_pCurrentDefinition->AddLevel(); - - writerfilter::Reference::Pointer_t pProperties = rVal.getProperties(); - if(pProperties) - pProperties->resolve(*this); - } + m_pCurrentDefinition->AddLevel(rVal.getString().toInt32()); + break; + case NS_ooxml::LN_CT_Lvl_ilvl: + m_pCurrentDefinition->AddLevel(rVal.getString().toInt32()); break; case NS_ooxml::LN_CT_AbstractNum_abstractNumId: { @@ -733,7 +734,6 @@ void ListsManager::lcl_attribute( Id nName, Value& rVal ) pCurrentLvl->Insert( PROP_FIRST_LINE_INDENT, uno::makeAny( ConversionHelper::convertTwipToMM100( nIntValue ) )); break; - case NS_ooxml::LN_CT_Lvl_ilvl: //overrides previous level - unsupported case NS_ooxml::LN_CT_Lvl_tplc: //template code - unsupported case NS_ooxml::LN_CT_Lvl_tentative: //marks level as unused in the document - unsupported break; @@ -895,7 +895,6 @@ void ListsManager::lcl_sprm( Sprm& rSprm ) break; case NS_ooxml::LN_CT_AbstractNum_lvl: { - m_pCurrentDefinition->AddLevel(); writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); if(pProperties) pProperties->resolve(*this); diff --git a/writerfilter/source/dmapper/NumberingManager.hxx b/writerfilter/source/dmapper/NumberingManager.hxx index 6173f1431f0e..29f139082522 100644 --- a/writerfilter/source/dmapper/NumberingManager.hxx +++ b/writerfilter/source/dmapper/NumberingManager.hxx @@ -152,7 +152,7 @@ public: sal_Int16 Size( ) { return sal_Int16( m_aLevels.size( ) ); }; ListLevel::Pointer GetLevel( sal_uInt16 nLvl ); - void AddLevel( ); + void AddLevel( sal_uInt16 nLvl ); const ListLevel::Pointer& GetCurrentLevel( ) const { return m_pCurrentLevel; }; -- cgit