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