LCOV - code coverage report
Current view: top level - sc/source/filter/xml - XMLExportDataPilot.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 15 497 3.0 %
Date: 2014-04-11 Functions: 5 23 21.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "XMLExportDataPilot.hxx"
      21             : #include <xmloff/xmltoken.hxx>
      22             : #include <xmloff/xmlnmspe.hxx>
      23             : #include <xmloff/xmluconv.hxx>
      24             : #include <xmloff/nmspmap.hxx>
      25             : #include <sax/tools/converter.hxx>
      26             : #include <rtl/math.hxx>
      27             : #include "xmlexprt.hxx"
      28             : #include "XMLConverter.hxx"
      29             : #include "document.hxx"
      30             : #include "dpobject.hxx"
      31             : #include "dociter.hxx"
      32             : #include "attrib.hxx"
      33             : #include "patattr.hxx"
      34             : #include "scitems.hxx"
      35             : #include "dpsave.hxx"
      36             : #include "dpshttab.hxx"
      37             : #include "dpsdbtab.hxx"
      38             : #include "dpdimsave.hxx"
      39             : #include "dpgroup.hxx"
      40             : #include "dputil.hxx"
      41             : #include "rangeutl.hxx"
      42             : #include "queryentry.hxx"
      43             : #include <com/sun/star/sheet/DataImportMode.hpp>
      44             : #include <com/sun/star/sheet/DataPilotFieldReference.hpp>
      45             : #include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp>
      46             : #include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp>
      47             : #include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
      48             : #include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
      49             : #include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
      50             : #include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp>
      51             : #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
      52             : #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
      53             : #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
      54             : 
      55             : using namespace com::sun::star;
      56             : using namespace xmloff::token;
      57             : 
      58          18 : ScXMLExportDataPilot::ScXMLExportDataPilot(ScXMLExport& rTempExport)
      59             :     : rExport(rTempExport),
      60          18 :     pDoc( NULL )
      61             : {
      62          18 : }
      63             : 
      64          18 : ScXMLExportDataPilot::~ScXMLExportDataPilot()
      65             : {
      66          18 : }
      67             : 
      68           0 : OUString ScXMLExportDataPilot::getDPOperatorXML(
      69             :     const ScQueryOp aFilterOperator, const bool bUseRegularExpressions) const
      70             : {
      71           0 :     switch (aFilterOperator)
      72             :     {
      73             :         case SC_EQUAL :
      74             :         {
      75           0 :             if (bUseRegularExpressions)
      76           0 :                 return GetXMLToken(XML_MATCH);
      77             :             else
      78           0 :                 return OUString("=");
      79             :         }
      80             :         case SC_NOT_EQUAL :
      81             :         {
      82           0 :             if (bUseRegularExpressions)
      83           0 :                 return GetXMLToken(XML_NOMATCH);
      84             :             else
      85           0 :                 return OUString("!=");
      86             :         }
      87             :         case SC_BOTPERC :
      88           0 :             return GetXMLToken(XML_BOTTOM_PERCENT);
      89             :         case SC_BOTVAL :
      90           0 :             return GetXMLToken(XML_BOTTOM_VALUES);
      91             :         case SC_GREATER :
      92           0 :             return OUString(">");
      93             :         case SC_GREATER_EQUAL :
      94           0 :             return OUString(">=");
      95             :         case SC_LESS :
      96           0 :             return OUString("<");
      97             :         case SC_LESS_EQUAL :
      98           0 :             return OUString("<=");
      99             :         case SC_TOPPERC :
     100           0 :             return GetXMLToken(XML_TOP_PERCENT);
     101             :         case SC_TOPVAL :
     102           0 :             return GetXMLToken(XML_TOP_VALUES);
     103             :         default:
     104             :             OSL_FAIL("This FilterOperator is not supported.");
     105             :     }
     106           0 :     return OUString("=");
     107             : }
     108             : 
     109           0 : void ScXMLExportDataPilot::WriteDPCondition(const ScQueryEntry& aQueryEntry, bool bIsCaseSensitive, bool bUseRegularExpressions)
     110             : {
     111           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(aQueryEntry.nField));
     112           0 :     if (bIsCaseSensitive)
     113           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE);
     114           0 :     const ScQueryEntry::Item& rItem = aQueryEntry.GetQueryItem();
     115           0 :     OUString aQueryStr = rItem.maString.getString();
     116           0 :     if (rItem.meType == ScQueryEntry::ByString)
     117             :     {
     118           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aQueryStr);
     119             :     }
     120             :     else
     121             :     {
     122           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
     123           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aQueryStr);
     124             :     }
     125             : 
     126           0 :     if (aQueryEntry.IsQueryByEmpty())
     127             :     {
     128           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, GetXMLToken(XML_EMPTY));
     129             :     }
     130           0 :     else if (aQueryEntry.IsQueryByNonEmpty())
     131             :     {
     132           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, GetXMLToken(XML_NOEMPTY));
     133             :     }
     134             :     else
     135             :         rExport.AddAttribute(
     136             :             XML_NAMESPACE_TABLE, XML_OPERATOR,
     137           0 :             getDPOperatorXML(aQueryEntry.eOp, bUseRegularExpressions));
     138             : 
     139           0 :     SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true);
     140           0 : }
     141             : 
     142           0 : void ScXMLExportDataPilot::WriteDPFilter(const ScQueryParam& aQueryParam)
     143             : {
     144           0 :     SCSIZE nQueryEntryCount = aQueryParam.GetEntryCount();
     145           0 :     if (nQueryEntryCount > 0)
     146             :     {
     147           0 :         bool bAnd(false);
     148           0 :         bool bOr(false);
     149           0 :         bool bHasEntries(true);
     150           0 :         SCSIZE nEntries(0);
     151             :         SCSIZE j;
     152             : 
     153           0 :         for ( j = 0; (j < nQueryEntryCount) && bHasEntries; ++j)
     154             :         {
     155           0 :             ScQueryEntry aEntry = aQueryParam.GetEntry(j);
     156           0 :             if (aEntry.bDoQuery)
     157             :             {
     158           0 :                 if (nEntries > 0)
     159             :                 {
     160           0 :                     if (aEntry.eConnect == SC_AND)
     161           0 :                         bAnd = true;
     162             :                     else
     163           0 :                         bOr = true;
     164             :                 }
     165           0 :                 ++nEntries;
     166             :             }
     167             :             else
     168           0 :                 bHasEntries = false;
     169           0 :         }
     170           0 :         nQueryEntryCount = nEntries;
     171           0 :         if (nQueryEntryCount)
     172             :         {
     173           0 :             if(!((aQueryParam.nCol1 == aQueryParam.nCol2) && (aQueryParam.nRow1 == aQueryParam.nRow2) &&
     174           0 :                         (static_cast<SCCOLROW>(aQueryParam.nCol1) == static_cast<SCCOLROW>(aQueryParam.nRow1)) &&
     175           0 :                         (aQueryParam.nCol1 == 0) && (aQueryParam.nTab == SCTAB_MAX)))
     176             :             {
     177             :                 ScRange aConditionRange(aQueryParam.nCol1, aQueryParam.nRow1, aQueryParam.nTab,
     178           0 :                     aQueryParam.nCol2, aQueryParam.nRow2, aQueryParam.nTab);
     179           0 :                 OUString sConditionRange;
     180           0 :                 ScRangeStringConverter::GetStringFromRange( sConditionRange, aConditionRange, pDoc, ::formula::FormulaGrammar::CONV_OOO );
     181           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION_SOURCE_RANGE_ADDRESS, sConditionRange);
     182             :             }
     183           0 :             if (!aQueryParam.bDuplicate)
     184           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_DUPLICATES, XML_FALSE);
     185           0 :             SvXMLElementExport aElemDPF(rExport, XML_NAMESPACE_TABLE, XML_FILTER, true, true);
     186           0 :             rExport.CheckAttrList();
     187           0 :             if (nQueryEntryCount  == 1)
     188             :             {
     189           0 :                     WriteDPCondition(aQueryParam.GetEntry(0), aQueryParam.bCaseSens, aQueryParam.bRegExp);
     190             :             }
     191           0 :             else if (bOr && !bAnd)
     192             :             {
     193           0 :                 SvXMLElementExport aElemOr(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, true, true);
     194           0 :                 for (j = 0; j < nQueryEntryCount; ++j)
     195             :                 {
     196           0 :                     WriteDPCondition(aQueryParam.GetEntry(j), aQueryParam.bCaseSens, aQueryParam.bRegExp);
     197           0 :                 }
     198             :             }
     199           0 :             else if (bAnd && !bOr)
     200             :             {
     201           0 :                 SvXMLElementExport aElemAnd(rExport, XML_NAMESPACE_TABLE, XML_FILTER_AND, true, true);
     202           0 :                 for (j = 0; j < nQueryEntryCount; ++j)
     203             :                 {
     204           0 :                     WriteDPCondition(aQueryParam.GetEntry(j), aQueryParam.bCaseSens, aQueryParam.bRegExp);
     205           0 :                 }
     206             :             }
     207             :             else
     208             :             {
     209           0 :                 SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, true, true);
     210           0 :                 ScQueryEntry aPrevFilterField(aQueryParam.GetEntry(0));
     211           0 :                 ScQueryConnect aConnection = aQueryParam.GetEntry(1).eConnect;
     212             :                 bool bOpenAndElement;
     213           0 :                 OUString aName(rExport.GetNamespaceMap().GetQNameByKey(XML_NAMESPACE_TABLE, GetXMLToken(XML_FILTER_AND)));
     214           0 :                 if (aConnection == SC_AND)
     215             :                 {
     216           0 :                     rExport.StartElement( aName, true );
     217           0 :                     bOpenAndElement = true;
     218             :                 }
     219             :                 else
     220           0 :                     bOpenAndElement = false;
     221           0 :                 for (j = 1; j < nQueryEntryCount; ++j)
     222             :                 {
     223           0 :                     if (aConnection != aQueryParam.GetEntry(j).eConnect)
     224             :                     {
     225           0 :                         aConnection = aQueryParam.GetEntry(j).eConnect;
     226           0 :                         if (aQueryParam.GetEntry(j).eConnect == SC_AND)
     227             :                         {
     228           0 :                             rExport.StartElement( aName, true );
     229           0 :                             bOpenAndElement = true;
     230           0 :                             WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     231           0 :                             aPrevFilterField = aQueryParam.GetEntry(j);
     232           0 :                             if (j == nQueryEntryCount - 1)
     233             :                             {
     234           0 :                                 WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     235           0 :                                 rExport.EndElement(aName, true);
     236           0 :                                 bOpenAndElement = false;
     237             :                             }
     238             :                         }
     239             :                         else
     240             :                         {
     241           0 :                             WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     242           0 :                             aPrevFilterField = aQueryParam.GetEntry(j);
     243           0 :                             if (bOpenAndElement)
     244             :                             {
     245           0 :                                 rExport.EndElement(aName, true);
     246           0 :                                 bOpenAndElement = false;
     247             :                             }
     248           0 :                             if (j == nQueryEntryCount - 1)
     249             :                             {
     250           0 :                                 WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     251             :                             }
     252             :                         }
     253             :                     }
     254             :                     else
     255             :                     {
     256           0 :                         WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     257           0 :                         aPrevFilterField = aQueryParam.GetEntry(j);
     258           0 :                         if (j == nQueryEntryCount - 1)
     259           0 :                             WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     260             :                     }
     261           0 :                 }
     262           0 :             }
     263             :         }
     264             :     }
     265           0 : }
     266             : 
     267           0 : void ScXMLExportDataPilot::WriteFieldReference(ScDPSaveDimension* pDim)
     268             : {
     269           0 :     const sheet::DataPilotFieldReference* pRef = pDim->GetReferenceValue();
     270           0 :     if (pRef)
     271             :     {
     272           0 :         OUString sValueStr;
     273           0 :         switch (pRef->ReferenceType)
     274             :         {
     275             :             case sheet::DataPilotFieldReferenceType::NONE :
     276           0 :                 sValueStr = GetXMLToken(XML_NONE);
     277           0 :                 break;
     278             :             case sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE :
     279           0 :                 sValueStr = GetXMLToken(XML_MEMBER_DIFFERENCE);
     280           0 :                 break;
     281             :             case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE :
     282           0 :                 sValueStr = GetXMLToken(XML_MEMBER_PERCENTAGE);
     283           0 :                 break;
     284             :             case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE :
     285           0 :                 sValueStr = GetXMLToken(XML_MEMBER_PERCENTAGE_DIFFERENCE);
     286           0 :                 break;
     287             :             case sheet::DataPilotFieldReferenceType::RUNNING_TOTAL :
     288           0 :                 sValueStr = GetXMLToken(XML_RUNNING_TOTAL);
     289           0 :                 break;
     290             :             case sheet::DataPilotFieldReferenceType::ROW_PERCENTAGE :
     291           0 :                 sValueStr = GetXMLToken(XML_ROW_PERCENTAGE);
     292           0 :                 break;
     293             :             case sheet::DataPilotFieldReferenceType::COLUMN_PERCENTAGE :
     294           0 :                 sValueStr = GetXMLToken(XML_COLUMN_PERCENTAGE);
     295           0 :                 break;
     296             :             case sheet::DataPilotFieldReferenceType::TOTAL_PERCENTAGE :
     297           0 :                 sValueStr = GetXMLToken(XML_TOTAL_PERCENTAGE);
     298           0 :                 break;
     299             :             case sheet::DataPilotFieldReferenceType::INDEX :
     300           0 :                 sValueStr = GetXMLToken(XML_INDEX);
     301           0 :                 break;
     302             :         }
     303           0 :         if (!sValueStr.isEmpty())
     304           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TYPE, sValueStr);
     305             : 
     306           0 :         if (!pRef->ReferenceField.isEmpty())
     307           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NAME, pRef->ReferenceField);
     308             : 
     309           0 :         if (pRef->ReferenceItemType == sheet::DataPilotFieldReferenceItemType::NAMED)
     310             :         {
     311           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_TYPE, XML_NAMED);
     312           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_NAME, pRef->ReferenceItemName);
     313             :         }
     314             :         else
     315             :         {
     316           0 :             sValueStr = OUString();
     317           0 :             switch(pRef->ReferenceItemType)
     318             :             {
     319             :                 case sheet::DataPilotFieldReferenceItemType::PREVIOUS :
     320           0 :                 sValueStr = GetXMLToken(XML_PREVIOUS);
     321           0 :                 break;
     322             :                 case sheet::DataPilotFieldReferenceItemType::NEXT :
     323           0 :                 sValueStr = GetXMLToken(XML_NEXT);
     324           0 :                 break;
     325             :             }
     326           0 :             if (!sValueStr.isEmpty())
     327           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_TYPE, sValueStr);
     328             :         }
     329           0 :         SvXMLElementExport aElemDPFR(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_FIELD_REFERENCE, true, true);
     330             :     }
     331           0 :     rExport.CheckAttrList();
     332           0 : }
     333             : 
     334           0 : void ScXMLExportDataPilot::WriteSortInfo(ScDPSaveDimension* pDim)
     335             : {
     336           0 :     const sheet::DataPilotFieldSortInfo* pSortInfo = pDim->GetSortInfo();
     337           0 :     if (pSortInfo)
     338             :     {
     339           0 :         if (pSortInfo->IsAscending)
     340           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORDER, XML_ASCENDING);
     341             :         else
     342           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORDER, XML_DESCENDING);
     343             : 
     344           0 :         OUString sValueStr;
     345           0 :         switch (pSortInfo->Mode)
     346             :         {
     347             :             case sheet::DataPilotFieldSortMode::NONE:
     348           0 :             sValueStr = GetXMLToken(XML_NONE);
     349           0 :             break;
     350             :             case sheet::DataPilotFieldSortMode::MANUAL:
     351           0 :             sValueStr = GetXMLToken(XML_MANUAL);
     352           0 :             break;
     353             :             case sheet::DataPilotFieldSortMode::NAME:
     354           0 :             sValueStr = GetXMLToken(XML_NAME);
     355           0 :             break;
     356             :             case sheet::DataPilotFieldSortMode::DATA:
     357           0 :             sValueStr = GetXMLToken(XML_DATA);
     358           0 :             if (!pSortInfo->Field.isEmpty())
     359           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_FIELD, pSortInfo->Field);
     360           0 :             break;
     361             :         }
     362           0 :         if (!sValueStr.isEmpty())
     363           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SORT_MODE, sValueStr);
     364           0 :         SvXMLElementExport aElemDPLSI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SORT_INFO, true, true);
     365             :     }
     366           0 : }
     367             : 
     368           0 : void ScXMLExportDataPilot::WriteAutoShowInfo(ScDPSaveDimension* pDim)
     369             : {
     370           0 :     const sheet::DataPilotFieldAutoShowInfo* pAutoInfo = pDim->GetAutoShowInfo();
     371           0 :     if (pAutoInfo)
     372             :     {
     373           0 :         if (pAutoInfo->IsEnabled)
     374           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ENABLED, XML_TRUE);
     375             :         else
     376           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ENABLED, XML_FALSE);
     377             : 
     378           0 :         OUString sValueStr;
     379           0 :         switch (pAutoInfo->ShowItemsMode)
     380             :         {
     381             :             case sheet::DataPilotFieldShowItemsMode::FROM_TOP:
     382           0 :             sValueStr = GetXMLToken(XML_FROM_TOP);
     383           0 :             break;
     384             :             case sheet::DataPilotFieldShowItemsMode::FROM_BOTTOM:
     385           0 :             sValueStr = GetXMLToken(XML_FROM_BOTTOM);
     386           0 :             break;
     387             :         }
     388           0 :         if (!sValueStr.isEmpty())
     389           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_MEMBER_MODE, sValueStr);
     390             : 
     391           0 :         OUStringBuffer sBuffer;
     392           0 :         ::sax::Converter::convertNumber(sBuffer, pAutoInfo->ItemCount);
     393           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_COUNT, sBuffer.makeStringAndClear());
     394             : 
     395           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_FIELD, pAutoInfo->DataField);
     396             : 
     397           0 :         SvXMLElementExport aElemDPLAI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_DISPLAY_INFO, true, true);
     398             :     }
     399           0 : }
     400             : 
     401           0 : void ScXMLExportDataPilot::WriteLayoutInfo(ScDPSaveDimension* pDim)
     402             : {
     403           0 :     const sheet::DataPilotFieldLayoutInfo* pLayoutInfo = pDim->GetLayoutInfo();
     404           0 :     if (pLayoutInfo)
     405             :     {
     406           0 :         if (pLayoutInfo->AddEmptyLines)
     407           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ADD_EMPTY_LINES, XML_TRUE);
     408             :         else
     409           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ADD_EMPTY_LINES, XML_FALSE);
     410             : 
     411           0 :         OUString sValueStr;
     412           0 :         switch (pLayoutInfo->LayoutMode)
     413             :         {
     414             :             case sheet::DataPilotFieldLayoutMode::TABULAR_LAYOUT:
     415           0 :             sValueStr = GetXMLToken(XML_TABULAR_LAYOUT);
     416           0 :             break;
     417             :             case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP:
     418           0 :             sValueStr = GetXMLToken(XML_OUTLINE_SUBTOTALS_TOP);
     419           0 :             break;
     420             :             case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM:
     421           0 :             sValueStr = GetXMLToken(XML_OUTLINE_SUBTOTALS_BOTTOM);
     422           0 :             break;
     423             :         }
     424           0 :         if (!sValueStr.isEmpty())
     425           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_LAYOUT_MODE, sValueStr);
     426           0 :         SvXMLElementExport aElemDPLLI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_LAYOUT_INFO, true, true);
     427             :     }
     428           0 : }
     429             : 
     430           0 : void ScXMLExportDataPilot::WriteSubTotals(ScDPSaveDimension* pDim)
     431             : {
     432             :     using sheet::GeneralFunction;
     433             : 
     434           0 :     sal_Int32 nSubTotalCount = pDim->GetSubTotalsCount();
     435           0 :     const OUString* pLayoutName = NULL;
     436           0 :     if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     437             :         // Export display names only for 1.2 extended or later.
     438           0 :         pLayoutName = pDim->GetSubtotalName();
     439             : 
     440           0 :     if (nSubTotalCount > 0)
     441             :     {
     442           0 :         SvXMLElementExport aElemSTs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SUBTOTALS, true, true);
     443           0 :         rExport.CheckAttrList();
     444           0 :         for (sal_Int32 nSubTotal = 0; nSubTotal < nSubTotalCount; nSubTotal++)
     445             :         {
     446           0 :             OUString sFunction;
     447           0 :             GeneralFunction nFunc = static_cast<GeneralFunction>(pDim->GetSubTotalFunc(nSubTotal));
     448           0 :             ScXMLConverter::GetStringFromFunction( sFunction, nFunc);
     449           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FUNCTION, sFunction);
     450           0 :             if (pLayoutName && nFunc == sheet::GeneralFunction_AUTO)
     451           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
     452           0 :             SvXMLElementExport aElemST(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SUBTOTAL, true, true);
     453           0 :         }
     454             :     }
     455           0 : }
     456             : 
     457           0 : void ScXMLExportDataPilot::WriteMembers(ScDPSaveDimension* pDim)
     458             : {
     459           0 :     const ScDPSaveDimension::MemberList &rMembers = pDim->GetMembers();
     460           0 :     if (rMembers.begin() != rMembers.end())
     461             :     {
     462           0 :         SvXMLElementExport aElemDPMs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBERS, true, true);
     463           0 :         rExport.CheckAttrList();
     464           0 :         for (ScDPSaveDimension::MemberList::const_iterator i=rMembers.begin(); i != rMembers.end() ; ++i)
     465             :         {
     466           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, OUString((*i)->GetName()));
     467             : 
     468           0 :             if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     469             :             {
     470             :                 // Export display names only for ODF 1.2 extended or later.
     471           0 :                 const OUString* pLayoutName = (*i)->GetLayoutName();
     472           0 :                 if (pLayoutName)
     473           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
     474             :             }
     475             : 
     476           0 :             OUStringBuffer sBuffer;
     477           0 :             ::sax::Converter::convertBool(sBuffer, (*i)->GetIsVisible());
     478           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, sBuffer.makeStringAndClear());
     479           0 :             ::sax::Converter::convertBool(sBuffer, (*i)->GetShowDetails());
     480           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_DETAILS, sBuffer.makeStringAndClear());
     481           0 :             SvXMLElementExport aElemDPM(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBER, true, true);
     482           0 :             rExport.CheckAttrList();
     483           0 :         }
     484             :     }
     485           0 : }
     486             : 
     487           0 : void ScXMLExportDataPilot::WriteLevels(ScDPSaveDimension* pDim)
     488             : {
     489             :     // #i114202# GetShowEmpty is only valid if HasShowEmpty is true.
     490           0 :     if (pDim->HasShowEmpty())
     491             :     {
     492           0 :         OUStringBuffer sBuffer;
     493           0 :         ::sax::Converter::convertBool(sBuffer, pDim->GetShowEmpty());
     494           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_EMPTY, sBuffer.makeStringAndClear());
     495             :     }
     496           0 :     SvXMLElementExport aElemDPL(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_LEVEL, true, true);
     497             : 
     498           0 :     WriteSubTotals(pDim);
     499           0 :     WriteMembers(pDim);
     500           0 :     WriteAutoShowInfo(pDim);
     501           0 :     WriteSortInfo(pDim);
     502           0 :     WriteLayoutInfo(pDim);
     503           0 :     rExport.CheckAttrList();
     504           0 : }
     505             : 
     506           0 : void ScXMLExportDataPilot::WriteDatePart(sal_Int32 nPart)
     507             : {
     508           0 :     switch(nPart)
     509             :     {
     510             :     case com::sun::star::sheet::DataPilotFieldGroupBy::SECONDS :
     511             :         {
     512           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_SECONDS);
     513             :         }
     514           0 :         break;
     515             :     case com::sun::star::sheet::DataPilotFieldGroupBy::MINUTES :
     516             :         {
     517           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_MINUTES);
     518             :         }
     519           0 :         break;
     520             :     case com::sun::star::sheet::DataPilotFieldGroupBy::HOURS :
     521             :         {
     522           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_HOURS);
     523             :         }
     524           0 :         break;
     525             :     case com::sun::star::sheet::DataPilotFieldGroupBy::DAYS :
     526             :         {
     527           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_DAYS);
     528             :         }
     529           0 :         break;
     530             :     case com::sun::star::sheet::DataPilotFieldGroupBy::MONTHS :
     531             :         {
     532           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_MONTHS);
     533             :         }
     534           0 :         break;
     535             :     case com::sun::star::sheet::DataPilotFieldGroupBy::QUARTERS :
     536             :         {
     537           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_QUARTERS);
     538             :         }
     539           0 :         break;
     540             :     case com::sun::star::sheet::DataPilotFieldGroupBy::YEARS :
     541             :         {
     542           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_YEARS);
     543             :         }
     544           0 :         break;
     545             :     }
     546           0 : }
     547             : 
     548           0 : void ScXMLExportDataPilot::WriteNumGroupInfo(const ScDPNumGroupInfo& rGroupInfo)
     549             : {
     550             :     OSL_ENSURE(rGroupInfo.mbEnable, "group dimension should be enabled");
     551           0 :     if (rGroupInfo.mbDateValues)
     552             :     {
     553           0 :         if (rGroupInfo.mbAutoStart)
     554           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_START, XML_AUTO);
     555             :         else
     556             :         {
     557           0 :             OUStringBuffer sDate;
     558           0 :             rExport.GetMM100UnitConverter().convertDateTime(sDate, rGroupInfo.mfStart);
     559           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_START, sDate.makeStringAndClear());
     560             :         }
     561           0 :         if (rGroupInfo.mbAutoEnd)
     562           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_END, XML_AUTO);
     563             :         else
     564             :         {
     565           0 :             OUStringBuffer sDate;
     566           0 :             rExport.GetMM100UnitConverter().convertDateTime(sDate, rGroupInfo.mfEnd);
     567           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_END, sDate.makeStringAndClear());
     568             :         }
     569             :     }
     570             :     else
     571             :     {
     572           0 :         if (rGroupInfo.mbAutoStart)
     573           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_START, XML_AUTO);
     574             :         else
     575             :         {
     576             :             OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfStart,
     577             :                         rtl_math_StringFormat_Automatic,
     578           0 :                         rtl_math_DecimalPlaces_Max, '.', true));
     579           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_START, sValue);
     580             :         }
     581           0 :         if (rGroupInfo.mbAutoEnd)
     582           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_END, XML_AUTO);
     583             :         else
     584             :         {
     585             :             OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfEnd,
     586             :                         rtl_math_StringFormat_Automatic,
     587           0 :                         rtl_math_DecimalPlaces_Max, '.', true));
     588           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_END, sValue);
     589             :         }
     590             :     }
     591             :     OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfStep,
     592             :                 rtl_math_StringFormat_Automatic,
     593           0 :                 rtl_math_DecimalPlaces_Max, '.', true));
     594           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_STEP, sValue);
     595           0 : }
     596             : 
     597           0 : void ScXMLExportDataPilot::WriteGroupDimAttributes(const ScDPSaveGroupDimension* pGroupDim)
     598             : {
     599           0 :     if (pGroupDim)
     600             :     {
     601           0 :         OUString aSrcFieldName = ScDPUtil::getSourceDimensionName(pGroupDim->GetSourceDimName());
     602           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_GROUP_FIELD, XML_TRUE);
     603           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_FIELD_NAME, aSrcFieldName);
     604           0 :         if (pGroupDim->GetDatePart())
     605             :         {
     606           0 :             WriteDatePart(pGroupDim->GetDatePart());
     607           0 :             WriteNumGroupInfo(pGroupDim->GetDateInfo());
     608           0 :         }
     609             :     }
     610           0 : }
     611             : 
     612           0 : void ScXMLExportDataPilot::WriteNumGroupDim(const ScDPSaveNumGroupDimension* pNumGroupDim)
     613             : {
     614           0 :     if (pNumGroupDim)
     615             :     {
     616           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_GROUP_FIELD, XML_TRUE);
     617           0 :         if (pNumGroupDim->GetDatePart())
     618             :         {
     619           0 :             WriteDatePart(pNumGroupDim->GetDatePart());
     620           0 :             WriteNumGroupInfo(pNumGroupDim->GetDateInfo());
     621             :         }
     622             :         else
     623             :         {
     624           0 :             WriteNumGroupInfo(pNumGroupDim->GetInfo());
     625             :         }
     626             :     }
     627           0 : }
     628             : 
     629           0 : void ScXMLExportDataPilot::WriteGroupDimElements(ScDPSaveDimension* pDim, const ScDPDimensionSaveData* pDimData)
     630             : {
     631           0 :     const ScDPSaveGroupDimension* pGroupDim = NULL;
     632           0 :     const ScDPSaveNumGroupDimension* pNumGroupDim = NULL;
     633           0 :     if (pDimData)
     634             :     {
     635           0 :         pGroupDim = pDimData->GetNamedGroupDim(pDim->GetName());
     636           0 :         WriteGroupDimAttributes(pGroupDim);
     637           0 :         pNumGroupDim = pDimData->GetNumGroupDim(pDim->GetName());
     638           0 :         WriteNumGroupDim(pNumGroupDim);
     639             : 
     640             :         OSL_ENSURE((!pGroupDim || !pNumGroupDim), "there should be no NumGroup and Group at the same field");
     641             :     }
     642           0 :     if (pGroupDim || pNumGroupDim)
     643             :     {
     644           0 :         SvXMLElementExport aElemDPGs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_GROUPS, true, true);
     645           0 :         if (pGroupDim)
     646             :         {
     647           0 :             if (!pGroupDim->GetDatePart())
     648             :             {
     649           0 :                 sal_Int32 nCount = pGroupDim->GetGroupCount();
     650           0 :                 for (sal_Int32 i = 0; i < nCount; ++i)
     651             :                 {
     652           0 :                     const ScDPSaveGroupItem* pGroup = pGroupDim->GetGroupByIndex( i );
     653           0 :                     if (pGroup)
     654             :                     {
     655           0 :                         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, pGroup->GetGroupName());
     656           0 :                         SvXMLElementExport aElemDPG(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_GROUP, true, true);
     657           0 :                         sal_Int32 nElemCount = pGroup->GetElementCount();
     658           0 :                         for(sal_Int32 j = 0; j < nElemCount; ++j)
     659             :                         {
     660           0 :                             const OUString* pElem = pGroup->GetElementByIndex(j);
     661           0 :                             if (pElem)
     662             :                             {
     663           0 :                                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, *pElem);
     664           0 :                                 SvXMLElementExport aElemDPM(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBER, true, true);
     665             :                             }
     666           0 :                         }
     667             :                     }
     668             :                 }
     669             :             }
     670           0 :         }
     671             :     }
     672           0 : }
     673             : 
     674           0 : void ScXMLExportDataPilot::WriteDimension(ScDPSaveDimension* pDim, const ScDPDimensionSaveData* pDimData)
     675             : {
     676           0 :     OUString aSrcDimName = ScDPUtil::getSourceDimensionName(pDim->GetName());
     677           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_FIELD_NAME, aSrcDimName);
     678           0 :     if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     679             :     {
     680             :         // Export display names only for ODF 1.2 extended or later.
     681           0 :         const OUString* pLayoutName = pDim->GetLayoutName();
     682           0 :         if (pLayoutName)
     683           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
     684             :     }
     685             : 
     686           0 :     if (pDim->IsDataLayout())
     687           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_DATA_LAYOUT_FIELD, XML_TRUE);
     688           0 :     OUString sValueStr;
     689             :     ScXMLConverter::GetStringFromOrientation( sValueStr,
     690           0 :         (sheet::DataPilotFieldOrientation) pDim->GetOrientation() );
     691           0 :     if( !sValueStr.isEmpty() )
     692           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORIENTATION, sValueStr );
     693           0 :     if (pDim->GetUsedHierarchy() != 1)
     694             :     {
     695           0 :         OUStringBuffer sBuffer;
     696           0 :         ::sax::Converter::convertNumber(sBuffer, pDim->GetUsedHierarchy());
     697           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_USED_HIERARCHY, sBuffer.makeStringAndClear());
     698             :     }
     699             :     ScXMLConverter::GetStringFromFunction( sValueStr,
     700           0 :         (sheet::GeneralFunction) pDim->GetFunction() );
     701           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FUNCTION, sValueStr);
     702             : 
     703           0 :     SvXMLElementExport aElemDPF(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_FIELD, true, true);
     704           0 :     WriteFieldReference(pDim);
     705           0 :     WriteLevels(pDim);
     706           0 :     if( pDim->GetOrientation() != sheet::DataPilotFieldOrientation_DATA )
     707           0 :         WriteGroupDimElements(pDim, pDimData);
     708           0 : }
     709             : 
     710           0 : void ScXMLExportDataPilot::WriteDimensions(ScDPSaveData* pDPSave)
     711             : {
     712           0 :     const boost::ptr_vector<ScDPSaveDimension> &rDimensions = pDPSave->GetDimensions();
     713           0 :     boost::ptr_vector<ScDPSaveDimension>::const_iterator iter;
     714           0 :     for (iter = rDimensions.begin(); iter != rDimensions.end(); ++iter)
     715           0 :         WriteDimension(const_cast<ScDPSaveDimension*>(&(*iter)), pDPSave->GetExistingDimensionData());
     716           0 : }
     717             : 
     718           0 : void ScXMLExportDataPilot::WriteGrandTotal(::xmloff::token::XMLTokenEnum eOrient, bool bVisible, const OUString* pGrandTotal)
     719             : {
     720           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, bVisible ? XML_TRUE : XML_FALSE);
     721           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORIENTATION, eOrient);
     722           0 :     if (pGrandTotal)
     723           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pGrandTotal);
     724             : 
     725           0 :     SvXMLElementExport aElemGrandTotal(rExport, XML_NAMESPACE_TABLE_EXT, XML_DATA_PILOT_GRAND_TOTAL, true, true);
     726           0 : }
     727             : 
     728          18 : void ScXMLExportDataPilot::WriteDataPilots(const uno::Reference <sheet::XSpreadsheetDocument>& /* xSpreadDoc */)
     729             : {
     730          18 :     pDoc = rExport.GetDocument();
     731          18 :     if (!pDoc)
     732          18 :         return;
     733             : 
     734          18 :     ScDPCollection* pDPs = pDoc->GetDPCollection();
     735          18 :     if (!pDPs)
     736           0 :         return;
     737             : 
     738          18 :     size_t nDPCount = pDPs->GetCount();
     739          18 :     if (!nDPCount)
     740          18 :         return;
     741             : 
     742           0 :     SvXMLElementExport aElemDPs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_TABLES, true, true);
     743           0 :     rExport.CheckAttrList();
     744           0 :     for (size_t i = 0; i < nDPCount; ++i)
     745             :     {
     746           0 :         ScDPSaveData* pDPSave = (*pDPs)[i]->GetSaveData();
     747           0 :         if (!pDPSave)
     748           0 :             continue;
     749             : 
     750           0 :         ScRange aOutRange((*pDPs)[i]->GetOutRange());
     751           0 :         OUString sTargetRangeAddress;
     752           0 :         ScRangeStringConverter::GetStringFromRange( sTargetRangeAddress, aOutRange, pDoc, ::formula::FormulaGrammar::CONV_OOO );
     753           0 :         ScDocAttrIterator aAttrItr(pDoc, aOutRange.aStart.Tab(),
     754           0 :             aOutRange.aStart.Col(), aOutRange.aStart.Row(),
     755           0 :             aOutRange.aEnd.Col(), aOutRange.aEnd.Row());
     756             :         SCCOL nCol;
     757             :         SCROW nRow1, nRow2;
     758           0 :         OUString sOUButtonList;
     759           0 :         const ScPatternAttr* pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
     760           0 :         while (pAttr)
     761             :         {
     762           0 :             ScMergeFlagAttr& rItem = (ScMergeFlagAttr&)pAttr->GetItem(ATTR_MERGE_FLAG);
     763           0 :             if (rItem.HasPivotButton())
     764             :             {
     765           0 :                 for (SCROW nButtonRow = nRow1; nButtonRow <= nRow2; ++nButtonRow)
     766             :                 {
     767           0 :                     ScAddress aButtonAddr(nCol, nButtonRow, aOutRange.aStart.Tab());
     768             :                     ScRangeStringConverter::GetStringFromAddress(
     769           0 :                         sOUButtonList, aButtonAddr, pDoc, ::formula::FormulaGrammar::CONV_OOO, ' ', true );
     770             :                 }
     771             :             }
     772           0 :             pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
     773             :         }
     774           0 :         OUString sName((*pDPs)[i]->GetName());
     775           0 :         OUString sApplicationData((*pDPs)[i]->GetTag());
     776           0 :         bool bRowGrand = pDPSave->GetRowGrand();
     777           0 :         bool bColumnGrand = pDPSave->GetColumnGrand();
     778           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, sName);
     779           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_APPLICATION_DATA, sApplicationData);
     780           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, sTargetRangeAddress);
     781           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_BUTTONS, sOUButtonList);
     782           0 :         if (!(bRowGrand && bColumnGrand))
     783             :         {
     784           0 :             if (bRowGrand)
     785           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_ROW);
     786           0 :             else if (bColumnGrand)
     787           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_COLUMN);
     788             :             else
     789           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_NONE);
     790             :         }
     791           0 :         if (pDPSave->GetIgnoreEmptyRows())
     792           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IGNORE_EMPTY_ROWS, XML_TRUE);
     793           0 :         if (pDPSave->GetRepeatIfEmpty())
     794           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IDENTIFY_CATEGORIES, XML_TRUE);
     795           0 :         if (!pDPSave->GetFilterButton())
     796           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_FILTER_BUTTON, XML_FALSE);
     797           0 :         if (!pDPSave->GetDrillDown())
     798           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DRILL_DOWN_ON_DOUBLE_CLICK, XML_FALSE);
     799           0 :         if ((*pDPs)[i]->GetHeaderLayout())
     800           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_HEADER_GRID_LAYOUT, XML_TRUE);
     801             : 
     802           0 :         SvXMLElementExport aElemDP(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_TABLE, true, true);
     803             : 
     804             :         // grand total elements.
     805             : 
     806           0 :         const OUString* pGrandTotalName = pDPSave->GetGrandTotalName();
     807           0 :         if (pGrandTotalName && rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     808             :         {
     809             :             // Use the new data-pilot-grand-total element.
     810           0 :             if (bRowGrand && bColumnGrand)
     811             :             {
     812           0 :                 WriteGrandTotal(XML_BOTH, true, pGrandTotalName);
     813             :             }
     814             :             else
     815             :             {
     816           0 :                 WriteGrandTotal(XML_ROW, bRowGrand, pGrandTotalName);
     817           0 :                 WriteGrandTotal(XML_COLUMN, bColumnGrand, pGrandTotalName);
     818             :             }
     819             :         }
     820             : 
     821           0 :         rExport.CheckAttrList();
     822           0 :         if ((*pDPs)[i]->IsSheetData())
     823             :         {
     824           0 :             const ScSheetSourceDesc* pSheetSource = (*pDPs)[i]->GetSheetDesc();
     825             : 
     826           0 :             if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     827             :             {
     828           0 :                 if (pSheetSource->HasRangeName())
     829             :                     rExport.AddAttribute(
     830           0 :                         XML_NAMESPACE_TABLE, XML_NAME, pSheetSource->GetRangeName());
     831             :             }
     832             : 
     833           0 :             OUString sCellRangeAddress;
     834             :             ScRangeStringConverter::GetStringFromRange(
     835           0 :                 sCellRangeAddress, pSheetSource->GetSourceRange(), pDoc,
     836           0 :                 ::formula::FormulaGrammar::CONV_OOO);
     837             : 
     838           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, sCellRangeAddress);
     839           0 :             SvXMLElementExport aElemSCR(rExport, XML_NAMESPACE_TABLE, XML_SOURCE_CELL_RANGE, true, true);
     840           0 :             rExport.CheckAttrList();
     841           0 :             WriteDPFilter(pSheetSource->GetQueryParam());
     842             :         }
     843           0 :         else if ((*pDPs)[i]->IsImportData())
     844             :         {
     845           0 :             const ScImportSourceDesc* pImpSource = (*pDPs)[i]->GetImportSourceDesc();
     846           0 :             switch (pImpSource->nType)
     847             :             {
     848           0 :                 case sheet::DataImportMode_NONE : break;
     849             :                 case sheet::DataImportMode_QUERY :
     850             :                 {
     851           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
     852           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_QUERY_NAME, pImpSource->aObject);
     853           0 :                     SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_QUERY, true, true);
     854           0 :                     rExport.CheckAttrList();
     855             :                 }
     856           0 :                 break;
     857             :                 case sheet::DataImportMode_TABLE :
     858             :                 {
     859           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
     860           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TABLE_NAME, pImpSource->aObject);
     861           0 :                     SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_TABLE, true, true);
     862           0 :                     rExport.CheckAttrList();
     863             :                 }
     864           0 :                 break;
     865             :                 case sheet::DataImportMode_SQL :
     866             :                 {
     867           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
     868           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SQL_STATEMENT, pImpSource->aObject);
     869           0 :                     if (!pImpSource->bNative)
     870           0 :                         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_PARSE_SQL_STATEMENT, XML_TRUE);
     871           0 :                     SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_SQL, true, true);
     872           0 :                     rExport.CheckAttrList();
     873             :                 }
     874           0 :                 break;
     875             :             }
     876             :         }
     877           0 :         else if ((*pDPs)[i]->IsServiceData())
     878             :         {
     879           0 :             const ScDPServiceDesc* pServSource = (*pDPs)[i]->GetDPServiceDesc();
     880           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, pServSource->aServiceName);
     881           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_NAME, pServSource->aParSource);
     882           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OBJECT_NAME, pServSource->aParName);
     883           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_USER_NAME, pServSource->aParUser);
     884             :             // #i111754# leave out password attribute as long as DataPilotSource doesn't specify the content
     885             :             // rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_PASSWORD, OUString(pServSource->aParPass));
     886           0 :             SvXMLElementExport aElemSD(rExport, XML_NAMESPACE_TABLE, XML_SOURCE_SERVICE, true, true);
     887           0 :             rExport.CheckAttrList();
     888             :         }
     889           0 :         WriteDimensions(pDPSave);
     890           0 :     }
     891         102 : }
     892             : 
     893             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10