unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, StdCtrls,
  TAGraph, TASeries, TAStyles, TASources;

type

  { TForm1 }

  TForm1 = class(TForm)
    BtnAddBar: TButton;
    BtnAddLevel: TButton;
    BtnDelete: TButton;
    CalculatedChartSource1: TCalculatedChartSource;
    Chart1: TChart;
    Chart1BarSeries1: TBarSeries;
    CbPercent: TCheckBox;
    ChartStyles1: TChartStyles;
    ListBox1: TListBox;
    ListChartSource1: TListChartSource;
    Panel1: TPanel;
    procedure BtnAddBarClick(Sender: TObject);
    procedure BtnAddLevelClick(Sender: TObject);
    procedure BtnDeleteClick(Sender: TObject);
    procedure CbPercentChange(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.BtnAddBarClick(Sender: TObject);
var
  x, y: Double;
  i, n: Integer;
  style: TChartStyle;
begin
  x := ListChartSource1.Count;
  y := Random * 0.9 + 0.1;   // Random number between 0.1 and 1.0
  n := ListChartSource1.Add(x, y);
  for i:=0 to ListChartSource1.YCount-2 do
    ListChartSource1.Item[n]^.YList[i] := random;

  if ChartStyles1.Styles.Count = 0 then begin
    style := TChartStyle(ChartStyles1.Styles.Add);
    style.Brush.Color := RgbToColor(random(256), random(256), random(256));
    style.Text := 'Y';

    Listbox1.Items.Add(style.Text);
  end;

  BtnDelete.Enabled := true;
end;

procedure TForm1.BtnAddLevelClick(Sender: TObject);
var
  yidx: Integer;
  i: Integer;
  style: TChartStyle;
begin
  // Increment the number of y values and add random data to the new y value
  ListChartSource1.BeginUpdate;
  try
    yidx := ListChartSource1.YCount - 1;
    ListChartSource1.YCount := ListChartSource1.YCount + 1;
    for i := 0 to ListChartSource1.Count-1 do
      ListChartSource1.Item[i]^.YList[yidx] := random;
  finally
    ListChartSource1.EndUpdate;
  end;

  style := TChartStyle(ChartStyles1.Styles.Add);
  style.Brush.Color := RgbToColor(random(256), random(256), random(256));
  style.Text := 'YList[' + IntToStr(yidx) + ']';

  Listbox1.Items.Add(style.Text);
  Listbox1.ItemIndex := Listbox1.Items.Count - 1;

  BtnDelete.Enabled := true;
end;

procedure TForm1.BtnDeleteClick(Sender: TObject);
var
  idx: Integer;  // Index of level to be deleted
  i, j: Integer;
begin
  idx := Listbox1.ItemIndex;

  if (ListChartSource1.YCount = 1) then begin
    ListChartSource1.Clear;
    exit;
  end;

  // Delete level in Listsource
  ListChartSource1.BeginUpdate;
  try
    for i := 0 to ListChartSource1.Count-1 do begin
      if idx = 0 then
        ListChartSource1.Item[i]^.Y := ListChartSource1.Item[i]^.YList[0];
      for j:=idx to ListChartSource1.YCount-3 do
        ListChartSource1.Item[i]^.YList[j] := ListChartSource1.Item[i]^.YList[j+1];
    end;
    ListChartSource1.YCount := ListChartSource1.YCount - 1;
  finally
    ListChartSource1.EndUpdate;
  end;

  // Delete level in ChartStyles
  ChartStyles1.Styles.Delete(idx);

  // Delete item in Listbox
  Listbox1.Items.Delete(idx);
  if idx < Listbox1.Items.Count then
    Listbox1.ItemIndex := idx
  else
    Listbox1.ItemIndex := Listbox1.Items.Count - 1;

  BtnDelete.Enabled := Listbox1.Items.Count > 0;
end;

procedure TForm1.CbPercentChange(Sender: TObject);
begin
  CalculatedChartSource1.Percentage := CbPercent.Checked;
end;

end.

