[Libreoffice-commits] core.git: Branch 'feature/fastparser' - 26 commits - include/xmloff sc/source sw/inc sw/source xmloff/inc xmloff/source

Daniel Sikeler d.sikeler94 at gmail.com
Sun Mar 1 22:42:53 PST 2015


 include/xmloff/XMLEventsImportContext.hxx           |    6 
 include/xmloff/shapeimport.hxx                      |    8 
 sc/source/filter/xml/xmlstyli.cxx                   |   28 +
 sw/inc/SwXMLSectionList.hxx                         |   27 -
 sw/source/core/swg/SwXMLSectionList.cxx             |   87 +--
 sw/source/filter/xml/swxml.cxx                      |   15 
 xmloff/inc/XMLBackgroundImageContext.hxx            |   13 
 xmloff/inc/XMLElementPropertyContext.hxx            |    5 
 xmloff/inc/XMLImageMapContext.hxx                   |    8 
 xmloff/inc/XMLReplacementImageContext.hxx           |    9 
 xmloff/inc/XMLStringBufferImportContext.hxx         |   10 
 xmloff/inc/XMLTextColumnsContext.hxx                |   10 
 xmloff/source/chart/SchXMLParagraphContext.cxx      |   64 ++
 xmloff/source/chart/SchXMLParagraphContext.hxx      |   14 
 xmloff/source/chart/XMLChartPropertyContext.cxx     |   29 +
 xmloff/source/chart/XMLLabelSeparatorContext.cxx    |   46 ++
 xmloff/source/chart/XMLLabelSeparatorContext.hxx    |   14 
 xmloff/source/chart/XMLSymbolImageContext.cxx       |   83 +++
 xmloff/source/chart/XMLSymbolImageContext.hxx       |   14 
 xmloff/source/draw/XMLImageMapContext.cxx           |  211 +++++++++
 xmloff/source/draw/XMLReplacementImageContext.cxx   |   76 +++
 xmloff/source/draw/shapeimport.cxx                  |   16 
 xmloff/source/script/XMLEventsImportContext.cxx     |    9 
 xmloff/source/style/XMLBackgroundImageContext.cxx   |  223 +++++++++
 xmloff/source/style/XMLElementPropertyContext.cxx   |   18 
 xmloff/source/text/XMLStringBufferImportContext.cxx |   38 +
 xmloff/source/text/XMLTextColumnsContext.cxx        |  301 +++++++++++++
 xmloff/source/text/XMLTextFrameContext.cxx          |  451 +++++++++++++++++++-
 xmloff/source/text/XMLTextShapeStyleContext.cxx     |   10 
 xmloff/source/text/txtstyli.cxx                     |    2 
 30 files changed, 1752 insertions(+), 93 deletions(-)

New commits:
commit c06fc29249cfb5dd10874fa59f060a770e6001ec
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 11:54:00 2015 +0100

    XMLChartPropertyContext method implementation
    
    complete
    
    Change-Id: Ibd914008a55bdfa73e36abab6059bfba4fb20f40

diff --git a/xmloff/source/chart/XMLChartPropertyContext.cxx b/xmloff/source/chart/XMLChartPropertyContext.cxx
index 7e97be6..92142f6 100644
--- a/xmloff/source/chart/XMLChartPropertyContext.cxx
+++ b/xmloff/source/chart/XMLChartPropertyContext.cxx
@@ -82,11 +82,32 @@ SvXMLImportContext* XMLChartPropertyContext::CreateChildContext(
 
 uno::Reference< xml::sax::XFastContextHandler >
     XMLChartPropertyContext::createFastChildContext(
-    sal_Int32 /*Element*/, const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/,
-    std::vector< XMLPropertyState >& /*rProperties*/,
-    const XMLPropertyState& /*rProp*/ )
+    sal_Int32 Element, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
+    std::vector< XMLPropertyState >& rProperties,
+    const XMLPropertyState& rProp )
 {
-    return uno::Reference< xml::sax::XFastContextHandler >();
+    uno::Reference< xml::sax::XFastContextHandler > pContext = 0;
+
+    switch( mxMapper->getPropertySetMapper()->GetEntryContextId( rProp.mnIndex ) )
+    {
+        case XML_SCH_CONTEXT_SPECIAL_SYMBOL_IMAGE:
+            pContext = new XMLSymbolImageContext( GetImport(), Element,
+                    rProp, rProperties );
+            break;
+        case XML_SCH_CONTEXT_SPECIAL_LABEL_SEPARATOR:
+            pContext = new XMLLabelSeparatorContext( GetImport(), Element,
+                    rProp, rProperties );
+            break;
+    }
+
+    // default / no context yet: create child context by base class
+    if( !pContext.is() )
+    {
+        pContext = SvXMLPropertySetContext::createFastChildContext(
+                Element, xAttrList, rProperties, rProp );
+    }
+
+    return pContext;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit e529f59007efe07a8aa3de5eb642eab9ddb87ba6
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 11:53:05 2015 +0100

    XMLSymbolImageContext implements fastparser ...
    
    interface
    
    Change-Id: Icc797d62c42a2fe90472cb4e8866cc73f3f631c1

diff --git a/xmloff/source/chart/XMLSymbolImageContext.cxx b/xmloff/source/chart/XMLSymbolImageContext.cxx
index 8154e77..0126c81 100644
--- a/xmloff/source/chart/XMLSymbolImageContext.cxx
+++ b/xmloff/source/chart/XMLSymbolImageContext.cxx
@@ -66,6 +66,14 @@ XMLSymbolImageContext::XMLSymbolImageContext(
 {
 }
 
+XMLSymbolImageContext::XMLSymbolImageContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    const XMLPropertyState& rProp,
+    ::std::vector< XMLPropertyState >& rProps )
+:   XMLElementPropertyContext( rImport, Element, rProp, rProps )
+{
+}
+
 XMLSymbolImageContext::~XMLSymbolImageContext()
 {}
 
@@ -98,6 +106,30 @@ void XMLSymbolImageContext::StartElement( const uno::Reference< xml::sax::XAttri
     }
 }
 
+void SAL_CALL XMLSymbolImageContext::startFastElement( sal_Int32 /*Element*/,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    SvXMLTokenMap aTokenMap( aSymbolImageAttrTokenMap );
+    uno::Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+
+    for( xml::FastAttribute atrribute : attributes )
+    {
+        switch( aTokenMap.Get( atrribute.Token ) )
+        {
+            case XML_TOK_SYMBOL_IMAGE_HREF:
+                msURL = atrribute.Value;
+                break;
+            case XML_TOK_SYMBOL_IMAGE_ACTUATE:
+            case XML_TOK_SYMBOL_IMAGE_TYPE:
+            case XML_TOK_SYMBOL_IMAGE_SHOW:
+                // these values are currently not interpreted
+                // it is always assumed 'actuate=onLoad', 'type=simple', 'show=embed'
+                break;
+        }
+    }
+}
+
 SvXMLImportContext* XMLSymbolImageContext::CreateChildContext(
     sal_uInt16 nPrefix, const OUString& rLocalName,
     const uno::Reference< xml::sax::XAttributeList > & xAttrList )
@@ -123,6 +155,31 @@ SvXMLImportContext* XMLSymbolImageContext::CreateChildContext(
     return pContext;
 }
 
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
+    XMLSymbolImageContext::createFastChildContext( sal_Int32 Element,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    uno::Reference< xml::sax::XFastContextHandler > pContext = NULL;
+    if( XML_binary_data == (Element & XML_binary_data) )
+    {
+        if( msURL.isEmpty() && !mxBase64Stream.is() )
+        {
+            mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
+            if( mxBase64Stream.is() )
+                pContext = new XMLBase64ImportContext( GetImport(),
+                        Element, xAttrList, mxBase64Stream );
+        }
+    }
+
+    if( !pContext.is() )
+    {
+        pContext = new SvXMLImportContext( GetImport() );
+    }
+
+    return pContext;
+}
+
 void XMLSymbolImageContext::EndElement()
 {
     OUString sResolvedURL;
@@ -147,4 +204,30 @@ void XMLSymbolImageContext::EndElement()
     XMLElementPropertyContext::EndElement();
 }
 
+void SAL_CALL XMLSymbolImageContext::endFastElement( sal_Int32 Element )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    OUString sResolvedURL;
+
+    if( !msURL.isEmpty() )
+    {
+        sResolvedURL = GetImport().ResolveGraphicObjectURL( msURL, false );
+    }
+    else if( mxBase64Stream.is() )
+    {
+        sResolvedURL = GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream );
+        mxBase64Stream = 0;
+    }
+
+    if( !sResolvedURL.isEmpty())
+    {
+        // aProp is a member of XMLElementPropertyContext
+        aProp.maValue <<= sResolvedURL;
+        SetInsert( true );
+    }
+
+    XMLElementPropertyContext::endFastElement(Element);
+}
+
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/chart/XMLSymbolImageContext.hxx b/xmloff/source/chart/XMLSymbolImageContext.hxx
index 718101c..5eeafed 100644
--- a/xmloff/source/chart/XMLSymbolImageContext.hxx
+++ b/xmloff/source/chart/XMLSymbolImageContext.hxx
@@ -34,14 +34,28 @@ public:
                            const OUString& rLName,
                            const XMLPropertyState& rProp,
                            ::std::vector< XMLPropertyState > &rProps );
+    XMLSymbolImageContext( SvXMLImport& rImport, sal_Int32 Element,
+            const XMLPropertyState& rProp,
+            ::std::vector< XMLPropertyState >& rProps );
     virtual ~XMLSymbolImageContext();
 
     virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual void SAL_CALL startFastElement( sal_Int32 Element,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
+
     virtual SvXMLImportContext *CreateChildContext(
         sal_uInt16 nPrefix,
         const OUString& rLocalName,
         const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
+
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
 private:
     OUString msURL;
commit cbb5d39e4711ef857a6ae80f3de40f2d3f92d6bf
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 11:29:45 2015 +0100

    XMLLabelSeparatorContext implements fastparser ...
    
    interface
    
    Change-Id: I3e7885659720a2af43ce0400822fb04bef2b3879

diff --git a/xmloff/source/chart/XMLLabelSeparatorContext.cxx b/xmloff/source/chart/XMLLabelSeparatorContext.cxx
index bf7a9c3..e3961b3 100644
--- a/xmloff/source/chart/XMLLabelSeparatorContext.cxx
+++ b/xmloff/source/chart/XMLLabelSeparatorContext.cxx
@@ -25,6 +25,7 @@
 #include <xmloff/xmlnmspe.hxx>
 #include <xmloff/xmlimp.hxx>
 #include <xmloff/nmspmap.hxx>
+#include <xmloff/token/tokens.hxx>
 
 TYPEINIT1( XMLLabelSeparatorContext, XMLElementPropertyContext );
 
@@ -41,6 +42,15 @@ XMLLabelSeparatorContext::XMLLabelSeparatorContext(
 {
 }
 
+XMLLabelSeparatorContext::XMLLabelSeparatorContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    const XMLPropertyState& rProp,
+    ::std::vector< XMLPropertyState >& rProps )
+:   XMLElementPropertyContext( rImport, Element, rProp, rProps ),
+    m_aSeparator()
+{
+}
+
 XMLLabelSeparatorContext::~XMLLabelSeparatorContext()
 {}
 
@@ -48,6 +58,12 @@ void XMLLabelSeparatorContext::StartElement( const uno::Reference< xml::sax::XAt
 {
 }
 
+void SAL_CALL XMLLabelSeparatorContext::startFastElement( sal_Int32 /*Element*/,
+    const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+}
+
 SvXMLImportContext* XMLLabelSeparatorContext::CreateChildContext(
     sal_uInt16 nPrefix, const OUString& rLocalName,
     const uno::Reference< xml::sax::XAttributeList > & /*xAttrList*/ )
@@ -64,6 +80,23 @@ SvXMLImportContext* XMLLabelSeparatorContext::CreateChildContext(
     return pContext;
 }
 
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
+    XMLLabelSeparatorContext::createFastChildContext( sal_Int32 Element,
+    const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    uno::Reference< xml::sax::XFastContextHandler > pContext = NULL;
+    if( xmloff::XML_p == (Element & xmloff::XML_p) )
+    {
+        pContext = new SchXMLParagraphContext( GetImport(), Element,
+                m_aSeparator );
+    }
+    if( !pContext.is() )
+        pContext = new SvXMLImportContext( GetImport() );
+
+    return pContext;
+}
+
 void XMLLabelSeparatorContext::EndElement()
 {
     if( !m_aSeparator.isEmpty() )
@@ -76,4 +109,17 @@ void XMLLabelSeparatorContext::EndElement()
     XMLElementPropertyContext::EndElement();
 }
 
+void SAL_CALL XMLLabelSeparatorContext::endFastElement( sal_Int32 Element )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    if( !m_aSeparator.isEmpty() )
+    {
+        // aProp is a member of XMLElementPropertyContext
+        aProp.maValue <<= m_aSeparator;
+        SetInsert( true );
+    }
+
+    XMLElementPropertyContext::endFastElement( Element );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/chart/XMLLabelSeparatorContext.hxx b/xmloff/source/chart/XMLLabelSeparatorContext.hxx
index aee92d6..0fdeefd 100644
--- a/xmloff/source/chart/XMLLabelSeparatorContext.hxx
+++ b/xmloff/source/chart/XMLLabelSeparatorContext.hxx
@@ -30,14 +30,28 @@ public:
                            const OUString& rLName,
                            const XMLPropertyState& rProp,
                            ::std::vector< XMLPropertyState > &rProps );
+    XMLLabelSeparatorContext( SvXMLImport& rImport, sal_Int32 Element,
+        const XMLPropertyState& rProp,
+        ::std::vector< XMLPropertyState >& rProps );
     virtual ~XMLLabelSeparatorContext();
 
     virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual void SAL_CALL startFastElement( sal_Int32 Element,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
+
     virtual SvXMLImportContext *CreateChildContext(
         sal_uInt16 nPrefix,
         const OUString& rLocalName,
         const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
+
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
 private:
     OUString         m_aSeparator;
commit 6c774160cf15cd5c587abd3a6611da08214cda37
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 11:27:08 2015 +0100

    SchXMLParagraphContext implements fastparser ...
    
    interface
    
    Change-Id: I4a2cf0d047faad624fa303fa8fc9dc5548c087e6

diff --git a/xmloff/source/chart/SchXMLParagraphContext.cxx b/xmloff/source/chart/SchXMLParagraphContext.cxx
index ba8a254..bf02b8b 100644
--- a/xmloff/source/chart/SchXMLParagraphContext.cxx
+++ b/xmloff/source/chart/SchXMLParagraphContext.cxx
@@ -24,9 +24,13 @@
 #include <xmloff/xmlnmspe.hxx>
 #include <xmloff/xmltoken.hxx>
 #include <xmloff/nmspmap.hxx>
+#include <xmloff/token/tokens.hxx>
+#include <com/sun/star/xml/sax/FastToken.hpp>
 
 using namespace com::sun::star;
 using namespace ::xmloff::token;
+using namespace xmloff;
+using css::xml::sax::FastToken::NAMESPACE;
 
 SchXMLParagraphContext::SchXMLParagraphContext( SvXMLImport& rImport,
                                                 const OUString& rLocalName,
@@ -38,6 +42,15 @@ SchXMLParagraphContext::SchXMLParagraphContext( SvXMLImport& rImport,
 {
 }
 
+SchXMLParagraphContext::SchXMLParagraphContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    OUString& rText, OUString * pOutId /* = 0 */ )
+:   SvXMLImportContext( rImport ),
+    mrText( rText ),
+    mpId( pOutId )
+{
+}
+
 SchXMLParagraphContext::~SchXMLParagraphContext()
 {}
 
@@ -75,11 +88,39 @@ void SchXMLParagraphContext::StartElement( const uno::Reference< xml::sax::XAttr
     }
 }
 
+void SAL_CALL SchXMLParagraphContext::startFastElement( sal_Int32 /*Element*/,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    // remember the id. It is used for storing the original cell range string in
+    // a local table (cached data)
+    if( mpId )
+    {
+        bool bHaveXmlId( false );
+        if( xAttrList->hasAttribute( NAMESPACE | XML_NAMESPACE_XML | XML_id ) )
+        {
+            (*mpId) = xAttrList->getValue( NAMESPACE | XML_NAMESPACE_XML | XML_id );
+            bHaveXmlId = true;
+        }
+        if( !bHaveXmlId // text:id shall be ignored if xml:id exists
+         && xAttrList->hasAttribute( NAMESPACE | XML_NAMESPACE_TEXT | XML_id ) )
+        {
+            (*mpId) = xAttrList->getValue( NAMESPACE | XML_NAMESPACE_TEXT | XML_id );
+        }
+    }
+}
+
 void SchXMLParagraphContext::EndElement()
 {
     mrText = maBuffer.makeStringAndClear();
 }
 
+void SAL_CALL SchXMLParagraphContext::endFastElement( sal_Int32 /*Element*/ )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    mrText = maBuffer.makeStringAndClear();
+}
+
 SvXMLImportContext* SchXMLParagraphContext::CreateChildContext(
     sal_uInt16 nPrefix,
     const OUString& rLocalName,
@@ -100,9 +141,32 @@ SvXMLImportContext* SchXMLParagraphContext::CreateChildContext(
     return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
 }
 
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
+    SchXMLParagraphContext::createFastChildContext( sal_Int32 Element,
+    const uno::Reference< xml::sax::XFastAttributeList >& )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    if( Element == (NAMESPACE | XML_NAMESPACE_TEXT | XML_tab_stop) )
+    {
+        maBuffer.append( sal_Unicode( 0x0009 ));    // tabulator
+    }
+    else if( Element == (NAMESPACE | XML_NAMESPACE_TEXT | XML_line_break) )
+    {
+        maBuffer.append( sal_Unicode( 0x000A ));    // linefedd
+    }
+
+    return new SvXMLImportContext( GetImport() );
+}
+
 void SchXMLParagraphContext::Characters( const OUString& rChars )
 {
     maBuffer.append( rChars );
 }
 
+void SAL_CALL SchXMLParagraphContext::characters( const OUString& rChars )
+    throw(uno::RuntimeException, xml::sax::SAXException, std::exception)
+{
+    maBuffer.append( rChars );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/chart/SchXMLParagraphContext.hxx b/xmloff/source/chart/SchXMLParagraphContext.hxx
index 970e434..1522c55 100644
--- a/xmloff/source/chart/SchXMLParagraphContext.hxx
+++ b/xmloff/source/chart/SchXMLParagraphContext.hxx
@@ -39,16 +39,30 @@ public:
                             const OUString& rLocalName,
                             OUString& rText,
                             OUString * pOutId = 0 );
+    SchXMLParagraphContext( SvXMLImport& rImport, sal_Int32 Element,
+        OUString& rText, OUString *pOutId = 0);
     virtual ~SchXMLParagraphContext();
     virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual void SAL_CALL startFastElement( sal_Int32 Element,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
+
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     virtual SvXMLImportContext* CreateChildContext(
         sal_uInt16 nPrefix,
         const OUString& rLocalName,
         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
+    virtual void SAL_CALL characters( const OUString& rChars )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 };
 
 #endif // INCLUDED_XMLOFF_SOURCE_CHART_SCHXMLPARAGRAPHCONTEXT_HXX
commit e9d997c7a97e5816ba1454500e6a0e2637dd8f75
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 10:32:52 2015 +0100

    XMLTableCellPropsContext method implementation ...
    
    complete
    
    Change-Id: I2ed9666fd3b23b003f88b98781107ec50396f8b8

diff --git a/sc/source/filter/xml/xmlstyli.cxx b/sc/source/filter/xml/xmlstyli.cxx
index 03145b3..aaa5a2d 100644
--- a/sc/source/filter/xml/xmlstyli.cxx
+++ b/sc/source/filter/xml/xmlstyli.cxx
@@ -367,12 +367,30 @@ SvXMLImportContext* XMLTableCellPropsContext::CreateChildContext( sal_uInt16 nPr
 }
 
 uno::Reference< xml::sax::XFastContextHandler >
-    XMLTableCellPropsContext::createFastChildContext( sal_Int32 /*Element*/,
-    const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/,
-    std::vector< XMLPropertyState >& /*rProperties*/,
-    const XMLPropertyState& /*rProp*/ )
+    XMLTableCellPropsContext::createFastChildContext( sal_Int32 Element,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
+    std::vector< XMLPropertyState >& rProperties,
+    const XMLPropertyState& rProp )
 {
-    return uno::Reference< xml::sax::XFastContextHandler >();
+    // no need for a custom context or indeed a SvXMLTokenMap to grab just the
+    // single attribute ( href ) that we are interested in.
+    // still though, we will check namespaces etd.
+    if( Element == (FastToken::NAMESPACE | XML_NAMESPACE_STYLE | XML_hyperlink) )
+    {
+        OUString sURL;
+        if( xAttrList->hasAttribute( FastToken::NAMESPACE | XML_NAMESPACE_XLINK | XML_href) )
+        {
+            sURL = xAttrList->getValue( FastToken::NAMESPACE | XML_NAMESPACE_XLINK | XML_href );
+        }
+        if( !sURL.isEmpty() )
+        {
+            XMLPropertyState aProp( rProp );
+            aProp.maValue <<= sURL;
+            rProperties.push_back( aProp );
+        }
+    }
+    return SvXMLPropertySetContext::createFastChildContext( Element,
+            xAttrList, rProperties, rProp );
 }
 
 class ScXMLMapContext : public SvXMLImportContext
commit a4978fac41175a67975e20b3e7ab5e8c830797b0
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 10:21:49 2015 +0100

    XMLTextShapePropertySetContext_Impl method ...
    
    implementation complete
    
    Change-Id: I305be7c2c08199da06a5d97b5111bee1b71af3d1

diff --git a/xmloff/source/text/XMLTextShapeStyleContext.cxx b/xmloff/source/text/XMLTextShapeStyleContext.cxx
index 05f14ce..784646e 100644
--- a/xmloff/source/text/XMLTextShapeStyleContext.cxx
+++ b/xmloff/source/text/XMLTextShapeStyleContext.cxx
@@ -154,7 +154,7 @@ Reference< XFastContextHandler >
     switch( mxMapper->getPropertySetMapper()->GetEntryContextId( rProp.mnIndex ) )
     {
     case CTF_TEXTCOLUMNS:
-        //pContext = new XMLTextColumnsContext( GetImport(), Element, xAttrList, rProp, rProperties );
+        pContext = new XMLTextColumnsContext( GetImport(), Element, xAttrList, rProp, rProperties );
         break;
     case CTF_BACKGROUND_URL:
         DBG_ASSERT( rProp.mnIndex >= 3 &&
@@ -166,9 +166,9 @@ Reference< XFastContextHandler >
                     CTF_BACKGROUND_FILTER == mxMapper->getPropertySetMapper()
                         ->GetEntryContextId( rProp.mnIndex-1 ),
                     "invalid property map!" );
-        //pContext = new XMLBackgroundImageContext( GetImport(), Element,
-        //    xAttrList, rProp, rProp.mnIndex-2, rProp.mnIndex-1,
-        //    rProp.mnIndex-3, rProperties );
+        pContext = new XMLBackgroundImageContext( GetImport(), Element,
+            xAttrList, rProp, rProp.mnIndex-2, rProp.mnIndex-1,
+            rProp.mnIndex-3, rProperties );
         break;
     }
 
commit c61c32ef7eb6378ca793d95a921fae4514b0108d
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 10:15:40 2015 +0100

    XMLBackgroundImageContext implements fastparser ..
    
    interface
    
    Change-Id: I1f364a9acefae7e782e359dd4ee1b5c634a05eb2

diff --git a/xmloff/inc/XMLBackgroundImageContext.hxx b/xmloff/inc/XMLBackgroundImageContext.hxx
index 3fb3ca1..7bac0550 100644
--- a/xmloff/inc/XMLBackgroundImageContext.hxx
+++ b/xmloff/inc/XMLBackgroundImageContext.hxx
@@ -44,6 +44,8 @@ private:
     void ProcessAttrs(
             const ::com::sun::star::uno::Reference<
                     ::com::sun::star::xml::sax::XAttributeList > & xAttrList );
+    void ProcessAttrs(
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList );
 
 public:
     TYPEINFO_OVERRIDE();
@@ -59,6 +61,11 @@ public:
         sal_Int32 nFilterIdx,
         sal_Int32 nTransparencyIdx,
         ::std::vector< XMLPropertyState > &rProps );
+    XMLBackgroundImageContext( SvXMLImport& rImport, sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
+        const XMLPropertyState& rProp,
+        sal_Int32 nPosIdx, sal_Int32 nFilterIdx, sal_Int32 nTransparencyIdx,
+        ::std::vector< XMLPropertyState >& rProps );
 
     virtual ~XMLBackgroundImageContext();
 
@@ -66,8 +73,14 @@ public:
                 const OUString& rLocalName,
                  const ::com::sun::star::uno::Reference<
                     ::com::sun::star::xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 };
 
 
diff --git a/xmloff/source/style/XMLBackgroundImageContext.cxx b/xmloff/source/style/XMLBackgroundImageContext.cxx
index 6459f15..a204f5e 100644
--- a/xmloff/source/style/XMLBackgroundImageContext.cxx
+++ b/xmloff/source/style/XMLBackgroundImageContext.cxx
@@ -337,6 +337,155 @@ void XMLBackgroundImageContext::ProcessAttrs(
 
 }
 
+void XMLBackgroundImageContext::ProcessAttrs(
+    const Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+    SvXMLTokenMap aTokenMap( lcl_getBGImgAttributesAttrTokenMap() );
+
+    ePos = GraphicLocation_NONE;
+
+    uno::Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+    for( xml::FastAttribute attribute : attributes )
+    {
+        switch( aTokenMap.Get( attribute.Token ) )
+        {
+        case XML_TOK_BGIMG_HREF:
+            sURL = attribute.Value;
+            if( GraphicLocation_NONE == ePos )
+                ePos = GraphicLocation_TILED;
+            break;
+        case XML_TOK_BGIMG_TYPE:
+        case XML_TOK_BGIMG_ACTUATE:
+        case XML_TOK_BGIMG_SHOW:
+            break;
+        case XML_TOK_BGIMG_POSITION:
+        {
+            GraphicLocation eNewPos = GraphicLocation_NONE, eTmp;
+            sal_uInt16 nTmp;
+            SvXMLTokenEnumerator aTokenEnum( attribute.Value );
+            OUString aToken;
+            bool bHori = false, bVert = false;
+            bool bOK = true;
+            while( bOK && aTokenEnum.getNextToken( aToken ) )
+            {
+                if( bHori && bVert )
+                {
+                    bOK = false;
+                }
+                else if( -1 != aToken.indexOf( '%' ) )
+                {
+                    sal_Int32 nPrc = 50;
+                    if (::sax::Converter::convertPercent( nPrc, aToken ))
+                    {
+                        if( !bHori )
+                        {
+                            eNewPos = nPrc < 25
+                                ? GraphicLocation_LEFT_TOP
+                                : (nPrc < 75 ? GraphicLocation_MIDDLE_MIDDLE
+                                            : GraphicLocation_RIGHT_BOTTOM);
+                            bHori = true;
+                        }
+                        else
+                        {
+                            eTmp = nPrc < 25
+                                ? GraphicLocation_LEFT_TOP
+                                : (nPrc < 75 ? GraphicLocation_LEFT_MIDDLE
+                                             : GraphicLocation_LEFT_BOTTOM);
+                            lcl_xmlbic_MergeVertPos( eNewPos, eTmp );
+                            bVert = true;
+                        }
+                    }
+                    else
+                    {
+                        // wrong percentage
+                        bOK = false;
+                    }
+                }
+                else if( aToken.equals( "center" ) )
+                {
+                    if( bHori )
+                        lcl_xmlbic_MergeVertPos( eNewPos,
+                                GraphicLocation_MIDDLE_MIDDLE );
+                    else if( bVert )
+                        lcl_xmlbic_MergeHoriPos( eNewPos,
+                                GraphicLocation_MIDDLE_MIDDLE );
+                    else
+                        eNewPos = GraphicLocation_MIDDLE_MIDDLE;
+                }
+                else if( SvXMLUnitConverter::convertEnum( nTmp, aToken,
+                            psXML_BrushHoriPos ) )
+                {
+                    if( bVert )
+                        lcl_xmlbic_MergeHoriPos( eNewPos,
+                                    (GraphicLocation)nTmp );
+                    else if( !bHori )
+                        eNewPos = (GraphicLocation)nTmp;
+                    else
+                        bOK = false;
+                    bHori = true;
+                }
+                else if( SvXMLUnitConverter::convertEnum( nTmp, aToken,
+                                                     psXML_BrushVertPos ) )
+                {
+                    if( bHori )
+                        lcl_xmlbic_MergeVertPos( eNewPos,
+                                        (GraphicLocation)nTmp );
+                    else if( !bVert )
+                        eNewPos = (GraphicLocation)nTmp;
+                    else
+                        bOK = false;
+                    bVert = true;
+                }
+                else
+                {
+                    bOK = false;
+                }
+            }
+
+            bOK &= GraphicLocation_NONE != eNewPos;
+            if( bOK )
+                ePos = eNewPos;
+        }
+        break;
+        case XML_TOK_BGIMG_REPEAT:
+            {
+                sal_uInt16 nPos = GraphicLocation_NONE;
+                static const SvXMLEnumMapEntry psXML_BrushRepeat[] =
+                {
+                    { XML_BACKGROUND_REPEAT,        GraphicLocation_TILED   },
+                    { XML_BACKGROUND_NO_REPEAT,     GraphicLocation_MIDDLE_MIDDLE       },
+                    { XML_BACKGROUND_STRETCH,       GraphicLocation_AREA    },
+                    { xmloff::token::XML_TOKEN_INVALID,            0           }
+                };
+                if( SvXMLUnitConverter::convertEnum( nPos, attribute.Value,
+                            psXML_BrushRepeat ) )
+                {
+                    if( GraphicLocation_MIDDLE_MIDDLE != nPos ||
+                        GraphicLocation_NONE == ePos ||
+                        GraphicLocation_AREA == ePos ||
+                        GraphicLocation_TILED == ePos )
+                        ePos = (GraphicLocation)nPos;
+                }
+            }
+            break;
+        case XML_TOK_BGIMG_FILTER:
+            sFilter = attribute.Value;
+            break;
+        case XML_TOK_BGIMG_OPACITY:
+            {
+                sal_Int32 nTmp;
+                // convert from percent and clip
+                if( ::sax::Converter::convertPercent( nTmp, attribute.Value ) )
+                {
+                    if( (nTmp >= 0) && (nTmp <= 100) )
+                        nTransparency = static_cast<sal_Int8>( 100-nTmp );
+                }
+            }
+            break;
+        }
+    }
+}
+
 XMLBackgroundImageContext::XMLBackgroundImageContext(
         SvXMLImport& rImport, sal_uInt16 nPrfx,
         const OUString& rLName,
@@ -355,6 +504,21 @@ XMLBackgroundImageContext::XMLBackgroundImageContext(
     ProcessAttrs( xAttrList );
 }
 
+XMLBackgroundImageContext::XMLBackgroundImageContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    const Reference< xml::sax::XFastAttributeList >& xAttrList,
+    const XMLPropertyState& rProp, sal_Int32 nPosIdx,
+    sal_Int32 nFilterIdx, sal_Int32 nTransparencyIdx,
+    ::std::vector< XMLPropertyState >& rProps )
+:   XMLElementPropertyContext( rImport, Element, rProp, rProps ),
+    aPosProp( nPosIdx ),
+    aFilterProp( nFilterIdx ),
+    aTransparencyProp( nTransparencyIdx ),
+    nTransparency( 0 )
+{
+    ProcessAttrs( xAttrList );
+}
+
 XMLBackgroundImageContext::~XMLBackgroundImageContext()
 {
 }
@@ -385,6 +549,31 @@ SvXMLImportContext *XMLBackgroundImageContext::CreateChildContext(
     return pContext;
 }
 
+Reference< xml::sax::XFastContextHandler > SAL_CALL
+    XMLBackgroundImageContext::createFastChildContext( sal_Int32 Element,
+    const Reference< xml::sax::XFastAttributeList >& xAttrList )
+    throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+    Reference< XFastContextHandler > pContext = NULL;
+
+    if( Element == (NAMESPACE | XML_NAMESPACE_OFFICE | XML_binary_data) )
+    {
+        if( sURL.isEmpty() && !xBase64Stream.is() )
+        {
+            xBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
+            if( xBase64Stream.is() )
+                pContext = new XMLBase64ImportContext( GetImport(),
+                        Element, xAttrList, xBase64Stream );
+        }
+    }
+    if( !pContext.is() )
+    {
+        pContext = new SvXMLImportContext( GetImport() );
+    }
+
+    return pContext;
+}
+
 void XMLBackgroundImageContext::EndElement()
 {
     if( !sURL.isEmpty() )
@@ -418,4 +607,38 @@ void XMLBackgroundImageContext::EndElement()
         rProperties.push_back( aTransparencyProp );
 }
 
+void SAL_CALL XMLBackgroundImageContext::endFastElement( sal_Int32 Element )
+    throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+    if( !sURL.isEmpty() )
+    {
+        sURL = GetImport().ResolveGraphicObjectURL( sURL, false );
+    }
+    else if( xBase64Stream.is() )
+    {
+        sURL = GetImport().ResolveGraphicObjectURLFromBase64( xBase64Stream );
+        xBase64Stream = 0;
+    }
+
+    if( sURL.isEmpty() )
+        ePos = GraphicLocation_NONE;
+    else if( GraphicLocation_NONE == ePos )
+        ePos = GraphicLocation_TILED;
+
+    aProp.maValue <<= sURL;
+    aPosProp.maValue <<= ePos;
+    aFilterProp.maValue <<= sFilter;
+    aTransparencyProp.maValue <<= nTransparency;
+
+    SetInsert( true );
+    XMLElementPropertyContext::endFastElement(Element);
+
+    if( -1 != aPosProp.mnIndex )
+        rProperties.push_back( aPosProp );
+    if( -1 != aFilterProp.mnIndex )
+        rProperties.push_back( aFilterProp );
+    if( -1 != aTransparencyProp.mnIndex )
+        rProperties.push_back( aTransparencyProp );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 322b73eb6b691c46325f6a6a9648751c270a8109
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 09:37:17 2015 +0100

    XMLTextColumnsContext implements fastparser ...
    
    interface
    
    Change-Id: Idcd82c684d4c88731f68596852183eeb389616bc

diff --git a/xmloff/inc/XMLTextColumnsContext.hxx b/xmloff/inc/XMLTextColumnsContext.hxx
index 9a10ac6..b3a57af 100644
--- a/xmloff/inc/XMLTextColumnsContext.hxx
+++ b/xmloff/inc/XMLTextColumnsContext.hxx
@@ -57,14 +57,24 @@ public:
             ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
         const XMLPropertyState& rProp,
         ::std::vector< XMLPropertyState > &rProps );
+    XMLTextColumnsContext( SvXMLImport& rImport, sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
+        const XMLPropertyState& rProp,
+        ::std::vector< XMLPropertyState >& rProps );
 
     virtual ~XMLTextColumnsContext();
 
     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                    const OUString& rLocalName,
                                    const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 };
 
 
diff --git a/xmloff/source/text/XMLTextColumnsContext.cxx b/xmloff/source/text/XMLTextColumnsContext.cxx
index 751c53e..a96a4e2 100644
--- a/xmloff/source/text/XMLTextColumnsContext.cxx
+++ b/xmloff/source/text/XMLTextColumnsContext.cxx
@@ -428,6 +428,45 @@ XMLTextColumnsContext::XMLTextColumnsContext(
     }
 }
 
+XMLTextColumnsContext::XMLTextColumnsContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    const Reference< xml::sax::XFastAttributeList >& xAttrList,
+    const XMLPropertyState& rProp,
+    ::std::vector< XMLPropertyState >& rProps )
+:   XMLElementPropertyContext( rImport, Element, rProp, rProps )
+,   sSeparatorLineIsOn("SeparatorLineIsOn")
+,   sSeparatorLineWidth("SeparatorLineWidth")
+,   sSeparatorLineColor("SeparatorLineColor")
+,   sSeparatorLineRelativeHeight("SeparatorLineRelativeHeight")
+,   sSeparatorLineVerticalAlignment("SeparatorLineVerticalAlignment")
+,   sAutomaticDistance("AutomaticDistance")
+,   sSeparatorLineStyle("SeparatorLineStyle")
+,   pColumns( 0 )
+,   pColumnSep( 0 )
+,   pColumnAttrTokenMap( new SvXMLTokenMap(aColAttrTokenMap) )
+,   pColumnSepAttrTokenMap( new SvXMLTokenMap(aColSepAttrTokenMap) )
+,   nCount( 0 )
+,   bAutomatic( false )
+,   nAutomaticDistance( 0 )
+{
+    sal_Int32 nVal;
+    if( xAttrList->hasAttribute( NAMESPACE | XML_NAMESPACE_FO | XML_column_count ) )
+    {
+        if( ::sax::Converter::convertNumber( nVal,
+            xAttrList->getValue( NAMESPACE | XML_NAMESPACE_FO | XML_column_count ),
+            0, SHRT_MAX ) )
+        {
+            nCount = static_cast< sal_Int16 >( nVal );
+        }
+    }
+    else if( xAttrList->hasAttribute( NAMESPACE | XML_NAMESPACE_FO | XML_column_gap ) )
+    {
+        bAutomatic = GetImport().GetMM100UnitConverter().
+            convertMeasureToCore( nAutomaticDistance,
+            xAttrList->getValue( NAMESPACE | XML_NAMESPACE_FO | XML_column_gap ) );
+    }
+}
+
 XMLTextColumnsContext::~XMLTextColumnsContext()
 {
     if( pColumns )
@@ -487,6 +526,44 @@ SvXMLImportContext *XMLTextColumnsContext::CreateChildContext(
     return pContext;
 }
 
+Reference< xml::sax::XFastContextHandler > SAL_CALL
+    XMLTextColumnsContext::createFastChildContext( sal_Int32 Element,
+    const Reference< xml::sax::XFastAttributeList >& xAttrList )
+    throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+    SvXMLImportContext *pContext = 0;
+
+    if( Element == (NAMESPACE | XML_NAMESPACE_STYLE | XML_column) )
+    {
+        XMLTextColumnContext_Impl *pColumn =
+            new XMLTextColumnContext_Impl( GetImport(), Element,
+                    xAttrList, *pColumnAttrTokenMap );
+
+        // add new tabstop to array of tabstops
+        if( !pColumns )
+            pColumns = new XMLTextColumnsArray_Impl;
+
+        pColumns->push_back( pColumn );
+        pColumn->AddFirstRef();
+
+        pContext = pColumn;
+    }
+    else if( Element == (NAMESPACE | XML_NAMESPACE_STYLE  | XML_column_sep) )
+    {
+        pColumnSep = new XMLTextColumnSepContext_Impl( GetImport(),
+                Element, xAttrList, *pColumnSepAttrTokenMap );
+        pColumnSep->AddFirstRef();
+
+        pContext = pColumnSep;
+    }
+    else
+    {
+        pContext = new SvXMLImportContext( GetImport() );
+    }
+
+    return pContext;
+}
+
 void XMLTextColumnsContext::EndElement( )
 {
     Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(),UNO_QUERY);
@@ -608,4 +685,126 @@ void XMLTextColumnsContext::EndElement( )
 
 }
 
+void SAL_CALL XMLTextColumnsContext::endFastElement( sal_Int32 Element )
+    throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+    Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(),UNO_QUERY);
+    if( !xFactory.is() )
+        return;
+
+    Reference<XInterface> xIfc = xFactory->createInstance("com.sun.star.text.TextColumns");
+    if( !xIfc.is() )
+        return;
+
+    Reference< XTextColumns > xColumns( xIfc, UNO_QUERY );
+    if ( 0 == nCount )
+    {
+        // zero columns = no columns -> 1 column
+        xColumns->setColumnCount( 1 );
+    }
+    else if( !bAutomatic && pColumns &&
+             pColumns->size() == (sal_uInt16)nCount )
+    {
+        // if we have column descriptions, one per column, and we don't use
+        // automatic width, then set the column widths
+
+        sal_Int32 nRelWidth = 0;
+        sal_uInt16 nColumnsWithWidth = 0;
+        sal_Int16 i;
+
+        for( i = 0; i < nCount; i++ )
+        {
+            const TextColumn& rColumn =
+                (*pColumns)[(sal_uInt16)i]->getTextColumn();
+            if( rColumn.Width > 0 )
+            {
+                nRelWidth += rColumn.Width;
+                nColumnsWithWidth++;
+            }
+        }
+        if( nColumnsWithWidth < nCount )
+        {
+            sal_Int32 nColWidth = 0==nRelWidth
+                                        ? USHRT_MAX / nCount
+                                        : nRelWidth / nColumnsWithWidth;
+
+            for( i=0; i < nCount; i++ )
+            {
+                TextColumn& rColumn =
+                    (*pColumns)[(sal_uInt16)i]->getTextColumn();
+                if( rColumn.Width == 0 )
+                {
+                    rColumn.Width = nColWidth;
+                    nRelWidth += rColumn.Width;
+                    if( 0 == --nColumnsWithWidth )
+                        break;
+                }
+            }
+        }
+
+        Sequence< TextColumn > aColumns( (sal_Int32)nCount );
+        TextColumn *pTextColumns = aColumns.getArray();
+        for( i=0; i < nCount; i++ )
+            *pTextColumns++ = (*pColumns)[(sal_uInt16)i]->getTextColumn();
+
+        xColumns->setColumns( aColumns );
+    }
+    else
+    {
+        // only set column count (and let the columns be distributed
+        // automatically)
+
+        xColumns->setColumnCount( nCount );
+    }
+
+    Reference < XPropertySet > xPropSet( xColumns, UNO_QUERY );
+    if( xPropSet.is() )
+    {
+        Any aAny;
+        sal_Bool bOn = pColumnSep != 0;
+
+        aAny.setValue( &bOn, ::getBooleanCppuType() );
+        xPropSet->setPropertyValue( sSeparatorLineIsOn, aAny );
+
+        if( pColumnSep )
+        {
+            if( pColumnSep->GetWidth() )
+            {
+                aAny <<= pColumnSep->GetWidth();
+                xPropSet->setPropertyValue( sSeparatorLineWidth, aAny );
+            }
+            if( pColumnSep->GetHeight() )
+            {
+                aAny <<= pColumnSep->GetHeight();
+                xPropSet->setPropertyValue( sSeparatorLineRelativeHeight,
+                                            aAny );
+            }
+            if ( pColumnSep->GetStyle() )
+            {
+                aAny <<= pColumnSep->GetStyle();
+                xPropSet->setPropertyValue( sSeparatorLineStyle, aAny );
+            }
+
+            aAny <<= pColumnSep->GetColor();
+            xPropSet->setPropertyValue( sSeparatorLineColor, aAny );
+
+            aAny <<= pColumnSep->GetVertAlign();
+            xPropSet->setPropertyValue( sSeparatorLineVerticalAlignment, aAny );
+        }
+
+        // handle 'automatic columns': column distance
+        if( bAutomatic )
+        {
+            aAny <<= nAutomaticDistance;
+            xPropSet->setPropertyValue( sAutomaticDistance, aAny );
+        }
+    }
+
+    aProp.maValue <<= xColumns;
+
+    SetInsert( true );
+    XMLElementPropertyContext::endFastElement(Element);
+
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 97d6d69c84f96d02faf4b24964eaa1c19ce0d3df
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 09:36:23 2015 +0100

    XMLTextColumnSepContext_Impl implements fastparser
    
    ... interface
    
    Change-Id: I193c46caa7dee76a77a6d5bc017ac95c5f97509e

diff --git a/xmloff/source/text/XMLTextColumnsContext.cxx b/xmloff/source/text/XMLTextColumnsContext.cxx
index e93800c..751c53e 100644
--- a/xmloff/source/text/XMLTextColumnsContext.cxx
+++ b/xmloff/source/text/XMLTextColumnsContext.cxx
@@ -245,6 +245,9 @@ public:
                                const uno::Reference<
                                        xml::sax::XAttributeList > & xAttrList,
                                const SvXMLTokenMap& rTokenMap );
+    XMLTextColumnSepContext_Impl( SvXMLImport& rImport, sal_Int32 Element,
+            const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
+            const SvXMLTokenMap& rTokenMap );
 
     virtual ~XMLTextColumnSepContext_Impl();
 
@@ -318,6 +321,58 @@ XMLTextColumnSepContext_Impl::XMLTextColumnSepContext_Impl(
     }
 }
 
+XMLTextColumnSepContext_Impl::XMLTextColumnSepContext_Impl(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
+    const SvXMLTokenMap& rTokenMap )
+:   SvXMLImportContext( rImport ),
+    nWidth( 2 ),
+    nColor( 0 ),
+    nHeight( 100 ),
+    nStyle( 1 ),
+    eVertAlign( VerticalAlignment_TOP )
+{
+    uno::Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+    for( xml::FastAttribute attribute : attributes )
+    {
+        sal_Int32 nVal;
+        switch( rTokenMap.Get( attribute.Token ) )
+        {
+        case XML_TOK_COLUMN_SEP_WIDTH:
+            if( GetImport().GetMM100UnitConverter().
+                    convertMeasureToCore( nVal, attribute.Value ) )
+                nWidth = nVal;
+            break;
+        case XML_TOK_COLUMN_SEP_HEIGHT:
+            if( ::sax::Converter::convertPercent( nVal, attribute.Value )
+                && nVal >= 1 && nVal <= 100 )
+                nHeight = (sal_Int8)nVal;
+            break;
+        case XML_TOK_COLUMN_SEP_COLOR:
+            {
+                ::sax::Converter::convertColor( nColor, attribute.Value );
+            }
+            break;
+        case XML_TOK_COLUMN_SEP_ALIGN:
+            {
+                sal_uInt16 nAlign;
+                if( SvXMLUnitConverter::convertEnum( nAlign, attribute.Value,
+                            pXML_Sep_Align_Enum ) )
+                    eVertAlign = (VerticalAlignment)nAlign;
+            }
+            break;
+        case XML_TOK_COLUMN_SEP_STYLE:
+            {
+                sal_uInt16 nStyleVal;
+                if( SvXMLUnitConverter::convertEnum( nStyleVal, attribute.Value,
+                            pXML_Sep_Style_Enum ) )
+                    nStyle = (sal_Int8)nStyleVal;
+            }
+            break;
+        }
+    }
+}
+
 XMLTextColumnSepContext_Impl::~XMLTextColumnSepContext_Impl()
 {
 }
commit 2172d78c068441cec3360c2afaeb573a62229019
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 09:35:09 2015 +0100

    XMLTextColumnContext_Impl implements fastparser ..
    
    interface
    
    Change-Id: I42463ad08bcdf9e03338d8cdfb0db6caa582b4f9

diff --git a/xmloff/source/text/XMLTextColumnsContext.cxx b/xmloff/source/text/XMLTextColumnsContext.cxx
index ab6776d..e93800c 100644
--- a/xmloff/source/text/XMLTextColumnsContext.cxx
+++ b/xmloff/source/text/XMLTextColumnsContext.cxx
@@ -116,6 +116,9 @@ public:
                                const uno::Reference<
                                        xml::sax::XAttributeList > & xAttrList,
                                const SvXMLTokenMap& rTokenMap );
+    XMLTextColumnContext_Impl( SvXMLImport& rImport, sal_Int32 Element,
+        const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
+        const SvXMLTokenMap& rTokenMap );
 
     virtual ~XMLTextColumnContext_Impl();
 
@@ -178,6 +181,50 @@ XMLTextColumnContext_Impl::XMLTextColumnContext_Impl(
     }
 }
 
+XMLTextColumnContext_Impl::XMLTextColumnContext_Impl(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    const uno::Reference< xml::sax::XFastAttributeList >& xAttrList,
+    const SvXMLTokenMap& rTokenMap )
+:   SvXMLImportContext( rImport )
+{
+    aColumn.Width = 0;
+    aColumn.LeftMargin = 0;
+    aColumn.RightMargin = 0;
+
+    uno::Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+    for( xml::FastAttribute attribute : attributes )
+    {
+        sal_Int32 nVal;
+        switch( rTokenMap.Get( attribute.Token ) )
+        {
+        case XML_TOK_COLUMN_WIDTH:
+            {
+                sal_Int32 nPos = attribute.Value.indexOf( (sal_Unicode)'*' );
+                if( nPos != -1 && nPos+1 == attribute.Value.getLength() )
+                {
+                    OUString sTmp( attribute.Value.copy( 0, nPos ) );
+                    if( ::sax::Converter::convertNumber(
+                                nVal, sTmp, 0, USHRT_MAX ) )
+                        aColumn.Width = nVal;
+                }
+            }
+            break;
+        case XML_TOK_COLUMN_MARGIN_LEFT:
+            if( GetImport().GetMM100UnitConverter().
+                    convertMeasureToCore( nVal, attribute.Value ) )
+                aColumn.LeftMargin = nVal;
+            break;
+        case XML_TOK_COLUMN_MARGIN_RIGHT:
+            if( GetImport().GetMM100UnitConverter().
+                    convertMeasureToCore( nVal, attribute.Value ) )
+                aColumn.RightMargin = nVal;
+            break;
+        default:
+            break;
+        }
+    }
+}
+
 XMLTextColumnContext_Impl::~XMLTextColumnContext_Impl()
 {
 }
commit 1922d127ea27085783cfa7007a579cc06296c7ad
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 09:32:29 2015 +0100

    XMLElementPropertyContext implements fastparser ..
    
    interface
    
    Change-Id: I0703a6f8cb4fcfe121260a56a743369afb69300e

diff --git a/xmloff/inc/XMLElementPropertyContext.hxx b/xmloff/inc/XMLElementPropertyContext.hxx
index f89630b..b16153f 100644
--- a/xmloff/inc/XMLElementPropertyContext.hxx
+++ b/xmloff/inc/XMLElementPropertyContext.hxx
@@ -46,10 +46,15 @@ public:
                                const OUString& rLName,
                                const XMLPropertyState& rProp,
                                 ::std::vector< XMLPropertyState > &rProps );
+    XMLElementPropertyContext( SvXMLImport& rImport, sal_Int32 Element,
+            const XMLPropertyState& rProp,
+            ::std::vector< XMLPropertyState >& rProps );
 
     virtual ~XMLElementPropertyContext();
 
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 };
 
 
diff --git a/xmloff/source/style/XMLElementPropertyContext.cxx b/xmloff/source/style/XMLElementPropertyContext.cxx
index 79198a7..02b23e5 100644
--- a/xmloff/source/style/XMLElementPropertyContext.cxx
+++ b/xmloff/source/style/XMLElementPropertyContext.cxx
@@ -34,6 +34,17 @@ XMLElementPropertyContext::XMLElementPropertyContext (
 {
 }
 
+XMLElementPropertyContext::XMLElementPropertyContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    const XMLPropertyState& rProp,
+    std::vector< XMLPropertyState >& rProps )
+:   SvXMLImportContext( rImport ),
+    bInsert( false ),
+    rProperties( rProps ),
+    aProp( rProp )
+{
+}
+
 XMLElementPropertyContext::~XMLElementPropertyContext()
 {
 }
@@ -44,5 +55,12 @@ void XMLElementPropertyContext::EndElement( )
         rProperties.push_back( aProp );
 }
 
+void SAL_CALL XMLElementPropertyContext::endFastElement( sal_Int32 /*Element*/ )
+    throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception)
+{
+    if( bInsert )
+        rProperties.push_back( aProp );
+}
+
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit f807150007a99fbc35704c2f7f76db6fc38d465b
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:39:55 2015 +0100

    XMLTextFrameContext method implementation ...
    
    for fastparser usage
    
    Change-Id: If0566704ba269c0fbee0890e5d7284385a8bde58

diff --git a/xmloff/source/text/XMLTextFrameContext.cxx b/xmloff/source/text/XMLTextFrameContext.cxx
index 64e5b2f..50c7e28 100644
--- a/xmloff/source/text/XMLTextFrameContext.cxx
+++ b/xmloff/source/text/XMLTextFrameContext.cxx
@@ -1656,6 +1656,35 @@ XMLTextFrameContext::XMLTextFrameContext(
     m_HasAutomaticStyleWithoutParentStyle( false ),
     m_bSupportsReplacement( false )
 {
+    if( xAttrList.is() )
+    {
+        if( xAttrList->hasAttribute( NAMESPACE | XML_NAMESPACE_DRAW | XML_style_name ) )
+        {
+            OUString aStyleName = xAttrList->getValue( NAMESPACE | XML_NAMESPACE_DRAW | XML_style_name );
+            if( !aStyleName.isEmpty() )
+            {
+                rtl::Reference< XMLTextImportHelper > xTxtImport =
+                    GetImport().GetTextImport();
+                XMLPropStyleContext* pStyle( 0L );
+                pStyle = xTxtImport->FindAutoFrameStyle( aStyleName );
+                if( pStyle && pStyle->GetParentName().isEmpty() )
+                {
+                    m_HasAutomaticStyleWithoutParentStyle = true;
+                }
+            }
+        }
+        else if( xAttrList->hasAttribute( NAMESPACE | XML_NAMESPACE_TEXT | XML_anchor_type ) )
+        {
+            TextContentAnchorType eNew;
+            if( XMLAnchorTypePropHdl::convert(
+                    xAttrList->getValue( NAMESPACE | XML_NAMESPACE_TEXT | XML_anchor_type ), eNew )
+                && ( TextContentAnchorType_AT_PARAGRAPH == eNew ||
+                     TextContentAnchorType_AT_CHARACTER == eNew ||
+                     TextContentAnchorType_AS_CHARACTER == eNew ||
+                     TextContentAnchorType_AT_PAGE == eNew ) )
+                m_eDefaultAnchorType = eNew;
+        }
+    }
 }
 
 XMLTextFrameContext::~XMLTextFrameContext()
@@ -1706,6 +1735,43 @@ void XMLTextFrameContext::EndElement()
 void SAL_CALL XMLTextFrameContext::endFastElement( sal_Int32 /*Element*/ )
     throw(RuntimeException, SAXException, std::exception)
 {
+    /// solve if multiple image child contexts were imported
+    SvXMLImportContextRef const pMultiContext(solveMultipleImages());
+
+    SvXMLImportContext const*const pContext =
+        (pMultiContext) ? &pMultiContext : &m_xImplContext;
+    XMLTextFrameContext_Impl *pImpl = const_cast<XMLTextFrameContext_Impl*>(PTR_CAST( XMLTextFrameContext_Impl, pContext ));
+    assert(!pMultiContext || pImpl);
+    if( pImpl )
+    {
+        pImpl->CreateIfNotThere();
+
+        // fdo#68839: in case the surviving image was not the first one,
+        // it will have a counter added to its name - set the original name
+        if (pMultiContext) // do this only when necessary; esp. not for text
+        {                  // frames that may have entries in GetRenameMap()!
+            pImpl->SetName();
+        }
+
+        if( !m_sTitle.isEmpty() )
+        {
+            pImpl->SetTitle( m_sTitle );
+        }
+        if( !m_sDesc.isEmpty() )
+        {
+            pImpl->SetDesc( m_sDesc );
+        }
+
+        if( m_pHyperlink )
+        {
+            pImpl->SetHyperlink( m_pHyperlink->GetHRef(), m_pHyperlink->GetName(),
+                          m_pHyperlink->GetTargetFrameName(), m_pHyperlink->GetMap() );
+            delete m_pHyperlink;
+            m_pHyperlink = 0;
+        }
+
+    }
+
 }
 
 SvXMLImportContext *XMLTextFrameContext::CreateChildContext(
@@ -1918,11 +1984,186 @@ SvXMLImportContext *XMLTextFrameContext::CreateChildContext(
 }
 
 Reference< XFastContextHandler > SAL_CALL
-    XMLTextFrameContext::createFastChildContext( sal_Int32 /*Element*/,
-    const Reference< XFastAttributeList >& /*xAttrList*/ )
+    XMLTextFrameContext::createFastChildContext( sal_Int32 Element,
+    const Reference< XFastAttributeList >& xAttrList )
     throw(RuntimeException, SAXException, std::exception)
 {
-    Reference< XFastContextHandler > pContext = 0;
+    SvXMLImportContext *pContext = 0;
+
+    if( !m_xImplContext.Is() )
+    {
+        // no child exists
+        sal_uInt16 nFrameType = USHRT_MAX;
+        if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_text_box) )
+            nFrameType = XML_TEXT_FRAME_TEXTBOX;
+        else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_image) )
+            nFrameType = XML_TEXT_FRAME_GRAPHIC;
+        else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_object) )
+            nFrameType = XML_TEXT_FRAME_OBJECT;
+        else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_object_ole) )
+            nFrameType = XML_TEXT_FRAME_OBJECT_OLE;
+        else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_applet) )
+            nFrameType = XML_TEXT_FRAME_APPLET;
+        else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_plugin) )
+            nFrameType = XML_TEXT_FRAME_PLUGIN;
+        else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_floating_frame) )
+            nFrameType = XML_TEXT_FRAME_FLOATING_FRAME;
+
+        if( USHRT_MAX != nFrameType )
+        {
+            // Shapes in Writer cannot be named via context menu (#i51726#)
+            if( ( XML_TEXT_FRAME_TEXTBOX == nFrameType ||
+                  XML_TEXT_FRAME_GRAPHIC == nFrameType ) &&
+                m_HasAutomaticStyleWithoutParentStyle )
+            {
+                Reference< XShapes > xShapes;
+                pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
+                        GetImport(), Element, xAttrList, xShapes, m_xFastAttrList );
+            }
+            else if( XML_TEXT_FRAME_PLUGIN == nFrameType )
+            {
+                bool bMedia = false;
+
+                // check, if we have a media object
+                if( xAttrList->hasAttribute( NAMESPACE | XML_NAMESPACE_DRAW | XML_mime_type ) )
+                {
+                    bMedia = xAttrList->getValue( NAMESPACE | XML_NAMESPACE_DRAW | XML_mime_type ).equals(
+                            "application/vnd.sun.star.media" );
+                }
+
+                if( bMedia )
+                {
+                    Reference< XShapes > xShapes;
+                    pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
+                        GetImport(), Element, xAttrList, xShapes, m_xFastAttrList );
+                }
+            }
+            else if( XML_TEXT_FRAME_OBJECT == nFrameType ||
+                     XML_TEXT_FRAME_OBJECT_OLE == nFrameType )
+            {
+                m_bSupportsReplacement = true;
+            }
+            else if( XML_TEXT_FRAME_GRAPHIC == nFrameType )
+            {
+                setSupportsMultipleContents( xAttrList->hasAttribute(
+                    NAMESPACE | XML_NAMESPACE_DRAW | XML_image ) );
+            }
+
+            if( !pContext )
+            {
+                pContext = new XMLTextFrameContext_Impl( GetImport(),
+                        Element, xAttrList, m_eDefaultAnchorType,
+                        nFrameType, m_xFastAttrList );
+            }
+
+            m_xImplContext = pContext;
+
+            if( getSupportsMultipleContents()
+                && XML_TEXT_FRAME_GRAPHIC == nFrameType )
+            {
+                addContent(*m_xImplContext);
+            }
+        }
+    }
+    else if( getSupportsMultipleContents() &&
+            Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_image) )
+    {
+        // read another image
+        pContext = new XMLTextFrameContext_Impl(
+            GetImport(), Element, xAttrList,
+            m_eDefaultAnchorType, XML_TEXT_FRAME_GRAPHIC, m_xFastAttrList );
+
+        m_xImplContext = pContext;
+        addContent(*m_xImplContext);
+    }
+    else if( m_bSupportsReplacement && !m_xReplImplContext &&
+            Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_image) )
+    {
+        // read replacement image
+        Reference< XPropertySet > xPropSet;
+        if( CreateIfNotThere( xPropSet ) )
+        {
+            pContext = new XMLReplacementImageContext( GetImport(),
+                    Element, xAttrList, xPropSet );
+            m_xReplImplContext = pContext;
+        }
+    }
+    else if( m_xImplContext-ISA( XMLTextFrameContext_Impl ) )
+    {
+        // the child is a writer frame
+        // Implement Title/Description Elements UI (#i73249#)
+        const bool bOld = SvXMLImport::OOo_2x >= GetImport().getGeneratorVersion();
+        if( Element == (NAMESPACE | XML_NAMESPACE_SVG | XML_desc) )
+        {
+            if( bOld )
+            {
+                pContext = new XMLTextFrameTitleOrDescContext_Impl(
+                        GetImport(), Element, m_sTitle );
+            }
+            else
+            {
+                pContext = new XMLTextFrameTitleOrDescContext_Impl(
+                        GetImport(), Element, m_sDesc );
+            }
+        }
+        else if( Element == (NAMESPACE | XML_NAMESPACE_SVG | XML_title) )
+        {
+            pContext= new XMLTextFrameTitleOrDescContext_Impl(
+                    GetImport(), Element, m_sTitle );
+        }
+        else
+        {
+            Reference< XPropertySet > xPropSet;
+            if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_contour_polygon) )
+            {
+                if( CreateIfNotThere( xPropSet ) )
+                    pContext = new XMLTextFrameContourContext_Impl(
+                        GetImport(), Element, xAttrList, xPropSet, false );
+            }
+            else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_contour_path) )
+            {
+                if( CreateIfNotThere( xPropSet ) )
+                    pContext = new XMLTextFrameContourContext_Impl(
+                        GetImport(), Element, xAttrList, xPropSet, true );
+            }
+            else if( Element == (NAMESPACE | XML_NAMESPACE_DRAW | XML_image_map) )
+            {
+                if( CreateIfNotThere( xPropSet ) )
+                    pContext = new XMLImageMapContext(
+                            GetImport(), Element, xPropSet );
+            }
+            else if( Element == (NAMESPACE | XML_NAMESPACE_OFFICE | XML_event_listeners) )
+            {
+                // do we still have the frame object?
+                if( CreateIfNotThere( xPropSet ) )
+                {
+                    // is it an event supplier?
+                    Reference< XEventsSupplier > xEventsSupplier(xPropSet, UNO_QUERY);
+                    if( xEventsSupplier.is() )
+                    {
+                        // OK, we have the events, so create the context
+                        pContext = new XMLEventsImportContext(
+                                GetImport(), Element, xEventsSupplier );
+                    }
+                }
+            }
+        }
+    }
+    else if( Element == (NAMESPACE | XML_NAMESPACE_SVG | XML_title) // #i68101#
+          || Element == (NAMESPACE | XML_NAMESPACE_SVG | XML_desc) )
+    {
+        pContext = static_cast< SvXMLImportContext* >(
+            m_xImplContext->createFastChildContext( Element, xAttrList ).get() );
+    }
+    else
+    {
+        // the child is a drawing shape
+        pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
+                &m_xImplContext, Element, xAttrList );
+    }
+
+    if( !pContext )
+        pContext = new SvXMLImportContext( GetImport() );
 
     return pContext;
 }
commit 3e220703a36b3ac77bae0c7915b34582983b38b3
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:38:01 2015 +0100

    XMLImageMapContext implements fastparser interface
    
    Change-Id: Ic070707a473bbb40f933bef71689ee2c6e30f7db

diff --git a/xmloff/inc/XMLImageMapContext.hxx b/xmloff/inc/XMLImageMapContext.hxx
index 6110522..2734df38 100644
--- a/xmloff/inc/XMLImageMapContext.hxx
+++ b/xmloff/inc/XMLImageMapContext.hxx
@@ -53,6 +53,8 @@ public:
         const OUString& rLocalName,
         ::com::sun::star::uno::Reference<
             ::com::sun::star::beans::XPropertySet> & rPropertySet);
+    XMLImageMapContext( SvXMLImport& rImport, sal_Int32 Element,
+        css::uno::Reference< css::beans::XPropertySet >& rPropertySet );
 
     virtual ~XMLImageMapContext();
 
@@ -61,8 +63,14 @@ public:
         const OUString& rLocalName,
         const ::com::sun::star::uno::Reference<
             ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 };
 
 #endif
diff --git a/xmloff/source/draw/XMLImageMapContext.cxx b/xmloff/source/draw/XMLImageMapContext.cxx
index 2e3e06a..5d1497f 100644
--- a/xmloff/source/draw/XMLImageMapContext.cxx
+++ b/xmloff/source/draw/XMLImageMapContext.cxx
@@ -825,6 +825,27 @@ XMLImageMapContext::XMLImageMapContext(
     }
 }
 
+XMLImageMapContext::XMLImageMapContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    Reference< XPropertySet >& rPropertySet )
+:   SvXMLImportContext( rImport ),
+    sImageMap("ImageMap"),
+    xPropertySet(rPropertySet)
+{
+    try
+    {
+        Reference< XPropertySetInfo > xInfo =
+            xPropertySet->getPropertySetInfo();
+        if( xInfo.is() && xInfo->hasPropertyByName( sImageMap ) )
+            xPropertySet->getPropertyValue(sImageMap) >>= xImageMap;
+    }
+    catch(const com::sun::star::uno::Exception& e)
+    {
+        uno::Sequence<OUString> aSeq(0);
+        rImport.SetError( XMLERROR_FLAG_WARNING | XMLERROR_API , aSeq, e.Message, NULL );
+    }
+}
+
 XMLImageMapContext::~XMLImageMapContext()
 {
 }
@@ -861,6 +882,35 @@ SvXMLImportContext *XMLImageMapContext::CreateChildContext(
     return pContext;
 }
 
+Reference< XFastContextHandler > SAL_CALL
+    XMLImageMapContext::createFastChildContext( sal_Int32 Element,
+    const Reference< XFastAttributeList >& xAttrList )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    Reference< XFastContextHandler > pContext = NULL;
+
+    if( Element == (FastToken::NAMESPACE | XML_NAMESPACE_DRAW | XML_area_rectangle) )
+    {
+        pContext = new XMLImageMapRectangleContext(
+                GetImport(), Element, xImageMap );
+    }
+    else if( Element == (FastToken::NAMESPACE | XML_NAMESPACE_DRAW | XML_area_polygon) )
+    {
+        pContext = new XMLImageMapPolygonContext(
+                GetImport(), Element, xImageMap );
+    }
+    else if( Element == (FastToken::NAMESPACE | XML_NAMESPACE_DRAW | XML_area_circle) )
+    {
+        pContext = new XMLImageMapCircleContext(
+                GetImport(), Element, xImageMap );
+    }
+    else
+        pContext = SvXMLImportContext::createFastChildContext(
+                Element, xAttrList );
+
+    return pContext;
+}
+
 void XMLImageMapContext::EndElement()
 {
     Reference < XPropertySetInfo > xInfo =
@@ -869,4 +919,14 @@ void XMLImageMapContext::EndElement()
         xPropertySet->setPropertyValue(sImageMap, uno::makeAny( xImageMap ) );
 }
 
+void SAL_CALL XMLImageMapContext::endFastElement( sal_Int32 /*Element*/ )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    Reference < XPropertySetInfo > xInfo =
+        xPropertySet->getPropertySetInfo();
+    if( xInfo.is() && xInfo->hasPropertyByName( sImageMap ) )
+        xPropertySet->setPropertyValue(sImageMap, uno::makeAny( xImageMap ) );
+}
+
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit ba521d4de0144263095d6d49438b0041b3cadd78
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:36:25 2015 +0100

    XMLImageMapCircleContext implements fastparser ...
    
    interface
    
    Change-Id: I7922186249d7d7afeab0c3b6033a4a1bf0da0439

diff --git a/xmloff/source/draw/XMLImageMapContext.cxx b/xmloff/source/draw/XMLImageMapContext.cxx
index 6d016da..2e3e06a 100644
--- a/xmloff/source/draw/XMLImageMapContext.cxx
+++ b/xmloff/source/draw/XMLImageMapContext.cxx
@@ -689,6 +689,8 @@ public:
         const OUString& rLocalName,
         ::com::sun::star::uno::Reference<
             ::com::sun::star::container::XIndexContainer> xMap);
+    XMLImageMapCircleContext( SvXMLImport& rImport, sal_Int32 Element,
+        css::uno::Reference< css::container::XIndexContainer > xMap );
 
     virtual ~XMLImageMapCircleContext();
 
@@ -718,6 +720,18 @@ XMLImageMapCircleContext::XMLImageMapCircleContext(
 {
 }
 
+XMLImageMapCircleContext::XMLImageMapCircleContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    Reference< XIndexContainer > xMap )
+:   XMLImageMapObjectContext( rImport, Element, xMap,
+        "com.sun.star.image.ImageMapCircleObject" ),
+    nRadius(0),
+    bXOK(false),
+    bYOK(false),
+    bRadiusOK(false)
+{
+}
+
 XMLImageMapCircleContext::~XMLImageMapCircleContext()
 {
 }
commit 030f3a3d96a01db773010ac0e30c6bedb63b52c1
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:35:37 2015 +0100

    XMLImageMapPolygonContext implements fastparser ..
    
    interface
    
    Change-Id: I6bc4a707edacc7006d8b2621b4c07ba862110ca4

diff --git a/xmloff/source/draw/XMLImageMapContext.cxx b/xmloff/source/draw/XMLImageMapContext.cxx
index ccff4c5..6d016da 100644
--- a/xmloff/source/draw/XMLImageMapContext.cxx
+++ b/xmloff/source/draw/XMLImageMapContext.cxx
@@ -579,6 +579,8 @@ public:
         const OUString& rLocalName,
         ::com::sun::star::uno::Reference<
             ::com::sun::star::container::XIndexContainer> xMap);
+    XMLImageMapPolygonContext( SvXMLImport& rImport, sal_Int32 Element,
+        css::uno::Reference< css::container::XIndexContainer > xMap );
 
     virtual ~XMLImageMapPolygonContext();
 
@@ -608,6 +610,16 @@ XMLImageMapPolygonContext::XMLImageMapPolygonContext(
 {
 }
 
+XMLImageMapPolygonContext::XMLImageMapPolygonContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    Reference< XIndexContainer > xMap )
+:   XMLImageMapObjectContext( rImport, Element, xMap,
+        "com.sun.star.image.ImageMapPolygonObject" ),
+    bViewBoxOK(false),
+    bPointsOK(false)
+{
+}
+
 XMLImageMapPolygonContext::~XMLImageMapPolygonContext()
 {
 }
commit 79d949357f3a1e5252e7f86fdfbd1ccd90856c27
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:34:33 2015 +0100

    XMLImageMapRectangleContext implements fastparser
    
    interface
    
    Change-Id: Idf8dd856ea53c338f48b112c29526d430bc617c2

diff --git a/xmloff/source/draw/XMLImageMapContext.cxx b/xmloff/source/draw/XMLImageMapContext.cxx
index 279ccfe..ccff4c5 100644
--- a/xmloff/source/draw/XMLImageMapContext.cxx
+++ b/xmloff/source/draw/XMLImageMapContext.cxx
@@ -455,6 +455,8 @@ public:
         const OUString& rLocalName,
         ::com::sun::star::uno::Reference<
             ::com::sun::star::container::XIndexContainer> xMap);
+    XMLImageMapRectangleContext( SvXMLImport& rImport, sal_Int32 Element,
+        css::uno::Reference< css::container::XIndexContainer > xMap );
 
     virtual ~XMLImageMapRectangleContext();
 
@@ -486,6 +488,18 @@ XMLImageMapRectangleContext::XMLImageMapRectangleContext(
 {
 }
 
+XMLImageMapRectangleContext::XMLImageMapRectangleContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    Reference< XIndexContainer > xMap )
+:   XMLImageMapObjectContext( rImport, Element, xMap,
+        "com.sun.star.image.ImageMapRectangleObject" ),
+    bXOK(false),
+    bYOK(false),
+    bWidthOK(false),
+    bHeightOK(false)
+{
+}
+
 XMLImageMapRectangleContext::~XMLImageMapRectangleContext()
 {
 }
commit 55d3fcf04b02c697d3918548624652f71dc67a1e
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:32:29 2015 +0100

    XMLImageMapObjectContext implements fastparser ...
    
    interface
    
    Change-Id: I5c902b83bb28ccd055c9e5e8d63a7baa78ce57b2

diff --git a/xmloff/source/draw/XMLImageMapContext.cxx b/xmloff/source/draw/XMLImageMapContext.cxx
index d50ffeb..279ccfe 100644
--- a/xmloff/source/draw/XMLImageMapContext.cxx
+++ b/xmloff/source/draw/XMLImageMapContext.cxx
@@ -151,18 +151,30 @@ public:
         ::com::sun::star::uno::Reference<
             ::com::sun::star::container::XIndexContainer> xMap,
         const sal_Char* pServiceName);
+    XMLImageMapObjectContext( SvXMLImport& rImport, sal_Int32 Element,
+        css::uno::Reference< css::container::XIndexContainer > xMap,
+        const sal_Char* pServiceName );
 
     void StartElement(
         const ::com::sun::star::uno::Reference<
         ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual void SAL_CALL startFastElement( sal_Int32 Element,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     SvXMLImportContext *CreateChildContext(
         sal_uInt16 nPrefix,
         const OUString& rLocalName,
         const ::com::sun::star::uno::Reference<
             ::com::sun::star::xml::sax::XAttributeList> & xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
 protected:
 
@@ -220,6 +232,47 @@ XMLImageMapObjectContext::XMLImageMapObjectContext(
     // else: can't even get factory -> ignore
 }
 
+XMLImageMapObjectContext::XMLImageMapObjectContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    Reference<XIndexContainer> xMap,
+    const sal_Char* pServiceName)
+:   SvXMLImportContext(rImport),
+    sBoundary("Boundary"),
+    sCenter("Center"),
+    sTitle("Title"),
+    sDescription("Description"),
+    sImageMap("ImageMap"),
+    sIsActive("IsActive"),
+    sName("Name"),
+    sPolygon("Polygon"),
+    sRadius("Radius"),
+    sTarget("Target"),
+    sURL("URL"),
+    xImageMap(xMap),
+    bIsActive(true),
+    bValid(false)
+{
+    DBG_ASSERT(NULL != pServiceName,
+               "Please supply the image map object service name");
+
+    Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(),UNO_QUERY);
+    if( xFactory.is() )
+    {
+        Reference<XInterface> xIfc = xFactory->createInstance(
+            OUString::createFromAscii(pServiceName));
+        DBG_ASSERT(xIfc.is(), "can't create image map object!");
+        if( xIfc.is() )
+        {
+            Reference<XPropertySet> xPropertySet( xIfc, UNO_QUERY );
+
+            xMapEntry = xPropertySet;
+        }
+        // else: can't create service -> ignore
+    }
+    // else: can't even get factory -> ignore
+}
+
+
 void XMLImageMapObjectContext::StartElement(
     const Reference<XAttributeList >& xAttrList )
 {
@@ -239,6 +292,20 @@ void XMLImageMapObjectContext::StartElement(
     }
 }
 
+void SAL_CALL XMLImageMapObjectContext::startFastElement( sal_Int32 /*Element*/,
+    const Reference< XFastAttributeList >& xAttrList )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    SvXMLTokenMap aMap(aImageMapObjectTokenMap);
+
+    css::uno::Sequence< css::xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+    for( css::xml::FastAttribute attribute : attributes )
+    {
+        ProcessAttribute((enum XMLImageMapToken)aMap.Get( attribute.Token ),
+                attribute.Value );
+    }
+}
+
 void XMLImageMapObjectContext::EndElement()
 {
     // only create and insert image map object if validity flag is set
@@ -256,6 +323,24 @@ void XMLImageMapObjectContext::EndElement()
     // else: not valid -> don't create and insert
 }
 
+void SAL_CALL XMLImageMapObjectContext::endFastElement( sal_Int32 /*Element*/ )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    // only create and insert image map object if validity flag is set
+    // (and we actually have an image map)
+    if ( bValid && xImageMap.is() && xMapEntry.is() )
+    {
+        // set values
+        Prepare( xMapEntry );
+
+        // insert into image map
+        Any aAny;
+        aAny <<= xMapEntry;
+        xImageMap->insertByIndex( xImageMap->getCount(), aAny );
+    }
+    // else: not valid -> don't create and insert
+}
+
 SvXMLImportContext* XMLImageMapObjectContext::CreateChildContext(
     sal_uInt16 nPrefix,
     const OUString& rLocalName,
@@ -286,6 +371,32 @@ SvXMLImportContext* XMLImageMapObjectContext::CreateChildContext(
 
 }
 
+Reference< XFastContextHandler > SAL_CALL
+    XMLImageMapObjectContext::createFastChildContext( sal_Int32 Element,
+    const Reference< XFastAttributeList >& xAttrList )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    if( Element == (FastToken::NAMESPACE | XML_NAMESPACE_OFFICE | XML_event_listeners) )
+    {
+        Reference< XEventsSupplier > xEvents( xMapEntry, UNO_QUERY );
+        return new XMLEventsImportContext(
+                GetImport(), Element, xEvents );
+    }
+    else if( Element == (FastToken::NAMESPACE | XML_NAMESPACE_SVG | XML_title) )
+    {
+        return new XMLStringBufferImportContext(
+                GetImport(), Element, sTitleBuffer );
+    }
+    else if( Element == (FastToken::NAMESPACE | XML_NAMESPACE_SVG | XML_desc) )
+    {
+        return new XMLStringBufferImportContext(
+                GetImport(), Element, sDescriptionBuffer );
+    }
+    else
+        return SvXMLImportContext::createFastChildContext(
+                Element, xAttrList );
+}
+
 void XMLImageMapObjectContext::ProcessAttribute(
     enum XMLImageMapToken eToken,
     const OUString& rValue)
commit d1fe9bd54f46c2202a4860e532e054aa2cb7d098
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:30:24 2015 +0100

    XMLStringBufferImportContext implements fastparser
    
    interface
    
    Change-Id: I4cb0a48035b10fefbbf3bc15bbaeef66a8ae55bb

diff --git a/xmloff/inc/XMLStringBufferImportContext.hxx b/xmloff/inc/XMLStringBufferImportContext.hxx
index 332dc2d..d71cf17 100644
--- a/xmloff/inc/XMLStringBufferImportContext.hxx
+++ b/xmloff/inc/XMLStringBufferImportContext.hxx
@@ -43,6 +43,8 @@ public:
         sal_uInt16 nPrefix,
         const OUString& sLocalName,
         OUStringBuffer& rBuffer);
+    XMLStringBufferImportContext( SvXMLImport& rImport, sal_Int32 Element,
+        OUStringBuffer& rBuffer );
 
     virtual ~XMLStringBufferImportContext();
 
@@ -51,11 +53,19 @@ public:
         const OUString& rLocalName,
         const ::com::sun::star::uno::Reference<
             ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     virtual void Characters(
         const OUString& rChars ) SAL_OVERRIDE;
+    virtual void SAL_CALL characters( const OUString& rChars )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 };
 
 #endif
diff --git a/xmloff/source/text/XMLStringBufferImportContext.cxx b/xmloff/source/text/XMLStringBufferImportContext.cxx
index dbbfc41..51596ed 100644
--- a/xmloff/source/text/XMLStringBufferImportContext.cxx
+++ b/xmloff/source/text/XMLStringBufferImportContext.cxx
@@ -20,12 +20,17 @@
 #include "XMLStringBufferImportContext.hxx"
 #include <xmloff/xmltoken.hxx>
 #include <xmloff/xmlnmspe.hxx>
+#include <xmloff/token/tokens.hxx>
+#include <com/sun/star/xml/sax/FastToken.hpp>
 
 
 using ::com::sun::star::uno::Reference;
 using ::com::sun::star::xml::sax::XAttributeList;
 using ::xmloff::token::IsXMLToken;
 using ::xmloff::token::XML_P;
+using xmloff::XML_p;
+using css::xml::sax::FastToken::NAMESPACE;
+using namespace css::xml::sax;
 
 
 TYPEINIT1(XMLStringBufferImportContext, SvXMLImportContext);
@@ -40,6 +45,14 @@ XMLStringBufferImportContext::XMLStringBufferImportContext(
 {
 }
 
+XMLStringBufferImportContext::XMLStringBufferImportContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    OUStringBuffer& rBuffer )
+:   SvXMLImportContext( rImport ),
+    rTextBuffer(rBuffer)
+{
+}
+
 XMLStringBufferImportContext::~XMLStringBufferImportContext()
 {
 }
@@ -53,12 +66,27 @@ SvXMLImportContext *XMLStringBufferImportContext::CreateChildContext(
                                             rLocalName, rTextBuffer);
 }
 
+Reference< XFastContextHandler > SAL_CALL
+    XMLStringBufferImportContext::createFastChildContext( sal_Int32 Element,
+    const Reference< XFastAttributeList >& /*xAttrList*/ )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    return new XMLStringBufferImportContext( GetImport(),
+            Element, rTextBuffer );
+}
+
 void XMLStringBufferImportContext::Characters(
     const OUString& rChars )
 {
     rTextBuffer.append(rChars);
 }
 
+void SAL_CALL XMLStringBufferImportContext::characters( const OUString& rChars )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    rTextBuffer.append(rChars);
+}
+
 void XMLStringBufferImportContext::EndElement()
 {
     // add return for paragraph elements
@@ -69,4 +97,14 @@ void XMLStringBufferImportContext::EndElement()
     }
 }
 
+void SAL_CALL XMLStringBufferImportContext::endFastElement( sal_Int32 Element )
+    throw(css::uno::RuntimeException, SAXException, std::exception)
+{
+    // add return for paragraph elements
+    if( Element == (NAMESPACE | XML_NAMESPACE_TEXT | XML_p) )
+    {
+        rTextBuffer.append(sal_Unicode(0x0a));
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 80e8259dea583d5ccbe285244e013f6102f58642
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Fri Feb 27 08:19:25 2015 +0100

    changed ctor XMLEventsImportContext
    
    Change-Id: Id6912a1edbf96d2287fad7d67a69b29980e55179

diff --git a/include/xmloff/XMLEventsImportContext.hxx b/include/xmloff/XMLEventsImportContext.hxx
index e3b0c30..128f57d 100644
--- a/include/xmloff/XMLEventsImportContext.hxx
+++ b/include/xmloff/XMLEventsImportContext.hxx
@@ -70,7 +70,7 @@ public:
         SvXMLImport& rImport,
         sal_uInt16 nPrfx,
         const OUString& rLocalName);
-    XMLEventsImportContext( SvXMLImport& rImport );
+    XMLEventsImportContext( SvXMLImport& rImport, sal_Int32 Element );
 
     XMLEventsImportContext(
         SvXMLImport& rImport,
@@ -78,7 +78,7 @@ public:
         const OUString& rLocalName,
         const ::com::sun::star::uno::Reference<
             ::com::sun::star::document::XEventsSupplier> & xEventsSupplier);
-    XMLEventsImportContext( SvXMLImport& rImport,
+    XMLEventsImportContext( SvXMLImport& rImport, sal_Int32 Element,
         const css::uno::Reference< css::document::XEventsSupplier >& xEventsSupplier );
 
     XMLEventsImportContext(
@@ -87,7 +87,7 @@ public:
         const OUString& rLocalName,
         const ::com::sun::star::uno::Reference<
             ::com::sun::star::container::XNameReplace> & xNameRepl);
-    XMLEventsImportContext( SvXMLImport& rImport,
+    XMLEventsImportContext( SvXMLImport& rImport, sal_Int32 Element,
         const css::uno::Reference< css::container::XNameReplace >& xNameRepl);
 
     virtual ~XMLEventsImportContext();
diff --git a/xmloff/source/script/XMLEventsImportContext.cxx b/xmloff/source/script/XMLEventsImportContext.cxx
index c8e1b24..abc993b 100644
--- a/xmloff/source/script/XMLEventsImportContext.cxx
+++ b/xmloff/source/script/XMLEventsImportContext.cxx
@@ -52,7 +52,8 @@ XMLEventsImportContext::XMLEventsImportContext(
 {
 }
 
-XMLEventsImportContext::XMLEventsImportContext( SvXMLImport& rImport )
+XMLEventsImportContext::XMLEventsImportContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/ )
     : SvXMLImportContext( rImport )
 {
 }
@@ -67,7 +68,8 @@ XMLEventsImportContext::XMLEventsImportContext(
 {
 }
 
-XMLEventsImportContext::XMLEventsImportContext( SvXMLImport& rImport,
+XMLEventsImportContext::XMLEventsImportContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
     const Reference< XEventsSupplier >& xEventsSupplier )
 :   SvXMLImportContext( rImport ),
     xEvents( xEventsSupplier->getEvents() )
@@ -84,7 +86,8 @@ XMLEventsImportContext::XMLEventsImportContext(
 {
 }
 
-XMLEventsImportContext::XMLEventsImportContext( SvXMLImport& rImport,
+XMLEventsImportContext::XMLEventsImportContext(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
     const Reference< XNameReplace >& xNameReplace )
 :   SvXMLImportContext( rImport ),
     xEvents( xNameReplace )
diff --git a/xmloff/source/text/XMLTextShapeStyleContext.cxx b/xmloff/source/text/XMLTextShapeStyleContext.cxx
index 2f81b3c..05f14ce 100644
--- a/xmloff/source/text/XMLTextShapeStyleContext.cxx
+++ b/xmloff/source/text/XMLTextShapeStyleContext.cxx
@@ -279,7 +279,7 @@ Reference< XFastContextHandler > SAL_CALL
     {
         // create and remember events import context
         // (for delayed processing of events)
-        pContext = new XMLEventsImportContext( GetImport() );
+        pContext = new XMLEventsImportContext( GetImport(), Element );
         xEventContext = pContext;
     }
     else
diff --git a/xmloff/source/text/txtstyli.cxx b/xmloff/source/text/txtstyli.cxx
index ff19227..119858b 100644
--- a/xmloff/source/text/txtstyli.cxx
+++ b/xmloff/source/text/txtstyli.cxx
@@ -238,7 +238,7 @@ Reference< XFastContextHandler > SAL_CALL
     {
         //create and remember events import context
         //(for delayed processing of events)
-        pEventContext = new XMLEventsImportContext( GetImport() );
+        pEventContext = new XMLEventsImportContext( GetImport(), Element );
         pEventContext->AddFirstRef();
         pContext = pEventContext;
     }
commit 3f11b8da0bba97b306de1e94206b51059608e282
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Thu Feb 26 10:47:35 2015 +0100

    XMLTextFrameContourContext_Impl implements ...
    
    fastparser interface
    
    Change-Id: I394ad0fba88c7ecfcc84d8c6a964862e87d01fa3

diff --git a/xmloff/source/text/XMLTextFrameContext.cxx b/xmloff/source/text/XMLTextFrameContext.cxx
index 381f84f..64e5b2f 100644
--- a/xmloff/source/text/XMLTextFrameContext.cxx
+++ b/xmloff/source/text/XMLTextFrameContext.cxx
@@ -240,6 +240,9 @@ public:
                 ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
             const Reference < XPropertySet >& rPropSet,
             bool bPath );
+    XMLTextFrameContourContext_Impl( SvXMLImport& rImport, sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
+        const Reference< XPropertySet >& rPropSet, bool bPath );
     virtual ~XMLTextFrameContourContext_Impl();
 };
 
@@ -370,6 +373,123 @@ XMLTextFrameContourContext_Impl::XMLTextFrameContourContext_Impl(
     }
 }
 
+XMLTextFrameContourContext_Impl::XMLTextFrameContourContext_Impl(
+    SvXMLImport& rImport, sal_Int32 Element,
+    const Reference< XFastAttributeList >& xAttrList,
+    const Reference< XPropertySet >& rPropSet,
+    bool bPath )
+:   SvXMLImportContext( rImport ),
+    xPropSet( rPropSet )
+{
+    OUString sD, sPoints, sViewBox;
+    bool bPixelWidth = false, bPixelHeight = false;
+    sal_Bool bAuto = sal_False;
+    sal_Int32 nWidth = 0;
+    sal_Int32 nHeight = 0;
+
+    const SvXMLTokenMap& rTokenMap =
+        GetImport().GetTextImport()->GetTextContourAttrTokenMap();
+
+    Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+    for( xml::FastAttribute attribute : attributes )
+    {
+        switch( rTokenMap.Get( attribute.Token ) )
+        {
+        case XML_TOK_TEXT_CONTOUR_VIEWBOX:
+            sViewBox = attribute.Value;
+            break;
+        case XML_TOK_TEXT_CONTOUR_D:
+            if( bPath )
+                sD = attribute.Value;
+            break;
+        case XML_TOK_TEXT_CONTOUR_POINTS:
+            if( !bPath )
+                sPoints = attribute.Value;
+            break;
+        case XML_TOK_TEXT_CONTOUR_WIDTH:
+            if( ::sax::Converter::convertMeasurePx( nWidth, attribute.Value ) )
+                bPixelWidth = true;
+            else
+                GetImport().GetMM100UnitConverter().convertMeasureToCore(
+                        nWidth, attribute.Value );
+            break;
+        case XML_TOK_TEXT_CONTOUR_HEIGHT:
+            if( ::sax::Converter::convertMeasurePx( nHeight, attribute.Value ) )
+                bPixelHeight = true;
+            else
+                GetImport().GetMM100UnitConverter().convertMeasureToCore(
+                        nHeight, attribute.Value );
+            break;
+        case XML_TOK_TEXT_CONTOUR_AUTO:
+            bAuto = attribute.Value.equals( "true" );
+            break;
+        }
+    }
+
+    OUString sContourPolyPolygon("ContourPolyPolygon");
+    Reference < XPropertySetInfo > xPropSetInfo = rPropSet->getPropertySetInfo();
+
+    if(xPropSetInfo->hasPropertyByName(sContourPolyPolygon) && nWidth > 0 && nHeight > 0 && bPixelWidth == bPixelHeight && (bPath ? sD : sPoints).getLength())
+    {
+        const SdXMLImExViewBox aViewBox( sViewBox, GetImport().GetMM100UnitConverter());
+        basegfx::B2DPolyPolygon aPolyPolygon;
+        Any aAny;
+
+        if( bPath )
+        {
+            basegfx::tools::importFromSvgD(aPolyPolygon, sD, GetImport().needFixPositionAfterZ(), 0);
+        }
+        else
+        {
+            basegfx::B2DPolygon aPolygon;
+
+            if(basegfx::tools::importFromSvgPoints(aPolygon, sPoints))
+            {
+                aPolyPolygon = basegfx::B2DPolyPolygon(aPolygon);
+            }
+        }
+
+        if(aPolyPolygon.count())
+        {
+            const basegfx::B2DRange aSourceRange(
+                aViewBox.GetX(), aViewBox.GetY(),
+                aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
+            const basegfx::B2DRange aTargetRange(
+                0.0, 0.0,
+                nWidth, nHeight);
+
+            if(!aSourceRange.equal(aTargetRange))
+            {
+                aPolyPolygon.transform(
+                    basegfx::tools::createSourceRangeTargetRangeTransform(
+                        aSourceRange,
+                        aTargetRange));
+            }
+
+            com::sun::star::drawing::PointSequenceSequence aPointSequenceSequence;
+            basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(aPolyPolygon, aPointSequenceSequence);
+            aAny <<= aPointSequenceSequence;
+            xPropSet->setPropertyValue( sContourPolyPolygon, aAny );
+        }
+
+        const OUString sIsPixelContour("IsPixelContour");
+
+        if( xPropSetInfo->hasPropertyByName( sIsPixelContour ) )
+        {
+            aAny.setValue( &bPixelWidth, ::getBooleanCppuType() );
+            xPropSet->setPropertyValue( sIsPixelContour, aAny );
+        }
+
+        const OUString sIsAutomaticContour("IsAutomaticContour");
+
+        if( xPropSetInfo->hasPropertyByName( sIsAutomaticContour ) )
+        {
+            aAny.setValue( &bAuto, ::getBooleanCppuType() );
+            xPropSet->setPropertyValue( sIsAutomaticContour, aAny );
+        }
+    }
+}
+
 XMLTextFrameContourContext_Impl::~XMLTextFrameContourContext_Impl()
 {
 }
commit 31dd515c5e7a13984ba0cc2eb2ca10273688c441
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Thu Feb 26 10:46:00 2015 +0100

    XMLTextFrameTitleOrDescContext_Impl implements ...
    
    fastparser interface
    
    Change-Id: I799279c0a0e58a612070c25d0b37d6c8e49ccc25

diff --git a/xmloff/source/text/XMLTextFrameContext.cxx b/xmloff/source/text/XMLTextFrameContext.cxx
index 70b8a94..381f84f 100644
--- a/xmloff/source/text/XMLTextFrameContext.cxx
+++ b/xmloff/source/text/XMLTextFrameContext.cxx
@@ -126,9 +126,13 @@ public:
                                          sal_uInt16 nPrfx,
                                          const OUString& rLName,
                                          OUString& rTitleOrDesc );
+    XMLTextFrameTitleOrDescContext_Impl( SvXMLImport& rImport,
+            sal_Int32 Element, OUString& rTitleOrDesc );
     virtual ~XMLTextFrameTitleOrDescContext_Impl();
 
     virtual void Characters( const OUString& rText ) SAL_OVERRIDE;
+    virtual void SAL_CALL characters( const OUString& rChars )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 };
 
 TYPEINIT1( XMLTextFrameTitleOrDescContext_Impl, SvXMLImportContext );
@@ -143,6 +147,14 @@ XMLTextFrameTitleOrDescContext_Impl::XMLTextFrameTitleOrDescContext_Impl(
 {
 }
 
+XMLTextFrameTitleOrDescContext_Impl::XMLTextFrameTitleOrDescContext_Impl(
+    SvXMLImport& rImport, sal_Int32 /*Element*/,
+    OUString& rTitleOrDesc )
+:   SvXMLImportContext( rImport ),
+    mrTitleOrDesc( rTitleOrDesc )
+{
+}
+
 XMLTextFrameTitleOrDescContext_Impl::~XMLTextFrameTitleOrDescContext_Impl()
 {
 }
@@ -152,6 +164,12 @@ void XMLTextFrameTitleOrDescContext_Impl::Characters( const OUString& rText )
     mrTitleOrDesc += rText;
 }
 
+void SAL_CALL XMLTextFrameTitleOrDescContext_Impl::characters( const OUString& rChars )
+    throw(RuntimeException, SAXException, std::exception)
+{
+    mrTitleOrDesc += rChars;
+}
+
 class XMLTextFrameParam_Impl : public SvXMLImportContext
 {
 public:
commit 5ff5346e9e8ab08b18225bb3111405143e5403ab
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date:   Thu Feb 26 10:08:09 2015 +0100

    XMLReplacementImageContext implements fastparser
    
    interface
    
    Change-Id: I7283d1e2acf4b28dd778bd9f7f6cb63a0b1e13fa

diff --git a/xmloff/inc/XMLReplacementImageContext.hxx b/xmloff/inc/XMLReplacementImageContext.hxx
index 0560f1d..abb421c 100644
--- a/xmloff/inc/XMLReplacementImageContext.hxx
+++ b/xmloff/inc/XMLReplacementImageContext.hxx
@@ -49,14 +49,23 @@ public:
                 ::com::sun::star::xml::sax::XAttributeList > & rAttrList,
             const ::com::sun::star::uno::Reference <
                 ::com::sun::star::beans::XPropertySet >& rPropSet );
+    XMLReplacementImageContext( SvXMLImport& rImport, sal_Int32 Element,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
+        const css::uno::Reference< css::beans::XPropertySet >& rPropSet );
     virtual ~XMLReplacementImageContext();
 
     virtual void EndElement() SAL_OVERRIDE;
+    virtual void SAL_CALL endFastElement( sal_Int32 Element )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
     SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                 const OUString& rLocalName,
                  const ::com::sun::star::uno::Reference<
                     ::com::sun::star::xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
+    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
+        createFastChildContext( sal_Int32 Element,
+                const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+        throw(css::uno::RuntimeException, css::xml::sax::SAXException, std::exception) SAL_OVERRIDE;
 
 };
 
diff --git a/xmloff/source/draw/XMLReplacementImageContext.cxx b/xmloff/source/draw/XMLReplacementImageContext.cxx
index 80e075b..a540842 100644
--- a/xmloff/source/draw/XMLReplacementImageContext.cxx
+++ b/xmloff/source/draw/XMLReplacementImageContext.cxx
@@ -19,9 +19,11 @@
 
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/xml/sax/FastToken.hpp>
 #include <osl/diagnose.h>
 #include <xmloff/xmlimp.hxx>
 #include <xmloff/xmltoken.hxx>
+#include <xmloff/token/tokens.hxx>
 #include <xmloff/xmlnmspe.hxx>
 #include <xmloff/nmspmap.hxx>
 #include <xmloff/XMLBase64ImportContext.hxx>
@@ -29,8 +31,10 @@
 
 using ::com::sun::star::uno::Reference;
 using ::com::sun::star::uno::makeAny;
+using css::xml::sax::FastToken::NAMESPACE;
 using namespace ::com::sun::star::xml::sax;
 using namespace ::com::sun::star::beans;
+using namespace css::uno;
 
 TYPEINIT1( XMLReplacementImageContext, SvXMLImportContext );
 
@@ -67,6 +71,29 @@ XMLReplacementImageContext::XMLReplacementImageContext(
     }
 }
 
+XMLReplacementImageContext::XMLReplacementImageContext(
+    SvXMLImport& rImport, sal_Int32 Element,
+    const Reference< XFastAttributeList >& xAttrList,
+    const Reference< XPropertySet >& rPropSet )
+:   SvXMLImportContext( rImport ),
+    m_xPropSet( rPropSet ),
+    m_sGraphicURL("GraphicURL")
+{
+    const SvXMLTokenMap& rTokenMap = GetImport().GetTextImport()->
+            GetTextFrameAttrTokenMap();
+
+    Sequence< css::xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+    for( css::xml::FastAttribute attribute : attributes )
+    {
+        switch( rTokenMap.Get( attribute.Token ) )
+        {
+        case XML_TOK_TEXT_FRAME_HREF:
+            m_sHRef = attribute.Value;
+            break;
+        }
+    }
+}
+
 XMLReplacementImageContext::~XMLReplacementImageContext()
 {
 }
@@ -98,6 +125,34 @@ void XMLReplacementImageContext::EndElement()
         m_xPropSet->setPropertyValue( m_sGraphicURL, makeAny( sHRef ) );
 }
 
+void SAL_CALL XMLReplacementImageContext::endFastElement( sal_Int32 Element )
+    throw(RuntimeException, SAXException, std::exception)
+{
+    OSL_ENSURE( !m_sHRef.isEmpty() || m_xBase64Stream.is(),
+                "neither URL nor base64 image data given" );
+    rtl::Reference < XMLTextImportHelper > xTxtImport =
+        GetImport().GetTextImport();
+    OUString sHRef;
+    if( !m_sHRef.isEmpty() )
+    {
+        bool bForceLoad = xTxtImport->IsInsertMode() ||
+                              xTxtImport->IsBlockMode() ||
+                              xTxtImport->IsStylesOnlyMode() ||
+                              xTxtImport->IsOrganizerMode();
+        sHRef = GetImport().ResolveGraphicObjectURL( m_sHRef, !bForceLoad );
+    }
+    else if( m_xBase64Stream.is() )
+    {
+        sHRef = GetImport().ResolveGraphicObjectURLFromBase64( m_xBase64Stream );
+        m_xBase64Stream = 0;
+    }
+
+    Reference < XPropertySetInfo > xPropSetInfo =
+        m_xPropSet->getPropertySetInfo();
+    if( xPropSetInfo->hasPropertyByName( m_sGraphicURL ) )
+        m_xPropSet->setPropertyValue( m_sGraphicURL, makeAny( sHRef ) );
+}
+
 SvXMLImportContext *XMLReplacementImageContext::CreateChildContext(
         sal_uInt16 nPrefix,
         const OUString& rLocalName,
@@ -122,5 +177,26 @@ SvXMLImportContext *XMLReplacementImageContext::CreateChildContext(
     return pContext;
 }
 
+Reference< XFastContextHandler > SAL_CALL
+    XMLReplacementImageContext::createFastChildContext( sal_Int32 Element,
+    const Reference< XFastAttributeList >& xAttrList )
+    throw(RuntimeException, SAXException, std::exception)
+{
+    Reference< XFastContextHandler > pContext = 0;
+
+    if( Element == (NAMESPACE | XML_NAMESPACE_OFFICE | xmloff::XML_binary_data)
+        && !m_xBase64Stream.is() )
+    {
+        m_xBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
+        if( m_xBase64Stream.is() )
+            pContext = new XMLBase64ImportContext( GetImport(), Element,
+                    xAttrList, m_xBase64Stream );
+    }
+
+    if( !pContext.is() )
+        pContext = new SvXMLImportContext( GetImport() );
+
+    return pContext;
+}
 

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list