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