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