mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-07-14 02:55:59 +02:00
352 lines
11 KiB
ObjectPascal
352 lines
11 KiB
ObjectPascal
unit ceSeriesFrame;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Graphics, Forms, Controls, ExtCtrls, StdCtrls,
|
|
TAGraph, TACustomSeries, TASeries,
|
|
ceBrushFrame, cePenFrame, cePointerFrame;
|
|
|
|
type
|
|
|
|
{ TChartSeriesFrame }
|
|
|
|
TChartSeriesFrame = class(TFrame)
|
|
Bevel1: TBevel;
|
|
Bevel2: TBevel;
|
|
Bevel3: TBevel;
|
|
Bevel4: TBevel;
|
|
btnMore: TButton;
|
|
cbAreaShowContourLines: TCheckBox;
|
|
cbAreaShowDropLines: TCheckBox;
|
|
cbBarShape: TComboBox;
|
|
cmbLegendMultiplicity: TComboBox;
|
|
cbLineSeriesShowLines: TCheckBox;
|
|
cbLineSeriesShowPoints: TCheckBox;
|
|
cbMarksStyle: TComboBox;
|
|
cbShowInLegend: TCheckBox;
|
|
cbShowMarks: TCheckBox;
|
|
cbShowSeries: TCheckBox;
|
|
edMarksFormat: TEdit;
|
|
edSeriesTitle: TEdit;
|
|
gbAreaContourPen: TGroupBox;
|
|
gbAreaDropLinePen: TGroupBox;
|
|
gbAreaSeriesBrush: TGroupBox;
|
|
gbBarSeriesBorder: TGroupBox;
|
|
gbBarSeriesBrush: TGroupBox;
|
|
gbBarShape: TGroupBox;
|
|
gbLegendText: TGroupBox;
|
|
gbLineSeriesLineStyle: TGroupBox;
|
|
gbLineSeriesPointer: TGroupBox;
|
|
gbMarks: TGroupBox;
|
|
lblLegendItems: TLabel;
|
|
Label2: TLabel;
|
|
lblSeriesMarksStyle: TLabel;
|
|
nbSeriesTypes: TNotebook;
|
|
PanelTop: TPanel;
|
|
pgAreaSeries: TPage;
|
|
pgBarSeries: TPage;
|
|
pgLineSeries: TPage;
|
|
procedure btnMoreClick(Sender: TObject);
|
|
procedure cbAreaShowContourLinesChange(Sender: TObject);
|
|
procedure cbAreaShowDropLinesChange(Sender: TObject);
|
|
procedure cbBarShapeChange(Sender: TObject);
|
|
procedure cmbLegendMultiplicityChange(Sender: TObject);
|
|
procedure cbLineSeriesShowLinesChange(Sender: TObject);
|
|
procedure cbLineSeriesShowPointsChange(Sender: TObject);
|
|
procedure cbMarksStyleChange(Sender: TObject);
|
|
procedure cbShowInLegendChange(Sender: TObject);
|
|
procedure cbShowMarksChange(Sender: TObject);
|
|
procedure cbShowSeriesChange(Sender: TObject);
|
|
procedure edMarksFormatEditingDone(Sender: TObject);
|
|
procedure edSeriesTitleChange(Sender: TObject);
|
|
private
|
|
FSeries: TBasicChartSeries;
|
|
FLineSeriesPenFrame: TChartPenFrame;
|
|
FLineSeriesPointerFrame: TChartPointerFrame;
|
|
FBarSeriesBrushFrame: TChartBrushFrame;
|
|
FBarSeriesPenFrame: TChartPenFrame;
|
|
FAreaSeriesBrushFrame: TChartBrushFrame;
|
|
FAreaSeriesContourPenFrame: TChartPenFrame;
|
|
FAreaSeriesDropLinesPenFrame: TChartPenFrame;
|
|
FOnChanged: TNotifyEvent;
|
|
procedure ChangedHandler(Sender: TObject);
|
|
protected
|
|
function GetChart: TChart;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure Prepare(ASeries: TBasicChartSeries);
|
|
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
TAChartUtils, TALegend,
|
|
ceUtils, ceMarksForm;
|
|
|
|
constructor TChartSeriesFrame.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
|
|
FLineSeriesPenFrame := TChartPenFrame.Create(self);
|
|
FLineSeriesPenFrame.Parent := gbLineSeriesLineStyle;
|
|
FLineSeriesPenFrame.Name := '';
|
|
FLineSeriesPenFrame.Align := alClient;
|
|
FLineSeriesPenFrame.BorderSpacing.Around := 8;
|
|
FLineSeriesPenFrame.OnChange := @ChangedHandler;
|
|
gbLineSeriesLineStyle.Caption := 'Connecting lines';
|
|
gbLineSeriesLineStyle.AutoSize := true;
|
|
|
|
FLineSeriesPointerFrame := TChartPointerFrame.Create(self);
|
|
FLineSeriesPointerFrame.Parent := gbLineSeriesPointer;
|
|
FLineSeriesPointerFrame.Name := '';
|
|
FLineSeriesPointerFrame.AutoSize := true;
|
|
FLineSeriesPointerFrame.Align := alClient;
|
|
FLineSeriesPointerFrame.BorderSpacing.Around := 8;
|
|
FLineSeriesPointerFrame.OnChange := @ChangedHandler;
|
|
gbLineSeriesPointer.Caption := 'Series pointer';
|
|
gbLineSeriesPointer.AutoSize := true;
|
|
|
|
{ Bar series page }
|
|
FBarSeriesBrushFrame := TChartBrushFrame.Create(self);
|
|
FBarSeriesBrushFrame.Parent := gbBarSeriesBrush;
|
|
FBarSeriesBrushFrame.Name := '';
|
|
FBarSeriesBrushFrame.Align := alClient;
|
|
FBarSeriesBrushFrame.BorderSpacing.Around := 8;
|
|
FBarSeriesBrushFrame.OnChange := @ChangedHandler;
|
|
gbBarSeriesBrush.Caption := 'Bar brush';
|
|
gbBarSeriesBrush.AutoSize := true;
|
|
|
|
FBarSeriesPenFrame := TChartPenFrame.Create(self);
|
|
FBarSeriesPenFrame.Parent := gbBarSeriesBorder;
|
|
FBarSeriesPenFrame.Name := '';
|
|
FBarSeriesPenFrame.Align := alClient;
|
|
FBarSeriesPenFrame.BorderSpacing.Around := 8;
|
|
FBarSeriesPenFrame.OnChange := @ChangedHandler;
|
|
gbBarSeriesBorder.Caption := 'Bar borders';
|
|
gbBarSeriesBorder.AutoSize := true;
|
|
|
|
cbBarShape.DropdownCount := DEFAULT_DROPDOWN_COUNT;
|
|
|
|
{ Area series page }
|
|
FAreaSeriesBrushFrame := TChartBrushFrame.Create(self);
|
|
FAreaSeriesBrushFrame.Parent := gbAreaSeriesBrush;
|
|
FAreaSeriesBrushFrame.Name := '';
|
|
FAreaSeriesBrushFrame.Align := alClient;
|
|
FAreaSeriesBrushFrame.BorderSpacing.Around := 8;
|
|
FAreaSeriesBrushFrame.OnChange := @ChangedHandler;
|
|
gbAreaSeriesBrush.Caption := 'Area fill';
|
|
gbAreaSeriesBrush.AutoSize := true;
|
|
|
|
FAreaSeriesContourPenFrame := TChartPenFrame.Create(self);
|
|
FAreaSeriesContourPenFrame.Parent := gbAreaContourPen;
|
|
FAreaSeriesContourPenFrame.Name := '';
|
|
FAreaSeriesContourPenFrame.Align := alClient;
|
|
FAreaSeriesContourPenFrame.BorderSpacing.Around := 8;
|
|
FAreaSeriesContourPenFrame.OnChange := @ChangedHandler;
|
|
gbAreaContourPen.Caption := 'Border';
|
|
gbAreaContourPen.AutoSize := true;
|
|
|
|
FAreaSeriesDropLinesPenFrame := TChartPenFrame.Create(self);
|
|
FAreaSeriesDropLinesPenFrame.Parent := gbAreaDropLinePen;
|
|
FAreaSeriesDropLinesPenFrame.Name := '';
|
|
FAreaSeriesDropLinesPenFrame.Align := alClient;
|
|
FAreaSeriesDropLinesPenFrame.BorderSpacing.Around := 8;
|
|
FAreaSeriesDropLinesPenFrame.OnChange := @ChangedHandler;
|
|
gbAreaDropLinePen.Caption := 'Drop lines';
|
|
gbAreaDropLinePen.AutoSize := true;
|
|
|
|
{ for all }
|
|
BoldHeaders(self);
|
|
|
|
cmbLegendMultiplicity.DropdownCount := DEFAULT_DROPDOWN_COUNT;
|
|
cbMarksStyle.DropdownCount := DEFAULT_DROPDOWN_COUNT;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbAreaShowContourLinesChange(Sender: TObject);
|
|
begin
|
|
if FSeries is TAreaSeries then begin
|
|
if cbAreaShowContourLines.Checked then
|
|
TAreaSeries(FSeries).AreaContourPen.Style := FAreaSeriesContourPenFrame.cbPenStyle.PenStyle
|
|
else
|
|
TAreaSeries(FSeries).AreaContourPen.Style := psClear;
|
|
FAreaSeriesContourPenFrame.Enabled := cbAreaShowContourLines.Checked;
|
|
end;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.btnMoreClick(Sender: TObject);
|
|
var
|
|
F: TMarksForm;
|
|
ser: TBasicChartSeries;
|
|
begin
|
|
if not (FSeries is TChartSeries) then
|
|
exit;
|
|
|
|
F := TMarksForm.Create(GetParentForm(self));
|
|
try
|
|
ser := TSeriesClass(FSeries.ClassType).Create(nil);
|
|
ser.Assign(FSeries);
|
|
|
|
F.Prepare(TChartSeries(FSeries));
|
|
F.Position := poOwnerFormCenter;
|
|
if F.ShowModal <> mrOK then
|
|
FSeries.Assign(ser);
|
|
finally
|
|
ser.Free;
|
|
F.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbAreaShowDropLinesChange(Sender: TObject);
|
|
begin
|
|
if FSeries is TAreaSeries then begin
|
|
if cbAreaShowDropLines.Checked then
|
|
TAreaSeries(FSeries).AreaLinesPen.Style := FAreaSeriesDropLinesPenFrame.cbPenStyle.PenStyle
|
|
else
|
|
TAreaSeries(FSeries).AreaLinesPen.Style := psClear;
|
|
FAreaSeriesDropLinesPenFrame.Enabled := cbAreaShowDropLines.Checked;
|
|
end;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbBarShapeChange(Sender: TObject);
|
|
begin
|
|
if FSeries is TBarSeries then
|
|
TBarSeries(FSeries).BarShape := TBarShape(cbBarShape.ItemIndex);
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cmbLegendMultiplicityChange(Sender: TObject);
|
|
begin
|
|
(FSeries as TCustomChartSeries).Legend.Multiplicity := TLegendMultiplicity(cmbLegendMultiplicity.ItemIndex);
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbLineSeriesShowLinesChange(Sender: TObject);
|
|
begin
|
|
if FSeries is TLineSeries then
|
|
begin
|
|
TLineSeries(FSeries).ShowLines := cbLineSeriesShowLines.Checked;
|
|
FLineSeriesPenFrame.Enabled := cbLineSeriesShowLines.Checked;
|
|
end;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbLineSeriesShowPointsChange(Sender: TObject);
|
|
begin
|
|
if FSeries is TLineSeries then
|
|
TLineSeries(FSeries).ShowPoints := cbLineSeriesShowPoints.Checked;
|
|
FLineSeriesPointerFrame.Enabled := cbLineSeriesShowPoints.Checked;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbMarksStyleChange(Sender: TObject);
|
|
var
|
|
series: TChartSeries;
|
|
begin
|
|
if (FSeries is TChartSeries) then begin
|
|
series := TChartSeries(FSeries);
|
|
series.Marks.Style := TSeriesMarksStyle(cbMarksStyle.ItemIndex);
|
|
edMarksFormat.Text := series.Marks.Format;
|
|
btnMore.Enabled := (series.Marks.Style <> smsNone) and cbShowMarks.Checked;
|
|
end;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbShowInLegendChange(Sender: TObject);
|
|
begin
|
|
(FSeries as TCustomChartSeries).Legend.Visible := cbShowInLegend.Checked;
|
|
lblLegendItems.Enabled := cbShowInLegend.Checked;
|
|
cmbLegendMultiplicity.Enabled := cbShowInLegend.Checked;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbShowMarksChange(Sender: TObject);
|
|
begin
|
|
if (FSeries is TChartSeries) then
|
|
begin
|
|
TChartSeries(FSeries).Marks.Visible := cbShowMarks.Checked;
|
|
btnMore.Enabled := (TChartSeries(FSeries).Marks.Style <> smsNone) and cbShowMarks.Checked;
|
|
end;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.cbShowSeriesChange(Sender: TObject);
|
|
begin
|
|
FSeries.Active := cbShowSeries.Checked;
|
|
gbLegendText.Visible := cbShowSeries.Checked;
|
|
gbMarks.Visible := cbShowSeries.Checked;
|
|
nbSeriesTypes.Visible := cbShowSeries.Checked;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.ChangedHandler(Sender: TObject);
|
|
begin
|
|
GetChart.Invalidate;
|
|
if Assigned(FOnChanged) then FOnChanged(self);
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.edMarksFormatEditingDone(Sender: TObject);
|
|
begin
|
|
if (FSeries is TChartSeries) then
|
|
try
|
|
TChartSeries(FSeries).Marks.Format := edMarksFormat.Text;
|
|
except
|
|
end;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.edSeriesTitleChange(Sender: TObject);
|
|
begin
|
|
(FSeries as TCustomChartSeries).Title := edSeriesTitle.Text;
|
|
end;
|
|
|
|
function TChartSeriesFrame.GetChart: TChart;
|
|
begin
|
|
Result := FSeries.ParentChart;
|
|
end;
|
|
|
|
procedure TChartSeriesFrame.Prepare(ASeries: TBasicChartSeries);
|
|
var
|
|
series: TCustomChartSeries;
|
|
begin
|
|
FSeries := ASeries;
|
|
series := TCustomChartSeries(FSeries);
|
|
|
|
cbShowSeries.Checked := series.Active;
|
|
cbShowInLegend.Checked := series.Legend.Visible;
|
|
edSeriesTitle.Text := series.Title;
|
|
cmbLegendMultiplicity.ItemIndex := ord(series.Legend.Multiplicity);
|
|
|
|
gbMarks.Visible := (FSeries is TChartSeries);
|
|
if (FSeries is TChartSeries) then begin
|
|
cbMarksStyle.ItemIndex := ord(TChartSeries(FSeries).Marks.Style);
|
|
edMarksFormat.Text := TChartSeries(FSeries).Marks.Format;
|
|
cbShowMarks.Checked := TChartSeries(FSeries).Marks.Visible;
|
|
end;
|
|
|
|
if ASeries is TLineSeries then begin
|
|
nbSeriesTypes.PageIndex := 0;
|
|
cbLineSeriesShowLines.Checked := TLineSeries(ASeries).ShowLines;
|
|
cbLineSeriesShowPoints.Checked := TLineSeries(ASeries).ShowPoints;
|
|
FLineSeriesPenFrame.Prepare(TLineSeries(ASeries).LinePen);
|
|
FLineSeriesPointerFrame.Prepare(TLineSeries(ASeries).Pointer);
|
|
end;
|
|
|
|
if ASeries is TBarSeries then begin
|
|
nbSeriesTypes.PageIndex := 1;
|
|
FBarSeriesPenFrame.Prepare(TBarSeries(ASeries).BarPen);
|
|
FBarSeriesBrushFrame.Prepare(TBarSeries(ASeries).BarBrush);
|
|
cbBarShape.ItemIndex := ord(TBarSeries(ASeries).BarShape);
|
|
end;
|
|
|
|
if ASeries is TAreaSeries then begin
|
|
nbSeriesTypes.PageIndex := 2;
|
|
cbAreaShowContourLines.Checked := TAreaSeries(ASeries).AreaContourPen.Style <> psClear;
|
|
cbAreaShowDropLines.Checked := TAreaSeries(ASeries).AreaLinesPen.Style <> psClear;
|
|
FAreaSeriesBrushFrame.Prepare(TAreaSeries(ASeries).AreaBrush);
|
|
FAreaSeriesContourPenFrame.Prepare(TAreaSeries(ASeries).AreaContourPen);
|
|
FAreaSeriesDropLinesPenFrame.Prepare(TAreaSeries(ASeries).AreaLinesPen);
|
|
end;
|
|
|
|
end;
|
|
|
|
end.
|
|
|