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