LCOV - code coverage report
Current view: top level - sc/source/filter/xml - xmldrani.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 173 472 36.7 %
Date: 2015-06-13 12:38:46 Functions: 18 54 33.3 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11