mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-22 12:59:26 +02:00
TAChart: Move more functionality from clients into TListener class
git-svn-id: trunk@24471 -
This commit is contained in:
parent
c08a43fead
commit
5b2e752e04
@ -140,15 +140,22 @@ type
|
||||
property Index: Integer read GetIndex write SetIndex;
|
||||
end;
|
||||
|
||||
TBroadcaster = class;
|
||||
|
||||
{ TListener }
|
||||
|
||||
TListener = class
|
||||
private
|
||||
FIsListening: Boolean;
|
||||
FBroadcaster: TBroadcaster;
|
||||
FOnNotify: TNotifyEvent;
|
||||
FRef: PPointer;
|
||||
function GetIsListening: Boolean;
|
||||
public
|
||||
constructor Create(ARef: PPointer; AOnNotify: TNotifyEvent);
|
||||
destructor Destroy; override;
|
||||
procedure Forget; virtual;
|
||||
procedure Notify; virtual; abstract;
|
||||
property IsListening: Boolean read FIsListening;
|
||||
procedure Notify(ASender: TObject); virtual;
|
||||
property IsListening: Boolean read GetIsListening;
|
||||
end;
|
||||
|
||||
{ TBroadcaster }
|
||||
@ -728,9 +735,33 @@ end;
|
||||
|
||||
{ TListener }
|
||||
|
||||
constructor TListener.Create(ARef: PPointer; AOnNotify: TNotifyEvent);
|
||||
begin
|
||||
FOnNotify := AOnNotify;
|
||||
FRef := Aref;
|
||||
end;
|
||||
|
||||
destructor TListener.Destroy;
|
||||
begin
|
||||
if IsListening then
|
||||
FBroadcaster.Unsubscribe(Self);
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TListener.Forget;
|
||||
begin
|
||||
FIsListening := false;
|
||||
FBroadcaster := nil;
|
||||
FRef^ := nil;
|
||||
end;
|
||||
|
||||
function TListener.GetIsListening: Boolean;
|
||||
begin
|
||||
Result := FBroadcaster <> nil;
|
||||
end;
|
||||
|
||||
procedure TListener.Notify(ASender: TObject);
|
||||
begin
|
||||
FOnNotify(ASender)
|
||||
end;
|
||||
|
||||
{ TBroadcaster }
|
||||
@ -740,7 +771,7 @@ var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to Count - 1 do
|
||||
TListener(Items[i]).Notify;
|
||||
TListener(Items[i]).Notify(nil);
|
||||
end;
|
||||
|
||||
destructor TBroadcaster.Destroy;
|
||||
@ -758,7 +789,7 @@ begin
|
||||
raise EListenerError.Create('Listener subscribed twice');
|
||||
if IndexOf(AListener) >= 0 then
|
||||
raise EListenerError.Create('Duplicate listener');
|
||||
AListener.FIsListening := true;
|
||||
AListener.FBroadcaster := Self;
|
||||
Add(AListener);
|
||||
end;
|
||||
|
||||
@ -768,7 +799,7 @@ var
|
||||
begin
|
||||
if not AListener.IsListening then
|
||||
raise EListenerError.Create('Listener not subscribed');
|
||||
AListener.FIsListening := false;
|
||||
AListener.Forget;
|
||||
i := IndexOf(AListener);
|
||||
if i < 0 then
|
||||
raise EListenerError.Create('Listener not found');
|
||||
|
@ -149,37 +149,6 @@ implementation
|
||||
uses
|
||||
Math, TAChartAxis;
|
||||
|
||||
type
|
||||
|
||||
{ TChartSeriesListener }
|
||||
|
||||
TChartSeriesListener = class(TListener)
|
||||
private
|
||||
FSeries: TChartSeries;
|
||||
public
|
||||
constructor Create(ASeries: TChartSeries);
|
||||
procedure Forget; override;
|
||||
procedure Notify; override;
|
||||
end;
|
||||
|
||||
{ TChartSeriesListener }
|
||||
|
||||
constructor TChartSeriesListener.Create(ASeries: TChartSeries);
|
||||
begin
|
||||
FSeries := ASeries;
|
||||
end;
|
||||
|
||||
procedure TChartSeriesListener.Forget;
|
||||
begin
|
||||
inherited Forget;
|
||||
FSeries.FSource := nil;
|
||||
end;
|
||||
|
||||
procedure TChartSeriesListener.Notify;
|
||||
begin
|
||||
FSeries.UpdateParentChart;
|
||||
end;
|
||||
|
||||
{ TCustomChartSeries }
|
||||
|
||||
function TCustomChartSeries.AxisToGraphX(AX: Double): Double;
|
||||
@ -376,7 +345,7 @@ const
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
|
||||
FListener := TChartSeriesListener.Create(Self);
|
||||
FListener := TListener.Create(@FSource, @StyleChanged);
|
||||
FBuiltinSource := TListChartSource.Create(Self);
|
||||
FBuiltinSource.Name := BUILTIN_SOURCE_NAME;
|
||||
FBuiltinSource.Broadcaster.Subscribe(FListener);
|
||||
@ -390,11 +359,9 @@ end;
|
||||
|
||||
destructor TChartSeries.Destroy;
|
||||
begin
|
||||
if FListener.IsListening then
|
||||
Source.Broadcaster.Unsubscribe(FListener);
|
||||
FListener.Free;
|
||||
FBuiltinSource.Free;
|
||||
FMarks.Free;
|
||||
FListener.Free;
|
||||
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user