1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski //___________________________________________________________________
30*b1cdbd2cSJim Jagielski #include "XMLConsolidationContext.hxx"
31*b1cdbd2cSJim Jagielski #include "document.hxx"
32*b1cdbd2cSJim Jagielski #include "rangeutl.hxx"
33*b1cdbd2cSJim Jagielski #include "xmlimprt.hxx"
34*b1cdbd2cSJim Jagielski #include "XMLConverter.hxx"
35*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
36*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski using ::rtl::OUString;
39*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
40*b1cdbd2cSJim Jagielski using namespace xmloff::token;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski //___________________________________________________________________
44*b1cdbd2cSJim Jagielski 
ScXMLConsolidationContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)45*b1cdbd2cSJim Jagielski ScXMLConsolidationContext::ScXMLConsolidationContext(
46*b1cdbd2cSJim Jagielski 		ScXMLImport& rImport,
47*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrfx,
48*b1cdbd2cSJim Jagielski 		const OUString& rLName,
49*b1cdbd2cSJim Jagielski 		const uno::Reference< xml::sax::XAttributeList >& xAttrList ) :
50*b1cdbd2cSJim Jagielski 	SvXMLImportContext( rImport, nPrfx, rLName ),
51*b1cdbd2cSJim Jagielski 	eFunction( SUBTOTAL_FUNC_NONE ),
52*b1cdbd2cSJim Jagielski 	bLinkToSource( sal_False ),
53*b1cdbd2cSJim Jagielski 	bTargetAddr(sal_False)
54*b1cdbd2cSJim Jagielski {
55*b1cdbd2cSJim Jagielski 	rImport.LockSolarMutex();
56*b1cdbd2cSJim Jagielski 	if( !xAttrList.is() ) return;
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski 	sal_Int16				nAttrCount		= xAttrList->getLength();
59*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap&	rAttrTokenMap	= GetScImport().GetConsolidationAttrTokenMap();
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 	for( sal_Int16 nIndex = 0; nIndex < nAttrCount; ++nIndex )
62*b1cdbd2cSJim Jagielski 	{
63*b1cdbd2cSJim Jagielski 		const rtl::OUString& sAttrName	(xAttrList->getNameByIndex( nIndex ));
64*b1cdbd2cSJim Jagielski 		const rtl::OUString& sValue		(xAttrList->getValueByIndex( nIndex ));
65*b1cdbd2cSJim Jagielski 		OUString aLocalName;
66*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix		= GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 		switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
69*b1cdbd2cSJim Jagielski 		{
70*b1cdbd2cSJim Jagielski 			case XML_TOK_CONSOLIDATION_ATTR_FUNCTION:
71*b1cdbd2cSJim Jagielski 				eFunction = ScXMLConverter::GetSubTotalFuncFromString( sValue );
72*b1cdbd2cSJim Jagielski 			break;
73*b1cdbd2cSJim Jagielski 			case XML_TOK_CONSOLIDATION_ATTR_SOURCE_RANGES:
74*b1cdbd2cSJim Jagielski 				sSourceList = sValue;
75*b1cdbd2cSJim Jagielski 			break;
76*b1cdbd2cSJim Jagielski 			case XML_TOK_CONSOLIDATION_ATTR_TARGET_ADDRESS:
77*b1cdbd2cSJim Jagielski 				{
78*b1cdbd2cSJim Jagielski 					sal_Int32 nOffset(0);
79*b1cdbd2cSJim Jagielski 					bTargetAddr = ScRangeStringConverter::GetAddressFromString(
80*b1cdbd2cSJim Jagielski 						aTargetAddr, sValue, GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO, nOffset );
81*b1cdbd2cSJim Jagielski 				}
82*b1cdbd2cSJim Jagielski 				break;
83*b1cdbd2cSJim Jagielski 			case XML_TOK_CONSOLIDATION_ATTR_USE_LABEL:
84*b1cdbd2cSJim Jagielski 				sUseLabel = sValue;
85*b1cdbd2cSJim Jagielski 			break;
86*b1cdbd2cSJim Jagielski 			case XML_TOK_CONSOLIDATION_ATTR_LINK_TO_SOURCE:
87*b1cdbd2cSJim Jagielski 				bLinkToSource = IsXMLToken(sValue, XML_TRUE);
88*b1cdbd2cSJim Jagielski 			break;
89*b1cdbd2cSJim Jagielski 		}
90*b1cdbd2cSJim Jagielski 	}
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski 
~ScXMLConsolidationContext()93*b1cdbd2cSJim Jagielski ScXMLConsolidationContext::~ScXMLConsolidationContext()
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski }
96*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLName,const uno::Reference<xml::sax::XAttributeList> &)97*b1cdbd2cSJim Jagielski SvXMLImportContext *ScXMLConsolidationContext::CreateChildContext(
98*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix,
99*b1cdbd2cSJim Jagielski 		const OUString& rLName,
100*b1cdbd2cSJim Jagielski         const uno::Reference< xml::sax::XAttributeList>& /* xAttrList */ )
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski 	return new SvXMLImportContext( GetImport(), nPrefix, rLName );
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
EndElement()105*b1cdbd2cSJim Jagielski void ScXMLConsolidationContext::EndElement()
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski 	if (bTargetAddr)
108*b1cdbd2cSJim Jagielski 	{
109*b1cdbd2cSJim Jagielski 		ScConsolidateParam aConsParam;
110*b1cdbd2cSJim Jagielski 		aConsParam.nCol = aTargetAddr.Col();
111*b1cdbd2cSJim Jagielski 		aConsParam.nRow = aTargetAddr.Row();
112*b1cdbd2cSJim Jagielski 		aConsParam.nTab = aTargetAddr.Tab();
113*b1cdbd2cSJim Jagielski 		aConsParam.eFunction = eFunction;
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 		sal_Bool bError = sal_False;
116*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = (sal_uInt16) Min( ScRangeStringConverter::GetTokenCount( sSourceList ), (sal_Int32)0xFFFF );
117*b1cdbd2cSJim Jagielski 		ScArea** ppAreas = nCount ? new ScArea*[ nCount ] : NULL;
118*b1cdbd2cSJim Jagielski 		if( ppAreas )
119*b1cdbd2cSJim Jagielski 		{
120*b1cdbd2cSJim Jagielski 			sal_Int32 nOffset = 0;
121*b1cdbd2cSJim Jagielski 			sal_uInt16 nIndex;
122*b1cdbd2cSJim Jagielski 			for( nIndex = 0; nIndex < nCount; ++nIndex )
123*b1cdbd2cSJim Jagielski 			{
124*b1cdbd2cSJim Jagielski 				ppAreas[ nIndex ] = new ScArea;
125*b1cdbd2cSJim Jagielski 				if ( !ScRangeStringConverter::GetAreaFromString(
126*b1cdbd2cSJim Jagielski 					*ppAreas[ nIndex ], sSourceList, GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO, nOffset ) )
127*b1cdbd2cSJim Jagielski 				{
128*b1cdbd2cSJim Jagielski 					bError = sal_True;		//! handle error
129*b1cdbd2cSJim Jagielski 				}
130*b1cdbd2cSJim Jagielski 			}
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 			aConsParam.SetAreas( ppAreas, nCount );
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 			// array is copied in SetAreas
135*b1cdbd2cSJim Jagielski 			for( nIndex = 0; nIndex < nCount; ++nIndex )
136*b1cdbd2cSJim Jagielski 				delete ppAreas[nIndex];
137*b1cdbd2cSJim Jagielski 			delete[] ppAreas;
138*b1cdbd2cSJim Jagielski 		}
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 		aConsParam.bByCol = aConsParam.bByRow = sal_False;
141*b1cdbd2cSJim Jagielski 		if( IsXMLToken(sUseLabel, XML_COLUMN ) )
142*b1cdbd2cSJim Jagielski 			aConsParam.bByCol = sal_True;
143*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( sUseLabel, XML_ROW ) )
144*b1cdbd2cSJim Jagielski 			aConsParam.bByRow = sal_True;
145*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( sUseLabel, XML_BOTH ) )
146*b1cdbd2cSJim Jagielski 			aConsParam.bByCol = aConsParam.bByRow = sal_True;
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 		aConsParam.bReferenceData = bLinkToSource;
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 		ScDocument* pDoc = GetScImport().GetDocument();
151*b1cdbd2cSJim Jagielski 		if( pDoc )
152*b1cdbd2cSJim Jagielski 			pDoc->SetConsolidateDlgData( &aConsParam );
153*b1cdbd2cSJim Jagielski 	}
154*b1cdbd2cSJim Jagielski 	GetScImport().UnlockSolarMutex();
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski 
157