diff options
author | Mohammed Abdul Azeem <azeemmysore@gmail.com> | 2016-09-05 14:38:30 +0530 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2017-01-25 11:20:48 +0000 |
commit | 8154953add163554c00935486a1cf5677cef2609 (patch) | |
tree | d8e148e84aa1e164a2358827085f4d9240ce5e31 /sc/source/filter/xml/xmlrowi.cxx | |
parent | 657eea01046c7f39ee8ca4545241372177385946 (diff) |
ScXMLTableRowCellContext implements fast interfaces:
Implementation of fast interfaces for contexts in path from
ScXMLImport::CreateFastContext to ScXMLTableRowCellContext.
FastParser is enabled and duplicates are avoided at all
possible places.
OOoXML filters still need those legacy paths we removed,
so I had to temporarily map them to fast elements, which
would increase their load time, but hopefully it should
help us in the long run.
Change-Id: Ie997a9a8b72787da2356abc99ea2cd57c2e5b670
Reviewed-on: https://gerrit.libreoffice.org/28648
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'sc/source/filter/xml/xmlrowi.cxx')
-rw-r--r-- | sc/source/filter/xml/xmlrowi.cxx | 146 |
1 files changed, 72 insertions, 74 deletions
diff --git a/sc/source/filter/xml/xmlrowi.cxx b/sc/source/filter/xml/xmlrowi.cxx index 2a66bde28ee4..130843211c9d 100644 --- a/sc/source/filter/xml/xmlrowi.cxx +++ b/sc/source/filter/xml/xmlrowi.cxx @@ -33,6 +33,7 @@ #include <xmloff/xmlnmspe.hxx> #include <xmloff/families.hxx> #include <xmloff/xmltoken.hxx> +#include <sax/fastattribs.hxx> #include <com/sun/star/sheet/XSpreadsheet.hpp> #include <com/sun/star/table/XColumnRowRange.hpp> #include <com/sun/star/sheet/XPrintAreas.hpp> @@ -43,55 +44,58 @@ using namespace com::sun::star; using namespace xmloff::token; ScXMLTableRowContext::ScXMLTableRowContext( 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)), nRepeatedRows(1), bHasCell(false) { OUString sCellStyleName; - sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0); const SvXMLTokenMap& rAttrTokenMap(GetScImport().GetTableRowAttrTokenMap()); - 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; + assert( dynamic_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() ) != nullptr ); + pAttribList = static_cast< sax_fastparser::FastAttributeList *>( xAttrList.get() ); - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + const std::vector< sal_Int32 >& rAttrList = pAttribList->getFastAttributeTokens(); + for ( size_t i = 0; i < rAttrList.size(); i++ ) { - case XML_TOK_TABLE_ROW_ATTR_STYLE_NAME: + const OUString sValue = OUString(pAttribList->getFastAttributeValue(i), + pAttribList->AttributeValueLength(i), RTL_TEXTENCODING_UTF8); + switch( rAttrTokenMap.Get( rAttrList[ i ] ) ) { - sStyleName = sValue; - } - break; - case XML_TOK_TABLE_ROW_ATTR_VISIBILITY: - { - sVisibility = sValue; - } - break; - case XML_TOK_TABLE_ROW_ATTR_REPEATED: - { - nRepeatedRows = std::max( sValue.toInt32(), (sal_Int32) 1 ); - nRepeatedRows = std::min( nRepeatedRows, MAXROWCOUNT ); - } - break; - case XML_TOK_TABLE_ROW_ATTR_DEFAULT_CELL_STYLE_NAME: - { - sCellStyleName = sValue; - } - break; - /*case XML_TOK_TABLE_ROW_ATTR_USE_OPTIMAL_HEIGHT: - { - sOptimalHeight = sValue; + case XML_TOK_TABLE_ROW_ATTR_STYLE_NAME: + { + sStyleName = sValue; + } + break; + case XML_TOK_TABLE_ROW_ATTR_VISIBILITY: + { + sVisibility = sValue; + } + break; + case XML_TOK_TABLE_ROW_ATTR_REPEATED: + { + nRepeatedRows = std::max( sValue.toInt32(), (sal_Int32) 1 ); + nRepeatedRows = std::min( nRepeatedRows, MAXROWCOUNT ); + } + break; + case XML_TOK_TABLE_ROW_ATTR_DEFAULT_CELL_STYLE_NAME: + { + sCellStyleName = sValue; + } + break; + /*case XML_TOK_TABLE_ROW_ATTR_USE_OPTIMAL_HEIGHT: + { + sOptimalHeight = sValue; + } + break;*/ } - break;*/ } } + GetScImport().GetTables().AddRow(); GetScImport().GetTables().SetRowStyle(sCellStyleName); } @@ -100,21 +104,22 @@ ScXMLTableRowContext::~ScXMLTableRowContext() { } -SvXMLImportContext *ScXMLTableRowContext::CreateChildContext( sal_uInt16 nPrefix, - const OUString& rLName, - const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) +uno::Reference< xml::sax::XFastContextHandler > SAL_CALL + ScXMLTableRowContext::createFastChildContext( sal_Int32 nElement, + const uno::Reference< xml::sax::XFastAttributeList > & xAttrList ) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) { SvXMLImportContext *pContext(nullptr); const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowElemTokenMap()); - switch( rTokenMap.Get( nPrefix, rLName ) ) + switch( rTokenMap.Get( nElement ) ) { case XML_TOK_TABLE_ROW_CELL: // if( IsInsertCellPossible() ) { bHasCell = true; - pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix, - rLName, xAttrList, false, static_cast<SCROW>(nRepeatedRows) + pContext = new ScXMLTableRowCellContext( GetScImport(), nElement, + xAttrList, false, static_cast<SCROW>(nRepeatedRows) //this ); } @@ -123,8 +128,8 @@ SvXMLImportContext *ScXMLTableRowContext::CreateChildContext( sal_uInt16 nPrefix // if( IsInsertCellPossible() ) { bHasCell = true; - pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix, - rLName, xAttrList, true, static_cast<SCROW>(nRepeatedRows) + pContext = new ScXMLTableRowCellContext( GetScImport(), nElement, + xAttrList, true, static_cast<SCROW>(nRepeatedRows) //this ); } @@ -132,12 +137,13 @@ SvXMLImportContext *ScXMLTableRowContext::CreateChildContext( sal_uInt16 nPrefix } if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + pContext = new SvXMLImportContext( GetImport() ); return pContext; } -void ScXMLTableRowContext::EndElement() +void SAL_CALL ScXMLTableRowContext::endFastElement(sal_Int32 /*nElement*/) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) { ScXMLImport& rXMLImport(GetScImport()); if (!bHasCell && nRepeatedRows > 1) @@ -209,12 +215,11 @@ void ScXMLTableRowContext::EndElement() } ScXMLTableRowsContext::ScXMLTableRowsContext( 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 ), nHeaderStartRow(0), nGroupStartRow(0), bHeader(bTempHeader), @@ -232,17 +237,11 @@ ScXMLTableRowsContext::ScXMLTableRowsContext( ScXMLImport& rImport, { nGroupStartRow = rImport.GetTables().GetCurrentRow(); ++nGroupStartRow; - sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - for( sal_Int16 i=0; i < nAttrCount; ++i ) + if ( xAttrList.is() && + xAttrList->hasAttribute( NAMESPACE_TOKEN( XML_NAMESPACE_TABLE ) | XML_DISPLAY ) ) { - 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_TABLE) && IsXMLToken(aLocalName, XML_DISPLAY)) - bGroupDisplay = IsXMLToken(sValue, XML_TRUE); + bGroupDisplay = IsXMLToken( xAttrList->getValue( + NAMESPACE_TOKEN( XML_NAMESPACE_TABLE ) | XML_DISPLAY ), XML_TRUE ); } } } @@ -251,45 +250,44 @@ ScXMLTableRowsContext::~ScXMLTableRowsContext() { } -SvXMLImportContext *ScXMLTableRowsContext::CreateChildContext( sal_uInt16 nPrefix, - const OUString& rLName, - const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) +uno::Reference< xml::sax::XFastContextHandler > SAL_CALL + ScXMLTableRowsContext::createFastChildContext( sal_Int32 nElement, + const uno::Reference< xml::sax::XFastAttributeList > & xAttrList ) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) { SvXMLImportContext *pContext(nullptr); const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowsElemTokenMap()); - switch( rTokenMap.Get( nPrefix, rLName ) ) + switch( rTokenMap.Get( nElement ) ) { case XML_TOK_TABLE_ROWS_ROW_GROUP: - pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix, - rLName, xAttrList, + pContext = new ScXMLTableRowsContext( GetScImport(), nElement, xAttrList, false, true ); break; case XML_TOK_TABLE_ROWS_HEADER_ROWS: - pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix, - rLName, xAttrList, + pContext = new ScXMLTableRowsContext( GetScImport(), nElement, xAttrList, true, false ); break; case XML_TOK_TABLE_ROWS_ROWS: - pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix, - rLName, xAttrList, + pContext = new ScXMLTableRowsContext( GetScImport(), nElement, xAttrList, false, false ); break; case XML_TOK_TABLE_ROWS_ROW: - pContext = new ScXMLTableRowContext( GetScImport(), nPrefix, - rLName, xAttrList//, + pContext = new ScXMLTableRowContext( GetScImport(), nElement, + xAttrList//, //this ); break; } if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + pContext = new SvXMLImportContext( GetImport() ); return pContext; } -void ScXMLTableRowsContext::EndElement() +void SAL_CALL ScXMLTableRowsContext::endFastElement(sal_Int32 /*nElement*/) + throw (uno::RuntimeException, xml::sax::SAXException, std::exception) { ScXMLImport& rXMLImport(GetScImport()); if (bHeader) |