diff options
author | Vasily Melenchuk <vasily.melenchuk@cib.de> | 2020-06-14 14:47:57 +0300 |
---|---|---|
committer | Vasily Melenchuk <vasily.melenchuk@cib.de> | 2020-06-17 09:21:53 +0200 |
commit | c1d695d93125fbbd5999ee7f49a30a3360a90747 (patch) | |
tree | 6dd62d0f751140bd27cf02d41be07a7967168028 /writerfilter | |
parent | cad5fe48d7a514daea6e5e413398fd42c70ce306 (diff) |
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 <Thorsten.Behrens@CIB.de>
(cherry picked from commit 408f2a1c09a6563caf193384df8e1cac6e153fbb)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96422
Reviewed-by: Vasily Melenchuk <vasily.melenchuk@cib.de>
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.cxx | 23 | ||||
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.hxx | 2 |
2 files changed, 12 insertions, 13 deletions
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index 309ca8f46d80..23ea3ebefbb7 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<uno::Sequence<beans::PropertyValue>> AbstractListDef::GetPropertyValues(bool bDefaults) @@ -381,7 +384,8 @@ uno::Sequence<uno::Sequence<beans::PropertyValue>> 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<Properties>::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<Properties>::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; }; |