lazarus/components/tachart/demo/charteditor/celegenddlg.pas
2019-04-04 20:45:48 +00:00

295 lines
7.4 KiB
ObjectPascal

unit ceLegendDlg;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ButtonPanel,
ExtCtrls, Buttons, ColorBox, ComCtrls, Spin, ceFontFrame,
TAGraph, TALegend;
type
{ TLegendEditor }
TLegendEditor = class(TForm)
Bevel1: TBevel;
ButtonPanel: TButtonPanel;
cbFilled: TCheckBox;
cbShowBorder: TCheckBox;
cbShow: TCheckBox;
cbFillColor: TColorBox;
cbBorderColor: TColorBox;
cbInverted: TCheckBox;
cbUseSideBar: TCheckBox;
cbItemFillOrder: TComboBox;
FontFrame1: TFontFrame;
gbBackground: TGroupBox;
gbBorder: TGroupBox;
gbFont: TGroupBox;
gbMargins: TGroupBox;
gbItems: TGroupBox;
lblMarginX: TLabel;
lblMarginY: TLabel;
lblItemFillOrder: TLabel;
lblColumns: TLabel;
lblSymbolWidth: TLabel;
lblSpacing: TLabel;
PanelTop: TPanel;
ParamsPanel: TPanel;
rbTopLeft: TRadioButton;
rbTopCenter: TRadioButton;
rbTopRight: TRadioButton;
rbCenterLeft: TRadioButton;
rbCenterRight: TRadioButton;
rbBottomLeft: TRadioButton;
rbBottomCenter: TRadioButton;
rbBottomRight: TRadioButton;
gbAlignment: TGroupBox;
seColumns: TSpinEdit;
seMarginX: TSpinEdit;
seMarginY: TSpinEdit;
seSymbolWidth: TSpinEdit;
seSpacing: TSpinEdit;
procedure cbBorderColorChange(Sender: TObject);
procedure cbFillColorChange(Sender: TObject);
procedure cbInvertedChange(Sender: TObject);
procedure cbItemFillOrderChange(Sender: TObject);
procedure cbFilledChange(Sender: TObject);
procedure cbShowBorderChange(Sender: TObject);
procedure cbShowChange(Sender: TObject);
procedure cbUseSideBarChange(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure OKButtonClick(Sender: TObject);
procedure rbAlignmentChange(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;
FSavedLegend: TChartLegend;
FOKClicked: Boolean;
procedure ChangedHandler(Sender: TObject);
function GetAlignment: TLegendAlignment;
procedure SetAlignment(AValue: TLegendAlignment);
protected
function GetChart: TChart;
public
procedure Prepare(ALegend: TChartLegend; ACaption: String = '');
end;
var
AxisTitleEditor: TLegendEditor;
implementation
{$R *.lfm}
uses
ceUtils;
type
TChartLegendAccess = class(TChartLegend);
procedure TLegendEditor.cbBorderColorChange(Sender: TObject);
begin
FLegend.Frame.Color := cbBorderColor.Selected;
end;
procedure TLegendEditor.cbFillColorChange(Sender: TObject);
begin
FLegend.BackgroundBrush.Color := cbFillColor.Selected;
end;
procedure TLegendEditor.cbInvertedChange(Sender: TObject);
begin
FLegend.Inverted := cbInverted.Checked;
end;
procedure TLegendEditor.cbItemFillOrderChange(Sender: TObject);
begin
FLegend.ItemFillOrder := TLegendItemFillOrder(cbItemFillOrder.ItemIndex);
end;
procedure TLegendEditor.cbFilledChange(Sender: TObject);
begin
cbFillColor.Visible := cbFilled.Checked;
if cbFilled.Checked then
FLegend.BackgroundBrush.Style := bsSolid
else
FLegend.BackgroundBrush.Style := bsClear;
end;
procedure TLegendEditor.cbShowBorderChange(Sender: TObject);
begin
FLegend.Frame.Visible := cbShowBorder.Checked;
cbBorderColor.Visible := cbShowBorder.Checked;
end;
procedure TLegendEditor.cbShowChange(Sender: TObject);
begin
FLegend.Visible := cbShow.Checked;
cbUseSideBar.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 TLegendEditor.cbUseSideBarChange(Sender: TObject);
begin
FLegend.UseSideBar := cbUseSideBar.Checked;
end;
procedure TLegendEditor.ChangedHandler(Sender: TObject);
begin
GetChart.Invalidate;
end;
procedure TLegendEditor.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
if not CanClose then exit;
if not FOKClicked then begin
FLegend.Assign(FSavedLegend);
GetChart.Invalidate;
end;
end;
procedure TLegendEditor.FormCreate(Sender: TObject);
begin
BoldHeaders(Self);
FontFrame1.OnChange := @ChangedHandler;
end;
procedure TLegendEditor.FormDestroy(Sender: TObject);
begin
FSavedLegend.Free;
end;
procedure TLegendEditor.FormShow(Sender: TObject);
begin
if cbShow.Checked then begin
AutoSize := true;
Constraints.MinWidth := Width;
Constraints.MinHeight := Height;
AutoSize := false;
end;
FOKClicked := false;
end;
function TLegendEditor.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;
end;
function TLegendEditor.GetChart: TChart;
begin
Result := TChartLegendAccess(FLegend).GetOwner as TChart;
end;
procedure TLegendEditor.OKButtonClick(Sender: TObject);
begin
FOKClicked := true;
end;
procedure TLegendEditor.rbAlignmentChange(Sender: TObject);
begin
FLegend.Alignment := GetAlignment;
end;
procedure TLegendEditor.seColumnsChange(Sender: TObject);
begin
FLegend.ColumnCount := seColumns.Value;
end;
procedure TLegendEditor.seMarginXChange(Sender: TObject);
begin
FLegend.MarginX := seMarginX.Value;
end;
procedure TLegendEditor.seMarginYChange(Sender: TObject);
begin
FLegend.MarginY := seMarginY.Value;
end;
procedure TLegendEditor.seSpacingChange(Sender: TObject);
begin
FLegend.Spacing := seSpacing.Value;
end;
procedure TLegendEditor.seSymbolWidthChange(Sender: TObject);
begin
FLegend.SymbolWidth := seSymbolWidth.Value;
end;
procedure TLegendEditor.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;
procedure TLegendEditor.Prepare(ALegend: TChartLegend;
ACaption: String = '');
begin
FLegend := ALegend;
if FSavedLegend = nil then
FSavedLegend := TChartLegend.Create(nil);
FSavedLegend.Assign(ALegend);
if ACaption <> '' then
Caption := ACaption;
cbShow.Checked := ALegend.Visible;
SetAlignment(ALegend.Alignment);
cbFilled.Checked := ALegend.BackgroundBrush.Style <> bsClear;
cbFillColor.Selected := ALegend.BackgroundBrush.Color;
cbShowBorder.Checked := (ALegend.Frame.Style <> psClear) and ALegend.Frame.Visible;
cbBorderColor.Selected := ALegend.Frame.Color;
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);
FontFrame1.Prepare(ALegend.Font, false);
end;
end.