1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 #include "ChartPlotAreaOASISTContext.hxx" 27 #include "TransformerBase.hxx" 28 #include <xmloff/nmspmap.hxx> 29 #include "xmloff/xmlnmspe.hxx" 30 #include <xmloff/xmltoken.hxx> 31 #include "DeepTContext.hxx" 32 #include "ActionMapTypesOASIS.hxx" 33 #include "MutableAttrList.hxx" 34 35 using namespace ::com::sun::star; 36 using namespace ::xmloff::token; 37 38 using ::com::sun::star::uno::Reference; 39 using ::rtl::OUString; 40 41 class XMLAxisOASISContext : public XMLPersElemContentTContext 42 { 43 public: 44 TYPEINFO(); 45 46 XMLAxisOASISContext( XMLTransformerBase& rTransformer, 47 const ::rtl::OUString& rQName, 48 ::rtl::Reference< XMLPersAttrListTContext > & rOutCategoriesContext ); 49 ~XMLAxisOASISContext(); 50 51 virtual XMLTransformerContext *CreateChildContext( 52 sal_uInt16 nPrefix, 53 const ::rtl::OUString& rLocalName, 54 const ::rtl::OUString& rQName, 55 const Reference< xml::sax::XAttributeList >& xAttrList ); 56 57 virtual void StartElement( const Reference< xml::sax::XAttributeList >& rAttrList ); 58 virtual void EndElement(); 59 60 bool IsCategoryAxis() const; 61 62 private: 63 ::rtl::Reference< XMLPersAttrListTContext > & m_rCategoriesContext; 64 bool m_bHasCategories; 65 }; 66 67 TYPEINIT1( XMLAxisOASISContext, XMLPersElemContentTContext ); 68 69 XMLAxisOASISContext::XMLAxisOASISContext( 70 XMLTransformerBase& rTransformer, 71 const ::rtl::OUString& rQName, 72 ::rtl::Reference< XMLPersAttrListTContext > & rOutCategoriesContext ) : 73 XMLPersElemContentTContext( rTransformer, rQName ), 74 m_rCategoriesContext( rOutCategoriesContext ), 75 m_bHasCategories( false ) 76 {} 77 78 XMLAxisOASISContext::~XMLAxisOASISContext() 79 {} 80 81 XMLTransformerContext * XMLAxisOASISContext::CreateChildContext( 82 sal_uInt16 nPrefix, 83 const ::rtl::OUString& rLocalName, 84 const ::rtl::OUString& rQName, 85 const Reference< xml::sax::XAttributeList >& xAttrList ) 86 { 87 XMLTransformerContext * pContext = 0; 88 89 if( XML_NAMESPACE_CHART == nPrefix && 90 IsXMLToken( rLocalName, XML_CATEGORIES ) ) 91 { 92 // store categories element at parent 93 m_rCategoriesContext.set( new XMLPersAttrListTContext( GetTransformer(), rQName )); 94 m_bHasCategories = true; 95 pContext = m_rCategoriesContext.get(); 96 } 97 else 98 { 99 pContext = XMLPersElemContentTContext::CreateChildContext( 100 nPrefix, rLocalName, rQName, xAttrList ); 101 } 102 103 return pContext; 104 } 105 106 void XMLAxisOASISContext::StartElement( 107 const Reference< xml::sax::XAttributeList >& rAttrList ) 108 { 109 OUString aLocation, aMacroName; 110 Reference< xml::sax::XAttributeList > xAttrList( rAttrList ); 111 XMLMutableAttributeList *pMutableAttrList = 0; 112 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 113 for( sal_Int16 i=0; i < nAttrCount; i++ ) 114 { 115 const OUString& rAttrName = xAttrList->getNameByIndex( i ); 116 OUString aLocalName; 117 sal_uInt16 nPrefix = 118 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ); 119 120 if( nPrefix == XML_NAMESPACE_CHART && 121 IsXMLToken( aLocalName, XML_DIMENSION ) ) 122 { 123 if( !pMutableAttrList ) 124 { 125 pMutableAttrList = new XMLMutableAttributeList( xAttrList ); 126 xAttrList = pMutableAttrList; 127 } 128 129 const OUString& rAttrValue = xAttrList->getValueByIndex( i ); 130 XMLTokenEnum eToken = XML_TOKEN_INVALID; 131 if( IsXMLToken( rAttrValue, XML_X )) 132 { 133 eToken = XML_DOMAIN; 134 // has to be XML_CATEGORY for axes with a categories 135 // sub-element. The attribute is changed later (when it is 136 // known that there is a categories sub-element) in this case. 137 } 138 else if( IsXMLToken( rAttrValue, XML_Y )) 139 { 140 eToken = XML_VALUE; 141 } 142 else if( IsXMLToken( rAttrValue, XML_Z )) 143 { 144 eToken = XML_SERIES; 145 } 146 else 147 { 148 OSL_ENSURE( false, "ChartAxis: Invalid attribute value" ); 149 } 150 151 if( eToken != XML_TOKEN_INVALID ) 152 { 153 OUString aNewAttrQName( 154 GetTransformer().GetNamespaceMap().GetQNameByKey( 155 XML_NAMESPACE_CHART, GetXMLToken( XML_CLASS ))); 156 pMutableAttrList->RenameAttributeByIndex( i, aNewAttrQName ); 157 158 pMutableAttrList->SetValueByIndex( i, GetXMLToken( eToken )); 159 } 160 } 161 } 162 163 XMLPersElemContentTContext::StartElement( xAttrList ); 164 } 165 166 void XMLAxisOASISContext::EndElement() 167 { 168 // if we have categories, change the "class" attribute 169 if( IsCategoryAxis() && 170 m_rCategoriesContext.is() ) 171 { 172 OSL_ENSURE( GetAttrList().is(), "Invalid attribute list" ); 173 XMLMutableAttributeList * pMutableAttrList = 174 new XMLMutableAttributeList( GetAttrList()); 175 OUString aAttrQName( GetTransformer().GetNamespaceMap().GetQNameByKey( 176 XML_NAMESPACE_CHART, GetXMLToken( XML_CLASS ))); 177 sal_Int16 nIndex = pMutableAttrList->GetIndexByName( aAttrQName ); 178 if( nIndex != -1 ) 179 { 180 OSL_ENSURE( IsXMLToken( pMutableAttrList->getValueByIndex( nIndex ), 181 XML_DOMAIN ), "Axis Dimension: invalid former value" ); 182 pMutableAttrList->SetValueByIndex( nIndex, GetXMLToken( XML_CATEGORY )); 183 OSL_ENSURE( IsXMLToken( pMutableAttrList->getValueByIndex( nIndex ), 184 XML_CATEGORY ), "Axis Dimension: invalid new value" ); 185 } 186 187 GetTransformer().GetDocHandler()->startElement( 188 GetExportQName(), 189 Reference< xml::sax::XAttributeList >( pMutableAttrList )); 190 ExportContent(); 191 GetTransformer().GetDocHandler()->endElement( GetExportQName()); 192 } 193 else 194 Export(); 195 } 196 197 bool XMLAxisOASISContext::IsCategoryAxis() const 198 { 199 return m_bHasCategories; 200 } 201 202 203 TYPEINIT1( XMLChartPlotAreaOASISTContext, XMLProcAttrTransformerContext ); 204 205 XMLChartPlotAreaOASISTContext::XMLChartPlotAreaOASISTContext( 206 XMLTransformerBase & rTransformer, const ::rtl::OUString & rQName ) : 207 XMLProcAttrTransformerContext( rTransformer, rQName, OASIS_SHAPE_ACTIONS ) 208 { 209 } 210 211 XMLChartPlotAreaOASISTContext::~XMLChartPlotAreaOASISTContext() 212 {} 213 214 XMLTransformerContext * XMLChartPlotAreaOASISTContext::CreateChildContext( 215 sal_uInt16 nPrefix, 216 const ::rtl::OUString& rLocalName, 217 const ::rtl::OUString& rQName, 218 const uno::Reference< xml::sax::XAttributeList >& xAttrList ) 219 { 220 XMLTransformerContext *pContext = 0; 221 222 if( XML_NAMESPACE_CHART == nPrefix && 223 IsXMLToken( rLocalName, XML_AXIS ) ) 224 { 225 pContext = new XMLAxisOASISContext( GetTransformer(), rQName, m_rCategoriesContext ); 226 } 227 else 228 { 229 // export (and forget) categories if found in an axis-element 230 // otherwise export regularly 231 ExportCategories(); 232 pContext = XMLProcAttrTransformerContext::CreateChildContext( 233 nPrefix, rLocalName, rQName, xAttrList ); 234 } 235 236 return pContext; 237 } 238 239 void XMLChartPlotAreaOASISTContext::EndElement() 240 { 241 ExportCategories(); 242 XMLProcAttrTransformerContext::EndElement(); 243 } 244 245 void XMLChartPlotAreaOASISTContext::ExportCategories() 246 { 247 if( m_rCategoriesContext.is()) 248 { 249 m_rCategoriesContext->Export(); 250 m_rCategoriesContext.clear(); 251 } 252 } 253