Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sax/tools/converter.hxx>
21 :
22 : #include "SchXMLAxisContext.hxx"
23 : #include "SchXMLChartContext.hxx"
24 : #include "SchXMLTools.hxx"
25 : #include <xmloff/xmlnmspe.hxx>
26 : #include <xmloff/xmlement.hxx>
27 : #include <xmloff/xmlstyle.hxx>
28 : #include <xmloff/prstylei.hxx>
29 : #include <xmloff/nmspmap.hxx>
30 : #include <xmloff/xmluconv.hxx>
31 :
32 : #include <tools/color.hxx>
33 :
34 : #include <com/sun/star/chart/ChartAxisLabelPosition.hpp>
35 : #include <com/sun/star/chart/ChartAxisMarkPosition.hpp>
36 : #include <com/sun/star/chart/ChartAxisPosition.hpp>
37 : #include <com/sun/star/chart/ChartAxisType.hpp>
38 : #include <com/sun/star/chart/TimeIncrement.hpp>
39 : #include <com/sun/star/chart/TimeInterval.hpp>
40 : #include <com/sun/star/chart/TimeUnit.hpp>
41 : #include <com/sun/star/chart/XAxis.hpp>
42 : #include <com/sun/star/chart/XAxisSupplier.hpp>
43 : #include <com/sun/star/chart2/AxisType.hpp>
44 : #include <com/sun/star/chart2/XChartDocument.hpp>
45 : #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
46 :
47 : #include <com/sun/star/drawing/LineStyle.hpp>
48 :
49 : using namespace ::xmloff::token;
50 : using namespace com::sun::star;
51 :
52 : using com::sun::star::uno::Reference;
53 :
54 : static const SvXMLEnumMapEntry aXMLAxisDimensionMap[] =
55 : {
56 : { XML_X, SCH_XML_AXIS_X },
57 : { XML_Y, SCH_XML_AXIS_Y },
58 : { XML_Z, SCH_XML_AXIS_Z },
59 : { XML_TOKEN_INVALID, 0 }
60 : };
61 :
62 : static const SvXMLEnumMapEntry aXMLAxisTypeMap[] =
63 : {
64 : { XML_AUTO, ::com::sun::star::chart::ChartAxisType::AUTOMATIC },
65 : { XML_TEXT, ::com::sun::star::chart::ChartAxisType::CATEGORY },
66 : { XML_DATE, ::com::sun::star::chart::ChartAxisType::DATE },
67 : { XML_TOKEN_INVALID, 0 }
68 : };
69 :
70 : class SchXMLCategoriesContext : public SvXMLImportContext
71 : {
72 : private:
73 : OUString& mrAddress;
74 :
75 : public:
76 : SchXMLCategoriesContext( SvXMLImport& rImport,
77 : sal_uInt16 nPrefix,
78 : const OUString& rLocalName,
79 : OUString& rAddress );
80 : virtual ~SchXMLCategoriesContext();
81 : virtual void StartElement( const Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
82 : };
83 :
84 : class DateScaleContext : public SvXMLImportContext
85 : {
86 : public:
87 : DateScaleContext( SvXMLImport& rImport,
88 : sal_uInt16 nPrefix, const OUString& rLocalName,
89 : const Reference< beans::XPropertySet > xAxisProps );
90 :
91 : virtual ~DateScaleContext();
92 : virtual void StartElement( const Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ) SAL_OVERRIDE;
93 :
94 : private:
95 : Reference< beans::XPropertySet > m_xAxisProps;
96 : };
97 :
98 580 : SchXMLAxisContext::SchXMLAxisContext( SchXMLImportHelper& rImpHelper,
99 : SvXMLImport& rImport, const OUString& rLocalName,
100 : Reference< chart::XDiagram > xDiagram,
101 : std::vector< SchXMLAxis >& rAxes,
102 : OUString & rCategoriesAddress,
103 : bool bAddMissingXAxisForNetCharts,
104 : bool bAdaptWrongPercentScaleValues,
105 : bool bAdaptXAxisOrientationForOld2DBarCharts,
106 : bool& rbAxisPositionAttributeImported ) :
107 : SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
108 : m_rImportHelper( rImpHelper ),
109 : m_xDiagram( xDiagram ),
110 : m_rAxes( rAxes ),
111 : m_rCategoriesAddress( rCategoriesAddress ),
112 : m_nAxisType(chart::ChartAxisType::AUTOMATIC),
113 : m_bAxisTypeImported(false),
114 : m_bDateScaleImported(false),
115 : m_bAddMissingXAxisForNetCharts( bAddMissingXAxisForNetCharts ),
116 : m_bAdaptWrongPercentScaleValues( bAdaptWrongPercentScaleValues ),
117 : m_bAdaptXAxisOrientationForOld2DBarCharts( bAdaptXAxisOrientationForOld2DBarCharts ),
118 580 : m_rbAxisPositionAttributeImported( rbAxisPositionAttributeImported )
119 : {
120 580 : }
121 :
122 1160 : SchXMLAxisContext::~SchXMLAxisContext()
123 1160 : {}
124 :
125 954 : static Reference< chart::XAxis > lcl_getChartAxis( SchXMLAxis aCurrentAxis, const Reference< chart::XDiagram > xDiagram )
126 : {
127 954 : Reference< chart::XAxis > xAxis;
128 1908 : Reference< chart::XAxisSupplier > xAxisSuppl( xDiagram, uno::UNO_QUERY );
129 954 : if( !xAxisSuppl.is() )
130 0 : return xAxis;
131 954 : if( aCurrentAxis.nAxisIndex == 0 )
132 922 : xAxis = xAxisSuppl->getAxis(aCurrentAxis.eDimension);
133 : else
134 32 : xAxis = xAxisSuppl->getSecondaryAxis(aCurrentAxis.eDimension);
135 954 : return xAxis;
136 : }
137 :
138 : /* returns a shape for the current axis's title. The property
139 : "Has...AxisTitle" is set to "True" to get the shape
140 : */
141 58 : Reference< drawing::XShape > SchXMLAxisContext::getTitleShape()
142 : {
143 58 : Reference< drawing::XShape > xResult;
144 116 : Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
145 116 : Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
146 58 : if( !xDiaProp.is() || !xAxis.is() )
147 0 : return xResult;
148 :
149 116 : OUString aPropName;
150 58 : switch( m_aCurrentAxis.eDimension )
151 : {
152 : case SCH_XML_AXIS_X:
153 28 : if( m_aCurrentAxis.nAxisIndex == 0 )
154 28 : aPropName = "HasXAxisTitle";
155 : else
156 0 : aPropName = "HasSecondaryXAxisTitle";
157 28 : break;
158 : case SCH_XML_AXIS_Y:
159 30 : if( m_aCurrentAxis.nAxisIndex == 0 )
160 28 : aPropName = "HasYAxisTitle";
161 : else
162 2 : aPropName = "HasSecondaryYAxisTitle";
163 30 : break;
164 : case SCH_XML_AXIS_Z:
165 0 : aPropName = "HasZAxisTitle";
166 0 : break;
167 : case SCH_XML_AXIS_UNDEF:
168 : SAL_INFO("xmloff.chart", "Invalid axis" );
169 0 : break;
170 : }
171 58 : xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
172 58 : xResult = Reference< drawing::XShape >( xAxis->getAxisTitle(), uno::UNO_QUERY );
173 58 : return xResult;
174 : }
175 :
176 258 : void SchXMLAxisContext::CreateGrid( const OUString& sAutoStyleName, bool bIsMajor )
177 : {
178 258 : Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
179 516 : Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
180 258 : if( !xDiaProp.is() || !xAxis.is() )
181 258 : return;
182 :
183 516 : OUString aPropName;
184 258 : switch( m_aCurrentAxis.eDimension )
185 : {
186 : case SCH_XML_AXIS_X:
187 26 : if( bIsMajor )
188 26 : aPropName = "HasXAxisGrid";
189 : else
190 0 : aPropName = "HasXAxisHelpGrid";
191 26 : break;
192 : case SCH_XML_AXIS_Y:
193 232 : if( bIsMajor )
194 208 : aPropName = "HasYAxisGrid";
195 : else
196 24 : aPropName = "HasYAxisHelpGrid";
197 232 : break;
198 : case SCH_XML_AXIS_Z:
199 0 : if( bIsMajor )
200 0 : aPropName = "HasZAxisGrid";
201 : else
202 0 : aPropName = "HasZAxisHelpGrid";
203 0 : break;
204 : case SCH_XML_AXIS_UNDEF:
205 : SAL_INFO("xmloff.chart", "Invalid axis" );
206 0 : break;
207 : }
208 258 : xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
209 :
210 258 : Reference< beans::XPropertySet > xGridProp;
211 258 : if( bIsMajor )
212 234 : xGridProp = xAxis->getMajorGrid();
213 : else
214 24 : xGridProp = xAxis->getMinorGrid();
215 :
216 : // set properties
217 258 : if( xGridProp.is())
218 : {
219 : // the line color is black as default, in the model it is a light gray
220 258 : xGridProp->setPropertyValue("LineColor",
221 258 : uno::makeAny( COL_BLACK ));
222 258 : if( !sAutoStyleName.isEmpty())
223 : {
224 258 : const SvXMLStylesContext* pStylesCtxt = m_rImportHelper.GetAutoStylesContext();
225 258 : if( pStylesCtxt )
226 : {
227 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
228 258 : SchXMLImportHelper::GetChartFamilyID(), sAutoStyleName );
229 :
230 258 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
231 258 : const_cast<XMLPropStyleContext*>( static_cast< const XMLPropStyleContext* >( pStyle ))->FillPropertySet( xGridProp );
232 : }
233 : }
234 516 : }
235 : }
236 :
237 : namespace
238 : {
239 : enum AxisAttributeTokens
240 : {
241 : XML_TOK_AXIS_DIMENSION,
242 : XML_TOK_AXIS_NAME,
243 : XML_TOK_AXIS_STYLE_NAME,
244 : XML_TOK_AXIS_TYPE,
245 : XML_TOK_AXIS_TYPE_EXT
246 : };
247 :
248 : const SvXMLTokenMapEntry aAxisAttributeTokenMap[] =
249 : {
250 : { XML_NAMESPACE_CHART, XML_DIMENSION, XML_TOK_AXIS_DIMENSION },
251 : { XML_NAMESPACE_CHART, XML_NAME, XML_TOK_AXIS_NAME },
252 : { XML_NAMESPACE_CHART, XML_STYLE_NAME, XML_TOK_AXIS_STYLE_NAME },
253 : { XML_NAMESPACE_CHART, XML_AXIS_TYPE, XML_TOK_AXIS_TYPE },
254 : { XML_NAMESPACE_CHART_EXT, XML_AXIS_TYPE, XML_TOK_AXIS_TYPE_EXT },
255 : XML_TOKEN_MAP_END
256 : };
257 :
258 : class AxisAttributeTokenMap : public SvXMLTokenMap
259 : {
260 : public:
261 18 : AxisAttributeTokenMap(): SvXMLTokenMap( aAxisAttributeTokenMap ) {}
262 18 : virtual ~AxisAttributeTokenMap() {}
263 : };
264 :
265 : //a AxisAttributeTokenMap Singleton
266 : struct theAxisAttributeTokenMap : public rtl::Static< AxisAttributeTokenMap, theAxisAttributeTokenMap > {};
267 : }
268 :
269 580 : void SchXMLAxisContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
270 : {
271 : // parse attributes
272 580 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
273 580 : const SvXMLTokenMap& rAttrTokenMap = theAxisAttributeTokenMap::get();
274 :
275 2486 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
276 : {
277 1906 : OUString sAttrName = xAttrList->getNameByIndex( i );
278 3812 : OUString aLocalName;
279 3812 : OUString aValue = xAttrList->getValueByIndex( i );
280 1906 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
281 :
282 1906 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
283 : {
284 : case XML_TOK_AXIS_DIMENSION:
285 : {
286 : sal_uInt16 nEnumVal;
287 580 : if( SvXMLUnitConverter::convertEnum( nEnumVal, aValue, aXMLAxisDimensionMap ))
288 580 : m_aCurrentAxis.eDimension = ( SchXMLAxisDimension )nEnumVal;
289 : }
290 580 : break;
291 : case XML_TOK_AXIS_NAME:
292 580 : m_aCurrentAxis.aName = aValue;
293 580 : break;
294 : case XML_TOK_AXIS_TYPE:
295 : case XML_TOK_AXIS_TYPE_EXT:
296 : sal_uInt16 nEnumVal;
297 166 : if( SvXMLUnitConverter::convertEnum( nEnumVal, aValue, aXMLAxisTypeMap ))
298 : {
299 166 : m_nAxisType = nEnumVal;
300 166 : m_bAxisTypeImported = true;
301 : }
302 166 : break;
303 : case XML_TOK_AXIS_STYLE_NAME:
304 580 : m_aAutoStyleName = aValue;
305 580 : break;
306 : }
307 1906 : }
308 :
309 : // check for number of axes with same dimension
310 580 : m_aCurrentAxis.nAxisIndex = 0;
311 580 : sal_Int32 nNumOfAxes = m_rAxes.size();
312 1022 : for( sal_Int32 nCurrent = 0; nCurrent < nNumOfAxes; nCurrent++ )
313 : {
314 442 : if( m_rAxes[ nCurrent ].eDimension == m_aCurrentAxis.eDimension )
315 28 : m_aCurrentAxis.nAxisIndex++;
316 : }
317 580 : CreateAxis();
318 580 : }
319 : namespace
320 : {
321 :
322 418 : Reference< chart2::XAxis > lcl_getAxis( const Reference< frame::XModel >& xChartModel,
323 : sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex )
324 : {
325 418 : Reference< chart2::XAxis > xAxis;
326 :
327 : try
328 : {
329 418 : Reference< chart2::XChartDocument > xChart2Document( xChartModel, uno::UNO_QUERY );
330 418 : if( xChart2Document.is() )
331 : {
332 418 : Reference< chart2::XDiagram > xDiagram( xChart2Document->getFirstDiagram());
333 836 : Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
334 : uno::Sequence< Reference< chart2::XCoordinateSystem > >
335 836 : aCooSysSeq( xCooSysCnt->getCoordinateSystems());
336 418 : sal_Int32 nCooSysIndex = 0;
337 418 : if( nCooSysIndex < aCooSysSeq.getLength() )
338 : {
339 418 : Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[nCooSysIndex] );
340 418 : if( xCooSys.is() && nDimensionIndex < xCooSys->getDimension() )
341 : {
342 418 : const sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex);
343 418 : if( nAxisIndex <= nMaxAxisIndex )
344 418 : xAxis = xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex );
345 418 : }
346 418 : }
347 418 : }
348 : }
349 0 : catch( uno::Exception & )
350 : {
351 : SAL_INFO("xmloff.chart", "Couldn't get axis" );
352 : }
353 :
354 418 : return xAxis;
355 : }
356 :
357 0 : bool lcl_divideBy100( uno::Any& rDoubleAny )
358 : {
359 0 : bool bChanged = false;
360 0 : double fValue=0.0;
361 0 : if( (rDoubleAny>>=fValue) && (fValue!=0.0) )
362 : {
363 0 : fValue/=100.0;
364 0 : rDoubleAny = uno::makeAny(fValue);
365 0 : bChanged = true;
366 : }
367 0 : return bChanged;
368 : }
369 :
370 0 : bool lcl_AdaptWrongPercentScaleValues(chart2::ScaleData& rScaleData)
371 : {
372 0 : bool bChanged = lcl_divideBy100( rScaleData.Minimum );
373 0 : bChanged = lcl_divideBy100( rScaleData.Maximum ) || bChanged;
374 0 : bChanged = lcl_divideBy100( rScaleData.Origin ) || bChanged;
375 0 : bChanged = lcl_divideBy100( rScaleData.IncrementData.Distance ) || bChanged;
376 0 : return bChanged;
377 : }
378 :
379 : }//end anonymous namespace
380 :
381 580 : void SchXMLAxisContext::CreateAxis()
382 : {
383 580 : m_rAxes.push_back( m_aCurrentAxis );
384 :
385 580 : Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
386 580 : if( !xDiaProp.is() )
387 0 : return;
388 1160 : OUString aPropName;
389 580 : switch( m_aCurrentAxis.eDimension )
390 : {
391 : case SCH_XML_AXIS_X:
392 258 : if( m_aCurrentAxis.nAxisIndex == 0 )
393 244 : aPropName = "HasXAxis";
394 : else
395 14 : aPropName = "HasSecondaryXAxis";
396 258 : break;
397 : case SCH_XML_AXIS_Y:
398 258 : if( m_aCurrentAxis.nAxisIndex == 0 )
399 244 : aPropName = "HasYAxis";
400 : else
401 14 : aPropName = "HasSecondaryYAxis";
402 258 : break;
403 : case SCH_XML_AXIS_Z:
404 64 : if( m_aCurrentAxis.nAxisIndex == 0 )
405 64 : aPropName = "HasXAxis";
406 : else
407 0 : aPropName = "HasSecondaryXAxis";
408 64 : break;
409 : case SCH_XML_AXIS_UNDEF:
410 : SAL_INFO("xmloff.chart", "Invalid axis" );
411 0 : break;
412 : }
413 : try
414 : {
415 580 : xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
416 : }
417 0 : catch( beans::UnknownPropertyException & )
418 : {
419 : SAL_INFO("xmloff.chart", "Couldn't turn on axis" );
420 : }
421 580 : if( m_aCurrentAxis.eDimension==SCH_XML_AXIS_Z )
422 : {
423 64 : bool bSettingZAxisSuccedded = false;
424 : try
425 : {
426 64 : xDiaProp->getPropertyValue( aPropName ) >>= bSettingZAxisSuccedded;
427 : }
428 0 : catch( beans::UnknownPropertyException & )
429 : {
430 : SAL_INFO("xmloff.chart", "Couldn't turn on z axis" );
431 : }
432 64 : if( !bSettingZAxisSuccedded )
433 0 : return;
434 : }
435 :
436 580 : m_xAxisProps = Reference<beans::XPropertySet>( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ), uno::UNO_QUERY );
437 :
438 580 : if( m_bAddMissingXAxisForNetCharts && m_aCurrentAxis.eDimension==SCH_XML_AXIS_Y && m_aCurrentAxis.nAxisIndex==0 )
439 : {
440 : try
441 : {
442 0 : xDiaProp->setPropertyValue("HasXAxis", uno::makeAny(sal_True) );
443 : }
444 0 : catch( beans::UnknownPropertyException & )
445 : {
446 : SAL_INFO("xmloff.chart", "Couldn't turn on x axis" );
447 : }
448 : }
449 :
450 : // set properties
451 580 : if( m_xAxisProps.is())
452 : {
453 580 : uno::Any aTrueBool( uno::makeAny( sal_True ));
454 1160 : uno::Any aFalseBool( uno::makeAny( sal_False ));
455 :
456 : // #i109879# the line color is black as default, in the model it is a light gray
457 580 : m_xAxisProps->setPropertyValue("LineColor",
458 580 : uno::makeAny( COL_BLACK ));
459 :
460 580 : m_xAxisProps->setPropertyValue("DisplayLabels", aFalseBool );
461 :
462 : // #88077# AutoOrigin 'on' is default
463 580 : m_xAxisProps->setPropertyValue("AutoOrigin", aTrueBool );
464 :
465 580 : if( m_bAxisTypeImported )
466 166 : m_xAxisProps->setPropertyValue("AxisType", uno::makeAny(m_nAxisType) );
467 :
468 580 : if( !m_aAutoStyleName.isEmpty())
469 : {
470 580 : const SvXMLStylesContext* pStylesCtxt = m_rImportHelper.GetAutoStylesContext();
471 580 : if( pStylesCtxt )
472 : {
473 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
474 580 : SchXMLImportHelper::GetChartFamilyID(), m_aAutoStyleName );
475 :
476 580 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
477 : {
478 : // note: SvXMLStyleContext::FillPropertySet is not const
479 580 : XMLPropStyleContext * pPropStyleContext = const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
480 580 : if( pPropStyleContext )
481 580 : pPropStyleContext->FillPropertySet( m_xAxisProps );
482 :
483 580 : if( m_bAdaptWrongPercentScaleValues && m_aCurrentAxis.eDimension==SCH_XML_AXIS_Y )
484 : {
485 : //set scale data of added x axis back to default
486 0 : Reference< chart2::XAxis > xAxis( lcl_getAxis( GetImport().GetModel(),
487 0 : m_aCurrentAxis.eDimension, m_aCurrentAxis.nAxisIndex ) );
488 0 : if( xAxis.is() )
489 : {
490 0 : chart2::ScaleData aScaleData( xAxis->getScaleData());
491 0 : if( lcl_AdaptWrongPercentScaleValues(aScaleData) )
492 0 : xAxis->setScaleData( aScaleData );
493 0 : }
494 : }
495 :
496 580 : if( m_bAddMissingXAxisForNetCharts )
497 : {
498 : //copy style from y axis to added x axis:
499 :
500 0 : Reference< chart::XAxisSupplier > xAxisSuppl( xDiaProp, uno::UNO_QUERY );
501 0 : if( xAxisSuppl.is() )
502 : {
503 0 : Reference< beans::XPropertySet > xXAxisProp( xAxisSuppl->getAxis(0), uno::UNO_QUERY );
504 0 : const_cast<XMLPropStyleContext*>( static_cast< const XMLPropStyleContext* >( pStyle ))->FillPropertySet( xXAxisProp );
505 : }
506 :
507 : //set scale data of added x axis back to default
508 0 : Reference< chart2::XAxis > xAxis( lcl_getAxis( GetImport().GetModel(),
509 0 : 0 /*nDimensionIndex*/, 0 /*nAxisIndex*/ ) );
510 0 : if( xAxis.is() )
511 : {
512 0 : chart2::ScaleData aScaleData;
513 0 : aScaleData.AxisType = chart2::AxisType::CATEGORY;
514 0 : aScaleData.Orientation = chart2::AxisOrientation_MATHEMATICAL;
515 0 : xAxis->setScaleData( aScaleData );
516 : }
517 :
518 : //set line style of added x axis to invisible
519 0 : Reference< beans::XPropertySet > xNewAxisProp( xAxis, uno::UNO_QUERY );
520 0 : if( xNewAxisProp.is() )
521 : {
522 0 : xNewAxisProp->setPropertyValue("LineStyle"
523 0 : , uno::makeAny(drawing::LineStyle_NONE));
524 0 : }
525 : }
526 :
527 580 : if( m_bAdaptXAxisOrientationForOld2DBarCharts && m_aCurrentAxis.eDimension == SCH_XML_AXIS_X )
528 : {
529 0 : bool bIs3DChart = false;
530 0 : if( xDiaProp.is() && ( xDiaProp->getPropertyValue("Dim3D") >>= bIs3DChart )
531 0 : && !bIs3DChart )
532 : {
533 0 : Reference< chart2::XChartDocument > xChart2Document( GetImport().GetModel(), uno::UNO_QUERY );
534 0 : if( xChart2Document.is() )
535 : {
536 0 : Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xChart2Document->getFirstDiagram(), uno::UNO_QUERY );
537 0 : if( xCooSysCnt.is() )
538 : {
539 0 : uno::Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems() );
540 0 : if( aCooSysSeq.getLength() )
541 : {
542 0 : bool bSwapXandYAxis = false;
543 0 : Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[0] );
544 0 : Reference< beans::XPropertySet > xCooSysProp( xCooSys, uno::UNO_QUERY );
545 0 : if( xCooSysProp.is() && ( xCooSysProp->getPropertyValue("SwapXAndYAxis") >>= bSwapXandYAxis )
546 0 : && bSwapXandYAxis )
547 : {
548 0 : Reference< chart2::XAxis > xAxis = xCooSys->getAxisByDimension( 0, m_aCurrentAxis.nAxisIndex );
549 0 : if( xAxis.is() )
550 : {
551 0 : chart2::ScaleData aScaleData = xAxis->getScaleData();
552 0 : aScaleData.Orientation = chart2::AxisOrientation_REVERSE;
553 0 : xAxis->setScaleData( aScaleData );
554 0 : }
555 0 : }
556 0 : }
557 0 : }
558 0 : }
559 : }
560 : }
561 :
562 1080 : m_rbAxisPositionAttributeImported = m_rbAxisPositionAttributeImported || SchXMLTools::getPropertyFromContext(
563 1660 : OUString("CrossoverPosition"), pPropStyleContext, pStylesCtxt ).hasValue();
564 : }
565 : }
566 580 : }
567 580 : }
568 : }
569 :
570 580 : void SchXMLAxisContext::SetAxisTitle()
571 : {
572 580 : if( m_aCurrentAxis.aTitle.isEmpty() )
573 1044 : return;
574 :
575 58 : Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
576 58 : if( !xAxis.is() )
577 0 : return;
578 :
579 116 : Reference< beans::XPropertySet > xTitleProp( xAxis->getAxisTitle() );
580 58 : if( xTitleProp.is() )
581 : {
582 : try
583 : {
584 58 : xTitleProp->setPropertyValue("String", uno::makeAny(m_aCurrentAxis.aTitle) );
585 : }
586 0 : catch( beans::UnknownPropertyException & )
587 : {
588 : SAL_INFO("xmloff.chart", "Property String for Title not available" );
589 : }
590 58 : }
591 : }
592 :
593 : namespace
594 : {
595 : enum AxisChildTokens
596 : {
597 : XML_TOK_AXIS_TITLE,
598 : XML_TOK_AXIS_CATEGORIES,
599 : XML_TOK_AXIS_GRID,
600 : XML_TOK_AXIS_DATE_SCALE,
601 : XML_TOK_AXIS_DATE_SCALE_EXT
602 : };
603 :
604 : const SvXMLTokenMapEntry aAxisChildTokenMap[] =
605 : {
606 : { XML_NAMESPACE_CHART, XML_TITLE, XML_TOK_AXIS_TITLE },
607 : { XML_NAMESPACE_CHART, XML_CATEGORIES, XML_TOK_AXIS_CATEGORIES },
608 : { XML_NAMESPACE_CHART, XML_GRID, XML_TOK_AXIS_GRID },
609 : { XML_NAMESPACE_CHART, XML_DATE_SCALE, XML_TOK_AXIS_DATE_SCALE },
610 : { XML_NAMESPACE_CHART_EXT, XML_DATE_SCALE, XML_TOK_AXIS_DATE_SCALE_EXT },
611 : XML_TOKEN_MAP_END
612 : };
613 :
614 : class AxisChildTokenMap : public SvXMLTokenMap
615 : {
616 : public:
617 18 : AxisChildTokenMap(): SvXMLTokenMap( aAxisChildTokenMap ) {}
618 18 : virtual ~AxisChildTokenMap() {}
619 : };
620 :
621 : //a AxisChildTokenMap Singleton
622 : struct theAxisChildTokenMap : public rtl::Static< AxisChildTokenMap, theAxisChildTokenMap > {};
623 : }
624 :
625 624 : SvXMLImportContext* SchXMLAxisContext::CreateChildContext(
626 : sal_uInt16 p_nPrefix,
627 : const OUString& rLocalName,
628 : const Reference< xml::sax::XAttributeList >& xAttrList )
629 : {
630 624 : SvXMLImportContext* pContext = 0;
631 624 : const SvXMLTokenMap& rTokenMap = theAxisChildTokenMap::get();
632 :
633 624 : switch( rTokenMap.Get( p_nPrefix, rLocalName ))
634 : {
635 : case XML_TOK_AXIS_TITLE:
636 : {
637 58 : Reference< drawing::XShape > xTitleShape = getTitleShape();
638 58 : pContext = new SchXMLTitleContext( m_rImportHelper, GetImport(), rLocalName,
639 : m_aCurrentAxis.aTitle,
640 58 : xTitleShape );
641 : }
642 58 : break;
643 :
644 : case XML_TOK_AXIS_CATEGORIES:
645 174 : pContext = new SchXMLCategoriesContext( GetImport(),
646 : p_nPrefix, rLocalName,
647 174 : m_rCategoriesAddress );
648 174 : m_aCurrentAxis.bHasCategories = true;
649 174 : break;
650 :
651 : case XML_TOK_AXIS_DATE_SCALE:
652 : case XML_TOK_AXIS_DATE_SCALE_EXT:
653 134 : pContext = new DateScaleContext( GetImport(),
654 134 : p_nPrefix, rLocalName, m_xAxisProps );
655 134 : m_bDateScaleImported = true;
656 134 : break;
657 :
658 : case XML_TOK_AXIS_GRID:
659 : {
660 258 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
661 258 : bool bIsMajor = true; // default value for class is "major"
662 258 : OUString sAutoStyleName;
663 :
664 774 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
665 : {
666 516 : OUString sAttrName = xAttrList->getNameByIndex( i );
667 1032 : OUString aLocalName;
668 516 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
669 :
670 516 : if( nPrefix == XML_NAMESPACE_CHART )
671 : {
672 516 : if( IsXMLToken( aLocalName, XML_CLASS ) )
673 : {
674 258 : if( IsXMLToken( xAttrList->getValueByIndex( i ), XML_MINOR ) )
675 24 : bIsMajor = false;
676 : }
677 258 : else if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
678 258 : sAutoStyleName = xAttrList->getValueByIndex( i );
679 : }
680 516 : }
681 :
682 258 : CreateGrid( sAutoStyleName, bIsMajor );
683 :
684 : // don't create a context => use default context. grid elements are empty
685 258 : pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
686 : }
687 258 : break;
688 :
689 : default:
690 0 : pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
691 0 : break;
692 : }
693 :
694 624 : return pContext;
695 : }
696 :
697 580 : void SchXMLAxisContext::EndElement()
698 : {
699 580 : if( !m_bDateScaleImported && m_nAxisType==chart::ChartAxisType::AUTOMATIC )
700 : {
701 418 : Reference< chart2::XAxis > xAxis( lcl_getAxis( GetImport().GetModel(), m_aCurrentAxis.eDimension, m_aCurrentAxis.nAxisIndex ) );
702 418 : if( xAxis.is() )
703 : {
704 418 : chart2::ScaleData aScaleData( xAxis->getScaleData());
705 418 : aScaleData.AutoDateAxis = false;//different default for older documents
706 418 : xAxis->setScaleData( aScaleData );
707 418 : }
708 : }
709 :
710 580 : SetAxisTitle();
711 580 : }
712 :
713 : namespace
714 : {
715 :
716 24 : Reference< chart2::XAxis > lcl_getAxis( const Reference< chart2::XCoordinateSystem > xCooSys, sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex )
717 : {
718 24 : Reference< chart2::XAxis > xAxis;
719 : try
720 : {
721 24 : xAxis = xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex );
722 : }
723 12 : catch( uno::Exception & )
724 : {
725 : }
726 24 : return xAxis;
727 : }
728 :
729 : } // anonymous namespace
730 :
731 244 : void SchXMLAxisContext::CorrectAxisPositions( const Reference< chart2::XChartDocument >& xNewDoc,
732 : const OUString& rChartTypeServiceName,
733 : const OUString& rODFVersionOfFile,
734 : bool bAxisPositionAttributeImported )
735 : {
736 732 : if( ( rODFVersionOfFile.isEmpty() || rODFVersionOfFile == "1.0" || rODFVersionOfFile == "1.1"
737 482 : || ( rODFVersionOfFile == "1.2" && !bAxisPositionAttributeImported ) ) )
738 : {
739 : try
740 : {
741 6 : Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xNewDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
742 12 : uno::Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
743 6 : if( aCooSysSeq.getLength() )
744 : {
745 6 : Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[0] );
746 6 : if( xCooSys.is() )
747 : {
748 6 : Reference< chart2::XAxis > xMainXAxis = lcl_getAxis( xCooSys, 0, 0 );
749 12 : Reference< chart2::XAxis > xMainYAxis = lcl_getAxis( xCooSys, 1, 0 );
750 : //Reference< chart2::XAxis > xMajorZAxis = lcl_getAxis( xCooSys, 2, 0 );
751 12 : Reference< chart2::XAxis > xSecondaryXAxis = lcl_getAxis( xCooSys, 0, 1 );
752 12 : Reference< chart2::XAxis > xSecondaryYAxis = lcl_getAxis( xCooSys, 1, 1 );
753 :
754 12 : Reference< beans::XPropertySet > xMainXAxisProp( xMainXAxis, uno::UNO_QUERY );
755 12 : Reference< beans::XPropertySet > xMainYAxisProp( xMainYAxis, uno::UNO_QUERY );
756 12 : Reference< beans::XPropertySet > xSecondaryXAxisProp( xSecondaryXAxis, uno::UNO_QUERY );
757 12 : Reference< beans::XPropertySet > xSecondaryYAxisProp( xSecondaryYAxis, uno::UNO_QUERY );
758 :
759 6 : if( xMainXAxisProp.is() && xMainYAxisProp.is() )
760 : {
761 6 : chart2::ScaleData aMainXScale = xMainXAxis->getScaleData();
762 6 : if( rChartTypeServiceName == "com.sun.star.chart2.ScatterChartType" )
763 : {
764 0 : xMainYAxisProp->setPropertyValue("CrossoverPosition"
765 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_VALUE) );
766 0 : double fCrossoverValue = 0.0;
767 0 : aMainXScale.Origin >>= fCrossoverValue;
768 0 : xMainYAxisProp->setPropertyValue("CrossoverValue"
769 0 : , uno::makeAny( fCrossoverValue ) );
770 :
771 0 : if( aMainXScale.Orientation == chart2::AxisOrientation_REVERSE )
772 : {
773 0 : xMainYAxisProp->setPropertyValue("LabelPosition"
774 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_END) );
775 0 : xMainYAxisProp->setPropertyValue("MarkPosition"
776 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
777 0 : if( xSecondaryYAxisProp.is() )
778 0 : xSecondaryYAxisProp->setPropertyValue("CrossoverPosition"
779 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
780 : }
781 : else
782 : {
783 0 : xMainYAxisProp->setPropertyValue("LabelPosition"
784 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START) );
785 0 : xMainYAxisProp->setPropertyValue("MarkPosition"
786 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
787 0 : if( xSecondaryYAxisProp.is() )
788 0 : xSecondaryYAxisProp->setPropertyValue("CrossoverPosition"
789 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
790 : }
791 : }
792 : else
793 : {
794 6 : if( aMainXScale.Orientation == chart2::AxisOrientation_REVERSE )
795 : {
796 0 : xMainYAxisProp->setPropertyValue("CrossoverPosition"
797 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
798 0 : if( xSecondaryYAxisProp.is() )
799 0 : xSecondaryYAxisProp->setPropertyValue("CrossoverPosition"
800 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
801 : }
802 : else
803 : {
804 6 : xMainYAxisProp->setPropertyValue("CrossoverPosition"
805 6 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
806 6 : if( xSecondaryYAxisProp.is() )
807 0 : xSecondaryYAxisProp->setPropertyValue("CrossoverPosition"
808 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
809 : }
810 : }
811 :
812 12 : chart2::ScaleData aMainYScale = xMainYAxis->getScaleData();
813 6 : xMainXAxisProp->setPropertyValue("CrossoverPosition"
814 6 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_VALUE) );
815 6 : double fCrossoverValue = 0.0;
816 6 : aMainYScale.Origin >>= fCrossoverValue;
817 6 : xMainXAxisProp->setPropertyValue("CrossoverValue"
818 6 : , uno::makeAny( fCrossoverValue ) );
819 :
820 6 : if( aMainYScale.Orientation == chart2::AxisOrientation_REVERSE )
821 : {
822 0 : xMainXAxisProp->setPropertyValue("LabelPosition"
823 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_END) );
824 0 : xMainXAxisProp->setPropertyValue("MarkPosition"
825 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
826 0 : if( xSecondaryXAxisProp.is() )
827 0 : xSecondaryXAxisProp->setPropertyValue("CrossoverPosition"
828 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
829 : }
830 : else
831 : {
832 6 : xMainXAxisProp->setPropertyValue("LabelPosition"
833 6 : , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START) );
834 6 : xMainXAxisProp->setPropertyValue("MarkPosition"
835 6 : , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
836 6 : if( xSecondaryXAxisProp.is() )
837 0 : xSecondaryXAxisProp->setPropertyValue("CrossoverPosition"
838 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
839 6 : }
840 6 : }
841 6 : }
842 6 : }
843 : }
844 0 : catch( uno::Exception & )
845 : {
846 : }
847 : }
848 244 : }
849 :
850 174 : SchXMLCategoriesContext::SchXMLCategoriesContext(
851 : SvXMLImport& rImport,
852 : sal_uInt16 nPrefix,
853 : const OUString& rLocalName,
854 : OUString& rAddress ) :
855 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
856 174 : mrAddress( rAddress )
857 : {
858 174 : }
859 :
860 348 : SchXMLCategoriesContext::~SchXMLCategoriesContext()
861 : {
862 348 : }
863 :
864 174 : void SchXMLCategoriesContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
865 : {
866 174 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
867 :
868 348 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
869 : {
870 174 : OUString sAttrName = xAttrList->getNameByIndex( i );
871 348 : OUString aLocalName;
872 174 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
873 :
874 348 : if( nPrefix == XML_NAMESPACE_TABLE &&
875 174 : IsXMLToken( aLocalName, XML_CELL_RANGE_ADDRESS ) )
876 : {
877 174 : Reference< chart2::XChartDocument > xNewDoc( GetImport().GetModel(), uno::UNO_QUERY );
878 174 : mrAddress = xAttrList->getValueByIndex( i );
879 : }
880 174 : }
881 174 : }
882 :
883 134 : DateScaleContext::DateScaleContext(
884 : SvXMLImport& rImport,
885 : sal_uInt16 nPrefix,
886 : const OUString& rLocalName,
887 : const Reference< beans::XPropertySet > xAxisProps ) :
888 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
889 134 : m_xAxisProps( xAxisProps )
890 : {
891 134 : }
892 :
893 268 : DateScaleContext::~DateScaleContext()
894 : {
895 268 : }
896 :
897 : namespace
898 : {
899 : enum DateScaleAttributeTokens
900 : {
901 : XML_TOK_DATESCALE_BASE_TIME_UNIT,
902 : XML_TOK_DATESCALE_MAJOR_INTERVAL_VALUE,
903 : XML_TOK_DATESCALE_MAJOR_INTERVAL_UNIT,
904 : XML_TOK_DATESCALE_MINOR_INTERVAL_VALUE,
905 : XML_TOK_DATESCALE_MINOR_INTERVAL_UNIT
906 : };
907 :
908 : const SvXMLTokenMapEntry aDateScaleAttributeTokenMap[] =
909 : {
910 : { XML_NAMESPACE_CHART, XML_BASE_TIME_UNIT, XML_TOK_DATESCALE_BASE_TIME_UNIT },
911 : { XML_NAMESPACE_CHART, XML_MAJOR_INTERVAL_VALUE, XML_TOK_DATESCALE_MAJOR_INTERVAL_VALUE },
912 : { XML_NAMESPACE_CHART, XML_MAJOR_INTERVAL_UNIT, XML_TOK_DATESCALE_MAJOR_INTERVAL_UNIT },
913 : { XML_NAMESPACE_CHART, XML_MINOR_INTERVAL_VALUE, XML_TOK_DATESCALE_MINOR_INTERVAL_VALUE },
914 : { XML_NAMESPACE_CHART, XML_MINOR_INTERVAL_UNIT, XML_TOK_DATESCALE_MINOR_INTERVAL_UNIT },
915 : XML_TOKEN_MAP_END
916 : };
917 :
918 : class DateScaleAttributeTokenMap : public SvXMLTokenMap
919 : {
920 : public:
921 12 : DateScaleAttributeTokenMap(): SvXMLTokenMap( aDateScaleAttributeTokenMap ) {}
922 12 : virtual ~DateScaleAttributeTokenMap() {}
923 : };
924 :
925 : struct theDateScaleAttributeTokenMap : public rtl::Static< DateScaleAttributeTokenMap, theDateScaleAttributeTokenMap > {};
926 :
927 4 : sal_Int32 lcl_getTimeUnit( const OUString& rValue )
928 : {
929 4 : sal_Int32 nTimeUnit = ::com::sun::star::chart::TimeUnit::DAY;
930 4 : if( IsXMLToken( rValue, XML_DAYS ) )
931 2 : nTimeUnit = ::com::sun::star::chart::TimeUnit::DAY;
932 2 : else if( IsXMLToken( rValue, XML_MONTHS ) )
933 2 : nTimeUnit = ::com::sun::star::chart::TimeUnit::MONTH;
934 0 : else if( IsXMLToken( rValue, XML_YEARS ) )
935 0 : nTimeUnit = ::com::sun::star::chart::TimeUnit::YEAR;
936 4 : return nTimeUnit;
937 : }
938 :
939 : }
940 :
941 134 : void DateScaleContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
942 : {
943 134 : if( !m_xAxisProps.is() )
944 134 : return;
945 :
946 : // parse attributes
947 134 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
948 134 : const SvXMLTokenMap& rAttrTokenMap = theDateScaleAttributeTokenMap::get();
949 :
950 134 : bool bSetNewIncrement=false;
951 134 : chart::TimeIncrement aIncrement;
952 134 : m_xAxisProps->getPropertyValue("TimeIncrement") >>= aIncrement;
953 :
954 138 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
955 : {
956 4 : OUString sAttrName = xAttrList->getNameByIndex( i );
957 8 : OUString aLocalName;
958 8 : OUString aValue = xAttrList->getValueByIndex( i );
959 4 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
960 :
961 4 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
962 : {
963 : case XML_TOK_DATESCALE_BASE_TIME_UNIT:
964 : {
965 4 : aIncrement.TimeResolution = uno::makeAny( lcl_getTimeUnit(aValue) );
966 4 : bSetNewIncrement = true;
967 : }
968 4 : break;
969 : case XML_TOK_DATESCALE_MAJOR_INTERVAL_VALUE:
970 : {
971 0 : chart::TimeInterval aInterval(1,0);
972 0 : aIncrement.MajorTimeInterval >>= aInterval;
973 0 : ::sax::Converter::convertNumber( aInterval.Number, aValue );
974 0 : aIncrement.MajorTimeInterval = uno::makeAny(aInterval);
975 0 : bSetNewIncrement = true;
976 : }
977 0 : break;
978 : case XML_TOK_DATESCALE_MAJOR_INTERVAL_UNIT:
979 : {
980 0 : chart::TimeInterval aInterval(1,0);
981 0 : aIncrement.MajorTimeInterval >>= aInterval;
982 0 : aInterval.TimeUnit = lcl_getTimeUnit(aValue);
983 0 : aIncrement.MajorTimeInterval = uno::makeAny(aInterval);
984 0 : bSetNewIncrement = true;
985 : }
986 0 : break;
987 : case XML_TOK_DATESCALE_MINOR_INTERVAL_VALUE:
988 : {
989 0 : chart::TimeInterval aInterval(1,0);
990 0 : aIncrement.MinorTimeInterval >>= aInterval;
991 0 : ::sax::Converter::convertNumber( aInterval.Number, aValue );
992 0 : aIncrement.MinorTimeInterval = uno::makeAny(aInterval);
993 0 : bSetNewIncrement = true;
994 : }
995 0 : break;
996 : case XML_TOK_DATESCALE_MINOR_INTERVAL_UNIT:
997 : {
998 0 : chart::TimeInterval aInterval(1,0);
999 0 : aIncrement.MinorTimeInterval >>= aInterval;
1000 0 : aInterval.TimeUnit = lcl_getTimeUnit(aValue);
1001 0 : aIncrement.MinorTimeInterval = uno::makeAny(aInterval);
1002 0 : bSetNewIncrement = true;
1003 : }
1004 0 : break;
1005 : }
1006 4 : }
1007 :
1008 134 : if( bSetNewIncrement )
1009 4 : m_xAxisProps->setPropertyValue("TimeIncrement", uno::makeAny( aIncrement ) );
1010 : }
1011 :
1012 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|