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 "xmldrani.hxx"
30 : : #include "xmlimprt.hxx"
31 : : #include "xmlfilti.hxx"
32 : : #include "xmlsorti.hxx"
33 : : #include "document.hxx"
34 : : #include "globstr.hrc"
35 : : #include "globalnames.hxx"
36 : : #include "docuno.hxx"
37 : : #include "dbdata.hxx"
38 : : #include "datauno.hxx"
39 : : #include "attrib.hxx"
40 : : #include "unonames.hxx"
41 : : #include "convuno.hxx"
42 : : #include "XMLConverter.hxx"
43 : : #include "rangeutl.hxx"
44 : : #include "queryentry.hxx"
45 : :
46 : : #include <xmloff/xmltkmap.hxx>
47 : : #include <xmloff/nmspmap.hxx>
48 : : #include <xmloff/xmltoken.hxx>
49 : : #include <xmloff/xmlnmspe.hxx>
50 : : #include <xmloff/xmlerror.hxx>
51 : :
52 : : #include <sax/tools/converter.hxx>
53 : :
54 : : #include <com/sun/star/sheet/DataImportMode.hpp>
55 : : #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
56 : : #include <com/sun/star/sheet/XDatabaseRanges.hpp>
57 : : #include <com/sun/star/sheet/XDatabaseRange.hpp>
58 : : #include <com/sun/star/table/CellRangeAddress.hpp>
59 : : #include <comphelper/extract.hxx>
60 : : #include <com/sun/star/uno/RuntimeException.hpp>
61 : : #include <com/sun/star/xml/sax/XLocator.hpp>
62 : :
63 : : #include <memory>
64 : :
65 : : #define SC_USERLIST "UserList"
66 : :
67 : : using namespace com::sun::star;
68 : : using namespace xmloff::token;
69 : : using ::rtl::OUString;
70 : :
71 : : //------------------------------------------------------------------
72 : :
73 : 8 : ScXMLDatabaseRangesContext::ScXMLDatabaseRangesContext( ScXMLImport& rImport,
74 : : sal_uInt16 nPrfx,
75 : : const ::rtl::OUString& rLName,
76 : : const ::com::sun::star::uno::Reference<
77 : : ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) :
78 : 8 : SvXMLImportContext( rImport, nPrfx, rLName )
79 : : {
80 : : // has no attributes
81 [ + - ]: 8 : rImport.LockSolarMutex();
82 : 8 : }
83 : :
84 : 8 : ScXMLDatabaseRangesContext::~ScXMLDatabaseRangesContext()
85 : : {
86 [ + - ]: 8 : GetScImport().UnlockSolarMutex();
87 [ - + ]: 16 : }
88 : :
89 : 26 : SvXMLImportContext *ScXMLDatabaseRangesContext::CreateChildContext( sal_uInt16 nPrefix,
90 : : const ::rtl::OUString& rLName,
91 : : const ::com::sun::star::uno::Reference<
92 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
93 : : {
94 : 26 : SvXMLImportContext *pContext = 0;
95 : :
96 : 26 : const SvXMLTokenMap& rTokenMap = GetScImport().GetDatabaseRangesElemTokenMap();
97 [ + - ]: 26 : switch( rTokenMap.Get( nPrefix, rLName ) )
98 : : {
99 : : case XML_TOK_DATABASE_RANGE :
100 : : {
101 : : pContext = new ScXMLDatabaseRangeContext( GetScImport(), nPrefix,
102 [ + - ]: 26 : rLName, xAttrList);
103 : : }
104 : 26 : break;
105 : : }
106 : :
107 [ - + ]: 26 : if( !pContext )
108 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
109 : :
110 : 26 : return pContext;
111 : : }
112 : :
113 : 8 : void ScXMLDatabaseRangesContext::EndElement()
114 : : {
115 : 8 : }
116 : :
117 : 26 : ScXMLDatabaseRangeContext::ScXMLDatabaseRangeContext( ScXMLImport& rImport,
118 : : sal_uInt16 nPrfx,
119 : : const ::rtl::OUString& rLName,
120 : : const ::com::sun::star::uno::Reference<
121 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList) :
122 : : SvXMLImportContext( rImport, nPrfx, rLName ),
123 [ + - ]: 26 : mpQueryParam(new ScQueryParam),
124 : : sDatabaseRangeName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)),
125 : : aSortSequence(),
126 : : nRefresh(0),
127 : : nSubTotalsUserListIndex(0),
128 : : mbValidRange(true),
129 : : bContainsSort(false),
130 : : bContainsSubTotal(false),
131 : : bNative(true),
132 : : bIsSelection(false),
133 : : bKeepFormats(false),
134 : : bMoveCells(false),
135 : : bStripData(false),
136 : : bAutoFilter(false),
137 : : bSubTotalsBindFormatsToContent(false),
138 : : bSubTotalsIsCaseSensitive(false),
139 : : bSubTotalsInsertPageBreaks(false),
140 : : bSubTotalsSortGroups(false),
141 : : bSubTotalsEnabledUserList(false),
142 : : bSubTotalsAscending(true),
143 : : bFilterConditionSourceRange(false),
144 : : bHasHeader(true),
145 : : bByRow(false),
146 [ + - ][ + - ]: 52 : meRangeType(ScDBCollection::GlobalNamed)
[ + - ][ + - ]
147 : : {
148 : 26 : nSourceType = sheet::DataImportMode_NONE;
149 [ + - ][ + - ]: 26 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ + - ]
150 [ + - ]: 26 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeAttrTokenMap();
151 [ + + ]: 90 : for( sal_Int16 i=0; i < nAttrCount; ++i )
152 : : {
153 [ + - ][ + - ]: 64 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
154 : 64 : rtl::OUString aLocalName;
155 : 64 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
156 [ + - ]: 64 : sAttrName, &aLocalName );
157 [ + - ][ + - ]: 64 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
158 : :
159 [ + - ][ + - : 64 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
- - - - +
+ + - - ]
160 : : {
161 : : case XML_TOK_DATABASE_RANGE_ATTR_NAME :
162 : : {
163 : 26 : sDatabaseRangeName = sValue;
164 : : }
165 : 26 : break;
166 : : case XML_TOK_DATABASE_RANGE_ATTR_IS_SELECTION :
167 : : {
168 [ # # ]: 0 : bIsSelection = IsXMLToken(sValue, XML_TRUE);
169 : : }
170 : 0 : break;
171 : : case XML_TOK_DATABASE_RANGE_ATTR_ON_UPDATE_KEEP_STYLES :
172 : : {
173 [ # # ]: 0 : bKeepFormats = IsXMLToken(sValue, XML_TRUE);
174 : : }
175 : 0 : break;
176 : : case XML_TOK_DATABASE_RANGE_ATTR_ON_UPDATE_KEEP_SIZE :
177 : : {
178 [ # # ]: 0 : bMoveCells = !IsXMLToken(sValue, XML_TRUE);
179 : : }
180 : 0 : break;
181 : : case XML_TOK_DATABASE_RANGE_ATTR_HAS_PERSISTENT_DATA :
182 : : {
183 [ # # ]: 0 : bStripData = !IsXMLToken(sValue, XML_TRUE);
184 : : }
185 : 0 : break;
186 : : case XML_TOK_DATABASE_RANGE_ATTR_ORIENTATION :
187 : : {
188 [ # # ]: 0 : bByRow = !IsXMLToken(sValue, XML_COLUMN);
189 : 0 : mpQueryParam->bByRow = bByRow;
190 : : }
191 : 0 : break;
192 : : case XML_TOK_DATABASE_RANGE_ATTR_CONTAINS_HEADER :
193 : : {
194 [ + - ]: 3 : bHasHeader = IsXMLToken(sValue, XML_TRUE);
195 : 3 : mpQueryParam->bHasHeader = bHasHeader;
196 : : }
197 : 3 : break;
198 : : case XML_TOK_DATABASE_RANGE_ATTR_DISPLAY_FILTER_BUTTONS :
199 : : {
200 [ + - ]: 9 : bAutoFilter = IsXMLToken(sValue, XML_TRUE);
201 : : }
202 : 9 : break;
203 : : case XML_TOK_DATABASE_RANGE_ATTR_TARGET_RANGE_ADDRESS :
204 : : {
205 : 26 : ScDocument* pDoc = GetScImport().GetDocument();
206 : 26 : sal_Int32 nOffset = 0;
207 [ - + ]: 26 : if (!ScRangeStringConverter::GetRangeFromString(
208 [ + - ]: 26 : maRange, sValue, pDoc, ::formula::FormulaGrammar::CONV_OOO, nOffset))
209 : 0 : mbValidRange = false;
210 : : }
211 : 26 : break;
212 : : case XML_TOK_DATABASE_RANGE_ATTR_REFRESH_DELAY :
213 : : {
214 : : double fTime;
215 [ # # ][ # # ]: 0 : if (::sax::Converter::convertDuration( fTime, sValue ))
216 : 0 : nRefresh = Max( (sal_Int32)(fTime * 86400.0), (sal_Int32)0 );
217 : : }
218 : 0 : break;
219 : : }
220 : 64 : }
221 : :
222 : 26 : mpQueryParam->nTab = maRange.aStart.Tab();
223 : 26 : mpQueryParam->nCol1 = maRange.aStart.Col();
224 : 26 : mpQueryParam->nRow1 = maRange.aStart.Row();
225 : 26 : mpQueryParam->nCol2 = maRange.aEnd.Col();
226 : 26 : mpQueryParam->nRow2 = maRange.aEnd.Row();
227 : :
228 [ + + ]: 26 : if (sDatabaseRangeName.matchAsciiL(STR_DB_LOCAL_NONAME, strlen(STR_DB_LOCAL_NONAME)))
229 : 3 : meRangeType = ScDBCollection::SheetAnonymous;
230 [ - + ]: 23 : else if (sDatabaseRangeName.matchAsciiL(STR_DB_GLOBAL_NONAME, strlen(STR_DB_GLOBAL_NONAME)))
231 : 0 : meRangeType = ScDBCollection::GlobalAnonymous;
232 : 26 : }
233 : :
234 [ + - ][ + - ]: 26 : ScXMLDatabaseRangeContext::~ScXMLDatabaseRangeContext()
235 : : {
236 [ - + ]: 52 : }
237 : :
238 : 9 : SvXMLImportContext *ScXMLDatabaseRangeContext::CreateChildContext( sal_uInt16 nPrefix,
239 : : const ::rtl::OUString& rLName,
240 : : const ::com::sun::star::uno::Reference<
241 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
242 : : {
243 : 9 : SvXMLImportContext *pContext = 0;
244 : :
245 : 9 : const SvXMLTokenMap& rTokenMap = GetScImport().GetDatabaseRangeElemTokenMap();
246 [ - - - + : 9 : switch( rTokenMap.Get( nPrefix, rLName ) )
- - - ]
247 : : {
248 : : case XML_TOK_DATABASE_RANGE_SOURCE_SQL :
249 : : {
250 : : pContext = new ScXMLSourceSQLContext( GetScImport(), nPrefix,
251 [ # # ]: 0 : rLName, xAttrList, this);
252 : : }
253 : 0 : break;
254 : : case XML_TOK_DATABASE_RANGE_SOURCE_TABLE :
255 : : {
256 : : pContext = new ScXMLSourceTableContext( GetScImport(), nPrefix,
257 [ # # ]: 0 : rLName, xAttrList, this);
258 : : }
259 : 0 : break;
260 : : case XML_TOK_DATABASE_RANGE_SOURCE_QUERY :
261 : : {
262 : : pContext = new ScXMLSourceQueryContext( GetScImport(), nPrefix,
263 [ # # ]: 0 : rLName, xAttrList, this);
264 : : }
265 : 0 : break;
266 : : case XML_TOK_FILTER :
267 : : {
268 : : pContext = new ScXMLFilterContext(
269 [ + - ]: 9 : GetScImport(), nPrefix, rLName, xAttrList, *mpQueryParam, this);
270 : : }
271 : 9 : break;
272 : : case XML_TOK_SORT :
273 : : {
274 : 0 : bContainsSort = true;
275 : : pContext = new ScXMLSortContext( GetScImport(), nPrefix,
276 [ # # ]: 0 : rLName, xAttrList, this);
277 : : }
278 : 0 : break;
279 : : case XML_TOK_DATABASE_RANGE_SUBTOTAL_RULES :
280 : : {
281 : 0 : bContainsSubTotal = true;
282 : : pContext = new ScXMLSubTotalRulesContext( GetScImport(), nPrefix,
283 [ # # ]: 0 : rLName, xAttrList, this);
284 : : }
285 : 0 : break;
286 : : }
287 : :
288 [ - + ]: 9 : if( !pContext )
289 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
290 : :
291 : 9 : return pContext;
292 : : }
293 : :
294 : 26 : ScDBData* ScXMLDatabaseRangeContext::ConvertToDBData(const OUString& rName)
295 : : {
296 [ - + ]: 26 : if (!mbValidRange)
297 : 0 : return NULL;
298 : :
299 : 26 : ScDocument* pDoc = GetScImport().GetDocument();
300 : :
301 : : SAL_WNODEPRECATED_DECLARATIONS_PUSH
302 : : ::std::auto_ptr<ScDBData> pData(
303 [ + - ][ + - ]: 26 : new ScDBData(rName, maRange.aStart.Tab(), maRange.aStart.Col(), maRange.aStart.Row(), maRange.aEnd.Col(), maRange.aEnd.Row(), bByRow, bHasHeader));
304 : : SAL_WNODEPRECATED_DECLARATIONS_POP
305 : :
306 : 26 : pData->SetAutoFilter(bAutoFilter);
307 : 26 : pData->SetKeepFmt(bKeepFormats);
308 : 26 : pData->SetDoSize(bMoveCells);
309 : 26 : pData->SetStripData(bStripData);
310 : :
311 [ + - ]: 26 : pData->SetQueryParam(*mpQueryParam);
312 : :
313 [ - + ]: 26 : if (bFilterConditionSourceRange)
314 : : {
315 : 0 : ScRange aAdvSource;
316 : 0 : ScUnoConversion::FillScRange(aAdvSource, aFilterConditionSourceRangeAddress);
317 [ # # ]: 0 : pData->SetAdvancedQuerySource(&aAdvSource);
318 : : }
319 : :
320 : : {
321 [ + - ]: 26 : ScImportParam aParam;
322 : 26 : aParam.bNative = bNative;
323 [ + - ]: 26 : aParam.aDBName = sDatabaseName.isEmpty() ? sConnectionResource : sDatabaseName;
324 : 26 : aParam.aStatement = sSourceObject;
325 : 26 : sheet::DataImportMode eMode = static_cast<sheet::DataImportMode>(nSourceType);
326 [ + - - - : 26 : switch (eMode)
- ]
327 : : {
328 : : case sheet::DataImportMode_NONE:
329 : 26 : aParam.bImport = false;
330 : 26 : break;
331 : : case sheet::DataImportMode_SQL:
332 : 0 : aParam.bImport = true;
333 : 0 : aParam.bSql = true;
334 : 0 : break;
335 : : case sheet::DataImportMode_TABLE:
336 : 0 : aParam.bImport = true;
337 : 0 : aParam.bSql = false;
338 : 0 : aParam.nType = ScDbTable;
339 : 0 : break;
340 : : case sheet::DataImportMode_QUERY:
341 : 0 : aParam.bImport = true;
342 : 0 : aParam.bSql = false;
343 : 0 : aParam.nType = ScDbQuery;
344 : 0 : break;
345 : : default:
346 : : OSL_FAIL("Unknown data import mode");
347 : 0 : aParam.bImport = false;
348 : : }
349 [ + - ][ + - ]: 26 : pData->SetImportParam(aParam);
350 : : }
351 : :
352 [ - + ]: 26 : if (bContainsSort)
353 : : {
354 : 0 : size_t nOldSize = aSortSequence.getLength();
355 [ # # ]: 0 : aSortSequence.realloc(nOldSize + 1);
356 : 0 : beans::PropertyValue aProperty;
357 [ # # ]: 0 : aProperty.Name = OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ORIENT));
358 : 0 : table::TableOrientation eOrient = mpQueryParam->bByRow ?
359 [ # # ]: 0 : table::TableOrientation_ROWS : table::TableOrientation_COLUMNS;
360 [ # # ]: 0 : aProperty.Value <<= eOrient;
361 [ # # ]: 0 : aSortSequence[nOldSize] = aProperty;
362 [ # # ]: 0 : ScSortParam aParam;
363 [ # # ]: 0 : ScSortDescriptor::FillSortParam(aParam, aSortSequence);
364 : :
365 [ # # ]: 0 : SCCOLROW nStartPos = aParam.bByRow ? maRange.aStart.Col() : maRange.aStart.Row();
366 [ # # ]: 0 : for (size_t i = 0; i < aParam.GetSortKeyCount(); ++i)
367 : : {
368 [ # # ]: 0 : if (!aParam.maKeyState[i].bDoSort)
369 : 0 : break;
370 : 0 : aParam.maKeyState[i].nField += nStartPos;
371 : : }
372 : :
373 [ # # ][ # # ]: 0 : pData->SetSortParam(aParam);
374 : : }
375 : :
376 [ - + ]: 26 : if (bContainsSubTotal)
377 : : {
378 [ # # ]: 0 : ScSubTotalParam aParam;
379 : 0 : aParam.bIncludePattern = bSubTotalsBindFormatsToContent;
380 : 0 : aParam.bUserDef = bSubTotalsEnabledUserList;
381 : 0 : aParam.nUserIndex = nSubTotalsUserListIndex;
382 : 0 : aParam.bPagebreak = bSubTotalsInsertPageBreaks;
383 : 0 : aParam.bCaseSens = bSubTotalsIsCaseSensitive;
384 : 0 : aParam.bDoSort = bSubTotalsSortGroups;
385 : 0 : aParam.bAscending = bSubTotalsAscending;
386 : 0 : aParam.bUserDef = bSubTotalsEnabledUserList;
387 : 0 : aParam.nUserIndex = nSubTotalsUserListIndex;
388 : 0 : std::vector <ScSubTotalRule>::iterator itr = aSubTotalRules.begin(), itrEnd = aSubTotalRules.end();
389 [ # # ][ # # ]: 0 : for (size_t nPos = 0; itr != itrEnd; ++itr, ++nPos)
390 : : {
391 [ # # ]: 0 : if (nPos >= MAXSUBTOTAL)
392 : 0 : break;
393 : :
394 : 0 : const uno::Sequence<sheet::SubTotalColumn>& rColumns = itr->aSubTotalColumns;
395 : 0 : sal_Int32 nColCount = rColumns.getLength();
396 : 0 : sal_Int16 nGroupColumn = itr->nSubTotalRuleGroupFieldNumber;
397 : 0 : aParam.bGroupActive[nPos] = true;
398 : 0 : aParam.nField[nPos] = static_cast<SCCOL>(nGroupColumn);
399 : :
400 : 0 : SCCOL nCount = static_cast<SCCOL>(nColCount);
401 : 0 : aParam.nSubTotals[nPos] = nCount;
402 [ # # ]: 0 : if (nCount != 0)
403 : : {
404 [ # # ]: 0 : aParam.pSubTotals[nPos] = new SCCOL[nCount];
405 [ # # ]: 0 : aParam.pFunctions[nPos] = new ScSubTotalFunc[nCount];
406 : :
407 : 0 : const sheet::SubTotalColumn* pAry = rColumns.getConstArray();
408 [ # # ]: 0 : for (SCCOL i = 0; i < nCount; ++i)
409 : : {
410 : 0 : aParam.pSubTotals[nPos][i] = static_cast<SCCOL>(pAry[i].Column);
411 : 0 : aParam.pFunctions[nPos][i] =
412 [ # # ]: 0 : ScDataUnoConversion::GeneralToSubTotal( pAry[i].Function );
413 : : }
414 : : }
415 : : else
416 : : {
417 : 0 : aParam.pSubTotals[nPos] = NULL;
418 : 0 : aParam.pFunctions[nPos] = NULL;
419 : : }
420 : : }
421 : :
422 [ # # ]: 0 : pData->SetSubTotalParam(aParam);
423 : : }
424 : :
425 [ + - ][ - + ]: 26 : if (pData->HasImportParam() && !pData->HasImportSelection())
[ # # ][ - + ]
426 : : {
427 [ # # ]: 0 : pData->SetRefreshDelay(nRefresh);
428 [ # # ]: 0 : pData->SetRefreshHandler(pDoc->GetDBCollection()->GetRefreshHandler());
429 : 0 : pData->SetRefreshControl(pDoc->GetRefreshTimerControlAddress());
430 : : }
431 : :
432 [ + - ]: 26 : return pData.release();
433 : : }
434 : :
435 : : namespace {
436 : :
437 : 26 : bool setAutoFilterFlags(ScDocument& rDoc, const ScDBData& rData)
438 : : {
439 [ + + ]: 26 : if (!rData.HasAutoFilter())
440 : 17 : return false;
441 : :
442 : : // Set autofilter flags so that the buttons get displayed.
443 : 9 : ScRange aRange;
444 [ + - ]: 9 : rData.GetArea(aRange);
445 : : rDoc.ApplyFlagsTab(
446 : 18 : aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aStart.Row(),
447 [ + - ]: 27 : aRange.aStart.Tab(), SC_MF_AUTO);
448 : 26 : return false;
449 : : }
450 : :
451 : : }
452 : :
453 : 26 : void ScXMLDatabaseRangeContext::EndElement()
454 : : {
455 : 26 : ScDocument* pDoc = GetScImport().GetDocument();
456 [ - + ]: 26 : if (!pDoc)
457 : 0 : return;
458 : :
459 [ + + ]: 26 : if (meRangeType == ScDBCollection::SheetAnonymous)
460 : : {
461 [ + - ]: 3 : OUString aName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
462 : : SAL_WNODEPRECATED_DECLARATIONS_PUSH
463 [ + - ]: 3 : ::std::auto_ptr<ScDBData> pData(ConvertToDBData(aName));
464 : : SAL_WNODEPRECATED_DECLARATIONS_POP
465 : :
466 [ + - ]: 3 : if (pData.get())
467 : : {
468 : 3 : ScRange aRange;
469 [ + - ]: 3 : pData->GetArea(aRange);
470 : :
471 [ + - ]: 3 : setAutoFilterFlags(*pDoc, *pData);
472 [ + - ]: 3 : pDoc->SetAnonymousDBData(aRange.aStart.Tab(), pData.release());
473 : : }
474 [ + - ]: 3 : return;
475 : : }
476 [ - + ]: 23 : else if (meRangeType == ScDBCollection::GlobalAnonymous)
477 : : {
478 [ # # ]: 0 : OUString aName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_GLOBAL_NONAME));
479 : : SAL_WNODEPRECATED_DECLARATIONS_PUSH
480 [ # # ]: 0 : ::std::auto_ptr<ScDBData> pData(ConvertToDBData(aName));
481 : : SAL_WNODEPRECATED_DECLARATIONS_POP
482 : :
483 [ # # ]: 0 : if (pData.get())
484 : : {
485 : 0 : ScRange aRange;
486 [ # # ]: 0 : pData->GetArea(aRange);
487 : :
488 [ # # ][ # # ]: 0 : if (setAutoFilterFlags(*pDoc, *pData))
489 [ # # ]: 0 : pDoc->SetAnonymousDBData(aRange.aStart.Tab(), pData.release());
490 : : else
491 [ # # ][ # # ]: 0 : pDoc->GetDBCollection()->getAnonDBs().insert(pData.release());
[ # # ]
492 : : }
493 [ # # ]: 0 : return;
494 : : }
495 [ + - ]: 23 : else if (meRangeType == ScDBCollection::GlobalNamed)
496 : : {
497 : : SAL_WNODEPRECATED_DECLARATIONS_PUSH
498 [ + - ]: 23 : ::std::auto_ptr<ScDBData> pData(ConvertToDBData(sDatabaseRangeName));
499 : : SAL_WNODEPRECATED_DECLARATIONS_POP
500 : :
501 [ + - ]: 23 : if (pData.get())
502 : : {
503 [ + - ]: 23 : setAutoFilterFlags(*pDoc, *pData);
504 [ + - ][ + - ]: 23 : pDoc->GetDBCollection()->getNamedDBs().insert(pData.release());
[ + - ]
505 [ + - ]: 26 : }
506 : : }
507 : : }
508 : :
509 : 0 : ScXMLSourceSQLContext::ScXMLSourceSQLContext( ScXMLImport& rImport,
510 : : sal_uInt16 nPrfx,
511 : : const ::rtl::OUString& rLName,
512 : : const ::com::sun::star::uno::Reference<
513 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
514 : : ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) :
515 : : SvXMLImportContext( rImport, nPrfx, rLName ),
516 : 0 : pDatabaseRangeContext(pTempDatabaseRangeContext)
517 : : {
518 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
519 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceSQLAttrTokenMap();
520 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
521 : : {
522 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
523 : 0 : rtl::OUString aLocalName;
524 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
525 [ # # ]: 0 : sAttrName, &aLocalName );
526 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
527 : :
528 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # # ]
529 : : {
530 : : case XML_TOK_SOURCE_SQL_ATTR_DATABASE_NAME :
531 : : {
532 : 0 : sDBName = sValue;
533 : : }
534 : 0 : break;
535 : : case XML_TOK_SOURCE_SQL_ATTR_SQL_STATEMENT :
536 : : {
537 : 0 : pDatabaseRangeContext->SetSourceObject(sValue);
538 : : }
539 : 0 : break;
540 : : case XML_TOK_SOURCE_SQL_ATTR_PARSE_SQL_STATEMENT :
541 : : {
542 [ # # ]: 0 : pDatabaseRangeContext->SetNative(IsXMLToken(sValue, XML_TRUE));
543 : : }
544 : 0 : break;
545 : : }
546 : 0 : }
547 : 0 : pDatabaseRangeContext->SetSourceType(sheet::DataImportMode_SQL);
548 : 0 : }
549 : :
550 : 0 : ScXMLSourceSQLContext::~ScXMLSourceSQLContext()
551 : : {
552 [ # # ]: 0 : }
553 : :
554 : 0 : SvXMLImportContext *ScXMLSourceSQLContext::CreateChildContext( sal_uInt16 nPrefix,
555 : : const ::rtl::OUString& rLName,
556 : : const ::com::sun::star::uno::Reference<
557 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
558 : : {
559 : 0 : SvXMLImportContext *pContext = 0;
560 : :
561 [ # # ]: 0 : if ( nPrefix == XML_NAMESPACE_FORM )
562 : : {
563 [ # # ][ # # ]: 0 : if (IsXMLToken(rLName, XML_CONNECTION_RESOURCE) && sDBName.isEmpty())
[ # # ]
564 : : {
565 : : pContext = new ScXMLConResContext( GetScImport(), nPrefix,
566 [ # # ]: 0 : rLName, xAttrList, pDatabaseRangeContext);
567 : : }
568 : : }
569 : :
570 [ # # ]: 0 : if( !pContext )
571 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
572 : :
573 : 0 : return pContext;
574 : : }
575 : :
576 : 0 : void ScXMLSourceSQLContext::EndElement()
577 : : {
578 [ # # ]: 0 : if (!sDBName.isEmpty())
579 : 0 : pDatabaseRangeContext->SetDatabaseName(sDBName);
580 : 0 : }
581 : :
582 : 0 : ScXMLSourceTableContext::ScXMLSourceTableContext( ScXMLImport& rImport,
583 : : sal_uInt16 nPrfx,
584 : : const ::rtl::OUString& rLName,
585 : : const ::com::sun::star::uno::Reference<
586 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
587 : : ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) :
588 : : SvXMLImportContext( rImport, nPrfx, rLName ),
589 : 0 : pDatabaseRangeContext(pTempDatabaseRangeContext)
590 : : {
591 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
592 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceTableAttrTokenMap();
593 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
594 : : {
595 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
596 : 0 : rtl::OUString aLocalName;
597 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
598 [ # # ]: 0 : sAttrName, &aLocalName );
599 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
600 : :
601 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # ]
602 : : {
603 : : case XML_TOK_SOURCE_TABLE_ATTR_DATABASE_NAME :
604 : : {
605 : 0 : sDBName = sValue;
606 : : }
607 : 0 : break;
608 : : case XML_TOK_SOURCE_TABLE_ATTR_TABLE_NAME :
609 : : {
610 : 0 : pDatabaseRangeContext->SetSourceObject(sValue);
611 : : }
612 : 0 : break;
613 : : }
614 : 0 : }
615 : 0 : pDatabaseRangeContext->SetSourceType(sheet::DataImportMode_TABLE);
616 : 0 : }
617 : :
618 : 0 : ScXMLSourceTableContext::~ScXMLSourceTableContext()
619 : : {
620 [ # # ]: 0 : }
621 : :
622 : 0 : SvXMLImportContext *ScXMLSourceTableContext::CreateChildContext( sal_uInt16 nPrefix,
623 : : const ::rtl::OUString& rLName,
624 : : const ::com::sun::star::uno::Reference<
625 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
626 : : {
627 : 0 : SvXMLImportContext *pContext = 0;
628 : :
629 [ # # ]: 0 : if ( nPrefix == XML_NAMESPACE_FORM )
630 : : {
631 [ # # ][ # # ]: 0 : if (IsXMLToken(rLName, XML_CONNECTION_RESOURCE) && sDBName.isEmpty())
[ # # ]
632 : : {
633 : : pContext = new ScXMLConResContext( GetScImport(), nPrefix,
634 [ # # ]: 0 : rLName, xAttrList, pDatabaseRangeContext);
635 : : }
636 : : }
637 : :
638 [ # # ]: 0 : if( !pContext )
639 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
640 : :
641 : 0 : return pContext;
642 : : }
643 : :
644 : 0 : void ScXMLSourceTableContext::EndElement()
645 : : {
646 [ # # ]: 0 : if (!sDBName.isEmpty())
647 : 0 : pDatabaseRangeContext->SetDatabaseName(sDBName);
648 : 0 : }
649 : :
650 : 0 : ScXMLSourceQueryContext::ScXMLSourceQueryContext( ScXMLImport& rImport,
651 : : sal_uInt16 nPrfx,
652 : : const ::rtl::OUString& rLName,
653 : : const ::com::sun::star::uno::Reference<
654 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
655 : : ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) :
656 : : SvXMLImportContext( rImport, nPrfx, rLName ),
657 : 0 : pDatabaseRangeContext(pTempDatabaseRangeContext)
658 : : {
659 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
660 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceQueryAttrTokenMap();
661 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
662 : : {
663 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
664 : 0 : rtl::OUString aLocalName;
665 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
666 [ # # ]: 0 : sAttrName, &aLocalName );
667 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
668 : :
669 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # ]
670 : : {
671 : : case XML_TOK_SOURCE_QUERY_ATTR_DATABASE_NAME :
672 : : {
673 : 0 : sDBName = sValue;
674 : : }
675 : 0 : break;
676 : : case XML_TOK_SOURCE_QUERY_ATTR_QUERY_NAME :
677 : : {
678 : 0 : pDatabaseRangeContext->SetSourceObject(sValue);
679 : : }
680 : 0 : break;
681 : : }
682 : 0 : }
683 : 0 : pDatabaseRangeContext->SetSourceType(sheet::DataImportMode_QUERY);
684 : 0 : }
685 : :
686 : 0 : ScXMLSourceQueryContext::~ScXMLSourceQueryContext()
687 : : {
688 [ # # ]: 0 : }
689 : :
690 : 0 : SvXMLImportContext *ScXMLSourceQueryContext::CreateChildContext( sal_uInt16 nPrefix,
691 : : const ::rtl::OUString& rLName,
692 : : const ::com::sun::star::uno::Reference<
693 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
694 : : {
695 : 0 : SvXMLImportContext *pContext = 0;
696 : :
697 [ # # ]: 0 : if ( nPrefix == XML_NAMESPACE_FORM )
698 : : {
699 [ # # ][ # # ]: 0 : if (IsXMLToken(rLName, XML_CONNECTION_RESOURCE) && sDBName.isEmpty())
[ # # ]
700 : : {
701 : : pContext = new ScXMLConResContext( GetScImport(), nPrefix,
702 [ # # ]: 0 : rLName, xAttrList, pDatabaseRangeContext);
703 : : }
704 : : }
705 : :
706 [ # # ]: 0 : if( !pContext )
707 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
708 : :
709 : 0 : return pContext;
710 : : }
711 : :
712 : 0 : void ScXMLSourceQueryContext::EndElement()
713 : : {
714 [ # # ]: 0 : if (!sDBName.isEmpty())
715 : 0 : pDatabaseRangeContext->SetDatabaseName(sDBName);
716 : 0 : }
717 : :
718 : 0 : ScXMLConResContext::ScXMLConResContext( ScXMLImport& rImport,
719 : : sal_uInt16 nPrfx,
720 : : const ::rtl::OUString& rLName,
721 : : const ::com::sun::star::uno::Reference<
722 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
723 : : ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) :
724 : : SvXMLImportContext( rImport, nPrfx, rLName ),
725 : 0 : pDatabaseRangeContext( pTempDatabaseRangeContext )
726 : : {
727 : 0 : rtl::OUString sConRes;
728 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
729 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; i++ )
730 : : {
731 [ # # ][ # # ]: 0 : rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
732 : 0 : rtl::OUString aLocalName;
733 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
734 [ # # ]: 0 : sAttrName, &aLocalName );
735 [ # # ][ # # ]: 0 : rtl::OUString sValue = xAttrList->getValueByIndex( i );
736 : :
737 [ # # ]: 0 : if (nPrefix == XML_NAMESPACE_XLINK)
738 : : {
739 [ # # ][ # # ]: 0 : if (IsXMLToken(aLocalName, XML_HREF))
740 : 0 : sConRes = sValue;
741 : : }
742 : 0 : }
743 [ # # ]: 0 : if (!sConRes.isEmpty())
744 : 0 : pDatabaseRangeContext->SetConnectionResource(sConRes);
745 : 0 : }
746 : :
747 : 0 : ScXMLConResContext::~ScXMLConResContext()
748 : : {
749 [ # # ]: 0 : }
750 : :
751 : 0 : SvXMLImportContext *ScXMLConResContext::CreateChildContext( sal_uInt16 nPrefix,
752 : : const ::rtl::OUString& rLName,
753 : : const ::com::sun::star::uno::Reference<
754 : : ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
755 : : {
756 : 0 : SvXMLImportContext *pContext = 0;
757 : :
758 [ # # ]: 0 : if( !pContext )
759 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
760 : :
761 : 0 : return pContext;
762 : : }
763 : :
764 : 0 : void ScXMLConResContext::EndElement()
765 : : {
766 : 0 : }
767 : :
768 : 0 : ScXMLSubTotalRulesContext::ScXMLSubTotalRulesContext( ScXMLImport& rImport,
769 : : sal_uInt16 nPrfx,
770 : : const ::rtl::OUString& rLName,
771 : : const ::com::sun::star::uno::Reference<
772 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
773 : : ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) :
774 : : SvXMLImportContext( rImport, nPrfx, rLName ),
775 : 0 : pDatabaseRangeContext(pTempDatabaseRangeContext)
776 : : {
777 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
778 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSubTotalRulesAttrTokenMap();
779 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
780 : : {
781 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
782 : 0 : rtl::OUString aLocalName;
783 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
784 [ # # ]: 0 : sAttrName, &aLocalName );
785 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
786 : :
787 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # # ]
788 : : {
789 : : case XML_TOK_SUBTOTAL_RULES_ATTR_BIND_STYLES_TO_CONTENT :
790 : : {
791 [ # # ]: 0 : pDatabaseRangeContext->SetSubTotalsBindFormatsToContent(IsXMLToken(sValue, XML_TRUE));
792 : : }
793 : 0 : break;
794 : : case XML_TOK_SUBTOTAL_RULES_ATTR_CASE_SENSITIVE :
795 : : {
796 [ # # ]: 0 : pDatabaseRangeContext->SetSubTotalsIsCaseSensitive(IsXMLToken(sValue, XML_TRUE));
797 : : }
798 : 0 : break;
799 : : case XML_TOK_SUBTOTAL_RULES_ATTR_PAGE_BREAKS_ON_GROUP_CHANGE :
800 : : {
801 [ # # ]: 0 : pDatabaseRangeContext->SetSubTotalsInsertPageBreaks(IsXMLToken(sValue, XML_TRUE));
802 : : }
803 : 0 : break;
804 : : }
805 : 0 : }
806 : 0 : }
807 : :
808 : 0 : ScXMLSubTotalRulesContext::~ScXMLSubTotalRulesContext()
809 : : {
810 [ # # ]: 0 : }
811 : :
812 : 0 : SvXMLImportContext *ScXMLSubTotalRulesContext::CreateChildContext( sal_uInt16 nPrefix,
813 : : const ::rtl::OUString& rLName,
814 : : const ::com::sun::star::uno::Reference<
815 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
816 : : {
817 : 0 : SvXMLImportContext *pContext = 0;
818 : :
819 : 0 : const SvXMLTokenMap& rTokenMap = GetScImport().GetDatabaseRangeSubTotalRulesElemTokenMap();
820 [ # # # ]: 0 : switch( rTokenMap.Get( nPrefix, rLName ) )
821 : : {
822 : : case XML_TOK_SUBTOTAL_RULES_SORT_GROUPS :
823 : : {
824 : : pContext = new ScXMLSortGroupsContext( GetScImport(), nPrefix,
825 [ # # ]: 0 : rLName, xAttrList, pDatabaseRangeContext);
826 : : }
827 : 0 : break;
828 : : case XML_TOK_SUBTOTAL_RULES_SUBTOTAL_RULE :
829 : : {
830 : : pContext = new ScXMLSubTotalRuleContext( GetScImport(), nPrefix,
831 [ # # ]: 0 : rLName, xAttrList, pDatabaseRangeContext);
832 : : }
833 : 0 : break;
834 : : }
835 : :
836 [ # # ]: 0 : if( !pContext )
837 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
838 : :
839 : 0 : return pContext;
840 : : }
841 : :
842 : 0 : void ScXMLSubTotalRulesContext::EndElement()
843 : : {
844 : 0 : }
845 : :
846 : 0 : ScXMLSortGroupsContext::ScXMLSortGroupsContext( ScXMLImport& rImport,
847 : : sal_uInt16 nPrfx,
848 : : const ::rtl::OUString& rLName,
849 : : const ::com::sun::star::uno::Reference<
850 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
851 : : ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) :
852 : : SvXMLImportContext( rImport, nPrfx, rLName ),
853 : 0 : pDatabaseRangeContext(pTempDatabaseRangeContext)
854 : : {
855 : 0 : pDatabaseRangeContext->SetSubTotalsSortGroups(true);
856 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
857 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetSubTotalRulesSortGroupsAttrTokenMap();
858 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
859 : : {
860 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
861 : 0 : rtl::OUString aLocalName;
862 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
863 [ # # ]: 0 : sAttrName, &aLocalName );
864 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
865 : :
866 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # ]
867 : : {
868 : : case XML_TOK_SORT_GROUPS_ATTR_DATA_TYPE :
869 : : {
870 [ # # ]: 0 : if (sValue.getLength() > 8)
871 : : {
872 : 0 : rtl::OUString sTemp = sValue.copy(0, 8);
873 [ # # ]: 0 : if (sTemp.compareToAscii(SC_USERLIST) == 0)
874 : : {
875 : 0 : pDatabaseRangeContext->SetSubTotalsEnabledUserList(true);
876 : 0 : sTemp = sValue.copy(8);
877 : 0 : pDatabaseRangeContext->SetSubTotalsUserListIndex(static_cast<sal_Int16>(sTemp.toInt32()));
878 : : }
879 : : else
880 : : {
881 : : //if (IsXMLToken(sValue, XML_AUTOMATIC))
882 : : //aSortField.FieldType = util::SortFieldType_AUTOMATIC;
883 : : // is not supported by StarOffice
884 : 0 : }
885 : : }
886 : : else
887 : : {
888 : : //if (IsXMLToken(sValue, XML_TEXT))
889 : : //aSortField.FieldType = util::SortFieldType_ALPHANUMERIC;
890 : : // is not supported by StarOffice
891 : : //else if (IsXMLToken(sValue, XML_NUMBER))
892 : : //aSortField.FieldType = util::SortFieldType_NUMERIC;
893 : : // is not supported by StarOffice
894 : : }
895 : : }
896 : 0 : break;
897 : : case XML_TOK_SORT_GROUPS_ATTR_ORDER :
898 : : {
899 [ # # ][ # # ]: 0 : if (IsXMLToken(sValue, XML_ASCENDING))
900 : 0 : pDatabaseRangeContext->SetSubTotalsAscending(true);
901 : : else
902 : 0 : pDatabaseRangeContext->SetSubTotalsAscending(false);
903 : : }
904 : 0 : break;
905 : : }
906 : 0 : }
907 : 0 : }
908 : :
909 : 0 : ScXMLSortGroupsContext::~ScXMLSortGroupsContext()
910 : : {
911 [ # # ]: 0 : }
912 : :
913 : 0 : SvXMLImportContext *ScXMLSortGroupsContext::CreateChildContext( sal_uInt16 nPrefix,
914 : : const ::rtl::OUString& rLName,
915 : : const ::com::sun::star::uno::Reference<
916 : : ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
917 : : {
918 : 0 : SvXMLImportContext *pContext = 0;
919 : :
920 [ # # ]: 0 : if( !pContext )
921 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
922 : :
923 : 0 : return pContext;
924 : : }
925 : :
926 : 0 : void ScXMLSortGroupsContext::EndElement()
927 : : {
928 : 0 : }
929 : :
930 : 0 : ScXMLSubTotalRuleContext::ScXMLSubTotalRuleContext( ScXMLImport& rImport,
931 : : sal_uInt16 nPrfx,
932 : : const ::rtl::OUString& rLName,
933 : : const ::com::sun::star::uno::Reference<
934 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
935 : : ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) :
936 : : SvXMLImportContext( rImport, nPrfx, rLName ),
937 [ # # ]: 0 : pDatabaseRangeContext(pTempDatabaseRangeContext)
938 : : {
939 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
940 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetSubTotalRulesSubTotalRuleAttrTokenMap();
941 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
942 : : {
943 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
944 : 0 : rtl::OUString aLocalName;
945 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
946 [ # # ]: 0 : sAttrName, &aLocalName );
947 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
948 : :
949 [ # # ][ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
950 : : {
951 : : case XML_TOK_SUBTOTAL_RULE_ATTR_GROUP_BY_FIELD_NUMBER :
952 : : {
953 : 0 : aSubTotalRule.nSubTotalRuleGroupFieldNumber = static_cast<sal_Int16>(sValue.toInt32());
954 : : }
955 : 0 : break;
956 : : }
957 : 0 : }
958 : 0 : }
959 : :
960 [ # # ]: 0 : ScXMLSubTotalRuleContext::~ScXMLSubTotalRuleContext()
961 : : {
962 [ # # ]: 0 : }
963 : :
964 : 0 : SvXMLImportContext *ScXMLSubTotalRuleContext::CreateChildContext( sal_uInt16 nPrefix,
965 : : const ::rtl::OUString& rLName,
966 : : const ::com::sun::star::uno::Reference<
967 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
968 : : {
969 : 0 : SvXMLImportContext *pContext = 0;
970 : :
971 : 0 : const SvXMLTokenMap& rTokenMap = GetScImport().GetSubTotalRulesSubTotalRuleElemTokenMap();
972 [ # # ]: 0 : switch( rTokenMap.Get( nPrefix, rLName ) )
973 : : {
974 : : case XML_TOK_SUBTOTAL_RULE_SUBTOTAL_FIELD :
975 : : {
976 : : pContext = new ScXMLSubTotalFieldContext( GetScImport(), nPrefix,
977 [ # # ]: 0 : rLName, xAttrList, this);
978 : : }
979 : 0 : break;
980 : : }
981 : :
982 [ # # ]: 0 : if( !pContext )
983 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
984 : :
985 : 0 : return pContext;
986 : : }
987 : :
988 : 0 : void ScXMLSubTotalRuleContext::EndElement()
989 : : {
990 [ # # ]: 0 : if (pDatabaseRangeContext)
991 : 0 : pDatabaseRangeContext->AddSubTotalRule(aSubTotalRule);
992 : 0 : }
993 : :
994 : 0 : ScXMLSubTotalFieldContext::ScXMLSubTotalFieldContext( ScXMLImport& rImport,
995 : : sal_uInt16 nPrfx,
996 : : const ::rtl::OUString& rLName,
997 : : const ::com::sun::star::uno::Reference<
998 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
999 : : ScXMLSubTotalRuleContext* pTempSubTotalRuleContext) :
1000 : : SvXMLImportContext( rImport, nPrfx, rLName ),
1001 : 0 : pSubTotalRuleContext(pTempSubTotalRuleContext)
1002 : : {
1003 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
1004 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetSubTotalRuleSubTotalFieldAttrTokenMap();
1005 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
1006 : : {
1007 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
1008 : 0 : rtl::OUString aLocalName;
1009 : 0 : sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
1010 [ # # ]: 0 : sAttrName, &aLocalName );
1011 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
1012 : :
1013 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # ]
1014 : : {
1015 : : case XML_TOK_SUBTOTAL_FIELD_ATTR_FIELD_NUMBER :
1016 : : {
1017 : 0 : sFieldNumber = sValue;
1018 : : }
1019 : 0 : break;
1020 : : case XML_TOK_SUBTOTAL_FIELD_ATTR_FUNCTION :
1021 : : {
1022 : 0 : sFunction = sValue;
1023 : : }
1024 : 0 : break;
1025 : : }
1026 : 0 : }
1027 : 0 : }
1028 : :
1029 : 0 : ScXMLSubTotalFieldContext::~ScXMLSubTotalFieldContext()
1030 : : {
1031 [ # # ]: 0 : }
1032 : :
1033 : 0 : SvXMLImportContext *ScXMLSubTotalFieldContext::CreateChildContext( sal_uInt16 nPrefix,
1034 : : const ::rtl::OUString& rLName,
1035 : : const ::com::sun::star::uno::Reference<
1036 : : ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
1037 : : {
1038 : 0 : SvXMLImportContext *pContext = 0;
1039 : :
1040 [ # # ]: 0 : if( !pContext )
1041 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
1042 : :
1043 : 0 : return pContext;
1044 : : }
1045 : :
1046 : 0 : void ScXMLSubTotalFieldContext::EndElement()
1047 : : {
1048 : 0 : sheet::SubTotalColumn aSubTotalColumn;
1049 : 0 : aSubTotalColumn.Column = sFieldNumber.toInt32();
1050 [ # # ]: 0 : aSubTotalColumn.Function = ScXMLConverter::GetFunctionFromString( sFunction );
1051 [ # # ]: 0 : pSubTotalRuleContext->AddSubTotalColumn(aSubTotalColumn);
1052 : 0 : }
1053 : :
1054 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|