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 >& rAxisProps );
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 193 : 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 193 : m_rbAxisPositionAttributeImported( rbAxisPositionAttributeImported )
119 : {
120 193 : }
121 :
122 386 : SchXMLAxisContext::~SchXMLAxisContext()
123 386 : {}
124 :
125 311 : static Reference< chart::XAxis > lcl_getChartAxis(const SchXMLAxis& rCurrentAxis, const Reference< chart::XDiagram >& rDiagram )
126 : {
127 311 : Reference< chart::XAxis > xAxis;
128 622 : Reference< chart::XAxisSupplier > xAxisSuppl( rDiagram, uno::UNO_QUERY );
129 311 : if( !xAxisSuppl.is() )
130 0 : return xAxis;
131 311 : if( rCurrentAxis.nAxisIndex == 0 )
132 304 : xAxis = xAxisSuppl->getAxis(rCurrentAxis.eDimension);
133 : else
134 7 : xAxis = xAxisSuppl->getSecondaryAxis(rCurrentAxis.eDimension);
135 311 : 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 14 : Reference< drawing::XShape > SchXMLAxisContext::getTitleShape()
142 : {
143 14 : Reference< drawing::XShape > xResult;
144 28 : Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
145 28 : Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
146 14 : if( !xDiaProp.is() || !xAxis.is() )
147 0 : return xResult;
148 :
149 28 : OUString aPropName;
150 14 : switch( m_aCurrentAxis.eDimension )
151 : {
152 : case SCH_XML_AXIS_X:
153 7 : if( m_aCurrentAxis.nAxisIndex == 0 )
154 7 : aPropName = "HasXAxisTitle";
155 : else
156 0 : aPropName = "HasSecondaryXAxisTitle";
157 7 : break;
158 : case SCH_XML_AXIS_Y:
159 7 : if( m_aCurrentAxis.nAxisIndex == 0 )
160 7 : aPropName = "HasYAxisTitle";
161 : else
162 0 : aPropName = "HasSecondaryYAxisTitle";
163 7 : 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 14 : xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
172 14 : xResult = Reference< drawing::XShape >( xAxis->getAxisTitle(), uno::UNO_QUERY );
173 14 : return xResult;
174 : }
175 :
176 90 : void SchXMLAxisContext::CreateGrid( const OUString& sAutoStyleName, bool bIsMajor )
177 : {
178 90 : Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
179 180 : Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
180 90 : if( !xDiaProp.is() || !xAxis.is() )
181 90 : return;
182 :
183 180 : OUString aPropName;
184 90 : switch( m_aCurrentAxis.eDimension )
185 : {
186 : case SCH_XML_AXIS_X:
187 7 : if( bIsMajor )
188 7 : aPropName = "HasXAxisGrid";
189 : else
190 0 : aPropName = "HasXAxisHelpGrid";
191 7 : break;
192 : case SCH_XML_AXIS_Y:
193 83 : if( bIsMajor )
194 78 : aPropName = "HasYAxisGrid";
195 : else
196 5 : aPropName = "HasYAxisHelpGrid";
197 83 : 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 90 : xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
209 :
210 90 : Reference< beans::XPropertySet > xGridProp;
211 90 : if( bIsMajor )
212 85 : xGridProp = xAxis->getMajorGrid();
213 : else
214 5 : xGridProp = xAxis->getMinorGrid();
215 :
216 : // set properties
217 90 : if( xGridProp.is())
218 : {
219 : // the line color is black as default, in the model it is a light gray
220 90 : xGridProp->setPropertyValue("LineColor",
221 90 : uno::makeAny( COL_BLACK ));
222 90 : if( !sAutoStyleName.isEmpty())
223 : {
224 90 : const SvXMLStylesContext* pStylesCtxt = m_rImportHelper.GetAutoStylesContext();
225 90 : if( pStylesCtxt )
226 : {
227 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
228 90 : SchXMLImportHelper::GetChartFamilyID(), sAutoStyleName );
229 :
230 90 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
231 90 : const_cast<XMLPropStyleContext*>( static_cast< const XMLPropStyleContext* >( pStyle ))->FillPropertySet( xGridProp );
232 : }
233 : }
234 180 : }
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 8 : AxisAttributeTokenMap(): SvXMLTokenMap( aAxisAttributeTokenMap ) {}
262 8 : virtual ~AxisAttributeTokenMap() {}
263 : };
264 :
265 : //a AxisAttributeTokenMap Singleton
266 : struct theAxisAttributeTokenMap : public rtl::Static< AxisAttributeTokenMap, theAxisAttributeTokenMap > {};
267 : }
268 :
269 193 : void SchXMLAxisContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
270 : {
271 : // parse attributes
272 193 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
273 193 : const SvXMLTokenMap& rAttrTokenMap = theAxisAttributeTokenMap::get();
274 :
275 819 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
276 : {
277 626 : OUString sAttrName = xAttrList->getNameByIndex( i );
278 1252 : OUString aLocalName;
279 1252 : OUString aValue = xAttrList->getValueByIndex( i );
280 626 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
281 :
282 626 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
283 : {
284 : case XML_TOK_AXIS_DIMENSION:
285 : {
286 : sal_uInt16 nEnumVal;
287 193 : if( SvXMLUnitConverter::convertEnum( nEnumVal, aValue, aXMLAxisDimensionMap ))
288 193 : m_aCurrentAxis.eDimension = ( SchXMLAxisDimension )nEnumVal;
289 : }
290 193 : break;
291 : case XML_TOK_AXIS_NAME:
292 193 : m_aCurrentAxis.aName = aValue;
293 193 : break;
294 : case XML_TOK_AXIS_TYPE:
295 : case XML_TOK_AXIS_TYPE_EXT:
296 : sal_uInt16 nEnumVal;
297 47 : if( SvXMLUnitConverter::convertEnum( nEnumVal, aValue, aXMLAxisTypeMap ))
298 : {
299 47 : m_nAxisType = nEnumVal;
300 47 : m_bAxisTypeImported = true;
301 : }
302 47 : break;
303 : case XML_TOK_AXIS_STYLE_NAME:
304 193 : m_aAutoStyleName = aValue;
305 193 : break;
306 : }
307 626 : }
308 :
309 : // check for number of axes with same dimension
310 193 : m_aCurrentAxis.nAxisIndex = 0;
311 193 : sal_Int32 nNumOfAxes = m_rAxes.size();
312 324 : for( sal_Int32 nCurrent = 0; nCurrent < nNumOfAxes; nCurrent++ )
313 : {
314 131 : if( m_rAxes[ nCurrent ].eDimension == m_aCurrentAxis.eDimension )
315 7 : m_aCurrentAxis.nAxisIndex++;
316 : }
317 193 : CreateAxis();
318 193 : }
319 : namespace
320 : {
321 :
322 148 : Reference< chart2::XAxis > lcl_getAxis( const Reference< frame::XModel >& xChartModel,
323 : sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex )
324 : {
325 148 : Reference< chart2::XAxis > xAxis;
326 :
327 : try
328 : {
329 148 : Reference< chart2::XChartDocument > xChart2Document( xChartModel, uno::UNO_QUERY );
330 148 : if( xChart2Document.is() )
331 : {
332 148 : Reference< chart2::XDiagram > xDiagram( xChart2Document->getFirstDiagram());
333 296 : Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
334 : uno::Sequence< Reference< chart2::XCoordinateSystem > >
335 296 : aCooSysSeq( xCooSysCnt->getCoordinateSystems());
336 148 : sal_Int32 nCooSysIndex = 0;
337 148 : if( nCooSysIndex < aCooSysSeq.getLength() )
338 : {
339 148 : Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[nCooSysIndex] );
340 148 : if( xCooSys.is() && nDimensionIndex < xCooSys->getDimension() )
341 : {
342 148 : const sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex);
343 148 : if( nAxisIndex <= nMaxAxisIndex )
344 148 : xAxis = xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex );
345 148 : }
346 148 : }
347 148 : }
348 : }
349 0 : catch( uno::Exception & )
350 : {
351 : SAL_INFO("xmloff.chart", "Couldn't get axis" );
352 : }
353 :
354 148 : 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 193 : void SchXMLAxisContext::CreateAxis()
382 : {
383 193 : m_rAxes.push_back( m_aCurrentAxis );
384 :
385 193 : Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
386 193 : if( !xDiaProp.is() )
387 0 : return;
388 386 : OUString aPropName;
389 193 : switch( m_aCurrentAxis.eDimension )
390 : {
391 : case SCH_XML_AXIS_X:
392 89 : if( m_aCurrentAxis.nAxisIndex == 0 )
393 86 : aPropName = "HasXAxis";
394 : else
395 3 : aPropName = "HasSecondaryXAxis";
396 89 : break;
397 : case SCH_XML_AXIS_Y:
398 90 : if( m_aCurrentAxis.nAxisIndex == 0 )
399 86 : aPropName = "HasYAxis";
400 : else
401 4 : aPropName = "HasSecondaryYAxis";
402 90 : break;
403 : case SCH_XML_AXIS_Z:
404 14 : if( m_aCurrentAxis.nAxisIndex == 0 )
405 14 : aPropName = "HasXAxis";
406 : else
407 0 : aPropName = "HasSecondaryXAxis";
408 14 : break;
409 : case SCH_XML_AXIS_UNDEF:
410 : SAL_INFO("xmloff.chart", "Invalid axis" );
411 0 : break;
412 : }
413 : try
414 : {
415 193 : 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 193 : if( m_aCurrentAxis.eDimension==SCH_XML_AXIS_Z )
422 : {
423 14 : bool bSettingZAxisSuccedded = false;
424 : try
425 : {
426 14 : xDiaProp->getPropertyValue( aPropName ) >>= bSettingZAxisSuccedded;
427 : }
428 0 : catch( beans::UnknownPropertyException & )
429 : {
430 : SAL_INFO("xmloff.chart", "Couldn't turn on z axis" );
431 : }
432 14 : if( !bSettingZAxisSuccedded )
433 0 : return;
434 : }
435 :
436 193 : m_xAxisProps = Reference<beans::XPropertySet>( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ), uno::UNO_QUERY );
437 :
438 193 : 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 193 : if( m_xAxisProps.is())
452 : {
453 193 : uno::Any aTrueBool( uno::makeAny( sal_True ));
454 386 : 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 193 : m_xAxisProps->setPropertyValue("LineColor",
458 193 : uno::makeAny( COL_BLACK ));
459 :
460 193 : m_xAxisProps->setPropertyValue("DisplayLabels", aFalseBool );
461 :
462 : // #88077# AutoOrigin 'on' is default
463 193 : m_xAxisProps->setPropertyValue("AutoOrigin", aTrueBool );
464 :
465 193 : if( m_bAxisTypeImported )
466 47 : m_xAxisProps->setPropertyValue("AxisType", uno::makeAny(m_nAxisType) );
467 :
468 193 : if( !m_aAutoStyleName.isEmpty())
469 : {
470 193 : const SvXMLStylesContext* pStylesCtxt = m_rImportHelper.GetAutoStylesContext();
471 193 : if( pStylesCtxt )
472 : {
473 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
474 193 : SchXMLImportHelper::GetChartFamilyID(), m_aAutoStyleName );
475 :
476 193 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
477 : {
478 : // note: SvXMLStyleContext::FillPropertySet is not const
479 193 : XMLPropStyleContext * pPropStyleContext = const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
480 193 : if( pPropStyleContext )
481 193 : pPropStyleContext->FillPropertySet( m_xAxisProps );
482 :
483 193 : 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 193 : 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 193 : 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 371 : m_rbAxisPositionAttributeImported = m_rbAxisPositionAttributeImported || SchXMLTools::getPropertyFromContext(
563 564 : OUString("CrossoverPosition"), pPropStyleContext, pStylesCtxt ).hasValue();
564 : }
565 : }
566 193 : }
567 193 : }
568 : }
569 :
570 193 : void SchXMLAxisContext::SetAxisTitle()
571 : {
572 193 : if( m_aCurrentAxis.aTitle.isEmpty() )
573 358 : return;
574 :
575 14 : Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
576 14 : if( !xAxis.is() )
577 0 : return;
578 :
579 28 : Reference< beans::XPropertySet > xTitleProp( xAxis->getAxisTitle() );
580 14 : if( xTitleProp.is() )
581 : {
582 : try
583 : {
584 14 : 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 14 : }
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 8 : AxisChildTokenMap(): SvXMLTokenMap( aAxisChildTokenMap ) {}
618 8 : virtual ~AxisChildTokenMap() {}
619 : };
620 :
621 : //a AxisChildTokenMap Singleton
622 : struct theAxisChildTokenMap : public rtl::Static< AxisChildTokenMap, theAxisChildTokenMap > {};
623 : }
624 :
625 194 : SvXMLImportContext* SchXMLAxisContext::CreateChildContext(
626 : sal_uInt16 p_nPrefix,
627 : const OUString& rLocalName,
628 : const Reference< xml::sax::XAttributeList >& xAttrList )
629 : {
630 194 : SvXMLImportContext* pContext = 0;
631 194 : const SvXMLTokenMap& rTokenMap = theAxisChildTokenMap::get();
632 :
633 194 : switch( rTokenMap.Get( p_nPrefix, rLocalName ))
634 : {
635 : case XML_TOK_AXIS_TITLE:
636 : {
637 14 : Reference< drawing::XShape > xTitleShape = getTitleShape();
638 14 : pContext = new SchXMLTitleContext( m_rImportHelper, GetImport(), rLocalName,
639 : m_aCurrentAxis.aTitle,
640 14 : xTitleShape );
641 : }
642 14 : break;
643 :
644 : case XML_TOK_AXIS_CATEGORIES:
645 51 : pContext = new SchXMLCategoriesContext( GetImport(),
646 : p_nPrefix, rLocalName,
647 51 : m_rCategoriesAddress );
648 51 : m_aCurrentAxis.bHasCategories = true;
649 51 : break;
650 :
651 : case XML_TOK_AXIS_DATE_SCALE:
652 : case XML_TOK_AXIS_DATE_SCALE_EXT:
653 39 : pContext = new DateScaleContext( GetImport(),
654 39 : p_nPrefix, rLocalName, m_xAxisProps );
655 39 : m_bDateScaleImported = true;
656 39 : break;
657 :
658 : case XML_TOK_AXIS_GRID:
659 : {
660 90 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
661 90 : bool bIsMajor = true; // default value for class is "major"
662 90 : OUString sAutoStyleName;
663 :
664 270 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
665 : {
666 180 : OUString sAttrName = xAttrList->getNameByIndex( i );
667 360 : OUString aLocalName;
668 180 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
669 :
670 180 : if( nPrefix == XML_NAMESPACE_CHART )
671 : {
672 180 : if( IsXMLToken( aLocalName, XML_CLASS ) )
673 : {
674 90 : if( IsXMLToken( xAttrList->getValueByIndex( i ), XML_MINOR ) )
675 5 : bIsMajor = false;
676 : }
677 90 : else if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
678 90 : sAutoStyleName = xAttrList->getValueByIndex( i );
679 : }
680 180 : }
681 :
682 90 : CreateGrid( sAutoStyleName, bIsMajor );
683 :
684 : // don't create a context => use default context. grid elements are empty
685 90 : pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
686 : }
687 90 : break;
688 :
689 : default:
690 0 : pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
691 0 : break;
692 : }
693 :
694 194 : return pContext;
695 : }
696 :
697 193 : void SchXMLAxisContext::EndElement()
698 : {
699 193 : if( !m_bDateScaleImported && m_nAxisType==chart::ChartAxisType::AUTOMATIC )
700 : {
701 148 : Reference< chart2::XAxis > xAxis( lcl_getAxis( GetImport().GetModel(), m_aCurrentAxis.eDimension, m_aCurrentAxis.nAxisIndex ) );
702 148 : if( xAxis.is() )
703 : {
704 148 : chart2::ScaleData aScaleData( xAxis->getScaleData());
705 148 : aScaleData.AutoDateAxis = false;//different default for older documents
706 148 : xAxis->setScaleData( aScaleData );
707 148 : }
708 : }
709 :
710 193 : SetAxisTitle();
711 193 : }
712 :
713 : namespace
714 : {
715 :
716 12 : Reference< chart2::XAxis > lcl_getAxis( const Reference< chart2::XCoordinateSystem >& rCooSys, sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex )
717 : {
718 12 : Reference< chart2::XAxis > xAxis;
719 : try
720 : {
721 12 : xAxis = rCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex );
722 : }
723 6 : catch( uno::Exception & )
724 : {
725 : }
726 12 : return xAxis;
727 : }
728 :
729 : } // anonymous namespace
730 :
731 86 : void SchXMLAxisContext::CorrectAxisPositions( const Reference< chart2::XChartDocument >& xNewDoc,
732 : const OUString& rChartTypeServiceName,
733 : const OUString& rODFVersionOfFile,
734 : bool bAxisPositionAttributeImported )
735 : {
736 258 : if( ( rODFVersionOfFile.isEmpty() || rODFVersionOfFile == "1.0" || rODFVersionOfFile == "1.1"
737 169 : || ( rODFVersionOfFile == "1.2" && !bAxisPositionAttributeImported ) ) )
738 : {
739 : try
740 : {
741 3 : Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xNewDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
742 6 : uno::Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
743 3 : if( aCooSysSeq.getLength() )
744 : {
745 3 : Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[0] );
746 3 : if( xCooSys.is() )
747 : {
748 3 : Reference< chart2::XAxis > xMainXAxis = lcl_getAxis( xCooSys, 0, 0 );
749 6 : Reference< chart2::XAxis > xMainYAxis = lcl_getAxis( xCooSys, 1, 0 );
750 : //Reference< chart2::XAxis > xMajorZAxis = lcl_getAxis( xCooSys, 2, 0 );
751 6 : Reference< chart2::XAxis > xSecondaryXAxis = lcl_getAxis( xCooSys, 0, 1 );
752 6 : Reference< chart2::XAxis > xSecondaryYAxis = lcl_getAxis( xCooSys, 1, 1 );
753 :
754 6 : Reference< beans::XPropertySet > xMainXAxisProp( xMainXAxis, uno::UNO_QUERY );
755 6 : Reference< beans::XPropertySet > xMainYAxisProp( xMainYAxis, uno::UNO_QUERY );
756 6 : Reference< beans::XPropertySet > xSecondaryXAxisProp( xSecondaryXAxis, uno::UNO_QUERY );
757 6 : Reference< beans::XPropertySet > xSecondaryYAxisProp( xSecondaryYAxis, uno::UNO_QUERY );
758 :
759 3 : if( xMainXAxisProp.is() && xMainYAxisProp.is() )
760 : {
761 3 : chart2::ScaleData aMainXScale = xMainXAxis->getScaleData();
762 3 : 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 3 : 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 3 : xMainYAxisProp->setPropertyValue("CrossoverPosition"
805 3 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
806 3 : if( xSecondaryYAxisProp.is() )
807 0 : xSecondaryYAxisProp->setPropertyValue("CrossoverPosition"
808 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
809 : }
810 : }
811 :
812 6 : chart2::ScaleData aMainYScale = xMainYAxis->getScaleData();
813 3 : xMainXAxisProp->setPropertyValue("CrossoverPosition"
814 3 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_VALUE) );
815 3 : double fCrossoverValue = 0.0;
816 3 : aMainYScale.Origin >>= fCrossoverValue;
817 3 : xMainXAxisProp->setPropertyValue("CrossoverValue"
818 3 : , uno::makeAny( fCrossoverValue ) );
819 :
820 3 : 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 3 : xMainXAxisProp->setPropertyValue("LabelPosition"
833 3 : , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START) );
834 3 : xMainXAxisProp->setPropertyValue("MarkPosition"
835 3 : , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
836 3 : if( xSecondaryXAxisProp.is() )
837 0 : xSecondaryXAxisProp->setPropertyValue("CrossoverPosition"
838 0 : , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
839 3 : }
840 3 : }
841 3 : }
842 3 : }
843 : }
844 0 : catch( uno::Exception & )
845 : {
846 : }
847 : }
848 86 : }
849 :
850 51 : SchXMLCategoriesContext::SchXMLCategoriesContext(
851 : SvXMLImport& rImport,
852 : sal_uInt16 nPrefix,
853 : const OUString& rLocalName,
854 : OUString& rAddress ) :
855 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
856 51 : mrAddress( rAddress )
857 : {
858 51 : }
859 :
860 102 : SchXMLCategoriesContext::~SchXMLCategoriesContext()
861 : {
862 102 : }
863 :
864 51 : void SchXMLCategoriesContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
865 : {
866 51 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
867 :
868 102 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
869 : {
870 51 : OUString sAttrName = xAttrList->getNameByIndex( i );
871 102 : OUString aLocalName;
872 51 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
873 :
874 102 : if( nPrefix == XML_NAMESPACE_TABLE &&
875 51 : IsXMLToken( aLocalName, XML_CELL_RANGE_ADDRESS ) )
876 : {
877 51 : Reference< chart2::XChartDocument > xNewDoc( GetImport().GetModel(), uno::UNO_QUERY );
878 51 : mrAddress = xAttrList->getValueByIndex( i );
879 : }
880 51 : }
881 51 : }
882 :
883 39 : DateScaleContext::DateScaleContext(
884 : SvXMLImport& rImport,
885 : sal_uInt16 nPrefix,
886 : const OUString& rLocalName,
887 : const Reference< beans::XPropertySet >& rAxisProps ) :
888 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
889 39 : m_xAxisProps( rAxisProps )
890 : {
891 39 : }
892 :
893 78 : DateScaleContext::~DateScaleContext()
894 : {
895 78 : }
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 5 : DateScaleAttributeTokenMap(): SvXMLTokenMap( aDateScaleAttributeTokenMap ) {}
922 5 : virtual ~DateScaleAttributeTokenMap() {}
923 : };
924 :
925 : struct theDateScaleAttributeTokenMap : public rtl::Static< DateScaleAttributeTokenMap, theDateScaleAttributeTokenMap > {};
926 :
927 2 : sal_Int32 lcl_getTimeUnit( const OUString& rValue )
928 : {
929 2 : sal_Int32 nTimeUnit = ::com::sun::star::chart::TimeUnit::DAY;
930 2 : if( IsXMLToken( rValue, XML_DAYS ) )
931 1 : nTimeUnit = ::com::sun::star::chart::TimeUnit::DAY;
932 1 : else if( IsXMLToken( rValue, XML_MONTHS ) )
933 1 : 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 2 : return nTimeUnit;
937 : }
938 :
939 : }
940 :
941 39 : void DateScaleContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
942 : {
943 39 : if( !m_xAxisProps.is() )
944 39 : return;
945 :
946 : // parse attributes
947 39 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
948 39 : const SvXMLTokenMap& rAttrTokenMap = theDateScaleAttributeTokenMap::get();
949 :
950 39 : bool bSetNewIncrement=false;
951 39 : chart::TimeIncrement aIncrement;
952 39 : m_xAxisProps->getPropertyValue("TimeIncrement") >>= aIncrement;
953 :
954 41 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
955 : {
956 2 : OUString sAttrName = xAttrList->getNameByIndex( i );
957 4 : OUString aLocalName;
958 4 : OUString aValue = xAttrList->getValueByIndex( i );
959 2 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
960 :
961 2 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
962 : {
963 : case XML_TOK_DATESCALE_BASE_TIME_UNIT:
964 : {
965 2 : aIncrement.TimeResolution = uno::makeAny( lcl_getTimeUnit(aValue) );
966 2 : bSetNewIncrement = true;
967 : }
968 2 : 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 2 : }
1007 :
1008 39 : if( bSetNewIncrement )
1009 2 : m_xAxisProps->setPropertyValue("TimeIncrement", uno::makeAny( aIncrement ) );
1010 : }
1011 :
1012 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|