From 1f99cf0ccfee9c58f46d766f41137bdf61be2b76 Mon Sep 17 00:00:00 2001 From: ask Date: Mon, 24 Jan 2011 08:51:05 +0000 Subject: [PATCH] TAChart: Support multi-line mark labels git-svn-id: trunk@29183 - --- components/tachart/tadrawutils.pas | 55 ++++++++++++++++++++++++++++-- components/tachart/tatypes.pas | 8 ++--- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/components/tachart/tadrawutils.pas b/components/tachart/tadrawutils.pas index 87957afc4f..3c1c32977d 100644 --- a/components/tachart/tadrawutils.pas +++ b/components/tachart/tadrawutils.pas @@ -21,7 +21,7 @@ unit TADrawUtils; interface uses - Classes, Graphics, SysUtils; + Classes, Graphics, SysUtils, Types; const Colors: array [1..15] of TColor = ( @@ -48,6 +48,9 @@ type procedure DrawLineDepth(ACanvas: TCanvas; AX1, AY1, AX2, AY2, ADepth: Integer); procedure DrawLineDepth(ACanvas: TCanvas; const AP1, AP2: TPoint; ADepth: Integer); +function MultiLineTextExtent(ACanvas: TCanvas; const AText: String): TPoint; +procedure MultiLineTextOut(ACanvas: TCanvas; APos: TPoint; const AText: String); + procedure PrepareSimplePen(ACanvas: TCanvas; AColor: TColor); procedure PrepareXorPen(ACanvas: TCanvas); @@ -56,7 +59,7 @@ function TypicalTextHeight(ACanvas: TCanvas): Integer; implementation uses - Types, TAChartUtils; + Math, TAChartUtils; procedure DrawLineDepth(ACanvas: TCanvas; AX1, AY1, AX2, AY2, ADepth: Integer); begin @@ -72,6 +75,54 @@ begin ACanvas.Polygon([AP1, AP1 + d, AP2 + d, AP2]); end; +const + LINE_INTERVAL = 2; + +function MultiLineTextExtent(ACanvas: TCanvas; const AText: String): TPoint; +var + sl: TStrings; + i: Integer; +begin + if Pos(LineEnding, AText) = 0 then + exit(ACanvas.TextExtent(AText)); + sl := TStringList.Create; + try + sl.Text := AText; + Result := Size(0, -LINE_INTERVAL); + for i := 0 to sl.Count - 1 do + with ACanvas.TextExtent(sl[i]) do begin + Result.X := Max(Result.X, cx); + Result.Y += cy + LINE_INTERVAL; + end; + finally + sl.Free; + end; +end; + +procedure MultiLineTextOut(ACanvas: TCanvas; APos: TPoint; const AText: String); +var + sl: TStrings; + i, h: Integer; + a: Double; +begin + if Pos(LineEnding, AText) = 0 then begin + ACanvas.TextOut(APos.X, APos.Y, AText); + exit; + end; + a := -OrientToRad(ACanvas.Font.Orientation); + sl := TStringList.Create; + try + sl.Text := AText; + for i := 0 to sl.Count - 1 do begin + ACanvas.TextOut(APos.X, APos.Y, sl[i]); + h := ACanvas.TextHeight(sl[i]) + LINE_INTERVAL; + APos += RotatePoint(Point(0, h), a); + end; + finally + sl.Free; + end; +end; + procedure PrepareSimplePen(ACanvas: TCanvas; AColor: TColor); begin with ACanvas.Pen do begin diff --git a/components/tachart/tatypes.pas b/components/tachart/tatypes.pas index 9b0cb2e164..a6762e4808 100644 --- a/components/tachart/tatypes.pas +++ b/components/tachart/tatypes.pas @@ -308,7 +308,7 @@ type implementation uses - TACustomSource; + TACustomSource, TADrawUtils; { TChartPen } @@ -511,7 +511,7 @@ var i: Integer; begin PutLabelFontTo(ACanvas); - ptText := ACanvas.TextExtent(AText); + ptText := MultiLineTextExtent(ACanvas, AText); labelPoly := GetLabelPolygon(ptText); for i := 0 to High(labelPoly) do labelPoly[i] += ALabelCenter; @@ -537,7 +537,7 @@ begin end; ptText := RotatePoint(-ptText div 2, LabelAngle) + ALabelCenter; - ACanvas.TextOut(ptText.X, ptText.Y, AText); + MultiLineTextOut(ACanvas, ptText, AText); if wasClipping then ACanvas.Clipping := true; end; @@ -588,7 +588,7 @@ var sz: TPoint; begin PutLabelFontTo(ACanvas); - sz := ACanvas.TextExtent(AText); + sz := MultiLineTextExtent(ACanvas, AText); if IsMarginRequired then sz += Point(MARKS_MARGIN_X, MARKS_MARGIN_Y) * 2; Result := MeasureRotatedRect(sz, LabelAngle);