Kaydet (Commit) 7b807390 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Ensure we export correct labal placement value for percent/stacked charts.

Normal charts allow a variety of label placement options, but percent/stacked
charts only allow three variants, and exporting a wrong value would trigger
MS Office to think the file is corrupt.

Change-Id: I8bdc1dc072b29e8df2c506b6b16c61279df12045
üst 3119e04b
...@@ -86,6 +86,7 @@ ...@@ -86,6 +86,7 @@
#include <xmloff/SchXMLSeriesHelper.hxx> #include <xmloff/SchXMLSeriesHelper.hxx>
#include "ColorPropertySet.hxx" #include "ColorPropertySet.hxx"
#include <set> #include <set>
#include <boost/unordered_set.hpp>
#include <rtl/math.hxx> #include <rtl/math.hxx>
...@@ -443,6 +444,8 @@ ChartExport::ChartExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, Reference< f ...@@ -443,6 +444,8 @@ ChartExport::ChartExport( sal_Int32 nXmlNamespace, FSHelperPtr pFS, Reference< f
, mbHasCategoryLabels( false ) , mbHasCategoryLabels( false )
, mbHasZAxis( false ) , mbHasZAxis( false )
, mbIs3DChart( false ) , mbIs3DChart( false )
, mbStacked(false)
, mbPercent(false)
{ {
} }
...@@ -2540,9 +2543,24 @@ struct LabelPlacementParam ...@@ -2540,9 +2543,24 @@ struct LabelPlacementParam
bool mbExport; bool mbExport;
sal_Int32 meDefault; sal_Int32 meDefault;
boost::unordered_set<sal_Int32> maAllowedValues;
LabelPlacementParam() : LabelPlacementParam() :
mbExport(true), mbExport(true),
meDefault(css::chart::DataLabelPlacement::OUTSIDE) {} meDefault(css::chart::DataLabelPlacement::OUTSIDE) {}
void allowAll()
{
maAllowedValues.insert(css::chart::DataLabelPlacement::OUTSIDE);
maAllowedValues.insert(css::chart::DataLabelPlacement::INSIDE);
maAllowedValues.insert(css::chart::DataLabelPlacement::CENTER);
maAllowedValues.insert(css::chart::DataLabelPlacement::NEAR_ORIGIN);
maAllowedValues.insert(css::chart::DataLabelPlacement::TOP);
maAllowedValues.insert(css::chart::DataLabelPlacement::BOTTOM);
maAllowedValues.insert(css::chart::DataLabelPlacement::LEFT);
maAllowedValues.insert(css::chart::DataLabelPlacement::RIGHT);
maAllowedValues.insert(css::chart::DataLabelPlacement::AVOID_OVERLAP);
}
}; };
const char* toOOXMLPlacement( sal_Int32 nPlacement ) const char* toOOXMLPlacement( sal_Int32 nPlacement )
...@@ -2597,7 +2615,11 @@ void writeLabelProperties( ...@@ -2597,7 +2615,11 @@ void writeLabelProperties(
{ {
sal_Int32 nLabelPlacement = rLabelParam.meDefault; sal_Int32 nLabelPlacement = rLabelParam.meDefault;
if (xPropSet->getPropertyValue("LabelPlacement") >>= nLabelPlacement) if (xPropSet->getPropertyValue("LabelPlacement") >>= nLabelPlacement)
{
if (!rLabelParam.maAllowedValues.count(nLabelPlacement))
nLabelPlacement = rLabelParam.meDefault;
pFS->singleElement(FSNS(XML_c, XML_dLblPos), XML_val, toOOXMLPlacement(nLabelPlacement), FSEND); pFS->singleElement(FSNS(XML_c, XML_dLblPos), XML_val, toOOXMLPlacement(nLabelPlacement), FSEND);
}
} }
pFS->singleElement(FSNS(XML_c, XML_showLegendKey), XML_val, BS(aLabel.ShowLegendSymbol), FSEND); pFS->singleElement(FSNS(XML_c, XML_showLegendKey), XML_val, BS(aLabel.ShowLegendSymbol), FSEND);
...@@ -2633,6 +2655,7 @@ void ChartExport::exportDataLabels( ...@@ -2633,6 +2655,7 @@ void ChartExport::exportDataLabels(
LabelPlacementParam aParam; LabelPlacementParam aParam;
aParam.mbExport = !mbIs3DChart; aParam.mbExport = !mbIs3DChart;
aParam.meDefault = rInfo.mnDefLabelPos; aParam.meDefault = rInfo.mnDefLabelPos;
aParam.allowAll();
switch (getChartType()) // diagram chart type switch (getChartType()) // diagram chart type
{ {
case chart::TYPEID_PIE: case chart::TYPEID_PIE:
...@@ -2641,9 +2664,18 @@ void ChartExport::exportDataLabels( ...@@ -2641,9 +2664,18 @@ void ChartExport::exportDataLabels(
break; break;
case chart::TYPEID_DOUGHNUT: case chart::TYPEID_DOUGHNUT:
case chart::TYPEID_AREA: case chart::TYPEID_AREA:
// Doughnut charts don't support label placement. // Doughnut and area charts don't support label placement.
aParam.mbExport = false; aParam.mbExport = false;
break; break;
case chart::TYPEID_BAR:
if (mbStacked || mbPercent)
{
aParam.maAllowedValues.clear();
aParam.maAllowedValues.insert(css::chart::DataLabelPlacement::CENTER);
aParam.maAllowedValues.insert(css::chart::DataLabelPlacement::INSIDE);
aParam.maAllowedValues.insert(css::chart::DataLabelPlacement::NEAR_ORIGIN);
aParam.meDefault = css::chart::DataLabelPlacement::CENTER;
}
default: default:
; ;
} }
...@@ -2768,17 +2800,15 @@ void ChartExport::exportGrouping( bool isBar ) ...@@ -2768,17 +2800,15 @@ void ChartExport::exportGrouping( bool isBar )
FSHelperPtr pFS = GetFS(); FSHelperPtr pFS = GetFS();
Reference< XPropertySet > xPropSet( mxDiagram , uno::UNO_QUERY); Reference< XPropertySet > xPropSet( mxDiagram , uno::UNO_QUERY);
// grouping // grouping
bool bStacked = false;
if( GetProperty( xPropSet, "Stacked" ) ) if( GetProperty( xPropSet, "Stacked" ) )
mAny >>= bStacked; mAny >>= mbStacked;
bool bPercentage = false;
if( GetProperty( xPropSet, "Percent" ) ) if( GetProperty( xPropSet, "Percent" ) )
mAny >>= bPercentage; mAny >>= mbPercent;
const char* grouping = NULL; const char* grouping = NULL;
if( bStacked ) if (mbStacked)
grouping = "stacked"; grouping = "stacked";
else if( bPercentage ) else if (mbPercent)
grouping = "percentStacked"; grouping = "percentStacked";
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment