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
27*b1cdbd2cSJim Jagielski #include "DialogModel.hxx"
28*b1cdbd2cSJim Jagielski #include "RangeSelectionHelper.hxx"
29*b1cdbd2cSJim Jagielski #include "PropertyHelper.hxx"
30*b1cdbd2cSJim Jagielski #include "DataSeriesHelper.hxx"
31*b1cdbd2cSJim Jagielski #include "DataSourceHelper.hxx"
32*b1cdbd2cSJim Jagielski #include "DiagramHelper.hxx"
33*b1cdbd2cSJim Jagielski #include "macros.hxx"
34*b1cdbd2cSJim Jagielski #include "Strings.hrc"
35*b1cdbd2cSJim Jagielski #include "ResId.hxx"
36*b1cdbd2cSJim Jagielski #include "ContainerHelper.hxx"
37*b1cdbd2cSJim Jagielski #include "CommonFunctors.hxx"
38*b1cdbd2cSJim Jagielski #include "ControllerLockGuard.hxx"
39*b1cdbd2cSJim Jagielski #include "ChartTypeHelper.hxx"
40*b1cdbd2cSJim Jagielski #include "ThreeDHelper.hxx"
41*b1cdbd2cSJim Jagielski
42*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloneable.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/AxisType.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XTitled.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartTypeContainer.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataSink.hpp>
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski #include <utility>
53*b1cdbd2cSJim Jagielski #include <algorithm>
54*b1cdbd2cSJim Jagielski #include <iterator>
55*b1cdbd2cSJim Jagielski #include <functional>
56*b1cdbd2cSJim Jagielski #include <numeric>
57*b1cdbd2cSJim Jagielski
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::chart2;
60*b1cdbd2cSJim Jagielski using namespace ::chart::ContainerHelper;
61*b1cdbd2cSJim Jagielski
62*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
63*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
64*b1cdbd2cSJim Jagielski using ::rtl::OUString;
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski // ----------------------------------------
67*b1cdbd2cSJim Jagielski
68*b1cdbd2cSJim Jagielski namespace
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski const OUString lcl_aLabelRole( RTL_CONSTASCII_USTRINGPARAM( "label" ));
71*b1cdbd2cSJim Jagielski
72*b1cdbd2cSJim Jagielski struct lcl_ChartTypeToSeriesCnt : ::std::unary_function<
73*b1cdbd2cSJim Jagielski Reference< XChartType >, Reference< XDataSeriesContainer > >
74*b1cdbd2cSJim Jagielski {
operator ()__anoncc6e63b90111::lcl_ChartTypeToSeriesCnt75*b1cdbd2cSJim Jagielski Reference< XDataSeriesContainer > operator() (
76*b1cdbd2cSJim Jagielski const Reference< XChartType > & xChartType )
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski return Reference< XDataSeriesContainer >::query( xChartType );
79*b1cdbd2cSJim Jagielski }
80*b1cdbd2cSJim Jagielski };
81*b1cdbd2cSJim Jagielski
lcl_ConvertRole(const OUString & rRoleString,bool bFromInternalToUI)82*b1cdbd2cSJim Jagielski OUString lcl_ConvertRole( const OUString & rRoleString, bool bFromInternalToUI )
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski OUString aResult( rRoleString );
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski typedef ::std::map< OUString, OUString > tTranslationMap;
87*b1cdbd2cSJim Jagielski static tTranslationMap aTranslationMap;
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski if( aTranslationMap.size() == 0 )
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "categories" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_CATEGORIES )));
92*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "error-bars-x" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_X_ERROR )));
93*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "error-bars-x-positive" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_X_ERROR_POSITIVE )));
94*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "error-bars-x-negative" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_X_ERROR_NEGATIVE )));
95*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "error-bars-y" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_Y_ERROR )));
96*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "error-bars-y-positive" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_Y_ERROR_POSITIVE )));
97*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "error-bars-y-negative" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_Y_ERROR_NEGATIVE )));
98*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "label" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_LABEL )));
99*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "values-first" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_FIRST )));
100*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "values-last" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_LAST )));
101*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "values-max" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_MAX )));
102*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "values-min" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_MIN )));
103*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "values-x" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_X )));
104*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "values-y" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_Y )));
105*b1cdbd2cSJim Jagielski aTranslationMap[ C2U( "values-size" ) ] = OUString( String( ::chart::SchResId( STR_DATA_ROLE_SIZE )));
106*b1cdbd2cSJim Jagielski }
107*b1cdbd2cSJim Jagielski
108*b1cdbd2cSJim Jagielski if( bFromInternalToUI )
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski tTranslationMap::const_iterator aIt( aTranslationMap.find( rRoleString ));
111*b1cdbd2cSJim Jagielski if( aIt != aTranslationMap.end())
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski aResult = (*aIt).second;
114*b1cdbd2cSJim Jagielski }
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski else
117*b1cdbd2cSJim Jagielski {
118*b1cdbd2cSJim Jagielski tTranslationMap::const_iterator aIt(
119*b1cdbd2cSJim Jagielski ::std::find_if( aTranslationMap.begin(), aTranslationMap.end(),
120*b1cdbd2cSJim Jagielski ::std::compose1( ::std::bind2nd(
121*b1cdbd2cSJim Jagielski ::std::equal_to< tTranslationMap::mapped_type >(),
122*b1cdbd2cSJim Jagielski rRoleString ),
123*b1cdbd2cSJim Jagielski ::std::select2nd< tTranslationMap::value_type >())));
124*b1cdbd2cSJim Jagielski
125*b1cdbd2cSJim Jagielski if( aIt != aTranslationMap.end())
126*b1cdbd2cSJim Jagielski aResult = (*aIt).first;
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski return aResult;
130*b1cdbd2cSJim Jagielski }
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielski typedef ::std::map< ::rtl::OUString, sal_Int32 > lcl_tRoleIndexMap;
133*b1cdbd2cSJim Jagielski
lcl_createRoleIndexMap(lcl_tRoleIndexMap & rOutMap)134*b1cdbd2cSJim Jagielski void lcl_createRoleIndexMap( lcl_tRoleIndexMap & rOutMap )
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski rOutMap.clear();
137*b1cdbd2cSJim Jagielski sal_Int32 nIndex = 0;
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski rOutMap[ C2U( "label" ) ] = ++nIndex;
140*b1cdbd2cSJim Jagielski rOutMap[ C2U( "categories" ) ] = ++nIndex;
141*b1cdbd2cSJim Jagielski rOutMap[ C2U( "values-x" ) ] = ++nIndex;
142*b1cdbd2cSJim Jagielski rOutMap[ C2U( "values-y" ) ] = ++nIndex;
143*b1cdbd2cSJim Jagielski rOutMap[ C2U( "error-bars-x" ) ] = ++nIndex;
144*b1cdbd2cSJim Jagielski rOutMap[ C2U( "error-bars-x-positive" ) ] = ++nIndex;
145*b1cdbd2cSJim Jagielski rOutMap[ C2U( "error-bars-x-negative" ) ] = ++nIndex;
146*b1cdbd2cSJim Jagielski rOutMap[ C2U( "error-bars-y" ) ] = ++nIndex;
147*b1cdbd2cSJim Jagielski rOutMap[ C2U( "error-bars-y-positive" ) ] = ++nIndex;
148*b1cdbd2cSJim Jagielski rOutMap[ C2U( "error-bars-y-negative" ) ] = ++nIndex;
149*b1cdbd2cSJim Jagielski rOutMap[ C2U( "values-first" ) ] = ++nIndex;
150*b1cdbd2cSJim Jagielski rOutMap[ C2U( "values-min" ) ] = ++nIndex;
151*b1cdbd2cSJim Jagielski rOutMap[ C2U( "values-max" ) ] = ++nIndex;
152*b1cdbd2cSJim Jagielski rOutMap[ C2U( "values-last" ) ] = ++nIndex;
153*b1cdbd2cSJim Jagielski rOutMap[ C2U( "values-size" ) ] = ++nIndex;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski struct lcl_DataSeriesContainerAppend : public
157*b1cdbd2cSJim Jagielski ::std::iterator< ::std::output_iterator_tag, Reference< XDataSeriesContainer > >
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski typedef ::std::vector< ::chart::DialogModel::tSeriesWithChartTypeByName > tContainerType;
160*b1cdbd2cSJim Jagielski
lcl_DataSeriesContainerAppend__anoncc6e63b90111::lcl_DataSeriesContainerAppend161*b1cdbd2cSJim Jagielski explicit lcl_DataSeriesContainerAppend( tContainerType & rCnt )
162*b1cdbd2cSJim Jagielski : m_rDestCnt( rCnt )
163*b1cdbd2cSJim Jagielski {}
164*b1cdbd2cSJim Jagielski
operator =__anoncc6e63b90111::lcl_DataSeriesContainerAppend165*b1cdbd2cSJim Jagielski lcl_DataSeriesContainerAppend & operator= ( const value_type & xVal )
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski try
168*b1cdbd2cSJim Jagielski {
169*b1cdbd2cSJim Jagielski if( xVal.is())
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski Sequence< Reference< XDataSeries > > aSeq( xVal->getDataSeries());
172*b1cdbd2cSJim Jagielski OUString aRole( RTL_CONSTASCII_USTRINGPARAM("values-y"));
173*b1cdbd2cSJim Jagielski Reference< XChartType > xCT( xVal, uno::UNO_QUERY );
174*b1cdbd2cSJim Jagielski if( xCT.is())
175*b1cdbd2cSJim Jagielski aRole = xCT->getRoleOfSequenceForSeriesLabel();
176*b1cdbd2cSJim Jagielski for( sal_Int32 nI = 0; nI < aSeq.getLength(); ++ nI )
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski m_rDestCnt.push_back(
179*b1cdbd2cSJim Jagielski ::chart::DialogModel::tSeriesWithChartTypeByName(
180*b1cdbd2cSJim Jagielski ::chart::DataSeriesHelper::getDataSeriesLabel( aSeq[nI], aRole ),
181*b1cdbd2cSJim Jagielski ::std::make_pair( aSeq[nI], xCT )));
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski return *this;
190*b1cdbd2cSJim Jagielski }
191*b1cdbd2cSJim Jagielski
operator *__anoncc6e63b90111::lcl_DataSeriesContainerAppend192*b1cdbd2cSJim Jagielski lcl_DataSeriesContainerAppend & operator* () { return *this; }
operator ++__anoncc6e63b90111::lcl_DataSeriesContainerAppend193*b1cdbd2cSJim Jagielski lcl_DataSeriesContainerAppend & operator++ () { return *this; }
operator ++__anoncc6e63b90111::lcl_DataSeriesContainerAppend194*b1cdbd2cSJim Jagielski lcl_DataSeriesContainerAppend & operator++ (int) { return *this; }
195*b1cdbd2cSJim Jagielski
196*b1cdbd2cSJim Jagielski private:
197*b1cdbd2cSJim Jagielski tContainerType & m_rDestCnt;
198*b1cdbd2cSJim Jagielski };
199*b1cdbd2cSJim Jagielski
200*b1cdbd2cSJim Jagielski struct lcl_RolesWithRangeAppend : public
201*b1cdbd2cSJim Jagielski ::std::iterator< ::std::output_iterator_tag, Reference< data::XLabeledDataSequence > >
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski typedef ::chart::DialogModel::tRolesWithRanges tContainerType;
204*b1cdbd2cSJim Jagielski
lcl_RolesWithRangeAppend__anoncc6e63b90111::lcl_RolesWithRangeAppend205*b1cdbd2cSJim Jagielski explicit lcl_RolesWithRangeAppend( tContainerType & rCnt,
206*b1cdbd2cSJim Jagielski const ::rtl::OUString & aLabelRole )
207*b1cdbd2cSJim Jagielski : m_rDestCnt( rCnt ),
208*b1cdbd2cSJim Jagielski m_aRoleForLabelSeq( aLabelRole )
209*b1cdbd2cSJim Jagielski {}
210*b1cdbd2cSJim Jagielski
operator =__anoncc6e63b90111::lcl_RolesWithRangeAppend211*b1cdbd2cSJim Jagielski lcl_RolesWithRangeAppend & operator= ( const value_type & xVal )
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski try
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski if( xVal.is())
216*b1cdbd2cSJim Jagielski {
217*b1cdbd2cSJim Jagielski // data sequence
218*b1cdbd2cSJim Jagielski Reference< data::XDataSequence > xSeq( xVal->getValues());
219*b1cdbd2cSJim Jagielski if( xSeq.is())
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski OUString aRole;
222*b1cdbd2cSJim Jagielski Reference< beans::XPropertySet > xProp( xSeq, uno::UNO_QUERY_THROW );
223*b1cdbd2cSJim Jagielski if( xProp->getPropertyValue( C2U("Role")) >>= aRole )
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski m_rDestCnt.insert(
226*b1cdbd2cSJim Jagielski tContainerType::value_type(
227*b1cdbd2cSJim Jagielski aRole, xSeq->getSourceRangeRepresentation()));
228*b1cdbd2cSJim Jagielski // label
229*b1cdbd2cSJim Jagielski if( aRole.equals( m_aRoleForLabelSeq ))
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski Reference< data::XDataSequence > xLabelSeq( xVal->getLabel());
232*b1cdbd2cSJim Jagielski if( xLabelSeq.is())
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski m_rDestCnt.insert(
235*b1cdbd2cSJim Jagielski tContainerType::value_type(
236*b1cdbd2cSJim Jagielski lcl_aLabelRole, xLabelSeq->getSourceRangeRepresentation()));
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski return *this;
248*b1cdbd2cSJim Jagielski }
249*b1cdbd2cSJim Jagielski
operator *__anoncc6e63b90111::lcl_RolesWithRangeAppend250*b1cdbd2cSJim Jagielski lcl_RolesWithRangeAppend & operator* () { return *this; }
operator ++__anoncc6e63b90111::lcl_RolesWithRangeAppend251*b1cdbd2cSJim Jagielski lcl_RolesWithRangeAppend & operator++ () { return *this; }
operator ++__anoncc6e63b90111::lcl_RolesWithRangeAppend252*b1cdbd2cSJim Jagielski lcl_RolesWithRangeAppend & operator++ (int) { return *this; }
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski private:
255*b1cdbd2cSJim Jagielski tContainerType & m_rDestCnt;
256*b1cdbd2cSJim Jagielski OUString m_aRoleForLabelSeq;
257*b1cdbd2cSJim Jagielski };
258*b1cdbd2cSJim Jagielski
lcl_SetSequenceRole(const Reference<data::XDataSequence> & xSeq,const OUString & rRole)259*b1cdbd2cSJim Jagielski void lcl_SetSequenceRole(
260*b1cdbd2cSJim Jagielski const Reference< data::XDataSequence > & xSeq,
261*b1cdbd2cSJim Jagielski const OUString & rRole )
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski Reference< beans::XPropertySet > xProp( xSeq, uno::UNO_QUERY );
264*b1cdbd2cSJim Jagielski if( xProp.is())
265*b1cdbd2cSJim Jagielski xProp->setPropertyValue( C2U("Role"), uno::makeAny( rRole ));
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski
lcl_CreateNewSeries(const Reference<uno::XComponentContext> & xContext,const Reference<XChartType> & xChartType,sal_Int32 nNewSeriesIndex,sal_Int32 nTotalNumberOfSeriesInCTGroup,const Reference<XDiagram> & xDiagram,const Reference<XChartTypeTemplate> & xTemplate,bool bCreateDataCachedSequences)268*b1cdbd2cSJim Jagielski Reference< XDataSeries > lcl_CreateNewSeries(
269*b1cdbd2cSJim Jagielski const Reference< uno::XComponentContext > & xContext,
270*b1cdbd2cSJim Jagielski const Reference< XChartType > & xChartType,
271*b1cdbd2cSJim Jagielski sal_Int32 nNewSeriesIndex,
272*b1cdbd2cSJim Jagielski sal_Int32 nTotalNumberOfSeriesInCTGroup,
273*b1cdbd2cSJim Jagielski const Reference< XDiagram > & xDiagram,
274*b1cdbd2cSJim Jagielski const Reference< XChartTypeTemplate > & xTemplate,
275*b1cdbd2cSJim Jagielski bool bCreateDataCachedSequences )
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski // create plain series
278*b1cdbd2cSJim Jagielski Reference< XDataSeries > xResult(
279*b1cdbd2cSJim Jagielski xContext->getServiceManager()->createInstanceWithContext(
280*b1cdbd2cSJim Jagielski C2U( "com.sun.star.chart2.DataSeries" ),
281*b1cdbd2cSJim Jagielski xContext ), uno::UNO_QUERY );
282*b1cdbd2cSJim Jagielski if( xTemplate.is())
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski Reference< beans::XPropertySet > xResultProp( xResult, uno::UNO_QUERY );
285*b1cdbd2cSJim Jagielski if( xResultProp.is())
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski // @deprecated: correct default color should be found by view
288*b1cdbd2cSJim Jagielski // without setting it as hard attribute
289*b1cdbd2cSJim Jagielski Reference< XColorScheme > xColorScheme( xDiagram->getDefaultColorScheme());
290*b1cdbd2cSJim Jagielski if( xColorScheme.is())
291*b1cdbd2cSJim Jagielski xResultProp->setPropertyValue(
292*b1cdbd2cSJim Jagielski C2U("Color"), uno::makeAny( xColorScheme->getColorByIndex( nNewSeriesIndex )));
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski sal_Int32 nGroupIndex=0;
295*b1cdbd2cSJim Jagielski if( xChartType.is())
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski Sequence< Reference< XChartType > > aCTs(
298*b1cdbd2cSJim Jagielski ::chart::DiagramHelper::getChartTypesFromDiagram( xDiagram ));
299*b1cdbd2cSJim Jagielski for( ; nGroupIndex<aCTs.getLength(); ++nGroupIndex)
300*b1cdbd2cSJim Jagielski if( aCTs[nGroupIndex] == xChartType )
301*b1cdbd2cSJim Jagielski break;
302*b1cdbd2cSJim Jagielski if( nGroupIndex == aCTs.getLength())
303*b1cdbd2cSJim Jagielski nGroupIndex = 0;
304*b1cdbd2cSJim Jagielski }
305*b1cdbd2cSJim Jagielski xTemplate->applyStyle( xResult, nGroupIndex, nNewSeriesIndex, nTotalNumberOfSeriesInCTGroup );
306*b1cdbd2cSJim Jagielski }
307*b1cdbd2cSJim Jagielski
308*b1cdbd2cSJim Jagielski if( bCreateDataCachedSequences )
309*b1cdbd2cSJim Jagielski {
310*b1cdbd2cSJim Jagielski // set chart type specific roles
311*b1cdbd2cSJim Jagielski Reference< data::XDataSink > xSink( xResult, uno::UNO_QUERY );
312*b1cdbd2cSJim Jagielski if( xChartType.is() && xSink.is())
313*b1cdbd2cSJim Jagielski {
314*b1cdbd2cSJim Jagielski ::std::vector< Reference< data::XLabeledDataSequence > > aNewSequences;
315*b1cdbd2cSJim Jagielski const OUString aRoleOfSeqForSeriesLabel = xChartType->getRoleOfSequenceForSeriesLabel();
316*b1cdbd2cSJim Jagielski const OUString aLabel( String( ::chart::SchResId( STR_DATA_UNNAMED_SERIES )));
317*b1cdbd2cSJim Jagielski const Sequence< OUString > aRoles( xChartType->getSupportedMandatoryRoles());
318*b1cdbd2cSJim Jagielski const Sequence< OUString > aOptRoles( xChartType->getSupportedOptionalRoles());
319*b1cdbd2cSJim Jagielski sal_Int32 nI = 0;
320*b1cdbd2cSJim Jagielski
321*b1cdbd2cSJim Jagielski for(nI=0; nI<aRoles.getLength(); ++nI)
322*b1cdbd2cSJim Jagielski {
323*b1cdbd2cSJim Jagielski if( aRoles[nI].equals( lcl_aLabelRole ))
324*b1cdbd2cSJim Jagielski continue;
325*b1cdbd2cSJim Jagielski Reference< data::XDataSequence > xSeq( ::chart::DataSourceHelper::createCachedDataSequence() );
326*b1cdbd2cSJim Jagielski lcl_SetSequenceRole( xSeq, aRoles[nI] );
327*b1cdbd2cSJim Jagielski // assert that aRoleOfSeqForSeriesLabel is part of the mandatory roles
328*b1cdbd2cSJim Jagielski if( aRoles[nI].equals( aRoleOfSeqForSeriesLabel ))
329*b1cdbd2cSJim Jagielski {
330*b1cdbd2cSJim Jagielski Reference< data::XDataSequence > xLabel( ::chart::DataSourceHelper::createCachedDataSequence( aLabel ));
331*b1cdbd2cSJim Jagielski lcl_SetSequenceRole( xLabel, lcl_aLabelRole );
332*b1cdbd2cSJim Jagielski aNewSequences.push_back( ::chart::DataSourceHelper::createLabeledDataSequence( xSeq, xLabel ));
333*b1cdbd2cSJim Jagielski }
334*b1cdbd2cSJim Jagielski else
335*b1cdbd2cSJim Jagielski aNewSequences.push_back( ::chart::DataSourceHelper::createLabeledDataSequence( xSeq ));
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski
338*b1cdbd2cSJim Jagielski for(nI=0; nI<aOptRoles.getLength(); ++nI)
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski if( aOptRoles[nI].equals( lcl_aLabelRole ))
341*b1cdbd2cSJim Jagielski continue;
342*b1cdbd2cSJim Jagielski Reference< data::XDataSequence > xSeq( ::chart::DataSourceHelper::createCachedDataSequence());
343*b1cdbd2cSJim Jagielski lcl_SetSequenceRole( xSeq, aOptRoles[nI] );
344*b1cdbd2cSJim Jagielski aNewSequences.push_back( ::chart::DataSourceHelper::createLabeledDataSequence( xSeq ));
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski
347*b1cdbd2cSJim Jagielski xSink->setData( ContainerToSequence( aNewSequences ));
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski
351*b1cdbd2cSJim Jagielski return xResult;
352*b1cdbd2cSJim Jagielski }
353*b1cdbd2cSJim Jagielski
354*b1cdbd2cSJim Jagielski struct lcl_addSeriesNumber : public ::std::binary_function<
355*b1cdbd2cSJim Jagielski sal_Int32, Reference< XDataSeriesContainer >, sal_Int32 >
356*b1cdbd2cSJim Jagielski {
operator ()__anoncc6e63b90111::lcl_addSeriesNumber357*b1cdbd2cSJim Jagielski sal_Int32 operator() ( sal_Int32 nCurrentNumber, const Reference< XDataSeriesContainer > & xCnt ) const
358*b1cdbd2cSJim Jagielski {
359*b1cdbd2cSJim Jagielski if( xCnt.is())
360*b1cdbd2cSJim Jagielski return nCurrentNumber + (xCnt->getDataSeries().getLength());
361*b1cdbd2cSJim Jagielski return nCurrentNumber;
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski };
364*b1cdbd2cSJim Jagielski
365*b1cdbd2cSJim Jagielski } // anonymous namespace
366*b1cdbd2cSJim Jagielski
367*b1cdbd2cSJim Jagielski // ----------------------------------------
368*b1cdbd2cSJim Jagielski
369*b1cdbd2cSJim Jagielski
370*b1cdbd2cSJim Jagielski namespace chart
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski
DialogModel(const Reference<XChartDocument> & xChartDocument,const Reference<uno::XComponentContext> & xContext)373*b1cdbd2cSJim Jagielski DialogModel::DialogModel(
374*b1cdbd2cSJim Jagielski const Reference< XChartDocument > & xChartDocument,
375*b1cdbd2cSJim Jagielski const Reference< uno::XComponentContext > & xContext ) :
376*b1cdbd2cSJim Jagielski m_xChartDocument( xChartDocument ),
377*b1cdbd2cSJim Jagielski m_xContext( xContext ),
378*b1cdbd2cSJim Jagielski m_aTimerTriggeredControllerLock( uno::Reference< frame::XModel >( m_xChartDocument, uno::UNO_QUERY ) )
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski
~DialogModel()382*b1cdbd2cSJim Jagielski DialogModel::~DialogModel()
383*b1cdbd2cSJim Jagielski {}
384*b1cdbd2cSJim Jagielski
setTemplate(const Reference<XChartTypeTemplate> & xTemplate)385*b1cdbd2cSJim Jagielski void DialogModel::setTemplate(
386*b1cdbd2cSJim Jagielski const Reference< XChartTypeTemplate > & xTemplate )
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski m_xTemplate = xTemplate;
389*b1cdbd2cSJim Jagielski }
390*b1cdbd2cSJim Jagielski
391*b1cdbd2cSJim Jagielski ::boost::shared_ptr< RangeSelectionHelper >
getRangeSelectionHelper() const392*b1cdbd2cSJim Jagielski DialogModel::getRangeSelectionHelper() const
393*b1cdbd2cSJim Jagielski {
394*b1cdbd2cSJim Jagielski if( ! m_spRangeSelectionHelper.get())
395*b1cdbd2cSJim Jagielski m_spRangeSelectionHelper.reset(
396*b1cdbd2cSJim Jagielski new RangeSelectionHelper( m_xChartDocument ));
397*b1cdbd2cSJim Jagielski
398*b1cdbd2cSJim Jagielski return m_spRangeSelectionHelper;
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski
getChartModel() const401*b1cdbd2cSJim Jagielski Reference< frame::XModel > DialogModel::getChartModel() const
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski Reference< frame::XModel > xResult( m_xChartDocument, uno::UNO_QUERY );
404*b1cdbd2cSJim Jagielski return xResult;
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski
getDataProvider() const407*b1cdbd2cSJim Jagielski Reference< data::XDataProvider > DialogModel::getDataProvider() const
408*b1cdbd2cSJim Jagielski {
409*b1cdbd2cSJim Jagielski Reference< data::XDataProvider > xResult;
410*b1cdbd2cSJim Jagielski if( m_xChartDocument.is())
411*b1cdbd2cSJim Jagielski xResult.set( m_xChartDocument->getDataProvider());
412*b1cdbd2cSJim Jagielski return xResult;
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski
415*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeriesContainer > >
getAllDataSeriesContainers() const416*b1cdbd2cSJim Jagielski DialogModel::getAllDataSeriesContainers() const
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeriesContainer > > aResult;
419*b1cdbd2cSJim Jagielski
420*b1cdbd2cSJim Jagielski try
421*b1cdbd2cSJim Jagielski {
422*b1cdbd2cSJim Jagielski Reference< XDiagram > xDiagram;
423*b1cdbd2cSJim Jagielski if( m_xChartDocument.is())
424*b1cdbd2cSJim Jagielski xDiagram.set( m_xChartDocument->getFirstDiagram());
425*b1cdbd2cSJim Jagielski if( xDiagram.is())
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski Reference< XCoordinateSystemContainer > xCooSysCnt(
428*b1cdbd2cSJim Jagielski xDiagram, uno::UNO_QUERY_THROW );
429*b1cdbd2cSJim Jagielski Sequence< Reference< XCoordinateSystem > > aCooSysSeq(
430*b1cdbd2cSJim Jagielski xCooSysCnt->getCoordinateSystems());
431*b1cdbd2cSJim Jagielski for( sal_Int32 i=0; i<aCooSysSeq.getLength(); ++i )
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski Reference< XChartTypeContainer > xCTCnt( aCooSysSeq[i], uno::UNO_QUERY_THROW );
434*b1cdbd2cSJim Jagielski Sequence< Reference< XChartType > > aChartTypeSeq( xCTCnt->getChartTypes());
435*b1cdbd2cSJim Jagielski ::std::transform(
436*b1cdbd2cSJim Jagielski aChartTypeSeq.getConstArray(), aChartTypeSeq.getConstArray() + aChartTypeSeq.getLength(),
437*b1cdbd2cSJim Jagielski ::std::back_inserter( aResult ),
438*b1cdbd2cSJim Jagielski lcl_ChartTypeToSeriesCnt() );
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski }
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
445*b1cdbd2cSJim Jagielski }
446*b1cdbd2cSJim Jagielski
447*b1cdbd2cSJim Jagielski return aResult;
448*b1cdbd2cSJim Jagielski }
449*b1cdbd2cSJim Jagielski
450*b1cdbd2cSJim Jagielski ::std::vector< DialogModel::tSeriesWithChartTypeByName >
getAllDataSeriesWithLabel() const451*b1cdbd2cSJim Jagielski DialogModel::getAllDataSeriesWithLabel() const
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski ::std::vector< tSeriesWithChartTypeByName > aResult;
454*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeriesContainer > > aContainers(
455*b1cdbd2cSJim Jagielski getAllDataSeriesContainers());
456*b1cdbd2cSJim Jagielski
457*b1cdbd2cSJim Jagielski ::std::copy( aContainers.begin(), aContainers.end(),
458*b1cdbd2cSJim Jagielski lcl_DataSeriesContainerAppend( aResult ));
459*b1cdbd2cSJim Jagielski return aResult;
460*b1cdbd2cSJim Jagielski }
461*b1cdbd2cSJim Jagielski
getRolesWithRanges(const Reference<XDataSeries> & xSeries,const::rtl::OUString & aRoleOfSequenceForLabel,const Reference<chart2::XChartType> & xChartType) const462*b1cdbd2cSJim Jagielski DialogModel::tRolesWithRanges DialogModel::getRolesWithRanges(
463*b1cdbd2cSJim Jagielski const Reference< XDataSeries > & xSeries,
464*b1cdbd2cSJim Jagielski const ::rtl::OUString & aRoleOfSequenceForLabel,
465*b1cdbd2cSJim Jagielski const Reference< chart2::XChartType > & xChartType ) const
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski DialogModel::tRolesWithRanges aResult;
468*b1cdbd2cSJim Jagielski try
469*b1cdbd2cSJim Jagielski {
470*b1cdbd2cSJim Jagielski Reference< data::XDataSource > xSource( xSeries, uno::UNO_QUERY_THROW );
471*b1cdbd2cSJim Jagielski const Sequence< Reference< data::XLabeledDataSequence > > aSeq( xSource->getDataSequences());
472*b1cdbd2cSJim Jagielski ::std::copy( aSeq.getConstArray(), aSeq.getConstArray() + aSeq.getLength(),
473*b1cdbd2cSJim Jagielski lcl_RolesWithRangeAppend( aResult, aRoleOfSequenceForLabel ));
474*b1cdbd2cSJim Jagielski if( xChartType.is())
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski // add missing mandatory roles
477*b1cdbd2cSJim Jagielski Sequence< OUString > aRoles( xChartType->getSupportedMandatoryRoles());
478*b1cdbd2cSJim Jagielski OUString aEmptyString;
479*b1cdbd2cSJim Jagielski sal_Int32 nI = 0;
480*b1cdbd2cSJim Jagielski for( nI=0; nI < aRoles.getLength(); ++nI )
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski if( aResult.find( aRoles[nI] ) == aResult.end() )
483*b1cdbd2cSJim Jagielski aResult.insert( DialogModel::tRolesWithRanges::value_type( aRoles[nI], aEmptyString ));
484*b1cdbd2cSJim Jagielski }
485*b1cdbd2cSJim Jagielski
486*b1cdbd2cSJim Jagielski // add missing optional roles
487*b1cdbd2cSJim Jagielski aRoles = xChartType->getSupportedOptionalRoles();
488*b1cdbd2cSJim Jagielski for( nI=0; nI < aRoles.getLength(); ++nI )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski if( aResult.find( aRoles[nI] ) == aResult.end() )
491*b1cdbd2cSJim Jagielski aResult.insert( DialogModel::tRolesWithRanges::value_type( aRoles[nI], aEmptyString ));
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski }
494*b1cdbd2cSJim Jagielski }
495*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
498*b1cdbd2cSJim Jagielski }
499*b1cdbd2cSJim Jagielski return aResult;
500*b1cdbd2cSJim Jagielski }
501*b1cdbd2cSJim Jagielski
moveSeries(const Reference<XDataSeries> & xSeries,eMoveDirection eDirection)502*b1cdbd2cSJim Jagielski void DialogModel::moveSeries(
503*b1cdbd2cSJim Jagielski const Reference< XDataSeries > & xSeries,
504*b1cdbd2cSJim Jagielski eMoveDirection eDirection )
505*b1cdbd2cSJim Jagielski {
506*b1cdbd2cSJim Jagielski m_aTimerTriggeredControllerLock.startTimer();
507*b1cdbd2cSJim Jagielski ControllerLockGuard aLockedControllers( Reference< frame::XModel >( m_xChartDocument, uno::UNO_QUERY ) );
508*b1cdbd2cSJim Jagielski
509*b1cdbd2cSJim Jagielski Reference< XDiagram > xDiagram( m_xChartDocument->getFirstDiagram());
510*b1cdbd2cSJim Jagielski DiagramHelper::moveSeries( xDiagram, xSeries, eDirection==MOVE_UP );
511*b1cdbd2cSJim Jagielski }
512*b1cdbd2cSJim Jagielski
insertSeriesAfter(const Reference<XDataSeries> & xSeries,const Reference<XChartType> & xChartType,bool bCreateDataCachedSequences)513*b1cdbd2cSJim Jagielski Reference< chart2::XDataSeries > DialogModel::insertSeriesAfter(
514*b1cdbd2cSJim Jagielski const Reference< XDataSeries > & xSeries,
515*b1cdbd2cSJim Jagielski const Reference< XChartType > & xChartType,
516*b1cdbd2cSJim Jagielski bool bCreateDataCachedSequences /* = false */ )
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski m_aTimerTriggeredControllerLock.startTimer();
519*b1cdbd2cSJim Jagielski ControllerLockGuard aLockedControllers( Reference< frame::XModel >( m_xChartDocument, uno::UNO_QUERY ) );
520*b1cdbd2cSJim Jagielski Reference< XDataSeries > xNewSeries;
521*b1cdbd2cSJim Jagielski
522*b1cdbd2cSJim Jagielski try
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski Reference< chart2::XDiagram > xDiagram( m_xChartDocument->getFirstDiagram() );
525*b1cdbd2cSJim Jagielski ThreeDLookScheme e3DScheme = ThreeDHelper::detectScheme( xDiagram );
526*b1cdbd2cSJim Jagielski
527*b1cdbd2cSJim Jagielski sal_Int32 nSeriesInChartType = 0;
528*b1cdbd2cSJim Jagielski const sal_Int32 nTotalSeries = countSeries();
529*b1cdbd2cSJim Jagielski if( xChartType.is())
530*b1cdbd2cSJim Jagielski {
531*b1cdbd2cSJim Jagielski Reference< XDataSeriesContainer > xCnt( xChartType, uno::UNO_QUERY_THROW );
532*b1cdbd2cSJim Jagielski nSeriesInChartType = xCnt->getDataSeries().getLength();
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski
535*b1cdbd2cSJim Jagielski // create new series
536*b1cdbd2cSJim Jagielski xNewSeries.set(
537*b1cdbd2cSJim Jagielski lcl_CreateNewSeries(
538*b1cdbd2cSJim Jagielski m_xContext,
539*b1cdbd2cSJim Jagielski xChartType,
540*b1cdbd2cSJim Jagielski nTotalSeries, // new series' index
541*b1cdbd2cSJim Jagielski nSeriesInChartType,
542*b1cdbd2cSJim Jagielski xDiagram,
543*b1cdbd2cSJim Jagielski m_xTemplate,
544*b1cdbd2cSJim Jagielski bCreateDataCachedSequences ));
545*b1cdbd2cSJim Jagielski
546*b1cdbd2cSJim Jagielski // add new series to container
547*b1cdbd2cSJim Jagielski if( xNewSeries.is())
548*b1cdbd2cSJim Jagielski {
549*b1cdbd2cSJim Jagielski Reference< XDataSeriesContainer > xSeriesCnt( xChartType, uno::UNO_QUERY_THROW );
550*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeries > > aSeries(
551*b1cdbd2cSJim Jagielski SequenceToVector( xSeriesCnt->getDataSeries()));
552*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeries > >::iterator aIt =
553*b1cdbd2cSJim Jagielski ::std::find( aSeries.begin(), aSeries.end(), xSeries );
554*b1cdbd2cSJim Jagielski if( aIt == aSeries.end())
555*b1cdbd2cSJim Jagielski // if we have no series we insert at the first position.
556*b1cdbd2cSJim Jagielski aIt = aSeries.begin();
557*b1cdbd2cSJim Jagielski else
558*b1cdbd2cSJim Jagielski // vector::insert inserts before, so we have to advance
559*b1cdbd2cSJim Jagielski ++aIt;
560*b1cdbd2cSJim Jagielski aSeries.insert( aIt, xNewSeries );
561*b1cdbd2cSJim Jagielski xSeriesCnt->setDataSeries( ContainerToSequence( aSeries ));
562*b1cdbd2cSJim Jagielski }
563*b1cdbd2cSJim Jagielski
564*b1cdbd2cSJim Jagielski ThreeDHelper::setScheme( xDiagram, e3DScheme );
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
567*b1cdbd2cSJim Jagielski {
568*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
569*b1cdbd2cSJim Jagielski }
570*b1cdbd2cSJim Jagielski return xNewSeries;
571*b1cdbd2cSJim Jagielski }
572*b1cdbd2cSJim Jagielski
deleteSeries(const Reference<XDataSeries> & xSeries,const Reference<XChartType> & xChartType)573*b1cdbd2cSJim Jagielski void DialogModel::deleteSeries(
574*b1cdbd2cSJim Jagielski const Reference< XDataSeries > & xSeries,
575*b1cdbd2cSJim Jagielski const Reference< XChartType > & xChartType )
576*b1cdbd2cSJim Jagielski {
577*b1cdbd2cSJim Jagielski m_aTimerTriggeredControllerLock.startTimer();
578*b1cdbd2cSJim Jagielski ControllerLockGuard aLockedControllers( Reference< frame::XModel >( m_xChartDocument, uno::UNO_QUERY ) );
579*b1cdbd2cSJim Jagielski
580*b1cdbd2cSJim Jagielski DataSeriesHelper::deleteSeries( xSeries, xChartType );
581*b1cdbd2cSJim Jagielski }
582*b1cdbd2cSJim Jagielski
getCategories() const583*b1cdbd2cSJim Jagielski Reference< data::XLabeledDataSequence > DialogModel::getCategories() const
584*b1cdbd2cSJim Jagielski {
585*b1cdbd2cSJim Jagielski Reference< data::XLabeledDataSequence > xResult;
586*b1cdbd2cSJim Jagielski try
587*b1cdbd2cSJim Jagielski {
588*b1cdbd2cSJim Jagielski if( m_xChartDocument.is())
589*b1cdbd2cSJim Jagielski {
590*b1cdbd2cSJim Jagielski Reference< chart2::XDiagram > xDiagram( m_xChartDocument->getFirstDiagram());
591*b1cdbd2cSJim Jagielski xResult.set( DiagramHelper::getCategoriesFromDiagram( xDiagram ));
592*b1cdbd2cSJim Jagielski }
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
595*b1cdbd2cSJim Jagielski {
596*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
597*b1cdbd2cSJim Jagielski }
598*b1cdbd2cSJim Jagielski return xResult;
599*b1cdbd2cSJim Jagielski }
600*b1cdbd2cSJim Jagielski
setCategories(const Reference<chart2::data::XLabeledDataSequence> & xCategories)601*b1cdbd2cSJim Jagielski void DialogModel::setCategories( const Reference< chart2::data::XLabeledDataSequence > & xCategories )
602*b1cdbd2cSJim Jagielski {
603*b1cdbd2cSJim Jagielski if( m_xChartDocument.is())
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski Reference< chart2::XDiagram > xDiagram( m_xChartDocument->getFirstDiagram());
606*b1cdbd2cSJim Jagielski if( xDiagram.is())
607*b1cdbd2cSJim Jagielski {
608*b1cdbd2cSJim Jagielski // categories
609*b1cdbd2cSJim Jagielski bool bSupportsCategories = true;
610*b1cdbd2cSJim Jagielski
611*b1cdbd2cSJim Jagielski Reference< XChartType > xFirstChartType( DiagramHelper::getChartTypeByIndex( xDiagram, 0 ) );
612*b1cdbd2cSJim Jagielski if( xFirstChartType.is() )
613*b1cdbd2cSJim Jagielski {
614*b1cdbd2cSJim Jagielski sal_Int32 nAxisType = ChartTypeHelper::getAxisType( xFirstChartType, 0 ); // x-axis
615*b1cdbd2cSJim Jagielski bSupportsCategories = (nAxisType == AxisType::CATEGORY);
616*b1cdbd2cSJim Jagielski }
617*b1cdbd2cSJim Jagielski DiagramHelper::setCategoriesToDiagram( xCategories, xDiagram, true, bSupportsCategories );
618*b1cdbd2cSJim Jagielski }
619*b1cdbd2cSJim Jagielski }
620*b1cdbd2cSJim Jagielski }
621*b1cdbd2cSJim Jagielski
getCategoriesRange() const622*b1cdbd2cSJim Jagielski OUString DialogModel::getCategoriesRange() const
623*b1cdbd2cSJim Jagielski {
624*b1cdbd2cSJim Jagielski Reference< data::XLabeledDataSequence > xLSeq( getCategories());
625*b1cdbd2cSJim Jagielski OUString aRange;
626*b1cdbd2cSJim Jagielski if( xLSeq.is())
627*b1cdbd2cSJim Jagielski {
628*b1cdbd2cSJim Jagielski Reference< data::XDataSequence > xSeq( xLSeq->getValues());
629*b1cdbd2cSJim Jagielski if( xSeq.is())
630*b1cdbd2cSJim Jagielski aRange = xSeq->getSourceRangeRepresentation();
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski return aRange;
633*b1cdbd2cSJim Jagielski }
634*b1cdbd2cSJim Jagielski
isCategoryDiagram() const635*b1cdbd2cSJim Jagielski bool DialogModel::isCategoryDiagram() const
636*b1cdbd2cSJim Jagielski {
637*b1cdbd2cSJim Jagielski bool bRet = false;
638*b1cdbd2cSJim Jagielski if( m_xChartDocument.is())
639*b1cdbd2cSJim Jagielski bRet = DiagramHelper::isCategoryDiagram( m_xChartDocument->getFirstDiagram() );
640*b1cdbd2cSJim Jagielski return bRet;
641*b1cdbd2cSJim Jagielski }
642*b1cdbd2cSJim Jagielski
detectArguments(OUString & rOutRangeString,bool & rOutUseColumns,bool & rOutFirstCellAsLabel,bool & rOutHasCategories) const643*b1cdbd2cSJim Jagielski void DialogModel::detectArguments(
644*b1cdbd2cSJim Jagielski OUString & rOutRangeString,
645*b1cdbd2cSJim Jagielski bool & rOutUseColumns,
646*b1cdbd2cSJim Jagielski bool & rOutFirstCellAsLabel,
647*b1cdbd2cSJim Jagielski bool & rOutHasCategories ) const
648*b1cdbd2cSJim Jagielski {
649*b1cdbd2cSJim Jagielski try
650*b1cdbd2cSJim Jagielski {
651*b1cdbd2cSJim Jagielski uno::Sequence< sal_Int32 > aSequenceMapping;//todo YYYX
652*b1cdbd2cSJim Jagielski
653*b1cdbd2cSJim Jagielski // Note: unused data is currently not supported in being passed to detectRangeSegmentation
654*b1cdbd2cSJim Jagielski if( m_xChartDocument.is())
655*b1cdbd2cSJim Jagielski DataSourceHelper::detectRangeSegmentation(
656*b1cdbd2cSJim Jagielski Reference< frame::XModel >( m_xChartDocument, uno::UNO_QUERY_THROW ),
657*b1cdbd2cSJim Jagielski rOutRangeString, aSequenceMapping, rOutUseColumns, rOutFirstCellAsLabel, rOutHasCategories );
658*b1cdbd2cSJim Jagielski }
659*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
660*b1cdbd2cSJim Jagielski {
661*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski }
664*b1cdbd2cSJim Jagielski
allArgumentsForRectRangeDetected() const665*b1cdbd2cSJim Jagielski bool DialogModel::allArgumentsForRectRangeDetected() const
666*b1cdbd2cSJim Jagielski {
667*b1cdbd2cSJim Jagielski return DataSourceHelper::allArgumentsForRectRangeDetected( m_xChartDocument );
668*b1cdbd2cSJim Jagielski }
669*b1cdbd2cSJim Jagielski
startControllerLockTimer()670*b1cdbd2cSJim Jagielski void DialogModel::startControllerLockTimer()
671*b1cdbd2cSJim Jagielski {
672*b1cdbd2cSJim Jagielski m_aTimerTriggeredControllerLock.startTimer();
673*b1cdbd2cSJim Jagielski }
674*b1cdbd2cSJim Jagielski
setData(const Sequence<beans::PropertyValue> & rArguments)675*b1cdbd2cSJim Jagielski bool DialogModel::setData(
676*b1cdbd2cSJim Jagielski const Sequence< beans::PropertyValue > & rArguments )
677*b1cdbd2cSJim Jagielski {
678*b1cdbd2cSJim Jagielski m_aTimerTriggeredControllerLock.startTimer();
679*b1cdbd2cSJim Jagielski ControllerLockGuard aLockedControllers( Reference< frame::XModel >( m_xChartDocument, uno::UNO_QUERY ) );
680*b1cdbd2cSJim Jagielski
681*b1cdbd2cSJim Jagielski Reference< data::XDataProvider > xDataProvider( getDataProvider());
682*b1cdbd2cSJim Jagielski if( ! xDataProvider.is() ||
683*b1cdbd2cSJim Jagielski ! m_xTemplate.is() )
684*b1cdbd2cSJim Jagielski {
685*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "Model objects missing" );
686*b1cdbd2cSJim Jagielski return false;
687*b1cdbd2cSJim Jagielski }
688*b1cdbd2cSJim Jagielski
689*b1cdbd2cSJim Jagielski try
690*b1cdbd2cSJim Jagielski {
691*b1cdbd2cSJim Jagielski Reference< chart2::data::XDataSource > xDataSource(
692*b1cdbd2cSJim Jagielski xDataProvider->createDataSource( rArguments ) );
693*b1cdbd2cSJim Jagielski
694*b1cdbd2cSJim Jagielski Reference< chart2::XDataInterpreter > xInterpreter(
695*b1cdbd2cSJim Jagielski m_xTemplate->getDataInterpreter());
696*b1cdbd2cSJim Jagielski if( xInterpreter.is())
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski Reference< chart2::XDiagram > xDiagram( m_xChartDocument->getFirstDiagram() );
699*b1cdbd2cSJim Jagielski ThreeDLookScheme e3DScheme = ThreeDHelper::detectScheme( xDiagram );
700*b1cdbd2cSJim Jagielski
701*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeries > > aSeriesToReUse(
702*b1cdbd2cSJim Jagielski DiagramHelper::getDataSeriesFromDiagram( xDiagram ));
703*b1cdbd2cSJim Jagielski applyInterpretedData(
704*b1cdbd2cSJim Jagielski xInterpreter->interpretDataSource(
705*b1cdbd2cSJim Jagielski xDataSource, rArguments,
706*b1cdbd2cSJim Jagielski ContainerToSequence( aSeriesToReUse )),
707*b1cdbd2cSJim Jagielski aSeriesToReUse,
708*b1cdbd2cSJim Jagielski true /* bSetStyles */);
709*b1cdbd2cSJim Jagielski
710*b1cdbd2cSJim Jagielski ThreeDHelper::setScheme( xDiagram, e3DScheme );
711*b1cdbd2cSJim Jagielski }
712*b1cdbd2cSJim Jagielski }
713*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
716*b1cdbd2cSJim Jagielski return false;
717*b1cdbd2cSJim Jagielski }
718*b1cdbd2cSJim Jagielski
719*b1cdbd2cSJim Jagielski return true;
720*b1cdbd2cSJim Jagielski }
721*b1cdbd2cSJim Jagielski
ConvertRoleFromInternalToUI(const OUString & rRoleString)722*b1cdbd2cSJim Jagielski OUString DialogModel::ConvertRoleFromInternalToUI( const OUString & rRoleString )
723*b1cdbd2cSJim Jagielski {
724*b1cdbd2cSJim Jagielski return lcl_ConvertRole( rRoleString, true );
725*b1cdbd2cSJim Jagielski }
726*b1cdbd2cSJim Jagielski
GetRoleDataLabel()727*b1cdbd2cSJim Jagielski OUString DialogModel::GetRoleDataLabel()
728*b1cdbd2cSJim Jagielski {
729*b1cdbd2cSJim Jagielski return OUString( String( ::chart::SchResId( STR_OBJECT_DATALABELS )));
730*b1cdbd2cSJim Jagielski }
731*b1cdbd2cSJim Jagielski
GetRoleIndexForSorting(const::rtl::OUString & rInternalRoleString)732*b1cdbd2cSJim Jagielski sal_Int32 DialogModel::GetRoleIndexForSorting( const ::rtl::OUString & rInternalRoleString )
733*b1cdbd2cSJim Jagielski {
734*b1cdbd2cSJim Jagielski static lcl_tRoleIndexMap aRoleIndexMap;
735*b1cdbd2cSJim Jagielski
736*b1cdbd2cSJim Jagielski if( aRoleIndexMap.empty())
737*b1cdbd2cSJim Jagielski lcl_createRoleIndexMap( aRoleIndexMap );
738*b1cdbd2cSJim Jagielski
739*b1cdbd2cSJim Jagielski lcl_tRoleIndexMap::const_iterator aIt( aRoleIndexMap.find( rInternalRoleString ));
740*b1cdbd2cSJim Jagielski if( aIt != aRoleIndexMap.end())
741*b1cdbd2cSJim Jagielski return aIt->second;
742*b1cdbd2cSJim Jagielski
743*b1cdbd2cSJim Jagielski return 0;
744*b1cdbd2cSJim Jagielski }
745*b1cdbd2cSJim Jagielski
746*b1cdbd2cSJim Jagielski // private methods
747*b1cdbd2cSJim Jagielski
applyInterpretedData(const InterpretedData & rNewData,const::std::vector<Reference<XDataSeries>> & rSeriesToReUse,bool bSetStyles)748*b1cdbd2cSJim Jagielski void DialogModel::applyInterpretedData(
749*b1cdbd2cSJim Jagielski const InterpretedData & rNewData,
750*b1cdbd2cSJim Jagielski const ::std::vector< Reference< XDataSeries > > & rSeriesToReUse,
751*b1cdbd2cSJim Jagielski bool bSetStyles )
752*b1cdbd2cSJim Jagielski {
753*b1cdbd2cSJim Jagielski if( ! m_xChartDocument.is())
754*b1cdbd2cSJim Jagielski return;
755*b1cdbd2cSJim Jagielski
756*b1cdbd2cSJim Jagielski m_aTimerTriggeredControllerLock.startTimer();
757*b1cdbd2cSJim Jagielski Reference< XDiagram > xDiagram( m_xChartDocument->getFirstDiagram());
758*b1cdbd2cSJim Jagielski if( xDiagram.is())
759*b1cdbd2cSJim Jagielski {
760*b1cdbd2cSJim Jagielski // styles
761*b1cdbd2cSJim Jagielski if( bSetStyles && m_xTemplate.is() )
762*b1cdbd2cSJim Jagielski {
763*b1cdbd2cSJim Jagielski sal_Int32 nGroup = 0;
764*b1cdbd2cSJim Jagielski sal_Int32 nSeriesCounter = 0;
765*b1cdbd2cSJim Jagielski sal_Int32 nNewSeriesIndex = static_cast< sal_Int32 >( rSeriesToReUse.size());
766*b1cdbd2cSJim Jagielski const sal_Int32 nOuterSize=rNewData.Series.getLength();
767*b1cdbd2cSJim Jagielski
768*b1cdbd2cSJim Jagielski for(; nGroup < nOuterSize; ++nGroup)
769*b1cdbd2cSJim Jagielski {
770*b1cdbd2cSJim Jagielski Sequence< Reference< XDataSeries > > aSeries( rNewData.Series[ nGroup ] );
771*b1cdbd2cSJim Jagielski const sal_Int32 nSeriesInGroup = aSeries.getLength();
772*b1cdbd2cSJim Jagielski for( sal_Int32 nSeries=0; nSeries<nSeriesInGroup; ++nSeries, ++nSeriesCounter )
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski if( ::std::find( rSeriesToReUse.begin(), rSeriesToReUse.end(), aSeries[nSeries] )
775*b1cdbd2cSJim Jagielski == rSeriesToReUse.end())
776*b1cdbd2cSJim Jagielski {
777*b1cdbd2cSJim Jagielski Reference< beans::XPropertySet > xSeriesProp( aSeries[nSeries], uno::UNO_QUERY );
778*b1cdbd2cSJim Jagielski if( xSeriesProp.is())
779*b1cdbd2cSJim Jagielski {
780*b1cdbd2cSJim Jagielski // @deprecated: correct default color should be found by view
781*b1cdbd2cSJim Jagielski // without setting it as hard attribute
782*b1cdbd2cSJim Jagielski Reference< XColorScheme > xColorScheme( xDiagram->getDefaultColorScheme());
783*b1cdbd2cSJim Jagielski if( xColorScheme.is())
784*b1cdbd2cSJim Jagielski xSeriesProp->setPropertyValue(
785*b1cdbd2cSJim Jagielski C2U("Color"), uno::makeAny( xColorScheme->getColorByIndex( nSeriesCounter )));
786*b1cdbd2cSJim Jagielski }
787*b1cdbd2cSJim Jagielski m_xTemplate->applyStyle( aSeries[nSeries], nGroup, nNewSeriesIndex++, nSeriesInGroup );
788*b1cdbd2cSJim Jagielski }
789*b1cdbd2cSJim Jagielski }
790*b1cdbd2cSJim Jagielski }
791*b1cdbd2cSJim Jagielski }
792*b1cdbd2cSJim Jagielski
793*b1cdbd2cSJim Jagielski // data series
794*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeriesContainer > > aSeriesCnt( getAllDataSeriesContainers());
795*b1cdbd2cSJim Jagielski ::std::vector< Sequence< Reference< XDataSeries > > > aNewSeries(
796*b1cdbd2cSJim Jagielski SequenceToVector( rNewData.Series ));
797*b1cdbd2cSJim Jagielski
798*b1cdbd2cSJim Jagielski OSL_ASSERT( aSeriesCnt.size() == aNewSeries.size());
799*b1cdbd2cSJim Jagielski
800*b1cdbd2cSJim Jagielski ::std::vector< Sequence< Reference< XDataSeries > > >::const_iterator aSrcIt( aNewSeries.begin());
801*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeriesContainer > >::iterator aDestIt( aSeriesCnt.begin());
802*b1cdbd2cSJim Jagielski for(; aSrcIt != aNewSeries.end() && aDestIt != aSeriesCnt.end();
803*b1cdbd2cSJim Jagielski ++aSrcIt, ++aDestIt )
804*b1cdbd2cSJim Jagielski {
805*b1cdbd2cSJim Jagielski try
806*b1cdbd2cSJim Jagielski {
807*b1cdbd2cSJim Jagielski OSL_ASSERT( (*aDestIt).is());
808*b1cdbd2cSJim Jagielski (*aDestIt)->setDataSeries( *aSrcIt );
809*b1cdbd2cSJim Jagielski }
810*b1cdbd2cSJim Jagielski catch( uno::Exception & ex )
811*b1cdbd2cSJim Jagielski {
812*b1cdbd2cSJim Jagielski ASSERT_EXCEPTION( ex );
813*b1cdbd2cSJim Jagielski }
814*b1cdbd2cSJim Jagielski }
815*b1cdbd2cSJim Jagielski
816*b1cdbd2cSJim Jagielski DialogModel::setCategories(rNewData.Categories);
817*b1cdbd2cSJim Jagielski }
818*b1cdbd2cSJim Jagielski }
819*b1cdbd2cSJim Jagielski
countSeries() const820*b1cdbd2cSJim Jagielski sal_Int32 DialogModel::countSeries() const
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski ::std::vector< Reference< XDataSeriesContainer > > aCnt( getAllDataSeriesContainers());
823*b1cdbd2cSJim Jagielski return ::std::accumulate( aCnt.begin(), aCnt.end(), 0, lcl_addSeriesNumber());
824*b1cdbd2cSJim Jagielski }
825*b1cdbd2cSJim Jagielski
826*b1cdbd2cSJim Jagielski } // namespace chart
827