1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 
28 
29 // INCLUDE ---------------------------------------------------------------
30 #include "XMLCalculationSettingsContext.hxx"
31 #include "xmlimprt.hxx"
32 #include "unonames.hxx"
33 #include "docoptio.hxx"
34 #include "document.hxx"
35 #include <xmloff/xmltoken.hxx>
36 #include <xmloff/xmlnmspe.hxx>
37 #include <xmloff/xmluconv.hxx>
38 #include <xmloff/nmspmap.hxx>
39 #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
40 #include <comphelper/extract.hxx>
41 
42 using namespace com::sun::star;
43 using namespace xmloff::token;
44 
45 //------------------------------------------------------------------
46 
ScXMLCalculationSettingsContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)47 ScXMLCalculationSettingsContext::ScXMLCalculationSettingsContext( ScXMLImport& rImport,
48 									  sal_uInt16 nPrfx,
49 									  const ::rtl::OUString& rLName,
50 									  const ::com::sun::star::uno::Reference<
51 									  ::com::sun::star::xml::sax::XAttributeList>& xAttrList) :
52 	SvXMLImportContext( rImport, nPrfx, rLName ),
53 	fIterationEpsilon(0.001),
54 	nIterationCount(100),
55 	nYear2000(1930),
56 	bIsIterationEnabled(sal_False),
57 	bCalcAsShown(sal_False),
58 	bIgnoreCase(sal_False),
59 	bLookUpLabels(sal_True),
60 	bMatchWholeCell(sal_True),
61 	bUseRegularExpressions(sal_True)
62 {
63 	aNullDate.Day = 30;
64 	aNullDate.Month = 12;
65 	aNullDate.Year = 1899;
66 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
67 	for( sal_Int16 i=0; i < nAttrCount; ++i )
68 	{
69 		const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
70 		rtl::OUString aLocalName;
71 		sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
72 											sAttrName, &aLocalName );
73 		const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
74 
75 		if (nPrefix == XML_NAMESPACE_TABLE)
76 		{
77 			if (IsXMLToken(aLocalName, XML_CASE_SENSITIVE))
78 			{
79 				if (IsXMLToken(sValue, XML_FALSE))
80 					bIgnoreCase = sal_True;
81 			}
82 			else if (IsXMLToken(aLocalName, XML_PRECISION_AS_SHOWN))
83 			{
84 				if (IsXMLToken(sValue, XML_TRUE))
85 					bCalcAsShown = sal_True;
86 			}
87 			else if (IsXMLToken(aLocalName, XML_SEARCH_CRITERIA_MUST_APPLY_TO_WHOLE_CELL))
88 			{
89 				if (IsXMLToken(sValue, XML_FALSE))
90 					bMatchWholeCell = sal_False;
91 			}
92 			else if (IsXMLToken(aLocalName, XML_AUTOMATIC_FIND_LABELS))
93 			{
94 				if (IsXMLToken(sValue, XML_FALSE))
95 					bLookUpLabels = sal_False;
96 			}
97 			else if (IsXMLToken(aLocalName, XML_NULL_YEAR))
98 			{
99 				sal_Int32 nTemp;
100 				GetScImport().GetMM100UnitConverter().convertNumber(nTemp, sValue);
101 				nYear2000 = static_cast<sal_uInt16>(nTemp);
102 			}
103 			else if (IsXMLToken(aLocalName, XML_USE_REGULAR_EXPRESSIONS))
104 			{
105 				if (IsXMLToken(sValue, XML_FALSE))
106 					bUseRegularExpressions = sal_False;
107 			}
108 		}
109 	}
110 }
111 
~ScXMLCalculationSettingsContext()112 ScXMLCalculationSettingsContext::~ScXMLCalculationSettingsContext()
113 {
114 }
115 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)116 SvXMLImportContext *ScXMLCalculationSettingsContext::CreateChildContext( sal_uInt16 nPrefix,
117 											const ::rtl::OUString& rLName,
118 											const ::com::sun::star::uno::Reference<
119 									  	::com::sun::star::xml::sax::XAttributeList>& xAttrList )
120 {
121 	SvXMLImportContext *pContext = 0;
122 
123 	if (nPrefix == XML_NAMESPACE_TABLE)
124 	{
125 		if (IsXMLToken(rLName, XML_NULL_DATE))
126 			pContext = new ScXMLNullDateContext(GetScImport(), nPrefix, rLName, xAttrList, this);
127 		else if (IsXMLToken(rLName, XML_ITERATION))
128 			pContext = new ScXMLIterationContext(GetScImport(), nPrefix, rLName, xAttrList, this);
129 	}
130 
131 	if( !pContext )
132 		pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
133 
134 	return pContext;
135 }
136 
EndElement()137 void ScXMLCalculationSettingsContext::EndElement()
138 {
139 	if (GetScImport().GetModel().is())
140 	{
141 		uno::Reference <beans::XPropertySet> xPropertySet (GetScImport().GetModel(), uno::UNO_QUERY);
142 		if (xPropertySet.is())
143 		{
144             xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_CALCASSHOWN)), uno::makeAny(bCalcAsShown) );
145 			xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_IGNORECASE)), uno::makeAny(bIgnoreCase) );
146 			xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_LOOKUPLABELS)), uno::makeAny(bLookUpLabels) );
147 			xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_MATCHWHOLE)), uno::makeAny(bMatchWholeCell) );
148 			xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_REGEXENABLED)), uno::makeAny(bUseRegularExpressions) );
149 			xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ITERENABLED)), uno::makeAny(bIsIterationEnabled) );
150 			xPropertySet->setPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ITERCOUNT)), uno::makeAny(nIterationCount) );
151 			xPropertySet->setPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ITEREPSILON)), uno::makeAny(fIterationEpsilon) );
152 			xPropertySet->setPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_NULLDATE)), uno::makeAny(aNullDate) );
153 			if (GetScImport().GetDocument())
154 			{
155 				GetScImport().LockSolarMutex();
156 				ScDocOptions aDocOptions (GetScImport().GetDocument()->GetDocOptions());
157 				aDocOptions.SetYear2000(nYear2000);
158 				GetScImport().GetDocument()->SetDocOptions(aDocOptions);
159 				GetScImport().UnlockSolarMutex();
160 			}
161 		}
162 	}
163 }
164 
ScXMLNullDateContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLCalculationSettingsContext * pCalcSet)165 ScXMLNullDateContext::ScXMLNullDateContext( ScXMLImport& rImport,
166 									  sal_uInt16 nPrfx,
167 									  const ::rtl::OUString& rLName,
168 									  const ::com::sun::star::uno::Reference<
169 									  ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
170 									  ScXMLCalculationSettingsContext* pCalcSet) :
171 	SvXMLImportContext( rImport, nPrfx, rLName )
172 {
173 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
174 	for( sal_Int16 i=0; i < nAttrCount; ++i )
175 	{
176 		const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
177 		rtl::OUString aLocalName;
178 		sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
179 											sAttrName, &aLocalName );
180 		const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
181 
182 		if (nPrefix == XML_NAMESPACE_TABLE && IsXMLToken(aLocalName, XML_DATE_VALUE))
183 		{
184 			util::DateTime aDateTime;
185 			GetScImport().GetMM100UnitConverter().convertDateTime(aDateTime, sValue);
186 			util::Date aDate;
187 			aDate.Day = aDateTime.Day;
188 			aDate.Month = aDateTime.Month;
189 			aDate.Year = aDateTime.Year;
190 			pCalcSet->SetNullDate(aDate);
191 		}
192 	}
193 }
194 
~ScXMLNullDateContext()195 ScXMLNullDateContext::~ScXMLNullDateContext()
196 {
197 }
198 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)199 SvXMLImportContext *ScXMLNullDateContext::CreateChildContext( sal_uInt16 nPrefix,
200 											const ::rtl::OUString& rLName,
201 											const ::com::sun::star::uno::Reference<
202                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
203 {
204 	SvXMLImportContext *pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
205 
206 	return pContext;
207 }
208 
EndElement()209 void ScXMLNullDateContext::EndElement()
210 {
211 }
212 
ScXMLIterationContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,ScXMLCalculationSettingsContext * pCalcSet)213 ScXMLIterationContext::ScXMLIterationContext( ScXMLImport& rImport,
214 									  sal_uInt16 nPrfx,
215 									  const ::rtl::OUString& rLName,
216 									  const ::com::sun::star::uno::Reference<
217 									  ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
218 									  ScXMLCalculationSettingsContext* pCalcSet) :
219 	SvXMLImportContext( rImport, nPrfx, rLName )
220 {
221 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
222 	for( sal_Int16 i=0; i < nAttrCount; ++i )
223 	{
224 		const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
225 		rtl::OUString aLocalName;
226 		sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
227 											sAttrName, &aLocalName );
228 		const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
229 
230 		if (nPrefix == XML_NAMESPACE_TABLE)
231 		{
232 			if (IsXMLToken(aLocalName, XML_STATUS))
233 			{
234 				if (IsXMLToken(sValue, XML_ENABLE))
235 					pCalcSet->SetIterationStatus(sal_True);
236 			}
237 			else if (IsXMLToken(aLocalName, XML_STEPS))
238 			{
239 				sal_Int32 nSteps;
240 				GetScImport().GetMM100UnitConverter().convertNumber(nSteps, sValue);
241 				pCalcSet->SetIterationCount(nSteps);
242 			}
243 			else if (IsXMLToken(aLocalName, XML_MAXIMUM_DIFFERENCE))
244 			{
245 				double fDif;
246 				GetScImport().GetMM100UnitConverter().convertDouble(fDif, sValue);
247 				pCalcSet->SetIterationEpsilon(fDif);
248 			}
249 		}
250 	}
251 }
252 
~ScXMLIterationContext()253 ScXMLIterationContext::~ScXMLIterationContext()
254 {
255 }
256 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)257 SvXMLImportContext *ScXMLIterationContext::CreateChildContext( sal_uInt16 nPrefix,
258 											const ::rtl::OUString& rLName,
259 											const ::com::sun::star::uno::Reference<
260                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
261 {
262 	SvXMLImportContext *pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
263 
264 	return pContext;
265 }
266 
EndElement()267 void ScXMLIterationContext::EndElement()
268 {
269 }
270