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 #include "ChartPlotAreaOASISTContext.hxx" 31*cdf0e10cSrcweir #include "TransformerBase.hxx" 32*cdf0e10cSrcweir #include <xmloff/nmspmap.hxx> 33*cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 34*cdf0e10cSrcweir #include <xmloff/xmltoken.hxx> 35*cdf0e10cSrcweir #include "DeepTContext.hxx" 36*cdf0e10cSrcweir #include "ActionMapTypesOASIS.hxx" 37*cdf0e10cSrcweir #include "MutableAttrList.hxx" 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir using namespace ::com::sun::star; 40*cdf0e10cSrcweir using namespace ::xmloff::token; 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 43*cdf0e10cSrcweir using ::rtl::OUString; 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir class XMLAxisOASISContext : public XMLPersElemContentTContext 46*cdf0e10cSrcweir { 47*cdf0e10cSrcweir public: 48*cdf0e10cSrcweir TYPEINFO(); 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir XMLAxisOASISContext( XMLTransformerBase& rTransformer, 51*cdf0e10cSrcweir const ::rtl::OUString& rQName, 52*cdf0e10cSrcweir ::rtl::Reference< XMLPersAttrListTContext > & rOutCategoriesContext ); 53*cdf0e10cSrcweir ~XMLAxisOASISContext(); 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir virtual XMLTransformerContext *CreateChildContext( 56*cdf0e10cSrcweir sal_uInt16 nPrefix, 57*cdf0e10cSrcweir const ::rtl::OUString& rLocalName, 58*cdf0e10cSrcweir const ::rtl::OUString& rQName, 59*cdf0e10cSrcweir const Reference< xml::sax::XAttributeList >& xAttrList ); 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir virtual void StartElement( const Reference< xml::sax::XAttributeList >& rAttrList ); 62*cdf0e10cSrcweir virtual void EndElement(); 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir bool IsCategoryAxis() const; 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir private: 67*cdf0e10cSrcweir ::rtl::Reference< XMLPersAttrListTContext > & m_rCategoriesContext; 68*cdf0e10cSrcweir bool m_bHasCategories; 69*cdf0e10cSrcweir }; 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir TYPEINIT1( XMLAxisOASISContext, XMLPersElemContentTContext ); 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir XMLAxisOASISContext::XMLAxisOASISContext( 74*cdf0e10cSrcweir XMLTransformerBase& rTransformer, 75*cdf0e10cSrcweir const ::rtl::OUString& rQName, 76*cdf0e10cSrcweir ::rtl::Reference< XMLPersAttrListTContext > & rOutCategoriesContext ) : 77*cdf0e10cSrcweir XMLPersElemContentTContext( rTransformer, rQName ), 78*cdf0e10cSrcweir m_rCategoriesContext( rOutCategoriesContext ), 79*cdf0e10cSrcweir m_bHasCategories( false ) 80*cdf0e10cSrcweir {} 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir XMLAxisOASISContext::~XMLAxisOASISContext() 83*cdf0e10cSrcweir {} 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir XMLTransformerContext * XMLAxisOASISContext::CreateChildContext( 86*cdf0e10cSrcweir sal_uInt16 nPrefix, 87*cdf0e10cSrcweir const ::rtl::OUString& rLocalName, 88*cdf0e10cSrcweir const ::rtl::OUString& rQName, 89*cdf0e10cSrcweir const Reference< xml::sax::XAttributeList >& xAttrList ) 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir XMLTransformerContext * pContext = 0; 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir if( XML_NAMESPACE_CHART == nPrefix && 94*cdf0e10cSrcweir IsXMLToken( rLocalName, XML_CATEGORIES ) ) 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir // store categories element at parent 97*cdf0e10cSrcweir m_rCategoriesContext.set( new XMLPersAttrListTContext( GetTransformer(), rQName )); 98*cdf0e10cSrcweir m_bHasCategories = true; 99*cdf0e10cSrcweir pContext = m_rCategoriesContext.get(); 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir else 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir pContext = XMLPersElemContentTContext::CreateChildContext( 104*cdf0e10cSrcweir nPrefix, rLocalName, rQName, xAttrList ); 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir return pContext; 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir void XMLAxisOASISContext::StartElement( 111*cdf0e10cSrcweir const Reference< xml::sax::XAttributeList >& rAttrList ) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir OUString aLocation, aMacroName; 114*cdf0e10cSrcweir Reference< xml::sax::XAttributeList > xAttrList( rAttrList ); 115*cdf0e10cSrcweir XMLMutableAttributeList *pMutableAttrList = 0; 116*cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 117*cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir const OUString& rAttrName = xAttrList->getNameByIndex( i ); 120*cdf0e10cSrcweir OUString aLocalName; 121*cdf0e10cSrcweir sal_uInt16 nPrefix = 122*cdf0e10cSrcweir GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ); 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir if( nPrefix == XML_NAMESPACE_CHART && 125*cdf0e10cSrcweir IsXMLToken( aLocalName, XML_DIMENSION ) ) 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir if( !pMutableAttrList ) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir pMutableAttrList = new XMLMutableAttributeList( xAttrList ); 130*cdf0e10cSrcweir xAttrList = pMutableAttrList; 131*cdf0e10cSrcweir } 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir const OUString& rAttrValue = xAttrList->getValueByIndex( i ); 134*cdf0e10cSrcweir XMLTokenEnum eToken = XML_TOKEN_INVALID; 135*cdf0e10cSrcweir if( IsXMLToken( rAttrValue, XML_X )) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir eToken = XML_DOMAIN; 138*cdf0e10cSrcweir // has to be XML_CATEGORY for axes with a categories 139*cdf0e10cSrcweir // sub-element. The attribute is changed later (when it is 140*cdf0e10cSrcweir // known that there is a categories sub-element) in this case. 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir else if( IsXMLToken( rAttrValue, XML_Y )) 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir eToken = XML_VALUE; 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir else if( IsXMLToken( rAttrValue, XML_Z )) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir eToken = XML_SERIES; 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir else 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir OSL_ENSURE( false, "ChartAxis: Invalid attribute value" ); 153*cdf0e10cSrcweir } 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir if( eToken != XML_TOKEN_INVALID ) 156*cdf0e10cSrcweir { 157*cdf0e10cSrcweir OUString aNewAttrQName( 158*cdf0e10cSrcweir GetTransformer().GetNamespaceMap().GetQNameByKey( 159*cdf0e10cSrcweir XML_NAMESPACE_CHART, GetXMLToken( XML_CLASS ))); 160*cdf0e10cSrcweir pMutableAttrList->RenameAttributeByIndex( i, aNewAttrQName ); 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, GetXMLToken( eToken )); 163*cdf0e10cSrcweir } 164*cdf0e10cSrcweir } 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir XMLPersElemContentTContext::StartElement( xAttrList ); 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir void XMLAxisOASISContext::EndElement() 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir // if we have categories, change the "class" attribute 173*cdf0e10cSrcweir if( IsCategoryAxis() && 174*cdf0e10cSrcweir m_rCategoriesContext.is() ) 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir OSL_ENSURE( GetAttrList().is(), "Invalid attribute list" ); 177*cdf0e10cSrcweir XMLMutableAttributeList * pMutableAttrList = 178*cdf0e10cSrcweir new XMLMutableAttributeList( GetAttrList()); 179*cdf0e10cSrcweir OUString aAttrQName( GetTransformer().GetNamespaceMap().GetQNameByKey( 180*cdf0e10cSrcweir XML_NAMESPACE_CHART, GetXMLToken( XML_CLASS ))); 181*cdf0e10cSrcweir sal_Int16 nIndex = pMutableAttrList->GetIndexByName( aAttrQName ); 182*cdf0e10cSrcweir if( nIndex != -1 ) 183*cdf0e10cSrcweir { 184*cdf0e10cSrcweir OSL_ENSURE( IsXMLToken( pMutableAttrList->getValueByIndex( nIndex ), 185*cdf0e10cSrcweir XML_DOMAIN ), "Axis Dimension: invalid former value" ); 186*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( nIndex, GetXMLToken( XML_CATEGORY )); 187*cdf0e10cSrcweir OSL_ENSURE( IsXMLToken( pMutableAttrList->getValueByIndex( nIndex ), 188*cdf0e10cSrcweir XML_CATEGORY ), "Axis Dimension: invalid new value" ); 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir GetTransformer().GetDocHandler()->startElement( 192*cdf0e10cSrcweir GetExportQName(), 193*cdf0e10cSrcweir Reference< xml::sax::XAttributeList >( pMutableAttrList )); 194*cdf0e10cSrcweir ExportContent(); 195*cdf0e10cSrcweir GetTransformer().GetDocHandler()->endElement( GetExportQName()); 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir else 198*cdf0e10cSrcweir Export(); 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir bool XMLAxisOASISContext::IsCategoryAxis() const 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir return m_bHasCategories; 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir TYPEINIT1( XMLChartPlotAreaOASISTContext, XMLProcAttrTransformerContext ); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir XMLChartPlotAreaOASISTContext::XMLChartPlotAreaOASISTContext( 210*cdf0e10cSrcweir XMLTransformerBase & rTransformer, const ::rtl::OUString & rQName ) : 211*cdf0e10cSrcweir XMLProcAttrTransformerContext( rTransformer, rQName, OASIS_SHAPE_ACTIONS ) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir XMLChartPlotAreaOASISTContext::~XMLChartPlotAreaOASISTContext() 216*cdf0e10cSrcweir {} 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir XMLTransformerContext * XMLChartPlotAreaOASISTContext::CreateChildContext( 219*cdf0e10cSrcweir sal_uInt16 nPrefix, 220*cdf0e10cSrcweir const ::rtl::OUString& rLocalName, 221*cdf0e10cSrcweir const ::rtl::OUString& rQName, 222*cdf0e10cSrcweir const uno::Reference< xml::sax::XAttributeList >& xAttrList ) 223*cdf0e10cSrcweir { 224*cdf0e10cSrcweir XMLTransformerContext *pContext = 0; 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir if( XML_NAMESPACE_CHART == nPrefix && 227*cdf0e10cSrcweir IsXMLToken( rLocalName, XML_AXIS ) ) 228*cdf0e10cSrcweir { 229*cdf0e10cSrcweir pContext = new XMLAxisOASISContext( GetTransformer(), rQName, m_rCategoriesContext ); 230*cdf0e10cSrcweir } 231*cdf0e10cSrcweir else 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir // export (and forget) categories if found in an axis-element 234*cdf0e10cSrcweir // otherwise export regularly 235*cdf0e10cSrcweir ExportCategories(); 236*cdf0e10cSrcweir pContext = XMLProcAttrTransformerContext::CreateChildContext( 237*cdf0e10cSrcweir nPrefix, rLocalName, rQName, xAttrList ); 238*cdf0e10cSrcweir } 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir return pContext; 241*cdf0e10cSrcweir } 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir void XMLChartPlotAreaOASISTContext::EndElement() 244*cdf0e10cSrcweir { 245*cdf0e10cSrcweir ExportCategories(); 246*cdf0e10cSrcweir XMLProcAttrTransformerContext::EndElement(); 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir void XMLChartPlotAreaOASISTContext::ExportCategories() 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir if( m_rCategoriesContext.is()) 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir m_rCategoriesContext->Export(); 254*cdf0e10cSrcweir m_rCategoriesContext.clear(); 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir } 257