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;
TChartToolEvent = procedure (AChart: TChart; AX, AY: Integer) of object;
{ TBasicСhartTool }
TBasicChartTool = class(TIndexedComponent)
@ -103,7 +101,8 @@ type
procedure Deactivate; virtual;
end;
TChartToolEventId = (evidMouseDown, evidMouseMove, evidMouseUp);
TChartToolEventId = (
evidKeyDown, evidKeyUp, evidMouseDown, evidMouseMove, evidMouseUp);
{ TBasicChartToolset }
@ -240,6 +239,8 @@ type
procedure Clear(ADrawer: IChartDrawer; const ARect: TRect);
procedure DisplaySeries(ADrawer: IChartDrawer);
procedure DrawBackWall(ADrawer: IChartDrawer);
procedure KeyDownAfterInterface(var AKey: Word; AShift: TShiftState); override;
procedure KeyUpAfterInterface(var AKey: Word; AShift: TShiftState); override;
procedure MouseDown(
Button: TMouseButton; 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);
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
if
PtInRect(FClipRect, Point(X, Y)) and

View File

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