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