LCOV - code coverage report
Current view: top level - chart2/source/tools - AxisHelper.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 604 0.0 %
Date: 2014-04-14 Functions: 0 47 0.0 %
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             : 
      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: */

Generated by: LCOV version 1.10