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 "SchXMLPlotAreaContext.hxx"
28*b1cdbd2cSJim Jagielski #include "SchXMLImport.hxx"
29*b1cdbd2cSJim Jagielski #include "SchXMLAxisContext.hxx"
30*b1cdbd2cSJim Jagielski #include "SchXMLSeries2Context.hxx"
31*b1cdbd2cSJim Jagielski #include "SchXMLTools.hxx"
32*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
33*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
34*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
35*b1cdbd2cSJim Jagielski #endif
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
38*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
39*b1cdbd2cSJim Jagielski #include <xmloff/xmlement.hxx>
40*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
41*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
42*b1cdbd2cSJim Jagielski #include <xmloff/prstylei.hxx>
43*b1cdbd2cSJim Jagielski #include <xmloff/xmlstyle.hxx>
44*b1cdbd2cSJim Jagielski #include "xexptran.hxx"
45*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Point.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Size.hpp>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/ChartDataRowSource.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/X3DDisplay.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XStatisticDisplay.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/chart/XDiagramPositioning.hpp>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartTypeContainer.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/RelativePosition.hpp>
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/CameraGeometry.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/FillStyle.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XStringMapping.hpp>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XAttributeList.hpp>
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski using namespace com::sun::star;
67*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski using ::rtl::OUString;
70*b1cdbd2cSJim Jagielski using com::sun::star::uno::Reference;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski namespace
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski struct lcl_AxisHasCategories : public ::std::unary_function< SchXMLAxis, bool >
76*b1cdbd2cSJim Jagielski {
operator ()__anon877fc5480111::lcl_AxisHasCategories77*b1cdbd2cSJim Jagielski     bool operator() ( const SchXMLAxis & rAxis )
78*b1cdbd2cSJim Jagielski     {
79*b1cdbd2cSJim Jagielski         return rAxis.bHasCategories;
80*b1cdbd2cSJim Jagielski     }
81*b1cdbd2cSJim Jagielski };
82*b1cdbd2cSJim Jagielski 
lcl_ConvertRange(const::rtl::OUString & rRange,const uno::Reference<chart2::XChartDocument> & xDoc)83*b1cdbd2cSJim Jagielski OUString lcl_ConvertRange( const ::rtl::OUString & rRange, const uno::Reference< chart2::XChartDocument > & xDoc )
84*b1cdbd2cSJim Jagielski {
85*b1cdbd2cSJim Jagielski     OUString aResult = rRange;
86*b1cdbd2cSJim Jagielski     if(!xDoc.is())
87*b1cdbd2cSJim Jagielski         return aResult;
88*b1cdbd2cSJim Jagielski     uno::Reference< chart2::data::XRangeXMLConversion > xConversion(
89*b1cdbd2cSJim Jagielski         xDoc->getDataProvider(), uno::UNO_QUERY );
90*b1cdbd2cSJim Jagielski     if( xConversion.is())
91*b1cdbd2cSJim Jagielski         aResult = xConversion->convertRangeFromXML( rRange );
92*b1cdbd2cSJim Jagielski     return aResult;
93*b1cdbd2cSJim Jagielski }
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski } // anonymous namespace
96*b1cdbd2cSJim Jagielski 
SchXML3DSceneAttributesHelper(SvXMLImport & rImporter)97*b1cdbd2cSJim Jagielski SchXML3DSceneAttributesHelper::SchXML3DSceneAttributesHelper( SvXMLImport& rImporter )
98*b1cdbd2cSJim Jagielski     : SdXML3DSceneAttributesHelper( rImporter )
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski 
getCameraDefaultFromDiagram(const uno::Reference<chart::XDiagram> & xDiagram)102*b1cdbd2cSJim Jagielski void SchXML3DSceneAttributesHelper::getCameraDefaultFromDiagram( const uno::Reference< chart::XDiagram >& xDiagram )
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski     //different defaults for camera geometry necessary to workaround wrong behaviour in old chart
105*b1cdbd2cSJim Jagielski     //in future make this version dependent if we have versioning (metastream) for ole objects
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     try
108*b1cdbd2cSJim Jagielski     {
109*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xProp( xDiagram, uno::UNO_QUERY );
110*b1cdbd2cSJim Jagielski         if( xProp.is() )
111*b1cdbd2cSJim Jagielski         {
112*b1cdbd2cSJim Jagielski             drawing::CameraGeometry aCamGeo;
113*b1cdbd2cSJim Jagielski             xProp->getPropertyValue( ::rtl::OUString::createFromAscii("D3DCameraGeometry")) >>= aCamGeo;
114*b1cdbd2cSJim Jagielski             maVRP.setX( aCamGeo.vrp.PositionX );
115*b1cdbd2cSJim Jagielski 	        maVRP.setY( aCamGeo.vrp.PositionY );
116*b1cdbd2cSJim Jagielski 	        maVRP.setZ( aCamGeo.vrp.PositionZ );
117*b1cdbd2cSJim Jagielski 	        maVPN.setX( aCamGeo.vpn.DirectionX );
118*b1cdbd2cSJim Jagielski 	        maVPN.setY( aCamGeo.vpn.DirectionY );
119*b1cdbd2cSJim Jagielski 	        maVPN.setZ( aCamGeo.vpn.DirectionZ );
120*b1cdbd2cSJim Jagielski 	        maVUP.setX( aCamGeo.vup.DirectionX );
121*b1cdbd2cSJim Jagielski 	        maVUP.setY( aCamGeo.vup.DirectionY );
122*b1cdbd2cSJim Jagielski 	        maVUP.setZ( aCamGeo.vup.DirectionZ );
123*b1cdbd2cSJim Jagielski         }
124*b1cdbd2cSJim Jagielski     }
125*b1cdbd2cSJim Jagielski     catch( uno::Exception & rEx )
126*b1cdbd2cSJim Jagielski     {
127*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
128*b1cdbd2cSJim Jagielski         String aStr( rEx.Message );
129*b1cdbd2cSJim Jagielski         ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
130*b1cdbd2cSJim Jagielski         DBG_ERROR1( "Exception caught for property NumberOfLines: %s", aBStr.GetBuffer());
131*b1cdbd2cSJim Jagielski #else
132*b1cdbd2cSJim Jagielski         (void)rEx; // avoid warning for pro build
133*b1cdbd2cSJim Jagielski #endif
134*b1cdbd2cSJim Jagielski     }
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
~SchXML3DSceneAttributesHelper()137*b1cdbd2cSJim Jagielski SchXML3DSceneAttributesHelper::~SchXML3DSceneAttributesHelper()
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
SchXMLPlotAreaContext(SchXMLImportHelper & rImpHelper,SvXMLImport & rImport,const rtl::OUString & rLocalName,const rtl::OUString & rXLinkHRefAttributeToIndicateDataProvider,uno::Sequence<chart::ChartSeriesAddress> & rSeriesAddresses,::rtl::OUString & rCategoriesAddress,::rtl::OUString & rChartAddress,bool & rbHasRangeAtPlotArea,sal_Bool & rAllRangeAddressesAvailable,sal_Bool & rColHasLabels,sal_Bool & rRowHasLabels,chart::ChartDataRowSource & rDataRowSource,SeriesDefaultsAndStyles & rSeriesDefaultsAndStyles,const::rtl::OUString & aChartTypeServiceName,tSchXMLLSequencesPerIndex & rLSequencesPerIndex,const awt::Size & rChartSize)141*b1cdbd2cSJim Jagielski SchXMLPlotAreaContext::SchXMLPlotAreaContext(
142*b1cdbd2cSJim Jagielski     SchXMLImportHelper& rImpHelper,
143*b1cdbd2cSJim Jagielski     SvXMLImport& rImport, const rtl::OUString& rLocalName,
144*b1cdbd2cSJim Jagielski     const rtl::OUString& rXLinkHRefAttributeToIndicateDataProvider,
145*b1cdbd2cSJim Jagielski     uno::Sequence< chart::ChartSeriesAddress >& rSeriesAddresses,
146*b1cdbd2cSJim Jagielski     ::rtl::OUString& rCategoriesAddress,
147*b1cdbd2cSJim Jagielski     ::rtl::OUString& rChartAddress,
148*b1cdbd2cSJim Jagielski     bool& rbHasRangeAtPlotArea,
149*b1cdbd2cSJim Jagielski     sal_Bool & rAllRangeAddressesAvailable,
150*b1cdbd2cSJim Jagielski     sal_Bool & rColHasLabels,
151*b1cdbd2cSJim Jagielski     sal_Bool & rRowHasLabels,
152*b1cdbd2cSJim Jagielski     chart::ChartDataRowSource & rDataRowSource,
153*b1cdbd2cSJim Jagielski     SeriesDefaultsAndStyles& rSeriesDefaultsAndStyles,
154*b1cdbd2cSJim Jagielski     const ::rtl::OUString& aChartTypeServiceName,
155*b1cdbd2cSJim Jagielski     tSchXMLLSequencesPerIndex & rLSequencesPerIndex,
156*b1cdbd2cSJim Jagielski     const awt::Size & rChartSize ) :
157*b1cdbd2cSJim Jagielski 		SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
158*b1cdbd2cSJim Jagielski 		mrImportHelper( rImpHelper ),
159*b1cdbd2cSJim Jagielski 		mrSeriesAddresses( rSeriesAddresses ),
160*b1cdbd2cSJim Jagielski 		mrCategoriesAddress( rCategoriesAddress ),
161*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles( rSeriesDefaultsAndStyles ),
162*b1cdbd2cSJim Jagielski         mnNumOfLinesProp( 0 ),
163*b1cdbd2cSJim Jagielski         mbStockHasVolume( sal_False ),
164*b1cdbd2cSJim Jagielski 		mnSeries( 0 ),
165*b1cdbd2cSJim Jagielski         m_aGlobalSeriesImportInfo( rAllRangeAddressesAvailable ),
166*b1cdbd2cSJim Jagielski 		maSceneImportHelper( rImport ),
167*b1cdbd2cSJim Jagielski         m_aOuterPositioning( rImport ),
168*b1cdbd2cSJim Jagielski         m_aInnerPositioning( rImport ),
169*b1cdbd2cSJim Jagielski         mbPercentStacked(false),
170*b1cdbd2cSJim Jagielski         m_bAxisPositionAttributeImported(false),
171*b1cdbd2cSJim Jagielski         m_rXLinkHRefAttributeToIndicateDataProvider(rXLinkHRefAttributeToIndicateDataProvider),
172*b1cdbd2cSJim Jagielski         mrChartAddress( rChartAddress ),
173*b1cdbd2cSJim Jagielski         m_rbHasRangeAtPlotArea( rbHasRangeAtPlotArea ),
174*b1cdbd2cSJim Jagielski         mrColHasLabels( rColHasLabels ),
175*b1cdbd2cSJim Jagielski         mrRowHasLabels( rRowHasLabels ),
176*b1cdbd2cSJim Jagielski         mrDataRowSource( rDataRowSource ),
177*b1cdbd2cSJim Jagielski         maChartTypeServiceName( aChartTypeServiceName ),
178*b1cdbd2cSJim Jagielski         mrLSequencesPerIndex( rLSequencesPerIndex ),
179*b1cdbd2cSJim Jagielski         mbGlobalChartTypeUsedBySeries( false ),
180*b1cdbd2cSJim Jagielski         maChartSize( rChartSize )
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski     m_rbHasRangeAtPlotArea = false;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	// get Diagram
185*b1cdbd2cSJim Jagielski 	uno::Reference< chart::XChartDocument > xDoc( rImpHelper.GetChartDocument(), uno::UNO_QUERY );
186*b1cdbd2cSJim Jagielski 	if( xDoc.is())
187*b1cdbd2cSJim Jagielski 	{
188*b1cdbd2cSJim Jagielski 		mxDiagram = xDoc->getDiagram();
189*b1cdbd2cSJim Jagielski         mxNewDoc.set( xDoc, uno::UNO_QUERY );
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski         maSceneImportHelper.getCameraDefaultFromDiagram( mxDiagram );
192*b1cdbd2cSJim Jagielski 	}
193*b1cdbd2cSJim Jagielski 	DBG_ASSERT( mxDiagram.is(), "Couldn't get XDiagram" );
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	// turn off all axes initially
196*b1cdbd2cSJim Jagielski 	uno::Any aFalseBool;
197*b1cdbd2cSJim Jagielski 	aFalseBool <<= (sal_Bool)(sal_False);
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 	uno::Reference< lang::XServiceInfo > xInfo( mxDiagram, uno::UNO_QUERY );
200*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xProp( mxDiagram, uno::UNO_QUERY );
201*b1cdbd2cSJim Jagielski 	if( xInfo.is() &&
202*b1cdbd2cSJim Jagielski 		xProp.is())
203*b1cdbd2cSJim Jagielski 	{
204*b1cdbd2cSJim Jagielski 		try
205*b1cdbd2cSJim Jagielski 		{
206*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
207*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasXAxis" ), aFalseBool );
208*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
209*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasXAxisGrid" ), aFalseBool );
210*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
211*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasXAxisDescription" ), aFalseBool );
212*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
213*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasSecondaryXAxis" ), aFalseBool );
214*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
215*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasSecondaryXAxisDescription" ), aFalseBool );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
218*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasYAxis" ), aFalseBool );
219*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
220*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasYAxisGrid" ), aFalseBool );
221*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
222*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasYAxisDescription" ), aFalseBool );
223*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
224*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasSecondaryYAxis" ), aFalseBool );
225*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
226*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasSecondaryYAxisDescription" ), aFalseBool );
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
229*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasZAxis" ), aFalseBool );
230*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue(
231*b1cdbd2cSJim Jagielski 				rtl::OUString::createFromAscii( "HasZAxisDescription" ), aFalseBool );
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 			uno::Any aAny;
234*b1cdbd2cSJim Jagielski 			chart::ChartDataRowSource eSource = chart::ChartDataRowSource_COLUMNS;
235*b1cdbd2cSJim Jagielski 			aAny <<= eSource;
236*b1cdbd2cSJim Jagielski 			xProp->setPropertyValue( rtl::OUString::createFromAscii( "DataRowSource" ), aAny );
237*b1cdbd2cSJim Jagielski 		}
238*b1cdbd2cSJim Jagielski 		catch( beans::UnknownPropertyException & )
239*b1cdbd2cSJim Jagielski 		{
240*b1cdbd2cSJim Jagielski 			DBG_ERROR( "Property required by service not supported" );
241*b1cdbd2cSJim Jagielski 		}
242*b1cdbd2cSJim Jagielski 	}
243*b1cdbd2cSJim Jagielski }
244*b1cdbd2cSJim Jagielski 
~SchXMLPlotAreaContext()245*b1cdbd2cSJim Jagielski SchXMLPlotAreaContext::~SchXMLPlotAreaContext()
246*b1cdbd2cSJim Jagielski {}
247*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)248*b1cdbd2cSJim Jagielski void SchXMLPlotAreaContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski 	// parse attributes
251*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
252*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetPlotAreaAttrTokenMap();
253*b1cdbd2cSJim Jagielski     uno::Reference< chart2::XChartDocument > xNewDoc( GetImport().GetModel(), uno::UNO_QUERY );
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 	for( sal_Int16 i = 0; i < nAttrCount; i++ )
256*b1cdbd2cSJim Jagielski 	{
257*b1cdbd2cSJim Jagielski 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
258*b1cdbd2cSJim Jagielski 		rtl::OUString aLocalName;
259*b1cdbd2cSJim Jagielski 		rtl::OUString aValue = xAttrList->getValueByIndex( i );
260*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 		switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
263*b1cdbd2cSJim Jagielski 		{
264*b1cdbd2cSJim Jagielski 			case XML_TOK_PA_X:
265*b1cdbd2cSJim Jagielski 			case XML_TOK_PA_Y:
266*b1cdbd2cSJim Jagielski 			case XML_TOK_PA_WIDTH:
267*b1cdbd2cSJim Jagielski 			case XML_TOK_PA_HEIGHT:
268*b1cdbd2cSJim Jagielski                 m_aOuterPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
269*b1cdbd2cSJim Jagielski 				break;
270*b1cdbd2cSJim Jagielski 			case XML_TOK_PA_STYLE_NAME:
271*b1cdbd2cSJim Jagielski 				msAutoStyleName = aValue;
272*b1cdbd2cSJim Jagielski 				break;
273*b1cdbd2cSJim Jagielski             case XML_TOK_PA_CHART_ADDRESS:
274*b1cdbd2cSJim Jagielski                 mrChartAddress = lcl_ConvertRange( aValue, xNewDoc );
275*b1cdbd2cSJim Jagielski                 // indicator for getting data from the outside
276*b1cdbd2cSJim Jagielski                 m_rbHasRangeAtPlotArea = true;
277*b1cdbd2cSJim Jagielski                 break;
278*b1cdbd2cSJim Jagielski             case XML_TOK_PA_DS_HAS_LABELS:
279*b1cdbd2cSJim Jagielski                 {
280*b1cdbd2cSJim Jagielski                     if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_BOTH )))
281*b1cdbd2cSJim Jagielski                         mrColHasLabels = mrRowHasLabels = sal_True;
282*b1cdbd2cSJim Jagielski                     else if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_ROW )))
283*b1cdbd2cSJim Jagielski                         mrRowHasLabels = sal_True;
284*b1cdbd2cSJim Jagielski                     else if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_COLUMN )))
285*b1cdbd2cSJim Jagielski                         mrColHasLabels = sal_True;
286*b1cdbd2cSJim Jagielski                 }
287*b1cdbd2cSJim Jagielski                 break;
288*b1cdbd2cSJim Jagielski             case XML_TOK_PA_TRANSFORM:
289*b1cdbd2cSJim Jagielski             case XML_TOK_PA_VRP:
290*b1cdbd2cSJim Jagielski             case XML_TOK_PA_VPN:
291*b1cdbd2cSJim Jagielski             case XML_TOK_PA_VUP:
292*b1cdbd2cSJim Jagielski             case XML_TOK_PA_PROJECTION:
293*b1cdbd2cSJim Jagielski             case XML_TOK_PA_DISTANCE:
294*b1cdbd2cSJim Jagielski             case XML_TOK_PA_FOCAL_LENGTH:
295*b1cdbd2cSJim Jagielski             case XML_TOK_PA_SHADOW_SLANT:
296*b1cdbd2cSJim Jagielski             case XML_TOK_PA_SHADE_MODE:
297*b1cdbd2cSJim Jagielski             case XML_TOK_PA_AMBIENT_COLOR:
298*b1cdbd2cSJim Jagielski             case XML_TOK_PA_LIGHTING_MODE:
299*b1cdbd2cSJim Jagielski 				maSceneImportHelper.processSceneAttribute( nPrefix, aLocalName, aValue );
300*b1cdbd2cSJim Jagielski 				break;
301*b1cdbd2cSJim Jagielski 		}
302*b1cdbd2cSJim Jagielski 	}
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski     if( ! mxNewDoc.is())
305*b1cdbd2cSJim Jagielski     {
306*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xDocProp( mrImportHelper.GetChartDocument(), uno::UNO_QUERY );
307*b1cdbd2cSJim Jagielski         if( xDocProp.is())
308*b1cdbd2cSJim Jagielski         {
309*b1cdbd2cSJim Jagielski             try
310*b1cdbd2cSJim Jagielski             {
311*b1cdbd2cSJim Jagielski                 uno::Any aAny;
312*b1cdbd2cSJim Jagielski                 aAny <<= (sal_Bool)(mrColHasLabels);
313*b1cdbd2cSJim Jagielski                 xDocProp->setPropertyValue(
314*b1cdbd2cSJim Jagielski                     ::rtl::OUString::createFromAscii( "DataSourceLabelsInFirstColumn" ),
315*b1cdbd2cSJim Jagielski                     aAny );
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski                 aAny <<= (sal_Bool)(mrRowHasLabels);
318*b1cdbd2cSJim Jagielski                 xDocProp->setPropertyValue(
319*b1cdbd2cSJim Jagielski                     ::rtl::OUString::createFromAscii( "DataSourceLabelsInFirstRow" ),
320*b1cdbd2cSJim Jagielski                     aAny );
321*b1cdbd2cSJim Jagielski             }
322*b1cdbd2cSJim Jagielski             catch( beans::UnknownPropertyException & )
323*b1cdbd2cSJim Jagielski             {
324*b1cdbd2cSJim Jagielski                 DBG_ERRORFILE( "Properties missing" );
325*b1cdbd2cSJim Jagielski             }
326*b1cdbd2cSJim Jagielski         }
327*b1cdbd2cSJim Jagielski     }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 	// set properties
330*b1cdbd2cSJim Jagielski 	uno::Reference< beans::XPropertySet > xProp( mxDiagram, uno::UNO_QUERY );
331*b1cdbd2cSJim Jagielski 	if( msAutoStyleName.getLength())
332*b1cdbd2cSJim Jagielski 	{
333*b1cdbd2cSJim Jagielski 		if( xProp.is())
334*b1cdbd2cSJim Jagielski 		{
335*b1cdbd2cSJim Jagielski 			const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
336*b1cdbd2cSJim Jagielski 			if( pStylesCtxt )
337*b1cdbd2cSJim Jagielski 			{
338*b1cdbd2cSJim Jagielski 				const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
339*b1cdbd2cSJim Jagielski 					mrImportHelper.GetChartFamilyID(), msAutoStyleName );
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski                 XMLPropStyleContext* pPropStyleContext =
342*b1cdbd2cSJim Jagielski                     const_cast< XMLPropStyleContext * >(
343*b1cdbd2cSJim Jagielski                         dynamic_cast< const XMLPropStyleContext * >( pStyle ) );
344*b1cdbd2cSJim Jagielski 				if( pPropStyleContext )
345*b1cdbd2cSJim Jagielski                 {
346*b1cdbd2cSJim Jagielski                     pPropStyleContext->FillPropertySet( xProp );
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski                     // get the data row source that was set without having data
349*b1cdbd2cSJim Jagielski                     xProp->getPropertyValue( ::rtl::OUString::createFromAscii("DataRowSource"))
350*b1cdbd2cSJim Jagielski                         >>= mrDataRowSource;
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski                     //lines on/off
353*b1cdbd2cSJim Jagielski                     //this old property is not supported fully anymore with the new chart, so we need to get the information a little bit different from similar properties
354*b1cdbd2cSJim Jagielski                     mrSeriesDefaultsAndStyles.maLinesOnProperty = SchXMLTools::getPropertyFromContext(
355*b1cdbd2cSJim Jagielski                         ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Lines")), pPropStyleContext, pStylesCtxt );
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski                     //handle automatic position and size
358*b1cdbd2cSJim Jagielski                     m_aOuterPositioning.readAutomaticPositioningProperties( pPropStyleContext, pStylesCtxt );
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski                     //correct default starting angle for old 3D pies
361*b1cdbd2cSJim Jagielski                     if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan3_0( GetImport().GetModel() ) )
362*b1cdbd2cSJim Jagielski                     {
363*b1cdbd2cSJim Jagielski                         bool bIs3d = false;
364*b1cdbd2cSJim Jagielski                         if( xProp.is() && ( xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Dim3D"))) >>= bIs3d ) &&
365*b1cdbd2cSJim Jagielski                             bIs3d )
366*b1cdbd2cSJim Jagielski                         {
367*b1cdbd2cSJim Jagielski                             if( maChartTypeServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.PieChartType" ))
368*b1cdbd2cSJim Jagielski                                 || maChartTypeServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.DonutChartType" )) )
369*b1cdbd2cSJim Jagielski                             {
370*b1cdbd2cSJim Jagielski                                 ::rtl::OUString aPropName( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StartingAngle")) );
371*b1cdbd2cSJim Jagielski                                 uno::Any aAStartingAngle( SchXMLTools::getPropertyFromContext( aPropName, pPropStyleContext, pStylesCtxt ) );
372*b1cdbd2cSJim Jagielski                                 if( !aAStartingAngle.hasValue() )
373*b1cdbd2cSJim Jagielski                                     xProp->setPropertyValue( aPropName, uno::makeAny(sal_Int32(0)) ) ;
374*b1cdbd2cSJim Jagielski                             }
375*b1cdbd2cSJim Jagielski                         }
376*b1cdbd2cSJim Jagielski                     }
377*b1cdbd2cSJim Jagielski                 }
378*b1cdbd2cSJim Jagielski 			}
379*b1cdbd2cSJim Jagielski 		}
380*b1cdbd2cSJim Jagielski 	}
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski     //remember default values for dataseries
383*b1cdbd2cSJim Jagielski     if(xProp.is())
384*b1cdbd2cSJim Jagielski     try
385*b1cdbd2cSJim Jagielski     {
386*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maSymbolTypeDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SymbolType")));
387*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maDataCaptionDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataCaption")));
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maErrorIndicatorDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ErrorIndicator")));
390*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maErrorCategoryDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ErrorCategory")));
391*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maConstantErrorLowDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ConstantErrorLow")));
392*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maConstantErrorHighDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ConstantErrorHigh")));
393*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maPercentageErrorDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PercentageError")));
394*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maErrorMarginDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ErrorMargin")));
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maMeanValueDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MeanValue")));
397*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maRegressionCurvesDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RegressionCurves")));
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski         bool bStacked = false;
400*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maStackedDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Stacked")));
401*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maStackedDefault >>= bStacked;
402*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maPercentDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Percent")));
403*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maPercentDefault >>= mbPercentStacked;
404*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maStackedBarsConnectedDefault = xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StackedBarsConnected")));
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski         // deep
407*b1cdbd2cSJim Jagielski         uno::Any aDeepProperty( xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Deep"))));
408*b1cdbd2cSJim Jagielski         // #124488# old versions store a 3d area and 3D line deep chart with Deep==false => workaround for this
409*b1cdbd2cSJim Jagielski         if( ! (bStacked || mbPercentStacked ))
410*b1cdbd2cSJim Jagielski         {
411*b1cdbd2cSJim Jagielski             if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( GetImport().GetModel() ) )
412*b1cdbd2cSJim Jagielski             {
413*b1cdbd2cSJim Jagielski                 bool bIs3d = false;
414*b1cdbd2cSJim Jagielski                 if( ( xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Dim3D"))) >>= bIs3d ) &&
415*b1cdbd2cSJim Jagielski                     bIs3d )
416*b1cdbd2cSJim Jagielski                 {
417*b1cdbd2cSJim Jagielski                     if( maChartTypeServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.AreaChartType" )) ||
418*b1cdbd2cSJim Jagielski                         maChartTypeServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.LineChartType" )) )
419*b1cdbd2cSJim Jagielski                     {
420*b1cdbd2cSJim Jagielski                         aDeepProperty <<= uno::makeAny( true );
421*b1cdbd2cSJim Jagielski                     }
422*b1cdbd2cSJim Jagielski                 }
423*b1cdbd2cSJim Jagielski             }
424*b1cdbd2cSJim Jagielski         }
425*b1cdbd2cSJim Jagielski         mrSeriesDefaultsAndStyles.maDeepDefault = aDeepProperty;
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski         xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberOfLines"))) >>= mnNumOfLinesProp;
428*b1cdbd2cSJim Jagielski         xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Volume"))) >>= mbStockHasVolume;
429*b1cdbd2cSJim Jagielski     }
430*b1cdbd2cSJim Jagielski     catch( uno::Exception & rEx )
431*b1cdbd2cSJim Jagielski     {
432*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
433*b1cdbd2cSJim Jagielski 		String aStr( rEx.Message );
434*b1cdbd2cSJim Jagielski 		ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
435*b1cdbd2cSJim Jagielski 		DBG_ERROR1( "PlotAreaContext:EndElement(): Exception caught: %s", aBStr.GetBuffer());
436*b1cdbd2cSJim Jagielski #else
437*b1cdbd2cSJim Jagielski         (void)rEx; // avoid warning for pro build
438*b1cdbd2cSJim Jagielski #endif
439*b1cdbd2cSJim Jagielski     }
440*b1cdbd2cSJim Jagielski     //
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski     bool bCreateInternalDataProvider = false;
443*b1cdbd2cSJim Jagielski     if( m_rXLinkHRefAttributeToIndicateDataProvider.equalsAscii( "." ) ) //data comes from the chart itself
444*b1cdbd2cSJim Jagielski         bCreateInternalDataProvider = true;
445*b1cdbd2cSJim Jagielski     else if( m_rXLinkHRefAttributeToIndicateDataProvider.equalsAscii( ".." ) ) //data comes from the parent application
446*b1cdbd2cSJim Jagielski         bCreateInternalDataProvider = false;
447*b1cdbd2cSJim Jagielski     else if( m_rXLinkHRefAttributeToIndicateDataProvider.getLength() ) //not supported so far to get the data by sibling objects -> fall back to chart itself
448*b1cdbd2cSJim Jagielski         bCreateInternalDataProvider = true;
449*b1cdbd2cSJim Jagielski     else if( !m_rbHasRangeAtPlotArea )
450*b1cdbd2cSJim Jagielski         bCreateInternalDataProvider = true;
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski     if( bCreateInternalDataProvider && mxNewDoc.is() )
453*b1cdbd2cSJim Jagielski     {
454*b1cdbd2cSJim Jagielski         // we have no complete range => we have own data, so switch the data
455*b1cdbd2cSJim Jagielski         // provider to internal. Clone is not necessary, as we don't have any
456*b1cdbd2cSJim Jagielski         // data yet.
457*b1cdbd2cSJim Jagielski         mxNewDoc->createInternalDataProvider( false /* bCloneExistingData */ );
458*b1cdbd2cSJim Jagielski         if( xProp.is() && mrDataRowSource!=chart::ChartDataRowSource_COLUMNS )
459*b1cdbd2cSJim Jagielski             xProp->setPropertyValue( rtl::OUString::createFromAscii( "DataRowSource" ), uno::makeAny(mrDataRowSource) );
460*b1cdbd2cSJim Jagielski     }
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)463*b1cdbd2cSJim Jagielski SvXMLImportContext* SchXMLPlotAreaContext::CreateChildContext(
464*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix,
465*b1cdbd2cSJim Jagielski 	const rtl::OUString& rLocalName,
466*b1cdbd2cSJim Jagielski 	const uno::Reference< xml::sax::XAttributeList >& xAttrList )
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = 0;
469*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap& rTokenMap = mrImportHelper.GetPlotAreaElemTokenMap();
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski 	switch( rTokenMap.Get( nPrefix, rLocalName ))
472*b1cdbd2cSJim Jagielski 	{
473*b1cdbd2cSJim Jagielski         case XML_TOK_PA_COORDINATE_REGION_EXT:
474*b1cdbd2cSJim Jagielski         case XML_TOK_PA_COORDINATE_REGION:
475*b1cdbd2cSJim Jagielski         {
476*b1cdbd2cSJim Jagielski             pContext = new SchXMLCoordinateRegionContext( GetImport(), nPrefix, rLocalName, m_aInnerPositioning );
477*b1cdbd2cSJim Jagielski         }
478*b1cdbd2cSJim Jagielski         break;
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski 		case XML_TOK_PA_AXIS:
481*b1cdbd2cSJim Jagielski         {
482*b1cdbd2cSJim Jagielski             bool bAddMissingXAxisForNetCharts = false;
483*b1cdbd2cSJim Jagielski             bool bAdaptWrongPercentScaleValues = false;
484*b1cdbd2cSJim Jagielski             if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( GetImport().GetModel() ) )
485*b1cdbd2cSJim Jagielski             {
486*b1cdbd2cSJim Jagielski                 //correct errors from older versions
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski                 // for NetCharts there were no xAxis exported to older files
489*b1cdbd2cSJim Jagielski                 // so we need to add the x axis here for those old NetChart files
490*b1cdbd2cSJim Jagielski                 if( maChartTypeServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.NetChartType" )) )
491*b1cdbd2cSJim Jagielski                     bAddMissingXAxisForNetCharts = true;
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski                 //Issue 59288
494*b1cdbd2cSJim Jagielski                 if( mbPercentStacked )
495*b1cdbd2cSJim Jagielski                     bAdaptWrongPercentScaleValues = true;
496*b1cdbd2cSJim Jagielski             }
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski             bool bAdaptXAxisOrientationForOld2DBarCharts = false;
499*b1cdbd2cSJim Jagielski             if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_4( GetImport().GetModel() ) )
500*b1cdbd2cSJim Jagielski             {
501*b1cdbd2cSJim Jagielski                 //issue74660
502*b1cdbd2cSJim Jagielski                 if( maChartTypeServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.ColumnChartType" )) )
503*b1cdbd2cSJim Jagielski                     bAdaptXAxisOrientationForOld2DBarCharts = true;
504*b1cdbd2cSJim Jagielski             }
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski 			pContext = new SchXMLAxisContext( mrImportHelper, GetImport(), rLocalName, mxDiagram, maAxes, mrCategoriesAddress,
507*b1cdbd2cSJim Jagielski                                               bAddMissingXAxisForNetCharts, bAdaptWrongPercentScaleValues, bAdaptXAxisOrientationForOld2DBarCharts, m_bAxisPositionAttributeImported );
508*b1cdbd2cSJim Jagielski         }
509*b1cdbd2cSJim Jagielski         break;
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski 		case XML_TOK_PA_SERIES:
512*b1cdbd2cSJim Jagielski 			{
513*b1cdbd2cSJim Jagielski                 if( mxNewDoc.is())
514*b1cdbd2cSJim Jagielski                 {
515*b1cdbd2cSJim Jagielski                     pContext = new SchXMLSeries2Context(
516*b1cdbd2cSJim Jagielski                         mrImportHelper, GetImport(), rLocalName,
517*b1cdbd2cSJim Jagielski                         mxNewDoc, maAxes,
518*b1cdbd2cSJim Jagielski                         mrSeriesDefaultsAndStyles.maSeriesStyleList,
519*b1cdbd2cSJim Jagielski                         mnSeries,
520*b1cdbd2cSJim Jagielski                         mbStockHasVolume,
521*b1cdbd2cSJim Jagielski                         m_aGlobalSeriesImportInfo,
522*b1cdbd2cSJim Jagielski                         maChartTypeServiceName,
523*b1cdbd2cSJim Jagielski                         mrLSequencesPerIndex,
524*b1cdbd2cSJim Jagielski                         mbGlobalChartTypeUsedBySeries, maChartSize );
525*b1cdbd2cSJim Jagielski                 }
526*b1cdbd2cSJim Jagielski 				mnSeries++;
527*b1cdbd2cSJim Jagielski 			}
528*b1cdbd2cSJim Jagielski 			break;
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski 		case XML_TOK_PA_WALL:
531*b1cdbd2cSJim Jagielski 			pContext = new SchXMLWallFloorContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
532*b1cdbd2cSJim Jagielski 												   SchXMLWallFloorContext::CONTEXT_TYPE_WALL );
533*b1cdbd2cSJim Jagielski 			break;
534*b1cdbd2cSJim Jagielski 		case XML_TOK_PA_FLOOR:
535*b1cdbd2cSJim Jagielski 			pContext = new SchXMLWallFloorContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
536*b1cdbd2cSJim Jagielski 												   SchXMLWallFloorContext::CONTEXT_TYPE_FLOOR );
537*b1cdbd2cSJim Jagielski 			break;
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 		case XML_TOK_PA_LIGHT_SOURCE:
540*b1cdbd2cSJim Jagielski 			pContext = maSceneImportHelper.create3DLightContext( nPrefix, rLocalName, xAttrList );
541*b1cdbd2cSJim Jagielski 			break;
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski         // elements for stock charts
544*b1cdbd2cSJim Jagielski         case XML_TOK_PA_STOCK_GAIN:
545*b1cdbd2cSJim Jagielski             pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
546*b1cdbd2cSJim Jagielski                                                SchXMLStockContext::CONTEXT_TYPE_GAIN );
547*b1cdbd2cSJim Jagielski             break;
548*b1cdbd2cSJim Jagielski         case XML_TOK_PA_STOCK_LOSS:
549*b1cdbd2cSJim Jagielski             pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
550*b1cdbd2cSJim Jagielski                                                SchXMLStockContext::CONTEXT_TYPE_LOSS );
551*b1cdbd2cSJim Jagielski             break;
552*b1cdbd2cSJim Jagielski         case XML_TOK_PA_STOCK_RANGE:
553*b1cdbd2cSJim Jagielski             pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
554*b1cdbd2cSJim Jagielski                                                SchXMLStockContext::CONTEXT_TYPE_RANGE );
555*b1cdbd2cSJim Jagielski             break;
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski 		default:
558*b1cdbd2cSJim Jagielski 			pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
559*b1cdbd2cSJim Jagielski 	}
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 	return pContext;
562*b1cdbd2cSJim Jagielski }
563*b1cdbd2cSJim Jagielski 
EndElement()564*b1cdbd2cSJim Jagielski void SchXMLPlotAreaContext::EndElement()
565*b1cdbd2cSJim Jagielski {
566*b1cdbd2cSJim Jagielski     // set categories
567*b1cdbd2cSJim Jagielski     if( mrCategoriesAddress.getLength() && mxNewDoc.is())
568*b1cdbd2cSJim Jagielski     {
569*b1cdbd2cSJim Jagielski         uno::Reference< chart2::data::XDataProvider > xDataProvider(
570*b1cdbd2cSJim Jagielski             mxNewDoc->getDataProvider()  );
571*b1cdbd2cSJim Jagielski         // @todo: correct coordinate system index
572*b1cdbd2cSJim Jagielski         sal_Int32 nDimension( 0 );
573*b1cdbd2cSJim Jagielski         ::std::vector< SchXMLAxis >::const_iterator aIt(
574*b1cdbd2cSJim Jagielski             ::std::find_if( maAxes.begin(), maAxes.end(), lcl_AxisHasCategories()));
575*b1cdbd2cSJim Jagielski         if( aIt != maAxes.end())
576*b1cdbd2cSJim Jagielski             nDimension = static_cast< sal_Int32 >( (*aIt).eDimension );
577*b1cdbd2cSJim Jagielski         SchXMLTools::CreateCategories(
578*b1cdbd2cSJim Jagielski             xDataProvider, mxNewDoc, mrCategoriesAddress,
579*b1cdbd2cSJim Jagielski             0 /* nCooSysIndex */,
580*b1cdbd2cSJim Jagielski             nDimension, &mrLSequencesPerIndex );
581*b1cdbd2cSJim Jagielski     }
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski     uno::Reference< beans::XPropertySet > xDiaProp( mxDiagram, uno::UNO_QUERY );
584*b1cdbd2cSJim Jagielski     if( xDiaProp.is())
585*b1cdbd2cSJim Jagielski     {
586*b1cdbd2cSJim Jagielski         sal_Bool bIsThreeDim = sal_False;
587*b1cdbd2cSJim Jagielski         uno::Any aAny = xDiaProp->getPropertyValue( ::rtl::OUString::createFromAscii( "Dim3D" ));
588*b1cdbd2cSJim Jagielski         aAny >>= bIsThreeDim;
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski         // set 3d scene attributes
591*b1cdbd2cSJim Jagielski         if( bIsThreeDim )
592*b1cdbd2cSJim Jagielski         {
593*b1cdbd2cSJim Jagielski             // set scene attributes at diagram
594*b1cdbd2cSJim Jagielski             maSceneImportHelper.setSceneAttributes( xDiaProp );
595*b1cdbd2cSJim Jagielski         }
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski         // set correct number of lines at series
598*b1cdbd2cSJim Jagielski         if( ! m_aGlobalSeriesImportInfo.rbAllRangeAddressesAvailable &&
599*b1cdbd2cSJim Jagielski             mnNumOfLinesProp > 0 &&
600*b1cdbd2cSJim Jagielski             maChartTypeServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.ColumnChartType" )))
601*b1cdbd2cSJim Jagielski         {
602*b1cdbd2cSJim Jagielski             try
603*b1cdbd2cSJim Jagielski             {
604*b1cdbd2cSJim Jagielski                 xDiaProp->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "NumberOfLines" )),
605*b1cdbd2cSJim Jagielski                                             uno::makeAny( mnNumOfLinesProp ));
606*b1cdbd2cSJim Jagielski             }
607*b1cdbd2cSJim Jagielski             catch( uno::Exception & rEx )
608*b1cdbd2cSJim Jagielski             {
609*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
610*b1cdbd2cSJim Jagielski                 String aStr( rEx.Message );
611*b1cdbd2cSJim Jagielski                 ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
612*b1cdbd2cSJim Jagielski                 DBG_ERROR1( "Exception caught for property NumberOfLines: %s", aBStr.GetBuffer());
613*b1cdbd2cSJim Jagielski #else
614*b1cdbd2cSJim Jagielski                 (void)rEx; // avoid warning for pro build
615*b1cdbd2cSJim Jagielski #endif
616*b1cdbd2cSJim Jagielski             }
617*b1cdbd2cSJim Jagielski         }
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski         // #i32366# stock has volume
620*b1cdbd2cSJim Jagielski         if( ( 0 == mxDiagram->getDiagramType().reverseCompareToAsciiL(
621*b1cdbd2cSJim Jagielski                   RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart.StockDiagram" ))) &&
622*b1cdbd2cSJim Jagielski             mbStockHasVolume )
623*b1cdbd2cSJim Jagielski         {
624*b1cdbd2cSJim Jagielski             try
625*b1cdbd2cSJim Jagielski             {
626*b1cdbd2cSJim Jagielski                 xDiaProp->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Volume" )),
627*b1cdbd2cSJim Jagielski                                             uno::makeAny( true ));
628*b1cdbd2cSJim Jagielski             }
629*b1cdbd2cSJim Jagielski             catch( uno::Exception & rEx )
630*b1cdbd2cSJim Jagielski             {
631*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
632*b1cdbd2cSJim Jagielski                 String aStr( rEx.Message );
633*b1cdbd2cSJim Jagielski                 ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US );
634*b1cdbd2cSJim Jagielski                 DBG_ERROR1( "Exception caught for property Volume: %s", aBStr.GetBuffer());
635*b1cdbd2cSJim Jagielski #else
636*b1cdbd2cSJim Jagielski                 (void)rEx; // avoid warning for pro build
637*b1cdbd2cSJim Jagielski #endif
638*b1cdbd2cSJim Jagielski             }
639*b1cdbd2cSJim Jagielski         }
640*b1cdbd2cSJim Jagielski     }
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 	// set changed size and position after properties (esp. 3d)
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski     uno::Reference< chart::XDiagramPositioning > xDiaPos( mxDiagram, uno::UNO_QUERY );
645*b1cdbd2cSJim Jagielski 	if( xDiaPos.is())
646*b1cdbd2cSJim Jagielski 	{
647*b1cdbd2cSJim Jagielski         if( !m_aOuterPositioning.isAutomatic() )
648*b1cdbd2cSJim Jagielski         {
649*b1cdbd2cSJim Jagielski             if( m_aInnerPositioning.hasPosSize() )
650*b1cdbd2cSJim Jagielski                 xDiaPos->setDiagramPositionExcludingAxes( m_aInnerPositioning.getRectangle() );
651*b1cdbd2cSJim Jagielski             else if( m_aOuterPositioning.hasPosSize() )
652*b1cdbd2cSJim Jagielski             {
653*b1cdbd2cSJim Jagielski                 if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan3_3( GetImport().GetModel() ) ) //old version of OOo did write a wrong rectangle for the diagram size
654*b1cdbd2cSJim Jagielski 		            xDiaPos->setDiagramPositionIncludingAxesAndAxisTitles( m_aOuterPositioning.getRectangle() );
655*b1cdbd2cSJim Jagielski                 else
656*b1cdbd2cSJim Jagielski                     xDiaPos->setDiagramPositionIncludingAxes( m_aOuterPositioning.getRectangle() );
657*b1cdbd2cSJim Jagielski             }
658*b1cdbd2cSJim Jagielski         }
659*b1cdbd2cSJim Jagielski 	}
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski     SchXMLAxisContext::CorrectAxisPositions( uno::Reference< chart2::XChartDocument >( mrImportHelper.GetChartDocument(), uno::UNO_QUERY ), maChartTypeServiceName, GetImport().GetODFVersion(), m_bAxisPositionAttributeImported );
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski // ========================================
665*b1cdbd2cSJim Jagielski 
SchXMLDataPointContext(SchXMLImportHelper & rImpHelper,SvXMLImport & rImport,const rtl::OUString & rLocalName,::std::list<DataRowPointStyle> & rStyleList,const::com::sun::star::uno::Reference<::com::sun::star::chart2::XDataSeries> & xSeries,sal_Int32 & rIndex,bool bSymbolSizeForSeriesIsMissingInFile)666*b1cdbd2cSJim Jagielski SchXMLDataPointContext::SchXMLDataPointContext(  SchXMLImportHelper& rImpHelper,
667*b1cdbd2cSJim Jagielski 												 SvXMLImport& rImport, const rtl::OUString& rLocalName,
668*b1cdbd2cSJim Jagielski 												 ::std::list< DataRowPointStyle >& rStyleList,
669*b1cdbd2cSJim Jagielski 												 const ::com::sun::star::uno::Reference<
670*b1cdbd2cSJim Jagielski                                                     ::com::sun::star::chart2::XDataSeries >& xSeries,
671*b1cdbd2cSJim Jagielski                                                  sal_Int32& rIndex,
672*b1cdbd2cSJim Jagielski                                                  bool bSymbolSizeForSeriesIsMissingInFile ) :
673*b1cdbd2cSJim Jagielski 		SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
674*b1cdbd2cSJim Jagielski 		mrImportHelper( rImpHelper ),
675*b1cdbd2cSJim Jagielski 		mrStyleList( rStyleList ),
676*b1cdbd2cSJim Jagielski         m_xSeries( xSeries ),
677*b1cdbd2cSJim Jagielski 		mrIndex( rIndex ),
678*b1cdbd2cSJim Jagielski         mbSymbolSizeForSeriesIsMissingInFile( bSymbolSizeForSeriesIsMissingInFile )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski }
681*b1cdbd2cSJim Jagielski 
~SchXMLDataPointContext()682*b1cdbd2cSJim Jagielski SchXMLDataPointContext::~SchXMLDataPointContext()
683*b1cdbd2cSJim Jagielski {
684*b1cdbd2cSJim Jagielski }
685*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)686*b1cdbd2cSJim Jagielski void SchXMLDataPointContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
689*b1cdbd2cSJim Jagielski 	::rtl::OUString aValue;
690*b1cdbd2cSJim Jagielski 	::rtl::OUString sAutoStyleName;
691*b1cdbd2cSJim Jagielski 	sal_Int32 nRepeat = 1;
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski 	for( sal_Int16 i = 0; i < nAttrCount; i++ )
694*b1cdbd2cSJim Jagielski 	{
695*b1cdbd2cSJim Jagielski 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
696*b1cdbd2cSJim Jagielski 		rtl::OUString aLocalName;
697*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski 		if( nPrefix == XML_NAMESPACE_CHART )
700*b1cdbd2cSJim Jagielski 		{
701*b1cdbd2cSJim Jagielski 			if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
702*b1cdbd2cSJim Jagielski 				sAutoStyleName = xAttrList->getValueByIndex( i );
703*b1cdbd2cSJim Jagielski 			else if( IsXMLToken( aLocalName, XML_REPEATED ) )
704*b1cdbd2cSJim Jagielski 				nRepeat = xAttrList->getValueByIndex( i ).toInt32();
705*b1cdbd2cSJim Jagielski 		}
706*b1cdbd2cSJim Jagielski 	}
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski 	if( sAutoStyleName.getLength())
709*b1cdbd2cSJim Jagielski 	{
710*b1cdbd2cSJim Jagielski 		DataRowPointStyle aStyle(
711*b1cdbd2cSJim Jagielski             DataRowPointStyle::DATA_POINT,
712*b1cdbd2cSJim Jagielski             m_xSeries, mrIndex, nRepeat, sAutoStyleName );
713*b1cdbd2cSJim Jagielski         aStyle.mbSymbolSizeForSeriesIsMissingInFile = mbSymbolSizeForSeriesIsMissingInFile;
714*b1cdbd2cSJim Jagielski 		mrStyleList.push_back( aStyle );
715*b1cdbd2cSJim Jagielski 	}
716*b1cdbd2cSJim Jagielski 	mrIndex += nRepeat;
717*b1cdbd2cSJim Jagielski }
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski // ========================================
720*b1cdbd2cSJim Jagielski 
SchXMLPositonAttributesHelper(SvXMLImport & rImporter)721*b1cdbd2cSJim Jagielski SchXMLPositonAttributesHelper::SchXMLPositonAttributesHelper( SvXMLImport& rImporter )
722*b1cdbd2cSJim Jagielski     : m_rImport( rImporter )
723*b1cdbd2cSJim Jagielski     , m_aPosition(0,0)
724*b1cdbd2cSJim Jagielski     , m_aSize(0,0)
725*b1cdbd2cSJim Jagielski     , m_bHasSizeWidth( false )
726*b1cdbd2cSJim Jagielski     , m_bHasSizeHeight( false )
727*b1cdbd2cSJim Jagielski     , m_bHasPositionX( false )
728*b1cdbd2cSJim Jagielski     , m_bHasPositionY( false )
729*b1cdbd2cSJim Jagielski     , m_bAutoSize( false )
730*b1cdbd2cSJim Jagielski     , m_bAutoPosition( false )
731*b1cdbd2cSJim Jagielski {
732*b1cdbd2cSJim Jagielski }
733*b1cdbd2cSJim Jagielski 
~SchXMLPositonAttributesHelper()734*b1cdbd2cSJim Jagielski SchXMLPositonAttributesHelper::~SchXMLPositonAttributesHelper()
735*b1cdbd2cSJim Jagielski {
736*b1cdbd2cSJim Jagielski }
737*b1cdbd2cSJim Jagielski 
hasSize() const738*b1cdbd2cSJim Jagielski bool SchXMLPositonAttributesHelper::hasSize() const
739*b1cdbd2cSJim Jagielski {
740*b1cdbd2cSJim Jagielski     return m_bHasSizeWidth && m_bHasSizeHeight;
741*b1cdbd2cSJim Jagielski }
hasPosition() const742*b1cdbd2cSJim Jagielski bool SchXMLPositonAttributesHelper::hasPosition() const
743*b1cdbd2cSJim Jagielski {
744*b1cdbd2cSJim Jagielski     return m_bHasPositionX && m_bHasPositionY;
745*b1cdbd2cSJim Jagielski }
hasPosSize() const746*b1cdbd2cSJim Jagielski bool SchXMLPositonAttributesHelper::hasPosSize() const
747*b1cdbd2cSJim Jagielski {
748*b1cdbd2cSJim Jagielski     return hasPosition() && hasSize();
749*b1cdbd2cSJim Jagielski }
isAutomatic() const750*b1cdbd2cSJim Jagielski bool SchXMLPositonAttributesHelper::isAutomatic() const
751*b1cdbd2cSJim Jagielski {
752*b1cdbd2cSJim Jagielski     return m_bAutoSize || m_bAutoPosition;
753*b1cdbd2cSJim Jagielski }
getPosition() const754*b1cdbd2cSJim Jagielski awt::Point SchXMLPositonAttributesHelper::getPosition() const
755*b1cdbd2cSJim Jagielski {
756*b1cdbd2cSJim Jagielski     return m_aPosition;
757*b1cdbd2cSJim Jagielski }
getSize() const758*b1cdbd2cSJim Jagielski awt::Size SchXMLPositonAttributesHelper::getSize() const
759*b1cdbd2cSJim Jagielski {
760*b1cdbd2cSJim Jagielski     return m_aSize;
761*b1cdbd2cSJim Jagielski }
getRectangle() const762*b1cdbd2cSJim Jagielski awt::Rectangle SchXMLPositonAttributesHelper::getRectangle() const
763*b1cdbd2cSJim Jagielski {
764*b1cdbd2cSJim Jagielski     return awt::Rectangle( m_aPosition.X, m_aPosition.Y, m_aSize.Width, m_aSize.Height );
765*b1cdbd2cSJim Jagielski }
766*b1cdbd2cSJim Jagielski 
readPositioningAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)767*b1cdbd2cSJim Jagielski bool SchXMLPositonAttributesHelper::readPositioningAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
768*b1cdbd2cSJim Jagielski {
769*b1cdbd2cSJim Jagielski     //returns true if the attribute was proccessed
770*b1cdbd2cSJim Jagielski     bool bReturn = true;
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski     if( XML_NAMESPACE_SVG == nPrefix )
773*b1cdbd2cSJim Jagielski     {
774*b1cdbd2cSJim Jagielski         if( IsXMLToken( rLocalName, XML_X ) )
775*b1cdbd2cSJim Jagielski         {
776*b1cdbd2cSJim Jagielski 			m_rImport.GetMM100UnitConverter().convertMeasure( m_aPosition.X, rValue );
777*b1cdbd2cSJim Jagielski             m_bHasPositionX = true;
778*b1cdbd2cSJim Jagielski         }
779*b1cdbd2cSJim Jagielski         else if( IsXMLToken( rLocalName, XML_Y ) )
780*b1cdbd2cSJim Jagielski         {
781*b1cdbd2cSJim Jagielski 			m_rImport.GetMM100UnitConverter().convertMeasure( m_aPosition.Y, rValue );
782*b1cdbd2cSJim Jagielski             m_bHasPositionY = true;
783*b1cdbd2cSJim Jagielski         }
784*b1cdbd2cSJim Jagielski         else if( IsXMLToken( rLocalName, XML_WIDTH ) )
785*b1cdbd2cSJim Jagielski         {
786*b1cdbd2cSJim Jagielski 			m_rImport.GetMM100UnitConverter().convertMeasure( m_aSize.Width, rValue );
787*b1cdbd2cSJim Jagielski             m_bHasSizeWidth = true;
788*b1cdbd2cSJim Jagielski         }
789*b1cdbd2cSJim Jagielski 		else if( IsXMLToken( rLocalName, XML_HEIGHT ) )
790*b1cdbd2cSJim Jagielski         {
791*b1cdbd2cSJim Jagielski 			m_rImport.GetMM100UnitConverter().convertMeasure( m_aSize.Height, rValue );
792*b1cdbd2cSJim Jagielski             m_bHasSizeHeight = true;
793*b1cdbd2cSJim Jagielski         }
794*b1cdbd2cSJim Jagielski         else
795*b1cdbd2cSJim Jagielski             bReturn = false;
796*b1cdbd2cSJim Jagielski 	}
797*b1cdbd2cSJim Jagielski     else
798*b1cdbd2cSJim Jagielski         bReturn = false;
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski     return bReturn;
801*b1cdbd2cSJim Jagielski }
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski 
readAutomaticPositioningProperties(XMLPropStyleContext * pPropStyleContext,const SvXMLStylesContext * pStylesCtxt)804*b1cdbd2cSJim Jagielski void SchXMLPositonAttributesHelper::readAutomaticPositioningProperties( XMLPropStyleContext* pPropStyleContext, const SvXMLStylesContext* pStylesCtxt )
805*b1cdbd2cSJim Jagielski {
806*b1cdbd2cSJim Jagielski     if( pPropStyleContext && pStylesCtxt )
807*b1cdbd2cSJim Jagielski     {
808*b1cdbd2cSJim Jagielski         //handle automatic position and size
809*b1cdbd2cSJim Jagielski         SchXMLTools::getPropertyFromContext(
810*b1cdbd2cSJim Jagielski             ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AutomaticSize")), pPropStyleContext, pStylesCtxt ) >>= m_bAutoSize;
811*b1cdbd2cSJim Jagielski         SchXMLTools::getPropertyFromContext(
812*b1cdbd2cSJim Jagielski             ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AutomaticPosition")), pPropStyleContext, pStylesCtxt ) >>= m_bAutoPosition;
813*b1cdbd2cSJim Jagielski     }
814*b1cdbd2cSJim Jagielski }
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski // ========================================
817*b1cdbd2cSJim Jagielski 
SchXMLCoordinateRegionContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const rtl::OUString & rLocalName,SchXMLPositonAttributesHelper & rPositioning)818*b1cdbd2cSJim Jagielski SchXMLCoordinateRegionContext::SchXMLCoordinateRegionContext(
819*b1cdbd2cSJim Jagielski 	      SvXMLImport& rImport
820*b1cdbd2cSJim Jagielski         , sal_uInt16 nPrefix
821*b1cdbd2cSJim Jagielski         , const rtl::OUString& rLocalName
822*b1cdbd2cSJim Jagielski         , SchXMLPositonAttributesHelper& rPositioning )
823*b1cdbd2cSJim Jagielski         : SvXMLImportContext( rImport, nPrefix, rLocalName )
824*b1cdbd2cSJim Jagielski         , m_rPositioning( rPositioning )
825*b1cdbd2cSJim Jagielski {
826*b1cdbd2cSJim Jagielski }
827*b1cdbd2cSJim Jagielski 
~SchXMLCoordinateRegionContext()828*b1cdbd2cSJim Jagielski SchXMLCoordinateRegionContext::~SchXMLCoordinateRegionContext()
829*b1cdbd2cSJim Jagielski {
830*b1cdbd2cSJim Jagielski }
831*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)832*b1cdbd2cSJim Jagielski void SchXMLCoordinateRegionContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
833*b1cdbd2cSJim Jagielski {
834*b1cdbd2cSJim Jagielski 	// parse attributes
835*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski 	for( sal_Int16 i = 0; i < nAttrCount; i++ )
838*b1cdbd2cSJim Jagielski 	{
839*b1cdbd2cSJim Jagielski 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
840*b1cdbd2cSJim Jagielski 		rtl::OUString aLocalName;
841*b1cdbd2cSJim Jagielski 		rtl::OUString aValue = xAttrList->getValueByIndex( i );
842*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
843*b1cdbd2cSJim Jagielski         m_rPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
844*b1cdbd2cSJim Jagielski     }
845*b1cdbd2cSJim Jagielski }
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski // ========================================
848*b1cdbd2cSJim Jagielski 
SchXMLWallFloorContext(SchXMLImportHelper & rImpHelper,SvXMLImport & rImport,sal_uInt16 nPrefix,const rtl::OUString & rLocalName,uno::Reference<chart::XDiagram> & xDiagram,ContextType eContextType)849*b1cdbd2cSJim Jagielski SchXMLWallFloorContext::SchXMLWallFloorContext(
850*b1cdbd2cSJim Jagielski 	SchXMLImportHelper& rImpHelper,
851*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
852*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix,
853*b1cdbd2cSJim Jagielski 	const rtl::OUString& rLocalName,
854*b1cdbd2cSJim Jagielski 	uno::Reference< chart::XDiagram >& xDiagram,
855*b1cdbd2cSJim Jagielski 	ContextType eContextType ) :
856*b1cdbd2cSJim Jagielski 		SvXMLImportContext( rImport, nPrefix, rLocalName ),
857*b1cdbd2cSJim Jagielski 		mrImportHelper( rImpHelper ),
858*b1cdbd2cSJim Jagielski 		mxWallFloorSupplier( xDiagram, uno::UNO_QUERY ),
859*b1cdbd2cSJim Jagielski 		meContextType( eContextType )
860*b1cdbd2cSJim Jagielski {
861*b1cdbd2cSJim Jagielski }
862*b1cdbd2cSJim Jagielski 
~SchXMLWallFloorContext()863*b1cdbd2cSJim Jagielski SchXMLWallFloorContext::~SchXMLWallFloorContext()
864*b1cdbd2cSJim Jagielski {
865*b1cdbd2cSJim Jagielski }
866*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)867*b1cdbd2cSJim Jagielski void SchXMLWallFloorContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
868*b1cdbd2cSJim Jagielski {
869*b1cdbd2cSJim Jagielski 	if( mxWallFloorSupplier.is())
870*b1cdbd2cSJim Jagielski 	{
871*b1cdbd2cSJim Jagielski 		sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
872*b1cdbd2cSJim Jagielski 		rtl::OUString sAutoStyleName;
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski 		for( sal_Int16 i = 0; i < nAttrCount; i++ )
875*b1cdbd2cSJim Jagielski 		{
876*b1cdbd2cSJim Jagielski 			rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
877*b1cdbd2cSJim Jagielski 			rtl::OUString aLocalName;
878*b1cdbd2cSJim Jagielski 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski 			if( nPrefix == XML_NAMESPACE_CHART &&
881*b1cdbd2cSJim Jagielski 				IsXMLToken( aLocalName, XML_STYLE_NAME ) )
882*b1cdbd2cSJim Jagielski 			{
883*b1cdbd2cSJim Jagielski 				sAutoStyleName = xAttrList->getValueByIndex( i );
884*b1cdbd2cSJim Jagielski 			}
885*b1cdbd2cSJim Jagielski 		}
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski         // set properties
888*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xProp( ( meContextType == CONTEXT_TYPE_WALL )
889*b1cdbd2cSJim Jagielski                                                      ? mxWallFloorSupplier->getWall()
890*b1cdbd2cSJim Jagielski                                                      : mxWallFloorSupplier->getFloor(),
891*b1cdbd2cSJim Jagielski                                                      uno::UNO_QUERY );
892*b1cdbd2cSJim Jagielski         if( xProp.is())
893*b1cdbd2cSJim Jagielski         {
894*b1cdbd2cSJim Jagielski             if( sAutoStyleName.getLength())
895*b1cdbd2cSJim Jagielski             {
896*b1cdbd2cSJim Jagielski                 const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
897*b1cdbd2cSJim Jagielski                 if( pStylesCtxt )
898*b1cdbd2cSJim Jagielski                 {
899*b1cdbd2cSJim Jagielski                     const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
900*b1cdbd2cSJim Jagielski                         mrImportHelper.GetChartFamilyID(), sAutoStyleName );
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski                     if( pStyle && pStyle->ISA( XMLPropStyleContext ))
903*b1cdbd2cSJim Jagielski                         (( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
904*b1cdbd2cSJim Jagielski                 }
905*b1cdbd2cSJim Jagielski             }
906*b1cdbd2cSJim Jagielski 		}
907*b1cdbd2cSJim Jagielski 	}
908*b1cdbd2cSJim Jagielski }
909*b1cdbd2cSJim Jagielski 
910*b1cdbd2cSJim Jagielski // ========================================
911*b1cdbd2cSJim Jagielski 
SchXMLStockContext(SchXMLImportHelper & rImpHelper,SvXMLImport & rImport,sal_uInt16 nPrefix,const rtl::OUString & rLocalName,uno::Reference<chart::XDiagram> & xDiagram,ContextType eContextType)912*b1cdbd2cSJim Jagielski SchXMLStockContext::SchXMLStockContext(
913*b1cdbd2cSJim Jagielski 	SchXMLImportHelper& rImpHelper,
914*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
915*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix,
916*b1cdbd2cSJim Jagielski 	const rtl::OUString& rLocalName,
917*b1cdbd2cSJim Jagielski 	uno::Reference< chart::XDiagram >& xDiagram,
918*b1cdbd2cSJim Jagielski 	ContextType eContextType ) :
919*b1cdbd2cSJim Jagielski 		SvXMLImportContext( rImport, nPrefix, rLocalName ),
920*b1cdbd2cSJim Jagielski 		mrImportHelper( rImpHelper ),
921*b1cdbd2cSJim Jagielski 		mxStockPropProvider( xDiagram, uno::UNO_QUERY ),
922*b1cdbd2cSJim Jagielski 		meContextType( eContextType )
923*b1cdbd2cSJim Jagielski {
924*b1cdbd2cSJim Jagielski }
925*b1cdbd2cSJim Jagielski 
~SchXMLStockContext()926*b1cdbd2cSJim Jagielski SchXMLStockContext::~SchXMLStockContext()
927*b1cdbd2cSJim Jagielski {
928*b1cdbd2cSJim Jagielski }
929*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)930*b1cdbd2cSJim Jagielski void SchXMLStockContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
931*b1cdbd2cSJim Jagielski {
932*b1cdbd2cSJim Jagielski 	if( mxStockPropProvider.is())
933*b1cdbd2cSJim Jagielski 	{
934*b1cdbd2cSJim Jagielski 		sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
935*b1cdbd2cSJim Jagielski 		rtl::OUString sAutoStyleName;
936*b1cdbd2cSJim Jagielski 
937*b1cdbd2cSJim Jagielski 		for( sal_Int16 i = 0; i < nAttrCount; i++ )
938*b1cdbd2cSJim Jagielski 		{
939*b1cdbd2cSJim Jagielski 			rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
940*b1cdbd2cSJim Jagielski 			rtl::OUString aLocalName;
941*b1cdbd2cSJim Jagielski 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski 			if( nPrefix == XML_NAMESPACE_CHART &&
944*b1cdbd2cSJim Jagielski 				IsXMLToken( aLocalName, XML_STYLE_NAME ) )
945*b1cdbd2cSJim Jagielski 			{
946*b1cdbd2cSJim Jagielski 				sAutoStyleName = xAttrList->getValueByIndex( i );
947*b1cdbd2cSJim Jagielski 			}
948*b1cdbd2cSJim Jagielski 		}
949*b1cdbd2cSJim Jagielski 
950*b1cdbd2cSJim Jagielski 		if( sAutoStyleName.getLength())
951*b1cdbd2cSJim Jagielski 		{
952*b1cdbd2cSJim Jagielski 			// set properties
953*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProp;
954*b1cdbd2cSJim Jagielski             switch( meContextType )
955*b1cdbd2cSJim Jagielski             {
956*b1cdbd2cSJim Jagielski                 case CONTEXT_TYPE_GAIN:
957*b1cdbd2cSJim Jagielski                     xProp = mxStockPropProvider->getUpBar();
958*b1cdbd2cSJim Jagielski                     break;
959*b1cdbd2cSJim Jagielski                 case CONTEXT_TYPE_LOSS:
960*b1cdbd2cSJim Jagielski                     xProp = mxStockPropProvider->getDownBar();
961*b1cdbd2cSJim Jagielski                     break;
962*b1cdbd2cSJim Jagielski                 case CONTEXT_TYPE_RANGE:
963*b1cdbd2cSJim Jagielski                     xProp = mxStockPropProvider->getMinMaxLine();
964*b1cdbd2cSJim Jagielski                     break;
965*b1cdbd2cSJim Jagielski             }
966*b1cdbd2cSJim Jagielski 			if( xProp.is())
967*b1cdbd2cSJim Jagielski 			{
968*b1cdbd2cSJim Jagielski 				const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
969*b1cdbd2cSJim Jagielski 				if( pStylesCtxt )
970*b1cdbd2cSJim Jagielski 				{
971*b1cdbd2cSJim Jagielski 					const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
972*b1cdbd2cSJim Jagielski 						mrImportHelper.GetChartFamilyID(), sAutoStyleName );
973*b1cdbd2cSJim Jagielski 
974*b1cdbd2cSJim Jagielski 					if( pStyle && pStyle->ISA( XMLPropStyleContext ))
975*b1cdbd2cSJim Jagielski 						(( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
976*b1cdbd2cSJim Jagielski 				}
977*b1cdbd2cSJim Jagielski 			}
978*b1cdbd2cSJim Jagielski 		}
979*b1cdbd2cSJim Jagielski 	}
980*b1cdbd2cSJim Jagielski }
981*b1cdbd2cSJim Jagielski 
982*b1cdbd2cSJim Jagielski // ========================================
983*b1cdbd2cSJim Jagielski 
SchXMLStatisticsObjectContext(SchXMLImportHelper & rImpHelper,SvXMLImport & rImport,sal_uInt16 nPrefix,const rtl::OUString & rLocalName,::std::list<DataRowPointStyle> & rStyleList,const::com::sun::star::uno::Reference<::com::sun::star::chart2::XDataSeries> & xSeries,ContextType eContextType,const awt::Size & rChartSize)984*b1cdbd2cSJim Jagielski SchXMLStatisticsObjectContext::SchXMLStatisticsObjectContext(
985*b1cdbd2cSJim Jagielski 
986*b1cdbd2cSJim Jagielski 	SchXMLImportHelper& rImpHelper,
987*b1cdbd2cSJim Jagielski 	SvXMLImport& rImport,
988*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix,
989*b1cdbd2cSJim Jagielski 	const rtl::OUString& rLocalName,
990*b1cdbd2cSJim Jagielski     ::std::list< DataRowPointStyle >& rStyleList,
991*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Reference<
992*b1cdbd2cSJim Jagielski                 ::com::sun::star::chart2::XDataSeries >& xSeries,
993*b1cdbd2cSJim Jagielski     ContextType eContextType,
994*b1cdbd2cSJim Jagielski     const awt::Size & rChartSize ) :
995*b1cdbd2cSJim Jagielski 
996*b1cdbd2cSJim Jagielski 		SvXMLImportContext( rImport, nPrefix, rLocalName ),
997*b1cdbd2cSJim Jagielski 		mrImportHelper( rImpHelper ),
998*b1cdbd2cSJim Jagielski         mrStyleList( rStyleList ),
999*b1cdbd2cSJim Jagielski         m_xSeries( xSeries ),
1000*b1cdbd2cSJim Jagielski 		meContextType( eContextType ),
1001*b1cdbd2cSJim Jagielski         maChartSize( rChartSize )
1002*b1cdbd2cSJim Jagielski {}
1003*b1cdbd2cSJim Jagielski 
~SchXMLStatisticsObjectContext()1004*b1cdbd2cSJim Jagielski SchXMLStatisticsObjectContext::~SchXMLStatisticsObjectContext()
1005*b1cdbd2cSJim Jagielski {
1006*b1cdbd2cSJim Jagielski }
1007*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1008*b1cdbd2cSJim Jagielski void SchXMLStatisticsObjectContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1009*b1cdbd2cSJim Jagielski {
1010*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
1011*b1cdbd2cSJim Jagielski 	::rtl::OUString aValue;
1012*b1cdbd2cSJim Jagielski 	::rtl::OUString sAutoStyleName;
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski 	for( sal_Int16 i = 0; i < nAttrCount; i++ )
1015*b1cdbd2cSJim Jagielski 	{
1016*b1cdbd2cSJim Jagielski 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
1017*b1cdbd2cSJim Jagielski 		rtl::OUString aLocalName;
1018*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski 		if( nPrefix == XML_NAMESPACE_CHART )
1021*b1cdbd2cSJim Jagielski 		{
1022*b1cdbd2cSJim Jagielski 			if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
1023*b1cdbd2cSJim Jagielski 				sAutoStyleName = xAttrList->getValueByIndex( i );
1024*b1cdbd2cSJim Jagielski 		}
1025*b1cdbd2cSJim Jagielski 	}
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski     // note: regression-curves must get a style-object even if there is no
1028*b1cdbd2cSJim Jagielski     // auto-style set, because they can contain an equation
1029*b1cdbd2cSJim Jagielski 	if( sAutoStyleName.getLength() || meContextType == CONTEXT_TYPE_REGRESSION_CURVE )
1030*b1cdbd2cSJim Jagielski 	{
1031*b1cdbd2cSJim Jagielski         DataRowPointStyle::StyleType eType = DataRowPointStyle::MEAN_VALUE;
1032*b1cdbd2cSJim Jagielski         switch( meContextType )
1033*b1cdbd2cSJim Jagielski         {
1034*b1cdbd2cSJim Jagielski             case CONTEXT_TYPE_MEAN_VALUE_LINE:
1035*b1cdbd2cSJim Jagielski                 eType = DataRowPointStyle::MEAN_VALUE;
1036*b1cdbd2cSJim Jagielski                 break;
1037*b1cdbd2cSJim Jagielski             case CONTEXT_TYPE_REGRESSION_CURVE:
1038*b1cdbd2cSJim Jagielski                 eType = DataRowPointStyle::REGRESSION;
1039*b1cdbd2cSJim Jagielski                 break;
1040*b1cdbd2cSJim Jagielski             case CONTEXT_TYPE_ERROR_INDICATOR:
1041*b1cdbd2cSJim Jagielski                 eType = DataRowPointStyle::ERROR_INDICATOR;
1042*b1cdbd2cSJim Jagielski                 break;
1043*b1cdbd2cSJim Jagielski         }
1044*b1cdbd2cSJim Jagielski 		DataRowPointStyle aStyle(
1045*b1cdbd2cSJim Jagielski             eType, m_xSeries, -1, 1, sAutoStyleName );
1046*b1cdbd2cSJim Jagielski 		mrStyleList.push_back( aStyle );
1047*b1cdbd2cSJim Jagielski 	}
1048*b1cdbd2cSJim Jagielski }
1049*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)1050*b1cdbd2cSJim Jagielski SvXMLImportContext* SchXMLStatisticsObjectContext::CreateChildContext(
1051*b1cdbd2cSJim Jagielski 	sal_uInt16 nPrefix,
1052*b1cdbd2cSJim Jagielski 	const rtl::OUString& rLocalName,
1053*b1cdbd2cSJim Jagielski 	const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1054*b1cdbd2cSJim Jagielski {
1055*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = 0;
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski     if( nPrefix == XML_NAMESPACE_CHART &&
1058*b1cdbd2cSJim Jagielski 		IsXMLToken( rLocalName, XML_EQUATION ) )
1059*b1cdbd2cSJim Jagielski 	{
1060*b1cdbd2cSJim Jagielski         pContext = new SchXMLEquationContext(
1061*b1cdbd2cSJim Jagielski             mrImportHelper, GetImport(), nPrefix, rLocalName, m_xSeries, maChartSize, mrStyleList.back());
1062*b1cdbd2cSJim Jagielski 	}
1063*b1cdbd2cSJim Jagielski 	else
1064*b1cdbd2cSJim Jagielski 	{
1065*b1cdbd2cSJim Jagielski 		pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
1066*b1cdbd2cSJim Jagielski 	}
1067*b1cdbd2cSJim Jagielski 
1068*b1cdbd2cSJim Jagielski 	return pContext;
1069*b1cdbd2cSJim Jagielski }
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski // ========================================
1072*b1cdbd2cSJim Jagielski 
SchXMLEquationContext(SchXMLImportHelper & rImpHelper,SvXMLImport & rImport,sal_uInt16 nPrefix,const rtl::OUString & rLocalName,const::com::sun::star::uno::Reference<::com::sun::star::chart2::XDataSeries> & xSeries,const awt::Size & rChartSize,DataRowPointStyle & rRegressionStyle)1073*b1cdbd2cSJim Jagielski SchXMLEquationContext::SchXMLEquationContext(
1074*b1cdbd2cSJim Jagielski     SchXMLImportHelper& rImpHelper,
1075*b1cdbd2cSJim Jagielski     SvXMLImport& rImport,
1076*b1cdbd2cSJim Jagielski     sal_uInt16 nPrefix,
1077*b1cdbd2cSJim Jagielski     const rtl::OUString& rLocalName,
1078*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Reference<
1079*b1cdbd2cSJim Jagielski     ::com::sun::star::chart2::XDataSeries >& xSeries,
1080*b1cdbd2cSJim Jagielski     const awt::Size & rChartSize,
1081*b1cdbd2cSJim Jagielski     DataRowPointStyle & rRegressionStyle ) :
1082*b1cdbd2cSJim Jagielski         SvXMLImportContext( rImport, nPrefix, rLocalName ),
1083*b1cdbd2cSJim Jagielski         mrImportHelper( rImpHelper ),
1084*b1cdbd2cSJim Jagielski         mrRegressionStyle( rRegressionStyle ),
1085*b1cdbd2cSJim Jagielski         m_xSeries( xSeries ),
1086*b1cdbd2cSJim Jagielski         maChartSize( rChartSize )
1087*b1cdbd2cSJim Jagielski {}
1088*b1cdbd2cSJim Jagielski 
~SchXMLEquationContext()1089*b1cdbd2cSJim Jagielski SchXMLEquationContext::~SchXMLEquationContext()
1090*b1cdbd2cSJim Jagielski {}
1091*b1cdbd2cSJim Jagielski 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1092*b1cdbd2cSJim Jagielski void SchXMLEquationContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1093*b1cdbd2cSJim Jagielski {
1094*b1cdbd2cSJim Jagielski 	// parse attributes
1095*b1cdbd2cSJim Jagielski 	sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
1096*b1cdbd2cSJim Jagielski 	SchXMLImport& rImport = ( SchXMLImport& )GetImport();
1097*b1cdbd2cSJim Jagielski 	const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetRegEquationAttrTokenMap();
1098*b1cdbd2cSJim Jagielski     OUString sAutoStyleName;
1099*b1cdbd2cSJim Jagielski 
1100*b1cdbd2cSJim Jagielski     sal_Bool bShowEquation = sal_True;
1101*b1cdbd2cSJim Jagielski     sal_Bool bShowRSquare = sal_False;
1102*b1cdbd2cSJim Jagielski     awt::Point aPosition;
1103*b1cdbd2cSJim Jagielski     bool bHasXPos = false;
1104*b1cdbd2cSJim Jagielski     bool bHasYPos = false;
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski 	for( sal_Int16 i = 0; i < nAttrCount; i++ )
1107*b1cdbd2cSJim Jagielski 	{
1108*b1cdbd2cSJim Jagielski 		rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
1109*b1cdbd2cSJim Jagielski 		rtl::OUString aLocalName;
1110*b1cdbd2cSJim Jagielski 		rtl::OUString aValue = xAttrList->getValueByIndex( i );
1111*b1cdbd2cSJim Jagielski 		sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski 		switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
1114*b1cdbd2cSJim Jagielski 		{
1115*b1cdbd2cSJim Jagielski             case XML_TOK_REGEQ_POS_X:
1116*b1cdbd2cSJim Jagielski 				rImport.GetMM100UnitConverter().convertMeasure( aPosition.X, aValue );
1117*b1cdbd2cSJim Jagielski                 bHasXPos = true;
1118*b1cdbd2cSJim Jagielski                 break;
1119*b1cdbd2cSJim Jagielski             case XML_TOK_REGEQ_POS_Y:
1120*b1cdbd2cSJim Jagielski 				rImport.GetMM100UnitConverter().convertMeasure( aPosition.Y, aValue );
1121*b1cdbd2cSJim Jagielski                 bHasYPos = true;
1122*b1cdbd2cSJim Jagielski                 break;
1123*b1cdbd2cSJim Jagielski 			case XML_TOK_REGEQ_DISPLAY_EQUATION:
1124*b1cdbd2cSJim Jagielski 				rImport.GetMM100UnitConverter().convertBool( bShowEquation, aValue );
1125*b1cdbd2cSJim Jagielski 				break;
1126*b1cdbd2cSJim Jagielski 			case XML_TOK_REGEQ_DISPLAY_R_SQUARE:
1127*b1cdbd2cSJim Jagielski 				rImport.GetMM100UnitConverter().convertBool( bShowRSquare, aValue );
1128*b1cdbd2cSJim Jagielski                 break;
1129*b1cdbd2cSJim Jagielski 			case XML_TOK_REGEQ_STYLE_NAME:
1130*b1cdbd2cSJim Jagielski 				sAutoStyleName = aValue;
1131*b1cdbd2cSJim Jagielski 				break;
1132*b1cdbd2cSJim Jagielski 		}
1133*b1cdbd2cSJim Jagielski 	}
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski     if( sAutoStyleName.getLength() || bShowEquation || bShowRSquare )
1136*b1cdbd2cSJim Jagielski     {
1137*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xEqProp;
1138*b1cdbd2cSJim Jagielski         uno::Reference< lang::XMultiServiceFactory > xFact( comphelper::getProcessServiceFactory(), uno::UNO_QUERY );
1139*b1cdbd2cSJim Jagielski         if( xFact.is())
1140*b1cdbd2cSJim Jagielski             xEqProp.set( xFact->createInstance(
1141*b1cdbd2cSJim Jagielski                              ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.RegressionEquation" ))), uno::UNO_QUERY );
1142*b1cdbd2cSJim Jagielski         if( xEqProp.is())
1143*b1cdbd2cSJim Jagielski         {
1144*b1cdbd2cSJim Jagielski             if( sAutoStyleName.getLength() )
1145*b1cdbd2cSJim Jagielski             {
1146*b1cdbd2cSJim Jagielski                 const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
1147*b1cdbd2cSJim Jagielski                 if( pStylesCtxt )
1148*b1cdbd2cSJim Jagielski                 {
1149*b1cdbd2cSJim Jagielski                     const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
1150*b1cdbd2cSJim Jagielski                         mrImportHelper.GetChartFamilyID(), sAutoStyleName );
1151*b1cdbd2cSJim Jagielski                     // note: SvXMLStyleContext::FillPropertySet is not const
1152*b1cdbd2cSJim Jagielski                     XMLPropStyleContext * pPropStyleContext =
1153*b1cdbd2cSJim Jagielski                         const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski                     if( pPropStyleContext )
1156*b1cdbd2cSJim Jagielski                         pPropStyleContext->FillPropertySet( xEqProp );
1157*b1cdbd2cSJim Jagielski                 }
1158*b1cdbd2cSJim Jagielski             }
1159*b1cdbd2cSJim Jagielski             xEqProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("ShowEquation")), uno::makeAny( bShowEquation ));
1160*b1cdbd2cSJim Jagielski             xEqProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("ShowCorrelationCoefficient")), uno::makeAny( bShowRSquare ));
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski             if( bHasXPos && bHasYPos )
1163*b1cdbd2cSJim Jagielski             {
1164*b1cdbd2cSJim Jagielski                 chart2::RelativePosition aRelPos;
1165*b1cdbd2cSJim Jagielski                 aRelPos.Primary = static_cast< double >( aPosition.X ) / static_cast< double >( maChartSize.Width );
1166*b1cdbd2cSJim Jagielski                 aRelPos.Secondary = static_cast< double >( aPosition.Y ) / static_cast< double >( maChartSize.Height );
1167*b1cdbd2cSJim Jagielski                 xEqProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "RelativePosition" )),
1168*b1cdbd2cSJim Jagielski                                            uno::makeAny( aRelPos ));
1169*b1cdbd2cSJim Jagielski             }
1170*b1cdbd2cSJim Jagielski             OSL_ASSERT( mrRegressionStyle.meType == DataRowPointStyle::REGRESSION );
1171*b1cdbd2cSJim Jagielski             mrRegressionStyle.m_xEquationProperties.set( xEqProp );
1172*b1cdbd2cSJim Jagielski         }
1173*b1cdbd2cSJim Jagielski     }
1174*b1cdbd2cSJim Jagielski }
1175