sw/qa/extras/ooxmlexport/data/tdf114703.docx     |binary
 sw/qa/extras/ooxmlexport/ooxmlexport11.cxx       |   12 +++++++++
 writerfilter/source/dmapper/NumberingManager.cxx |   28 +++++++++++++----------
 writerfilter/source/dmapper/NumberingManager.hxx |    8 +++---
 4 files changed, 32 insertions(+), 16 deletions(-)

New commits:
commit d9fcc98c2d7d072d1a99c7c8b59806715a393a4f
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Mon Jan 8 22:59:21 2018 +0100

    tdf#114703 DOCX import: apply num defaults only to abstract nums
    
    Numbering definitions have two levels: abstract ones and overrides. The
    full definition is a merge of the two. Make sure that when defaults are
    added to the numbering level properties, these are only added for
    abstract ones, otherwise overriding e.g. the start value of a level will
    also pull in other, unwanted default properties.
    
    (cherry picked from commit a6ec829055ab0b9d223979ae5f90d158d5549db1)
    
    Conflicts:
            sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
    
    Change-Id: If0273ebc6b49476df17b09d636489a3bfb717334
    Reviewed-on: https://gerrit.libreoffice.org/47653
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Michael Stahl <mst...@redhat.com>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf114703.docx 
b/sw/qa/extras/ooxmlexport/data/tdf114703.docx
new file mode 100644
index 000000000000..116b56a2b42f
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf114703.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
index a5f808f070b3..700c69b225c3 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
@@ -136,6 +136,18 @@ DECLARE_OOXMLEXPORT_TEST(testTdf113399, "tdf113399.doc")
     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nPaddingValue);
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf114703, "tdf114703.docx")
+{
+    uno::Reference<container::XIndexAccess> xRules
+        = getProperty<uno::Reference<container::XIndexAccess>>(
+            getStyles("NumberingStyles")->getByName("WWNum1"), 
"NumberingRules");
+    // This was 0, level override "default" replaced the non-default value from
+    // the abstract level.
+    CPPUNIT_ASSERT_EQUAL(
+        static_cast<sal_Int32>(-1000),
+        
comphelper::SequenceAsHashMap(xRules->getByIndex(0))["FirstLineIndent"].get<sal_Int32>());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx 
b/writerfilter/source/dmapper/NumberingManager.cxx
index 809717e62659..273501e6ccc6 100644
--- a/writerfilter/source/dmapper/NumberingManager.cxx
+++ b/writerfilter/source/dmapper/NumberingManager.cxx
@@ -191,9 +191,9 @@ sal_Int16 ListLevel::GetParentNumbering( const OUString& 
sText, sal_Int16 nLevel
     return nParentNumbering;
 }
 
-uno::Sequence< beans::PropertyValue > ListLevel::GetProperties( )
+uno::Sequence<beans::PropertyValue> ListLevel::GetProperties(bool bDefaults)
 {
-    uno::Sequence< beans::PropertyValue > aLevelProps = GetLevelProperties( );
+    uno::Sequence<beans::PropertyValue> aLevelProps = 
GetLevelProperties(bDefaults);
     if ( m_pParaStyle.get( ) )
         AddParaProperties( &aLevelProps );
     return aLevelProps;
@@ -233,7 +233,7 @@ uno::Sequence< beans::PropertyValue > 
ListLevel::GetCharStyleProperties( )
     return comphelper::containerToSequence(rProperties);
 }
 
-uno::Sequence< beans::PropertyValue > ListLevel::GetLevelProperties( )
+uno::Sequence<beans::PropertyValue> ListLevel::GetLevelProperties(bool 
bDefaults)
 {
     const sal_Int16 aWWToUnoAdjust[] =
     {
@@ -286,7 +286,8 @@ uno::Sequence< beans::PropertyValue > 
ListLevel::GetLevelProperties( )
         }
     }
 
-    aNumberingProperties.push_back(lcl_makePropVal(PROP_LISTTAB_STOP_POSITION, 
m_nTabstop));
+    if (bDefaults || m_nTabstop != 0)
+        
aNumberingProperties.push_back(lcl_makePropVal(PROP_LISTTAB_STOP_POSITION, 
m_nTabstop));
 
     //TODO: handling of nFLegal?
     //TODO: nFNoRestart lower levels do not restart when higher levels are 
incremented, like:
@@ -299,7 +300,8 @@ uno::Sequence< beans::PropertyValue > 
ListLevel::GetLevelProperties( )
 //    TODO: sRGBXchNums;     array of inherited numbers
 
 //  nXChFollow; following character 0 - tab, 1 - space, 2 - nothing
-    aNumberingProperties.push_back(lcl_makePropVal(PROP_LEVEL_FOLLOW, 
m_nXChFollow));
+    if (bDefaults || m_nXChFollow != SvxNumberFormat::LISTTAB)
+        aNumberingProperties.push_back(lcl_makePropVal(PROP_LEVEL_FOLLOW, 
m_nXChFollow));
 
     PropertyIds const aReadIds[] =
     {
@@ -310,7 +312,7 @@ uno::Sequence< beans::PropertyValue > 
ListLevel::GetLevelProperties( )
         boost::optional<PropertyMap::Property> aProp = getProperty(rReadId);
         if (aProp)
             aNumberingProperties.emplace_back( getPropertyName(aProp->first), 
0, aProp->second, beans::PropertyState_DIRECT_VALUE );
-        else if (rReadId == PROP_FIRST_LINE_INDENT)
+        else if (rReadId == PROP_FIRST_LINE_INDENT && bDefaults)
             // Writer default is -360 twips, Word default seems to be 0.
             aNumberingProperties.emplace_back("FirstLineIndent", 0, 
uno::makeAny(static_cast<sal_Int32>(0)), beans::PropertyState_DIRECT_VALUE);
     }
@@ -424,7 +426,7 @@ void AbstractListDef::AddLevel( )
     m_aLevels.push_back( pLevel );
 }
 
-uno::Sequence< uno::Sequence< beans::PropertyValue > > 
AbstractListDef::GetPropertyValues( )
+uno::Sequence<uno::Sequence<beans::PropertyValue>> 
AbstractListDef::GetPropertyValues(bool bDefaults)
 {
     uno::Sequence< uno::Sequence< beans::PropertyValue > > result( sal_Int32( 
m_aLevels.size( ) ) );
     uno::Sequence< beans::PropertyValue >* aResult = result.getArray( );
@@ -432,7 +434,7 @@ uno::Sequence< uno::Sequence< beans::PropertyValue > > 
AbstractListDef::GetPrope
     int nLevels = m_aLevels.size( );
     for ( int i = 0; i < nLevels; i++ )
     {
-        aResult[i] = m_aLevels[i]->GetProperties( );
+        aResult[i] = m_aLevels[i]->GetProperties(bDefaults);
     }
 
     return result;
@@ -456,16 +458,18 @@ OUString ListDef::GetStyleName( sal_Int32 nId )
     return sStyleName;
 }
 
-uno::Sequence< uno::Sequence< beans::PropertyValue > > 
ListDef::GetPropertyValues( )
+uno::Sequence<uno::Sequence<beans::PropertyValue>> 
ListDef::GetMergedPropertyValues()
 {
     if (!m_pAbstractDef)
         return uno::Sequence< uno::Sequence< beans::PropertyValue > >();
 
     // [1] Call the same method on the abstract list
-    uno::Sequence< uno::Sequence< beans::PropertyValue > > aAbstract = 
m_pAbstractDef->GetPropertyValues( );
+    uno::Sequence<uno::Sequence<beans::PropertyValue>> aAbstract
+        = m_pAbstractDef->GetPropertyValues(/*bDefaults=*/true);
 
     // [2] Call the upper class method
-    uno::Sequence< uno::Sequence< beans::PropertyValue > > aThis = 
AbstractListDef::GetPropertyValues( );
+    uno::Sequence<uno::Sequence<beans::PropertyValue>> aThis
+        = AbstractListDef::GetPropertyValues(/*bDefaults=*/false);
 
     // Merge the results of [2] in [1]
     sal_Int32 nThisCount = aThis.getLength( );
@@ -529,7 +533,7 @@ void ListDef::CreateNumberingRules( DomainMapper& rDMapper,
             uno::Any aRules = xStyle->getPropertyValue( getPropertyName( 
PROP_NUMBERING_RULES ) );
             aRules >>= m_xNumRules;
 
-            uno::Sequence< uno::Sequence< beans::PropertyValue > > aProps = 
GetPropertyValues( );
+            uno::Sequence<uno::Sequence<beans::PropertyValue>> aProps = 
GetMergedPropertyValues();
 
             sal_Int32 nAbstLevels = m_pAbstractDef ? m_pAbstractDef->Size() : 
0;
             sal_Int32 nLevel = 0;
diff --git a/writerfilter/source/dmapper/NumberingManager.hxx 
b/writerfilter/source/dmapper/NumberingManager.hxx
index eabf4a0276c6..339e6d491757 100644
--- a/writerfilter/source/dmapper/NumberingManager.hxx
+++ b/writerfilter/source/dmapper/NumberingManager.hxx
@@ -90,12 +90,12 @@ public:
     static sal_Int16 GetParentNumbering( const OUString& sText, sal_Int16 
nLevel,
         OUString& rPrefix, OUString& rSuffix );
 
-    css::uno::Sequence<css::beans::PropertyValue> GetProperties();
+    css::uno::Sequence<css::beans::PropertyValue> GetProperties(bool 
bDefaults);
 
     css::uno::Sequence<css::beans::PropertyValue> GetCharStyleProperties();
 private:
 
-    css::uno::Sequence<css::beans::PropertyValue> GetLevelProperties();
+    css::uno::Sequence<css::beans::PropertyValue> GetLevelProperties(bool 
bDefaults);
 
     void AddParaProperties(css::uno::Sequence<css::beans::PropertyValue>* 
pProps);
 };
@@ -153,7 +153,7 @@ public:
 
     const ListLevel::Pointer&  GetCurrentLevel( ) { return m_pCurrentLevel; };
 
-    virtual css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValue> 
> GetPropertyValues();
+    css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValue> > 
GetPropertyValues(bool bDefaults);
 
     void                  SetNumStyleLink(const OUString& sValue) { 
m_sNumStyleLink = sValue; };
     const OUString&       GetNumStyleLink() { return m_sNumStyleLink; };
@@ -181,7 +181,7 @@ public:
     // Mapping functions
     static OUString GetStyleName( sal_Int32 nId );
 
-    css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValue> > 
GetPropertyValues() override;
+    css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValue> > 
GetMergedPropertyValues();
 
     void CreateNumberingRules(DomainMapper& rDMapper, 
css::uno::Reference<css::lang::XMultiServiceFactory> const& xFactory);
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to