/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" // INCLUDE --------------------------------------------------------------- #include "xmlcvali.hxx" #include "xmlimprt.hxx" #include "xmlconti.hxx" #include "document.hxx" #include "XMLConverter.hxx" #include #include #include #include #include #include #include using namespace com::sun::star; using namespace xmloff::token; using namespace ::formula; using ::rtl::OUString; class ScXMLContentValidationContext : public SvXMLImportContext { rtl::OUString sName; rtl::OUString sHelpTitle; rtl::OUString sHelpMessage; rtl::OUString sErrorTitle; rtl::OUString sErrorMessage; rtl::OUString sErrorMessageType; rtl::OUString sBaseCellAddress; rtl::OUString sCondition; sal_Int16 nShowList; sal_Bool bAllowEmptyCell; sal_Bool bDisplayHelp; sal_Bool bDisplayError; SvXMLImportContextRef xEventContext; const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } com::sun::star::sheet::ValidationAlertStyle GetAlertStyle() const; void SetFormula( OUString& rFormula, OUString& rFormulaNmsp, FormulaGrammar::Grammar& reGrammar, const OUString& rCondition, const OUString& rGlobNmsp, FormulaGrammar::Grammar eGlobGrammar, bool bHasNmsp ) const; void GetCondition( ScMyImportValidation& rValidation ) const; public: ScXMLContentValidationContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList); virtual ~ScXMLContentValidationContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void EndElement(); void SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay); void SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const rtl::OUString& sMessageType, const sal_Bool bDisplay); void SetErrorMacro(const sal_Bool bExecute); }; class ScXMLHelpMessageContext : public SvXMLImportContext { rtl::OUString sTitle; rtl::OUStringBuffer sMessage; sal_Int32 nParagraphCount; sal_Bool bDisplay; ScXMLContentValidationContext* pValidationContext; const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } public: ScXMLHelpMessageContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, ScXMLContentValidationContext* pValidationContext); virtual ~ScXMLHelpMessageContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void EndElement(); }; class ScXMLErrorMessageContext : public SvXMLImportContext { rtl::OUString sTitle; rtl::OUStringBuffer sMessage; rtl::OUString sMessageType; sal_Int32 nParagraphCount; sal_Bool bDisplay; ScXMLContentValidationContext* pValidationContext; const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } public: ScXMLErrorMessageContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, ScXMLContentValidationContext* pValidationContext); virtual ~ScXMLErrorMessageContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void EndElement(); }; class ScXMLErrorMacroContext : public SvXMLImportContext { rtl::OUString sName; sal_Bool bExecute; ScXMLContentValidationContext* pValidationContext; const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } public: ScXMLErrorMacroContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, ScXMLContentValidationContext* pValidationContext); virtual ~ScXMLErrorMacroContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void EndElement(); }; //------------------------------------------------------------------ ScXMLContentValidationsContext::ScXMLContentValidationsContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) : SvXMLImportContext( rImport, nPrfx, rLName ) { // here are no attributes } ScXMLContentValidationsContext::~ScXMLContentValidationsContext() { } SvXMLImportContext *ScXMLContentValidationsContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { SvXMLImportContext *pContext = 0; const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationsElemTokenMap(); switch( rTokenMap.Get( nPrefix, rLName ) ) { case XML_TOK_CONTENT_VALIDATION: pContext = new ScXMLContentValidationContext( GetScImport(), nPrefix, rLName, xAttrList); break; } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); return pContext; } void ScXMLContentValidationsContext::EndElement() { } ScXMLContentValidationContext::ScXMLContentValidationContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : SvXMLImportContext( rImport, nPrfx, rLName ), nShowList(sheet::TableValidationVisibility::UNSORTED), bAllowEmptyCell(sal_True), bDisplayHelp(sal_False), bDisplayError(sal_False) { sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationAttrTokenMap(); for( sal_Int16 i=0; i < nAttrCount; ++i ) { const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); rtl::OUString aLocalName; sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) { case XML_TOK_CONTENT_VALIDATION_NAME: sName = sValue; break; case XML_TOK_CONTENT_VALIDATION_CONDITION: sCondition = sValue; break; case XML_TOK_CONTENT_VALIDATION_BASE_CELL_ADDRESS: sBaseCellAddress = sValue; break; case XML_TOK_CONTENT_VALIDATION_ALLOW_EMPTY_CELL: if (IsXMLToken(sValue, XML_FALSE)) bAllowEmptyCell = sal_False; break; case XML_TOK_CONTENT_VALIDATION_DISPLAY_LIST: { if (IsXMLToken(sValue, XML_NO)) { nShowList = sheet::TableValidationVisibility::INVISIBLE; } else if (IsXMLToken(sValue, XML_UNSORTED)) { nShowList = sheet::TableValidationVisibility::UNSORTED; } else if (IsXMLToken(sValue, XML_SORTED_ASCENDING)) { nShowList = sheet::TableValidationVisibility::SORTEDASCENDING; } } break; } } } ScXMLContentValidationContext::~ScXMLContentValidationContext() { } SvXMLImportContext *ScXMLContentValidationContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { SvXMLImportContext *pContext = 0; const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationElemTokenMap(); switch( rTokenMap.Get( nPrefix, rLName ) ) { case XML_TOK_CONTENT_VALIDATION_ELEM_HELP_MESSAGE: pContext = new ScXMLHelpMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this); break; case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MESSAGE: pContext = new ScXMLErrorMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this); break; case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MACRO: pContext = new ScXMLErrorMacroContext( GetScImport(), nPrefix, rLName, xAttrList, this); break; case XML_TOK_CONTENT_VALIDATION_ELEM_EVENT_LISTENERS: pContext = new XMLEventsImportContext( GetImport(), nPrefix, rLName ); xEventContext = pContext; break; } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); return pContext; } sheet::ValidationAlertStyle ScXMLContentValidationContext::GetAlertStyle() const { if (IsXMLToken(sErrorMessageType, XML_MACRO)) return sheet::ValidationAlertStyle_MACRO; if (IsXMLToken(sErrorMessageType, XML_STOP)) return sheet::ValidationAlertStyle_STOP; if (IsXMLToken(sErrorMessageType, XML_WARNING)) return sheet::ValidationAlertStyle_WARNING; if (IsXMLToken(sErrorMessageType, XML_INFORMATION)) return sheet::ValidationAlertStyle_INFO; // default for unknown return sheet::ValidationAlertStyle_STOP; } void ScXMLContentValidationContext::SetFormula( OUString& rFormula, OUString& rFormulaNmsp, FormulaGrammar::Grammar& reGrammar, const OUString& rCondition, const OUString& rGlobNmsp, FormulaGrammar::Grammar eGlobGrammar, bool bHasNmsp ) const { reGrammar = FormulaGrammar::GRAM_UNSPECIFIED; if( bHasNmsp ) { // the entire attribute contains a namespace: internal namespace not allowed rFormula = rCondition; rFormulaNmsp = rGlobNmsp; reGrammar = eGlobGrammar; } else { // the attribute does not contain a namespace: try to find a namespace of an external grammar GetScImport().ExtractFormulaNamespaceGrammar( rFormula, rFormulaNmsp, reGrammar, rCondition, true ); if( reGrammar != FormulaGrammar::GRAM_EXTERNAL ) reGrammar = eGlobGrammar; } } void ScXMLContentValidationContext::GetCondition( ScMyImportValidation& rValidation ) const { rValidation.aValidationType = sheet::ValidationType_ANY; // #b6343997# default if no condition is given rValidation.aOperator = sheet::ConditionOperator_NONE; if( sCondition.getLength() > 0 ) { // extract leading namespace from condition string OUString aCondition, aConditionNmsp; FormulaGrammar::Grammar eGrammar = FormulaGrammar::GRAM_UNSPECIFIED; GetScImport().ExtractFormulaNamespaceGrammar( aCondition, aConditionNmsp, eGrammar, sCondition ); bool bHasNmsp = aCondition.getLength() < sCondition.getLength(); // parse a condition from the attribute string ScXMLConditionParseResult aParseResult; ScXMLConditionHelper::parseCondition( aParseResult, aCondition, 0 ); /* Check the result. A valid value in aParseResult.meToken implies that the other members of aParseResult are filled with valid data for that token. */ bool bSecondaryPart = false; switch( aParseResult.meToken ) { case XML_COND_TEXTLENGTH: // condition is 'cell-content-text-length()' case XML_COND_TEXTLENGTH_ISBETWEEN: // condition is 'cell-content-text-length-is-between(,)' case XML_COND_TEXTLENGTH_ISNOTBETWEEN: // condition is 'cell-content-text-length-is-not-between(,)' case XML_COND_ISINLIST: // condition is 'cell-content-is-in-list()' rValidation.aValidationType = aParseResult.meValidation; rValidation.aOperator = aParseResult.meOperator; break; case XML_COND_ISWHOLENUMBER: // condition is 'cell-content-is-whole-number() and ' case XML_COND_ISDECIMALNUMBER: // condition is 'cell-content-is-decimal-number() and ' case XML_COND_ISDATE: // condition is 'cell-content-is-date() and ' case XML_COND_ISTIME: // condition is 'cell-content-is-time() and ' rValidation.aValidationType = aParseResult.meValidation; bSecondaryPart = true; break; default:; // unacceptable or unknown condition } /* Parse the following 'and ' part of some conditions. This updates the members of aParseResult that will contain the operands and comparison operator then. */ if( bSecondaryPart ) { ScXMLConditionHelper::parseCondition( aParseResult, aCondition, aParseResult.mnEndIndex ); if( aParseResult.meToken == XML_COND_AND ) { ScXMLConditionHelper::parseCondition( aParseResult, aCondition, aParseResult.mnEndIndex ); switch( aParseResult.meToken ) { case XML_COND_CELLCONTENT: // condition is 'and cell-content()' case XML_COND_ISBETWEEN: // condition is 'and cell-content-is-between(,)' case XML_COND_ISNOTBETWEEN: // condition is 'and cell-content-is-not-between(,)' rValidation.aOperator = aParseResult.meOperator; break; default:; // unacceptable or unknown condition } } } // a validation type (date, integer) without a condition isn't possible if( rValidation.aOperator == sheet::ConditionOperator_NONE ) rValidation.aValidationType = sheet::ValidationType_ANY; // parse the formulas if( rValidation.aValidationType != sheet::ValidationType_ANY ) { SetFormula( rValidation.sFormula1, rValidation.sFormulaNmsp1, rValidation.eGrammar1, aParseResult.maOperand1, aConditionNmsp, eGrammar, bHasNmsp ); SetFormula( rValidation.sFormula2, rValidation.sFormulaNmsp2, rValidation.eGrammar2, aParseResult.maOperand2, aConditionNmsp, eGrammar, bHasNmsp ); } } } void ScXMLContentValidationContext::EndElement() { // #i36650# event-listeners element moved up one level if (xEventContext.Is()) { rtl::OUString sOnError(RTL_CONSTASCII_USTRINGPARAM("OnError")); XMLEventsImportContext* pEvents = (XMLEventsImportContext*)&xEventContext; uno::Sequence aValues; pEvents->GetEventSequence( sOnError, aValues ); sal_Int32 nLength = aValues.getLength(); for( sal_Int32 i = 0; i < nLength; i++ ) { // #i47525# must allow "MacroName" or "Script" if ( aValues[i].Name.equalsAsciiL( "MacroName", sizeof("MacroName")-1 ) || aValues[i].Name.equalsAsciiL( "Script", sizeof("Script")-1 ) ) { aValues[i].Value >>= sErrorTitle; break; } } } ScMyImportValidation aValidation; aValidation.eGrammar1 = aValidation.eGrammar2 = GetScImport().GetDocument()->GetStorageGrammar(); aValidation.sName = sName; aValidation.sBaseCellAddress = sBaseCellAddress; aValidation.sImputTitle = sHelpTitle; aValidation.sImputMessage = sHelpMessage; aValidation.sErrorTitle = sErrorTitle; aValidation.sErrorMessage = sErrorMessage; GetCondition( aValidation ); aValidation.aAlertStyle = GetAlertStyle(); aValidation.bShowErrorMessage = bDisplayError; aValidation.bShowImputMessage = bDisplayHelp; aValidation.bIgnoreBlanks = bAllowEmptyCell; aValidation.nShowList = nShowList; GetScImport().AddValidation(aValidation); } void ScXMLContentValidationContext::SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay) { sHelpTitle = sTitle; sHelpMessage = sMessage; bDisplayHelp = bDisplay; } void ScXMLContentValidationContext::SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const rtl::OUString& sMessageType, const sal_Bool bDisplay) { sErrorTitle = sTitle; sErrorMessage = sMessage; sErrorMessageType = sMessageType; bDisplayError = bDisplay; } void ScXMLContentValidationContext::SetErrorMacro(const sal_Bool bExecute) { sErrorMessageType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("macro")); bDisplayError = bExecute; } ScXMLHelpMessageContext::ScXMLHelpMessageContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, ScXMLContentValidationContext* pTempValidationContext) : SvXMLImportContext( rImport, nPrfx, rLName ), sTitle(), sMessage(), nParagraphCount(0), bDisplay(sal_False) { pValidationContext = pTempValidationContext; sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationHelpMessageAttrTokenMap(); for( sal_Int16 i=0; i < nAttrCount; ++i ) { const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); rtl::OUString aLocalName; sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) { case XML_TOK_HELP_MESSAGE_ATTR_TITLE: sTitle = sValue; break; case XML_TOK_HELP_MESSAGE_ATTR_DISPLAY: bDisplay = IsXMLToken(sValue, XML_TRUE); break; } } } ScXMLHelpMessageContext::~ScXMLHelpMessageContext() { } SvXMLImportContext *ScXMLHelpMessageContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { SvXMLImportContext *pContext = 0; const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap(); switch( rTokenMap.Get( nPrefix, rLName ) ) { case XML_TOK_P: { if(nParagraphCount) sMessage.append(static_cast('\n')); ++nParagraphCount; pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage); } break; } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); return pContext; } void ScXMLHelpMessageContext::EndElement() { pValidationContext->SetHelpMessage(sTitle, sMessage.makeStringAndClear(), bDisplay); } ScXMLErrorMessageContext::ScXMLErrorMessageContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, ScXMLContentValidationContext* pTempValidationContext) : SvXMLImportContext( rImport, nPrfx, rLName ), sTitle(), sMessage(), sMessageType(), nParagraphCount(0), bDisplay(sal_False) { pValidationContext = pTempValidationContext; sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMessageAttrTokenMap(); for( sal_Int16 i=0; i < nAttrCount; ++i ) { const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); rtl::OUString aLocalName; sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) { case XML_TOK_ERROR_MESSAGE_ATTR_TITLE: sTitle = sValue; break; case XML_TOK_ERROR_MESSAGE_ATTR_MESSAGE_TYPE: sMessageType = sValue; break; case XML_TOK_ERROR_MESSAGE_ATTR_DISPLAY: bDisplay = IsXMLToken(sValue, XML_TRUE); break; } } } ScXMLErrorMessageContext::~ScXMLErrorMessageContext() { } SvXMLImportContext *ScXMLErrorMessageContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { SvXMLImportContext *pContext = 0; const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap(); switch( rTokenMap.Get( nPrefix, rLName ) ) { case XML_TOK_P: { if(nParagraphCount) sMessage.append(static_cast('\n')); ++nParagraphCount; pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage); } break; } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); return pContext; } void ScXMLErrorMessageContext::EndElement() { pValidationContext->SetErrorMessage(sTitle, sMessage.makeStringAndClear(), sMessageType, bDisplay); } ScXMLErrorMacroContext::ScXMLErrorMacroContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, ScXMLContentValidationContext* pTempValidationContext) : SvXMLImportContext( rImport, nPrfx, rLName ), sName(), bExecute(sal_False) { pValidationContext = pTempValidationContext; sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMacroAttrTokenMap(); for( sal_Int16 i=0; i < nAttrCount; ++i ) { const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); rtl::OUString aLocalName; sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) { case XML_TOK_ERROR_MACRO_ATTR_NAME: sName = sValue; break; case XML_TOK_ERROR_MACRO_ATTR_EXECUTE: bExecute = IsXMLToken(sValue, XML_TRUE); break; } } } ScXMLErrorMacroContext::~ScXMLErrorMacroContext() { } SvXMLImportContext *ScXMLErrorMacroContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) { SvXMLImportContext *pContext = NULL; if ((nPrefix == XML_NAMESPACE_SCRIPT) && IsXMLToken(rLName, XML_EVENTS)) { pContext = new XMLEventsImportContext(GetImport(), nPrefix, rLName); } if (!pContext) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); return pContext; } void ScXMLErrorMacroContext::EndElement() { pValidationContext->SetErrorMacro( bExecute ); }