/************************************************************************* * * $RCSfile: SchXMLChartContext.cxx,v $ * * $Revision: 1.1.1.1 $ * * last change: $Author: hr $ $Date: 2000-09-18 17:07:02 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #include "SchXMLChartContext.hxx" #include "SchXMLImport.hxx" #include "SchXMLPlotAreaContext.hxx" #include "SchXMLParagraphContext.hxx" #include "SchXMLTableContext.hxx" #ifndef _TOOLS_DEBUG_HXX #include #endif #ifndef _XMLOFF_XMLNMSPE_HXX #include "xmlnmspe.hxx" #endif #ifndef _XMLOFF_XMLEMENT_HXX #include "xmlement.hxx" #endif #ifndef _XMLOFF_XMLKYWD_HXX #include "xmlkywd.hxx" #endif #ifndef _XMLOFF_NMSPMAP_HXX #include "nmspmap.hxx" #endif #ifndef _XMLOFF_XMLUCONV_HXX #include "xmluconv.hxx" #endif #ifndef _XMLOFF_XMLSTYLE_HXX #include "xmlstyle.hxx" #endif #ifndef _XMLOFF_PRSTYLEI_HXX_ #include "prstylei.hxx" #endif #ifndef _COM_SUN_STAR_CHART_XCHARTDOCUMENT_HPP_ #include #endif #ifndef _COM_SUN_STAR_CHART_XDIAGRAM_HPP_ #include #endif #ifndef _COM_SUN_STAR_XML_SAX_XATTRIBUTELIST_HPP_ #include #endif #ifndef _COM_SUN_STAR_TEXT_XTEXTRANGE_HPP_ #include #endif #ifndef _COM_SUN_STAR_CHART_CHARTLEGENDPOSITION_HPP_ #include #endif #ifndef _COM_SUN_STAR_UTIL_XSTRINGMAPPING_HPP_ #include #endif using namespace com::sun::star; enum SchXMLChartType { XML_CHART_CLASS_LINE, XML_CHART_CLASS_AREA, XML_CHART_CLASS_CIRCLE, XML_CHART_CLASS_RING, XML_CHART_CLASS_SCATTER, XML_CHART_CLASS_RADAR, XML_CHART_CLASS_BAR, XML_CHART_CLASS_STOCK, XML_CHART_CLASS_BUBBLE // not yet implemented }; // ---------------------------------------- static __FAR_DATA SvXMLEnumMapEntry aXMLChartClassMap[] = { { sXML_line, XML_CHART_CLASS_LINE }, { sXML_area, XML_CHART_CLASS_AREA }, { sXML_circle, XML_CHART_CLASS_CIRCLE }, { sXML_ring, XML_CHART_CLASS_RING }, { sXML_scatter, XML_CHART_CLASS_SCATTER }, { sXML_radar, XML_CHART_CLASS_RADAR }, { sXML_bar, XML_CHART_CLASS_BAR }, { sXML_stock, XML_CHART_CLASS_STOCK }, { sXML_bubble, XML_CHART_CLASS_BUBBLE }, { 0, 0 } }; static __FAR_DATA SvXMLEnumMapEntry aXMLLegendAlignmentMap[] = { { sXML_left, chart::ChartLegendPosition_LEFT }, { sXML_top, chart::ChartLegendPosition_TOP }, { sXML_right, chart::ChartLegendPosition_RIGHT }, { sXML_bottom, chart::ChartLegendPosition_BOTTOM }, { 0, 0 } }; // ---------------------------------------- SchXMLChartContext::SchXMLChartContext( SchXMLImportHelper& rImpHelper, SvXMLImport& rImport, const rtl::OUString& rLocalName ) : SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ), mrImportHelper( rImpHelper ), mbHasOwnTable( sal_False ) { // hide title, subtitle and legend uno::Reference< beans::XPropertySet > xProp( mrImportHelper.GetChartDocument(), uno::UNO_QUERY ); if( xProp.is()) { uno::Any aFalseBool; aFalseBool <<= (sal_Bool)(sal_False); try { xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasMainTitle" ), aFalseBool ); xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasSubTitle" ), aFalseBool ); xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasLegend" ), aFalseBool ); } catch( beans::UnknownPropertyException ) { DBG_ERROR( "XML-Chart Import: Property not found" ); } } } SchXMLChartContext::~SchXMLChartContext() {} void SchXMLChartContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList ) { // parse attributes sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0; rtl::OUString aValue; const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetChartAttrTokenMap(); for( sal_Int16 i = 0; i < nAttrCount; i++ ) { rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); rtl::OUString aLocalName; rtl::OUString aValue = xAttrList->getValueByIndex( i ); USHORT nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); switch( rAttrTokenMap.Get( nPrefix, aLocalName )) { case XML_TOK_CHART_CLASS: { USHORT nEnumVal; rtl::OUString aServiceName; if( GetImport().GetMM100UnitConverter().convertEnum( nEnumVal, aValue, aXMLChartClassMap )) { switch( nEnumVal ) { case XML_CHART_CLASS_LINE: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.LineDiagram" )); break; case XML_CHART_CLASS_AREA: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.AreaDiagram" )); break; case XML_CHART_CLASS_CIRCLE: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.PieDiagram" )); break; case XML_CHART_CLASS_RING: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.DonutDiagram" )); break; case XML_CHART_CLASS_SCATTER: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.XYDiagram" )); break; case XML_CHART_CLASS_RADAR: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.NetDiagram" )); break; case XML_CHART_CLASS_BAR: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.BarDiagram" )); break; case XML_CHART_CLASS_STOCK: aServiceName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.StockDiagram" )); break; case XML_CHART_CLASS_BUBBLE: DBG_ERROR( "Bubble chart not supported yet" ); break; } } if( aServiceName.getLength()) { uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument(); if( xDoc.is()) { uno::Reference< lang::XMultiServiceFactory > xFact( xDoc, uno::UNO_QUERY ); if( xFact.is()) { uno::Reference< chart::XDiagram > xDia( xFact->createInstance( aServiceName ), uno::UNO_QUERY ); if( xDia.is()) xDoc->setDiagram( xDia ); } } } } break; case XML_TOK_CHART_WIDTH: GetImport().GetMM100UnitConverter().convertMeasure( mnWidth, aValue ); break; case XML_TOK_CHART_HEIGHT: GetImport().GetMM100UnitConverter().convertMeasure( mnHeight, aValue ); break; case XML_TOK_CHART_STYLE_NAME: msAutoStyleName = aValue; break; } } } void SchXMLChartContext::EndElement() { uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument(); uno::Reference< beans::XPropertySet > xProp( xDoc, uno::UNO_QUERY ); uno::Any aTrueBool; aTrueBool <<= (sal_Bool)(sal_True); if( xProp.is()) { if( maMainTitle.getLength()) { try { xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasMainTitle" ), aTrueBool ); } catch( beans::UnknownPropertyException ) { DBG_ERROR1( "Couldn't set property %s on document", "HasMainTitle" ); } uno::Reference< text::XTextRange > xRange( xDoc->getTitle(), uno::UNO_QUERY ); if( xRange.is()) xRange->setString( maMainTitle ); } if( maSubTitle.getLength()) { try { xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasSubTitle" ), aTrueBool ); } catch( beans::UnknownPropertyException ) { DBG_ERROR1( "Couldn't set property %s on document", "HasSubTitle" ); } uno::Reference< text::XTextRange > xRange( xDoc->getSubTitle(), uno::UNO_QUERY ); if( xRange.is()) xRange->setString( maSubTitle ); } } if( mbHasOwnTable ) { // apply data read in table sub-element to chart SchXMLTableHelper::applyTable( maTable, maSeriesAddresses, msCategoriesAddress, xDoc ); } else { // translate cell-address strings uno::Reference< util::XStringMapping > xTableAddressMapper = mrImportHelper.GetTableAddressMapper(); if( xTableAddressMapper.is()) { // series sal_Int32 nLength = maSeriesAddresses.getLength(); sal_Int32 nIdx; uno::Sequence< rtl::OUString > aStrSeq( nLength * 2 + 1 ); for( nIdx = 0; nIdx < nLength; nIdx++ ) { aStrSeq[ nIdx * 2 ] = maSeriesAddresses[ nIdx ].DataRangeAddress; aStrSeq[ nIdx * 2 + 1 ] = maSeriesAddresses[ nIdx ].LabelAddress; // domains if( maSeriesAddresses[ nIdx ].DomainRangeAddresses.getLength()) xTableAddressMapper->mapStrings( maSeriesAddresses[ nIdx ].DomainRangeAddresses ); } // categories aStrSeq[ nLength * 2 ] = msCategoriesAddress; // translate xTableAddressMapper->mapStrings( aStrSeq ); // write back for( nIdx = 0; nIdx < nLength; nIdx++ ) { maSeriesAddresses[ nIdx ].DataRangeAddress = aStrSeq[ nIdx * 2 ]; maSeriesAddresses[ nIdx ].LabelAddress = aStrSeq[ nIdx * 2 + 1 ]; } msCategoriesAddress = aStrSeq[ nLength * 2 ]; } // set table references at document if( xProp.is()) { try { uno::Any aAny; aAny <<= msCategoriesAddress; xProp->setPropertyValue( rtl::OUString::createFromAscii( "CategoriesRangeAddress" ), aAny ); aAny <<= maSeriesAddresses; xProp->setPropertyValue( rtl::OUString::createFromAscii( "SeriesAddresses" ), aAny ); } catch( beans::UnknownPropertyException ) { DBG_WARNING( "Required property not found in ChartDocument" ); } } } } SvXMLImportContext* SchXMLChartContext::CreateChildContext( USHORT nPrefix, const rtl::OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList >& xAttrList ) { SvXMLImportContext* pContext = 0; const SvXMLTokenMap& rTokenMap = mrImportHelper.GetChartElemTokenMap(); switch( rTokenMap.Get( nPrefix, rLocalName )) { case XML_TOK_CHART_PLOT_AREA: pContext = new SchXMLPlotAreaContext( mrImportHelper, GetImport(), rLocalName, maSeriesAddresses, msCategoriesAddress ); break; case XML_TOK_CHART_TITLE: pContext = new SchXMLTitleContext( GetImport(), rLocalName, maMainTitle ); break; case XML_TOK_CHART_SUBTITLE: pContext = new SchXMLTitleContext( GetImport(), rLocalName, maSubTitle ); break; case XML_TOK_CHART_LEGEND: pContext = new SchXMLLegendContext( mrImportHelper, GetImport(), rLocalName ); break; case XML_TOK_CHART_TABLE: pContext = new SchXMLTableContext( mrImportHelper, GetImport(), rLocalName, maTable ); if( pContext ) mbHasOwnTable = sal_True; break; } if( ! pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); return pContext; } // ---------------------------------------- SchXMLTitleContext::SchXMLTitleContext( SvXMLImport& rImport, const rtl::OUString& rLocalName, rtl::OUString& aTitle ) : SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ), maTitle( aTitle ) { } SchXMLTitleContext::~SchXMLTitleContext() {} SvXMLImportContext* SchXMLTitleContext::CreateChildContext( USHORT nPrefix, const rtl::OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList >& xAttrList ) { SvXMLImportContext* pContext = 0; if( nPrefix == XML_NAMESPACE_TEXT && rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_p ))) { pContext = new SchXMLParagraphContext( GetImport(), rLocalName, maTitle ); } else pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); return pContext; } // ---------------------------------------- SchXMLLegendContext::SchXMLLegendContext( SchXMLImportHelper& rImpHelper, SvXMLImport& rImport, const rtl::OUString& rLocalName ) : SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ), mrImportHelper( rImpHelper ) { } void SchXMLLegendContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList ) { uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument(); if( ! xDoc.is()) return; // turn on legend uno::Reference< beans::XPropertySet > xDocProp( xDoc, uno::UNO_QUERY ); if( xDocProp.is()) { uno::Any aTrueBool; aTrueBool <<= (sal_Bool)(sal_True); try { xDocProp->setPropertyValue( rtl::OUString::createFromAscii( "HasLegend" ), aTrueBool ); } catch( beans::UnknownPropertyException ) { DBG_ERROR( "Property HasLegend not found" ); } } // parse attributes sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0; rtl::OUString aValue; const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetLegendAttrTokenMap(); for( sal_Int16 i = 0; i < nAttrCount; i++ ) { rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); rtl::OUString aLocalName; rtl::OUString aValue = xAttrList->getValueByIndex( i ); USHORT nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); switch( rAttrTokenMap.Get( nPrefix, aLocalName )) { case XML_TOK_LEGEND_POSITION: { uno::Reference< beans::XPropertySet > xProp( xDoc->getLegend(), uno::UNO_QUERY ); if( xProp.is()) { try { USHORT nEnumVal; if( GetImport().GetMM100UnitConverter().convertEnum( nEnumVal, aValue, aXMLLegendAlignmentMap )) { uno::Any aAny; aAny <<= (chart::ChartLegendPosition)(nEnumVal); xProp->setPropertyValue( rtl::OUString::createFromAscii( "Alignment" ), aAny ); } } catch( beans::UnknownPropertyException ) { DBG_ERROR( "Property Alignment (legend) not found" ); } } } break; case XML_TOK_LEGEND_X: case XML_TOK_LEGEND_Y: break; } } } SchXMLLegendContext::~SchXMLLegendContext() { }