LCOV - code coverage report
Current view: top level - sc/source/filter/xml - XMLExportDataPilot.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 15 504 3.0 %
Date: 2015-06-13 12:38:46 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          29 : ScXMLExportDataPilot::ScXMLExportDataPilot(ScXMLExport& rTempExport)
      59             :     : rExport(rTempExport),
      60          29 :     pDoc( NULL )
      61             : {
      62          29 : }
      63             : 
      64          29 : ScXMLExportDataPilot::~ScXMLExportDataPilot()
      65             : {
      66          29 : }
      67             : 
      68           0 : OUString ScXMLExportDataPilot::getDPOperatorXML(
      69             :     const ScQueryOp aFilterOperator, const bool bUseRegularExpressions)
      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 :                 if (!sConditionRange.isEmpty())
     182           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION_SOURCE_RANGE_ADDRESS, sConditionRange);
     183             :             }
     184           0 :             if (!aQueryParam.bDuplicate)
     185           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_DUPLICATES, XML_FALSE);
     186           0 :             SvXMLElementExport aElemDPF(rExport, XML_NAMESPACE_TABLE, XML_FILTER, true, true);
     187           0 :             rExport.CheckAttrList();
     188           0 :             if (nQueryEntryCount  == 1)
     189             :             {
     190           0 :                     WriteDPCondition(aQueryParam.GetEntry(0), aQueryParam.bCaseSens, aQueryParam.bRegExp);
     191             :             }
     192           0 :             else if (bOr && !bAnd)
     193             :             {
     194           0 :                 SvXMLElementExport aElemOr(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, true, true);
     195           0 :                 for (j = 0; j < nQueryEntryCount; ++j)
     196             :                 {
     197           0 :                     WriteDPCondition(aQueryParam.GetEntry(j), aQueryParam.bCaseSens, aQueryParam.bRegExp);
     198           0 :                 }
     199             :             }
     200           0 :             else if (bAnd && !bOr)
     201             :             {
     202           0 :                 SvXMLElementExport aElemAnd(rExport, XML_NAMESPACE_TABLE, XML_FILTER_AND, true, true);
     203           0 :                 for (j = 0; j < nQueryEntryCount; ++j)
     204             :                 {
     205           0 :                     WriteDPCondition(aQueryParam.GetEntry(j), aQueryParam.bCaseSens, aQueryParam.bRegExp);
     206           0 :                 }
     207             :             }
     208             :             else
     209             :             {
     210           0 :                 SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, true, true);
     211           0 :                 ScQueryEntry aPrevFilterField(aQueryParam.GetEntry(0));
     212           0 :                 ScQueryConnect aConnection = aQueryParam.GetEntry(1).eConnect;
     213             :                 bool bOpenAndElement;
     214           0 :                 OUString aName(rExport.GetNamespaceMap().GetQNameByKey(XML_NAMESPACE_TABLE, GetXMLToken(XML_FILTER_AND)));
     215           0 :                 if (aConnection == SC_AND)
     216             :                 {
     217           0 :                     rExport.StartElement( aName, true );
     218           0 :                     bOpenAndElement = true;
     219             :                 }
     220             :                 else
     221           0 :                     bOpenAndElement = false;
     222           0 :                 for (j = 1; j < nQueryEntryCount; ++j)
     223             :                 {
     224           0 :                     if (aConnection != aQueryParam.GetEntry(j).eConnect)
     225             :                     {
     226           0 :                         aConnection = aQueryParam.GetEntry(j).eConnect;
     227           0 :                         if (aQueryParam.GetEntry(j).eConnect == SC_AND)
     228             :                         {
     229           0 :                             rExport.StartElement( aName, true );
     230           0 :                             bOpenAndElement = true;
     231           0 :                             WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     232           0 :                             aPrevFilterField = aQueryParam.GetEntry(j);
     233           0 :                             if (j == nQueryEntryCount - 1)
     234             :                             {
     235           0 :                                 WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     236           0 :                                 rExport.EndElement(aName, true);
     237           0 :                                 bOpenAndElement = false;
     238             :                             }
     239             :                         }
     240             :                         else
     241             :                         {
     242           0 :                             WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     243           0 :                             aPrevFilterField = aQueryParam.GetEntry(j);
     244           0 :                             if (bOpenAndElement)
     245             :                             {
     246           0 :                                 rExport.EndElement(aName, true);
     247           0 :                                 bOpenAndElement = false;
     248             :                             }
     249           0 :                             if (j == nQueryEntryCount - 1)
     250             :                             {
     251           0 :                                 WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     252             :                             }
     253             :                         }
     254             :                     }
     255             :                     else
     256             :                     {
     257           0 :                         WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     258           0 :                         aPrevFilterField = aQueryParam.GetEntry(j);
     259           0 :                         if (j == nQueryEntryCount - 1)
     260           0 :                             WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
     261             :                     }
     262           0 :                 }
     263           0 :             }
     264             :         }
     265             :     }
     266           0 : }
     267             : 
     268           0 : void ScXMLExportDataPilot::WriteFieldReference(ScDPSaveDimension* pDim)
     269             : {
     270           0 :     const sheet::DataPilotFieldReference* pRef = pDim->GetReferenceValue();
     271           0 :     if (pRef)
     272             :     {
     273           0 :         OUString sValueStr;
     274           0 :         switch (pRef->ReferenceType)
     275             :         {
     276             :             case sheet::DataPilotFieldReferenceType::NONE :
     277           0 :                 sValueStr = GetXMLToken(XML_NONE);
     278           0 :                 break;
     279             :             case sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE :
     280           0 :                 sValueStr = GetXMLToken(XML_MEMBER_DIFFERENCE);
     281           0 :                 break;
     282             :             case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE :
     283           0 :                 sValueStr = GetXMLToken(XML_MEMBER_PERCENTAGE);
     284           0 :                 break;
     285             :             case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE :
     286           0 :                 sValueStr = GetXMLToken(XML_MEMBER_PERCENTAGE_DIFFERENCE);
     287           0 :                 break;
     288             :             case sheet::DataPilotFieldReferenceType::RUNNING_TOTAL :
     289           0 :                 sValueStr = GetXMLToken(XML_RUNNING_TOTAL);
     290           0 :                 break;
     291             :             case sheet::DataPilotFieldReferenceType::ROW_PERCENTAGE :
     292           0 :                 sValueStr = GetXMLToken(XML_ROW_PERCENTAGE);
     293           0 :                 break;
     294             :             case sheet::DataPilotFieldReferenceType::COLUMN_PERCENTAGE :
     295           0 :                 sValueStr = GetXMLToken(XML_COLUMN_PERCENTAGE);
     296           0 :                 break;
     297             :             case sheet::DataPilotFieldReferenceType::TOTAL_PERCENTAGE :
     298           0 :                 sValueStr = GetXMLToken(XML_TOTAL_PERCENTAGE);
     299           0 :                 break;
     300             :             case sheet::DataPilotFieldReferenceType::INDEX :
     301           0 :                 sValueStr = GetXMLToken(XML_INDEX);
     302           0 :                 break;
     303             :         }
     304           0 :         if (!sValueStr.isEmpty())
     305           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TYPE, sValueStr);
     306             : 
     307           0 :         if (!pRef->ReferenceField.isEmpty())
     308           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NAME, pRef->ReferenceField);
     309             : 
     310           0 :         if (pRef->ReferenceItemType == sheet::DataPilotFieldReferenceItemType::NAMED)
     311             :         {
     312           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_TYPE, XML_NAMED);
     313           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_NAME, pRef->ReferenceItemName);
     314             :         }
     315             :         else
     316             :         {
     317           0 :             sValueStr.clear();
     318           0 :             switch(pRef->ReferenceItemType)
     319             :             {
     320             :                 case sheet::DataPilotFieldReferenceItemType::PREVIOUS :
     321           0 :                 sValueStr = GetXMLToken(XML_PREVIOUS);
     322           0 :                 break;
     323             :                 case sheet::DataPilotFieldReferenceItemType::NEXT :
     324           0 :                 sValueStr = GetXMLToken(XML_NEXT);
     325           0 :                 break;
     326             :             }
     327           0 :             if (!sValueStr.isEmpty())
     328           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_TYPE, sValueStr);
     329             :         }
     330           0 :         SvXMLElementExport aElemDPFR(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_FIELD_REFERENCE, true, true);
     331             :     }
     332           0 :     rExport.CheckAttrList();
     333           0 : }
     334             : 
     335           0 : void ScXMLExportDataPilot::WriteSortInfo(ScDPSaveDimension* pDim)
     336             : {
     337           0 :     const sheet::DataPilotFieldSortInfo* pSortInfo = pDim->GetSortInfo();
     338           0 :     if (pSortInfo)
     339             :     {
     340           0 :         if (pSortInfo->IsAscending)
     341           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORDER, XML_ASCENDING);
     342             :         else
     343           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORDER, XML_DESCENDING);
     344             : 
     345           0 :         OUString sValueStr;
     346           0 :         switch (pSortInfo->Mode)
     347             :         {
     348             :             case sheet::DataPilotFieldSortMode::NONE:
     349           0 :             sValueStr = GetXMLToken(XML_NONE);
     350           0 :             break;
     351             :             case sheet::DataPilotFieldSortMode::MANUAL:
     352           0 :             sValueStr = GetXMLToken(XML_MANUAL);
     353           0 :             break;
     354             :             case sheet::DataPilotFieldSortMode::NAME:
     355           0 :             sValueStr = GetXMLToken(XML_NAME);
     356           0 :             break;
     357             :             case sheet::DataPilotFieldSortMode::DATA:
     358           0 :             sValueStr = GetXMLToken(XML_DATA);
     359           0 :             if (!pSortInfo->Field.isEmpty())
     360           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_FIELD, pSortInfo->Field);
     361           0 :             break;
     362             :         }
     363           0 :         if (!sValueStr.isEmpty())
     364           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SORT_MODE, sValueStr);
     365           0 :         SvXMLElementExport aElemDPLSI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SORT_INFO, true, true);
     366             :     }
     367           0 : }
     368             : 
     369           0 : void ScXMLExportDataPilot::WriteAutoShowInfo(ScDPSaveDimension* pDim)
     370             : {
     371           0 :     const sheet::DataPilotFieldAutoShowInfo* pAutoInfo = pDim->GetAutoShowInfo();
     372           0 :     if (pAutoInfo)
     373             :     {
     374           0 :         if (pAutoInfo->IsEnabled)
     375           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ENABLED, XML_TRUE);
     376             :         else
     377           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ENABLED, XML_FALSE);
     378             : 
     379           0 :         OUString sValueStr;
     380           0 :         switch (pAutoInfo->ShowItemsMode)
     381             :         {
     382             :             case sheet::DataPilotFieldShowItemsMode::FROM_TOP:
     383           0 :             sValueStr = GetXMLToken(XML_FROM_TOP);
     384           0 :             break;
     385             :             case sheet::DataPilotFieldShowItemsMode::FROM_BOTTOM:
     386           0 :             sValueStr = GetXMLToken(XML_FROM_BOTTOM);
     387           0 :             break;
     388             :         }
     389           0 :         if (!sValueStr.isEmpty())
     390           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_MEMBER_MODE, sValueStr);
     391             : 
     392           0 :         OUStringBuffer sBuffer;
     393           0 :         ::sax::Converter::convertNumber(sBuffer, pAutoInfo->ItemCount);
     394           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_COUNT, sBuffer.makeStringAndClear());
     395             : 
     396           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_FIELD, pAutoInfo->DataField);
     397             : 
     398           0 :         SvXMLElementExport aElemDPLAI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_DISPLAY_INFO, true, true);
     399             :     }
     400           0 : }
     401             : 
     402           0 : void ScXMLExportDataPilot::WriteLayoutInfo(ScDPSaveDimension* pDim)
     403             : {
     404           0 :     const sheet::DataPilotFieldLayoutInfo* pLayoutInfo = pDim->GetLayoutInfo();
     405           0 :     if (pLayoutInfo)
     406             :     {
     407           0 :         if (pLayoutInfo->AddEmptyLines)
     408           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ADD_EMPTY_LINES, XML_TRUE);
     409             :         else
     410           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ADD_EMPTY_LINES, XML_FALSE);
     411             : 
     412           0 :         OUString sValueStr;
     413           0 :         switch (pLayoutInfo->LayoutMode)
     414             :         {
     415             :             case sheet::DataPilotFieldLayoutMode::TABULAR_LAYOUT:
     416           0 :             sValueStr = GetXMLToken(XML_TABULAR_LAYOUT);
     417           0 :             break;
     418             :             case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP:
     419           0 :             sValueStr = GetXMLToken(XML_OUTLINE_SUBTOTALS_TOP);
     420           0 :             break;
     421             :             case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM:
     422           0 :             sValueStr = GetXMLToken(XML_OUTLINE_SUBTOTALS_BOTTOM);
     423           0 :             break;
     424             :         }
     425           0 :         if (!sValueStr.isEmpty())
     426           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_LAYOUT_MODE, sValueStr);
     427           0 :         SvXMLElementExport aElemDPLLI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_LAYOUT_INFO, true, true);
     428             :     }
     429           0 : }
     430             : 
     431           0 : void ScXMLExportDataPilot::WriteSubTotals(ScDPSaveDimension* pDim)
     432             : {
     433             :     using sheet::GeneralFunction;
     434             : 
     435           0 :     sal_Int32 nSubTotalCount = pDim->GetSubTotalsCount();
     436           0 :     const OUString* pLayoutName = NULL;
     437           0 :     if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     438             :         // Export display names only for 1.2 extended or later.
     439           0 :         pLayoutName = pDim->GetSubtotalName();
     440             : 
     441           0 :     if (nSubTotalCount > 0)
     442             :     {
     443           0 :         SvXMLElementExport aElemSTs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SUBTOTALS, true, true);
     444           0 :         rExport.CheckAttrList();
     445           0 :         for (sal_Int32 nSubTotal = 0; nSubTotal < nSubTotalCount; nSubTotal++)
     446             :         {
     447           0 :             OUString sFunction;
     448           0 :             GeneralFunction nFunc = static_cast<GeneralFunction>(pDim->GetSubTotalFunc(nSubTotal));
     449           0 :             ScXMLConverter::GetStringFromFunction( sFunction, nFunc);
     450           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FUNCTION, sFunction);
     451           0 :             if (pLayoutName && nFunc == sheet::GeneralFunction_AUTO)
     452           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
     453           0 :             SvXMLElementExport aElemST(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SUBTOTAL, true, true);
     454           0 :         }
     455             :     }
     456           0 : }
     457             : 
     458           0 : void ScXMLExportDataPilot::WriteMembers(ScDPSaveDimension* pDim)
     459             : {
     460           0 :     const ScDPSaveDimension::MemberList &rMembers = pDim->GetMembers();
     461           0 :     if (rMembers.begin() != rMembers.end())
     462             :     {
     463           0 :         SvXMLElementExport aElemDPMs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBERS, true, true);
     464           0 :         rExport.CheckAttrList();
     465           0 :         for (ScDPSaveDimension::MemberList::const_iterator i=rMembers.begin(); i != rMembers.end() ; ++i)
     466             :         {
     467           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, OUString((*i)->GetName()));
     468             : 
     469           0 :             if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     470             :             {
     471             :                 // Export display names only for ODF 1.2 extended or later.
     472           0 :                 const OUString* pLayoutName = (*i)->GetLayoutName();
     473           0 :                 if (pLayoutName)
     474           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
     475             :             }
     476             : 
     477           0 :             OUStringBuffer sBuffer;
     478           0 :             ::sax::Converter::convertBool(sBuffer, (*i)->GetIsVisible());
     479           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, sBuffer.makeStringAndClear());
     480           0 :             ::sax::Converter::convertBool(sBuffer, (*i)->GetShowDetails());
     481           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_DETAILS, sBuffer.makeStringAndClear());
     482           0 :             SvXMLElementExport aElemDPM(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBER, true, true);
     483           0 :             rExport.CheckAttrList();
     484           0 :         }
     485             :     }
     486           0 : }
     487             : 
     488           0 : void ScXMLExportDataPilot::WriteLevels(ScDPSaveDimension* pDim)
     489             : {
     490             :     // #i114202# GetShowEmpty is only valid if HasShowEmpty is true.
     491           0 :     if (pDim->HasShowEmpty())
     492             :     {
     493           0 :         OUStringBuffer sBuffer;
     494           0 :         ::sax::Converter::convertBool(sBuffer, pDim->GetShowEmpty());
     495           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_EMPTY, sBuffer.makeStringAndClear());
     496             :     }
     497             :     {
     498           0 :         OUStringBuffer sBuffer;
     499           0 :         ::sax::Converter::convertBool(sBuffer, pDim->GetRepeatItemLabels());
     500           0 :         rExport.AddAttribute(XML_NAMESPACE_CALC_EXT, XML_REPEAT_ITEM_LABELS, sBuffer.makeStringAndClear());
     501             :     }
     502           0 :     SvXMLElementExport aElemDPL(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_LEVEL, true, true);
     503             : 
     504           0 :     WriteSubTotals(pDim);
     505           0 :     WriteMembers(pDim);
     506           0 :     WriteAutoShowInfo(pDim);
     507           0 :     WriteSortInfo(pDim);
     508           0 :     WriteLayoutInfo(pDim);
     509           0 :     rExport.CheckAttrList();
     510           0 : }
     511             : 
     512           0 : void ScXMLExportDataPilot::WriteDatePart(sal_Int32 nPart)
     513             : {
     514           0 :     switch(nPart)
     515             :     {
     516             :     case com::sun::star::sheet::DataPilotFieldGroupBy::SECONDS :
     517             :         {
     518           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_SECONDS);
     519             :         }
     520           0 :         break;
     521             :     case com::sun::star::sheet::DataPilotFieldGroupBy::MINUTES :
     522             :         {
     523           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_MINUTES);
     524             :         }
     525           0 :         break;
     526             :     case com::sun::star::sheet::DataPilotFieldGroupBy::HOURS :
     527             :         {
     528           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_HOURS);
     529             :         }
     530           0 :         break;
     531             :     case com::sun::star::sheet::DataPilotFieldGroupBy::DAYS :
     532             :         {
     533           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_DAYS);
     534             :         }
     535           0 :         break;
     536             :     case com::sun::star::sheet::DataPilotFieldGroupBy::MONTHS :
     537             :         {
     538           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_MONTHS);
     539             :         }
     540           0 :         break;
     541             :     case com::sun::star::sheet::DataPilotFieldGroupBy::QUARTERS :
     542             :         {
     543           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_QUARTERS);
     544             :         }
     545           0 :         break;
     546             :     case com::sun::star::sheet::DataPilotFieldGroupBy::YEARS :
     547             :         {
     548           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_YEARS);
     549             :         }
     550           0 :         break;
     551             :     }
     552           0 : }
     553             : 
     554           0 : void ScXMLExportDataPilot::WriteNumGroupInfo(const ScDPNumGroupInfo& rGroupInfo)
     555             : {
     556             :     OSL_ENSURE(rGroupInfo.mbEnable, "group dimension should be enabled");
     557           0 :     if (rGroupInfo.mbDateValues)
     558             :     {
     559           0 :         if (rGroupInfo.mbAutoStart)
     560           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_START, XML_AUTO);
     561             :         else
     562             :         {
     563           0 :             OUStringBuffer sDate;
     564           0 :             rExport.GetMM100UnitConverter().convertDateTime(sDate, rGroupInfo.mfStart);
     565           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_START, sDate.makeStringAndClear());
     566             :         }
     567           0 :         if (rGroupInfo.mbAutoEnd)
     568           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_END, XML_AUTO);
     569             :         else
     570             :         {
     571           0 :             OUStringBuffer sDate;
     572           0 :             rExport.GetMM100UnitConverter().convertDateTime(sDate, rGroupInfo.mfEnd);
     573           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_END, sDate.makeStringAndClear());
     574             :         }
     575             :     }
     576             :     else
     577             :     {
     578           0 :         if (rGroupInfo.mbAutoStart)
     579           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_START, XML_AUTO);
     580             :         else
     581             :         {
     582             :             OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfStart,
     583             :                         rtl_math_StringFormat_Automatic,
     584           0 :                         rtl_math_DecimalPlaces_Max, '.', true));
     585           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_START, sValue);
     586             :         }
     587           0 :         if (rGroupInfo.mbAutoEnd)
     588           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_END, XML_AUTO);
     589             :         else
     590             :         {
     591             :             OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfEnd,
     592             :                         rtl_math_StringFormat_Automatic,
     593           0 :                         rtl_math_DecimalPlaces_Max, '.', true));
     594           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_END, sValue);
     595             :         }
     596             :     }
     597             :     OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfStep,
     598             :                 rtl_math_StringFormat_Automatic,
     599           0 :                 rtl_math_DecimalPlaces_Max, '.', true));
     600           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_STEP, sValue);
     601           0 : }
     602             : 
     603           0 : void ScXMLExportDataPilot::WriteGroupDimAttributes(const ScDPSaveGroupDimension* pGroupDim)
     604             : {
     605           0 :     if (pGroupDim)
     606             :     {
     607           0 :         OUString aSrcFieldName = ScDPUtil::getSourceDimensionName(pGroupDim->GetSourceDimName());
     608           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_FIELD_NAME, aSrcFieldName);
     609           0 :         if (pGroupDim->GetDatePart())
     610             :         {
     611           0 :             WriteDatePart(pGroupDim->GetDatePart());
     612           0 :             WriteNumGroupInfo(pGroupDim->GetDateInfo());
     613           0 :         }
     614             :     }
     615           0 : }
     616             : 
     617           0 : void ScXMLExportDataPilot::WriteNumGroupDim(const ScDPSaveNumGroupDimension* pNumGroupDim)
     618             : {
     619           0 :     if (pNumGroupDim)
     620             :     {
     621           0 :         if (pNumGroupDim->GetDatePart())
     622             :         {
     623           0 :             WriteDatePart(pNumGroupDim->GetDatePart());
     624           0 :             WriteNumGroupInfo(pNumGroupDim->GetDateInfo());
     625             :         }
     626             :         else
     627             :         {
     628           0 :             WriteNumGroupInfo(pNumGroupDim->GetInfo());
     629             :         }
     630             :     }
     631           0 : }
     632             : 
     633           0 : void ScXMLExportDataPilot::WriteGroupDimElements(ScDPSaveDimension* pDim, const ScDPDimensionSaveData* pDimData)
     634             : {
     635           0 :     const ScDPSaveGroupDimension* pGroupDim = NULL;
     636           0 :     const ScDPSaveNumGroupDimension* pNumGroupDim = NULL;
     637           0 :     if (pDimData)
     638             :     {
     639           0 :         pGroupDim = pDimData->GetNamedGroupDim(pDim->GetName());
     640           0 :         WriteGroupDimAttributes(pGroupDim);
     641           0 :         pNumGroupDim = pDimData->GetNumGroupDim(pDim->GetName());
     642           0 :         WriteNumGroupDim(pNumGroupDim);
     643             : 
     644             :         OSL_ENSURE((!pGroupDim || !pNumGroupDim), "there should be no NumGroup and Group at the same field");
     645             :     }
     646           0 :     if (pGroupDim || pNumGroupDim)
     647             :     {
     648           0 :         SvXMLElementExport aElemDPGs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_GROUPS, true, true);
     649           0 :         if (pGroupDim)
     650             :         {
     651           0 :             if (!pGroupDim->GetDatePart())
     652             :             {
     653           0 :                 sal_Int32 nCount = pGroupDim->GetGroupCount();
     654           0 :                 for (sal_Int32 i = 0; i < nCount; ++i)
     655             :                 {
     656           0 :                     const ScDPSaveGroupItem* pGroup = pGroupDim->GetGroupByIndex( i );
     657           0 :                     if (pGroup)
     658             :                     {
     659           0 :                         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, pGroup->GetGroupName());
     660           0 :                         SvXMLElementExport aElemDPG(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_GROUP, true, true);
     661           0 :                         sal_Int32 nElemCount = pGroup->GetElementCount();
     662           0 :                         for(sal_Int32 j = 0; j < nElemCount; ++j)
     663             :                         {
     664           0 :                             const OUString* pElem = pGroup->GetElementByIndex(j);
     665           0 :                             if (pElem)
     666             :                             {
     667           0 :                                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, *pElem);
     668           0 :                                 SvXMLElementExport aElemDPM(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_GROUP_MEMBER, true, true);
     669             :                             }
     670           0 :                         }
     671             :                     }
     672             :                 }
     673             :             }
     674           0 :         }
     675             :     }
     676           0 : }
     677             : 
     678           0 : void ScXMLExportDataPilot::WriteDimension(ScDPSaveDimension* pDim, const ScDPDimensionSaveData* pDimData)
     679             : {
     680           0 :     OUString aSrcDimName = ScDPUtil::getSourceDimensionName(pDim->GetName());
     681           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_FIELD_NAME, aSrcDimName);
     682           0 :     if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     683             :     {
     684             :         // Export display names only for ODF 1.2 extended or later.
     685           0 :         const OUString* pLayoutName = pDim->GetLayoutName();
     686           0 :         if (pLayoutName)
     687           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
     688             :     }
     689             : 
     690           0 :     if (pDim->IsDataLayout())
     691           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_DATA_LAYOUT_FIELD, XML_TRUE);
     692           0 :     OUString sValueStr;
     693           0 :     sheet::DataPilotFieldOrientation eOrientation = (sheet::DataPilotFieldOrientation) pDim->GetOrientation();
     694             :     ScXMLConverter::GetStringFromOrientation( sValueStr,
     695           0 :          eOrientation);
     696           0 :     if( !sValueStr.isEmpty() )
     697           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORIENTATION, sValueStr );
     698           0 :     if (pDim->GetUsedHierarchy() != 1)
     699             :     {
     700           0 :         OUStringBuffer sBuffer;
     701           0 :         ::sax::Converter::convertNumber(sBuffer, pDim->GetUsedHierarchy());
     702           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_USED_HIERARCHY, sBuffer.makeStringAndClear());
     703             :     }
     704             :     ScXMLConverter::GetStringFromFunction( sValueStr,
     705           0 :         (sheet::GeneralFunction) pDim->GetFunction() );
     706           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FUNCTION, sValueStr);
     707             : 
     708           0 :     if (eOrientation == sheet::DataPilotFieldOrientation_PAGE)
     709             :     {
     710           0 :         if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     711             :         {
     712           0 :             rExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_IGNORE_SELECTED_PAGE, "true");
     713             :         }
     714           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SELECTED_PAGE, pDim->GetCurrentPage());
     715             :     }
     716             : 
     717           0 :     SvXMLElementExport aElemDPF(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_FIELD, true, true);
     718           0 :     WriteLevels(pDim);
     719           0 :     WriteFieldReference(pDim);
     720           0 :     if( pDim->GetOrientation() != sheet::DataPilotFieldOrientation_DATA )
     721           0 :         WriteGroupDimElements(pDim, pDimData);
     722           0 : }
     723             : 
     724           0 : void ScXMLExportDataPilot::WriteDimensions(ScDPSaveData* pDPSave)
     725             : {
     726           0 :     const boost::ptr_vector<ScDPSaveDimension> &rDimensions = pDPSave->GetDimensions();
     727           0 :     boost::ptr_vector<ScDPSaveDimension>::const_iterator iter;
     728           0 :     for (iter = rDimensions.begin(); iter != rDimensions.end(); ++iter)
     729           0 :         WriteDimension(const_cast<ScDPSaveDimension*>(&(*iter)), pDPSave->GetExistingDimensionData());
     730           0 : }
     731             : 
     732           0 : void ScXMLExportDataPilot::WriteGrandTotal(::xmloff::token::XMLTokenEnum eOrient, bool bVisible, const OUString* pGrandTotal)
     733             : {
     734           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, bVisible ? XML_TRUE : XML_FALSE);
     735           0 :     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORIENTATION, eOrient);
     736           0 :     if (pGrandTotal)
     737           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pGrandTotal);
     738             : 
     739           0 :     SvXMLElementExport aElemGrandTotal(rExport, XML_NAMESPACE_TABLE_EXT, XML_DATA_PILOT_GRAND_TOTAL, true, true);
     740           0 : }
     741             : 
     742          29 : void ScXMLExportDataPilot::WriteDataPilots(const uno::Reference <sheet::XSpreadsheetDocument>& /* xSpreadDoc */)
     743             : {
     744          29 :     pDoc = rExport.GetDocument();
     745          29 :     if (!pDoc)
     746          29 :         return;
     747             : 
     748          29 :     ScDPCollection* pDPs = pDoc->GetDPCollection();
     749          29 :     if (!pDPs)
     750           0 :         return;
     751             : 
     752          29 :     size_t nDPCount = pDPs->GetCount();
     753          29 :     if (!nDPCount)
     754          29 :         return;
     755             : 
     756           0 :     SvXMLElementExport aElemDPs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_TABLES, true, true);
     757           0 :     rExport.CheckAttrList();
     758           0 :     for (size_t i = 0; i < nDPCount; ++i)
     759             :     {
     760           0 :         ScDPSaveData* pDPSave = (*pDPs)[i]->GetSaveData();
     761           0 :         if (!pDPSave)
     762           0 :             continue;
     763             : 
     764           0 :         ScRange aOutRange((*pDPs)[i]->GetOutRange());
     765           0 :         OUString sTargetRangeAddress;
     766           0 :         ScRangeStringConverter::GetStringFromRange( sTargetRangeAddress, aOutRange, pDoc, ::formula::FormulaGrammar::CONV_OOO );
     767           0 :         ScDocAttrIterator aAttrItr(pDoc, aOutRange.aStart.Tab(),
     768           0 :             aOutRange.aStart.Col(), aOutRange.aStart.Row(),
     769           0 :             aOutRange.aEnd.Col(), aOutRange.aEnd.Row());
     770             :         SCCOL nCol;
     771             :         SCROW nRow1, nRow2;
     772           0 :         OUString sOUButtonList;
     773           0 :         const ScPatternAttr* pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
     774           0 :         while (pAttr)
     775             :         {
     776           0 :             const ScMergeFlagAttr& rItem = static_cast<const ScMergeFlagAttr&>(pAttr->GetItem(ATTR_MERGE_FLAG));
     777           0 :             if (rItem.HasPivotButton())
     778             :             {
     779           0 :                 for (SCROW nButtonRow = nRow1; nButtonRow <= nRow2; ++nButtonRow)
     780             :                 {
     781           0 :                     ScAddress aButtonAddr(nCol, nButtonRow, aOutRange.aStart.Tab());
     782             :                     ScRangeStringConverter::GetStringFromAddress(
     783           0 :                         sOUButtonList, aButtonAddr, pDoc, ::formula::FormulaGrammar::CONV_OOO, ' ', true );
     784             :                 }
     785             :             }
     786           0 :             pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
     787             :         }
     788           0 :         OUString sName((*pDPs)[i]->GetName());
     789           0 :         OUString sApplicationData((*pDPs)[i]->GetTag());
     790           0 :         bool bRowGrand = pDPSave->GetRowGrand();
     791           0 :         bool bColumnGrand = pDPSave->GetColumnGrand();
     792           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, sName);
     793           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_APPLICATION_DATA, sApplicationData);
     794           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, sTargetRangeAddress);
     795           0 :         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_BUTTONS, sOUButtonList);
     796           0 :         if (!(bRowGrand && bColumnGrand))
     797             :         {
     798           0 :             if (bRowGrand)
     799           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_ROW);
     800           0 :             else if (bColumnGrand)
     801           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_COLUMN);
     802             :             else
     803           0 :                 rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_NONE);
     804             :         }
     805           0 :         if (pDPSave->GetIgnoreEmptyRows())
     806           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IGNORE_EMPTY_ROWS, XML_TRUE);
     807           0 :         if (pDPSave->GetRepeatIfEmpty())
     808           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IDENTIFY_CATEGORIES, XML_TRUE);
     809           0 :         if (!pDPSave->GetFilterButton())
     810           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_FILTER_BUTTON, XML_FALSE);
     811           0 :         if (!pDPSave->GetDrillDown())
     812           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DRILL_DOWN_ON_DOUBLE_CLICK, XML_FALSE);
     813           0 :         if ((*pDPs)[i]->GetHeaderLayout())
     814           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_HEADER_GRID_LAYOUT, XML_TRUE);
     815             : 
     816           0 :         SvXMLElementExport aElemDP(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_TABLE, true, true);
     817             : 
     818             :         // grand total elements.
     819             : 
     820           0 :         const OUString* pGrandTotalName = pDPSave->GetGrandTotalName();
     821           0 :         if (pGrandTotalName && rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     822             :         {
     823             :             // Use the new data-pilot-grand-total element.
     824           0 :             if (bRowGrand && bColumnGrand)
     825             :             {
     826           0 :                 WriteGrandTotal(XML_BOTH, true, pGrandTotalName);
     827             :             }
     828             :             else
     829             :             {
     830           0 :                 WriteGrandTotal(XML_ROW, bRowGrand, pGrandTotalName);
     831           0 :                 WriteGrandTotal(XML_COLUMN, bColumnGrand, pGrandTotalName);
     832             :             }
     833             :         }
     834             : 
     835           0 :         rExport.CheckAttrList();
     836           0 :         if ((*pDPs)[i]->IsSheetData())
     837             :         {
     838           0 :             const ScSheetSourceDesc* pSheetSource = (*pDPs)[i]->GetSheetDesc();
     839             : 
     840           0 :             if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
     841             :             {
     842           0 :                 if (pSheetSource->HasRangeName())
     843             :                     rExport.AddAttribute(
     844           0 :                         XML_NAMESPACE_TABLE, XML_NAME, pSheetSource->GetRangeName());
     845             :             }
     846             : 
     847           0 :             OUString sCellRangeAddress;
     848             :             ScRangeStringConverter::GetStringFromRange(
     849           0 :                 sCellRangeAddress, pSheetSource->GetSourceRange(), pDoc,
     850           0 :                 ::formula::FormulaGrammar::CONV_OOO);
     851             : 
     852           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, sCellRangeAddress);
     853           0 :             SvXMLElementExport aElemSCR(rExport, XML_NAMESPACE_TABLE, XML_SOURCE_CELL_RANGE, true, true);
     854           0 :             rExport.CheckAttrList();
     855           0 :             WriteDPFilter(pSheetSource->GetQueryParam());
     856             :         }
     857           0 :         else if ((*pDPs)[i]->IsImportData())
     858             :         {
     859           0 :             const ScImportSourceDesc* pImpSource = (*pDPs)[i]->GetImportSourceDesc();
     860           0 :             switch (pImpSource->nType)
     861             :             {
     862           0 :                 case sheet::DataImportMode_NONE : break;
     863             :                 case sheet::DataImportMode_QUERY :
     864             :                 {
     865           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
     866           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_QUERY_NAME, pImpSource->aObject);
     867           0 :                     SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_QUERY, true, true);
     868           0 :                     rExport.CheckAttrList();
     869             :                 }
     870           0 :                 break;
     871             :                 case sheet::DataImportMode_TABLE :
     872             :                 {
     873           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
     874           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_TABLE_NAME, pImpSource->aObject);
     875           0 :                     SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_TABLE, true, true);
     876           0 :                     rExport.CheckAttrList();
     877             :                 }
     878           0 :                 break;
     879             :                 case sheet::DataImportMode_SQL :
     880             :                 {
     881           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
     882           0 :                     rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SQL_STATEMENT, pImpSource->aObject);
     883           0 :                     if (!pImpSource->bNative)
     884           0 :                         rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_PARSE_SQL_STATEMENT, XML_TRUE);
     885           0 :                     SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_SQL, true, true);
     886           0 :                     rExport.CheckAttrList();
     887             :                 }
     888           0 :                 break;
     889             :             }
     890             :         }
     891           0 :         else if ((*pDPs)[i]->IsServiceData())
     892             :         {
     893           0 :             const ScDPServiceDesc* pServSource = (*pDPs)[i]->GetDPServiceDesc();
     894           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, pServSource->aServiceName);
     895           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_NAME, pServSource->aParSource);
     896           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OBJECT_NAME, pServSource->aParName);
     897           0 :             rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_USER_NAME, pServSource->aParUser);
     898             :             // #i111754# leave out password attribute as long as DataPilotSource doesn't specify the content
     899             :             // rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_PASSWORD, OUString(pServSource->aParPass));
     900           0 :             SvXMLElementExport aElemSD(rExport, XML_NAMESPACE_TABLE, XML_SOURCE_SERVICE, true, true);
     901           0 :             rExport.CheckAttrList();
     902             :         }
     903           0 :         WriteDimensions(pDPSave);
     904           0 :     }
     905         156 : }
     906             : 
     907             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11