diff --git a/components/fpspreadsheet/source/common/xlsxooxmlchart.pas b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas index 2bb92ce6b..e815a9c7d 100644 --- a/components/fpspreadsheet/source/common/xlsxooxmlchart.pas +++ b/components/fpspreadsheet/source/common/xlsxooxmlchart.pas @@ -154,6 +154,7 @@ const DEFAULT_FONT_NAME = 'Liberation Sans'; FALSE_TRUE: Array[boolean] of String = ('0', '1'); + LEGEND_POS: Array[TsChartLegendPosition] of string = ('r', 't', 'b', 'l'); {$INCLUDE xlsxooxmlchart_hatch.inc} @@ -1064,6 +1065,7 @@ procedure TsSpreadOOXMLChartReader.ReadChartLegend(ANode: TDOMNode; var nodeName, s: String; dummy: Single; + lp: TsChartLegendPosition; begin if ANode = nil then exit; @@ -1076,12 +1078,12 @@ begin 'c:legendPos': begin s := GetAttrValue(ANode, 'val'); - case s of - 't': AChartLegend.Position := lpTop; - 'b': AChartLegend.Position := lpBottom; - 'l': AChartLegend.Position := lpLeft; - 'r': AChartLegend.Position := lpRight; - end; + for lp in TsChartLegendPosition do + if s = LEGEND_POS[lp] then + begin + AChartLegend.Position := lp; + break; + end; end; // Formatting of individual legend items, not supported @@ -3571,11 +3573,11 @@ begin AppendToStream(AStream, indent + '' + LE + indent + ' ' + LE + -// indent + ' ' + LE + + indent + ' ' + LE + indent + ' ' + LE + - indent + ' ' + LE + + indent + ' ' + LE + GetChartFontXML(AIndent + 6, AFont, 'a:defRPr') + LE + - indent + ' ' + LE + + indent + ' ' + LE + indent + ' ' + LE + indent + '' + LE ); @@ -3592,28 +3594,49 @@ procedure TsSpreadOOXMLChartWriter.WriteChartLegendNode(AStream: TStream; AIndent: Integer; ALegend: TsChartLegend); var indent: String; + indent2: String; + overlay: String = ''; + legendPos: String = ''; + formatStr: String = ''; + fontStr: String = ''; begin if not ALegend.Visible then exit; indent := DupeString(' ', AIndent); + indent2 := indent + ' '; + // Legend position + legendPos := indent2 + Format('', [LEGEND_POS[ALegend.Position]]) + LE; + + // Inside/outside plot area? + overlay := indent2 + Format('', [FALSE_TRUE[ALegend.CanOverlapPlotArea]]) + LE; + + // Background and border formatting + formatStr := + indent2 + '' + LE + + GetChartFillAndLineXML(AIndent + 4, ALegend.Chart, ALegend.Background, ALegend.Border) + LE + + indent2 + '' + LE; + + // Font of text items + fontStr := + indent2 + '' + LE + + indent2 + ' ' + LE + + indent2 + ' ' + LE + + indent2 + ' ' + LE + + indent2 + ' ' + LE + + GetChartFontXML(AIndent + 6, ALegend.Font, 'a:defRPr') + LE + + indent2 + ' ' + LE + + indent2 + ' ' + LE + + indent2 + '' + LE; + + // Write out AppendToStream(AStream, indent + '' + LE + - indent + ' ' + LE + - indent + ' ' + LE + - indent + ' ' + LE + - GetChartFillAndLineXML(AIndent + 4, ALegend.Chart, ALegend.Background, ALegend.Border) + LE + - indent + ' ' + LE + - indent + ' ' + LE + - indent + ' ' + LE + - indent + ' ' + LE + - indent + ' ' + LE + - indent + ' ' + LE + - GetChartFontXML(AIndent + 8, ALegend.Font, 'a:defRPr') + LE + - indent + ' ' + LE + - indent + ' ' + LE + - indent + ' ' + LE + + legendPos + + overlay + + formatStr + + fontStr + indent + '' + LE ); end;