LCOV - code coverage report
Current view: top level - chart2/source/tools - AxisHelper.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 434 613 70.8 %
Date: 2014-11-03 Functions: 39 49 79.6 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10