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

Generated by: LCOV version 1.10