mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-21 13:00:40 +01:00
295 lines
7.4 KiB
ObjectPascal
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.
|
|
|