blob: 74be0bdec5296be0d89663ac0a554c9a48d3a004 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
//___________________________________________________________________
#include "XMLConsolidationContext.hxx"
#include "document.hxx"
#include "rangeutl.hxx"
#include "xmlimprt.hxx"
#include "XMLConverter.hxx"
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmltoken.hxx>
using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace xmloff::token;
//___________________________________________________________________
ScXMLConsolidationContext::ScXMLConsolidationContext(
ScXMLImport& rImport,
sal_uInt16 nPrfx,
const OUString& rLName,
const uno::Reference< xml::sax::XAttributeList >& xAttrList ) :
SvXMLImportContext( rImport, nPrfx, rLName ),
eFunction( SUBTOTAL_FUNC_NONE ),
bLinkToSource( sal_False ),
bTargetAddr(sal_False)
{
rImport.LockSolarMutex();
if( !xAttrList.is() ) return;
sal_Int16 nAttrCount = xAttrList->getLength();
const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetConsolidationAttrTokenMap();
for( sal_Int16 nIndex = 0; nIndex < nAttrCount; ++nIndex )
{
const rtl::OUString& sAttrName (xAttrList->getNameByIndex( nIndex ));
const rtl::OUString& sValue (xAttrList->getValueByIndex( nIndex ));
OUString aLocalName;
sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
{
case XML_TOK_CONSOLIDATION_ATTR_FUNCTION:
eFunction = ScXMLConverter::GetSubTotalFuncFromString( sValue );
break;
case XML_TOK_CONSOLIDATION_ATTR_SOURCE_RANGES:
sSourceList = sValue;
break;
case XML_TOK_CONSOLIDATION_ATTR_TARGET_ADDRESS:
{
sal_Int32 nOffset(0);
bTargetAddr = ScRangeStringConverter::GetAddressFromString(
aTargetAddr, sValue, GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO, nOffset );
}
break;
case XML_TOK_CONSOLIDATION_ATTR_USE_LABEL:
sUseLabel = sValue;
break;
case XML_TOK_CONSOLIDATION_ATTR_LINK_TO_SOURCE:
bLinkToSource = IsXMLToken(sValue, XML_TRUE);
break;
}
}
}
ScXMLConsolidationContext::~ScXMLConsolidationContext()
{
}
SvXMLImportContext *ScXMLConsolidationContext::CreateChildContext(
sal_uInt16 nPrefix,
const OUString& rLName,
const uno::Reference< xml::sax::XAttributeList>& /* xAttrList */ )
{
return new SvXMLImportContext( GetImport(), nPrefix, rLName );
}
void ScXMLConsolidationContext::EndElement()
{
if (bTargetAddr)
{
ScConsolidateParam aConsParam;
aConsParam.nCol = aTargetAddr.Col();
aConsParam.nRow = aTargetAddr.Row();
aConsParam.nTab = aTargetAddr.Tab();
aConsParam.eFunction = eFunction;
sal_Bool bError = sal_False;
sal_uInt16 nCount = (sal_uInt16) Min( ScRangeStringConverter::GetTokenCount( sSourceList ), (sal_Int32)0xFFFF );
ScArea** ppAreas = nCount ? new ScArea*[ nCount ] : NULL;
if( ppAreas )
{
sal_Int32 nOffset = 0;
sal_uInt16 nIndex;
for( nIndex = 0; nIndex < nCount; ++nIndex )
{
ppAreas[ nIndex ] = new ScArea;
if ( !ScRangeStringConverter::GetAreaFromString(
*ppAreas[ nIndex ], sSourceList, GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO, nOffset ) )
{
bError = sal_True; //! handle error
}
}
aConsParam.SetAreas( ppAreas, nCount );
// array is copied in SetAreas
for( nIndex = 0; nIndex < nCount; ++nIndex )
delete ppAreas[nIndex];
delete[] ppAreas;
}
aConsParam.bByCol = aConsParam.bByRow = sal_False;
if( IsXMLToken(sUseLabel, XML_COLUMN ) )
aConsParam.bByCol = sal_True;
else if( IsXMLToken( sUseLabel, XML_ROW ) )
aConsParam.bByRow = sal_True;
else if( IsXMLToken( sUseLabel, XML_BOTH ) )
aConsParam.bByCol = aConsParam.bByRow = sal_True;
aConsParam.bReferenceData = bLinkToSource;
ScDocument* pDoc = GetScImport().GetDocument();
if( pDoc )
pDoc->SetConsolidateDlgData( &aConsParam );
}
GetScImport().UnlockSolarMutex();
}