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