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