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