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