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