diff options
Diffstat (limited to 'sc/source/filter/xml/xmldrani.cxx')
-rw-r--r-- | sc/source/filter/xml/xmldrani.cxx | 1216 |
1 files changed, 1216 insertions, 0 deletions
diff --git a/sc/source/filter/xml/xmldrani.cxx b/sc/source/filter/xml/xmldrani.cxx new file mode 100644 index 000000000000..17238ace3167 --- /dev/null +++ b/sc/source/filter/xml/xmldrani.cxx @@ -0,0 +1,1216 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +// INCLUDE --------------------------------------------------------------- + +#include "xmldrani.hxx" +#include "xmlimprt.hxx" +#include "xmlfilti.hxx" +#include "xmlsorti.hxx" +#include "document.hxx" +#include "globstr.hrc" +#include "globalnames.hxx" +#include "docuno.hxx" +#include "dbcolect.hxx" +#include "datauno.hxx" +#include "attrib.hxx" +#include "unonames.hxx" +#include "convuno.hxx" +#include "XMLConverter.hxx" +#include "rangeutl.hxx" + +#include <xmloff/xmltkmap.hxx> +#include <xmloff/nmspmap.hxx> +#include <xmloff/xmltoken.hxx> +#include <xmloff/xmlnmspe.hxx> +#include <xmloff/xmluconv.hxx> +#include <xmloff/xmlerror.hxx> +#include <com/sun/star/sheet/DataImportMode.hpp> +#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> +#include <com/sun/star/sheet/XDatabaseRanges.hpp> +#include <com/sun/star/sheet/XDatabaseRange.hpp> +#include <com/sun/star/table/CellRangeAddress.hpp> +#include <comphelper/extract.hxx> +#include <com/sun/star/uno/RuntimeException.hpp> +#include <com/sun/star/xml/sax/XLocator.hpp> + +#include <memory> + +#define SC_ENABLEUSERSORTLIST "EnableUserSortList" +#define SC_USERSORTLISTINDEX "UserSortListIndex" +#define SC_USERLIST "UserList" + +using namespace com::sun::star; +using namespace xmloff::token; +using ::rtl::OUString; + +//------------------------------------------------------------------ + +ScXMLDatabaseRangesContext::ScXMLDatabaseRangesContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) : + SvXMLImportContext( rImport, nPrfx, rLName ) +{ + // has no attributes + rImport.LockSolarMutex(); +} + +ScXMLDatabaseRangesContext::~ScXMLDatabaseRangesContext() +{ + GetScImport().UnlockSolarMutex(); +} + +SvXMLImportContext *ScXMLDatabaseRangesContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetDatabaseRangesElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_DATABASE_RANGE : + { + pContext = new ScXMLDatabaseRangeContext( GetScImport(), nPrefix, + rLName, xAttrList); + } + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLDatabaseRangesContext::EndElement() +{ +} + +ScXMLDatabaseRangeContext::ScXMLDatabaseRangeContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : + SvXMLImportContext( rImport, nPrfx, rLName ), + sDatabaseRangeName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)), + aSortSequence(), + eOrientation(table::TableOrientation_ROWS), + nRefresh(0), + nSubTotalsUserListIndex(0), + bContainsSort(false), + bContainsSubTotal(false), + bNative(sal_True), + bIsSelection(false), + bKeepFormats(false), + bMoveCells(false), + bStripData(false), + bContainsHeader(sal_True), + bAutoFilter(false), + bSubTotalsBindFormatsToContent(false), + bSubTotalsIsCaseSensitive(false), + bSubTotalsInsertPageBreaks(false), + bSubTotalsSortGroups(false), + bSubTotalsEnabledUserList(false), + bSubTotalsAscending(sal_True), + bFilterCopyOutputData(false), + bFilterIsCaseSensitive(false), + bFilterSkipDuplicates(false), + bFilterUseRegularExpressions(false), + bFilterConditionSourceRange(false), + meRangeType(GlobalNamed) +{ + nSourceType = sheet::DataImportMode_NONE; + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_DATABASE_RANGE_ATTR_NAME : + { + sDatabaseRangeName = sValue; + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_IS_SELECTION : + { + bIsSelection = IsXMLToken(sValue, XML_TRUE); + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_ON_UPDATE_KEEP_STYLES : + { + bKeepFormats = IsXMLToken(sValue, XML_TRUE); + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_ON_UPDATE_KEEP_SIZE : + { + bMoveCells = !IsXMLToken(sValue, XML_TRUE); + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_HAS_PERSISTENT_DATA : + { + bStripData = !IsXMLToken(sValue, XML_TRUE); + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_ORIENTATION : + { + if (IsXMLToken(sValue, XML_COLUMN)) + eOrientation = table::TableOrientation_COLUMNS; + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_CONTAINS_HEADER : + { + bContainsHeader = IsXMLToken(sValue, XML_TRUE); + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_DISPLAY_FILTER_BUTTONS : + { + bAutoFilter = IsXMLToken(sValue, XML_TRUE); + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_TARGET_RANGE_ADDRESS : + { + sRangeAddress = sValue; + } + break; + case XML_TOK_DATABASE_RANGE_ATTR_REFRESH_DELAY : + { + double fTime; + if( SvXMLUnitConverter::convertTime( fTime, sValue ) ) + nRefresh = Max( (sal_Int32)(fTime * 86400.0), (sal_Int32)0 ); + } + break; + } + } + + if (sDatabaseRangeName.matchAsciiL(STR_DB_LOCAL_NONAME, strlen(STR_DB_LOCAL_NONAME))) + meRangeType = SheetAnonymous; + else if (sDatabaseRangeName.matchAsciiL(STR_DB_GLOBAL_NONAME, strlen(STR_DB_GLOBAL_NONAME))) + meRangeType = GlobalAnonymous; +} + +ScXMLDatabaseRangeContext::~ScXMLDatabaseRangeContext() +{ +} + +SvXMLImportContext *ScXMLDatabaseRangeContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetDatabaseRangeElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_DATABASE_RANGE_SOURCE_SQL : + { + pContext = new ScXMLSourceSQLContext( GetScImport(), nPrefix, + rLName, xAttrList, this); + } + break; + case XML_TOK_DATABASE_RANGE_SOURCE_TABLE : + { + pContext = new ScXMLSourceTableContext( GetScImport(), nPrefix, + rLName, xAttrList, this); + } + break; + case XML_TOK_DATABASE_RANGE_SOURCE_QUERY : + { + pContext = new ScXMLSourceQueryContext( GetScImport(), nPrefix, + rLName, xAttrList, this); + } + break; + case XML_TOK_FILTER : + { + pContext = new ScXMLFilterContext( GetScImport(), nPrefix, + rLName, xAttrList, this); + } + break; + case XML_TOK_SORT : + { + bContainsSort = sal_True; + pContext = new ScXMLSortContext( GetScImport(), nPrefix, + rLName, xAttrList, this); + } + break; + case XML_TOK_DATABASE_RANGE_SUBTOTAL_RULES : + { + bContainsSubTotal = sal_True; + pContext = new ScXMLSubTotalRulesContext( GetScImport(), nPrefix, + rLName, xAttrList, this); + } + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +ScDBData* ScXMLDatabaseRangeContext::ConvertToDBData(const OUString& rName) +{ + ScDocument* pDoc = GetScImport().GetDocument(); + + sal_Int32 nOffset = 0; + ScRange aRange; + if (!ScRangeStringConverter::GetRangeFromString(aRange, sRangeAddress, pDoc, ::formula::FormulaGrammar::CONV_OOO, nOffset)) + return NULL; + + ::std::auto_ptr<ScDBData> pData( + new ScDBData(rName, aRange.aStart.Tab(), aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aEnd.Row())); + + pData->SetAutoFilter(bAutoFilter); + pData->SetKeepFmt(bKeepFormats); + pData->SetDoSize(bMoveCells); + pData->SetStripData(bStripData); + + { + ScImportParam aParam; + aParam.bNative = bNative; + aParam.aDBName = sDatabaseName.isEmpty() ? sConnectionRessource : sDatabaseName; + aParam.aStatement = sSourceObject; + sheet::DataImportMode eMode = static_cast<sheet::DataImportMode>(nSourceType); + switch (eMode) + { + case sheet::DataImportMode_NONE: + aParam.bImport = false; + break; + case sheet::DataImportMode_SQL: + aParam.bImport = true; + aParam.bSql = true; + break; + case sheet::DataImportMode_TABLE: + aParam.bImport = true; + aParam.bSql = false; + aParam.nType = ScDbTable; + break; + case sheet::DataImportMode_QUERY: + aParam.bImport = true; + aParam.bSql = false; + aParam.nType = ScDbQuery; + break; + default: + OSL_FAIL("Unknown data import mode"); + aParam.bImport = false; + } + pData->SetImportParam(aParam); + } + + { + ScQueryParam aParam; + pData->GetQueryParam(aParam); + aParam.bByRow = (eOrientation == table::TableOrientation_ROWS); + aParam.bHasHeader = bContainsHeader; + aParam.bInplace = !bFilterCopyOutputData; + aParam.bCaseSens = bFilterIsCaseSensitive; + aParam.bDuplicate = !bFilterSkipDuplicates; + aParam.bRegExp = bFilterUseRegularExpressions; + aParam.nDestTab = aFilterOutputPosition.Sheet; + aParam.nDestCol = aFilterOutputPosition.Column; + aParam.nDestRow = aFilterOutputPosition.Row; + ScFilterDescriptorBase::fillQueryParam(aParam, pDoc, aFilterFields); + + // Convert from relative to absolute column IDs for the fields. Calc + // core expects the field positions to be absolute column IDs. + SCCOLROW nStartPos = aParam.bByRow ? aRange.aStart.Col() : aRange.aStart.Row(); + for (size_t i = 0; i < MAXQUERY; ++i) + { + ScQueryEntry& rEntry = aParam.GetEntry(i); + if (!rEntry.bDoQuery) + break; + rEntry.nField += nStartPos; + } + + pData->SetQueryParam(aParam); + } + + if (bFilterConditionSourceRange) + { + ScRange aAdvSource; + ScUnoConversion::FillScRange(aAdvSource, aFilterConditionSourceRangeAddress); + pData->SetAdvancedQuerySource(&aAdvSource); + } + + if (bContainsSort) + { + size_t nOldSize = aSortSequence.getLength(); + aSortSequence.realloc(nOldSize + 1); + beans::PropertyValue aProperty; + aProperty.Name = OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ORIENT)); + aProperty.Value <<= eOrientation; + aSortSequence[nOldSize] = aProperty; + ScSortParam aParam; + ScSortDescriptor::FillSortParam(aParam, aSortSequence); + + SCCOLROW nStartPos = aParam.bByRow ? aRange.aStart.Col() : aRange.aStart.Row(); + for (size_t i = 0; i < MAXSORT; ++i) + { + if (!aParam.bDoSort[i]) + break; + aParam.nField[i] += nStartPos; + } + + pData->SetSortParam(aParam); + } + + if (bContainsSubTotal) + { + ScSubTotalParam aParam; + aParam.bIncludePattern = bSubTotalsBindFormatsToContent; + aParam.bUserDef = bSubTotalsEnabledUserList; + aParam.nUserIndex = nSubTotalsUserListIndex; + aParam.bPagebreak = bSubTotalsInsertPageBreaks; + aParam.bCaseSens = bSubTotalsIsCaseSensitive; + aParam.bDoSort = bSubTotalsSortGroups; + aParam.bAscending = bSubTotalsAscending; + aParam.bUserDef = bSubTotalsEnabledUserList; + aParam.nUserIndex = nSubTotalsUserListIndex; + std::vector <ScSubTotalRule>::iterator itr = aSubTotalRules.begin(), itrEnd = aSubTotalRules.end(); + for (size_t nPos = 0; itr != itrEnd; ++itr, ++nPos) + { + if (nPos >= MAXSUBTOTAL) + break; + + const uno::Sequence<sheet::SubTotalColumn>& rColumns = itr->aSubTotalColumns; + sal_Int32 nColCount = rColumns.getLength(); + sal_Int16 nGroupColumn = itr->nSubTotalRuleGroupFieldNumber; + aParam.bGroupActive[nPos] = true; + aParam.nField[nPos] = static_cast<SCCOL>(nGroupColumn); + + SCCOL nCount = static_cast<SCCOL>(nColCount); + aParam.nSubTotals[nPos] = nCount; + if (nCount != 0) + { + aParam.pSubTotals[nPos] = new SCCOL[nCount]; + aParam.pFunctions[nPos] = new ScSubTotalFunc[nCount]; + + const sheet::SubTotalColumn* pAry = rColumns.getConstArray(); + for (SCCOL i = 0; i < nCount; ++i) + { + aParam.pSubTotals[nPos][i] = static_cast<SCCOL>(pAry[i].Column); + aParam.pFunctions[nPos][i] = + ScDataUnoConversion::GeneralToSubTotal( pAry[i].Function ); + } + } + else + { + aParam.pSubTotals[nPos] = NULL; + aParam.pFunctions[nPos] = NULL; + } + } + + pData->SetSubTotalParam(aParam); + } + + if (pData->HasImportParam() && !pData->HasImportSelection()) + { + pData->SetRefreshDelay(nRefresh); + pData->SetRefreshHandler(pDoc->GetDBCollection()->GetRefreshHandler()); + pData->SetRefreshControl(pDoc->GetRefreshTimerControlAddress()); + } + + return pData.release(); +} + +void ScXMLDatabaseRangeContext::EndElement() +{ + ScDocument* pDoc = GetScImport().GetDocument(); + if (!pDoc) + return; + + if (meRangeType == SheetAnonymous) + { + OUString aName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)); + ::std::auto_ptr<ScDBData> pData(ConvertToDBData(aName)); + + if (pData.get()) + { + ScRange aRange; + pData->GetArea(aRange); + if (pData->HasAutoFilter()) + { + // Set autofilter flags so that the buttons get displayed. + pDoc->ApplyFlagsTab( + aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aStart.Row(), + aRange.aStart.Tab(), SC_MF_AUTO); + } + + pDoc->SetAnonymousDBData(aRange.aStart.Tab(), pData.release()); + } + return; + } + else if (meRangeType == GlobalAnonymous) + { + OUString aName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_GLOBAL_NONAME)); + ::std::auto_ptr<ScDBData> pData(ConvertToDBData(aName)); + + if (pData.get()) + { + if (pData->HasAutoFilter()) + { + // Set autofilter flags so that the buttons get displayed. + ScRange aRange; + pData->GetArea(aRange); + pDoc->ApplyFlagsTab( + aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aStart.Row(), + aRange.aStart.Tab(), SC_MF_AUTO); + pDoc->SetAnonymousDBData(aRange.aStart.Tab(), pData.release()); + } + else + pDoc->GetDBCollection()->insertAnonRange(pData.release()); + } + return; + } + + if (GetScImport().GetModel().is()) + { + uno::Reference <beans::XPropertySet> xPropertySet( GetScImport().GetModel(), uno::UNO_QUERY ); + if (xPropertySet.is()) + { + uno::Reference <sheet::XDatabaseRanges> xDatabaseRanges(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_DATABASERNG))), uno::UNO_QUERY); + if (xDatabaseRanges.is()) + { + table::CellRangeAddress aCellRangeAddress; + sal_Int32 nOffset(0); + if (ScRangeStringConverter::GetRangeFromString( aCellRangeAddress, sRangeAddress, pDoc, ::formula::FormulaGrammar::CONV_OOO, nOffset )) + { + sal_Bool bInsert(sal_True); + try + { + xDatabaseRanges->addNewByName(sDatabaseRangeName, aCellRangeAddress); + } + catch ( uno::RuntimeException& rRuntimeException ) + { + bInsert = false; + rtl::OUString sErrorMessage(RTL_CONSTASCII_USTRINGPARAM("DatabaseRange ")); + sErrorMessage += sDatabaseRangeName; + sErrorMessage += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" could not be created with the range ")); + sErrorMessage += sRangeAddress; + uno::Sequence<rtl::OUString> aSeq(1); + aSeq[0] = sErrorMessage; + uno::Reference<xml::sax::XLocator> xLocator; + GetScImport().SetError(XMLERROR_API | XMLERROR_FLAG_ERROR, aSeq, rRuntimeException.Message, xLocator); + } + if (bInsert) + { + uno::Reference <sheet::XDatabaseRange> xDatabaseRange(xDatabaseRanges->getByName(sDatabaseRangeName), uno::UNO_QUERY); + if (xDatabaseRange.is()) + { + uno::Reference <beans::XPropertySet> xDatabaseRangePropertySet (xDatabaseRange, uno::UNO_QUERY); + if (xDatabaseRangePropertySet.is()) + { + xDatabaseRangePropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_KEEPFORM)), uno::makeAny(bKeepFormats)); + xDatabaseRangePropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_MOVCELLS)), uno::makeAny(bMoveCells)); + xDatabaseRangePropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_STRIPDAT)), uno::makeAny(bStripData)); + } + uno::Sequence <beans::PropertyValue> aImportDescriptor(xDatabaseRange->getImportDescriptor()); + sal_Int32 nImportProperties = aImportDescriptor.getLength(); + for (sal_Int16 i = 0; i < nImportProperties; ++i) + { + if (aImportDescriptor[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_DBNAME))) + { + if (sDatabaseName.getLength()) + { + aImportDescriptor[i].Value <<= sDatabaseName; + } + else + { + aImportDescriptor[i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CONRES)); + aImportDescriptor[i].Value <<= sConnectionRessource; + } + } + else if (aImportDescriptor[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SRCOBJ))) + aImportDescriptor[i].Value <<= sSourceObject; + else if (aImportDescriptor[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SRCTYPE))) + aImportDescriptor[i].Value <<= nSourceType; + else if (aImportDescriptor[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ISNATIVE))) + aImportDescriptor[i].Value <<= bNative; + } + ScDBCollection* pDBCollection = pDoc->GetDBCollection(); + sal_uInt16 nIndex; + pDBCollection->SearchName(sDatabaseRangeName, nIndex); + ScDBData* pDBData = (*pDBCollection)[nIndex]; + pDBData->SetImportSelection(bIsSelection); + pDBData->SetAutoFilter(bAutoFilter); + if (bAutoFilter) + pDoc->ApplyFlagsTab( static_cast<SCCOL>(aCellRangeAddress.StartColumn), static_cast<SCROW>(aCellRangeAddress.StartRow), + static_cast<SCCOL>(aCellRangeAddress.EndColumn), static_cast<SCROW>(aCellRangeAddress.StartRow), + aCellRangeAddress.Sheet, SC_MF_AUTO ); + ScImportParam aImportParam; + ScImportDescriptor::FillImportParam(aImportParam, aImportDescriptor); + pDBData->SetImportParam(aImportParam); + if (bContainsSort) + { + sal_uInt32 nOldSize(aSortSequence.getLength()); + aSortSequence.realloc(nOldSize + 1); + beans::PropertyValue aProperty; + aProperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ORIENT)); + aProperty.Value <<= eOrientation; + aSortSequence[nOldSize] = aProperty; + ScSortParam aSortParam; + ScSortDescriptor::FillSortParam(aSortParam, aSortSequence); + + //#98317#; until now the Fields are relative to the left top edge of the range, but the + // core wants to have the absolute position (column/row) + SCCOLROW nFieldStart = aSortParam.bByRow ? static_cast<SCCOLROW>(aCellRangeAddress.StartColumn) : static_cast<SCCOLROW>(aCellRangeAddress.StartRow); + for (sal_uInt16 i = 0; i < MAXSORT; ++i) + { + if (aSortParam.bDoSort[i]) + aSortParam.nField[i] += nFieldStart; + } + + pDBData->SetSortParam(aSortParam); + } + uno::Reference< sheet::XSheetFilterDescriptor2 > xSheetFilterDescriptor( + xDatabaseRange->getFilterDescriptor(), uno::UNO_QUERY ); + if (xSheetFilterDescriptor.is()) + { + uno::Reference <beans::XPropertySet> xFilterPropertySet (xSheetFilterDescriptor, uno::UNO_QUERY); + if (xFilterPropertySet.is()) + { + sal_Bool bOrientation(table::TableOrientation_COLUMNS == eOrientation); + xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ORIENT)), uno::makeAny(bOrientation)); + xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CONTHDR)), uno::makeAny(bContainsHeader)); + xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_COPYOUT)), uno::makeAny(bFilterCopyOutputData)); + xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ISCASE)), uno::makeAny(bFilterIsCaseSensitive)); + xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SKIPDUP)), uno::makeAny(bFilterSkipDuplicates)); + xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_USEREGEX)), uno::makeAny(bFilterUseRegularExpressions)); + xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_OUTPOS)), uno::makeAny(aFilterOutputPosition)); + } + xSheetFilterDescriptor->setFilterFields2(aFilterFields); + if (bFilterConditionSourceRange) + { + ScRange aAdvSource; + ScUnoConversion::FillScRange( aAdvSource, aFilterConditionSourceRangeAddress ); + pDBData->SetAdvancedQuerySource(&aAdvSource); + } + } + if (bContainsSubTotal) + { + uno::Reference <sheet::XSubTotalDescriptor> xSubTotalDescriptor(xDatabaseRange->getSubTotalDescriptor()); + if (xSubTotalDescriptor.is()) + { + uno::Reference <beans::XPropertySet> xSubTotalPropertySet (xSubTotalDescriptor, uno::UNO_QUERY); + if( xSubTotalPropertySet.is()) + { + xSubTotalPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_BINDFMT)), uno::makeAny(bSubTotalsBindFormatsToContent)); + xSubTotalPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ENABLEUSERSORTLIST)), uno::makeAny(bSubTotalsEnabledUserList)); + xSubTotalPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_USERSORTLISTINDEX)), uno::makeAny(nSubTotalsUserListIndex)); + xSubTotalPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INSBRK)), uno::makeAny(bSubTotalsInsertPageBreaks)); + xSubTotalPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ISCASE)), uno::makeAny(bSubTotalsIsCaseSensitive)); + } + ScSubTotalParam aSubTotalParam; + aSubTotalParam.bDoSort = bSubTotalsSortGroups; + aSubTotalParam.bAscending = bSubTotalsAscending; + aSubTotalParam.bUserDef = bSubTotalsEnabledUserList; + aSubTotalParam.nUserIndex = nSubTotalsUserListIndex; + pDBData->SetSubTotalParam(aSubTotalParam); + std::vector < ScSubTotalRule >::iterator aItr(aSubTotalRules.begin()); + while (!aSubTotalRules.empty()) + { + xSubTotalDescriptor->addNew(aItr->aSubTotalColumns, aItr->nSubTotalRuleGroupFieldNumber); + aItr = aSubTotalRules.erase(aItr); + } + } + } + if ( pDBData->HasImportParam() && !pDBData->HasImportSelection() ) + { + pDBData->SetRefreshDelay( nRefresh ); + pDBData->SetRefreshHandler( pDBCollection->GetRefreshHandler() ); + pDBData->SetRefreshControl( pDoc->GetRefreshTimerControlAddress() ); + } + } + } + } + } + } + } +} + +ScXMLSourceSQLContext::ScXMLSourceSQLContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pDatabaseRangeContext(pTempDatabaseRangeContext) +{ + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceSQLAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_SOURCE_SQL_ATTR_DATABASE_NAME : + { + sDBName = sValue; + } + break; + case XML_TOK_SOURCE_SQL_ATTR_SQL_STATEMENT : + { + pDatabaseRangeContext->SetSourceObject(sValue); + } + break; + case XML_TOK_SOURCE_SQL_ATTR_PARSE_SQL_STATEMENT : + { + pDatabaseRangeContext->SetNative(IsXMLToken(sValue, XML_TRUE)); + } + break; + } + } + pDatabaseRangeContext->SetSourceType(sheet::DataImportMode_SQL); +} + +ScXMLSourceSQLContext::~ScXMLSourceSQLContext() +{ +} + +SvXMLImportContext *ScXMLSourceSQLContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + if ( nPrefix == XML_NAMESPACE_FORM ) + { + if (IsXMLToken(rLName, XML_CONNECTION_RESOURCE) && (sDBName.getLength() == 0)) + { + pContext = new ScXMLConResContext( GetScImport(), nPrefix, + rLName, xAttrList, pDatabaseRangeContext); + } + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLSourceSQLContext::EndElement() +{ + if (sDBName.getLength()) + pDatabaseRangeContext->SetDatabaseName(sDBName); +} + +ScXMLSourceTableContext::ScXMLSourceTableContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pDatabaseRangeContext(pTempDatabaseRangeContext) +{ + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceTableAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_SOURCE_TABLE_ATTR_DATABASE_NAME : + { + sDBName = sValue; + } + break; + case XML_TOK_SOURCE_TABLE_ATTR_TABLE_NAME : + { + pDatabaseRangeContext->SetSourceObject(sValue); + } + break; + } + } + pDatabaseRangeContext->SetSourceType(sheet::DataImportMode_TABLE); +} + +ScXMLSourceTableContext::~ScXMLSourceTableContext() +{ +} + +SvXMLImportContext *ScXMLSourceTableContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + if ( nPrefix == XML_NAMESPACE_FORM ) + { + if (IsXMLToken(rLName, XML_CONNECTION_RESOURCE) && (sDBName.getLength() == 0)) + { + pContext = new ScXMLConResContext( GetScImport(), nPrefix, + rLName, xAttrList, pDatabaseRangeContext); + } + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLSourceTableContext::EndElement() +{ + if (sDBName.getLength()) + pDatabaseRangeContext->SetDatabaseName(sDBName); +} + +ScXMLSourceQueryContext::ScXMLSourceQueryContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pDatabaseRangeContext(pTempDatabaseRangeContext) +{ + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSourceQueryAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_SOURCE_QUERY_ATTR_DATABASE_NAME : + { + sDBName = sValue; + } + break; + case XML_TOK_SOURCE_QUERY_ATTR_QUERY_NAME : + { + pDatabaseRangeContext->SetSourceObject(sValue); + } + break; + } + } + pDatabaseRangeContext->SetSourceType(sheet::DataImportMode_QUERY); +} + +ScXMLSourceQueryContext::~ScXMLSourceQueryContext() +{ +} + +SvXMLImportContext *ScXMLSourceQueryContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + if ( nPrefix == XML_NAMESPACE_FORM ) + { + if (IsXMLToken(rLName, XML_CONNECTION_RESOURCE) && (sDBName.getLength() == 0)) + { + pContext = new ScXMLConResContext( GetScImport(), nPrefix, + rLName, xAttrList, pDatabaseRangeContext); + } + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLSourceQueryContext::EndElement() +{ + if (sDBName.getLength()) + pDatabaseRangeContext->SetDatabaseName(sDBName); +} + +ScXMLConResContext::ScXMLConResContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pDatabaseRangeContext( pTempDatabaseRangeContext ) +{ + rtl::OUString sConRes; + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for( sal_Int16 i=0; i < nAttrCount; i++ ) + { + rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + rtl::OUString sValue = xAttrList->getValueByIndex( i ); + + if (nPrefix == XML_NAMESPACE_XLINK) + { + if (IsXMLToken(aLocalName, XML_HREF)) + sConRes = sValue; + } + } + if (sConRes.getLength()) + pDatabaseRangeContext->SetConnectionRessource(sConRes); +} + +ScXMLConResContext::~ScXMLConResContext() +{ +} + +SvXMLImportContext *ScXMLConResContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) +{ + SvXMLImportContext *pContext = 0; + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLConResContext::EndElement() +{ +} + +ScXMLSubTotalRulesContext::ScXMLSubTotalRulesContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pDatabaseRangeContext(pTempDatabaseRangeContext) +{ + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDatabaseRangeSubTotalRulesAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_SUBTOTAL_RULES_ATTR_BIND_STYLES_TO_CONTENT : + { + pDatabaseRangeContext->SetSubTotalsBindFormatsToContent(IsXMLToken(sValue, XML_TRUE)); + } + break; + case XML_TOK_SUBTOTAL_RULES_ATTR_CASE_SENSITIVE : + { + pDatabaseRangeContext->SetSubTotalsIsCaseSensitive(IsXMLToken(sValue, XML_TRUE)); + } + break; + case XML_TOK_SUBTOTAL_RULES_ATTR_PAGE_BREAKS_ON_GROUP_CHANGE : + { + pDatabaseRangeContext->SetSubTotalsInsertPageBreaks(IsXMLToken(sValue, XML_TRUE)); + } + break; + } + } +} + +ScXMLSubTotalRulesContext::~ScXMLSubTotalRulesContext() +{ +} + +SvXMLImportContext *ScXMLSubTotalRulesContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetDatabaseRangeSubTotalRulesElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_SUBTOTAL_RULES_SORT_GROUPS : + { + pContext = new ScXMLSortGroupsContext( GetScImport(), nPrefix, + rLName, xAttrList, pDatabaseRangeContext); + } + break; + case XML_TOK_SUBTOTAL_RULES_SUBTOTAL_RULE : + { + pContext = new ScXMLSubTotalRuleContext( GetScImport(), nPrefix, + rLName, xAttrList, pDatabaseRangeContext); + } + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLSubTotalRulesContext::EndElement() +{ +} + +ScXMLSortGroupsContext::ScXMLSortGroupsContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pDatabaseRangeContext(pTempDatabaseRangeContext) +{ + pDatabaseRangeContext->SetSubTotalsSortGroups(sal_True); + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetSubTotalRulesSortGroupsAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_SORT_GROUPS_ATTR_DATA_TYPE : + { + if (sValue.getLength() > 8) + { + rtl::OUString sTemp = sValue.copy(0, 8); + if (sTemp.compareToAscii(SC_USERLIST) == 0) + { + pDatabaseRangeContext->SetSubTotalsEnabledUserList(sal_True); + sTemp = sValue.copy(8); + pDatabaseRangeContext->SetSubTotalsUserListIndex(static_cast<sal_Int16>(sTemp.toInt32())); + } + else + { + //if (IsXMLToken(sValue, XML_AUTOMATIC)) + //aSortField.FieldType = util::SortFieldType_AUTOMATIC; + // is not supported by StarOffice + } + } + else + { + //if (IsXMLToken(sValue, XML_TEXT)) + //aSortField.FieldType = util::SortFieldType_ALPHANUMERIC; + // is not supported by StarOffice + //else if (IsXMLToken(sValue, XML_NUMBER)) + //aSortField.FieldType = util::SortFieldType_NUMERIC; + // is not supported by StarOffice + } + } + break; + case XML_TOK_SORT_GROUPS_ATTR_ORDER : + { + if (IsXMLToken(sValue, XML_ASCENDING)) + pDatabaseRangeContext->SetSubTotalsAscending(sal_True); + else + pDatabaseRangeContext->SetSubTotalsAscending(false); + } + break; + } + } +} + +ScXMLSortGroupsContext::~ScXMLSortGroupsContext() +{ +} + +SvXMLImportContext *ScXMLSortGroupsContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) +{ + SvXMLImportContext *pContext = 0; + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLSortGroupsContext::EndElement() +{ +} + +ScXMLSubTotalRuleContext::ScXMLSubTotalRuleContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLDatabaseRangeContext* pTempDatabaseRangeContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pDatabaseRangeContext(pTempDatabaseRangeContext) +{ + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetSubTotalRulesSubTotalRuleAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_SUBTOTAL_RULE_ATTR_GROUP_BY_FIELD_NUMBER : + { + aSubTotalRule.nSubTotalRuleGroupFieldNumber = static_cast<sal_Int16>(sValue.toInt32()); + } + break; + } + } +} + +ScXMLSubTotalRuleContext::~ScXMLSubTotalRuleContext() +{ +} + +SvXMLImportContext *ScXMLSubTotalRuleContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetSubTotalRulesSubTotalRuleElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_SUBTOTAL_RULE_SUBTOTAL_FIELD : + { + pContext = new ScXMLSubTotalFieldContext( GetScImport(), nPrefix, + rLName, xAttrList, this); + } + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLSubTotalRuleContext::EndElement() +{ + if (pDatabaseRangeContext) + pDatabaseRangeContext->AddSubTotalRule(aSubTotalRule); +} + +ScXMLSubTotalFieldContext::ScXMLSubTotalFieldContext( ScXMLImport& rImport, + sal_uInt16 nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLSubTotalRuleContext* pTempSubTotalRuleContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + pSubTotalRuleContext(pTempSubTotalRuleContext) +{ + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetSubTotalRuleSubTotalFieldAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_SUBTOTAL_FIELD_ATTR_FIELD_NUMBER : + { + sFieldNumber = sValue; + } + break; + case XML_TOK_SUBTOTAL_FIELD_ATTR_FUNCTION : + { + sFunction = sValue; + } + break; + } + } +} + +ScXMLSubTotalFieldContext::~ScXMLSubTotalFieldContext() +{ +} + +SvXMLImportContext *ScXMLSubTotalFieldContext::CreateChildContext( sal_uInt16 nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) +{ + SvXMLImportContext *pContext = 0; + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLSubTotalFieldContext::EndElement() +{ + sheet::SubTotalColumn aSubTotalColumn; + aSubTotalColumn.Column = sFieldNumber.toInt32(); + aSubTotalColumn.Function = ScXMLConverter::GetFunctionFromString( sFunction ); + pSubTotalRuleContext->AddSubTotalColumn(aSubTotalColumn); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |