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 "AxisHelper.hxx"
21 : #include "DiagramHelper.hxx"
22 : #include "ChartTypeHelper.hxx"
23 : #include "macros.hxx"
24 : #include "AxisIndexDefines.hxx"
25 : #include "LinePropertiesHelper.hxx"
26 : #include "ContainerHelper.hxx"
27 : #include "servicenames_coosystems.hxx"
28 : #include "DataSeriesHelper.hxx"
29 : #include "Scaling.hxx"
30 : #include "ChartModelHelper.hxx"
31 : #include "DataSourceHelper.hxx"
32 :
33 : #include <unotools/saveopt.hxx>
34 :
35 : #include <com/sun/star/chart/ChartAxisPosition.hpp>
36 :
37 : #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
38 : #include <com/sun/star/chart2/XChartTypeContainer.hpp>
39 : #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
40 : #include <com/sun/star/chart2/data/XDataSource.hpp>
41 :
42 : // header for class OUStringBuffer
43 : #include <rtl/ustrbuf.hxx>
44 : #include <rtl/math.hxx>
45 :
46 : #include <com/sun/star/util/XCloneable.hpp>
47 : #include <com/sun/star/lang/XServiceName.hpp>
48 :
49 : #include <map>
50 :
51 : namespace chart
52 : {
53 : using namespace ::com::sun::star;
54 : using namespace ::com::sun::star::chart2;
55 : using ::com::sun::star::uno::Reference;
56 : using ::com::sun::star::uno::Sequence;
57 :
58 0 : Reference< chart2::XScaling > AxisHelper::createLinearScaling()
59 : {
60 0 : return new LinearScaling( 1.0, 0.0 );
61 : }
62 :
63 0 : Reference< chart2::XScaling > AxisHelper::createLogarithmicScaling( double fBase )
64 : {
65 0 : return new LogarithmicScaling( fBase );
66 : }
67 :
68 0 : ScaleData AxisHelper::createDefaultScale()
69 : {
70 0 : ScaleData aScaleData;
71 0 : aScaleData.AxisType = chart2::AxisType::REALNUMBER;
72 0 : aScaleData.AutoDateAxis = true;
73 0 : aScaleData.ShiftedCategoryPosition = false;//this is adapted in the view code currently
74 0 : Sequence< SubIncrement > aSubIncrements(1);
75 0 : aSubIncrements[0] = SubIncrement();
76 0 : aScaleData.IncrementData.SubIncrements = aSubIncrements;
77 0 : return aScaleData;
78 : }
79 :
80 0 : void AxisHelper::removeExplicitScaling( ScaleData& rScaleData )
81 : {
82 0 : uno::Any aEmpty;
83 0 : rScaleData.Minimum = rScaleData.Maximum = rScaleData.Origin = aEmpty;
84 0 : rScaleData.Scaling = 0;
85 0 : ScaleData aDefaultScale( createDefaultScale() );
86 0 : rScaleData.IncrementData = aDefaultScale.IncrementData;
87 0 : rScaleData.TimeIncrement = aDefaultScale.TimeIncrement;
88 0 : }
89 :
90 0 : bool AxisHelper::isLogarithmic( const Reference< XScaling >& xScaling )
91 : {
92 0 : bool bReturn = false;
93 0 : Reference< lang::XServiceName > xServiceName( xScaling, uno::UNO_QUERY );
94 0 : bReturn =( xServiceName.is() && (xServiceName->getServiceName()).equals(
95 0 : "com.sun.star.chart2.LogarithmicScaling"));
96 0 : return bReturn;
97 : }
98 :
99 0 : chart2::ScaleData AxisHelper::getDateCheckedScale( const Reference< chart2::XAxis >& xAxis, ChartModel& rModel )
100 : {
101 0 : ScaleData aScale = xAxis->getScaleData();
102 0 : Reference< chart2::XCoordinateSystem > xCooSys( ChartModelHelper::getFirstCoordinateSystem( rModel ) );
103 0 : if( aScale.AutoDateAxis && aScale.AxisType == AxisType::CATEGORY )
104 : {
105 0 : sal_Int32 nDimensionIndex=0; sal_Int32 nAxisIndex=0;
106 0 : AxisHelper::getIndicesForAxis(xAxis, xCooSys, nDimensionIndex, nAxisIndex );
107 0 : bool bChartTypeAllowsDateAxis = ChartTypeHelper::isSupportingDateAxis( AxisHelper::getChartTypeByIndex( xCooSys, 0 ), 2, nDimensionIndex );
108 0 : if( bChartTypeAllowsDateAxis )
109 0 : aScale.AxisType = AxisType::DATE;
110 : }
111 0 : if( aScale.AxisType == AxisType::DATE )
112 : {
113 0 : ExplicitCategoriesProvider aExplicitCategoriesProvider( xCooSys, rModel );
114 0 : if( !aExplicitCategoriesProvider.isDateAxis() )
115 0 : aScale.AxisType = AxisType::CATEGORY;
116 : }
117 0 : return aScale;
118 : }
119 :
120 0 : void AxisHelper::checkDateAxis( chart2::ScaleData& rScale, ExplicitCategoriesProvider* pExplicitCategoriesProvider, bool bChartTypeAllowsDateAxis )
121 : {
122 0 : if( rScale.AutoDateAxis && rScale.AxisType == AxisType::CATEGORY && bChartTypeAllowsDateAxis )
123 : {
124 0 : rScale.AxisType = AxisType::DATE;
125 0 : removeExplicitScaling( rScale );
126 : }
127 0 : if( rScale.AxisType == AxisType::DATE && (!pExplicitCategoriesProvider || !pExplicitCategoriesProvider->isDateAxis()) )
128 : {
129 0 : rScale.AxisType = AxisType::CATEGORY;
130 0 : removeExplicitScaling( rScale );
131 : }
132 0 : }
133 :
134 0 : sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis(
135 : const Reference< chart2::XAxis >& xAxis
136 : , const Reference< chart2::XCoordinateSystem > & xCorrespondingCoordinateSystem
137 : , const Reference< util::XNumberFormatsSupplier >& xNumberFormatsSupplier
138 : , bool bSearchForParallelAxisIfNothingIsFound )
139 : {
140 0 : sal_Int32 nNumberFormatKey(0);
141 0 : bool bNumberFormatKeyFoundViaAttachedData = false;
142 0 : sal_Int32 nAxisIndex = 0;
143 0 : sal_Int32 nDimensionIndex = 1;
144 0 : AxisHelper::getIndicesForAxis( xAxis, xCorrespondingCoordinateSystem, nDimensionIndex, nAxisIndex );
145 0 : Reference< chart2::XChartDocument > xChartDoc( xNumberFormatsSupplier, uno::UNO_QUERY );
146 :
147 0 : Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY );
148 0 : if( xProp.is() && !( xProp->getPropertyValue( "NumberFormat" ) >>= nNumberFormatKey ) )
149 : {
150 0 : bool bFormatSet = false;
151 : //check whether we have a percent scale -> use percent format
152 0 : if( xNumberFormatsSupplier.is() )
153 : {
154 0 : ChartModel* pModel = dynamic_cast<ChartModel*>( xChartDoc.get() );
155 : assert(pModel);
156 0 : ScaleData aData = AxisHelper::getDateCheckedScale( xAxis, *pModel );
157 0 : if( aData.AxisType==AxisType::PERCENT )
158 : {
159 0 : sal_Int32 nPercentFormat = DiagramHelper::getPercentNumberFormat( xNumberFormatsSupplier );
160 0 : if( nPercentFormat != -1 )
161 : {
162 0 : nNumberFormatKey = nPercentFormat;
163 0 : bFormatSet = true;
164 : }
165 : }
166 0 : else if( aData.AxisType==AxisType::DATE )
167 : {
168 0 : if( aData.Categories.is() )
169 : {
170 0 : Reference< data::XDataSequence > xSeq( aData.Categories->getValues());
171 0 : if( xSeq.is() && !( xChartDoc.is() && xChartDoc->hasInternalDataProvider()) )
172 0 : nNumberFormatKey = xSeq->getNumberFormatKeyByIndex( -1 );
173 : else
174 0 : nNumberFormatKey = DiagramHelper::getDateNumberFormat( xNumberFormatsSupplier );
175 0 : bFormatSet = true;
176 : }
177 : }
178 0 : else if( xChartDoc.is() && xChartDoc->hasInternalDataProvider() && nDimensionIndex == 0 ) //maybe date axis
179 : {
180 0 : Reference< chart2::XDiagram > xDiagram( xChartDoc->getFirstDiagram() );
181 0 : if( DiagramHelper::isSupportingDateAxis( xDiagram ) )
182 : {
183 0 : nNumberFormatKey = DiagramHelper::getDateNumberFormat( xNumberFormatsSupplier );
184 : }
185 : else
186 : {
187 0 : Reference< data::XDataSource > xSource( DataSourceHelper::getUsedData( xChartDoc ) );
188 0 : if( xSource.is() )
189 : {
190 : ::std::vector< Reference< chart2::data::XLabeledDataSequence > > aXValues(
191 0 : DataSeriesHelper::getAllDataSequencesByRole( xSource->getDataSequences(), "values-x", true ) );
192 0 : if( aXValues.empty() )
193 : {
194 0 : Reference< data::XLabeledDataSequence > xCategories( DiagramHelper::getCategoriesFromDiagram( xDiagram ) );
195 0 : if( xCategories.is() )
196 : {
197 0 : Reference< data::XDataSequence > xSeq( xCategories->getValues());
198 0 : if( xSeq.is() )
199 : {
200 0 : bool bHasValidDoubles = false;
201 0 : double fTest=0.0;
202 0 : Sequence< uno::Any > aCats( xSeq->getData() );
203 0 : sal_Int32 nCount = aCats.getLength();
204 0 : for( sal_Int32 i = 0; i < nCount; ++i )
205 : {
206 0 : if( (aCats[i]>>=fTest) && !::rtl::math::isNan(fTest) )
207 : {
208 0 : bHasValidDoubles=true;
209 0 : break;
210 : }
211 : }
212 0 : if( bHasValidDoubles )
213 0 : nNumberFormatKey = DiagramHelper::getDateNumberFormat( xNumberFormatsSupplier );
214 0 : }
215 0 : }
216 0 : }
217 0 : }
218 : }
219 0 : bFormatSet = true;
220 0 : }
221 : }
222 :
223 0 : if( !bFormatSet )
224 : {
225 : typedef ::std::map< sal_Int32, sal_Int32 > tNumberformatFrequency;
226 0 : tNumberformatFrequency aKeyMap;
227 :
228 : try
229 : {
230 0 : Reference< XChartTypeContainer > xCTCnt( xCorrespondingCoordinateSystem, uno::UNO_QUERY_THROW );
231 0 : if( xCTCnt.is() )
232 : {
233 0 : OUString aRoleToMatch;
234 0 : if( nDimensionIndex == 0 )
235 0 : aRoleToMatch = "values-x";
236 0 : Sequence< Reference< XChartType > > aChartTypes( xCTCnt->getChartTypes());
237 0 : for( sal_Int32 nCTIdx=0; nCTIdx<aChartTypes.getLength(); ++nCTIdx )
238 : {
239 0 : if( nDimensionIndex != 0 )
240 0 : aRoleToMatch = ChartTypeHelper::getRoleOfSequenceForYAxisNumberFormatDetection( aChartTypes[nCTIdx] );
241 0 : Reference< XDataSeriesContainer > xDSCnt( aChartTypes[nCTIdx], uno::UNO_QUERY_THROW );
242 0 : Sequence< Reference< XDataSeries > > aDataSeriesSeq( xDSCnt->getDataSeries());
243 0 : for( sal_Int32 nSeriesIdx=0; nSeriesIdx<aDataSeriesSeq.getLength(); ++nSeriesIdx )
244 : {
245 0 : Reference< chart2::XDataSeries > xDataSeries(aDataSeriesSeq[nSeriesIdx]);
246 0 : Reference< data::XDataSource > xSource( xDataSeries, uno::UNO_QUERY_THROW );
247 :
248 0 : if( nDimensionIndex == 1 )
249 : {
250 : //only take those series into accoutn that are attached to this axis
251 0 : sal_Int32 nAttachedAxisIndex = DataSeriesHelper::getAttachedAxisIndex(xDataSeries);
252 0 : if( nAttachedAxisIndex != nAxisIndex )
253 0 : continue;
254 : }
255 :
256 : Reference< data::XLabeledDataSequence > xLabeledSeq(
257 0 : DataSeriesHelper::getDataSequenceByRole( xSource, aRoleToMatch ) );
258 :
259 0 : if( !xLabeledSeq.is() && nDimensionIndex==0 )
260 : {
261 0 : ScaleData aData = xAxis->getScaleData();
262 0 : xLabeledSeq = aData.Categories;
263 : }
264 :
265 0 : if( xLabeledSeq.is() )
266 : {
267 0 : Reference< data::XDataSequence > xSeq( xLabeledSeq->getValues());
268 0 : if( xSeq.is() )
269 : {
270 0 : sal_Int32 nKey = xSeq->getNumberFormatKeyByIndex( -1 );
271 : // initialize the value
272 0 : if( aKeyMap.find( nKey ) == aKeyMap.end())
273 0 : aKeyMap[ nKey ] = 0;
274 : // increase frequency
275 0 : aKeyMap[ nKey ] = (aKeyMap[ nKey ] + 1);
276 0 : }
277 : }
278 0 : }
279 0 : }
280 0 : }
281 : }
282 0 : catch( const uno::Exception & ex )
283 : {
284 : ASSERT_EXCEPTION( ex );
285 : }
286 :
287 0 : if( ! aKeyMap.empty())
288 : {
289 0 : sal_Int32 nMaxFreq = 0;
290 : // find most frequent key
291 0 : for( tNumberformatFrequency::const_iterator aIt = aKeyMap.begin();
292 0 : aIt != aKeyMap.end(); ++aIt )
293 : {
294 : OSL_TRACE( "NumberFormatKey %d appears %d times", (*aIt).first, (*aIt).second );
295 : // all values must at least be 1
296 0 : if( (*aIt).second > nMaxFreq )
297 : {
298 0 : nNumberFormatKey = (*aIt).first;
299 0 : bNumberFormatKeyFoundViaAttachedData = true;
300 0 : nMaxFreq = (*aIt).second;
301 : }
302 : }
303 : }
304 :
305 0 : if( bSearchForParallelAxisIfNothingIsFound )
306 : {
307 : //no format is set to this axis and no data is set to this axis
308 : //--> try to obtain the format from the parallel y-axis
309 0 : if( !bNumberFormatKeyFoundViaAttachedData && nDimensionIndex == 1 )
310 : {
311 0 : sal_Int32 nParallelAxisIndex = (nAxisIndex==1) ?0 :1;
312 0 : Reference< XAxis > xParallelAxis( AxisHelper::getAxis( 1, nParallelAxisIndex, xCorrespondingCoordinateSystem ) );
313 0 : nNumberFormatKey = AxisHelper::getExplicitNumberFormatKeyForAxis( xParallelAxis, xCorrespondingCoordinateSystem, xNumberFormatsSupplier, false );
314 : }
315 0 : }
316 : }
317 : }
318 0 : return nNumberFormatKey;
319 : }
320 :
321 0 : Reference< XAxis > AxisHelper::createAxis(
322 : sal_Int32 nDimensionIndex
323 : , sal_Int32 nAxisIndex // 0==main or 1==secondary axis
324 : , const Reference< XCoordinateSystem >& xCooSys
325 : , const Reference< uno::XComponentContext > & xContext
326 : , ReferenceSizeProvider * pRefSizeProvider )
327 : {
328 0 : if( !xContext.is() || !xCooSys.is() )
329 0 : return NULL;
330 0 : if( nDimensionIndex >= xCooSys->getDimension() )
331 0 : return NULL;
332 :
333 0 : Reference< XAxis > xAxis( xContext->getServiceManager()->createInstanceWithContext(
334 0 : "com.sun.star.chart2.Axis", xContext ), uno::UNO_QUERY );
335 :
336 : OSL_ASSERT( xAxis.is());
337 0 : if( xAxis.is())
338 : {
339 0 : xCooSys->setAxisByDimension( nDimensionIndex, xAxis, nAxisIndex );
340 :
341 0 : if( nAxisIndex>0 )//when inserting secondary axes copy some things from the main axis
342 : {
343 0 : ::com::sun::star::chart::ChartAxisPosition eNewAxisPos( ::com::sun::star::chart::ChartAxisPosition_END );
344 :
345 0 : Reference< XAxis > xMainAxis( xCooSys->getAxisByDimension( nDimensionIndex, 0 ) );
346 0 : if( xMainAxis.is() )
347 : {
348 0 : ScaleData aScale = xAxis->getScaleData();
349 0 : ScaleData aMainScale = xMainAxis->getScaleData();
350 :
351 0 : aScale.AxisType = aMainScale.AxisType;
352 0 : aScale.AutoDateAxis = aMainScale.AutoDateAxis;
353 0 : aScale.Categories = aMainScale.Categories;
354 0 : aScale.Orientation = aMainScale.Orientation;
355 :
356 0 : xAxis->setScaleData( aScale );
357 :
358 : //ensure that the second axis is not placed on the main axis
359 0 : Reference< beans::XPropertySet > xMainProp( xMainAxis, uno::UNO_QUERY );
360 0 : if( xMainProp.is() )
361 : {
362 0 : ::com::sun::star::chart::ChartAxisPosition eMainAxisPos( ::com::sun::star::chart::ChartAxisPosition_ZERO );
363 0 : xMainProp->getPropertyValue("CrossoverPosition") >>= eMainAxisPos;
364 0 : if( ::com::sun::star::chart::ChartAxisPosition_END == eMainAxisPos )
365 0 : eNewAxisPos = ::com::sun::star::chart::ChartAxisPosition_START;
366 0 : }
367 : }
368 :
369 0 : Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY );
370 0 : if( xProp.is() )
371 0 : xProp->setPropertyValue("CrossoverPosition", uno::makeAny(eNewAxisPos) );
372 : }
373 :
374 0 : Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY );
375 0 : if( xProp.is() ) try
376 : {
377 : // set correct initial AutoScale
378 0 : if( pRefSizeProvider )
379 0 : pRefSizeProvider->setValuesAtPropertySet( xProp );
380 : }
381 0 : catch( const uno::Exception& e )
382 : {
383 : ASSERT_EXCEPTION( e );
384 0 : }
385 : }
386 0 : return xAxis;
387 : }
388 :
389 0 : Reference< XAxis > AxisHelper::createAxis( sal_Int32 nDimensionIndex, bool bMainAxis
390 : , const Reference< chart2::XDiagram >& xDiagram
391 : , const Reference< uno::XComponentContext >& xContext
392 : , ReferenceSizeProvider * pRefSizeProvider )
393 : {
394 : OSL_ENSURE( xContext.is(), "need a context to create an axis" );
395 0 : if( !xContext.is() )
396 0 : return NULL;
397 :
398 0 : sal_Int32 nAxisIndex = bMainAxis ? MAIN_AXIS_INDEX : SECONDARY_AXIS_INDEX;
399 0 : sal_Int32 nCooSysIndex = 0;
400 0 : Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
401 :
402 : // create axis
403 : return AxisHelper::createAxis(
404 0 : nDimensionIndex, nAxisIndex, xCooSys, xContext, pRefSizeProvider );
405 : }
406 :
407 0 : void AxisHelper::showAxis( sal_Int32 nDimensionIndex, bool bMainAxis
408 : , const Reference< chart2::XDiagram >& xDiagram
409 : , const Reference< uno::XComponentContext >& xContext
410 : , ReferenceSizeProvider * pRefSizeProvider )
411 : {
412 0 : if( !xDiagram.is() )
413 0 : return;
414 :
415 0 : bool bNewAxisCreated = false;
416 0 : Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) );
417 0 : if( !xAxis.is() && xContext.is() )
418 : {
419 : // create axis
420 0 : bNewAxisCreated = true;
421 0 : xAxis.set( AxisHelper::createAxis( nDimensionIndex, bMainAxis, xDiagram, xContext, pRefSizeProvider ) );
422 : }
423 :
424 : OSL_ASSERT( xAxis.is());
425 0 : if( !bNewAxisCreated ) //default is true already if created
426 0 : AxisHelper::makeAxisVisible( xAxis );
427 : }
428 :
429 0 : void AxisHelper::showGrid( sal_Int32 nDimensionIndex, sal_Int32 nCooSysIndex, bool bMainGrid
430 : , const Reference< XDiagram >& xDiagram
431 : , const Reference< uno::XComponentContext >& /*xContext*/ )
432 : {
433 0 : if( !xDiagram.is() )
434 0 : return;
435 :
436 0 : Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
437 0 : if(!xCooSys.is())
438 0 : return;
439 :
440 0 : Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, MAIN_AXIS_INDEX, xCooSys ) );
441 0 : if(!xAxis.is())
442 : {
443 : //hhhh todo create axis without axis visibility
444 : }
445 0 : if(!xAxis.is())
446 0 : return;
447 :
448 0 : if( bMainGrid )
449 0 : AxisHelper::makeGridVisible( xAxis->getGridProperties() );
450 : else
451 : {
452 0 : Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );
453 0 : for( sal_Int32 nN=0; nN<aSubGrids.getLength(); nN++)
454 0 : AxisHelper::makeGridVisible( aSubGrids[nN] );
455 0 : }
456 : }
457 :
458 0 : void AxisHelper::makeAxisVisible( const Reference< XAxis >& xAxis )
459 : {
460 0 : Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY );
461 0 : if( xProps.is() )
462 : {
463 0 : xProps->setPropertyValue( "Show", uno::makeAny( sal_True ) );
464 0 : LinePropertiesHelper::SetLineVisible( xProps );
465 0 : xProps->setPropertyValue( "DisplayLabels", uno::makeAny( sal_True ) );
466 0 : }
467 0 : }
468 :
469 0 : void AxisHelper::makeGridVisible( const Reference< beans::XPropertySet >& xGridProperties )
470 : {
471 0 : if( xGridProperties.is() )
472 : {
473 0 : xGridProperties->setPropertyValue( "Show", uno::makeAny( sal_True ) );
474 0 : LinePropertiesHelper::SetLineVisible( xGridProperties );
475 : }
476 0 : }
477 :
478 0 : void AxisHelper::hideAxis( sal_Int32 nDimensionIndex, bool bMainAxis
479 : , const Reference< XDiagram >& xDiagram )
480 : {
481 0 : AxisHelper::makeAxisInvisible( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) );
482 0 : }
483 :
484 0 : void AxisHelper::makeAxisInvisible( const Reference< XAxis >& xAxis )
485 : {
486 0 : Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY );
487 0 : if( xProps.is() )
488 : {
489 0 : xProps->setPropertyValue( "Show", uno::makeAny( sal_False ) );
490 0 : }
491 0 : }
492 :
493 0 : void AxisHelper::hideAxisIfNoDataIsAttached( const Reference< XAxis >& xAxis, const Reference< XDiagram >& xDiagram )
494 : {
495 : //axis is hidden if no data is attached anymore but data is available
496 0 : bool bOtherSeriesAttachedToThisAxis = false;
497 0 : ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector( DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
498 0 : ::std::vector< Reference< chart2::XDataSeries > >::const_iterator aIt = aSeriesVector.begin();
499 0 : for( ; aIt != aSeriesVector.end(); ++aIt)
500 : {
501 0 : uno::Reference< chart2::XAxis > xCurrentAxis( DiagramHelper::getAttachedAxis( *aIt, xDiagram ), uno::UNO_QUERY );
502 0 : if( xCurrentAxis==xAxis )
503 : {
504 0 : bOtherSeriesAttachedToThisAxis = true;
505 0 : break;
506 : }
507 0 : }
508 0 : if(!bOtherSeriesAttachedToThisAxis && !aSeriesVector.empty() )
509 0 : AxisHelper::makeAxisInvisible( xAxis );
510 0 : }
511 :
512 0 : void AxisHelper::hideGrid( sal_Int32 nDimensionIndex, sal_Int32 nCooSysIndex, bool bMainGrid
513 : , const Reference< XDiagram >& xDiagram )
514 : {
515 0 : if( !xDiagram.is() )
516 0 : return;
517 :
518 0 : Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
519 0 : if(!xCooSys.is())
520 0 : return;
521 :
522 0 : Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, MAIN_AXIS_INDEX, xCooSys ) );
523 0 : if(!xAxis.is())
524 0 : return;
525 :
526 0 : if( bMainGrid )
527 0 : AxisHelper::makeGridInvisible( xAxis->getGridProperties() );
528 : else
529 : {
530 0 : Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );
531 0 : for( sal_Int32 nN=0; nN<aSubGrids.getLength(); nN++)
532 0 : AxisHelper::makeGridInvisible( aSubGrids[nN] );
533 0 : }
534 : }
535 :
536 0 : void AxisHelper::makeGridInvisible( const Reference< beans::XPropertySet >& xGridProperties )
537 : {
538 0 : if( xGridProperties.is() )
539 : {
540 0 : xGridProperties->setPropertyValue( "Show", uno::makeAny( sal_False ) );
541 : }
542 0 : }
543 :
544 0 : sal_Bool AxisHelper::isGridShown( sal_Int32 nDimensionIndex, sal_Int32 nCooSysIndex, bool bMainGrid
545 : , const Reference< ::com::sun::star::chart2::XDiagram >& xDiagram )
546 : {
547 0 : sal_Bool bRet = false;
548 :
549 0 : Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex );
550 0 : if(!xCooSys.is())
551 0 : return bRet;
552 :
553 0 : Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, MAIN_AXIS_INDEX, xCooSys ) );
554 0 : if(!xAxis.is())
555 0 : return bRet;
556 :
557 0 : if( bMainGrid )
558 0 : bRet = AxisHelper::isGridVisible( xAxis->getGridProperties() );
559 : else
560 : {
561 0 : Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );
562 0 : if( aSubGrids.getLength() )
563 0 : bRet = AxisHelper::isGridVisible( aSubGrids[0] );
564 : }
565 :
566 0 : return bRet;
567 : }
568 :
569 0 : Reference< XCoordinateSystem > AxisHelper::getCoordinateSystemByIndex(
570 : const Reference< XDiagram >& xDiagram, sal_Int32 nIndex )
571 : {
572 0 : Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
573 0 : if(!xCooSysContainer.is())
574 0 : return NULL;
575 0 : Sequence< Reference< XCoordinateSystem > > aCooSysList = xCooSysContainer->getCoordinateSystems();
576 0 : if(0<=nIndex && nIndex<aCooSysList.getLength())
577 0 : return aCooSysList[nIndex];
578 0 : return NULL;
579 : }
580 :
581 0 : Reference< XAxis > AxisHelper::getAxis( sal_Int32 nDimensionIndex, bool bMainAxis
582 : , const Reference< XDiagram >& xDiagram )
583 : {
584 0 : Reference< XAxis > xRet;
585 : try
586 : {
587 0 : Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 );
588 0 : xRet.set( AxisHelper::getAxis( nDimensionIndex, bMainAxis ? 0 : 1, xCooSys ) );
589 : }
590 0 : catch( const uno::Exception & )
591 : {
592 : }
593 0 : return xRet;
594 : }
595 :
596 0 : Reference< XAxis > AxisHelper::getAxis( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex
597 : , const Reference< XCoordinateSystem >& xCooSys )
598 : {
599 0 : Reference< XAxis > xRet;
600 0 : if(!xCooSys.is())
601 0 : return xRet;
602 :
603 0 : if(nDimensionIndex >= xCooSys->getDimension())
604 0 : return xRet;
605 :
606 0 : if(nAxisIndex > xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex))
607 0 : return xRet;
608 :
609 : assert(nAxisIndex >= 0);
610 : assert(nDimensionIndex >= 0);
611 0 : xRet.set( xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex ) );
612 0 : return xRet;
613 : }
614 :
615 0 : Reference< XAxis > AxisHelper::getCrossingMainAxis( const Reference< XAxis >& xAxis
616 : , const Reference< XCoordinateSystem >& xCooSys )
617 : {
618 0 : sal_Int32 nDimensionIndex = 0;
619 0 : sal_Int32 nAxisIndex = 0;
620 0 : AxisHelper::getIndicesForAxis( xAxis, xCooSys, nDimensionIndex, nAxisIndex );
621 0 : if( 2==nDimensionIndex )
622 : {
623 0 : nDimensionIndex=1;
624 0 : bool bSwapXY = false;
625 0 : Reference< beans::XPropertySet > xCooSysProp( xCooSys, uno::UNO_QUERY );
626 0 : if( xCooSysProp.is() && (xCooSysProp->getPropertyValue( "SwapXAndYAxis" ) >>= bSwapXY) && bSwapXY )
627 0 : nDimensionIndex=0;
628 : }
629 0 : else if( 1==nDimensionIndex )
630 0 : nDimensionIndex=0;
631 : else
632 0 : nDimensionIndex=1;
633 0 : return AxisHelper::getAxis( nDimensionIndex, 0, xCooSys );
634 : }
635 :
636 0 : Reference< XAxis > AxisHelper::getParallelAxis( const Reference< XAxis >& xAxis
637 : , const Reference< XDiagram >& xDiagram )
638 : {
639 : try
640 : {
641 0 : sal_Int32 nCooSysIndex=-1;
642 0 : sal_Int32 nDimensionIndex=-1;
643 0 : sal_Int32 nAxisIndex=-1;
644 0 : if( getIndicesForAxis( xAxis, xDiagram, nCooSysIndex, nDimensionIndex, nAxisIndex ) )
645 : {
646 0 : sal_Int32 nParallelAxisIndex = (nAxisIndex==1) ?0 :1;
647 0 : return getAxis( nDimensionIndex, nParallelAxisIndex, getCoordinateSystemByIndex( xDiagram, nCooSysIndex ) );
648 : }
649 : }
650 0 : catch( const uno::RuntimeException& )
651 : {
652 : }
653 0 : return 0;
654 : }
655 :
656 0 : sal_Bool AxisHelper::isAxisShown( sal_Int32 nDimensionIndex, bool bMainAxis
657 : , const Reference< XDiagram >& xDiagram )
658 : {
659 0 : return AxisHelper::isAxisVisible( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) );
660 : }
661 :
662 0 : sal_Bool AxisHelper::isAxisVisible( const Reference< XAxis >& xAxis )
663 : {
664 0 : sal_Bool bRet = false;
665 :
666 0 : Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY );
667 0 : if( xProps.is() )
668 : {
669 0 : xProps->getPropertyValue( "Show" ) >>= bRet;
670 0 : bRet = bRet && ( LinePropertiesHelper::IsLineVisible( xProps )
671 0 : || areAxisLabelsVisible( xProps ) );
672 : }
673 :
674 0 : return bRet;
675 : }
676 :
677 0 : sal_Bool AxisHelper::areAxisLabelsVisible( const Reference< beans::XPropertySet >& xAxisProperties )
678 : {
679 0 : sal_Bool bRet = false;
680 0 : if( xAxisProperties.is() )
681 : {
682 0 : xAxisProperties->getPropertyValue( "DisplayLabels" ) >>= bRet;
683 : }
684 0 : return bRet;
685 : }
686 :
687 0 : sal_Bool AxisHelper::isGridVisible( const Reference< beans::XPropertySet >& xGridProperies )
688 : {
689 0 : sal_Bool bRet = false;
690 :
691 0 : if( xGridProperies.is() )
692 : {
693 0 : xGridProperies->getPropertyValue( "Show" ) >>= bRet;
694 0 : bRet = bRet && LinePropertiesHelper::IsLineVisible( xGridProperies );
695 : }
696 :
697 0 : return bRet;
698 : }
699 :
700 0 : Reference< beans::XPropertySet > AxisHelper::getGridProperties(
701 : const Reference< XCoordinateSystem >& xCooSys
702 : , sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex, sal_Int32 nSubGridIndex )
703 : {
704 0 : Reference< beans::XPropertySet > xRet;
705 :
706 0 : Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, nAxisIndex, xCooSys ) );
707 0 : if( xAxis.is() )
708 : {
709 0 : if( nSubGridIndex<0 )
710 0 : xRet.set( xAxis->getGridProperties() );
711 : else
712 : {
713 0 : Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );
714 0 : if( nSubGridIndex >= 0 && nSubGridIndex < aSubGrids.getLength() )
715 0 : xRet.set( aSubGrids[nSubGridIndex] );
716 : }
717 : }
718 :
719 0 : return xRet;
720 : }
721 :
722 0 : sal_Int32 AxisHelper::getDimensionIndexOfAxis(
723 : const Reference< XAxis >& xAxis
724 : , const Reference< XDiagram >& xDiagram )
725 : {
726 0 : sal_Int32 nDimensionIndex = -1;
727 0 : sal_Int32 nCooSysIndex = -1;
728 0 : sal_Int32 nAxisIndex = -1;
729 0 : AxisHelper::getIndicesForAxis( xAxis, xDiagram, nCooSysIndex , nDimensionIndex, nAxisIndex );
730 0 : return nDimensionIndex;
731 : }
732 :
733 0 : bool AxisHelper::getIndicesForAxis(
734 : const Reference< XAxis >& xAxis
735 : , const Reference< XCoordinateSystem >& xCooSys
736 : , sal_Int32& rOutDimensionIndex, sal_Int32& rOutAxisIndex )
737 : {
738 : //returns true if indices are found
739 :
740 0 : rOutDimensionIndex = -1;
741 0 : rOutAxisIndex = -1;
742 :
743 0 : if( xCooSys.is() && xAxis.is() )
744 : {
745 0 : Reference< XAxis > xCurrentAxis;
746 0 : sal_Int32 nDimensionCount( xCooSys->getDimension() );
747 0 : for( sal_Int32 nDimensionIndex = 0; nDimensionIndex < nDimensionCount; nDimensionIndex++ )
748 : {
749 0 : sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex);
750 0 : for( sal_Int32 nAxisIndex = 0; nAxisIndex <= nMaxAxisIndex; nAxisIndex++ )
751 : {
752 0 : xCurrentAxis = xCooSys->getAxisByDimension(nDimensionIndex,nAxisIndex);
753 0 : if( xCurrentAxis == xAxis )
754 : {
755 0 : rOutDimensionIndex = nDimensionIndex;
756 0 : rOutAxisIndex = nAxisIndex;
757 0 : return true;
758 : }
759 : }
760 0 : }
761 : }
762 0 : return false;
763 : }
764 :
765 0 : bool AxisHelper::getIndicesForAxis( const Reference< XAxis >& xAxis, const Reference< XDiagram >& xDiagram
766 : , sal_Int32& rOutCooSysIndex, sal_Int32& rOutDimensionIndex, sal_Int32& rOutAxisIndex )
767 : {
768 : //returns true if indices are found
769 :
770 0 : rOutCooSysIndex = -1;
771 0 : rOutDimensionIndex = -1;
772 0 : rOutAxisIndex = -1;
773 :
774 0 : Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
775 0 : if(xCooSysContainer.is())
776 : {
777 0 : Sequence< Reference< XCoordinateSystem > > aCooSysList = xCooSysContainer->getCoordinateSystems();
778 0 : for( sal_Int32 nC=0; nC<aCooSysList.getLength(); ++nC )
779 : {
780 0 : if( AxisHelper::getIndicesForAxis( xAxis, aCooSysList[nC], rOutDimensionIndex, rOutAxisIndex ) )
781 : {
782 0 : rOutCooSysIndex = nC;
783 0 : return true;
784 : }
785 0 : }
786 : }
787 :
788 0 : return false;
789 : }
790 :
791 0 : std::vector< Reference< XAxis > > AxisHelper::getAllAxesOfCoordinateSystem(
792 : const Reference< XCoordinateSystem >& xCooSys
793 : , bool bOnlyVisible /* = false */ )
794 : {
795 0 : std::vector< Reference< XAxis > > aAxisVector;
796 :
797 0 : if(xCooSys.is())
798 : {
799 0 : sal_Int32 nMaxDimensionIndex = xCooSys->getDimension() -1;
800 0 : if( nMaxDimensionIndex>=0 )
801 : {
802 0 : sal_Int32 nDimensionIndex = 0;
803 0 : for(; nDimensionIndex<=nMaxDimensionIndex; ++nDimensionIndex)
804 : {
805 0 : const sal_Int32 nMaximumAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex);
806 0 : for(sal_Int32 nAxisIndex=0; nAxisIndex<=nMaximumAxisIndex; ++nAxisIndex)
807 : {
808 : try
809 : {
810 0 : Reference< XAxis > xAxis( xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex ) );
811 0 : bool bAddAxis = true;
812 0 : if( xAxis.is() )
813 : {
814 0 : if( bOnlyVisible )
815 : {
816 0 : Reference< beans::XPropertySet > xAxisProp( xAxis, uno::UNO_QUERY );
817 0 : if( !xAxisProp.is() ||
818 0 : !(xAxisProp->getPropertyValue( "Show") >>= bAddAxis) )
819 0 : bAddAxis = false;
820 : }
821 0 : if( bAddAxis )
822 0 : aAxisVector.push_back( xAxis );
823 0 : }
824 : }
825 0 : catch( const uno::Exception & ex )
826 : {
827 : ASSERT_EXCEPTION( ex );
828 : }
829 : }
830 : }
831 : }
832 : }
833 :
834 0 : return aAxisVector;
835 : }
836 :
837 0 : Sequence< Reference< XAxis > > AxisHelper::getAllAxesOfDiagram(
838 : const Reference< XDiagram >& xDiagram
839 : , bool bOnlyVisible )
840 : {
841 0 : std::vector< Reference< XAxis > > aAxisVector;
842 :
843 0 : Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
844 0 : if(xCooSysContainer.is())
845 : {
846 0 : Sequence< Reference< XCoordinateSystem > > aCooSysList = xCooSysContainer->getCoordinateSystems();
847 0 : sal_Int32 nC = 0;
848 0 : for( nC=0; nC<aCooSysList.getLength(); ++nC )
849 : {
850 0 : std::vector< Reference< XAxis > > aAxesPerCooSys( AxisHelper::getAllAxesOfCoordinateSystem( aCooSysList[nC], bOnlyVisible ) );
851 0 : aAxisVector.insert( aAxisVector.end(), aAxesPerCooSys.begin(), aAxesPerCooSys.end() );
852 0 : }
853 : }
854 :
855 0 : return ContainerHelper::ContainerToSequence( aAxisVector );
856 : }
857 :
858 0 : Sequence< Reference< beans::XPropertySet > > AxisHelper::getAllGrids( const Reference< XDiagram >& xDiagram )
859 : {
860 0 : Sequence< Reference< XAxis > > aAllAxes( AxisHelper::getAllAxesOfDiagram( xDiagram ) );
861 0 : std::vector< Reference< beans::XPropertySet > > aGridVector;
862 :
863 0 : sal_Int32 nA = 0;
864 0 : for( nA=0; nA<aAllAxes.getLength(); ++nA )
865 : {
866 0 : Reference< XAxis > xAxis( aAllAxes[nA] );
867 0 : if(!xAxis.is())
868 0 : continue;
869 0 : Reference< beans::XPropertySet > xGridProperties( xAxis->getGridProperties() );
870 0 : if( xGridProperties.is() )
871 0 : aGridVector.push_back( xGridProperties );
872 :
873 0 : Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );;
874 0 : sal_Int32 nSubGrid = 0;
875 0 : for( nSubGrid = 0; nSubGrid < aSubGrids.getLength(); ++nSubGrid )
876 : {
877 0 : Reference< beans::XPropertySet > xSubGrid( aSubGrids[nSubGrid] );
878 0 : if( xSubGrid.is() )
879 0 : aGridVector.push_back( xSubGrid );
880 0 : }
881 0 : }
882 :
883 0 : return ContainerHelper::ContainerToSequence( aGridVector );
884 : }
885 :
886 0 : void AxisHelper::getAxisOrGridPossibilities( Sequence< sal_Bool >& rPossibilityList
887 : , const Reference< XDiagram>& xDiagram, sal_Bool bAxis )
888 : {
889 0 : rPossibilityList.realloc(6);
890 :
891 0 : sal_Int32 nDimensionCount = DiagramHelper::getDimension( xDiagram );
892 :
893 : //set possibilities:
894 0 : sal_Int32 nIndex=0;
895 0 : Reference< XChartType > xChartType = DiagramHelper::getChartTypeByIndex( xDiagram, 0 );
896 0 : for(nIndex=0;nIndex<3;nIndex++)
897 0 : rPossibilityList[nIndex]=ChartTypeHelper::isSupportingMainAxis(xChartType,nDimensionCount,nIndex);
898 0 : for(nIndex=3;nIndex<6;nIndex++)
899 0 : if( bAxis )
900 0 : rPossibilityList[nIndex]=ChartTypeHelper::isSupportingSecondaryAxis(xChartType,nDimensionCount,nIndex-3);
901 : else
902 0 : rPossibilityList[nIndex] = rPossibilityList[nIndex-3];
903 0 : }
904 :
905 0 : bool AxisHelper::isSecondaryYAxisNeeded( const Reference< XCoordinateSystem >& xCooSys )
906 : {
907 0 : Reference< chart2::XChartTypeContainer > xCTCnt( xCooSys, uno::UNO_QUERY );
908 0 : if( xCTCnt.is() )
909 : {
910 0 : Sequence< Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes() );
911 0 : for( sal_Int32 i=0; i<aChartTypes.getLength(); ++i )
912 : {
913 0 : Reference< XDataSeriesContainer > xSeriesContainer( aChartTypes[i] , uno::UNO_QUERY );
914 0 : if( !xSeriesContainer.is() )
915 0 : continue;
916 :
917 0 : Sequence< Reference< XDataSeries > > aSeriesList( xSeriesContainer->getDataSeries() );
918 0 : for( sal_Int32 nS = aSeriesList.getLength(); nS-- ; )
919 : {
920 0 : Reference< beans::XPropertySet > xProp( aSeriesList[nS], uno::UNO_QUERY );
921 0 : if(xProp.is())
922 : {
923 0 : sal_Int32 nAttachedAxisIndex = 0;
924 0 : if( ( xProp->getPropertyValue( "AttachedAxisIndex" ) >>= nAttachedAxisIndex ) && nAttachedAxisIndex>0 )
925 0 : return true;
926 : }
927 0 : }
928 0 : }
929 : }
930 0 : return false;
931 : }
932 :
933 0 : bool AxisHelper::shouldAxisBeDisplayed( const Reference< XAxis >& xAxis
934 : , const Reference< XCoordinateSystem >& xCooSys )
935 : {
936 0 : bool bRet = false;
937 :
938 0 : if( xAxis.is() && xCooSys.is() )
939 : {
940 0 : sal_Int32 nDimensionIndex=-1;
941 0 : sal_Int32 nAxisIndex=-1;
942 0 : if( AxisHelper::getIndicesForAxis( xAxis, xCooSys, nDimensionIndex, nAxisIndex ) )
943 : {
944 0 : sal_Int32 nDimensionCount = xCooSys->getDimension();
945 0 : Reference< XChartType > xChartType( AxisHelper::getChartTypeByIndex( xCooSys, 0 ) );
946 :
947 0 : bool bMainAxis = (nAxisIndex==MAIN_AXIS_INDEX);
948 0 : if( bMainAxis )
949 0 : bRet = ChartTypeHelper::isSupportingMainAxis(xChartType,nDimensionCount,nDimensionIndex);
950 : else
951 0 : bRet = ChartTypeHelper::isSupportingSecondaryAxis(xChartType,nDimensionCount,nDimensionIndex);
952 : }
953 : }
954 :
955 0 : return bRet;
956 : }
957 :
958 0 : void AxisHelper::getAxisOrGridExcistence( Sequence< sal_Bool >& rExistenceList
959 : , const Reference< XDiagram>& xDiagram, sal_Bool bAxis )
960 : {
961 0 : rExistenceList.realloc(6);
962 :
963 0 : if(bAxis)
964 : {
965 : sal_Int32 nN;
966 0 : Reference< XAxis > xAxis;
967 0 : for(nN=0;nN<3;nN++)
968 0 : rExistenceList[nN] = AxisHelper::isAxisShown( nN, true, xDiagram );
969 0 : for(nN=3;nN<6;nN++)
970 0 : rExistenceList[nN] = AxisHelper::isAxisShown( nN%3, false, xDiagram );
971 : }
972 : else
973 : {
974 : sal_Int32 nN;
975 :
976 0 : for(nN=0;nN<3;nN++)
977 0 : rExistenceList[nN] = AxisHelper::isGridShown( nN, 0, true, xDiagram );
978 0 : for(nN=3;nN<6;nN++)
979 0 : rExistenceList[nN] = AxisHelper::isGridShown( nN%3, 0, false, xDiagram );
980 : }
981 0 : }
982 :
983 0 : bool AxisHelper::changeVisibilityOfAxes( const Reference< XDiagram >& xDiagram
984 : , const Sequence< sal_Bool >& rOldExistenceList
985 : , const Sequence< sal_Bool >& rNewExistenceList
986 : , const Reference< uno::XComponentContext >& xContext
987 : , ReferenceSizeProvider * pRefSizeProvider )
988 : {
989 0 : bool bChanged = false;
990 0 : for(sal_Int32 nN=0;nN<6;nN++)
991 : {
992 0 : if(rOldExistenceList[nN]!=rNewExistenceList[nN])
993 : {
994 0 : bChanged = true;
995 0 : if(rNewExistenceList[nN])
996 : {
997 0 : AxisHelper::showAxis( nN%3, nN<3, xDiagram, xContext, pRefSizeProvider );
998 : }
999 : else
1000 0 : AxisHelper::hideAxis( nN%3, nN<3, xDiagram );
1001 : }
1002 : }
1003 0 : return bChanged;
1004 : }
1005 :
1006 0 : bool AxisHelper::changeVisibilityOfGrids( const Reference< XDiagram >& xDiagram
1007 : , const Sequence< sal_Bool >& rOldExistenceList
1008 : , const Sequence< sal_Bool >& rNewExistenceList
1009 : , const Reference< uno::XComponentContext >& xContext )
1010 : {
1011 0 : bool bChanged = false;
1012 0 : for(sal_Int32 nN=0;nN<6;nN++)
1013 : {
1014 0 : if(rOldExistenceList[nN]!=rNewExistenceList[nN])
1015 : {
1016 0 : bChanged = true;
1017 0 : if(rNewExistenceList[nN])
1018 0 : AxisHelper::showGrid( nN%3, 0, nN<3, xDiagram, xContext );
1019 : else
1020 0 : AxisHelper::hideGrid( nN%3, 0, nN<3, xDiagram );
1021 : }
1022 : }
1023 0 : return bChanged;
1024 : }
1025 :
1026 0 : Reference< XCoordinateSystem > AxisHelper::getCoordinateSystemOfAxis(
1027 : const Reference< XAxis >& xAxis
1028 : , const Reference< XDiagram >& xDiagram )
1029 : {
1030 0 : Reference< XCoordinateSystem > xRet;
1031 :
1032 0 : Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
1033 0 : if( xCooSysContainer.is() )
1034 : {
1035 0 : Reference< XCoordinateSystem > xCooSys;
1036 0 : Sequence< Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() );
1037 0 : for( sal_Int32 nCooSysIndex = 0; nCooSysIndex < aCooSysList.getLength(); ++nCooSysIndex )
1038 : {
1039 0 : xCooSys = aCooSysList[nCooSysIndex];
1040 0 : std::vector< Reference< XAxis > > aAllAxis( AxisHelper::getAllAxesOfCoordinateSystem( xCooSys ) );
1041 :
1042 : ::std::vector< Reference< XAxis > >::iterator aFound =
1043 0 : ::std::find( aAllAxis.begin(), aAllAxis.end(), xAxis );
1044 0 : if( aFound != aAllAxis.end())
1045 : {
1046 0 : xRet.set( xCooSys );
1047 0 : break;
1048 : }
1049 0 : }
1050 : }
1051 0 : return xRet;
1052 : }
1053 :
1054 0 : Reference< XChartType > AxisHelper::getChartTypeByIndex( const Reference< XCoordinateSystem >& xCooSys, sal_Int32 nIndex )
1055 : {
1056 0 : Reference< XChartType > xChartType;
1057 :
1058 0 : Reference< XChartTypeContainer > xChartTypeContainer( xCooSys, uno::UNO_QUERY );
1059 0 : if( xChartTypeContainer.is() )
1060 : {
1061 0 : Sequence< Reference< XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() );
1062 0 : if( nIndex >= 0 && nIndex < aChartTypeList.getLength() )
1063 0 : xChartType.set( aChartTypeList[nIndex] );
1064 : }
1065 :
1066 0 : return xChartType;
1067 : }
1068 :
1069 0 : void AxisHelper::setRTLAxisLayout( const Reference< XCoordinateSystem >& xCooSys )
1070 : {
1071 0 : if( xCooSys.is() )
1072 : {
1073 0 : bool bCartesian = xCooSys->getViewServiceName().equals( CHART2_COOSYSTEM_CARTESIAN_VIEW_SERVICE_NAME );
1074 0 : if( bCartesian )
1075 : {
1076 0 : bool bVertical = false;
1077 0 : Reference< beans::XPropertySet > xCooSysProp( xCooSys, uno::UNO_QUERY );
1078 0 : if( xCooSysProp.is() )
1079 0 : xCooSysProp->getPropertyValue( "SwapXAndYAxis" ) >>= bVertical;
1080 :
1081 0 : sal_Int32 nHorizontalAxisDimension = bVertical ? 1 : 0;
1082 0 : sal_Int32 nVerticalAxisDimension = bVertical ? 0 : 1;
1083 :
1084 : try
1085 : {
1086 : //reverse direction for horizontal main axis
1087 0 : Reference< chart2::XAxis > xHorizontalMainAxis( AxisHelper::getAxis( nHorizontalAxisDimension, MAIN_AXIS_INDEX, xCooSys ) );
1088 0 : if( xHorizontalMainAxis.is() )
1089 : {
1090 0 : chart2::ScaleData aScale = xHorizontalMainAxis->getScaleData();
1091 0 : aScale.Orientation = chart2::AxisOrientation_REVERSE;
1092 0 : xHorizontalMainAxis->setScaleData(aScale);
1093 : }
1094 :
1095 : //mathematical direction for vertical main axis
1096 0 : Reference< chart2::XAxis > xVerticalMainAxis( AxisHelper::getAxis( nVerticalAxisDimension, MAIN_AXIS_INDEX, xCooSys ) );
1097 0 : if( xVerticalMainAxis.is() )
1098 : {
1099 0 : chart2::ScaleData aScale = xVerticalMainAxis->getScaleData();
1100 0 : aScale.Orientation = chart2::AxisOrientation_MATHEMATICAL;
1101 0 : xVerticalMainAxis->setScaleData(aScale);
1102 0 : }
1103 : }
1104 0 : catch( const uno::Exception & ex )
1105 : {
1106 : ASSERT_EXCEPTION( ex );
1107 : }
1108 :
1109 : try
1110 : {
1111 : //reverse direction for horizontal secondary axis
1112 0 : Reference< chart2::XAxis > xHorizontalSecondaryAxis( AxisHelper::getAxis( nHorizontalAxisDimension, SECONDARY_AXIS_INDEX, xCooSys ) );
1113 0 : if( xHorizontalSecondaryAxis.is() )
1114 : {
1115 0 : chart2::ScaleData aScale = xHorizontalSecondaryAxis->getScaleData();
1116 0 : aScale.Orientation = chart2::AxisOrientation_REVERSE;
1117 0 : xHorizontalSecondaryAxis->setScaleData(aScale);
1118 : }
1119 :
1120 : //mathematical direction for vertical secondary axis
1121 0 : Reference< chart2::XAxis > xVerticalSecondaryAxis( AxisHelper::getAxis( nVerticalAxisDimension, SECONDARY_AXIS_INDEX, xCooSys ) );
1122 0 : if( xVerticalSecondaryAxis.is() )
1123 : {
1124 0 : chart2::ScaleData aScale = xVerticalSecondaryAxis->getScaleData();
1125 0 : aScale.Orientation = chart2::AxisOrientation_MATHEMATICAL;
1126 0 : xVerticalSecondaryAxis->setScaleData(aScale);
1127 0 : }
1128 : }
1129 0 : catch( const uno::Exception & ex )
1130 : {
1131 : ASSERT_EXCEPTION( ex );
1132 0 : }
1133 : }
1134 : }
1135 0 : }
1136 :
1137 0 : Reference< XChartType > AxisHelper::getFirstChartTypeWithSeriesAttachedToAxisIndex( const Reference< chart2::XDiagram >& xDiagram, const sal_Int32 nAttachedAxisIndex )
1138 : {
1139 0 : Reference< XChartType > xChartType;
1140 0 : ::std::vector< Reference< XDataSeries > > aSeriesVector( DiagramHelper::getDataSeriesFromDiagram( xDiagram ) );
1141 0 : ::std::vector< Reference< XDataSeries > >::const_iterator aIter = aSeriesVector.begin();
1142 0 : for( ; aIter != aSeriesVector.end(); ++aIter )
1143 : {
1144 0 : sal_Int32 nCurrentIndex = DataSeriesHelper::getAttachedAxisIndex( *aIter );
1145 0 : if( nAttachedAxisIndex == nCurrentIndex )
1146 : {
1147 0 : xChartType = DiagramHelper::getChartTypeOfSeries( xDiagram, *aIter );
1148 0 : if(xChartType.is())
1149 0 : break;
1150 : }
1151 : }
1152 0 : return xChartType;
1153 : }
1154 :
1155 0 : bool AxisHelper::isAxisPositioningEnabled()
1156 : {
1157 0 : const SvtSaveOptions::ODFDefaultVersion nCurrentVersion( SvtSaveOptions().GetODFDefaultVersion() );
1158 0 : return nCurrentVersion >= SvtSaveOptions::ODFVER_012;
1159 : }
1160 :
1161 : } //namespace chart
1162 :
1163 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|