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