Import X errorbars.
Change-Id: I069271ad1c0f2fc5ec0854d6fb13aa0dc25be01d
diff --git a/xmloff/source/chart/PropertyMap.hxx b/xmloff/source/chart/PropertyMap.hxx
index f293b79..b295eed 100644
--- a/xmloff/source/chart/PropertyMap.hxx
+++ b/xmloff/source/chart/PropertyMap.hxx
@@ -182,6 +182,10 @@ const XMLPropertyMapEntry aXMLChartPropMap[] =
MAP_FULL( "MarkPosition", CHART, XML_TICK_MARK_POSITION, XML_SCH_TYPE_TICK_MARK_POSITION, 0, SvtSaveOptions::ODFVER_012 ),
// statistical properties
MAP_ENTRY_ODF_EXT( "ShowPositiveError", CHART, XML_ERROR_UPPER_INDICATOR, XML_TYPE_BOOL),
MAP_ENTRY_ODF_EXT( "ShowNegativeError", CHART, XML_ERROR_LOWER_INDICATOR, XML_TYPE_BOOL),
MAP_ENTRY( "MeanValue", CHART, XML_MEAN_VALUE, XML_TYPE_BOOL ),
MAP_ENTRY( "ErrorMargin", CHART, XML_ERROR_MARGIN, XML_TYPE_DOUBLE ),
MAP_ENTRY( "ConstantErrorLow", CHART, XML_ERROR_LOWER_LIMIT, XML_TYPE_DOUBLE ),
@@ -198,8 +202,6 @@ const XMLPropertyMapEntry aXMLChartPropMap[] =
MAP_ENTRY_ODF_EXT( "PositiveError", CHART, XML_ERROR_LOWER_LIMIT, XML_TYPE_DOUBLE),
MAP_ENTRY_ODF_EXT( "NegativeError", CHART, XML_ERROR_UPPER_LIMIT, XML_TYPE_DOUBLE),
MAP_ENTRY_ODF_EXT( "Weigth", CHART, XML_ERROR_STANDARD_WEIGTH, XML_TYPE_DOUBLE),
MAP_ENTRY_ODF_EXT( "ShowPositiveError", CHART, XML_ERROR_UPPER_INDICATOR, XML_TYPE_BOOL),
MAP_ENTRY_ODF_EXT( "ShowNegativeError", CHART, XML_ERROR_LOWER_INDICATOR, XML_TYPE_BOOL),
// series/data-point properties
MAP_SPECIAL( "DataCaption", CHART, XML_DATA_LABEL_NUMBER, XML_TYPE_NUMBER | MID_FLAG_MERGE_PROPERTY, XML_SCH_CONTEXT_SPECIAL_DATA_LABEL_NUMBER ), // convert one constant
diff --git a/xmloff/source/chart/SchXMLPlotAreaContext.cxx b/xmloff/source/chart/SchXMLPlotAreaContext.cxx
index 588d819..535e6d2 100644
--- a/xmloff/source/chart/SchXMLPlotAreaContext.cxx
+++ b/xmloff/source/chart/SchXMLPlotAreaContext.cxx
@@ -50,10 +50,14 @@
#include <com/sun/star/awt/Size.hpp>
#include <com/sun/star/chart/ChartDataRowSource.hpp>
#include <com/sun/star/chart/ChartErrorCategory.hpp>
#include <com/sun/star/chart/ChartErrorIndicatorType.hpp>
#include <com/sun/star/chart/ErrorBarStyle.hpp>
#include <com/sun/star/chart/X3DDisplay.hpp>
#include <com/sun/star/chart/XStatisticDisplay.hpp>
#include <com/sun/star/chart/XDiagramPositioning.hpp>
#include <com/sun/star/chart2/data/XDataSink.hpp>
#include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
#include <com/sun/star/chart2/XChartTypeContainer.hpp>
#include <com/sun/star/chart2/XDataSeriesContainer.hpp>
@@ -386,13 +390,6 @@ void SchXMLPlotAreaContext::StartElement( const uno::Reference< xml::sax::XAttri
mrSeriesDefaultsAndStyles.maSymbolTypeDefault = xProp->getPropertyValue(::rtl::OUString("SymbolType"));
mrSeriesDefaultsAndStyles.maDataCaptionDefault = xProp->getPropertyValue(::rtl::OUString("DataCaption"));
mrSeriesDefaultsAndStyles.maErrorIndicatorDefault = xProp->getPropertyValue(::rtl::OUString("ErrorIndicator"));
mrSeriesDefaultsAndStyles.maErrorCategoryDefault = xProp->getPropertyValue(::rtl::OUString("ErrorCategory"));
mrSeriesDefaultsAndStyles.maConstantErrorLowDefault = xProp->getPropertyValue(::rtl::OUString("ConstantErrorLow"));
mrSeriesDefaultsAndStyles.maConstantErrorHighDefault = xProp->getPropertyValue(::rtl::OUString("ConstantErrorHigh"));
mrSeriesDefaultsAndStyles.maPercentageErrorDefault = xProp->getPropertyValue(::rtl::OUString("PercentageError"));
mrSeriesDefaultsAndStyles.maErrorMarginDefault = xProp->getPropertyValue(::rtl::OUString("ErrorMargin"));
mrSeriesDefaultsAndStyles.maMeanValueDefault = xProp->getPropertyValue(::rtl::OUString("MeanValue"));
mrSeriesDefaultsAndStyles.maRegressionCurvesDefault = xProp->getPropertyValue(::rtl::OUString("RegressionCurves"));
@@ -971,12 +968,70 @@ void SchXMLStockContext::StartElement( const uno::Reference< xml::sax::XAttribut
// ========================================
void lcl_setErrorBarSequence ( const uno::Reference< chart2::XChartDocument > &xDoc,
const uno::Reference< beans::XPropertySet > &xBarProp,
const rtl::OUString &aRange,
bool bPositiveValue, bool bYError )
{
uno::Reference< com::sun::star::chart2::data::XDataProvider > xDataProvider(xDoc->getDataProvider());
uno::Reference< com::sun::star::chart2::data::XDataSource > xDataSource( xBarProp, uno::UNO_QUERY );
uno::Reference< com::sun::star::chart2::data::XDataSink > xDataSink( xDataSource, uno::UNO_QUERY );
assert( xDataSink.is() && xDataSource.is() && xDataProvider.is() );
rtl::OUString aXMLRange(lcl_ConvertRange(aRange,xDoc));
uno::Reference< chart2::data::XDataSequence > xNewSequence(
xDataProvider->createDataSequenceByRangeRepresentation( aRange ));
if( xNewSequence.is())
{
SchXMLTools::setXMLRangePropertyAtDataSequence(xNewSequence,aXMLRange);
rtl::OUStringBuffer aRoleBuffer("error-bars-");
if( bYError )
aRoleBuffer.append( sal_Unicode( 'y' ));
else
aRoleBuffer.append( sal_Unicode( 'x' ));
rtl::OUString aPlainRole = aRoleBuffer.makeStringAndClear();
aRoleBuffer.append( aPlainRole );
aRoleBuffer.append( sal_Unicode( '-' ));
if( bPositiveValue )
aRoleBuffer = aRoleBuffer.appendAscii( "positive" );
else
aRoleBuffer = aRoleBuffer.appendAscii( "negative" );
rtl::OUString aRole = aRoleBuffer.makeStringAndClear();
Reference< beans::XPropertySet > xSeqProp( xNewSequence, uno::UNO_QUERY );
xSeqProp->setPropertyValue("Role", uno::makeAny( aRole ));
Reference< lang::XMultiServiceFactory > xFact( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
Reference< chart2::data::XLabeledDataSequence > xLabelSeq(
xFact->createInstance("com.sun.star.chart2.data.LabeledDataSequence"), uno::UNO_QUERY );
xLabelSeq->setValues( xNewSequence );
uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences(
xDataSource->getDataSequences());
aSequences.realloc( aSequences.getLength() + 1 );
aSequences[ aSequences.getLength() - 1 ] = xLabelSeq;
xDataSink->setData( aSequences );
}
}
SchXMLStatisticsObjectContext::SchXMLStatisticsObjectContext(
SchXMLImportHelper& rImpHelper,
SvXMLImport& rImport,
sal_uInt16 nPrefix,
const rtl::OUString& rLocalName,
const rtl::OUString &rSeriesStyleName,
::std::list< DataRowPointStyle >& rStyleList,
const ::com::sun::star::uno::Reference<
::com::sun::star::chart2::XDataSeries >& xSeries,
@@ -988,7 +1043,8 @@ SchXMLStatisticsObjectContext::SchXMLStatisticsObjectContext(
mrStyleList( rStyleList ),
m_xSeries( xSeries ),
meContextType( eContextType ),
maChartSize( rChartSize )
maChartSize( rChartSize ),
maSeriesStyleName( rSeriesStyleName)
{}
SchXMLStatisticsObjectContext::~SchXMLStatisticsObjectContext()
@@ -1000,6 +1056,9 @@ void SchXMLStatisticsObjectContext::StartElement( const uno::Reference< xml::sax
sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
::rtl::OUString aValue;
::rtl::OUString sAutoStyleName;
rtl::OUString aPosRange;
rtl::OUString aNegRange;
bool bYError = true; /// Default errorbar, to be backward compatible with older files!
for( sal_Int16 i = 0; i < nAttrCount; i++ )
{
@@ -1011,6 +1070,12 @@ void SchXMLStatisticsObjectContext::StartElement( const uno::Reference< xml::sax
{
if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
sAutoStyleName = xAttrList->getValueByIndex( i );
else if( IsXMLToken( aLocalName, XML_DIMENSION ) )
bYError = xAttrList->getValueByIndex(i) == "y";
else if( IsXMLToken( aLocalName, XML_ERROR_UPPER_RANGE) )
aPosRange = xAttrList->getValueByIndex(i);
else if( IsXMLToken( aLocalName, XML_ERROR_LOWER_RANGE) )
aNegRange = xAttrList->getValueByIndex(i);
}
}
@@ -1018,21 +1083,109 @@ void SchXMLStatisticsObjectContext::StartElement( const uno::Reference< xml::sax
// auto-style set, because they can contain an equation
if( !sAutoStyleName.isEmpty() || meContextType == CONTEXT_TYPE_REGRESSION_CURVE )
{
DataRowPointStyle::StyleType eType = DataRowPointStyle::MEAN_VALUE;
DataRowPointStyle aStyle( DataRowPointStyle::MEAN_VALUE, m_xSeries, -1, 1, sAutoStyleName );
switch( meContextType )
{
case CONTEXT_TYPE_MEAN_VALUE_LINE:
eType = DataRowPointStyle::MEAN_VALUE;
aStyle.meType = DataRowPointStyle::MEAN_VALUE;
break;
case CONTEXT_TYPE_REGRESSION_CURVE:
eType = DataRowPointStyle::REGRESSION;
aStyle.meType = DataRowPointStyle::REGRESSION;
break;
case CONTEXT_TYPE_ERROR_INDICATOR:
eType = DataRowPointStyle::ERROR_INDICATOR;
{
aStyle.meType = DataRowPointStyle::ERROR_INDICATOR;
;
uno::Reference< lang::XMultiServiceFactory > xFact( comphelper::getProcessServiceFactory(),
uno::UNO_QUERY );
uno::Reference< beans::XPropertySet > xBarProp( xFact->createInstance("com.sun.star.chart2.ErrorBar" ),
uno::UNO_QUERY );
xBarProp->setPropertyValue("ErrorBarStyle",uno::makeAny(com::sun::star::chart::ErrorBarStyle::NONE));
xBarProp->setPropertyValue("PositiveError",uno::makeAny(static_cast<double>(0.0)));
xBarProp->setPropertyValue("NegativeError",uno::makeAny(static_cast<double>(0.0)));
xBarProp->setPropertyValue("Weight",uno::makeAny(static_cast<double>(1.0)));
xBarProp->setPropertyValue("ShowPositiveError",uno::makeAny(sal_True));
xBarProp->setPropertyValue("ShowNegativeError",uno::makeAny(sal_True));
const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
mrImportHelper.GetChartFamilyID(), sAutoStyleName );
// note: SvXMLStyleContext::FillPropertySet is not const
XMLPropStyleContext * pErrorStyleContext =
const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
pErrorStyleContext->FillPropertySet( xBarProp );
uno::Reference< chart2::XChartDocument > xDoc(GetImport().GetModel(),uno::UNO_QUERY);
if (!aPosRange.isEmpty())
lcl_setErrorBarSequence(xDoc,xBarProp,aPosRange,true,bYError);
if (!aNegRange.isEmpty())
lcl_setErrorBarSequence(xDoc,xBarProp,aNegRange,false,bYError);
if ( !bYError )
{
aStyle.m_xErrorXProperties.set( xBarProp );
}
else
{
/// Keep 0DF12 and below support
pStyle = pStylesCtxt->FindStyleChildContext(mrImportHelper.GetChartFamilyID(),
maSeriesStyleName);
XMLPropStyleContext * pSeriesStyleContext =
const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
uno::Any aAny = SchXMLTools::getPropertyFromContext("ErrorBarStyle",
pSeriesStyleContext,pStylesCtxt);
if ( aAny.hasValue() )
{
sal_Int32 aBarStyle = com::sun::star::chart::ErrorBarStyle::NONE;
aAny >>= aBarStyle;
aAny = SchXMLTools::getPropertyFromContext("ShowPositiveError",
pSeriesStyleContext,pStylesCtxt);
xBarProp->setPropertyValue("ShowPositiveError",aAny);
aAny = SchXMLTools::getPropertyFromContext("ShowNegativeError",
pSeriesStyleContext,pStylesCtxt);
xBarProp->setPropertyValue("ShowNegativeError",aAny);
switch(aBarStyle)
{
case com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN:
{
aAny = SchXMLTools::getPropertyFromContext("NegativeError",
pSeriesStyleContext,pStylesCtxt);
xBarProp->setPropertyValue("NegativeError",aAny);
aAny = SchXMLTools::getPropertyFromContext("PositiveError",
pSeriesStyleContext,pStylesCtxt);
xBarProp->setPropertyValue("PositiveError",aAny);
}
break;
default:
break;
}
}
aStyle.m_xErrorYProperties.set( xBarProp );
}
}
break;
}
DataRowPointStyle aStyle(
eType, m_xSeries, -1, 1, sAutoStyleName );
mrStyleList.push_back( aStyle );
}
}
diff --git a/xmloff/source/chart/SchXMLPlotAreaContext.hxx b/xmloff/source/chart/SchXMLPlotAreaContext.hxx
index 92a8b48..7308e69 100644
--- a/xmloff/source/chart/SchXMLPlotAreaContext.hxx
+++ b/xmloff/source/chart/SchXMLPlotAreaContext.hxx
@@ -276,6 +276,7 @@ public:
SvXMLImport& rImport,
sal_uInt16 nPrefix,
const rtl::OUString& rLocalName,
const rtl::OUString &rSeriesStyleName,
::std::list< DataRowPointStyle >& rStyleList,
const ::com::sun::star::uno::Reference<
::com::sun::star::chart2::XDataSeries >& xSeries,
@@ -297,6 +298,7 @@ private:
::com::sun::star::chart2::XDataSeries > m_xSeries;
ContextType meContextType;
::com::sun::star::awt::Size maChartSize;
rtl::OUString maSeriesStyleName;
};
// ----------------------------------------
diff --git a/xmloff/source/chart/SchXMLSeries2Context.cxx b/xmloff/source/chart/SchXMLSeries2Context.cxx
index 8e50d4a..26f10f0 100644
--- a/xmloff/source/chart/SchXMLSeries2Context.cxx
+++ b/xmloff/source/chart/SchXMLSeries2Context.cxx
@@ -658,7 +658,7 @@ SvXMLImportContext* SchXMLSeries2Context::CreateChildContext(
case XML_TOK_SERIES_MEAN_VALUE_LINE:
pContext = new SchXMLStatisticsObjectContext(
mrImportHelper, GetImport(),
nPrefix, rLocalName,
nPrefix, rLocalName, msAutoStyleName,
mrStyleList, m_xSeries,
SchXMLStatisticsObjectContext::CONTEXT_TYPE_MEAN_VALUE_LINE,
maChartSize );
@@ -666,7 +666,7 @@ SvXMLImportContext* SchXMLSeries2Context::CreateChildContext(
case XML_TOK_SERIES_REGRESSION_CURVE:
pContext = new SchXMLStatisticsObjectContext(
mrImportHelper, GetImport(),
nPrefix, rLocalName,
nPrefix, rLocalName, msAutoStyleName,
mrStyleList, m_xSeries,
SchXMLStatisticsObjectContext::CONTEXT_TYPE_REGRESSION_CURVE,
maChartSize );
@@ -674,7 +674,7 @@ SvXMLImportContext* SchXMLSeries2Context::CreateChildContext(
case XML_TOK_SERIES_ERROR_INDICATOR:
pContext = new SchXMLStatisticsObjectContext(
mrImportHelper, GetImport(),
nPrefix, rLocalName,
nPrefix, rLocalName, msAutoStyleName,
mrStyleList, m_xSeries,
SchXMLStatisticsObjectContext::CONTEXT_TYPE_ERROR_INDICATOR,
maChartSize );
@@ -878,6 +878,17 @@ void SchXMLSeries2Context::setStylesToStatisticsObjects( SeriesDefaultsAndStyles
iStyle->meType == DataRowPointStyle::ERROR_INDICATOR ||
iStyle->meType == DataRowPointStyle::MEAN_VALUE )
{
if ( iStyle->meType == DataRowPointStyle::ERROR_INDICATOR )
{
uno::Reference< beans::XPropertySet > xNewSeriesProp(iStyle->m_xSeries,uno::UNO_QUERY);
if (iStyle->m_xErrorXProperties.is())
xNewSeriesProp->setPropertyValue("ErrorBarX",uno::makeAny(iStyle->m_xErrorXProperties));
if (iStyle->m_xErrorYProperties.is())
xNewSeriesProp->setPropertyValue("ErrorBarY",uno::makeAny(iStyle->m_xErrorYProperties));
}
try
{
uno::Reference< beans::XPropertySet > xSeriesProp( iStyle->m_xOldAPISeries );
diff --git a/xmloff/source/chart/SchXMLSeries2Context.hxx b/xmloff/source/chart/SchXMLSeries2Context.hxx
index 0bb17b0..4699de4 100644
--- a/xmloff/source/chart/SchXMLSeries2Context.hxx
+++ b/xmloff/source/chart/SchXMLSeries2Context.hxx
@@ -119,7 +119,7 @@ public:
static void setStylesToStatisticsObjects( SeriesDefaultsAndStyles& rSeriesDefaultsAndStyles
, const SvXMLStylesContext* pStylesCtxt
, const SvXMLStyleContext*& rpStyle
, ::rtl::OUString& rCurrStyleName );
, rtl::OUString &rCurrStyleName );
static void setStylesToDataPoints( SeriesDefaultsAndStyles& rSeriesDefaultsAndStyles
, const SvXMLStylesContext* pStylesCtxt
diff --git a/xmloff/source/chart/transporttypes.hxx b/xmloff/source/chart/transporttypes.hxx
index 7ecf086..be60fcd 100644
--- a/xmloff/source/chart/transporttypes.hxx
+++ b/xmloff/source/chart/transporttypes.hxx
@@ -176,6 +176,10 @@ struct DataRowPointStyle
::com::sun::star::chart2::XDataSeries > m_xSeries;
::com::sun::star::uno::Reference<
::com::sun::star::beans::XPropertySet > m_xOldAPISeries;
com::sun::star::uno::Reference<
com::sun::star::beans::XPropertySet > m_xErrorXProperties;
com::sun::star::uno::Reference<
com::sun::star::beans::XPropertySet > m_xErrorYProperties;
::com::sun::star::uno::Reference<
::com::sun::star::beans::XPropertySet > m_xEquationProperties;
sal_Int32 m_nPointIndex;