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