blob: d398ab94f907e59ef7defc278cf2dc10ad43cf06 [file] [log] [blame]
/**************************************************************
*
* 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 <xmloff/xmltkmap.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/XMLEventsImportContext.hxx>
#include <com/sun/star/sheet/TableValidationVisibility.hpp>
#include <tools/debug.hxx>
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()<operator><expression>'
case XML_COND_TEXTLENGTH_ISBETWEEN: // condition is 'cell-content-text-length-is-between(<expression1>,<expression2>)'
case XML_COND_TEXTLENGTH_ISNOTBETWEEN: // condition is 'cell-content-text-length-is-not-between(<expression1>,<expression2>)'
case XML_COND_ISINLIST: // condition is 'cell-content-is-in-list(<expression>)'
rValidation.aValidationType = aParseResult.meValidation;
rValidation.aOperator = aParseResult.meOperator;
break;
case XML_COND_ISWHOLENUMBER: // condition is 'cell-content-is-whole-number() and <condition>'
case XML_COND_ISDECIMALNUMBER: // condition is 'cell-content-is-decimal-number() and <condition>'
case XML_COND_ISDATE: // condition is 'cell-content-is-date() and <condition>'
case XML_COND_ISTIME: // condition is 'cell-content-is-time() and <condition>'
rValidation.aValidationType = aParseResult.meValidation;
bSecondaryPart = true;
break;
default:; // unacceptable or unknown condition
}
/* Parse the following 'and <condition>' 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()<operator><expression>'
case XML_COND_ISBETWEEN: // condition is 'and cell-content-is-between(<expression1>,<expression2>)'
case XML_COND_ISNOTBETWEEN: // condition is 'and cell-content-is-not-between(<expression1>,<expression2>)'
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<beans::PropertyValue> 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<sal_Unicode>('\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<sal_Unicode>('\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 );
}