xref: /AOO41X/main/sc/source/filter/xml/xmldpimp.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 "xmldpimp.hxx"
32 #include "xmlimprt.hxx"
33 #include "xmlfilti.hxx"
34 #include "xmlsorti.hxx"
35 #include "document.hxx"
36 #include "docuno.hxx"
37 #include "dpshttab.hxx"
38 #include "dpsdbtab.hxx"
39 #include "attrib.hxx"
40 #include "XMLConverter.hxx"
41 #include "dpgroup.hxx"
42 #include "dpdimsave.hxx"
43 #include "rangeutl.hxx"
44 #include "dpoutputgeometry.hxx"
45 
46 #include <xmloff/xmltkmap.hxx>
47 #include <xmloff/nmspmap.hxx>
48 #include <xmloff/xmltoken.hxx>
49 #include <xmloff/xmlnmspe.hxx>
50 #include <xmloff/xmluconv.hxx>
51 #include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp>
52 #include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp>
53 #include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp>
54 #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
55 #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
56 #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
57 
58 //#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
59 
60 using namespace com::sun::star;
61 using namespace xmloff::token;
62 using ::com::sun::star::uno::Reference;
63 using ::com::sun::star::xml::sax::XAttributeList;
64 using ::rtl::OUString;
65 
66 //------------------------------------------------------------------
67 
ScXMLDataPilotTablesContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)68 ScXMLDataPilotTablesContext::ScXMLDataPilotTablesContext( ScXMLImport& rImport,
69                                       sal_uInt16 nPrfx,
70                                       const ::rtl::OUString& rLName,
71                                       const ::com::sun::star::uno::Reference<
72                                       ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) :
73     SvXMLImportContext( rImport, nPrfx, rLName )
74 {
75     // has no Attributes
76     rImport.LockSolarMutex();
77 }
78 
~ScXMLDataPilotTablesContext()79 ScXMLDataPilotTablesContext::~ScXMLDataPilotTablesContext()
80 {
81     GetScImport().UnlockSolarMutex();
82 }
83 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)84 SvXMLImportContext *ScXMLDataPilotTablesContext::CreateChildContext( sal_uInt16 nPrefix,
85                                             const ::rtl::OUString& rLName,
86                                             const ::com::sun::star::uno::Reference<
87                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
88 {
89     SvXMLImportContext *pContext = 0;
90 
91     const SvXMLTokenMap& rTokenMap = GetScImport().GetDataPilotTablesElemTokenMap();
92     switch( rTokenMap.Get( nPrefix, rLName ) )
93     {
94         case XML_TOK_DATA_PILOT_TABLE :
95         {
96             pContext = new ScXMLDataPilotTableContext( GetScImport(), nPrefix,
97                                                         rLName, xAttrList);
98         }
99         break;
100     }
101 
102     if( !pContext )
103         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
104 
105     return pContext;
106 }
107 
EndElement()108 void ScXMLDataPilotTablesContext::EndElement()
109 {
110 }
111 
GrandTotalItem()112 ScXMLDataPilotTableContext::GrandTotalItem::GrandTotalItem() :
113     mbVisible(true) {}
114 
ScXMLDataPilotTableContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)115 ScXMLDataPilotTableContext::ScXMLDataPilotTableContext( ScXMLImport& rImport,
116                                       sal_uInt16 nPrfx,
117                                       const ::rtl::OUString& rLName,
118                                       const ::com::sun::star::uno::Reference<
119                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList) :
120     SvXMLImportContext( rImport, nPrfx, rLName ),
121     pDoc(GetScImport().GetDocument()),
122     pDPObject(NULL),
123     pDPSave(NULL),
124     pDPDimSaveData(NULL),
125     sDataPilotTableName(),
126     sApplicationData(),
127     mnRowFieldCount(0),
128     mnColFieldCount(0),
129     mnPageFieldCount(0),
130     mnDataFieldCount(0),
131     bIsNative(sal_True),
132     bIgnoreEmptyRows(sal_False),
133     bIdentifyCategories(sal_False),
134     bTargetRangeAddress(sal_False),
135     bSourceCellRange(sal_False),
136     bShowFilter(sal_True),
137     bDrillDown(sal_True)
138 {
139     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
140     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotTableAttrTokenMap();
141     for( sal_Int16 i=0; i < nAttrCount; ++i )
142     {
143         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
144         rtl::OUString aLocalName;
145         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
146                                             sAttrName, &aLocalName );
147         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
148 
149         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
150         {
151             case XML_TOK_DATA_PILOT_TABLE_ATTR_NAME :
152             {
153                 sDataPilotTableName = sValue;
154             }
155             break;
156             case XML_TOK_DATA_PILOT_TABLE_ATTR_APPLICATION_DATA :
157             {
158                 sApplicationData = sValue;
159             }
160             break;
161             case XML_TOK_DATA_PILOT_TABLE_ATTR_GRAND_TOTAL :
162             {
163                 if (IsXMLToken(sValue, XML_BOTH))
164                 {
165                     maRowGrandTotal.mbVisible = true;
166                     maColGrandTotal.mbVisible = true;
167                 }
168                 else if (IsXMLToken(sValue, XML_ROW))
169                 {
170                     maRowGrandTotal.mbVisible = true;
171                     maColGrandTotal.mbVisible = false;
172                 }
173                 else if (IsXMLToken(sValue, XML_COLUMN))
174                 {
175                     maRowGrandTotal.mbVisible = false;
176                     maColGrandTotal.mbVisible = true;
177                 }
178                 else
179                 {
180                     maRowGrandTotal.mbVisible = false;
181                     maColGrandTotal.mbVisible = false;
182                 }
183             }
184             break;
185             case XML_TOK_DATA_PILOT_TABLE_ATTR_IGNORE_EMPTY_ROWS :
186             {
187                 bIgnoreEmptyRows = IsXMLToken(sValue, XML_TRUE);
188             }
189             break;
190             case XML_TOK_DATA_PILOT_TABLE_ATTR_IDENTIFY_CATEGORIES :
191             {
192                 bIdentifyCategories = IsXMLToken(sValue, XML_TRUE);
193             }
194             break;
195             case XML_TOK_DATA_PILOT_TABLE_ATTR_TARGET_RANGE_ADDRESS :
196             {
197                 sal_Int32 nOffset(0);
198                 bTargetRangeAddress = ScRangeStringConverter::GetRangeFromString( aTargetRangeAddress, sValue, pDoc, ::formula::FormulaGrammar::CONV_OOO, nOffset );
199             }
200             break;
201             case XML_TOK_DATA_PILOT_TABLE_ATTR_BUTTONS :
202             {
203                 sButtons = sValue;
204             }
205             break;
206             case XML_TOK_DATA_PILOT_TABLE_ATTR_SHOW_FILTER_BUTTON :
207             {
208                 bShowFilter = IsXMLToken(sValue, XML_TRUE);
209             }
210             break;
211             case XML_TOK_DATA_PILOT_TABLE_ATTR_DRILL_DOWN :
212             {
213                 bDrillDown = IsXMLToken(sValue, XML_TRUE);
214             }
215             break;
216         }
217     }
218 
219     pDPObject = new ScDPObject(pDoc);
220     pDPSave = new ScDPSaveData();
221 }
222 
~ScXMLDataPilotTableContext()223 ScXMLDataPilotTableContext::~ScXMLDataPilotTableContext()
224 {
225     delete pDPDimSaveData;
226 }
227 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)228 SvXMLImportContext *ScXMLDataPilotTableContext::CreateChildContext( sal_uInt16 nPrefix,
229                                             const ::rtl::OUString& rLName,
230                                             const ::com::sun::star::uno::Reference<
231                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
232 {
233     SvXMLImportContext *pContext = 0;
234 
235     const SvXMLTokenMap& rTokenMap = GetScImport().GetDataPilotTableElemTokenMap();
236     switch( rTokenMap.Get( nPrefix, rLName ) )
237     {
238         case XML_TOK_DATA_PILOT_TABLE_ELEM_SOURCE_SQL :
239         {
240             pContext = new ScXMLDPSourceSQLContext(GetScImport(), nPrefix, rLName, xAttrList, this);
241             nSourceType = SQL;
242         }
243         break;
244         case XML_TOK_DATA_PILOT_TABLE_ELEM_SOURCE_TABLE :
245         {
246             pContext = new ScXMLDPSourceTableContext(GetScImport(), nPrefix, rLName, xAttrList, this);
247             nSourceType = TABLE;
248         }
249         break;
250         case XML_TOK_DATA_PILOT_TABLE_ELEM_SOURCE_QUERY :
251         {
252             pContext = new ScXMLDPSourceQueryContext(GetScImport(), nPrefix, rLName, xAttrList, this);
253             nSourceType = QUERY;
254         }
255         break;
256         case XML_TOK_DATA_PILOT_TABLE_ELEM_SOURCE_SERVICE :
257         {
258             pContext = new ScXMLSourceServiceContext(GetScImport(), nPrefix, rLName, xAttrList, this);
259             nSourceType = SERVICE;
260         }
261         break;
262         case XML_TOK_DATA_PILOT_TABLE_ELEM_GRAND_TOTAL:
263         case XML_TOK_DATA_PILOT_TABLE_ELEM_GRAND_TOTAL_EXT:
264         {
265             pContext = new ScXMLDataPilotGrandTotalContext(GetScImport(), nPrefix, rLName, xAttrList, this);
266         }
267         break;
268         case XML_TOK_DATA_PILOT_TABLE_ELEM_SOURCE_CELL_RANGE :
269         {
270             pContext = new ScXMLSourceCellRangeContext(GetScImport(), nPrefix, rLName, xAttrList, this);
271             nSourceType = CELLRANGE;
272         }
273         break;
274         case XML_TOK_DATA_PILOT_TABLE_ELEM_DATA_PILOT_FIELD :
275             pContext = new ScXMLDataPilotFieldContext(GetScImport(), nPrefix, rLName, xAttrList, this);
276         break;
277     }
278 
279     if( !pContext )
280         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
281 
282     return pContext;
283 }
284 
SetButtons()285 void ScXMLDataPilotTableContext::SetButtons()
286 {
287     ScDPOutputGeometry aGeometry(aTargetRangeAddress, bShowFilter, ScDPOutputGeometry::ODF);
288     aGeometry.setColumnFieldCount(mnColFieldCount);
289     aGeometry.setRowFieldCount(mnRowFieldCount);
290     aGeometry.setPageFieldCount(mnPageFieldCount);
291     aGeometry.setDataFieldCount(mnDataFieldCount);
292 
293     OUString sAddress;
294     sal_Int32 nOffset = 0;
295     while( nOffset >= 0 )
296     {
297         ScRangeStringConverter::GetTokenByOffset( sAddress, sButtons, nOffset );
298         if( nOffset >= 0 )
299         {
300             ScAddress aScAddress;
301             sal_Int32 nAddrOffset(0);
302             if (pDoc && ScRangeStringConverter::GetAddressFromString( aScAddress, sAddress, pDoc, ::formula::FormulaGrammar::CONV_OOO, nAddrOffset ))
303             {
304                 ScDPOutputGeometry::FieldType eType = aGeometry.getFieldButtonType(aScAddress);
305 
306                 sal_Int16 nMFlag = SC_MF_BUTTON;
307                 if (eType == ScDPOutputGeometry::Column || eType == ScDPOutputGeometry::Row)
308                     nMFlag |= SC_MF_BUTTON_POPUP;
309 
310                 // Use the cell's string value to see if this field contains a
311                 // hidden member.  Isn't there a better way?  GetString() is
312                 // quite expensive...
313                 String aCellStr;
314                 pDoc->GetString(aScAddress.Col(), aScAddress.Row(), aScAddress.Tab(), aCellStr);
315                 if (maHiddenMemberFields.count(aCellStr))
316                     nMFlag |= SC_MF_HIDDEN_MEMBER;
317 
318                 pDoc->ApplyFlagsTab(aScAddress.Col(), aScAddress.Row(), aScAddress.Col(), aScAddress.Row(), aScAddress.Tab(), nMFlag);
319             }
320         }
321     }
322 
323     if ( pDPObject )
324         pDPObject->RefreshAfterLoad();
325 }
326 
AddDimension(ScDPSaveDimension * pDim,bool bHasHiddenMember)327 void ScXMLDataPilotTableContext::AddDimension(ScDPSaveDimension* pDim, bool bHasHiddenMember)
328 {
329     if (pDPSave)
330     {
331         //  #91045# if a dimension with that name has already been inserted,
332         //  mark the new one as duplicate
333         if ( !pDim->IsDataLayout() &&
334                 pDPSave->GetExistingDimensionByName(pDim->GetName()) )
335             pDim->SetDupFlag( sal_True );
336 
337         if (!pDim->IsDataLayout())
338         {
339             switch (pDim->GetOrientation())
340             {
341                 case sheet::DataPilotFieldOrientation_ROW:
342                     ++mnRowFieldCount;
343                 break;
344                 case sheet::DataPilotFieldOrientation_COLUMN:
345                     ++mnColFieldCount;
346                 break;
347                 case sheet::DataPilotFieldOrientation_PAGE:
348                     ++mnPageFieldCount;
349                 break;
350                 case sheet::DataPilotFieldOrientation_DATA:
351                     ++mnDataFieldCount;
352                 break;
353                 case sheet::DataPilotFieldOrientation_HIDDEN:
354                 default:
355                     ;
356             }
357 
358             if (bHasHiddenMember)
359             {
360                 // the layout name takes priority over the original name,
361                 // since this data is used against cell values.
362                 const OUString* pLayoutName = pDim->GetLayoutName();
363                 if (pLayoutName)
364                     maHiddenMemberFields.insert(*pLayoutName);
365                 else
366                     maHiddenMemberFields.insert(pDim->GetName());
367             }
368         }
369         pDPSave->AddDimension(pDim);
370     }
371 }
372 
AddGroupDim(const ScDPSaveNumGroupDimension & aNumGroupDim)373 void ScXMLDataPilotTableContext::AddGroupDim(const ScDPSaveNumGroupDimension& aNumGroupDim)
374 {
375     if (!pDPDimSaveData)
376         pDPDimSaveData = new ScDPDimensionSaveData();
377     pDPDimSaveData->AddNumGroupDimension(aNumGroupDim);
378 }
379 
AddGroupDim(const ScDPSaveGroupDimension & aGroupDim)380 void ScXMLDataPilotTableContext::AddGroupDim(const ScDPSaveGroupDimension& aGroupDim)
381 {
382     if (!pDPDimSaveData)
383         pDPDimSaveData = new ScDPDimensionSaveData();
384     pDPDimSaveData->AddGroupDimension(aGroupDim);
385 }
386 
EndElement()387 void ScXMLDataPilotTableContext::EndElement()
388 {
389     if (bTargetRangeAddress)
390     {
391         pDPObject->SetName(sDataPilotTableName);
392         pDPObject->SetTag(sApplicationData);
393         pDPObject->SetOutRange(aTargetRangeAddress);
394         switch (nSourceType)
395         {
396             case SQL :
397             {
398                 ScImportSourceDesc aImportDesc;
399                 aImportDesc.aDBName = sDatabaseName;
400                 aImportDesc.aObject = sSourceObject;
401                 aImportDesc.nType = sheet::DataImportMode_SQL;
402                 aImportDesc.bNative = bIsNative;
403                 pDPObject->SetImportDesc(aImportDesc);
404             }
405             break;
406             case TABLE :
407             {
408                 ScImportSourceDesc aImportDesc;
409                 aImportDesc.aDBName = sDatabaseName;
410                 aImportDesc.aObject = sSourceObject;
411                 aImportDesc.nType = sheet::DataImportMode_TABLE;
412                 pDPObject->SetImportDesc(aImportDesc);
413             }
414             break;
415             case QUERY :
416             {
417                 ScImportSourceDesc aImportDesc;
418                 aImportDesc.aDBName = sDatabaseName;
419                 aImportDesc.aObject = sSourceObject;
420                 aImportDesc.nType = sheet::DataImportMode_QUERY;
421                 pDPObject->SetImportDesc(aImportDesc);
422             }
423             break;
424             case SERVICE :
425             {
426                 ScDPServiceDesc aServiceDesk(sServiceName, sServiceSourceName, sServiceSourceObject,
427                                     sServiceUsername, sServicePassword);
428                 pDPObject->SetServiceData(aServiceDesk);
429             }
430             break;
431             case CELLRANGE :
432             {
433                 if (bSourceCellRange)
434                 {
435                     ScSheetSourceDesc aSheetDesc;
436                     aSheetDesc.aSourceRange = aSourceCellRangeAddress;
437                     aSheetDesc.aQueryParam = aSourceQueryParam;
438                     pDPObject->SetSheetDesc(aSheetDesc);
439                 }
440             }
441             break;
442         }
443 
444         pDPSave->SetRowGrand(maRowGrandTotal.mbVisible);
445         pDPSave->SetColumnGrand(maColGrandTotal.mbVisible);
446         if (maRowGrandTotal.maDisplayName.getLength())
447             // TODO: Right now, we only support one grand total name for both
448             // column and row totals.  Take the value from the row total for
449             // now.
450             pDPSave->SetGrandTotalName(maRowGrandTotal.maDisplayName);
451 
452         pDPSave->SetIgnoreEmptyRows(bIgnoreEmptyRows);
453         pDPSave->SetRepeatIfEmpty(bIdentifyCategories);
454         pDPSave->SetFilterButton(bShowFilter);
455         pDPSave->SetDrillDown(bDrillDown);
456         if (pDPDimSaveData)
457             pDPSave->SetDimensionData(pDPDimSaveData);
458         pDPObject->SetSaveData(*pDPSave);
459         if (pDoc)
460         {
461             ScDPCollection* pDPCollection = pDoc->GetDPCollection();
462 
463             // #i94570# Names have to be unique, or the tables can't be accessed by API.
464             if ( pDPCollection->GetByName(pDPObject->GetName()) )
465                 pDPObject->SetName( String() );     // ignore the invalid name, create a new name in AfterXMLLoading
466 
467             pDPObject->SetAlive(sal_True);
468             pDPCollection->InsertNewTable(pDPObject);
469         }
470         SetButtons();
471     }
472 }
473 
SetGrandTotal(XMLTokenEnum eOrientation,bool bVisible,const OUString & rDisplayName)474 void ScXMLDataPilotTableContext::SetGrandTotal(
475     XMLTokenEnum eOrientation, bool bVisible, const OUString& rDisplayName)
476 {
477     switch (eOrientation)
478     {
479         case XML_BOTH:
480             maRowGrandTotal.mbVisible     = bVisible;
481             maRowGrandTotal.maDisplayName = rDisplayName;
482             maColGrandTotal.mbVisible     = bVisible;
483             maColGrandTotal.maDisplayName = rDisplayName;
484         break;
485         case XML_ROW:
486             maRowGrandTotal.mbVisible     = bVisible;
487             maRowGrandTotal.maDisplayName = rDisplayName;
488         break;
489         case XML_COLUMN:
490             maColGrandTotal.mbVisible     = bVisible;
491             maColGrandTotal.maDisplayName = rDisplayName;
492         break;
493         default:
494             ;
495     }
496 }
497 
ScXMLDPSourceSQLContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotTableContext * pTempDataPilotTable)498 ScXMLDPSourceSQLContext::ScXMLDPSourceSQLContext( ScXMLImport& rImport,
499                                       sal_uInt16 nPrfx,
500                                       const ::rtl::OUString& rLName,
501                                       const ::com::sun::star::uno::Reference<
502                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
503                                         ScXMLDataPilotTableContext* pTempDataPilotTable) :
504     SvXMLImportContext( rImport, nPrfx, rLName ),
505     pDataPilotTable(pTempDataPilotTable)
506 {
507     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
508     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceSQLAttrTokenMap();
509     for( sal_Int16 i=0; i < nAttrCount; ++i )
510     {
511         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
512         rtl::OUString aLocalName;
513         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
514                                             sAttrName, &aLocalName );
515         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
516 
517         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
518         {
519             case XML_TOK_SOURCE_SQL_ATTR_DATABASE_NAME :
520             {
521                 pDataPilotTable->SetDatabaseName(sValue);
522             }
523             break;
524             case XML_TOK_SOURCE_SQL_ATTR_SQL_STATEMENT :
525             {
526                 pDataPilotTable->SetSourceObject(sValue);
527             }
528             break;
529             case XML_TOK_SOURCE_SQL_ATTR_PARSE_SQL_STATEMENT :
530             {
531                 pDataPilotTable->SetNative(!IsXMLToken(sValue, XML_TRUE));
532             }
533             break;
534         }
535     }
536 }
537 
~ScXMLDPSourceSQLContext()538 ScXMLDPSourceSQLContext::~ScXMLDPSourceSQLContext()
539 {
540 }
541 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)542 SvXMLImportContext *ScXMLDPSourceSQLContext::CreateChildContext( sal_uInt16 nPrefix,
543                                             const ::rtl::OUString& rLName,
544                                             const ::com::sun::star::uno::Reference<
545                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
546 {
547     SvXMLImportContext *pContext = 0;
548 
549     if( !pContext )
550         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
551 
552     return pContext;
553 }
554 
EndElement()555 void ScXMLDPSourceSQLContext::EndElement()
556 {
557 }
558 
ScXMLDPSourceTableContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotTableContext * pTempDataPilotTable)559 ScXMLDPSourceTableContext::ScXMLDPSourceTableContext( ScXMLImport& rImport,
560                                       sal_uInt16 nPrfx,
561                                       const ::rtl::OUString& rLName,
562                                       const ::com::sun::star::uno::Reference<
563                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
564                                         ScXMLDataPilotTableContext* pTempDataPilotTable) :
565     SvXMLImportContext( rImport, nPrfx, rLName ),
566     pDataPilotTable(pTempDataPilotTable)
567 {
568     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
569     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceTableAttrTokenMap();
570     for( sal_Int16 i=0; i < nAttrCount; ++i )
571     {
572         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
573         rtl::OUString aLocalName;
574         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
575                                             sAttrName, &aLocalName );
576         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
577 
578         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
579         {
580             case XML_TOK_SOURCE_TABLE_ATTR_DATABASE_NAME :
581             {
582                 pDataPilotTable->SetDatabaseName(sValue);
583             }
584             break;
585             case XML_TOK_SOURCE_TABLE_ATTR_TABLE_NAME :
586             {
587                 pDataPilotTable->SetSourceObject(sValue);
588             }
589             break;
590         }
591     }
592 }
593 
~ScXMLDPSourceTableContext()594 ScXMLDPSourceTableContext::~ScXMLDPSourceTableContext()
595 {
596 }
597 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)598 SvXMLImportContext *ScXMLDPSourceTableContext::CreateChildContext( sal_uInt16 nPrefix,
599                                             const ::rtl::OUString& rLName,
600                                             const ::com::sun::star::uno::Reference<
601                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
602 {
603     SvXMLImportContext *pContext = 0;
604 
605     if( !pContext )
606         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
607 
608     return pContext;
609 }
610 
EndElement()611 void ScXMLDPSourceTableContext::EndElement()
612 {
613 }
614 
ScXMLDPSourceQueryContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotTableContext * pTempDataPilotTable)615 ScXMLDPSourceQueryContext::ScXMLDPSourceQueryContext( ScXMLImport& rImport,
616                                       sal_uInt16 nPrfx,
617                                       const ::rtl::OUString& rLName,
618                                       const ::com::sun::star::uno::Reference<
619                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
620                                         ScXMLDataPilotTableContext* pTempDataPilotTable) :
621     SvXMLImportContext( rImport, nPrfx, rLName ),
622     pDataPilotTable(pTempDataPilotTable)
623 {
624     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
625     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceQueryAttrTokenMap();
626     for( sal_Int16 i=0; i < nAttrCount; ++i )
627     {
628         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
629         rtl::OUString aLocalName;
630         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
631                                             sAttrName, &aLocalName );
632         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
633 
634         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
635         {
636             case XML_TOK_SOURCE_QUERY_ATTR_DATABASE_NAME :
637             {
638                 pDataPilotTable->SetDatabaseName(sValue);
639             }
640             break;
641             case XML_TOK_SOURCE_QUERY_ATTR_QUERY_NAME :
642             {
643                 pDataPilotTable->SetSourceObject(sValue);
644             }
645             break;
646         }
647     }
648 }
649 
~ScXMLDPSourceQueryContext()650 ScXMLDPSourceQueryContext::~ScXMLDPSourceQueryContext()
651 {
652 }
653 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)654 SvXMLImportContext *ScXMLDPSourceQueryContext::CreateChildContext( sal_uInt16 nPrefix,
655                                             const ::rtl::OUString& rLName,
656                                             const ::com::sun::star::uno::Reference<
657                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
658 {
659     SvXMLImportContext *pContext = 0;
660 
661     if( !pContext )
662         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
663 
664     return pContext;
665 }
666 
EndElement()667 void ScXMLDPSourceQueryContext::EndElement()
668 {
669 }
670 
ScXMLSourceServiceContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotTableContext * pTempDataPilotTable)671 ScXMLSourceServiceContext::ScXMLSourceServiceContext( ScXMLImport& rImport,
672                                       sal_uInt16 nPrfx,
673                                       const ::rtl::OUString& rLName,
674                                       const ::com::sun::star::uno::Reference<
675                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
676                                         ScXMLDataPilotTableContext* pTempDataPilotTable) :
677     SvXMLImportContext( rImport, nPrfx, rLName ),
678     pDataPilotTable(pTempDataPilotTable)
679 {
680     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
681     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotTableSourceServiceAttrTokenMap();
682     for( sal_Int16 i=0; i < nAttrCount; ++i )
683     {
684         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
685         rtl::OUString aLocalName;
686         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
687                                             sAttrName, &aLocalName );
688         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
689 
690         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
691         {
692             case XML_TOK_SOURCE_SERVICE_ATTR_NAME :
693             {
694                 pDataPilotTable->SetServiceName(sValue);
695             }
696             break;
697             case XML_TOK_SOURCE_SERVICE_ATTR_SOURCE_NAME :
698             {
699                 pDataPilotTable->SetServiceSourceName(sValue);
700             }
701             break;
702             case XML_TOK_SOURCE_SERVICE_ATTR_OBJECT_NAME :
703             {
704                 pDataPilotTable->SetServiceSourceObject(sValue);
705             }
706             break;
707             case XML_TOK_SOURCE_SERVICE_ATTR_USER_NAME :
708             {
709                 pDataPilotTable->SetServiceUsername(sValue);
710             }
711             break;
712             case XML_TOK_SOURCE_SERVICE_ATTR_PASSWORD :
713             {
714                 pDataPilotTable->SetServicePassword(sValue);
715             }
716             break;
717         }
718     }
719 }
720 
~ScXMLSourceServiceContext()721 ScXMLSourceServiceContext::~ScXMLSourceServiceContext()
722 {
723 }
724 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)725 SvXMLImportContext *ScXMLSourceServiceContext::CreateChildContext( sal_uInt16 nPrefix,
726                                             const ::rtl::OUString& rLName,
727                                             const ::com::sun::star::uno::Reference<
728                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
729 {
730     SvXMLImportContext *pContext = 0;
731 
732     if( !pContext )
733         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
734 
735     return pContext;
736 }
737 
EndElement()738 void ScXMLSourceServiceContext::EndElement()
739 {
740 }
741 
GetScImport()742 ScXMLImport& ScXMLDataPilotGrandTotalContext::GetScImport()
743 {
744     return static_cast<ScXMLImport&>(GetImport());
745 }
746 
ScXMLDataPilotGrandTotalContext(ScXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLName,const Reference<XAttributeList> & xAttrList,ScXMLDataPilotTableContext * pTableContext)747 ScXMLDataPilotGrandTotalContext::ScXMLDataPilotGrandTotalContext(
748     ScXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLName, const Reference<XAttributeList>& xAttrList,
749     ScXMLDataPilotTableContext* pTableContext ) :
750     SvXMLImportContext( rImport, nPrefix, rLName ),
751     mpTableContext(pTableContext),
752     meOrientation(NONE),
753     mbVisible(false)
754 {
755     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
756     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotGrandTotalAttrTokenMap();
757     for (sal_Int16 i = 0; i < nAttrCount; ++i)
758     {
759         const OUString& rAttrName  = xAttrList->getNameByIndex(i);
760         const OUString& rAttrValue = xAttrList->getValueByIndex(i);
761 
762         OUString aLocalName;
763         sal_uInt16 nLocalPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
764         switch (rAttrTokenMap.Get(nLocalPrefix, aLocalName))
765         {
766             case XML_TOK_DATA_PILOT_GRAND_TOTAL_ATTR_DISPLAY:
767                 mbVisible = IsXMLToken(rAttrValue, XML_TRUE);
768             break;
769             case XML_TOK_DATA_PILOT_GRAND_TOTAL_ATTR_ORIENTATION:
770                 if (IsXMLToken(rAttrValue, XML_BOTH))
771                     meOrientation = BOTH;
772                 else if (IsXMLToken(rAttrValue, XML_ROW))
773                     meOrientation = ROW;
774                 else if (IsXMLToken(rAttrValue, XML_COLUMN))
775                     meOrientation = COLUMN;
776             break;
777             case XML_TOK_DATA_PILOT_GRAND_TOTAL_ATTR_DISPLAY_NAME:
778             case XML_TOK_DATA_PILOT_GRAND_TOTAL_ATTR_DISPLAY_NAME_EXT:
779                 maDisplayName = rAttrValue;
780             break;
781             default:
782                 ;
783         }
784     }
785 }
786 
~ScXMLDataPilotGrandTotalContext()787 ScXMLDataPilotGrandTotalContext::~ScXMLDataPilotGrandTotalContext()
788 {
789 }
790 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const Reference<XAttributeList> &)791 SvXMLImportContext* ScXMLDataPilotGrandTotalContext::CreateChildContext(
792     sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const Reference<XAttributeList>& /*xAttrList*/ )
793 {
794     return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
795 }
796 
EndElement()797 void ScXMLDataPilotGrandTotalContext::EndElement()
798 {
799     XMLTokenEnum eOrient = XML_NONE;
800     switch (meOrientation)
801     {
802         case BOTH:
803             eOrient = XML_BOTH;
804         break;
805         case ROW:
806             eOrient = XML_ROW;
807         break;
808         case COLUMN:
809             eOrient = XML_COLUMN;
810         break;
811         default:
812             ;
813     }
814     mpTableContext->SetGrandTotal(eOrient, mbVisible, maDisplayName);
815 }
816 
ScXMLSourceCellRangeContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotTableContext * pTempDataPilotTable)817 ScXMLSourceCellRangeContext::ScXMLSourceCellRangeContext( ScXMLImport& rImport,
818                                       sal_uInt16 nPrfx,
819                                       const ::rtl::OUString& rLName,
820                                       const ::com::sun::star::uno::Reference<
821                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
822                                         ScXMLDataPilotTableContext* pTempDataPilotTable) :
823     SvXMLImportContext( rImport, nPrfx, rLName ),
824     pDataPilotTable(pTempDataPilotTable)
825 {
826     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
827     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotTableSourceCellRangeAttrTokenMap();
828     for( sal_Int16 i=0; i < nAttrCount; ++i )
829     {
830         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
831         rtl::OUString aLocalName;
832         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
833                                             sAttrName, &aLocalName );
834         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
835 
836         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
837         {
838             case XML_TOK_SOURCE_CELL_RANGE_ATTR_CELL_RANGE_ADDRESS :
839             {
840                 ScRange aSourceRangeAddress;
841                 sal_Int32 nOffset(0);
842                 if (ScRangeStringConverter::GetRangeFromString( aSourceRangeAddress, sValue, GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO, nOffset ))
843                     pDataPilotTable->SetSourceCellRangeAddress(aSourceRangeAddress);
844             }
845             break;
846         }
847     }
848 }
849 
~ScXMLSourceCellRangeContext()850 ScXMLSourceCellRangeContext::~ScXMLSourceCellRangeContext()
851 {
852 }
853 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)854 SvXMLImportContext *ScXMLSourceCellRangeContext::CreateChildContext( sal_uInt16 nPrefix,
855                                             const ::rtl::OUString& rLName,
856                                             const ::com::sun::star::uno::Reference<
857                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
858 {
859     SvXMLImportContext *pContext = 0;
860 
861     const SvXMLTokenMap& rTokenMap = GetScImport().GetDataPilotTableSourceCellRangeElemTokenMap();
862     switch( rTokenMap.Get( nPrefix, rLName ) )
863     {
864         case XML_TOK_SOURCE_CELL_RANGE_ELEM_FILTER :
865             pContext = new ScXMLDPFilterContext(GetScImport(), nPrefix, rLName, xAttrList, pDataPilotTable);
866         break;
867     }
868 
869     if( !pContext )
870         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
871 
872     return pContext;
873 }
874 
EndElement()875 void ScXMLSourceCellRangeContext::EndElement()
876 {
877 }
878 
ScXMLDataPilotFieldContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotTableContext * pTempDataPilotTable)879 ScXMLDataPilotFieldContext::ScXMLDataPilotFieldContext( ScXMLImport& rImport,
880                                       sal_uInt16 nPrfx,
881                                       const ::rtl::OUString& rLName,
882                                       const ::com::sun::star::uno::Reference<
883                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
884                                         ScXMLDataPilotTableContext* pTempDataPilotTable) :
885     SvXMLImportContext( rImport, nPrfx, rLName ),
886     pDataPilotTable(pTempDataPilotTable),
887     pDim(NULL),
888     fStart(0.0),
889     fEnd(0.0),
890     fStep(0.0),
891     nUsedHierarchy(1),
892     nGroupPart(0),
893     bSelectedPage(sal_False),
894     bIsGroupField(sal_False),
895     bDateValue(sal_False),
896     bAutoStart(sal_False),
897     bAutoEnd(sal_False),
898     mbHasHiddenMember(false)
899 {
900     sal_Bool bHasName(sal_False);
901     sal_Bool bDataLayout(sal_False);
902     OUString aDisplayName;
903     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
904     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotFieldAttrTokenMap();
905     for( sal_Int16 i=0; i < nAttrCount; ++i )
906     {
907         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
908         rtl::OUString aLocalName;
909         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
910                                             sAttrName, &aLocalName );
911         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
912 
913         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
914         {
915             case XML_TOK_DATA_PILOT_FIELD_ATTR_SOURCE_FIELD_NAME :
916             {
917                 sName = sValue;
918                 bHasName = sal_True;
919             }
920             break;
921             case XML_TOK_DATA_PILOT_FIELD_ATTR_DISPLAY_NAME:
922             case XML_TOK_DATA_PILOT_FIELD_ATTR_DISPLAY_NAME_EXT:
923             {
924                 aDisplayName = sValue;
925             }
926             break;
927             case XML_TOK_DATA_PILOT_FIELD_ATTR_IS_DATA_LAYOUT_FIELD :
928             {
929                 bDataLayout = IsXMLToken(sValue, XML_TRUE);
930             }
931             break;
932             case XML_TOK_DATA_PILOT_FIELD_ATTR_FUNCTION :
933             {
934                 nFunction = (sal_Int16) ScXMLConverter::GetFunctionFromString( sValue );
935             }
936             break;
937             case XML_TOK_DATA_PILOT_FIELD_ATTR_ORIENTATION :
938             {
939                 nOrientation = (sal_Int16) ScXMLConverter::GetOrientationFromString( sValue );
940             }
941             break;
942             case XML_TOK_DATA_PILOT_FIELD_ATTR_SELECTED_PAGE :
943             {
944                 sSelectedPage = sValue;
945                 bSelectedPage = sal_True;
946             }
947             break;
948             case XML_TOK_DATA_PILOT_FIELD_ATTR_USED_HIERARCHY :
949             {
950                 nUsedHierarchy = sValue.toInt32();
951             }
952             break;
953         }
954     }
955     if (bHasName)
956     {
957         pDim = new ScDPSaveDimension(String(sName), bDataLayout);
958         if (aDisplayName.getLength())
959             pDim->SetLayoutName(aDisplayName);
960     }
961 }
962 
~ScXMLDataPilotFieldContext()963 ScXMLDataPilotFieldContext::~ScXMLDataPilotFieldContext()
964 {
965 }
966 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)967 SvXMLImportContext *ScXMLDataPilotFieldContext::CreateChildContext( sal_uInt16 nPrefix,
968                                             const ::rtl::OUString& rLName,
969                                             const ::com::sun::star::uno::Reference<
970                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
971 {
972     SvXMLImportContext *pContext = 0;
973 
974     const SvXMLTokenMap& rTokenMap = GetScImport().GetDataPilotFieldElemTokenMap();
975     switch( rTokenMap.Get( nPrefix, rLName ) )
976     {
977         case XML_TOK_DATA_PILOT_FIELD_ELEM_DATA_PILOT_LEVEL :
978             pContext = new ScXMLDataPilotLevelContext(GetScImport(), nPrefix, rLName, xAttrList, this);
979         break;
980         case XML_TOK_DATA_PILOT_FIELD_ELEM_DATA_PILOT_REFERENCE :
981             pContext = new ScXMLDataPilotFieldReferenceContext(GetScImport(), nPrefix, rLName, xAttrList, this);
982         break;
983         case XML_TOK_DATA_PILOT_FIELD_ELEM_DATA_PILOT_GROUPS :
984             pContext = new ScXMLDataPilotGroupsContext(GetScImport(), nPrefix, rLName, xAttrList, this);
985         break;
986     }
987 
988     if( !pContext )
989         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
990 
991     return pContext;
992 }
993 
AddMember(ScDPSaveMember * pMember)994 void ScXMLDataPilotFieldContext::AddMember(ScDPSaveMember* pMember)
995 {
996     if (pDim)
997         pDim->AddMember(pMember);
998 
999     if (!pMember->GetIsVisible())
1000         // This member is hidden.
1001         mbHasHiddenMember = true;
1002 }
1003 
SetSubTotalName(const OUString & rName)1004 void ScXMLDataPilotFieldContext::SetSubTotalName(const OUString& rName)
1005 {
1006     if (pDim)
1007         pDim->SetSubtotalName(rName);
1008 }
1009 
AddGroup(const::std::vector<rtl::OUString> & rMembers,const rtl::OUString & rName)1010 void ScXMLDataPilotFieldContext::AddGroup(const ::std::vector<rtl::OUString>& rMembers, const rtl::OUString& rName)
1011 {
1012     ScXMLDataPilotGroup aGroup;
1013     aGroup.aMembers = rMembers;
1014     aGroup.aName = rName;
1015     aGroups.push_back(aGroup);
1016 }
1017 
EndElement()1018 void ScXMLDataPilotFieldContext::EndElement()
1019 {
1020     if (pDim)
1021     {
1022         pDim->SetUsedHierarchy(nUsedHierarchy);
1023         pDim->SetFunction(nFunction);
1024         pDim->SetOrientation(nOrientation);
1025         if (bSelectedPage)
1026         {
1027             String sPage(sSelectedPage);
1028             pDim->SetCurrentPage(&sPage);
1029         }
1030         pDataPilotTable->AddDimension(pDim, mbHasHiddenMember);
1031         if (bIsGroupField)
1032         {
1033             ScDPNumGroupInfo aInfo;
1034             aInfo.Enable = sal_True;
1035             aInfo.DateValues = bDateValue;
1036             aInfo.AutoStart = bAutoStart;
1037             aInfo.AutoEnd = bAutoEnd;
1038             aInfo.Start = fStart;
1039             aInfo.End = fEnd;
1040             aInfo.Step = fStep;
1041             if (sGroupSource.getLength())
1042             {
1043                 ScDPSaveGroupDimension aGroupDim(sGroupSource, sName);
1044                 if (nGroupPart)
1045                     aGroupDim.SetDateInfo(aInfo, nGroupPart);
1046                 else
1047                 {
1048                     ::std::vector<ScXMLDataPilotGroup>::const_iterator aItr(aGroups.begin());
1049                     ::std::vector<ScXMLDataPilotGroup>::const_iterator aEndItr(aGroups.end());
1050                     while (aItr != aEndItr)
1051                     {
1052                         ScDPSaveGroupItem aItem(aItr->aName);
1053                         ::std::vector<rtl::OUString>::const_iterator aMembersItr(aItr->aMembers.begin());
1054                         ::std::vector<rtl::OUString>::const_iterator aMembersEndItr(aItr->aMembers.end());
1055                         while (aMembersItr != aMembersEndItr)
1056                         {
1057                             aItem.AddElement(*aMembersItr);
1058                             ++aMembersItr;
1059                         }
1060                         ++aItr;
1061                         aGroupDim.AddGroupItem(aItem);
1062                     }
1063                 }
1064                 pDataPilotTable->AddGroupDim(aGroupDim);
1065             }
1066             else //NumGroup
1067             {
1068                 ScDPSaveNumGroupDimension aNumGroupDim(sName, aInfo);
1069                 if (nGroupPart)
1070                     aNumGroupDim.SetDateInfo(aInfo, nGroupPart);
1071                 pDataPilotTable->AddGroupDim(aNumGroupDim);
1072             }
1073         }
1074     }
1075 }
1076 
ScXMLDataPilotFieldReferenceContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pDataPilotField)1077 ScXMLDataPilotFieldReferenceContext::ScXMLDataPilotFieldReferenceContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
1078                         const ::rtl::OUString& rLName,
1079                         const uno::Reference<xml::sax::XAttributeList>& xAttrList,
1080                         ScXMLDataPilotFieldContext* pDataPilotField) :
1081     SvXMLImportContext( rImport, nPrfx, rLName )
1082 {
1083     sheet::DataPilotFieldReference aReference;
1084 
1085     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1086     for( sal_Int16 i=0; i < nAttrCount; i++ )
1087     {
1088         rtl::OUString sAttrName(xAttrList->getNameByIndex( i ));
1089         rtl::OUString aLocalName;
1090         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1091                                             sAttrName, &aLocalName );
1092         rtl::OUString sValue(xAttrList->getValueByIndex( i ));
1093 
1094         if ( nPrefix == XML_NAMESPACE_TABLE )
1095         {
1096             if (IsXMLToken(aLocalName, XML_TYPE))
1097             {
1098                 if (IsXMLToken(sValue, XML_NONE))
1099                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::NONE;
1100                 else if (IsXMLToken(sValue, XML_MEMBER_DIFFERENCE))
1101                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE;
1102                 else if (IsXMLToken(sValue, XML_MEMBER_PERCENTAGE))
1103                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE;
1104                 else if (IsXMLToken(sValue, XML_MEMBER_PERCENTAGE_DIFFERENCE))
1105                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE;
1106                 else if (IsXMLToken(sValue, XML_RUNNING_TOTAL))
1107                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::RUNNING_TOTAL;
1108                 else if (IsXMLToken(sValue, XML_ROW_PERCENTAGE))
1109                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::ROW_PERCENTAGE;
1110                 else if (IsXMLToken(sValue, XML_COLUMN_PERCENTAGE))
1111                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::COLUMN_PERCENTAGE;
1112                 else if (IsXMLToken(sValue, XML_TOTAL_PERCENTAGE))
1113                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::TOTAL_PERCENTAGE;
1114                 else if (IsXMLToken(sValue, XML_INDEX))
1115                     aReference.ReferenceType = sheet::DataPilotFieldReferenceType::INDEX;
1116             }
1117             else if (IsXMLToken(aLocalName, XML_FIELD_NAME))
1118             {
1119                 aReference.ReferenceField = sValue;
1120             }
1121             else if (IsXMLToken(aLocalName, XML_MEMBER_TYPE))
1122             {
1123                 if (IsXMLToken(sValue, XML_NAMED))
1124                     aReference.ReferenceItemType = sheet::DataPilotFieldReferenceItemType::NAMED;
1125                 else if (IsXMLToken(sValue, XML_PREVIOUS))
1126                     aReference.ReferenceItemType = sheet::DataPilotFieldReferenceItemType::PREVIOUS;
1127                 else if (IsXMLToken(sValue, XML_NEXT))
1128                     aReference.ReferenceItemType = sheet::DataPilotFieldReferenceItemType::NEXT;
1129             }
1130             else if (IsXMLToken(aLocalName, XML_MEMBER_NAME))
1131             {
1132                 aReference.ReferenceItemName = sValue;
1133             }
1134         }
1135     }
1136     pDataPilotField->SetFieldReference(aReference);
1137 }
1138 
~ScXMLDataPilotFieldReferenceContext()1139 ScXMLDataPilotFieldReferenceContext::~ScXMLDataPilotFieldReferenceContext()
1140 {
1141 }
1142 
ScXMLDataPilotLevelContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pTempDataPilotField)1143 ScXMLDataPilotLevelContext::ScXMLDataPilotLevelContext( ScXMLImport& rImport,
1144                                       sal_uInt16 nPrfx,
1145                                       const ::rtl::OUString& rLName,
1146                                       const ::com::sun::star::uno::Reference<
1147                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1148                                         ScXMLDataPilotFieldContext* pTempDataPilotField) :
1149     SvXMLImportContext( rImport, nPrfx, rLName ),
1150     pDataPilotField(pTempDataPilotField)
1151 {
1152     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1153     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotLevelAttrTokenMap();
1154     for( sal_Int16 i=0; i < nAttrCount; ++i )
1155     {
1156         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
1157         rtl::OUString aLocalName;
1158         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1159                                             sAttrName, &aLocalName );
1160         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
1161 
1162         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
1163         {
1164             case XML_TOK_DATA_PILOT_LEVEL_ATTR_SHOW_EMPTY :
1165             {
1166                 pDataPilotField->SetShowEmpty(IsXMLToken(sValue, XML_TRUE));
1167             }
1168             break;
1169         }
1170     }
1171 }
1172 
~ScXMLDataPilotLevelContext()1173 ScXMLDataPilotLevelContext::~ScXMLDataPilotLevelContext()
1174 {
1175 }
1176 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)1177 SvXMLImportContext *ScXMLDataPilotLevelContext::CreateChildContext( sal_uInt16 nPrefix,
1178                                             const ::rtl::OUString& rLName,
1179                                             const ::com::sun::star::uno::Reference<
1180                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
1181 {
1182     SvXMLImportContext *pContext = 0;
1183 
1184     const SvXMLTokenMap& rTokenMap = GetScImport().GetDataPilotLevelElemTokenMap();
1185     switch( rTokenMap.Get( nPrefix, rLName ) )
1186     {
1187         case XML_TOK_DATA_PILOT_LEVEL_ELEM_DATA_PILOT_SUBTOTALS :
1188             pContext = new ScXMLDataPilotSubTotalsContext(GetScImport(), nPrefix, rLName, xAttrList, pDataPilotField);
1189         break;
1190         case XML_TOK_DATA_PILOT_LEVEL_ELEM_DATA_PILOT_MEMBERS :
1191             pContext = new ScXMLDataPilotMembersContext(GetScImport(), nPrefix, rLName, xAttrList, pDataPilotField);
1192         break;
1193         case XML_TOK_DATA_PILOT_FIELD_ELEM_DATA_PILOT_DISPLAY_INFO :
1194             pContext = new ScXMLDataPilotDisplayInfoContext(GetScImport(), nPrefix, rLName, xAttrList, pDataPilotField);
1195         break;
1196         case XML_TOK_DATA_PILOT_FIELD_ELEM_DATA_PILOT_SORT_INFO :
1197             pContext = new ScXMLDataPilotSortInfoContext(GetScImport(), nPrefix, rLName, xAttrList, pDataPilotField);
1198         break;
1199         case XML_TOK_DATA_PILOT_FIELD_ELEM_DATA_PILOT_LAYOUT_INFO :
1200             pContext = new ScXMLDataPilotLayoutInfoContext(GetScImport(), nPrefix, rLName, xAttrList, pDataPilotField);
1201         break;
1202     }
1203 
1204     if( !pContext )
1205         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1206 
1207     return pContext;
1208 }
1209 
EndElement()1210 void ScXMLDataPilotLevelContext::EndElement()
1211 {
1212 }
1213 
ScXMLDataPilotDisplayInfoContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pDataPilotField)1214 ScXMLDataPilotDisplayInfoContext::ScXMLDataPilotDisplayInfoContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
1215                         const ::rtl::OUString& rLName,
1216                         const ::com::sun::star::uno::Reference<
1217                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1218                         ScXMLDataPilotFieldContext* pDataPilotField) :
1219     SvXMLImportContext( rImport, nPrfx, rLName )
1220 {
1221     sheet::DataPilotFieldAutoShowInfo aInfo;
1222 
1223     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1224     for( sal_Int16 i=0; i < nAttrCount; i++ )
1225     {
1226         rtl::OUString sAttrName(xAttrList->getNameByIndex( i ));
1227         rtl::OUString aLocalName;
1228         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1229                                             sAttrName, &aLocalName );
1230         rtl::OUString sValue(xAttrList->getValueByIndex( i ));
1231 
1232         if ( nPrefix == XML_NAMESPACE_TABLE )
1233         {
1234             if (IsXMLToken(aLocalName, XML_ENABLED))
1235             {
1236                 if (IsXMLToken(sValue, XML_TRUE))
1237                     aInfo.IsEnabled = sal_True;
1238                 else
1239                     aInfo.IsEnabled = sal_False;
1240             }
1241             else if (IsXMLToken(aLocalName, XML_DISPLAY_MEMBER_MODE))
1242             {
1243                 if (IsXMLToken(sValue, XML_FROM_TOP))
1244                     aInfo.ShowItemsMode = sheet::DataPilotFieldShowItemsMode::FROM_TOP;
1245                 else if (IsXMLToken(sValue, XML_FROM_BOTTOM))
1246                     aInfo.ShowItemsMode = sheet::DataPilotFieldShowItemsMode::FROM_BOTTOM;
1247             }
1248             else if (IsXMLToken(aLocalName, XML_MEMBER_COUNT))
1249             {
1250                 aInfo.ItemCount = sValue.toInt32();
1251             }
1252             else if (IsXMLToken(aLocalName, XML_DATA_FIELD))
1253             {
1254                 aInfo.DataField = sValue;
1255             }
1256         }
1257     }
1258     pDataPilotField->SetAutoShowInfo(aInfo);
1259 }
1260 
~ScXMLDataPilotDisplayInfoContext()1261 ScXMLDataPilotDisplayInfoContext::~ScXMLDataPilotDisplayInfoContext()
1262 {
1263 }
1264 
ScXMLDataPilotSortInfoContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pDataPilotField)1265 ScXMLDataPilotSortInfoContext::ScXMLDataPilotSortInfoContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
1266                         const ::rtl::OUString& rLName,
1267                         const ::com::sun::star::uno::Reference<
1268                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1269                         ScXMLDataPilotFieldContext* pDataPilotField) :
1270     SvXMLImportContext( rImport, nPrfx, rLName )
1271 {
1272     sheet::DataPilotFieldSortInfo aInfo;
1273 
1274     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1275     for( sal_Int16 i=0; i < nAttrCount; i++ )
1276     {
1277         rtl::OUString sAttrName(xAttrList->getNameByIndex( i ));
1278         rtl::OUString aLocalName;
1279         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1280                                             sAttrName, &aLocalName );
1281         rtl::OUString sValue(xAttrList->getValueByIndex( i ));
1282 
1283         if ( nPrefix == XML_NAMESPACE_TABLE )
1284         {
1285             if (IsXMLToken(aLocalName, XML_ORDER))
1286             {
1287                 if (IsXMLToken(sValue, XML_ASCENDING))
1288                     aInfo.IsAscending = sal_True;
1289                 else if (IsXMLToken(sValue, XML_DESCENDING))
1290                     aInfo.IsAscending = sal_False;
1291             }
1292             else if (IsXMLToken(aLocalName, XML_SORT_MODE))
1293             {
1294                 if (IsXMLToken(sValue, XML_NONE))
1295                     aInfo.Mode = sheet::DataPilotFieldSortMode::NONE;
1296                 else if (IsXMLToken(sValue, XML_MANUAL))
1297                     aInfo.Mode = sheet::DataPilotFieldSortMode::MANUAL;
1298                 else if (IsXMLToken(sValue, XML_NAME))
1299                     aInfo.Mode = sheet::DataPilotFieldSortMode::NAME;
1300                 else if (IsXMLToken(sValue, XML_DATA))
1301                     aInfo.Mode = sheet::DataPilotFieldSortMode::DATA;
1302             }
1303             else if (IsXMLToken(aLocalName, XML_DATA_FIELD))
1304                 aInfo.Field = sValue;
1305         }
1306     }
1307     pDataPilotField->SetSortInfo(aInfo);
1308 }
1309 
~ScXMLDataPilotSortInfoContext()1310 ScXMLDataPilotSortInfoContext::~ScXMLDataPilotSortInfoContext()
1311 {
1312 }
1313 
ScXMLDataPilotLayoutInfoContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pDataPilotField)1314 ScXMLDataPilotLayoutInfoContext::ScXMLDataPilotLayoutInfoContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
1315                         const ::rtl::OUString& rLName,
1316                         const ::com::sun::star::uno::Reference<
1317                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1318                         ScXMLDataPilotFieldContext* pDataPilotField) :
1319     SvXMLImportContext( rImport, nPrfx, rLName )
1320 {
1321     sheet::DataPilotFieldLayoutInfo aInfo;
1322 
1323     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1324     for( sal_Int16 i=0; i < nAttrCount; i++ )
1325     {
1326         rtl::OUString sAttrName(xAttrList->getNameByIndex( i ));
1327         rtl::OUString aLocalName;
1328         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1329                                             sAttrName, &aLocalName );
1330         rtl::OUString sValue(xAttrList->getValueByIndex( i ));
1331 
1332         if ( nPrefix == XML_NAMESPACE_TABLE )
1333         {
1334             if (IsXMLToken(aLocalName, XML_ADD_EMPTY_LINES))
1335             {
1336                 if (IsXMLToken(sValue, XML_TRUE))
1337                     aInfo.AddEmptyLines = sal_True;
1338                 else
1339                     aInfo.AddEmptyLines = sal_False;
1340             }
1341             else if (IsXMLToken(aLocalName, XML_LAYOUT_MODE))
1342             {
1343                 if (IsXMLToken(sValue, XML_TABULAR_LAYOUT))
1344                     aInfo.LayoutMode = sheet::DataPilotFieldLayoutMode::TABULAR_LAYOUT;
1345                 else if (IsXMLToken(sValue, XML_OUTLINE_SUBTOTALS_TOP))
1346                     aInfo.LayoutMode = sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP;
1347                 else if (IsXMLToken(sValue, XML_OUTLINE_SUBTOTALS_BOTTOM))
1348                     aInfo.LayoutMode = sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM;
1349             }
1350         }
1351     }
1352     pDataPilotField->SetLayoutInfo(aInfo);}
1353 
~ScXMLDataPilotLayoutInfoContext()1354 ScXMLDataPilotLayoutInfoContext::~ScXMLDataPilotLayoutInfoContext()
1355 {
1356 }
1357 
ScXMLDataPilotSubTotalsContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &,ScXMLDataPilotFieldContext * pTempDataPilotField)1358 ScXMLDataPilotSubTotalsContext::ScXMLDataPilotSubTotalsContext( ScXMLImport& rImport,
1359                                       sal_uInt16 nPrfx,
1360                                       const ::rtl::OUString& rLName,
1361                                       const ::com::sun::star::uno::Reference<
1362                                       ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */,
1363                                         ScXMLDataPilotFieldContext* pTempDataPilotField) :
1364     SvXMLImportContext( rImport, nPrfx, rLName ),
1365     pDataPilotField(pTempDataPilotField),
1366     nFunctionCount(0),
1367     pFunctions(NULL)
1368 {
1369 
1370     // has no attributes
1371 }
1372 
~ScXMLDataPilotSubTotalsContext()1373 ScXMLDataPilotSubTotalsContext::~ScXMLDataPilotSubTotalsContext()
1374 {
1375 }
1376 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)1377 SvXMLImportContext *ScXMLDataPilotSubTotalsContext::CreateChildContext( sal_uInt16 nPrefix,
1378                                             const ::rtl::OUString& rLName,
1379                                             const ::com::sun::star::uno::Reference<
1380                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
1381 {
1382     SvXMLImportContext *pContext = 0;
1383 
1384     const SvXMLTokenMap& rTokenMap = GetScImport().GetDataPilotSubTotalsElemTokenMap();
1385     switch( rTokenMap.Get( nPrefix, rLName ) )
1386     {
1387         case XML_TOK_DATA_PILOT_SUBTOTALS_ELEM_DATA_PILOT_SUBTOTAL :
1388             pContext = new ScXMLDataPilotSubTotalContext(GetScImport(), nPrefix, rLName, xAttrList, this);
1389         break;
1390     }
1391 
1392     if( !pContext )
1393         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1394 
1395     return pContext;
1396 }
1397 
EndElement()1398 void ScXMLDataPilotSubTotalsContext::EndElement()
1399 {
1400     pDataPilotField->SetSubTotals(pFunctions, nFunctionCount);
1401     if (maDisplayName.getLength())
1402         pDataPilotField->SetSubTotalName(maDisplayName);
1403 }
1404 
AddFunction(sal_Int16 nFunction)1405 void ScXMLDataPilotSubTotalsContext::AddFunction(sal_Int16 nFunction)
1406 {
1407     if (nFunctionCount)
1408     {
1409         ++nFunctionCount;
1410         sal_uInt16* pTemp = new sal_uInt16[nFunctionCount];
1411         for (sal_Int16 i = 0; i < nFunctionCount - 1; ++i)
1412             pTemp[i] = pFunctions[i];
1413         pTemp[nFunctionCount - 1] = nFunction;
1414         delete[] pFunctions;
1415         pFunctions = pTemp;
1416     }
1417     else
1418     {
1419         nFunctionCount = 1;
1420         pFunctions = new sal_uInt16[nFunctionCount];
1421         pFunctions[0] = nFunction;
1422     }
1423 }
1424 
SetDisplayName(const OUString & rName)1425 void ScXMLDataPilotSubTotalsContext::SetDisplayName(const OUString& rName)
1426 {
1427     maDisplayName = rName;
1428 }
1429 
ScXMLDataPilotSubTotalContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotSubTotalsContext * pTempDataPilotSubTotals)1430 ScXMLDataPilotSubTotalContext::ScXMLDataPilotSubTotalContext( ScXMLImport& rImport,
1431                                       sal_uInt16 nPrfx,
1432                                       const ::rtl::OUString& rLName,
1433                                       const ::com::sun::star::uno::Reference<
1434                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1435                                         ScXMLDataPilotSubTotalsContext* pTempDataPilotSubTotals) :
1436     SvXMLImportContext( rImport, nPrfx, rLName ),
1437     pDataPilotSubTotals(pTempDataPilotSubTotals)
1438 {
1439     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1440     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotSubTotalAttrTokenMap();
1441     for( sal_Int16 i=0; i < nAttrCount; ++i )
1442     {
1443         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
1444         rtl::OUString aLocalName;
1445         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1446                                             sAttrName, &aLocalName );
1447         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
1448 
1449         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
1450         {
1451             case XML_TOK_DATA_PILOT_SUBTOTAL_ATTR_FUNCTION :
1452             {
1453                 pDataPilotSubTotals->AddFunction( sal::static_int_cast<sal_Int16>(
1454                                 ScXMLConverter::GetFunctionFromString( sValue ) ) );
1455             }
1456             break;
1457             case XML_TOK_DATA_PILOT_SUBTOTAL_ATTR_DISPLAY_NAME:
1458             case XML_TOK_DATA_PILOT_SUBTOTAL_ATTR_DISPLAY_NAME_EXT:
1459                 pDataPilotSubTotals->SetDisplayName(sValue);
1460             break;
1461         }
1462     }
1463 }
1464 
~ScXMLDataPilotSubTotalContext()1465 ScXMLDataPilotSubTotalContext::~ScXMLDataPilotSubTotalContext()
1466 {
1467 }
1468 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)1469 SvXMLImportContext *ScXMLDataPilotSubTotalContext::CreateChildContext( sal_uInt16 nPrefix,
1470                                             const ::rtl::OUString& rLName,
1471                                             const ::com::sun::star::uno::Reference<
1472                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
1473 {
1474     SvXMLImportContext *pContext = 0;
1475 
1476     if( !pContext )
1477         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1478 
1479     return pContext;
1480 }
1481 
EndElement()1482 void ScXMLDataPilotSubTotalContext::EndElement()
1483 {
1484 }
1485 
ScXMLDataPilotMembersContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &,ScXMLDataPilotFieldContext * pTempDataPilotField)1486 ScXMLDataPilotMembersContext::ScXMLDataPilotMembersContext( ScXMLImport& rImport,
1487                                       sal_uInt16 nPrfx,
1488                                       const ::rtl::OUString& rLName,
1489                                       const ::com::sun::star::uno::Reference<
1490                                       ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */,
1491                                         ScXMLDataPilotFieldContext* pTempDataPilotField) :
1492     SvXMLImportContext( rImport, nPrfx, rLName ),
1493     pDataPilotField(pTempDataPilotField)
1494 {
1495     // has no attributes
1496 }
1497 
~ScXMLDataPilotMembersContext()1498 ScXMLDataPilotMembersContext::~ScXMLDataPilotMembersContext()
1499 {
1500 }
1501 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)1502 SvXMLImportContext *ScXMLDataPilotMembersContext::CreateChildContext( sal_uInt16 nPrefix,
1503                                             const ::rtl::OUString& rLName,
1504                                             const ::com::sun::star::uno::Reference<
1505                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
1506 {
1507     SvXMLImportContext *pContext = 0;
1508 
1509     const SvXMLTokenMap& rTokenMap = GetScImport().GetDataPilotMembersElemTokenMap();
1510     switch( rTokenMap.Get( nPrefix, rLName ) )
1511     {
1512         case XML_TOK_DATA_PILOT_MEMBERS_ELEM_DATA_PILOT_MEMBER :
1513             pContext = new ScXMLDataPilotMemberContext(GetScImport(), nPrefix, rLName, xAttrList, pDataPilotField);
1514         break;
1515     }
1516 
1517     if( !pContext )
1518         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1519 
1520     return pContext;
1521 }
1522 
EndElement()1523 void ScXMLDataPilotMembersContext::EndElement()
1524 {
1525 }
1526 
ScXMLDataPilotMemberContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pTempDataPilotField)1527 ScXMLDataPilotMemberContext::ScXMLDataPilotMemberContext( ScXMLImport& rImport,
1528                                       sal_uInt16 nPrfx,
1529                                       const ::rtl::OUString& rLName,
1530                                       const ::com::sun::star::uno::Reference<
1531                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1532                                         ScXMLDataPilotFieldContext* pTempDataPilotField) :
1533     SvXMLImportContext( rImport, nPrfx, rLName ),
1534     pDataPilotField(pTempDataPilotField),
1535     bDisplay( sal_True ),
1536     bDisplayDetails( sal_True ),
1537     bHasName( sal_False )
1538 {
1539     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1540     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataPilotMemberAttrTokenMap();
1541     for( sal_Int16 i=0; i < nAttrCount; ++i )
1542     {
1543         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
1544         rtl::OUString aLocalName;
1545         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1546                                             sAttrName, &aLocalName );
1547         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
1548 
1549         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
1550         {
1551             case XML_TOK_DATA_PILOT_MEMBER_ATTR_NAME :
1552             {
1553                 sName = sValue;
1554                 bHasName = sal_True;
1555             }
1556             break;
1557             case XML_TOK_DATA_PILOT_MEMBER_ATTR_DISPLAY_NAME:
1558             case XML_TOK_DATA_PILOT_MEMBER_ATTR_DISPLAY_NAME_EXT:
1559             {
1560                 maDisplayName = sValue;
1561             }
1562             case XML_TOK_DATA_PILOT_MEMBER_ATTR_DISPLAY :
1563             {
1564                 bDisplay = IsXMLToken(sValue, XML_TRUE);
1565             }
1566             break;
1567             case XML_TOK_DATA_PILOT_MEMBER_ATTR_SHOW_DETAILS :
1568             {
1569                 bDisplayDetails = IsXMLToken(sValue, XML_TRUE);
1570             }
1571             break;
1572         }
1573     }
1574 }
1575 
~ScXMLDataPilotMemberContext()1576 ScXMLDataPilotMemberContext::~ScXMLDataPilotMemberContext()
1577 {
1578 }
1579 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)1580 SvXMLImportContext *ScXMLDataPilotMemberContext::CreateChildContext( sal_uInt16 nPrefix,
1581                                             const ::rtl::OUString& rLName,
1582                                             const ::com::sun::star::uno::Reference<
1583                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
1584 {
1585     SvXMLImportContext *pContext = 0;
1586 
1587     if( !pContext )
1588         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1589 
1590     return pContext;
1591 }
1592 
EndElement()1593 void ScXMLDataPilotMemberContext::EndElement()
1594 {
1595     if (bHasName)   // #i53407# don't check sName, empty name is allowed
1596     {
1597         ScDPSaveMember* pMember = new ScDPSaveMember(String(sName));
1598         if (maDisplayName.getLength())
1599             pMember->SetLayoutName(maDisplayName);
1600         pMember->SetIsVisible(bDisplay);
1601         pMember->SetShowDetails(bDisplayDetails);
1602         pDataPilotField->AddMember(pMember);
1603     }
1604 }
1605 
ScXMLDataPilotGroupsContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pTempDataPilotField)1606 ScXMLDataPilotGroupsContext::ScXMLDataPilotGroupsContext( ScXMLImport& rImport,
1607                                       sal_uInt16 nPrfx,
1608                                       const ::rtl::OUString& rLName,
1609                                       const ::com::sun::star::uno::Reference<
1610                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1611                                         ScXMLDataPilotFieldContext* pTempDataPilotField) :
1612     SvXMLImportContext( rImport, nPrfx, rLName ),
1613     pDataPilotField(pTempDataPilotField)
1614 {
1615     rtl::OUString               sGroupSource;
1616     double                      fStart(0.0);
1617     double                      fEnd(0.0);
1618     double                      fStep(0.0);
1619     sal_Int32                   nGroupPart(0);
1620     sal_Bool                    bDateValue(sal_False);
1621     sal_Bool                    bAutoStart(sal_True);
1622     sal_Bool                    bAutoEnd(sal_True);
1623 
1624     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1625     for( sal_Int16 i=0; i < nAttrCount; i++ )
1626     {
1627         rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
1628         rtl::OUString aLocalName;
1629         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1630                                             sAttrName, &aLocalName );
1631         rtl::OUString sValue = xAttrList->getValueByIndex( i );
1632 
1633         (void)nPrefix;  //! compare below!
1634 
1635         if (IsXMLToken(aLocalName, XML_SOURCE_FIELD_NAME))
1636                 sGroupSource = sValue;
1637         else if (IsXMLToken(aLocalName, XML_DATE_START))
1638         {
1639             bDateValue = sal_True;
1640             if (IsXMLToken(sValue, XML_AUTO))
1641                 bAutoStart = sal_True;
1642             else
1643             {
1644                 GetScImport().GetMM100UnitConverter().convertDateTime(fStart, sValue);
1645                 bAutoStart = sal_False;
1646             }
1647         }
1648         else if (IsXMLToken(aLocalName, XML_DATE_END))
1649         {
1650             bDateValue = sal_True;
1651             if (IsXMLToken(sValue, XML_AUTO))
1652                 bAutoEnd = sal_True;
1653             else
1654             {
1655                 GetScImport().GetMM100UnitConverter().convertDateTime(fEnd, sValue);
1656                 bAutoEnd = sal_False;
1657             }
1658         }
1659         else if (IsXMLToken(aLocalName, XML_START))
1660         {
1661             if (IsXMLToken(sValue, XML_AUTO))
1662                 bAutoStart = sal_True;
1663             else
1664             {
1665                 GetScImport().GetMM100UnitConverter().convertDouble(fStart, sValue);
1666                 bAutoStart = sal_False;
1667             }
1668         }
1669         else if (IsXMLToken(aLocalName, XML_END))
1670         {
1671             if (IsXMLToken(sValue, XML_AUTO))
1672                 bAutoEnd = sal_True;
1673             else
1674             {
1675                 GetScImport().GetMM100UnitConverter().convertDouble(fEnd, sValue);
1676                 bAutoEnd = sal_False;
1677             }
1678         }
1679         else if (IsXMLToken(aLocalName, XML_STEP))
1680                 GetScImport().GetMM100UnitConverter().convertDouble(fStep, sValue);
1681         else if (IsXMLToken(aLocalName, XML_GROUPED_BY))
1682         {
1683             if (IsXMLToken(sValue, XML_SECONDS))
1684                 nGroupPart = com::sun::star::sheet::DataPilotFieldGroupBy::SECONDS;
1685             else if (IsXMLToken(sValue, XML_MINUTES))
1686                 nGroupPart = com::sun::star::sheet::DataPilotFieldGroupBy::MINUTES;
1687             else if (IsXMLToken(sValue, XML_HOURS))
1688                 nGroupPart = com::sun::star::sheet::DataPilotFieldGroupBy::HOURS;
1689             else if (IsXMLToken(sValue, XML_DAYS))
1690                 nGroupPart = com::sun::star::sheet::DataPilotFieldGroupBy::DAYS;
1691             else if (IsXMLToken(sValue, XML_MONTHS))
1692                 nGroupPart = com::sun::star::sheet::DataPilotFieldGroupBy::MONTHS;
1693             else if (IsXMLToken(sValue, XML_QUARTERS))
1694                 nGroupPart = com::sun::star::sheet::DataPilotFieldGroupBy::QUARTERS;
1695             else if (IsXMLToken(sValue, XML_YEARS))
1696                 nGroupPart = com::sun::star::sheet::DataPilotFieldGroupBy::YEARS;
1697         }
1698     }
1699     pDataPilotField->SetGrouping(sGroupSource, fStart, fEnd, fStep, nGroupPart, bDateValue, bAutoStart, bAutoEnd);
1700 }
1701 
~ScXMLDataPilotGroupsContext()1702 ScXMLDataPilotGroupsContext::~ScXMLDataPilotGroupsContext()
1703 {
1704 }
1705 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)1706 SvXMLImportContext *ScXMLDataPilotGroupsContext::CreateChildContext( sal_uInt16 nPrefix,
1707                                             const ::rtl::OUString& rLName,
1708                                             const ::com::sun::star::uno::Reference<
1709                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
1710 {
1711     SvXMLImportContext *pContext = 0;
1712 
1713     if (nPrefix == XML_NAMESPACE_TABLE)
1714     {
1715         if (IsXMLToken(rLName, XML_DATA_PILOT_GROUP))
1716             pContext = new ScXMLDataPilotGroupContext(GetScImport(), nPrefix, rLName,  xAttrList, pDataPilotField);
1717     }
1718 
1719     if( !pContext )
1720         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1721 
1722     return pContext;
1723 }
1724 
EndElement()1725 void ScXMLDataPilotGroupsContext::EndElement()
1726 {
1727 }
1728 
ScXMLDataPilotGroupContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotFieldContext * pTempDataPilotField)1729 ScXMLDataPilotGroupContext::ScXMLDataPilotGroupContext( ScXMLImport& rImport,
1730                                       sal_uInt16 nPrfx,
1731                                       const ::rtl::OUString& rLName,
1732                                       const ::com::sun::star::uno::Reference<
1733                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1734                                         ScXMLDataPilotFieldContext* pTempDataPilotField) :
1735     SvXMLImportContext( rImport, nPrfx, rLName ),
1736     pDataPilotField(pTempDataPilotField)
1737 {
1738     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1739     for( sal_Int16 i=0; i < nAttrCount; i++ )
1740     {
1741         rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
1742         rtl::OUString aLocalName;
1743         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1744                                             sAttrName, &aLocalName );
1745         rtl::OUString sValue = xAttrList->getValueByIndex( i );
1746 
1747         if (nPrefix == XML_NAMESPACE_TABLE)
1748         {
1749             if (IsXMLToken(aLocalName, XML_NAME))
1750                 sName = sValue;
1751         }
1752     }
1753 }
1754 
~ScXMLDataPilotGroupContext()1755 ScXMLDataPilotGroupContext::~ScXMLDataPilotGroupContext()
1756 {
1757 }
1758 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)1759 SvXMLImportContext *ScXMLDataPilotGroupContext::CreateChildContext( sal_uInt16 nPrefix,
1760                                             const ::rtl::OUString& rLName,
1761                                             const ::com::sun::star::uno::Reference<
1762                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
1763 {
1764     SvXMLImportContext *pContext = 0;
1765 
1766     if (nPrefix == XML_NAMESPACE_TABLE)
1767     {
1768         if (IsXMLToken(rLName, XML_DATA_PILOT_MEMBER))
1769             pContext = new ScXMLDataPilotGroupMemberContext(GetScImport(), nPrefix, rLName, xAttrList, this);
1770     }
1771 
1772     if( !pContext )
1773         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1774 
1775     return pContext;
1776 }
1777 
EndElement()1778 void ScXMLDataPilotGroupContext::EndElement()
1779 {
1780     pDataPilotField->AddGroup(aMembers, sName);
1781 }
1782 
ScXMLDataPilotGroupMemberContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLDataPilotGroupContext * pTempDataPilotGroup)1783 ScXMLDataPilotGroupMemberContext::ScXMLDataPilotGroupMemberContext( ScXMLImport& rImport,
1784                                       sal_uInt16 nPrfx,
1785                                       const ::rtl::OUString& rLName,
1786                                       const ::com::sun::star::uno::Reference<
1787                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
1788                                         ScXMLDataPilotGroupContext* pTempDataPilotGroup) :
1789     SvXMLImportContext( rImport, nPrfx, rLName ),
1790     pDataPilotGroup(pTempDataPilotGroup)
1791 {
1792     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1793     for( sal_Int16 i=0; i < nAttrCount; i++ )
1794     {
1795         rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
1796         rtl::OUString aLocalName;
1797         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1798                                             sAttrName, &aLocalName );
1799         rtl::OUString sValue = xAttrList->getValueByIndex( i );
1800 
1801         if (nPrefix == XML_NAMESPACE_TABLE)
1802         {
1803             if (IsXMLToken(aLocalName, XML_NAME))
1804                 sName = sValue;
1805         }
1806     }
1807 }
1808 
~ScXMLDataPilotGroupMemberContext()1809 ScXMLDataPilotGroupMemberContext::~ScXMLDataPilotGroupMemberContext()
1810 {
1811 }
1812 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)1813 SvXMLImportContext *ScXMLDataPilotGroupMemberContext::CreateChildContext( sal_uInt16 nPrefix,
1814                                             const ::rtl::OUString& rLName,
1815                                             const ::com::sun::star::uno::Reference<
1816                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
1817 {
1818     SvXMLImportContext *pContext = 0;
1819 
1820     if( !pContext )
1821         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1822 
1823     return pContext;
1824 }
1825 
EndElement()1826 void ScXMLDataPilotGroupMemberContext::EndElement()
1827 {
1828     if (sName.getLength())
1829         pDataPilotGroup->AddMember(sName);
1830 }
1831