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 "SchXMLTools.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski /*
30*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
31*b1cdbd2cSJim Jagielski */
32*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
33*b1cdbd2cSJim Jagielski #include <comphelper/InlineContainer.hxx>
34*b1cdbd2cSJim Jagielski // header for class SvXMLUnitConverter
35*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
36*b1cdbd2cSJim Jagielski // header for struct SvXMLEnumMapEntry
37*b1cdbd2cSJim Jagielski #include <xmloff/xmlement.hxx>
38*b1cdbd2cSJim Jagielski // header for define __FAR_DATA
39*b1cdbd2cSJim Jagielski #include <tools/solar.h>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski // header for class SvXMLImportPropertyMapper
42*b1cdbd2cSJim Jagielski #include <xmloff/xmlimppr.hxx>
43*b1cdbd2cSJim Jagielski // header for class XMLPropStyleContext
44*b1cdbd2cSJim Jagielski #include <xmloff/prstylei.hxx>
45*b1cdbd2cSJim Jagielski // header for class XMLPropertySetMapper
46*b1cdbd2cSJim Jagielski #include <xmloff/xmlprmap.hxx>
47*b1cdbd2cSJim Jagielski #include <xmloff/xmlexp.hxx>
48*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
49*b1cdbd2cSJim Jagielski #include <xmloff/xmlmetai.hxx>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataProvider.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XDataReceiver.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartDocument.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentProperties.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceName.hpp>
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski using namespace com::sun::star;
67*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski using ::rtl::OUString;
70*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
71*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
72*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski namespace
75*b1cdbd2cSJim Jagielski {
lcl_getComponentContext()76*b1cdbd2cSJim Jagielski Reference< uno::XComponentContext > lcl_getComponentContext()
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski     Reference< uno::XComponentContext > xContext;
79*b1cdbd2cSJim Jagielski     try
80*b1cdbd2cSJim Jagielski     {
81*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xFactProp( comphelper::getProcessServiceFactory(), uno::UNO_QUERY );
82*b1cdbd2cSJim Jagielski         if( xFactProp.is())
83*b1cdbd2cSJim Jagielski             xFactProp->getPropertyValue(OUString::createFromAscii("DefaultContext")) >>= xContext;
84*b1cdbd2cSJim Jagielski     }
85*b1cdbd2cSJim Jagielski     catch( uno::Exception& )
86*b1cdbd2cSJim Jagielski     {}
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     return xContext;
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski 
lcl_getGeneratorFromModel(const uno::Reference<frame::XModel> & xChartModel)91*b1cdbd2cSJim Jagielski rtl::OUString lcl_getGeneratorFromModel( const uno::Reference< frame::XModel >& xChartModel )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski     ::rtl::OUString aGenerator;
94*b1cdbd2cSJim Jagielski     uno::Reference< document::XDocumentPropertiesSupplier> xChartDocumentPropertiesSupplier( xChartModel, uno::UNO_QUERY );
95*b1cdbd2cSJim Jagielski     if( xChartDocumentPropertiesSupplier.is() )
96*b1cdbd2cSJim Jagielski     {
97*b1cdbd2cSJim Jagielski         uno::Reference< document::XDocumentProperties > xChartDocumentProperties(
98*b1cdbd2cSJim Jagielski             xChartDocumentPropertiesSupplier->getDocumentProperties());
99*b1cdbd2cSJim Jagielski         if( xChartDocumentProperties.is() )
100*b1cdbd2cSJim Jagielski             aGenerator =  xChartDocumentProperties->getGenerator();
101*b1cdbd2cSJim Jagielski     }
102*b1cdbd2cSJim Jagielski     return aGenerator;
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
lcl_getGeneratorFromModelOrItsParent(const uno::Reference<frame::XModel> & xChartModel)105*b1cdbd2cSJim Jagielski rtl::OUString lcl_getGeneratorFromModelOrItsParent( const uno::Reference< frame::XModel >& xChartModel )
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski     ::rtl::OUString aGenerator( lcl_getGeneratorFromModel(xChartModel) );
108*b1cdbd2cSJim Jagielski     if( !aGenerator.getLength() ) //try to get the missing info from the parent document
109*b1cdbd2cSJim Jagielski     {
110*b1cdbd2cSJim Jagielski         uno::Reference< container::XChild > xChild( xChartModel, uno::UNO_QUERY );
111*b1cdbd2cSJim Jagielski         if( xChild.is() )
112*b1cdbd2cSJim Jagielski             aGenerator = lcl_getGeneratorFromModel( uno::Reference< frame::XModel >( xChild->getParent(), uno::UNO_QUERY) );
113*b1cdbd2cSJim Jagielski     }
114*b1cdbd2cSJim Jagielski     return aGenerator;
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
lcl_getBuildIDFromGenerator(const::rtl::OUString & rGenerator)117*b1cdbd2cSJim Jagielski sal_Int32 lcl_getBuildIDFromGenerator( const ::rtl::OUString& rGenerator )
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski     //returns -1 if nothing found
120*b1cdbd2cSJim Jagielski     sal_Int32 nBuildId = -1;
121*b1cdbd2cSJim Jagielski     const OUString sBuildCompare( RTL_CONSTASCII_USTRINGPARAM( "$Build-" ) );
122*b1cdbd2cSJim Jagielski     sal_Int32 nEnd = -1;
123*b1cdbd2cSJim Jagielski     sal_Int32 nBegin = rGenerator.indexOf( sBuildCompare, nEnd );
124*b1cdbd2cSJim Jagielski     if( nBegin != -1 )
125*b1cdbd2cSJim Jagielski     {
126*b1cdbd2cSJim Jagielski         OUString sBuildId( rGenerator.copy( nBegin + sBuildCompare.getLength() ) );
127*b1cdbd2cSJim Jagielski         nBuildId = sBuildId.toInt32();
128*b1cdbd2cSJim Jagielski     }
129*b1cdbd2cSJim Jagielski     return nBuildId;
130*b1cdbd2cSJim Jagielski }
131*b1cdbd2cSJim Jagielski 
lcl_ConvertRange(const::rtl::OUString & rRange,const Reference<chart2::data::XDataProvider> & xDataProvider)132*b1cdbd2cSJim Jagielski OUString lcl_ConvertRange( const ::rtl::OUString & rRange, const Reference< chart2::data::XDataProvider >& xDataProvider )
133*b1cdbd2cSJim Jagielski {
134*b1cdbd2cSJim Jagielski     OUString aResult = rRange;
135*b1cdbd2cSJim Jagielski     Reference< chart2::data::XRangeXMLConversion > xRangeConversion( xDataProvider, uno::UNO_QUERY );
136*b1cdbd2cSJim Jagielski     if( xRangeConversion.is())
137*b1cdbd2cSJim Jagielski         aResult = xRangeConversion->convertRangeFromXML( rRange );
138*b1cdbd2cSJim Jagielski     return aResult;
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
lcl_createNewSequenceFromCachedXMLRange(const Reference<chart2::data::XDataSequence> & xSeq,const Reference<chart2::data::XDataProvider> & xDataProvider)141*b1cdbd2cSJim Jagielski Reference< chart2::data::XDataSequence > lcl_createNewSequenceFromCachedXMLRange( const Reference< chart2::data::XDataSequence >& xSeq, const Reference< chart2::data::XDataProvider >& xDataProvider )
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski     Reference< chart2::data::XDataSequence > xRet;
144*b1cdbd2cSJim Jagielski     OUString aRange;
145*b1cdbd2cSJim Jagielski     if( xSeq.is() && SchXMLTools::getXMLRangePropertyFromDataSequence( xSeq, aRange, /* bClearProp = */ true ) )
146*b1cdbd2cSJim Jagielski     {
147*b1cdbd2cSJim Jagielski         xRet.set( xDataProvider->createDataSequenceByRangeRepresentation(
148*b1cdbd2cSJim Jagielski             lcl_ConvertRange( aRange, xDataProvider )) );
149*b1cdbd2cSJim Jagielski         SchXMLTools::copyProperties( Reference< beans::XPropertySet >( xSeq, uno::UNO_QUERY ),
150*b1cdbd2cSJim Jagielski             Reference< beans::XPropertySet >( xRet, uno::UNO_QUERY ));
151*b1cdbd2cSJim Jagielski     }
152*b1cdbd2cSJim Jagielski     return xRet;
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski } // anonymous namespace
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski // ----------------------------------------
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski namespace SchXMLTools
160*b1cdbd2cSJim Jagielski {
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski static __FAR_DATA SvXMLEnumMapEntry aXMLChartClassMap[] =
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski 	{ XML_LINE,	    	XML_CHART_CLASS_LINE	},
165*b1cdbd2cSJim Jagielski 	{ XML_AREA,		    XML_CHART_CLASS_AREA	},
166*b1cdbd2cSJim Jagielski 	{ XML_CIRCLE,		XML_CHART_CLASS_CIRCLE	},
167*b1cdbd2cSJim Jagielski 	{ XML_RING,		    XML_CHART_CLASS_RING	},
168*b1cdbd2cSJim Jagielski 	{ XML_SCATTER,		XML_CHART_CLASS_SCATTER	},
169*b1cdbd2cSJim Jagielski 	{ XML_RADAR,		XML_CHART_CLASS_RADAR	},
170*b1cdbd2cSJim Jagielski     { XML_FILLED_RADAR,	XML_CHART_CLASS_FILLED_RADAR },
171*b1cdbd2cSJim Jagielski 	{ XML_BAR,			XML_CHART_CLASS_BAR		},
172*b1cdbd2cSJim Jagielski 	{ XML_STOCK,		XML_CHART_CLASS_STOCK	},
173*b1cdbd2cSJim Jagielski 	{ XML_BUBBLE,		XML_CHART_CLASS_BUBBLE	},
174*b1cdbd2cSJim Jagielski     { XML_SURFACE,		XML_CHART_CLASS_BAR	    }, //@todo change this if a surface chart is available
175*b1cdbd2cSJim Jagielski     { XML_ADD_IN,       XML_CHART_CLASS_ADDIN   },
176*b1cdbd2cSJim Jagielski 	{ XML_TOKEN_INVALID, XML_CHART_CLASS_UNKNOWN }
177*b1cdbd2cSJim Jagielski };
178*b1cdbd2cSJim Jagielski 
GetChartTypeEnum(const OUString & rClassName)179*b1cdbd2cSJim Jagielski SchXMLChartTypeEnum GetChartTypeEnum( const OUString& rClassName )
180*b1cdbd2cSJim Jagielski {
181*b1cdbd2cSJim Jagielski     sal_uInt16 nEnumVal = XML_CHART_CLASS_UNKNOWN;
182*b1cdbd2cSJim Jagielski     if( !SvXMLUnitConverter::convertEnum(
183*b1cdbd2cSJim Jagielski 									nEnumVal, rClassName, aXMLChartClassMap ) )
184*b1cdbd2cSJim Jagielski         nEnumVal = XML_CHART_CLASS_UNKNOWN;
185*b1cdbd2cSJim Jagielski     return SchXMLChartTypeEnum(nEnumVal);
186*b1cdbd2cSJim Jagielski }
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski typedef ::comphelper::MakeMap< ::rtl::OUString, ::rtl::OUString > tMakeStringStringMap;
189*b1cdbd2cSJim Jagielski //static
lcl_getChartTypeNameMap()190*b1cdbd2cSJim Jagielski const tMakeStringStringMap& lcl_getChartTypeNameMap()
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski     //shape property -- chart model object property
193*b1cdbd2cSJim Jagielski     static tMakeStringStringMap g_aChartTypeNameMap =
194*b1cdbd2cSJim Jagielski         tMakeStringStringMap
195*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.LineDiagram" )
196*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.LineChartType" ) )
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.AreaDiagram" )
199*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.AreaChartType" ) )
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.BarDiagram" )
202*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.ColumnChartType" ) )
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.PieDiagram" )
205*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.PieChartType" ) )
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.DonutDiagram" )
208*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.DonutChartType" ) )
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.XYDiagram" )
211*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.ScatterChartType" ) )
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.NetDiagram" )
214*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.NetChartType" ) )
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.FilledNetDiagram" )
217*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.FilledNetChartType" ) )
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.StockDiagram" )
220*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.CandleStickChartType" ) )
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski         ( ::rtl::OUString::createFromAscii( "com.sun.star.chart.BubbleDiagram" )
223*b1cdbd2cSJim Jagielski         , ::rtl::OUString::createFromAscii( "com.sun.star.chart2.BubbleChartType" ) )
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski         ;
226*b1cdbd2cSJim Jagielski     return g_aChartTypeNameMap;
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 
GetNewChartTypeName(const OUString & rOldChartTypeName)230*b1cdbd2cSJim Jagielski OUString GetNewChartTypeName( const OUString & rOldChartTypeName )
231*b1cdbd2cSJim Jagielski {
232*b1cdbd2cSJim Jagielski     OUString aNew(rOldChartTypeName);
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski     const tMakeStringStringMap& rMap = lcl_getChartTypeNameMap();
235*b1cdbd2cSJim Jagielski     tMakeStringStringMap::const_iterator aIt( rMap.find( rOldChartTypeName ));
236*b1cdbd2cSJim Jagielski     if( aIt != rMap.end())
237*b1cdbd2cSJim Jagielski     {
238*b1cdbd2cSJim Jagielski         aNew = aIt->second;
239*b1cdbd2cSJim Jagielski     }
240*b1cdbd2cSJim Jagielski     return aNew;
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski 
GetChartTypeByClassName(const OUString & rClassName,bool bUseOldNames)243*b1cdbd2cSJim Jagielski OUString GetChartTypeByClassName(
244*b1cdbd2cSJim Jagielski     const OUString & rClassName, bool bUseOldNames )
245*b1cdbd2cSJim Jagielski {
246*b1cdbd2cSJim Jagielski     OUStringBuffer aResultBuffer;
247*b1cdbd2cSJim Jagielski     bool bInternalType = false;
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski     if( bUseOldNames )
250*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("com.sun.star.chart."));
251*b1cdbd2cSJim Jagielski     else
252*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("com.sun.star.chart2."));
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski     bInternalType = true;
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski     if( IsXMLToken( rClassName, XML_LINE ))
257*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Line"));
258*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_AREA ))
259*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Area"));
260*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_BAR ))
261*b1cdbd2cSJim Jagielski     {
262*b1cdbd2cSJim Jagielski         if( bUseOldNames )
263*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Bar"));
264*b1cdbd2cSJim Jagielski         else
265*b1cdbd2cSJim Jagielski         {
266*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Column"));
267*b1cdbd2cSJim Jagielski             // @todo: might be Bar
268*b1cdbd2cSJim Jagielski         }
269*b1cdbd2cSJim Jagielski     }
270*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_CIRCLE ))
271*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Pie"));
272*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_RING ))
273*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Donut"));
274*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_SCATTER ))
275*b1cdbd2cSJim Jagielski     {
276*b1cdbd2cSJim Jagielski         if( bUseOldNames )
277*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("XY"));
278*b1cdbd2cSJim Jagielski         else
279*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Scatter"));
280*b1cdbd2cSJim Jagielski     }
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_BUBBLE ))
283*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Bubble"));
284*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_RADAR ))
285*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Net"));
286*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_FILLED_RADAR ))
287*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("FilledNet"));
288*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_STOCK ))
289*b1cdbd2cSJim Jagielski     {
290*b1cdbd2cSJim Jagielski         if( bUseOldNames )
291*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Stock"));
292*b1cdbd2cSJim Jagielski         else
293*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("CandleStick"));
294*b1cdbd2cSJim Jagielski     }
295*b1cdbd2cSJim Jagielski     else if( IsXMLToken( rClassName, XML_SURFACE ))
296*b1cdbd2cSJim Jagielski     {
297*b1cdbd2cSJim Jagielski         //@todo change this if a surface chart is available
298*b1cdbd2cSJim Jagielski         if( bUseOldNames )
299*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Bar"));
300*b1cdbd2cSJim Jagielski         else
301*b1cdbd2cSJim Jagielski             aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Column"));
302*b1cdbd2cSJim Jagielski     }
303*b1cdbd2cSJim Jagielski     else
304*b1cdbd2cSJim Jagielski         bInternalType = false;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     if( ! bInternalType )
307*b1cdbd2cSJim Jagielski         return OUString();
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     if( bUseOldNames )
310*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("Diagram"));
311*b1cdbd2cSJim Jagielski     else
312*b1cdbd2cSJim Jagielski         aResultBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM("ChartType"));
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     return aResultBuffer.makeStringAndClear();
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski }
317*b1cdbd2cSJim Jagielski 
getTokenByChartType(const OUString & rChartTypeService,bool bUseOldNames)318*b1cdbd2cSJim Jagielski XMLTokenEnum getTokenByChartType(
319*b1cdbd2cSJim Jagielski     const OUString & rChartTypeService, bool bUseOldNames )
320*b1cdbd2cSJim Jagielski {
321*b1cdbd2cSJim Jagielski     XMLTokenEnum eResult = XML_TOKEN_INVALID;
322*b1cdbd2cSJim Jagielski     OUString aPrefix, aPostfix;
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski     if( bUseOldNames )
325*b1cdbd2cSJim Jagielski     {
326*b1cdbd2cSJim Jagielski         aPrefix = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart."));
327*b1cdbd2cSJim Jagielski         aPostfix = OUString( RTL_CONSTASCII_USTRINGPARAM("Diagram"));
328*b1cdbd2cSJim Jagielski     }
329*b1cdbd2cSJim Jagielski     else
330*b1cdbd2cSJim Jagielski     {
331*b1cdbd2cSJim Jagielski         aPrefix = OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2."));
332*b1cdbd2cSJim Jagielski         aPostfix = OUString( RTL_CONSTASCII_USTRINGPARAM("ChartType"));
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski     if( rChartTypeService.match( aPrefix ))
336*b1cdbd2cSJim Jagielski     {
337*b1cdbd2cSJim Jagielski         sal_Int32 nSkip = aPrefix.getLength();
338*b1cdbd2cSJim Jagielski         OSL_ASSERT( rChartTypeService.getLength() >= nSkip );
339*b1cdbd2cSJim Jagielski         sal_Int32 nTypeLength = rChartTypeService.getLength() - nSkip - aPostfix.getLength();
340*b1cdbd2cSJim Jagielski         // if postfix matches and leaves a non-empty type
341*b1cdbd2cSJim Jagielski         if( nTypeLength > 0 && rChartTypeService.match( aPostfix, nSkip + nTypeLength ))
342*b1cdbd2cSJim Jagielski         {
343*b1cdbd2cSJim Jagielski             OUString aServiceName( rChartTypeService.copy( nSkip, nTypeLength ));
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski             if( aServiceName.equalsAscii("Line"))
346*b1cdbd2cSJim Jagielski                 eResult = XML_LINE;
347*b1cdbd2cSJim Jagielski             else if( aServiceName.equalsAscii("Area"))
348*b1cdbd2cSJim Jagielski                 eResult = XML_AREA;
349*b1cdbd2cSJim Jagielski             else if( aServiceName.equalsAscii("Bar") ||
350*b1cdbd2cSJim Jagielski                      (!bUseOldNames && aServiceName.equalsAscii("Column")))
351*b1cdbd2cSJim Jagielski                 eResult = XML_BAR;
352*b1cdbd2cSJim Jagielski             else if( aServiceName.equalsAscii("Pie"))
353*b1cdbd2cSJim Jagielski                 eResult = XML_CIRCLE;
354*b1cdbd2cSJim Jagielski             else if( aServiceName.equalsAscii("Donut"))
355*b1cdbd2cSJim Jagielski                 eResult = XML_RING;
356*b1cdbd2cSJim Jagielski             else if( (bUseOldNames && aServiceName.equalsAscii("XY")) ||
357*b1cdbd2cSJim Jagielski                      (!bUseOldNames && aServiceName.equalsAscii("Scatter")))
358*b1cdbd2cSJim Jagielski                 eResult = XML_SCATTER;
359*b1cdbd2cSJim Jagielski             else if( aServiceName.equalsAscii("Bubble"))
360*b1cdbd2cSJim Jagielski                 eResult = XML_BUBBLE;
361*b1cdbd2cSJim Jagielski             else if( aServiceName.equalsAscii("Net"))
362*b1cdbd2cSJim Jagielski                 eResult = XML_RADAR;
363*b1cdbd2cSJim Jagielski             else if( aServiceName.equalsAscii("FilledNet"))
364*b1cdbd2cSJim Jagielski                 eResult = XML_FILLED_RADAR;
365*b1cdbd2cSJim Jagielski             else if( (bUseOldNames && aServiceName.equalsAscii("Stock")) ||
366*b1cdbd2cSJim Jagielski                      (!bUseOldNames && aServiceName.equalsAscii("CandleStick")))
367*b1cdbd2cSJim Jagielski                 eResult = XML_STOCK;
368*b1cdbd2cSJim Jagielski         }
369*b1cdbd2cSJim Jagielski     }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski     if( eResult == XML_TOKEN_INVALID && rChartTypeService.getLength() > 0 )
372*b1cdbd2cSJim Jagielski         eResult = XML_ADD_IN;
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski     return eResult;
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
GetNewLabeledDataSequence()377*b1cdbd2cSJim Jagielski Reference< chart2::data::XLabeledDataSequence > GetNewLabeledDataSequence()
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski     Reference< chart2::data::XLabeledDataSequence >  xResult;
380*b1cdbd2cSJim Jagielski     Reference< uno::XComponentContext > xContext( lcl_getComponentContext());
381*b1cdbd2cSJim Jagielski     if( xContext.is() )
382*b1cdbd2cSJim Jagielski         xResult.set(
383*b1cdbd2cSJim Jagielski             xContext->getServiceManager()->createInstanceWithContext(
384*b1cdbd2cSJim Jagielski                 OUString::createFromAscii("com.sun.star.chart2.data.LabeledDataSequence"),
385*b1cdbd2cSJim Jagielski                 xContext ), uno::UNO_QUERY_THROW );
386*b1cdbd2cSJim Jagielski     return xResult;
387*b1cdbd2cSJim Jagielski }
388*b1cdbd2cSJim Jagielski 
CreateDataSequence(const OUString & rRange,const Reference<chart2::XChartDocument> & xChartDoc)389*b1cdbd2cSJim Jagielski Reference< chart2::data::XDataSequence > CreateDataSequence(
390*b1cdbd2cSJim Jagielski         const OUString & rRange,
391*b1cdbd2cSJim Jagielski         const Reference< chart2::XChartDocument >& xChartDoc )
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski     Reference< chart2::data::XDataSequence > xRet;
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski     if( !xChartDoc.is() )
396*b1cdbd2cSJim Jagielski     {
397*b1cdbd2cSJim Jagielski         DBG_ERROR( "need a chart document" );
398*b1cdbd2cSJim Jagielski         return xRet;
399*b1cdbd2cSJim Jagielski     }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski     Reference< chart2::data::XDataProvider > xDataProvider( xChartDoc->getDataProvider() );
402*b1cdbd2cSJim Jagielski     if( !xDataProvider.is() )
403*b1cdbd2cSJim Jagielski     {
404*b1cdbd2cSJim Jagielski         DBG_ERROR( "need a data provider" );
405*b1cdbd2cSJim Jagielski         return xRet;
406*b1cdbd2cSJim Jagielski     }
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski     try
409*b1cdbd2cSJim Jagielski     {
410*b1cdbd2cSJim Jagielski         xRet.set( xDataProvider->createDataSequenceByRangeRepresentation( lcl_ConvertRange( rRange, xDataProvider )));
411*b1cdbd2cSJim Jagielski         SchXMLTools::setXMLRangePropertyAtDataSequence( xRet, rRange );
412*b1cdbd2cSJim Jagielski     }
413*b1cdbd2cSJim Jagielski     catch( const lang::IllegalArgumentException & )
414*b1cdbd2cSJim Jagielski     {
415*b1cdbd2cSJim Jagielski         DBG_ERROR( "could not create data sequence" );
416*b1cdbd2cSJim Jagielski     }
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski     if( !xRet.is() && !xChartDoc->hasInternalDataProvider() && rRange.getLength() )
419*b1cdbd2cSJim Jagielski     {
420*b1cdbd2cSJim Jagielski         //#i103911# switch to internal data in case the parent cannot provide the requested data
421*b1cdbd2cSJim Jagielski         xChartDoc->createInternalDataProvider( sal_True /* bCloneExistingData */ );
422*b1cdbd2cSJim Jagielski         xDataProvider = xChartDoc->getDataProvider();
423*b1cdbd2cSJim Jagielski         try
424*b1cdbd2cSJim Jagielski         {
425*b1cdbd2cSJim Jagielski             xRet.set( xDataProvider->createDataSequenceByRangeRepresentation( lcl_ConvertRange( rRange, xDataProvider )));
426*b1cdbd2cSJim Jagielski             SchXMLTools::setXMLRangePropertyAtDataSequence( xRet, rRange );
427*b1cdbd2cSJim Jagielski         }
428*b1cdbd2cSJim Jagielski         catch( const lang::IllegalArgumentException & )
429*b1cdbd2cSJim Jagielski         {
430*b1cdbd2cSJim Jagielski             DBG_ERROR( "could not create data sequence" );
431*b1cdbd2cSJim Jagielski         }
432*b1cdbd2cSJim Jagielski     }
433*b1cdbd2cSJim Jagielski     return xRet;
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
CreateCategories(const uno::Reference<chart2::data::XDataProvider> & xDataProvider,const uno::Reference<chart2::XChartDocument> & xNewDoc,const OUString & rRangeAddress,sal_Int32 nCooSysIndex,sal_Int32 nDimensionIndex,tSchXMLLSequencesPerIndex * pLSequencesPerIndex)436*b1cdbd2cSJim Jagielski void CreateCategories(
437*b1cdbd2cSJim Jagielski     const uno::Reference< chart2::data::XDataProvider > & xDataProvider,
438*b1cdbd2cSJim Jagielski     const uno::Reference< chart2::XChartDocument > & xNewDoc,
439*b1cdbd2cSJim Jagielski     const OUString & rRangeAddress,
440*b1cdbd2cSJim Jagielski     sal_Int32 nCooSysIndex,
441*b1cdbd2cSJim Jagielski     sal_Int32 nDimensionIndex,
442*b1cdbd2cSJim Jagielski     tSchXMLLSequencesPerIndex * pLSequencesPerIndex )
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski     try
445*b1cdbd2cSJim Jagielski     {
446*b1cdbd2cSJim Jagielski         if( xNewDoc.is() && rRangeAddress.getLength())
447*b1cdbd2cSJim Jagielski         {
448*b1cdbd2cSJim Jagielski             if( xDataProvider.is())
449*b1cdbd2cSJim Jagielski             {
450*b1cdbd2cSJim Jagielski                 uno::Reference< chart2::XDiagram > xDia( xNewDoc->getFirstDiagram());
451*b1cdbd2cSJim Jagielski                 if( !xDia.is())
452*b1cdbd2cSJim Jagielski                     return;
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski                 uno::Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDia, uno::UNO_QUERY_THROW );
455*b1cdbd2cSJim Jagielski                 uno::Sequence< uno::Reference< chart2::XCoordinateSystem > >
456*b1cdbd2cSJim Jagielski                     aCooSysSeq( xCooSysCnt->getCoordinateSystems());
457*b1cdbd2cSJim Jagielski                 if( nCooSysIndex < aCooSysSeq.getLength())
458*b1cdbd2cSJim Jagielski                 {
459*b1cdbd2cSJim Jagielski                     uno::Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[nCooSysIndex] );
460*b1cdbd2cSJim Jagielski                     OSL_ASSERT( xCooSys.is());
461*b1cdbd2cSJim Jagielski                     if( nDimensionIndex < xCooSys->getDimension() )
462*b1cdbd2cSJim Jagielski                     {
463*b1cdbd2cSJim Jagielski                         const sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex);
464*b1cdbd2cSJim Jagielski                         for(sal_Int32 nI=0; nI<=nMaxAxisIndex; ++nI)
465*b1cdbd2cSJim Jagielski                         {
466*b1cdbd2cSJim Jagielski                             uno::Reference< chart2::XAxis > xAxis( xCooSys->getAxisByDimension( nDimensionIndex, nI ));
467*b1cdbd2cSJim Jagielski                             if( xAxis.is() )
468*b1cdbd2cSJim Jagielski                             {
469*b1cdbd2cSJim Jagielski                                 chart2::ScaleData aData( xAxis->getScaleData());
470*b1cdbd2cSJim Jagielski                                 uno::Reference< chart2::data::XLabeledDataSequence > xLabeledSeq(
471*b1cdbd2cSJim Jagielski                                     GetNewLabeledDataSequence());
472*b1cdbd2cSJim Jagielski                                 try
473*b1cdbd2cSJim Jagielski                                 {
474*b1cdbd2cSJim Jagielski                                     OUString aConvertedRange( rRangeAddress );
475*b1cdbd2cSJim Jagielski                                     bool bRangeConverted = false;
476*b1cdbd2cSJim Jagielski                                     if( ! (xNewDoc->hasInternalDataProvider() &&
477*b1cdbd2cSJim Jagielski                                            aConvertedRange.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("categories"))))
478*b1cdbd2cSJim Jagielski                                     {
479*b1cdbd2cSJim Jagielski                                         Reference< chart2::data::XRangeXMLConversion > xXMLConv( xDataProvider, uno::UNO_QUERY );
480*b1cdbd2cSJim Jagielski                                         if( xXMLConv.is())
481*b1cdbd2cSJim Jagielski                                         {
482*b1cdbd2cSJim Jagielski                                             aConvertedRange = xXMLConv->convertRangeFromXML( rRangeAddress );
483*b1cdbd2cSJim Jagielski                                             bRangeConverted = true;
484*b1cdbd2cSJim Jagielski                                         }
485*b1cdbd2cSJim Jagielski                                     }
486*b1cdbd2cSJim Jagielski                                     Reference< chart2::data::XDataSequence > xSeq(
487*b1cdbd2cSJim Jagielski                                         xDataProvider->createDataSequenceByRangeRepresentation( aConvertedRange ));
488*b1cdbd2cSJim Jagielski                                     xLabeledSeq->setValues( xSeq );
489*b1cdbd2cSJim Jagielski                                     if( bRangeConverted )
490*b1cdbd2cSJim Jagielski                                         setXMLRangePropertyAtDataSequence( xSeq, rRangeAddress );
491*b1cdbd2cSJim Jagielski                                 }
492*b1cdbd2cSJim Jagielski                                 catch( const lang::IllegalArgumentException & ex )
493*b1cdbd2cSJim Jagielski                                 {
494*b1cdbd2cSJim Jagielski                                     (void)ex; // avoid warning for pro build
495*b1cdbd2cSJim Jagielski                                     OSL_ENSURE( false, ::rtl::OUStringToOString(
496*b1cdbd2cSJim Jagielski                                                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IllegalArgumentException caught, Message: " )) +
497*b1cdbd2cSJim Jagielski                                                     ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
498*b1cdbd2cSJim Jagielski                                 }
499*b1cdbd2cSJim Jagielski                                 aData.Categories.set( xLabeledSeq );
500*b1cdbd2cSJim Jagielski                                 if( pLSequencesPerIndex )
501*b1cdbd2cSJim Jagielski                                 {
502*b1cdbd2cSJim Jagielski                                     // register for setting local data if external data provider is not present
503*b1cdbd2cSJim Jagielski                                     pLSequencesPerIndex->insert(
504*b1cdbd2cSJim Jagielski                                         tSchXMLLSequencesPerIndex::value_type(
505*b1cdbd2cSJim Jagielski                                             tSchXMLIndexWithPart( SCH_XML_CATEGORIES_INDEX, SCH_XML_PART_VALUES ), xLabeledSeq ));
506*b1cdbd2cSJim Jagielski                                 }
507*b1cdbd2cSJim Jagielski                                 xAxis->setScaleData( aData );
508*b1cdbd2cSJim Jagielski                             }
509*b1cdbd2cSJim Jagielski                         }
510*b1cdbd2cSJim Jagielski                     }
511*b1cdbd2cSJim Jagielski                 }
512*b1cdbd2cSJim Jagielski             }
513*b1cdbd2cSJim Jagielski         }
514*b1cdbd2cSJim Jagielski     }
515*b1cdbd2cSJim Jagielski     catch( uno::Exception & )
516*b1cdbd2cSJim Jagielski     {
517*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "Exception caught while creating Categories" );
518*b1cdbd2cSJim Jagielski     }
519*b1cdbd2cSJim Jagielski }
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 
getPropertyFromContext(const rtl::OUString & rPropertyName,const XMLPropStyleContext * pPropStyleContext,const SvXMLStylesContext * pStylesCtxt)522*b1cdbd2cSJim Jagielski uno::Any getPropertyFromContext( const rtl::OUString& rPropertyName, const XMLPropStyleContext* pPropStyleContext, const SvXMLStylesContext* pStylesCtxt )
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski     uno::Any aRet;
525*b1cdbd2cSJim Jagielski     if( !pPropStyleContext || !pStylesCtxt )
526*b1cdbd2cSJim Jagielski         return aRet;
527*b1cdbd2cSJim Jagielski     const ::std::vector< XMLPropertyState >& rProperties = pPropStyleContext->GetProperties();
528*b1cdbd2cSJim Jagielski     const UniReference< XMLPropertySetMapper >& rMapper = pStylesCtxt->GetImportPropertyMapper( pPropStyleContext->GetFamily()/*XML_STYLE_FAMILY_SCH_CHART_ID*/ )->getPropertySetMapper();
529*b1cdbd2cSJim Jagielski     ::std::vector< XMLPropertyState >::const_iterator aEnd( rProperties.end() );
530*b1cdbd2cSJim Jagielski     ::std::vector< XMLPropertyState >::const_iterator aPropIter( rProperties.begin() );
531*b1cdbd2cSJim Jagielski     for( aPropIter = rProperties.begin(); aPropIter != aEnd; ++aPropIter )
532*b1cdbd2cSJim Jagielski     {
533*b1cdbd2cSJim Jagielski         sal_Int32 nIdx = aPropIter->mnIndex;
534*b1cdbd2cSJim Jagielski         if( nIdx == -1 )
535*b1cdbd2cSJim Jagielski             continue;
536*b1cdbd2cSJim Jagielski         OUString aPropName = rMapper->GetEntryAPIName( nIdx );
537*b1cdbd2cSJim Jagielski         if(rPropertyName.equals(aPropName))
538*b1cdbd2cSJim Jagielski             return aPropIter->maValue;
539*b1cdbd2cSJim Jagielski     }
540*b1cdbd2cSJim Jagielski     return aRet;
541*b1cdbd2cSJim Jagielski }
542*b1cdbd2cSJim Jagielski 
exportText(SvXMLExport & rExport,const OUString & rText,bool bConvertTabsLFs)543*b1cdbd2cSJim Jagielski void exportText( SvXMLExport& rExport, const OUString& rText, bool bConvertTabsLFs )
544*b1cdbd2cSJim Jagielski {
545*b1cdbd2cSJim Jagielski     SvXMLElementExport aPara( rExport, XML_NAMESPACE_TEXT,
546*b1cdbd2cSJim Jagielski                               ::xmloff::token::GetXMLToken( ::xmloff::token::XML_P ),
547*b1cdbd2cSJim Jagielski                               sal_True, sal_False );
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski     if( bConvertTabsLFs )
550*b1cdbd2cSJim Jagielski     {
551*b1cdbd2cSJim Jagielski         sal_Int32 nStartPos = 0;
552*b1cdbd2cSJim Jagielski         sal_Int32 nEndPos = rText.getLength();
553*b1cdbd2cSJim Jagielski         sal_Unicode cChar;
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski         for( sal_Int32 nPos = 0; nPos < nEndPos; nPos++ )
556*b1cdbd2cSJim Jagielski         {
557*b1cdbd2cSJim Jagielski             cChar = rText[ nPos ];
558*b1cdbd2cSJim Jagielski             switch( cChar )
559*b1cdbd2cSJim Jagielski             {
560*b1cdbd2cSJim Jagielski                 case 0x0009:        // tabulator
561*b1cdbd2cSJim Jagielski                     {
562*b1cdbd2cSJim Jagielski                         if( nPos > nStartPos )
563*b1cdbd2cSJim Jagielski                             rExport.GetDocHandler()->characters( rText.copy( nStartPos, (nPos - nStartPos)) );
564*b1cdbd2cSJim Jagielski                         nStartPos = nPos + 1;
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski                         SvXMLElementExport aElem( rExport, XML_NAMESPACE_TEXT,
567*b1cdbd2cSJim Jagielski                                                   ::xmloff::token::GetXMLToken( ::xmloff::token::XML_TAB_STOP ),
568*b1cdbd2cSJim Jagielski                                                   sal_False, sal_False );
569*b1cdbd2cSJim Jagielski                     }
570*b1cdbd2cSJim Jagielski                     break;
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski                 case 0x000A:        // linefeed
573*b1cdbd2cSJim Jagielski                     {
574*b1cdbd2cSJim Jagielski                         if( nPos > nStartPos )
575*b1cdbd2cSJim Jagielski                             rExport.GetDocHandler()->characters( rText.copy( nStartPos, (nPos - nStartPos)) );
576*b1cdbd2cSJim Jagielski                         nStartPos = nPos + 1;
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski                         SvXMLElementExport aElem( rExport, XML_NAMESPACE_TEXT,
579*b1cdbd2cSJim Jagielski                                                   ::xmloff::token::GetXMLToken( ::xmloff::token::XML_LINE_BREAK ),
580*b1cdbd2cSJim Jagielski                                                   sal_False, sal_False );
581*b1cdbd2cSJim Jagielski                     }
582*b1cdbd2cSJim Jagielski                     break;
583*b1cdbd2cSJim Jagielski             }
584*b1cdbd2cSJim Jagielski         }
585*b1cdbd2cSJim Jagielski         if( nEndPos > nStartPos )
586*b1cdbd2cSJim Jagielski         {
587*b1cdbd2cSJim Jagielski             if( nStartPos == 0 )
588*b1cdbd2cSJim Jagielski                 rExport.GetDocHandler()->characters( rText );
589*b1cdbd2cSJim Jagielski             else
590*b1cdbd2cSJim Jagielski                 rExport.GetDocHandler()->characters( rText.copy( nStartPos, (nEndPos - nStartPos)) );
591*b1cdbd2cSJim Jagielski         }
592*b1cdbd2cSJim Jagielski     }
593*b1cdbd2cSJim Jagielski     else // do not convert tabs and linefeeds (eg for numbers coming from unit converter)
594*b1cdbd2cSJim Jagielski     {
595*b1cdbd2cSJim Jagielski         rExport.GetDocHandler()->characters( rText );
596*b1cdbd2cSJim Jagielski     }
597*b1cdbd2cSJim Jagielski }
598*b1cdbd2cSJim Jagielski 
exportRangeToSomewhere(SvXMLExport & rExport,const::rtl::OUString & rValue)599*b1cdbd2cSJim Jagielski void exportRangeToSomewhere( SvXMLExport& rExport, const ::rtl::OUString& rValue )
600*b1cdbd2cSJim Jagielski {
601*b1cdbd2cSJim Jagielski     //with issue #i366# and CWS chart20 ranges for error bars were introduced
602*b1cdbd2cSJim Jagielski     //to keep them during copy paste from calc to impress for example it
603*b1cdbd2cSJim Jagielski     //was necessary to introduce a mapping between the used ranges within calc and the data written to the local table
604*b1cdbd2cSJim Jagielski     //this is why we write this ranges here
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski     //#i113950# first the range was exported to attribute text:id, but that attribute does not allow arbitrary strings anymore within ODF 1.2
607*b1cdbd2cSJim Jagielski     //as an alternative the range info is now saved into the description at an empty group element (not very nice, but ODF conform)
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski     const SvtSaveOptions::ODFDefaultVersion nCurrentODFVersion( SvtSaveOptions().GetODFDefaultVersion() );
610*b1cdbd2cSJim Jagielski     if( nCurrentODFVersion == SvtSaveOptions::ODFVER_010 || nCurrentODFVersion == SvtSaveOptions::ODFVER_011 )
611*b1cdbd2cSJim Jagielski         return;//svg:desc is not allowed at draw:g in ODF1.0; but as the ranges for error bars are anyhow not allowed within ODF1.0 nor ODF1.1 we do not need the information
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski     SvXMLElementExport aEmptyShapeGroup( rExport, XML_NAMESPACE_DRAW,
614*b1cdbd2cSJim Jagielski                               ::xmloff::token::GetXMLToken( ::xmloff::token::XML_G ),
615*b1cdbd2cSJim Jagielski                               sal_True, sal_False );
616*b1cdbd2cSJim Jagielski     SvXMLElementExport aDescription( rExport, XML_NAMESPACE_SVG,
617*b1cdbd2cSJim Jagielski                               ::xmloff::token::GetXMLToken( ::xmloff::token::XML_DESC ),
618*b1cdbd2cSJim Jagielski                               sal_True, sal_False );
619*b1cdbd2cSJim Jagielski     rExport.GetDocHandler()->characters( rValue );
620*b1cdbd2cSJim Jagielski }
621*b1cdbd2cSJim Jagielski 
getRegressionCurve(const Reference<chart2::XDataSeries> & xDataSeries)622*b1cdbd2cSJim Jagielski Reference< chart2::XRegressionCurve > getRegressionCurve(
623*b1cdbd2cSJim Jagielski     const Reference< chart2::XDataSeries > & xDataSeries )
624*b1cdbd2cSJim Jagielski {
625*b1cdbd2cSJim Jagielski     Reference< chart2::XRegressionCurve > xResult;
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski     Reference< chart2::XRegressionCurveContainer > xRegCurveCnt( xDataSeries, uno::UNO_QUERY );
628*b1cdbd2cSJim Jagielski     if( xRegCurveCnt.is())
629*b1cdbd2cSJim Jagielski     {
630*b1cdbd2cSJim Jagielski         // find equation properties of first regression curve
631*b1cdbd2cSJim Jagielski         Sequence< Reference< chart2::XRegressionCurve > > aCurveSeq(
632*b1cdbd2cSJim Jagielski             xRegCurveCnt->getRegressionCurves() );
633*b1cdbd2cSJim Jagielski         for( sal_Int32 nI=0; nI<aCurveSeq.getLength(); ++nI )
634*b1cdbd2cSJim Jagielski         {
635*b1cdbd2cSJim Jagielski             // skip mean-value line
636*b1cdbd2cSJim Jagielski             Reference< lang::XServiceName > xServiceName( aCurveSeq[nI], uno::UNO_QUERY );
637*b1cdbd2cSJim Jagielski             if( xServiceName.is())
638*b1cdbd2cSJim Jagielski             {
639*b1cdbd2cSJim Jagielski                 OUString aServiceName( xServiceName->getServiceName());
640*b1cdbd2cSJim Jagielski                 if( aServiceName.equalsAsciiL(
641*b1cdbd2cSJim Jagielski                         RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.MeanValueRegressionCurve" )))
642*b1cdbd2cSJim Jagielski                     continue;
643*b1cdbd2cSJim Jagielski             }
644*b1cdbd2cSJim Jagielski             // take first non-empty curve
645*b1cdbd2cSJim Jagielski             if( aCurveSeq[nI].is())
646*b1cdbd2cSJim Jagielski             {
647*b1cdbd2cSJim Jagielski                 xResult.set( aCurveSeq[nI] );
648*b1cdbd2cSJim Jagielski                 break;
649*b1cdbd2cSJim Jagielski             }
650*b1cdbd2cSJim Jagielski         }
651*b1cdbd2cSJim Jagielski     }
652*b1cdbd2cSJim Jagielski     return xResult;
653*b1cdbd2cSJim Jagielski }
654*b1cdbd2cSJim Jagielski 
setXMLRangePropertyAtDataSequence(const Reference<chart2::data::XDataSequence> & xDataSequence,const OUString & rXMLRange)655*b1cdbd2cSJim Jagielski void setXMLRangePropertyAtDataSequence(
656*b1cdbd2cSJim Jagielski     const Reference< chart2::data::XDataSequence > & xDataSequence,
657*b1cdbd2cSJim Jagielski     const OUString & rXMLRange )
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski     if( !xDataSequence.is())
660*b1cdbd2cSJim Jagielski         return;
661*b1cdbd2cSJim Jagielski     try
662*b1cdbd2cSJim Jagielski     {
663*b1cdbd2cSJim Jagielski         const OUString aXMLRangePropName( RTL_CONSTASCII_USTRINGPARAM( "CachedXMLRange" ));
664*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySet > xProp( xDataSequence, uno::UNO_QUERY_THROW );
665*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySetInfo > xInfo( xProp->getPropertySetInfo());
666*b1cdbd2cSJim Jagielski         if( xInfo.is() && xInfo->hasPropertyByName( aXMLRangePropName ))
667*b1cdbd2cSJim Jagielski             xProp->setPropertyValue( aXMLRangePropName, uno::makeAny( rXMLRange ));
668*b1cdbd2cSJim Jagielski     }
669*b1cdbd2cSJim Jagielski     catch( const uno::Exception & ex )
670*b1cdbd2cSJim Jagielski     {
671*b1cdbd2cSJim Jagielski         (void)ex; // avoid warning for pro build
672*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, ::rtl::OUStringToOString(
673*b1cdbd2cSJim Jagielski                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught, Message: " )) +
674*b1cdbd2cSJim Jagielski                         ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
675*b1cdbd2cSJim Jagielski     }
676*b1cdbd2cSJim Jagielski }
677*b1cdbd2cSJim Jagielski 
getXMLRangePropertyFromDataSequence(const Reference<chart2::data::XDataSequence> & xDataSequence,OUString & rOutXMLRange,bool bClearProp)678*b1cdbd2cSJim Jagielski bool getXMLRangePropertyFromDataSequence(
679*b1cdbd2cSJim Jagielski     const Reference< chart2::data::XDataSequence > & xDataSequence,
680*b1cdbd2cSJim Jagielski     OUString & rOutXMLRange,
681*b1cdbd2cSJim Jagielski     bool bClearProp /* = false */)
682*b1cdbd2cSJim Jagielski {
683*b1cdbd2cSJim Jagielski     bool bResult = false;
684*b1cdbd2cSJim Jagielski     if( xDataSequence.is())
685*b1cdbd2cSJim Jagielski     {
686*b1cdbd2cSJim Jagielski         try
687*b1cdbd2cSJim Jagielski         {
688*b1cdbd2cSJim Jagielski             const OUString aXMLRangePropName( RTL_CONSTASCII_USTRINGPARAM( "CachedXMLRange" ));
689*b1cdbd2cSJim Jagielski             Reference< beans::XPropertySet > xProp( xDataSequence, uno::UNO_QUERY_THROW );
690*b1cdbd2cSJim Jagielski             Reference< beans::XPropertySetInfo > xInfo( xProp->getPropertySetInfo());
691*b1cdbd2cSJim Jagielski             bResult =
692*b1cdbd2cSJim Jagielski                 ( xInfo.is() && xInfo->hasPropertyByName( aXMLRangePropName ) &&
693*b1cdbd2cSJim Jagielski                   ( xProp->getPropertyValue( aXMLRangePropName ) >>= rOutXMLRange ) &&
694*b1cdbd2cSJim Jagielski                   rOutXMLRange.getLength());
695*b1cdbd2cSJim Jagielski             // clear the property after usage
696*b1cdbd2cSJim Jagielski             if( bClearProp && bResult )
697*b1cdbd2cSJim Jagielski                 xProp->setPropertyValue( aXMLRangePropName, uno::Any( OUString()));
698*b1cdbd2cSJim Jagielski         }
699*b1cdbd2cSJim Jagielski         catch( const uno::Exception & ex )
700*b1cdbd2cSJim Jagielski         {
701*b1cdbd2cSJim Jagielski             (void)ex; // avoid warning for pro build
702*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, ::rtl::OUStringToOString(
703*b1cdbd2cSJim Jagielski                             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught, Message: " )) +
704*b1cdbd2cSJim Jagielski                             ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
705*b1cdbd2cSJim Jagielski         }
706*b1cdbd2cSJim Jagielski     }
707*b1cdbd2cSJim Jagielski     return bResult;
708*b1cdbd2cSJim Jagielski }
709*b1cdbd2cSJim Jagielski 
copyProperties(const Reference<beans::XPropertySet> & xSource,const Reference<beans::XPropertySet> & xDestination)710*b1cdbd2cSJim Jagielski void copyProperties(
711*b1cdbd2cSJim Jagielski     const Reference< beans::XPropertySet > & xSource,
712*b1cdbd2cSJim Jagielski     const Reference< beans::XPropertySet > & xDestination )
713*b1cdbd2cSJim Jagielski {
714*b1cdbd2cSJim Jagielski     if( ! (xSource.is() && xDestination.is()) )
715*b1cdbd2cSJim Jagielski         return;
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski     try
718*b1cdbd2cSJim Jagielski     {
719*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySetInfo > xSrcInfo( xSource->getPropertySetInfo(), uno::UNO_QUERY_THROW );
720*b1cdbd2cSJim Jagielski         Reference< beans::XPropertySetInfo > xDestInfo( xDestination->getPropertySetInfo(), uno::UNO_QUERY_THROW );
721*b1cdbd2cSJim Jagielski         Sequence< beans::Property > aProperties( xSrcInfo->getProperties());
722*b1cdbd2cSJim Jagielski         const sal_Int32 nLength = aProperties.getLength();
723*b1cdbd2cSJim Jagielski         for( sal_Int32 i = 0; i < nLength; ++i )
724*b1cdbd2cSJim Jagielski         {
725*b1cdbd2cSJim Jagielski             OUString aName( aProperties[i].Name);
726*b1cdbd2cSJim Jagielski             if( xDestInfo->hasPropertyByName( aName ))
727*b1cdbd2cSJim Jagielski             {
728*b1cdbd2cSJim Jagielski                 beans::Property aProp( xDestInfo->getPropertyByName( aName ));
729*b1cdbd2cSJim Jagielski                 if( (aProp.Attributes & beans::PropertyAttribute::READONLY) == 0 )
730*b1cdbd2cSJim Jagielski                     xDestination->setPropertyValue(
731*b1cdbd2cSJim Jagielski                         aName, xSource->getPropertyValue( aName ));
732*b1cdbd2cSJim Jagielski             }
733*b1cdbd2cSJim Jagielski         }
734*b1cdbd2cSJim Jagielski     }
735*b1cdbd2cSJim Jagielski     catch( const uno::Exception & )
736*b1cdbd2cSJim Jagielski     {
737*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "Copying property sets failed!" );
738*b1cdbd2cSJim Jagielski     }
739*b1cdbd2cSJim Jagielski }
740*b1cdbd2cSJim Jagielski 
switchBackToDataProviderFromParent(const Reference<chart2::XChartDocument> & xChartDoc,const tSchXMLLSequencesPerIndex & rLSequencesPerIndex)741*b1cdbd2cSJim Jagielski bool switchBackToDataProviderFromParent( const Reference< chart2::XChartDocument >& xChartDoc, const tSchXMLLSequencesPerIndex & rLSequencesPerIndex )
742*b1cdbd2cSJim Jagielski {
743*b1cdbd2cSJim Jagielski     //return whether the switch is successful
744*b1cdbd2cSJim Jagielski     if( !xChartDoc.is() || !xChartDoc->hasInternalDataProvider() )
745*b1cdbd2cSJim Jagielski         return false;
746*b1cdbd2cSJim Jagielski     Reference< chart2::data::XDataProvider > xDataProviderFromParent( SchXMLTools::getDataProviderFromParent( xChartDoc ) );
747*b1cdbd2cSJim Jagielski     if( !xDataProviderFromParent.is() )
748*b1cdbd2cSJim Jagielski         return false;
749*b1cdbd2cSJim Jagielski     uno::Reference< chart2::data::XDataReceiver > xDataReceiver( xChartDoc, uno::UNO_QUERY );
750*b1cdbd2cSJim Jagielski     if( !xDataReceiver.is() )
751*b1cdbd2cSJim Jagielski         return false;
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski     xDataReceiver->attachDataProvider( xDataProviderFromParent );
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski     for( tSchXMLLSequencesPerIndex::const_iterator aLSeqIt( rLSequencesPerIndex.begin() );
756*b1cdbd2cSJim Jagielski          aLSeqIt != rLSequencesPerIndex.end(); ++aLSeqIt )
757*b1cdbd2cSJim Jagielski     {
758*b1cdbd2cSJim Jagielski         Reference< chart2::data::XLabeledDataSequence > xLabeledSeq( aLSeqIt->second );
759*b1cdbd2cSJim Jagielski         if( !xLabeledSeq.is() )
760*b1cdbd2cSJim Jagielski             continue;
761*b1cdbd2cSJim Jagielski         Reference< chart2::data::XDataSequence > xNewSeq;
762*b1cdbd2cSJim Jagielski         xNewSeq = lcl_createNewSequenceFromCachedXMLRange( xLabeledSeq->getValues(), xDataProviderFromParent );
763*b1cdbd2cSJim Jagielski         if( xNewSeq.is() )
764*b1cdbd2cSJim Jagielski             xLabeledSeq->setValues( xNewSeq );
765*b1cdbd2cSJim Jagielski         xNewSeq = lcl_createNewSequenceFromCachedXMLRange( xLabeledSeq->getLabel(), xDataProviderFromParent );
766*b1cdbd2cSJim Jagielski         if( xNewSeq.is() )
767*b1cdbd2cSJim Jagielski             xLabeledSeq->setLabel( xNewSeq );
768*b1cdbd2cSJim Jagielski     }
769*b1cdbd2cSJim Jagielski     return true;
770*b1cdbd2cSJim Jagielski }
771*b1cdbd2cSJim Jagielski 
setBuildIDAtImportInfo(uno::Reference<frame::XModel> xModel,Reference<beans::XPropertySet> xImportInfo)772*b1cdbd2cSJim Jagielski void setBuildIDAtImportInfo( uno::Reference< frame::XModel > xModel, Reference< beans::XPropertySet > xImportInfo )
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski     ::rtl::OUString aGenerator( lcl_getGeneratorFromModelOrItsParent(xModel) );
775*b1cdbd2cSJim Jagielski     if( aGenerator.getLength() )
776*b1cdbd2cSJim Jagielski         SvXMLMetaDocumentContext::setBuildId( aGenerator, xImportInfo );
777*b1cdbd2cSJim Jagielski }
778*b1cdbd2cSJim Jagielski 
isDocumentGeneratedWithOpenOfficeOlderThan3_3(const uno::Reference<frame::XModel> & xChartModel)779*b1cdbd2cSJim Jagielski bool isDocumentGeneratedWithOpenOfficeOlderThan3_3( const uno::Reference< frame::XModel >& xChartModel )
780*b1cdbd2cSJim Jagielski {
781*b1cdbd2cSJim Jagielski     bool bResult = isDocumentGeneratedWithOpenOfficeOlderThan3_0( xChartModel );
782*b1cdbd2cSJim Jagielski     if( !bResult )
783*b1cdbd2cSJim Jagielski     {
784*b1cdbd2cSJim Jagielski         ::rtl::OUString aGenerator( lcl_getGeneratorFromModel(xChartModel) );
785*b1cdbd2cSJim Jagielski         if( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org_project/3") ) ) != -1 )
786*b1cdbd2cSJim Jagielski         {
787*b1cdbd2cSJim Jagielski             if( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org_project/300m") ) ) != -1 )
788*b1cdbd2cSJim Jagielski             {
789*b1cdbd2cSJim Jagielski                 sal_Int32 nBuilId = lcl_getBuildIDFromGenerator( lcl_getGeneratorFromModel(xChartModel) );
790*b1cdbd2cSJim Jagielski                 if( nBuilId>0 && nBuilId<9491 ) //9491 is build id of dev300m76
791*b1cdbd2cSJim Jagielski                     bResult= true;
792*b1cdbd2cSJim Jagielski             }
793*b1cdbd2cSJim Jagielski             else if( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org_project/310m") ) ) != -1 )
794*b1cdbd2cSJim Jagielski                 bResult= true;
795*b1cdbd2cSJim Jagielski             else if( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org_project/320m") ) ) != -1 )
796*b1cdbd2cSJim Jagielski                 bResult= true;
797*b1cdbd2cSJim Jagielski         }
798*b1cdbd2cSJim Jagielski     }
799*b1cdbd2cSJim Jagielski     return bResult;
800*b1cdbd2cSJim Jagielski }
801*b1cdbd2cSJim Jagielski 
isDocumentGeneratedWithOpenOfficeOlderThan3_0(const uno::Reference<frame::XModel> & xChartModel)802*b1cdbd2cSJim Jagielski bool isDocumentGeneratedWithOpenOfficeOlderThan3_0( const uno::Reference< frame::XModel >& xChartModel )
803*b1cdbd2cSJim Jagielski {
804*b1cdbd2cSJim Jagielski     bool bResult = isDocumentGeneratedWithOpenOfficeOlderThan2_3( xChartModel );
805*b1cdbd2cSJim Jagielski     if( !bResult )
806*b1cdbd2cSJim Jagielski     {
807*b1cdbd2cSJim Jagielski         ::rtl::OUString aGenerator( lcl_getGeneratorFromModel(xChartModel) );
808*b1cdbd2cSJim Jagielski         if( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org_project/680m") ) ) != -1 )
809*b1cdbd2cSJim Jagielski             bResult= true;
810*b1cdbd2cSJim Jagielski     }
811*b1cdbd2cSJim Jagielski     return bResult;
812*b1cdbd2cSJim Jagielski }
813*b1cdbd2cSJim Jagielski 
isDocumentGeneratedWithOpenOfficeOlderThan2_4(const uno::Reference<frame::XModel> & xChartModel)814*b1cdbd2cSJim Jagielski bool isDocumentGeneratedWithOpenOfficeOlderThan2_4( const uno::Reference< frame::XModel >& xChartModel )
815*b1cdbd2cSJim Jagielski {
816*b1cdbd2cSJim Jagielski     if( isDocumentGeneratedWithOpenOfficeOlderThan2_3( xChartModel ) )
817*b1cdbd2cSJim Jagielski         return true;
818*b1cdbd2cSJim Jagielski 
819*b1cdbd2cSJim Jagielski     if( isDocumentGeneratedWithOpenOfficeOlderThan3_0( xChartModel ) )
820*b1cdbd2cSJim Jagielski     {
821*b1cdbd2cSJim Jagielski         sal_Int32 nBuilId = lcl_getBuildIDFromGenerator( lcl_getGeneratorFromModel(xChartModel) );
822*b1cdbd2cSJim Jagielski         if( nBuilId>0 && nBuilId<=9238 ) //9238 is build id of OpenOffice.org 2.3.1
823*b1cdbd2cSJim Jagielski             return true;
824*b1cdbd2cSJim Jagielski     }
825*b1cdbd2cSJim Jagielski     return false;
826*b1cdbd2cSJim Jagielski }
827*b1cdbd2cSJim Jagielski 
isDocumentGeneratedWithOpenOfficeOlderThan2_3(const uno::Reference<frame::XModel> & xChartModel)828*b1cdbd2cSJim Jagielski bool isDocumentGeneratedWithOpenOfficeOlderThan2_3( const uno::Reference< frame::XModel >& xChartModel )
829*b1cdbd2cSJim Jagielski {
830*b1cdbd2cSJim Jagielski     bool bResult = false;
831*b1cdbd2cSJim Jagielski     ::rtl::OUString aGenerator( lcl_getGeneratorFromModel(xChartModel) );
832*b1cdbd2cSJim Jagielski     //if there is a meta stream at the chart object it was not written with an older OpenOffice version < 2.3
833*b1cdbd2cSJim Jagielski     if( !aGenerator.getLength() )
834*b1cdbd2cSJim Jagielski     {
835*b1cdbd2cSJim Jagielski         //if there is no meta stream at the chart object we need to check whether the parent document is OpenOffice at all
836*b1cdbd2cSJim Jagielski         uno::Reference< container::XChild > xChild( xChartModel, uno::UNO_QUERY );
837*b1cdbd2cSJim Jagielski         if( xChild.is() )
838*b1cdbd2cSJim Jagielski         {
839*b1cdbd2cSJim Jagielski             aGenerator = lcl_getGeneratorFromModel( uno::Reference< frame::XModel >( xChild->getParent(), uno::UNO_QUERY) );
840*b1cdbd2cSJim Jagielski             if( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org_project") ) ) != -1 )
841*b1cdbd2cSJim Jagielski             {
842*b1cdbd2cSJim Jagielski                 //the chart application has not created files without a meta stream since OOo 2.3 (OOo 2.3 has written a metastream already)
843*b1cdbd2cSJim Jagielski                 //only the report builder extension has created some files with OOo 3.1 that do not have a meta stream
844*b1cdbd2cSJim Jagielski                 if( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org_project/31") ) ) != -1 )
845*b1cdbd2cSJim Jagielski                     bResult = false;//#i100102# probably generated with OOo 3.1 by the report designer
846*b1cdbd2cSJim Jagielski                 else
847*b1cdbd2cSJim Jagielski                     bResult= true; //in this case the OLE chart was created by an older version, as OLE objects are sometimes stream copied the version can differ from the parents version, so the parents version is not a reliable indicator
848*b1cdbd2cSJim Jagielski             }
849*b1cdbd2cSJim Jagielski             else if( isDocumentGeneratedWithOpenOfficeOlderThan2_0(xChartModel) )
850*b1cdbd2cSJim Jagielski                 bResult= true;
851*b1cdbd2cSJim Jagielski         }
852*b1cdbd2cSJim Jagielski     }
853*b1cdbd2cSJim Jagielski     return bResult;
854*b1cdbd2cSJim Jagielski }
855*b1cdbd2cSJim Jagielski 
isDocumentGeneratedWithOpenOfficeOlderThan2_0(const::com::sun::star::uno::Reference<::com::sun::star::frame::XModel> & xChartModel)856*b1cdbd2cSJim Jagielski bool isDocumentGeneratedWithOpenOfficeOlderThan2_0( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xChartModel)
857*b1cdbd2cSJim Jagielski {
858*b1cdbd2cSJim Jagielski     bool bResult = false;
859*b1cdbd2cSJim Jagielski     ::rtl::OUString aGenerator( lcl_getGeneratorFromModelOrItsParent(xChartModel) );
860*b1cdbd2cSJim Jagielski     if(    ( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OpenOffice.org 1") ) ) == 0 )
861*b1cdbd2cSJim Jagielski         || ( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("StarOffice 6") ) ) == 0 )
862*b1cdbd2cSJim Jagielski         || ( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("StarOffice 7") ) ) == 0 )
863*b1cdbd2cSJim Jagielski         || ( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("StarSuite 6") ) ) == 0 )
864*b1cdbd2cSJim Jagielski         || ( aGenerator.indexOf( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("StarSuite 7") ) ) == 0 )
865*b1cdbd2cSJim Jagielski         )
866*b1cdbd2cSJim Jagielski         bResult= true;
867*b1cdbd2cSJim Jagielski     return bResult;
868*b1cdbd2cSJim Jagielski }
869*b1cdbd2cSJim Jagielski 
getDataProviderFromParent(const Reference<chart2::XChartDocument> & xChartDoc)870*b1cdbd2cSJim Jagielski Reference< chart2::data::XDataProvider > getDataProviderFromParent( const Reference< chart2::XChartDocument >& xChartDoc )
871*b1cdbd2cSJim Jagielski {
872*b1cdbd2cSJim Jagielski     Reference< chart2::data::XDataProvider > xRet;
873*b1cdbd2cSJim Jagielski     uno::Reference< container::XChild > xChild( xChartDoc, uno::UNO_QUERY );
874*b1cdbd2cSJim Jagielski     if( xChild.is() )
875*b1cdbd2cSJim Jagielski     {
876*b1cdbd2cSJim Jagielski         Reference< lang::XMultiServiceFactory > xFact( xChild->getParent(), uno::UNO_QUERY );
877*b1cdbd2cSJim Jagielski         if( xFact.is() )
878*b1cdbd2cSJim Jagielski         {
879*b1cdbd2cSJim Jagielski             const OUString aDataProviderServiceName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2.data.DataProvider"));
880*b1cdbd2cSJim Jagielski             const uno::Sequence< OUString > aServiceNames( xFact->getAvailableServiceNames());
881*b1cdbd2cSJim Jagielski             const OUString * pBegin = aServiceNames.getConstArray();
882*b1cdbd2cSJim Jagielski             const OUString * pEnd = pBegin + aServiceNames.getLength();
883*b1cdbd2cSJim Jagielski             if( ::std::find( pBegin, pEnd, aDataProviderServiceName ) != pEnd )
884*b1cdbd2cSJim Jagielski             {
885*b1cdbd2cSJim Jagielski                 xRet = Reference< chart2::data::XDataProvider >(
886*b1cdbd2cSJim Jagielski                     xFact->createInstance( aDataProviderServiceName ), uno::UNO_QUERY );
887*b1cdbd2cSJim Jagielski             }
888*b1cdbd2cSJim Jagielski         }
889*b1cdbd2cSJim Jagielski     }
890*b1cdbd2cSJim Jagielski     return xRet;
891*b1cdbd2cSJim Jagielski }
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski } // namespace SchXMLTools
894