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_xmloff.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <xmloff/xmlprmap.hxx>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "SchXMLExport.hxx"
30*b1cdbd2cSJim Jagielski #include "XMLChartPropertySetMapper.hxx"
31*b1cdbd2cSJim Jagielski #include "SchXMLSeriesHelper.hxx"
32*b1cdbd2cSJim Jagielski #include "ColorPropertySet.hxx"
33*b1cdbd2cSJim Jagielski #include "SchXMLTools.hxx"
34*b1cdbd2cSJim Jagielski #include "SchXMLEnumConverter.hxx"
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
37*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
38*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
39*b1cdbd2cSJim Jagielski #include <tools/globname.hxx>
40*b1cdbd2cSJim Jagielski #include <sot/clsids.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
43*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
44*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
45*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx>
46*b1cdbd2cSJim Jagielski #include <xmloff/xmlaustp.hxx>
47*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
48*b1cdbd2cSJim Jagielski #include <xmloff/xmlmetae.hxx>
49*b1cdbd2cSJim Jagielski #include "xexptran.hxx"
50*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
51*b1cdbd2cSJim Jagielski // header for any2enum
52*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include <list>
55*b1cdbd2cSJim Jagielski #include <typeinfo>
56*b1cdbd2cSJim Jagielski #include <algorithm>
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XStatusIndicatorSupplier.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceName.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XRefreshable.hpp>
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XAxis.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XAxisSupplier.hpp>
67*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XChartDocument.hpp>
68*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartLegendPosition.hpp>
69*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartLegendExpansion.hpp>
70*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartDataRowSource.hpp>
71*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartAxisAssign.hpp>
72*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartAxisType.hpp>
73*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/TimeIncrement.hpp>
74*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/TimeInterval.hpp>
75*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/TimeUnit.hpp>
76*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartSeriesAddress.hpp>
77*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/X3DDisplay.hpp>
78*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XStatisticDisplay.hpp>
79*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XSecondAxisTitleSupplier.hpp>
80*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XDiagramPositioning.hpp>
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XAnyDescriptionAccess.hpp>
83*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/AxisType.hpp>
84*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartDocument.hpp>
85*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDiagram.hpp>
86*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/RelativePosition.hpp>
87*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
88*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
89*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartTypeContainer.hpp>
90*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
91*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataSource.hpp>
92*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataSink.hpp>
93*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataReceiver.hpp>
94*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataProvider.hpp>
95*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDatabaseDataProvider.hpp>
96*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
97*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XTextualDataSequence.hpp>
98*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XStringMapping.hpp>
101*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/HomogenMatrix.hpp>
102*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
103*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XShapes.hpp>
104*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/Aspects.hpp>
105*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/XVisualObject.hpp>
106*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski #include "MultiPropertySetHandler.hxx"
110*b1cdbd2cSJim Jagielski #include "PropertyMap.hxx"
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski using namespace com::sun::star;
113*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski using ::rtl::OUString;
116*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
117*b1cdbd2cSJim Jagielski using ::rtl::OUStringToOString;
118*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
119*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
120*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any;
121*b1cdbd2cSJim Jagielski using ::std::vector;
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski // ========================================
124*b1cdbd2cSJim Jagielski // class SchXMLExportHelper_Impl
125*b1cdbd2cSJim Jagielski // ========================================
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski class SchXMLExportHelper_Impl
128*b1cdbd2cSJim Jagielski {
129*b1cdbd2cSJim Jagielski public:
130*b1cdbd2cSJim Jagielski     // first: data sequence for label, second: data sequence for values.
131*b1cdbd2cSJim Jagielski     typedef ::std::pair< ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence >,
132*b1cdbd2cSJim Jagielski             ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > > tLabelValuesDataPair;
133*b1cdbd2cSJim Jagielski     typedef ::std::vector< tLabelValuesDataPair > tDataSequenceCont;
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski public:
136*b1cdbd2cSJim Jagielski 	SchXMLExportHelper_Impl( SvXMLExport& rExport,
137*b1cdbd2cSJim Jagielski 						SvXMLAutoStylePoolP& rASPool );
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski     virtual ~SchXMLExportHelper_Impl();
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski     // auto-styles
142*b1cdbd2cSJim Jagielski 	/// parse chart and collect all auto-styles used in current pool
143*b1cdbd2cSJim Jagielski 	void collectAutoStyles( com::sun::star::uno::Reference<
144*b1cdbd2cSJim Jagielski 							com::sun::star::chart::XChartDocument > rChartDoc );
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski     /// write the styles collected into the current pool as <style:style> elements
147*b1cdbd2cSJim Jagielski 	void exportAutoStyles();
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski     /** export the <chart:chart> element corresponding to rChartDoc
150*b1cdbd2cSJim Jagielski 		if bIncludeTable is true, the chart data is exported as <table:table>
151*b1cdbd2cSJim Jagielski 		element (inside the chart element).
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 		Otherwise the external references stored in the chart document are used
154*b1cdbd2cSJim Jagielski 		for writing the corresponding attributes at series
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 		All attributes contained in xAttrList are written at the chart element,
157*b1cdbd2cSJim Jagielski 		which ist the outer element of a chart. So these attributes can easily
158*b1cdbd2cSJim Jagielski 		be parsed again by the container
159*b1cdbd2cSJim Jagielski 	 */
160*b1cdbd2cSJim Jagielski 	void exportChart( com::sun::star::uno::Reference<
161*b1cdbd2cSJim Jagielski 					  	com::sun::star::chart::XChartDocument > rChartDoc,
162*b1cdbd2cSJim Jagielski 					  sal_Bool bIncludeTable );
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski     UniReference< XMLPropertySetMapper > GetPropertySetMapper() const;
165*b1cdbd2cSJim Jagielski 
SetChartRangeAddress(const::rtl::OUString & rAddress)166*b1cdbd2cSJim Jagielski     void SetChartRangeAddress( const ::rtl::OUString& rAddress )
167*b1cdbd2cSJim Jagielski         { msChartAddress = rAddress; }
SetTableNumberList(const::rtl::OUString & rList)168*b1cdbd2cSJim Jagielski     void SetTableNumberList( const ::rtl::OUString& rList )
169*b1cdbd2cSJim Jagielski         { msTableNumberList = rList; }
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski     void InitRangeSegmentationProperties(
172*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
173*b1cdbd2cSJim Jagielski             ::com::sun::star::chart2::XChartDocument > & xChartDoc );
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski     ::com::sun::star::awt::Size getPageSize(
176*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
177*b1cdbd2cSJim Jagielski             ::com::sun::star::chart2::XChartDocument > & xChartDoc ) const;
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski     /** first parseDocument: collect autostyles and store names in this queue
180*b1cdbd2cSJim Jagielski         second parseDocument: export content and use names from this queue
181*b1cdbd2cSJim Jagielski      */
182*b1cdbd2cSJim Jagielski     ::std::queue< ::rtl::OUString > maAutoStyleNameQueue;
183*b1cdbd2cSJim Jagielski     void CollectAutoStyle(
184*b1cdbd2cSJim Jagielski         const std::vector< XMLPropertyState >& aStates );
185*b1cdbd2cSJim Jagielski     void AddAutoStyleAttribute(
186*b1cdbd2cSJim Jagielski         const std::vector< XMLPropertyState >& aStates );
187*b1cdbd2cSJim Jagielski 
GetAutoStylePoolP()188*b1cdbd2cSJim Jagielski     SvXMLAutoStylePoolP& GetAutoStylePoolP()
189*b1cdbd2cSJim Jagielski     { return mrAutoStylePool; }
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	/// if bExportContent is false the auto-styles are collected
192*b1cdbd2cSJim Jagielski 	void parseDocument( com::sun::star::uno::Reference<
193*b1cdbd2cSJim Jagielski 							com::sun::star::chart::XChartDocument >& rChartDoc,
194*b1cdbd2cSJim Jagielski 						sal_Bool bExportContent,
195*b1cdbd2cSJim Jagielski 						sal_Bool bIncludeTable = sal_False );
196*b1cdbd2cSJim Jagielski 	void exportTable();
197*b1cdbd2cSJim Jagielski 	void exportPlotArea(
198*b1cdbd2cSJim Jagielski         com::sun::star::uno::Reference< com::sun::star::chart::XDiagram > xDiagram,
199*b1cdbd2cSJim Jagielski         com::sun::star::uno::Reference< com::sun::star::chart2::XDiagram > xNewDiagram,
200*b1cdbd2cSJim Jagielski         const ::com::sun::star::awt::Size & rPageSize,
201*b1cdbd2cSJim Jagielski         sal_Bool bExportContent,
202*b1cdbd2cSJim Jagielski         sal_Bool bIncludeTable );
203*b1cdbd2cSJim Jagielski     void exportCoordinateRegion( const com::sun::star::uno::Reference< com::sun::star::chart::XDiagram >& xDiagram );
204*b1cdbd2cSJim Jagielski 	void exportAxes( const com::sun::star::uno::Reference< com::sun::star::chart::XDiagram > & xDiagram,
205*b1cdbd2cSJim Jagielski                                     const com::sun::star::uno::Reference< com::sun::star::chart2::XDiagram > & xNewDiagram,
206*b1cdbd2cSJim Jagielski                                     sal_Bool bExportContent );
207*b1cdbd2cSJim Jagielski     void exportAxis( enum XMLTokenEnum eDimension, enum XMLTokenEnum eAxisName,
208*b1cdbd2cSJim Jagielski                     const Reference< beans::XPropertySet > xAxisProps, const Reference< chart2::XAxis >& xChart2Axis,
209*b1cdbd2cSJim Jagielski                     const OUString& rCategoriesRanges,
210*b1cdbd2cSJim Jagielski                     bool bHasTitle, bool bHasMajorGrid, bool bHasMinorGrid, bool bExportContent );
211*b1cdbd2cSJim Jagielski     void exportGrid( const Reference< beans::XPropertySet > xGridProperties, bool bMajor, bool bExportContent );
212*b1cdbd2cSJim Jagielski     void exportDateScale( const Reference< beans::XPropertySet > xAxisProps );
213*b1cdbd2cSJim Jagielski     void exportAxisTitle( const Reference< beans::XPropertySet > xTitleProps, bool bExportContent );
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	void exportSeries(
216*b1cdbd2cSJim Jagielski         const com::sun::star::uno::Reference< com::sun::star::chart2::XDiagram > & xNewDiagram,
217*b1cdbd2cSJim Jagielski         const ::com::sun::star::awt::Size & rPageSize,
218*b1cdbd2cSJim Jagielski         sal_Bool bExportContent,
219*b1cdbd2cSJim Jagielski         sal_Bool bHasTwoYAxes );
220*b1cdbd2cSJim Jagielski     void exportCandleStickSeries(
221*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Sequence<
222*b1cdbd2cSJim Jagielski             ::com::sun::star::uno::Reference<
223*b1cdbd2cSJim Jagielski                 ::com::sun::star::chart2::XDataSeries > > & aSeriesSeq,
224*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
225*b1cdbd2cSJim Jagielski             ::com::sun::star::chart2::XDiagram > & xDiagram,
226*b1cdbd2cSJim Jagielski         sal_Bool bJapaneseCandleSticks,
227*b1cdbd2cSJim Jagielski         sal_Bool bExportContent );
228*b1cdbd2cSJim Jagielski     void exportDataPoints(
229*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
230*b1cdbd2cSJim Jagielski             ::com::sun::star::beans::XPropertySet > & xSeriesProperties,
231*b1cdbd2cSJim Jagielski         sal_Int32 nSeriesLength,
232*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
233*b1cdbd2cSJim Jagielski             ::com::sun::star::chart2::XDiagram > & xDiagram,
234*b1cdbd2cSJim Jagielski         sal_Bool bExportContent );
235*b1cdbd2cSJim Jagielski     void exportRegressionCurve(
236*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
237*b1cdbd2cSJim Jagielski             ::com::sun::star::chart2::XDataSeries > & xSeries,
238*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference<
239*b1cdbd2cSJim Jagielski             ::com::sun::star::beans::XPropertySet > & xSeriesProp,
240*b1cdbd2cSJim Jagielski         const ::com::sun::star::awt::Size & rPageSize,
241*b1cdbd2cSJim Jagielski         sal_Bool bExportContent );
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski 	/// add svg position as attribute for current element
244*b1cdbd2cSJim Jagielski     void addPosition( const ::com::sun::star::awt::Point & rPosition );
245*b1cdbd2cSJim Jagielski 	void addPosition( com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xShape );
246*b1cdbd2cSJim Jagielski 	/// add svg size as attribute for current element
247*b1cdbd2cSJim Jagielski     void addSize( const ::com::sun::star::awt::Size & rSize, bool bIsOOoNamespace = false );
248*b1cdbd2cSJim Jagielski     void addSize( com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xShape, bool bIsOOoNamespace = false  );
249*b1cdbd2cSJim Jagielski 	/// fills the member msString with the appropriate String (i.e. "A3")
250*b1cdbd2cSJim Jagielski 	void getCellAddress( sal_Int32 nCol, sal_Int32 nRow );
251*b1cdbd2cSJim Jagielski     /// exports a string as a paragraph element
252*b1cdbd2cSJim Jagielski     void exportText( const ::rtl::OUString& rText, bool bConvertTabsLFs = false );
253*b1cdbd2cSJim Jagielski     void exportErrorBarRanges();
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski     SchXMLExportHelper_Impl(SchXMLExportHelper_Impl &); // not defined
256*b1cdbd2cSJim Jagielski     void operator =(SchXMLExportHelper_Impl &); // not defined
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski public:
259*b1cdbd2cSJim Jagielski 	SvXMLExport& mrExport;
260*b1cdbd2cSJim Jagielski 	SvXMLAutoStylePoolP& mrAutoStylePool;
261*b1cdbd2cSJim Jagielski 	UniReference< XMLPropertyHandlerFactory > mxPropertyHandlerFactory;
262*b1cdbd2cSJim Jagielski 	UniReference< XMLPropertySetMapper > mxPropertySetMapper;
263*b1cdbd2cSJim Jagielski 	UniReference< XMLChartExportPropertyMapper > mxExpPropMapper;
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 	rtl::OUString msTableName;
266*b1cdbd2cSJim Jagielski 	rtl::OUStringBuffer msStringBuffer;
267*b1cdbd2cSJim Jagielski 	rtl::OUString msString;
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski     // members filled by InitRangeSegmentationProperties (retrieved from DataProvider)
270*b1cdbd2cSJim Jagielski 	sal_Bool mbHasSeriesLabels;
271*b1cdbd2cSJim Jagielski 	sal_Bool mbHasCategoryLabels; //if the categories are only automatically generated this will be false
272*b1cdbd2cSJim Jagielski 	sal_Bool mbRowSourceColumns;
273*b1cdbd2cSJim Jagielski 	rtl::OUString msChartAddress;
274*b1cdbd2cSJim Jagielski 	rtl::OUString msTableNumberList;
275*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Sequence< sal_Int32 > maSequenceMapping;
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 	rtl::OUString msCLSID;
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > mxAdditionalShapes;
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski     tDataSequenceCont m_aDataSequencesToExport;
282*b1cdbd2cSJim Jagielski     rtl::OUString maCategoriesRange;
283*b1cdbd2cSJim Jagielski };
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski namespace
286*b1cdbd2cSJim Jagielski {
lcl_getComponentContext()287*b1cdbd2cSJim Jagielski Reference< uno::XComponentContext > lcl_getComponentContext()
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski     Reference< uno::XComponentContext > xContext;
290*b1cdbd2cSJim Jagielski     try
291*b1cdbd2cSJim Jagielski     {
292*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xFactProp( comphelper::getProcessServiceFactory(), uno::UNO_QUERY );
293*b1cdbd2cSJim Jagielski         if( xFactProp.is())
294*b1cdbd2cSJim Jagielski             xFactProp->getPropertyValue(OUString::createFromAscii("DefaultContext")) >>= xContext;
295*b1cdbd2cSJim Jagielski     }
296*b1cdbd2cSJim Jagielski     catch( uno::Exception& )
297*b1cdbd2cSJim Jagielski     {}
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski     return xContext;
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski class lcl_MatchesRole : public ::std::unary_function< Reference< chart2::data::XLabeledDataSequence >, bool >
303*b1cdbd2cSJim Jagielski {
304*b1cdbd2cSJim Jagielski public:
lcl_MatchesRole(const OUString & aRole)305*b1cdbd2cSJim Jagielski     explicit lcl_MatchesRole( const OUString & aRole ) :
306*b1cdbd2cSJim Jagielski             m_aRole( aRole )
307*b1cdbd2cSJim Jagielski     {}
308*b1cdbd2cSJim Jagielski 
operator ()(const Reference<chart2::data::XLabeledDataSequence> & xSeq) const309*b1cdbd2cSJim Jagielski     bool operator () ( const Reference< chart2::data::XLabeledDataSequence > & xSeq ) const
310*b1cdbd2cSJim Jagielski     {
311*b1cdbd2cSJim Jagielski         if( !xSeq.is() )
312*b1cdbd2cSJim Jagielski             return  false;
313*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xProp( xSeq->getValues(), uno::UNO_QUERY );
314*b1cdbd2cSJim Jagielski         OUString aRole;
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski         return ( xProp.is() &&
317*b1cdbd2cSJim Jagielski                  (xProp->getPropertyValue(
318*b1cdbd2cSJim Jagielski                      OUString( RTL_CONSTASCII_USTRINGPARAM( "Role" )) ) >>= aRole ) &&
319*b1cdbd2cSJim Jagielski                  m_aRole.equals( aRole ));
320*b1cdbd2cSJim Jagielski     }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski private:
323*b1cdbd2cSJim Jagielski     OUString m_aRole;
324*b1cdbd2cSJim Jagielski };
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski template< typename T >
lcl_SequenceToVectorAppend(const Sequence<T> & rSource,::std::vector<T> & rDestination)327*b1cdbd2cSJim Jagielski     void lcl_SequenceToVectorAppend( const Sequence< T > & rSource, ::std::vector< T > & rDestination )
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski     rDestination.reserve( rDestination.size() + rSource.getLength());
330*b1cdbd2cSJim Jagielski     ::std::copy( rSource.getConstArray(), rSource.getConstArray() + rSource.getLength(),
331*b1cdbd2cSJim Jagielski                  ::std::back_inserter( rDestination ));
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski template< typename T >
lcl_SequenceToVector(const Sequence<T> & rSource,::std::vector<T> & rDestination)335*b1cdbd2cSJim Jagielski     void lcl_SequenceToVector( const Sequence< T > & rSource, ::std::vector< T > & rDestination )
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski     rDestination.clear();
338*b1cdbd2cSJim Jagielski     lcl_SequenceToVectorAppend( rSource, rDestination );
339*b1cdbd2cSJim Jagielski }
340*b1cdbd2cSJim Jagielski 
lcl_getCategories(const Reference<chart2::XDiagram> & xDiagram)341*b1cdbd2cSJim Jagielski Reference< chart2::data::XLabeledDataSequence > lcl_getCategories( const Reference< chart2::XDiagram > & xDiagram )
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski     Reference< chart2::data::XLabeledDataSequence >  xResult;
344*b1cdbd2cSJim Jagielski     try
345*b1cdbd2cSJim Jagielski     {
346*b1cdbd2cSJim Jagielski         Reference< chart2::XCoordinateSystemContainer > xCooSysCnt(
347*b1cdbd2cSJim Jagielski             xDiagram, uno::UNO_QUERY_THROW );
348*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq(
349*b1cdbd2cSJim Jagielski             xCooSysCnt->getCoordinateSystems());
350*b1cdbd2cSJim Jagielski         for( sal_Int32 i=0; i<aCooSysSeq.getLength(); ++i )
351*b1cdbd2cSJim Jagielski         {
352*b1cdbd2cSJim Jagielski             Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[i] );
353*b1cdbd2cSJim Jagielski             OSL_ASSERT( xCooSys.is());
354*b1cdbd2cSJim Jagielski             for( sal_Int32 nN = xCooSys->getDimension(); nN--; )
355*b1cdbd2cSJim Jagielski             {
356*b1cdbd2cSJim Jagielski                 const sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nN);
357*b1cdbd2cSJim Jagielski                 for(sal_Int32 nI=0; nI<=nMaxAxisIndex; ++nI)
358*b1cdbd2cSJim Jagielski                 {
359*b1cdbd2cSJim Jagielski                     Reference< chart2::XAxis > xAxis = xCooSys->getAxisByDimension( nN, nI );
360*b1cdbd2cSJim Jagielski                     OSL_ASSERT( xAxis.is());
361*b1cdbd2cSJim Jagielski                     if( xAxis.is())
362*b1cdbd2cSJim Jagielski                     {
363*b1cdbd2cSJim Jagielski                         chart2::ScaleData aScaleData = xAxis->getScaleData();
364*b1cdbd2cSJim Jagielski                         if( aScaleData.Categories.is())
365*b1cdbd2cSJim Jagielski                         {
366*b1cdbd2cSJim Jagielski                             xResult.set( aScaleData.Categories );
367*b1cdbd2cSJim Jagielski                             break;
368*b1cdbd2cSJim Jagielski                         }
369*b1cdbd2cSJim Jagielski                     }
370*b1cdbd2cSJim Jagielski                 }
371*b1cdbd2cSJim Jagielski             }
372*b1cdbd2cSJim Jagielski         }
373*b1cdbd2cSJim Jagielski     }
374*b1cdbd2cSJim Jagielski     catch( uno::Exception & ex )
375*b1cdbd2cSJim Jagielski     {
376*b1cdbd2cSJim Jagielski         (void)ex; // avoid warning for pro build
377*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, OUStringToOString(
378*b1cdbd2cSJim Jagielski                         OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught. Type: " )) +
379*b1cdbd2cSJim Jagielski                         OUString::createFromAscii( typeid( ex ).name()) +
380*b1cdbd2cSJim Jagielski                         OUString( RTL_CONSTASCII_USTRINGPARAM( ", Message: " )) +
381*b1cdbd2cSJim Jagielski                         ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
382*b1cdbd2cSJim Jagielski     }
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     return xResult;
385*b1cdbd2cSJim Jagielski }
386*b1cdbd2cSJim Jagielski 
lcl_createDataSource(const Sequence<Reference<chart2::data::XLabeledDataSequence>> & aData)387*b1cdbd2cSJim Jagielski Reference< chart2::data::XDataSource > lcl_createDataSource(
388*b1cdbd2cSJim Jagielski     const Sequence< Reference< chart2::data::XLabeledDataSequence > > & aData )
389*b1cdbd2cSJim Jagielski {
390*b1cdbd2cSJim Jagielski     Reference< chart2::data::XDataSink > xSink;
391*b1cdbd2cSJim Jagielski     Reference< uno::XComponentContext > xContext( lcl_getComponentContext());
392*b1cdbd2cSJim Jagielski     if( xContext.is() )
393*b1cdbd2cSJim Jagielski         xSink.set(
394*b1cdbd2cSJim Jagielski             xContext->getServiceManager()->createInstanceWithContext(
395*b1cdbd2cSJim Jagielski                 OUString::createFromAscii("com.sun.star.chart2.data.DataSource"),
396*b1cdbd2cSJim Jagielski                 xContext ), uno::UNO_QUERY_THROW );
397*b1cdbd2cSJim Jagielski     if( xSink.is())
398*b1cdbd2cSJim Jagielski         xSink->setData( aData );
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski     return Reference< chart2::data::XDataSource >( xSink, uno::UNO_QUERY );
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski 
lcl_getAllSeriesSequences(const Reference<chart2::XChartDocument> & xChartDoc)403*b1cdbd2cSJim Jagielski Sequence< Reference< chart2::data::XLabeledDataSequence > > lcl_getAllSeriesSequences( const Reference< chart2::XChartDocument >& xChartDoc )
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski     ::std::vector< Reference< chart2::data::XLabeledDataSequence > > aContainer;
406*b1cdbd2cSJim Jagielski     if( xChartDoc.is() )
407*b1cdbd2cSJim Jagielski     {
408*b1cdbd2cSJim Jagielski         Reference< chart2::XDiagram > xDiagram( xChartDoc->getFirstDiagram());
409*b1cdbd2cSJim Jagielski         ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector( SchXMLSeriesHelper::getDataSeriesFromDiagram( xDiagram ));
410*b1cdbd2cSJim Jagielski         for( ::std::vector< Reference< chart2::XDataSeries > >::const_iterator aSeriesIt( aSeriesVector.begin() )
411*b1cdbd2cSJim Jagielski             ; aSeriesIt != aSeriesVector.end(); ++aSeriesIt )
412*b1cdbd2cSJim Jagielski         {
413*b1cdbd2cSJim Jagielski             Reference< chart2::data::XDataSource > xDataSource( *aSeriesIt, uno::UNO_QUERY );
414*b1cdbd2cSJim Jagielski             if( !xDataSource.is() )
415*b1cdbd2cSJim Jagielski                 continue;
416*b1cdbd2cSJim Jagielski             uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > aDataSequences( xDataSource->getDataSequences() );
417*b1cdbd2cSJim Jagielski             lcl_SequenceToVectorAppend( aDataSequences, aContainer );
418*b1cdbd2cSJim Jagielski         }
419*b1cdbd2cSJim Jagielski     }
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski     Sequence< Reference< chart2::data::XLabeledDataSequence > > aRet( aContainer.size());
422*b1cdbd2cSJim Jagielski     ::std::copy( aContainer.begin(), aContainer.end(), aRet.getArray());
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski     return aRet;
425*b1cdbd2cSJim Jagielski }
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski Reference< chart2::data::XLabeledDataSequence >
lcl_getDataSequenceByRole(const Sequence<Reference<chart2::data::XLabeledDataSequence>> & aLabeledSeq,const OUString & rRole)428*b1cdbd2cSJim Jagielski     lcl_getDataSequenceByRole(
429*b1cdbd2cSJim Jagielski         const Sequence< Reference< chart2::data::XLabeledDataSequence > > & aLabeledSeq,
430*b1cdbd2cSJim Jagielski         const OUString & rRole )
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski     Reference< chart2::data::XLabeledDataSequence > aNoResult;
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski     const Reference< chart2::data::XLabeledDataSequence > * pBegin = aLabeledSeq.getConstArray();
435*b1cdbd2cSJim Jagielski     const Reference< chart2::data::XLabeledDataSequence > * pEnd = pBegin + aLabeledSeq.getLength();
436*b1cdbd2cSJim Jagielski     const Reference< chart2::data::XLabeledDataSequence > * pMatch =
437*b1cdbd2cSJim Jagielski         ::std::find_if( pBegin, pEnd, lcl_MatchesRole( rRole ));
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski     if( pMatch != pEnd )
440*b1cdbd2cSJim Jagielski         return *pMatch;
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski     return aNoResult;
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski 
lcl_pressUsedDataIntoRectangularFormat(const Reference<chart2::XChartDocument> & xChartDoc,sal_Bool & rOutSourceHasCategoryLabels)445*b1cdbd2cSJim Jagielski Reference< chart2::data::XDataSource > lcl_pressUsedDataIntoRectangularFormat( const Reference< chart2::XChartDocument >& xChartDoc, sal_Bool& rOutSourceHasCategoryLabels )
446*b1cdbd2cSJim Jagielski {
447*b1cdbd2cSJim Jagielski     ::std::vector< Reference< chart2::data::XLabeledDataSequence > > aLabeledSeqVector;
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski     //categories are always the first sequence
450*b1cdbd2cSJim Jagielski     Reference< chart2::XDiagram > xDiagram( xChartDoc->getFirstDiagram());
451*b1cdbd2cSJim Jagielski     Reference< chart2::data::XLabeledDataSequence > xCategories( lcl_getCategories( xDiagram ) );
452*b1cdbd2cSJim Jagielski     if( xCategories.is() )
453*b1cdbd2cSJim Jagielski         aLabeledSeqVector.push_back( xCategories );
454*b1cdbd2cSJim Jagielski     rOutSourceHasCategoryLabels = sal_Bool(xCategories.is());
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski     Sequence< Reference< chart2::data::XLabeledDataSequence > > aSeriesSeqVector(
457*b1cdbd2cSJim Jagielski             lcl_getAllSeriesSequences( xChartDoc ) );
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski     //the first x-values is always the next sequence //todo ... other x-values get lost for old format
460*b1cdbd2cSJim Jagielski     Reference< chart2::data::XLabeledDataSequence > xXValues(
461*b1cdbd2cSJim Jagielski         lcl_getDataSequenceByRole( aSeriesSeqVector, OUString::createFromAscii("values-x" ) ) );
462*b1cdbd2cSJim Jagielski     if( xXValues.is() )
463*b1cdbd2cSJim Jagielski         aLabeledSeqVector.push_back( xXValues );
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski     //add all other sequences now without x-values
466*b1cdbd2cSJim Jagielski     lcl_MatchesRole aHasXValues( OUString::createFromAscii("values-x" ) );
467*b1cdbd2cSJim Jagielski     for( sal_Int32 nN=0; nN<aSeriesSeqVector.getLength(); nN++ )
468*b1cdbd2cSJim Jagielski     {
469*b1cdbd2cSJim Jagielski         if( !aHasXValues( aSeriesSeqVector[nN] ) )
470*b1cdbd2cSJim Jagielski             aLabeledSeqVector.push_back( aSeriesSeqVector[nN] );
471*b1cdbd2cSJim Jagielski     }
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski     Sequence< Reference< chart2::data::XLabeledDataSequence > > aSeq( aLabeledSeqVector.size() );
474*b1cdbd2cSJim Jagielski     ::std::copy( aLabeledSeqVector.begin(), aLabeledSeqVector.end(), aSeq.getArray() );
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski     return lcl_createDataSource( aSeq );
477*b1cdbd2cSJim Jagielski }
478*b1cdbd2cSJim Jagielski 
lcl_isSeriesAttachedToFirstAxis(const Reference<chart2::XDataSeries> & xDataSeries)479*b1cdbd2cSJim Jagielski bool lcl_isSeriesAttachedToFirstAxis(
480*b1cdbd2cSJim Jagielski     const Reference< chart2::XDataSeries > & xDataSeries )
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski     bool bResult=true;
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski     try
485*b1cdbd2cSJim Jagielski     {
486*b1cdbd2cSJim Jagielski         sal_Int32 nAxisIndex = 0;
487*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xProp( xDataSeries, uno::UNO_QUERY_THROW );
488*b1cdbd2cSJim Jagielski         if( xProp.is() )
489*b1cdbd2cSJim Jagielski             xProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("AttachedAxisIndex") ) ) >>= nAxisIndex;
490*b1cdbd2cSJim Jagielski         bResult = (0==nAxisIndex);
491*b1cdbd2cSJim Jagielski     }
492*b1cdbd2cSJim Jagielski     catch( uno::Exception & ex )
493*b1cdbd2cSJim Jagielski     {
494*b1cdbd2cSJim Jagielski         (void)ex; // avoid warning for pro build
495*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, OUStringToOString(
496*b1cdbd2cSJim Jagielski                         OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught. Type: " )) +
497*b1cdbd2cSJim Jagielski                         OUString::createFromAscii( typeid( ex ).name()) +
498*b1cdbd2cSJim Jagielski                         OUString( RTL_CONSTASCII_USTRINGPARAM( ", Message: " )) +
499*b1cdbd2cSJim Jagielski                         ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
500*b1cdbd2cSJim Jagielski     }
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski     return bResult;
503*b1cdbd2cSJim Jagielski }
504*b1cdbd2cSJim Jagielski 
lcl_ConvertRange(const::rtl::OUString & rRange,const Reference<chart2::XChartDocument> & xDoc)505*b1cdbd2cSJim Jagielski OUString lcl_ConvertRange( const ::rtl::OUString & rRange, const Reference< chart2::XChartDocument > & xDoc )
506*b1cdbd2cSJim Jagielski {
507*b1cdbd2cSJim Jagielski     OUString aResult = rRange;
508*b1cdbd2cSJim Jagielski     if( !xDoc.is() )
509*b1cdbd2cSJim Jagielski         return aResult;
510*b1cdbd2cSJim Jagielski     Reference< chart2::data::XRangeXMLConversion > xConversion(
511*b1cdbd2cSJim Jagielski         xDoc->getDataProvider(), uno::UNO_QUERY );
512*b1cdbd2cSJim Jagielski     if( xConversion.is())
513*b1cdbd2cSJim Jagielski         aResult = xConversion->convertRangeToXML( rRange );
514*b1cdbd2cSJim Jagielski     return aResult;
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski typedef ::std::pair< OUString, OUString > tLabelAndValueRange;
518*b1cdbd2cSJim Jagielski 
lcl_getLabelAndValueRangeByRole(const Sequence<Reference<chart2::data::XLabeledDataSequence>> & aSeqCnt,const OUString & rRole,const Reference<chart2::XChartDocument> & xDoc,SchXMLExportHelper_Impl::tDataSequenceCont & rOutSequencesToExport)519*b1cdbd2cSJim Jagielski tLabelAndValueRange lcl_getLabelAndValueRangeByRole(
520*b1cdbd2cSJim Jagielski     const Sequence< Reference< chart2::data::XLabeledDataSequence > > & aSeqCnt,
521*b1cdbd2cSJim Jagielski     const OUString & rRole,
522*b1cdbd2cSJim Jagielski     const Reference< chart2::XChartDocument > & xDoc,
523*b1cdbd2cSJim Jagielski     SchXMLExportHelper_Impl::tDataSequenceCont & rOutSequencesToExport )
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski     tLabelAndValueRange aResult;
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski     Reference< chart2::data::XLabeledDataSequence > xLabeledSeq(
528*b1cdbd2cSJim Jagielski         lcl_getDataSequenceByRole( aSeqCnt, rRole ));
529*b1cdbd2cSJim Jagielski     if( xLabeledSeq.is())
530*b1cdbd2cSJim Jagielski     {
531*b1cdbd2cSJim Jagielski         Reference< chart2::data::XDataSequence > xLabelSeq( xLabeledSeq->getLabel());
532*b1cdbd2cSJim Jagielski         if( xLabelSeq.is())
533*b1cdbd2cSJim Jagielski             aResult.first = lcl_ConvertRange( xLabelSeq->getSourceRangeRepresentation(), xDoc );
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski         Reference< chart2::data::XDataSequence > xValueSeq( xLabeledSeq->getValues());
536*b1cdbd2cSJim Jagielski         if( xValueSeq.is())
537*b1cdbd2cSJim Jagielski             aResult.second = lcl_ConvertRange( xValueSeq->getSourceRangeRepresentation(), xDoc );
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski         if( xLabelSeq.is() || xValueSeq.is())
540*b1cdbd2cSJim Jagielski             rOutSequencesToExport.push_back( SchXMLExportHelper_Impl::tLabelValuesDataPair( xLabelSeq, xValueSeq ));
541*b1cdbd2cSJim Jagielski     }
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski     return aResult;
544*b1cdbd2cSJim Jagielski }
545*b1cdbd2cSJim Jagielski 
lcl_getSequenceLengthByRole(const Sequence<Reference<chart2::data::XLabeledDataSequence>> & aSeqCnt,const OUString & rRole)546*b1cdbd2cSJim Jagielski sal_Int32 lcl_getSequenceLengthByRole(
547*b1cdbd2cSJim Jagielski     const Sequence< Reference< chart2::data::XLabeledDataSequence > > & aSeqCnt,
548*b1cdbd2cSJim Jagielski     const OUString & rRole )
549*b1cdbd2cSJim Jagielski {
550*b1cdbd2cSJim Jagielski     Reference< chart2::data::XLabeledDataSequence > xLabeledSeq(
551*b1cdbd2cSJim Jagielski         lcl_getDataSequenceByRole( aSeqCnt, rRole ));
552*b1cdbd2cSJim Jagielski     if( xLabeledSeq.is())
553*b1cdbd2cSJim Jagielski     {
554*b1cdbd2cSJim Jagielski         Reference< chart2::data::XDataSequence > xSeq( xLabeledSeq->getValues());
555*b1cdbd2cSJim Jagielski         return xSeq->getData().getLength();
556*b1cdbd2cSJim Jagielski     }
557*b1cdbd2cSJim Jagielski     return 0;
558*b1cdbd2cSJim Jagielski }
559*b1cdbd2cSJim Jagielski 
lcl_hasChartType(const Reference<chart2::XDiagram> & xDiagram,const OUString & rChartType)560*b1cdbd2cSJim Jagielski bool lcl_hasChartType( const Reference< chart2::XDiagram > & xDiagram, const OUString & rChartType )
561*b1cdbd2cSJim Jagielski {
562*b1cdbd2cSJim Jagielski     try
563*b1cdbd2cSJim Jagielski     {
564*b1cdbd2cSJim Jagielski         Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
565*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
566*b1cdbd2cSJim Jagielski         for( sal_Int32 nCooSysIdx=0; nCooSysIdx<aCooSysSeq.getLength(); ++nCooSysIdx )
567*b1cdbd2cSJim Jagielski         {
568*b1cdbd2cSJim Jagielski             Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nCooSysIdx], uno::UNO_QUERY_THROW );
569*b1cdbd2cSJim Jagielski             Sequence< Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
570*b1cdbd2cSJim Jagielski             for( sal_Int32 nCTIdx=0; nCTIdx<aChartTypes.getLength(); ++nCTIdx )
571*b1cdbd2cSJim Jagielski             {
572*b1cdbd2cSJim Jagielski                 if( aChartTypes[nCTIdx]->getChartType().equals( rChartType ))
573*b1cdbd2cSJim Jagielski                     return true;
574*b1cdbd2cSJim Jagielski             }
575*b1cdbd2cSJim Jagielski         }
576*b1cdbd2cSJim Jagielski     }
577*b1cdbd2cSJim Jagielski     catch( uno::Exception & )
578*b1cdbd2cSJim Jagielski     {
579*b1cdbd2cSJim Jagielski         DBG_ERROR( "Exception while searching for chart type in diagram" );
580*b1cdbd2cSJim Jagielski     }
581*b1cdbd2cSJim Jagielski     return false;
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski 
lcl_flattenStringSequence(const Sequence<OUString> & rSequence)584*b1cdbd2cSJim Jagielski OUString lcl_flattenStringSequence( const Sequence< OUString > & rSequence )
585*b1cdbd2cSJim Jagielski {
586*b1cdbd2cSJim Jagielski     OUStringBuffer aResult;
587*b1cdbd2cSJim Jagielski     bool bPrecedeWithSpace = false;
588*b1cdbd2cSJim Jagielski     for( sal_Int32 nIndex=0; nIndex<rSequence.getLength(); ++nIndex )
589*b1cdbd2cSJim Jagielski     {
590*b1cdbd2cSJim Jagielski         if( rSequence[nIndex].getLength())
591*b1cdbd2cSJim Jagielski         {
592*b1cdbd2cSJim Jagielski             if( bPrecedeWithSpace )
593*b1cdbd2cSJim Jagielski                 aResult.append( static_cast< sal_Unicode >( ' ' ));
594*b1cdbd2cSJim Jagielski             aResult.append( rSequence[nIndex] );
595*b1cdbd2cSJim Jagielski             bPrecedeWithSpace = true;
596*b1cdbd2cSJim Jagielski         }
597*b1cdbd2cSJim Jagielski     }
598*b1cdbd2cSJim Jagielski     return aResult.makeStringAndClear();
599*b1cdbd2cSJim Jagielski }
600*b1cdbd2cSJim Jagielski 
lcl_getLabelStringSequence(Sequence<OUString> & rOutLabels,const Reference<chart2::data::XDataSequence> & xLabelSeq)601*b1cdbd2cSJim Jagielski void lcl_getLabelStringSequence( Sequence< OUString >& rOutLabels, const Reference< chart2::data::XDataSequence > & xLabelSeq )
602*b1cdbd2cSJim Jagielski {
603*b1cdbd2cSJim Jagielski     uno::Reference< chart2::data::XTextualDataSequence > xTextualDataSequence( xLabelSeq, uno::UNO_QUERY );
604*b1cdbd2cSJim Jagielski     if( xTextualDataSequence.is())
605*b1cdbd2cSJim Jagielski     {
606*b1cdbd2cSJim Jagielski         rOutLabels = xTextualDataSequence->getTextualData();
607*b1cdbd2cSJim Jagielski     }
608*b1cdbd2cSJim Jagielski     else if( xLabelSeq.is())
609*b1cdbd2cSJim Jagielski     {
610*b1cdbd2cSJim Jagielski         Sequence< uno::Any > aAnies( xLabelSeq->getData());
611*b1cdbd2cSJim Jagielski         rOutLabels.realloc( aAnies.getLength());
612*b1cdbd2cSJim Jagielski         for( sal_Int32 i=0; i<aAnies.getLength(); ++i )
613*b1cdbd2cSJim Jagielski             aAnies[i] >>= rOutLabels[i];
614*b1cdbd2cSJim Jagielski     }
615*b1cdbd2cSJim Jagielski }
616*b1cdbd2cSJim Jagielski 
lcl_getMaxSequenceLength(const SchXMLExportHelper_Impl::tDataSequenceCont & rContainer)617*b1cdbd2cSJim Jagielski sal_Int32 lcl_getMaxSequenceLength(
618*b1cdbd2cSJim Jagielski     const SchXMLExportHelper_Impl::tDataSequenceCont & rContainer )
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski     sal_Int32 nResult = 0;
621*b1cdbd2cSJim Jagielski     for( SchXMLExportHelper_Impl::tDataSequenceCont::const_iterator aIt( rContainer.begin());
622*b1cdbd2cSJim Jagielski          aIt != rContainer.end(); ++aIt )
623*b1cdbd2cSJim Jagielski     {
624*b1cdbd2cSJim Jagielski         if( aIt->second.is())
625*b1cdbd2cSJim Jagielski         {
626*b1cdbd2cSJim Jagielski             sal_Int32 nSeqLength = aIt->second->getData().getLength();
627*b1cdbd2cSJim Jagielski             if( nSeqLength > nResult )
628*b1cdbd2cSJim Jagielski                 nResult = nSeqLength;
629*b1cdbd2cSJim Jagielski         }
630*b1cdbd2cSJim Jagielski     }
631*b1cdbd2cSJim Jagielski     return nResult;
632*b1cdbd2cSJim Jagielski }
633*b1cdbd2cSJim Jagielski 
lcl_DataSequenceToStringSequence(const uno::Reference<chart2::data::XDataSequence> & xDataSequence)634*b1cdbd2cSJim Jagielski uno::Sequence< rtl::OUString > lcl_DataSequenceToStringSequence(
635*b1cdbd2cSJim Jagielski     const uno::Reference< chart2::data::XDataSequence >& xDataSequence )
636*b1cdbd2cSJim Jagielski {
637*b1cdbd2cSJim Jagielski     uno::Sequence< rtl::OUString > aResult;
638*b1cdbd2cSJim Jagielski     if(!xDataSequence.is())
639*b1cdbd2cSJim Jagielski         return aResult;
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski     uno::Reference< chart2::data::XTextualDataSequence > xTextualDataSequence( xDataSequence, uno::UNO_QUERY );
642*b1cdbd2cSJim Jagielski     if( xTextualDataSequence.is() )
643*b1cdbd2cSJim Jagielski     {
644*b1cdbd2cSJim Jagielski         aResult = xTextualDataSequence->getTextualData();
645*b1cdbd2cSJim Jagielski     }
646*b1cdbd2cSJim Jagielski     else
647*b1cdbd2cSJim Jagielski     {
648*b1cdbd2cSJim Jagielski         uno::Sequence< uno::Any > aValues = xDataSequence->getData();
649*b1cdbd2cSJim Jagielski         aResult.realloc(aValues.getLength());
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski         for(sal_Int32 nN=aValues.getLength();nN--;)
652*b1cdbd2cSJim Jagielski             aValues[nN] >>= aResult[nN];
653*b1cdbd2cSJim Jagielski     }
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski     return aResult;
656*b1cdbd2cSJim Jagielski }
lcl_getAllValuesFromSequence(const Reference<chart2::data::XDataSequence> & xSeq)657*b1cdbd2cSJim Jagielski ::std::vector< double > lcl_getAllValuesFromSequence( const Reference< chart2::data::XDataSequence > & xSeq )
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski     double fNan = 0.0;
660*b1cdbd2cSJim Jagielski     ::rtl::math::setNan( &fNan );
661*b1cdbd2cSJim Jagielski     ::std::vector< double > aResult;
662*b1cdbd2cSJim Jagielski     if(!xSeq.is())
663*b1cdbd2cSJim Jagielski         return aResult;
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski     uno::Sequence< double > aValuesSequence;
666*b1cdbd2cSJim Jagielski     Reference< chart2::data::XNumericalDataSequence > xNumSeq( xSeq, uno::UNO_QUERY );
667*b1cdbd2cSJim Jagielski     if( xNumSeq.is() )
668*b1cdbd2cSJim Jagielski     {
669*b1cdbd2cSJim Jagielski         aValuesSequence = xNumSeq->getNumericalData();
670*b1cdbd2cSJim Jagielski     }
671*b1cdbd2cSJim Jagielski     else
672*b1cdbd2cSJim Jagielski     {
673*b1cdbd2cSJim Jagielski         Sequence< uno::Any > aAnies( xSeq->getData() );
674*b1cdbd2cSJim Jagielski         aValuesSequence.realloc( aAnies.getLength() );
675*b1cdbd2cSJim Jagielski         for( sal_Int32 i=0; i<aAnies.getLength(); ++i )
676*b1cdbd2cSJim Jagielski             aAnies[i] >>= aValuesSequence[i];
677*b1cdbd2cSJim Jagielski     }
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski     //special handling for x-values (if x-values do point to categories, indices are used instead )
680*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xProp( xSeq, uno::UNO_QUERY );
681*b1cdbd2cSJim Jagielski     if( xProp.is() )
682*b1cdbd2cSJim Jagielski     {
683*b1cdbd2cSJim Jagielski         OUString aRole;
684*b1cdbd2cSJim Jagielski         xProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Role") ) ) >>= aRole;
685*b1cdbd2cSJim Jagielski         if( aRole.match( OUString( RTL_CONSTASCII_USTRINGPARAM( "values-x") ) ) )
686*b1cdbd2cSJim Jagielski         {
687*b1cdbd2cSJim Jagielski             //lcl_clearIfNoValuesButTextIsContained - replace by indices if the values are not appropriate
688*b1cdbd2cSJim Jagielski             bool bHasValue=false;
689*b1cdbd2cSJim Jagielski             bool bHasText=false;
690*b1cdbd2cSJim Jagielski             sal_Int32 nCount = aValuesSequence.getLength();
691*b1cdbd2cSJim Jagielski             for( sal_Int32 j = 0; j < nCount; ++j )
692*b1cdbd2cSJim Jagielski             {
693*b1cdbd2cSJim Jagielski                 if( !::rtl::math::isNan( aValuesSequence[j] ) )
694*b1cdbd2cSJim Jagielski                 {
695*b1cdbd2cSJim Jagielski                     bHasValue=true;
696*b1cdbd2cSJim Jagielski                     break;
697*b1cdbd2cSJim Jagielski                 }
698*b1cdbd2cSJim Jagielski             }
699*b1cdbd2cSJim Jagielski             if(!bHasValue)
700*b1cdbd2cSJim Jagielski             {
701*b1cdbd2cSJim Jagielski                 //no double value is countained
702*b1cdbd2cSJim Jagielski                 //is there any text?
703*b1cdbd2cSJim Jagielski                 uno::Sequence< rtl::OUString > aStrings( lcl_DataSequenceToStringSequence( xSeq ) );
704*b1cdbd2cSJim Jagielski                 sal_Int32 nTextCount = aStrings.getLength();
705*b1cdbd2cSJim Jagielski                 for( sal_Int32 j = 0; j < nTextCount; ++j )
706*b1cdbd2cSJim Jagielski                 {
707*b1cdbd2cSJim Jagielski                     if( aStrings[j].getLength() )
708*b1cdbd2cSJim Jagielski                     {
709*b1cdbd2cSJim Jagielski                         bHasText=true;
710*b1cdbd2cSJim Jagielski                         break;
711*b1cdbd2cSJim Jagielski                     }
712*b1cdbd2cSJim Jagielski                 }
713*b1cdbd2cSJim Jagielski             }
714*b1cdbd2cSJim Jagielski             if( !bHasValue && bHasText )
715*b1cdbd2cSJim Jagielski             {
716*b1cdbd2cSJim Jagielski                 for( sal_Int32 j = 0; j < nCount; ++j )
717*b1cdbd2cSJim Jagielski                     aValuesSequence[j] = j+1;
718*b1cdbd2cSJim Jagielski             }
719*b1cdbd2cSJim Jagielski         }
720*b1cdbd2cSJim Jagielski     }
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski     ::std::copy( aValuesSequence.getConstArray(), aValuesSequence.getConstArray() + aValuesSequence.getLength(),
723*b1cdbd2cSJim Jagielski                      ::std::back_inserter( aResult ));
724*b1cdbd2cSJim Jagielski     return aResult;
725*b1cdbd2cSJim Jagielski }
726*b1cdbd2cSJim Jagielski 
lcl_SequenceHasUnhiddenData(const uno::Reference<chart2::data::XDataSequence> & xDataSequence)727*b1cdbd2cSJim Jagielski bool lcl_SequenceHasUnhiddenData( const uno::Reference< chart2::data::XDataSequence >& xDataSequence )
728*b1cdbd2cSJim Jagielski {
729*b1cdbd2cSJim Jagielski     if( !xDataSequence.is() )
730*b1cdbd2cSJim Jagielski         return false;
731*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xProp( xDataSequence, uno::UNO_QUERY );
732*b1cdbd2cSJim Jagielski     if( xProp.is() )
733*b1cdbd2cSJim Jagielski     {
734*b1cdbd2cSJim Jagielski         uno::Sequence< sal_Int32 > aHiddenValues;
735*b1cdbd2cSJim Jagielski         try
736*b1cdbd2cSJim Jagielski         {
737*b1cdbd2cSJim Jagielski             xProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "HiddenValues" ) ) ) >>= aHiddenValues;
738*b1cdbd2cSJim Jagielski             if( !aHiddenValues.getLength() )
739*b1cdbd2cSJim Jagielski                 return true;
740*b1cdbd2cSJim Jagielski         }
741*b1cdbd2cSJim Jagielski         catch( uno::Exception& e )
742*b1cdbd2cSJim Jagielski         {
743*b1cdbd2cSJim Jagielski             (void)e; // avoid warning
744*b1cdbd2cSJim Jagielski             return true;
745*b1cdbd2cSJim Jagielski         }
746*b1cdbd2cSJim Jagielski     }
747*b1cdbd2cSJim Jagielski     if( xDataSequence->getData().getLength() )
748*b1cdbd2cSJim Jagielski         return true;
749*b1cdbd2cSJim Jagielski     return false;
750*b1cdbd2cSJim Jagielski }
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski typedef vector< OUString > tStringVector;
753*b1cdbd2cSJim Jagielski typedef vector< double > tDoubleVector;
754*b1cdbd2cSJim Jagielski typedef vector< vector< OUString > > t2DStringVector;
755*b1cdbd2cSJim Jagielski typedef vector< vector< double > > t2DNumberContainer;
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski struct lcl_TableData
758*b1cdbd2cSJim Jagielski {
759*b1cdbd2cSJim Jagielski     t2DNumberContainer  aDataInRows;
760*b1cdbd2cSJim Jagielski     tStringVector       aDataRangeRepresentations;
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski     tStringVector       aColumnDescriptions;
763*b1cdbd2cSJim Jagielski     tStringVector       aColumnDescriptions_Ranges;
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski     tStringVector       aRowDescriptions;
766*b1cdbd2cSJim Jagielski     tStringVector       aRowDescriptions_Ranges;
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski     Sequence< Sequence< uno::Any > >    aComplexColumnDescriptions;//outer index is columns - inner index is level
769*b1cdbd2cSJim Jagielski     Sequence< Sequence< uno::Any > >    aComplexRowDescriptions;//outer index is rows - inner index is level
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski     ::std::vector< sal_Int32 > aHiddenColumns;
772*b1cdbd2cSJim Jagielski };
773*b1cdbd2cSJim Jagielski 
774*b1cdbd2cSJim Jagielski // ::std::bind2nd( ::std::mem_fun_ref( &T::resize ), nSize ) does not work
775*b1cdbd2cSJim Jagielski template< class T >
776*b1cdbd2cSJim Jagielski     struct lcl_resize
777*b1cdbd2cSJim Jagielski     {
lcl_resize__anona92078ed0111::lcl_resize778*b1cdbd2cSJim Jagielski         lcl_resize( typename T::size_type nSize, typename T::value_type fDefaultValue ) : m_nSize( nSize ), m_fDefaultValue( fDefaultValue ) {}
operator ()__anona92078ed0111::lcl_resize779*b1cdbd2cSJim Jagielski         void operator()( T & t )
780*b1cdbd2cSJim Jagielski         { t.resize( m_nSize, m_fDefaultValue ); }
781*b1cdbd2cSJim Jagielski     private:
782*b1cdbd2cSJim Jagielski         typename T::size_type m_nSize;
783*b1cdbd2cSJim Jagielski         typename T::value_type m_fDefaultValue;
784*b1cdbd2cSJim Jagielski     };
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski typedef ::std::map< sal_Int32, SchXMLExportHelper_Impl::tLabelValuesDataPair >
788*b1cdbd2cSJim Jagielski     lcl_DataSequenceMap;
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski struct lcl_SequenceToMapElement :
791*b1cdbd2cSJim Jagielski     public ::std::unary_function< lcl_DataSequenceMap::mapped_type, lcl_DataSequenceMap::value_type >
792*b1cdbd2cSJim Jagielski {
lcl_SequenceToMapElement__anona92078ed0111::lcl_SequenceToMapElement793*b1cdbd2cSJim Jagielski     lcl_SequenceToMapElement()
794*b1cdbd2cSJim Jagielski     {}
operator ()__anona92078ed0111::lcl_SequenceToMapElement795*b1cdbd2cSJim Jagielski     result_type operator() ( const argument_type & rContent )
796*b1cdbd2cSJim Jagielski     {
797*b1cdbd2cSJim Jagielski         sal_Int32 nIndex = -1;
798*b1cdbd2cSJim Jagielski         if( rContent.second.is()) //has values
799*b1cdbd2cSJim Jagielski         {
800*b1cdbd2cSJim Jagielski             OUString aRangeRep( rContent.second->getSourceRangeRepresentation());
801*b1cdbd2cSJim Jagielski             nIndex = aRangeRep.toInt32();
802*b1cdbd2cSJim Jagielski         }
803*b1cdbd2cSJim Jagielski         else if( rContent.first.is()) //has labels
804*b1cdbd2cSJim Jagielski             nIndex = rContent.first->getSourceRangeRepresentation().copy( sizeof("label ")).toInt32();
805*b1cdbd2cSJim Jagielski         return result_type( nIndex, rContent );
806*b1cdbd2cSJim Jagielski     }
807*b1cdbd2cSJim Jagielski };
808*b1cdbd2cSJim Jagielski 
lcl_ReorderInternalSequencesAccordingToTheirRangeName(SchXMLExportHelper_Impl::tDataSequenceCont & rInOutSequences)809*b1cdbd2cSJim Jagielski void lcl_ReorderInternalSequencesAccordingToTheirRangeName(
810*b1cdbd2cSJim Jagielski     SchXMLExportHelper_Impl::tDataSequenceCont & rInOutSequences )
811*b1cdbd2cSJim Jagielski {
812*b1cdbd2cSJim Jagielski     lcl_DataSequenceMap aIndexSequenceMap;
813*b1cdbd2cSJim Jagielski     ::std::transform( rInOutSequences.begin(), rInOutSequences.end(),
814*b1cdbd2cSJim Jagielski                       ::std::inserter( aIndexSequenceMap, aIndexSequenceMap.begin()),
815*b1cdbd2cSJim Jagielski                       lcl_SequenceToMapElement());
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski     rInOutSequences.clear();
818*b1cdbd2cSJim Jagielski     sal_Int32 nIndex = 0;
819*b1cdbd2cSJim Jagielski     for( lcl_DataSequenceMap::const_iterator aIt = aIndexSequenceMap.begin();
820*b1cdbd2cSJim Jagielski          aIt != aIndexSequenceMap.end(); ++aIt, ++nIndex )
821*b1cdbd2cSJim Jagielski     {
822*b1cdbd2cSJim Jagielski         if( aIt->first < 0 )
823*b1cdbd2cSJim Jagielski             continue;
824*b1cdbd2cSJim Jagielski         // fill empty columns
825*b1cdbd2cSJim Jagielski         for( ; nIndex < aIt->first; ++nIndex )
826*b1cdbd2cSJim Jagielski             rInOutSequences.push_back(
827*b1cdbd2cSJim Jagielski                 SchXMLExportHelper_Impl::tDataSequenceCont::value_type( 0, 0 ));
828*b1cdbd2cSJim Jagielski         OSL_ASSERT( nIndex == aIt->first );
829*b1cdbd2cSJim Jagielski         rInOutSequences.push_back( aIt->second );
830*b1cdbd2cSJim Jagielski     }
831*b1cdbd2cSJim Jagielski }
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski 
lcl_getDataForLocalTable(const SchXMLExportHelper_Impl::tDataSequenceCont & aSequencesToExport,const Reference<chart2::XAnyDescriptionAccess> & xAnyDescriptionAccess,const OUString & rCategoriesRange,bool bSeriesFromColumns,const Reference<chart2::data::XRangeXMLConversion> & xRangeConversion)834*b1cdbd2cSJim Jagielski lcl_TableData lcl_getDataForLocalTable(
835*b1cdbd2cSJim Jagielski     const SchXMLExportHelper_Impl::tDataSequenceCont & aSequencesToExport,
836*b1cdbd2cSJim Jagielski     const Reference< chart2::XAnyDescriptionAccess >& xAnyDescriptionAccess,
837*b1cdbd2cSJim Jagielski     const OUString& rCategoriesRange,
838*b1cdbd2cSJim Jagielski     bool bSeriesFromColumns,
839*b1cdbd2cSJim Jagielski     const Reference< chart2::data::XRangeXMLConversion > & xRangeConversion )
840*b1cdbd2cSJim Jagielski {
841*b1cdbd2cSJim Jagielski     lcl_TableData aResult;
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski     try
844*b1cdbd2cSJim Jagielski     {
845*b1cdbd2cSJim Jagielski         Sequence< OUString > aSimpleCategories;
846*b1cdbd2cSJim Jagielski         if( xAnyDescriptionAccess.is() )
847*b1cdbd2cSJim Jagielski         {
848*b1cdbd2cSJim Jagielski             //categories
849*b1cdbd2cSJim Jagielski             if( bSeriesFromColumns )
850*b1cdbd2cSJim Jagielski             {
851*b1cdbd2cSJim Jagielski                 aSimpleCategories = xAnyDescriptionAccess->getRowDescriptions();
852*b1cdbd2cSJim Jagielski                 aResult.aComplexRowDescriptions = xAnyDescriptionAccess->getAnyRowDescriptions();
853*b1cdbd2cSJim Jagielski             }
854*b1cdbd2cSJim Jagielski             else
855*b1cdbd2cSJim Jagielski             {
856*b1cdbd2cSJim Jagielski                 aSimpleCategories = xAnyDescriptionAccess->getColumnDescriptions();
857*b1cdbd2cSJim Jagielski                 aResult.aComplexColumnDescriptions = xAnyDescriptionAccess->getAnyColumnDescriptions();
858*b1cdbd2cSJim Jagielski             }
859*b1cdbd2cSJim Jagielski         }
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski         //series values and series labels
862*b1cdbd2cSJim Jagielski         SchXMLExportHelper_Impl::tDataSequenceCont::size_type nNumSequences = aSequencesToExport.size();
863*b1cdbd2cSJim Jagielski         SchXMLExportHelper_Impl::tDataSequenceCont::const_iterator aBegin( aSequencesToExport.begin());
864*b1cdbd2cSJim Jagielski         SchXMLExportHelper_Impl::tDataSequenceCont::const_iterator aEnd( aSequencesToExport.end());
865*b1cdbd2cSJim Jagielski         SchXMLExportHelper_Impl::tDataSequenceCont::const_iterator aIt( aBegin );
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski         size_t nMaxSequenceLength( lcl_getMaxSequenceLength( aSequencesToExport ));
868*b1cdbd2cSJim Jagielski         size_t nCategoriesLength( aSimpleCategories.getLength() );
869*b1cdbd2cSJim Jagielski         if( nCategoriesLength > nMaxSequenceLength )
870*b1cdbd2cSJim Jagielski         {
871*b1cdbd2cSJim Jagielski             aSimpleCategories.realloc(nMaxSequenceLength);//#i110617#
872*b1cdbd2cSJim Jagielski             nCategoriesLength = nMaxSequenceLength;
873*b1cdbd2cSJim Jagielski         }
874*b1cdbd2cSJim Jagielski         size_t nNumColumns( bSeriesFromColumns ? nNumSequences : nMaxSequenceLength );
875*b1cdbd2cSJim Jagielski         size_t nNumRows( bSeriesFromColumns ? nMaxSequenceLength : nNumSequences );
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski         // resize data
878*b1cdbd2cSJim Jagielski         aResult.aDataInRows.resize( nNumRows );
879*b1cdbd2cSJim Jagielski         double fNan = 0.0;
880*b1cdbd2cSJim Jagielski         ::rtl::math::setNan( &fNan );
881*b1cdbd2cSJim Jagielski         ::std::for_each( aResult.aDataInRows.begin(), aResult.aDataInRows.end(),
882*b1cdbd2cSJim Jagielski                          lcl_resize< t2DNumberContainer::value_type >( nNumColumns, fNan ));
883*b1cdbd2cSJim Jagielski         aResult.aColumnDescriptions.resize( nNumColumns );
884*b1cdbd2cSJim Jagielski         aResult.aComplexColumnDescriptions.realloc( nNumColumns );
885*b1cdbd2cSJim Jagielski         aResult.aRowDescriptions.resize( nNumRows );
886*b1cdbd2cSJim Jagielski         aResult.aComplexRowDescriptions.realloc( nNumRows );
887*b1cdbd2cSJim Jagielski 
888*b1cdbd2cSJim Jagielski         tStringVector& rCategories = bSeriesFromColumns ? aResult.aRowDescriptions    : aResult.aColumnDescriptions;
889*b1cdbd2cSJim Jagielski         tStringVector& rLabels     = bSeriesFromColumns ? aResult.aColumnDescriptions : aResult.aRowDescriptions;
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski         //categories
892*b1cdbd2cSJim Jagielski         lcl_SequenceToVector( aSimpleCategories, rCategories );
893*b1cdbd2cSJim Jagielski         if( rCategoriesRange.getLength() )
894*b1cdbd2cSJim Jagielski         {
895*b1cdbd2cSJim Jagielski             OUString aRange(rCategoriesRange);
896*b1cdbd2cSJim Jagielski             if( xRangeConversion.is())
897*b1cdbd2cSJim Jagielski                 aRange = xRangeConversion->convertRangeToXML( aRange );
898*b1cdbd2cSJim Jagielski             if( bSeriesFromColumns )
899*b1cdbd2cSJim Jagielski                 aResult.aRowDescriptions_Ranges.push_back( aRange );
900*b1cdbd2cSJim Jagielski             else
901*b1cdbd2cSJim Jagielski                 aResult.aColumnDescriptions_Ranges.push_back( aRange );
902*b1cdbd2cSJim Jagielski         }
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski         // iterate over all sequences
905*b1cdbd2cSJim Jagielski         size_t nSeqIdx = 0;
906*b1cdbd2cSJim Jagielski         Sequence< Sequence< OUString > > aComplexLabels(nNumSequences);
907*b1cdbd2cSJim Jagielski         for( ; aIt != aEnd; ++aIt, ++nSeqIdx )
908*b1cdbd2cSJim Jagielski         {
909*b1cdbd2cSJim Jagielski             OUString aRange;
910*b1cdbd2cSJim Jagielski             Sequence< OUString >& rCurrentComplexLabel = aComplexLabels[nSeqIdx];
911*b1cdbd2cSJim Jagielski             if( aIt->first.is())
912*b1cdbd2cSJim Jagielski             {
913*b1cdbd2cSJim Jagielski                 lcl_getLabelStringSequence( rCurrentComplexLabel, aIt->first );
914*b1cdbd2cSJim Jagielski                 rLabels[nSeqIdx] = lcl_flattenStringSequence( rCurrentComplexLabel );
915*b1cdbd2cSJim Jagielski                 aRange = aIt->first->getSourceRangeRepresentation();
916*b1cdbd2cSJim Jagielski                 if( xRangeConversion.is())
917*b1cdbd2cSJim Jagielski                     aRange = xRangeConversion->convertRangeToXML( aRange );
918*b1cdbd2cSJim Jagielski             }
919*b1cdbd2cSJim Jagielski             else if( aIt->second.is())
920*b1cdbd2cSJim Jagielski             {
921*b1cdbd2cSJim Jagielski                 rCurrentComplexLabel.realloc(1);
922*b1cdbd2cSJim Jagielski                 rLabels[nSeqIdx] = rCurrentComplexLabel[0] = lcl_flattenStringSequence(
923*b1cdbd2cSJim Jagielski                     aIt->second->generateLabel( chart2::data::LabelOrigin_SHORT_SIDE ));
924*b1cdbd2cSJim Jagielski             }
925*b1cdbd2cSJim Jagielski             if( bSeriesFromColumns )
926*b1cdbd2cSJim Jagielski                 aResult.aColumnDescriptions_Ranges.push_back( aRange );
927*b1cdbd2cSJim Jagielski             else
928*b1cdbd2cSJim Jagielski                 aResult.aRowDescriptions_Ranges.push_back( aRange );
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski             ::std::vector< double > aNumbers( lcl_getAllValuesFromSequence( aIt->second ));
931*b1cdbd2cSJim Jagielski             if( bSeriesFromColumns )
932*b1cdbd2cSJim Jagielski             {
933*b1cdbd2cSJim Jagielski                 const sal_Int32 nSize( static_cast< sal_Int32 >( aNumbers.size()));
934*b1cdbd2cSJim Jagielski                 for( sal_Int32 nIdx=0; nIdx<nSize; ++nIdx )
935*b1cdbd2cSJim Jagielski                     aResult.aDataInRows[nIdx][nSeqIdx] = aNumbers[nIdx];
936*b1cdbd2cSJim Jagielski             }
937*b1cdbd2cSJim Jagielski             else
938*b1cdbd2cSJim Jagielski                 aResult.aDataInRows[nSeqIdx] = aNumbers;
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski             if( aIt->second.is())
941*b1cdbd2cSJim Jagielski             {
942*b1cdbd2cSJim Jagielski                 aRange =  aIt->second->getSourceRangeRepresentation();
943*b1cdbd2cSJim Jagielski                 if( xRangeConversion.is())
944*b1cdbd2cSJim Jagielski                     aRange = xRangeConversion->convertRangeToXML( aRange );
945*b1cdbd2cSJim Jagielski             }
946*b1cdbd2cSJim Jagielski             aResult.aDataRangeRepresentations.push_back( aRange );
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski             //is column hidden?
949*b1cdbd2cSJim Jagielski             if( !lcl_SequenceHasUnhiddenData(aIt->first) && !lcl_SequenceHasUnhiddenData(aIt->second) )
950*b1cdbd2cSJim Jagielski                 aResult.aHiddenColumns.push_back(nSeqIdx);
951*b1cdbd2cSJim Jagielski         }
952*b1cdbd2cSJim Jagielski         Sequence< Sequence< Any > >& rComplexAnyLabels = bSeriesFromColumns ? aResult.aComplexColumnDescriptions : aResult.aComplexRowDescriptions;//#i116544#
953*b1cdbd2cSJim Jagielski         rComplexAnyLabels.realloc(aComplexLabels.getLength());
954*b1cdbd2cSJim Jagielski         for( sal_Int32 nN=0; nN<aComplexLabels.getLength();nN++ )
955*b1cdbd2cSJim Jagielski         {
956*b1cdbd2cSJim Jagielski             Sequence< OUString >& rSource = aComplexLabels[nN];
957*b1cdbd2cSJim Jagielski             Sequence< Any >& rTarget = rComplexAnyLabels[nN];
958*b1cdbd2cSJim Jagielski             rTarget.realloc( rSource.getLength() );
959*b1cdbd2cSJim Jagielski             for( sal_Int32 i=0; i<rSource.getLength(); i++ )
960*b1cdbd2cSJim Jagielski                 rTarget[i] = uno::makeAny( rSource[i] );
961*b1cdbd2cSJim Jagielski         }
962*b1cdbd2cSJim Jagielski     }
963*b1cdbd2cSJim Jagielski     catch( uno::Exception & rEx )
964*b1cdbd2cSJim Jagielski     {
965*b1cdbd2cSJim Jagielski         (void)rEx; // avoid warning for pro build
966*b1cdbd2cSJim Jagielski         OSL_TRACE( OUStringToOString( OUString( RTL_CONSTASCII_USTRINGPARAM(
967*b1cdbd2cSJim Jagielski                     "something went wrong during table data collection: " )) + rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
968*b1cdbd2cSJim Jagielski     }
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski     return aResult;
971*b1cdbd2cSJim Jagielski }
972*b1cdbd2cSJim Jagielski 
lcl_exportNumberFormat(const OUString & rPropertyName,const Reference<beans::XPropertySet> & xPropSet,SvXMLExport & rExport)973*b1cdbd2cSJim Jagielski void lcl_exportNumberFormat( const OUString& rPropertyName, const Reference< beans::XPropertySet >& xPropSet,
974*b1cdbd2cSJim Jagielski                                         SvXMLExport& rExport )
975*b1cdbd2cSJim Jagielski {
976*b1cdbd2cSJim Jagielski     if( xPropSet.is())
977*b1cdbd2cSJim Jagielski     {
978*b1cdbd2cSJim Jagielski         sal_Int32 nNumberFormat = 0;
979*b1cdbd2cSJim Jagielski         Any aNumAny = xPropSet->getPropertyValue( rPropertyName );
980*b1cdbd2cSJim Jagielski         if( (aNumAny >>= nNumberFormat) && (nNumberFormat != -1) )
981*b1cdbd2cSJim Jagielski             rExport.addDataStyle( nNumberFormat );
982*b1cdbd2cSJim Jagielski     }
983*b1cdbd2cSJim Jagielski }
984*b1cdbd2cSJim Jagielski 
985*b1cdbd2cSJim Jagielski ::std::vector< Reference< chart2::data::XDataSequence > >
lcl_getErrorBarSequences(const Reference<beans::XPropertySet> & xErrorBarProp)986*b1cdbd2cSJim Jagielski     lcl_getErrorBarSequences( const Reference< beans::XPropertySet > & xErrorBarProp )
987*b1cdbd2cSJim Jagielski {
988*b1cdbd2cSJim Jagielski     ::std::vector< Reference< chart2::data::XDataSequence > > aResult;
989*b1cdbd2cSJim Jagielski     Reference< chart2::data::XDataSource > xErrorBarDataSource( xErrorBarProp, uno::UNO_QUERY );
990*b1cdbd2cSJim Jagielski     if( !xErrorBarDataSource.is())
991*b1cdbd2cSJim Jagielski         return aResult;
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski     const OUString aRolePrefix( RTL_CONSTASCII_USTRINGPARAM( "error-bars-" ));
994*b1cdbd2cSJim Jagielski //     const OUString aXRolePrefix( aRolePrefix + OUString( RTL_CONSTASCII_USTRINGPARAM( "x-" )));
995*b1cdbd2cSJim Jagielski //     const OUString aYRolePrefix( aRolePrefix + OUString( RTL_CONSTASCII_USTRINGPARAM( "y-" )));
996*b1cdbd2cSJim Jagielski //     const OUString aPositivePostfix( RTL_CONSTASCII_USTRINGPARAM( "positive" ));
997*b1cdbd2cSJim Jagielski //     const OUString aNegativePostfix( RTL_CONSTASCII_USTRINGPARAM( "negative" ));
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski     Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences(
1000*b1cdbd2cSJim Jagielski         xErrorBarDataSource->getDataSequences());
1001*b1cdbd2cSJim Jagielski     for( sal_Int32 nI=0; nI< aSequences.getLength(); ++nI )
1002*b1cdbd2cSJim Jagielski     {
1003*b1cdbd2cSJim Jagielski         try
1004*b1cdbd2cSJim Jagielski         {
1005*b1cdbd2cSJim Jagielski             if( aSequences[nI].is())
1006*b1cdbd2cSJim Jagielski             {
1007*b1cdbd2cSJim Jagielski                 Reference< chart2::data::XDataSequence > xSequence( aSequences[nI]->getValues());
1008*b1cdbd2cSJim Jagielski                 Reference< beans::XPropertySet > xSeqProp( xSequence, uno::UNO_QUERY_THROW );
1009*b1cdbd2cSJim Jagielski                 OUString aRole;
1010*b1cdbd2cSJim Jagielski                 if( ( xSeqProp->getPropertyValue(
1011*b1cdbd2cSJim Jagielski                           OUString( RTL_CONSTASCII_USTRINGPARAM( "Role" ))) >>= aRole ) &&
1012*b1cdbd2cSJim Jagielski                     aRole.match( aRolePrefix ))
1013*b1cdbd2cSJim Jagielski                 {
1014*b1cdbd2cSJim Jagielski                     aResult.push_back( xSequence );
1015*b1cdbd2cSJim Jagielski                 }
1016*b1cdbd2cSJim Jagielski             }
1017*b1cdbd2cSJim Jagielski         }
1018*b1cdbd2cSJim Jagielski         catch( uno::Exception & rEx )
1019*b1cdbd2cSJim Jagielski         {
1020*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
1021*b1cdbd2cSJim Jagielski             String aStr( rEx.Message );
1022*b1cdbd2cSJim Jagielski             ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
1023*b1cdbd2cSJim Jagielski             DBG_ERROR1( "chart:exporting error bar ranges: %s", aBStr.GetBuffer());
1024*b1cdbd2cSJim Jagielski #else
1025*b1cdbd2cSJim Jagielski             (void)rEx; // avoid warning
1026*b1cdbd2cSJim Jagielski #endif
1027*b1cdbd2cSJim Jagielski         }
1028*b1cdbd2cSJim Jagielski     }
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski     return aResult;
1031*b1cdbd2cSJim Jagielski }
1032*b1cdbd2cSJim Jagielski 
lcl_exportDomainForThisSequence(const Reference<chart2::data::XDataSequence> xValues,rtl::OUString & rFirstRangeForThisDomainIndex,SvXMLExport & rExport)1033*b1cdbd2cSJim Jagielski bool lcl_exportDomainForThisSequence( const Reference< chart2::data::XDataSequence > xValues, rtl::OUString& rFirstRangeForThisDomainIndex, SvXMLExport& rExport )
1034*b1cdbd2cSJim Jagielski {
1035*b1cdbd2cSJim Jagielski     bool bDomainExported = false;
1036*b1cdbd2cSJim Jagielski     if( xValues.is())
1037*b1cdbd2cSJim Jagielski     {
1038*b1cdbd2cSJim Jagielski         Reference< chart2::XChartDocument > xNewDoc( rExport.GetModel(), uno::UNO_QUERY );
1039*b1cdbd2cSJim Jagielski         OUString aRange( lcl_ConvertRange( xValues->getSourceRangeRepresentation(), xNewDoc ) );
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski         //work around error in OOo 2.0 (problems with multiple series having a domain element)
1042*b1cdbd2cSJim Jagielski         if( !rFirstRangeForThisDomainIndex.getLength() || !aRange.equals(rFirstRangeForThisDomainIndex) )
1043*b1cdbd2cSJim Jagielski         {
1044*b1cdbd2cSJim Jagielski             rExport.AddAttribute( XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, aRange);
1045*b1cdbd2cSJim Jagielski             SvXMLElementExport aDomain( rExport, XML_NAMESPACE_CHART, XML_DOMAIN, sal_True, sal_True );
1046*b1cdbd2cSJim Jagielski             bDomainExported = true;
1047*b1cdbd2cSJim Jagielski         }
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski         if( !rFirstRangeForThisDomainIndex.getLength() )
1050*b1cdbd2cSJim Jagielski             rFirstRangeForThisDomainIndex = aRange;
1051*b1cdbd2cSJim Jagielski     }
1052*b1cdbd2cSJim Jagielski     return bDomainExported;
1053*b1cdbd2cSJim Jagielski }
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski } // anonymous namespace
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski struct SchXMLDataPointStruct
1058*b1cdbd2cSJim Jagielski {
1059*b1cdbd2cSJim Jagielski     OUString   maStyleName;
1060*b1cdbd2cSJim Jagielski     sal_Int32  mnRepeat;
1061*b1cdbd2cSJim Jagielski 
SchXMLDataPointStructSchXMLDataPointStruct1062*b1cdbd2cSJim Jagielski     SchXMLDataPointStruct() : mnRepeat( 1 ) {}
1063*b1cdbd2cSJim Jagielski };
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski // ========================================
1066*b1cdbd2cSJim Jagielski // class SchXMLExportHelper
1067*b1cdbd2cSJim Jagielski // ========================================
1068*b1cdbd2cSJim Jagielski 
SchXMLExportHelper(SvXMLExport & rExport,SvXMLAutoStylePoolP & rASPool)1069*b1cdbd2cSJim Jagielski SchXMLExportHelper::SchXMLExportHelper(	SvXMLExport& rExport, SvXMLAutoStylePoolP& rASPool )
1070*b1cdbd2cSJim Jagielski     : m_pImpl( new SchXMLExportHelper_Impl( rExport, rASPool ) )
1071*b1cdbd2cSJim Jagielski {
1072*b1cdbd2cSJim Jagielski }
1073*b1cdbd2cSJim Jagielski 
~SchXMLExportHelper()1074*b1cdbd2cSJim Jagielski SchXMLExportHelper::~SchXMLExportHelper()
1075*b1cdbd2cSJim Jagielski {
1076*b1cdbd2cSJim Jagielski     delete m_pImpl;
1077*b1cdbd2cSJim Jagielski }
1078*b1cdbd2cSJim Jagielski 
getChartCLSID()1079*b1cdbd2cSJim Jagielski const OUString& SchXMLExportHelper::getChartCLSID()
1080*b1cdbd2cSJim Jagielski {
1081*b1cdbd2cSJim Jagielski 	return m_pImpl->msCLSID;
1082*b1cdbd2cSJim Jagielski }
1083*b1cdbd2cSJim Jagielski 
GetPropertySetMapper() const1084*b1cdbd2cSJim Jagielski UniReference< XMLPropertySetMapper > SchXMLExportHelper_Impl::GetPropertySetMapper() const
1085*b1cdbd2cSJim Jagielski {
1086*b1cdbd2cSJim Jagielski     return mxPropertySetMapper;
1087*b1cdbd2cSJim Jagielski }
1088*b1cdbd2cSJim Jagielski 
exportAutoStyles()1089*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportAutoStyles()
1090*b1cdbd2cSJim Jagielski {
1091*b1cdbd2cSJim Jagielski 	if( mxExpPropMapper.is())
1092*b1cdbd2cSJim Jagielski 	{
1093*b1cdbd2cSJim Jagielski 		//ToDo: when embedded in calc/writer this is not necessary because the
1094*b1cdbd2cSJim Jagielski 		// numberformatter is shared between both documents
1095*b1cdbd2cSJim Jagielski 		mrExport.exportAutoDataStyles();
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski 		// export chart auto styles
1098*b1cdbd2cSJim Jagielski 		mrAutoStylePool.exportXML(
1099*b1cdbd2cSJim Jagielski 			XML_STYLE_FAMILY_SCH_CHART_ID
1100*b1cdbd2cSJim Jagielski 			, mrExport.GetDocHandler(),
1101*b1cdbd2cSJim Jagielski 			mrExport.GetMM100UnitConverter(),
1102*b1cdbd2cSJim Jagielski 			mrExport.GetNamespaceMap()
1103*b1cdbd2cSJim Jagielski             );
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski         // export auto styles for additional shapes
1106*b1cdbd2cSJim Jagielski         mrExport.GetShapeExport()->exportAutoStyles();
1107*b1cdbd2cSJim Jagielski         // and for text in additional shapes
1108*b1cdbd2cSJim Jagielski         mrExport.GetTextParagraphExport()->exportTextAutoStyles();
1109*b1cdbd2cSJim Jagielski 	}
1110*b1cdbd2cSJim Jagielski }
1111*b1cdbd2cSJim Jagielski 
1112*b1cdbd2cSJim Jagielski // private methods
1113*b1cdbd2cSJim Jagielski // ---------------
1114*b1cdbd2cSJim Jagielski 
SchXMLExportHelper_Impl(SvXMLExport & rExport,SvXMLAutoStylePoolP & rASPool)1115*b1cdbd2cSJim Jagielski SchXMLExportHelper_Impl::SchXMLExportHelper_Impl(
1116*b1cdbd2cSJim Jagielski 	SvXMLExport& rExport,
1117*b1cdbd2cSJim Jagielski 	SvXMLAutoStylePoolP& rASPool ) :
1118*b1cdbd2cSJim Jagielski 		mrExport( rExport ),
1119*b1cdbd2cSJim Jagielski 		mrAutoStylePool( rASPool ),
1120*b1cdbd2cSJim Jagielski 		mbHasSeriesLabels( sal_False ),
1121*b1cdbd2cSJim Jagielski 		mbHasCategoryLabels( sal_False ),
1122*b1cdbd2cSJim Jagielski 		mbRowSourceColumns( sal_True )
1123*b1cdbd2cSJim Jagielski 		// #110680#
1124*b1cdbd2cSJim Jagielski 		// this id depends on the ServiceManager used due to the binary filter stripping.
1125*b1cdbd2cSJim Jagielski 		// ,msCLSID( rtl::OUString( SvGlobalName( SO3_SCH_CLASSID ).GetHexName()))
1126*b1cdbd2cSJim Jagielski {
1127*b1cdbd2cSJim Jagielski 	// #110680#
1128*b1cdbd2cSJim Jagielski 	// changed initialisation for msCLSID. Compare the ServiceInfo name with
1129*b1cdbd2cSJim Jagielski 	// the known name of the LegacyServiceManager.
1130*b1cdbd2cSJim Jagielski 	Reference<lang::XServiceInfo> xServiceInfo( mrExport.getServiceFactory(), uno::UNO_QUERY );
1131*b1cdbd2cSJim Jagielski 	DBG_ASSERT( xServiceInfo.is(), "XMultiServiceFactory without xServiceInfo (!)" );
1132*b1cdbd2cSJim Jagielski 	OUString rdbURL = xServiceInfo->getImplementationName();
1133*b1cdbd2cSJim Jagielski 	OUString implLegacyServiceManagerName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.office.LegacyServiceManager" ) );
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski 	if( rdbURL.equals( implLegacyServiceManagerName ))
1136*b1cdbd2cSJim Jagielski 	{
1137*b1cdbd2cSJim Jagielski 		msCLSID = OUString( SvGlobalName( BF_SO3_SCH_CLASSID ).GetHexName());
1138*b1cdbd2cSJim Jagielski 	}
1139*b1cdbd2cSJim Jagielski 	else
1140*b1cdbd2cSJim Jagielski 	{
1141*b1cdbd2cSJim Jagielski 		msCLSID = OUString( SvGlobalName( SO3_SCH_CLASSID ).GetHexName());
1142*b1cdbd2cSJim Jagielski 	}
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski 	msTableName = OUString::createFromAscii( "local-table" );
1145*b1cdbd2cSJim Jagielski 
1146*b1cdbd2cSJim Jagielski 	// create factory
1147*b1cdbd2cSJim Jagielski 	mxPropertyHandlerFactory = new XMLChartPropHdlFactory;
1148*b1cdbd2cSJim Jagielski 
1149*b1cdbd2cSJim Jagielski 	if( mxPropertyHandlerFactory.is() )
1150*b1cdbd2cSJim Jagielski 	{
1151*b1cdbd2cSJim Jagielski 		// create property set mapper
1152*b1cdbd2cSJim Jagielski 		mxPropertySetMapper = new XMLChartPropertySetMapper;
1153*b1cdbd2cSJim Jagielski 	}
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski 	mxExpPropMapper = new XMLChartExportPropertyMapper( mxPropertySetMapper, rExport );
1156*b1cdbd2cSJim Jagielski 
1157*b1cdbd2cSJim Jagielski 	// register chart auto-style family
1158*b1cdbd2cSJim Jagielski 	mrAutoStylePool.AddFamily(
1159*b1cdbd2cSJim Jagielski 		XML_STYLE_FAMILY_SCH_CHART_ID,
1160*b1cdbd2cSJim Jagielski 		OUString::createFromAscii( XML_STYLE_FAMILY_SCH_CHART_NAME ),
1161*b1cdbd2cSJim Jagielski 		mxExpPropMapper.get(),
1162*b1cdbd2cSJim Jagielski 		OUString::createFromAscii( XML_STYLE_FAMILY_SCH_CHART_PREFIX ));
1163*b1cdbd2cSJim Jagielski 
1164*b1cdbd2cSJim Jagielski     // register shape family
1165*b1cdbd2cSJim Jagielski 	mrAutoStylePool.AddFamily(
1166*b1cdbd2cSJim Jagielski 		XML_STYLE_FAMILY_SD_GRAPHICS_ID,
1167*b1cdbd2cSJim Jagielski 		OUString::createFromAscii( XML_STYLE_FAMILY_SD_GRAPHICS_NAME ),
1168*b1cdbd2cSJim Jagielski 		mxExpPropMapper.get(),
1169*b1cdbd2cSJim Jagielski 		OUString::createFromAscii( XML_STYLE_FAMILY_SD_GRAPHICS_PREFIX ));
1170*b1cdbd2cSJim Jagielski     // register paragraph family also for shapes
1171*b1cdbd2cSJim Jagielski 	mrAutoStylePool.AddFamily(
1172*b1cdbd2cSJim Jagielski 		XML_STYLE_FAMILY_TEXT_PARAGRAPH,
1173*b1cdbd2cSJim Jagielski         GetXMLToken( XML_PARAGRAPH ),
1174*b1cdbd2cSJim Jagielski 		mxExpPropMapper.get(),
1175*b1cdbd2cSJim Jagielski         String( 'P' ));
1176*b1cdbd2cSJim Jagielski     // register text family also for shapes
1177*b1cdbd2cSJim Jagielski 	mrAutoStylePool.AddFamily(
1178*b1cdbd2cSJim Jagielski         XML_STYLE_FAMILY_TEXT_TEXT,
1179*b1cdbd2cSJim Jagielski         GetXMLToken( XML_TEXT ),
1180*b1cdbd2cSJim Jagielski 		mxExpPropMapper.get(),
1181*b1cdbd2cSJim Jagielski         String( 'T' ));
1182*b1cdbd2cSJim Jagielski }
1183*b1cdbd2cSJim Jagielski 
~SchXMLExportHelper_Impl()1184*b1cdbd2cSJim Jagielski SchXMLExportHelper_Impl::~SchXMLExportHelper_Impl()
1185*b1cdbd2cSJim Jagielski {
1186*b1cdbd2cSJim Jagielski }
1187*b1cdbd2cSJim Jagielski 
collectAutoStyles(Reference<chart::XChartDocument> rChartDoc)1188*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::collectAutoStyles( Reference< chart::XChartDocument > rChartDoc )
1189*b1cdbd2cSJim Jagielski {
1190*b1cdbd2cSJim Jagielski     parseDocument( rChartDoc, sal_False );
1191*b1cdbd2cSJim Jagielski }
1192*b1cdbd2cSJim Jagielski 
exportChart(Reference<chart::XChartDocument> rChartDoc,sal_Bool bIncludeTable)1193*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportChart( Reference< chart::XChartDocument > rChartDoc,
1194*b1cdbd2cSJim Jagielski 									  sal_Bool bIncludeTable )
1195*b1cdbd2cSJim Jagielski {
1196*b1cdbd2cSJim Jagielski     parseDocument( rChartDoc, sal_True, bIncludeTable );
1197*b1cdbd2cSJim Jagielski     DBG_ASSERT( maAutoStyleNameQueue.empty(), "There are still remaining autostyle names in the queue" );
1198*b1cdbd2cSJim Jagielski }
1199*b1cdbd2cSJim Jagielski 
lcl_GetStringFromNumberSequence(const::com::sun::star::uno::Sequence<sal_Int32> & rSequenceMapping,bool bRemoveOneFromEachIndex)1200*b1cdbd2cSJim Jagielski ::rtl::OUString lcl_GetStringFromNumberSequence( const ::com::sun::star::uno::Sequence< sal_Int32 >& rSequenceMapping, bool bRemoveOneFromEachIndex /*should be true if having categories*/ )
1201*b1cdbd2cSJim Jagielski {
1202*b1cdbd2cSJim Jagielski     const sal_Int32* pArray = rSequenceMapping.getConstArray();
1203*b1cdbd2cSJim Jagielski     const sal_Int32 nSize = rSequenceMapping.getLength();
1204*b1cdbd2cSJim Jagielski     sal_Int32 i = 0;
1205*b1cdbd2cSJim Jagielski     OUStringBuffer aBuf;
1206*b1cdbd2cSJim Jagielski     bool bHasPredecessor = false;
1207*b1cdbd2cSJim Jagielski     for( i = 0; i < nSize; ++i )
1208*b1cdbd2cSJim Jagielski     {
1209*b1cdbd2cSJim Jagielski         sal_Int32 nIndex = pArray[ i ];
1210*b1cdbd2cSJim Jagielski         if( bRemoveOneFromEachIndex )
1211*b1cdbd2cSJim Jagielski             --nIndex;
1212*b1cdbd2cSJim Jagielski         if(nIndex>=0)
1213*b1cdbd2cSJim Jagielski         {
1214*b1cdbd2cSJim Jagielski             if(bHasPredecessor)
1215*b1cdbd2cSJim Jagielski                 aBuf.append( static_cast< sal_Unicode >( ' ' ));
1216*b1cdbd2cSJim Jagielski             aBuf.append( nIndex, 10 );
1217*b1cdbd2cSJim Jagielski             bHasPredecessor = true;
1218*b1cdbd2cSJim Jagielski         }
1219*b1cdbd2cSJim Jagielski     }
1220*b1cdbd2cSJim Jagielski     return aBuf.makeStringAndClear();
1221*b1cdbd2cSJim Jagielski }
1222*b1cdbd2cSJim Jagielski 
1223*b1cdbd2cSJim Jagielski /// if bExportContent is false the auto-styles are collected
parseDocument(Reference<chart::XChartDocument> & rChartDoc,sal_Bool bExportContent,sal_Bool bIncludeTable)1224*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::parseDocument( Reference< chart::XChartDocument >& rChartDoc,
1225*b1cdbd2cSJim Jagielski 										sal_Bool bExportContent,
1226*b1cdbd2cSJim Jagielski 										sal_Bool bIncludeTable )
1227*b1cdbd2cSJim Jagielski {
1228*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xNewDoc( rChartDoc, uno::UNO_QUERY );
1229*b1cdbd2cSJim Jagielski     if( !rChartDoc.is() || !xNewDoc.is() )
1230*b1cdbd2cSJim Jagielski 	{
1231*b1cdbd2cSJim Jagielski 		DBG_ERROR( "No XChartDocument was given for export." );
1232*b1cdbd2cSJim Jagielski 		return;
1233*b1cdbd2cSJim Jagielski 	}
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski     awt::Size aPageSize( getPageSize( xNewDoc ));
1236*b1cdbd2cSJim Jagielski     if( bExportContent )
1237*b1cdbd2cSJim Jagielski         addSize( aPageSize );
1238*b1cdbd2cSJim Jagielski     Reference< chart::XDiagram > xDiagram = rChartDoc->getDiagram();
1239*b1cdbd2cSJim Jagielski     Reference< chart2::XDiagram > xNewDiagram;
1240*b1cdbd2cSJim Jagielski     if( xNewDoc.is())
1241*b1cdbd2cSJim Jagielski         xNewDiagram.set( xNewDoc->getFirstDiagram());
1242*b1cdbd2cSJim Jagielski 
1243*b1cdbd2cSJim Jagielski     //todo remove if model changes are notified and view is updated automatically
1244*b1cdbd2cSJim Jagielski     if( bExportContent )
1245*b1cdbd2cSJim Jagielski     {
1246*b1cdbd2cSJim Jagielski         Reference< util::XRefreshable > xRefreshable( xNewDoc, uno::UNO_QUERY );
1247*b1cdbd2cSJim Jagielski         if( xRefreshable.is() )
1248*b1cdbd2cSJim Jagielski             xRefreshable->refresh();
1249*b1cdbd2cSJim Jagielski     }
1250*b1cdbd2cSJim Jagielski 
1251*b1cdbd2cSJim Jagielski 	// get Properties of ChartDocument
1252*b1cdbd2cSJim Jagielski 	sal_Bool bHasMainTitle = sal_False;
1253*b1cdbd2cSJim Jagielski 	sal_Bool bHasSubTitle = sal_False;
1254*b1cdbd2cSJim Jagielski 	sal_Bool bHasLegend = sal_False;
1255*b1cdbd2cSJim Jagielski     util::DateTime aNullDate(0,0,0,0,30,12,1899);
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski     std::vector< XMLPropertyState > aPropertyStates;
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski 	Reference< beans::XPropertySet > xDocPropSet( rChartDoc, uno::UNO_QUERY );
1260*b1cdbd2cSJim Jagielski 	if( xDocPropSet.is())
1261*b1cdbd2cSJim Jagielski 	{
1262*b1cdbd2cSJim Jagielski 		try
1263*b1cdbd2cSJim Jagielski 		{
1264*b1cdbd2cSJim Jagielski 			Any aAny( xDocPropSet->getPropertyValue(
1265*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM( "HasMainTitle" ))));
1266*b1cdbd2cSJim Jagielski 			aAny >>= bHasMainTitle;
1267*b1cdbd2cSJim Jagielski 			aAny = xDocPropSet->getPropertyValue(
1268*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM( "HasSubTitle" )));
1269*b1cdbd2cSJim Jagielski 			aAny >>= bHasSubTitle;
1270*b1cdbd2cSJim Jagielski 			aAny = xDocPropSet->getPropertyValue(
1271*b1cdbd2cSJim Jagielski 				OUString( RTL_CONSTASCII_USTRINGPARAM( "HasLegend" )));
1272*b1cdbd2cSJim Jagielski 			aAny >>= bHasLegend;
1273*b1cdbd2cSJim Jagielski             if ( bIncludeTable )
1274*b1cdbd2cSJim Jagielski             {
1275*b1cdbd2cSJim Jagielski                 OUString sNullDate( RTL_CONSTASCII_USTRINGPARAM( "NullDate" ));
1276*b1cdbd2cSJim Jagielski                 aAny = xDocPropSet->getPropertyValue(sNullDate);
1277*b1cdbd2cSJim Jagielski                 if ( !aAny.hasValue() )
1278*b1cdbd2cSJim Jagielski                 {
1279*b1cdbd2cSJim Jagielski                     Reference<container::XChild> xChild(rChartDoc, uno::UNO_QUERY );
1280*b1cdbd2cSJim Jagielski                     if ( xChild.is() )
1281*b1cdbd2cSJim Jagielski                     {
1282*b1cdbd2cSJim Jagielski                         Reference< beans::XPropertySet > xParentDoc( xChild->getParent(),uno::UNO_QUERY);
1283*b1cdbd2cSJim Jagielski                         if ( xParentDoc.is() && xParentDoc->getPropertySetInfo()->hasPropertyByName(sNullDate) )
1284*b1cdbd2cSJim Jagielski                             aAny = xParentDoc->getPropertyValue(sNullDate);
1285*b1cdbd2cSJim Jagielski                     }
1286*b1cdbd2cSJim Jagielski                 }
1287*b1cdbd2cSJim Jagielski 
1288*b1cdbd2cSJim Jagielski                 aAny >>= aNullDate;
1289*b1cdbd2cSJim Jagielski             }
1290*b1cdbd2cSJim Jagielski 		}
1291*b1cdbd2cSJim Jagielski 		catch( beans::UnknownPropertyException & )
1292*b1cdbd2cSJim Jagielski 		{
1293*b1cdbd2cSJim Jagielski 			DBG_WARNING( "Required property not found in ChartDocument" );
1294*b1cdbd2cSJim Jagielski 		}
1295*b1cdbd2cSJim Jagielski 	} // if( xDocPropSet.is())
1296*b1cdbd2cSJim Jagielski 
1297*b1cdbd2cSJim Jagielski     if ( bIncludeTable && (aNullDate.Day != 30 || aNullDate.Month != 12 || aNullDate.Year != 1899 ) )
1298*b1cdbd2cSJim Jagielski     {
1299*b1cdbd2cSJim Jagielski         SvXMLElementExport aSet( mrExport, XML_NAMESPACE_TABLE, XML_CALCULATION_SETTINGS, sal_True, sal_True );
1300*b1cdbd2cSJim Jagielski         {
1301*b1cdbd2cSJim Jagielski             ::rtl::OUStringBuffer sBuffer;
1302*b1cdbd2cSJim Jagielski             SvXMLUnitConverter::convertDateTime(sBuffer,aNullDate);
1303*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_TABLE,XML_DATE_VALUE,sBuffer.makeStringAndClear());
1304*b1cdbd2cSJim Jagielski             SvXMLElementExport aNull( mrExport, XML_NAMESPACE_TABLE, XML_NULL_DATE, sal_True, sal_True );
1305*b1cdbd2cSJim Jagielski         }
1306*b1cdbd2cSJim Jagielski     }
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski 	// chart element
1309*b1cdbd2cSJim Jagielski 	// -------------
1310*b1cdbd2cSJim Jagielski 
1311*b1cdbd2cSJim Jagielski 	SvXMLElementExport* pElChart = 0;
1312*b1cdbd2cSJim Jagielski 	// get property states for autostyles
1313*b1cdbd2cSJim Jagielski 	if( mxExpPropMapper.is())
1314*b1cdbd2cSJim Jagielski 	{
1315*b1cdbd2cSJim Jagielski 		Reference< beans::XPropertySet > xPropSet( rChartDoc->getArea(), uno::UNO_QUERY );
1316*b1cdbd2cSJim Jagielski 		if( xPropSet.is())
1317*b1cdbd2cSJim Jagielski 			aPropertyStates = mxExpPropMapper->Filter( xPropSet );
1318*b1cdbd2cSJim Jagielski 	}
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski 	if( bExportContent )
1321*b1cdbd2cSJim Jagielski 	{
1322*b1cdbd2cSJim Jagielski         //export data provider in xlink:href attribute
1323*b1cdbd2cSJim Jagielski         const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
1324*b1cdbd2cSJim Jagielski         if( nCurrentODFVersion >= SvtSaveOptions::ODFVER_012 )
1325*b1cdbd2cSJim Jagielski         {
1326*b1cdbd2cSJim Jagielski             OUString aDataProviderURL( RTL_CONSTASCII_USTRINGPARAM( ".." ) );
1327*b1cdbd2cSJim Jagielski             if( xNewDoc->hasInternalDataProvider() )
1328*b1cdbd2cSJim Jagielski                 aDataProviderURL = OUString( RTL_CONSTASCII_USTRINGPARAM( "." ) );
1329*b1cdbd2cSJim Jagielski             else //special handling for data base data provider necessary
1330*b1cdbd2cSJim Jagielski             {
1331*b1cdbd2cSJim Jagielski                 Reference< chart2::data::XDatabaseDataProvider > xDBDataProvider( xNewDoc->getDataProvider(), uno::UNO_QUERY );
1332*b1cdbd2cSJim Jagielski                 if( xDBDataProvider.is() )
1333*b1cdbd2cSJim Jagielski                     aDataProviderURL = OUString( RTL_CONSTASCII_USTRINGPARAM( "." ) );
1334*b1cdbd2cSJim Jagielski             }
1335*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aDataProviderURL );
1336*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
1337*b1cdbd2cSJim Jagielski         }
1338*b1cdbd2cSJim Jagielski 
1339*b1cdbd2cSJim Jagielski         OUString sChartType( xDiagram->getDiagramType() );
1340*b1cdbd2cSJim Jagielski 
1341*b1cdbd2cSJim Jagielski 		// attributes
1342*b1cdbd2cSJim Jagielski 		// determine class
1343*b1cdbd2cSJim Jagielski 		if( sChartType.getLength())
1344*b1cdbd2cSJim Jagielski 		{
1345*b1cdbd2cSJim Jagielski 			enum XMLTokenEnum eXMLChartType = SchXMLTools::getTokenByChartType( sChartType, true /* bUseOldNames */ );
1346*b1cdbd2cSJim Jagielski 
1347*b1cdbd2cSJim Jagielski             DBG_ASSERT( eXMLChartType != XML_TOKEN_INVALID, "invalid chart class" );
1348*b1cdbd2cSJim Jagielski             if( eXMLChartType == XML_TOKEN_INVALID )
1349*b1cdbd2cSJim Jagielski                 eXMLChartType = XML_BAR;
1350*b1cdbd2cSJim Jagielski 
1351*b1cdbd2cSJim Jagielski             if( eXMLChartType == XML_ADD_IN )
1352*b1cdbd2cSJim Jagielski             {
1353*b1cdbd2cSJim Jagielski                 // sChartType is the servie-name of the add-in
1354*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_CLASS,
1355*b1cdbd2cSJim Jagielski                                        mrExport.GetNamespaceMap().GetQNameByKey(
1356*b1cdbd2cSJim Jagielski                                            XML_NAMESPACE_OOO, sChartType) );
1357*b1cdbd2cSJim Jagielski 			}
1358*b1cdbd2cSJim Jagielski             else if( eXMLChartType != XML_TOKEN_INVALID )
1359*b1cdbd2cSJim Jagielski 			{
1360*b1cdbd2cSJim Jagielski 				mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_CLASS,
1361*b1cdbd2cSJim Jagielski 						mrExport.GetNamespaceMap().GetQNameByKey(
1362*b1cdbd2cSJim Jagielski 							XML_NAMESPACE_CHART, GetXMLToken(eXMLChartType )) );
1363*b1cdbd2cSJim Jagielski 			}
1364*b1cdbd2cSJim Jagielski 
1365*b1cdbd2cSJim Jagielski             //column-mapping or row-mapping
1366*b1cdbd2cSJim Jagielski             if( maSequenceMapping.getLength() )
1367*b1cdbd2cSJim Jagielski             {
1368*b1cdbd2cSJim Jagielski                 enum XMLTokenEnum eTransToken = ::xmloff::token::XML_ROW_MAPPING;
1369*b1cdbd2cSJim Jagielski                 if( mbRowSourceColumns )
1370*b1cdbd2cSJim Jagielski                     eTransToken = ::xmloff::token::XML_COLUMN_MAPPING;
1371*b1cdbd2cSJim Jagielski                 ::rtl::OUString aSequenceMappingStr( lcl_GetStringFromNumberSequence(
1372*b1cdbd2cSJim Jagielski                     maSequenceMapping, mbHasCategoryLabels && !xNewDoc->hasInternalDataProvider() ) );
1373*b1cdbd2cSJim Jagielski 
1374*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_CHART,
1375*b1cdbd2cSJim Jagielski                                         ::xmloff::token::GetXMLToken( eTransToken ),
1376*b1cdbd2cSJim Jagielski                                         aSequenceMappingStr );
1377*b1cdbd2cSJim Jagielski             }
1378*b1cdbd2cSJim Jagielski         }
1379*b1cdbd2cSJim Jagielski 		// write style name
1380*b1cdbd2cSJim Jagielski         AddAutoStyleAttribute( aPropertyStates );
1381*b1cdbd2cSJim Jagielski 
1382*b1cdbd2cSJim Jagielski 		//element
1383*b1cdbd2cSJim Jagielski 		pElChart = new SvXMLElementExport( mrExport, XML_NAMESPACE_CHART, XML_CHART, sal_True, sal_True );
1384*b1cdbd2cSJim Jagielski 	}
1385*b1cdbd2cSJim Jagielski 	else	// autostyles
1386*b1cdbd2cSJim Jagielski 	{
1387*b1cdbd2cSJim Jagielski         CollectAutoStyle( aPropertyStates );
1388*b1cdbd2cSJim Jagielski 	}
1389*b1cdbd2cSJim Jagielski 	// remove property states for autostyles
1390*b1cdbd2cSJim Jagielski 	aPropertyStates.clear();
1391*b1cdbd2cSJim Jagielski 
1392*b1cdbd2cSJim Jagielski 	// title element
1393*b1cdbd2cSJim Jagielski 	// -------------
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski 	if( bHasMainTitle )
1396*b1cdbd2cSJim Jagielski 	{
1397*b1cdbd2cSJim Jagielski 		// get property states for autostyles
1398*b1cdbd2cSJim Jagielski 		if( mxExpPropMapper.is())
1399*b1cdbd2cSJim Jagielski 		{
1400*b1cdbd2cSJim Jagielski 			Reference< beans::XPropertySet > xPropSet( rChartDoc->getTitle(), uno::UNO_QUERY );
1401*b1cdbd2cSJim Jagielski 			if( xPropSet.is())
1402*b1cdbd2cSJim Jagielski 				aPropertyStates = mxExpPropMapper->Filter( xPropSet );
1403*b1cdbd2cSJim Jagielski 		}
1404*b1cdbd2cSJim Jagielski 		if( bExportContent )
1405*b1cdbd2cSJim Jagielski 		{
1406*b1cdbd2cSJim Jagielski 			Reference< drawing::XShape > xShape = rChartDoc->getTitle();
1407*b1cdbd2cSJim Jagielski 			if( xShape.is())	// && "hasTitleBeenMoved"
1408*b1cdbd2cSJim Jagielski 				addPosition( xShape );
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski 			// write style name
1411*b1cdbd2cSJim Jagielski             AddAutoStyleAttribute( aPropertyStates );
1412*b1cdbd2cSJim Jagielski 
1413*b1cdbd2cSJim Jagielski 			// element
1414*b1cdbd2cSJim Jagielski 			SvXMLElementExport aElTitle( mrExport, XML_NAMESPACE_CHART, XML_TITLE, sal_True, sal_True );
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski 			// content (text:p)
1417*b1cdbd2cSJim Jagielski 			Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY );
1418*b1cdbd2cSJim Jagielski 			if( xPropSet.is())
1419*b1cdbd2cSJim Jagielski 			{
1420*b1cdbd2cSJim Jagielski 				Any aAny( xPropSet->getPropertyValue(
1421*b1cdbd2cSJim Jagielski 					OUString( RTL_CONSTASCII_USTRINGPARAM( "String" ))));
1422*b1cdbd2cSJim Jagielski 				OUString aText;
1423*b1cdbd2cSJim Jagielski 				aAny >>= aText;
1424*b1cdbd2cSJim Jagielski                 exportText( aText );
1425*b1cdbd2cSJim Jagielski 			}
1426*b1cdbd2cSJim Jagielski 		}
1427*b1cdbd2cSJim Jagielski 		else	// autostyles
1428*b1cdbd2cSJim Jagielski 		{
1429*b1cdbd2cSJim Jagielski             CollectAutoStyle( aPropertyStates );
1430*b1cdbd2cSJim Jagielski 		}
1431*b1cdbd2cSJim Jagielski 		// remove property states for autostyles
1432*b1cdbd2cSJim Jagielski 		aPropertyStates.clear();
1433*b1cdbd2cSJim Jagielski 	}
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski 	// subtitle element
1436*b1cdbd2cSJim Jagielski 	// ----------------
1437*b1cdbd2cSJim Jagielski 
1438*b1cdbd2cSJim Jagielski 	if( bHasSubTitle )
1439*b1cdbd2cSJim Jagielski 	{
1440*b1cdbd2cSJim Jagielski 		// get property states for autostyles
1441*b1cdbd2cSJim Jagielski 		if( mxExpPropMapper.is())
1442*b1cdbd2cSJim Jagielski 		{
1443*b1cdbd2cSJim Jagielski 			Reference< beans::XPropertySet > xPropSet( rChartDoc->getSubTitle(), uno::UNO_QUERY );
1444*b1cdbd2cSJim Jagielski 			if( xPropSet.is())
1445*b1cdbd2cSJim Jagielski 				aPropertyStates = mxExpPropMapper->Filter( xPropSet );
1446*b1cdbd2cSJim Jagielski 		}
1447*b1cdbd2cSJim Jagielski 
1448*b1cdbd2cSJim Jagielski 		if( bExportContent )
1449*b1cdbd2cSJim Jagielski 		{
1450*b1cdbd2cSJim Jagielski 			Reference< drawing::XShape > xShape = rChartDoc->getSubTitle();
1451*b1cdbd2cSJim Jagielski 			if( xShape.is())
1452*b1cdbd2cSJim Jagielski 				addPosition( xShape );
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski 			// write style name
1455*b1cdbd2cSJim Jagielski             AddAutoStyleAttribute( aPropertyStates );
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 			// element (has no subelements)
1458*b1cdbd2cSJim Jagielski 			SvXMLElementExport aElSubTitle( mrExport, XML_NAMESPACE_CHART, XML_SUBTITLE, sal_True, sal_True );
1459*b1cdbd2cSJim Jagielski 
1460*b1cdbd2cSJim Jagielski 			// content (text:p)
1461*b1cdbd2cSJim Jagielski 			Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY );
1462*b1cdbd2cSJim Jagielski 			if( xPropSet.is())
1463*b1cdbd2cSJim Jagielski 			{
1464*b1cdbd2cSJim Jagielski 				Any aAny( xPropSet->getPropertyValue(
1465*b1cdbd2cSJim Jagielski 					OUString( RTL_CONSTASCII_USTRINGPARAM( "String" ))));
1466*b1cdbd2cSJim Jagielski 				OUString aText;
1467*b1cdbd2cSJim Jagielski 				aAny >>= aText;
1468*b1cdbd2cSJim Jagielski                 exportText( aText );
1469*b1cdbd2cSJim Jagielski 			}
1470*b1cdbd2cSJim Jagielski 		}
1471*b1cdbd2cSJim Jagielski 		else	// autostyles
1472*b1cdbd2cSJim Jagielski 		{
1473*b1cdbd2cSJim Jagielski             CollectAutoStyle( aPropertyStates );
1474*b1cdbd2cSJim Jagielski 		}
1475*b1cdbd2cSJim Jagielski 		// remove property states for autostyles
1476*b1cdbd2cSJim Jagielski 		aPropertyStates.clear();
1477*b1cdbd2cSJim Jagielski 	}
1478*b1cdbd2cSJim Jagielski 
1479*b1cdbd2cSJim Jagielski 	// legend element
1480*b1cdbd2cSJim Jagielski 	// --------------
1481*b1cdbd2cSJim Jagielski 	if( bHasLegend )
1482*b1cdbd2cSJim Jagielski 	{
1483*b1cdbd2cSJim Jagielski 		// get property states for autostyles
1484*b1cdbd2cSJim Jagielski 		if( mxExpPropMapper.is())
1485*b1cdbd2cSJim Jagielski 		{
1486*b1cdbd2cSJim Jagielski 			Reference< beans::XPropertySet > xPropSet( rChartDoc->getLegend(), uno::UNO_QUERY );
1487*b1cdbd2cSJim Jagielski 			if( xPropSet.is())
1488*b1cdbd2cSJim Jagielski 				aPropertyStates = mxExpPropMapper->Filter( xPropSet );
1489*b1cdbd2cSJim Jagielski 		}
1490*b1cdbd2cSJim Jagielski 
1491*b1cdbd2cSJim Jagielski 		if( bExportContent )
1492*b1cdbd2cSJim Jagielski 		{
1493*b1cdbd2cSJim Jagielski 			Reference< beans::XPropertySet > xProp( rChartDoc->getLegend(), uno::UNO_QUERY );
1494*b1cdbd2cSJim Jagielski 			if( xProp.is())
1495*b1cdbd2cSJim Jagielski 			{
1496*b1cdbd2cSJim Jagielski                 // export legend anchor position
1497*b1cdbd2cSJim Jagielski                 try
1498*b1cdbd2cSJim Jagielski 				{
1499*b1cdbd2cSJim Jagielski 					Any aAny( xProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Alignment" ))));
1500*b1cdbd2cSJim Jagielski                     if( SchXMLEnumConverter::getLegendPositionConverter().exportXML( msString, aAny, mrExport.GetMM100UnitConverter() ) )
1501*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_LEGEND_POSITION, msString );
1502*b1cdbd2cSJim Jagielski 				}
1503*b1cdbd2cSJim Jagielski 				catch( beans::UnknownPropertyException & )
1504*b1cdbd2cSJim Jagielski 				{
1505*b1cdbd2cSJim Jagielski 					DBG_WARNING( "Property Align not found in ChartLegend" );
1506*b1cdbd2cSJim Jagielski 				}
1507*b1cdbd2cSJim Jagielski 
1508*b1cdbd2cSJim Jagielski 				// export absolute legend position
1509*b1cdbd2cSJim Jagielski 				Reference< drawing::XShape > xLegendShape( xProp, uno::UNO_QUERY );
1510*b1cdbd2cSJim Jagielski 				addPosition( xLegendShape );
1511*b1cdbd2cSJim Jagielski 
1512*b1cdbd2cSJim Jagielski 				// export legend size
1513*b1cdbd2cSJim Jagielski                 const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
1514*b1cdbd2cSJim Jagielski                 if( xLegendShape.is() && nCurrentODFVersion >= SvtSaveOptions::ODFVER_012 && nCurrentODFVersion == SvtSaveOptions::ODFVER_LATEST )//do not export legend-expansion to ODF 1.0 and export size only if extensions are enabled //#i28670# todo: change this dependent on fileformat evolution
1515*b1cdbd2cSJim Jagielski                 {
1516*b1cdbd2cSJim Jagielski                     try
1517*b1cdbd2cSJim Jagielski 				    {
1518*b1cdbd2cSJim Jagielski                         chart::ChartLegendExpansion nLegendExpansion = chart::ChartLegendExpansion_HIGH;
1519*b1cdbd2cSJim Jagielski                         OUString aExpansionString;
1520*b1cdbd2cSJim Jagielski 					    Any aAny( xProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Expansion" ))));
1521*b1cdbd2cSJim Jagielski 					    bool bHasExpansion = (aAny >>= nLegendExpansion);
1522*b1cdbd2cSJim Jagielski                         if( bHasExpansion && SchXMLEnumConverter::getLegendExpansionConverter().exportXML( aExpansionString, aAny, mrExport.GetMM100UnitConverter() ) )
1523*b1cdbd2cSJim Jagielski                         {
1524*b1cdbd2cSJim Jagielski                             mrExport.AddAttribute( XML_NAMESPACE_STYLE, XML_LEGEND_EXPANSION, aExpansionString );
1525*b1cdbd2cSJim Jagielski                             if( nLegendExpansion == chart::ChartLegendExpansion_CUSTOM)
1526*b1cdbd2cSJim Jagielski                             {
1527*b1cdbd2cSJim Jagielski                                 awt::Size aSize( xLegendShape->getSize() );
1528*b1cdbd2cSJim Jagielski                                 addSize( aSize, true );
1529*b1cdbd2cSJim Jagielski                                 rtl::OUStringBuffer aAspectRatioString;
1530*b1cdbd2cSJim Jagielski                                 SvXMLUnitConverter::convertDouble(aAspectRatioString, double(aSize.Width)/double(aSize.Height));
1531*b1cdbd2cSJim Jagielski                                 mrExport.AddAttribute( XML_NAMESPACE_STYLE, XML_LEGEND_EXPANSION_ASPECT_RATIO, aAspectRatioString.makeStringAndClear() );
1532*b1cdbd2cSJim Jagielski                             }
1533*b1cdbd2cSJim Jagielski                         }
1534*b1cdbd2cSJim Jagielski 				    }
1535*b1cdbd2cSJim Jagielski 				    catch( beans::UnknownPropertyException & )
1536*b1cdbd2cSJim Jagielski 				    {
1537*b1cdbd2cSJim Jagielski 					    DBG_WARNING( "Property Expansion not found in ChartLegend" );
1538*b1cdbd2cSJim Jagielski 				    }
1539*b1cdbd2cSJim Jagielski                 }
1540*b1cdbd2cSJim Jagielski 			}
1541*b1cdbd2cSJim Jagielski 
1542*b1cdbd2cSJim Jagielski 			// write style name
1543*b1cdbd2cSJim Jagielski             AddAutoStyleAttribute( aPropertyStates );
1544*b1cdbd2cSJim Jagielski 
1545*b1cdbd2cSJim Jagielski 			// element
1546*b1cdbd2cSJim Jagielski 			SvXMLElementExport aLegend( mrExport, XML_NAMESPACE_CHART, XML_LEGEND, sal_True, sal_True );
1547*b1cdbd2cSJim Jagielski 		}
1548*b1cdbd2cSJim Jagielski 		else	// autostyles
1549*b1cdbd2cSJim Jagielski 		{
1550*b1cdbd2cSJim Jagielski             CollectAutoStyle( aPropertyStates );
1551*b1cdbd2cSJim Jagielski 		}
1552*b1cdbd2cSJim Jagielski 		// remove property states for autostyles
1553*b1cdbd2cSJim Jagielski 		aPropertyStates.clear();
1554*b1cdbd2cSJim Jagielski 	}
1555*b1cdbd2cSJim Jagielski 
1556*b1cdbd2cSJim Jagielski 	// plot-area element
1557*b1cdbd2cSJim Jagielski 	// -----------------
1558*b1cdbd2cSJim Jagielski 	if( xDiagram.is())
1559*b1cdbd2cSJim Jagielski 		exportPlotArea( xDiagram, xNewDiagram, aPageSize, bExportContent, bIncludeTable );
1560*b1cdbd2cSJim Jagielski 
1561*b1cdbd2cSJim Jagielski     // export additional shapes
1562*b1cdbd2cSJim Jagielski     // ------------------------
1563*b1cdbd2cSJim Jagielski     if( xDocPropSet.is() )
1564*b1cdbd2cSJim Jagielski     {
1565*b1cdbd2cSJim Jagielski         if( bExportContent )
1566*b1cdbd2cSJim Jagielski         {
1567*b1cdbd2cSJim Jagielski             if( mxAdditionalShapes.is())
1568*b1cdbd2cSJim Jagielski             {
1569*b1cdbd2cSJim Jagielski                 // can't call exportShapes with all shapes because the
1570*b1cdbd2cSJim Jagielski                 // initialisation happend with the complete draw page and not
1571*b1cdbd2cSJim Jagielski                 // the XShapes object used here. Thus the shapes have to be
1572*b1cdbd2cSJim Jagielski                 // exported one by one
1573*b1cdbd2cSJim Jagielski                 UniReference< XMLShapeExport > rShapeExport = mrExport.GetShapeExport();
1574*b1cdbd2cSJim Jagielski                 Reference< drawing::XShape > xShape;
1575*b1cdbd2cSJim Jagielski                 const sal_Int32 nShapeCount( mxAdditionalShapes->getCount());
1576*b1cdbd2cSJim Jagielski                 for( sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++ )
1577*b1cdbd2cSJim Jagielski                 {
1578*b1cdbd2cSJim Jagielski                     mxAdditionalShapes->getByIndex( nShapeId ) >>= xShape;
1579*b1cdbd2cSJim Jagielski                     DBG_ASSERT( xShape.is(), "Shape without an XShape?" );
1580*b1cdbd2cSJim Jagielski                     if( ! xShape.is())
1581*b1cdbd2cSJim Jagielski                         continue;
1582*b1cdbd2cSJim Jagielski 
1583*b1cdbd2cSJim Jagielski                     rShapeExport->exportShape( xShape );
1584*b1cdbd2cSJim Jagielski                 }
1585*b1cdbd2cSJim Jagielski                 // this would be the easier way if it worked:
1586*b1cdbd2cSJim Jagielski                 //mrExport.GetShapeExport()->exportShapes( mxAdditionalShapes );
1587*b1cdbd2cSJim Jagielski             }
1588*b1cdbd2cSJim Jagielski         }
1589*b1cdbd2cSJim Jagielski         else
1590*b1cdbd2cSJim Jagielski         {
1591*b1cdbd2cSJim Jagielski             // get a sequence of non-chart shapes (inserted via clipboard)
1592*b1cdbd2cSJim Jagielski             try
1593*b1cdbd2cSJim Jagielski             {
1594*b1cdbd2cSJim Jagielski                 Any aShapesAny = xDocPropSet->getPropertyValue( OUString::createFromAscii( "AdditionalShapes" ));
1595*b1cdbd2cSJim Jagielski                 aShapesAny >>= mxAdditionalShapes;
1596*b1cdbd2cSJim Jagielski             }
1597*b1cdbd2cSJim Jagielski             catch( uno::Exception & rEx )
1598*b1cdbd2cSJim Jagielski 		    {
1599*b1cdbd2cSJim Jagielski                 (void)rEx; // avoid warning for pro build
1600*b1cdbd2cSJim Jagielski                 OSL_TRACE(
1601*b1cdbd2cSJim Jagielski                     OUStringToOString(
1602*b1cdbd2cSJim Jagielski                         OUString( RTL_CONSTASCII_USTRINGPARAM(
1603*b1cdbd2cSJim Jagielski                             "AdditionalShapes not found: " )) +
1604*b1cdbd2cSJim Jagielski                         rEx.Message,
1605*b1cdbd2cSJim Jagielski                         RTL_TEXTENCODING_ASCII_US ).getStr());
1606*b1cdbd2cSJim Jagielski 		    }
1607*b1cdbd2cSJim Jagielski 
1608*b1cdbd2cSJim Jagielski             if( mxAdditionalShapes.is())
1609*b1cdbd2cSJim Jagielski             {
1610*b1cdbd2cSJim Jagielski                 // seek shapes has to be called for the whole page because in
1611*b1cdbd2cSJim Jagielski                 // the shape export the vector of shapes is accessed via the
1612*b1cdbd2cSJim Jagielski                 // ZOrder which might be (actually is) larger than the number of
1613*b1cdbd2cSJim Jagielski                 // shapes in mxAdditionalShapes
1614*b1cdbd2cSJim Jagielski                 Reference< drawing::XDrawPageSupplier > xSupplier( rChartDoc, uno::UNO_QUERY );
1615*b1cdbd2cSJim Jagielski                 DBG_ASSERT( xSupplier.is(), "Cannot retrieve draw page to initialize shape export" );
1616*b1cdbd2cSJim Jagielski                 if( xSupplier.is() )
1617*b1cdbd2cSJim Jagielski                 {
1618*b1cdbd2cSJim Jagielski                     Reference< drawing::XShapes > xDrawPage( xSupplier->getDrawPage(), uno::UNO_QUERY );
1619*b1cdbd2cSJim Jagielski                     DBG_ASSERT( xDrawPage.is(), "Invalid draw page for initializing shape export" );
1620*b1cdbd2cSJim Jagielski                     if( xDrawPage.is())
1621*b1cdbd2cSJim Jagielski                         mrExport.GetShapeExport()->seekShapes( xDrawPage );
1622*b1cdbd2cSJim Jagielski                 }
1623*b1cdbd2cSJim Jagielski 
1624*b1cdbd2cSJim Jagielski                 // can't call collectShapesAutoStyles with all shapes because
1625*b1cdbd2cSJim Jagielski                 // the initialisation happend with the complete draw page and
1626*b1cdbd2cSJim Jagielski                 // not the XShapes object used here. Thus the shapes have to be
1627*b1cdbd2cSJim Jagielski                 // exported one by one
1628*b1cdbd2cSJim Jagielski                 UniReference< XMLShapeExport > rShapeExport = mrExport.GetShapeExport();
1629*b1cdbd2cSJim Jagielski                 Reference< drawing::XShape > xShape;
1630*b1cdbd2cSJim Jagielski                 const sal_Int32 nShapeCount( mxAdditionalShapes->getCount());
1631*b1cdbd2cSJim Jagielski                 for( sal_Int32 nShapeId = 0; nShapeId < nShapeCount; nShapeId++ )
1632*b1cdbd2cSJim Jagielski                 {
1633*b1cdbd2cSJim Jagielski                     mxAdditionalShapes->getByIndex( nShapeId ) >>= xShape;
1634*b1cdbd2cSJim Jagielski                     DBG_ASSERT( xShape.is(), "Shape without an XShape?" );
1635*b1cdbd2cSJim Jagielski                     if( ! xShape.is())
1636*b1cdbd2cSJim Jagielski                         continue;
1637*b1cdbd2cSJim Jagielski 
1638*b1cdbd2cSJim Jagielski                     rShapeExport->collectShapeAutoStyles( xShape );
1639*b1cdbd2cSJim Jagielski                 }
1640*b1cdbd2cSJim Jagielski                 // this would be the easier way if it worked:
1641*b1cdbd2cSJim Jagielski                 // mrExport.GetShapeExport()->collectShapesAutoStyles( mxAdditionalShapes );
1642*b1cdbd2cSJim Jagielski             }
1643*b1cdbd2cSJim Jagielski         }
1644*b1cdbd2cSJim Jagielski     }
1645*b1cdbd2cSJim Jagielski 
1646*b1cdbd2cSJim Jagielski 	// table element
1647*b1cdbd2cSJim Jagielski 	// (is included as subelement of chart)
1648*b1cdbd2cSJim Jagielski 	// ------------------------------------
1649*b1cdbd2cSJim Jagielski 	if( bExportContent )
1650*b1cdbd2cSJim Jagielski 	{
1651*b1cdbd2cSJim Jagielski         // #85929# always export table, otherwise clipboard may loose data
1652*b1cdbd2cSJim Jagielski         exportTable();
1653*b1cdbd2cSJim Jagielski 	}
1654*b1cdbd2cSJim Jagielski 
1655*b1cdbd2cSJim Jagielski 	// close <chart:chart> element
1656*b1cdbd2cSJim Jagielski 	if( pElChart )
1657*b1cdbd2cSJim Jagielski 		delete pElChart;
1658*b1cdbd2cSJim Jagielski }
1659*b1cdbd2cSJim Jagielski 
lcl_exportComplexLabel(const Sequence<uno::Any> & rComplexLabel,SvXMLExport & rExport)1660*b1cdbd2cSJim Jagielski void lcl_exportComplexLabel( const Sequence< uno::Any >& rComplexLabel, SvXMLExport& rExport )
1661*b1cdbd2cSJim Jagielski {
1662*b1cdbd2cSJim Jagielski     sal_Int32 nLength = rComplexLabel.getLength();
1663*b1cdbd2cSJim Jagielski     if( nLength<=1 )
1664*b1cdbd2cSJim Jagielski         return;
1665*b1cdbd2cSJim Jagielski     SvXMLElementExport aTextList( rExport, XML_NAMESPACE_TEXT, XML_LIST, sal_True, sal_True );
1666*b1cdbd2cSJim Jagielski     for(sal_Int32 nN=0; nN<nLength; nN++)
1667*b1cdbd2cSJim Jagielski     {
1668*b1cdbd2cSJim Jagielski         SvXMLElementExport aListItem( rExport, XML_NAMESPACE_TEXT, XML_LIST_ITEM, sal_True, sal_True );
1669*b1cdbd2cSJim Jagielski         OUString aString;
1670*b1cdbd2cSJim Jagielski         if( !(rComplexLabel[nN]>>=aString) )
1671*b1cdbd2cSJim Jagielski         {
1672*b1cdbd2cSJim Jagielski             //todo?
1673*b1cdbd2cSJim Jagielski         }
1674*b1cdbd2cSJim Jagielski         SchXMLTools::exportText( rExport, aString, false /*bConvertTabsLFs*/ );
1675*b1cdbd2cSJim Jagielski     }
1676*b1cdbd2cSJim Jagielski }
1677*b1cdbd2cSJim Jagielski 
exportTable()1678*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportTable()
1679*b1cdbd2cSJim Jagielski {
1680*b1cdbd2cSJim Jagielski     // table element
1681*b1cdbd2cSJim Jagielski 	// -------------
1682*b1cdbd2cSJim Jagielski 	mrExport.AddAttribute( XML_NAMESPACE_TABLE, XML_NAME, msTableName );
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski     try
1685*b1cdbd2cSJim Jagielski     {
1686*b1cdbd2cSJim Jagielski         bool bProtected = false;
1687*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xProps( mrExport.GetModel(), uno::UNO_QUERY_THROW );
1688*b1cdbd2cSJim Jagielski         if ( ( xProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableDataTableDialog" ) ) ) >>= bProtected ) &&
1689*b1cdbd2cSJim Jagielski              bProtected )
1690*b1cdbd2cSJim Jagielski         {
1691*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_TABLE, XML_PROTECTED, XML_TRUE );
1692*b1cdbd2cSJim Jagielski         }
1693*b1cdbd2cSJim Jagielski     }
1694*b1cdbd2cSJim Jagielski     catch ( uno::Exception& )
1695*b1cdbd2cSJim Jagielski     {
1696*b1cdbd2cSJim Jagielski     }
1697*b1cdbd2cSJim Jagielski 
1698*b1cdbd2cSJim Jagielski     SvXMLElementExport aTable( mrExport, XML_NAMESPACE_TABLE, XML_TABLE, sal_True, sal_True );
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski     bool bHasOwnData = false;
1701*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xNewDoc( mrExport.GetModel(), uno::UNO_QUERY );
1702*b1cdbd2cSJim Jagielski     Reference< chart2::data::XRangeXMLConversion > xRangeConversion;
1703*b1cdbd2cSJim Jagielski     if( xNewDoc.is())
1704*b1cdbd2cSJim Jagielski     {
1705*b1cdbd2cSJim Jagielski         bHasOwnData = xNewDoc->hasInternalDataProvider();
1706*b1cdbd2cSJim Jagielski         xRangeConversion.set( xNewDoc->getDataProvider(), uno::UNO_QUERY );
1707*b1cdbd2cSJim Jagielski     }
1708*b1cdbd2cSJim Jagielski 
1709*b1cdbd2cSJim Jagielski     Reference< chart2::XAnyDescriptionAccess > xAnyDescriptionAccess;
1710*b1cdbd2cSJim Jagielski     {
1711*b1cdbd2cSJim Jagielski         Reference< chart::XChartDocument > xChartDoc( mrExport.GetModel(), uno::UNO_QUERY );
1712*b1cdbd2cSJim Jagielski         if( xChartDoc.is() )
1713*b1cdbd2cSJim Jagielski             xAnyDescriptionAccess = Reference< chart2::XAnyDescriptionAccess >( xChartDoc->getData(), uno::UNO_QUERY );
1714*b1cdbd2cSJim Jagielski     }
1715*b1cdbd2cSJim Jagielski 
1716*b1cdbd2cSJim Jagielski     if( bHasOwnData )
1717*b1cdbd2cSJim Jagielski         lcl_ReorderInternalSequencesAccordingToTheirRangeName( m_aDataSequencesToExport );
1718*b1cdbd2cSJim Jagielski     lcl_TableData aData( lcl_getDataForLocalTable( m_aDataSequencesToExport
1719*b1cdbd2cSJim Jagielski                                 , xAnyDescriptionAccess, maCategoriesRange
1720*b1cdbd2cSJim Jagielski                                 , mbRowSourceColumns, xRangeConversion ));
1721*b1cdbd2cSJim Jagielski 
1722*b1cdbd2cSJim Jagielski     tStringVector::const_iterator aDataRangeIter( aData.aDataRangeRepresentations.begin());
1723*b1cdbd2cSJim Jagielski     const tStringVector::const_iterator aDataRangeEndIter( aData.aDataRangeRepresentations.end());
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski     tStringVector::const_iterator aRowDescriptions_RangeIter( aData.aRowDescriptions_Ranges.begin());
1726*b1cdbd2cSJim Jagielski     const tStringVector::const_iterator aRowDescriptions_RangeEnd( aData.aRowDescriptions_Ranges.end());
1727*b1cdbd2cSJim Jagielski 
1728*b1cdbd2cSJim Jagielski     // declare columns
1729*b1cdbd2cSJim Jagielski     {
1730*b1cdbd2cSJim Jagielski         SvXMLElementExport aHeaderColumns( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_HEADER_COLUMNS, sal_True, sal_True );
1731*b1cdbd2cSJim Jagielski         SvXMLElementExport aHeaderColumn( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, sal_True, sal_True );
1732*b1cdbd2cSJim Jagielski     }
1733*b1cdbd2cSJim Jagielski     {
1734*b1cdbd2cSJim Jagielski         SvXMLElementExport aColumns( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_COLUMNS, sal_True, sal_True );
1735*b1cdbd2cSJim Jagielski 
1736*b1cdbd2cSJim Jagielski         sal_Int32 nNextIndex = 0;
1737*b1cdbd2cSJim Jagielski         for( size_t nN=0; nN< aData.aHiddenColumns.size(); nN++ )
1738*b1cdbd2cSJim Jagielski         {
1739*b1cdbd2cSJim Jagielski             //i91578 display of hidden values (copy paste scenario; export hidden flag thus it can be used during migration to locale table upon paste )
1740*b1cdbd2cSJim Jagielski             sal_Int32 nHiddenIndex = aData.aHiddenColumns[nN];
1741*b1cdbd2cSJim Jagielski             if( nHiddenIndex > nNextIndex )
1742*b1cdbd2cSJim Jagielski             {
1743*b1cdbd2cSJim Jagielski                 sal_Int64 nRepeat = static_cast< sal_Int64 >( nHiddenIndex - nNextIndex );
1744*b1cdbd2cSJim Jagielski                 if(nRepeat>1)
1745*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED,
1746*b1cdbd2cSJim Jagielski                                    OUString::valueOf( nRepeat ));
1747*b1cdbd2cSJim Jagielski                 SvXMLElementExport aColumn( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, sal_True, sal_True );
1748*b1cdbd2cSJim Jagielski             }
1749*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_TABLE, XML_VISIBILITY, GetXMLToken( XML_COLLAPSE ) );
1750*b1cdbd2cSJim Jagielski             SvXMLElementExport aColumn( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, sal_True, sal_True );
1751*b1cdbd2cSJim Jagielski             nNextIndex = nHiddenIndex+1;
1752*b1cdbd2cSJim Jagielski         }
1753*b1cdbd2cSJim Jagielski 
1754*b1cdbd2cSJim Jagielski         sal_Int32 nEndIndex = aData.aColumnDescriptions.size()-1;
1755*b1cdbd2cSJim Jagielski         if( nEndIndex >= nNextIndex )
1756*b1cdbd2cSJim Jagielski         {
1757*b1cdbd2cSJim Jagielski             sal_Int64 nRepeat = static_cast< sal_Int64 >( nEndIndex - nNextIndex + 1 );
1758*b1cdbd2cSJim Jagielski             if(nRepeat>1)
1759*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED,
1760*b1cdbd2cSJim Jagielski                                OUString::valueOf( nRepeat ));
1761*b1cdbd2cSJim Jagielski             SvXMLElementExport aColumn( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, sal_True, sal_True );
1762*b1cdbd2cSJim Jagielski         }
1763*b1cdbd2cSJim Jagielski     }
1764*b1cdbd2cSJim Jagielski 
1765*b1cdbd2cSJim Jagielski     // export rows with content
1766*b1cdbd2cSJim Jagielski     //export header row
1767*b1cdbd2cSJim Jagielski     {
1768*b1cdbd2cSJim Jagielski         SvXMLElementExport aHeaderRows( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_HEADER_ROWS, sal_True, sal_True );
1769*b1cdbd2cSJim Jagielski         SvXMLElementExport aRow( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True );
1770*b1cdbd2cSJim Jagielski 
1771*b1cdbd2cSJim Jagielski         //first one empty cell for the row descriptions
1772*b1cdbd2cSJim Jagielski         {
1773*b1cdbd2cSJim Jagielski             SvXMLElementExport aEmptyCell( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True );
1774*b1cdbd2cSJim Jagielski             SvXMLElementExport aEmptyParagraph( mrExport, XML_NAMESPACE_TEXT, XML_P, sal_True, sal_True );
1775*b1cdbd2cSJim Jagielski         }
1776*b1cdbd2cSJim Jagielski 
1777*b1cdbd2cSJim Jagielski         //export column descriptions
1778*b1cdbd2cSJim Jagielski         tStringVector::const_iterator aColumnDescriptions_RangeIter( aData.aColumnDescriptions_Ranges.begin());
1779*b1cdbd2cSJim Jagielski         const tStringVector::const_iterator aColumnDescriptions_RangeEnd( aData.aColumnDescriptions_Ranges.end());
1780*b1cdbd2cSJim Jagielski         const Sequence< Sequence< uno::Any > >& rComplexColumnDescriptions = aData.aComplexColumnDescriptions;
1781*b1cdbd2cSJim Jagielski         sal_Int32 nComplexCount = rComplexColumnDescriptions.getLength();
1782*b1cdbd2cSJim Jagielski         sal_Int32 nC = 0;
1783*b1cdbd2cSJim Jagielski         for( tStringVector::const_iterator aIt( aData.aColumnDescriptions.begin())
1784*b1cdbd2cSJim Jagielski              ; (aIt != aData.aColumnDescriptions.end())
1785*b1cdbd2cSJim Jagielski              ; aIt++, nC++ )
1786*b1cdbd2cSJim Jagielski         {
1787*b1cdbd2cSJim Jagielski             bool bExportString = true;
1788*b1cdbd2cSJim Jagielski             if( nC < nComplexCount )
1789*b1cdbd2cSJim Jagielski             {
1790*b1cdbd2cSJim Jagielski                 const Sequence< uno::Any >& rComplexLabel = rComplexColumnDescriptions[nC];
1791*b1cdbd2cSJim Jagielski                 if( rComplexLabel.getLength()>0 )
1792*b1cdbd2cSJim Jagielski                 {
1793*b1cdbd2cSJim Jagielski                     double fValue=0.0;
1794*b1cdbd2cSJim Jagielski                     if( rComplexLabel[0] >>=fValue )
1795*b1cdbd2cSJim Jagielski                     {
1796*b1cdbd2cSJim Jagielski                         bExportString = false;
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski                         SvXMLUnitConverter::convertDouble( msStringBuffer, fValue );
1799*b1cdbd2cSJim Jagielski                         msString = msStringBuffer.makeStringAndClear();
1800*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_FLOAT );
1801*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE, msString );
1802*b1cdbd2cSJim Jagielski                     }
1803*b1cdbd2cSJim Jagielski                 }
1804*b1cdbd2cSJim Jagielski             }
1805*b1cdbd2cSJim Jagielski             if( bExportString )
1806*b1cdbd2cSJim Jagielski             {
1807*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_STRING );
1808*b1cdbd2cSJim Jagielski             }
1809*b1cdbd2cSJim Jagielski 
1810*b1cdbd2cSJim Jagielski             SvXMLElementExport aCell( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True );
1811*b1cdbd2cSJim Jagielski             exportText( *aIt );
1812*b1cdbd2cSJim Jagielski             if( nC < nComplexCount )
1813*b1cdbd2cSJim Jagielski                 lcl_exportComplexLabel( rComplexColumnDescriptions[nC], mrExport );
1814*b1cdbd2cSJim Jagielski             if( !bHasOwnData && aColumnDescriptions_RangeIter != aColumnDescriptions_RangeEnd )
1815*b1cdbd2cSJim Jagielski             {
1816*b1cdbd2cSJim Jagielski                 // remind the original range to allow a correct re-association when copying via clipboard
1817*b1cdbd2cSJim Jagielski                 if ((*aColumnDescriptions_RangeIter).getLength())
1818*b1cdbd2cSJim Jagielski                     SchXMLTools::exportRangeToSomewhere( mrExport, *aColumnDescriptions_RangeIter );
1819*b1cdbd2cSJim Jagielski                 ++aColumnDescriptions_RangeIter;
1820*b1cdbd2cSJim Jagielski             }
1821*b1cdbd2cSJim Jagielski         }
1822*b1cdbd2cSJim Jagielski         OSL_ASSERT( bHasOwnData || aColumnDescriptions_RangeIter == aColumnDescriptions_RangeEnd );
1823*b1cdbd2cSJim Jagielski     } // closing row and header-rows elements
1824*b1cdbd2cSJim Jagielski 
1825*b1cdbd2cSJim Jagielski     // export value rows
1826*b1cdbd2cSJim Jagielski     {
1827*b1cdbd2cSJim Jagielski         SvXMLElementExport aRows( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_ROWS, sal_True, sal_True );
1828*b1cdbd2cSJim Jagielski         tStringVector::const_iterator aRowDescriptionsIter( aData.aRowDescriptions.begin());
1829*b1cdbd2cSJim Jagielski         const Sequence< Sequence< uno::Any > >& rComplexRowDescriptions = aData.aComplexRowDescriptions;
1830*b1cdbd2cSJim Jagielski         sal_Int32 nComplexCount = rComplexRowDescriptions.getLength();
1831*b1cdbd2cSJim Jagielski         sal_Int32 nC = 0;
1832*b1cdbd2cSJim Jagielski 
1833*b1cdbd2cSJim Jagielski         for( t2DNumberContainer::const_iterator aRowIt( aData.aDataInRows.begin())
1834*b1cdbd2cSJim Jagielski             ; aRowIt != aData.aDataInRows.end()
1835*b1cdbd2cSJim Jagielski             ; ++aRowIt, ++nC )
1836*b1cdbd2cSJim Jagielski         {
1837*b1cdbd2cSJim Jagielski             SvXMLElementExport aRow( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True );
1838*b1cdbd2cSJim Jagielski 
1839*b1cdbd2cSJim Jagielski             //export row descriptions
1840*b1cdbd2cSJim Jagielski             {
1841*b1cdbd2cSJim Jagielski                 bool bExportString = true;
1842*b1cdbd2cSJim Jagielski                 if( nC < nComplexCount )
1843*b1cdbd2cSJim Jagielski                 {
1844*b1cdbd2cSJim Jagielski                     const Sequence< uno::Any >& rComplexLabel = rComplexRowDescriptions[nC];
1845*b1cdbd2cSJim Jagielski                     if( rComplexLabel.getLength()>0 )
1846*b1cdbd2cSJim Jagielski                     {
1847*b1cdbd2cSJim Jagielski                         double fValue=0.0;
1848*b1cdbd2cSJim Jagielski                         if( rComplexLabel[0] >>=fValue )
1849*b1cdbd2cSJim Jagielski                         {
1850*b1cdbd2cSJim Jagielski                             bExportString = false;
1851*b1cdbd2cSJim Jagielski 
1852*b1cdbd2cSJim Jagielski                             SvXMLUnitConverter::convertDouble( msStringBuffer, fValue );
1853*b1cdbd2cSJim Jagielski                             msString = msStringBuffer.makeStringAndClear();
1854*b1cdbd2cSJim Jagielski                             mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_FLOAT );
1855*b1cdbd2cSJim Jagielski                             mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE, msString );
1856*b1cdbd2cSJim Jagielski                         }
1857*b1cdbd2cSJim Jagielski                     }
1858*b1cdbd2cSJim Jagielski                 }
1859*b1cdbd2cSJim Jagielski                 if( bExportString )
1860*b1cdbd2cSJim Jagielski                 {
1861*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_STRING );
1862*b1cdbd2cSJim Jagielski                 }
1863*b1cdbd2cSJim Jagielski 
1864*b1cdbd2cSJim Jagielski                 SvXMLElementExport aCell( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True );
1865*b1cdbd2cSJim Jagielski                 if( aRowDescriptionsIter != aData.aRowDescriptions.end())
1866*b1cdbd2cSJim Jagielski                 {
1867*b1cdbd2cSJim Jagielski                     exportText( *aRowDescriptionsIter );
1868*b1cdbd2cSJim Jagielski                     if( nC < nComplexCount )
1869*b1cdbd2cSJim Jagielski                         lcl_exportComplexLabel( rComplexRowDescriptions[nC], mrExport );
1870*b1cdbd2cSJim Jagielski                     if( !bHasOwnData && aRowDescriptions_RangeIter != aRowDescriptions_RangeEnd )
1871*b1cdbd2cSJim Jagielski                     {
1872*b1cdbd2cSJim Jagielski                         // remind the original range to allow a correct re-association when copying via clipboard
1873*b1cdbd2cSJim Jagielski                         SchXMLTools::exportRangeToSomewhere( mrExport, *aRowDescriptions_RangeIter );
1874*b1cdbd2cSJim Jagielski                         ++aRowDescriptions_RangeIter;
1875*b1cdbd2cSJim Jagielski                     }
1876*b1cdbd2cSJim Jagielski                     ++aRowDescriptionsIter;
1877*b1cdbd2cSJim Jagielski                 }
1878*b1cdbd2cSJim Jagielski             }
1879*b1cdbd2cSJim Jagielski 
1880*b1cdbd2cSJim Jagielski             //export row values
1881*b1cdbd2cSJim Jagielski             for( t2DNumberContainer::value_type::const_iterator aColIt( aRowIt->begin());
1882*b1cdbd2cSJim Jagielski                  aColIt != aRowIt->end(); ++aColIt )
1883*b1cdbd2cSJim Jagielski             {
1884*b1cdbd2cSJim Jagielski                 SvXMLUnitConverter::convertDouble( msStringBuffer, *aColIt );
1885*b1cdbd2cSJim Jagielski                 msString = msStringBuffer.makeStringAndClear();
1886*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_FLOAT );
1887*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_OFFICE, XML_VALUE, msString );
1888*b1cdbd2cSJim Jagielski                 SvXMLElementExport aCell( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True );
1889*b1cdbd2cSJim Jagielski                 exportText( msString, false ); // do not convert tabs and lfs
1890*b1cdbd2cSJim Jagielski                 if( ( !bHasOwnData && aDataRangeIter != aDataRangeEndIter ) &&
1891*b1cdbd2cSJim Jagielski                     ( mbRowSourceColumns || (aColIt == aRowIt->begin()) ) )
1892*b1cdbd2cSJim Jagielski                 {
1893*b1cdbd2cSJim Jagielski                     // remind the original range to allow a correct re-association when copying via clipboard
1894*b1cdbd2cSJim Jagielski                     if ((*aDataRangeIter).getLength())
1895*b1cdbd2cSJim Jagielski                         SchXMLTools::exportRangeToSomewhere( mrExport, *aDataRangeIter );
1896*b1cdbd2cSJim Jagielski                     ++aDataRangeIter;
1897*b1cdbd2cSJim Jagielski                 }
1898*b1cdbd2cSJim Jagielski             }
1899*b1cdbd2cSJim Jagielski         }
1900*b1cdbd2cSJim Jagielski     }
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski     // if range iterator was used it should have reached its end
1903*b1cdbd2cSJim Jagielski     OSL_ASSERT( bHasOwnData || (aDataRangeIter == aDataRangeEndIter) );
1904*b1cdbd2cSJim Jagielski     OSL_ASSERT( bHasOwnData || (aRowDescriptions_RangeIter == aRowDescriptions_RangeEnd) );
1905*b1cdbd2cSJim Jagielski }
1906*b1cdbd2cSJim Jagielski 
1907*b1cdbd2cSJim Jagielski namespace
1908*b1cdbd2cSJim Jagielski {
1909*b1cdbd2cSJim Jagielski 
lcl_getCooSys(const Reference<chart2::XDiagram> & xNewDiagram)1910*b1cdbd2cSJim Jagielski Reference< chart2::XCoordinateSystem > lcl_getCooSys( const Reference< chart2::XDiagram > & xNewDiagram )
1911*b1cdbd2cSJim Jagielski {
1912*b1cdbd2cSJim Jagielski     Reference< chart2::XCoordinateSystem > xCooSys;
1913*b1cdbd2cSJim Jagielski     Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xNewDiagram, uno::UNO_QUERY );
1914*b1cdbd2cSJim Jagielski     if(xCooSysCnt.is())
1915*b1cdbd2cSJim Jagielski     {
1916*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems() );
1917*b1cdbd2cSJim Jagielski         if(aCooSysSeq.getLength()>0)
1918*b1cdbd2cSJim Jagielski             xCooSys = aCooSysSeq[0];
1919*b1cdbd2cSJim Jagielski     }
1920*b1cdbd2cSJim Jagielski     return xCooSys;
1921*b1cdbd2cSJim Jagielski }
1922*b1cdbd2cSJim Jagielski 
lcl_getAxis(const Reference<chart2::XCoordinateSystem> & xCooSys,enum XMLTokenEnum eDimension,bool bPrimary=true)1923*b1cdbd2cSJim Jagielski Reference< chart2::XAxis > lcl_getAxis( const Reference< chart2::XCoordinateSystem >& xCooSys,
1924*b1cdbd2cSJim Jagielski         enum XMLTokenEnum eDimension, bool bPrimary=true )
1925*b1cdbd2cSJim Jagielski {
1926*b1cdbd2cSJim Jagielski     Reference< chart2::XAxis > xNewAxis;
1927*b1cdbd2cSJim Jagielski     try
1928*b1cdbd2cSJim Jagielski     {
1929*b1cdbd2cSJim Jagielski         if( xCooSys.is() )
1930*b1cdbd2cSJim Jagielski         {
1931*b1cdbd2cSJim Jagielski             sal_Int32 nDimensionIndex=0;
1932*b1cdbd2cSJim Jagielski             switch( eDimension )
1933*b1cdbd2cSJim Jagielski             {
1934*b1cdbd2cSJim Jagielski             case XML_X:
1935*b1cdbd2cSJim Jagielski                 nDimensionIndex=0;
1936*b1cdbd2cSJim Jagielski                 break;
1937*b1cdbd2cSJim Jagielski             case XML_Y:
1938*b1cdbd2cSJim Jagielski                 nDimensionIndex=1;
1939*b1cdbd2cSJim Jagielski                 break;
1940*b1cdbd2cSJim Jagielski             case XML_Z:
1941*b1cdbd2cSJim Jagielski                 nDimensionIndex=2;
1942*b1cdbd2cSJim Jagielski                 break;
1943*b1cdbd2cSJim Jagielski             default:
1944*b1cdbd2cSJim Jagielski                 break;
1945*b1cdbd2cSJim Jagielski             }
1946*b1cdbd2cSJim Jagielski 
1947*b1cdbd2cSJim Jagielski             xNewAxis = xCooSys->getAxisByDimension( nDimensionIndex, bPrimary ? 0 : 1 );
1948*b1cdbd2cSJim Jagielski         }
1949*b1cdbd2cSJim Jagielski     }
1950*b1cdbd2cSJim Jagielski     catch( const uno::Exception & )
1951*b1cdbd2cSJim Jagielski     {
1952*b1cdbd2cSJim Jagielski     }
1953*b1cdbd2cSJim Jagielski     return xNewAxis;
1954*b1cdbd2cSJim Jagielski }
1955*b1cdbd2cSJim Jagielski 
1956*b1cdbd2cSJim Jagielski }
1957*b1cdbd2cSJim Jagielski 
exportPlotArea(Reference<chart::XDiagram> xDiagram,Reference<chart2::XDiagram> xNewDiagram,const awt::Size & rPageSize,sal_Bool bExportContent,sal_Bool bIncludeTable)1958*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportPlotArea(
1959*b1cdbd2cSJim Jagielski     Reference< chart::XDiagram > xDiagram,
1960*b1cdbd2cSJim Jagielski     Reference< chart2::XDiagram > xNewDiagram,
1961*b1cdbd2cSJim Jagielski     const awt::Size & rPageSize,
1962*b1cdbd2cSJim Jagielski     sal_Bool bExportContent,
1963*b1cdbd2cSJim Jagielski     sal_Bool bIncludeTable )
1964*b1cdbd2cSJim Jagielski {
1965*b1cdbd2cSJim Jagielski 	DBG_ASSERT( xDiagram.is(), "Invalid XDiagram as parameter" );
1966*b1cdbd2cSJim Jagielski 	if( ! xDiagram.is())
1967*b1cdbd2cSJim Jagielski 		return;
1968*b1cdbd2cSJim Jagielski 
1969*b1cdbd2cSJim Jagielski 	// variables for autostyles
1970*b1cdbd2cSJim Jagielski 	Reference< beans::XPropertySet > xPropSet;
1971*b1cdbd2cSJim Jagielski 	std::vector< XMLPropertyState > aPropertyStates;
1972*b1cdbd2cSJim Jagielski 
1973*b1cdbd2cSJim Jagielski 	sal_Bool bIs3DChart = sal_False;
1974*b1cdbd2cSJim Jagielski 	drawing::HomogenMatrix aTransMatrix;
1975*b1cdbd2cSJim Jagielski 
1976*b1cdbd2cSJim Jagielski     msStringBuffer.setLength( 0 );
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski     // plot-area element
1979*b1cdbd2cSJim Jagielski 	// -----------------
1980*b1cdbd2cSJim Jagielski 
1981*b1cdbd2cSJim Jagielski 	SvXMLElementExport* pElPlotArea = 0;
1982*b1cdbd2cSJim Jagielski 	// get property states for autostyles
1983*b1cdbd2cSJim Jagielski 	xPropSet = Reference< beans::XPropertySet >( xDiagram, uno::UNO_QUERY );
1984*b1cdbd2cSJim Jagielski 	if( xPropSet.is())
1985*b1cdbd2cSJim Jagielski 	{
1986*b1cdbd2cSJim Jagielski 		if( mxExpPropMapper.is())
1987*b1cdbd2cSJim Jagielski 			aPropertyStates = mxExpPropMapper->Filter( xPropSet );
1988*b1cdbd2cSJim Jagielski 	}
1989*b1cdbd2cSJim Jagielski 	if( bExportContent )
1990*b1cdbd2cSJim Jagielski 	{
1991*b1cdbd2cSJim Jagielski 		UniReference< XMLShapeExport > rShapeExport;
1992*b1cdbd2cSJim Jagielski 
1993*b1cdbd2cSJim Jagielski 		// write style name
1994*b1cdbd2cSJim Jagielski         AddAutoStyleAttribute( aPropertyStates );
1995*b1cdbd2cSJim Jagielski 
1996*b1cdbd2cSJim Jagielski         if( msChartAddress.getLength() )
1997*b1cdbd2cSJim Jagielski         {
1998*b1cdbd2cSJim Jagielski             if( !bIncludeTable )
1999*b1cdbd2cSJim Jagielski                 mrExport.AddAttribute( XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, msChartAddress );
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski             Reference< chart::XChartDocument > xDoc( mrExport.GetModel(), uno::UNO_QUERY );
2002*b1cdbd2cSJim Jagielski             if( xDoc.is() )
2003*b1cdbd2cSJim Jagielski             {
2004*b1cdbd2cSJim Jagielski                 Reference< beans::XPropertySet > xDocProp( xDoc, uno::UNO_QUERY );
2005*b1cdbd2cSJim Jagielski                 if( xDocProp.is())
2006*b1cdbd2cSJim Jagielski                 {
2007*b1cdbd2cSJim Jagielski                     Any aAny;
2008*b1cdbd2cSJim Jagielski                     sal_Bool bFirstCol = false, bFirstRow = false;
2009*b1cdbd2cSJim Jagielski 
2010*b1cdbd2cSJim Jagielski                     try
2011*b1cdbd2cSJim Jagielski                     {
2012*b1cdbd2cSJim Jagielski                         aAny = xDocProp->getPropertyValue(
2013*b1cdbd2cSJim Jagielski                             OUString( RTL_CONSTASCII_USTRINGPARAM( "DataSourceLabelsInFirstColumn" )));
2014*b1cdbd2cSJim Jagielski                         aAny >>= bFirstCol;
2015*b1cdbd2cSJim Jagielski                         aAny = xDocProp->getPropertyValue(
2016*b1cdbd2cSJim Jagielski                             OUString( RTL_CONSTASCII_USTRINGPARAM( "DataSourceLabelsInFirstRow" )));
2017*b1cdbd2cSJim Jagielski                         aAny >>= bFirstRow;
2018*b1cdbd2cSJim Jagielski 
2019*b1cdbd2cSJim Jagielski                         if( bFirstCol || bFirstRow )
2020*b1cdbd2cSJim Jagielski                         {
2021*b1cdbd2cSJim Jagielski                             mrExport.AddAttribute( XML_NAMESPACE_CHART,
2022*b1cdbd2cSJim Jagielski                                                    ::xmloff::token::GetXMLToken( ::xmloff::token::XML_DATA_SOURCE_HAS_LABELS ),
2023*b1cdbd2cSJim Jagielski                                                    ( bFirstCol
2024*b1cdbd2cSJim Jagielski                                                      ? ( bFirstRow
2025*b1cdbd2cSJim Jagielski                                                          ?  ::xmloff::token::GetXMLToken( ::xmloff::token::XML_BOTH )
2026*b1cdbd2cSJim Jagielski                                                          :  ::xmloff::token::GetXMLToken( ::xmloff::token::XML_COLUMN ))
2027*b1cdbd2cSJim Jagielski                                                      : ::xmloff::token::GetXMLToken( ::xmloff::token::XML_ROW )));
2028*b1cdbd2cSJim Jagielski                         }
2029*b1cdbd2cSJim Jagielski                     }
2030*b1cdbd2cSJim Jagielski                     catch( beans::UnknownPropertyException & )
2031*b1cdbd2cSJim Jagielski                     {
2032*b1cdbd2cSJim Jagielski                         DBG_ERRORFILE( "Properties missing" );
2033*b1cdbd2cSJim Jagielski                     }
2034*b1cdbd2cSJim Jagielski                 }
2035*b1cdbd2cSJim Jagielski             }
2036*b1cdbd2cSJim Jagielski         }
2037*b1cdbd2cSJim Jagielski 
2038*b1cdbd2cSJim Jagielski         // #i72973#, #144135# only export table-number-list in OOo format (also for binary)
2039*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xExportInfo( mrExport.getExportInfo());
2040*b1cdbd2cSJim Jagielski         if( msTableNumberList.getLength() &&
2041*b1cdbd2cSJim Jagielski             xExportInfo.is())
2042*b1cdbd2cSJim Jagielski         {
2043*b1cdbd2cSJim Jagielski             try
2044*b1cdbd2cSJim Jagielski             {
2045*b1cdbd2cSJim Jagielski                 OUString sExportTableNumListPropName( RTL_CONSTASCII_USTRINGPARAM("ExportTableNumberList"));
2046*b1cdbd2cSJim Jagielski                 Reference< beans::XPropertySetInfo > xInfo( xExportInfo->getPropertySetInfo());
2047*b1cdbd2cSJim Jagielski                 bool bExportTableNumberList = false;
2048*b1cdbd2cSJim Jagielski                 if( xInfo.is() && xInfo->hasPropertyByName( sExportTableNumListPropName ) &&
2049*b1cdbd2cSJim Jagielski                     (xExportInfo->getPropertyValue( sExportTableNumListPropName ) >>= bExportTableNumberList) &&
2050*b1cdbd2cSJim Jagielski                     bExportTableNumberList )
2051*b1cdbd2cSJim Jagielski                 {
2052*b1cdbd2cSJim Jagielski                     // this attribute is for charts embedded in calc documents only.
2053*b1cdbd2cSJim Jagielski                     // With this you are able to store a file again in 5.0 binary format
2054*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_TABLE_NUMBER_LIST, msTableNumberList );
2055*b1cdbd2cSJim Jagielski                 }
2056*b1cdbd2cSJim Jagielski             }
2057*b1cdbd2cSJim Jagielski 			catch( uno::Exception & rEx )
2058*b1cdbd2cSJim Jagielski             {
2059*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2060*b1cdbd2cSJim Jagielski                 String aStr( rEx.Message );
2061*b1cdbd2cSJim Jagielski                 ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
2062*b1cdbd2cSJim Jagielski                 DBG_ERROR1( "chart:TableNumberList property caught: %s", aBStr.GetBuffer());
2063*b1cdbd2cSJim Jagielski #else
2064*b1cdbd2cSJim Jagielski                 (void)rEx; // avoid warning
2065*b1cdbd2cSJim Jagielski #endif
2066*b1cdbd2cSJim Jagielski             }
2067*b1cdbd2cSJim Jagielski         }
2068*b1cdbd2cSJim Jagielski 
2069*b1cdbd2cSJim Jagielski         // attributes
2070*b1cdbd2cSJim Jagielski 		Reference< drawing::XShape > xShape ( xDiagram, uno::UNO_QUERY );
2071*b1cdbd2cSJim Jagielski 		if( xShape.is())
2072*b1cdbd2cSJim Jagielski 		{
2073*b1cdbd2cSJim Jagielski 			addPosition( xShape );
2074*b1cdbd2cSJim Jagielski 			addSize( xShape );
2075*b1cdbd2cSJim Jagielski 		}
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski 		if( xPropSet.is())
2078*b1cdbd2cSJim Jagielski 		{
2079*b1cdbd2cSJim Jagielski 			Any aAny;
2080*b1cdbd2cSJim Jagielski 
2081*b1cdbd2cSJim Jagielski 			// 3d attributes
2082*b1cdbd2cSJim Jagielski 			try
2083*b1cdbd2cSJim Jagielski 			{
2084*b1cdbd2cSJim Jagielski 				aAny = xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Dim3D" )));
2085*b1cdbd2cSJim Jagielski 				aAny >>= bIs3DChart;
2086*b1cdbd2cSJim Jagielski 
2087*b1cdbd2cSJim Jagielski 				if( bIs3DChart )
2088*b1cdbd2cSJim Jagielski 				{
2089*b1cdbd2cSJim Jagielski 					rShapeExport = mrExport.GetShapeExport();
2090*b1cdbd2cSJim Jagielski 					if( rShapeExport.is())
2091*b1cdbd2cSJim Jagielski 						rShapeExport->export3DSceneAttributes( xPropSet );
2092*b1cdbd2cSJim Jagielski 				}
2093*b1cdbd2cSJim Jagielski 			}
2094*b1cdbd2cSJim Jagielski 			catch( uno::Exception & rEx )
2095*b1cdbd2cSJim Jagielski 			{
2096*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2097*b1cdbd2cSJim Jagielski                 String aStr( rEx.Message );
2098*b1cdbd2cSJim Jagielski                 ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
2099*b1cdbd2cSJim Jagielski                 DBG_ERROR1( "chart:exportPlotAreaException caught: %s", aBStr.GetBuffer());
2100*b1cdbd2cSJim Jagielski #else
2101*b1cdbd2cSJim Jagielski                 (void)rEx; // avoid warning
2102*b1cdbd2cSJim Jagielski #endif
2103*b1cdbd2cSJim Jagielski 			}
2104*b1cdbd2cSJim Jagielski 		}
2105*b1cdbd2cSJim Jagielski 
2106*b1cdbd2cSJim Jagielski 		// plot-area element
2107*b1cdbd2cSJim Jagielski 		pElPlotArea = new SvXMLElementExport( mrExport, XML_NAMESPACE_CHART, XML_PLOT_AREA, sal_True, sal_True );
2108*b1cdbd2cSJim Jagielski 
2109*b1cdbd2cSJim Jagielski         //inner position rectangle element
2110*b1cdbd2cSJim Jagielski         exportCoordinateRegion( xDiagram );
2111*b1cdbd2cSJim Jagielski 
2112*b1cdbd2cSJim Jagielski 		// light sources (inside plot area element)
2113*b1cdbd2cSJim Jagielski 		if( bIs3DChart &&
2114*b1cdbd2cSJim Jagielski 			rShapeExport.is())
2115*b1cdbd2cSJim Jagielski 			rShapeExport->export3DLamps( xPropSet );
2116*b1cdbd2cSJim Jagielski 	}
2117*b1cdbd2cSJim Jagielski 	else	// autostyles
2118*b1cdbd2cSJim Jagielski 	{
2119*b1cdbd2cSJim Jagielski         CollectAutoStyle( aPropertyStates );
2120*b1cdbd2cSJim Jagielski 	}
2121*b1cdbd2cSJim Jagielski 	// remove property states for autostyles
2122*b1cdbd2cSJim Jagielski 	aPropertyStates.clear();
2123*b1cdbd2cSJim Jagielski 
2124*b1cdbd2cSJim Jagielski     // axis elements
2125*b1cdbd2cSJim Jagielski 	// -------------
2126*b1cdbd2cSJim Jagielski 	exportAxes( xDiagram, xNewDiagram, bExportContent );
2127*b1cdbd2cSJim Jagielski 
2128*b1cdbd2cSJim Jagielski 	// series elements
2129*b1cdbd2cSJim Jagielski 	// ---------------
2130*b1cdbd2cSJim Jagielski     Reference< chart2::XAxis > xSecondYAxis = lcl_getAxis( lcl_getCooSys( xNewDiagram ), XML_Y, false );
2131*b1cdbd2cSJim Jagielski     exportSeries( xNewDiagram, rPageSize, bExportContent, xSecondYAxis.is() );
2132*b1cdbd2cSJim Jagielski 
2133*b1cdbd2cSJim Jagielski     // stock-chart elements
2134*b1cdbd2cSJim Jagielski     OUString sChartType ( xDiagram->getDiagramType());
2135*b1cdbd2cSJim Jagielski     if( 0 == sChartType.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart.StockDiagram" )))
2136*b1cdbd2cSJim Jagielski     {
2137*b1cdbd2cSJim Jagielski         Reference< chart::XStatisticDisplay > xStockPropProvider( xDiagram, uno::UNO_QUERY );
2138*b1cdbd2cSJim Jagielski         if( xStockPropProvider.is())
2139*b1cdbd2cSJim Jagielski         {
2140*b1cdbd2cSJim Jagielski             // stock-gain-marker
2141*b1cdbd2cSJim Jagielski             Reference< beans::XPropertySet > xStockPropSet = xStockPropProvider->getUpBar();
2142*b1cdbd2cSJim Jagielski             if( xStockPropSet.is())
2143*b1cdbd2cSJim Jagielski             {
2144*b1cdbd2cSJim Jagielski                 aPropertyStates.clear();
2145*b1cdbd2cSJim Jagielski                 aPropertyStates = mxExpPropMapper->Filter( xStockPropSet );
2146*b1cdbd2cSJim Jagielski 
2147*b1cdbd2cSJim Jagielski                 if( !aPropertyStates.empty() )
2148*b1cdbd2cSJim Jagielski                 {
2149*b1cdbd2cSJim Jagielski                     if( bExportContent )
2150*b1cdbd2cSJim Jagielski                     {
2151*b1cdbd2cSJim Jagielski                         AddAutoStyleAttribute( aPropertyStates );
2152*b1cdbd2cSJim Jagielski 
2153*b1cdbd2cSJim Jagielski                         SvXMLElementExport aGain( mrExport, XML_NAMESPACE_CHART, XML_STOCK_GAIN_MARKER, sal_True, sal_True );
2154*b1cdbd2cSJim Jagielski                     }
2155*b1cdbd2cSJim Jagielski                     else
2156*b1cdbd2cSJim Jagielski                     {
2157*b1cdbd2cSJim Jagielski                         CollectAutoStyle( aPropertyStates );
2158*b1cdbd2cSJim Jagielski                     }
2159*b1cdbd2cSJim Jagielski                 }
2160*b1cdbd2cSJim Jagielski             }
2161*b1cdbd2cSJim Jagielski 
2162*b1cdbd2cSJim Jagielski             // stock-loss-marker
2163*b1cdbd2cSJim Jagielski             xStockPropSet = xStockPropProvider->getDownBar();
2164*b1cdbd2cSJim Jagielski             if( xStockPropSet.is())
2165*b1cdbd2cSJim Jagielski             {
2166*b1cdbd2cSJim Jagielski                 aPropertyStates.clear();
2167*b1cdbd2cSJim Jagielski                 aPropertyStates = mxExpPropMapper->Filter( xStockPropSet );
2168*b1cdbd2cSJim Jagielski 
2169*b1cdbd2cSJim Jagielski                 if( !aPropertyStates.empty() )
2170*b1cdbd2cSJim Jagielski                 {
2171*b1cdbd2cSJim Jagielski                     if( bExportContent )
2172*b1cdbd2cSJim Jagielski                     {
2173*b1cdbd2cSJim Jagielski                         AddAutoStyleAttribute( aPropertyStates );
2174*b1cdbd2cSJim Jagielski 
2175*b1cdbd2cSJim Jagielski                         SvXMLElementExport aGain( mrExport, XML_NAMESPACE_CHART, XML_STOCK_LOSS_MARKER, sal_True, sal_True );
2176*b1cdbd2cSJim Jagielski                     }
2177*b1cdbd2cSJim Jagielski                     else
2178*b1cdbd2cSJim Jagielski                     {
2179*b1cdbd2cSJim Jagielski                         CollectAutoStyle( aPropertyStates );
2180*b1cdbd2cSJim Jagielski                     }
2181*b1cdbd2cSJim Jagielski                 }
2182*b1cdbd2cSJim Jagielski             }
2183*b1cdbd2cSJim Jagielski 
2184*b1cdbd2cSJim Jagielski             // stock-range-line
2185*b1cdbd2cSJim Jagielski             xStockPropSet = xStockPropProvider->getMinMaxLine();
2186*b1cdbd2cSJim Jagielski             if( xStockPropSet.is())
2187*b1cdbd2cSJim Jagielski             {
2188*b1cdbd2cSJim Jagielski                 aPropertyStates.clear();
2189*b1cdbd2cSJim Jagielski                 aPropertyStates = mxExpPropMapper->Filter( xStockPropSet );
2190*b1cdbd2cSJim Jagielski 
2191*b1cdbd2cSJim Jagielski                 if( !aPropertyStates.empty() )
2192*b1cdbd2cSJim Jagielski                 {
2193*b1cdbd2cSJim Jagielski                     if( bExportContent )
2194*b1cdbd2cSJim Jagielski                     {
2195*b1cdbd2cSJim Jagielski                         AddAutoStyleAttribute( aPropertyStates );
2196*b1cdbd2cSJim Jagielski 
2197*b1cdbd2cSJim Jagielski                         SvXMLElementExport aGain( mrExport, XML_NAMESPACE_CHART, XML_STOCK_RANGE_LINE, sal_True, sal_True );
2198*b1cdbd2cSJim Jagielski                     }
2199*b1cdbd2cSJim Jagielski                     else
2200*b1cdbd2cSJim Jagielski                     {
2201*b1cdbd2cSJim Jagielski                         CollectAutoStyle( aPropertyStates );
2202*b1cdbd2cSJim Jagielski                     }
2203*b1cdbd2cSJim Jagielski                 }
2204*b1cdbd2cSJim Jagielski             }
2205*b1cdbd2cSJim Jagielski         }
2206*b1cdbd2cSJim Jagielski     }
2207*b1cdbd2cSJim Jagielski 
2208*b1cdbd2cSJim Jagielski 	// wall and floor element
2209*b1cdbd2cSJim Jagielski 	// ----------------------
2210*b1cdbd2cSJim Jagielski 
2211*b1cdbd2cSJim Jagielski 	Reference< chart::X3DDisplay > xWallFloorSupplier( xDiagram, uno::UNO_QUERY );
2212*b1cdbd2cSJim Jagielski 	if( mxExpPropMapper.is() &&
2213*b1cdbd2cSJim Jagielski 		xWallFloorSupplier.is())
2214*b1cdbd2cSJim Jagielski 	{
2215*b1cdbd2cSJim Jagielski 		// remove property states for autostyles
2216*b1cdbd2cSJim Jagielski 		aPropertyStates.clear();
2217*b1cdbd2cSJim Jagielski 
2218*b1cdbd2cSJim Jagielski 		Reference< beans::XPropertySet > xWallPropSet( xWallFloorSupplier->getWall(), uno::UNO_QUERY );
2219*b1cdbd2cSJim Jagielski 		if( xWallPropSet.is())
2220*b1cdbd2cSJim Jagielski 		{
2221*b1cdbd2cSJim Jagielski 			aPropertyStates = mxExpPropMapper->Filter( xWallPropSet );
2222*b1cdbd2cSJim Jagielski 
2223*b1cdbd2cSJim Jagielski 			if( !aPropertyStates.empty() )
2224*b1cdbd2cSJim Jagielski 			{
2225*b1cdbd2cSJim Jagielski 				// write element
2226*b1cdbd2cSJim Jagielski 				if( bExportContent )
2227*b1cdbd2cSJim Jagielski 				{
2228*b1cdbd2cSJim Jagielski 					// add style name attribute
2229*b1cdbd2cSJim Jagielski                     AddAutoStyleAttribute( aPropertyStates );
2230*b1cdbd2cSJim Jagielski 
2231*b1cdbd2cSJim Jagielski 					SvXMLElementExport aWall( mrExport, XML_NAMESPACE_CHART, XML_WALL, sal_True, sal_True );
2232*b1cdbd2cSJim Jagielski 				}
2233*b1cdbd2cSJim Jagielski 				else	// autostyles
2234*b1cdbd2cSJim Jagielski 				{
2235*b1cdbd2cSJim Jagielski                     CollectAutoStyle( aPropertyStates );
2236*b1cdbd2cSJim Jagielski 				}
2237*b1cdbd2cSJim Jagielski 			}
2238*b1cdbd2cSJim Jagielski 		}
2239*b1cdbd2cSJim Jagielski 
2240*b1cdbd2cSJim Jagielski         // floor element
2241*b1cdbd2cSJim Jagielski         // -------------
2242*b1cdbd2cSJim Jagielski 
2243*b1cdbd2cSJim Jagielski 		// remove property states for autostyles
2244*b1cdbd2cSJim Jagielski 		aPropertyStates.clear();
2245*b1cdbd2cSJim Jagielski 
2246*b1cdbd2cSJim Jagielski 		Reference< beans::XPropertySet > xFloorPropSet( xWallFloorSupplier->getFloor(), uno::UNO_QUERY );
2247*b1cdbd2cSJim Jagielski 		if( xFloorPropSet.is())
2248*b1cdbd2cSJim Jagielski 		{
2249*b1cdbd2cSJim Jagielski 			aPropertyStates = mxExpPropMapper->Filter( xFloorPropSet );
2250*b1cdbd2cSJim Jagielski 
2251*b1cdbd2cSJim Jagielski 			if( !aPropertyStates.empty() )
2252*b1cdbd2cSJim Jagielski 			{
2253*b1cdbd2cSJim Jagielski 				// write element
2254*b1cdbd2cSJim Jagielski 				if( bExportContent )
2255*b1cdbd2cSJim Jagielski 				{
2256*b1cdbd2cSJim Jagielski 					// add style name attribute
2257*b1cdbd2cSJim Jagielski                     AddAutoStyleAttribute( aPropertyStates );
2258*b1cdbd2cSJim Jagielski 
2259*b1cdbd2cSJim Jagielski 					SvXMLElementExport aFloor( mrExport, XML_NAMESPACE_CHART, XML_FLOOR, sal_True, sal_True );
2260*b1cdbd2cSJim Jagielski 				}
2261*b1cdbd2cSJim Jagielski 				else	// autostyles
2262*b1cdbd2cSJim Jagielski 				{
2263*b1cdbd2cSJim Jagielski                     CollectAutoStyle( aPropertyStates );
2264*b1cdbd2cSJim Jagielski 				}
2265*b1cdbd2cSJim Jagielski 			}
2266*b1cdbd2cSJim Jagielski 		}
2267*b1cdbd2cSJim Jagielski 	}
2268*b1cdbd2cSJim Jagielski 
2269*b1cdbd2cSJim Jagielski 	if( pElPlotArea )
2270*b1cdbd2cSJim Jagielski 		delete pElPlotArea;
2271*b1cdbd2cSJim Jagielski }
2272*b1cdbd2cSJim Jagielski 
exportCoordinateRegion(const uno::Reference<chart::XDiagram> & xDiagram)2273*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportCoordinateRegion( const uno::Reference< chart::XDiagram >& xDiagram )
2274*b1cdbd2cSJim Jagielski {
2275*b1cdbd2cSJim Jagielski     const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
2276*b1cdbd2cSJim Jagielski     if( nCurrentODFVersion <= SvtSaveOptions::ODFVER_012 )//do not export to ODF 1.2 or older
2277*b1cdbd2cSJim Jagielski         return;
2278*b1cdbd2cSJim Jagielski     if( nCurrentODFVersion != SvtSaveOptions::ODFVER_LATEST )//export only if extensions are enabled //#i100778# todo: change this dependent on fileformat evolution
2279*b1cdbd2cSJim Jagielski         return;
2280*b1cdbd2cSJim Jagielski 
2281*b1cdbd2cSJim Jagielski     Reference< chart::XDiagramPositioning > xDiaPos( xDiagram, uno::UNO_QUERY );
2282*b1cdbd2cSJim Jagielski     DBG_ASSERT( xDiaPos.is(), "Invalid xDiaPos as parameter" );
2283*b1cdbd2cSJim Jagielski 	if( !xDiaPos.is() )
2284*b1cdbd2cSJim Jagielski 		return;
2285*b1cdbd2cSJim Jagielski 
2286*b1cdbd2cSJim Jagielski     awt::Rectangle aRect( xDiaPos->calculateDiagramPositionExcludingAxes() );
2287*b1cdbd2cSJim Jagielski     addPosition( awt::Point(aRect.X,aRect.Y) );
2288*b1cdbd2cSJim Jagielski     addSize( awt::Size(aRect.Width,aRect.Height) );
2289*b1cdbd2cSJim Jagielski 
2290*b1cdbd2cSJim Jagielski     SvXMLElementExport aCoordinateRegion( mrExport, XML_NAMESPACE_CHART_EXT, XML_COORDINATE_REGION, sal_True, sal_True );//#i100778# todo: change to chart namespace in future - dependent on fileformat
2291*b1cdbd2cSJim Jagielski }
2292*b1cdbd2cSJim Jagielski 
2293*b1cdbd2cSJim Jagielski namespace
2294*b1cdbd2cSJim Jagielski {
lcl_getTimeUnitToken(sal_Int32 nTimeUnit)2295*b1cdbd2cSJim Jagielski     XMLTokenEnum lcl_getTimeUnitToken( sal_Int32 nTimeUnit )
2296*b1cdbd2cSJim Jagielski     {
2297*b1cdbd2cSJim Jagielski         XMLTokenEnum eToken = XML_DAYS;
2298*b1cdbd2cSJim Jagielski         switch( nTimeUnit )
2299*b1cdbd2cSJim Jagielski         {
2300*b1cdbd2cSJim Jagielski         case ::com::sun::star::chart::TimeUnit::YEAR:
2301*b1cdbd2cSJim Jagielski             eToken = XML_YEARS;
2302*b1cdbd2cSJim Jagielski             break;
2303*b1cdbd2cSJim Jagielski         case ::com::sun::star::chart::TimeUnit::MONTH:
2304*b1cdbd2cSJim Jagielski             eToken = XML_MONTHS;
2305*b1cdbd2cSJim Jagielski             break;
2306*b1cdbd2cSJim Jagielski         default://days
2307*b1cdbd2cSJim Jagielski             break;
2308*b1cdbd2cSJim Jagielski         }
2309*b1cdbd2cSJim Jagielski         return eToken;
2310*b1cdbd2cSJim Jagielski     }
2311*b1cdbd2cSJim Jagielski }
2312*b1cdbd2cSJim Jagielski 
exportDateScale(const Reference<beans::XPropertySet> xAxisProps)2313*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportDateScale( const Reference< beans::XPropertySet > xAxisProps )
2314*b1cdbd2cSJim Jagielski {
2315*b1cdbd2cSJim Jagielski     if( !xAxisProps.is() )
2316*b1cdbd2cSJim Jagielski         return;
2317*b1cdbd2cSJim Jagielski 
2318*b1cdbd2cSJim Jagielski     chart::TimeIncrement aIncrement;
2319*b1cdbd2cSJim Jagielski     if( (xAxisProps->getPropertyValue( OUString::createFromAscii( "TimeIncrement" )) >>= aIncrement) )
2320*b1cdbd2cSJim Jagielski     {
2321*b1cdbd2cSJim Jagielski         sal_Int32 nTimeResolution = ::com::sun::star::chart::TimeUnit::DAY;
2322*b1cdbd2cSJim Jagielski         if( aIncrement.TimeResolution >>= nTimeResolution )
2323*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_BASE_TIME_UNIT, lcl_getTimeUnitToken( nTimeResolution ) );
2324*b1cdbd2cSJim Jagielski 
2325*b1cdbd2cSJim Jagielski         OUStringBuffer aValue;
2326*b1cdbd2cSJim Jagielski         chart::TimeInterval aInterval;
2327*b1cdbd2cSJim Jagielski         if( aIncrement.MajorTimeInterval >>= aInterval )
2328*b1cdbd2cSJim Jagielski         {
2329*b1cdbd2cSJim Jagielski             SvXMLUnitConverter::convertNumber( aValue, aInterval.Number );
2330*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_MAJOR_INTERVAL_VALUE, aValue.makeStringAndClear() );
2331*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_MAJOR_INTERVAL_UNIT, lcl_getTimeUnitToken( aInterval.TimeUnit ) );
2332*b1cdbd2cSJim Jagielski         }
2333*b1cdbd2cSJim Jagielski         if( aIncrement.MinorTimeInterval >>= aInterval )
2334*b1cdbd2cSJim Jagielski         {
2335*b1cdbd2cSJim Jagielski             SvXMLUnitConverter::convertNumber( aValue, aInterval.Number );
2336*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_MINOR_INTERVAL_VALUE, aValue.makeStringAndClear() );
2337*b1cdbd2cSJim Jagielski             mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_MINOR_INTERVAL_UNIT, lcl_getTimeUnitToken( aInterval.TimeUnit ) );
2338*b1cdbd2cSJim Jagielski         }
2339*b1cdbd2cSJim Jagielski 
2340*b1cdbd2cSJim Jagielski         SvXMLElementExport aDateScale( mrExport, XML_NAMESPACE_CHART_EXT, XML_DATE_SCALE, sal_True, sal_True );//#i25706#todo: change namespace for next ODF version
2341*b1cdbd2cSJim Jagielski     }
2342*b1cdbd2cSJim Jagielski }
2343*b1cdbd2cSJim Jagielski 
exportAxisTitle(const Reference<beans::XPropertySet> xTitleProps,bool bExportContent)2344*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportAxisTitle( const Reference< beans::XPropertySet > xTitleProps, bool bExportContent )
2345*b1cdbd2cSJim Jagielski {
2346*b1cdbd2cSJim Jagielski     if( !xTitleProps.is() )
2347*b1cdbd2cSJim Jagielski         return;
2348*b1cdbd2cSJim Jagielski     std::vector< XMLPropertyState > aPropertyStates = mxExpPropMapper->Filter( xTitleProps );
2349*b1cdbd2cSJim Jagielski     if( bExportContent )
2350*b1cdbd2cSJim Jagielski     {
2351*b1cdbd2cSJim Jagielski         OUString aText;
2352*b1cdbd2cSJim Jagielski         Any aAny( xTitleProps->getPropertyValue(
2353*b1cdbd2cSJim Jagielski             OUString( RTL_CONSTASCII_USTRINGPARAM( "String" ))));
2354*b1cdbd2cSJim Jagielski         aAny >>= aText;
2355*b1cdbd2cSJim Jagielski 
2356*b1cdbd2cSJim Jagielski         Reference< drawing::XShape > xShape( xTitleProps, uno::UNO_QUERY );
2357*b1cdbd2cSJim Jagielski         if( xShape.is())
2358*b1cdbd2cSJim Jagielski             addPosition( xShape );
2359*b1cdbd2cSJim Jagielski 
2360*b1cdbd2cSJim Jagielski         AddAutoStyleAttribute( aPropertyStates );
2361*b1cdbd2cSJim Jagielski         SvXMLElementExport aTitle( mrExport, XML_NAMESPACE_CHART, XML_TITLE, sal_True, sal_True );
2362*b1cdbd2cSJim Jagielski 
2363*b1cdbd2cSJim Jagielski         // paragraph containing title
2364*b1cdbd2cSJim Jagielski         exportText( aText );
2365*b1cdbd2cSJim Jagielski     }
2366*b1cdbd2cSJim Jagielski     else
2367*b1cdbd2cSJim Jagielski     {
2368*b1cdbd2cSJim Jagielski         CollectAutoStyle( aPropertyStates );
2369*b1cdbd2cSJim Jagielski     }
2370*b1cdbd2cSJim Jagielski     aPropertyStates.clear();
2371*b1cdbd2cSJim Jagielski }
2372*b1cdbd2cSJim Jagielski 
exportGrid(const Reference<beans::XPropertySet> xGridProperties,bool bMajor,bool bExportContent)2373*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportGrid( const Reference< beans::XPropertySet > xGridProperties, bool bMajor, bool bExportContent )
2374*b1cdbd2cSJim Jagielski {
2375*b1cdbd2cSJim Jagielski     if( !xGridProperties.is() )
2376*b1cdbd2cSJim Jagielski         return;
2377*b1cdbd2cSJim Jagielski     std::vector< XMLPropertyState > aPropertyStates = mxExpPropMapper->Filter( xGridProperties );
2378*b1cdbd2cSJim Jagielski     if( bExportContent )
2379*b1cdbd2cSJim Jagielski     {
2380*b1cdbd2cSJim Jagielski         AddAutoStyleAttribute( aPropertyStates );
2381*b1cdbd2cSJim Jagielski         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_CLASS, bMajor ? XML_MAJOR : XML_MINOR );
2382*b1cdbd2cSJim Jagielski         SvXMLElementExport aGrid( mrExport, XML_NAMESPACE_CHART, XML_GRID, sal_True, sal_True );
2383*b1cdbd2cSJim Jagielski     }
2384*b1cdbd2cSJim Jagielski     else
2385*b1cdbd2cSJim Jagielski     {
2386*b1cdbd2cSJim Jagielski         CollectAutoStyle( aPropertyStates );
2387*b1cdbd2cSJim Jagielski     }
2388*b1cdbd2cSJim Jagielski     aPropertyStates.clear();
2389*b1cdbd2cSJim Jagielski }
2390*b1cdbd2cSJim Jagielski 
2391*b1cdbd2cSJim Jagielski namespace
2392*b1cdbd2cSJim Jagielski {
2393*b1cdbd2cSJim Jagielski 
2394*b1cdbd2cSJim Jagielski //returns true if a date scale needs to be exported
lcl_exportAxisType(const Reference<chart2::XAxis> xChart2Axis,SvXMLExport & rExport)2395*b1cdbd2cSJim Jagielski bool lcl_exportAxisType( const Reference< chart2::XAxis > xChart2Axis, SvXMLExport& rExport)
2396*b1cdbd2cSJim Jagielski {
2397*b1cdbd2cSJim Jagielski     bool bExportDateScale = false;
2398*b1cdbd2cSJim Jagielski     if( !xChart2Axis.is() )
2399*b1cdbd2cSJim Jagielski         return bExportDateScale;
2400*b1cdbd2cSJim Jagielski 
2401*b1cdbd2cSJim Jagielski     const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
2402*b1cdbd2cSJim Jagielski     if( nCurrentODFVersion != SvtSaveOptions::ODFVER_LATEST ) //#i25706#todo: change version for next ODF version
2403*b1cdbd2cSJim Jagielski         return bExportDateScale;
2404*b1cdbd2cSJim Jagielski 
2405*b1cdbd2cSJim Jagielski     chart2::ScaleData aScale( xChart2Axis->getScaleData() );
2406*b1cdbd2cSJim Jagielski     //#i25706#todo: change namespace for next ODF version
2407*b1cdbd2cSJim Jagielski     sal_uInt16 nNameSpace = XML_NAMESPACE_CHART_EXT;
2408*b1cdbd2cSJim Jagielski 
2409*b1cdbd2cSJim Jagielski     switch(aScale.AxisType)
2410*b1cdbd2cSJim Jagielski     {
2411*b1cdbd2cSJim Jagielski     case chart2::AxisType::CATEGORY:
2412*b1cdbd2cSJim Jagielski         if( aScale.AutoDateAxis )
2413*b1cdbd2cSJim Jagielski         {
2414*b1cdbd2cSJim Jagielski             rExport.AddAttribute( nNameSpace, XML_AXIS_TYPE, XML_AUTO );
2415*b1cdbd2cSJim Jagielski             bExportDateScale = true;
2416*b1cdbd2cSJim Jagielski         }
2417*b1cdbd2cSJim Jagielski         else
2418*b1cdbd2cSJim Jagielski             rExport.AddAttribute( nNameSpace, XML_AXIS_TYPE, XML_TEXT );
2419*b1cdbd2cSJim Jagielski         break;
2420*b1cdbd2cSJim Jagielski     case chart2::AxisType::DATE:
2421*b1cdbd2cSJim Jagielski         rExport.AddAttribute( nNameSpace, XML_AXIS_TYPE, XML_DATE );
2422*b1cdbd2cSJim Jagielski         bExportDateScale = true;
2423*b1cdbd2cSJim Jagielski         break;
2424*b1cdbd2cSJim Jagielski     default: //AUTOMATIC
2425*b1cdbd2cSJim Jagielski         rExport.AddAttribute( nNameSpace, XML_AXIS_TYPE, XML_AUTO );
2426*b1cdbd2cSJim Jagielski         break;
2427*b1cdbd2cSJim Jagielski     }
2428*b1cdbd2cSJim Jagielski 
2429*b1cdbd2cSJim Jagielski     return bExportDateScale;
2430*b1cdbd2cSJim Jagielski }
2431*b1cdbd2cSJim Jagielski 
2432*b1cdbd2cSJim Jagielski }
2433*b1cdbd2cSJim Jagielski 
exportAxis(enum XMLTokenEnum eDimension,enum XMLTokenEnum eAxisName,const Reference<beans::XPropertySet> xAxisProps,const Reference<chart2::XAxis> & xChart2Axis,const OUString & rCategoriesRange,bool bHasTitle,bool bHasMajorGrid,bool bHasMinorGrid,bool bExportContent)2434*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportAxis(
2435*b1cdbd2cSJim Jagielski     enum XMLTokenEnum eDimension,
2436*b1cdbd2cSJim Jagielski     enum XMLTokenEnum eAxisName,
2437*b1cdbd2cSJim Jagielski     const Reference< beans::XPropertySet > xAxisProps,
2438*b1cdbd2cSJim Jagielski     const Reference< chart2::XAxis >& xChart2Axis,
2439*b1cdbd2cSJim Jagielski     const OUString& rCategoriesRange,
2440*b1cdbd2cSJim Jagielski     bool bHasTitle, bool bHasMajorGrid, bool bHasMinorGrid,
2441*b1cdbd2cSJim Jagielski     bool bExportContent )
2442*b1cdbd2cSJim Jagielski {
2443*b1cdbd2cSJim Jagielski     static const OUString sNumFormat( OUString::createFromAscii( "NumberFormat" ));
2444*b1cdbd2cSJim Jagielski     std::vector< XMLPropertyState > aPropertyStates;
2445*b1cdbd2cSJim Jagielski     SvXMLElementExport* pAxis = NULL;
2446*b1cdbd2cSJim Jagielski 
2447*b1cdbd2cSJim Jagielski     // get property states for autostyles
2448*b1cdbd2cSJim Jagielski     if( xAxisProps.is() && mxExpPropMapper.is() )
2449*b1cdbd2cSJim Jagielski     {
2450*b1cdbd2cSJim Jagielski         lcl_exportNumberFormat( sNumFormat, xAxisProps, mrExport );
2451*b1cdbd2cSJim Jagielski         aPropertyStates = mxExpPropMapper->Filter( xAxisProps );
2452*b1cdbd2cSJim Jagielski     }
2453*b1cdbd2cSJim Jagielski 
2454*b1cdbd2cSJim Jagielski     bool bExportDateScale = false;
2455*b1cdbd2cSJim Jagielski     if( bExportContent )
2456*b1cdbd2cSJim Jagielski     {
2457*b1cdbd2cSJim Jagielski         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_DIMENSION, eDimension );
2458*b1cdbd2cSJim Jagielski         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_NAME, eAxisName );
2459*b1cdbd2cSJim Jagielski         AddAutoStyleAttribute( aPropertyStates ); // write style name
2460*b1cdbd2cSJim Jagielski         if( rCategoriesRange.getLength() )
2461*b1cdbd2cSJim Jagielski             bExportDateScale = lcl_exportAxisType( xChart2Axis, mrExport );
2462*b1cdbd2cSJim Jagielski 
2463*b1cdbd2cSJim Jagielski         // open axis element
2464*b1cdbd2cSJim Jagielski         pAxis = new SvXMLElementExport( mrExport, XML_NAMESPACE_CHART, XML_AXIS, sal_True, sal_True );
2465*b1cdbd2cSJim Jagielski     }
2466*b1cdbd2cSJim Jagielski     else
2467*b1cdbd2cSJim Jagielski     {
2468*b1cdbd2cSJim Jagielski         CollectAutoStyle( aPropertyStates );
2469*b1cdbd2cSJim Jagielski     }
2470*b1cdbd2cSJim Jagielski     aPropertyStates.clear();
2471*b1cdbd2cSJim Jagielski 
2472*b1cdbd2cSJim Jagielski     //date scale
2473*b1cdbd2cSJim Jagielski     if( bExportDateScale )
2474*b1cdbd2cSJim Jagielski         exportDateScale( xAxisProps );
2475*b1cdbd2cSJim Jagielski 
2476*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xTitleProps;
2477*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xMajorGridProps;
2478*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xMinorGridProps;
2479*b1cdbd2cSJim Jagielski     Reference< chart::XAxis > xAxis( xAxisProps, uno::UNO_QUERY );
2480*b1cdbd2cSJim Jagielski     if( xAxis.is() )
2481*b1cdbd2cSJim Jagielski     {
2482*b1cdbd2cSJim Jagielski         xTitleProps = bHasTitle ? xAxis->getAxisTitle() : 0;
2483*b1cdbd2cSJim Jagielski         xMajorGridProps = bHasMajorGrid ? xAxis->getMajorGrid() : 0;
2484*b1cdbd2cSJim Jagielski         xMinorGridProps = bHasMinorGrid ? xAxis->getMinorGrid() : 0;
2485*b1cdbd2cSJim Jagielski     }
2486*b1cdbd2cSJim Jagielski 
2487*b1cdbd2cSJim Jagielski     // axis-title
2488*b1cdbd2cSJim Jagielski     exportAxisTitle( xTitleProps , bExportContent );
2489*b1cdbd2cSJim Jagielski 
2490*b1cdbd2cSJim Jagielski     // categories if we have a categories chart
2491*b1cdbd2cSJim Jagielski     if( bExportContent && rCategoriesRange.getLength() )
2492*b1cdbd2cSJim Jagielski     {
2493*b1cdbd2cSJim Jagielski         mrExport.AddAttribute( XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, rCategoriesRange );
2494*b1cdbd2cSJim Jagielski         SvXMLElementExport aCategories( mrExport, XML_NAMESPACE_CHART, XML_CATEGORIES, sal_True, sal_True );
2495*b1cdbd2cSJim Jagielski     }
2496*b1cdbd2cSJim Jagielski 
2497*b1cdbd2cSJim Jagielski     // grid
2498*b1cdbd2cSJim Jagielski     exportGrid( xMajorGridProps, true, bExportContent );
2499*b1cdbd2cSJim Jagielski     exportGrid( xMinorGridProps, false, bExportContent );
2500*b1cdbd2cSJim Jagielski 
2501*b1cdbd2cSJim Jagielski     if( pAxis )
2502*b1cdbd2cSJim Jagielski     {
2503*b1cdbd2cSJim Jagielski         //close axis element
2504*b1cdbd2cSJim Jagielski         delete pAxis;
2505*b1cdbd2cSJim Jagielski         pAxis = NULL;
2506*b1cdbd2cSJim Jagielski     }
2507*b1cdbd2cSJim Jagielski }
2508*b1cdbd2cSJim Jagielski 
exportAxes(const Reference<chart::XDiagram> & xDiagram,const Reference<chart2::XDiagram> & xNewDiagram,sal_Bool bExportContent)2509*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportAxes(
2510*b1cdbd2cSJim Jagielski     const Reference< chart::XDiagram > & xDiagram,
2511*b1cdbd2cSJim Jagielski     const Reference< chart2::XDiagram > & xNewDiagram,
2512*b1cdbd2cSJim Jagielski     sal_Bool bExportContent )
2513*b1cdbd2cSJim Jagielski {
2514*b1cdbd2cSJim Jagielski 	DBG_ASSERT( xDiagram.is(), "Invalid XDiagram as parameter" );
2515*b1cdbd2cSJim Jagielski 	if( ! xDiagram.is())
2516*b1cdbd2cSJim Jagielski 		return;
2517*b1cdbd2cSJim Jagielski 
2518*b1cdbd2cSJim Jagielski 	// get some properties from document first
2519*b1cdbd2cSJim Jagielski 	sal_Bool bHasXAxis = sal_False,
2520*b1cdbd2cSJim Jagielski 		bHasYAxis = sal_False,
2521*b1cdbd2cSJim Jagielski 		bHasZAxis = sal_False,
2522*b1cdbd2cSJim Jagielski 		bHasSecondaryXAxis = sal_False,
2523*b1cdbd2cSJim Jagielski 		bHasSecondaryYAxis = sal_False;
2524*b1cdbd2cSJim Jagielski 	sal_Bool bHasXAxisTitle = sal_False,
2525*b1cdbd2cSJim Jagielski 		bHasYAxisTitle = sal_False,
2526*b1cdbd2cSJim Jagielski 		bHasZAxisTitle = sal_False,
2527*b1cdbd2cSJim Jagielski 		bHasSecondaryXAxisTitle = sal_False,
2528*b1cdbd2cSJim Jagielski 		bHasSecondaryYAxisTitle = sal_False;
2529*b1cdbd2cSJim Jagielski 	sal_Bool bHasXAxisMajorGrid = sal_False,
2530*b1cdbd2cSJim Jagielski 		bHasXAxisMinorGrid = sal_False,
2531*b1cdbd2cSJim Jagielski 		bHasYAxisMajorGrid = sal_False,
2532*b1cdbd2cSJim Jagielski 		bHasYAxisMinorGrid = sal_False,
2533*b1cdbd2cSJim Jagielski 		bHasZAxisMajorGrid = sal_False,
2534*b1cdbd2cSJim Jagielski 		bHasZAxisMinorGrid = sal_False;
2535*b1cdbd2cSJim Jagielski 
2536*b1cdbd2cSJim Jagielski     // get multiple properties using XMultiPropertySet
2537*b1cdbd2cSJim Jagielski 	MultiPropertySetHandler	aDiagramProperties (xDiagram);
2538*b1cdbd2cSJim Jagielski 
2539*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2540*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM("HasXAxis")), bHasXAxis);
2541*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2542*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM("HasYAxis")), bHasYAxis);
2543*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2544*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM("HasZAxis")), bHasZAxis);
2545*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2546*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM("HasSecondaryXAxis")), bHasSecondaryXAxis);
2547*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2548*b1cdbd2cSJim Jagielski 		OUString(RTL_CONSTASCII_USTRINGPARAM("HasSecondaryYAxis")), bHasSecondaryYAxis);
2549*b1cdbd2cSJim Jagielski 
2550*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2551*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasXAxisTitle")), bHasXAxisTitle);
2552*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2553*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasYAxisTitle")), bHasYAxisTitle);
2554*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2555*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasZAxisTitle")), bHasZAxisTitle);
2556*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2557*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasSecondaryXAxisTitle")), bHasSecondaryXAxisTitle);
2558*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2559*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasSecondaryYAxisTitle")), bHasSecondaryYAxisTitle);
2560*b1cdbd2cSJim Jagielski 
2561*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2562*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasXAxisGrid")), bHasXAxisMajorGrid);
2563*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2564*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasYAxisGrid")), bHasYAxisMajorGrid);
2565*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2566*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasZAxisGrid")), bHasZAxisMajorGrid);
2567*b1cdbd2cSJim Jagielski 
2568*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2569*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasXAxisHelpGrid")), bHasXAxisMinorGrid);
2570*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2571*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasYAxisHelpGrid")), bHasYAxisMinorGrid);
2572*b1cdbd2cSJim Jagielski 	aDiagramProperties.Add (
2573*b1cdbd2cSJim Jagielski 		OUString (RTL_CONSTASCII_USTRINGPARAM ("HasZAxisHelpGrid")), bHasZAxisMinorGrid);
2574*b1cdbd2cSJim Jagielski 
2575*b1cdbd2cSJim Jagielski     if ( ! aDiagramProperties.GetProperties ())
2576*b1cdbd2cSJim Jagielski     {
2577*b1cdbd2cSJim Jagielski         DBG_WARNING ("Required properties not found in Chart diagram");
2578*b1cdbd2cSJim Jagielski     }
2579*b1cdbd2cSJim Jagielski 
2580*b1cdbd2cSJim Jagielski     Reference< chart2::XCoordinateSystem > xCooSys( lcl_getCooSys(xNewDiagram) );
2581*b1cdbd2cSJim Jagielski 
2582*b1cdbd2cSJim Jagielski     // write an axis element also if the axis itself is not visible, but a grid or a title
2583*b1cdbd2cSJim Jagielski 
2584*b1cdbd2cSJim Jagielski     OUString aCategoriesRange;
2585*b1cdbd2cSJim Jagielski     Reference< chart::XAxisSupplier > xAxisSupp( xDiagram, uno::UNO_QUERY );
2586*b1cdbd2cSJim Jagielski 
2587*b1cdbd2cSJim Jagielski     // x axis
2588*b1cdbd2cSJim Jagielski 	// -------
2589*b1cdbd2cSJim Jagielski     Reference< ::com::sun::star::chart2::XAxis > xNewAxis = lcl_getAxis( xCooSys, XML_X );
2590*b1cdbd2cSJim Jagielski     if( xNewAxis.is() )
2591*b1cdbd2cSJim Jagielski     {
2592*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xAxisProps( xAxisSupp.is() ? xAxisSupp->getAxis(0) : 0, uno::UNO_QUERY );
2593*b1cdbd2cSJim Jagielski         if( mbHasCategoryLabels && bExportContent )
2594*b1cdbd2cSJim Jagielski         {
2595*b1cdbd2cSJim Jagielski             Reference< chart2::data::XLabeledDataSequence > xCategories( lcl_getCategories( xNewDiagram ) );
2596*b1cdbd2cSJim Jagielski             if( xCategories.is() )
2597*b1cdbd2cSJim Jagielski             {
2598*b1cdbd2cSJim Jagielski                 Reference< chart2::data::XDataSequence > xValues( xCategories->getValues() );
2599*b1cdbd2cSJim Jagielski                 if( xValues.is() )
2600*b1cdbd2cSJim Jagielski                 {
2601*b1cdbd2cSJim Jagielski                     Reference< chart2::XChartDocument > xNewDoc( mrExport.GetModel(), uno::UNO_QUERY );
2602*b1cdbd2cSJim Jagielski                     maCategoriesRange = xValues->getSourceRangeRepresentation();
2603*b1cdbd2cSJim Jagielski                     aCategoriesRange = lcl_ConvertRange( maCategoriesRange, xNewDoc );
2604*b1cdbd2cSJim Jagielski                 }
2605*b1cdbd2cSJim Jagielski             }
2606*b1cdbd2cSJim Jagielski         }
2607*b1cdbd2cSJim Jagielski         exportAxis( XML_X, XML_PRIMARY_X, xAxisProps, xNewAxis, aCategoriesRange, bHasXAxisTitle, bHasXAxisMajorGrid, bHasXAxisMinorGrid, bExportContent );
2608*b1cdbd2cSJim Jagielski         aCategoriesRange = OUString();
2609*b1cdbd2cSJim Jagielski     }
2610*b1cdbd2cSJim Jagielski 
2611*b1cdbd2cSJim Jagielski     // secondary x axis
2612*b1cdbd2cSJim Jagielski     // -------
2613*b1cdbd2cSJim Jagielski     Reference< chart::XSecondAxisTitleSupplier > xSecondTitleSupp( xDiagram, uno::UNO_QUERY );
2614*b1cdbd2cSJim Jagielski     xNewAxis = lcl_getAxis( xCooSys, XML_X, false );
2615*b1cdbd2cSJim Jagielski     if( xNewAxis.is() )
2616*b1cdbd2cSJim Jagielski     {
2617*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xAxisProps( xAxisSupp.is() ? xAxisSupp->getSecondaryAxis(0) : 0, uno::UNO_QUERY );
2618*b1cdbd2cSJim Jagielski         exportAxis( XML_X, XML_SECONDARY_X, xAxisProps, xNewAxis, aCategoriesRange, bHasSecondaryXAxisTitle, false, false, bExportContent );
2619*b1cdbd2cSJim Jagielski     }
2620*b1cdbd2cSJim Jagielski 
2621*b1cdbd2cSJim Jagielski 	// y axis
2622*b1cdbd2cSJim Jagielski 	// -------
2623*b1cdbd2cSJim Jagielski     xNewAxis = lcl_getAxis( xCooSys, XML_Y );
2624*b1cdbd2cSJim Jagielski     if( xNewAxis.is() )
2625*b1cdbd2cSJim Jagielski     {
2626*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xAxisProps( xAxisSupp.is() ? xAxisSupp->getAxis(1) : 0, uno::UNO_QUERY );
2627*b1cdbd2cSJim Jagielski         exportAxis( XML_Y, XML_PRIMARY_Y, xAxisProps, xNewAxis, aCategoriesRange, bHasYAxisTitle, bHasYAxisMajorGrid, bHasYAxisMinorGrid, bExportContent );
2628*b1cdbd2cSJim Jagielski     }
2629*b1cdbd2cSJim Jagielski 
2630*b1cdbd2cSJim Jagielski     // secondary y axis
2631*b1cdbd2cSJim Jagielski     // -------
2632*b1cdbd2cSJim Jagielski     xNewAxis = lcl_getAxis( xCooSys, XML_Y, false );
2633*b1cdbd2cSJim Jagielski     if( xNewAxis.is() )
2634*b1cdbd2cSJim Jagielski     {
2635*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xAxisProps( xAxisSupp.is() ? xAxisSupp->getSecondaryAxis(1) : 0, uno::UNO_QUERY );
2636*b1cdbd2cSJim Jagielski         exportAxis( XML_Y, XML_SECONDARY_Y, xAxisProps, xNewAxis, aCategoriesRange, bHasSecondaryYAxisTitle, false, false, bExportContent );
2637*b1cdbd2cSJim Jagielski     }
2638*b1cdbd2cSJim Jagielski 
2639*b1cdbd2cSJim Jagielski 	// z axis
2640*b1cdbd2cSJim Jagielski 	// -------
2641*b1cdbd2cSJim Jagielski     xNewAxis = lcl_getAxis( xCooSys, XML_Z );
2642*b1cdbd2cSJim Jagielski     if( xNewAxis.is() )
2643*b1cdbd2cSJim Jagielski     {
2644*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xAxisProps( xAxisSupp.is() ? xAxisSupp->getAxis(2) : 0, uno::UNO_QUERY );
2645*b1cdbd2cSJim Jagielski         exportAxis( XML_Z, XML_PRIMARY_Z, xAxisProps, xNewAxis, aCategoriesRange, bHasZAxisTitle, bHasZAxisMajorGrid, bHasZAxisMinorGrid, bExportContent );
2646*b1cdbd2cSJim Jagielski     }
2647*b1cdbd2cSJim Jagielski }
2648*b1cdbd2cSJim Jagielski 
2649*b1cdbd2cSJim Jagielski namespace
2650*b1cdbd2cSJim Jagielski {
lcl_hasNoValuesButText(const uno::Reference<chart2::data::XDataSequence> & xDataSequence)2651*b1cdbd2cSJim Jagielski     bool lcl_hasNoValuesButText( const uno::Reference< chart2::data::XDataSequence >& xDataSequence )
2652*b1cdbd2cSJim Jagielski     {
2653*b1cdbd2cSJim Jagielski         if( !xDataSequence.is() )
2654*b1cdbd2cSJim Jagielski             return false;//have no data
2655*b1cdbd2cSJim Jagielski 
2656*b1cdbd2cSJim Jagielski         Sequence< uno::Any > aData;
2657*b1cdbd2cSJim Jagielski         Reference< chart2::data::XNumericalDataSequence > xNumericalDataSequence( xDataSequence, uno::UNO_QUERY );
2658*b1cdbd2cSJim Jagielski         if( xNumericalDataSequence.is() )
2659*b1cdbd2cSJim Jagielski         {
2660*b1cdbd2cSJim Jagielski             Sequence< double >  aDoubles( xNumericalDataSequence->getNumericalData() );
2661*b1cdbd2cSJim Jagielski             sal_Int32 nCount = aDoubles.getLength();
2662*b1cdbd2cSJim Jagielski             for( sal_Int32 i = 0; i < nCount; ++i )
2663*b1cdbd2cSJim Jagielski             {
2664*b1cdbd2cSJim Jagielski                 if( !::rtl::math::isNan( aDoubles[i] ) )
2665*b1cdbd2cSJim Jagielski                     return false;//have double value
2666*b1cdbd2cSJim Jagielski             }
2667*b1cdbd2cSJim Jagielski         }
2668*b1cdbd2cSJim Jagielski         else
2669*b1cdbd2cSJim Jagielski         {
2670*b1cdbd2cSJim Jagielski             aData = xDataSequence->getData();
2671*b1cdbd2cSJim Jagielski             double fDouble = 0.0;
2672*b1cdbd2cSJim Jagielski             sal_Int32 nCount = aData.getLength();
2673*b1cdbd2cSJim Jagielski             for( sal_Int32 i = 0; i < nCount; ++i )
2674*b1cdbd2cSJim Jagielski             {
2675*b1cdbd2cSJim Jagielski                 if( (aData[i] >>= fDouble) && !::rtl::math::isNan( fDouble ) )
2676*b1cdbd2cSJim Jagielski                     return false;//have double value
2677*b1cdbd2cSJim Jagielski             }
2678*b1cdbd2cSJim Jagielski 
2679*b1cdbd2cSJim Jagielski         }
2680*b1cdbd2cSJim Jagielski         //no values found
2681*b1cdbd2cSJim Jagielski 
2682*b1cdbd2cSJim Jagielski         Reference< chart2::data::XTextualDataSequence > xTextualDataSequence( xDataSequence, uno::UNO_QUERY );
2683*b1cdbd2cSJim Jagielski         if( xTextualDataSequence.is() )
2684*b1cdbd2cSJim Jagielski         {
2685*b1cdbd2cSJim Jagielski             uno::Sequence< rtl::OUString > aStrings( xTextualDataSequence->getTextualData() );
2686*b1cdbd2cSJim Jagielski             sal_Int32 nCount = aStrings.getLength();
2687*b1cdbd2cSJim Jagielski             for( sal_Int32 i = 0; i < nCount; ++i )
2688*b1cdbd2cSJim Jagielski             {
2689*b1cdbd2cSJim Jagielski                 if( aStrings[i].getLength() )
2690*b1cdbd2cSJim Jagielski                     return true;//have text
2691*b1cdbd2cSJim Jagielski             }
2692*b1cdbd2cSJim Jagielski         }
2693*b1cdbd2cSJim Jagielski         else
2694*b1cdbd2cSJim Jagielski         {
2695*b1cdbd2cSJim Jagielski             if( !aData.getLength() )
2696*b1cdbd2cSJim Jagielski                 aData = xDataSequence->getData();
2697*b1cdbd2cSJim Jagielski             uno::Any aAny;
2698*b1cdbd2cSJim Jagielski             OUString aString;
2699*b1cdbd2cSJim Jagielski             sal_Int32 nCount = aData.getLength();
2700*b1cdbd2cSJim Jagielski             for( sal_Int32 i = 0; i < nCount; ++i )
2701*b1cdbd2cSJim Jagielski             {
2702*b1cdbd2cSJim Jagielski                 if( (aData[i]>>=aString) && aString.getLength() )
2703*b1cdbd2cSJim Jagielski                     return true;//have text
2704*b1cdbd2cSJim Jagielski             }
2705*b1cdbd2cSJim Jagielski         }
2706*b1cdbd2cSJim Jagielski         //no doubles and no texts
2707*b1cdbd2cSJim Jagielski         return false;
2708*b1cdbd2cSJim Jagielski     }
2709*b1cdbd2cSJim Jagielski }
2710*b1cdbd2cSJim Jagielski 
exportSeries(const Reference<chart2::XDiagram> & xNewDiagram,const awt::Size & rPageSize,sal_Bool bExportContent,sal_Bool bHasTwoYAxes)2711*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportSeries(
2712*b1cdbd2cSJim Jagielski     const Reference< chart2::XDiagram > & xNewDiagram,
2713*b1cdbd2cSJim Jagielski     const awt::Size & rPageSize,
2714*b1cdbd2cSJim Jagielski     sal_Bool bExportContent,
2715*b1cdbd2cSJim Jagielski     sal_Bool bHasTwoYAxes )
2716*b1cdbd2cSJim Jagielski {
2717*b1cdbd2cSJim Jagielski     Reference< chart2::XCoordinateSystemContainer > xBCooSysCnt( xNewDiagram, uno::UNO_QUERY );
2718*b1cdbd2cSJim Jagielski     if( ! xBCooSysCnt.is())
2719*b1cdbd2cSJim Jagielski         return;
2720*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xNewDoc( mrExport.GetModel(), uno::UNO_QUERY );
2721*b1cdbd2cSJim Jagielski 
2722*b1cdbd2cSJim Jagielski     OUString aFirstXDomainRange;
2723*b1cdbd2cSJim Jagielski     OUString aFirstYDomainRange;
2724*b1cdbd2cSJim Jagielski 
2725*b1cdbd2cSJim Jagielski 	std::vector< XMLPropertyState > aPropertyStates;
2726*b1cdbd2cSJim Jagielski 
2727*b1cdbd2cSJim Jagielski     const OUString sNumFormat( OUString::createFromAscii( "NumberFormat" ));
2728*b1cdbd2cSJim Jagielski     const OUString sPercentageNumFormat( OUString::createFromAscii( "PercentageNumberFormat" ));
2729*b1cdbd2cSJim Jagielski 
2730*b1cdbd2cSJim Jagielski     Sequence< Reference< chart2::XCoordinateSystem > >
2731*b1cdbd2cSJim Jagielski         aCooSysSeq( xBCooSysCnt->getCoordinateSystems());
2732*b1cdbd2cSJim Jagielski     for( sal_Int32 nCSIdx=0; nCSIdx<aCooSysSeq.getLength(); ++nCSIdx )
2733*b1cdbd2cSJim Jagielski     {
2734*b1cdbd2cSJim Jagielski         Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nCSIdx], uno::UNO_QUERY );
2735*b1cdbd2cSJim Jagielski         if( ! xCTCnt.is())
2736*b1cdbd2cSJim Jagielski             continue;
2737*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XChartType > > aCTSeq( xCTCnt->getChartTypes());
2738*b1cdbd2cSJim Jagielski         for( sal_Int32 nCTIdx=0; nCTIdx<aCTSeq.getLength(); ++nCTIdx )
2739*b1cdbd2cSJim Jagielski         {
2740*b1cdbd2cSJim Jagielski             Reference< chart2::XDataSeriesContainer > xDSCnt( aCTSeq[nCTIdx], uno::UNO_QUERY );
2741*b1cdbd2cSJim Jagielski             if( ! xDSCnt.is())
2742*b1cdbd2cSJim Jagielski                 continue;
2743*b1cdbd2cSJim Jagielski             // note: if xDSCnt.is() then also aCTSeq[nCTIdx]
2744*b1cdbd2cSJim Jagielski             OUString aChartType( aCTSeq[nCTIdx]->getChartType());
2745*b1cdbd2cSJim Jagielski             OUString aLabelRole = aCTSeq[nCTIdx]->getRoleOfSequenceForSeriesLabel();
2746*b1cdbd2cSJim Jagielski 
2747*b1cdbd2cSJim Jagielski             // special export for stock charts
2748*b1cdbd2cSJim Jagielski             if( aChartType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.chart2.CandleStickChartType")))
2749*b1cdbd2cSJim Jagielski             {
2750*b1cdbd2cSJim Jagielski                 sal_Bool bJapaneseCandleSticks = sal_False;
2751*b1cdbd2cSJim Jagielski                 Reference< beans::XPropertySet > xCTProp( aCTSeq[nCTIdx], uno::UNO_QUERY );
2752*b1cdbd2cSJim Jagielski                 if( xCTProp.is())
2753*b1cdbd2cSJim Jagielski                     xCTProp->getPropertyValue( OUString::createFromAscii("Japanese")) >>= bJapaneseCandleSticks;
2754*b1cdbd2cSJim Jagielski                 exportCandleStickSeries(
2755*b1cdbd2cSJim Jagielski                     xDSCnt->getDataSeries(), xNewDiagram, bJapaneseCandleSticks, bExportContent );
2756*b1cdbd2cSJim Jagielski                 continue;
2757*b1cdbd2cSJim Jagielski             }
2758*b1cdbd2cSJim Jagielski 
2759*b1cdbd2cSJim Jagielski             // export dataseries for current chart-type
2760*b1cdbd2cSJim Jagielski             Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xDSCnt->getDataSeries());
2761*b1cdbd2cSJim Jagielski             for( sal_Int32 nSeriesIdx=0; nSeriesIdx<aSeriesSeq.getLength(); ++nSeriesIdx )
2762*b1cdbd2cSJim Jagielski             {
2763*b1cdbd2cSJim Jagielski                 // export series
2764*b1cdbd2cSJim Jagielski                 Reference< chart2::data::XDataSource > xSource( aSeriesSeq[nSeriesIdx], uno::UNO_QUERY );
2765*b1cdbd2cSJim Jagielski                 if( xSource.is())
2766*b1cdbd2cSJim Jagielski                 {
2767*b1cdbd2cSJim Jagielski                     SvXMLElementExport* pSeries = NULL;
2768*b1cdbd2cSJim Jagielski                     Sequence< Reference< chart2::data::XLabeledDataSequence > > aSeqCnt(
2769*b1cdbd2cSJim Jagielski                         xSource->getDataSequences());
2770*b1cdbd2cSJim Jagielski                     sal_Int32 nMainSequenceIndex = -1;
2771*b1cdbd2cSJim Jagielski                     sal_Int32 nSeriesLength = 0;
2772*b1cdbd2cSJim Jagielski                     sal_Int32 nAttachedAxis = chart::ChartAxisAssign::PRIMARY_Y;
2773*b1cdbd2cSJim Jagielski                     sal_Bool bHasMeanValueLine = false;
2774*b1cdbd2cSJim Jagielski                     chart::ChartRegressionCurveType eRegressionType( chart::ChartRegressionCurveType_NONE );
2775*b1cdbd2cSJim Jagielski                     chart::ChartErrorIndicatorType eErrorType( chart::ChartErrorIndicatorType_NONE );
2776*b1cdbd2cSJim Jagielski                     sal_Int32 nErrorBarStyle( chart::ErrorBarStyle::NONE );
2777*b1cdbd2cSJim Jagielski                     Reference< beans::XPropertySet > xPropSet;
2778*b1cdbd2cSJim Jagielski                     tLabelValuesDataPair aSeriesLabelValuesPair;
2779*b1cdbd2cSJim Jagielski 
2780*b1cdbd2cSJim Jagielski                     // search for main sequence and create a series element
2781*b1cdbd2cSJim Jagielski                     {
2782*b1cdbd2cSJim Jagielski                         Reference< chart2::data::XDataSequence > xValuesSeq;
2783*b1cdbd2cSJim Jagielski                         Reference< chart2::data::XDataSequence > xLabelSeq;
2784*b1cdbd2cSJim Jagielski                         sal_Int32 nSeqIdx=0;
2785*b1cdbd2cSJim Jagielski                         for( ; nSeqIdx<aSeqCnt.getLength(); ++nSeqIdx )
2786*b1cdbd2cSJim Jagielski                         {
2787*b1cdbd2cSJim Jagielski                             OUString aRole;
2788*b1cdbd2cSJim Jagielski                             Reference< chart2::data::XDataSequence > xTempValueSeq( aSeqCnt[nSeqIdx]->getValues() );
2789*b1cdbd2cSJim Jagielski                             if( nMainSequenceIndex==-1 )
2790*b1cdbd2cSJim Jagielski                             {
2791*b1cdbd2cSJim Jagielski                                 Reference< beans::XPropertySet > xSeqProp( xTempValueSeq, uno::UNO_QUERY );
2792*b1cdbd2cSJim Jagielski                                 if( xSeqProp.is())
2793*b1cdbd2cSJim Jagielski                                     xSeqProp->getPropertyValue(OUString::createFromAscii("Role")) >>= aRole;
2794*b1cdbd2cSJim Jagielski                                 // "main" sequence
2795*b1cdbd2cSJim Jagielski                                 if( aRole.equals( aLabelRole ))
2796*b1cdbd2cSJim Jagielski                                 {
2797*b1cdbd2cSJim Jagielski                                     xValuesSeq.set( xTempValueSeq );
2798*b1cdbd2cSJim Jagielski                                     xLabelSeq.set( aSeqCnt[nSeqIdx]->getLabel());
2799*b1cdbd2cSJim Jagielski                                     nMainSequenceIndex = nSeqIdx;
2800*b1cdbd2cSJim Jagielski                                 }
2801*b1cdbd2cSJim Jagielski                             }
2802*b1cdbd2cSJim Jagielski                             sal_Int32 nSequenceLength = (xTempValueSeq.is()? xTempValueSeq->getData().getLength() : sal_Int32(0));
2803*b1cdbd2cSJim Jagielski                             if( nSeriesLength < nSequenceLength )
2804*b1cdbd2cSJim Jagielski                                 nSeriesLength = nSequenceLength;
2805*b1cdbd2cSJim Jagielski                         }
2806*b1cdbd2cSJim Jagielski 
2807*b1cdbd2cSJim Jagielski                         // have found the main sequence, then xValuesSeq and
2808*b1cdbd2cSJim Jagielski                         // xLabelSeq contain those.  Otherwise both are empty
2809*b1cdbd2cSJim Jagielski                         {
2810*b1cdbd2cSJim Jagielski                             // get property states for autostyles
2811*b1cdbd2cSJim Jagielski                             try
2812*b1cdbd2cSJim Jagielski                             {
2813*b1cdbd2cSJim Jagielski                                 xPropSet = SchXMLSeriesHelper::createOldAPISeriesPropertySet(
2814*b1cdbd2cSJim Jagielski                                     aSeriesSeq[nSeriesIdx], mrExport.GetModel() );
2815*b1cdbd2cSJim Jagielski                             }
2816*b1cdbd2cSJim Jagielski                             catch( uno::Exception & rEx )
2817*b1cdbd2cSJim Jagielski                             {
2818*b1cdbd2cSJim Jagielski                                 (void)rEx; // avoid warning for pro build
2819*b1cdbd2cSJim Jagielski                                 OSL_TRACE(
2820*b1cdbd2cSJim Jagielski                                     OUStringToOString(
2821*b1cdbd2cSJim Jagielski                                         OUString( RTL_CONSTASCII_USTRINGPARAM(
2822*b1cdbd2cSJim Jagielski                                                       "Series not found or no XPropertySet: " )) +
2823*b1cdbd2cSJim Jagielski                                         rEx.Message,
2824*b1cdbd2cSJim Jagielski                                         RTL_TEXTENCODING_ASCII_US ).getStr());
2825*b1cdbd2cSJim Jagielski                                 continue;
2826*b1cdbd2cSJim Jagielski                             }
2827*b1cdbd2cSJim Jagielski                             if( xPropSet.is())
2828*b1cdbd2cSJim Jagielski                             {
2829*b1cdbd2cSJim Jagielski                                 // determine attached axis
2830*b1cdbd2cSJim Jagielski                                 try
2831*b1cdbd2cSJim Jagielski                                 {
2832*b1cdbd2cSJim Jagielski                                     Any aAny( xPropSet->getPropertyValue(
2833*b1cdbd2cSJim Jagielski                                                   OUString( RTL_CONSTASCII_USTRINGPARAM( "Axis" ))));
2834*b1cdbd2cSJim Jagielski                                     aAny >>= nAttachedAxis;
2835*b1cdbd2cSJim Jagielski 
2836*b1cdbd2cSJim Jagielski                                     aAny = xPropSet->getPropertyValue(
2837*b1cdbd2cSJim Jagielski                                         OUString( RTL_CONSTASCII_USTRINGPARAM ( "MeanValue" )));
2838*b1cdbd2cSJim Jagielski                                     aAny >>= bHasMeanValueLine;
2839*b1cdbd2cSJim Jagielski 
2840*b1cdbd2cSJim Jagielski                                     aAny = xPropSet->getPropertyValue(
2841*b1cdbd2cSJim Jagielski                                         OUString( RTL_CONSTASCII_USTRINGPARAM( "RegressionCurves" )));
2842*b1cdbd2cSJim Jagielski                                     aAny >>= eRegressionType;
2843*b1cdbd2cSJim Jagielski 
2844*b1cdbd2cSJim Jagielski                                     aAny = xPropSet->getPropertyValue(
2845*b1cdbd2cSJim Jagielski                                         OUString( RTL_CONSTASCII_USTRINGPARAM( "ErrorIndicator" )));
2846*b1cdbd2cSJim Jagielski                                     aAny >>= eErrorType;
2847*b1cdbd2cSJim Jagielski 
2848*b1cdbd2cSJim Jagielski                                     aAny = xPropSet->getPropertyValue(
2849*b1cdbd2cSJim Jagielski                                         OUString( RTL_CONSTASCII_USTRINGPARAM( "ErrorBarStyle" )));
2850*b1cdbd2cSJim Jagielski                                     aAny >>= nErrorBarStyle;
2851*b1cdbd2cSJim Jagielski                                 }
2852*b1cdbd2cSJim Jagielski                                 catch( beans::UnknownPropertyException & rEx )
2853*b1cdbd2cSJim Jagielski                                 {
2854*b1cdbd2cSJim Jagielski                                     (void)rEx; // avoid warning for pro build
2855*b1cdbd2cSJim Jagielski                                     OSL_TRACE(
2856*b1cdbd2cSJim Jagielski                                         OUStringToOString(
2857*b1cdbd2cSJim Jagielski                                             OUString( RTL_CONSTASCII_USTRINGPARAM(
2858*b1cdbd2cSJim Jagielski                                                           "Required property not found in DataRowProperties: " )) +
2859*b1cdbd2cSJim Jagielski                                             rEx.Message,
2860*b1cdbd2cSJim Jagielski                                             RTL_TEXTENCODING_ASCII_US ).getStr());
2861*b1cdbd2cSJim Jagielski                                 }
2862*b1cdbd2cSJim Jagielski 
2863*b1cdbd2cSJim Jagielski                                 const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
2864*b1cdbd2cSJim Jagielski                                 if( nCurrentODFVersion >= SvtSaveOptions::ODFVER_012 )
2865*b1cdbd2cSJim Jagielski                                 {
2866*b1cdbd2cSJim Jagielski                                     lcl_exportNumberFormat( sNumFormat, xPropSet, mrExport );
2867*b1cdbd2cSJim Jagielski                                     lcl_exportNumberFormat( sPercentageNumFormat, xPropSet, mrExport );
2868*b1cdbd2cSJim Jagielski                                 }
2869*b1cdbd2cSJim Jagielski 
2870*b1cdbd2cSJim Jagielski                                 if( mxExpPropMapper.is())
2871*b1cdbd2cSJim Jagielski                                     aPropertyStates = mxExpPropMapper->Filter( xPropSet );
2872*b1cdbd2cSJim Jagielski                             }
2873*b1cdbd2cSJim Jagielski 
2874*b1cdbd2cSJim Jagielski                             if( bExportContent )
2875*b1cdbd2cSJim Jagielski                             {
2876*b1cdbd2cSJim Jagielski                                 if( bHasTwoYAxes )
2877*b1cdbd2cSJim Jagielski                                 {
2878*b1cdbd2cSJim Jagielski                                     if( nAttachedAxis == chart::ChartAxisAssign::SECONDARY_Y )
2879*b1cdbd2cSJim Jagielski                                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_SECONDARY_Y );
2880*b1cdbd2cSJim Jagielski                                     else
2881*b1cdbd2cSJim Jagielski                                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_PRIMARY_Y );
2882*b1cdbd2cSJim Jagielski                                 }
2883*b1cdbd2cSJim Jagielski 
2884*b1cdbd2cSJim Jagielski                                 // write style name
2885*b1cdbd2cSJim Jagielski                                 AddAutoStyleAttribute( aPropertyStates );
2886*b1cdbd2cSJim Jagielski 
2887*b1cdbd2cSJim Jagielski                                 if( xValuesSeq.is())
2888*b1cdbd2cSJim Jagielski                                     mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_VALUES_CELL_RANGE_ADDRESS,
2889*b1cdbd2cSJim Jagielski                                                            lcl_ConvertRange(
2890*b1cdbd2cSJim Jagielski                                                                xValuesSeq->getSourceRangeRepresentation(),
2891*b1cdbd2cSJim Jagielski                                                                xNewDoc ));
2892*b1cdbd2cSJim Jagielski                                 else
2893*b1cdbd2cSJim Jagielski                                     // #i75297# allow empty series, export empty range to have all ranges on import
2894*b1cdbd2cSJim Jagielski                                     mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_VALUES_CELL_RANGE_ADDRESS, OUString());
2895*b1cdbd2cSJim Jagielski 
2896*b1cdbd2cSJim Jagielski                                 if( xLabelSeq.is())
2897*b1cdbd2cSJim Jagielski                                     mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_LABEL_CELL_ADDRESS,
2898*b1cdbd2cSJim Jagielski                                                            lcl_ConvertRange(
2899*b1cdbd2cSJim Jagielski                                                                xLabelSeq->getSourceRangeRepresentation(),
2900*b1cdbd2cSJim Jagielski                                                                xNewDoc ));
2901*b1cdbd2cSJim Jagielski                                 if( xLabelSeq.is() || xValuesSeq.is() )
2902*b1cdbd2cSJim Jagielski                                     aSeriesLabelValuesPair = tLabelValuesDataPair( xLabelSeq, xValuesSeq );
2903*b1cdbd2cSJim Jagielski 
2904*b1cdbd2cSJim Jagielski                                 // chart-type for mixed types
2905*b1cdbd2cSJim Jagielski                                 enum XMLTokenEnum eCTToken(
2906*b1cdbd2cSJim Jagielski                                     SchXMLTools::getTokenByChartType( aChartType, false /* bUseOldNames */ ));
2907*b1cdbd2cSJim Jagielski                                 //@todo: get token for current charttype
2908*b1cdbd2cSJim Jagielski                                 mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_CLASS,
2909*b1cdbd2cSJim Jagielski                                                        mrExport.GetNamespaceMap().GetQNameByKey(
2910*b1cdbd2cSJim Jagielski                                                            XML_NAMESPACE_CHART, GetXMLToken( eCTToken )));
2911*b1cdbd2cSJim Jagielski 
2912*b1cdbd2cSJim Jagielski                                 // open series element until end of for loop
2913*b1cdbd2cSJim Jagielski                                 pSeries = new SvXMLElementExport( mrExport, XML_NAMESPACE_CHART, XML_SERIES, sal_True, sal_True );
2914*b1cdbd2cSJim Jagielski                             }
2915*b1cdbd2cSJim Jagielski                             else	// autostyles
2916*b1cdbd2cSJim Jagielski                             {
2917*b1cdbd2cSJim Jagielski                                 CollectAutoStyle( aPropertyStates );
2918*b1cdbd2cSJim Jagielski                             }
2919*b1cdbd2cSJim Jagielski                             // remove property states for autostyles
2920*b1cdbd2cSJim Jagielski                             aPropertyStates.clear();
2921*b1cdbd2cSJim Jagielski                         }
2922*b1cdbd2cSJim Jagielski                     }
2923*b1cdbd2cSJim Jagielski 
2924*b1cdbd2cSJim Jagielski                     // export domain elements if we have a series parent element
2925*b1cdbd2cSJim Jagielski                     if( pSeries )
2926*b1cdbd2cSJim Jagielski                     {
2927*b1cdbd2cSJim Jagielski                         // domain elements
2928*b1cdbd2cSJim Jagielski                         if( bExportContent )
2929*b1cdbd2cSJim Jagielski                         {
2930*b1cdbd2cSJim Jagielski                             bool bIsScatterChart = aChartType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.chart2.ScatterChartType"));
2931*b1cdbd2cSJim Jagielski                             bool bIsBubbleChart = aChartType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.chart2.BubbleChartType"));
2932*b1cdbd2cSJim Jagielski                             Reference< chart2::data::XDataSequence > xYValuesForBubbleChart;
2933*b1cdbd2cSJim Jagielski                             if( bIsBubbleChart )
2934*b1cdbd2cSJim Jagielski                             {
2935*b1cdbd2cSJim Jagielski                                 Reference< chart2::data::XLabeledDataSequence > xSequence( lcl_getDataSequenceByRole( aSeqCnt, OUString::createFromAscii("values-y" ) ) );
2936*b1cdbd2cSJim Jagielski                                 if( xSequence.is() )
2937*b1cdbd2cSJim Jagielski                                 {
2938*b1cdbd2cSJim Jagielski                                     xYValuesForBubbleChart = xSequence->getValues();
2939*b1cdbd2cSJim Jagielski                                     if( !lcl_exportDomainForThisSequence( xYValuesForBubbleChart, aFirstYDomainRange, mrExport ) )
2940*b1cdbd2cSJim Jagielski                                         xYValuesForBubbleChart = 0;
2941*b1cdbd2cSJim Jagielski                                 }
2942*b1cdbd2cSJim Jagielski                             }
2943*b1cdbd2cSJim Jagielski                             if( bIsScatterChart || bIsBubbleChart )
2944*b1cdbd2cSJim Jagielski                             {
2945*b1cdbd2cSJim Jagielski                                 Reference< chart2::data::XLabeledDataSequence > xSequence( lcl_getDataSequenceByRole( aSeqCnt, OUString::createFromAscii("values-x" ) ) );
2946*b1cdbd2cSJim Jagielski                                 if( xSequence.is() )
2947*b1cdbd2cSJim Jagielski                                 {
2948*b1cdbd2cSJim Jagielski                                     Reference< chart2::data::XDataSequence > xValues( xSequence->getValues() );
2949*b1cdbd2cSJim Jagielski                                     if( lcl_exportDomainForThisSequence( xValues, aFirstXDomainRange, mrExport ) )
2950*b1cdbd2cSJim Jagielski                                         m_aDataSequencesToExport.push_back( tLabelValuesDataPair( 0, xValues ));
2951*b1cdbd2cSJim Jagielski                                 }
2952*b1cdbd2cSJim Jagielski                                 else if( nSeriesIdx==0 )
2953*b1cdbd2cSJim Jagielski                                 {
2954*b1cdbd2cSJim Jagielski                                     //might be that the categories are used as x-values (e.g. for date axis) -> export them accordingly
2955*b1cdbd2cSJim Jagielski                                     Reference< chart2::data::XLabeledDataSequence > xCategories( lcl_getCategories( xNewDiagram ) );
2956*b1cdbd2cSJim Jagielski                                     if( xCategories.is() )
2957*b1cdbd2cSJim Jagielski                                     {
2958*b1cdbd2cSJim Jagielski                                         Reference< chart2::data::XDataSequence > xValues( xCategories->getValues() );
2959*b1cdbd2cSJim Jagielski                                         if( !lcl_hasNoValuesButText( xValues ) )
2960*b1cdbd2cSJim Jagielski                                             lcl_exportDomainForThisSequence( xValues, aFirstXDomainRange, mrExport );
2961*b1cdbd2cSJim Jagielski                                     }
2962*b1cdbd2cSJim Jagielski                                 }
2963*b1cdbd2cSJim Jagielski                             }
2964*b1cdbd2cSJim Jagielski                             if( xYValuesForBubbleChart.is() )
2965*b1cdbd2cSJim Jagielski                                 m_aDataSequencesToExport.push_back( tLabelValuesDataPair( 0, xYValuesForBubbleChart ));
2966*b1cdbd2cSJim Jagielski                         }
2967*b1cdbd2cSJim Jagielski                     }
2968*b1cdbd2cSJim Jagielski 
2969*b1cdbd2cSJim Jagielski                     // add sequences for main sequence after domain sequences,
2970*b1cdbd2cSJim Jagielski                     // so that the export of the local table has the correct order
2971*b1cdbd2cSJim Jagielski                     if( bExportContent &&
2972*b1cdbd2cSJim Jagielski                         (aSeriesLabelValuesPair.first.is() || aSeriesLabelValuesPair.second.is()))
2973*b1cdbd2cSJim Jagielski                         m_aDataSequencesToExport.push_back( aSeriesLabelValuesPair );
2974*b1cdbd2cSJim Jagielski 
2975*b1cdbd2cSJim Jagielski                     // statistical objects:
2976*b1cdbd2cSJim Jagielski                     // regression curves and mean value lines
2977*b1cdbd2cSJim Jagielski                     if( bHasMeanValueLine &&
2978*b1cdbd2cSJim Jagielski                         xPropSet.is() &&
2979*b1cdbd2cSJim Jagielski                         mxExpPropMapper.is() )
2980*b1cdbd2cSJim Jagielski                     {
2981*b1cdbd2cSJim Jagielski                         Reference< beans::XPropertySet > xStatProp;
2982*b1cdbd2cSJim Jagielski                         try
2983*b1cdbd2cSJim Jagielski                         {
2984*b1cdbd2cSJim Jagielski                             Any aPropAny( xPropSet->getPropertyValue(
2985*b1cdbd2cSJim Jagielski                                             OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMeanValueProperties" ))));
2986*b1cdbd2cSJim Jagielski                             aPropAny >>= xStatProp;
2987*b1cdbd2cSJim Jagielski                         }
2988*b1cdbd2cSJim Jagielski                         catch( uno::Exception & rEx )
2989*b1cdbd2cSJim Jagielski                         {
2990*b1cdbd2cSJim Jagielski                             (void)rEx; // avoid warning for pro build
2991*b1cdbd2cSJim Jagielski                             DBG_ERROR1( "Exception caught during Export of series - optional DataMeanValueProperties not available: %s",
2992*b1cdbd2cSJim Jagielski                                         OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
2993*b1cdbd2cSJim Jagielski                         }
2994*b1cdbd2cSJim Jagielski 
2995*b1cdbd2cSJim Jagielski                         if( xStatProp.is() )
2996*b1cdbd2cSJim Jagielski                         {
2997*b1cdbd2cSJim Jagielski                             aPropertyStates = mxExpPropMapper->Filter( xStatProp );
2998*b1cdbd2cSJim Jagielski 
2999*b1cdbd2cSJim Jagielski                             if( !aPropertyStates.empty() )
3000*b1cdbd2cSJim Jagielski                             {
3001*b1cdbd2cSJim Jagielski                                 // write element
3002*b1cdbd2cSJim Jagielski                                 if( bExportContent )
3003*b1cdbd2cSJim Jagielski                                 {
3004*b1cdbd2cSJim Jagielski                                     // add style name attribute
3005*b1cdbd2cSJim Jagielski                                     AddAutoStyleAttribute( aPropertyStates );
3006*b1cdbd2cSJim Jagielski 
3007*b1cdbd2cSJim Jagielski                                     SvXMLElementExport( mrExport, XML_NAMESPACE_CHART, XML_MEAN_VALUE, sal_True, sal_True );
3008*b1cdbd2cSJim Jagielski                                 }
3009*b1cdbd2cSJim Jagielski                                 else	// autostyles
3010*b1cdbd2cSJim Jagielski                                 {
3011*b1cdbd2cSJim Jagielski                                     CollectAutoStyle( aPropertyStates );
3012*b1cdbd2cSJim Jagielski                                 }
3013*b1cdbd2cSJim Jagielski                             }
3014*b1cdbd2cSJim Jagielski                         }
3015*b1cdbd2cSJim Jagielski                     }
3016*b1cdbd2cSJim Jagielski 
3017*b1cdbd2cSJim Jagielski                     if( eRegressionType != chart::ChartRegressionCurveType_NONE &&
3018*b1cdbd2cSJim Jagielski                         xPropSet.is() &&
3019*b1cdbd2cSJim Jagielski                         mxExpPropMapper.is() )
3020*b1cdbd2cSJim Jagielski                     {
3021*b1cdbd2cSJim Jagielski                         exportRegressionCurve( aSeriesSeq[nSeriesIdx], xPropSet, rPageSize, bExportContent );
3022*b1cdbd2cSJim Jagielski                     }
3023*b1cdbd2cSJim Jagielski 
3024*b1cdbd2cSJim Jagielski                     if( nErrorBarStyle != chart::ErrorBarStyle::NONE &&
3025*b1cdbd2cSJim Jagielski                         eErrorType != chart::ChartErrorIndicatorType_NONE &&
3026*b1cdbd2cSJim Jagielski                         xPropSet.is() &&
3027*b1cdbd2cSJim Jagielski                         mxExpPropMapper.is() )
3028*b1cdbd2cSJim Jagielski                     {
3029*b1cdbd2cSJim Jagielski                         Reference< beans::XPropertySet > xStatProp;
3030*b1cdbd2cSJim Jagielski                         try
3031*b1cdbd2cSJim Jagielski                         {
3032*b1cdbd2cSJim Jagielski                             Any aPropAny( xPropSet->getPropertyValue(
3033*b1cdbd2cSJim Jagielski                                             OUString( RTL_CONSTASCII_USTRINGPARAM( "DataErrorProperties" ))));
3034*b1cdbd2cSJim Jagielski                             aPropAny >>= xStatProp;
3035*b1cdbd2cSJim Jagielski                         }
3036*b1cdbd2cSJim Jagielski                         catch( uno::Exception & rEx )
3037*b1cdbd2cSJim Jagielski                         {
3038*b1cdbd2cSJim Jagielski                             (void)rEx; // avoid warning for pro build
3039*b1cdbd2cSJim Jagielski                             DBG_ERROR1( "Exception caught during Export of series - optional DataErrorProperties not available: %s",
3040*b1cdbd2cSJim Jagielski                                         OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
3041*b1cdbd2cSJim Jagielski                         }
3042*b1cdbd2cSJim Jagielski 
3043*b1cdbd2cSJim Jagielski                         if( xStatProp.is() )
3044*b1cdbd2cSJim Jagielski                         {
3045*b1cdbd2cSJim Jagielski                             if( bExportContent &&
3046*b1cdbd2cSJim Jagielski                                 nErrorBarStyle == chart::ErrorBarStyle::FROM_DATA )
3047*b1cdbd2cSJim Jagielski                             {
3048*b1cdbd2cSJim Jagielski                                 // register data ranges for error bars for export in local table
3049*b1cdbd2cSJim Jagielski                                 ::std::vector< Reference< chart2::data::XDataSequence > > aErrorBarSequences(
3050*b1cdbd2cSJim Jagielski                                     lcl_getErrorBarSequences( xStatProp ));
3051*b1cdbd2cSJim Jagielski                                 for( ::std::vector< Reference< chart2::data::XDataSequence > >::const_iterator aIt(
3052*b1cdbd2cSJim Jagielski                                          aErrorBarSequences.begin()); aIt != aErrorBarSequences.end(); ++aIt )
3053*b1cdbd2cSJim Jagielski                                 {
3054*b1cdbd2cSJim Jagielski                                     m_aDataSequencesToExport.push_back( tLabelValuesDataPair( 0, *aIt ));
3055*b1cdbd2cSJim Jagielski                                 }
3056*b1cdbd2cSJim Jagielski                             }
3057*b1cdbd2cSJim Jagielski 
3058*b1cdbd2cSJim Jagielski                             aPropertyStates = mxExpPropMapper->Filter( xStatProp );
3059*b1cdbd2cSJim Jagielski 
3060*b1cdbd2cSJim Jagielski                             if( !aPropertyStates.empty() )
3061*b1cdbd2cSJim Jagielski                             {
3062*b1cdbd2cSJim Jagielski                                 // write element
3063*b1cdbd2cSJim Jagielski                                 if( bExportContent )
3064*b1cdbd2cSJim Jagielski                                 {
3065*b1cdbd2cSJim Jagielski                                     // add style name attribute
3066*b1cdbd2cSJim Jagielski                                     AddAutoStyleAttribute( aPropertyStates );
3067*b1cdbd2cSJim Jagielski 
3068*b1cdbd2cSJim Jagielski                                     const SvtSaveOptions::ODFDefaultVersion nCurrentVersion( SvtSaveOptions().GetODFDefaultVersion() );
3069*b1cdbd2cSJim Jagielski                                     if( nCurrentVersion >= SvtSaveOptions::ODFVER_012 )
3070*b1cdbd2cSJim Jagielski                                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_DIMENSION, XML_Y );//#i114149#
3071*b1cdbd2cSJim Jagielski                                     SvXMLElementExport( mrExport, XML_NAMESPACE_CHART, XML_ERROR_INDICATOR, sal_True, sal_True );
3072*b1cdbd2cSJim Jagielski                                 }
3073*b1cdbd2cSJim Jagielski                                 else	// autostyles
3074*b1cdbd2cSJim Jagielski                                 {
3075*b1cdbd2cSJim Jagielski                                     CollectAutoStyle( aPropertyStates );
3076*b1cdbd2cSJim Jagielski                                 }
3077*b1cdbd2cSJim Jagielski                             }
3078*b1cdbd2cSJim Jagielski                         }
3079*b1cdbd2cSJim Jagielski                     }
3080*b1cdbd2cSJim Jagielski 
3081*b1cdbd2cSJim Jagielski                     exportDataPoints(
3082*b1cdbd2cSJim Jagielski                         uno::Reference< beans::XPropertySet >( aSeriesSeq[nSeriesIdx], uno::UNO_QUERY ),
3083*b1cdbd2cSJim Jagielski                         nSeriesLength, xNewDiagram, bExportContent );
3084*b1cdbd2cSJim Jagielski 
3085*b1cdbd2cSJim Jagielski                     // close series element
3086*b1cdbd2cSJim Jagielski                     if( pSeries )
3087*b1cdbd2cSJim Jagielski                         delete pSeries;
3088*b1cdbd2cSJim Jagielski                 }
3089*b1cdbd2cSJim Jagielski             }
3090*b1cdbd2cSJim Jagielski             aPropertyStates.clear();
3091*b1cdbd2cSJim Jagielski         }
3092*b1cdbd2cSJim Jagielski     }
3093*b1cdbd2cSJim Jagielski }
3094*b1cdbd2cSJim Jagielski 
exportRegressionCurve(const Reference<chart2::XDataSeries> & xSeries,const Reference<beans::XPropertySet> & xSeriesProp,const awt::Size & rPageSize,sal_Bool bExportContent)3095*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportRegressionCurve(
3096*b1cdbd2cSJim Jagielski     const Reference< chart2::XDataSeries > & xSeries,
3097*b1cdbd2cSJim Jagielski     const Reference< beans::XPropertySet > & xSeriesProp,
3098*b1cdbd2cSJim Jagielski     const awt::Size & rPageSize,
3099*b1cdbd2cSJim Jagielski     sal_Bool bExportContent )
3100*b1cdbd2cSJim Jagielski {
3101*b1cdbd2cSJim Jagielski     OSL_ASSERT( mxExpPropMapper.is());
3102*b1cdbd2cSJim Jagielski 
3103*b1cdbd2cSJim Jagielski 	std::vector< XMLPropertyState > aPropertyStates;
3104*b1cdbd2cSJim Jagielski 	std::vector< XMLPropertyState > aEquationPropertyStates;
3105*b1cdbd2cSJim Jagielski     Reference< beans::XPropertySet > xStatProp;
3106*b1cdbd2cSJim Jagielski     try
3107*b1cdbd2cSJim Jagielski     {
3108*b1cdbd2cSJim Jagielski         Any aPropAny( xSeriesProp->getPropertyValue(
3109*b1cdbd2cSJim Jagielski                           OUString( RTL_CONSTASCII_USTRINGPARAM( "DataRegressionProperties" ))));
3110*b1cdbd2cSJim Jagielski         aPropAny >>= xStatProp;
3111*b1cdbd2cSJim Jagielski     }
3112*b1cdbd2cSJim Jagielski     catch( uno::Exception & rEx )
3113*b1cdbd2cSJim Jagielski     {
3114*b1cdbd2cSJim Jagielski         (void)rEx; // avoid warning for pro build
3115*b1cdbd2cSJim Jagielski         DBG_ERROR1( "Exception caught during Export of series - optional DataRegressionProperties not available: %s",
3116*b1cdbd2cSJim Jagielski                     OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
3117*b1cdbd2cSJim Jagielski     }
3118*b1cdbd2cSJim Jagielski 
3119*b1cdbd2cSJim Jagielski     if( xStatProp.is() )
3120*b1cdbd2cSJim Jagielski     {
3121*b1cdbd2cSJim Jagielski         Reference< chart2::XRegressionCurve > xRegCurve( SchXMLTools::getRegressionCurve( xSeries ));
3122*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xEquationProperties;
3123*b1cdbd2cSJim Jagielski         if( xRegCurve.is())
3124*b1cdbd2cSJim Jagielski             xEquationProperties.set( xRegCurve->getEquationProperties());
3125*b1cdbd2cSJim Jagielski 
3126*b1cdbd2cSJim Jagielski         bool bShowEquation = false;
3127*b1cdbd2cSJim Jagielski         bool bShowRSquared = false;
3128*b1cdbd2cSJim Jagielski         bool bExportEquation = false;
3129*b1cdbd2cSJim Jagielski         aPropertyStates = mxExpPropMapper->Filter( xStatProp );
3130*b1cdbd2cSJim Jagielski         if( xEquationProperties.is())
3131*b1cdbd2cSJim Jagielski         {
3132*b1cdbd2cSJim Jagielski             xEquationProperties->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ShowEquation" )))
3133*b1cdbd2cSJim Jagielski                 >>= bShowEquation;
3134*b1cdbd2cSJim Jagielski             xEquationProperties->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ShowCorrelationCoefficient" )))
3135*b1cdbd2cSJim Jagielski                 >>= bShowRSquared;
3136*b1cdbd2cSJim Jagielski             bExportEquation = ( bShowEquation || bShowRSquared );
3137*b1cdbd2cSJim Jagielski             const SvtSaveOptions::ODFDefaultVersion nCurrentVersion( SvtSaveOptions().GetODFDefaultVersion() );
3138*b1cdbd2cSJim Jagielski             if( nCurrentVersion < SvtSaveOptions::ODFVER_012 )
3139*b1cdbd2cSJim Jagielski                 bExportEquation=false;
3140*b1cdbd2cSJim Jagielski             if( bExportEquation )
3141*b1cdbd2cSJim Jagielski             {
3142*b1cdbd2cSJim Jagielski                 // number format
3143*b1cdbd2cSJim Jagielski                 sal_Int32 nNumberFormat = 0;
3144*b1cdbd2cSJim Jagielski                 if( ( xEquationProperties->getPropertyValue(
3145*b1cdbd2cSJim Jagielski                           OUString( RTL_CONSTASCII_USTRINGPARAM( "NumberFormat" ))) >>= nNumberFormat ) &&
3146*b1cdbd2cSJim Jagielski                     nNumberFormat != -1 )
3147*b1cdbd2cSJim Jagielski                 {
3148*b1cdbd2cSJim Jagielski                     mrExport.addDataStyle( nNumberFormat );
3149*b1cdbd2cSJim Jagielski                 }
3150*b1cdbd2cSJim Jagielski                 aEquationPropertyStates = mxExpPropMapper->Filter( xEquationProperties );
3151*b1cdbd2cSJim Jagielski             }
3152*b1cdbd2cSJim Jagielski         }
3153*b1cdbd2cSJim Jagielski 
3154*b1cdbd2cSJim Jagielski         if( !aPropertyStates.empty() || bExportEquation )
3155*b1cdbd2cSJim Jagielski         {
3156*b1cdbd2cSJim Jagielski             // write element
3157*b1cdbd2cSJim Jagielski             if( bExportContent )
3158*b1cdbd2cSJim Jagielski             {
3159*b1cdbd2cSJim Jagielski                 // add style name attribute
3160*b1cdbd2cSJim Jagielski                 if( !aPropertyStates.empty())
3161*b1cdbd2cSJim Jagielski                     AddAutoStyleAttribute( aPropertyStates );
3162*b1cdbd2cSJim Jagielski                 SvXMLElementExport aRegressionExport( mrExport, XML_NAMESPACE_CHART, XML_REGRESSION_CURVE, sal_True, sal_True );
3163*b1cdbd2cSJim Jagielski                 if( bExportEquation )
3164*b1cdbd2cSJim Jagielski                 {
3165*b1cdbd2cSJim Jagielski                     // default is true
3166*b1cdbd2cSJim Jagielski                     if( !bShowEquation )
3167*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_DISPLAY_EQUATION, XML_FALSE );
3168*b1cdbd2cSJim Jagielski                     // default is false
3169*b1cdbd2cSJim Jagielski                     if( bShowRSquared )
3170*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_DISPLAY_R_SQUARE, XML_TRUE );
3171*b1cdbd2cSJim Jagielski 
3172*b1cdbd2cSJim Jagielski                     // export position
3173*b1cdbd2cSJim Jagielski                     chart2::RelativePosition aRelativePosition;
3174*b1cdbd2cSJim Jagielski                     if( xEquationProperties->getPropertyValue(
3175*b1cdbd2cSJim Jagielski                             OUString( RTL_CONSTASCII_USTRINGPARAM("RelativePosition"))) >>= aRelativePosition )
3176*b1cdbd2cSJim Jagielski                     {
3177*b1cdbd2cSJim Jagielski                         double fX = aRelativePosition.Primary * rPageSize.Width;
3178*b1cdbd2cSJim Jagielski                         double fY = aRelativePosition.Secondary * rPageSize.Height;
3179*b1cdbd2cSJim Jagielski                         awt::Point aPos;
3180*b1cdbd2cSJim Jagielski                         aPos.X = static_cast< sal_Int32 >( ::rtl::math::round( fX ));
3181*b1cdbd2cSJim Jagielski                         aPos.Y = static_cast< sal_Int32 >( ::rtl::math::round( fY ));
3182*b1cdbd2cSJim Jagielski                         addPosition( aPos );
3183*b1cdbd2cSJim Jagielski                     }
3184*b1cdbd2cSJim Jagielski 
3185*b1cdbd2cSJim Jagielski                     if( !aEquationPropertyStates.empty())
3186*b1cdbd2cSJim Jagielski                         AddAutoStyleAttribute( aEquationPropertyStates );
3187*b1cdbd2cSJim Jagielski 
3188*b1cdbd2cSJim Jagielski                     SvXMLElementExport( mrExport, XML_NAMESPACE_CHART, XML_EQUATION, sal_True, sal_True );
3189*b1cdbd2cSJim Jagielski                 }
3190*b1cdbd2cSJim Jagielski             }
3191*b1cdbd2cSJim Jagielski             else	// autostyles
3192*b1cdbd2cSJim Jagielski             {
3193*b1cdbd2cSJim Jagielski                 if( !aPropertyStates.empty())
3194*b1cdbd2cSJim Jagielski                     CollectAutoStyle( aPropertyStates );
3195*b1cdbd2cSJim Jagielski                 if( bExportEquation && !aEquationPropertyStates.empty())
3196*b1cdbd2cSJim Jagielski                     CollectAutoStyle( aEquationPropertyStates );
3197*b1cdbd2cSJim Jagielski             }
3198*b1cdbd2cSJim Jagielski         }
3199*b1cdbd2cSJim Jagielski     }
3200*b1cdbd2cSJim Jagielski }
3201*b1cdbd2cSJim Jagielski 
exportCandleStickSeries(const Sequence<Reference<chart2::XDataSeries>> & aSeriesSeq,const Reference<chart2::XDiagram> & xDiagram,sal_Bool bJapaneseCandleSticks,sal_Bool bExportContent)3202*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportCandleStickSeries(
3203*b1cdbd2cSJim Jagielski     const Sequence< Reference< chart2::XDataSeries > > & aSeriesSeq,
3204*b1cdbd2cSJim Jagielski     const Reference< chart2::XDiagram > & xDiagram,
3205*b1cdbd2cSJim Jagielski     sal_Bool bJapaneseCandleSticks,
3206*b1cdbd2cSJim Jagielski     sal_Bool bExportContent )
3207*b1cdbd2cSJim Jagielski {
3208*b1cdbd2cSJim Jagielski // 	std::vector< XMLPropertyState > aPropertyStates;
3209*b1cdbd2cSJim Jagielski 
3210*b1cdbd2cSJim Jagielski     for( sal_Int32 nSeriesIdx=0; nSeriesIdx<aSeriesSeq.getLength(); ++nSeriesIdx )
3211*b1cdbd2cSJim Jagielski     {
3212*b1cdbd2cSJim Jagielski         Reference< chart2::XDataSeries > xSeries( aSeriesSeq[nSeriesIdx] );
3213*b1cdbd2cSJim Jagielski         sal_Int32 nAttachedAxis = lcl_isSeriesAttachedToFirstAxis( xSeries )
3214*b1cdbd2cSJim Jagielski             ? chart::ChartAxisAssign::PRIMARY_Y
3215*b1cdbd2cSJim Jagielski             : chart::ChartAxisAssign::SECONDARY_Y;
3216*b1cdbd2cSJim Jagielski 
3217*b1cdbd2cSJim Jagielski         Reference< chart2::data::XDataSource > xSource( xSeries, uno::UNO_QUERY );
3218*b1cdbd2cSJim Jagielski         if( xSource.is())
3219*b1cdbd2cSJim Jagielski         {
3220*b1cdbd2cSJim Jagielski             // export series in correct order (as we don't store roles)
3221*b1cdbd2cSJim Jagielski             // with japanese candlesticks: open, low, high, close
3222*b1cdbd2cSJim Jagielski             // otherwise: low, high, close
3223*b1cdbd2cSJim Jagielski             Sequence< Reference< chart2::data::XLabeledDataSequence > > aSeqCnt(
3224*b1cdbd2cSJim Jagielski                 xSource->getDataSequences());
3225*b1cdbd2cSJim Jagielski 
3226*b1cdbd2cSJim Jagielski             sal_Int32 nSeriesLength =
3227*b1cdbd2cSJim Jagielski                 lcl_getSequenceLengthByRole( aSeqCnt, OUString::createFromAscii("values-last"));
3228*b1cdbd2cSJim Jagielski 
3229*b1cdbd2cSJim Jagielski             if( bExportContent )
3230*b1cdbd2cSJim Jagielski             {
3231*b1cdbd2cSJim Jagielski                 Reference< chart2::XChartDocument > xNewDoc( mrExport.GetModel(), uno::UNO_QUERY );
3232*b1cdbd2cSJim Jagielski                 //@todo: export data points
3233*b1cdbd2cSJim Jagielski 
3234*b1cdbd2cSJim Jagielski                 // open
3235*b1cdbd2cSJim Jagielski                 if( bJapaneseCandleSticks )
3236*b1cdbd2cSJim Jagielski                 {
3237*b1cdbd2cSJim Jagielski                     tLabelAndValueRange aRanges( lcl_getLabelAndValueRangeByRole(
3238*b1cdbd2cSJim Jagielski                         aSeqCnt, OUString::createFromAscii("values-first"),  xNewDoc, m_aDataSequencesToExport ));
3239*b1cdbd2cSJim Jagielski                     if( aRanges.second.getLength())
3240*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_VALUES_CELL_RANGE_ADDRESS, aRanges.second );
3241*b1cdbd2cSJim Jagielski                     if( aRanges.first.getLength())
3242*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_LABEL_CELL_ADDRESS, aRanges.first );
3243*b1cdbd2cSJim Jagielski                     if( nAttachedAxis == chart::ChartAxisAssign::SECONDARY_Y )
3244*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_SECONDARY_Y );
3245*b1cdbd2cSJim Jagielski                     else
3246*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_PRIMARY_Y );
3247*b1cdbd2cSJim Jagielski                     SvXMLElementExport aOpenSeries( mrExport, XML_NAMESPACE_CHART, XML_SERIES, sal_True, sal_True );
3248*b1cdbd2cSJim Jagielski                     // export empty data points
3249*b1cdbd2cSJim Jagielski                     exportDataPoints( 0, nSeriesLength, xDiagram, bExportContent );
3250*b1cdbd2cSJim Jagielski                 }
3251*b1cdbd2cSJim Jagielski 
3252*b1cdbd2cSJim Jagielski                 // low
3253*b1cdbd2cSJim Jagielski                 {
3254*b1cdbd2cSJim Jagielski                     tLabelAndValueRange aRanges( lcl_getLabelAndValueRangeByRole(
3255*b1cdbd2cSJim Jagielski                         aSeqCnt, OUString::createFromAscii("values-min"),  xNewDoc, m_aDataSequencesToExport ));
3256*b1cdbd2cSJim Jagielski                     if( aRanges.second.getLength())
3257*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_VALUES_CELL_RANGE_ADDRESS, aRanges.second );
3258*b1cdbd2cSJim Jagielski                     if( aRanges.first.getLength())
3259*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_LABEL_CELL_ADDRESS, aRanges.first );
3260*b1cdbd2cSJim Jagielski                     if( nAttachedAxis == chart::ChartAxisAssign::SECONDARY_Y )
3261*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_SECONDARY_Y );
3262*b1cdbd2cSJim Jagielski                     else
3263*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_PRIMARY_Y );
3264*b1cdbd2cSJim Jagielski                     SvXMLElementExport aLowSeries( mrExport, XML_NAMESPACE_CHART, XML_SERIES, sal_True, sal_True );
3265*b1cdbd2cSJim Jagielski                     // export empty data points
3266*b1cdbd2cSJim Jagielski                     exportDataPoints( 0, nSeriesLength, xDiagram, bExportContent );
3267*b1cdbd2cSJim Jagielski                 }
3268*b1cdbd2cSJim Jagielski 
3269*b1cdbd2cSJim Jagielski                 // high
3270*b1cdbd2cSJim Jagielski                 {
3271*b1cdbd2cSJim Jagielski                     tLabelAndValueRange aRanges( lcl_getLabelAndValueRangeByRole(
3272*b1cdbd2cSJim Jagielski                         aSeqCnt, OUString::createFromAscii("values-max"),  xNewDoc, m_aDataSequencesToExport ));
3273*b1cdbd2cSJim Jagielski                     if( aRanges.second.getLength())
3274*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_VALUES_CELL_RANGE_ADDRESS, aRanges.second );
3275*b1cdbd2cSJim Jagielski                     if( aRanges.first.getLength())
3276*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_LABEL_CELL_ADDRESS, aRanges.first );
3277*b1cdbd2cSJim Jagielski                     if( nAttachedAxis == chart::ChartAxisAssign::SECONDARY_Y )
3278*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_SECONDARY_Y );
3279*b1cdbd2cSJim Jagielski                     else
3280*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_PRIMARY_Y );
3281*b1cdbd2cSJim Jagielski                     SvXMLElementExport aHighSeries( mrExport, XML_NAMESPACE_CHART, XML_SERIES, sal_True, sal_True );
3282*b1cdbd2cSJim Jagielski                     // export empty data points
3283*b1cdbd2cSJim Jagielski                     exportDataPoints( 0, nSeriesLength, xDiagram, bExportContent );
3284*b1cdbd2cSJim Jagielski                 }
3285*b1cdbd2cSJim Jagielski 
3286*b1cdbd2cSJim Jagielski                 // close
3287*b1cdbd2cSJim Jagielski                 {
3288*b1cdbd2cSJim Jagielski                     tLabelAndValueRange aRanges( lcl_getLabelAndValueRangeByRole(
3289*b1cdbd2cSJim Jagielski                         aSeqCnt, OUString::createFromAscii("values-last"),  xNewDoc, m_aDataSequencesToExport ));
3290*b1cdbd2cSJim Jagielski                     if( aRanges.second.getLength())
3291*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_VALUES_CELL_RANGE_ADDRESS, aRanges.second );
3292*b1cdbd2cSJim Jagielski                     if( aRanges.first.getLength())
3293*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_LABEL_CELL_ADDRESS, aRanges.first );
3294*b1cdbd2cSJim Jagielski                     if( nAttachedAxis == chart::ChartAxisAssign::SECONDARY_Y )
3295*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_SECONDARY_Y );
3296*b1cdbd2cSJim Jagielski                     else
3297*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_PRIMARY_Y );
3298*b1cdbd2cSJim Jagielski                     // write style name
3299*b1cdbd2cSJim Jagielski //                     AddAutoStyleAttribute( aPropertyStates );
3300*b1cdbd2cSJim Jagielski                     // chart type
3301*b1cdbd2cSJim Jagielski //                     mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_CLASS,
3302*b1cdbd2cSJim Jagielski //                                            mrExport.GetNamespaceMap().GetQNameByKey(
3303*b1cdbd2cSJim Jagielski //                                                XML_NAMESPACE_CHART, GetXMLToken( XML_STOCK )));
3304*b1cdbd2cSJim Jagielski                     SvXMLElementExport aCloseSeries( mrExport, XML_NAMESPACE_CHART, XML_SERIES, sal_True, sal_True );
3305*b1cdbd2cSJim Jagielski                     // export empty data points
3306*b1cdbd2cSJim Jagielski                     exportDataPoints( 0, nSeriesLength, xDiagram, bExportContent );
3307*b1cdbd2cSJim Jagielski                 }
3308*b1cdbd2cSJim Jagielski             }
3309*b1cdbd2cSJim Jagielski             else	// autostyles
3310*b1cdbd2cSJim Jagielski             {
3311*b1cdbd2cSJim Jagielski                 // for close series
3312*b1cdbd2cSJim Jagielski //                 CollectAutoStyle( aPropertyStates );
3313*b1cdbd2cSJim Jagielski             }
3314*b1cdbd2cSJim Jagielski             // remove property states for autostyles
3315*b1cdbd2cSJim Jagielski //             aPropertyStates.clear();
3316*b1cdbd2cSJim Jagielski         }
3317*b1cdbd2cSJim Jagielski     }
3318*b1cdbd2cSJim Jagielski }
3319*b1cdbd2cSJim Jagielski 
exportDataPoints(const uno::Reference<beans::XPropertySet> & xSeriesProperties,sal_Int32 nSeriesLength,const uno::Reference<chart2::XDiagram> & xDiagram,sal_Bool bExportContent)3320*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportDataPoints(
3321*b1cdbd2cSJim Jagielski     const uno::Reference< beans::XPropertySet > & xSeriesProperties,
3322*b1cdbd2cSJim Jagielski     sal_Int32 nSeriesLength,
3323*b1cdbd2cSJim Jagielski     const uno::Reference< chart2::XDiagram > & xDiagram,
3324*b1cdbd2cSJim Jagielski     sal_Bool bExportContent )
3325*b1cdbd2cSJim Jagielski {
3326*b1cdbd2cSJim Jagielski     // data-points
3327*b1cdbd2cSJim Jagielski     // -----------
3328*b1cdbd2cSJim Jagielski     // write data-points only if they contain autostyles
3329*b1cdbd2cSJim Jagielski     // objects with equal autostyles are grouped using the attribute
3330*b1cdbd2cSJim Jagielski     // repeat="number"
3331*b1cdbd2cSJim Jagielski 
3332*b1cdbd2cSJim Jagielski     // Note: if only the nth data-point has autostyles there is an element
3333*b1cdbd2cSJim Jagielski     // without style and repeat="n-1" attribute written in advance.
3334*b1cdbd2cSJim Jagielski 
3335*b1cdbd2cSJim Jagielski     // the sequence aDataPointSeq contains indices of data-points that
3336*b1cdbd2cSJim Jagielski     // do have own attributes.  This increases the performance substantially.
3337*b1cdbd2cSJim Jagielski 
3338*b1cdbd2cSJim Jagielski     // more performant version for #93600#
3339*b1cdbd2cSJim Jagielski     if( mxExpPropMapper.is())
3340*b1cdbd2cSJim Jagielski     {
3341*b1cdbd2cSJim Jagielski         uno::Reference< chart2::XDataSeries > xSeries( xSeriesProperties, uno::UNO_QUERY );
3342*b1cdbd2cSJim Jagielski 
3343*b1cdbd2cSJim Jagielski         std::vector< XMLPropertyState > aPropertyStates;
3344*b1cdbd2cSJim Jagielski 
3345*b1cdbd2cSJim Jagielski         const OUString sNumFormat( OUString::createFromAscii( "NumberFormat" ));
3346*b1cdbd2cSJim Jagielski         const OUString sPercentageNumFormat( OUString::createFromAscii( "PercentageNumberFormat" ));
3347*b1cdbd2cSJim Jagielski 
3348*b1cdbd2cSJim Jagielski         bool bVaryColorsByPoint = false;
3349*b1cdbd2cSJim Jagielski         Sequence< sal_Int32 > aDataPointSeq;
3350*b1cdbd2cSJim Jagielski         if( xSeriesProperties.is())
3351*b1cdbd2cSJim Jagielski         {
3352*b1cdbd2cSJim Jagielski             Any aAny = xSeriesProperties->getPropertyValue(
3353*b1cdbd2cSJim Jagielski                 OUString( RTL_CONSTASCII_USTRINGPARAM( "AttributedDataPoints" )));
3354*b1cdbd2cSJim Jagielski             aAny >>= aDataPointSeq;
3355*b1cdbd2cSJim Jagielski             xSeriesProperties->getPropertyValue(
3356*b1cdbd2cSJim Jagielski                 OUString( RTL_CONSTASCII_USTRINGPARAM( "VaryColorsByPoint" ))) >>= bVaryColorsByPoint;
3357*b1cdbd2cSJim Jagielski         }
3358*b1cdbd2cSJim Jagielski 
3359*b1cdbd2cSJim Jagielski 
3360*b1cdbd2cSJim Jagielski         sal_Int32 nSize = aDataPointSeq.getLength();
3361*b1cdbd2cSJim Jagielski         DBG_ASSERT( nSize <= nSeriesLength, "Too many point attributes" );
3362*b1cdbd2cSJim Jagielski 
3363*b1cdbd2cSJim Jagielski         const sal_Int32 * pPoints = aDataPointSeq.getConstArray();
3364*b1cdbd2cSJim Jagielski         sal_Int32 nElement;
3365*b1cdbd2cSJim Jagielski         sal_Int32 nRepeat;
3366*b1cdbd2cSJim Jagielski         Reference< chart2::XColorScheme > xColorScheme;
3367*b1cdbd2cSJim Jagielski         if( xDiagram.is())
3368*b1cdbd2cSJim Jagielski             xColorScheme.set( xDiagram->getDefaultColorScheme());
3369*b1cdbd2cSJim Jagielski 
3370*b1cdbd2cSJim Jagielski         ::std::list< SchXMLDataPointStruct > aDataPointList;
3371*b1cdbd2cSJim Jagielski 
3372*b1cdbd2cSJim Jagielski         sal_Int32 nLastIndex = -1;
3373*b1cdbd2cSJim Jagielski         sal_Int32 nCurrIndex = 0;
3374*b1cdbd2cSJim Jagielski 
3375*b1cdbd2cSJim Jagielski         // collect elements
3376*b1cdbd2cSJim Jagielski         if( bVaryColorsByPoint && xColorScheme.is() )
3377*b1cdbd2cSJim Jagielski         {
3378*b1cdbd2cSJim Jagielski             ::std::set< sal_Int32 > aAttrPointSet;
3379*b1cdbd2cSJim Jagielski             ::std::copy( pPoints, pPoints + aDataPointSeq.getLength(),
3380*b1cdbd2cSJim Jagielski                             ::std::inserter( aAttrPointSet, aAttrPointSet.begin()));
3381*b1cdbd2cSJim Jagielski             const ::std::set< sal_Int32 >::const_iterator aEndIt( aAttrPointSet.end());
3382*b1cdbd2cSJim Jagielski             for( nElement = 0; nElement < nSeriesLength; ++nElement )
3383*b1cdbd2cSJim Jagielski             {
3384*b1cdbd2cSJim Jagielski                 aPropertyStates.clear();
3385*b1cdbd2cSJim Jagielski                 uno::Reference< beans::XPropertySet > xPropSet;
3386*b1cdbd2cSJim Jagielski                 bool bExportNumFmt = false;
3387*b1cdbd2cSJim Jagielski                 if( aAttrPointSet.find( nElement ) != aEndIt )
3388*b1cdbd2cSJim Jagielski                 {
3389*b1cdbd2cSJim Jagielski                     try
3390*b1cdbd2cSJim Jagielski                     {
3391*b1cdbd2cSJim Jagielski                         xPropSet = SchXMLSeriesHelper::createOldAPIDataPointPropertySet(
3392*b1cdbd2cSJim Jagielski                                     xSeries, nElement, mrExport.GetModel() );
3393*b1cdbd2cSJim Jagielski                         bExportNumFmt = true;
3394*b1cdbd2cSJim Jagielski                     }
3395*b1cdbd2cSJim Jagielski                     catch( uno::Exception & rEx )
3396*b1cdbd2cSJim Jagielski                     {
3397*b1cdbd2cSJim Jagielski                         (void)rEx; // avoid warning for pro build
3398*b1cdbd2cSJim Jagielski                         DBG_ERROR1( "Exception caught during Export of data point: %s",
3399*b1cdbd2cSJim Jagielski                                     OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
3400*b1cdbd2cSJim Jagielski                     }
3401*b1cdbd2cSJim Jagielski                 }
3402*b1cdbd2cSJim Jagielski                 else
3403*b1cdbd2cSJim Jagielski                 {
3404*b1cdbd2cSJim Jagielski                     // property set only containing the color
3405*b1cdbd2cSJim Jagielski                     xPropSet.set( new ::xmloff::chart::ColorPropertySet(
3406*b1cdbd2cSJim Jagielski                                         xColorScheme->getColorByIndex( nElement )));
3407*b1cdbd2cSJim Jagielski                 }
3408*b1cdbd2cSJim Jagielski                 DBG_ASSERT( xPropSet.is(), "Pie Segments should have properties" );
3409*b1cdbd2cSJim Jagielski                 if( xPropSet.is())
3410*b1cdbd2cSJim Jagielski                 {
3411*b1cdbd2cSJim Jagielski                     const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
3412*b1cdbd2cSJim Jagielski                     if( nCurrentODFVersion >= SvtSaveOptions::ODFVER_012 && bExportNumFmt )
3413*b1cdbd2cSJim Jagielski                     {
3414*b1cdbd2cSJim Jagielski                         lcl_exportNumberFormat( sNumFormat, xPropSet, mrExport );
3415*b1cdbd2cSJim Jagielski                         lcl_exportNumberFormat( sPercentageNumFormat, xPropSet, mrExport );
3416*b1cdbd2cSJim Jagielski                     }
3417*b1cdbd2cSJim Jagielski 
3418*b1cdbd2cSJim Jagielski                     aPropertyStates = mxExpPropMapper->Filter( xPropSet );
3419*b1cdbd2cSJim Jagielski                     if( !aPropertyStates.empty() )
3420*b1cdbd2cSJim Jagielski                     {
3421*b1cdbd2cSJim Jagielski                         if( bExportContent )
3422*b1cdbd2cSJim Jagielski                         {
3423*b1cdbd2cSJim Jagielski                             // write data-point with style
3424*b1cdbd2cSJim Jagielski                             DBG_ASSERT( ! maAutoStyleNameQueue.empty(), "Autostyle queue empty!" );
3425*b1cdbd2cSJim Jagielski 
3426*b1cdbd2cSJim Jagielski                             SchXMLDataPointStruct aPoint;
3427*b1cdbd2cSJim Jagielski                             aPoint.maStyleName = maAutoStyleNameQueue.front();
3428*b1cdbd2cSJim Jagielski                             maAutoStyleNameQueue.pop();
3429*b1cdbd2cSJim Jagielski                             aDataPointList.push_back( aPoint );
3430*b1cdbd2cSJim Jagielski                         }
3431*b1cdbd2cSJim Jagielski                         else
3432*b1cdbd2cSJim Jagielski                         {
3433*b1cdbd2cSJim Jagielski                             CollectAutoStyle( aPropertyStates );
3434*b1cdbd2cSJim Jagielski                         }
3435*b1cdbd2cSJim Jagielski                     }
3436*b1cdbd2cSJim Jagielski                 }
3437*b1cdbd2cSJim Jagielski             }
3438*b1cdbd2cSJim Jagielski             DBG_ASSERT( !bExportContent || (static_cast<sal_Int32>(aDataPointList.size()) == nSeriesLength),
3439*b1cdbd2cSJim Jagielski                         "not enough data points on content export" );
3440*b1cdbd2cSJim Jagielski         }
3441*b1cdbd2cSJim Jagielski         else
3442*b1cdbd2cSJim Jagielski         {
3443*b1cdbd2cSJim Jagielski             for( nElement = 0; nElement < nSize; ++nElement )
3444*b1cdbd2cSJim Jagielski             {
3445*b1cdbd2cSJim Jagielski                 aPropertyStates.clear();
3446*b1cdbd2cSJim Jagielski                 nCurrIndex = pPoints[ nElement ];
3447*b1cdbd2cSJim Jagielski                 //assuming sorted indices in pPoints
3448*b1cdbd2cSJim Jagielski 
3449*b1cdbd2cSJim Jagielski                 if( nCurrIndex<0 || nCurrIndex>=nSeriesLength )
3450*b1cdbd2cSJim Jagielski                     break;
3451*b1cdbd2cSJim Jagielski 
3452*b1cdbd2cSJim Jagielski                 // write leading empty data points
3453*b1cdbd2cSJim Jagielski                 if( nCurrIndex - nLastIndex > 1 )
3454*b1cdbd2cSJim Jagielski                 {
3455*b1cdbd2cSJim Jagielski                     SchXMLDataPointStruct aPoint;
3456*b1cdbd2cSJim Jagielski                     aPoint.mnRepeat = nCurrIndex - nLastIndex - 1;
3457*b1cdbd2cSJim Jagielski                     aDataPointList.push_back( aPoint );
3458*b1cdbd2cSJim Jagielski                 }
3459*b1cdbd2cSJim Jagielski 
3460*b1cdbd2cSJim Jagielski                 uno::Reference< beans::XPropertySet > xPropSet;
3461*b1cdbd2cSJim Jagielski                 // get property states
3462*b1cdbd2cSJim Jagielski                 try
3463*b1cdbd2cSJim Jagielski                 {
3464*b1cdbd2cSJim Jagielski                     xPropSet = SchXMLSeriesHelper::createOldAPIDataPointPropertySet(
3465*b1cdbd2cSJim Jagielski                                     xSeries, nCurrIndex, mrExport.GetModel() );
3466*b1cdbd2cSJim Jagielski                 }
3467*b1cdbd2cSJim Jagielski                 catch( uno::Exception & rEx )
3468*b1cdbd2cSJim Jagielski                 {
3469*b1cdbd2cSJim Jagielski                     (void)rEx; // avoid warning for pro build
3470*b1cdbd2cSJim Jagielski                     DBG_ERROR1( "Exception caught during Export of data point: %s",
3471*b1cdbd2cSJim Jagielski                                 OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
3472*b1cdbd2cSJim Jagielski                 }
3473*b1cdbd2cSJim Jagielski                 if( xPropSet.is())
3474*b1cdbd2cSJim Jagielski                 {
3475*b1cdbd2cSJim Jagielski                     const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
3476*b1cdbd2cSJim Jagielski                     if( nCurrentODFVersion >= SvtSaveOptions::ODFVER_012 )
3477*b1cdbd2cSJim Jagielski                     {
3478*b1cdbd2cSJim Jagielski                         lcl_exportNumberFormat( sNumFormat, xPropSet, mrExport );
3479*b1cdbd2cSJim Jagielski                         lcl_exportNumberFormat( sPercentageNumFormat, xPropSet, mrExport );
3480*b1cdbd2cSJim Jagielski                     }
3481*b1cdbd2cSJim Jagielski 
3482*b1cdbd2cSJim Jagielski                     aPropertyStates = mxExpPropMapper->Filter( xPropSet );
3483*b1cdbd2cSJim Jagielski                     if( !aPropertyStates.empty() )
3484*b1cdbd2cSJim Jagielski                     {
3485*b1cdbd2cSJim Jagielski                         if( bExportContent )
3486*b1cdbd2cSJim Jagielski                         {
3487*b1cdbd2cSJim Jagielski                             // write data-point with style
3488*b1cdbd2cSJim Jagielski                             DBG_ASSERT( ! maAutoStyleNameQueue.empty(), "Autostyle queue empty!" );
3489*b1cdbd2cSJim Jagielski                             SchXMLDataPointStruct aPoint;
3490*b1cdbd2cSJim Jagielski                             aPoint.maStyleName = maAutoStyleNameQueue.front();
3491*b1cdbd2cSJim Jagielski                             maAutoStyleNameQueue.pop();
3492*b1cdbd2cSJim Jagielski 
3493*b1cdbd2cSJim Jagielski                             aDataPointList.push_back( aPoint );
3494*b1cdbd2cSJim Jagielski                             nLastIndex = nCurrIndex;
3495*b1cdbd2cSJim Jagielski                         }
3496*b1cdbd2cSJim Jagielski                         else
3497*b1cdbd2cSJim Jagielski                         {
3498*b1cdbd2cSJim Jagielski                             CollectAutoStyle( aPropertyStates );
3499*b1cdbd2cSJim Jagielski                         }
3500*b1cdbd2cSJim Jagielski                         continue;
3501*b1cdbd2cSJim Jagielski                     }
3502*b1cdbd2cSJim Jagielski                 }
3503*b1cdbd2cSJim Jagielski 
3504*b1cdbd2cSJim Jagielski                 // if we get here the property states are empty
3505*b1cdbd2cSJim Jagielski                 SchXMLDataPointStruct aPoint;
3506*b1cdbd2cSJim Jagielski                 aDataPointList.push_back( aPoint );
3507*b1cdbd2cSJim Jagielski 
3508*b1cdbd2cSJim Jagielski                 nLastIndex = nCurrIndex;
3509*b1cdbd2cSJim Jagielski             }
3510*b1cdbd2cSJim Jagielski             // final empty elements
3511*b1cdbd2cSJim Jagielski             nRepeat = nSeriesLength - nLastIndex - 1;
3512*b1cdbd2cSJim Jagielski             if( nRepeat > 0 )
3513*b1cdbd2cSJim Jagielski             {
3514*b1cdbd2cSJim Jagielski                 SchXMLDataPointStruct aPoint;
3515*b1cdbd2cSJim Jagielski                 aPoint.mnRepeat = nRepeat;
3516*b1cdbd2cSJim Jagielski                 aDataPointList.push_back( aPoint );
3517*b1cdbd2cSJim Jagielski             }
3518*b1cdbd2cSJim Jagielski         }
3519*b1cdbd2cSJim Jagielski 
3520*b1cdbd2cSJim Jagielski         if( bExportContent )
3521*b1cdbd2cSJim Jagielski         {
3522*b1cdbd2cSJim Jagielski             // write elements (merge equal ones)
3523*b1cdbd2cSJim Jagielski             ::std::list< SchXMLDataPointStruct >::iterator aIter = aDataPointList.begin();
3524*b1cdbd2cSJim Jagielski             SchXMLDataPointStruct aPoint;
3525*b1cdbd2cSJim Jagielski             SchXMLDataPointStruct aLastPoint;
3526*b1cdbd2cSJim Jagielski 
3527*b1cdbd2cSJim Jagielski             // initialize so that it doesn't matter if
3528*b1cdbd2cSJim Jagielski             // the element is counted in the first iteration
3529*b1cdbd2cSJim Jagielski             aLastPoint.mnRepeat = 0;
3530*b1cdbd2cSJim Jagielski 
3531*b1cdbd2cSJim Jagielski             for( ; aIter != aDataPointList.end(); ++aIter )
3532*b1cdbd2cSJim Jagielski             {
3533*b1cdbd2cSJim Jagielski                 aPoint = (*aIter);
3534*b1cdbd2cSJim Jagielski 
3535*b1cdbd2cSJim Jagielski                 if( aPoint.maStyleName == aLastPoint.maStyleName )
3536*b1cdbd2cSJim Jagielski                     aPoint.mnRepeat += aLastPoint.mnRepeat;
3537*b1cdbd2cSJim Jagielski                 else if( aLastPoint.mnRepeat > 0 )
3538*b1cdbd2cSJim Jagielski                 {
3539*b1cdbd2cSJim Jagielski                     // write last element
3540*b1cdbd2cSJim Jagielski                     if( aLastPoint.maStyleName.getLength() )
3541*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_STYLE_NAME, aLastPoint.maStyleName );
3542*b1cdbd2cSJim Jagielski 
3543*b1cdbd2cSJim Jagielski                     if( aLastPoint.mnRepeat > 1 )
3544*b1cdbd2cSJim Jagielski                         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_REPEATED,
3545*b1cdbd2cSJim Jagielski                                             OUString::valueOf( (sal_Int64)( aLastPoint.mnRepeat ) ));
3546*b1cdbd2cSJim Jagielski 
3547*b1cdbd2cSJim Jagielski                     SvXMLElementExport aPointElem( mrExport, XML_NAMESPACE_CHART, XML_DATA_POINT, sal_True, sal_True );
3548*b1cdbd2cSJim Jagielski                 }
3549*b1cdbd2cSJim Jagielski                 aLastPoint = aPoint;
3550*b1cdbd2cSJim Jagielski             }
3551*b1cdbd2cSJim Jagielski             // write last element if it hasn't been written in last iteration
3552*b1cdbd2cSJim Jagielski             if( aPoint.maStyleName == aLastPoint.maStyleName )
3553*b1cdbd2cSJim Jagielski             {
3554*b1cdbd2cSJim Jagielski                 if( aLastPoint.maStyleName.getLength() )
3555*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_STYLE_NAME, aLastPoint.maStyleName );
3556*b1cdbd2cSJim Jagielski 
3557*b1cdbd2cSJim Jagielski                 if( aLastPoint.mnRepeat > 1 )
3558*b1cdbd2cSJim Jagielski                     mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_REPEATED,
3559*b1cdbd2cSJim Jagielski                                         OUString::valueOf( (sal_Int64)( aLastPoint.mnRepeat ) ));
3560*b1cdbd2cSJim Jagielski 
3561*b1cdbd2cSJim Jagielski                 SvXMLElementExport aPointElem( mrExport, XML_NAMESPACE_CHART, XML_DATA_POINT, sal_True, sal_True );
3562*b1cdbd2cSJim Jagielski             }
3563*b1cdbd2cSJim Jagielski         }
3564*b1cdbd2cSJim Jagielski     }
3565*b1cdbd2cSJim Jagielski }
3566*b1cdbd2cSJim Jagielski 
3567*b1cdbd2cSJim Jagielski 
getCellAddress(sal_Int32 nCol,sal_Int32 nRow)3568*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::getCellAddress( sal_Int32 nCol, sal_Int32 nRow )
3569*b1cdbd2cSJim Jagielski {
3570*b1cdbd2cSJim Jagielski 	msStringBuffer.append( (sal_Unicode)'.' );
3571*b1cdbd2cSJim Jagielski 	if( nCol < 26 )
3572*b1cdbd2cSJim Jagielski 		msStringBuffer.append( (sal_Unicode)('A' + nCol) );
3573*b1cdbd2cSJim Jagielski 	else if( nCol < 702 )
3574*b1cdbd2cSJim Jagielski 	{
3575*b1cdbd2cSJim Jagielski 		msStringBuffer.append( (sal_Unicode)('A' + nCol / 26 - 1 ));
3576*b1cdbd2cSJim Jagielski 		msStringBuffer.append( (sal_Unicode)('A' + nCol % 26) );
3577*b1cdbd2cSJim Jagielski 	}
3578*b1cdbd2cSJim Jagielski 	else
3579*b1cdbd2cSJim Jagielski 	{
3580*b1cdbd2cSJim Jagielski 		msStringBuffer.append( (sal_Unicode)('A' + nCol / 702 - 1 ));
3581*b1cdbd2cSJim Jagielski 		msStringBuffer.append( (sal_Unicode)('A' + (nCol % 702) / 26 ));
3582*b1cdbd2cSJim Jagielski 		msStringBuffer.append( (sal_Unicode)('A' + nCol % 26) );
3583*b1cdbd2cSJim Jagielski 	}
3584*b1cdbd2cSJim Jagielski 
3585*b1cdbd2cSJim Jagielski 	msStringBuffer.append( nRow + (sal_Int32)1 );
3586*b1cdbd2cSJim Jagielski }
3587*b1cdbd2cSJim Jagielski 
addPosition(const awt::Point & rPosition)3588*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::addPosition( const awt::Point & rPosition )
3589*b1cdbd2cSJim Jagielski {
3590*b1cdbd2cSJim Jagielski     mrExport.GetMM100UnitConverter().convertMeasure( msStringBuffer, rPosition.X );
3591*b1cdbd2cSJim Jagielski     msString = msStringBuffer.makeStringAndClear();
3592*b1cdbd2cSJim Jagielski     mrExport.AddAttribute( XML_NAMESPACE_SVG, XML_X, msString );
3593*b1cdbd2cSJim Jagielski 
3594*b1cdbd2cSJim Jagielski     mrExport.GetMM100UnitConverter().convertMeasure( msStringBuffer, rPosition.Y );
3595*b1cdbd2cSJim Jagielski     msString = msStringBuffer.makeStringAndClear();
3596*b1cdbd2cSJim Jagielski     mrExport.AddAttribute( XML_NAMESPACE_SVG, XML_Y, msString );
3597*b1cdbd2cSJim Jagielski }
3598*b1cdbd2cSJim Jagielski 
addPosition(Reference<drawing::XShape> xShape)3599*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::addPosition( Reference< drawing::XShape > xShape )
3600*b1cdbd2cSJim Jagielski {
3601*b1cdbd2cSJim Jagielski 	if( xShape.is())
3602*b1cdbd2cSJim Jagielski         addPosition( xShape->getPosition());
3603*b1cdbd2cSJim Jagielski }
3604*b1cdbd2cSJim Jagielski 
addSize(const awt::Size & rSize,bool bIsOOoNamespace)3605*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::addSize( const awt::Size & rSize, bool bIsOOoNamespace)
3606*b1cdbd2cSJim Jagielski {
3607*b1cdbd2cSJim Jagielski     mrExport.GetMM100UnitConverter().convertMeasure( msStringBuffer, rSize.Width );
3608*b1cdbd2cSJim Jagielski     msString = msStringBuffer.makeStringAndClear();
3609*b1cdbd2cSJim Jagielski     mrExport.AddAttribute( bIsOOoNamespace ? XML_NAMESPACE_CHART_EXT : XML_NAMESPACE_SVG , XML_WIDTH,  msString );
3610*b1cdbd2cSJim Jagielski 
3611*b1cdbd2cSJim Jagielski 
3612*b1cdbd2cSJim Jagielski     mrExport.GetMM100UnitConverter().convertMeasure( msStringBuffer, rSize.Height);
3613*b1cdbd2cSJim Jagielski     msString = msStringBuffer.makeStringAndClear();
3614*b1cdbd2cSJim Jagielski     mrExport.AddAttribute( bIsOOoNamespace ? XML_NAMESPACE_CHART_EXT : XML_NAMESPACE_SVG, XML_HEIGHT, msString );
3615*b1cdbd2cSJim Jagielski }
3616*b1cdbd2cSJim Jagielski 
addSize(Reference<drawing::XShape> xShape,bool bIsOOoNamespace)3617*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::addSize( Reference< drawing::XShape > xShape, bool bIsOOoNamespace )
3618*b1cdbd2cSJim Jagielski {
3619*b1cdbd2cSJim Jagielski 	if( xShape.is())
3620*b1cdbd2cSJim Jagielski         addSize( xShape->getSize(), bIsOOoNamespace );
3621*b1cdbd2cSJim Jagielski }
3622*b1cdbd2cSJim Jagielski 
getPageSize(const Reference<chart2::XChartDocument> & xChartDoc) const3623*b1cdbd2cSJim Jagielski awt::Size SchXMLExportHelper_Impl::getPageSize( const Reference< chart2::XChartDocument > & xChartDoc ) const
3624*b1cdbd2cSJim Jagielski {
3625*b1cdbd2cSJim Jagielski     awt::Size aSize( 8000, 7000 );
3626*b1cdbd2cSJim Jagielski     uno::Reference< embed::XVisualObject > xVisualObject( xChartDoc, uno::UNO_QUERY );
3627*b1cdbd2cSJim Jagielski     DBG_ASSERT( xVisualObject.is(),"need XVisualObject for page size" );
3628*b1cdbd2cSJim Jagielski     if( xVisualObject.is() )
3629*b1cdbd2cSJim Jagielski         aSize = xVisualObject->getVisualAreaSize( embed::Aspects::MSOLE_CONTENT );
3630*b1cdbd2cSJim Jagielski 
3631*b1cdbd2cSJim Jagielski     return aSize;
3632*b1cdbd2cSJim Jagielski }
3633*b1cdbd2cSJim Jagielski 
CollectAutoStyle(const std::vector<XMLPropertyState> & aStates)3634*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::CollectAutoStyle( const std::vector< XMLPropertyState >& aStates )
3635*b1cdbd2cSJim Jagielski {
3636*b1cdbd2cSJim Jagielski     if( !aStates.empty() )
3637*b1cdbd2cSJim Jagielski         maAutoStyleNameQueue.push( GetAutoStylePoolP().Add( XML_STYLE_FAMILY_SCH_CHART_ID, aStates ));
3638*b1cdbd2cSJim Jagielski }
3639*b1cdbd2cSJim Jagielski 
AddAutoStyleAttribute(const std::vector<XMLPropertyState> & aStates)3640*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::AddAutoStyleAttribute( const std::vector< XMLPropertyState >& aStates )
3641*b1cdbd2cSJim Jagielski {
3642*b1cdbd2cSJim Jagielski     if( !aStates.empty() )
3643*b1cdbd2cSJim Jagielski     {
3644*b1cdbd2cSJim Jagielski         DBG_ASSERT( ! maAutoStyleNameQueue.empty(), "Autostyle queue empty!" );
3645*b1cdbd2cSJim Jagielski 
3646*b1cdbd2cSJim Jagielski         mrExport.AddAttribute( XML_NAMESPACE_CHART, XML_STYLE_NAME,  maAutoStyleNameQueue.front() );
3647*b1cdbd2cSJim Jagielski         maAutoStyleNameQueue.pop();
3648*b1cdbd2cSJim Jagielski     }
3649*b1cdbd2cSJim Jagielski }
3650*b1cdbd2cSJim Jagielski 
exportText(const OUString & rText,bool bConvertTabsLFs)3651*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::exportText( const OUString& rText, bool bConvertTabsLFs )
3652*b1cdbd2cSJim Jagielski {
3653*b1cdbd2cSJim Jagielski     SchXMLTools::exportText( mrExport, rText, bConvertTabsLFs );
3654*b1cdbd2cSJim Jagielski }
3655*b1cdbd2cSJim Jagielski 
3656*b1cdbd2cSJim Jagielski // ========================================
3657*b1cdbd2cSJim Jagielski // class SchXMLExport
3658*b1cdbd2cSJim Jagielski // ========================================
3659*b1cdbd2cSJim Jagielski 
3660*b1cdbd2cSJim Jagielski // #110680#
SchXMLExport(const Reference<lang::XMultiServiceFactory> & xServiceFactory,sal_uInt16 nExportFlags)3661*b1cdbd2cSJim Jagielski SchXMLExport::SchXMLExport(
3662*b1cdbd2cSJim Jagielski 	const Reference< lang::XMultiServiceFactory >& xServiceFactory,
3663*b1cdbd2cSJim Jagielski 	sal_uInt16 nExportFlags )
3664*b1cdbd2cSJim Jagielski :	SvXMLExport( xServiceFactory, MAP_CM, ::xmloff::token::XML_CHART, nExportFlags ),
3665*b1cdbd2cSJim Jagielski 	maAutoStylePool( *this ),
3666*b1cdbd2cSJim Jagielski 	maExportHelper( *this, maAutoStylePool )
3667*b1cdbd2cSJim Jagielski {
3668*b1cdbd2cSJim Jagielski     if( getDefaultVersion() == SvtSaveOptions::ODFVER_LATEST )
3669*b1cdbd2cSJim Jagielski         _GetNamespaceMap().Add( GetXMLToken(XML_NP_CHART_EXT), GetXMLToken(XML_N_CHART_EXT), XML_NAMESPACE_CHART_EXT);
3670*b1cdbd2cSJim Jagielski }
3671*b1cdbd2cSJim Jagielski 
3672*b1cdbd2cSJim Jagielski 
~SchXMLExport()3673*b1cdbd2cSJim Jagielski SchXMLExport::~SchXMLExport()
3674*b1cdbd2cSJim Jagielski {
3675*b1cdbd2cSJim Jagielski 	// stop progress view
3676*b1cdbd2cSJim Jagielski 	if( mxStatusIndicator.is())
3677*b1cdbd2cSJim Jagielski 	{
3678*b1cdbd2cSJim Jagielski 		mxStatusIndicator->end();
3679*b1cdbd2cSJim Jagielski 		mxStatusIndicator->reset();
3680*b1cdbd2cSJim Jagielski 	}
3681*b1cdbd2cSJim Jagielski }
3682*b1cdbd2cSJim Jagielski 
exportDoc(enum::xmloff::token::XMLTokenEnum eClass)3683*b1cdbd2cSJim Jagielski sal_uInt32 SchXMLExport::exportDoc( enum ::xmloff::token::XMLTokenEnum eClass )
3684*b1cdbd2cSJim Jagielski {
3685*b1cdbd2cSJim Jagielski     Reference< chart2::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
3686*b1cdbd2cSJim Jagielski     maExportHelper.m_pImpl->InitRangeSegmentationProperties( xChartDoc );
3687*b1cdbd2cSJim Jagielski     return SvXMLExport::exportDoc( eClass );
3688*b1cdbd2cSJim Jagielski }
3689*b1cdbd2cSJim Jagielski 
_ExportStyles(sal_Bool bUsed)3690*b1cdbd2cSJim Jagielski void SchXMLExport::_ExportStyles( sal_Bool bUsed )
3691*b1cdbd2cSJim Jagielski {
3692*b1cdbd2cSJim Jagielski 	SvXMLExport::_ExportStyles( bUsed );
3693*b1cdbd2cSJim Jagielski }
3694*b1cdbd2cSJim Jagielski 
_ExportMasterStyles()3695*b1cdbd2cSJim Jagielski void SchXMLExport::_ExportMasterStyles()
3696*b1cdbd2cSJim Jagielski {
3697*b1cdbd2cSJim Jagielski 	// not available in chart
3698*b1cdbd2cSJim Jagielski 	DBG_WARNING( "Master Style Export requested. Not available for Chart" );
3699*b1cdbd2cSJim Jagielski }
3700*b1cdbd2cSJim Jagielski 
_ExportAutoStyles()3701*b1cdbd2cSJim Jagielski void SchXMLExport::_ExportAutoStyles()
3702*b1cdbd2cSJim Jagielski {
3703*b1cdbd2cSJim Jagielski 	// there are no styles that require their own autostyles
3704*b1cdbd2cSJim Jagielski 	if( getExportFlags() & EXPORT_CONTENT )
3705*b1cdbd2cSJim Jagielski 	{
3706*b1cdbd2cSJim Jagielski 		Reference< chart::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
3707*b1cdbd2cSJim Jagielski 		if( xChartDoc.is())
3708*b1cdbd2cSJim Jagielski 		{
3709*b1cdbd2cSJim Jagielski 			maExportHelper.m_pImpl->collectAutoStyles( xChartDoc );
3710*b1cdbd2cSJim Jagielski 			maExportHelper.m_pImpl->exportAutoStyles();
3711*b1cdbd2cSJim Jagielski 		}
3712*b1cdbd2cSJim Jagielski 		else
3713*b1cdbd2cSJim Jagielski 		{
3714*b1cdbd2cSJim Jagielski 			DBG_ERROR( "Couldn't export chart due to wrong XModel (must be XChartDocument)" );
3715*b1cdbd2cSJim Jagielski 		}
3716*b1cdbd2cSJim Jagielski 	}
3717*b1cdbd2cSJim Jagielski }
3718*b1cdbd2cSJim Jagielski 
_ExportContent()3719*b1cdbd2cSJim Jagielski void SchXMLExport::_ExportContent()
3720*b1cdbd2cSJim Jagielski {
3721*b1cdbd2cSJim Jagielski 	Reference< chart::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
3722*b1cdbd2cSJim Jagielski 	if( xChartDoc.is())
3723*b1cdbd2cSJim Jagielski 	{
3724*b1cdbd2cSJim Jagielski 		// determine if data comes from the outside
3725*b1cdbd2cSJim Jagielski 		sal_Bool bIncludeTable = sal_True;
3726*b1cdbd2cSJim Jagielski 
3727*b1cdbd2cSJim Jagielski         Reference< chart2::XChartDocument > xNewDoc( xChartDoc, uno::UNO_QUERY );
3728*b1cdbd2cSJim Jagielski         if( xNewDoc.is())
3729*b1cdbd2cSJim Jagielski         {
3730*b1cdbd2cSJim Jagielski             // check if we have own data.  If so we must not export the complete
3731*b1cdbd2cSJim Jagielski             // range string, as this is our only indicator for having own or
3732*b1cdbd2cSJim Jagielski             // external data. @todo: fix this in the file format!
3733*b1cdbd2cSJim Jagielski             Reference< lang::XServiceInfo > xDPServiceInfo( xNewDoc->getDataProvider(), uno::UNO_QUERY );
3734*b1cdbd2cSJim Jagielski             if( ! (xDPServiceInfo.is() &&
3735*b1cdbd2cSJim Jagielski                    xDPServiceInfo->getImplementationName().equalsAsciiL(
3736*b1cdbd2cSJim Jagielski                        RTL_CONSTASCII_STRINGPARAM( "com.sun.star.comp.chart.InternalDataProvider" ))))
3737*b1cdbd2cSJim Jagielski             {
3738*b1cdbd2cSJim Jagielski                 bIncludeTable = sal_False;
3739*b1cdbd2cSJim Jagielski             }
3740*b1cdbd2cSJim Jagielski         }
3741*b1cdbd2cSJim Jagielski         else
3742*b1cdbd2cSJim Jagielski         {
3743*b1cdbd2cSJim Jagielski             Reference< lang::XServiceInfo > xServ( xChartDoc, uno::UNO_QUERY );
3744*b1cdbd2cSJim Jagielski             if( xServ.is())
3745*b1cdbd2cSJim Jagielski             {
3746*b1cdbd2cSJim Jagielski                 if( xServ->supportsService(
3747*b1cdbd2cSJim Jagielski                         OUString::createFromAscii( "com.sun.star.chart.ChartTableAddressSupplier" )))
3748*b1cdbd2cSJim Jagielski                 {
3749*b1cdbd2cSJim Jagielski                     Reference< beans::XPropertySet > xProp( xServ, uno::UNO_QUERY );
3750*b1cdbd2cSJim Jagielski                     if( xProp.is())
3751*b1cdbd2cSJim Jagielski                     {
3752*b1cdbd2cSJim Jagielski                         Any aAny;
3753*b1cdbd2cSJim Jagielski                         try
3754*b1cdbd2cSJim Jagielski                         {
3755*b1cdbd2cSJim Jagielski                             OUString sChartAddress;
3756*b1cdbd2cSJim Jagielski                             aAny = xProp->getPropertyValue(
3757*b1cdbd2cSJim Jagielski                                 OUString::createFromAscii( "ChartRangeAddress" ));
3758*b1cdbd2cSJim Jagielski                             aAny >>= sChartAddress;
3759*b1cdbd2cSJim Jagielski                             maExportHelper.m_pImpl->SetChartRangeAddress( sChartAddress );
3760*b1cdbd2cSJim Jagielski 
3761*b1cdbd2cSJim Jagielski                             OUString sTableNumberList;
3762*b1cdbd2cSJim Jagielski                             aAny = xProp->getPropertyValue(
3763*b1cdbd2cSJim Jagielski                                 OUString::createFromAscii( "TableNumberList" ));
3764*b1cdbd2cSJim Jagielski                             aAny >>= sTableNumberList;
3765*b1cdbd2cSJim Jagielski                             maExportHelper.m_pImpl->SetTableNumberList( sTableNumberList );
3766*b1cdbd2cSJim Jagielski 
3767*b1cdbd2cSJim Jagielski                             // do not include own table if there are external addresses
3768*b1cdbd2cSJim Jagielski                             bIncludeTable = (sChartAddress.getLength() == 0);
3769*b1cdbd2cSJim Jagielski                         }
3770*b1cdbd2cSJim Jagielski                         catch( beans::UnknownPropertyException & )
3771*b1cdbd2cSJim Jagielski                         {
3772*b1cdbd2cSJim Jagielski                             DBG_ERROR( "Property ChartRangeAddress not supported by ChartDocument" );
3773*b1cdbd2cSJim Jagielski                         }
3774*b1cdbd2cSJim Jagielski                     }
3775*b1cdbd2cSJim Jagielski                 }
3776*b1cdbd2cSJim Jagielski             }
3777*b1cdbd2cSJim Jagielski         }
3778*b1cdbd2cSJim Jagielski         maExportHelper.m_pImpl->exportChart( xChartDoc, bIncludeTable );
3779*b1cdbd2cSJim Jagielski 	}
3780*b1cdbd2cSJim Jagielski 	else
3781*b1cdbd2cSJim Jagielski 	{
3782*b1cdbd2cSJim Jagielski 		DBG_ERROR( "Couldn't export chart due to wrong XModel" );
3783*b1cdbd2cSJim Jagielski 	}
3784*b1cdbd2cSJim Jagielski }
3785*b1cdbd2cSJim Jagielski 
SetProgress(sal_Int32 nPercentage)3786*b1cdbd2cSJim Jagielski void SchXMLExport::SetProgress( sal_Int32 nPercentage )
3787*b1cdbd2cSJim Jagielski {
3788*b1cdbd2cSJim Jagielski 	// set progress view
3789*b1cdbd2cSJim Jagielski 	if( mxStatusIndicator.is())
3790*b1cdbd2cSJim Jagielski 		mxStatusIndicator->setValue( nPercentage );
3791*b1cdbd2cSJim Jagielski }
3792*b1cdbd2cSJim Jagielski 
GetPropertySetMapper() const3793*b1cdbd2cSJim Jagielski UniReference< XMLPropertySetMapper > SchXMLExport::GetPropertySetMapper() const
3794*b1cdbd2cSJim Jagielski {
3795*b1cdbd2cSJim Jagielski     return maExportHelper.m_pImpl->GetPropertySetMapper();
3796*b1cdbd2cSJim Jagielski }
3797*b1cdbd2cSJim Jagielski 
InitRangeSegmentationProperties(const Reference<chart2::XChartDocument> & xChartDoc)3798*b1cdbd2cSJim Jagielski void SchXMLExportHelper_Impl::InitRangeSegmentationProperties( const Reference< chart2::XChartDocument > & xChartDoc )
3799*b1cdbd2cSJim Jagielski {
3800*b1cdbd2cSJim Jagielski     if( xChartDoc.is())
3801*b1cdbd2cSJim Jagielski         try
3802*b1cdbd2cSJim Jagielski         {
3803*b1cdbd2cSJim Jagielski             Reference< chart2::data::XDataProvider > xDataProvider( xChartDoc->getDataProvider() );
3804*b1cdbd2cSJim Jagielski             OSL_ENSURE( xDataProvider.is(), "No DataProvider" );
3805*b1cdbd2cSJim Jagielski             if( xDataProvider.is())
3806*b1cdbd2cSJim Jagielski             {
3807*b1cdbd2cSJim Jagielski                 Reference< chart2::data::XDataSource > xDataSource( lcl_pressUsedDataIntoRectangularFormat( xChartDoc, mbHasCategoryLabels ));
3808*b1cdbd2cSJim Jagielski                 Sequence< beans::PropertyValue > aArgs( xDataProvider->detectArguments( xDataSource ));
3809*b1cdbd2cSJim Jagielski                 ::rtl::OUString sCellRange, sBrokenRange;
3810*b1cdbd2cSJim Jagielski                 bool bBrokenRangeAvailable = false;
3811*b1cdbd2cSJim Jagielski                 for( sal_Int32 i=0; i<aArgs.getLength(); ++i )
3812*b1cdbd2cSJim Jagielski                 {
3813*b1cdbd2cSJim Jagielski                     if( aArgs[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("CellRangeRepresentation")))
3814*b1cdbd2cSJim Jagielski                         aArgs[i].Value >>= sCellRange;
3815*b1cdbd2cSJim Jagielski                     else if( aArgs[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("BrokenCellRangeForExport")))
3816*b1cdbd2cSJim Jagielski                     {
3817*b1cdbd2cSJim Jagielski                         if( aArgs[i].Value >>= sBrokenRange )
3818*b1cdbd2cSJim Jagielski                             bBrokenRangeAvailable = true;
3819*b1cdbd2cSJim Jagielski                     }
3820*b1cdbd2cSJim Jagielski                     else if( aArgs[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("DataRowSource")))
3821*b1cdbd2cSJim Jagielski                     {
3822*b1cdbd2cSJim Jagielski                         chart::ChartDataRowSource eRowSource;
3823*b1cdbd2cSJim Jagielski                         aArgs[i].Value >>= eRowSource;
3824*b1cdbd2cSJim Jagielski                         mbRowSourceColumns = ( eRowSource == chart::ChartDataRowSource_COLUMNS );
3825*b1cdbd2cSJim Jagielski                     }
3826*b1cdbd2cSJim Jagielski                     else if( aArgs[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("FirstCellAsLabel")))
3827*b1cdbd2cSJim Jagielski                         aArgs[i].Value >>= mbHasSeriesLabels;
3828*b1cdbd2cSJim Jagielski                     else if( aArgs[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("SequenceMapping")))
3829*b1cdbd2cSJim Jagielski                         aArgs[i].Value >>= maSequenceMapping;
3830*b1cdbd2cSJim Jagielski                     else if( aArgs[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("TableNumberList")))
3831*b1cdbd2cSJim Jagielski                         aArgs[i].Value >>= msTableNumberList;
3832*b1cdbd2cSJim Jagielski                 }
3833*b1cdbd2cSJim Jagielski 
3834*b1cdbd2cSJim Jagielski                 // #i79009# For Writer we have to export a broken version of the
3835*b1cdbd2cSJim Jagielski                 // range, where every row number is noe too large, so that older
3836*b1cdbd2cSJim Jagielski                 // version can correctly read those files.
3837*b1cdbd2cSJim Jagielski                 msChartAddress = (bBrokenRangeAvailable ? sBrokenRange : sCellRange);
3838*b1cdbd2cSJim Jagielski                 if( msChartAddress.getLength() > 0 )
3839*b1cdbd2cSJim Jagielski                 {
3840*b1cdbd2cSJim Jagielski                     // convert format to XML-conform one
3841*b1cdbd2cSJim Jagielski                     Reference< chart2::data::XRangeXMLConversion > xConversion( xDataProvider, uno::UNO_QUERY );
3842*b1cdbd2cSJim Jagielski                     if( xConversion.is())
3843*b1cdbd2cSJim Jagielski                         msChartAddress = xConversion->convertRangeToXML( msChartAddress );
3844*b1cdbd2cSJim Jagielski                 }
3845*b1cdbd2cSJim Jagielski             }
3846*b1cdbd2cSJim Jagielski         }
3847*b1cdbd2cSJim Jagielski         catch( uno::Exception & ex )
3848*b1cdbd2cSJim Jagielski         {
3849*b1cdbd2cSJim Jagielski             (void)ex; // avoid warning for pro build
3850*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, OUStringToOString(
3851*b1cdbd2cSJim Jagielski                             OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught. Type: " )) +
3852*b1cdbd2cSJim Jagielski                             OUString::createFromAscii( typeid( ex ).name()) +
3853*b1cdbd2cSJim Jagielski                             OUString( RTL_CONSTASCII_USTRINGPARAM( ", Message: " )) +
3854*b1cdbd2cSJim Jagielski                             ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
3855*b1cdbd2cSJim Jagielski         }
3856*b1cdbd2cSJim Jagielski }
3857*b1cdbd2cSJim Jagielski 
3858*b1cdbd2cSJim Jagielski // export components ========================================
3859*b1cdbd2cSJim Jagielski 
3860*b1cdbd2cSJim Jagielski // first version: everything goes in one storage
3861*b1cdbd2cSJim Jagielski 
SchXMLExport_getSupportedServiceNames()3862*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL SchXMLExport_getSupportedServiceNames() throw()
3863*b1cdbd2cSJim Jagielski {
3864*b1cdbd2cSJim Jagielski 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLExporter" ) );
3865*b1cdbd2cSJim Jagielski 	const Sequence< OUString > aSeq( &aServiceName, 1 );
3866*b1cdbd2cSJim Jagielski 	return aSeq;
3867*b1cdbd2cSJim Jagielski }
3868*b1cdbd2cSJim Jagielski 
SchXMLExport_getImplementationName()3869*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport_getImplementationName() throw()
3870*b1cdbd2cSJim Jagielski {
3871*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Compact" ) );
3872*b1cdbd2cSJim Jagielski }
3873*b1cdbd2cSJim Jagielski 
SchXMLExport_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)3874*b1cdbd2cSJim Jagielski Reference< uno::XInterface > SAL_CALL SchXMLExport_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
3875*b1cdbd2cSJim Jagielski {
3876*b1cdbd2cSJim Jagielski 	// #110680#
3877*b1cdbd2cSJim Jagielski     // #103997# removed some flags from EXPORT_ALL
3878*b1cdbd2cSJim Jagielski 	// return (cppu::OWeakObject*)new SchXMLExport( EXPORT_ALL ^ ( EXPORT_SETTINGS | EXPORT_MASTERSTYLES | EXPORT_SCRIPTS ));
3879*b1cdbd2cSJim Jagielski 	return (cppu::OWeakObject*)new SchXMLExport( rSMgr, EXPORT_ALL ^ ( EXPORT_SETTINGS | EXPORT_MASTERSTYLES | EXPORT_SCRIPTS ));
3880*b1cdbd2cSJim Jagielski }
3881*b1cdbd2cSJim Jagielski 
3882*b1cdbd2cSJim Jagielski // Oasis format
SchXMLExport_Oasis_getSupportedServiceNames()3883*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL SchXMLExport_Oasis_getSupportedServiceNames() throw()
3884*b1cdbd2cSJim Jagielski {
3885*b1cdbd2cSJim Jagielski 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisExporter" ) );
3886*b1cdbd2cSJim Jagielski 	const Sequence< OUString > aSeq( &aServiceName, 1 );
3887*b1cdbd2cSJim Jagielski 	return aSeq;
3888*b1cdbd2cSJim Jagielski }
3889*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_getImplementationName()3890*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport_Oasis_getImplementationName() throw()
3891*b1cdbd2cSJim Jagielski {
3892*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Oasis.Compact" ) );
3893*b1cdbd2cSJim Jagielski }
3894*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)3895*b1cdbd2cSJim Jagielski Reference< uno::XInterface > SAL_CALL SchXMLExport_Oasis_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
3896*b1cdbd2cSJim Jagielski {
3897*b1cdbd2cSJim Jagielski     // #103997# removed some flags from EXPORT_ALL
3898*b1cdbd2cSJim Jagielski 	return (cppu::OWeakObject*)new SchXMLExport( rSMgr,
3899*b1cdbd2cSJim Jagielski         (EXPORT_ALL ^ ( EXPORT_SETTINGS | EXPORT_MASTERSTYLES | EXPORT_SCRIPTS )) | EXPORT_OASIS );
3900*b1cdbd2cSJim Jagielski }
3901*b1cdbd2cSJim Jagielski 
3902*b1cdbd2cSJim Jagielski // ============================================================
3903*b1cdbd2cSJim Jagielski 
3904*b1cdbd2cSJim Jagielski // multiple storage version: one for content / styles / meta
3905*b1cdbd2cSJim Jagielski 
SchXMLExport_Styles_getSupportedServiceNames()3906*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL SchXMLExport_Styles_getSupportedServiceNames() throw()
3907*b1cdbd2cSJim Jagielski {
3908*b1cdbd2cSJim Jagielski 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLStylesExporter" ));
3909*b1cdbd2cSJim Jagielski 	const Sequence< OUString > aSeq( &aServiceName, 1 );
3910*b1cdbd2cSJim Jagielski 	return aSeq;
3911*b1cdbd2cSJim Jagielski }
3912*b1cdbd2cSJim Jagielski 
SchXMLExport_Styles_getImplementationName()3913*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport_Styles_getImplementationName() throw()
3914*b1cdbd2cSJim Jagielski {
3915*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Styles" ));
3916*b1cdbd2cSJim Jagielski }
3917*b1cdbd2cSJim Jagielski 
SchXMLExport_Styles_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)3918*b1cdbd2cSJim Jagielski Reference< uno::XInterface > SAL_CALL SchXMLExport_Styles_createInstance(const Reference< lang::XMultiServiceFactory >& rSMgr) throw( uno::Exception )
3919*b1cdbd2cSJim Jagielski {
3920*b1cdbd2cSJim Jagielski 	// #110680#
3921*b1cdbd2cSJim Jagielski 	// return (cppu::OWeakObject*)new SchXMLExport( EXPORT_STYLES );
3922*b1cdbd2cSJim Jagielski 	return (cppu::OWeakObject*)new SchXMLExport( rSMgr, EXPORT_STYLES );
3923*b1cdbd2cSJim Jagielski }
3924*b1cdbd2cSJim Jagielski 
3925*b1cdbd2cSJim Jagielski // Oasis format
SchXMLExport_Oasis_Styles_getSupportedServiceNames()3926*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL SchXMLExport_Oasis_Styles_getSupportedServiceNames() throw()
3927*b1cdbd2cSJim Jagielski {
3928*b1cdbd2cSJim Jagielski 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisStylesExporter" ));
3929*b1cdbd2cSJim Jagielski 	const Sequence< OUString > aSeq( &aServiceName, 1 );
3930*b1cdbd2cSJim Jagielski 	return aSeq;
3931*b1cdbd2cSJim Jagielski }
3932*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_Styles_getImplementationName()3933*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport_Oasis_Styles_getImplementationName() throw()
3934*b1cdbd2cSJim Jagielski {
3935*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Oasis.Styles" ));
3936*b1cdbd2cSJim Jagielski }
3937*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_Styles_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)3938*b1cdbd2cSJim Jagielski Reference< uno::XInterface > SAL_CALL SchXMLExport_Oasis_Styles_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
3939*b1cdbd2cSJim Jagielski {
3940*b1cdbd2cSJim Jagielski 	return (cppu::OWeakObject*)new SchXMLExport( rSMgr, EXPORT_STYLES | EXPORT_OASIS );
3941*b1cdbd2cSJim Jagielski }
3942*b1cdbd2cSJim Jagielski 
3943*b1cdbd2cSJim Jagielski // ------------------------------------------------------------
3944*b1cdbd2cSJim Jagielski 
SchXMLExport_Content_getSupportedServiceNames()3945*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL SchXMLExport_Content_getSupportedServiceNames() throw()
3946*b1cdbd2cSJim Jagielski {
3947*b1cdbd2cSJim Jagielski 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLContentExporter" ));
3948*b1cdbd2cSJim Jagielski 	const Sequence< OUString > aSeq( &aServiceName, 1 );
3949*b1cdbd2cSJim Jagielski 	return aSeq;
3950*b1cdbd2cSJim Jagielski }
3951*b1cdbd2cSJim Jagielski 
SchXMLExport_Content_getImplementationName()3952*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport_Content_getImplementationName() throw()
3953*b1cdbd2cSJim Jagielski {
3954*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Content" ));
3955*b1cdbd2cSJim Jagielski }
3956*b1cdbd2cSJim Jagielski 
SchXMLExport_Content_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)3957*b1cdbd2cSJim Jagielski Reference< uno::XInterface > SAL_CALL SchXMLExport_Content_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
3958*b1cdbd2cSJim Jagielski {
3959*b1cdbd2cSJim Jagielski 	// #110680#
3960*b1cdbd2cSJim Jagielski 	// return (cppu::OWeakObject*)new SchXMLExport( EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_FONTDECLS );
3961*b1cdbd2cSJim Jagielski 	return (cppu::OWeakObject*)new SchXMLExport( rSMgr, EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_FONTDECLS );
3962*b1cdbd2cSJim Jagielski }
3963*b1cdbd2cSJim Jagielski 
3964*b1cdbd2cSJim Jagielski // Oasis format
SchXMLExport_Oasis_Content_getSupportedServiceNames()3965*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL SchXMLExport_Oasis_Content_getSupportedServiceNames() throw()
3966*b1cdbd2cSJim Jagielski {
3967*b1cdbd2cSJim Jagielski 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisContentExporter" ));
3968*b1cdbd2cSJim Jagielski 	const Sequence< OUString > aSeq( &aServiceName, 1 );
3969*b1cdbd2cSJim Jagielski 	return aSeq;
3970*b1cdbd2cSJim Jagielski }
3971*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_Content_getImplementationName()3972*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport_Oasis_Content_getImplementationName() throw()
3973*b1cdbd2cSJim Jagielski {
3974*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Oasis.Content" ));
3975*b1cdbd2cSJim Jagielski }
3976*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_Content_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)3977*b1cdbd2cSJim Jagielski Reference< uno::XInterface > SAL_CALL SchXMLExport_Oasis_Content_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
3978*b1cdbd2cSJim Jagielski {
3979*b1cdbd2cSJim Jagielski 	return (cppu::OWeakObject*)new SchXMLExport( rSMgr, EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_FONTDECLS | EXPORT_OASIS );
3980*b1cdbd2cSJim Jagielski }
3981*b1cdbd2cSJim Jagielski 
3982*b1cdbd2cSJim Jagielski // ------------------------------------------------------------
3983*b1cdbd2cSJim Jagielski 
3984*b1cdbd2cSJim Jagielski // Sequence< OUString > SAL_CALL SchXMLExport_Meta_getSupportedServiceNames() throw()
3985*b1cdbd2cSJim Jagielski // {
3986*b1cdbd2cSJim Jagielski // 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLMetaExporter" ));
3987*b1cdbd2cSJim Jagielski // 	const Sequence< OUString > aSeq( &aServiceName, 1 );
3988*b1cdbd2cSJim Jagielski // 	return aSeq;
3989*b1cdbd2cSJim Jagielski // }
3990*b1cdbd2cSJim Jagielski 
3991*b1cdbd2cSJim Jagielski // OUString SAL_CALL SchXMLExport_Meta_getImplementationName() throw()
3992*b1cdbd2cSJim Jagielski // {
3993*b1cdbd2cSJim Jagielski // 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Meta" ));
3994*b1cdbd2cSJim Jagielski // }
3995*b1cdbd2cSJim Jagielski 
3996*b1cdbd2cSJim Jagielski // Reference< uno::XInterface > SAL_CALL SchXMLExport_Meta_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
3997*b1cdbd2cSJim Jagielski // {
3998*b1cdbd2cSJim Jagielski // 	return (cppu::OWeakObject*)new SchXMLExport( EXPORT_META );
3999*b1cdbd2cSJim Jagielski // }
4000*b1cdbd2cSJim Jagielski 
4001*b1cdbd2cSJim Jagielski // Oasis format
SchXMLExport_Oasis_Meta_getSupportedServiceNames()4002*b1cdbd2cSJim Jagielski Sequence< OUString > SAL_CALL SchXMLExport_Oasis_Meta_getSupportedServiceNames() throw()
4003*b1cdbd2cSJim Jagielski {
4004*b1cdbd2cSJim Jagielski 	const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Chart.XMLOasisMetaExporter" ));
4005*b1cdbd2cSJim Jagielski 	const Sequence< OUString > aSeq( &aServiceName, 1 );
4006*b1cdbd2cSJim Jagielski 	return aSeq;
4007*b1cdbd2cSJim Jagielski }
4008*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_Meta_getImplementationName()4009*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport_Oasis_Meta_getImplementationName() throw()
4010*b1cdbd2cSJim Jagielski {
4011*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "SchXMLExport.Oasis.Meta" ));
4012*b1cdbd2cSJim Jagielski }
4013*b1cdbd2cSJim Jagielski 
SchXMLExport_Oasis_Meta_createInstance(const Reference<lang::XMultiServiceFactory> & rSMgr)4014*b1cdbd2cSJim Jagielski Reference< uno::XInterface > SAL_CALL SchXMLExport_Oasis_Meta_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
4015*b1cdbd2cSJim Jagielski {
4016*b1cdbd2cSJim Jagielski 	return (cppu::OWeakObject*)new SchXMLExport( rSMgr, EXPORT_META | EXPORT_OASIS  );
4017*b1cdbd2cSJim Jagielski }
4018*b1cdbd2cSJim Jagielski 
4019*b1cdbd2cSJim Jagielski 
4020*b1cdbd2cSJim Jagielski // XServiceInfo
getImplementationName()4021*b1cdbd2cSJim Jagielski OUString SAL_CALL SchXMLExport::getImplementationName() throw( uno::RuntimeException )
4022*b1cdbd2cSJim Jagielski {
4023*b1cdbd2cSJim Jagielski     switch( getExportFlags())
4024*b1cdbd2cSJim Jagielski     {
4025*b1cdbd2cSJim Jagielski         case EXPORT_ALL:
4026*b1cdbd2cSJim Jagielski             return SchXMLExport_getImplementationName();
4027*b1cdbd2cSJim Jagielski         case EXPORT_STYLES:
4028*b1cdbd2cSJim Jagielski             return SchXMLExport_Styles_getImplementationName();
4029*b1cdbd2cSJim Jagielski         case ( EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_FONTDECLS ):
4030*b1cdbd2cSJim Jagielski             return SchXMLExport_Content_getImplementationName();
4031*b1cdbd2cSJim Jagielski //         case EXPORT_META:
4032*b1cdbd2cSJim Jagielski //             return SchXMLExport_Meta_getImplementationName();
4033*b1cdbd2cSJim Jagielski 
4034*b1cdbd2cSJim Jagielski         // Oasis format
4035*b1cdbd2cSJim Jagielski         case ( EXPORT_ALL | EXPORT_OASIS ):
4036*b1cdbd2cSJim Jagielski             return SchXMLExport_Oasis_getImplementationName();
4037*b1cdbd2cSJim Jagielski         case ( EXPORT_STYLES | EXPORT_OASIS ):
4038*b1cdbd2cSJim Jagielski             return SchXMLExport_Oasis_Styles_getImplementationName();
4039*b1cdbd2cSJim Jagielski         case ( EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_FONTDECLS | EXPORT_OASIS  ):
4040*b1cdbd2cSJim Jagielski             return SchXMLExport_Oasis_Content_getImplementationName();
4041*b1cdbd2cSJim Jagielski         case ( EXPORT_META | EXPORT_OASIS ):
4042*b1cdbd2cSJim Jagielski             return SchXMLExport_Oasis_Meta_getImplementationName();
4043*b1cdbd2cSJim Jagielski 
4044*b1cdbd2cSJim Jagielski         case EXPORT_SETTINGS:
4045*b1cdbd2cSJim Jagielski         // there is no settings component in chart
4046*b1cdbd2cSJim Jagielski         default:
4047*b1cdbd2cSJim Jagielski             return OUString::createFromAscii( "SchXMLExport" );
4048*b1cdbd2cSJim Jagielski     }
4049*b1cdbd2cSJim Jagielski }
4050