Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * Version: MPL 1.1 / GPLv3+ / LGPLv3+
4 : : *
5 : : * The contents of this file are subject to the Mozilla Public License Version
6 : : * 1.1 (the "License"); you may not use this file except in compliance with
7 : : * the License or as specified alternatively below. You may obtain a copy of
8 : : * the License at http://www.mozilla.org/MPL/
9 : : *
10 : : * Software distributed under the License is distributed on an "AS IS" basis,
11 : : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 : : * for the specific language governing rights and limitations under the
13 : : * License.
14 : : *
15 : : * Major Contributor(s):
16 : : * Copyright (C) 2012 Markus Mohrhard <markus.mohrhard@googlemail.com> (initial developer)
17 : : *
18 : : * All Rights Reserved.
19 : : *
20 : : * For minor contributions see the git repository.
21 : : *
22 : : * Alternatively, the contents of this file may be used under the terms of
23 : : * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
24 : : * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
25 : : * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
26 : : * instead of those above.
27 : : */
28 : :
29 : : #include "xmlcondformat.hxx"
30 : : #include <xmloff/nmspmap.hxx>
31 : :
32 : : #include "colorscale.hxx"
33 : : #include "conditio.hxx"
34 : : #include "document.hxx"
35 : : #include <sax/tools/converter.hxx>
36 : : #include "rangelst.hxx"
37 : : #include "rangeutl.hxx"
38 : : #include "docfunc.hxx"
39 : : #include "markdata.hxx"
40 : : #include "docpool.hxx"
41 : : #include "scitems.hxx"
42 : : #include "patattr.hxx"
43 : : #include "svl/intitem.hxx"
44 : : #include "XMLConverter.hxx"
45 : :
46 : :
47 : 3 : ScXMLConditionalFormatsContext::ScXMLConditionalFormatsContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
48 : : const ::rtl::OUString& rLName):
49 : 3 : SvXMLImportContext( rImport, nPrfx, rLName )
50 : : {
51 : 3 : GetScImport().SetNewCondFormatData();
52 [ + - ][ + - ]: 3 : GetScImport().GetDocument()->SetCondFormList(new ScConditionalFormatList(), GetScImport().GetTables().GetCurrentSheet());
[ + - ]
53 : 3 : }
54 : :
55 : 12 : SvXMLImportContext* ScXMLConditionalFormatsContext::CreateChildContext( sal_uInt16 nPrefix,
56 : : const ::rtl::OUString& rLocalName,
57 : : const ::com::sun::star::uno::Reference<
58 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
59 : : {
60 : 12 : const SvXMLTokenMap& rTokenMap = GetScImport().GetCondFormatsTokenMap();
61 : 12 : sal_uInt16 nToken = rTokenMap.Get(nPrefix, rLocalName);
62 : 12 : SvXMLImportContext* pContext = NULL;
63 [ + - ]: 12 : switch (nToken)
64 : : {
65 : : case XML_TOK_CONDFORMATS_CONDFORMAT:
66 [ + - ]: 12 : pContext = new ScXMLConditionalFormatContext( GetScImport(), nPrefix, rLocalName, xAttrList );
67 : 12 : break;
68 : : }
69 : :
70 : 12 : return pContext;
71 : : }
72 : :
73 : 3 : void ScXMLConditionalFormatsContext::EndElement()
74 : : {
75 : 3 : }
76 : :
77 : 12 : ScXMLConditionalFormatContext::ScXMLConditionalFormatContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
78 : : const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList):
79 [ + - ]: 12 : SvXMLImportContext( rImport, nPrfx, rLName )
80 : : {
81 : 12 : rtl::OUString sRange;
82 : :
83 [ + - ][ + - ]: 12 : sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
[ + - ]
84 [ + - ]: 12 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetCondFormatAttrMap();
85 [ + + ]: 24 : for( sal_Int16 i=0; i < nAttrCount; ++i )
86 : : {
87 [ + - ][ + - ]: 12 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
88 : 12 : rtl::OUString aLocalName;
89 : 12 : sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
90 [ + - ]: 12 : sAttrName, &aLocalName ));
91 [ + - ][ + - ]: 12 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
92 : :
93 [ + - ][ + - ]: 12 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
94 : : {
95 : : case XML_TOK_CONDFORMAT_TARGET_RANGE:
96 : 12 : sRange = sValue;
97 : 12 : break;
98 : : default:
99 : 0 : break;
100 : : }
101 : 12 : }
102 : :
103 : 12 : ScRangeStringConverter::GetRangeListFromString(maRange, sRange, GetScImport().GetDocument(),
104 [ + - ]: 12 : formula::FormulaGrammar::CONV_ODF);
105 : :
106 [ + - ][ + - ]: 12 : mpFormat = new ScConditionalFormat(0, GetScImport().GetDocument());
107 [ + - ]: 12 : mpFormat->AddRange(maRange);
108 : 12 : }
109 : :
110 : 12 : SvXMLImportContext* ScXMLConditionalFormatContext::CreateChildContext( sal_uInt16 nPrefix,
111 : : const ::rtl::OUString& rLocalName,
112 : : const ::com::sun::star::uno::Reference<
113 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
114 : : {
115 : 12 : const SvXMLTokenMap& rTokenMap = GetScImport().GetCondFormatTokenMap();
116 : 12 : sal_uInt16 nToken = rTokenMap.Get(nPrefix, rLocalName);
117 : 12 : SvXMLImportContext* pContext = NULL;
118 [ - + - - ]: 12 : switch (nToken)
119 : : {
120 : : case XML_TOK_CONDFORMAT_CONDITION:
121 [ # # ]: 0 : pContext = new ScXMLCondContext( GetScImport(), nPrefix, rLocalName, xAttrList, mpFormat );
122 : 0 : break;
123 : : case XML_TOK_CONDFORMAT_COLORSCALE:
124 [ + - ]: 12 : pContext = new ScXMLColorScaleFormatContext( GetScImport(), nPrefix, rLocalName, mpFormat );
125 : 12 : break;
126 : : case XML_TOK_CONDFORMAT_DATABAR:
127 [ # # ]: 0 : pContext = new ScXMLDataBarFormatContext( GetScImport(), nPrefix, rLocalName, xAttrList, mpFormat );
128 : 0 : break;
129 : : default:
130 : 0 : break;
131 : : }
132 : :
133 : 12 : return pContext;
134 : : }
135 : :
136 : 12 : void ScXMLConditionalFormatContext::EndElement()
137 : : {
138 : 12 : ScDocument* pDoc = GetScImport().GetDocument();
139 : :
140 [ + - ]: 12 : sal_uLong nIndex = pDoc->AddCondFormat(mpFormat, GetScImport().GetTables().GetCurrentSheet());
141 : 12 : mpFormat->SetKey(nIndex);
142 : :
143 [ + - ][ + - ]: 12 : ScPatternAttr aPattern( pDoc->GetPool() );
144 [ + - ][ + - ]: 12 : aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_CONDITIONAL, nIndex ) );
[ + - ]
145 [ + - ]: 12 : ScMarkData aMarkData;
146 [ + - ]: 12 : aMarkData.MarkFromRangeList(mpFormat->GetRange(), true);
147 [ + - ][ + - ]: 12 : pDoc->ApplySelectionPattern( aPattern , aMarkData);
[ + - ]
148 : 12 : }
149 : :
150 : 12 : ScXMLColorScaleFormatContext::ScXMLColorScaleFormatContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
151 : : const ::rtl::OUString& rLName, ScConditionalFormat* pFormat):
152 : : SvXMLImportContext( rImport, nPrfx, rLName ),
153 : 12 : pColorScaleFormat(NULL)
154 : : {
155 [ + - ][ + - ]: 12 : pColorScaleFormat = new ScColorScaleFormat(GetScImport().GetDocument());
156 [ + - ]: 12 : pFormat->AddEntry(pColorScaleFormat);
157 : 12 : }
158 : :
159 : 27 : SvXMLImportContext* ScXMLColorScaleFormatContext::CreateChildContext( sal_uInt16 nPrefix,
160 : : const ::rtl::OUString& rLocalName,
161 : : const ::com::sun::star::uno::Reference<
162 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
163 : : {
164 : 27 : const SvXMLTokenMap& rTokenMap = GetScImport().GetColorScaleTokenMap();
165 : 27 : sal_uInt16 nToken = rTokenMap.Get(nPrefix, rLocalName);
166 : 27 : SvXMLImportContext* pContext = NULL;
167 [ + - ]: 27 : switch (nToken)
168 : : {
169 : : case XML_TOK_COLORSCALE_COLORSCALEENTRY:
170 [ + - ]: 27 : pContext = new ScXMLColorScaleFormatEntryContext( GetScImport(), nPrefix, rLocalName, xAttrList, pColorScaleFormat );
171 : 27 : break;
172 : : default:
173 : 0 : break;
174 : : }
175 : :
176 : 27 : return pContext;
177 : : }
178 : :
179 : 12 : void ScXMLColorScaleFormatContext::EndElement()
180 : : {
181 : :
182 : 12 : }
183 : :
184 : 0 : ScXMLDataBarFormatContext::ScXMLDataBarFormatContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
185 : : const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
186 : : ScConditionalFormat* pFormat):
187 : : SvXMLImportContext( rImport, nPrfx, rLName ),
188 : : mpDataBarFormat(NULL),
189 : 0 : mpFormatData(NULL)
190 : : {
191 : 0 : rtl::OUString sPositiveColor;
192 : 0 : rtl::OUString sNegativeColor;
193 : 0 : rtl::OUString sGradient;
194 : 0 : rtl::OUString sAxisPosition;
195 : 0 : rtl::OUString sShowValue;
196 : 0 : rtl::OUString sAxisColor;
197 : :
198 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
[ # # ]
199 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataBarAttrMap();
200 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
201 : : {
202 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
203 : 0 : rtl::OUString aLocalName;
204 : 0 : sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
205 [ # # ]: 0 : sAttrName, &aLocalName ));
206 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
207 : :
208 [ # # ][ # # : 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
# # # #
# ]
209 : : {
210 : : case XML_TOK_DATABAR_POSITIVE_COLOR:
211 : 0 : sPositiveColor = sValue;
212 : 0 : break;
213 : : case XML_TOK_DATABAR_GRADIENT:
214 : 0 : sGradient = sValue;
215 : 0 : break;
216 : : case XML_TOK_DATABAR_NEGATIVE_COLOR:
217 : 0 : sNegativeColor = sValue;
218 : 0 : break;
219 : : case XML_TOK_DATABAR_AXISPOSITION:
220 : 0 : sAxisPosition = sValue;
221 : 0 : break;
222 : : case XML_TOK_DATABAR_SHOWVALUE:
223 : 0 : sShowValue = sValue;
224 : 0 : break;
225 : : case XML_TOK_DATABAR_AXISCOLOR:
226 : 0 : sAxisColor = sValue;
227 : 0 : break;
228 : : default:
229 : 0 : break;
230 : : }
231 : 0 : }
232 : :
233 [ # # ][ # # ]: 0 : mpDataBarFormat = new ScDataBarFormat(rImport.GetDocument());
234 [ # # ][ # # ]: 0 : mpFormatData = new ScDataBarFormatData();
235 [ # # ]: 0 : mpDataBarFormat->SetDataBarData(mpFormatData);
236 [ # # ]: 0 : if(!sGradient.isEmpty())
237 : : {
238 : 0 : bool bGradient = true;
239 [ # # ]: 0 : sax::Converter::convertBool( bGradient, sGradient);
240 : 0 : mpFormatData->mbGradient = bGradient;
241 : : }
242 : :
243 [ # # ]: 0 : if(!sPositiveColor.isEmpty())
244 : : {
245 : 0 : sal_Int32 nColor = 0;
246 [ # # ]: 0 : sax::Converter::convertColor( nColor, sPositiveColor );
247 : 0 : mpFormatData->maPositiveColor = Color(nColor);
248 : : }
249 : :
250 [ # # ]: 0 : if(!sNegativeColor.isEmpty())
251 : : {
252 : : // we might check here for 0xff0000 and don't write it
253 : 0 : sal_Int32 nColor = 0;
254 [ # # ]: 0 : sax::Converter::convertColor( nColor, sNegativeColor );
255 [ # # ][ # # ]: 0 : mpFormatData->mpNegativeColor.reset(new Color(nColor));
256 : : }
257 : : else
258 : 0 : mpFormatData->mbNeg = false;
259 : :
260 [ # # ]: 0 : if(!sAxisColor.isEmpty())
261 : : {
262 : 0 : sal_Int32 nColor = 0;
263 [ # # ]: 0 : sax::Converter::convertColor( nColor, sAxisColor );
264 : 0 : mpFormatData->maAxisColor = Color(nColor);
265 : : }
266 : :
267 [ # # ]: 0 : if(!sShowValue.isEmpty())
268 : : {
269 : 0 : bool bShowValue = true;
270 [ # # ]: 0 : sax::Converter::convertBool( bShowValue, sShowValue );
271 : 0 : mpFormatData->mbOnlyBar = !bShowValue;
272 : : }
273 : :
274 [ # # ]: 0 : pFormat->AddEntry(mpDataBarFormat);
275 : 0 : }
276 : :
277 : 0 : SvXMLImportContext* ScXMLDataBarFormatContext::CreateChildContext( sal_uInt16 nPrefix,
278 : : const ::rtl::OUString& rLocalName,
279 : : const ::com::sun::star::uno::Reference<
280 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
281 : : {
282 : 0 : const SvXMLTokenMap& rTokenMap = GetScImport().GetDataBarTokenMap();
283 : 0 : sal_uInt16 nToken = rTokenMap.Get(nPrefix, rLocalName);
284 : 0 : SvXMLImportContext* pContext = NULL;
285 [ # # ]: 0 : switch (nToken)
286 : : {
287 : : case XML_TOK_DATABAR_DATABARENTRY:
288 [ # # ]: 0 : pContext = new ScXMLDataBarFormatEntryContext( GetScImport(), nPrefix, rLocalName, xAttrList, mpFormatData );
289 : 0 : break;
290 : : default:
291 : 0 : break;
292 : : }
293 : :
294 : 0 : return pContext;
295 : : }
296 : :
297 : 0 : void ScXMLDataBarFormatContext::EndElement()
298 : : {
299 : 0 : }
300 : :
301 : : namespace {
302 : :
303 : 0 : void GetConditionData(const rtl::OUString& rValue, ScConditionMode& eMode, rtl::OUString& rExpr1, rtl::OUString& rExpr2)
304 : : {
305 [ # # ]: 0 : if(rValue.indexOf("unique") == 0)
306 : : {
307 : 0 : eMode = SC_COND_NOTDUPLICATE;
308 : : }
309 [ # # ]: 0 : else if(rValue.indexOf("duplicate") == 0)
310 : : {
311 : 0 : eMode = SC_COND_DUPLICATE;
312 : : }
313 [ # # ]: 0 : else if(rValue.indexOf("between") == 0)
314 : : {
315 : 0 : const sal_Unicode* pStr = rValue.getStr();
316 : 0 : const sal_Unicode* pStart = pStr + 8;
317 : 0 : const sal_Unicode* pEnd = pStr + rValue.getLength();
318 [ # # ]: 0 : rExpr1 = ScXMLConditionHelper::getExpression( pStart, pEnd, ',');
319 [ # # ]: 0 : rExpr2 = ScXMLConditionHelper::getExpression( pStart, pEnd, ')');
320 : 0 : eMode = SC_COND_BETWEEN;
321 : : }
322 [ # # ]: 0 : else if(rValue.indexOf("not-between") == 0)
323 : : {
324 : 0 : const sal_Unicode* pStr = rValue.getStr();
325 : 0 : const sal_Unicode* pStart = pStr + 12;
326 : 0 : const sal_Unicode* pEnd = pStr + rValue.getLength();
327 [ # # ]: 0 : rExpr1 = ScXMLConditionHelper::getExpression( pStart, pEnd, ',');
328 [ # # ]: 0 : rExpr2 = ScXMLConditionHelper::getExpression( pStart, pEnd, ')');
329 : 0 : eMode = SC_COND_NOTBETWEEN;
330 : : }
331 [ # # ]: 0 : else if(rValue.indexOf("<=") == 0)
332 : : {
333 : 0 : rExpr1 = rValue.copy(2);
334 : 0 : eMode = SC_COND_EQLESS;
335 : : }
336 [ # # ]: 0 : else if(rValue.indexOf(">=") == 0)
337 : : {
338 : 0 : rExpr1 = rValue.copy(2);
339 : 0 : eMode = SC_COND_EQGREATER;
340 : : }
341 [ # # ]: 0 : else if(rValue.indexOf("!=") == 0)
342 : : {
343 : 0 : rExpr1 = rValue.copy(2);
344 : 0 : eMode = SC_COND_NOTEQUAL;
345 : : }
346 [ # # ]: 0 : else if(rValue.indexOf('<') == 0)
347 : : {
348 : 0 : rExpr1 = rValue.copy(1);
349 : 0 : eMode = SC_COND_LESS;
350 : : }
351 [ # # ]: 0 : else if(rValue.indexOf('=') == 0)
352 : : {
353 : 0 : rExpr1 = rValue.copy(1);
354 : 0 : eMode = SC_COND_EQUAL;
355 : : }
356 [ # # ]: 0 : else if(rValue.indexOf('>') == 0)
357 : : {
358 : 0 : rExpr1 = rValue.copy(1);
359 : 0 : eMode = SC_COND_GREATER;
360 : : }
361 [ # # ]: 0 : else if(rValue.indexOf("formula-is") == 0)
362 : : {
363 : 0 : const sal_Unicode* pStr = rValue.getStr();
364 : 0 : const sal_Unicode* pStart = pStr + 11;
365 : 0 : const sal_Unicode* pEnd = pStr + rValue.getLength();
366 [ # # ]: 0 : rExpr1 = ScXMLConditionHelper::getExpression( pStart, pEnd, ')');
367 : 0 : eMode = SC_COND_DIRECT;
368 : : }
369 : : else
370 : 0 : eMode = SC_COND_NONE;
371 : 0 : }
372 : :
373 : : }
374 : :
375 : 0 : ScXMLCondContext::ScXMLCondContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
376 : : const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
377 : : ScConditionalFormat* pFormat ):
378 : 0 : SvXMLImportContext( rImport, nPrfx, rLName )
379 : : {
380 : 0 : rtl::OUString sExpression;
381 : 0 : rtl::OUString sStyle;
382 : 0 : rtl::OUString sAddress;
383 : :
384 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
[ # # ]
385 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetConditionAttrMap();
386 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
387 : : {
388 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
389 : 0 : rtl::OUString aLocalName;
390 : 0 : sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
391 [ # # ]: 0 : sAttrName, &aLocalName ));
392 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
393 : :
394 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # # ]
395 : : {
396 : : case XML_TOK_CONDITION_VALUE:
397 : 0 : sExpression = sValue;
398 : 0 : break;
399 : : case XML_TOK_CONDITION_APPLY_STYLE_NAME:
400 : 0 : sStyle = sValue;
401 : : case XML_TOK_CONDITION_BASE_CELL_ADDRESS:
402 : 0 : sAddress = sValue;
403 : : default:
404 : 0 : break;
405 : : }
406 : 0 : }
407 : :
408 : 0 : rtl::OUString aExpr1;
409 : 0 : rtl::OUString aExpr2;
410 : : ScConditionMode eMode;
411 [ # # ]: 0 : GetConditionData(sExpression, eMode, aExpr1, aExpr2);
412 : 0 : ScAddress aPos;
413 : 0 : sal_Int32 nIndex = 0;
414 [ # # ]: 0 : ScRangeStringConverter::GetAddressFromString(aPos, sAddress, GetScImport().GetDocument(), formula::FormulaGrammar::CONV_ODF, nIndex);
415 : :
416 : 0 : ScCondFormatEntry* pFormatEntry = new ScCondFormatEntry(eMode, aExpr1, aExpr2, GetScImport().GetDocument(), aPos, sStyle,
417 [ # # ]: 0 : rtl::OUString(), rtl::OUString(), formula::FormulaGrammar::GRAM_ODFF, formula::FormulaGrammar::GRAM_ODFF);
[ # # # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
418 : :
419 [ # # ]: 0 : pFormat->AddEntry(pFormatEntry);
420 : 0 : }
421 : :
422 : 0 : void ScXMLCondContext::EndElement()
423 : : {
424 : :
425 : 0 : }
426 : :
427 : : namespace {
428 : :
429 : 27 : void setColorEntryType(const rtl::OUString& rType, ScColorScaleEntry* pEntry, const rtl::OUString rFormula,
430 : : ScXMLImport& rImport)
431 : : {
432 [ + + ]: 27 : if(rType == "minimum")
433 : 6 : pEntry->SetType(COLORSCALE_MIN);
434 [ + + ]: 21 : else if(rType == "maximum")
435 : 6 : pEntry->SetType(COLORSCALE_MAX);
436 [ + + ]: 15 : else if(rType == "percentile")
437 : 6 : pEntry->SetType(COLORSCALE_PERCENTILE);
438 [ + + ]: 9 : else if(rType == "percent")
439 : 3 : pEntry->SetType(COLORSCALE_PERCENT);
440 [ + + ]: 6 : else if(rType == "formula")
441 : : {
442 : 3 : pEntry->SetType(COLORSCALE_FORMULA);
443 : : //position does not matter, only table is important
444 [ + - ]: 3 : pEntry->SetFormula(rFormula, rImport.GetDocument(), ScAddress(0,0,rImport.GetTables().GetCurrentSheet()), formula::FormulaGrammar::GRAM_ODFF);
445 : : }
446 [ - + ]: 3 : else if(rType == "auto-minimum")
447 : 0 : pEntry->SetType(COLORSCALE_AUTOMIN);
448 [ - + ]: 3 : else if(rType == "auto-maximum")
449 : 0 : pEntry->SetType(COLORSCALE_AUTOMAX);
450 : :
451 : : //TODO: add formulas
452 : 27 : }
453 : :
454 : : }
455 : :
456 : 27 : ScXMLColorScaleFormatEntryContext::ScXMLColorScaleFormatEntryContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
457 : : const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
458 : : ScColorScaleFormat* pFormat):
459 : : SvXMLImportContext( rImport, nPrfx, rLName ),
460 : : mpFormat( pFormat ),
461 : 27 : mpFormatEntry( NULL )
462 : : {
463 : 27 : double nVal = 0;
464 : 27 : Color aColor;
465 : :
466 : 27 : rtl::OUString sType;
467 : 27 : rtl::OUString sVal;
468 : 27 : rtl::OUString sColor;
469 : :
470 [ + - ][ + - ]: 27 : sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
[ + - ]
471 [ + - ]: 27 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetColorScaleEntryAttrMap();
472 [ + + ]: 108 : for( sal_Int16 i=0; i < nAttrCount; ++i )
473 : : {
474 [ + - ][ + - ]: 81 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
475 : 81 : rtl::OUString aLocalName;
476 : 81 : sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
477 [ + - ]: 81 : sAttrName, &aLocalName ));
478 [ + - ][ + - ]: 81 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
479 : :
480 [ + - ]: 81 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ + + + - ]
481 : : {
482 : : case XML_TOK_COLORSCALEENTRY_TYPE:
483 : 27 : sType = sValue;
484 : 27 : break;
485 : : case XML_TOK_COLORSCALEENTRY_VALUE:
486 : 27 : sVal = sValue;
487 : 27 : break;
488 : : case XML_TOK_COLORSCALEENTRY_COLOR:
489 : 27 : sColor = sValue;
490 : 27 : break;
491 : : default:
492 : 0 : break;
493 : : }
494 : 81 : }
495 : :
496 : : sal_Int32 nColor;
497 [ + - ]: 27 : sax::Converter::convertColor(nColor, sColor);
498 : 27 : aColor = Color(nColor);
499 : :
500 [ + - ]: 27 : if(!sVal.isEmpty())
501 [ + - ]: 27 : sax::Converter::convertDouble(nVal, sVal);
502 : :
503 [ + - ][ + - ]: 27 : mpFormatEntry = new ScColorScaleEntry(nVal, aColor);
504 [ + - ]: 27 : setColorEntryType(sType, mpFormatEntry, sVal, GetScImport());
505 [ + - ]: 27 : pFormat->AddEntry(mpFormatEntry);
506 : 27 : }
507 : :
508 : 27 : void ScXMLColorScaleFormatEntryContext::EndElement()
509 : : {
510 : 27 : }
511 : :
512 : 0 : ScXMLDataBarFormatEntryContext::ScXMLDataBarFormatEntryContext( ScXMLImport& rImport, sal_uInt16 nPrfx,
513 : : const ::rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
514 : : ScDataBarFormatData* pData):
515 : 0 : SvXMLImportContext( rImport, nPrfx, rLName )
516 : : {
517 : 0 : rtl::OUString sVal;
518 : 0 : rtl::OUString sType;
519 : :
520 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
[ # # ]
521 [ # # ]: 0 : const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDataBarEntryAttrMap();
522 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
523 : : {
524 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
525 : 0 : rtl::OUString aLocalName;
526 : 0 : sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
527 [ # # ]: 0 : sAttrName, &aLocalName ));
528 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
529 : :
530 [ # # ]: 0 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
[ # # # ]
531 : : {
532 : : case XML_TOK_DATABARENTRY_TYPE:
533 : 0 : sType = sValue;
534 : 0 : break;
535 : : case XML_TOK_DATABARENTRY_VALUE:
536 : 0 : sVal = sValue;
537 : 0 : break;
538 : : default:
539 : 0 : break;
540 : : }
541 : 0 : }
542 : :
543 : 0 : double nVal = 0;
544 [ # # ]: 0 : if(!sVal.isEmpty())
545 [ # # ]: 0 : sax::Converter::convertDouble(nVal, sVal);
546 : :
547 [ # # ][ # # ]: 0 : ScColorScaleEntry* pEntry = new ScColorScaleEntry(nVal, Color());
548 [ # # ]: 0 : setColorEntryType(sType, pEntry, sVal, GetScImport());
549 [ # # ]: 0 : if(pData->mpLowerLimit)
550 : : {
551 [ # # ]: 0 : pData->mpUpperLimit.reset(pEntry);
552 : : }
553 : : else
554 : : {
555 [ # # ]: 0 : pData->mpLowerLimit.reset(pEntry);
556 : 0 : }
557 : 0 : }
558 : :
559 : 0 : void ScXMLDataBarFormatEntryContext::EndElement()
560 : : {
561 : 0 : }
562 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|