TAChart: Add KeyDown/KeyUp events to chart tools

git-svn-id: trunk@31139 -
This commit is contained in:
ask 2011-06-09 08:52:01 +00:00
parent 3ecaf59d72
commit 5cf87bd0ee
2 changed files with 91 additions and 36 deletions

View File

@ -91,8 +91,6 @@ type
TSeriesClass = class of TBasicChartSeries; TSeriesClass = class of TBasicChartSeries;
TChartToolEvent = procedure (AChart: TChart; AX, AY: Integer) of object;
{ TBasicСhartTool } { TBasicСhartTool }
TBasicChartTool = class(TIndexedComponent) TBasicChartTool = class(TIndexedComponent)
@ -103,7 +101,8 @@ type
procedure Deactivate; virtual; procedure Deactivate; virtual;
end; end;
TChartToolEventId = (evidMouseDown, evidMouseMove, evidMouseUp); TChartToolEventId = (
evidKeyDown, evidKeyUp, evidMouseDown, evidMouseMove, evidMouseUp);
{ TBasicChartToolset } { TBasicChartToolset }
@ -240,6 +239,8 @@ type
procedure Clear(ADrawer: IChartDrawer; const ARect: TRect); procedure Clear(ADrawer: IChartDrawer; const ARect: TRect);
procedure DisplaySeries(ADrawer: IChartDrawer); procedure DisplaySeries(ADrawer: IChartDrawer);
procedure DrawBackWall(ADrawer: IChartDrawer); procedure DrawBackWall(ADrawer: IChartDrawer);
procedure KeyDownAfterInterface(var AKey: Word; AShift: TShiftState); override;
procedure KeyUpAfterInterface(var AKey: Word; AShift: TShiftState); override;
procedure MouseDown( procedure MouseDown(
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
@ -980,7 +981,26 @@ begin
InRange(AP.X, XGraphMin, XGraphMax) and InRange(AP.Y, YGraphMin, YGraphMax); InRange(AP.X, XGraphMin, XGraphMax) and InRange(AP.Y, YGraphMin, YGraphMax);
end; end;
procedure TChart.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TChart.KeyDownAfterInterface(var AKey: Word; AShift: TShiftState);
begin
if GetToolset.Dispatch(Self, evidKeyDown, AShift, Mouse.CursorPos) then exit;
inherited;
end;
procedure TChart.KeyUpAfterInterface(var AKey: Word; AShift: TShiftState);
begin
// To find a tool, toolset must see the shift state with the key still down.
case AKey of
VK_CONTROL: AShift += [ssCtrl];
VK_MENU: AShift += [ssAlt];
VK_SHIFT: AShift += [ssShift];
end;
if GetToolset.Dispatch(Self, evidKeyUp, AShift, Mouse.CursorPos) then exit;
inherited;
end;
procedure TChart.MouseDown(
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin begin
if if
PtInRect(FClipRect, Point(X, Y)) and PtInRect(FClipRect, Point(X, Y)) and

View File

@ -30,7 +30,7 @@ type
TChartToolset = class; TChartToolset = class;
TChartTool = class; TChartTool = class;
TChartToolMouseEvent = procedure (ATool: TChartTool; APoint: TPoint) of object; TChartToolEvent = procedure (ATool: TChartTool; APoint: TPoint) of object;
{ TChartTool } { TChartTool }
@ -38,15 +38,18 @@ type
private private
FActiveCursor: TCursor; FActiveCursor: TCursor;
FEnabled: Boolean; FEnabled: Boolean;
FMouseEvents: array [0..5] of TChartToolMouseEvent; FEventsAfter: array [TChartToolEventId] of TChartToolEvent;
FEventsBefore: array [TChartToolEventId] of TChartToolEvent;
FShift: TShiftState; FShift: TShiftState;
FToolset: TChartToolset; FToolset: TChartToolset;
procedure SetActiveCursor(const AValue: TCursor); procedure SetActiveCursor(const AValue: TCursor);
procedure SetToolset(const AValue: TChartToolset); procedure SetToolset(const AValue: TChartToolset);
private private
FOldCursor: TCursor; FOldCursor: TCursor;
function GetMouseEvent(AIndex: Integer): TChartToolMouseEvent; function GetAfterEvent(AIndex: Integer): TChartToolEvent;
procedure SetMouseEvent(AIndex: Integer; AValue: TChartToolMouseEvent); function GetBeforeEvent(AIndex: Integer): TChartToolEvent;
procedure SetAfterEvent(AIndex: Integer; AValue: TChartToolEvent);
procedure SetBeforeEvent(AIndex: Integer; AValue: TChartToolEvent);
protected protected
procedure ReadState(Reader: TReader); override; procedure ReadState(Reader: TReader); override;
procedure SetParentComponent(AParent: TComponent); override; procedure SetParentComponent(AParent: TComponent); override;
@ -57,6 +60,8 @@ type
AChart: TChart; AEventId: TChartToolEventId; APoint: TPoint); overload; AChart: TChart; AEventId: TChartToolEventId; APoint: TPoint); overload;
function GetIndex: Integer; override; function GetIndex: Integer; override;
function IsActive: Boolean; function IsActive: Boolean;
procedure KeyDown(APoint: TPoint); virtual;
procedure KeyUp(APoint: TPoint); virtual;
procedure MouseDown(APoint: TPoint); virtual; procedure MouseDown(APoint: TPoint); virtual;
procedure MouseMove(APoint: TPoint); virtual; procedure MouseMove(APoint: TPoint); virtual;
procedure MouseUp(APoint: TPoint); virtual; procedure MouseUp(APoint: TPoint); virtual;
@ -79,18 +84,27 @@ type
property Enabled: Boolean read FEnabled write FEnabled default true; property Enabled: Boolean read FEnabled write FEnabled default true;
property Shift: TShiftState read FShift write FShift; property Shift: TShiftState read FShift write FShift;
published published
property OnAfterMouseDown: TChartToolMouseEvent property OnAfterKeyDown: TChartToolEvent
index 0 read GetMouseEvent write SetMouseEvent; index 0 read GetAfterEvent write SetAfterEvent;
property OnAfterMouseMove: TChartToolMouseEvent property OnAfterKeyUp: TChartToolEvent
index 1 read GetMouseEvent write SetMouseEvent; index 1 read GetAfterEvent write SetAfterEvent;
property OnAfterMouseUp: TChartToolMouseEvent property OnAfterMouseDown: TChartToolEvent
index 2 read GetMouseEvent write SetMouseEvent; index 2 read GetAfterEvent write SetAfterEvent;
property OnBeforeMouseDown: TChartToolMouseEvent property OnAfterMouseMove: TChartToolEvent
index 3 read GetMouseEvent write SetMouseEvent; index 3 read GetAfterEvent write SetAfterEvent;
property OnBeforeMouseMove: TChartToolMouseEvent property OnAfterMouseUp: TChartToolEvent
index 4 read GetMouseEvent write SetMouseEvent; index 4 read GetAfterEvent write SetAfterEvent;
property OnBeforeMouseUp: TChartToolMouseEvent
index 5 read GetMouseEvent write SetMouseEvent; property OnBeforeKeyDown: TChartToolEvent
index 0 read GetBeforeEvent write SetBeforeEvent;
property OnBeforeKeyUp: TChartToolEvent
index 1 read GetBeforeEvent write SetBeforeEvent;
property OnBeforeMouseDown: TChartToolEvent
index 2 read GetBeforeEvent write SetBeforeEvent;
property OnBeforeMouseMove: TChartToolEvent
index 3 read GetBeforeEvent write SetBeforeEvent;
property OnBeforeMouseUp: TChartToolEvent
index 4 read GetBeforeEvent write SetBeforeEvent;
end; end;
TChartToolClass = class of TChartTool; TChartToolClass = class of TChartTool;
@ -298,13 +312,13 @@ type
TDataPointClickTool = class(TDataPointTool) TDataPointClickTool = class(TDataPointTool)
private private
FMouseDownPoint: TPoint; FMouseDownPoint: TPoint;
FOnPointClick: TChartToolMouseEvent; FOnPointClick: TChartToolEvent;
public public
procedure MouseDown(APoint: TPoint); override; procedure MouseDown(APoint: TPoint); override;
procedure MouseUp(APoint: TPoint); override; procedure MouseUp(APoint: TPoint); override;
published published
property ActiveCursor; property ActiveCursor;
property OnPointClick: TChartToolMouseEvent property OnPointClick: TChartToolEvent
read FOnPointClick write FOnPointClick; read FOnPointClick write FOnPointClick;
end; end;
@ -524,25 +538,37 @@ end;
procedure TChartTool.Dispatch( procedure TChartTool.Dispatch(
AChart: TChart; AEventId: TChartToolEventId; APoint: TPoint); AChart: TChart; AEventId: TChartToolEventId; APoint: TPoint);
var var
ev: TChartToolMouseEvent; ev: TChartToolEvent;
begin begin
if not Enabled or (FChart <> nil) and (FChart <> AChart) then exit; if not Enabled or (FChart <> nil) and (FChart <> AChart) then exit;
FChart := AChart; FChart := AChart;
ev := FMouseEvents[Ord(AEventId) + Ord(High(AEventId)) + 1]; ev := FEventsBefore[AEventId];
if Assigned(ev) then begin if Assigned(ev) then begin
ev(Self, APoint); ev(Self, APoint);
if Toolset.FIsHandled then exit; if Toolset.FIsHandled then exit;
end; end;
case AEventId of case AEventId of
evidKeyDown : KeyDown (APoint);
evidKeyUp : KeyUp (APoint);
evidMouseDown: MouseDown(APoint); evidMouseDown: MouseDown(APoint);
evidMouseMove: MouseMove(APoint); evidMouseMove: MouseMove(APoint);
evidMouseUp : MouseUp (APoint); evidMouseUp : MouseUp (APoint);
end; end;
ev := FMouseEvents[Ord(AEventId)]; ev := FEventsAfter[AEventId];
if Assigned(ev) then if Assigned(ev) then
ev(Self, APoint); ev(Self, APoint);
end; end;
function TChartTool.GetAfterEvent(AIndex: Integer): TChartToolEvent;
begin
Result := FEventsAfter[TChartToolEventId(AIndex)];
end;
function TChartTool.GetBeforeEvent(AIndex: Integer): TChartToolEvent;
begin
Result := FEventsBefore[TChartToolEventId(AIndex)];
end;
function TChartTool.GetIndex: Integer; function TChartTool.GetIndex: Integer;
begin begin
if Toolset = nil then if Toolset = nil then
@ -551,11 +577,6 @@ begin
Result := Toolset.Tools.IndexOf(Self); Result := Toolset.Tools.IndexOf(Self);
end; end;
function TChartTool.GetMouseEvent(AIndex: Integer): TChartToolMouseEvent;
begin
Result := FMouseEvents[AIndex];
end;
function TChartTool.GetParentComponent: TComponent; function TChartTool.GetParentComponent: TComponent;
begin begin
Result := FToolset; Result := FToolset;
@ -576,6 +597,16 @@ begin
Result := (FChart <> nil) and (FChart.ActiveToolIndex = Index); Result := (FChart <> nil) and (FChart.ActiveToolIndex = Index);
end; end;
procedure TChartTool.KeyDown(APoint: TPoint);
begin
Unused(APoint);
end;
procedure TChartTool.KeyUp(APoint: TPoint);
begin
Unused(APoint);
end;
procedure TChartTool.MouseDown(APoint: TPoint); procedure TChartTool.MouseDown(APoint: TPoint);
begin begin
Unused(APoint); Unused(APoint);
@ -614,6 +645,16 @@ begin
SetCursor; SetCursor;
end; end;
procedure TChartTool.SetAfterEvent(AIndex: Integer; AValue: TChartToolEvent);
begin
FEventsAfter[TChartToolEventId(AIndex)] := AValue;
end;
procedure TChartTool.SetBeforeEvent(AIndex: Integer; AValue: TChartToolEvent);
begin
FEventsBefore[TChartToolEventId(AIndex)] := AValue;
end;
procedure TChartTool.SetCursor; procedure TChartTool.SetCursor;
begin begin
if ActiveCursor = crDefault then exit; if ActiveCursor = crDefault then exit;
@ -626,12 +667,6 @@ begin
Toolset.Tools.Move(Index, EnsureRange(AValue, 0, Toolset.Tools.Count - 1)); Toolset.Tools.Move(Index, EnsureRange(AValue, 0, Toolset.Tools.Count - 1));
end; end;
procedure TChartTool.SetMouseEvent(
AIndex: Integer; AValue: TChartToolMouseEvent);
begin
FMouseEvents[AIndex] := AValue;
end;
procedure TChartTool.SetParentComponent(AParent: TComponent); procedure TChartTool.SetParentComponent(AParent: TComponent);
begin begin
if not (csLoading in ComponentState) then if not (csLoading in ComponentState) then