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

Generated by: LCOV version 1.10