1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_chart2.hxx"
26*b1cdbd2cSJim Jagielski #include "ChartDataWrapper.hxx"
27*b1cdbd2cSJim Jagielski #include "macros.hxx"
28*b1cdbd2cSJim Jagielski #include "DiagramHelper.hxx"
29*b1cdbd2cSJim Jagielski #include "DataSourceHelper.hxx"
30*b1cdbd2cSJim Jagielski #include "servicenames_charttypes.hxx"
31*b1cdbd2cSJim Jagielski #include "ContainerHelper.hxx"
32*b1cdbd2cSJim Jagielski #include "CommonFunctors.hxx"
33*b1cdbd2cSJim Jagielski #include "ChartModelHelper.hxx"
34*b1cdbd2cSJim Jagielski #include "DataSeriesHelper.hxx"
35*b1cdbd2cSJim Jagielski #include "ControllerLockGuard.hxx"
36*b1cdbd2cSJim Jagielski #include "Chart2ModelContact.hxx"
37*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XTitled.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XTextualDataSequence.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataSource.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDataSeries.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartTypeContainer.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataReceiver.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartDataRowSource.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XChartDocument.hpp>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include "CharacterProperties.hxx"
51*b1cdbd2cSJim Jagielski #include "LineProperties.hxx"
52*b1cdbd2cSJim Jagielski #include "FillProperties.hxx"
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include <map>
55*b1cdbd2cSJim Jagielski #include <algorithm>
56*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
59*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
60*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
61*b1cdbd2cSJim Jagielski using ::rtl::OUString;
62*b1cdbd2cSJim Jagielski using ::osl::MutexGuard;
63*b1cdbd2cSJim Jagielski using ::com::sun::star::chart2::XAnyDescriptionAccess;
64*b1cdbd2cSJim Jagielski using ::com::sun::star::chart::XComplexDescriptionAccess;
65*b1cdbd2cSJim Jagielski using ::com::sun::star::chart::XChartData;
66*b1cdbd2cSJim Jagielski using ::com::sun::star::chart::XChartDataArray;
67*b1cdbd2cSJim Jagielski using ::com::sun::star::chart::XDateCategories;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski namespace
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski static const ::rtl::OUString lcl_aServiceName(
72*b1cdbd2cSJim Jagielski     RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart.ChartData" ));
73*b1cdbd2cSJim Jagielski 
lcl_getNANInsteadDBL_MIN(const uno::Sequence<uno::Sequence<double>> & rData)74*b1cdbd2cSJim Jagielski uno::Sequence< uno::Sequence< double > > lcl_getNANInsteadDBL_MIN( const uno::Sequence< uno::Sequence< double > >& rData )
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Sequence< double > > aRet;
77*b1cdbd2cSJim Jagielski     const sal_Int32 nOuterSize = rData.getLength();
78*b1cdbd2cSJim Jagielski     aRet.realloc( nOuterSize );
79*b1cdbd2cSJim Jagielski     for( sal_Int32 nOuter=0; nOuter<nOuterSize; ++nOuter )
80*b1cdbd2cSJim Jagielski     {
81*b1cdbd2cSJim Jagielski         sal_Int32 nInnerSize = rData[nOuter].getLength();
82*b1cdbd2cSJim Jagielski         aRet[nOuter].realloc( nInnerSize );
83*b1cdbd2cSJim Jagielski         for( sal_Int32 nInner=0; nInner<nInnerSize; ++nInner )
84*b1cdbd2cSJim Jagielski         {
85*b1cdbd2cSJim Jagielski             aRet[nOuter][nInner] = rData[nOuter][nInner];
86*b1cdbd2cSJim Jagielski             double& rValue = aRet[nOuter][nInner];
87*b1cdbd2cSJim Jagielski             if( rValue == DBL_MIN )
88*b1cdbd2cSJim Jagielski                 ::rtl::math::setNan( &rValue );
89*b1cdbd2cSJim Jagielski         }
90*b1cdbd2cSJim Jagielski     }
91*b1cdbd2cSJim Jagielski     return aRet;
92*b1cdbd2cSJim Jagielski }
93*b1cdbd2cSJim Jagielski 
lcl_getDBL_MINInsteadNAN(const uno::Sequence<uno::Sequence<double>> & rData)94*b1cdbd2cSJim Jagielski uno::Sequence< uno::Sequence< double > > lcl_getDBL_MINInsteadNAN( const uno::Sequence< uno::Sequence< double > >& rData )
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Sequence< double > > aRet;
97*b1cdbd2cSJim Jagielski     const sal_Int32 nOuterSize = rData.getLength();
98*b1cdbd2cSJim Jagielski     aRet.realloc( nOuterSize );
99*b1cdbd2cSJim Jagielski     for( sal_Int32 nOuter=0; nOuter<nOuterSize; ++nOuter )
100*b1cdbd2cSJim Jagielski     {
101*b1cdbd2cSJim Jagielski         sal_Int32 nInnerSize = rData[nOuter].getLength();
102*b1cdbd2cSJim Jagielski         aRet[nOuter].realloc( nInnerSize );
103*b1cdbd2cSJim Jagielski         for( sal_Int32 nInner=0; nInner<nInnerSize; ++nInner )
104*b1cdbd2cSJim Jagielski         {
105*b1cdbd2cSJim Jagielski             aRet[nOuter][nInner] = rData[nOuter][nInner];
106*b1cdbd2cSJim Jagielski             double& rValue = aRet[nOuter][nInner];
107*b1cdbd2cSJim Jagielski             if( ::rtl::math::isNan( rValue ) )
108*b1cdbd2cSJim Jagielski                 rValue = DBL_MIN;
109*b1cdbd2cSJim Jagielski         }
110*b1cdbd2cSJim Jagielski     }
111*b1cdbd2cSJim Jagielski     return aRet;
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski } // anonymous namespace
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------------------
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski namespace chart
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski namespace wrapper
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski struct lcl_Operator
126*b1cdbd2cSJim Jagielski {
lcl_Operatorchart::wrapper::lcl_Operator127*b1cdbd2cSJim Jagielski     lcl_Operator()
128*b1cdbd2cSJim Jagielski     {
129*b1cdbd2cSJim Jagielski     }
~lcl_Operatorchart::wrapper::lcl_Operator130*b1cdbd2cSJim Jagielski     virtual ~lcl_Operator()
131*b1cdbd2cSJim Jagielski     {
132*b1cdbd2cSJim Jagielski     }
133*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess ) = 0;
134*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_Operator135*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool /*bDataInColumns*/ )
136*b1cdbd2cSJim Jagielski     {
137*b1cdbd2cSJim Jagielski         return false;
138*b1cdbd2cSJim Jagielski     }
139*b1cdbd2cSJim Jagielski };
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski struct lcl_AllOperator : public lcl_Operator
144*b1cdbd2cSJim Jagielski {
lcl_AllOperatorchart::wrapper::lcl_AllOperator145*b1cdbd2cSJim Jagielski     lcl_AllOperator( const Reference< XChartData >& xDataToApply )
146*b1cdbd2cSJim Jagielski         : lcl_Operator()
147*b1cdbd2cSJim Jagielski         , m_xDataToApply( xDataToApply )
148*b1cdbd2cSJim Jagielski     {
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_AllOperator151*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool /*bDataInColumns*/ )
152*b1cdbd2cSJim Jagielski     {
153*b1cdbd2cSJim Jagielski         return true;
154*b1cdbd2cSJim Jagielski     }
155*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_AllOperator156*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
157*b1cdbd2cSJim Jagielski     {
158*b1cdbd2cSJim Jagielski         if( !xDataAccess.is() )
159*b1cdbd2cSJim Jagielski             return;
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski         Reference< XAnyDescriptionAccess > xNewAny( m_xDataToApply, uno::UNO_QUERY );
162*b1cdbd2cSJim Jagielski         Reference< XComplexDescriptionAccess > xNewComplex( m_xDataToApply, uno::UNO_QUERY );
163*b1cdbd2cSJim Jagielski         if( xNewAny.is() )
164*b1cdbd2cSJim Jagielski         {
165*b1cdbd2cSJim Jagielski             xDataAccess->setData( xNewAny->getData() );
166*b1cdbd2cSJim Jagielski             xDataAccess->setComplexRowDescriptions( xNewAny->getComplexRowDescriptions() );
167*b1cdbd2cSJim Jagielski             xDataAccess->setComplexColumnDescriptions( xNewAny->getComplexColumnDescriptions() );
168*b1cdbd2cSJim Jagielski         }
169*b1cdbd2cSJim Jagielski         else if( xNewComplex.is() )
170*b1cdbd2cSJim Jagielski         {
171*b1cdbd2cSJim Jagielski             xDataAccess->setData( xNewComplex->getData() );
172*b1cdbd2cSJim Jagielski             xDataAccess->setComplexRowDescriptions( xNewComplex->getComplexRowDescriptions() );
173*b1cdbd2cSJim Jagielski             xDataAccess->setComplexColumnDescriptions( xNewComplex->getComplexColumnDescriptions() );
174*b1cdbd2cSJim Jagielski         }
175*b1cdbd2cSJim Jagielski         else
176*b1cdbd2cSJim Jagielski         {
177*b1cdbd2cSJim Jagielski             Reference< XChartDataArray > xNew( m_xDataToApply, uno::UNO_QUERY );
178*b1cdbd2cSJim Jagielski             if( xNew.is() )
179*b1cdbd2cSJim Jagielski             {
180*b1cdbd2cSJim Jagielski                 xDataAccess->setData( xNew->getData() );
181*b1cdbd2cSJim Jagielski                 xDataAccess->setRowDescriptions( xNew->getRowDescriptions() );
182*b1cdbd2cSJim Jagielski                 xDataAccess->setColumnDescriptions( xNew->getColumnDescriptions() );
183*b1cdbd2cSJim Jagielski             }
184*b1cdbd2cSJim Jagielski         }
185*b1cdbd2cSJim Jagielski     }
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     Reference< XChartData > m_xDataToApply;
188*b1cdbd2cSJim Jagielski };
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski struct lcl_DataOperator : public lcl_Operator
193*b1cdbd2cSJim Jagielski {
lcl_DataOperatorchart::wrapper::lcl_DataOperator194*b1cdbd2cSJim Jagielski     lcl_DataOperator( const Sequence< Sequence< double > >& rData )
195*b1cdbd2cSJim Jagielski         : lcl_Operator()
196*b1cdbd2cSJim Jagielski         , m_rData( rData )
197*b1cdbd2cSJim Jagielski     {
198*b1cdbd2cSJim Jagielski     }
199*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_DataOperator200*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
201*b1cdbd2cSJim Jagielski     {
202*b1cdbd2cSJim Jagielski         if( xDataAccess.is() )
203*b1cdbd2cSJim Jagielski             xDataAccess->setData( lcl_getNANInsteadDBL_MIN( m_rData ) );
204*b1cdbd2cSJim Jagielski     }
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski     const Sequence< Sequence< double > >& m_rData;
207*b1cdbd2cSJim Jagielski };
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski struct lcl_RowDescriptionsOperator : public lcl_Operator
212*b1cdbd2cSJim Jagielski {
lcl_RowDescriptionsOperatorchart::wrapper::lcl_RowDescriptionsOperator213*b1cdbd2cSJim Jagielski     lcl_RowDescriptionsOperator( const Sequence< OUString >& rRowDescriptions
214*b1cdbd2cSJim Jagielski         , const Reference< chart2::XChartDocument >& xChartDoc )
215*b1cdbd2cSJim Jagielski         : lcl_Operator()
216*b1cdbd2cSJim Jagielski         , m_rRowDescriptions( rRowDescriptions )
217*b1cdbd2cSJim Jagielski         , m_xChartDoc(xChartDoc)
218*b1cdbd2cSJim Jagielski         , m_bDataInColumns(true)
219*b1cdbd2cSJim Jagielski     {
220*b1cdbd2cSJim Jagielski     }
221*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_RowDescriptionsOperator222*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool bDataInColumns )
223*b1cdbd2cSJim Jagielski     {
224*b1cdbd2cSJim Jagielski         m_bDataInColumns = bDataInColumns;
225*b1cdbd2cSJim Jagielski         return bDataInColumns;
226*b1cdbd2cSJim Jagielski     }
227*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_RowDescriptionsOperator228*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
229*b1cdbd2cSJim Jagielski     {
230*b1cdbd2cSJim Jagielski         if( xDataAccess.is() )
231*b1cdbd2cSJim Jagielski         {
232*b1cdbd2cSJim Jagielski             xDataAccess->setRowDescriptions( m_rRowDescriptions );
233*b1cdbd2cSJim Jagielski             if( m_bDataInColumns )
234*b1cdbd2cSJim Jagielski                 DiagramHelper::switchToTextCategories( m_xChartDoc );
235*b1cdbd2cSJim Jagielski         }
236*b1cdbd2cSJim Jagielski     }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski     const Sequence< OUString >& m_rRowDescriptions;
239*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > m_xChartDoc;
240*b1cdbd2cSJim Jagielski     bool m_bDataInColumns;
241*b1cdbd2cSJim Jagielski };
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski struct lcl_ComplexRowDescriptionsOperator : public lcl_Operator
246*b1cdbd2cSJim Jagielski {
lcl_ComplexRowDescriptionsOperatorchart::wrapper::lcl_ComplexRowDescriptionsOperator247*b1cdbd2cSJim Jagielski     lcl_ComplexRowDescriptionsOperator( const Sequence< Sequence< OUString > >& rComplexRowDescriptions
248*b1cdbd2cSJim Jagielski         , const Reference< chart2::XChartDocument >& xChartDoc )
249*b1cdbd2cSJim Jagielski         : lcl_Operator()
250*b1cdbd2cSJim Jagielski         , m_rComplexRowDescriptions( rComplexRowDescriptions )
251*b1cdbd2cSJim Jagielski         , m_xChartDoc(xChartDoc)
252*b1cdbd2cSJim Jagielski         , m_bDataInColumns(true)
253*b1cdbd2cSJim Jagielski     {
254*b1cdbd2cSJim Jagielski     }
255*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_ComplexRowDescriptionsOperator256*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool bDataInColumns )
257*b1cdbd2cSJim Jagielski     {
258*b1cdbd2cSJim Jagielski         m_bDataInColumns = bDataInColumns;
259*b1cdbd2cSJim Jagielski         return bDataInColumns;
260*b1cdbd2cSJim Jagielski     }
261*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_ComplexRowDescriptionsOperator262*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
263*b1cdbd2cSJim Jagielski     {
264*b1cdbd2cSJim Jagielski         if( xDataAccess.is() )
265*b1cdbd2cSJim Jagielski         {
266*b1cdbd2cSJim Jagielski             xDataAccess->setComplexRowDescriptions( m_rComplexRowDescriptions );
267*b1cdbd2cSJim Jagielski             if( m_bDataInColumns )
268*b1cdbd2cSJim Jagielski                 DiagramHelper::switchToTextCategories( m_xChartDoc );
269*b1cdbd2cSJim Jagielski         }
270*b1cdbd2cSJim Jagielski     }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski     const Sequence< Sequence< OUString > >& m_rComplexRowDescriptions;
273*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > m_xChartDoc;
274*b1cdbd2cSJim Jagielski     bool m_bDataInColumns;
275*b1cdbd2cSJim Jagielski };
276*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski struct lcl_AnyRowDescriptionsOperator : public lcl_Operator
279*b1cdbd2cSJim Jagielski {
lcl_AnyRowDescriptionsOperatorchart::wrapper::lcl_AnyRowDescriptionsOperator280*b1cdbd2cSJim Jagielski     lcl_AnyRowDescriptionsOperator( const Sequence< Sequence< uno::Any > >& rAnyRowDescriptions )
281*b1cdbd2cSJim Jagielski         : lcl_Operator()
282*b1cdbd2cSJim Jagielski         , m_rAnyRowDescriptions( rAnyRowDescriptions )
283*b1cdbd2cSJim Jagielski     {
284*b1cdbd2cSJim Jagielski     }
285*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_AnyRowDescriptionsOperator286*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool bDataInColumns )
287*b1cdbd2cSJim Jagielski     {
288*b1cdbd2cSJim Jagielski         return bDataInColumns;
289*b1cdbd2cSJim Jagielski     }
290*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_AnyRowDescriptionsOperator291*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
292*b1cdbd2cSJim Jagielski     {
293*b1cdbd2cSJim Jagielski         if( xDataAccess.is() )
294*b1cdbd2cSJim Jagielski             xDataAccess->setAnyRowDescriptions( m_rAnyRowDescriptions );
295*b1cdbd2cSJim Jagielski     }
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski     const Sequence< Sequence< uno::Any > >& m_rAnyRowDescriptions;
298*b1cdbd2cSJim Jagielski };
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski struct lcl_ColumnDescriptionsOperator : public lcl_Operator
303*b1cdbd2cSJim Jagielski {
lcl_ColumnDescriptionsOperatorchart::wrapper::lcl_ColumnDescriptionsOperator304*b1cdbd2cSJim Jagielski     lcl_ColumnDescriptionsOperator( const Sequence< OUString >& rColumnDescriptions
305*b1cdbd2cSJim Jagielski         , const Reference< chart2::XChartDocument >& xChartDoc )
306*b1cdbd2cSJim Jagielski         : lcl_Operator()
307*b1cdbd2cSJim Jagielski         , m_rColumnDescriptions( rColumnDescriptions )
308*b1cdbd2cSJim Jagielski         , m_xChartDoc(xChartDoc)
309*b1cdbd2cSJim Jagielski         , m_bDataInColumns(true)
310*b1cdbd2cSJim Jagielski     {
311*b1cdbd2cSJim Jagielski     }
312*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_ColumnDescriptionsOperator313*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool bDataInColumns )
314*b1cdbd2cSJim Jagielski     {
315*b1cdbd2cSJim Jagielski         m_bDataInColumns = bDataInColumns;
316*b1cdbd2cSJim Jagielski         return !bDataInColumns;
317*b1cdbd2cSJim Jagielski     }
318*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_ColumnDescriptionsOperator319*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
320*b1cdbd2cSJim Jagielski     {
321*b1cdbd2cSJim Jagielski         if( xDataAccess.is() )
322*b1cdbd2cSJim Jagielski         {
323*b1cdbd2cSJim Jagielski             xDataAccess->setColumnDescriptions( m_rColumnDescriptions );
324*b1cdbd2cSJim Jagielski             if( !m_bDataInColumns )
325*b1cdbd2cSJim Jagielski                 DiagramHelper::switchToTextCategories( m_xChartDoc );
326*b1cdbd2cSJim Jagielski         }
327*b1cdbd2cSJim Jagielski     }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     const Sequence< OUString >& m_rColumnDescriptions;
330*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > m_xChartDoc;
331*b1cdbd2cSJim Jagielski     bool m_bDataInColumns;
332*b1cdbd2cSJim Jagielski };
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski struct lcl_ComplexColumnDescriptionsOperator : public lcl_Operator
337*b1cdbd2cSJim Jagielski {
lcl_ComplexColumnDescriptionsOperatorchart::wrapper::lcl_ComplexColumnDescriptionsOperator338*b1cdbd2cSJim Jagielski     lcl_ComplexColumnDescriptionsOperator( const Sequence< Sequence< OUString > >& rComplexColumnDescriptions
339*b1cdbd2cSJim Jagielski         , const Reference< chart2::XChartDocument >& xChartDoc )
340*b1cdbd2cSJim Jagielski         : lcl_Operator()
341*b1cdbd2cSJim Jagielski         , m_rComplexColumnDescriptions( rComplexColumnDescriptions )
342*b1cdbd2cSJim Jagielski         , m_xChartDoc(xChartDoc)
343*b1cdbd2cSJim Jagielski         , m_bDataInColumns(true)
344*b1cdbd2cSJim Jagielski     {
345*b1cdbd2cSJim Jagielski     }
346*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_ComplexColumnDescriptionsOperator347*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool bDataInColumns )
348*b1cdbd2cSJim Jagielski     {
349*b1cdbd2cSJim Jagielski         m_bDataInColumns = bDataInColumns;
350*b1cdbd2cSJim Jagielski         return !bDataInColumns;
351*b1cdbd2cSJim Jagielski     }
352*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_ComplexColumnDescriptionsOperator353*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
354*b1cdbd2cSJim Jagielski     {
355*b1cdbd2cSJim Jagielski         if( xDataAccess.is() )
356*b1cdbd2cSJim Jagielski         {
357*b1cdbd2cSJim Jagielski             xDataAccess->setComplexColumnDescriptions( m_rComplexColumnDescriptions );
358*b1cdbd2cSJim Jagielski             if( !m_bDataInColumns )
359*b1cdbd2cSJim Jagielski                 DiagramHelper::switchToTextCategories( m_xChartDoc );
360*b1cdbd2cSJim Jagielski         }
361*b1cdbd2cSJim Jagielski     }
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski     const Sequence< Sequence< OUString > >& m_rComplexColumnDescriptions;
364*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > m_xChartDoc;
365*b1cdbd2cSJim Jagielski     bool m_bDataInColumns;
366*b1cdbd2cSJim Jagielski };
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski struct lcl_AnyColumnDescriptionsOperator : public lcl_Operator
371*b1cdbd2cSJim Jagielski {
lcl_AnyColumnDescriptionsOperatorchart::wrapper::lcl_AnyColumnDescriptionsOperator372*b1cdbd2cSJim Jagielski     lcl_AnyColumnDescriptionsOperator( const Sequence< Sequence< uno::Any > >& rAnyColumnDescriptions )
373*b1cdbd2cSJim Jagielski         : lcl_Operator()
374*b1cdbd2cSJim Jagielski         , m_rAnyColumnDescriptions( rAnyColumnDescriptions )
375*b1cdbd2cSJim Jagielski     {
376*b1cdbd2cSJim Jagielski     }
377*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_AnyColumnDescriptionsOperator378*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool bDataInColumns )
379*b1cdbd2cSJim Jagielski     {
380*b1cdbd2cSJim Jagielski         return bDataInColumns;
381*b1cdbd2cSJim Jagielski     }
382*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_AnyColumnDescriptionsOperator383*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
384*b1cdbd2cSJim Jagielski     {
385*b1cdbd2cSJim Jagielski         if( xDataAccess.is() )
386*b1cdbd2cSJim Jagielski             xDataAccess->setAnyColumnDescriptions( m_rAnyColumnDescriptions );
387*b1cdbd2cSJim Jagielski     }
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     const Sequence< Sequence< uno::Any > >& m_rAnyColumnDescriptions;
390*b1cdbd2cSJim Jagielski };
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski struct lcl_DateCategoriesOperator : public lcl_Operator
395*b1cdbd2cSJim Jagielski {
lcl_DateCategoriesOperatorchart::wrapper::lcl_DateCategoriesOperator396*b1cdbd2cSJim Jagielski     lcl_DateCategoriesOperator( const Sequence< double >& rDates )
397*b1cdbd2cSJim Jagielski         : lcl_Operator()
398*b1cdbd2cSJim Jagielski         , m_rDates( rDates )
399*b1cdbd2cSJim Jagielski     {
400*b1cdbd2cSJim Jagielski     }
401*b1cdbd2cSJim Jagielski 
setsCategorieschart::wrapper::lcl_DateCategoriesOperator402*b1cdbd2cSJim Jagielski     virtual bool setsCategories( bool /*bDataInColumns*/ )
403*b1cdbd2cSJim Jagielski     {
404*b1cdbd2cSJim Jagielski         return true;
405*b1cdbd2cSJim Jagielski     }
406*b1cdbd2cSJim Jagielski 
applychart::wrapper::lcl_DateCategoriesOperator407*b1cdbd2cSJim Jagielski     virtual void apply( const Reference< XAnyDescriptionAccess >& xDataAccess )
408*b1cdbd2cSJim Jagielski     {
409*b1cdbd2cSJim Jagielski         Reference< XDateCategories > xDateCategories( xDataAccess, uno::UNO_QUERY );
410*b1cdbd2cSJim Jagielski         if( xDateCategories.is() )
411*b1cdbd2cSJim Jagielski             xDateCategories->setDateCategories( m_rDates );
412*b1cdbd2cSJim Jagielski     }
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski     const Sequence< double >& m_rDates;
415*b1cdbd2cSJim Jagielski };
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
418*b1cdbd2cSJim Jagielski 
ChartDataWrapper(::boost::shared_ptr<Chart2ModelContact> spChart2ModelContact)419*b1cdbd2cSJim Jagielski ChartDataWrapper::ChartDataWrapper( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) :
420*b1cdbd2cSJim Jagielski         m_spChart2ModelContact( spChart2ModelContact ),
421*b1cdbd2cSJim Jagielski         m_aEventListenerContainer( m_aMutex )
422*b1cdbd2cSJim Jagielski {
423*b1cdbd2cSJim Jagielski     osl_incrementInterlockedCount( &m_refCount );
424*b1cdbd2cSJim Jagielski     initDataAccess();
425*b1cdbd2cSJim Jagielski     osl_decrementInterlockedCount( &m_refCount );
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
ChartDataWrapper(::boost::shared_ptr<Chart2ModelContact> spChart2ModelContact,const Reference<XChartData> & xNewData)428*b1cdbd2cSJim Jagielski ChartDataWrapper::ChartDataWrapper( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact,
429*b1cdbd2cSJim Jagielski                                     const Reference< XChartData >& xNewData ) :
430*b1cdbd2cSJim Jagielski         m_spChart2ModelContact( spChart2ModelContact ),
431*b1cdbd2cSJim Jagielski         m_aEventListenerContainer( m_aMutex )
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski     osl_incrementInterlockedCount( &m_refCount );
434*b1cdbd2cSJim Jagielski     lcl_AllOperator aOperator( xNewData );
435*b1cdbd2cSJim Jagielski     applyData( aOperator );
436*b1cdbd2cSJim Jagielski     osl_decrementInterlockedCount( &m_refCount );
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski 
~ChartDataWrapper()439*b1cdbd2cSJim Jagielski ChartDataWrapper::~ChartDataWrapper()
440*b1cdbd2cSJim Jagielski {
441*b1cdbd2cSJim Jagielski     // @todo: implement XComponent and call this in dispose().  In the DTOR the
442*b1cdbd2cSJim Jagielski     // ref-count is 0, thus creating a stack reference to this calls the DTOR at
443*b1cdbd2cSJim Jagielski     // the end of the block recursively
444*b1cdbd2cSJim Jagielski //     uno::Reference< uno::XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) );
445*b1cdbd2cSJim Jagielski //     m_aEventListenerContainer.disposeAndClear( lang::EventObject( xSource ) );
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski // ____ XChartDataArray (read)____
getData()449*b1cdbd2cSJim Jagielski Sequence< Sequence< double > > SAL_CALL ChartDataWrapper::getData()
450*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski     initDataAccess();
453*b1cdbd2cSJim Jagielski     if( m_xDataAccess.is() )
454*b1cdbd2cSJim Jagielski         return lcl_getDBL_MINInsteadNAN( m_xDataAccess->getData() );
455*b1cdbd2cSJim Jagielski     return Sequence< Sequence< double > >();
456*b1cdbd2cSJim Jagielski }
getRowDescriptions()457*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL ChartDataWrapper::getRowDescriptions()
458*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski     initDataAccess();
461*b1cdbd2cSJim Jagielski     if( m_xDataAccess.is() )
462*b1cdbd2cSJim Jagielski         return m_xDataAccess->getRowDescriptions();
463*b1cdbd2cSJim Jagielski     return Sequence< OUString >();
464*b1cdbd2cSJim Jagielski }
getColumnDescriptions()465*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL ChartDataWrapper::getColumnDescriptions()
466*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski     initDataAccess();
469*b1cdbd2cSJim Jagielski     if( m_xDataAccess.is() )
470*b1cdbd2cSJim Jagielski         return m_xDataAccess->getColumnDescriptions();
471*b1cdbd2cSJim Jagielski     return Sequence< OUString > ();
472*b1cdbd2cSJim Jagielski }
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski // ____ XComplexDescriptionAccess (read) ____
getComplexRowDescriptions()475*b1cdbd2cSJim Jagielski Sequence< Sequence< OUString > > SAL_CALL ChartDataWrapper::getComplexRowDescriptions() throw (uno::RuntimeException)
476*b1cdbd2cSJim Jagielski {
477*b1cdbd2cSJim Jagielski     initDataAccess();
478*b1cdbd2cSJim Jagielski     if( m_xDataAccess.is() )
479*b1cdbd2cSJim Jagielski         return m_xDataAccess->getComplexRowDescriptions();
480*b1cdbd2cSJim Jagielski     return Sequence< Sequence< OUString > >();
481*b1cdbd2cSJim Jagielski }
getComplexColumnDescriptions()482*b1cdbd2cSJim Jagielski Sequence< Sequence< OUString > > SAL_CALL ChartDataWrapper::getComplexColumnDescriptions() throw (uno::RuntimeException)
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski     initDataAccess();
485*b1cdbd2cSJim Jagielski     if( m_xDataAccess.is() )
486*b1cdbd2cSJim Jagielski         return m_xDataAccess->getComplexColumnDescriptions();
487*b1cdbd2cSJim Jagielski     return Sequence< Sequence< OUString > >();
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski // ____ XAnyDescriptionAccess (read) ____
getAnyRowDescriptions()491*b1cdbd2cSJim Jagielski Sequence< Sequence< uno::Any > > SAL_CALL ChartDataWrapper::getAnyRowDescriptions() throw (uno::RuntimeException)
492*b1cdbd2cSJim Jagielski {
493*b1cdbd2cSJim Jagielski     initDataAccess();
494*b1cdbd2cSJim Jagielski     if( m_xDataAccess.is() )
495*b1cdbd2cSJim Jagielski         return m_xDataAccess->getAnyRowDescriptions();
496*b1cdbd2cSJim Jagielski     return Sequence< Sequence< uno::Any > >();
497*b1cdbd2cSJim Jagielski }
getAnyColumnDescriptions()498*b1cdbd2cSJim Jagielski Sequence< Sequence< uno::Any > > SAL_CALL ChartDataWrapper::getAnyColumnDescriptions() throw (uno::RuntimeException)
499*b1cdbd2cSJim Jagielski {
500*b1cdbd2cSJim Jagielski     initDataAccess();
501*b1cdbd2cSJim Jagielski     if( m_xDataAccess.is() )
502*b1cdbd2cSJim Jagielski         return m_xDataAccess->getAnyColumnDescriptions();
503*b1cdbd2cSJim Jagielski     return Sequence< Sequence< uno::Any > >();
504*b1cdbd2cSJim Jagielski }
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski // ____ XDateCategories (read) ____
getDateCategories()507*b1cdbd2cSJim Jagielski Sequence< double > SAL_CALL ChartDataWrapper::getDateCategories() throw (uno::RuntimeException)
508*b1cdbd2cSJim Jagielski {
509*b1cdbd2cSJim Jagielski     initDataAccess();
510*b1cdbd2cSJim Jagielski     Reference< XDateCategories > xDateCategories( m_xDataAccess, uno::UNO_QUERY );
511*b1cdbd2cSJim Jagielski     if( xDateCategories.is() )
512*b1cdbd2cSJim Jagielski         return xDateCategories->getDateCategories();
513*b1cdbd2cSJim Jagielski     return Sequence< double >();
514*b1cdbd2cSJim Jagielski }
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski // ____ XChartDataArray (write)____
setData(const Sequence<Sequence<double>> & rData)517*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setData( const Sequence< Sequence< double > >& rData )
518*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
519*b1cdbd2cSJim Jagielski {
520*b1cdbd2cSJim Jagielski     lcl_DataOperator aOperator( rData );
521*b1cdbd2cSJim Jagielski     applyData( aOperator );
522*b1cdbd2cSJim Jagielski }
setRowDescriptions(const Sequence<OUString> & rRowDescriptions)523*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setRowDescriptions( const Sequence< OUString >& rRowDescriptions )
524*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
525*b1cdbd2cSJim Jagielski {
526*b1cdbd2cSJim Jagielski     lcl_RowDescriptionsOperator aOperator( rRowDescriptions, m_spChart2ModelContact->getChart2Document() );
527*b1cdbd2cSJim Jagielski     applyData( aOperator );
528*b1cdbd2cSJim Jagielski }
setColumnDescriptions(const Sequence<OUString> & rColumnDescriptions)529*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setColumnDescriptions( const Sequence< OUString >& rColumnDescriptions )
530*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski     lcl_ColumnDescriptionsOperator aOperator( rColumnDescriptions, m_spChart2ModelContact->getChart2Document() );
533*b1cdbd2cSJim Jagielski     applyData( aOperator );
534*b1cdbd2cSJim Jagielski }
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski // ____ XComplexDescriptionAccess (write) ____
setComplexRowDescriptions(const Sequence<Sequence<::rtl::OUString>> & rRowDescriptions)537*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setComplexRowDescriptions( const Sequence< Sequence< ::rtl::OUString > >& rRowDescriptions ) throw (uno::RuntimeException)
538*b1cdbd2cSJim Jagielski {
539*b1cdbd2cSJim Jagielski     lcl_ComplexRowDescriptionsOperator aOperator( rRowDescriptions, m_spChart2ModelContact->getChart2Document() );
540*b1cdbd2cSJim Jagielski     applyData( aOperator );
541*b1cdbd2cSJim Jagielski }
setComplexColumnDescriptions(const Sequence<Sequence<::rtl::OUString>> & rColumnDescriptions)542*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setComplexColumnDescriptions( const Sequence< Sequence< ::rtl::OUString > >& rColumnDescriptions ) throw (uno::RuntimeException)
543*b1cdbd2cSJim Jagielski {
544*b1cdbd2cSJim Jagielski     lcl_ComplexColumnDescriptionsOperator aOperator( rColumnDescriptions, m_spChart2ModelContact->getChart2Document() );
545*b1cdbd2cSJim Jagielski     applyData( aOperator );
546*b1cdbd2cSJim Jagielski }
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski // ____ XAnyDescriptionAccess (write) ____
setAnyRowDescriptions(const Sequence<Sequence<uno::Any>> & rRowDescriptions)549*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setAnyRowDescriptions( const Sequence< Sequence< uno::Any > >& rRowDescriptions ) throw (uno::RuntimeException)
550*b1cdbd2cSJim Jagielski {
551*b1cdbd2cSJim Jagielski     lcl_AnyRowDescriptionsOperator aOperator( rRowDescriptions );
552*b1cdbd2cSJim Jagielski     applyData( aOperator );
553*b1cdbd2cSJim Jagielski }
setAnyColumnDescriptions(const Sequence<Sequence<uno::Any>> & rColumnDescriptions)554*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setAnyColumnDescriptions( const Sequence< Sequence< uno::Any > >& rColumnDescriptions ) throw (uno::RuntimeException)
555*b1cdbd2cSJim Jagielski {
556*b1cdbd2cSJim Jagielski     lcl_AnyColumnDescriptionsOperator aOperator( rColumnDescriptions );
557*b1cdbd2cSJim Jagielski     applyData( aOperator );
558*b1cdbd2cSJim Jagielski }
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski // ____ XDateCategories (write) ____
setDateCategories(const Sequence<double> & rDates)561*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::setDateCategories( const Sequence< double >& rDates ) throw (uno::RuntimeException)
562*b1cdbd2cSJim Jagielski {
563*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() );
564*b1cdbd2cSJim Jagielski     ControllerLockGuard aCtrlLockGuard( uno::Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ));
565*b1cdbd2cSJim Jagielski     lcl_DateCategoriesOperator aOperator( rDates );
566*b1cdbd2cSJim Jagielski     applyData( aOperator );
567*b1cdbd2cSJim Jagielski     DiagramHelper::switchToDateCategories( xChartDoc );
568*b1cdbd2cSJim Jagielski }
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski // ____ XChartData (base of XChartDataArray) ____
addChartDataChangeEventListener(const uno::Reference<::com::sun::star::chart::XChartDataChangeEventListener> & aListener)573*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::addChartDataChangeEventListener(
574*b1cdbd2cSJim Jagielski     const uno::Reference<
575*b1cdbd2cSJim Jagielski         ::com::sun::star::chart::XChartDataChangeEventListener >& aListener )
576*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
577*b1cdbd2cSJim Jagielski {
578*b1cdbd2cSJim Jagielski     m_aEventListenerContainer.addInterface( aListener );
579*b1cdbd2cSJim Jagielski }
580*b1cdbd2cSJim Jagielski 
removeChartDataChangeEventListener(const uno::Reference<::com::sun::star::chart::XChartDataChangeEventListener> & aListener)581*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::removeChartDataChangeEventListener(
582*b1cdbd2cSJim Jagielski     const uno::Reference<
583*b1cdbd2cSJim Jagielski         ::com::sun::star::chart::XChartDataChangeEventListener >& aListener )
584*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
585*b1cdbd2cSJim Jagielski {
586*b1cdbd2cSJim Jagielski     m_aEventListenerContainer.removeInterface( aListener );
587*b1cdbd2cSJim Jagielski }
588*b1cdbd2cSJim Jagielski 
getNotANumber()589*b1cdbd2cSJim Jagielski double SAL_CALL ChartDataWrapper::getNotANumber()
590*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski     return DBL_MIN;
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski 
isNotANumber(double nNumber)595*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ChartDataWrapper::isNotANumber( double nNumber )
596*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
597*b1cdbd2cSJim Jagielski {
598*b1cdbd2cSJim Jagielski     return DBL_MIN == nNumber
599*b1cdbd2cSJim Jagielski         || ::rtl::math::isNan( nNumber )
600*b1cdbd2cSJim Jagielski         || ::rtl::math::isInf( nNumber );
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski // ____ XComponent ____
dispose()604*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::dispose()
605*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
606*b1cdbd2cSJim Jagielski {
607*b1cdbd2cSJim Jagielski     m_aEventListenerContainer.disposeAndClear( lang::EventObject( static_cast< ::cppu::OWeakObject* >( this )));
608*b1cdbd2cSJim Jagielski     m_xDataAccess=0;
609*b1cdbd2cSJim Jagielski }
610*b1cdbd2cSJim Jagielski 
addEventListener(const uno::Reference<lang::XEventListener> & xListener)611*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::addEventListener(
612*b1cdbd2cSJim Jagielski     const uno::Reference< lang::XEventListener > & xListener )
613*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
614*b1cdbd2cSJim Jagielski {
615*b1cdbd2cSJim Jagielski 	m_aEventListenerContainer.addInterface( xListener );
616*b1cdbd2cSJim Jagielski }
617*b1cdbd2cSJim Jagielski 
removeEventListener(const uno::Reference<lang::XEventListener> & aListener)618*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::removeEventListener(
619*b1cdbd2cSJim Jagielski     const uno::Reference< lang::XEventListener >& aListener )
620*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
621*b1cdbd2cSJim Jagielski {
622*b1cdbd2cSJim Jagielski 	m_aEventListenerContainer.removeInterface( aListener );
623*b1cdbd2cSJim Jagielski }
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski // ____ XEventListener ____
disposing(const lang::EventObject &)626*b1cdbd2cSJim Jagielski void SAL_CALL ChartDataWrapper::disposing( const lang::EventObject& /* Source */ )
627*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski }
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski //  ::com::sun::star::chart::ChartDataChangeEvent aEvent;
632*b1cdbd2cSJim Jagielski //  aEvent.Type = chart::ChartDataChangeType_ALL;
633*b1cdbd2cSJim Jagielski //  aEvent.StartColumn = 0;
634*b1cdbd2cSJim Jagielski //  aEvent.EndColumn = 0;
635*b1cdbd2cSJim Jagielski //  aEvent.StartRow = 0;
636*b1cdbd2cSJim Jagielski //  aEvent.EndRow = 0;
fireChartDataChangeEvent(::com::sun::star::chart::ChartDataChangeEvent & aEvent)637*b1cdbd2cSJim Jagielski void ChartDataWrapper::fireChartDataChangeEvent(
638*b1cdbd2cSJim Jagielski     ::com::sun::star::chart::ChartDataChangeEvent& aEvent )
639*b1cdbd2cSJim Jagielski {
640*b1cdbd2cSJim Jagielski     if( ! m_aEventListenerContainer.getLength() )
641*b1cdbd2cSJim Jagielski         return;
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski     uno::Reference< uno::XInterface > xSrc( static_cast< cppu::OWeakObject* >( this ));
644*b1cdbd2cSJim Jagielski     OSL_ASSERT( xSrc.is());
645*b1cdbd2cSJim Jagielski     if( xSrc.is() )
646*b1cdbd2cSJim Jagielski         aEvent.Source = xSrc;
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski     ::cppu::OInterfaceIteratorHelper aIter( m_aEventListenerContainer );
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski     while( aIter.hasMoreElements() )
651*b1cdbd2cSJim Jagielski     {
652*b1cdbd2cSJim Jagielski         uno::Reference<
653*b1cdbd2cSJim Jagielski             ::com::sun::star::chart::XChartDataChangeEventListener > xListener(
654*b1cdbd2cSJim Jagielski                 aIter.next(), uno::UNO_QUERY );
655*b1cdbd2cSJim Jagielski         if( xListener.is() )
656*b1cdbd2cSJim Jagielski             xListener->chartDataChanged( aEvent );
657*b1cdbd2cSJim Jagielski     }
658*b1cdbd2cSJim Jagielski }
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------------------
661*b1cdbd2cSJim Jagielski 
switchToInternalDataProvider()662*b1cdbd2cSJim Jagielski void ChartDataWrapper::switchToInternalDataProvider()
663*b1cdbd2cSJim Jagielski {
664*b1cdbd2cSJim Jagielski     //create an internal data provider that is connected to the model
665*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() );
666*b1cdbd2cSJim Jagielski     if( xChartDoc.is() )
667*b1cdbd2cSJim Jagielski         xChartDoc->createInternalDataProvider( true /*bCloneExistingData*/ );
668*b1cdbd2cSJim Jagielski     initDataAccess();
669*b1cdbd2cSJim Jagielski }
670*b1cdbd2cSJim Jagielski 
initDataAccess()671*b1cdbd2cSJim Jagielski void ChartDataWrapper::initDataAccess()
672*b1cdbd2cSJim Jagielski {
673*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() );
674*b1cdbd2cSJim Jagielski     if( !xChartDoc.is() )
675*b1cdbd2cSJim Jagielski         return;
676*b1cdbd2cSJim Jagielski     if( xChartDoc->hasInternalDataProvider() )
677*b1cdbd2cSJim Jagielski         m_xDataAccess = Reference< XAnyDescriptionAccess >( xChartDoc->getDataProvider(), uno::UNO_QUERY_THROW );
678*b1cdbd2cSJim Jagielski     else
679*b1cdbd2cSJim Jagielski     {
680*b1cdbd2cSJim Jagielski         //create a separate "internal data provider" that is not connected to the model
681*b1cdbd2cSJim Jagielski         m_xDataAccess = Reference< XAnyDescriptionAccess >( ChartModelHelper::createInternalDataProvider(
682*b1cdbd2cSJim Jagielski             xChartDoc, false /*bConnectToModel*/ ), uno::UNO_QUERY_THROW );
683*b1cdbd2cSJim Jagielski     }
684*b1cdbd2cSJim Jagielski }
685*b1cdbd2cSJim Jagielski 
applyData(lcl_Operator & rDataOperator)686*b1cdbd2cSJim Jagielski void ChartDataWrapper::applyData( lcl_Operator& rDataOperator )
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski     //bool bSetValues, bool bSetRowDescriptions, bool bSetColumnDescriptions
689*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() );
690*b1cdbd2cSJim Jagielski     if( !xChartDoc.is() )
691*b1cdbd2cSJim Jagielski         return;
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski     // remember some diagram properties to reset later
694*b1cdbd2cSJim Jagielski     sal_Bool bStacked = sal_False;
695*b1cdbd2cSJim Jagielski     sal_Bool bPercent = sal_False;
696*b1cdbd2cSJim Jagielski     sal_Bool bDeep = sal_False;
697*b1cdbd2cSJim Jagielski     uno::Reference< ::com::sun::star::chart::XChartDocument > xOldDoc( xChartDoc, uno::UNO_QUERY );
698*b1cdbd2cSJim Jagielski     OSL_ASSERT( xOldDoc.is());
699*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xDiaProp( xOldDoc->getDiagram(), uno::UNO_QUERY );
700*b1cdbd2cSJim Jagielski     if( xDiaProp.is())
701*b1cdbd2cSJim Jagielski     {
702*b1cdbd2cSJim Jagielski         xDiaProp->getPropertyValue( C2U("Stacked")) >>= bStacked;
703*b1cdbd2cSJim Jagielski         xDiaProp->getPropertyValue( C2U("Percent")) >>= bPercent;
704*b1cdbd2cSJim Jagielski         xDiaProp->getPropertyValue( C2U("Deep")) >>= bDeep;
705*b1cdbd2cSJim Jagielski     }
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski     //detect arguments for the new data source
708*b1cdbd2cSJim Jagielski     ::rtl::OUString aRangeString;
709*b1cdbd2cSJim Jagielski     bool bUseColumns = true;
710*b1cdbd2cSJim Jagielski     bool bFirstCellAsLabel = true;
711*b1cdbd2cSJim Jagielski     bool bHasCategories = true;
712*b1cdbd2cSJim Jagielski     uno::Sequence< sal_Int32 > aSequenceMapping;
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski     DataSourceHelper::detectRangeSegmentation(
715*b1cdbd2cSJim Jagielski         uno::Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ),
716*b1cdbd2cSJim Jagielski         aRangeString, aSequenceMapping, bUseColumns, bFirstCellAsLabel, bHasCategories );
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski     if( !bHasCategories && rDataOperator.setsCategories( bUseColumns ) )
719*b1cdbd2cSJim Jagielski         bHasCategories = true;
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski     aRangeString = C2U("all");
722*b1cdbd2cSJim Jagielski     uno::Sequence< beans::PropertyValue > aArguments( DataSourceHelper::createArguments(
723*b1cdbd2cSJim Jagielski             aRangeString, aSequenceMapping, bUseColumns, bFirstCellAsLabel, bHasCategories ) );
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski     // /-- locked controllers
727*b1cdbd2cSJim Jagielski     ControllerLockGuard aCtrlLockGuard( uno::Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ));
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski     // create and attach new data source
730*b1cdbd2cSJim Jagielski     switchToInternalDataProvider();
731*b1cdbd2cSJim Jagielski     rDataOperator.apply(m_xDataAccess);
732*b1cdbd2cSJim Jagielski     uno::Reference< chart2::data::XDataProvider > xDataProvider( xChartDoc->getDataProvider() );
733*b1cdbd2cSJim Jagielski     OSL_ASSERT( xDataProvider.is() );
734*b1cdbd2cSJim Jagielski     if( !xDataProvider.is() )
735*b1cdbd2cSJim Jagielski         return;
736*b1cdbd2cSJim Jagielski     uno::Reference< chart2::data::XDataSource > xSource( xDataProvider->createDataSource( aArguments ) );
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski     uno::Reference< chart2::XDiagram > xDia( xChartDoc->getFirstDiagram() );
739*b1cdbd2cSJim Jagielski     if( xDia.is() )
740*b1cdbd2cSJim Jagielski         xDia->setDiagramData( xSource, aArguments );
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski     //correct stacking mode
743*b1cdbd2cSJim Jagielski     if( bStacked || bPercent || bDeep )
744*b1cdbd2cSJim Jagielski     {
745*b1cdbd2cSJim Jagielski         StackMode eStackMode = StackMode_Y_STACKED;
746*b1cdbd2cSJim Jagielski         if( bDeep )
747*b1cdbd2cSJim Jagielski             eStackMode = StackMode_Z_STACKED;
748*b1cdbd2cSJim Jagielski         else if( bPercent )
749*b1cdbd2cSJim Jagielski             eStackMode = StackMode_Y_STACKED_PERCENT;
750*b1cdbd2cSJim Jagielski         DiagramHelper::setStackMode( xDia, eStackMode );
751*b1cdbd2cSJim Jagielski     }
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski     // notify listeners
754*b1cdbd2cSJim Jagielski     ::com::sun::star::chart::ChartDataChangeEvent aEvent(
755*b1cdbd2cSJim Jagielski         static_cast< ::cppu::OWeakObject* >( this ),
756*b1cdbd2cSJim Jagielski         ::com::sun::star::chart::ChartDataChangeType_ALL, 0, 0, 0, 0 );
757*b1cdbd2cSJim Jagielski     fireChartDataChangeEvent( aEvent );
758*b1cdbd2cSJim Jagielski     // \-- locked controllers
759*b1cdbd2cSJim Jagielski }
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------------------
762*b1cdbd2cSJim Jagielski 
getSupportedServiceNames_Static()763*b1cdbd2cSJim Jagielski uno::Sequence< ::rtl::OUString > ChartDataWrapper::getSupportedServiceNames_Static()
764*b1cdbd2cSJim Jagielski {
765*b1cdbd2cSJim Jagielski     uno::Sequence< ::rtl::OUString > aServices( 2 );
766*b1cdbd2cSJim Jagielski     aServices[ 0 ] = C2U( "com.sun.star.chart.ChartDataArray" );
767*b1cdbd2cSJim Jagielski     aServices[ 1 ] = C2U( "com.sun.star.chart.ChartData" );
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski     return aServices;
770*b1cdbd2cSJim Jagielski }
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski // ================================================================================
773*b1cdbd2cSJim Jagielski 
774*b1cdbd2cSJim Jagielski // implement XServiceInfo methods basing upon getSupportedServiceNames_Static
775*b1cdbd2cSJim Jagielski APPHELPER_XSERVICEINFO_IMPL( ChartDataWrapper, lcl_aServiceName );
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski } //  namespace wrapper
778*b1cdbd2cSJim Jagielski } //  namespace chart
779