TAChart: Add TChartTool.Draw and TChartTool.DrawingMode. Publish DrawingMode property for TZoomDragTool.

git-svn-id: trunk@31964 -
This commit is contained in:
ask 2011-08-12 17:25:57 +00:00
parent cba541db5e
commit f1e69d3d5f
2 changed files with 63 additions and 7 deletions

View File

@ -111,6 +111,7 @@ type
function Dispatch(
AChart: TChart; AEventId: TChartToolEventId;
AShift: TShiftState; APoint: TPoint): Boolean; virtual; abstract; overload;
procedure Draw(AChart: TChart; ADrawer: IChartDrawer); virtual; abstract;
end;
TBasicChartSeriesEnumerator = class(TFPListEnumerator)
@ -297,6 +298,7 @@ type
function SaveToImage(AClass: TRasterImageClass): TRasterImage;
procedure StyleChanged(Sender: TObject); override;
procedure ZoomFull; override;
property Drawer: IChartDrawer read FDrawer;
public // Coordinate conversion
function GraphToImage(const AGraphPoint: TDoublePoint): TPoint;
@ -746,6 +748,7 @@ begin
ldd.FItems.Free;
end;
DrawReticule(ADrawer);
GetToolset.Draw(Self, ADrawer);
for s in Series do
s.AfterDraw;

View File

@ -23,7 +23,7 @@ interface
uses
Classes, Controls, CustomTimer, Types,
TAChartUtils, TAGraph, TATypes;
TAChartUtils, TADrawUtils, TAGraph, TATypes;
type
@ -32,11 +32,14 @@ type
TChartToolEvent = procedure (ATool: TChartTool; APoint: TPoint) of object;
TChartToolDrawingMode = (tdmDefault, tdmNormal, tdmXor);
{ TChartTool }
TChartTool = class(TBasicChartTool)
strict private
FActiveCursor: TCursor;
FDrawingMode: TChartToolDrawingMode;
FEnabled: Boolean;
FEventsAfter: array [TChartToolEventId] of TChartToolEvent;
FEventsBefore: array [TChartToolEventId] of TChartToolEvent;
@ -48,10 +51,13 @@ type
procedure SetActiveCursor(AValue: TCursor);
procedure SetAfterEvent(AIndex: Integer; AValue: TChartToolEvent);
procedure SetBeforeEvent(AIndex: Integer; AValue: TChartToolEvent);
procedure SetDrawingMode(AValue: TChartToolDrawingMode);
procedure SetToolset(AValue: TChartToolset);
protected
procedure ReadState(Reader: TReader); override;
procedure SetParentComponent(AParent: TComponent); override;
property DrawingMode: TChartToolDrawingMode
read FDrawingMode write SetDrawingMode default tdmDefault;
strict protected
procedure Activate; override;
procedure Deactivate; override;
@ -68,13 +74,15 @@ type
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
public
function GetParentComponent: TComponent; override;
function HasParent: Boolean; override;
public
procedure Assign(Source: TPersistent); override;
procedure Dispatch(
AChart: TChart; AEventId: TChartToolEventId; APoint: TPoint); overload;
function GetParentComponent: TComponent; override;
procedure Draw(AChart: TChart; ADrawer: IChartDrawer); virtual;
procedure Handled;
function HasParent: Boolean; override;
property ActiveCursor: TCursor
read FActiveCursor write SetActiveCursor default crDefault;
@ -137,6 +145,7 @@ type
function Dispatch(
AChart: TChart; AEventId: TChartToolEventId;
AShift: TShiftState; APoint: TPoint): Boolean; override;
procedure Draw(AChart: TChart; ADrawer: IChartDrawer); override;
property Item[AIndex: Integer]: TChartTool read GetItem; default;
published
property Tools: TChartTools read FTools;
@ -185,7 +194,10 @@ type
procedure MouseDown(APoint: TPoint); override;
procedure MouseMove(APoint: TPoint); override;
procedure MouseUp(APoint: TPoint); override;
public
procedure Draw(AChart: TChart; ADrawer: IChartDrawer); override;
published
property DrawingMode;
property Proportional: Boolean
read GetProportional write SetProportional stored false default false;
deprecated;
@ -566,6 +578,12 @@ begin
ev(Self, APoint);
end;
procedure TChartTool.Draw(AChart: TChart; ADrawer: IChartDrawer);
begin
Unused(ADrawer);
FChart := AChart;
end;
function TChartTool.GetAfterEvent(AIndex: Integer): TChartToolEvent;
begin
Result := FEventsAfter[TChartToolEventId(AIndex)];
@ -669,6 +687,12 @@ begin
FChart.Cursor := ActiveCursor;
end;
procedure TChartTool.SetDrawingMode(AValue: TChartToolDrawingMode);
begin
if FDrawingMode = AValue then exit;
FDrawingMode := AValue;
end;
procedure TChartTool.SetIndex(AValue: Integer);
begin
Toolset.Tools.Move(Index, EnsureRange(AValue, 0, Toolset.Tools.Count - 1));
@ -749,6 +773,14 @@ begin
Result := false;
end;
procedure TChartToolset.Draw(AChart: TChart; ADrawer: IChartDrawer);
var
t: TChartTool;
begin
for t in Tools do
t.Draw(AChart, ADrawer);
end;
procedure TChartToolset.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
t: TChartTool;
@ -849,6 +881,19 @@ end;
{ TZoomDragTool }
procedure TZoomDragTool.Draw(AChart: TChart; ADrawer: IChartDrawer);
begin
if not IsActive or IsAnimating then exit;
inherited;
case DrawingMode of
tdmDefault, tdmXor:
PrepareXorPen(FChart.Canvas);
tdmNormal:
FChart.Drawer.PrepareSimplePen($0);
end;
FChart.Drawer.Rectangle(FSelectionRect);
end;
function TZoomDragTool.GetProportional: Boolean;
begin
Result := RatioLimit = zrlProportional;
@ -866,10 +911,18 @@ end;
procedure TZoomDragTool.MouseMove(APoint: TPoint);
begin
if not IsActive or IsAnimating then exit;
PrepareXorPen(FChart.Canvas);
FChart.Canvas.Rectangle(FSelectionRect);
FSelectionRect.BottomRight := APoint;
FChart.Canvas.Rectangle(FSelectionRect);
case DrawingMode of
tdmDefault, tdmXor: begin
PrepareXorPen(FChart.Canvas);
FChart.Canvas.Rectangle(FSelectionRect);
FSelectionRect.BottomRight := APoint;
FChart.Canvas.Rectangle(FSelectionRect);
end;
tdmNormal: begin
FSelectionRect.BottomRight := APoint;
FChart.StyleChanged(Self);
end;
end;
Handled;
end;