xref: /AOO41X/main/xmloff/source/chart/SchXMLChartContext.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "SchXMLChartContext.hxx"
32*cdf0e10cSrcweir #include "SchXMLImport.hxx"
33*cdf0e10cSrcweir #include "SchXMLLegendContext.hxx"
34*cdf0e10cSrcweir #include "SchXMLPlotAreaContext.hxx"
35*cdf0e10cSrcweir #include "SchXMLParagraphContext.hxx"
36*cdf0e10cSrcweir #include "SchXMLTableContext.hxx"
37*cdf0e10cSrcweir #include "SchXMLSeriesHelper.hxx"
38*cdf0e10cSrcweir #include "SchXMLSeries2Context.hxx"
39*cdf0e10cSrcweir #include "SchXMLTools.hxx"
40*cdf0e10cSrcweir #include <comphelper/mediadescriptor.hxx>
41*cdf0e10cSrcweir #include <tools/debug.hxx>
42*cdf0e10cSrcweir // header for class ByteString
43*cdf0e10cSrcweir #include <tools/string.hxx>
44*cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
45*cdf0e10cSrcweir #include <xmloff/xmlement.hxx>
46*cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
47*cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
48*cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
49*cdf0e10cSrcweir #include <xmloff/xmlstyle.hxx>
50*cdf0e10cSrcweir #include <xmloff/prstylei.hxx>
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir #include "vector"
53*cdf0e10cSrcweir #include <com/sun/star/chart/XChartDocument.hpp>
54*cdf0e10cSrcweir #include <com/sun/star/chart/XDiagram.hpp>
55*cdf0e10cSrcweir #include <com/sun/star/xml/sax/XAttributeList.hpp>
56*cdf0e10cSrcweir #include <com/sun/star/util/XStringMapping.hpp>
57*cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
58*cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPage.hpp>
59*cdf0e10cSrcweir #include <com/sun/star/chart/ChartDataRowSource.hpp>
60*cdf0e10cSrcweir #include <com/sun/star/awt/PosSize.hpp>
61*cdf0e10cSrcweir #include <com/sun/star/embed/Aspects.hpp>
62*cdf0e10cSrcweir #include <com/sun/star/embed/XVisualObject.hpp>
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp>
65*cdf0e10cSrcweir #include <com/sun/star/chart2/data/XDataSink.hpp>
66*cdf0e10cSrcweir #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
67*cdf0e10cSrcweir #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
68*cdf0e10cSrcweir #include <com/sun/star/chart2/XChartTypeContainer.hpp>
69*cdf0e10cSrcweir #include <com/sun/star/chart2/XTitled.hpp>
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir using namespace com::sun::star;
72*cdf0e10cSrcweir using namespace ::xmloff::token;
73*cdf0e10cSrcweir using ::rtl::OUString;
74*cdf0e10cSrcweir using com::sun::star::uno::Reference;
75*cdf0e10cSrcweir using namespace ::SchXMLTools;
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir namespace
78*cdf0e10cSrcweir {
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir void lcl_setRoleAtLabeledSequence(
81*cdf0e10cSrcweir     const uno::Reference< chart2::data::XLabeledDataSequence > & xLSeq,
82*cdf0e10cSrcweir     const ::rtl::OUString &rRole )
83*cdf0e10cSrcweir {
84*cdf0e10cSrcweir     // set role of sequence
85*cdf0e10cSrcweir     uno::Reference< chart2::data::XDataSequence > xValues( xLSeq->getValues());
86*cdf0e10cSrcweir     if( xValues.is())
87*cdf0e10cSrcweir     {
88*cdf0e10cSrcweir         uno::Reference< beans::XPropertySet > xProp( xValues, uno::UNO_QUERY );
89*cdf0e10cSrcweir         if( xProp.is())
90*cdf0e10cSrcweir             xProp->setPropertyValue(OUString::createFromAscii("Role"), uno::makeAny( rRole ));
91*cdf0e10cSrcweir     }
92*cdf0e10cSrcweir }
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir void lcl_MoveDataToCandleStickSeries(
95*cdf0e10cSrcweir     const uno::Reference< chart2::data::XDataSource > & xDataSource,
96*cdf0e10cSrcweir     const uno::Reference< chart2::XDataSeries > & xDestination,
97*cdf0e10cSrcweir     const OUString & rRole )
98*cdf0e10cSrcweir {
99*cdf0e10cSrcweir     try
100*cdf0e10cSrcweir     {
101*cdf0e10cSrcweir         uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aLabeledSeq(
102*cdf0e10cSrcweir             xDataSource->getDataSequences());
103*cdf0e10cSrcweir         if( aLabeledSeq.getLength())
104*cdf0e10cSrcweir         {
105*cdf0e10cSrcweir             lcl_setRoleAtLabeledSequence( aLabeledSeq[0], rRole );
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir             // add to data series
108*cdf0e10cSrcweir             uno::Reference< chart2::data::XDataSource > xSource( xDestination, uno::UNO_QUERY_THROW );
109*cdf0e10cSrcweir             // @todo: realloc only once outside this function
110*cdf0e10cSrcweir             uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aData( xSource->getDataSequences());
111*cdf0e10cSrcweir             aData.realloc( aData.getLength() + 1);
112*cdf0e10cSrcweir             aData[ aData.getLength() - 1 ] = aLabeledSeq[0];
113*cdf0e10cSrcweir             uno::Reference< chart2::data::XDataSink > xSink( xDestination, uno::UNO_QUERY_THROW );
114*cdf0e10cSrcweir             xSink->setData( aData );
115*cdf0e10cSrcweir         }
116*cdf0e10cSrcweir     }
117*cdf0e10cSrcweir     catch( uno::Exception & )
118*cdf0e10cSrcweir     {
119*cdf0e10cSrcweir         OSL_ENSURE( false, "Exception caught while moving data to candlestick series" );
120*cdf0e10cSrcweir     }
121*cdf0e10cSrcweir }
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir void lcl_setRoleAtFirstSequence(
124*cdf0e10cSrcweir     const uno::Reference< chart2::XDataSeries > & xSeries,
125*cdf0e10cSrcweir     const ::rtl::OUString & rRole )
126*cdf0e10cSrcweir {
127*cdf0e10cSrcweir     uno::Reference< chart2::data::XDataSource > xSource( xSeries, uno::UNO_QUERY );
128*cdf0e10cSrcweir     if( xSource.is())
129*cdf0e10cSrcweir     {
130*cdf0e10cSrcweir         uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aSeq( xSource->getDataSequences());
131*cdf0e10cSrcweir         if( aSeq.getLength())
132*cdf0e10cSrcweir             lcl_setRoleAtLabeledSequence( aSeq[0], rRole );
133*cdf0e10cSrcweir     }
134*cdf0e10cSrcweir }
135*cdf0e10cSrcweir 
136*cdf0e10cSrcweir void lcl_removeEmptyChartTypeGroups( const uno::Reference< chart2::XChartDocument > & xDoc )
137*cdf0e10cSrcweir {
138*cdf0e10cSrcweir     if( ! xDoc.is())
139*cdf0e10cSrcweir         return;
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir     uno::Reference< chart2::XDiagram > xDia( xDoc->getFirstDiagram());
142*cdf0e10cSrcweir     if( ! xDia.is())
143*cdf0e10cSrcweir         return;
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir     try
146*cdf0e10cSrcweir     {
147*cdf0e10cSrcweir         // count all charttype groups to be able to leave at least one
148*cdf0e10cSrcweir         sal_Int32 nRemainingGroups = 0;
149*cdf0e10cSrcweir         uno::Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDia, uno::UNO_QUERY_THROW );
150*cdf0e10cSrcweir         uno::Sequence< uno::Reference< chart2::XCoordinateSystem > >
151*cdf0e10cSrcweir             aCooSysSeq( xCooSysCnt->getCoordinateSystems());
152*cdf0e10cSrcweir         for( sal_Int32 nI = aCooSysSeq.getLength(); nI--; )
153*cdf0e10cSrcweir         {
154*cdf0e10cSrcweir             uno::Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nI], uno::UNO_QUERY_THROW );
155*cdf0e10cSrcweir             nRemainingGroups += xCTCnt->getChartTypes().getLength();
156*cdf0e10cSrcweir         }
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir         // delete all empty groups, but leave at least  group (empty or not)
159*cdf0e10cSrcweir         for( sal_Int32 nI = aCooSysSeq.getLength(); nI-- && (nRemainingGroups > 1); )
160*cdf0e10cSrcweir         {
161*cdf0e10cSrcweir             uno::Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nI], uno::UNO_QUERY_THROW );
162*cdf0e10cSrcweir             uno::Sequence< uno::Reference< chart2::XChartType > > aCTSeq( xCTCnt->getChartTypes());
163*cdf0e10cSrcweir             for( sal_Int32 nJ=aCTSeq.getLength(); nJ-- && (nRemainingGroups > 1); )
164*cdf0e10cSrcweir             {
165*cdf0e10cSrcweir                 uno::Reference< chart2::XDataSeriesContainer > xDSCnt( aCTSeq[nJ], uno::UNO_QUERY_THROW );
166*cdf0e10cSrcweir                 if( xDSCnt->getDataSeries().getLength() == 0 )
167*cdf0e10cSrcweir                 {
168*cdf0e10cSrcweir                     // note: iterator stays valid as we have a local sequence
169*cdf0e10cSrcweir                     xCTCnt->removeChartType( aCTSeq[nJ] );
170*cdf0e10cSrcweir                     --nRemainingGroups;
171*cdf0e10cSrcweir                 }
172*cdf0e10cSrcweir             }
173*cdf0e10cSrcweir         }
174*cdf0e10cSrcweir     }
175*cdf0e10cSrcweir     catch( uno::Exception & ex )
176*cdf0e10cSrcweir     {
177*cdf0e10cSrcweir         String aStr( ex.Message );
178*cdf0e10cSrcweir         ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
179*cdf0e10cSrcweir         DBG_ERROR1( "Exception caught while removing empty chart types: %s", aBStr.GetBuffer());
180*cdf0e10cSrcweir     }
181*cdf0e10cSrcweir }
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir uno::Sequence< sal_Int32 > lcl_getNumberSequenceFromString( const ::rtl::OUString& rStr, bool bAddOneToEachOldIndex )
184*cdf0e10cSrcweir {
185*cdf0e10cSrcweir     const sal_Unicode aSpace( ' ' );
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir     // count number of entries
188*cdf0e10cSrcweir     ::std::vector< sal_Int32 > aVec;
189*cdf0e10cSrcweir     sal_Int32 nLastPos = 0;
190*cdf0e10cSrcweir     sal_Int32 nPos = 0;
191*cdf0e10cSrcweir     while( nPos != -1 )
192*cdf0e10cSrcweir     {
193*cdf0e10cSrcweir         nPos = rStr.indexOf( aSpace, nLastPos );
194*cdf0e10cSrcweir         if( nPos > nLastPos )
195*cdf0e10cSrcweir         {
196*cdf0e10cSrcweir             aVec.push_back( rStr.copy( nLastPos, (nPos - nLastPos) ).toInt32() );
197*cdf0e10cSrcweir         }
198*cdf0e10cSrcweir         if( nPos != -1 )
199*cdf0e10cSrcweir             nLastPos = nPos + 1;
200*cdf0e10cSrcweir     }
201*cdf0e10cSrcweir     // last entry
202*cdf0e10cSrcweir     if( nLastPos != 0 &&
203*cdf0e10cSrcweir         rStr.getLength() > nLastPos )
204*cdf0e10cSrcweir     {
205*cdf0e10cSrcweir         aVec.push_back( rStr.copy( nLastPos, (rStr.getLength() - nLastPos) ).toInt32() );
206*cdf0e10cSrcweir     }
207*cdf0e10cSrcweir 
208*cdf0e10cSrcweir     const sal_Int32 nVecSize = aVec.size();
209*cdf0e10cSrcweir     uno::Sequence< sal_Int32 > aSeq( nVecSize );
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir     if(!bAddOneToEachOldIndex)
212*cdf0e10cSrcweir     {
213*cdf0e10cSrcweir         sal_Int32* pSeqArr = aSeq.getArray();
214*cdf0e10cSrcweir         for( nPos = 0; nPos < nVecSize; ++nPos )
215*cdf0e10cSrcweir         {
216*cdf0e10cSrcweir             pSeqArr[ nPos ] = aVec[ nPos ];
217*cdf0e10cSrcweir         }
218*cdf0e10cSrcweir     }
219*cdf0e10cSrcweir     else if( bAddOneToEachOldIndex )
220*cdf0e10cSrcweir     {
221*cdf0e10cSrcweir         aSeq.realloc( nVecSize+1 );
222*cdf0e10cSrcweir         aSeq[0]=0;
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir         sal_Int32* pSeqArr = aSeq.getArray();
225*cdf0e10cSrcweir         for( nPos = 0; nPos < nVecSize; ++nPos )
226*cdf0e10cSrcweir         {
227*cdf0e10cSrcweir             pSeqArr[ nPos+1 ] = aVec[ nPos ]+1;
228*cdf0e10cSrcweir         }
229*cdf0e10cSrcweir     }
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir     return aSeq;
232*cdf0e10cSrcweir }
233*cdf0e10cSrcweir 
234*cdf0e10cSrcweir } // anonymous namespace
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir // ----------------------------------------
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir SchXMLChartContext::SchXMLChartContext( SchXMLImportHelper& rImpHelper,
239*cdf0e10cSrcweir 										SvXMLImport& rImport, const rtl::OUString& rLocalName ) :
240*cdf0e10cSrcweir 		SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
241*cdf0e10cSrcweir 		mrImportHelper( rImpHelper ),
242*cdf0e10cSrcweir         m_bHasRangeAtPlotArea( false ),
243*cdf0e10cSrcweir         m_bHasTableElement( false ),
244*cdf0e10cSrcweir         mbAllRangeAddressesAvailable( sal_True ),
245*cdf0e10cSrcweir         mbColHasLabels( sal_False ),
246*cdf0e10cSrcweir         mbRowHasLabels( sal_False ),
247*cdf0e10cSrcweir         meDataRowSource( chart::ChartDataRowSource_COLUMNS ),
248*cdf0e10cSrcweir         mbIsStockChart( false )
249*cdf0e10cSrcweir {
250*cdf0e10cSrcweir }
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir SchXMLChartContext::~SchXMLChartContext()
253*cdf0e10cSrcweir {}
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir void SchXMLChartContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
256*cdf0e10cSrcweir {
257*cdf0e10cSrcweir 	// parse attributes
258*cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
259*cdf0e10cSrcweir 	const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetChartAttrTokenMap();
260*cdf0e10cSrcweir 
261*cdf0e10cSrcweir     uno::Reference< embed::XVisualObject > xVisualObject( mrImportHelper.GetChartDocument(), uno::UNO_QUERY);
262*cdf0e10cSrcweir     DBG_ASSERT(xVisualObject.is(),"need xVisualObject for page size");
263*cdf0e10cSrcweir     if( xVisualObject.is() )
264*cdf0e10cSrcweir         maChartSize = xVisualObject->getVisualAreaSize( embed::Aspects::MSOLE_CONTENT ); //#i103460# take the size given from the parent frame as default
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir 	// this flag is necessarry for pie charts in the core
267*cdf0e10cSrcweir 	sal_Bool bSetSwitchData = sal_False;
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir 	::rtl::OUString sAutoStyleName;
270*cdf0e10cSrcweir     ::rtl::OUString aOldChartTypeName;
271*cdf0e10cSrcweir     bool bHasAddin = false;
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir 	for( sal_Int16 i = 0; i < nAttrCount; i++ )
274*cdf0e10cSrcweir 	{
275*cdf0e10cSrcweir 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
276*cdf0e10cSrcweir 		rtl::OUString aLocalName;
277*cdf0e10cSrcweir 		rtl::OUString aValue = xAttrList->getValueByIndex( i );
278*cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
279*cdf0e10cSrcweir 
280*cdf0e10cSrcweir 		switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
281*cdf0e10cSrcweir 		{
282*cdf0e10cSrcweir             case XML_TOK_CHART_HREF:
283*cdf0e10cSrcweir                 m_aXLinkHRefAttributeToIndicateDataProvider = aValue;
284*cdf0e10cSrcweir                 break;
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir 			case XML_TOK_CHART_CLASS:
287*cdf0e10cSrcweir 				{
288*cdf0e10cSrcweir 					rtl::OUString sClassName;
289*cdf0e10cSrcweir 					sal_uInt16 nClassPrefix =
290*cdf0e10cSrcweir 						GetImport().GetNamespaceMap().GetKeyByAttrName(
291*cdf0e10cSrcweir 								aValue, &sClassName );
292*cdf0e10cSrcweir 					if( XML_NAMESPACE_CHART == nClassPrefix )
293*cdf0e10cSrcweir 					{
294*cdf0e10cSrcweir 						SchXMLChartTypeEnum eChartTypeEnum = SchXMLTools::GetChartTypeEnum( sClassName );
295*cdf0e10cSrcweir                         if( eChartTypeEnum != XML_CHART_CLASS_UNKNOWN )
296*cdf0e10cSrcweir 						{
297*cdf0e10cSrcweir                             aOldChartTypeName = SchXMLTools::GetChartTypeByClassName( sClassName, true /* bUseOldNames */ );
298*cdf0e10cSrcweir                             maChartTypeServiceName = SchXMLTools::GetChartTypeByClassName( sClassName, false /* bUseOldNames */ );
299*cdf0e10cSrcweir 							switch( eChartTypeEnum )
300*cdf0e10cSrcweir 							{
301*cdf0e10cSrcweir 							case XML_CHART_CLASS_CIRCLE:
302*cdf0e10cSrcweir 								bSetSwitchData = sal_True;
303*cdf0e10cSrcweir 								break;
304*cdf0e10cSrcweir 							case XML_CHART_CLASS_STOCK:
305*cdf0e10cSrcweir                                 mbIsStockChart = true;
306*cdf0e10cSrcweir 								break;
307*cdf0e10cSrcweir 							default:
308*cdf0e10cSrcweir                                 break;
309*cdf0e10cSrcweir 							}
310*cdf0e10cSrcweir 						}
311*cdf0e10cSrcweir 					}
312*cdf0e10cSrcweir 					else if( XML_NAMESPACE_OOO == nClassPrefix )
313*cdf0e10cSrcweir 					{
314*cdf0e10cSrcweir                         // service is taken from add-in-name attribute
315*cdf0e10cSrcweir                         bHasAddin = true;
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir 						aOldChartTypeName = sClassName;
318*cdf0e10cSrcweir 						maChartTypeServiceName = sClassName;
319*cdf0e10cSrcweir 					}
320*cdf0e10cSrcweir 				}
321*cdf0e10cSrcweir 				break;
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir 			case XML_TOK_CHART_WIDTH:
324*cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertMeasure( maChartSize.Width, aValue );
325*cdf0e10cSrcweir 				break;
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir 			case XML_TOK_CHART_HEIGHT:
328*cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertMeasure( maChartSize.Height, aValue );
329*cdf0e10cSrcweir 				break;
330*cdf0e10cSrcweir 
331*cdf0e10cSrcweir 			case XML_TOK_CHART_STYLE_NAME:
332*cdf0e10cSrcweir 				sAutoStyleName = aValue;
333*cdf0e10cSrcweir 				break;
334*cdf0e10cSrcweir 
335*cdf0e10cSrcweir             case XML_TOK_CHART_COL_MAPPING:
336*cdf0e10cSrcweir                 msColTrans = aValue;
337*cdf0e10cSrcweir                 break;
338*cdf0e10cSrcweir             case XML_TOK_CHART_ROW_MAPPING:
339*cdf0e10cSrcweir                 msRowTrans = aValue;
340*cdf0e10cSrcweir                 break;
341*cdf0e10cSrcweir 		}
342*cdf0e10cSrcweir 	}
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir     if( aOldChartTypeName.getLength()<= 0 )
345*cdf0e10cSrcweir     {
346*cdf0e10cSrcweir         DBG_ERROR( "need a charttype to create a diagram" );
347*cdf0e10cSrcweir         //set a fallback value:
348*cdf0e10cSrcweir         ::rtl::OUString aChartClass_Bar( GetXMLToken(XML_BAR ) );
349*cdf0e10cSrcweir         aOldChartTypeName = SchXMLTools::GetChartTypeByClassName( aChartClass_Bar, true /* bUseOldNames */ );
350*cdf0e10cSrcweir         maChartTypeServiceName = SchXMLTools::GetChartTypeByClassName( aChartClass_Bar, false /* bUseOldNames */ );
351*cdf0e10cSrcweir     }
352*cdf0e10cSrcweir 
353*cdf0e10cSrcweir     //	Set the size of the draw page.
354*cdf0e10cSrcweir     if( xVisualObject.is() )
355*cdf0e10cSrcweir         xVisualObject->setVisualAreaSize( embed::Aspects::MSOLE_CONTENT, maChartSize );
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir 	InitChart( aOldChartTypeName, bSetSwitchData);
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir     if( bHasAddin )
360*cdf0e10cSrcweir     {
361*cdf0e10cSrcweir         //correct charttype serveice name when having an addin
362*cdf0e10cSrcweir         //and don't refresh addin during load
363*cdf0e10cSrcweir         uno::Reference< beans::XPropertySet > xDocProp( mrImportHelper.GetChartDocument(), uno::UNO_QUERY );
364*cdf0e10cSrcweir         if( xDocProp.is() )
365*cdf0e10cSrcweir         {
366*cdf0e10cSrcweir             try
367*cdf0e10cSrcweir             {
368*cdf0e10cSrcweir                 xDocProp->getPropertyValue( ::rtl::OUString::createFromAscii("BaseDiagram")) >>= aOldChartTypeName;
369*cdf0e10cSrcweir                 maChartTypeServiceName =  SchXMLTools::GetNewChartTypeName( aOldChartTypeName );
370*cdf0e10cSrcweir                 xDocProp->setPropertyValue( rtl::OUString::createFromAscii( "RefreshAddInAllowed" ) , uno::makeAny( sal_False) );
371*cdf0e10cSrcweir             }
372*cdf0e10cSrcweir             catch( uno::Exception & )
373*cdf0e10cSrcweir             {
374*cdf0e10cSrcweir                 DBG_ERROR( "Exception during import SchXMLChartContext::StartElement" );
375*cdf0e10cSrcweir             }
376*cdf0e10cSrcweir         }
377*cdf0e10cSrcweir     }
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir 	// set auto-styles for Area
380*cdf0e10cSrcweir 	uno::Reference< beans::XPropertySet > xProp( mrImportHelper.GetChartDocument()->getArea(), uno::UNO_QUERY );
381*cdf0e10cSrcweir 	if( xProp.is())
382*cdf0e10cSrcweir 	{
383*cdf0e10cSrcweir 		const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
384*cdf0e10cSrcweir 		if( pStylesCtxt )
385*cdf0e10cSrcweir 		{
386*cdf0e10cSrcweir 			const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
387*cdf0e10cSrcweir 				mrImportHelper.GetChartFamilyID(), sAutoStyleName );
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir 			if( pStyle && pStyle->ISA( XMLPropStyleContext ))
390*cdf0e10cSrcweir 				(( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
391*cdf0e10cSrcweir 		}
392*cdf0e10cSrcweir 	}
393*cdf0e10cSrcweir }
394*cdf0e10cSrcweir 
395*cdf0e10cSrcweir namespace
396*cdf0e10cSrcweir {
397*cdf0e10cSrcweir 
398*cdf0e10cSrcweir struct NewDonutSeries
399*cdf0e10cSrcweir {
400*cdf0e10cSrcweir     ::com::sun::star::uno::Reference<
401*cdf0e10cSrcweir                 ::com::sun::star::chart2::XDataSeries > m_xSeries;
402*cdf0e10cSrcweir     ::rtl::OUString msStyleName;
403*cdf0e10cSrcweir 	sal_Int32 mnAttachedAxis;
404*cdf0e10cSrcweir 
405*cdf0e10cSrcweir     ::std::vector< ::rtl::OUString > m_aSeriesStyles;
406*cdf0e10cSrcweir     ::std::vector< ::rtl::OUString > m_aPointStyles;
407*cdf0e10cSrcweir 
408*cdf0e10cSrcweir     NewDonutSeries( const ::com::sun::star::uno::Reference<
409*cdf0e10cSrcweir                 ::com::sun::star::chart2::XDataSeries >& xSeries, sal_Int32 nPointCount )
410*cdf0e10cSrcweir                     : m_xSeries( xSeries )
411*cdf0e10cSrcweir                     , mnAttachedAxis( 1 )
412*cdf0e10cSrcweir     {
413*cdf0e10cSrcweir         m_aPointStyles.resize(nPointCount);
414*cdf0e10cSrcweir         m_aSeriesStyles.resize(nPointCount);
415*cdf0e10cSrcweir     }
416*cdf0e10cSrcweir 
417*cdf0e10cSrcweir     void setSeriesStyleNameToPoint( const ::rtl::OUString& rStyleName, sal_Int32 nPointIndex )
418*cdf0e10cSrcweir     {
419*cdf0e10cSrcweir         DBG_ASSERT(nPointIndex < static_cast<sal_Int32>(m_aSeriesStyles.size()),"donut point <-> series count mismatch");
420*cdf0e10cSrcweir         if( nPointIndex < static_cast<sal_Int32>(m_aSeriesStyles.size()) )
421*cdf0e10cSrcweir             m_aSeriesStyles[nPointIndex]=rStyleName;
422*cdf0e10cSrcweir     }
423*cdf0e10cSrcweir 
424*cdf0e10cSrcweir     void setPointStyleNameToPoint( const ::rtl::OUString& rStyleName, sal_Int32 nPointIndex )
425*cdf0e10cSrcweir     {
426*cdf0e10cSrcweir         DBG_ASSERT(nPointIndex < static_cast<sal_Int32>(m_aPointStyles.size()),"donut point <-> series count mismatch");
427*cdf0e10cSrcweir         if( nPointIndex < static_cast<sal_Int32>(m_aPointStyles.size()) )
428*cdf0e10cSrcweir             m_aPointStyles[nPointIndex]=rStyleName;
429*cdf0e10cSrcweir     }
430*cdf0e10cSrcweir 
431*cdf0e10cSrcweir     ::std::list< DataRowPointStyle > creatStyleList()
432*cdf0e10cSrcweir     {
433*cdf0e10cSrcweir         ::std::list< DataRowPointStyle > aRet;
434*cdf0e10cSrcweir 
435*cdf0e10cSrcweir         DataRowPointStyle aSeriesStyle( DataRowPointStyle::DATA_SERIES
436*cdf0e10cSrcweir             , m_xSeries, -1, 1, msStyleName, mnAttachedAxis );
437*cdf0e10cSrcweir         aRet.push_back( aSeriesStyle );
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir         sal_Int32 nPointIndex=0;
440*cdf0e10cSrcweir         ::std::vector< ::rtl::OUString >::iterator aPointIt( m_aPointStyles.begin() );
441*cdf0e10cSrcweir         ::std::vector< ::rtl::OUString >::iterator aPointEnd( m_aPointStyles.end() );
442*cdf0e10cSrcweir         while( aPointIt != aPointEnd )
443*cdf0e10cSrcweir         {
444*cdf0e10cSrcweir             DataRowPointStyle aPointStyle( DataRowPointStyle::DATA_POINT
445*cdf0e10cSrcweir                 , m_xSeries, nPointIndex, 1, *aPointIt, mnAttachedAxis );
446*cdf0e10cSrcweir             if( nPointIndex < static_cast<sal_Int32>(m_aSeriesStyles.size()) )
447*cdf0e10cSrcweir             {
448*cdf0e10cSrcweir                 aPointStyle.msSeriesStyleNameForDonuts = m_aSeriesStyles[nPointIndex];
449*cdf0e10cSrcweir             }
450*cdf0e10cSrcweir             if( aPointStyle.msSeriesStyleNameForDonuts.getLength()
451*cdf0e10cSrcweir                 || aPointStyle.msStyleName.getLength() )
452*cdf0e10cSrcweir                 aRet.push_back( aPointStyle );
453*cdf0e10cSrcweir             ++aPointIt;
454*cdf0e10cSrcweir             ++nPointIndex;
455*cdf0e10cSrcweir         }
456*cdf0e10cSrcweir 
457*cdf0e10cSrcweir         return aRet;
458*cdf0e10cSrcweir     }
459*cdf0e10cSrcweir };
460*cdf0e10cSrcweir 
461*cdf0e10cSrcweir void lcl_swapPointAndSeriesStylesForDonutCharts( ::std::list< DataRowPointStyle >& rStyleList
462*cdf0e10cSrcweir         , const ::std::map< ::com::sun::star::uno::Reference<
463*cdf0e10cSrcweir                 ::com::sun::star::chart2::XDataSeries> , sal_Int32 >& rSeriesMap )
464*cdf0e10cSrcweir {
465*cdf0e10cSrcweir     ::std::list< DataRowPointStyle >::iterator aIt(rStyleList.begin());
466*cdf0e10cSrcweir     ::std::list< DataRowPointStyle >::iterator aEnd(rStyleList.end());
467*cdf0e10cSrcweir 
468*cdf0e10cSrcweir     //detect old series count
469*cdf0e10cSrcweir     //and add old series to aSeriesMap
470*cdf0e10cSrcweir     ::std::map< ::com::sun::star::uno::Reference<
471*cdf0e10cSrcweir                 ::com::sun::star::chart2::XDataSeries >, sal_Int32 > aSeriesMap(rSeriesMap);
472*cdf0e10cSrcweir     sal_Int32 nOldSeriesCount = 0;
473*cdf0e10cSrcweir     {
474*cdf0e10cSrcweir         sal_Int32 nMaxOldSeriesIndex = 0;
475*cdf0e10cSrcweir         sal_Int32 nOldSeriesIndex = 0;
476*cdf0e10cSrcweir         for( aIt = rStyleList.begin(); aIt != aEnd; ++aIt )
477*cdf0e10cSrcweir         {
478*cdf0e10cSrcweir             DataRowPointStyle aStyle(*aIt);
479*cdf0e10cSrcweir             if(aStyle.meType == DataRowPointStyle::DATA_SERIES &&
480*cdf0e10cSrcweir                     aStyle.m_xSeries.is() )
481*cdf0e10cSrcweir             {
482*cdf0e10cSrcweir                 nMaxOldSeriesIndex = nOldSeriesIndex;
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir                 if( aSeriesMap.end() == aSeriesMap.find(aStyle.m_xSeries) )
485*cdf0e10cSrcweir                     aSeriesMap[aStyle.m_xSeries] = nOldSeriesIndex;
486*cdf0e10cSrcweir 
487*cdf0e10cSrcweir                 nOldSeriesIndex++;
488*cdf0e10cSrcweir             }
489*cdf0e10cSrcweir         }
490*cdf0e10cSrcweir         nOldSeriesCount = nMaxOldSeriesIndex+1;
491*cdf0e10cSrcweir     }
492*cdf0e10cSrcweir     /*
493*cdf0e10cSrcweir     sal_Int32 nOldSeriesCount = 0;
494*cdf0e10cSrcweir     {
495*cdf0e10cSrcweir         sal_Int32 nMaxOldSeriesIndex = 0;
496*cdf0e10cSrcweir         sal_Int32 nOldSeriesIndex = 0;
497*cdf0e10cSrcweir         for( aIt = rStyleList.begin(); aIt != aEnd; ++aIt )
498*cdf0e10cSrcweir         {
499*cdf0e10cSrcweir             DataRowPointStyle aStyle(*aIt);
500*cdf0e10cSrcweir             if(aStyle.meType == DataRowPointStyle::DATA_SERIES )
501*cdf0e10cSrcweir             {
502*cdf0e10cSrcweir                 nMaxOldSeriesIndex = nOldSeriesIndex;
503*cdf0e10cSrcweir                 nOldSeriesIndex++;
504*cdf0e10cSrcweir             }
505*cdf0e10cSrcweir         }
506*cdf0e10cSrcweir         nOldSeriesCount = nMaxOldSeriesIndex+1;
507*cdf0e10cSrcweir     }
508*cdf0e10cSrcweir     */
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir 
511*cdf0e10cSrcweir     //initialize new series styles
512*cdf0e10cSrcweir     ::std::map< Reference< chart2::XDataSeries >, sal_Int32 >::const_iterator aSeriesMapIt( aSeriesMap.begin() );
513*cdf0e10cSrcweir     ::std::map< Reference< chart2::XDataSeries >, sal_Int32 >::const_iterator aSeriesMapEnd( aSeriesMap.end() );
514*cdf0e10cSrcweir 
515*cdf0e10cSrcweir     //sort by index
516*cdf0e10cSrcweir     ::std::vector< NewDonutSeries > aNewSeriesVector;
517*cdf0e10cSrcweir     {
518*cdf0e10cSrcweir         ::std::map< sal_Int32, Reference< chart2::XDataSeries > > aIndexSeriesMap;
519*cdf0e10cSrcweir         for( ; aSeriesMapIt != aSeriesMapEnd; ++aSeriesMapIt )
520*cdf0e10cSrcweir             aIndexSeriesMap[aSeriesMapIt->second] = aSeriesMapIt->first;
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir         ::std::map< sal_Int32, Reference< chart2::XDataSeries > >::const_iterator aIndexIt( aIndexSeriesMap.begin() );
523*cdf0e10cSrcweir         ::std::map< sal_Int32, Reference< chart2::XDataSeries > >::const_iterator aIndexEnd( aIndexSeriesMap.end() );
524*cdf0e10cSrcweir 
525*cdf0e10cSrcweir         for( ; aIndexIt != aIndexEnd; ++aIndexIt )
526*cdf0e10cSrcweir             aNewSeriesVector.push_back( NewDonutSeries(aIndexIt->second,nOldSeriesCount) );
527*cdf0e10cSrcweir     }
528*cdf0e10cSrcweir 
529*cdf0e10cSrcweir     //overwrite attached axis information according to old series styles
530*cdf0e10cSrcweir     for( aIt = rStyleList.begin(); aIt != aEnd; ++aIt )
531*cdf0e10cSrcweir     {
532*cdf0e10cSrcweir         DataRowPointStyle aStyle(*aIt);
533*cdf0e10cSrcweir         if(aStyle.meType == DataRowPointStyle::DATA_SERIES )
534*cdf0e10cSrcweir         {
535*cdf0e10cSrcweir             aSeriesMapIt = aSeriesMap.find( aStyle.m_xSeries );
536*cdf0e10cSrcweir             if( aSeriesMapIt != aSeriesMapEnd && aSeriesMapIt->second < static_cast<sal_Int32>(aNewSeriesVector.size()) )
537*cdf0e10cSrcweir                 aNewSeriesVector[aSeriesMapIt->second].mnAttachedAxis = aStyle.mnAttachedAxis;
538*cdf0e10cSrcweir         }
539*cdf0e10cSrcweir     }
540*cdf0e10cSrcweir 
541*cdf0e10cSrcweir     //overwrite new series style names with old series style name information
542*cdf0e10cSrcweir     for( aIt = rStyleList.begin(); aIt != aEnd; ++aIt )
543*cdf0e10cSrcweir     {
544*cdf0e10cSrcweir         DataRowPointStyle aStyle(*aIt);
545*cdf0e10cSrcweir         if( aStyle.meType == DataRowPointStyle::DATA_SERIES )
546*cdf0e10cSrcweir         {
547*cdf0e10cSrcweir             aSeriesMapIt = aSeriesMap.find(aStyle.m_xSeries);
548*cdf0e10cSrcweir             if( aSeriesMapEnd != aSeriesMapIt )
549*cdf0e10cSrcweir             {
550*cdf0e10cSrcweir                 sal_Int32 nNewPointIndex = aSeriesMapIt->second;
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir                 ::std::vector< NewDonutSeries >::iterator aNewSeriesIt( aNewSeriesVector.begin() );
553*cdf0e10cSrcweir                 ::std::vector< NewDonutSeries >::iterator aNewSeriesEnd( aNewSeriesVector.end() );
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir                 for( ;aNewSeriesIt!=aNewSeriesEnd; ++aNewSeriesIt)
556*cdf0e10cSrcweir                     aNewSeriesIt->setSeriesStyleNameToPoint( aStyle.msStyleName, nNewPointIndex );
557*cdf0e10cSrcweir             }
558*cdf0e10cSrcweir         }
559*cdf0e10cSrcweir     }
560*cdf0e10cSrcweir 
561*cdf0e10cSrcweir     //overwrite new series style names with point style name information
562*cdf0e10cSrcweir     for( aIt = rStyleList.begin(); aIt != aEnd; ++aIt )
563*cdf0e10cSrcweir     {
564*cdf0e10cSrcweir         DataRowPointStyle aStyle(*aIt);
565*cdf0e10cSrcweir         if( aStyle.meType == DataRowPointStyle::DATA_POINT )
566*cdf0e10cSrcweir         {
567*cdf0e10cSrcweir             aSeriesMapIt = aSeriesMap.find(aStyle.m_xSeries);
568*cdf0e10cSrcweir             if( aSeriesMapEnd != aSeriesMapIt )
569*cdf0e10cSrcweir             {
570*cdf0e10cSrcweir                 sal_Int32 nNewPointIndex = aSeriesMapIt->second;
571*cdf0e10cSrcweir                 sal_Int32 nNewSeriesIndex = aStyle.m_nPointIndex;
572*cdf0e10cSrcweir                 sal_Int32 nRepeatCount = aStyle.m_nPointRepeat;
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir                 while( nRepeatCount && (nNewSeriesIndex>=0) && (nNewSeriesIndex< static_cast<sal_Int32>(aNewSeriesVector.size()) ) )
575*cdf0e10cSrcweir                 {
576*cdf0e10cSrcweir                     NewDonutSeries& rNewSeries( aNewSeriesVector[nNewSeriesIndex] );
577*cdf0e10cSrcweir                     rNewSeries.setPointStyleNameToPoint( aStyle.msStyleName, nNewPointIndex );
578*cdf0e10cSrcweir 
579*cdf0e10cSrcweir                     nRepeatCount--;
580*cdf0e10cSrcweir                     nNewSeriesIndex++;
581*cdf0e10cSrcweir                 }
582*cdf0e10cSrcweir             }
583*cdf0e10cSrcweir         }
584*cdf0e10cSrcweir     }
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir     //put information from aNewSeriesVector to output parameter rStyleList
587*cdf0e10cSrcweir     rStyleList.clear();
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir     ::std::vector< NewDonutSeries >::iterator aNewSeriesIt( aNewSeriesVector.begin() );
590*cdf0e10cSrcweir     ::std::vector< NewDonutSeries >::iterator aNewSeriesEnd( aNewSeriesVector.end() );
591*cdf0e10cSrcweir     for( ;aNewSeriesIt!=aNewSeriesEnd; ++aNewSeriesIt)
592*cdf0e10cSrcweir     {
593*cdf0e10cSrcweir         ::std::list< DataRowPointStyle > aList( aNewSeriesIt->creatStyleList() );
594*cdf0e10cSrcweir         rStyleList.insert(rStyleList.end(),aList.begin(),aList.end());
595*cdf0e10cSrcweir     }
596*cdf0e10cSrcweir }
597*cdf0e10cSrcweir 
598*cdf0e10cSrcweir bool lcl_SpecialHandlingForDonutChartNeeded(
599*cdf0e10cSrcweir     const ::rtl::OUString & rServiceName,
600*cdf0e10cSrcweir     const SvXMLImport & rImport )
601*cdf0e10cSrcweir {
602*cdf0e10cSrcweir     bool bResult = false;
603*cdf0e10cSrcweir     if( rServiceName.equalsAsciiL(
604*cdf0e10cSrcweir             RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.DonutChartType" )))
605*cdf0e10cSrcweir     {
606*cdf0e10cSrcweir         bResult = SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( rImport.GetModel() );
607*cdf0e10cSrcweir     }
608*cdf0e10cSrcweir     return bResult;
609*cdf0e10cSrcweir }
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir } // anonymous namespace
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir void lcl_ApplyDataFromRectangularRangeToDiagram(
615*cdf0e10cSrcweir         const uno::Reference< chart2::XChartDocument >& xNewDoc
616*cdf0e10cSrcweir         , const rtl::OUString& rRectangularRange
617*cdf0e10cSrcweir         , ::com::sun::star::chart::ChartDataRowSource eDataRowSource
618*cdf0e10cSrcweir         , bool bRowHasLabels, bool bColHasLabels
619*cdf0e10cSrcweir         , bool bSwitchOnLabelsAndCategoriesForOwnData
620*cdf0e10cSrcweir         , const rtl::OUString& sColTrans
621*cdf0e10cSrcweir         , const rtl::OUString& sRowTrans )
622*cdf0e10cSrcweir {
623*cdf0e10cSrcweir     if( !xNewDoc.is() )
624*cdf0e10cSrcweir         return;
625*cdf0e10cSrcweir 
626*cdf0e10cSrcweir     uno::Reference< chart2::XDiagram > xNewDia( xNewDoc->getFirstDiagram());
627*cdf0e10cSrcweir     uno::Reference< chart2::data::XDataProvider > xDataProvider( xNewDoc->getDataProvider() );
628*cdf0e10cSrcweir     if( !xNewDia.is() || !xDataProvider.is() )
629*cdf0e10cSrcweir         return;
630*cdf0e10cSrcweir 
631*cdf0e10cSrcweir     sal_Bool bFirstCellAsLabel =
632*cdf0e10cSrcweir         (eDataRowSource==chart::ChartDataRowSource_COLUMNS)? bRowHasLabels : bColHasLabels;
633*cdf0e10cSrcweir     sal_Bool bHasCateories =
634*cdf0e10cSrcweir         (eDataRowSource==chart::ChartDataRowSource_COLUMNS)? bColHasLabels : bRowHasLabels;
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir     if( bSwitchOnLabelsAndCategoriesForOwnData )
637*cdf0e10cSrcweir     {
638*cdf0e10cSrcweir         bFirstCellAsLabel = true;
639*cdf0e10cSrcweir         bHasCateories = true;
640*cdf0e10cSrcweir     }
641*cdf0e10cSrcweir 
642*cdf0e10cSrcweir     uno::Sequence< beans::PropertyValue > aArgs( 3 );
643*cdf0e10cSrcweir     aArgs[0] = beans::PropertyValue(
644*cdf0e10cSrcweir         ::rtl::OUString::createFromAscii("CellRangeRepresentation"),
645*cdf0e10cSrcweir         -1, uno::makeAny( rRectangularRange ),
646*cdf0e10cSrcweir         beans::PropertyState_DIRECT_VALUE );
647*cdf0e10cSrcweir     aArgs[1] = beans::PropertyValue(
648*cdf0e10cSrcweir         ::rtl::OUString::createFromAscii("DataRowSource"),
649*cdf0e10cSrcweir         -1, uno::makeAny( eDataRowSource ),
650*cdf0e10cSrcweir         beans::PropertyState_DIRECT_VALUE );
651*cdf0e10cSrcweir     aArgs[2] = beans::PropertyValue(
652*cdf0e10cSrcweir         ::rtl::OUString::createFromAscii("FirstCellAsLabel"),
653*cdf0e10cSrcweir         -1, uno::makeAny( bFirstCellAsLabel ),
654*cdf0e10cSrcweir         beans::PropertyState_DIRECT_VALUE );
655*cdf0e10cSrcweir 
656*cdf0e10cSrcweir     if( sColTrans.getLength() || sRowTrans.getLength() )
657*cdf0e10cSrcweir     {
658*cdf0e10cSrcweir         aArgs.realloc( aArgs.getLength() + 1 );
659*cdf0e10cSrcweir         aArgs[ aArgs.getLength() - 1 ] = beans::PropertyValue(
660*cdf0e10cSrcweir             ::rtl::OUString::createFromAscii("SequenceMapping"),
661*cdf0e10cSrcweir             -1, uno::makeAny( sColTrans.getLength()
662*cdf0e10cSrcweir                 ? lcl_getNumberSequenceFromString( sColTrans, bHasCateories && !xNewDoc->hasInternalDataProvider() )
663*cdf0e10cSrcweir                 : lcl_getNumberSequenceFromString( sRowTrans, bHasCateories && !xNewDoc->hasInternalDataProvider() ) ),
664*cdf0e10cSrcweir         beans::PropertyState_DIRECT_VALUE );
665*cdf0e10cSrcweir     }
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir     //work around wrong writer ranges ( see Issue 58464 )
668*cdf0e10cSrcweir     {
669*cdf0e10cSrcweir         rtl::OUString aChartOleObjectName;
670*cdf0e10cSrcweir         uno::Reference< frame::XModel > xModel(xNewDoc, uno::UNO_QUERY );
671*cdf0e10cSrcweir         if( xModel.is() )
672*cdf0e10cSrcweir         {
673*cdf0e10cSrcweir             comphelper::MediaDescriptor aMediaDescriptor( xModel->getArgs() );
674*cdf0e10cSrcweir 
675*cdf0e10cSrcweir             comphelper::MediaDescriptor::const_iterator aIt(
676*cdf0e10cSrcweir                 aMediaDescriptor.find( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HierarchicalDocumentName" ))));
677*cdf0e10cSrcweir             if( aIt != aMediaDescriptor.end() )
678*cdf0e10cSrcweir             {
679*cdf0e10cSrcweir                 aChartOleObjectName = (*aIt).second.get< ::rtl::OUString >();
680*cdf0e10cSrcweir             }
681*cdf0e10cSrcweir         }
682*cdf0e10cSrcweir         if( aChartOleObjectName.getLength() )
683*cdf0e10cSrcweir         {
684*cdf0e10cSrcweir             aArgs.realloc( aArgs.getLength() + 1 );
685*cdf0e10cSrcweir             aArgs[ aArgs.getLength() - 1 ] = beans::PropertyValue(
686*cdf0e10cSrcweir                 ::rtl::OUString::createFromAscii("ChartOleObjectName"),
687*cdf0e10cSrcweir                 -1, uno::makeAny( aChartOleObjectName ),
688*cdf0e10cSrcweir                 beans::PropertyState_DIRECT_VALUE );
689*cdf0e10cSrcweir         }
690*cdf0e10cSrcweir     }
691*cdf0e10cSrcweir 
692*cdf0e10cSrcweir 
693*cdf0e10cSrcweir     uno::Reference< chart2::data::XDataSource > xDataSource(
694*cdf0e10cSrcweir         xDataProvider->createDataSource( aArgs ));
695*cdf0e10cSrcweir 
696*cdf0e10cSrcweir     aArgs.realloc( aArgs.getLength() + 2 );
697*cdf0e10cSrcweir     aArgs[ aArgs.getLength() - 2 ] = beans::PropertyValue(
698*cdf0e10cSrcweir         ::rtl::OUString::createFromAscii("HasCategories"),
699*cdf0e10cSrcweir         -1, uno::makeAny( bHasCateories ),
700*cdf0e10cSrcweir         beans::PropertyState_DIRECT_VALUE );
701*cdf0e10cSrcweir     aArgs[ aArgs.getLength() - 1 ] = beans::PropertyValue(
702*cdf0e10cSrcweir         ::rtl::OUString::createFromAscii("UseCategoriesAsX"),
703*cdf0e10cSrcweir         -1, uno::makeAny( sal_False ),//categories in ODF files are not to be used as x values (independent from what is offered in our ui)
704*cdf0e10cSrcweir         beans::PropertyState_DIRECT_VALUE );
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir     xNewDia->setDiagramData( xDataSource, aArgs );
707*cdf0e10cSrcweir }
708*cdf0e10cSrcweir 
709*cdf0e10cSrcweir void SchXMLChartContext::EndElement()
710*cdf0e10cSrcweir {
711*cdf0e10cSrcweir 	uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument();
712*cdf0e10cSrcweir 	uno::Reference< beans::XPropertySet > xProp( xDoc, uno::UNO_QUERY );
713*cdf0e10cSrcweir     uno::Reference< chart2::XChartDocument > xNewDoc( xDoc, uno::UNO_QUERY );
714*cdf0e10cSrcweir 
715*cdf0e10cSrcweir 	if( xProp.is())
716*cdf0e10cSrcweir 	{
717*cdf0e10cSrcweir 		if( maMainTitle.getLength())
718*cdf0e10cSrcweir 		{
719*cdf0e10cSrcweir 			uno::Reference< beans::XPropertySet > xTitleProp( xDoc->getTitle(), uno::UNO_QUERY );
720*cdf0e10cSrcweir 			if( xTitleProp.is())
721*cdf0e10cSrcweir 			{
722*cdf0e10cSrcweir 				try
723*cdf0e10cSrcweir 				{
724*cdf0e10cSrcweir 					uno::Any aAny;
725*cdf0e10cSrcweir 					aAny <<= maMainTitle;
726*cdf0e10cSrcweir 					xTitleProp->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "String" )), aAny );
727*cdf0e10cSrcweir 				}
728*cdf0e10cSrcweir 				catch( beans::UnknownPropertyException )
729*cdf0e10cSrcweir 				{
730*cdf0e10cSrcweir 					DBG_ERROR( "Property String for Title not available" );
731*cdf0e10cSrcweir 				}
732*cdf0e10cSrcweir 			}
733*cdf0e10cSrcweir 		}
734*cdf0e10cSrcweir 		if( maSubTitle.getLength())
735*cdf0e10cSrcweir 		{
736*cdf0e10cSrcweir 			uno::Reference< beans::XPropertySet > xTitleProp( xDoc->getSubTitle(), uno::UNO_QUERY );
737*cdf0e10cSrcweir 			if( xTitleProp.is())
738*cdf0e10cSrcweir 			{
739*cdf0e10cSrcweir 				try
740*cdf0e10cSrcweir 				{
741*cdf0e10cSrcweir 					uno::Any aAny;
742*cdf0e10cSrcweir 					aAny <<= maSubTitle;
743*cdf0e10cSrcweir 					xTitleProp->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "String" )), aAny );
744*cdf0e10cSrcweir 				}
745*cdf0e10cSrcweir 				catch( beans::UnknownPropertyException )
746*cdf0e10cSrcweir 				{
747*cdf0e10cSrcweir 					DBG_ERROR( "Property String for Title not available" );
748*cdf0e10cSrcweir 				}
749*cdf0e10cSrcweir 			}
750*cdf0e10cSrcweir 		}
751*cdf0e10cSrcweir 	}
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir     // cleanup: remove empty chart type groups
754*cdf0e10cSrcweir     lcl_removeEmptyChartTypeGroups( xNewDoc );
755*cdf0e10cSrcweir 
756*cdf0e10cSrcweir     // set stack mode before a potential chart type detection (in case we have a rectangular range)
757*cdf0e10cSrcweir     uno::Reference< chart::XDiagram > xDiagram( xDoc->getDiagram() );
758*cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xDiaProp( xDiagram, uno::UNO_QUERY );
759*cdf0e10cSrcweir     if( xDiaProp.is())
760*cdf0e10cSrcweir     {
761*cdf0e10cSrcweir         if( maSeriesDefaultsAndStyles.maStackedDefault.hasValue())
762*cdf0e10cSrcweir             xDiaProp->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Stacked")),maSeriesDefaultsAndStyles.maStackedDefault);
763*cdf0e10cSrcweir         if( maSeriesDefaultsAndStyles.maPercentDefault.hasValue())
764*cdf0e10cSrcweir             xDiaProp->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Percent")),maSeriesDefaultsAndStyles.maPercentDefault);
765*cdf0e10cSrcweir         if( maSeriesDefaultsAndStyles.maDeepDefault.hasValue())
766*cdf0e10cSrcweir             xDiaProp->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Deep")),maSeriesDefaultsAndStyles.maDeepDefault);
767*cdf0e10cSrcweir         if( maSeriesDefaultsAndStyles.maStackedBarsConnectedDefault.hasValue())
768*cdf0e10cSrcweir             xDiaProp->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StackedBarsConnected")),maSeriesDefaultsAndStyles.maStackedBarsConnectedDefault);
769*cdf0e10cSrcweir     }
770*cdf0e10cSrcweir 
771*cdf0e10cSrcweir     //the OOo 2.0 implementation and older has a bug with donuts
772*cdf0e10cSrcweir     bool bSpecialHandlingForDonutChart = lcl_SpecialHandlingForDonutChartNeeded(
773*cdf0e10cSrcweir         maChartTypeServiceName, GetImport());
774*cdf0e10cSrcweir 
775*cdf0e10cSrcweir     // apply data
776*cdf0e10cSrcweir     if(!xNewDoc.is())
777*cdf0e10cSrcweir         return;
778*cdf0e10cSrcweir 
779*cdf0e10cSrcweir     bool bHasOwnData = false;
780*cdf0e10cSrcweir     if( m_aXLinkHRefAttributeToIndicateDataProvider.equalsAscii( "." ) ) //data comes from the chart itself
781*cdf0e10cSrcweir         bHasOwnData = true;
782*cdf0e10cSrcweir     else if( m_aXLinkHRefAttributeToIndicateDataProvider.equalsAscii( ".." ) ) //data comes from the parent application
783*cdf0e10cSrcweir         bHasOwnData = false;
784*cdf0e10cSrcweir     else if( m_aXLinkHRefAttributeToIndicateDataProvider.getLength() ) //not supported so far to get the data by sibling objects -> fall back to chart itself if data are available
785*cdf0e10cSrcweir         bHasOwnData = m_bHasTableElement;
786*cdf0e10cSrcweir     else
787*cdf0e10cSrcweir         bHasOwnData = !m_bHasRangeAtPlotArea;
788*cdf0e10cSrcweir 
789*cdf0e10cSrcweir     if( xNewDoc->hasInternalDataProvider())
790*cdf0e10cSrcweir     {
791*cdf0e10cSrcweir         if( !m_bHasTableElement && !m_aXLinkHRefAttributeToIndicateDataProvider.equalsAscii( "." ) )
792*cdf0e10cSrcweir         {
793*cdf0e10cSrcweir             //#i103147# ODF, workaround broken files with a missing table:cell-range-address at the plot-area
794*cdf0e10cSrcweir             bool bSwitchSuccessful = SchXMLTools::switchBackToDataProviderFromParent( xNewDoc, maLSequencesPerIndex );
795*cdf0e10cSrcweir             bHasOwnData = !bSwitchSuccessful;
796*cdf0e10cSrcweir         }
797*cdf0e10cSrcweir         else
798*cdf0e10cSrcweir             bHasOwnData = true;//e.g. in case of copy->paste from calc to impress
799*cdf0e10cSrcweir     }
800*cdf0e10cSrcweir     else if( bHasOwnData )
801*cdf0e10cSrcweir     {
802*cdf0e10cSrcweir         xNewDoc->createInternalDataProvider( sal_False /* bCloneExistingData */ );
803*cdf0e10cSrcweir     }
804*cdf0e10cSrcweir     if( bHasOwnData )
805*cdf0e10cSrcweir         msChartAddress = ::rtl::OUString::createFromAscii("all");
806*cdf0e10cSrcweir 
807*cdf0e10cSrcweir     bool bSwitchRangesFromOuterToInternalIfNecessary = false;
808*cdf0e10cSrcweir     if( !bHasOwnData && mbAllRangeAddressesAvailable )
809*cdf0e10cSrcweir     {
810*cdf0e10cSrcweir         // special handling for stock chart (merge series together)
811*cdf0e10cSrcweir         if( mbIsStockChart )
812*cdf0e10cSrcweir             MergeSeriesForStockChart();
813*cdf0e10cSrcweir     }
814*cdf0e10cSrcweir     else if( msChartAddress.getLength() )
815*cdf0e10cSrcweir     {
816*cdf0e10cSrcweir         //own data or only rectangular range available
817*cdf0e10cSrcweir 
818*cdf0e10cSrcweir         if( xNewDoc->hasInternalDataProvider() )
819*cdf0e10cSrcweir             SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc );
820*cdf0e10cSrcweir 
821*cdf0e10cSrcweir         bool bOlderThan2_3 = SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( Reference< frame::XModel >( xNewDoc, uno::UNO_QUERY ));
822*cdf0e10cSrcweir         bool bOldFileWithOwnDataFromRows = (bOlderThan2_3 && bHasOwnData && (meDataRowSource==chart::ChartDataRowSource_ROWS)); // in this case there are range addresses that are simply wrong.
823*cdf0e10cSrcweir 
824*cdf0e10cSrcweir         if( mbAllRangeAddressesAvailable && !bSpecialHandlingForDonutChart && !mbIsStockChart &&
825*cdf0e10cSrcweir             !bOldFileWithOwnDataFromRows )
826*cdf0e10cSrcweir         {
827*cdf0e10cSrcweir             //bHasOwnData is true in this case!
828*cdf0e10cSrcweir             //e.g. for normal files with own data or also in case of copy paste scenario (e.g. calc to impress)
829*cdf0e10cSrcweir             bSwitchRangesFromOuterToInternalIfNecessary = true;
830*cdf0e10cSrcweir         }
831*cdf0e10cSrcweir         else
832*cdf0e10cSrcweir         {
833*cdf0e10cSrcweir             //apply data from rectangular range
834*cdf0e10cSrcweir 
835*cdf0e10cSrcweir             // create datasource from data provider with rectangular range parameters and change the diagram setDiagramData
836*cdf0e10cSrcweir             try
837*cdf0e10cSrcweir             {
838*cdf0e10cSrcweir                 if( bOlderThan2_3 && xDiaProp.is() )//for older charts the hidden cells were removed by calc on the fly
839*cdf0e10cSrcweir                     xDiaProp->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IncludeHiddenCells")),uno::makeAny(false));
840*cdf0e10cSrcweir 
841*cdf0e10cSrcweir                 // note: mbRowHasLabels means the first row contains labels, that means we have "column-descriptions",
842*cdf0e10cSrcweir                 // (analogously mbColHasLabels means we have "row-descriptions")
843*cdf0e10cSrcweir                 lcl_ApplyDataFromRectangularRangeToDiagram( xNewDoc, msChartAddress, meDataRowSource, mbRowHasLabels, mbColHasLabels, bHasOwnData, msColTrans, msRowTrans );
844*cdf0e10cSrcweir             }
845*cdf0e10cSrcweir             catch( uno::Exception & )
846*cdf0e10cSrcweir             {
847*cdf0e10cSrcweir                 //try to fallback to internal data
848*cdf0e10cSrcweir                 DBG_ERROR( "Exception during import SchXMLChartContext::lcl_ApplyDataFromRectangularRangeToDiagram try to fallback to internal data" );
849*cdf0e10cSrcweir                 if(!bHasOwnData)
850*cdf0e10cSrcweir                 {
851*cdf0e10cSrcweir                     bHasOwnData = true;
852*cdf0e10cSrcweir                     msChartAddress = ::rtl::OUString::createFromAscii("all");
853*cdf0e10cSrcweir                     if( !xNewDoc->hasInternalDataProvider() )
854*cdf0e10cSrcweir                     {
855*cdf0e10cSrcweir                         xNewDoc->createInternalDataProvider( sal_False /* bCloneExistingData */ );
856*cdf0e10cSrcweir                         SchXMLTableHelper::applyTableToInternalDataProvider( maTable, xNewDoc );
857*cdf0e10cSrcweir                         try
858*cdf0e10cSrcweir                         {
859*cdf0e10cSrcweir                             lcl_ApplyDataFromRectangularRangeToDiagram( xNewDoc, msChartAddress, meDataRowSource, mbRowHasLabels, mbColHasLabels, bHasOwnData, msColTrans, msRowTrans );
860*cdf0e10cSrcweir                         }
861*cdf0e10cSrcweir                         catch( uno::Exception & )
862*cdf0e10cSrcweir                         {
863*cdf0e10cSrcweir                             DBG_ERROR( "Exception during import SchXMLChartContext::lcl_ApplyDataFromRectangularRangeToDiagram fallback to internal data failed also" );
864*cdf0e10cSrcweir                         }
865*cdf0e10cSrcweir                     }
866*cdf0e10cSrcweir                 }
867*cdf0e10cSrcweir             }
868*cdf0e10cSrcweir         }
869*cdf0e10cSrcweir     }
870*cdf0e10cSrcweir     else
871*cdf0e10cSrcweir     {
872*cdf0e10cSrcweir         DBG_ERROR( " Must not get here" );
873*cdf0e10cSrcweir     }
874*cdf0e10cSrcweir 
875*cdf0e10cSrcweir     // now all series and data point properties are available and can be set
876*cdf0e10cSrcweir     {
877*cdf0e10cSrcweir         if( bSpecialHandlingForDonutChart )
878*cdf0e10cSrcweir         {
879*cdf0e10cSrcweir             uno::Reference< chart2::XDiagram > xNewDiagram( xNewDoc->getFirstDiagram() );
880*cdf0e10cSrcweir             lcl_swapPointAndSeriesStylesForDonutCharts( maSeriesDefaultsAndStyles.maSeriesStyleList
881*cdf0e10cSrcweir                 , SchXMLSeriesHelper::getDataSeriesIndexMapFromDiagram(xNewDiagram) );
882*cdf0e10cSrcweir         }
883*cdf0e10cSrcweir 
884*cdf0e10cSrcweir         SchXMLSeries2Context::initSeriesPropertySets( maSeriesDefaultsAndStyles, uno::Reference< frame::XModel >(xDoc, uno::UNO_QUERY ) );
885*cdf0e10cSrcweir 
886*cdf0e10cSrcweir         //set defaults from diagram to the new series:
887*cdf0e10cSrcweir         //check whether we need to remove lines from symbol only charts
888*cdf0e10cSrcweir         bool bSwitchOffLinesForScatter = false;
889*cdf0e10cSrcweir         {
890*cdf0e10cSrcweir             bool bLinesOn = true;
891*cdf0e10cSrcweir             if( (maSeriesDefaultsAndStyles.maLinesOnProperty >>= bLinesOn) && !bLinesOn )
892*cdf0e10cSrcweir             {
893*cdf0e10cSrcweir                 if( 0 == maChartTypeServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.ScatterChartType" ) ) )
894*cdf0e10cSrcweir                 {
895*cdf0e10cSrcweir                     bSwitchOffLinesForScatter = true;
896*cdf0e10cSrcweir                     SchXMLSeries2Context::switchSeriesLinesOff( maSeriesDefaultsAndStyles.maSeriesStyleList );
897*cdf0e10cSrcweir                 }
898*cdf0e10cSrcweir             }
899*cdf0e10cSrcweir         }
900*cdf0e10cSrcweir         SchXMLSeries2Context::setDefaultsToSeries( maSeriesDefaultsAndStyles );
901*cdf0e10cSrcweir 
902*cdf0e10cSrcweir         // set autostyles for series and data points
903*cdf0e10cSrcweir         const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
904*cdf0e10cSrcweir         const SvXMLStyleContext* pStyle = NULL;
905*cdf0e10cSrcweir 	    ::rtl::OUString sCurrStyleName;
906*cdf0e10cSrcweir 
907*cdf0e10cSrcweir         if( pStylesCtxt )
908*cdf0e10cSrcweir 	    {
909*cdf0e10cSrcweir             //iterate over data-series first
910*cdf0e10cSrcweir             //don't set series styles for donut charts
911*cdf0e10cSrcweir             if( !bSpecialHandlingForDonutChart )
912*cdf0e10cSrcweir             {
913*cdf0e10cSrcweir                 SchXMLSeries2Context::setStylesToSeries( maSeriesDefaultsAndStyles
914*cdf0e10cSrcweir                                                          , pStylesCtxt, pStyle, sCurrStyleName, mrImportHelper, GetImport(), mbIsStockChart, maLSequencesPerIndex );
915*cdf0e10cSrcweir                 // ... then set attributes for statistics (after their existence was set in the series)
916*cdf0e10cSrcweir                 SchXMLSeries2Context::setStylesToStatisticsObjects( maSeriesDefaultsAndStyles
917*cdf0e10cSrcweir                             , pStylesCtxt, pStyle, sCurrStyleName );
918*cdf0e10cSrcweir             }
919*cdf0e10cSrcweir         }
920*cdf0e10cSrcweir 
921*cdf0e10cSrcweir         //#i98319# call switchRangesFromOuterToInternalIfNecessary before the data point styles are applied, otherwise in copy->paste scenario the data point styles do get lost
922*cdf0e10cSrcweir         if( bSwitchRangesFromOuterToInternalIfNecessary )
923*cdf0e10cSrcweir         {
924*cdf0e10cSrcweir             if( xNewDoc->hasInternalDataProvider() )
925*cdf0e10cSrcweir                 SchXMLTableHelper::switchRangesFromOuterToInternalIfNecessary( maTable, maLSequencesPerIndex, xNewDoc, meDataRowSource );
926*cdf0e10cSrcweir         }
927*cdf0e10cSrcweir 
928*cdf0e10cSrcweir         if( pStylesCtxt )
929*cdf0e10cSrcweir         {
930*cdf0e10cSrcweir             // ... then iterate over data-point attributes, so the latter are not overwritten
931*cdf0e10cSrcweir             SchXMLSeries2Context::setStylesToDataPoints( maSeriesDefaultsAndStyles
932*cdf0e10cSrcweir                             , pStylesCtxt, pStyle, sCurrStyleName, mrImportHelper, GetImport(), mbIsStockChart, bSpecialHandlingForDonutChart, bSwitchOffLinesForScatter );
933*cdf0e10cSrcweir 	    }
934*cdf0e10cSrcweir     }
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir     if( xProp.is())
937*cdf0e10cSrcweir 	    xProp->setPropertyValue( rtl::OUString::createFromAscii( "RefreshAddInAllowed" ) , uno::makeAny( sal_True) );
938*cdf0e10cSrcweir }
939*cdf0e10cSrcweir 
940*cdf0e10cSrcweir void SchXMLChartContext::MergeSeriesForStockChart()
941*cdf0e10cSrcweir {
942*cdf0e10cSrcweir     OSL_ASSERT( mbIsStockChart );
943*cdf0e10cSrcweir     try
944*cdf0e10cSrcweir     {
945*cdf0e10cSrcweir         uno::Reference< chart::XChartDocument > xOldDoc( mrImportHelper.GetChartDocument());
946*cdf0e10cSrcweir         uno::Reference< chart2::XChartDocument > xDoc( xOldDoc, uno::UNO_QUERY_THROW );
947*cdf0e10cSrcweir         uno::Reference< chart2::XDiagram > xDiagram( xDoc->getFirstDiagram());
948*cdf0e10cSrcweir         if( ! xDiagram.is())
949*cdf0e10cSrcweir             return;
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir         bool bHasJapaneseCandlestick = true;
952*cdf0e10cSrcweir         uno::Reference< chart2::XDataSeriesContainer > xDSContainer;
953*cdf0e10cSrcweir         uno::Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
954*cdf0e10cSrcweir         uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
955*cdf0e10cSrcweir         for( sal_Int32 nCooSysIdx=0; nCooSysIdx<aCooSysSeq.getLength(); ++nCooSysIdx )
956*cdf0e10cSrcweir         {
957*cdf0e10cSrcweir             uno::Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nCooSysIdx], uno::UNO_QUERY_THROW );
958*cdf0e10cSrcweir             uno::Sequence< uno::Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
959*cdf0e10cSrcweir             for( sal_Int32 nCTIdx=0; nCTIdx<aChartTypes.getLength(); ++nCTIdx )
960*cdf0e10cSrcweir             {
961*cdf0e10cSrcweir                 if( aChartTypes[nCTIdx]->getChartType().equalsAsciiL(
962*cdf0e10cSrcweir                         RTL_CONSTASCII_STRINGPARAM("com.sun.star.chart2.CandleStickChartType")))
963*cdf0e10cSrcweir                 {
964*cdf0e10cSrcweir                     xDSContainer.set( aChartTypes[nCTIdx], uno::UNO_QUERY_THROW );
965*cdf0e10cSrcweir                     uno::Reference< beans::XPropertySet > xCTProp( aChartTypes[nCTIdx], uno::UNO_QUERY_THROW );
966*cdf0e10cSrcweir                     xCTProp->getPropertyValue( ::rtl::OUString::createFromAscii("Japanese")) >>= bHasJapaneseCandlestick;
967*cdf0e10cSrcweir                     break;
968*cdf0e10cSrcweir                 }
969*cdf0e10cSrcweir             }
970*cdf0e10cSrcweir         }
971*cdf0e10cSrcweir 
972*cdf0e10cSrcweir         if( xDSContainer.is())
973*cdf0e10cSrcweir         {
974*cdf0e10cSrcweir             // with japanese candlesticks: open, low, high, close
975*cdf0e10cSrcweir             // otherwise: low, high, close
976*cdf0e10cSrcweir             uno::Sequence< uno::Reference< chart2::XDataSeries > > aSeriesSeq( xDSContainer->getDataSeries());
977*cdf0e10cSrcweir             const sal_Int32 nSeriesCount( aSeriesSeq.getLength());
978*cdf0e10cSrcweir             const sal_Int32 nSeriesPerCandleStick = bHasJapaneseCandlestick ? 4: 3;
979*cdf0e10cSrcweir             sal_Int32 nCandleStickCount = nSeriesCount / nSeriesPerCandleStick;
980*cdf0e10cSrcweir             OSL_ASSERT( nSeriesPerCandleStick * nCandleStickCount == nSeriesCount );
981*cdf0e10cSrcweir             uno::Sequence< uno::Reference< chart2::XDataSeries > > aNewSeries( nCandleStickCount );
982*cdf0e10cSrcweir             for( sal_Int32 i=0; i<nCandleStickCount; ++i )
983*cdf0e10cSrcweir             {
984*cdf0e10cSrcweir                 sal_Int32 nSeriesIndex = i*nSeriesPerCandleStick;
985*cdf0e10cSrcweir                 if( bHasJapaneseCandlestick )
986*cdf0e10cSrcweir                 {
987*cdf0e10cSrcweir                     // open values
988*cdf0e10cSrcweir                     lcl_setRoleAtFirstSequence( aSeriesSeq[ nSeriesIndex ], OUString::createFromAscii("values-first"));
989*cdf0e10cSrcweir                     aNewSeries[i] = aSeriesSeq[ nSeriesIndex ];
990*cdf0e10cSrcweir                     // low values
991*cdf0e10cSrcweir                     lcl_MoveDataToCandleStickSeries(
992*cdf0e10cSrcweir                         uno::Reference< chart2::data::XDataSource >( aSeriesSeq[ ++nSeriesIndex ], uno::UNO_QUERY_THROW ),
993*cdf0e10cSrcweir                         aNewSeries[i], OUString::createFromAscii("values-min"));
994*cdf0e10cSrcweir                 }
995*cdf0e10cSrcweir                 else
996*cdf0e10cSrcweir                 {
997*cdf0e10cSrcweir                     // low values
998*cdf0e10cSrcweir                     lcl_setRoleAtFirstSequence( aSeriesSeq[ nSeriesIndex ], OUString::createFromAscii("values-min"));
999*cdf0e10cSrcweir                     aNewSeries[i] = aSeriesSeq[ nSeriesIndex ];
1000*cdf0e10cSrcweir                 }
1001*cdf0e10cSrcweir                 // high values
1002*cdf0e10cSrcweir                 lcl_MoveDataToCandleStickSeries(
1003*cdf0e10cSrcweir                     uno::Reference< chart2::data::XDataSource >( aSeriesSeq[ ++nSeriesIndex ], uno::UNO_QUERY_THROW ),
1004*cdf0e10cSrcweir                     aNewSeries[i], OUString::createFromAscii("values-max"));
1005*cdf0e10cSrcweir                 // close values
1006*cdf0e10cSrcweir                 lcl_MoveDataToCandleStickSeries(
1007*cdf0e10cSrcweir                     uno::Reference< chart2::data::XDataSource >( aSeriesSeq[ ++nSeriesIndex ], uno::UNO_QUERY_THROW ),
1008*cdf0e10cSrcweir                     aNewSeries[i], OUString::createFromAscii("values-last"));
1009*cdf0e10cSrcweir             }
1010*cdf0e10cSrcweir             xDSContainer->setDataSeries( aNewSeries );
1011*cdf0e10cSrcweir         }
1012*cdf0e10cSrcweir     }
1013*cdf0e10cSrcweir     catch( uno::Exception & )
1014*cdf0e10cSrcweir     {
1015*cdf0e10cSrcweir         DBG_ERROR( "Exception while merging series for stock chart" );
1016*cdf0e10cSrcweir     }
1017*cdf0e10cSrcweir }
1018*cdf0e10cSrcweir 
1019*cdf0e10cSrcweir SvXMLImportContext* SchXMLChartContext::CreateChildContext(
1020*cdf0e10cSrcweir 	sal_uInt16 nPrefix,
1021*cdf0e10cSrcweir 	const rtl::OUString& rLocalName,
1022*cdf0e10cSrcweir 	const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1023*cdf0e10cSrcweir {
1024*cdf0e10cSrcweir     static const sal_Bool bTrue = sal_True;
1025*cdf0e10cSrcweir     static const uno::Any aTrueBool( &bTrue, ::getBooleanCppuType());
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir 	SvXMLImportContext* pContext = 0;
1028*cdf0e10cSrcweir 	const SvXMLTokenMap& rTokenMap = mrImportHelper.GetChartElemTokenMap();
1029*cdf0e10cSrcweir 	uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument();
1030*cdf0e10cSrcweir     uno::Reference< beans::XPropertySet > xProp( xDoc, uno::UNO_QUERY );
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir 	switch( rTokenMap.Get( nPrefix, rLocalName ))
1033*cdf0e10cSrcweir 	{
1034*cdf0e10cSrcweir 		case XML_TOK_CHART_PLOT_AREA:
1035*cdf0e10cSrcweir 			pContext = new SchXMLPlotAreaContext( mrImportHelper, GetImport(), rLocalName,
1036*cdf0e10cSrcweir                                                   m_aXLinkHRefAttributeToIndicateDataProvider,
1037*cdf0e10cSrcweir 												  maSeriesAddresses, msCategoriesAddress,
1038*cdf0e10cSrcweir                                                   msChartAddress, m_bHasRangeAtPlotArea, mbAllRangeAddressesAvailable,
1039*cdf0e10cSrcweir                                                   mbColHasLabels, mbRowHasLabels,
1040*cdf0e10cSrcweir                                                   meDataRowSource,
1041*cdf0e10cSrcweir                                                   maSeriesDefaultsAndStyles,
1042*cdf0e10cSrcweir                                                   maChartTypeServiceName,
1043*cdf0e10cSrcweir                                                   maLSequencesPerIndex, maChartSize );
1044*cdf0e10cSrcweir 			break;
1045*cdf0e10cSrcweir 
1046*cdf0e10cSrcweir 		case XML_TOK_CHART_TITLE:
1047*cdf0e10cSrcweir 			if( xDoc.is())
1048*cdf0e10cSrcweir 			{
1049*cdf0e10cSrcweir 				if( xProp.is())
1050*cdf0e10cSrcweir 				{
1051*cdf0e10cSrcweir 					xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasMainTitle" ), aTrueBool );
1052*cdf0e10cSrcweir 				}
1053*cdf0e10cSrcweir 				uno::Reference< drawing::XShape > xTitleShape( xDoc->getTitle(), uno::UNO_QUERY );
1054*cdf0e10cSrcweir 				pContext = new SchXMLTitleContext( mrImportHelper, GetImport(),
1055*cdf0e10cSrcweir 												   rLocalName, maMainTitle, xTitleShape );
1056*cdf0e10cSrcweir 			}
1057*cdf0e10cSrcweir 			break;
1058*cdf0e10cSrcweir 
1059*cdf0e10cSrcweir 		case XML_TOK_CHART_SUBTITLE:
1060*cdf0e10cSrcweir 			if( xDoc.is())
1061*cdf0e10cSrcweir 			{
1062*cdf0e10cSrcweir 				if( xProp.is())
1063*cdf0e10cSrcweir 				{
1064*cdf0e10cSrcweir 					xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasSubTitle" ), aTrueBool );
1065*cdf0e10cSrcweir 				}
1066*cdf0e10cSrcweir 				uno::Reference< drawing::XShape > xTitleShape( xDoc->getSubTitle(), uno::UNO_QUERY );
1067*cdf0e10cSrcweir 				pContext = new SchXMLTitleContext( mrImportHelper, GetImport(),
1068*cdf0e10cSrcweir 												   rLocalName, maSubTitle, xTitleShape );
1069*cdf0e10cSrcweir 			}
1070*cdf0e10cSrcweir 			break;
1071*cdf0e10cSrcweir 
1072*cdf0e10cSrcweir 		case XML_TOK_CHART_LEGEND:
1073*cdf0e10cSrcweir 			pContext = new SchXMLLegendContext( mrImportHelper, GetImport(), rLocalName );
1074*cdf0e10cSrcweir 			break;
1075*cdf0e10cSrcweir 
1076*cdf0e10cSrcweir 		case XML_TOK_CHART_TABLE:
1077*cdf0e10cSrcweir             {
1078*cdf0e10cSrcweir                 SchXMLTableContext * pTableContext =
1079*cdf0e10cSrcweir                     new SchXMLTableContext( mrImportHelper, GetImport(), rLocalName, maTable );
1080*cdf0e10cSrcweir                 m_bHasTableElement = true;
1081*cdf0e10cSrcweir                 // #i85913# take into account column- and row- mapping for
1082*cdf0e10cSrcweir                 // charts with own data only for those which were not copied
1083*cdf0e10cSrcweir                 // from a place where they got data from the container.  Note,
1084*cdf0e10cSrcweir                 // that this requires the plot-area been read before the table
1085*cdf0e10cSrcweir                 // (which is required in the ODF spec)
1086*cdf0e10cSrcweir                 // Note: For stock charts and donut charts with special handling
1087*cdf0e10cSrcweir                 // the mapping must not be applied!
1088*cdf0e10cSrcweir                 if( !msChartAddress.getLength() && !mbIsStockChart &&
1089*cdf0e10cSrcweir                     !lcl_SpecialHandlingForDonutChartNeeded(
1090*cdf0e10cSrcweir                         maChartTypeServiceName, GetImport()))
1091*cdf0e10cSrcweir                 {
1092*cdf0e10cSrcweir                     if( msColTrans.getLength() > 0 )
1093*cdf0e10cSrcweir                     {
1094*cdf0e10cSrcweir                         OSL_ASSERT( msRowTrans.getLength() == 0 );
1095*cdf0e10cSrcweir                         pTableContext->setColumnPermutation( lcl_getNumberSequenceFromString( msColTrans, true ));
1096*cdf0e10cSrcweir                         msColTrans = OUString();
1097*cdf0e10cSrcweir                     }
1098*cdf0e10cSrcweir                     else if( msRowTrans.getLength() > 0 )
1099*cdf0e10cSrcweir                     {
1100*cdf0e10cSrcweir                         pTableContext->setRowPermutation( lcl_getNumberSequenceFromString( msRowTrans, true ));
1101*cdf0e10cSrcweir                         msRowTrans = OUString();
1102*cdf0e10cSrcweir                     }
1103*cdf0e10cSrcweir                 }
1104*cdf0e10cSrcweir                 pContext = pTableContext;
1105*cdf0e10cSrcweir             }
1106*cdf0e10cSrcweir             break;
1107*cdf0e10cSrcweir 
1108*cdf0e10cSrcweir         default:
1109*cdf0e10cSrcweir             // try importing as an additional shape
1110*cdf0e10cSrcweir             if( ! mxDrawPage.is())
1111*cdf0e10cSrcweir             {
1112*cdf0e10cSrcweir                 uno::Reference< drawing::XDrawPageSupplier  > xSupp( xDoc, uno::UNO_QUERY );
1113*cdf0e10cSrcweir                 if( xSupp.is())
1114*cdf0e10cSrcweir                     mxDrawPage = uno::Reference< drawing::XShapes >( xSupp->getDrawPage(), uno::UNO_QUERY );
1115*cdf0e10cSrcweir 
1116*cdf0e10cSrcweir                 DBG_ASSERT( mxDrawPage.is(), "Invalid Chart Page" );
1117*cdf0e10cSrcweir             }
1118*cdf0e10cSrcweir             if( mxDrawPage.is())
1119*cdf0e10cSrcweir                 pContext = GetImport().GetShapeImport()->CreateGroupChildContext(
1120*cdf0e10cSrcweir                     GetImport(), nPrefix, rLocalName, xAttrList, mxDrawPage );
1121*cdf0e10cSrcweir             break;
1122*cdf0e10cSrcweir 	}
1123*cdf0e10cSrcweir 
1124*cdf0e10cSrcweir 	if( ! pContext )
1125*cdf0e10cSrcweir 		pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1126*cdf0e10cSrcweir 
1127*cdf0e10cSrcweir 	return pContext;
1128*cdf0e10cSrcweir }
1129*cdf0e10cSrcweir 
1130*cdf0e10cSrcweir 
1131*cdf0e10cSrcweir /*
1132*cdf0e10cSrcweir 	With a locked controller the following is done here:
1133*cdf0e10cSrcweir 		1.	Hide title, subtitle, and legend.
1134*cdf0e10cSrcweir 		2.	Set the size of the draw page.
1135*cdf0e10cSrcweir 		3.	Set a (logically) empty data set.
1136*cdf0e10cSrcweir 		4.	Set the chart type.
1137*cdf0e10cSrcweir */
1138*cdf0e10cSrcweir void SchXMLChartContext::InitChart(
1139*cdf0e10cSrcweir     const OUString & rChartTypeServiceName, // currently the old service name
1140*cdf0e10cSrcweir     sal_Bool /* bSetSwitchData */ )
1141*cdf0e10cSrcweir {
1142*cdf0e10cSrcweir     uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument();
1143*cdf0e10cSrcweir 	DBG_ASSERT( xDoc.is(), "No valid document!" );
1144*cdf0e10cSrcweir 	uno::Reference< frame::XModel > xModel (xDoc, uno::UNO_QUERY );
1145*cdf0e10cSrcweir 
1146*cdf0e10cSrcweir 	// Remove Title and Diagram ("De-InitNew")
1147*cdf0e10cSrcweir 	uno::Reference< chart2::XChartDocument > xNewDoc( mrImportHelper.GetChartDocument(), uno::UNO_QUERY );
1148*cdf0e10cSrcweir 	if( xNewDoc.is())
1149*cdf0e10cSrcweir 	{
1150*cdf0e10cSrcweir         xNewDoc->setFirstDiagram( 0 );
1151*cdf0e10cSrcweir         uno::Reference< chart2::XTitled > xTitled( xNewDoc, uno::UNO_QUERY );
1152*cdf0e10cSrcweir         if( xTitled.is())
1153*cdf0e10cSrcweir             xTitled->setTitleObject( 0 );
1154*cdf0e10cSrcweir     }
1155*cdf0e10cSrcweir 
1156*cdf0e10cSrcweir 	//	Set the chart type via setting the diagram.
1157*cdf0e10cSrcweir 	if( rChartTypeServiceName.getLength() &&
1158*cdf0e10cSrcweir 		xDoc.is())
1159*cdf0e10cSrcweir 	{
1160*cdf0e10cSrcweir 		uno::Reference< lang::XMultiServiceFactory > xFact( xDoc, uno::UNO_QUERY );
1161*cdf0e10cSrcweir 		if( xFact.is())
1162*cdf0e10cSrcweir 		{
1163*cdf0e10cSrcweir 			uno::Reference< chart::XDiagram > xDia( xFact->createInstance( rChartTypeServiceName ), uno::UNO_QUERY );
1164*cdf0e10cSrcweir             if( xDia.is())
1165*cdf0e10cSrcweir 				xDoc->setDiagram( xDia );
1166*cdf0e10cSrcweir 		}
1167*cdf0e10cSrcweir 	}
1168*cdf0e10cSrcweir }
1169*cdf0e10cSrcweir 
1170*cdf0e10cSrcweir // ----------------------------------------
1171*cdf0e10cSrcweir 
1172*cdf0e10cSrcweir SchXMLTitleContext::SchXMLTitleContext( SchXMLImportHelper& rImpHelper, SvXMLImport& rImport,
1173*cdf0e10cSrcweir 										const rtl::OUString& rLocalName,
1174*cdf0e10cSrcweir 										rtl::OUString& rTitle,
1175*cdf0e10cSrcweir 										uno::Reference< drawing::XShape >& xTitleShape ) :
1176*cdf0e10cSrcweir 		SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
1177*cdf0e10cSrcweir 		mrImportHelper( rImpHelper ),
1178*cdf0e10cSrcweir 		mrTitle( rTitle ),
1179*cdf0e10cSrcweir 		mxTitleShape( xTitleShape )
1180*cdf0e10cSrcweir {
1181*cdf0e10cSrcweir }
1182*cdf0e10cSrcweir 
1183*cdf0e10cSrcweir SchXMLTitleContext::~SchXMLTitleContext()
1184*cdf0e10cSrcweir {}
1185*cdf0e10cSrcweir 
1186*cdf0e10cSrcweir void SchXMLTitleContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1187*cdf0e10cSrcweir {
1188*cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
1189*cdf0e10cSrcweir 
1190*cdf0e10cSrcweir     com::sun::star::awt::Point maPosition;
1191*cdf0e10cSrcweir     bool bHasXPosition=false;
1192*cdf0e10cSrcweir     bool bHasYPosition=false;
1193*cdf0e10cSrcweir 
1194*cdf0e10cSrcweir 	for( sal_Int16 i = 0; i < nAttrCount; i++ )
1195*cdf0e10cSrcweir 	{
1196*cdf0e10cSrcweir 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
1197*cdf0e10cSrcweir 		rtl::OUString aLocalName;
1198*cdf0e10cSrcweir 		rtl::OUString aValue = xAttrList->getValueByIndex( i );
1199*cdf0e10cSrcweir 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
1200*cdf0e10cSrcweir 
1201*cdf0e10cSrcweir 		if( nPrefix == XML_NAMESPACE_SVG )
1202*cdf0e10cSrcweir 		{
1203*cdf0e10cSrcweir 			if( IsXMLToken( aLocalName, XML_X ) )
1204*cdf0e10cSrcweir             {
1205*cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertMeasure( maPosition.X, aValue );
1206*cdf0e10cSrcweir                 bHasXPosition = true;
1207*cdf0e10cSrcweir             }
1208*cdf0e10cSrcweir 			else if( IsXMLToken( aLocalName, XML_Y ) )
1209*cdf0e10cSrcweir             {
1210*cdf0e10cSrcweir 				GetImport().GetMM100UnitConverter().convertMeasure( maPosition.Y, aValue );
1211*cdf0e10cSrcweir                 bHasYPosition = true;
1212*cdf0e10cSrcweir             }
1213*cdf0e10cSrcweir 		}
1214*cdf0e10cSrcweir 		else if( nPrefix == XML_NAMESPACE_CHART )
1215*cdf0e10cSrcweir 		{
1216*cdf0e10cSrcweir 			if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
1217*cdf0e10cSrcweir 				msAutoStyleName = aValue;
1218*cdf0e10cSrcweir 		}
1219*cdf0e10cSrcweir 	}
1220*cdf0e10cSrcweir 
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir 	if( mxTitleShape.is())
1223*cdf0e10cSrcweir 	{
1224*cdf0e10cSrcweir         if( bHasXPosition && bHasYPosition )
1225*cdf0e10cSrcweir             mxTitleShape->setPosition( maPosition );
1226*cdf0e10cSrcweir 
1227*cdf0e10cSrcweir 		uno::Reference< beans::XPropertySet > xProp( mxTitleShape, uno::UNO_QUERY );
1228*cdf0e10cSrcweir 		if( xProp.is())
1229*cdf0e10cSrcweir 		{
1230*cdf0e10cSrcweir 			const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
1231*cdf0e10cSrcweir 			if( pStylesCtxt )
1232*cdf0e10cSrcweir 			{
1233*cdf0e10cSrcweir 				const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
1234*cdf0e10cSrcweir 					mrImportHelper.GetChartFamilyID(), msAutoStyleName );
1235*cdf0e10cSrcweir 
1236*cdf0e10cSrcweir 				if( pStyle && pStyle->ISA( XMLPropStyleContext ))
1237*cdf0e10cSrcweir 					(( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
1238*cdf0e10cSrcweir 			}
1239*cdf0e10cSrcweir 		}
1240*cdf0e10cSrcweir 	}
1241*cdf0e10cSrcweir }
1242*cdf0e10cSrcweir 
1243*cdf0e10cSrcweir SvXMLImportContext* SchXMLTitleContext::CreateChildContext(
1244*cdf0e10cSrcweir 	sal_uInt16 nPrefix,
1245*cdf0e10cSrcweir 	const rtl::OUString& rLocalName,
1246*cdf0e10cSrcweir 	const uno::Reference< xml::sax::XAttributeList >& )
1247*cdf0e10cSrcweir {
1248*cdf0e10cSrcweir 	SvXMLImportContext* pContext = 0;
1249*cdf0e10cSrcweir 
1250*cdf0e10cSrcweir 	if( nPrefix == XML_NAMESPACE_TEXT &&
1251*cdf0e10cSrcweir 		IsXMLToken( rLocalName, XML_P ) )
1252*cdf0e10cSrcweir 	{
1253*cdf0e10cSrcweir 		pContext = new SchXMLParagraphContext( GetImport(), rLocalName, mrTitle );
1254*cdf0e10cSrcweir 	}
1255*cdf0e10cSrcweir 	else
1256*cdf0e10cSrcweir 		pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1257*cdf0e10cSrcweir 
1258*cdf0e10cSrcweir 	return pContext;
1259*cdf0e10cSrcweir }
1260*cdf0e10cSrcweir 
1261*cdf0e10cSrcweir // ----------------------------------------
1262