Moving legacy contexts to FastContexts:

ScXMLTableShapesContext
ScXMLTableSourceContext
ScXMLTableColContext
ScXMLTableColsContext
ScXMLConditionalFormatsContext
ScXMLTableProtectionContext

Change-Id: I36704c7f51cd5d13b3c0ebf9bc07b172c1576f3e
Reviewed-on: https://gerrit.libreoffice.org/40246
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Jenkins <ci@libreoffice.org>
diff --git a/sc/source/filter/xml/XMLTableShapesContext.cxx b/sc/source/filter/xml/XMLTableShapesContext.cxx
index 4aa69c0..35ca7bace 100644
--- a/sc/source/filter/xml/XMLTableShapesContext.cxx
+++ b/sc/source/filter/xml/XMLTableShapesContext.cxx
@@ -25,10 +25,9 @@
using namespace com::sun::star;

ScXMLTableShapesContext::ScXMLTableShapesContext( ScXMLImport& rImport,
                                      sal_uInt16 nPrfx,
                                      const OUString& rLName,
                                      const css::uno::Reference<css::xml::sax::XAttributeList>& /* xAttrList */ ) :
    ScXMLImportContext( rImport, nPrfx, rLName )
                                      sal_Int32 /*nElement*/,
                                      const css::uno::Reference<css::xml::sax::XFastAttributeList>& /* xAttrList */ ) :
    ScXMLImportContext( rImport )
{
    // here are no attributes
}
@@ -59,8 +58,4 @@ SvXMLImportContext *ScXMLTableShapesContext::CreateChildContext( sal_uInt16 nPre
    return pContext;
}

void ScXMLTableShapesContext::EndElement()
{
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/xml/XMLTableShapesContext.hxx b/sc/source/filter/xml/XMLTableShapesContext.hxx
index db9a3f3..93d85e3 100644
--- a/sc/source/filter/xml/XMLTableShapesContext.hxx
+++ b/sc/source/filter/xml/XMLTableShapesContext.hxx
@@ -27,17 +27,14 @@
class ScXMLTableShapesContext : public ScXMLImportContext
{
public:
    ScXMLTableShapesContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
                        const OUString& rLName,
                        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList);
    ScXMLTableShapesContext( ScXMLImport& rImport, sal_Int32 nElement,
                        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList);

    virtual ~ScXMLTableShapesContext() override;

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                     const OUString& rLocalName,
                                     const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;

    virtual void EndElement() override;
};

#endif
diff --git a/sc/source/filter/xml/XMLTableSourceContext.cxx b/sc/source/filter/xml/XMLTableSourceContext.cxx
index 8909adb..7d0c936 100644
--- a/sc/source/filter/xml/XMLTableSourceContext.cxx
+++ b/sc/source/filter/xml/XMLTableSourceContext.cxx
@@ -32,10 +32,9 @@ using namespace com::sun::star;
using namespace xmloff::token;

ScXMLTableSourceContext::ScXMLTableSourceContext( ScXMLImport& rImport,
                                      sal_uInt16 nPrfx,
                                      const OUString& rLName,
                                      const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList) :
    ScXMLImportContext( rImport, nPrfx, rLName ),
                                      sal_Int32 /*nElement*/,
                                      const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList) :
    ScXMLImportContext( rImport ),
    sLink(),
    sTableName(),
    sFilterName(),
@@ -43,37 +42,36 @@ ScXMLTableSourceContext::ScXMLTableSourceContext( ScXMLImport& rImport,
    nRefresh(0),
    nMode(sheet::SheetLinkMode_NORMAL)
{
    sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
    for( sal_Int16 i=0; i < nAttrCount; ++i )
    if ( xAttrList.is() )
    {
        const OUString& sAttrName(xAttrList->getNameByIndex( i ));
        OUString aLocalName;
        sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
                                            sAttrName, &aLocalName ));
        const OUString& sValue(xAttrList->getValueByIndex( i ));
        if(nPrefix == XML_NAMESPACE_XLINK)
        sax_fastparser::FastAttributeList *pAttribList =
            sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList );

        for (auto &aIter : *pAttribList)
        {
            if (IsXMLToken(aLocalName, XML_HREF))
                sLink = GetScImport().GetAbsoluteReference(sValue);
        }
        else if (nPrefix == XML_NAMESPACE_TABLE)
        {
            if (IsXMLToken(aLocalName, XML_TABLE_NAME))
                sTableName = sValue;
            else if (IsXMLToken(aLocalName, XML_FILTER_NAME))
                sFilterName = sValue;
            else if (IsXMLToken(aLocalName, XML_FILTER_OPTIONS))
                sFilterOptions = sValue;
            else if (IsXMLToken(aLocalName, XML_MODE))
            switch (aIter.getToken())
            {
                if (IsXMLToken(sValue, XML_COPY_RESULTS_ONLY))
            case XML_ELEMENT( XLINK, XML_HREF ):
                sLink = GetScImport().GetAbsoluteReference(aIter.toString());
                break;
            case XML_ELEMENT( TABLE, XML_TABLE_NAME ):
                sTableName = aIter.toString();
                break;
            case XML_ELEMENT( TABLE, XML_FILTER_NAME):
                sFilterName = aIter.toString();
                break;
            case XML_ELEMENT( TABLE, XML_FILTER_OPTIONS ):
                sFilterOptions = aIter.toString();
                break;
            case XML_ELEMENT( TABLE, XML_MODE ):
                if (IsXMLToken(aIter, XML_COPY_RESULTS_ONLY))
                    nMode = sheet::SheetLinkMode_VALUE;
            }
            else if (IsXMLToken(aLocalName, XML_REFRESH_DELAY))
            {
                break;
            case XML_ELEMENT( TABLE, XML_REFRESH_DELAY ):
                double fTime;
                if (::sax::Converter::convertDuration( fTime, sValue ))
                if (::sax::Converter::convertDuration( fTime, aIter.toString() ))
                    nRefresh = std::max( (sal_Int32)(fTime * 86400.0), (sal_Int32)0 );
                break;
            }
        }
    }
@@ -83,14 +81,13 @@ ScXMLTableSourceContext::~ScXMLTableSourceContext()
{
}

SvXMLImportContext *ScXMLTableSourceContext::CreateChildContext( sal_uInt16 nPrefix,
                                            const OUString& rLName,
                                            const css::uno::Reference<css::xml::sax::XAttributeList>& /* xAttrList */ )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLTableSourceContext::createFastChildContext(
    sal_Int32 /*nElement*/, const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ )
{
    return new SvXMLImportContext( GetImport(), nPrefix, rLName );
    return new SvXMLImportContext( GetImport() );
}

void ScXMLTableSourceContext::EndElement()
void SAL_CALL ScXMLTableSourceContext::endFastElement( sal_Int32 /*nElement*/ )
{
    if (!sLink.isEmpty())
    {
diff --git a/sc/source/filter/xml/XMLTableSourceContext.hxx b/sc/source/filter/xml/XMLTableSourceContext.hxx
index 31791c0..32805d9 100644
--- a/sc/source/filter/xml/XMLTableSourceContext.hxx
+++ b/sc/source/filter/xml/XMLTableSourceContext.hxx
@@ -35,17 +35,15 @@ class ScXMLTableSourceContext : public ScXMLImportContext
    css::sheet::SheetLinkMode          nMode;

public:
    ScXMLTableSourceContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
                        const OUString& rLName,
                        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList);
    ScXMLTableSourceContext( ScXMLImport& rImport, sal_Int32 nElement,
                        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList);

    virtual ~ScXMLTableSourceContext() override;

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                     const OUString& rLocalName,
                                     const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
        sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;

    virtual void EndElement() override;
    virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
};

#endif
diff --git a/sc/source/filter/xml/xmlcoli.cxx b/sc/source/filter/xml/xmlcoli.cxx
index 2b90f84..ac61900 100644
--- a/sc/source/filter/xml/xmlcoli.cxx
+++ b/sc/source/filter/xml/xmlcoli.cxx
@@ -40,47 +40,43 @@ using namespace com::sun::star;
using namespace xmloff::token;

ScXMLTableColContext::ScXMLTableColContext( ScXMLImport& rImport,
                                      sal_uInt16 nPrfx,
                                      const OUString& rLName,
                                      const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) :
    ScXMLImportContext( rImport, nPrfx, rLName ),
                                      sal_Int32 /*nElement*/,
                                      const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) :
    ScXMLImportContext( rImport ),
    sVisibility(GetXMLToken(XML_VISIBLE))
{
    nColCount = 1;
    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetTableColAttrTokenMap();

    for( sal_Int16 i=0; i < nAttrCount; ++i )
    if ( xAttrList.is() )
    {
        const OUString& sAttrName(xAttrList->getNameByIndex( i ));
        OUString aLocalName;
        sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
                                            sAttrName, &aLocalName );
        const OUString& sValue(xAttrList->getValueByIndex( i ));
        sax_fastparser::FastAttributeList *pAttribList =
            sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList );

        switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
        for (auto &aIter : *pAttribList)
        {
            case XML_TOK_TABLE_COL_ATTR_REPEATED:
            switch (aIter.getToken())
            {
            case XML_ELEMENT( TABLE, XML_NUMBER_COLUMNS_REPEATED ):
                {
                    nColCount = std::max<sal_Int32>(sValue.toInt32(), 1);
                    nColCount = std::max<sal_Int32>(aIter.toInt32(), 1);
                    nColCount = std::min<sal_Int32>(nColCount, MAXCOLCOUNT);
                }
                break;
            case XML_TOK_TABLE_COL_ATTR_STYLE_NAME:
            case XML_ELEMENT( TABLE, XML_STYLE_NAME ):
                {
                    sStyleName = sValue;
                    sStyleName = aIter.toString();
                }
                break;
            case XML_TOK_TABLE_COL_ATTR_VISIBILITY:
            case XML_ELEMENT( TABLE, XML_VISIBILITY ):
                {
                    sVisibility = sValue;
                    sVisibility = aIter.toString();
                }
                break;
            case XML_TOK_TABLE_COL_ATTR_DEFAULT_CELL_STYLE_NAME:
            case XML_ELEMENT( TABLE, XML_DEFAULT_CELL_STYLE_NAME ):
                {
                    sCellStyleName = sValue;
                    sCellStyleName = aIter.toString();
                }
                break;
            }
        }
    }
}
@@ -89,14 +85,13 @@ ScXMLTableColContext::~ScXMLTableColContext()
{
}

SvXMLImportContext *ScXMLTableColContext::CreateChildContext( sal_uInt16 nPrefix,
                                            const OUString& rLName,
                                            const css::uno::Reference<css::xml::sax::XAttributeList>& /* xAttrList */ )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLTableColContext::createFastChildContext(
    sal_Int32 /*nElement*/, const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ )
{
    return new SvXMLImportContext( GetImport(), nPrefix, rLName );
    return new SvXMLImportContext( GetImport() );
}

void ScXMLTableColContext::EndElement()
void SAL_CALL ScXMLTableColContext::endFastElement( sal_Int32 /*nElement*/ )
{
    ScXMLImport& rXMLImport = GetScImport();
    SCTAB nSheet = rXMLImport.GetTables().GetCurrentSheet();
@@ -152,11 +147,10 @@ void ScXMLTableColContext::EndElement()
}

ScXMLTableColsContext::ScXMLTableColsContext( ScXMLImport& rImport,
                                      sal_uInt16 nPrfx,
                                      const OUString& rLName,
                                      const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList,
                                      sal_Int32 /*nElement*/,
                                      const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList,
                                      const bool bTempHeader, const bool bTempGroup) :
    ScXMLImportContext( rImport, nPrfx, rLName ),
    ScXMLImportContext( rImport ),
    nHeaderStartCol(0),
    nHeaderEndCol(0),
    nGroupStartCol(0),
@@ -171,20 +165,14 @@ ScXMLTableColsContext::ScXMLTableColsContext( ScXMLImport& rImport,
    else if (bGroup)
    {
        nGroupStartCol = rImport.GetTables().GetCurrentColCount();
        sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
        for( sal_Int16 i=0; i < nAttrCount; ++i )
        if ( xAttrList.is() )
        {
            const OUString& sAttrName(xAttrList->getNameByIndex( i ));
            OUString aLocalName;
            sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
                                                sAttrName, &aLocalName );
            const OUString& sValue(xAttrList->getValueByIndex( i ));
            sax_fastparser::FastAttributeList *pAttribList =
                sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList );

            if (nPrefix == XML_NAMESPACE_TABLE && IsXMLToken(aLocalName, XML_DISPLAY))
            {
                if (IsXMLToken(sValue, XML_FALSE))
                    bGroupDisplay = false;
            }
            auto &aIter( pAttribList->find( XML_ELEMENT( TABLE, XML_DISPLAY ) ) );
            if ( aIter != pAttribList->end() && IsXMLToken(aIter, XML_FALSE) )
                bGroupDisplay = false;
        }
    }
}
@@ -193,45 +181,39 @@ ScXMLTableColsContext::~ScXMLTableColsContext()
{
}

SvXMLImportContext *ScXMLTableColsContext::CreateChildContext( sal_uInt16 nPrefix,
                                            const OUString& rLName,
                                            const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLTableColsContext::createFastChildContext(
    sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
{
    SvXMLImportContext *pContext = nullptr;

    const SvXMLTokenMap& rTokenMap = GetScImport().GetTableColsElemTokenMap();
    switch( rTokenMap.Get( nPrefix, rLName ) )
    switch (nElement)
    {
    case XML_TOK_TABLE_COLS_COL_GROUP:
        pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
                                                   rLName, xAttrList,
    case XML_ELEMENT( TABLE, XML_TABLE_COLUMN_GROUP ):
        pContext = new ScXMLTableColsContext( GetScImport(), nElement, xAttrList,
                                                   false, true );
        break;
    case XML_TOK_TABLE_COLS_HEADER_COLS:
        pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
                                                   rLName, xAttrList,
    case XML_ELEMENT( TABLE, XML_TABLE_HEADER_COLUMNS ):
        pContext = new ScXMLTableColsContext( GetScImport(), nElement, xAttrList,
                                                   true, false );
        break;
    case XML_TOK_TABLE_COLS_COLS:
        pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
                                                   rLName, xAttrList,
    case XML_ELEMENT( TABLE, XML_TABLE_COLUMNS ):
        pContext = new ScXMLTableColsContext( GetScImport(), nElement, xAttrList,
                                                   false, false );
        break;
    case XML_TOK_TABLE_COLS_COL:
            pContext = new ScXMLTableColContext( GetScImport(), nPrefix,
                                                      rLName, xAttrList//,
    case XML_ELEMENT( TABLE, XML_TABLE_COLUMN ):
        pContext = new ScXMLTableColContext( GetScImport(), nElement, xAttrList//,
                                                      //this
                                                      );
        break;
    }

    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
        pContext = new SvXMLImportContext( GetImport() );

    return pContext;
}

void ScXMLTableColsContext::EndElement()
void SAL_CALL ScXMLTableColsContext::endFastElement( sal_Int32 /*nElement*/ )
{
    ScXMLImport& rXMLImport = GetScImport();
    if (bHeader)
diff --git a/sc/source/filter/xml/xmlcoli.hxx b/sc/source/filter/xml/xmlcoli.hxx
index 85aaa64..9b7d2a2 100644
--- a/sc/source/filter/xml/xmlcoli.hxx
+++ b/sc/source/filter/xml/xmlcoli.hxx
@@ -33,17 +33,15 @@ class ScXMLTableColContext : public ScXMLImportContext

public:

    ScXMLTableColContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
                       const OUString& rLName,
                       const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList );
    ScXMLTableColContext( ScXMLImport& rImport, sal_Int32 nElement,
                       const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList );

    virtual ~ScXMLTableColContext() override;

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                     const OUString& rLocalName,
                                     const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
        sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;

    virtual void EndElement() override;
    virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
};

class ScXMLTableColsContext : public ScXMLImportContext
@@ -58,18 +56,16 @@ class ScXMLTableColsContext : public ScXMLImportContext

public:

    ScXMLTableColsContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
                       const OUString& rLName,
                       const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList,
    ScXMLTableColsContext( ScXMLImport& rImport, sal_Int32 nElement,
                       const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList,
                        const bool bHeader, const bool bGroup);

    virtual ~ScXMLTableColsContext() override;

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                     const OUString& rLocalName,
                                     const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
        sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;

    virtual void EndElement() override;
    virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
};

#endif
diff --git a/sc/source/filter/xml/xmlcondformat.cxx b/sc/source/filter/xml/xmlcondformat.cxx
index 91b0d6e..921fe8d 100644
--- a/sc/source/filter/xml/xmlcondformat.cxx
+++ b/sc/source/filter/xml/xmlcondformat.cxx
@@ -21,9 +21,8 @@
#include "XMLConverter.hxx"
#include "stylehelper.hxx"

ScXMLConditionalFormatsContext::ScXMLConditionalFormatsContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
                        const OUString& rLName):
    ScXMLImportContext( rImport, nPrfx, rLName )
ScXMLConditionalFormatsContext::ScXMLConditionalFormatsContext( ScXMLImport& rImport, sal_Int32 /*nElement*/ ):
    ScXMLImportContext( rImport )
{
    GetScImport().SetNewCondFormatData();
    GetScImport().GetDocument()->SetCondFormList(new ScConditionalFormatList(), GetScImport().GetTables().GetCurrentSheet());
@@ -46,7 +45,7 @@ SvXMLImportContext* ScXMLConditionalFormatsContext::CreateChildContext( sal_uInt
    return pContext;
}

void ScXMLConditionalFormatsContext::EndElement()
void SAL_CALL ScXMLConditionalFormatsContext::endFastElement( sal_Int32 /*nElement*/ )
{
    ScDocument* pDoc = GetScImport().GetDocument();

diff --git a/sc/source/filter/xml/xmlcondformat.hxx b/sc/source/filter/xml/xmlcondformat.hxx
index 593d65f..d2639da 100644
--- a/sc/source/filter/xml/xmlcondformat.hxx
+++ b/sc/source/filter/xml/xmlcondformat.hxx
@@ -26,14 +26,13 @@ struct ScIconSetFormatData;
class ScXMLConditionalFormatsContext : public ScXMLImportContext
{
public:
    ScXMLConditionalFormatsContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
                        const OUString& rLName );
    ScXMLConditionalFormatsContext( ScXMLImport& rImport, sal_Int32 nElement );

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                     const OUString& rLocalName,
                                     const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;

    virtual void EndElement() override;
    virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
};

class ScXMLConditionalFormatContext : public ScXMLImportContext
diff --git a/sc/source/filter/xml/xmllabri.cxx b/sc/source/filter/xml/xmllabri.cxx
index d895157..2c8d31e 100644
--- a/sc/source/filter/xml/xmllabri.cxx
+++ b/sc/source/filter/xml/xmllabri.cxx
@@ -21,6 +21,7 @@
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
#include "xmlimprt.hxx"
#include <xmloff/xmlnmspe.hxx>

#include <o3tl/make_unique.hxx>

@@ -41,55 +42,49 @@ ScXMLLabelRangesContext::~ScXMLLabelRangesContext()
    GetScImport().UnlockSolarMutex();
}

SvXMLImportContext* ScXMLLabelRangesContext::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLName,
        const uno::Reference< xml::sax::XAttributeList >& xAttrList )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLLabelRangesContext::createFastChildContext(
    sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
{
    SvXMLImportContext*     pContext(nullptr);
    const SvXMLTokenMap&    rTokenMap(GetScImport().GetLabelRangesElemTokenMap());

    switch( rTokenMap.Get( nPrefix, rLName ) )
    switch (nElement)
    {
        case XML_TOK_LABEL_RANGE_ELEM:
            pContext = new ScXMLLabelRangeContext( GetScImport(), nPrefix, rLName, xAttrList );
        case XML_ELEMENT( TABLE, XML_LABEL_RANGE ):
            pContext = new ScXMLLabelRangeContext( GetScImport(), nElement, xAttrList );
        break;
    }
    if( !pContext )
        pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
        pContext = new SvXMLImportContext( GetImport() );

    return pContext;
}

ScXMLLabelRangeContext::ScXMLLabelRangeContext(
        ScXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const uno::Reference< xml::sax::XAttributeList >& xAttrList ) :
    ScXMLImportContext( rImport, nPrfx, rLName ),
        sal_Int32 /*nElement*/,
        const uno::Reference< xml::sax::XFastAttributeList >& xAttrList ) :
    ScXMLImportContext( rImport ),
    bColumnOrientation( false )
{
    sal_Int16               nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
    const SvXMLTokenMap&    rAttrTokenMap(GetScImport().GetLabelRangeAttrTokenMap());

    for( sal_Int16 nIndex = 0; nIndex < nAttrCount; ++nIndex )
    if ( xAttrList.is() )
    {
        const OUString& sAttrName  (xAttrList->getNameByIndex( nIndex ));
        const OUString& sValue     (xAttrList->getValueByIndex( nIndex ));
        OUString    aLocalName;
        sal_uInt16      nPrefix     (GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ));
        sax_fastparser::FastAttributeList *pAttribList =
            sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList );

        switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
        for (auto &aIter : *pAttribList)
        {
            case XML_TOK_LABEL_RANGE_ATTR_LABEL_RANGE:
                sLabelRangeStr = sValue;
            break;
            case XML_TOK_LABEL_RANGE_ATTR_DATA_RANGE:
                sDataRangeStr = sValue;
            break;
            case XML_TOK_LABEL_RANGE_ATTR_ORIENTATION:
                bColumnOrientation = IsXMLToken(sValue, XML_COLUMN );
            break;
            switch (aIter.getToken())
            {
            case XML_ELEMENT( TABLE, XML_LABEL_CELL_RANGE_ADDRESS ):
                sLabelRangeStr = aIter.toString();
                break;
            case XML_ELEMENT( TABLE, XML_DATA_CELL_RANGE_ADDRESS ):
                sDataRangeStr = aIter.toString();
                break;
            case XML_ELEMENT( TABLE, XML_ORIENTATION ):
                bColumnOrientation = IsXMLToken(aIter, XML_COLUMN );
                break;
            }
        }
    }
}
@@ -98,15 +93,13 @@ ScXMLLabelRangeContext::~ScXMLLabelRangeContext()
{
}

SvXMLImportContext* ScXMLLabelRangeContext::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLName,
        const uno::Reference< xml::sax::XAttributeList >& /* xAttrList */ )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLLabelRangeContext::createFastChildContext(
    sal_Int32 /*nElement*/, const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ )
{
    return new SvXMLImportContext( GetImport(), nPrefix, rLName );
    return new SvXMLImportContext( GetImport() );
}

void ScXMLLabelRangeContext::EndElement()
void SAL_CALL ScXMLLabelRangeContext::endFastElement( sal_Int32 /*nElement*/ )
{
    //  Label ranges must be stored as strings until all sheets are loaded
    //  (like named expressions).
diff --git a/sc/source/filter/xml/xmllabri.hxx b/sc/source/filter/xml/xmllabri.hxx
index aab26fb..f4e3db7 100644
--- a/sc/source/filter/xml/xmllabri.hxx
+++ b/sc/source/filter/xml/xmllabri.hxx
@@ -33,10 +33,10 @@ public:
                                    );
    virtual                     ~ScXMLLabelRangesContext() override;

    virtual SvXMLImportContext* CreateChildContext(
                                    sal_uInt16 nPrefix,
                                    const OUString& rLocalName,
                                    const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList
    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
                                createFastChildContext(
                                    sal_Int32 nElement,
                                    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList
                                    ) override;
};

@@ -50,18 +50,17 @@ private:
public:
                                ScXMLLabelRangeContext(
                                    ScXMLImport& rImport,
                                    sal_uInt16 nPrefix,
                                    const OUString& rLName,
                                    const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList
                                    sal_Int32 nElement,
                                    const css::uno::Reference< css::xml::sax::XFastAttributeList>& xAttrList
                                    );
    virtual                     ~ScXMLLabelRangeContext() override;

    virtual SvXMLImportContext* CreateChildContext(
                                    sal_uInt16 nPrefix,
                                    const OUString& rLocalName,
                                    const css::uno::Reference< css::xml::sax::XAttributeList>& xAttrList
    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
                                createFastChildContext(
                                    sal_Int32 nElement,
                                    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList
                                    ) override;
    virtual void                EndElement() override;
    virtual void SAL_CALL       endFastElement( sal_Int32 nElement ) override;
};

#endif
diff --git a/sc/source/filter/xml/xmlsceni.cxx b/sc/source/filter/xml/xmlsceni.cxx
index 246317b..024863f 100644
--- a/sc/source/filter/xml/xmlsceni.cxx
+++ b/sc/source/filter/xml/xmlsceni.cxx
@@ -28,6 +28,7 @@
#include <xmloff/xmltkmap.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
#include <xmloff/xmlnmspe.hxx>

#include <sax/tools/converter.hxx>

@@ -36,10 +37,9 @@ using namespace xmloff::token;

ScXMLTableScenarioContext::ScXMLTableScenarioContext(
        ScXMLImport& rImport,
        sal_uInt16 nPrfx,
        const OUString& rLName,
        const uno::Reference< xml::sax::XAttributeList >& xAttrList ):
    ScXMLImportContext( rImport, nPrfx, rLName ),
        sal_Int32 /*nElement*/,
        const uno::Reference< xml::sax::XFastAttributeList >& xAttrList ):
    ScXMLImportContext( rImport ),
    aBorderColor( COL_BLACK ),
    bDisplayBorder( true ),
    bCopyBack( true ),
@@ -49,66 +49,49 @@ ScXMLTableScenarioContext::ScXMLTableScenarioContext(
    bProtected( false )
{
    rImport.LockSolarMutex();
    sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
    const SvXMLTokenMap& rAttrTokenMap(GetScImport().GetTableScenarioAttrTokenMap());
    for( sal_Int16 i = 0; i < nAttrCount; ++i )
    {
        const OUString& sAttrName(xAttrList->getNameByIndex( i ));
        OUString aLocalName;
        sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
                                            sAttrName, &aLocalName ));
        const OUString& sValue(xAttrList->getValueByIndex( i ));

        switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
    if ( xAttrList.is() )
    {
        sax_fastparser::FastAttributeList *pAttribList =
            sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList );

        for (auto &aIter : *pAttribList)
        {
            case XML_TOK_TABLE_SCENARIO_ATTR_DISPLAY_BORDER:
            switch (aIter.getToken())
            {
                bDisplayBorder = IsXMLToken(sValue, XML_TRUE);
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_BORDER_COLOR:
            {
                sal_Int32 nColor(0);
                ::sax::Converter::convertColor(nColor, sValue);
                aBorderColor.SetColor(nColor);
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_COPY_BACK:
            {
                bCopyBack = IsXMLToken(sValue, XML_TRUE);
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_COPY_STYLES:
            {
                bCopyStyles = IsXMLToken(sValue, XML_TRUE);
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_COPY_FORMULAS:
            {
                bCopyFormulas = IsXMLToken(sValue, XML_TRUE);
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_IS_ACTIVE:
            {
                bIsActive = IsXMLToken(sValue, XML_TRUE);
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_SCENARIO_RANGES:
            {
            case XML_ELEMENT( TABLE, XML_DISPLAY_BORDER ):
                bDisplayBorder = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_ELEMENT( TABLE, XML_BORDER_COLOR ):
                {
                    sal_Int32 nColor(0);
                    ::sax::Converter::convertColor(nColor, aIter.toString());
                    aBorderColor.SetColor(nColor);
                }
                break;
            case XML_ELEMENT( TABLE, XML_COPY_BACK ):
                bCopyBack = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_ELEMENT( TABLE, XML_COPY_STYLES ):
                bCopyStyles = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_ELEMENT( TABLE, XML_COPY_FORMULAS ):
                bCopyFormulas = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_ELEMENT( TABLE, XML_IS_ACTIVE ):
                bIsActive = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_ELEMENT( TABLE, XML_SCENARIO_RANGES ):
                ScRangeStringConverter::GetRangeListFromString(
                    aScenarioRanges, sValue, GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO );
                    aScenarioRanges, aIter.toString(), GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO );
                break;
            case XML_ELEMENT( TABLE, XML_COMMENT ):
                sComment = aIter.toString();
                break;
            case XML_ELEMENT( TABLE, XML_PROTECTED ):
                bProtected = IsXMLToken(aIter, XML_TRUE);
                break;
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_COMMENT:
            {
                sComment = sValue;
            }
            break;
            case XML_TOK_TABLE_SCENARIO_ATTR_PROTECTED:
            {
                bProtected = IsXMLToken(sValue, XML_TRUE);
            }
            break;
        }
    }
}
@@ -118,15 +101,13 @@ ScXMLTableScenarioContext::~ScXMLTableScenarioContext()
    GetScImport().UnlockSolarMutex();
}

SvXMLImportContext *ScXMLTableScenarioContext::CreateChildContext(
        sal_uInt16 nPrefix,
        const OUString& rLName,
        const uno::Reference< xml::sax::XAttributeList >& /* xAttrList */ )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLTableScenarioContext::createFastChildContext(
    sal_Int32 /*nElement*/, const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ )
{
    return new SvXMLImportContext( GetImport(), nPrefix, rLName );
    return new SvXMLImportContext( GetImport() );
}

void ScXMLTableScenarioContext::EndElement()
void SAL_CALL ScXMLTableScenarioContext::endFastElement( sal_Int32 /*nElement*/ )
{
    SCTAB nCurrTable( GetScImport().GetTables().GetCurrentSheet() );
    ScDocument* pDoc(GetScImport().GetDocument());
diff --git a/sc/source/filter/xml/xmlsceni.hxx b/sc/source/filter/xml/xmlsceni.hxx
index 0d97150..6aa3474 100644
--- a/sc/source/filter/xml/xmlsceni.hxx
+++ b/sc/source/filter/xml/xmlsceni.hxx
@@ -42,17 +42,15 @@ private:

public:

    ScXMLTableScenarioContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
                        const OUString& rLName,
                        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList );
    ScXMLTableScenarioContext( ScXMLImport& rImport, sal_Int32 nElement,
                        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList );

    virtual ~ScXMLTableScenarioContext() override;

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                     const OUString& rLocalName,
                                     const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
        sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;

    virtual void EndElement() override;
    virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
};

#endif
diff --git a/sc/source/filter/xml/xmltabi.cxx b/sc/source/filter/xml/xmltabi.cxx
index 0bad32e4..28bfbe6 100644
--- a/sc/source/filter/xml/xmltabi.cxx
+++ b/sc/source/filter/xml/xmltabi.cxx
@@ -215,7 +215,7 @@ ScXMLTableContext::~ScXMLTableContext()

SvXMLImportContext *ScXMLTableContext::CreateChildContext( sal_uInt16 nPrefix,
                                            const OUString& rLName,
                                            const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList )
                                            const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttrList*/ )
{
    const SvXMLTokenMap& rTokenMap(GetScImport().GetTableElemTokenMap());
    sal_uInt16 nToken = rTokenMap.Get(nPrefix, rLName);
@@ -228,38 +228,6 @@ SvXMLImportContext *ScXMLTableContext::CreateChildContext( sal_uInt16 nPrefix,

    switch (nToken)
    {
    case XML_TOK_TABLE_COL_GROUP:
        pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
                                                   rLName, xAttrList,
                                                   false, true );
        break;
    case XML_TOK_TABLE_HEADER_COLS:
        pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
                                                   rLName, xAttrList,
                                                   true, false );
        break;
    case XML_TOK_TABLE_COLS:
        pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
                                                   rLName, xAttrList,
                                                   false, false );
        break;
    case XML_TOK_TABLE_COL:
            pContext = new ScXMLTableColContext( GetScImport(), nPrefix,
                                                      rLName, xAttrList );
        break;
    case XML_TOK_TABLE_PROTECTION:
    case XML_TOK_TABLE_PROTECTION_EXT:
        pContext = new ScXMLTableProtectionContext( GetScImport(), nPrefix, rLName, xAttrList );
        break;
    case XML_TOK_TABLE_SOURCE:
        pContext = new ScXMLTableSourceContext( GetScImport(), nPrefix, rLName, xAttrList);
        break;
    case XML_TOK_TABLE_SCENARIO:
        pContext = new ScXMLTableScenarioContext( GetScImport(), nPrefix, rLName, xAttrList);
        break;
    case XML_TOK_TABLE_SHAPES:
        pContext = new ScXMLTableShapesContext( GetScImport(), nPrefix, rLName, xAttrList);
        break;
    case XML_TOK_TABLE_FORMS:
        {
            GetScImport().GetFormImport()->startPage(GetScImport().GetTables().GetCurrentXDrawPage());
@@ -275,9 +243,6 @@ SvXMLImportContext *ScXMLTableContext::CreateChildContext( sal_uInt16 nPrefix,
            pContext = new XMLEventsImportContext( GetImport(), nPrefix, rLName, xSupplier );
        }
        break;
    case XML_TOK_TABLE_CONDFORMATS:
        pContext = new ScXMLConditionalFormatsContext( GetScImport(), nPrefix, rLName );
        break;
    default:
        ;
    }
@@ -328,6 +293,26 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
            new ScXMLNamedExpressionsContext::SheetLocalInserter(GetScImport(), nTab));
    }
        break;
    case XML_ELEMENT( TABLE, XML_TABLE_COLUMN_GROUP ):
        pContext = new ScXMLTableColsContext( GetScImport(), nElement, xAttrList,
                                                   false, true );
        break;
    case XML_ELEMENT( TABLE, XML_TABLE_HEADER_COLUMNS ):
        pContext = new ScXMLTableColsContext( GetScImport(), nElement, xAttrList,
                                                   true, false );
        break;
    case XML_ELEMENT( TABLE, XML_TABLE_COLUMNS ):
        pContext = new ScXMLTableColsContext( GetScImport(), nElement, xAttrList,
                                                   false, false );
        break;
    case XML_ELEMENT( TABLE, XML_TABLE_COLUMN ):
        pContext = new ScXMLTableColContext( GetScImport(), nElement, xAttrList );
        break;
    case XML_ELEMENT( TABLE, XML_TABLE_PROTECTION ):
    case XML_ELEMENT( LO_EXT, XML_TABLE_PROTECTION ):
    case XML_ELEMENT( OFFICE_EXT, XML_TABLE_PROTECTION ):
        pContext = new ScXMLTableProtectionContext( GetScImport(), nElement, xAttrList );
        break;
    case XML_ELEMENT( TABLE, XML_TABLE_ROW_GROUP ):
        pContext = new ScXMLTableRowsContext( GetScImport(), xAttrList,
                                                   false, true );
@@ -343,6 +328,18 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
    case XML_ELEMENT( TABLE, XML_TABLE_ROW ):
            pContext = new ScXMLTableRowContext( GetScImport(),xAttrList );
        break;
    case XML_ELEMENT( TABLE, XML_TABLE_SOURCE ):
        pContext = new ScXMLTableSourceContext( GetScImport(), nElement, xAttrList);
        break;
    case XML_ELEMENT( TABLE, XML_SCENARIO ):
        pContext = new ScXMLTableScenarioContext( GetScImport(), nElement, xAttrList);
        break;
    case XML_ELEMENT( TABLE, XML_SHAPES ):
        pContext = new ScXMLTableShapesContext( GetScImport(), nElement, xAttrList);
        break;
    case XML_ELEMENT( CALC_EXT, XML_CONDITIONAL_FORMATS ):
        pContext = new ScXMLConditionalFormatsContext( GetScImport(), nElement );
        break;
    default:
        pContext = new SvXMLImportContext( GetImport() );
    }
@@ -432,11 +429,10 @@ void SAL_CALL ScXMLTableContext::endFastElement(sal_Int32 /*nElement*/)
}

ScXMLTableProtectionContext::ScXMLTableProtectionContext(
    ScXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLName,
    const Reference<XAttributeList>& xAttrList ) :
    ScXMLImportContext( rImport, nPrefix, rLName )
    ScXMLImport& rImport, sal_Int32 /*nElement*/,
    const Reference< xml::sax::XFastAttributeList>& xAttrList ) :
    ScXMLImportContext( rImport )
{
    const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetTableProtectionAttrTokenMap();
    bool bSelectProtectedCells = false;
    bool bSelectUnprotectedCells = false;
    bool bInsertColumns = false;
@@ -444,41 +440,42 @@ ScXMLTableProtectionContext::ScXMLTableProtectionContext(
    bool bDeleteColumns = false;
    bool bDeleteRows = false;

    sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;

    for (sal_Int16 i = 0; i < nAttrCount; ++i)
    if ( xAttrList.is() )
    {
        const OUString& aAttrName = xAttrList->getNameByIndex(i);
        const OUString aValue = xAttrList->getValueByIndex(i);
        sax_fastparser::FastAttributeList *pAttribList =
            sax_fastparser::FastAttributeList::castToFastAttributeList( xAttrList );

        OUString aLocalName;
        sal_uInt16 nLocalPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
            aAttrName, &aLocalName);

        switch (rAttrTokenMap.Get(nLocalPrefix, aLocalName))
        for (auto &aIter : *pAttribList)
        {
            case XML_TOK_TABLE_SELECT_PROTECTED_CELLS:
            case XML_TOK_TABLE_SELECT_PROTECTED_CELLS_EXT:
                bSelectProtectedCells = IsXMLToken(aValue, XML_TRUE);
            sal_Int32 nToken = aIter.getToken();
            switch (nToken)

            {
            case XML_ELEMENT( TABLE, XML_SELECT_PROTECTED_CELLS ):
            case XML_ELEMENT( OFFICE_EXT, XML_SELECT_PROTECTED_CELLS ):
            case XML_ELEMENT( LO_EXT, XML_SELECT_PROTECTED_CELLS ):
                bSelectProtectedCells = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS:
            case XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS_EXT:
                bSelectUnprotectedCells = IsXMLToken(aValue, XML_TRUE);
            case XML_ELEMENT( TABLE, XML_SELECT_UNPROTECTED_CELLS ):
            case XML_ELEMENT( OFFICE_EXT, XML_SELECT_UNPROTECTED_CELLS ):
            case XML_ELEMENT( LO_EXT, XML_SELECT_UNPROTECTED_CELLS ):
                bSelectUnprotectedCells = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_TOK_TABLE_INSERT_COLUMNS_EXT:
                bInsertColumns = IsXMLToken(aValue, XML_TRUE);
            case XML_ELEMENT( LO_EXT, XML_INSERT_COLUMNS ):
                bInsertColumns = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_TOK_TABLE_INSERT_ROWS_EXT:
                bInsertRows = IsXMLToken(aValue, XML_TRUE);
            case XML_ELEMENT( LO_EXT,  XML_INSERT_ROWS ):
                bInsertRows = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_TOK_TABLE_DELETE_COLUMNS_EXT:
                bDeleteColumns = IsXMLToken(aValue, XML_TRUE);
            case XML_ELEMENT( LO_EXT, XML_DELETE_COLUMNS ):
                bDeleteColumns = IsXMLToken(aIter, XML_TRUE);
                break;
            case XML_TOK_TABLE_DELETE_ROWS_EXT:
                bDeleteRows = IsXMLToken(aValue, XML_TRUE);
            case XML_ELEMENT( LO_EXT, XML_DELETE_ROWS ):
                bDeleteRows = IsXMLToken(aIter, XML_TRUE);
                break;
            default:
                SAL_WARN("sc", "unknown attribute: " << aAttrName);
                SAL_WARN("sc", "unknown attribute: " << nToken);
            }
        }
    }

@@ -495,14 +492,10 @@ ScXMLTableProtectionContext::~ScXMLTableProtectionContext()
{
}

SvXMLImportContext* ScXMLTableProtectionContext::CreateChildContext(
    sal_uInt16 /*nPrefix*/, const OUString& /*rLocalName*/, const Reference<XAttributeList>& /*xAttrList*/ )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLTableProtectionContext::createFastChildContext(
    sal_Int32 /*nElement*/, const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ )
{
    return nullptr;
}

void ScXMLTableProtectionContext::EndElement()
{
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/xml/xmltabi.hxx b/sc/source/filter/xml/xmltabi.hxx
index d36f4d8..9f9775e 100644
--- a/sc/source/filter/xml/xmltabi.hxx
+++ b/sc/source/filter/xml/xmltabi.hxx
@@ -67,17 +67,13 @@ public:
class ScXMLTableProtectionContext : public ScXMLImportContext
{
public:
    ScXMLTableProtectionContext( ScXMLImport& rImport, sal_uInt16 nPrefix,
                        const OUString& rLName,
                        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList );
    ScXMLTableProtectionContext( ScXMLImport& rImport, sal_Int32 nElement,
                        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList );

    virtual ~ScXMLTableProtectionContext() override;

    virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
                                     const OUString& rLocalName,
                                     const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;

    virtual void EndElement() override;
    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
        sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
};

#endif