diff --git a/components/tachart/tagraph.pas b/components/tachart/tagraph.pas index 3a2a654be5..8733ccd503 100644 --- a/components/tachart/tagraph.pas +++ b/components/tachart/tagraph.pas @@ -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 diff --git a/components/tachart/tatools.pas b/components/tachart/tatools.pas index 70353690a7..52801d3fbd 100644 --- a/components/tachart/tatools.pas +++ b/components/tachart/tatools.pas @@ -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