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