summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorVasily Melenchuk <vasily.melenchuk@cib.de>2020-06-14 14:47:57 +0300
committerVasily Melenchuk <vasily.melenchuk@cib.de>2020-06-17 09:21:53 +0200
commitc1d695d93125fbbd5999ee7f49a30a3360a90747 (patch)
tree6dd62d0f751140bd27cf02d41be07a7967168028 /writerfilter
parentcad5fe48d7a514daea6e5e413398fd42c70ce306 (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.cxx23
-rw-r--r--writerfilter/source/dmapper/NumberingManager.hxx2
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; };