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