[Libreoffice-commits] core.git: writerfilter/Library_writerfilter.mk writerfilter/source

Miklos Vajna vmiklos at collabora.co.uk
Tue Oct 8 03:55:41 PDT 2013


 writerfilter/Library_writerfilter.mk               |    1 
 writerfilter/source/dmapper/LatentStyleHandler.cxx |   82 +++++++++++++++++++++
 writerfilter/source/dmapper/LatentStyleHandler.hxx |   42 ++++++++++
 writerfilter/source/dmapper/StyleSheetTable.cxx    |   81 ++++++++++++++++++++
 writerfilter/source/dmapper/StyleSheetTable.hxx    |    2 
 5 files changed, 208 insertions(+)

New commits:
commit f484f9b482dd74616ab542d74f9ec547aab71285
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Oct 8 10:52:33 2013 +0200

    writerfilter: handle CT_LatentStyles and CT_LsdException in dmapper
    
    Just store them in the document InteropGrabBag for now.
    
    Change-Id: Ia413930746ed087bcb0f6e338198c7baa5bcbdf0

diff --git a/writerfilter/Library_writerfilter.mk b/writerfilter/Library_writerfilter.mk
index 24b92a8..ff23bad 100644
--- a/writerfilter/Library_writerfilter.mk
+++ b/writerfilter/Library_writerfilter.mk
@@ -102,6 +102,7 @@ $(eval $(call gb_Library_add_exception_objects,writerfilter,\
     writerfilter/source/dmapper/FormControlHelper \
     writerfilter/source/dmapper/GraphicHelpers \
     writerfilter/source/dmapper/GraphicImport \
+    writerfilter/source/dmapper/LatentStyleHandler \
     writerfilter/source/dmapper/MeasureHandler \
     writerfilter/source/dmapper/ModelEventListener \
     writerfilter/source/dmapper/NumberingManager \
diff --git a/writerfilter/source/dmapper/LatentStyleHandler.cxx b/writerfilter/source/dmapper/LatentStyleHandler.cxx
new file mode 100644
index 0000000..013e3c0
--- /dev/null
+++ b/writerfilter/source/dmapper/LatentStyleHandler.cxx
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#include <LatentStyleHandler.hxx>
+#include <ooxml/resourceids.hxx>
+#include "dmapperLoggers.hxx"
+
+namespace writerfilter {
+namespace dmapper {
+
+using namespace ::com::sun::star;
+
+LatentStyleHandler::LatentStyleHandler() :
+    LoggedProperties(dmapper_logger, "LatentStyleHandler")
+{
+}
+
+LatentStyleHandler::~LatentStyleHandler()
+{
+}
+
+void LatentStyleHandler::lcl_attribute(Id rName, Value& rVal)
+{
+    beans::PropertyValue aValue;
+    bool bFound = true;
+    switch (rName)
+    {
+        case NS_ooxml::LN_CT_LsdException_name:
+            aValue.Name = "name";
+        break;
+        case NS_ooxml::LN_CT_LsdException_locked:
+            aValue.Name = "locked";
+        break;
+        case NS_ooxml::LN_CT_LsdException_uiPriority:
+            aValue.Name = "uiPriority";
+        break;
+        case NS_ooxml::LN_CT_LsdException_semiHidden:
+            aValue.Name = "semiHidden";
+        break;
+        case NS_ooxml::LN_CT_LsdException_unhideWhenUsed:
+            aValue.Name = "unhideWhenUsed";
+        break;
+        case NS_ooxml::LN_CT_LsdException_qFormat:
+            aValue.Name = "qFormat";
+        break;
+        default:
+            bFound = false;
+#ifdef DEBUG_DOMAINMAPPER
+            dmapper_logger->element("unhandled");
+#endif
+            break;
+    }
+    if (bFound)
+    {
+        aValue.Value = uno::makeAny(rVal.getString());
+        m_aAttributes.push_back(aValue);
+    }
+}
+
+
+void LatentStyleHandler::lcl_sprm(Sprm& /*rSprm*/)
+{
+}
+
+uno::Sequence<beans::PropertyValue> LatentStyleHandler::getAttributes() const
+{
+    uno::Sequence<beans::PropertyValue> aAttributes(m_aAttributes.size());
+    beans::PropertyValue* pAttributes = aAttributes.getArray();
+    for (std::vector<beans::PropertyValue>::const_iterator i = m_aAttributes.begin(); i != m_aAttributes.end(); ++i)
+        *pAttributes++ = *i;
+    return aAttributes;
+}
+
+} // namespace dmapper
+} // namespace writerfilter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/LatentStyleHandler.hxx b/writerfilter/source/dmapper/LatentStyleHandler.hxx
new file mode 100644
index 0000000..081ddc2
--- /dev/null
+++ b/writerfilter/source/dmapper/LatentStyleHandler.hxx
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#ifndef INCLUDED_LATENTSTYLEHANDLER_HXX
+#define INCLUDED_LATENTSTYLEHANDLER_HXX
+
+#include <resourcemodel/LoggedResources.hxx>
+#include <boost/shared_ptr.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+
+namespace writerfilter {
+    namespace dmapper {
+
+        /// Handler for a latent style (w:lsdException element)
+        class LatentStyleHandler
+            : public LoggedProperties
+        {
+            std::vector<beans::PropertyValue> m_aAttributes;
+
+            // Properties
+            virtual void lcl_attribute(Id Name, Value & val);
+            virtual void lcl_sprm(Sprm & sprm);
+
+            public:
+            LatentStyleHandler();
+            virtual ~LatentStyleHandler();
+
+            com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> getAttributes() const;
+        };
+
+        typedef boost::shared_ptr<LatentStyleHandler> LatentStyleHandlerPtr;
+    } // namespace dmapper
+} // namespace writerfilter
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
index 0a232f0..acb45f6 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -23,6 +23,7 @@
 #include <ConversionHelper.hxx>
 #include <TblStylePrHandler.hxx>
 #include <BorderHandler.hxx>
+#include <LatentStyleHandler.hxx>
 #include <doctok/resourceids.hxx>
 #include <ooxml/resourceids.hxx>
 #include <vector>
@@ -280,6 +281,9 @@ struct StyleSheetTable_Impl
     StyleSheetTable_Impl(DomainMapper& rDMapper, uno::Reference< text::XTextDocument> xTextDocument, bool bIsNewDoc);
 
     OUString HasListCharStyle( const PropertyValueVector_t& rCharProperties );
+
+    /// Appends the given key-value pair to the list of latent style properties of the current entry.
+    void AppendLatentStyleProperty(OUString aName, Value& rValue);
 };
 
 
@@ -343,6 +347,14 @@ OUString StyleSheetTable_Impl::HasListCharStyle( const PropertyValueVector_t& rP
     return sRet;
 }
 
+void StyleSheetTable_Impl::AppendLatentStyleProperty(OUString aName, Value& rValue)
+{
+    beans::PropertyValue aValue;
+    aValue.Name = aName;
+    aValue.Value <<= rValue.getString();
+    m_pCurrentEntry->aLatentStyles.push_back(aValue);
+}
+
 
 StyleSheetTable::StyleSheetTable(DomainMapper& rDMapper, uno::Reference< text::XTextDocument> xTextDocument, bool bIsNewDoc)
 : LoggedProperties(dmapper_logger, "StyleSheetTable")
@@ -460,6 +472,24 @@ void StyleSheetTable::lcl_attribute(Id Name, Value & val)
         case NS_ooxml::LN_CT_TblWidth_type:
             dynamic_cast< StyleSheetPropertyMap* >( m_pImpl->m_pCurrentEntry->pProperties.get() )->SetCT_TblWidth_type( nIntValue );
         break;
+        case NS_ooxml::LN_CT_LatentStyles_defQFormat:
+            m_pImpl->AppendLatentStyleProperty("defQFormat", val);
+        break;
+        case NS_ooxml::LN_CT_LatentStyles_defUnhideWhenUsed:
+            m_pImpl->AppendLatentStyleProperty("defUnhideWhenUsed", val);
+        break;
+        case NS_ooxml::LN_CT_LatentStyles_defSemiHidden:
+            m_pImpl->AppendLatentStyleProperty("defSemiHidden", val);
+        break;
+        case NS_ooxml::LN_CT_LatentStyles_count:
+            m_pImpl->AppendLatentStyleProperty("count", val);
+        break;
+        case NS_ooxml::LN_CT_LatentStyles_defUIPriority:
+            m_pImpl->AppendLatentStyleProperty("defUIPriority", val);
+        break;
+        case NS_ooxml::LN_CT_LatentStyles_defLockedState:
+            m_pImpl->AppendLatentStyleProperty("defLockedState", val);
+        break;
         default:
         {
 #ifdef DEBUG_DOMAINMAPPER
@@ -587,6 +617,20 @@ void StyleSheetTable::lcl_sprm(Sprm & rSprm)
         case NS_ooxml::LN_CT_TblPrBase_tblCellMar:
             //no cell margins in styles
         break;
+        case NS_ooxml::LN_CT_LatentStyles_lsdException:
+        {
+            writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+            if (pProperties.get())
+            {
+                LatentStyleHandlerPtr pLatentStyleHandler(new LatentStyleHandler());
+                pProperties->resolve(*pLatentStyleHandler);
+                beans::PropertyValue aValue;
+                aValue.Name = "lsdException";
+                aValue.Value = uno::makeAny(pLatentStyleHandler->getAttributes());
+                m_pImpl->m_pCurrentEntry->aLsdExceptions.push_back(aValue);
+            }
+        }
+        break;
         case NS_ooxml::LN_CT_Style_pPr:
             // no break
         case NS_ooxml::LN_CT_Style_rPr:
@@ -640,6 +684,43 @@ void StyleSheetTable::lcl_entry(int /*pos*/, writerfilter::Reference<Properties>
         //TODO: this entry contains the default settings - they have to be added to the settings
     }
 
+    if (!m_pImpl->m_pCurrentEntry->aLatentStyles.empty())
+    {
+        // We have latent styles for this entry, then process them.
+        std::vector<beans::PropertyValue>& rLatentStyles = m_pImpl->m_pCurrentEntry->aLatentStyles;
+
+        if (!m_pImpl->m_pCurrentEntry->aLsdExceptions.empty())
+        {
+            std::vector<beans::PropertyValue>& rLsdExceptions = m_pImpl->m_pCurrentEntry->aLsdExceptions;
+            uno::Sequence<beans::PropertyValue> aLsdExceptions(rLsdExceptions.size());
+            beans::PropertyValue* pLsdExceptions = aLsdExceptions.getArray();
+            for (std::vector<beans::PropertyValue>::iterator i = rLsdExceptions.begin(); i != rLsdExceptions.end(); ++i)
+                *pLsdExceptions++ = *i;
+
+            beans::PropertyValue aValue;
+            aValue.Name = "lsdExceptions";
+            aValue.Value = uno::makeAny(aLsdExceptions);
+            rLatentStyles.push_back(aValue);
+        }
+
+        uno::Sequence<beans::PropertyValue> aLatentStyles(rLatentStyles.size());
+        beans::PropertyValue* pLatentStyles = aLatentStyles.getArray();
+        for (std::vector<beans::PropertyValue>::iterator i = rLatentStyles.begin(); i != rLatentStyles.end(); ++i)
+            *pLatentStyles++ = *i;
+
+        // We can put all latent style info directly to the document interop
+        // grab bag, as we can be sure that only a single style entry has
+        // latent style info.
+        uno::Reference<beans::XPropertySet> xPropertySet(m_pImpl->m_xTextDocument, uno::UNO_QUERY);
+        uno::Sequence<beans::PropertyValue> aGrabBag;
+        xPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
+        sal_Int32 nLength = aGrabBag.getLength();
+        aGrabBag.realloc(nLength + 1);
+        aGrabBag[nLength].Name = "latentStyles";
+        aGrabBag[nLength].Value = uno::makeAny(aLatentStyles);
+        xPropertySet->setPropertyValue("InteropGrabBag", uno::makeAny(aGrabBag));
+    }
+
     StyleSheetEntryPtr pEmptyEntry;
     m_pImpl->m_pCurrentEntry = pEmptyEntry;
 }
diff --git a/writerfilter/source/dmapper/StyleSheetTable.hxx b/writerfilter/source/dmapper/StyleSheetTable.hxx
index 05f5748..eb3c87f 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.hxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.hxx
@@ -63,6 +63,8 @@ public:
     OUString sStyleName1;
     PropertyMapPtr  pProperties;
     OUString sConvertedStyleName;
+    std::vector<beans::PropertyValue> aLatentStyles; ///< Attributes of latentStyles
+    std::vector<beans::PropertyValue> aLsdExceptions; ///< List of lsdException attribute lists
 
     StyleSheetEntry();
     virtual ~StyleSheetEntry();


More information about the Libreoffice-commits mailing list