lazarus/components/tachart/talegendpanel.pas

99 lines
1.9 KiB
ObjectPascal

{
*****************************************************************************
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
Authors: Alexander Klenin
}
unit TALegendPanel;
{$H+}
interface
uses
Classes, Controls, TAChartUtils, TAGraph;
type
{ TChartLegendPanel }
TChartLegendPanel = class(TCustomControl)
private
FChart: TChart;
FListener: TListener;
procedure ChartChanged(ASender: TObject);
procedure SetChart(AValue: TChart);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
published
property Chart: TChart read FChart write SetChart;
published
property Align;
property Anchors;
property BorderSpacing;
property Visible;
end;
procedure Register;
implementation
uses
SysUtils;
procedure Register;
begin
RegisterComponents(CHART_COMPONENT_IDE_PAGE, [TChartLegendPanel]);
end;
{ TChartLegendPanel }
procedure TChartLegendPanel.ChartChanged(ASender: TObject);
begin
// TODO: Do not auto-update on chart zooming/scrolling.
Unused(ASender);
Invalidate;
end;
constructor TChartLegendPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FListener := TListener.Create(@FChart, @ChartChanged);
Width := 40;
Height := 20;
end;
destructor TChartLegendPanel.Destroy;
begin
FreeAndNil(FListener);
inherited Destroy;
end;
procedure TChartLegendPanel.Paint;
var
r: TRect;
begin
if Chart = nil then exit;
r := Rect(0, 0, Width, Height);
Chart.DrawLegendOn(Canvas, r);
end;
procedure TChartLegendPanel.SetChart(AValue: TChart);
begin
if FChart = AValue then exit;
if FListener.IsListening then
FChart.Broadcaster.Unsubscribe(FListener);
FChart := AValue;
if FChart <> nil then
FChart.Broadcaster.Subscribe(FListener);
Invalidate;
end;
end.