1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_chart2.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "DataInterpreter.hxx" 32*cdf0e10cSrcweir #include "DataSeries.hxx" 33*cdf0e10cSrcweir #include "DataSourceHelper.hxx" 34*cdf0e10cSrcweir #include "DataSeriesHelper.hxx" 35*cdf0e10cSrcweir #include "macros.hxx" 36*cdf0e10cSrcweir #include "CommonConverters.hxx" 37*cdf0e10cSrcweir #include "ContainerHelper.hxx" 38*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/chart2/data/XDataSink.hpp> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include <vector> 42*cdf0e10cSrcweir #include <algorithm> 43*cdf0e10cSrcweir #include <iterator> 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir using namespace ::com::sun::star; 46*cdf0e10cSrcweir using namespace ::com::sun::star::chart2; 47*cdf0e10cSrcweir using namespace ::std; 48*cdf0e10cSrcweir using namespace ::chart::ContainerHelper; 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 51*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 52*cdf0e10cSrcweir using ::rtl::OUString; 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 55*cdf0e10cSrcweir namespace 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir void lcl_ShowDataSource( const Reference< data::XDataSource > & xSource ); 58*cdf0e10cSrcweir } 59*cdf0e10cSrcweir #endif 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir namespace chart 62*cdf0e10cSrcweir { 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir DataInterpreter::DataInterpreter( 65*cdf0e10cSrcweir const Reference< uno::XComponentContext > & xContext ) : 66*cdf0e10cSrcweir m_xContext( xContext ) 67*cdf0e10cSrcweir {} 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir DataInterpreter::~DataInterpreter() 70*cdf0e10cSrcweir {} 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir Reference< uno::XComponentContext > DataInterpreter::GetComponentContext() const 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir return m_xContext; 75*cdf0e10cSrcweir } 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir // ____ XDataInterpreter ____ 78*cdf0e10cSrcweir InterpretedData SAL_CALL DataInterpreter::interpretDataSource( 79*cdf0e10cSrcweir const Reference< data::XDataSource >& xSource, 80*cdf0e10cSrcweir const Sequence< beans::PropertyValue >& aArguments, 81*cdf0e10cSrcweir const Sequence< Reference< XDataSeries > >& aSeriesToReUse ) 82*cdf0e10cSrcweir throw (uno::RuntimeException) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir if( ! xSource.is()) 85*cdf0e10cSrcweir return InterpretedData(); 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 2 88*cdf0e10cSrcweir lcl_ShowDataSource( xSource ); 89*cdf0e10cSrcweir #endif 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aData( xSource->getDataSequences() ); 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir Reference< data::XLabeledDataSequence > xCategories; 94*cdf0e10cSrcweir vector< Reference< data::XLabeledDataSequence > > aSequencesVec; 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir // check if we should use categories 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir bool bHasCategories( HasCategories( aArguments, aData )); 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir // parse data 101*cdf0e10cSrcweir bool bCategoriesUsed = false; 102*cdf0e10cSrcweir for( sal_Int32 i=0; i < aData.getLength(); ++i ) 103*cdf0e10cSrcweir { 104*cdf0e10cSrcweir try 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir if( bHasCategories && ! bCategoriesUsed ) 107*cdf0e10cSrcweir { 108*cdf0e10cSrcweir xCategories.set( aData[i] ); 109*cdf0e10cSrcweir if( xCategories.is()) 110*cdf0e10cSrcweir SetRole( xCategories->getValues(), C2U("categories")); 111*cdf0e10cSrcweir bCategoriesUsed = true; 112*cdf0e10cSrcweir } 113*cdf0e10cSrcweir else 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir aSequencesVec.push_back( aData[i] ); 116*cdf0e10cSrcweir if( aData[i].is()) 117*cdf0e10cSrcweir SetRole( aData[i]->getValues(), C2U("values-y")); 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir catch( uno::Exception & ex ) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir } 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir // create DataSeries 127*cdf0e10cSrcweir vector< Reference< data::XLabeledDataSequence > >::const_iterator 128*cdf0e10cSrcweir aSequencesVecIt = aSequencesVec.begin(); 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir sal_Int32 nSeriesIndex = 0; 131*cdf0e10cSrcweir vector< Reference< XDataSeries > > aSeriesVec; 132*cdf0e10cSrcweir aSeriesVec.reserve( aSequencesVec.size()); 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir for( ;aSequencesVecIt != aSequencesVec.end(); ++aSequencesVecIt, ++nSeriesIndex ) 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aNewData( & (*aSequencesVecIt), 1 ); 137*cdf0e10cSrcweir Reference< XDataSeries > xSeries; 138*cdf0e10cSrcweir if( nSeriesIndex < aSeriesToReUse.getLength()) 139*cdf0e10cSrcweir xSeries.set( aSeriesToReUse[nSeriesIndex] ); 140*cdf0e10cSrcweir else 141*cdf0e10cSrcweir xSeries.set( new DataSeries( GetComponentContext() )); 142*cdf0e10cSrcweir OSL_ASSERT( xSeries.is() ); 143*cdf0e10cSrcweir Reference< data::XDataSink > xSink( xSeries, uno::UNO_QUERY ); 144*cdf0e10cSrcweir OSL_ASSERT( xSink.is() ); 145*cdf0e10cSrcweir xSink->setData( aNewData ); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir aSeriesVec.push_back( xSeries ); 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir Sequence< Sequence< Reference< XDataSeries > > > aSeries(1); 151*cdf0e10cSrcweir aSeries[0] = ContainerToSequence( aSeriesVec ); 152*cdf0e10cSrcweir return InterpretedData( aSeries, xCategories ); 153*cdf0e10cSrcweir } 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir InterpretedData SAL_CALL DataInterpreter::reinterpretDataSeries( 156*cdf0e10cSrcweir const InterpretedData& aInterpretedData ) 157*cdf0e10cSrcweir throw (uno::RuntimeException) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir InterpretedData aResult( aInterpretedData ); 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir sal_Int32 i=0; 162*cdf0e10cSrcweir Sequence< Reference< XDataSeries > > aSeries( FlattenSequence( aInterpretedData.Series )); 163*cdf0e10cSrcweir const sal_Int32 nCount = aSeries.getLength(); 164*cdf0e10cSrcweir for( ; i<nCount; ++i ) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir try 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir Reference< data::XDataSource > xSeriesSource( aSeries[i], uno::UNO_QUERY_THROW ); 169*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aNewSequences; 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir // values-y 172*cdf0e10cSrcweir Reference< data::XLabeledDataSequence > xValuesY( 173*cdf0e10cSrcweir DataSeriesHelper::getDataSequenceByRole( xSeriesSource, C2U("values-y"), false )); 174*cdf0e10cSrcweir // re-use values-... as values-y 175*cdf0e10cSrcweir if( ! xValuesY.is()) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir xValuesY.set( 178*cdf0e10cSrcweir DataSeriesHelper::getDataSequenceByRole( xSeriesSource, C2U("values"), true )); 179*cdf0e10cSrcweir if( xValuesY.is()) 180*cdf0e10cSrcweir SetRole( xValuesY->getValues(), C2U("values-y")); 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir if( xValuesY.is()) 183*cdf0e10cSrcweir { 184*cdf0e10cSrcweir aNewSequences.realloc(1); 185*cdf0e10cSrcweir aNewSequences[0] = xValuesY; 186*cdf0e10cSrcweir } 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aSeqs( xSeriesSource->getDataSequences()); 189*cdf0e10cSrcweir if( aSeqs.getLength() != aNewSequences.getLength() ) 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 192*cdf0e10cSrcweir sal_Int32 j=0; 193*cdf0e10cSrcweir for( ; j<aSeqs.getLength(); ++j ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir OSL_ENSURE( aSeqs[j] == xValuesY, "All sequences should be used" ); 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir #endif 198*cdf0e10cSrcweir Reference< data::XDataSink > xSink( xSeriesSource, uno::UNO_QUERY_THROW ); 199*cdf0e10cSrcweir xSink->setData( aNewSequences ); 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir } 202*cdf0e10cSrcweir catch( uno::Exception & ex ) 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir return aResult; 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir // criterion: all series must have exactly one data::XLabeledDataSequence 212*cdf0e10cSrcweir sal_Bool SAL_CALL DataInterpreter::isDataCompatible( 213*cdf0e10cSrcweir const chart2::InterpretedData& aInterpretedData ) 214*cdf0e10cSrcweir throw (uno::RuntimeException) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir Sequence< Reference< XDataSeries > > aSeries( FlattenSequence( aInterpretedData.Series )); 217*cdf0e10cSrcweir for( sal_Int32 i=0; i<aSeries.getLength(); ++i ) 218*cdf0e10cSrcweir { 219*cdf0e10cSrcweir try 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir Reference< data::XDataSource > xSrc( aSeries[i], uno::UNO_QUERY_THROW ); 222*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aSeq( xSrc->getDataSequences()); 223*cdf0e10cSrcweir if( aSeq.getLength() != 1 ) 224*cdf0e10cSrcweir return sal_False; 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir catch( uno::Exception & ex ) 227*cdf0e10cSrcweir { 228*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir } 231*cdf0e10cSrcweir 232*cdf0e10cSrcweir return sal_True; 233*cdf0e10cSrcweir } 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir namespace 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir struct lcl_LabeledSequenceEquals : public unary_function< Reference< data::XLabeledDataSequence >, bool > 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir lcl_LabeledSequenceEquals( const Reference< data::XLabeledDataSequence > & xLSeqToCmp ) : 241*cdf0e10cSrcweir m_bHasLabels ( false ), 242*cdf0e10cSrcweir m_bHasValues ( false ) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir if( xLSeqToCmp.is()) 245*cdf0e10cSrcweir { 246*cdf0e10cSrcweir Reference< data::XDataSequence > xSeq( xLSeqToCmp->getValues()); 247*cdf0e10cSrcweir if( xSeq.is()) 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir m_bHasValues = true; 250*cdf0e10cSrcweir m_aValuesRangeRep = xSeq->getSourceRangeRepresentation(); 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir xSeq.set( xLSeqToCmp->getLabel()); 254*cdf0e10cSrcweir if( xSeq.is()) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir m_bHasLabels = true; 257*cdf0e10cSrcweir m_aLabelRangeRep = xSeq->getSourceRangeRepresentation(); 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir bool operator() ( const Reference< data::XLabeledDataSequence > & xSeq ) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir if( ! xSeq.is()) 265*cdf0e10cSrcweir return false; 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir Reference< data::XDataSequence > xSeqValues( xSeq->getValues() ); 268*cdf0e10cSrcweir Reference< data::XDataSequence > xSeqLabels( xSeq->getLabel() ); 269*cdf0e10cSrcweir bool bHasValues = xSeqValues.is(); 270*cdf0e10cSrcweir bool bHasLabels = xSeqLabels.is(); 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir return ( ( (m_bHasValues == bHasValues) && 273*cdf0e10cSrcweir (!bHasValues || m_aValuesRangeRep.equals( xSeqValues->getSourceRangeRepresentation())) ) && 274*cdf0e10cSrcweir ( (m_bHasLabels == bHasLabels) && 275*cdf0e10cSrcweir (!bHasLabels || m_aLabelRangeRep.equals( xSeqLabels->getSourceRangeRepresentation())) ) 276*cdf0e10cSrcweir ); 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir private: 280*cdf0e10cSrcweir bool m_bHasLabels; 281*cdf0e10cSrcweir bool m_bHasValues; 282*cdf0e10cSrcweir OUString m_aValuesRangeRep; 283*cdf0e10cSrcweir OUString m_aLabelRangeRep; 284*cdf0e10cSrcweir }; 285*cdf0e10cSrcweir 286*cdf0e10cSrcweir } // anonymous namespace 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir Reference< data::XDataSource > SAL_CALL DataInterpreter::mergeInterpretedData( 289*cdf0e10cSrcweir const InterpretedData& aInterpretedData ) 290*cdf0e10cSrcweir throw (uno::RuntimeException) 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir vector< Reference< data::XLabeledDataSequence > > aResultVec; 293*cdf0e10cSrcweir aResultVec.reserve( aInterpretedData.Series.getLength() + 294*cdf0e10cSrcweir 1 // categories 295*cdf0e10cSrcweir ); 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir if( aInterpretedData.Categories.is()) 298*cdf0e10cSrcweir aResultVec.push_back( aInterpretedData.Categories ); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir Sequence< Reference< XDataSeries > > aSeries( FlattenSequence( aInterpretedData.Series )); 301*cdf0e10cSrcweir for( sal_Int32 nSeriesIdx=0; nSeriesIdx<aSeries.getLength(); ++nSeriesIdx ) 302*cdf0e10cSrcweir { 303*cdf0e10cSrcweir try 304*cdf0e10cSrcweir { 305*cdf0e10cSrcweir Reference< data::XDataSource > xSrc( aSeries[nSeriesIdx], uno::UNO_QUERY_THROW ); 306*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aSeq( xSrc->getDataSequences()); 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir // add all sequences of data series 309*cdf0e10cSrcweir for( sal_Int32 nSeqIdx=0; nSeqIdx<aSeq.getLength(); ++nSeqIdx ) 310*cdf0e10cSrcweir { 311*cdf0e10cSrcweir Reference< data::XLabeledDataSequence > xAdd( aSeq[nSeqIdx] ); 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir // only add if sequence is not yet in the result 314*cdf0e10cSrcweir if( find_if( aResultVec.begin(), aResultVec.end(), 315*cdf0e10cSrcweir lcl_LabeledSequenceEquals( xAdd )) == aResultVec.end()) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir aResultVec.push_back( xAdd ); 318*cdf0e10cSrcweir } 319*cdf0e10cSrcweir } 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir catch( uno::Exception & ex ) 322*cdf0e10cSrcweir { 323*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 324*cdf0e10cSrcweir } 325*cdf0e10cSrcweir } 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir return Reference< data::XDataSource >( DataSourceHelper::createDataSource( ContainerToSequence( aResultVec ) ) ); 328*cdf0e10cSrcweir } 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir // convenience methods 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir OUString DataInterpreter::GetRole( const Reference< data::XDataSequence > & xSeq ) 333*cdf0e10cSrcweir { 334*cdf0e10cSrcweir OUString aResult; 335*cdf0e10cSrcweir if( ! xSeq.is()) 336*cdf0e10cSrcweir return aResult; 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir try 339*cdf0e10cSrcweir { 340*cdf0e10cSrcweir Reference< beans::XPropertySet > xProp( xSeq, uno::UNO_QUERY_THROW ); 341*cdf0e10cSrcweir xProp->getPropertyValue( C2U("Role")) >>= aResult; 342*cdf0e10cSrcweir } 343*cdf0e10cSrcweir catch( uno::Exception & ex ) 344*cdf0e10cSrcweir { 345*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 346*cdf0e10cSrcweir } 347*cdf0e10cSrcweir return aResult; 348*cdf0e10cSrcweir } 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir void DataInterpreter::SetRole( const Reference< data::XDataSequence > & xSeq, const OUString & rRole ) 351*cdf0e10cSrcweir { 352*cdf0e10cSrcweir if( ! xSeq.is()) 353*cdf0e10cSrcweir return; 354*cdf0e10cSrcweir try 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir Reference< beans::XPropertySet > xProp( xSeq, uno::UNO_QUERY_THROW ); 357*cdf0e10cSrcweir xProp->setPropertyValue( C2U("Role"), uno::makeAny( rRole )); 358*cdf0e10cSrcweir } 359*cdf0e10cSrcweir catch( uno::Exception & ex ) 360*cdf0e10cSrcweir { 361*cdf0e10cSrcweir ASSERT_EXCEPTION( ex ); 362*cdf0e10cSrcweir } 363*cdf0e10cSrcweir } 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir uno::Any DataInterpreter::GetProperty( 366*cdf0e10cSrcweir const Sequence< beans::PropertyValue > & aArguments, 367*cdf0e10cSrcweir const OUString & rName ) 368*cdf0e10cSrcweir { 369*cdf0e10cSrcweir for( sal_Int32 i=aArguments.getLength(); i--; ) 370*cdf0e10cSrcweir { 371*cdf0e10cSrcweir if( aArguments[i].Name.equals( rName )) 372*cdf0e10cSrcweir return aArguments[i].Value; 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir return uno::Any(); 375*cdf0e10cSrcweir } 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir bool DataInterpreter::HasCategories( 378*cdf0e10cSrcweir const Sequence< beans::PropertyValue > & rArguments, 379*cdf0e10cSrcweir const Sequence< Reference< data::XLabeledDataSequence > > & rData ) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir bool bHasCategories = false; 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir if( rArguments.getLength() > 0 ) 384*cdf0e10cSrcweir GetProperty( rArguments, C2U(("HasCategories"))) >>= bHasCategories; 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir for( sal_Int32 nLSeqIdx=0; ! bHasCategories && nLSeqIdx<rData.getLength(); ++nLSeqIdx ) 387*cdf0e10cSrcweir bHasCategories = ( rData[nLSeqIdx].is() && 388*cdf0e10cSrcweir GetRole( rData[nLSeqIdx]->getValues()).equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("categories"))); 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir return bHasCategories; 391*cdf0e10cSrcweir } 392*cdf0e10cSrcweir 393*cdf0e10cSrcweir bool DataInterpreter::UseCategoriesAsX( const Sequence< beans::PropertyValue > & rArguments ) 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir bool bUseCategoriesAsX = true; 396*cdf0e10cSrcweir if( rArguments.getLength() > 0 ) 397*cdf0e10cSrcweir GetProperty( rArguments, C2U(("UseCategoriesAsX"))) >>= bUseCategoriesAsX; 398*cdf0e10cSrcweir return bUseCategoriesAsX; 399*cdf0e10cSrcweir } 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir // ------------------------------------------------------------ 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir Sequence< OUString > DataInterpreter::getSupportedServiceNames_Static() 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir Sequence< OUString > aServices( 1 ); 406*cdf0e10cSrcweir aServices[0] = C2U( "com.sun.star.chart2.DataInterpreter" ); 407*cdf0e10cSrcweir return aServices; 408*cdf0e10cSrcweir } 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir // implement XServiceInfo methods basing upon getSupportedServiceNames_Static 411*cdf0e10cSrcweir APPHELPER_XSERVICEINFO_IMPL( DataInterpreter, C2U("com.sun.star.comp.chart2.DataInterpreter")); 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir } // namespace chart 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 416*cdf0e10cSrcweir namespace 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir void lcl_ShowDataSource( const Reference< data::XDataSource > & xSource ) 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir if( ! xSource.is()) 422*cdf0e10cSrcweir return; 423*cdf0e10cSrcweir 424*cdf0e10cSrcweir OSL_TRACE( "DataSource in DataInterpreter:" ); 425*cdf0e10cSrcweir Sequence< Reference< data::XLabeledDataSequence > > aSequences( xSource->getDataSequences()); 426*cdf0e10cSrcweir Reference< beans::XPropertySet > xProp; 427*cdf0e10cSrcweir OUString aId; 428*cdf0e10cSrcweir const sal_Int32 nMax = aSequences.getLength(); 429*cdf0e10cSrcweir for( sal_Int32 k = 0; k < nMax; ++k ) 430*cdf0e10cSrcweir { 431*cdf0e10cSrcweir if( aSequences[k].is()) 432*cdf0e10cSrcweir { 433*cdf0e10cSrcweir OUString aSourceRepr(C2U("<none>")); 434*cdf0e10cSrcweir if( aSequences[k]->getValues().is()) 435*cdf0e10cSrcweir aSourceRepr = aSequences[k]->getValues()->getSourceRangeRepresentation(); 436*cdf0e10cSrcweir xProp.set( aSequences[k]->getValues(), uno::UNO_QUERY ); 437*cdf0e10cSrcweir if( xProp.is() && 438*cdf0e10cSrcweir ( xProp->getPropertyValue( C2U( "Role" )) >>= aId )) 439*cdf0e10cSrcweir { 440*cdf0e10cSrcweir OSL_TRACE( " <data sequence %d> Role: %s, Source: %s", k, U2C( aId ), U2C( aSourceRepr )); 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir else 443*cdf0e10cSrcweir { 444*cdf0e10cSrcweir OSL_TRACE( " <data sequence %d> unknown Role, Source: %s", k, U2C( aSourceRepr ) ); 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir aSourceRepr = C2U("<none>"); 448*cdf0e10cSrcweir if( aSequences[k]->getLabel().is()) 449*cdf0e10cSrcweir aSourceRepr = OUString( aSequences[k]->getLabel()->getSourceRangeRepresentation()); 450*cdf0e10cSrcweir xProp.set( aSequences[k]->getLabel(), uno::UNO_QUERY ); 451*cdf0e10cSrcweir if( xProp.is() && 452*cdf0e10cSrcweir ( xProp->getPropertyValue( C2U( "Role" )) >>= aId )) 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir OSL_TRACE( " <data sequence label %d> Role: %s, Source: %s", k, U2C( aId ), U2C( aSourceRepr )); 455*cdf0e10cSrcweir } 456*cdf0e10cSrcweir else 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir OSL_TRACE( " <data sequence label %d> unknown Role, Source: %s", k, U2C( aSourceRepr ) ); 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir } 462*cdf0e10cSrcweir } 463*cdf0e10cSrcweir 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir #endif 466