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