Files
libreoffice/xmloff/source/chart/SchXMLChartContext.cxx

858 lines
32 KiB
C++
Raw Normal View History

2000-09-18 16:07:07 +00:00
/*************************************************************************
*
* $RCSfile: SchXMLChartContext.cxx,v $
*
* $Revision: 1.17 $
2000-09-18 16:07:07 +00:00
*
* last change: $Author: bm $ $Date: 2001-05-25 12:01:07 $
2000-09-18 16:07:07 +00:00
*
* 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 <tools/debug.hxx>
#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 <com/sun/star/chart/XChartDocument.hpp>
#endif
#ifndef _COM_SUN_STAR_CHART_XDIAGRAM_HPP_
#include <com/sun/star/chart/XDiagram.hpp>
#endif
#ifndef _COM_SUN_STAR_XML_SAX_XATTRIBUTELIST_HPP_
#include <com/sun/star/xml/sax/XAttributeList.hpp>
#endif
#ifndef _COM_SUN_STAR_CHART_CHARTLEGENDPOSITION_HPP_
#include <com/sun/star/chart/ChartLegendPosition.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XSTRINGMAPPING_HPP_
#include <com/sun/star/util/XStringMapping.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGESUPPLIER_HPP_
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGE_HPP_
#include <com/sun/star/drawing/XDrawPage.hpp>
#endif
2001-03-26 14:37:47 +00:00
#ifndef _COM_SUN_STAR_CHART_CHARTDATAROWSOURCE_HPP_
#include <com/sun/star/chart/ChartDataRowSource.hpp>
#endif
#ifndef _COM_SUN_STAR_CHART_XCHARTDATAARRAY_HPP_
#include <com/sun/star/chart/XChartDataArray.hpp>
#endif
2000-09-18 16:07:07 +00:00
using namespace com::sun::star;
#define SCH_BUILDCHART(xDoc) if( xDoc->hasControllersLocked() ) {\
xDoc->unlockControllers();\
xDoc->lockControllers(); }
2000-09-18 16:07:07 +00:00
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
XML_CHART_CLASS_ADDIN
2000-09-18 16:07:07 +00:00
};
// ----------------------------------------
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 ),
mbHasLegend( sal_False )
2000-09-18 16:07:07 +00:00
{
// 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();
awt::Size aChartSize;
2001-03-26 14:37:47 +00:00
// this flag is necessarry for pie charts in the core
sal_Bool bSetSwitchData = sal_False;
2001-05-04 16:18:36 +00:00
sal_Bool bDomainForDefaultDataNeeded = sal_False;
2000-09-18 16:07:07 +00:00
rtl::OUString aServiceName;
rtl::OUString sAutoStyleName;
2000-09-18 16:07:07 +00:00
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;
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" ));
2001-03-26 14:37:47 +00:00
bSetSwitchData = sal_True;
2000-09-18 16:07:07 +00:00
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" ));
2001-05-04 16:18:36 +00:00
bDomainForDefaultDataNeeded = sal_True;
2000-09-18 16:07:07 +00:00
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;
case XML_CHART_CLASS_ADDIN:
// service is taken from add-in-name attribute
break;
2000-09-18 16:07:07 +00:00
}
}
}
break;
case XML_TOK_CHART_WIDTH:
GetImport().GetMM100UnitConverter().convertMeasure( aChartSize.Width, aValue );
2000-09-18 16:07:07 +00:00
break;
case XML_TOK_CHART_HEIGHT:
GetImport().GetMM100UnitConverter().convertMeasure( aChartSize.Height, aValue );
2000-09-18 16:07:07 +00:00
break;
case XML_TOK_CHART_STYLE_NAME:
sAutoStyleName = aValue;
2000-09-18 16:07:07 +00:00
break;
case XML_TOK_CHART_ADDIN_NAME:
aServiceName = aValue;
break;
}
}
// resize chart to zero data, because data will only be enlarged later
uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument();
DBG_ASSERT( xDoc.is(), "No valid document!" );
uno::Reference< chart::XChartDataArray > xArray( xDoc->getData(), uno::UNO_QUERY );
if( xArray.is())
{
double fNan = 0.0;
uno::Reference< chart::XChartData > xData( xDoc->getData(), uno::UNO_QUERY );
if( xData.is())
fNan = xData->getNotANumber();
// attention: the data must at least be 1 x 1,
// otherwise BuildChart doesn't perform much.
uno::Sequence< uno::Sequence< double > > aAlmostEmptySeq( 1 );
2001-05-04 16:18:36 +00:00
if( bDomainForDefaultDataNeeded )
{
aAlmostEmptySeq[ 0 ].realloc( 2 );
aAlmostEmptySeq[ 0 ][ 0 ] = 0.0;
aAlmostEmptySeq[ 0 ][ 1 ] = fNan;
}
else
{
aAlmostEmptySeq[ 0 ].realloc( 1 );
aAlmostEmptySeq[ 0 ][ 0 ] = fNan;
}
xArray->setData( aAlmostEmptySeq );
}
if( aServiceName.getLength() &&
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 );
2001-03-26 14:37:47 +00:00
// set data row source for pie charts to ROWS
if( bSetSwitchData )
{
uno::Reference< beans::XPropertySet > xDiaProp( xDia, uno::UNO_QUERY );
if( xDiaProp.is())
2001-03-26 14:37:47 +00:00
{
uno::Any aAny;
aAny <<= chart::ChartDataRowSource( chart::ChartDataRowSource_ROWS );
xDiaProp->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataRowSource" )), aAny );
2001-03-26 14:37:47 +00:00
}
}
}
2000-09-18 16:07:07 +00:00
}
}
uno::Reference< drawing::XDrawPageSupplier > xPageSupp( mrImportHelper.GetChartDocument(), uno::UNO_QUERY );
if( xPageSupp.is())
{
uno::Reference< beans::XPropertySet > xPageProp( xPageSupp->getDrawPage(), uno::UNO_QUERY );
if( xPageProp.is())
{
try
{
uno::Any aAny;
aAny <<= (sal_Int32)( aChartSize.Width );
xPageProp->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Width" )), aAny );
aAny <<= (sal_Int32)( aChartSize.Height );
xPageProp->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Height" )), aAny );
}
catch( beans::UnknownPropertyException )
{
DBG_ERROR( "Cannot set page size" );
}
}
}
// set auto-styles for Area
uno::Reference< beans::XPropertySet > xProp( mrImportHelper.GetChartDocument()->getArea(), uno::UNO_QUERY );
if( xProp.is())
{
const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
if( pStylesCtxt )
{
const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
mrImportHelper.GetChartFamilyID(), sAutoStyleName );
if( pStyle && pStyle->ISA( XMLPropStyleContext ))
(( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
}
}
// prevent BuildChart from now on
uno::Reference< frame::XModel > xModel( mrImportHelper.GetChartDocument(), uno::UNO_QUERY );
if( xModel.is())
xModel->lockControllers();
2000-09-18 16:07:07 +00:00
}
void SchXMLChartContext::EndElement()
{
uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument();
uno::Reference< beans::XPropertySet > xProp( xDoc, uno::UNO_QUERY );
if( xProp.is())
{
if( maMainTitle.getLength())
{
uno::Reference< beans::XPropertySet > xTitleProp( xDoc->getTitle(), uno::UNO_QUERY );
if( xTitleProp.is())
{
try
{
uno::Any aAny;
aAny <<= maMainTitle;
xTitleProp->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "String" )), aAny );
}
catch( beans::UnknownPropertyException )
{
DBG_ERROR( "Property String for Title not available" );
}
uno::Reference< drawing::XShape > xShape( xTitleProp, uno::UNO_QUERY );
if( xShape.is())
{
// perform build chart with new title string
// so that setting the position works correctly
if( xDoc.is())
{
xDoc->unlockControllers();
xDoc->lockControllers();
}
xShape->setPosition( maMainTitlePos );
}
}
2000-09-18 16:07:07 +00:00
}
if( maSubTitle.getLength())
{
uno::Reference< beans::XPropertySet > xTitleProp( xDoc->getSubTitle(), uno::UNO_QUERY );
if( xTitleProp.is())
{
try
{
uno::Any aAny;
aAny <<= maSubTitle;
xTitleProp->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "String" )), aAny );
}
catch( beans::UnknownPropertyException )
{
DBG_ERROR( "Property String for Title not available" );
}
uno::Reference< drawing::XShape > xShape( xTitleProp, uno::UNO_QUERY );
if( xShape.is())
{
// perform build chart with new title string
// so that setting the position works correctly
if( xDoc.is())
{
xDoc->unlockControllers();
xDoc->lockControllers();
}
xShape->setPosition( maSubTitlePos );
}
}
2000-09-18 16:07:07 +00:00
}
}
if( mbHasOwnTable )
{
// apply data read in table sub-element to chart
// SchXMLTableHelper::applyTable( maTable, maSeriesAddresses, msCategoriesAddress, xDoc );
SchXMLTableHelper::applyTableSimple( maTable, xDoc );
2000-09-18 16:07:07 +00:00
}
else
{
// deprecated method
2000-09-18 16:07:07 +00:00
// translate cell-address strings
if( maSeriesAddresses.getLength() ||
msCategoriesAddress.getLength())
2000-09-18 16:07:07 +00:00
{
uno::Reference< util::XStringMapping > xTableAddressMapper = mrImportHelper.GetTableAddressMapper();
if( xTableAddressMapper.is())
2000-09-18 16:07:07 +00:00
{
// series
sal_Int32 nLength = maSeriesAddresses.getLength();
sal_Int32 nIdx;
uno::Sequence< rtl::OUString > aStrSeq( nLength * 2 + 1 );
sal_Bool bHasDomain = sal_False;
2000-09-18 16:07:07 +00:00
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 );
bHasDomain = sal_True;
}
}
// categories
aStrSeq[ nLength * 2 ] = msCategoriesAddress;
2000-09-18 16:07:07 +00:00
// translate
xTableAddressMapper->mapStrings( aStrSeq );
2000-09-18 16:07:07 +00:00
// write back
sal_Int32 nOffset = 0;
for( nIdx = 0; nIdx < nLength; nIdx++ )
{
// #81525# convert addresses for xy charts
// this should be done by calc in the future
if( nIdx == 0 &&
bHasDomain )
{
// enlarge the sequence
maSeriesAddresses.realloc( maSeriesAddresses.getLength() + 1 );
// copy the domain as first series
if( maSeriesAddresses[ nIdx + nOffset ].DomainRangeAddresses.getLength() > 0 )
maSeriesAddresses[ nIdx + nOffset ].DataRangeAddress =
maSeriesAddresses[ nIdx + nOffset ].DomainRangeAddresses[ 0 ];
// the current data range becomes the second series
nOffset++;
}
maSeriesAddresses[ nIdx + nOffset ].DataRangeAddress = aStrSeq[ nIdx * 2 ];
maSeriesAddresses[ nIdx + nOffset ].LabelAddress = aStrSeq[ nIdx * 2 + 1 ];
}
msCategoriesAddress = aStrSeq[ nLength * 2 ];
2000-09-18 16:07:07 +00:00
}
}
}
2000-09-18 16:07:07 +00:00
// set table references at document
// even when having own table (Writer)
if( xProp.is())
{
try
2000-09-18 16:07:07 +00:00
{
uno::Any aAny;
if( msChartAddress.getLength())
2000-09-18 16:07:07 +00:00
{
aAny <<= msChartAddress;
xProp->setPropertyValue( ::rtl::OUString::createFromAscii( "ChartRangeAddress" ), aAny );
2001-05-17 14:48:47 +00:00
if( msTableNumberList.getLength())
{
aAny <<= msTableNumberList;
xProp->setPropertyValue( ::rtl::OUString::createFromAscii( "TableNumberList" ), aAny );
}
2000-09-18 16:07:07 +00:00
}
else
2000-09-18 16:07:07 +00:00
{
// deprecated
if( msCategoriesAddress.getLength())
{
aAny <<= msCategoriesAddress;
xProp->setPropertyValue( rtl::OUString::createFromAscii( "CategoriesRangeAddress" ), aAny );
}
// deprecated
if( maSeriesAddresses.getLength())
{
aAny <<= maSeriesAddresses;
xProp->setPropertyValue( rtl::OUString::createFromAscii( "SeriesAddresses" ), aAny );
}
2000-09-18 16:07:07 +00:00
}
}
catch( beans::UnknownPropertyException )
{
DBG_WARNING( "Required property not found in ChartDocument" );
}
2000-09-18 16:07:07 +00:00
}
// allow BuildChart again
uno::Reference< frame::XModel > xModel( xDoc, uno::UNO_QUERY );
if( xModel.is())
xModel->unlockControllers();
// set absolute legend position after (BuildChart!)
if( mbHasLegend )
{
uno::Reference< drawing::XShape > xLegendShape( xDoc->getLegend(), uno::UNO_QUERY );
if( xLegendShape.is())
xLegendShape->setPosition( maLegendPos );
}
2000-09-18 16:07:07 +00:00
}
SvXMLImportContext* SchXMLChartContext::CreateChildContext(
USHORT nPrefix,
const rtl::OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList >& xAttrList )
{
static const sal_Bool bTrue = sal_True;
static const uno::Any aTrueBool( &bTrue, ::getBooleanCppuType());
2000-09-18 16:07:07 +00:00
SvXMLImportContext* pContext = 0;
const SvXMLTokenMap& rTokenMap = mrImportHelper.GetChartElemTokenMap();
uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument();
uno::Reference< beans::XPropertySet > xProp( xDoc, uno::UNO_QUERY );
2000-09-18 16:07:07 +00:00
switch( rTokenMap.Get( nPrefix, rLocalName ))
{
case XML_TOK_CHART_PLOT_AREA:
pContext = new SchXMLPlotAreaContext( mrImportHelper, GetImport(), rLocalName,
maSeriesAddresses, msCategoriesAddress,
2001-05-17 14:48:47 +00:00
msChartAddress, msTableNumberList );
2000-09-18 16:07:07 +00:00
break;
case XML_TOK_CHART_TITLE:
if( xDoc.is())
{
if( xProp.is())
{
uno::Any aTrueBool;
aTrueBool <<= (sal_Bool)(sal_True);
xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasMainTitle" ), aTrueBool );
SCH_BUILDCHART( xDoc );
}
uno::Reference< drawing::XShape > xTitleShape( xDoc->getTitle(), uno::UNO_QUERY );
pContext = new SchXMLTitleContext( mrImportHelper, GetImport(),
rLocalName, maMainTitle, xTitleShape, maMainTitlePos );
}
2000-09-18 16:07:07 +00:00
break;
case XML_TOK_CHART_SUBTITLE:
if( xDoc.is())
{
if( xProp.is())
{
xProp->setPropertyValue( rtl::OUString::createFromAscii( "HasSubTitle" ), aTrueBool );
SCH_BUILDCHART( xDoc );
}
uno::Reference< drawing::XShape > xTitleShape( xDoc->getSubTitle(), uno::UNO_QUERY );
pContext = new SchXMLTitleContext( mrImportHelper, GetImport(),
rLocalName, maSubTitle, xTitleShape, maSubTitlePos );
}
2000-09-18 16:07:07 +00:00
break;
case XML_TOK_CHART_LEGEND:
pContext = new SchXMLLegendContext( mrImportHelper, GetImport(), rLocalName, maLegendPos );
mbHasLegend =sal_True;
2000-09-18 16:07:07 +00:00
break;
case XML_TOK_CHART_TABLE:
pContext = new SchXMLTableContext( mrImportHelper, GetImport(), rLocalName, maTable );
if( pContext )
{
2000-09-18 16:07:07 +00:00
mbHasOwnTable = sal_True;
if( xProp.is())
try
{
xProp->setPropertyValue( ::rtl::OUString::createFromAscii( "ExportData" ), aTrueBool );
}
catch( uno::Exception )
{
DBG_ERRORFILE( "Property missing" );
}
}
2000-09-18 16:07:07 +00:00
break;
}
if( ! pContext )
pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
return pContext;
}
// ----------------------------------------
SchXMLTitleContext::SchXMLTitleContext( SchXMLImportHelper& rImpHelper, SvXMLImport& rImport,
const rtl::OUString& rLocalName,
rtl::OUString& rTitle,
uno::Reference< drawing::XShape >& xTitleShape,
awt::Point& rPosition ) :
2000-09-18 16:07:07 +00:00
SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
mrImportHelper( rImpHelper ),
mrTitle( rTitle ),
mxTitleShape( xTitleShape ),
mrPosition( rPosition )
2000-09-18 16:07:07 +00:00
{
}
SchXMLTitleContext::~SchXMLTitleContext()
{}
void SchXMLTitleContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
{
sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
rtl::OUString aValue;
if( mxTitleShape.is())
mrPosition = mxTitleShape->getPosition();
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 );
if( nPrefix == XML_NAMESPACE_SVG )
{
if( aLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_x )))
GetImport().GetMM100UnitConverter().convertMeasure( mrPosition.X, aValue );
else if( aLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_y )))
GetImport().GetMM100UnitConverter().convertMeasure( mrPosition.Y, aValue );
}
else if( nPrefix == XML_NAMESPACE_CHART )
{
if( aLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sXML_style_name )))
msAutoStyleName = aValue;
}
}
if( mxTitleShape.is())
{
uno::Reference< beans::XPropertySet > xProp( mxTitleShape, uno::UNO_QUERY );
if( xProp.is())
{
const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
if( pStylesCtxt )
{
const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
mrImportHelper.GetChartFamilyID(), msAutoStyleName );
if( pStyle && pStyle->ISA( XMLPropStyleContext ))
(( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
}
}
}
}
2000-09-18 16:07:07 +00:00
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, mrTitle );
2000-09-18 16:07:07 +00:00
}
else
pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
return pContext;
}
// ----------------------------------------
SchXMLLegendContext::SchXMLLegendContext( SchXMLImportHelper& rImpHelper,
SvXMLImport& rImport, const rtl::OUString& rLocalName,
com::sun::star::awt::Point& rPosition ) :
2000-09-18 16:07:07 +00:00
SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
mrImportHelper( rImpHelper ),
mrPosition( rPosition )
2000-09-18 16:07:07 +00:00
{
}
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 );
SCH_BUILDCHART( xDoc );
// initialize position
uno::Reference< drawing::XShape > xLegendShape( xDoc->getLegend(), uno::UNO_QUERY );
if( xLegendShape.is())
mrPosition = xLegendShape->getPosition();
2000-09-18 16:07:07 +00:00
}
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();
awt::Point aPosition;
uno::Reference< drawing::XShape > xLegendShape( xDoc->getLegend(), uno::UNO_QUERY );
if( xLegendShape.is())
aPosition = xLegendShape->getPosition();
2000-12-09 14:54:51 +00:00
rtl::OUString sAutoStyleName;
2000-09-18 16:07:07 +00:00
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:
{
2000-12-09 14:54:51 +00:00
// set anchor position
2000-09-18 16:07:07 +00:00
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:
GetImport().GetMM100UnitConverter().convertMeasure( mrPosition.X, aValue );
break;
2000-09-18 16:07:07 +00:00
case XML_TOK_LEGEND_Y:
GetImport().GetMM100UnitConverter().convertMeasure( mrPosition.Y, aValue );
2000-09-18 16:07:07 +00:00
break;
2000-12-09 14:54:51 +00:00
case XML_TOK_LEGEND_STYLE_NAME:
sAutoStyleName = aValue;
}
}
// set auto-styles for Area
uno::Reference< beans::XPropertySet > xProp( xDoc->getLegend(), uno::UNO_QUERY );
if( xProp.is())
{
const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
if( pStylesCtxt )
{
const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
mrImportHelper.GetChartFamilyID(), sAutoStyleName );
if( pStyle && pStyle->ISA( XMLPropStyleContext ))
(( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
2000-09-18 16:07:07 +00:00
}
}
}
SchXMLLegendContext::~SchXMLLegendContext()
{
}