[Libreoffice-commits] core.git: Branch 'feature/fastparser' - 5 commits - xmloff/inc xmloff/source
Daniel Sikeler
d.sikeler94 at gmail.com
Fri Feb 13 00:50:13 PST 2015
xmloff/inc/txtvfldi.hxx | 16 +
xmloff/source/style/GradientStyle.cxx | 2
xmloff/source/text/XMLTextListBlockContext.cxx | 225 +++++++++++++++++++++++++
xmloff/source/text/XMLTextListBlockContext.hxx | 10 +
xmloff/source/text/XMLTextListItemContext.cxx | 117 +++++++++++++
xmloff/source/text/XMLTextListItemContext.hxx | 10 +
xmloff/source/text/txtvfldi.cxx | 155 +++++++++++++++++
7 files changed, 533 insertions(+), 2 deletions(-)
New commits:
commit 4b67e0c6f725851c90caab2af2fda8f8809b69b9
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date: Fri Feb 13 09:21:12 2015 +0100
fix XMLGradientStyleImport::importXML
Change-Id: If41fd5e0617768bc52e494c918048608f88d4334
diff --git a/xmloff/source/style/GradientStyle.cxx b/xmloff/source/style/GradientStyle.cxx
index 26ec0b9..647cc1d 100644
--- a/xmloff/source/style/GradientStyle.cxx
+++ b/xmloff/source/style/GradientStyle.cxx
@@ -429,7 +429,7 @@ bool XMLGradientStyleImport::importXML(
case XML_TOK_GRADIENT_ANGLE:
{
sal_Int32 nValue;
- sax::Converter::convertNumber( nTmpValue, attr->Value, 0, 3600 );
+ sax::Converter::convertNumber( nValue, attr->Value, 0, 3600 );
aGradient.Angle = sal_Int16( nValue );
}
break;
commit 99105e20cb5b32a676407699d1268e878ac3d623
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date: Fri Feb 13 09:14:34 2015 +0100
XMLVariableDeclsImportContext impl. fast interface
all methods implemented
Change-Id: Ia1943c2de2034607a7cb1d4a26e2321c96aea53a
diff --git a/xmloff/inc/txtvfldi.hxx b/xmloff/inc/txtvfldi.hxx
index 6383260..86adcd6 100644
--- a/xmloff/inc/txtvfldi.hxx
+++ b/xmloff/inc/txtvfldi.hxx
@@ -473,12 +473,21 @@ public:
sal_uInt16 nPrfx, /// namespace prefix
const OUString& rLocalName, /// element name w/o prefix
enum VarType eVarType); /// variable type
+ XMLVariableDeclsImportContext(
+ SvXMLImport& rImport, /// XML Import
+ XMLTextImportHelper& rHlp, /// text import helper
+ sal_Int32 Element, /// xml-tag specifier
+ enum VarType eVarType ); /// variable type
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;
};
/**
diff --git a/xmloff/source/text/txtvfldi.cxx b/xmloff/source/text/txtvfldi.cxx
index 948fe08..a4b0175 100644
--- a/xmloff/source/text/txtvfldi.cxx
+++ b/xmloff/source/text/txtvfldi.cxx
@@ -779,6 +779,15 @@ XMLVariableDeclsImportContext::XMLVariableDeclsImportContext(
{
}
+XMLVariableDeclsImportContext::XMLVariableDeclsImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_Int32 /*Element*/,
+ enum VarType eVarType )
+: SvXMLImportContext( rImport ),
+ eVarDeclsContextType(eVarType),
+ rImportHelper(rHlp)
+{
+}
+
SvXMLImportContext* XMLVariableDeclsImportContext::CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName,
const Reference<xml::sax::XAttributeList> & xAttrList )
@@ -823,8 +832,44 @@ SvXMLImportContext* XMLVariableDeclsImportContext::CreateChildContext(
return pImportContext;
}
+Reference< xml::sax::XFastContextHandler > SAL_CALL
+ XMLVariableDeclsImportContext::createFastChildContext( sal_Int32 Element,
+ const Reference< xml::sax::XFastAttributeList >& xAttrList )
+ throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+ sal_Int32 ElementToken = NAMESPACE | XML_NAMESPACE_TEXT;
+ Reference< xml::sax::XFastContextHandler > pImportContext = NULL;
+ switch( eVarDeclsContextType )
+ {
+ case VarTypeSequence:
+ ElementToken = ElementToken | XML_sequence_decl;
+ break;
+ case VarTypeSimple:
+ ElementToken = ElementToken | XML_variable_decl;
+ break;
+ case VarTypeUserField:
+ ElementToken = ElementToken | XML_user_field_decl;
+ default:
+ OSL_FAIL("unknown field type!");
+ ElementToken = ElementToken | XML_sequence_decl;
+ break;
+ }
+
+ if( Element == ElementToken )
+ {
+ pImportContext = new XMLVariableDeclImportContext(
+ GetImport(), rImportHelper, Element, xAttrList, eVarDeclsContextType );
+ }
+ // if no context was created, use default context
+ if( !pImportContext.is() ) {
+ pImportContext = SvXMLImportContext::createFastChildContext(
+ Element, xAttrList );
+ }
+
+ return pImportContext;
+}
// declaration import (<variable/user-field/sequence-decl> elements)
commit 388080679fd1695ecd090053709c7f4af7158508
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date: Fri Feb 13 09:13:03 2015 +0100
XMLVariableDeclImportContext impl. fast interface
all methods implemented
Change-Id: Id4c6cc1966d682096911ebaa38bc434cb2033e50
diff --git a/xmloff/inc/txtvfldi.hxx b/xmloff/inc/txtvfldi.hxx
index 276dc9b..6383260 100644
--- a/xmloff/inc/txtvfldi.hxx
+++ b/xmloff/inc/txtvfldi.hxx
@@ -509,6 +509,13 @@ public:
const ::com::sun::star::uno::Reference< /// list of element attributes
::com::sun::star::xml::sax::XAttributeList> & xAttrList,
enum VarType eVarType); /// variable type
+ XMLVariableDeclImportContext(
+ SvXMLImport& rImport, /// XML Import
+ XMLTextImportHelper& rHlp, /// text import helper
+ sal_Int32 Element, /// XML-tag specifier
+ const css::uno::Reference< /// list of element attributes
+ css::xml::sax::XFastAttributeList >& xAttrList,
+ enum VarType eVarType ); /// variable type
/// get field master for name and rename if appropriate
static bool FindFieldMaster(::com::sun::star::uno::Reference<
diff --git a/xmloff/source/text/txtvfldi.cxx b/xmloff/source/text/txtvfldi.cxx
index 89f4047..948fe08 100644
--- a/xmloff/source/text/txtvfldi.cxx
+++ b/xmloff/source/text/txtvfldi.cxx
@@ -32,6 +32,7 @@
#include <xmloff/xmlimp.hxx>
#include <xmloff/xmluconv.hxx>
#include <xmloff/xmlement.hxx>
+#include <xmloff/token/tokens.hxx>
#include <com/sun/star/text/SetVariableType.hpp>
#include <com/sun/star/text/XTextField.hpp>
#include <com/sun/star/text/XDependentTextField.hpp>
@@ -40,6 +41,7 @@
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/xml/sax/XAttributeList.hpp>
+#include <com/sun/star/xml/sax/FastToken.hpp>
#include <sax/tools/converter.hxx>
@@ -90,6 +92,8 @@ using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::style;
using namespace ::xmloff::token;
+using namespace xmloff;
+using css::xml::sax::FastToken::NAMESPACE;
@@ -936,6 +940,110 @@ XMLVariableDeclImportContext::XMLVariableDeclImportContext(
} // else: no sequence-decl
}
+XMLVariableDeclImportContext::XMLVariableDeclImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_Int32 Element,
+ const Reference< xml::sax::XFastAttributeList >& xAttrList,
+ enum VarType eVarType )
+: SvXMLImportContext( rImport ),
+ // bug?? which properties for userfield/userfieldmaster
+ sPropertySubType(sAPI_sub_type),
+ sPropertyNumberingLevel(sAPI_chapter_numbering_level),
+ sPropertyNumberingSeparator(sAPI_numbering_separator),
+ sPropertyIsExpression(sAPI_is_expression),
+ aValueHelper(rImport, rHlp, true, false, true, false),
+ nNumLevel(-1), cSeparationChar('.')
+{
+ if( Element == (NAMESPACE | XML_NAMESPACE_TEXT | XML_sequence_decl)
+ || Element == (NAMESPACE | XML_NAMESPACE_TEXT | XML_variable_decl)
+ || Element == (NAMESPACE | XML_NAMESPACE_TEXT | XML_user_field_decl) )
+ {
+ // TODO: check validity (need name!)
+
+ // parse attributes
+ uno::Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+ for( xml::FastAttribute attribute : attributes )
+ {
+ sal_uInt16 nToken = rHlp.GetTextFieldAttrTokenMap().
+ Get( attribute.Token );
+
+ switch( nToken )
+ {
+ case XML_TOK_TEXTFIELD_NAME:
+ sName = attribute.Value;
+ break;
+ case XML_TOK_TEXTFIELD_NUMBERING_LEVEL:
+ {
+ sal_Int32 nLevel;
+ bool const bRet = ::sax::Converter::convertNumber(
+ nLevel, attribute.Value, 0,
+ GetImport().GetTextImport()->GetChapterNumbering()->
+ getCount() );
+
+ if( bRet )
+ {
+ nNumLevel = static_cast< sal_Int8 >( nLevel-1 ); // API numbers -1..9
+ }
+ break;
+ }
+ case XML_TOK_TEXTFIELD_NUMBERING_SEPARATOR:
+ cSeparationChar =
+ static_cast< sal_Char >( attribute.Value.toChar() );
+ break;
+ default:
+ // delegate to value helper
+ aValueHelper.ProcessAttribute( nToken, attribute.Value );
+ break;
+ }
+ }
+
+ Reference<XPropertySet> xFieldMaster;
+ if( FindFieldMaster(xFieldMaster, GetImport(), rHlp,
+ sName, eVarType))
+ {
+ // now we have a field master: process attributes!
+ Any aAny;
+
+ switch( eVarType )
+ {
+ case VarTypeSequence:
+ aAny <<= nNumLevel;
+ xFieldMaster->setPropertyValue(sPropertyNumberingLevel, aAny);
+
+ if( nNumLevel >= 0 )
+ {
+ OUString sStr(&cSeparationChar, 1);
+ aAny <<= sStr;
+ xFieldMaster->setPropertyValue(
+ sPropertyNumberingSeparator, aAny);
+ }
+ break;
+ case VarTypeSimple:
+ {
+ // set string or non-string SubType (#93192#)
+ // The SubType was already set in the FindFieldMaster
+ // method, but it needs to be adjusted if it's a string.
+ aAny <<= aValueHelper.IsStringValue()
+ ? SetVariableType::STRING : SetVariableType::VAR;
+ xFieldMaster->setPropertyValue(sPropertySubType, aAny);
+ }
+ break;
+ case VarTypeUserField:
+ {
+ sal_Bool bTmp = !aValueHelper.IsStringValue();
+ aAny.setValue(&bTmp, ::getBooleanCppuType());
+ xFieldMaster->setPropertyValue(sPropertyIsExpression, aAny);
+ aValueHelper.PrepareField(xFieldMaster);
+ break;
+ }
+ default:
+ OSL_FAIL("unknown varfield type");
+ } // switch
+ } // else: no field master found/constructed
+ } // else: no sequence-decl
+}
+
+
bool XMLVariableDeclImportContext::FindFieldMaster(
@@ -1241,7 +1349,7 @@ static SvXMLEnumMapEntry const aValueTypeMap[] =
{ XML_TIME, XML_VALUE_TYPE_TIME },
{ XML_BOOLEAN, XML_VALUE_TYPE_BOOLEAN },
{ XML_STRING, XML_VALUE_TYPE_STRING },
- { XML_TOKEN_INVALID, 0 }
+ { xmloff::token::XML_TOKEN_INVALID, 0 }
};
XMLValueImportHelper::XMLValueImportHelper(
commit d78c898a7d1005be8005e5573803fdc3bf7ebc49
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date: Thu Feb 12 14:12:16 2015 +0100
XMLTextListBlockContext implements fast interface
all methods are implemented
Change-Id: Ibb50c09e3e7a8dfbe2feb78461de63c02b27b38c
diff --git a/xmloff/source/text/XMLTextListBlockContext.cxx b/xmloff/source/text/XMLTextListBlockContext.cxx
index f8f9d37..5ad79e3 100644
--- a/xmloff/source/text/XMLTextListBlockContext.cxx
+++ b/xmloff/source/text/XMLTextListBlockContext.cxx
@@ -231,6 +231,185 @@ XMLTextListBlockContext::XMLTextListBlockContext(
mrTxtImport.GetTextListHelper().PushListContext( this );
}
+// OD 2008-05-07 #refactorlists#
+// add optional parameter <bRestartNumberingAtSubList> and its handling
+XMLTextListBlockContext::XMLTextListBlockContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rTxtImp, sal_Int32 /*Element*/,
+ const Reference< xml::sax::XFastAttributeList >& xAttrList,
+ const bool bRestartNumberingAtSubList )
+: SvXMLImportContext( rImport ),
+ mrTxtImport( rTxtImp ),
+ msListStyleName(),
+ mxParentListBlock( ),
+ mnLevel( 0 ),
+ mbRestartNumbering( false ),
+ mbSetDefaults( false ),
+ msListId(),
+ msContinueListId()
+{
+ static const char s_PropNameDefaultListId[] = "DefaultListId";
+ {
+ // get the parent list block context (if any); this is a bit ugly...
+ XMLTextListBlockContext * pLB(0);
+ XMLTextListItemContext * pLI(0);
+ XMLNumberedParaContext * pNP(0);
+ rTxtImp.GetTextListHelper().ListContextTop(pLB, pLI, pNP);
+ }
+ // Inherit style name from parent list, as well as the flags whether
+ // numbering must be restarted and formats have to be created.
+ OUString sParentListStyleName;
+ if( mxParentListBlock.Is() )
+ {
+ XMLTextListBlockContext *pParent =
+ static_cast<XMLTextListBlockContext *>(&mxParentListBlock);
+ msListStyleName = pParent->GetListStyleName();
+ sParentListStyleName = msListStyleName;
+ mxNumRules = pParent->GetNumRules();
+ mnLevel = pParent->GetLevel() + 1;
+ mbRestartNumbering = pParent->IsRestartNumbering() ||
+ bRestartNumberingAtSubList;
+ mbSetDefaults = pParent->mbSetDefaults;
+ msListId = pParent->GetListId();
+ msContinueListId = pParent->GetContinueListId();
+ }
+
+ const SvXMLTokenMap& rTokenMap = mrTxtImport.GetTextListBlockAttrTokenMap();
+
+ bool bIsContinueNumberingAttributePresent( false );
+ uno::Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+ for( xml::FastAttribute attribute : attributes )
+ {
+ switch( rTokenMap.Get( attribute.Token ) )
+ {
+ case XML_TOK_TEXT_LIST_BLOCK_XMLID:
+ sXmlId = attribute.Value;
+//FIXME: there is no UNO API for lists
+ // xml:id is also the list ID (#i92221#)
+ if( mnLevel == 0) // root <list> element
+ {
+ msListId = attribute.Value;
+ }
+ break;
+ case XML_TOK_TEXT_LIST_BLOCK_CONTINUE_NUMBERING:
+ mbRestartNumbering = !attribute.Value.equals("true");
+ bIsContinueNumberingAttributePresent = true;
+ break;
+ case XML_TOK_TEXT_LIST_BLOCK_STYLE_NAME:
+ msListStyleName = attribute.Value;
+ break;
+ case XML_TOK_TEXT_LIST_BLOCK_CONTINUE_LIST:
+ if( mnLevel == 0) // root <list> element
+ {
+ msContinueListId = attribute.Value;
+ }
+ break;
+ }
+ }
+
+ mxNumRules = XMLTextListsHelper::MakeNumRule(GetImport(), mxNumRules,
+ sParentListStyleName, msListStyleName,
+ mnLevel, &mbRestartNumbering, &mbSetDefaults );
+ if( !mxNumRules.is() )
+ return;
+
+ if( mnLevel == 0) // root <list> element
+ {
+ XMLTextListsHelper& rTextListsHelper( mrTxtImport.GetTextListHelper() );
+ // Inconsistent behavior regarding lists (#i92811#)
+ OUString sListStyleDefaultListId;
+ {
+ uno::Reference< beans::XPropertySet > xNumRuleProps( mxNumRules, UNO_QUERY );
+ if( xNumRuleProps.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xNumRulePropSetInfo(
+ xNumRuleProps->getPropertySetInfo() );
+ if( xNumRulePropSetInfo.is() &&
+ xNumRulePropSetInfo->hasPropertyByName(
+ s_PropNameDefaultListId) )
+ {
+ xNumRuleProps->getPropertyValue(s_PropNameDefaultListId)
+ >>= sListStyleDefaultListId;
+ DBG_ASSERT( !sListStyleDefaultListId.isEmpty(),
+ "no default list id found at numbering rules instance. Serious defect -> please inform OD." );
+ }
+ }
+ }
+ if( msListId.isEmpty() ) // no text:id property found
+ {
+ sal_Int32 nUPD( 0 );
+ sal_Int32 nBuild( 0 );
+ const bool bBuildIdFound = GetImport().getBuildIds( nUPD, nBuild );
+ if( rImport.IsTextDocInOOoFileFormat() ||
+ ( bBuildIdFound && nUPD == 680 ) )
+ {
+ /* handling former documents written by OpenOffice.org:
+ use default list id of numbering rules instance, if existing
+ (#i92811#)
+ */
+ if( !sListStyleDefaultListId.isEmpty() )
+ {
+ msListId = sListStyleDefaultListId;
+ if( !bIsContinueNumberingAttributePresent &&
+ !mbRestartNumbering &&
+ rTextListsHelper.IsListProcessed( msListId ) )
+ {
+ mbRestartNumbering = true;
+ }
+ }
+ }
+ if( msListId.isEmpty() )
+ {
+ // generate a new list id for the list
+ msListId = rTextListsHelper.GenerateNewListId();
+ }
+ }
+
+ if( bIsContinueNumberingAttributePresent && !mbRestartNumbering &&
+ msContinueListId.isEmpty() )
+ {
+ OUString Last( rTextListsHelper.GetLastProcessedListId() );
+ if( rTextListsHelper.GetListStyleOfLastProcessedList() == msListStyleName
+ && Last != msListId )
+ {
+ msContinueListId = Last;
+ }
+ }
+
+ if( !msContinueListId.isEmpty() )
+ {
+ if( !rTextListsHelper.IsListProcessed( msContinueListId ) )
+ {
+ msContinueListId.clear();
+ }
+ else
+ {
+ // search continue list chain for master list and
+ // continue the master list.
+ OUString sTmpStr =
+ rTextListsHelper.GetContinueListIdOfProcessedList( msContinueListId );
+ while( !sTmpStr.isEmpty() )
+ {
+ msContinueListId = sTmpStr;
+
+ sTmpStr =
+ rTextListsHelper.GetContinueListIdOfProcessedList( msContinueListId );
+ }
+ }
+ }
+
+ if( !rTextListsHelper.IsListProcessed( msListId ) )
+ {
+ // Inconsistent behavior regarding lists (#i92811#)
+ rTextListsHelper.KeepListAsProcessed(
+ msListId, msListStyleName, msContinueListId,
+ sListStyleDefaultListId );
+ }
+ }
+
+ // Remember this list block.
+ mrTxtImport.GetTextListHelper().PushListContext( this );
+}
+
XMLTextListBlockContext::~XMLTextListBlockContext()
{
}
@@ -254,6 +433,26 @@ void XMLTextListBlockContext::EndElement()
mrTxtImport.GetTextListHelper().SetListItem( 0 );
}
+void SAL_CALL XMLTextListBlockContext::endFastElement( sal_Int32 /*Element*/ )
+ throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+ // Numbering has not to be restarted if it has been restarted within
+ // a child list.
+ XMLTextListBlockContext *pParent =
+ static_cast<XMLTextListBlockContext *>(&mxParentListBlock);
+ if( pParent )
+ {
+ pParent->mbRestartNumbering = mbRestartNumbering;
+ }
+
+ // Restore current list block.
+ mrTxtImport.GetTextListHelper().PopListContext();
+
+ // Any paragraph following the list within the same list item must not
+ // be numbered.
+ mrTxtImport.GetTextListHelper().SetListItem( 0 );
+}
+
SvXMLImportContext *XMLTextListBlockContext::CreateChildContext(
sal_uInt16 nPrefix,
const OUString& rLocalName,
@@ -282,6 +481,32 @@ SvXMLImportContext *XMLTextListBlockContext::CreateChildContext(
return pContext;
}
+Reference< xml::sax::XFastContextHandler > SAL_CALL
+ XMLTextListBlockContext::createFastChildContext( sal_Int32 Element,
+ const Reference< xml::sax::XFastAttributeList >& xAttrList )
+ throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+ Reference< xml::sax::XFastContextHandler > pContext = 0;
+
+ const SvXMLTokenMap& rTokenMap =
+ mrTxtImport.GetTextListBlockElemTokenMap();
+ bool bHeader = false;
+ switch( rTokenMap.Get( Element ) )
+ {
+ case XML_TOK_TEXT_LIST_HEADER:
+ bHeader = true;
+ //fall-through
+ case XML_TOK_TEXT_LIST_ITEM:
+ pContext = new XMLTextListItemContext( GetImport(), mrTxtImport,
+ Element, xAttrList, bHeader );
+ break;
+ }
+
+ if( !pContext.is() )
+ pContext = new SvXMLImportContext( GetImport() );
+
+ return pContext;
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/text/XMLTextListBlockContext.hxx b/xmloff/source/text/XMLTextListBlockContext.hxx
index 2796178..1263fc1 100644
--- a/xmloff/source/text/XMLTextListBlockContext.hxx
+++ b/xmloff/source/text/XMLTextListBlockContext.hxx
@@ -60,14 +60,24 @@ public:
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList > & xAttrList,
const bool bRestartNumberingAtSubList = false );
+ XMLTextListBlockContext( SvXMLImport& rImport,
+ XMLTextImportHelper& rTxtImp, sal_Int32 Element,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
+ const bool bRestartNumberingAtSubList = false );
virtual ~XMLTextListBlockContext();
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;
+ 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;
const OUString& GetListStyleName() const { return msListStyleName; }
sal_Int16 GetLevel() const { return mnLevel; }
commit 43fc4909e5e51e3b79b4784ee8d95be53f16c364
Author: Daniel Sikeler <d.sikeler94 at gmail.com>
Date: Thu Feb 12 14:10:31 2015 +0100
XMLTextListItemContext implements fast interface
all methods are implemented
Change-Id: I5d7b99e998a3f17a0ce3500fa55b2def82fd23ca
diff --git a/xmloff/source/text/XMLTextListItemContext.cxx b/xmloff/source/text/XMLTextListItemContext.cxx
index 71dea66..9c23610 100644
--- a/xmloff/source/text/XMLTextListItemContext.cxx
+++ b/xmloff/source/text/XMLTextListItemContext.cxx
@@ -21,6 +21,8 @@
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/xmltoken.hxx>
+#include <xmloff/token/tokens.hxx>
+#include <com/sun/star/xml/sax/FastToken.hpp>
#include "txtparai.hxx"
#include "txtlists.hxx"
#include "XMLTextListBlockContext.hxx"
@@ -34,6 +36,8 @@
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::xmloff::token;
+using namespace xmloff;
+using css::xml::sax::FastToken::NAMESPACE;
TYPEINIT1( XMLTextListItemContext, SvXMLImportContext );
@@ -121,6 +125,79 @@ XMLTextListItemContext::XMLTextListItemContext(
}
+XMLTextListItemContext::XMLTextListItemContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rTxtImp, sal_Int32 /*Element*/,
+ const Reference< xml::sax::XFastAttributeList >& xAttrList,
+ const bool bIsHeader )
+: SvXMLImportContext( rImport ),
+ rTxtImport( rTxtImp ),
+ nStartValue( -1 ),
+ mnSubListCount( 0 ),
+ mxNumRulesOverride()
+{
+ static const char s_NumberingRules[] = "NumberingRules";
+ uno::Sequence< xml::FastAttribute > attributes = xAttrList->getFastAttributes();
+ for( xml::FastAttribute attribute : attributes )
+ {
+ if( !bIsHeader && attribute.Token ==
+ (NAMESPACE | XML_NAMESPACE_TEXT | XML_start_value) )
+ {
+ sal_Int32 nTmp = attribute.Value.toInt32();
+ if( nTmp >= 0 && nTmp <= SHRT_MAX )
+ nStartValue = static_cast< sal_Int16 >( nTmp );
+ }
+ else if( attribute.Token ==
+ (NAMESPACE | XML_NAMESPACE_TEXT | XML_style_override) )
+ {
+ const OUString sListStyleOverrideName = attribute.Value;
+ if( !sListStyleOverrideName.isEmpty() )
+ {
+ OUString sDisplayStyleName(
+ GetImport().GetStyleDisplayName( XML_STYLE_FAMILY_TEXT_LIST,
+ sListStyleOverrideName ) );
+ const Reference< container::XNameContainer >& rNumStyles =
+ rTxtImp.GetNumberingStyles();
+ if( rNumStyles.is() && rNumStyles->hasByName( sDisplayStyleName ) )
+ {
+ Reference< style::XStyle > xStyle;
+ Any aAny = rNumStyles->getByName( sDisplayStyleName );
+ aAny >>= xStyle;
+
+ uno::Reference< beans::XPropertySet > xPropSet( xStyle, UNO_QUERY );
+ aAny = xPropSet->getPropertyValue(s_NumberingRules);
+ aAny >>= mxNumRulesOverride;
+ }
+ else
+ {
+ const SvxXMLListStyleContext* pListStyle =
+ rTxtImp.FindAutoListStyle( sListStyleOverrideName );
+ if( pListStyle )
+ {
+ mxNumRulesOverride = pListStyle->GetNumRules();
+ if( !mxNumRulesOverride.is() )
+ {
+ pListStyle->CreateAndInsertAuto();
+ mxNumRulesOverride = pListStyle->GetNumRules();
+ }
+ }
+ }
+ }
+ }
+ else if( attribute.Token ==
+ (NAMESPACE | XML_NAMESPACE_XML | XML_id) )
+ {
+ ;
+//FIXME: there is no UNO API for list items
+ }
+ }
+
+ // If this is a <text:list-item> element, then remember it as a sign
+ // that a bullet has to be generated.
+ if( !bIsHeader ) {
+ rTxtImport.GetTextListHelper().SetListItem( this );
+ }
+}
+
XMLTextListItemContext::~XMLTextListItemContext()
{
}
@@ -131,6 +208,13 @@ void XMLTextListItemContext::EndElement()
rTxtImport.GetTextListHelper().SetListItem( 0 );
}
+void SAL_CALL XMLTextListItemContext::endFastElement( sal_Int32 /*Element*/ )
+ throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+ // finish current list item
+ rTxtImport.GetTextListHelper().SetListItem( 0 );
+}
+
SvXMLImportContext *XMLTextListItemContext::CreateChildContext(
sal_uInt16 nPrefix,
const OUString& rLocalName,
@@ -167,4 +251,37 @@ SvXMLImportContext *XMLTextListItemContext::CreateChildContext(
return pContext;
}
+Reference< xml::sax::XFastContextHandler > SAL_CALL
+ XMLTextListItemContext::createFastChildContext( sal_Int32 Element,
+ const Reference< xml::sax::XFastAttributeList >& xAttrList )
+ throw(RuntimeException, xml::sax::SAXException, std::exception)
+{
+ Reference< xml::sax::XFastContextHandler > pContext = 0;
+
+ const SvXMLTokenMap& rTokenMap = rTxtImport.GetTextElemTokenMap();
+ bool bHeading = false;
+ switch( rTokenMap.Get( Element ) )
+ {
+ case XML_TOK_TEXT_H:
+ bHeading = true;
+ case XML_TOK_TEXT_P:
+ pContext = new XMLParaContext( GetImport(), Element,
+ xAttrList, bHeading );
+ if( rTxtImport.IsProgress() )
+ GetImport().GetProgressBarHelper()->Increment();
+
+ break;
+ case XML_TOK_TEXT_LIST:
+ ++mnSubListCount;
+ pContext = new XMLTextListBlockContext( GetImport(), rTxtImport,
+ Element, xAttrList, (mnSubListCount > 1) );
+ break;
+ }
+
+ if( !pContext.is() )
+ pContext = new SvXMLImportContext( GetImport() );
+
+ return pContext;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/text/XMLTextListItemContext.hxx b/xmloff/source/text/XMLTextListItemContext.hxx
index 069484a..f370ff8 100644
--- a/xmloff/source/text/XMLTextListItemContext.hxx
+++ b/xmloff/source/text/XMLTextListItemContext.hxx
@@ -48,14 +48,24 @@ public:
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList > & xAttrList,
const bool bIsHeader = false );
+ XMLTextListItemContext( SvXMLImport& rImport,
+ XMLTextImportHelper& rTxtImp, sal_Int32 Element,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
+ const bool bIsHeader = false );
virtual ~XMLTextListItemContext();
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;
+ 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;
bool HasStartValue() const { return -1 != nStartValue; }
sal_Int16 GetStartValue() const { return nStartValue; }
More information about the Libreoffice-commits
mailing list