lazarus/components/tachart/demo/charteditor/celegendframe.pas
2021-08-05 10:34:48 +02:00

266 lines
7.1 KiB
ObjectPascal

unit ceLegendFrame;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Graphics,
Forms, Controls, ExtCtrls, StdCtrls, Spin,
TALegend, TAGraph,
ceFontFrame, ceSimpleBrushFrame, ceSimplePenFrame;
type
{ TChartLegendFrame }
TChartLegendFrame = class(TFrame)
Bevel1: TBevel;
Background_Border_Spacer: TBevel;
cbInverted: TCheckBox;
cbItemFillOrder: TComboBox;
cbShow: TCheckBox;
cbUseSideBar: TCheckBox;
cbHTML: TCheckBox;
gbAlignment: TGroupBox;
gbBackground: TGroupBox;
gbBorder: TGroupBox;
gbFont: TGroupBox;
gbItems: TGroupBox;
gbMargins: TGroupBox;
lblColumns: TLabel;
lblItemFillOrder: TLabel;
lblMarginX: TLabel;
lblMarginY: TLabel;
lblSpacing: TLabel;
lblSymbolWidth: TLabel;
PanelTop: TPanel;
ParamsPanel: TPanel;
rbBottomCenter: TRadioButton;
rbBottomLeft: TRadioButton;
rbBottomRight: TRadioButton;
rbCenterLeft: TRadioButton;
rbCenterRight: TRadioButton;
rbTopCenter: TRadioButton;
rbTopLeft: TRadioButton;
rbTopRight: TRadioButton;
seColumns: TSpinEdit;
seMarginX: TSpinEdit;
seMarginY: TSpinEdit;
seSpacing: TSpinEdit;
seSymbolWidth: TSpinEdit;
procedure cbHTMLChange(Sender: TObject);
procedure cbInvertedChange(Sender: TObject);
procedure cbItemFillOrderChange(Sender: TObject);
procedure cbShowChange(Sender: TObject);
procedure cbUseSideBarChange(Sender: TObject);
procedure gbAlignmentClick(Sender: TObject);
procedure seColumnsChange(Sender: TObject);
procedure seMarginXChange(Sender: TObject);
procedure seMarginYChange(Sender: TObject);
procedure seSpacingChange(Sender: TObject);
procedure seSymbolWidthChange(Sender: TObject);
private
FLegend: TChartLegend;
FFontFrame: TChartFontFrame;
FBackgroundFrame: TSimpleChartBrushFrame;
FBorderFrame: TSimpleChartPenFrame;
function GetAlignment: TLegendAlignment;
procedure SetAlignment(AValue: TLegendAlignment);
protected
procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
{%H-}WithThemeSpace: Boolean); override;
function GetChart: TChart;
public
constructor Create(AOwner: TComponent); override;
procedure Prepare(ALegend: TChartLegend);
end;
implementation
{$R *.lfm}
uses
Math,
TATypes, TAChartUtils,
ceUtils;
constructor TChartLegendFrame.Create(AOwner: TComponent);
begin
inherited;
FFontFrame := TChartFontFrame.Create(self);
FFontFrame.Parent := gbFont;
FFontFrame.Name := '';
FFontFrame.Align := alClient;
FFontFrame.BorderSpacing.Left := 8;
FFontFrame.BorderSpacing.Right := 8;
FFontFrame.AutoSize := true;
gbFont.AutoSize := true;
gbFont.Caption := 'Font';
FBackgroundFrame := TSimpleChartBrushFrame.Create(self);
FBackgroundFrame.Name := '';
FBackgroundFrame.Align := alClient;
FBackgroundFrame.BorderSpacing.Left := 8;
FBackgroundFrame.BorderSpacing.Right := 8;
FBackgroundFrame.BorderSpacing.Bottom := 8;
FBackgroundFrame.Parent := gbBackground;
FBackgroundFrame.AutoSize := true;
gbBackground.AutoSize := true;
gbBackground.Caption := 'Background';
FBorderFrame := TSimpleChartPenFrame.Create(self);
FBorderFrame.Name := '';
FBorderFrame.Align := alClient;
FBorderFrame.BorderSpacing.Left := 8;
FBorderFrame.BorderSpacing.Right := 8;
FBorderFrame.BorderSpacing.Bottom := 8;
FBorderFrame.AutoSize := true;
FBorderFrame.Parent := gbBorder;
gbBorder.AutoSize := true;
gbBorder.Caption := 'Border';
BoldHeaders(Self);
end;
procedure TChartLegendFrame.CalculatePreferredSize(
var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean);
begin
PreferredHeight := PanelTop.Height + PanelTop.BorderSpacing.Bottom +
Max(
gbAlignment.Height + gbBackground.Height + gbBackground.BorderSpacing.Top +
gbMargins.Height + gbMargins.Borderspacing.Top,
gbFont.Height + gbItems.Height + gbItems.BorderSpacing.Top
);
PreferredWidth := gbAlignment.Width + gbFont.Width + gbFont.BorderSpacing.Left;
end;
procedure TChartLegendFrame.cbHTMLChange(Sender: TObject);
begin
FLegend.TextFormat := TEXT_FORMAT[cbHTML.Checked];
end;
procedure TChartLegendFrame.cbInvertedChange(Sender: TObject);
begin
FLegend.Inverted := cbInverted.Checked;
end;
procedure TChartLegendFrame.cbItemFillOrderChange(Sender: TObject);
begin
FLegend.ItemFillOrder := TLegendItemFillOrder(cbItemFillOrder.ItemIndex);
end;
procedure TChartLegendFrame.cbShowChange(Sender: TObject);
begin
FLegend.Visible := cbShow.Checked;
cbUseSideBar.Visible := cbShow.Checked;
cbHTML.Visible := cbShow.Checked;
gbAlignment.Visible := cbShow.Checked;
gbFont.Visible := cbShow.Checked;
gbBackground.Visible := cbShow.Checked;
gbBorder.Visible := cbShow.Checked;
gbItems.Visible := cbShow.Checked;
gbMargins.Visible := cbShow.Checked;
end;
procedure TChartLegendFrame.cbUseSideBarChange(Sender: TObject);
begin
FLegend.UseSideBar := cbUseSideBar.Checked;
end;
function TChartLegendFrame.GetChart: TChart;
begin
Result := FLegend.GetOwner as TChart;
end;
function TChartLegendFrame.GetAlignment: TLegendAlignment;
var
i: Integer;
rb: TRadioButton;
begin
for i := 0 to gbAlignment.ControlCount-1 do
if (gbAlignment.Controls[i] is TRadioButton) then begin
rb := TRadioButton(gbAlignment.Controls[i]);
if rb.Checked then begin
Result := TLegendAlignment(rb.Tag);
exit;
end;
end;
Result := laTopRight;
end;
procedure TChartLegendFrame.gbAlignmentClick(Sender: TObject);
begin
FLegend.Alignment := GetAlignment;
end;
procedure TChartLegendFrame.Prepare(ALegend: TChartLegend);
begin
FLegend := ALegend;
cbShow.Checked := ALegend.Visible;
cbHTML.Checked := (ALegend.TextFormat = tfHTML);
SetAlignment(ALegend.Alignment);
seMarginX.Value := ALegend.MarginX;
seMarginY.Value := ALegend.MarginY;
cbUseSideBar.Checked := ALegend.UseSidebar;
cbInverted.Checked := ALegend.Inverted;
seColumns.Value := ALegend.ColumnCount;
seSymbolWidth.Value := ALegend.SymbolWidth;
seSpacing.Value := ALegend.Spacing;
cbItemFillOrder.ItemIndex := ord(ALegend.ItemFillOrder);
FFontFrame.Prepare(ALegend.Font, false);
FBackgroundFrame.Prepare(ALegend.BackgroundBrush);
FBorderFrame.Prepare(ALegend.Frame);
end;
procedure TChartLegendFrame.seColumnsChange(Sender: TObject);
begin
FLegend.ColumnCount := seColumns.Value;
end;
procedure TChartLegendFrame.seMarginXChange(Sender: TObject);
begin
FLegend.MarginX := seMarginX.Value;
end;
procedure TChartLegendFrame.seMarginYChange(Sender: TObject);
begin
FLegend.MarginY := seMarginY.Value;
end;
procedure TChartLegendFrame.seSpacingChange(Sender: TObject);
begin
FLegend.Spacing := seSpacing.Value;
end;
procedure TChartLegendFrame.seSymbolWidthChange(Sender: TObject);
begin
FLegend.SymbolWidth := seSymbolWidth.Value;
end;
procedure TChartLegendFrame.SetAlignment(AValue: TLegendAlignment);
var
i: Integer;
rb: TRadioButton;
begin
for i:=0 to gbAlignment.ControlCount-1 do
if (gbAlignment.Controls[i] is TRadioButton) then begin
rb := TRadioButton(gbAlignment.Controls[i]);
if rb.Tag = ord(AValue) then begin
rb.Checked := true;
exit;
end;
end;
end;
end.