[Libreoffice-commits] .: writerfilter/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Sep 13 01:11:32 PDT 2012


 writerfilter/source/dmapper/DomainMapper.cxx      |   56 ++++++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   31 +++++++++---
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    4 +
 3 files changed, 84 insertions(+), 7 deletions(-)

New commits:
commit c5f9d61d45e56d9baaf6e9a91640c60d9b549aab
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Thu Sep 13 10:01:23 2012 +0200

    n#778836 fix DOCX import of right margin vs numbering and paragraph styles
    
    The problem was that the left / first paragraph margin was defined in
    the numbering style, and that zeroed out the already inherited right
    margin.
    
    Change-Id: Ife521d1de4868a7be33de5f8d6af363d10cbc903

diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 4866e2d..8f9476a 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1443,6 +1443,38 @@ void DomainMapper::lcl_sprm(Sprm & rSprm)
         sprmWithProps( rSprm, m_pImpl->GetTopContext() );
 }
 
+sal_Int32 lcl_getCurrentNumberingProperty(uno::Reference<container::XIndexAccess> xNumberingRules, sal_Int32 nNumberingLevel, OUString aProp)
+{
+    sal_Int32 nRet = 0;
+
+    try
+    {
+        if (nNumberingLevel < 0) // It seems it's valid to omit numbering level, and in that case it means zero.
+            nNumberingLevel = 0;
+        if (xNumberingRules.is())
+        {
+            uno::Sequence<beans::PropertyValue> aProps;
+            xNumberingRules->getByIndex(nNumberingLevel) >>= aProps;
+            for (int i = 0; i < aProps.getLength(); ++i)
+            {
+                const beans::PropertyValue& rProp = aProps[i];
+
+                if (rProp.Name == aProp)
+                {
+                    rProp.Value >>= nRet;
+                    break;
+                }
+            }
+        }
+    }
+    catch( const uno::Exception& )
+    {
+        // This can happen when the doc contains some hand-crafted invalid list level.
+    }
+
+    return nRet;
+}
+
 void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmType )
 {
     OSL_ENSURE(rContext.get(), "PropertyMap has to be valid!");
@@ -2970,9 +3002,33 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType
             const StyleSheetPropertyMap* pStyleSheetProperties = dynamic_cast<const StyleSheetPropertyMap*>(pEntry ? pEntry->pProperties.get() : 0);
 
             if( pStyleSheetProperties && pStyleSheetProperties->GetListId() >= 0 )
+            {
                 rContext->Insert( PROP_NUMBERING_STYLE_NAME, true, uno::makeAny(
                             ListDef::GetStyleName( pStyleSheetProperties->GetListId( ) ) ), false);
 
+                // We're inheriting properties from a numbering style. Make sure a possible right margin is inherited from the base style.
+                sal_Int32 nParaRightMargin = 0;
+                if (!pEntry->sBaseStyleIdentifier.isEmpty())
+                {
+                    const StyleSheetEntryPtr pParent = pStyleTable->FindStyleSheetByISTD(pEntry->sBaseStyleIdentifier);
+                    const StyleSheetPropertyMap* pParentProperties = dynamic_cast<const StyleSheetPropertyMap*>(pParent ? pParent->pProperties.get() : 0);
+                    if (pParentProperties->find( PropertyDefinition( PROP_PARA_RIGHT_MARGIN, true )) != pParentProperties->end())
+                        nParaRightMargin = pParentProperties->find( PropertyDefinition( PROP_PARA_RIGHT_MARGIN, true ))->second.get<sal_Int32>();
+                }
+                if (nParaRightMargin != 0)
+                {
+                    // If we're setting the right margin, we should set the first / left margin as well from the numbering style.
+                    sal_Int32 nFirstLineIndent = lcl_getCurrentNumberingProperty(m_pImpl->GetCurrentNumberingRules(), pStyleSheetProperties->GetListLevel(), "FirstLineIndent");
+                    sal_Int32 nParaLeftMargin = lcl_getCurrentNumberingProperty(m_pImpl->GetCurrentNumberingRules(), pStyleSheetProperties->GetListLevel(), "IndentAt");
+                    if (nFirstLineIndent != 0)
+                        rContext->Insert(PROP_PARA_FIRST_LINE_INDENT, true, uno::makeAny(nFirstLineIndent));
+                    if (nParaLeftMargin != 0)
+                        rContext->Insert(PROP_PARA_LEFT_MARGIN, true, uno::makeAny(nParaLeftMargin));
+
+                    rContext->Insert(PROP_PARA_RIGHT_MARGIN, true, uno::makeAny(nParaRightMargin));
+                }
+            }
+
             if( pStyleSheetProperties && pStyleSheetProperties->GetListLevel() >= 0 )
                 rContext->Insert( PROP_NUMBERING_LEVEL, true, uno::makeAny(pStyleSheetProperties->GetListLevel()), false);
         }
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 40acc30..1745f7d 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -3679,9 +3679,9 @@ void DomainMapper_Impl::ApplySettingsTable()
     }
 }
 
-uno::Reference<beans::XPropertySet> DomainMapper_Impl::GetCurrentNumberingCharStyle()
+uno::Reference<container::XIndexAccess> DomainMapper_Impl::GetCurrentNumberingRules(sal_Int32* pListLevel)
 {
-    uno::Reference<beans::XPropertySet> xRet;
+    uno::Reference<container::XIndexAccess> xRet;
     try
     {
         OUString aStyle = GetCurrentParaStyleId();
@@ -3692,18 +3692,35 @@ uno::Reference<beans::XPropertySet> DomainMapper_Impl::GetCurrentNumberingCharSt
             return xRet;
         const StyleSheetPropertyMap* pStyleSheetProperties = dynamic_cast<const StyleSheetPropertyMap*>(pEntry ? pEntry->pProperties.get() : 0);
         sal_Int32 nListId = pStyleSheetProperties->GetListId();
-        sal_Int32 nListLevel = pStyleSheetProperties->GetListLevel();
-        if (nListId < 0 || nListLevel < 0)
+        if (nListId < 0)
             return xRet;
+        if (pListLevel)
+            *pListLevel = pStyleSheetProperties->GetListLevel();
 
-        // So we are in a paragraph style and it has numbering. Look up the relevant character style.
+        // So we are in a paragraph style and it has numbering. Look up the relevant numbering rules.
         OUString aListName = ListDef::GetStyleName(nListId);
         uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier(GetTextDocument(), uno::UNO_QUERY);
         uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
         uno::Reference<container::XNameAccess> xNumberingStyles;
         xStyleFamilies->getByName("NumberingStyles") >>= xNumberingStyles;
         uno::Reference<beans::XPropertySet> xStyle(xNumberingStyles->getByName(aListName), uno::UNO_QUERY);
-        uno::Reference<container::XIndexAccess> xLevels(xStyle->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
+        xRet.set(xStyle->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
+    }
+    catch( const uno::Exception& )
+    {
+    }
+    return xRet;
+}
+
+uno::Reference<beans::XPropertySet> DomainMapper_Impl::GetCurrentNumberingCharStyle()
+{
+    uno::Reference<beans::XPropertySet> xRet;
+    try
+    {
+        sal_Int32 nListLevel = -1;
+        uno::Reference<container::XIndexAccess> xLevels = GetCurrentNumberingRules(&nListLevel);
+        if (!xLevels.is())
+            return xRet;
         uno::Sequence<beans::PropertyValue> aProps;
         xLevels->getByIndex(nListLevel) >>= aProps;
         for (int i = 0; i < aProps.getLength(); ++i)
@@ -3715,6 +3732,8 @@ uno::Reference<beans::XPropertySet> DomainMapper_Impl::GetCurrentNumberingCharSt
                 OUString aCharStyle;
                 rProp.Value >>= aCharStyle;
                 uno::Reference<container::XNameAccess> xCharacterStyles;
+                uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier(GetTextDocument(), uno::UNO_QUERY);
+                uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
                 xStyleFamilies->getByName("CharacterStyles") >>= xCharacterStyles;
                 xRet.set(xCharacterStyles->getByName(aCharStyle), uno::UNO_QUERY_THROW);
                 break;
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 55de1d4..845d04d 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -629,8 +629,10 @@ public:
 
     void ApplySettingsTable();
     SectionPropertyMap * GetSectionContext();
-    /// If the current paragraph has a numbering style associated, this method returns its character style
+    /// If the current paragraph has a numbering style associated, this method returns its character style (part of the numbering rules)
     com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet> GetCurrentNumberingCharStyle();
+    /// If the current paragraph has a numbering style associated, this method returns its numbering rules
+    com::sun::star::uno::Reference<com::sun::star::container::XIndexAccess> GetCurrentNumberingRules(sal_Int32* pListLevel = 0);
 
     /**
      Used for attributes/sprms which cannot be evaluated immediatelly (e.g. they depend


More information about the Libreoffice-commits mailing list