mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-03 02:38:16 +02:00
266 lines
7.1 KiB
ObjectPascal
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.
|
|
|