office-gobmx/xmloff/source/chart/SchXMLRegressionCurveObjectContext.cxx
Stephan Bergmann c21979a327 loplugin:staticcall
Change-Id: I7691a6d267ea572e3fdd028c1cfae7b721a76da7
2014-06-13 17:54:37 +02:00

207 lines
7.7 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
*/
#include "SchXMLRegressionCurveObjectContext.hxx"
#include <sax/tools/converter.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/xmlement.hxx>
#include <xmloff/xmluconv.hxx>
#include <xmloff/prstylei.hxx>
#include <xmloff/xmlstyle.hxx>
#include <comphelper/processfactory.hxx>
#include <com/sun/star/chart2/RegressionEquation.hpp>
#include <com/sun/star/chart2/RelativePosition.hpp>
using namespace com::sun::star;
using namespace xmloff::token;
using com::sun::star::uno::Reference;
SchXMLRegressionCurveObjectContext::SchXMLRegressionCurveObjectContext(
SchXMLImportHelper& rImpHelper,
SvXMLImport& rImport,
sal_uInt16 nPrefix,
const OUString& rLocalName,
const OUString &rSeriesStyleName,
std::list< RegressionStyle >& rRegressionStyleList,
const css::uno::Reference<
css::chart2::XDataSeries >& xSeries,
const awt::Size & rChartSize) :
SvXMLImportContext( rImport, nPrefix, rLocalName ),
mrImportHelper( rImpHelper ),
mxSeries( xSeries ),
maChartSize( rChartSize ),
maSeriesStyleName( rSeriesStyleName),
mrRegressionStyleList( rRegressionStyleList )
{
}
SchXMLRegressionCurveObjectContext::~SchXMLRegressionCurveObjectContext()
{
}
void SchXMLRegressionCurveObjectContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttributeList )
{
sal_Int16 nAttributeCount = xAttributeList.is()? xAttributeList->getLength(): 0;
OUString sAutoStyleName;
for( sal_Int16 i = 0; i < nAttributeCount; i++ )
{
OUString sAttributeName = xAttributeList->getNameByIndex( i );
OUString aLocalName;
sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttributeName, &aLocalName );
if( nPrefix == XML_NAMESPACE_CHART )
{
if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
{
sAutoStyleName = xAttributeList->getValueByIndex( i );
}
}
}
RegressionStyle aStyle( mxSeries, sAutoStyleName );
mrRegressionStyleList.push_back( aStyle );
}
SvXMLImportContext* SchXMLRegressionCurveObjectContext::CreateChildContext(
sal_uInt16 nPrefix,
const OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList >& xAttrList )
{
SvXMLImportContext* pContext = 0;
if( nPrefix == XML_NAMESPACE_CHART && IsXMLToken( rLocalName, XML_EQUATION ) )
{
pContext = new SchXMLEquationContext(
mrImportHelper, GetImport(), nPrefix, rLocalName, mxSeries, maChartSize, mrRegressionStyleList.back());
}
else
{
pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
}
return pContext;
}
SchXMLEquationContext::SchXMLEquationContext(
SchXMLImportHelper& rImpHelper,
SvXMLImport& rImport,
sal_uInt16 nPrefix,
const OUString& rLocalName,
const css::uno::Reference<
css::chart2::XDataSeries >& xSeries,
const awt::Size& rChartSize,
RegressionStyle& rRegressionStyle ) :
SvXMLImportContext( rImport, nPrefix, rLocalName ),
mrImportHelper( rImpHelper ),
mrRegressionStyle( rRegressionStyle ),
mxSeries( xSeries ),
maChartSize( rChartSize )
{}
SchXMLEquationContext::~SchXMLEquationContext()
{}
void SchXMLEquationContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
{
// parse attributes
sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
SchXMLImport& rImport = ( SchXMLImport& )GetImport();
const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetRegEquationAttrTokenMap();
OUString sAutoStyleName;
bool bShowEquation = true;
bool bShowRSquare = false;
awt::Point aPosition;
bool bHasXPos = false;
bool bHasYPos = false;
for( sal_Int16 i = 0; i < nAttrCount; i++ )
{
OUString sAttrName = xAttrList->getNameByIndex( i );
OUString aLocalName;
OUString aValue = xAttrList->getValueByIndex( i );
sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
{
case XML_TOK_REGEQ_POS_X:
rImport.GetMM100UnitConverter().convertMeasureToCore(
aPosition.X, aValue );
bHasXPos = true;
break;
case XML_TOK_REGEQ_POS_Y:
rImport.GetMM100UnitConverter().convertMeasureToCore(
aPosition.Y, aValue );
bHasYPos = true;
break;
case XML_TOK_REGEQ_DISPLAY_EQUATION:
::sax::Converter::convertBool(bShowEquation, aValue);
break;
case XML_TOK_REGEQ_DISPLAY_R_SQUARE:
::sax::Converter::convertBool(bShowRSquare, aValue);
break;
case XML_TOK_REGEQ_STYLE_NAME:
sAutoStyleName = aValue;
break;
}
}
if( !sAutoStyleName.isEmpty() || bShowEquation || bShowRSquare )
{
uno::Reference< beans::XPropertySet > xEqationProperties = chart2::RegressionEquation::create( comphelper::getProcessComponentContext() );
if( !sAutoStyleName.isEmpty() )
{
const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
if( pStylesCtxt )
{
const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
SchXMLImportHelper::GetChartFamilyID(), sAutoStyleName );
XMLPropStyleContext* pPropStyleContext =
const_cast< XMLPropStyleContext* >( dynamic_cast< const XMLPropStyleContext* >( pStyle ));
if( pPropStyleContext )
pPropStyleContext->FillPropertySet( xEqationProperties );
}
}
xEqationProperties->setPropertyValue( OUString( "ShowEquation"), uno::makeAny( bShowEquation ));
xEqationProperties->setPropertyValue( OUString( "ShowCorrelationCoefficient"), uno::makeAny( bShowRSquare ));
if( bHasXPos && bHasYPos )
{
chart2::RelativePosition aRelPos;
aRelPos.Primary = static_cast< double >( aPosition.X ) / static_cast< double >( maChartSize.Width );
aRelPos.Secondary = static_cast< double >( aPosition.Y ) / static_cast< double >( maChartSize.Height );
xEqationProperties->setPropertyValue( OUString( "RelativePosition" ), uno::makeAny( aRelPos ));
}
mrRegressionStyle.m_xEquationProperties.set( xEqationProperties );
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */