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