xref: /AOO41X/main/sc/source/filter/xml/xmlcvali.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 
28 
29 // INCLUDE ---------------------------------------------------------------
30 
31 #include "xmlcvali.hxx"
32 #include "xmlimprt.hxx"
33 #include "xmlconti.hxx"
34 #include "document.hxx"
35 #include "XMLConverter.hxx"
36 
37 #include <xmloff/xmltkmap.hxx>
38 #include <xmloff/nmspmap.hxx>
39 #include <xmloff/xmltoken.hxx>
40 #include <xmloff/xmlnmspe.hxx>
41 #include <xmloff/XMLEventsImportContext.hxx>
42 #include <com/sun/star/sheet/TableValidationVisibility.hpp>
43 #include <tools/debug.hxx>
44 
45 using namespace com::sun::star;
46 using namespace xmloff::token;
47 using namespace ::formula;
48 using ::rtl::OUString;
49 
50 class ScXMLContentValidationContext : public SvXMLImportContext
51 {
52     rtl::OUString      sName;
53     rtl::OUString      sHelpTitle;
54     rtl::OUString      sHelpMessage;
55     rtl::OUString      sErrorTitle;
56     rtl::OUString      sErrorMessage;
57     rtl::OUString      sErrorMessageType;
58     rtl::OUString      sBaseCellAddress;
59     rtl::OUString      sCondition;
60     sal_Int16          nShowList;
61     sal_Bool           bAllowEmptyCell;
62     sal_Bool           bDisplayHelp;
63     sal_Bool           bDisplayError;
64 
65     SvXMLImportContextRef           xEventContext;
66 
GetScImport() const67     const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); }
GetScImport()68     ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); }
69 
70     com::sun::star::sheet::ValidationAlertStyle GetAlertStyle() const;
71     void SetFormula( OUString& rFormula, OUString& rFormulaNmsp, FormulaGrammar::Grammar& reGrammar,
72         const OUString& rCondition, const OUString& rGlobNmsp, FormulaGrammar::Grammar eGlobGrammar, bool bHasNmsp ) const;
73     void GetCondition( ScMyImportValidation& rValidation ) const;
74 
75 public:
76 
77     ScXMLContentValidationContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
78                         const ::rtl::OUString& rLName,
79                         const ::com::sun::star::uno::Reference<
80                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList);
81 
82     virtual ~ScXMLContentValidationContext();
83 
84     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
85                                      const ::rtl::OUString& rLocalName,
86                                      const ::com::sun::star::uno::Reference<
87                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
88 
89     virtual void EndElement();
90 
91     void SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay);
92     void SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const rtl::OUString& sMessageType, const sal_Bool bDisplay);
93     void SetErrorMacro(const sal_Bool bExecute);
94 };
95 
96 class ScXMLHelpMessageContext : public SvXMLImportContext
97 {
98     rtl::OUString   sTitle;
99     rtl::OUStringBuffer sMessage;
100     sal_Int32       nParagraphCount;
101     sal_Bool        bDisplay;
102 
103     ScXMLContentValidationContext* pValidationContext;
104 
GetScImport() const105     const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); }
GetScImport()106     ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); }
107 
108 public:
109 
110     ScXMLHelpMessageContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
111                         const ::rtl::OUString& rLName,
112                         const ::com::sun::star::uno::Reference<
113                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
114                         ScXMLContentValidationContext* pValidationContext);
115 
116     virtual ~ScXMLHelpMessageContext();
117 
118     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
119                                      const ::rtl::OUString& rLocalName,
120                                      const ::com::sun::star::uno::Reference<
121                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
122 
123     virtual void EndElement();
124 };
125 
126 class ScXMLErrorMessageContext : public SvXMLImportContext
127 {
128     rtl::OUString   sTitle;
129     rtl::OUStringBuffer sMessage;
130     rtl::OUString   sMessageType;
131     sal_Int32       nParagraphCount;
132     sal_Bool        bDisplay;
133 
134     ScXMLContentValidationContext* pValidationContext;
135 
GetScImport() const136     const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); }
GetScImport()137     ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); }
138 
139 public:
140 
141     ScXMLErrorMessageContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
142                         const ::rtl::OUString& rLName,
143                         const ::com::sun::star::uno::Reference<
144                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
145                         ScXMLContentValidationContext* pValidationContext);
146 
147     virtual ~ScXMLErrorMessageContext();
148 
149     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
150                                      const ::rtl::OUString& rLocalName,
151                                      const ::com::sun::star::uno::Reference<
152                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
153 
154     virtual void EndElement();
155 };
156 
157 class ScXMLErrorMacroContext : public SvXMLImportContext
158 {
159     rtl::OUString   sName;
160     sal_Bool        bExecute;
161 
162     ScXMLContentValidationContext*  pValidationContext;
163 
GetScImport() const164     const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); }
GetScImport()165     ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); }
166 
167 public:
168 
169     ScXMLErrorMacroContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
170                         const ::rtl::OUString& rLName,
171                         const ::com::sun::star::uno::Reference<
172                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
173                         ScXMLContentValidationContext* pValidationContext);
174 
175     virtual ~ScXMLErrorMacroContext();
176 
177     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
178                                      const ::rtl::OUString& rLocalName,
179                                      const ::com::sun::star::uno::Reference<
180                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
181     virtual void EndElement();
182 };
183 
184 //------------------------------------------------------------------
185 
ScXMLContentValidationsContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)186 ScXMLContentValidationsContext::ScXMLContentValidationsContext( ScXMLImport& rImport,
187                                       sal_uInt16 nPrfx,
188                                       const ::rtl::OUString& rLName,
189                                       const ::com::sun::star::uno::Reference<
190                                       ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) :
191     SvXMLImportContext( rImport, nPrfx, rLName )
192 {
193     // here are no attributes
194 }
195 
~ScXMLContentValidationsContext()196 ScXMLContentValidationsContext::~ScXMLContentValidationsContext()
197 {
198 }
199 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)200 SvXMLImportContext *ScXMLContentValidationsContext::CreateChildContext( sal_uInt16 nPrefix,
201                                             const ::rtl::OUString& rLName,
202                                             const ::com::sun::star::uno::Reference<
203                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
204 {
205     SvXMLImportContext *pContext = 0;
206 
207     const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationsElemTokenMap();
208     switch( rTokenMap.Get( nPrefix, rLName ) )
209     {
210         case XML_TOK_CONTENT_VALIDATION:
211             pContext = new ScXMLContentValidationContext( GetScImport(), nPrefix, rLName, xAttrList);
212         break;
213     }
214 
215     if( !pContext )
216         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
217 
218     return pContext;
219 }
220 
EndElement()221 void ScXMLContentValidationsContext::EndElement()
222 {
223 }
224 
ScXMLContentValidationContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)225 ScXMLContentValidationContext::ScXMLContentValidationContext( ScXMLImport& rImport,
226                                       sal_uInt16 nPrfx,
227                                       const ::rtl::OUString& rLName,
228                                       const ::com::sun::star::uno::Reference<
229                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList) :
230     SvXMLImportContext( rImport, nPrfx, rLName ),
231     nShowList(sheet::TableValidationVisibility::UNSORTED),
232     bAllowEmptyCell(sal_True),
233     bDisplayHelp(sal_False),
234     bDisplayError(sal_False)
235 {
236     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
237     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationAttrTokenMap();
238     for( sal_Int16 i=0; i < nAttrCount; ++i )
239     {
240         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
241         rtl::OUString aLocalName;
242         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
243                                             sAttrName, &aLocalName );
244         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
245 
246         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
247         {
248             case XML_TOK_CONTENT_VALIDATION_NAME:
249                 sName = sValue;
250             break;
251             case XML_TOK_CONTENT_VALIDATION_CONDITION:
252                 sCondition = sValue;
253             break;
254             case XML_TOK_CONTENT_VALIDATION_BASE_CELL_ADDRESS:
255                 sBaseCellAddress = sValue;
256             break;
257             case XML_TOK_CONTENT_VALIDATION_ALLOW_EMPTY_CELL:
258                 if (IsXMLToken(sValue, XML_FALSE))
259                     bAllowEmptyCell = sal_False;
260             break;
261             case XML_TOK_CONTENT_VALIDATION_DISPLAY_LIST:
262             {
263                 if (IsXMLToken(sValue, XML_NO))
264                 {
265                     nShowList = sheet::TableValidationVisibility::INVISIBLE;
266                 }
267                 else if (IsXMLToken(sValue, XML_UNSORTED))
268                 {
269                     nShowList = sheet::TableValidationVisibility::UNSORTED;
270                 }
271                 else if (IsXMLToken(sValue, XML_SORTED_ASCENDING))
272                 {
273                     nShowList = sheet::TableValidationVisibility::SORTEDASCENDING;
274                 }
275             }
276             break;
277         }
278     }
279 }
280 
~ScXMLContentValidationContext()281 ScXMLContentValidationContext::~ScXMLContentValidationContext()
282 {
283 }
284 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)285 SvXMLImportContext *ScXMLContentValidationContext::CreateChildContext( sal_uInt16 nPrefix,
286                                             const ::rtl::OUString& rLName,
287                                             const ::com::sun::star::uno::Reference<
288                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
289 {
290     SvXMLImportContext *pContext = 0;
291 
292     const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationElemTokenMap();
293     switch( rTokenMap.Get( nPrefix, rLName ) )
294     {
295         case XML_TOK_CONTENT_VALIDATION_ELEM_HELP_MESSAGE:
296             pContext = new ScXMLHelpMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this);
297         break;
298         case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MESSAGE:
299             pContext = new ScXMLErrorMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this);
300         break;
301         case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MACRO:
302             pContext = new ScXMLErrorMacroContext( GetScImport(), nPrefix, rLName, xAttrList, this);
303         break;
304         case XML_TOK_CONTENT_VALIDATION_ELEM_EVENT_LISTENERS:
305             pContext = new XMLEventsImportContext( GetImport(), nPrefix, rLName );
306             xEventContext = pContext;
307         break;
308     }
309 
310     if( !pContext )
311         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
312 
313     return pContext;
314 }
315 
GetAlertStyle() const316 sheet::ValidationAlertStyle ScXMLContentValidationContext::GetAlertStyle() const
317 {
318     if (IsXMLToken(sErrorMessageType, XML_MACRO))
319         return sheet::ValidationAlertStyle_MACRO;
320     if (IsXMLToken(sErrorMessageType, XML_STOP))
321         return sheet::ValidationAlertStyle_STOP;
322     if (IsXMLToken(sErrorMessageType, XML_WARNING))
323         return sheet::ValidationAlertStyle_WARNING;
324     if (IsXMLToken(sErrorMessageType, XML_INFORMATION))
325         return sheet::ValidationAlertStyle_INFO;
326     // default for unknown
327     return sheet::ValidationAlertStyle_STOP;
328 }
329 
SetFormula(OUString & rFormula,OUString & rFormulaNmsp,FormulaGrammar::Grammar & reGrammar,const OUString & rCondition,const OUString & rGlobNmsp,FormulaGrammar::Grammar eGlobGrammar,bool bHasNmsp) const330 void ScXMLContentValidationContext::SetFormula( OUString& rFormula, OUString& rFormulaNmsp, FormulaGrammar::Grammar& reGrammar,
331     const OUString& rCondition, const OUString& rGlobNmsp, FormulaGrammar::Grammar eGlobGrammar, bool bHasNmsp ) const
332 {
333     reGrammar = FormulaGrammar::GRAM_UNSPECIFIED;
334     if( bHasNmsp )
335     {
336         // the entire attribute contains a namespace: internal namespace not allowed
337         rFormula = rCondition;
338         rFormulaNmsp = rGlobNmsp;
339         reGrammar = eGlobGrammar;
340     }
341     else
342     {
343         // the attribute does not contain a namespace: try to find a namespace of an external grammar
344         GetScImport().ExtractFormulaNamespaceGrammar( rFormula, rFormulaNmsp, reGrammar, rCondition, true );
345         if( reGrammar != FormulaGrammar::GRAM_EXTERNAL )
346             reGrammar = eGlobGrammar;
347     }
348 }
349 
GetCondition(ScMyImportValidation & rValidation) const350 void ScXMLContentValidationContext::GetCondition( ScMyImportValidation& rValidation ) const
351 {
352     rValidation.aValidationType = sheet::ValidationType_ANY;    // #b6343997# default if no condition is given
353     rValidation.aOperator = sheet::ConditionOperator_NONE;
354 
355     if( sCondition.getLength() > 0 )
356     {
357         // extract leading namespace from condition string
358         OUString aCondition, aConditionNmsp;
359         FormulaGrammar::Grammar eGrammar = FormulaGrammar::GRAM_UNSPECIFIED;
360         GetScImport().ExtractFormulaNamespaceGrammar( aCondition, aConditionNmsp, eGrammar, sCondition );
361         bool bHasNmsp = aCondition.getLength() < sCondition.getLength();
362 
363         // parse a condition from the attribute string
364         ScXMLConditionParseResult aParseResult;
365         ScXMLConditionHelper::parseCondition( aParseResult, aCondition, 0 );
366 
367         /*  Check the result. A valid value in aParseResult.meToken implies
368             that the other members of aParseResult are filled with valid data
369             for that token. */
370         bool bSecondaryPart = false;
371         switch( aParseResult.meToken )
372         {
373             case XML_COND_TEXTLENGTH:               // condition is 'cell-content-text-length()<operator><expression>'
374             case XML_COND_TEXTLENGTH_ISBETWEEN:     // condition is 'cell-content-text-length-is-between(<expression1>,<expression2>)'
375             case XML_COND_TEXTLENGTH_ISNOTBETWEEN:  // condition is 'cell-content-text-length-is-not-between(<expression1>,<expression2>)'
376             case XML_COND_ISINLIST:                 // condition is 'cell-content-is-in-list(<expression>)'
377                 rValidation.aValidationType = aParseResult.meValidation;
378                 rValidation.aOperator = aParseResult.meOperator;
379             break;
380 
381             case XML_COND_ISWHOLENUMBER:            // condition is 'cell-content-is-whole-number() and <condition>'
382             case XML_COND_ISDECIMALNUMBER:          // condition is 'cell-content-is-decimal-number() and <condition>'
383             case XML_COND_ISDATE:                   // condition is 'cell-content-is-date() and <condition>'
384             case XML_COND_ISTIME:                   // condition is 'cell-content-is-time() and <condition>'
385                 rValidation.aValidationType = aParseResult.meValidation;
386                 bSecondaryPart = true;
387             break;
388 
389             default:;   // unacceptable or unknown condition
390         }
391 
392         /*  Parse the following 'and <condition>' part of some conditions. This
393             updates the members of aParseResult that will contain the operands
394             and comparison operator then. */
395         if( bSecondaryPart )
396         {
397             ScXMLConditionHelper::parseCondition( aParseResult, aCondition, aParseResult.mnEndIndex );
398             if( aParseResult.meToken == XML_COND_AND )
399             {
400                 ScXMLConditionHelper::parseCondition( aParseResult, aCondition, aParseResult.mnEndIndex );
401                 switch( aParseResult.meToken )
402                 {
403                     case XML_COND_CELLCONTENT:  // condition is 'and cell-content()<operator><expression>'
404                     case XML_COND_ISBETWEEN:    // condition is 'and cell-content-is-between(<expression1>,<expression2>)'
405                     case XML_COND_ISNOTBETWEEN: // condition is 'and cell-content-is-not-between(<expression1>,<expression2>)'
406                         rValidation.aOperator = aParseResult.meOperator;
407                     break;
408                     default:;   // unacceptable or unknown condition
409                 }
410             }
411         }
412 
413         // a validation type (date, integer) without a condition isn't possible
414         if( rValidation.aOperator == sheet::ConditionOperator_NONE )
415             rValidation.aValidationType = sheet::ValidationType_ANY;
416 
417         // parse the formulas
418         if( rValidation.aValidationType != sheet::ValidationType_ANY )
419         {
420             SetFormula( rValidation.sFormula1, rValidation.sFormulaNmsp1, rValidation.eGrammar1,
421                 aParseResult.maOperand1, aConditionNmsp, eGrammar, bHasNmsp );
422             SetFormula( rValidation.sFormula2, rValidation.sFormulaNmsp2, rValidation.eGrammar2,
423                 aParseResult.maOperand2, aConditionNmsp, eGrammar, bHasNmsp );
424         }
425     }
426 }
427 
EndElement()428 void ScXMLContentValidationContext::EndElement()
429 {
430     // #i36650# event-listeners element moved up one level
431     if (xEventContext.Is())
432     {
433         rtl::OUString sOnError(RTL_CONSTASCII_USTRINGPARAM("OnError"));
434         XMLEventsImportContext* pEvents =
435             (XMLEventsImportContext*)&xEventContext;
436         uno::Sequence<beans::PropertyValue> aValues;
437         pEvents->GetEventSequence( sOnError, aValues );
438 
439         sal_Int32 nLength = aValues.getLength();
440         for( sal_Int32 i = 0; i < nLength; i++ )
441         {
442             // #i47525# must allow "MacroName" or "Script"
443             if ( aValues[i].Name.equalsAsciiL( "MacroName", sizeof("MacroName")-1 ) ||
444                  aValues[i].Name.equalsAsciiL( "Script", sizeof("Script")-1 ) )
445             {
446                 aValues[i].Value >>= sErrorTitle;
447                 break;
448             }
449         }
450     }
451 
452     ScMyImportValidation aValidation;
453     aValidation.eGrammar1 = aValidation.eGrammar2 = GetScImport().GetDocument()->GetStorageGrammar();
454     aValidation.sName = sName;
455     aValidation.sBaseCellAddress = sBaseCellAddress;
456     aValidation.sImputTitle = sHelpTitle;
457     aValidation.sImputMessage = sHelpMessage;
458     aValidation.sErrorTitle = sErrorTitle;
459     aValidation.sErrorMessage = sErrorMessage;
460     GetCondition( aValidation );
461     aValidation.aAlertStyle = GetAlertStyle();
462     aValidation.bShowErrorMessage = bDisplayError;
463     aValidation.bShowImputMessage = bDisplayHelp;
464     aValidation.bIgnoreBlanks = bAllowEmptyCell;
465     aValidation.nShowList = nShowList;
466     GetScImport().AddValidation(aValidation);
467 }
468 
SetHelpMessage(const rtl::OUString & sTitle,const rtl::OUString & sMessage,const sal_Bool bDisplay)469 void ScXMLContentValidationContext::SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay)
470 {
471     sHelpTitle = sTitle;
472     sHelpMessage = sMessage;
473     bDisplayHelp = bDisplay;
474 }
475 
SetErrorMessage(const rtl::OUString & sTitle,const rtl::OUString & sMessage,const rtl::OUString & sMessageType,const sal_Bool bDisplay)476 void ScXMLContentValidationContext::SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage,
477     const rtl::OUString& sMessageType, const sal_Bool bDisplay)
478 {
479     sErrorTitle = sTitle;
480     sErrorMessage = sMessage;
481     sErrorMessageType = sMessageType;
482     bDisplayError = bDisplay;
483 }
484 
SetErrorMacro(const sal_Bool bExecute)485 void ScXMLContentValidationContext::SetErrorMacro(const sal_Bool bExecute)
486 {
487     sErrorMessageType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("macro"));
488     bDisplayError = bExecute;
489 }
490 
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)491 ScXMLHelpMessageContext::ScXMLHelpMessageContext( ScXMLImport& rImport,
492                                       sal_uInt16 nPrfx,
493                                       const ::rtl::OUString& rLName,
494                                       const ::com::sun::star::uno::Reference<
495                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
496                                       ScXMLContentValidationContext* pTempValidationContext) :
497     SvXMLImportContext( rImport, nPrfx, rLName ),
498     sTitle(),
499     sMessage(),
500     nParagraphCount(0),
501     bDisplay(sal_False)
502 {
503     pValidationContext = pTempValidationContext;
504     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
505     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationHelpMessageAttrTokenMap();
506     for( sal_Int16 i=0; i < nAttrCount; ++i )
507     {
508         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
509         rtl::OUString aLocalName;
510         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
511                                             sAttrName, &aLocalName );
512         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
513 
514         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
515         {
516             case XML_TOK_HELP_MESSAGE_ATTR_TITLE:
517                 sTitle = sValue;
518             break;
519             case XML_TOK_HELP_MESSAGE_ATTR_DISPLAY:
520                 bDisplay = IsXMLToken(sValue, XML_TRUE);
521             break;
522         }
523     }
524 }
525 
~ScXMLHelpMessageContext()526 ScXMLHelpMessageContext::~ScXMLHelpMessageContext()
527 {
528 }
529 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)530 SvXMLImportContext *ScXMLHelpMessageContext::CreateChildContext( sal_uInt16 nPrefix,
531                                             const ::rtl::OUString& rLName,
532                                             const ::com::sun::star::uno::Reference<
533                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
534 {
535     SvXMLImportContext *pContext = 0;
536 
537     const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap();
538     switch( rTokenMap.Get( nPrefix, rLName ) )
539     {
540         case XML_TOK_P:
541         {
542             if(nParagraphCount)
543                 sMessage.append(static_cast<sal_Unicode>('\n'));
544             ++nParagraphCount;
545             pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage);
546         }
547         break;
548     }
549 
550     if( !pContext )
551         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
552 
553     return pContext;
554 }
555 
EndElement()556 void ScXMLHelpMessageContext::EndElement()
557 {
558     pValidationContext->SetHelpMessage(sTitle, sMessage.makeStringAndClear(), bDisplay);
559 }
560 
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)561 ScXMLErrorMessageContext::ScXMLErrorMessageContext( ScXMLImport& rImport,
562                                       sal_uInt16 nPrfx,
563                                       const ::rtl::OUString& rLName,
564                                       const ::com::sun::star::uno::Reference<
565                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
566                                       ScXMLContentValidationContext* pTempValidationContext) :
567     SvXMLImportContext( rImport, nPrfx, rLName ),
568     sTitle(),
569     sMessage(),
570     sMessageType(),
571     nParagraphCount(0),
572     bDisplay(sal_False)
573 {
574     pValidationContext = pTempValidationContext;
575     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
576     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMessageAttrTokenMap();
577     for( sal_Int16 i=0; i < nAttrCount; ++i )
578     {
579         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
580         rtl::OUString aLocalName;
581         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
582                                             sAttrName, &aLocalName );
583         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
584 
585         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
586         {
587             case XML_TOK_ERROR_MESSAGE_ATTR_TITLE:
588                 sTitle = sValue;
589             break;
590             case XML_TOK_ERROR_MESSAGE_ATTR_MESSAGE_TYPE:
591                 sMessageType = sValue;
592             break;
593             case XML_TOK_ERROR_MESSAGE_ATTR_DISPLAY:
594                 bDisplay = IsXMLToken(sValue, XML_TRUE);
595             break;
596         }
597     }
598 }
599 
~ScXMLErrorMessageContext()600 ScXMLErrorMessageContext::~ScXMLErrorMessageContext()
601 {
602 }
603 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)604 SvXMLImportContext *ScXMLErrorMessageContext::CreateChildContext( sal_uInt16 nPrefix,
605                                             const ::rtl::OUString& rLName,
606                                             const ::com::sun::star::uno::Reference<
607                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
608 {
609     SvXMLImportContext *pContext = 0;
610 
611     const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap();
612     switch( rTokenMap.Get( nPrefix, rLName ) )
613     {
614         case XML_TOK_P:
615         {
616             if(nParagraphCount)
617                 sMessage.append(static_cast<sal_Unicode>('\n'));
618             ++nParagraphCount;
619             pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage);
620         }
621         break;
622     }
623 
624     if( !pContext )
625         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
626 
627     return pContext;
628 }
629 
EndElement()630 void ScXMLErrorMessageContext::EndElement()
631 {
632     pValidationContext->SetErrorMessage(sTitle, sMessage.makeStringAndClear(), sMessageType, bDisplay);
633 }
634 
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)635 ScXMLErrorMacroContext::ScXMLErrorMacroContext( ScXMLImport& rImport,
636                                       sal_uInt16 nPrfx,
637                                       const ::rtl::OUString& rLName,
638                                       const ::com::sun::star::uno::Reference<
639                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
640                                       ScXMLContentValidationContext* pTempValidationContext) :
641     SvXMLImportContext( rImport, nPrfx, rLName ),
642     sName(),
643     bExecute(sal_False)
644 {
645     pValidationContext = pTempValidationContext;
646     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
647     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMacroAttrTokenMap();
648     for( sal_Int16 i=0; i < nAttrCount; ++i )
649     {
650         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
651         rtl::OUString aLocalName;
652         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
653                                             sAttrName, &aLocalName );
654         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
655 
656         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
657         {
658             case XML_TOK_ERROR_MACRO_ATTR_NAME:
659                 sName = sValue;
660             break;
661             case XML_TOK_ERROR_MACRO_ATTR_EXECUTE:
662                 bExecute = IsXMLToken(sValue, XML_TRUE);
663             break;
664         }
665     }
666 }
667 
~ScXMLErrorMacroContext()668 ScXMLErrorMacroContext::~ScXMLErrorMacroContext()
669 {
670 }
671 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)672 SvXMLImportContext *ScXMLErrorMacroContext::CreateChildContext( sal_uInt16 nPrefix,
673                                             const ::rtl::OUString& rLName,
674                                             const ::com::sun::star::uno::Reference<
675                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
676 {
677     SvXMLImportContext *pContext = NULL;
678 
679     if ((nPrefix == XML_NAMESPACE_SCRIPT) && IsXMLToken(rLName, XML_EVENTS))
680     {
681         pContext = new XMLEventsImportContext(GetImport(), nPrefix, rLName);
682     }
683     if (!pContext)
684         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
685 
686     return pContext;
687 }
688 
EndElement()689 void ScXMLErrorMacroContext::EndElement()
690 {
691     pValidationContext->SetErrorMacro( bExecute );
692 }
693