lazarus/components/tachart/demo/charteditor/ceaxisdlg.pas

372 lines
10 KiB
ObjectPascal

unit ceAxisDlg;
{$mode objfpc}{$H+}
{$WARN 6058 off : Call to subroutine "$1" marked as inline is not inlined}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ButtonPanel,
ExtCtrls, Buttons, ComCtrls,
TAChartAxis, TAChartAxisUtils, TATextElements, TAGraph,
ceAxisFrame;
type
TChartAxisParams = record
// General visibility
Visible: Boolean;
// Axis title
TitleVisible: Boolean;
TitleText: String;
TitleAlignment: TAlignment;
TitleFontName: String;
TitleFontSize: Integer;
TitleFontStyle: TFontStyles;
TitleFontColor: TColor;
TitleFontOrientation: Integer;
TitleDistance: Integer;
TitleShape: TChartLabelShape;
TitleBackgroundStyle: TBrushStyle;
TitleBackgroundColor: TColor;
TitleBorderVisible: Boolean;
TitleBorderColor: TColor;
TitleMarginLeft: Integer;
TitleMarginTop: Integer;
TitleMarginRight: Integer;
TitleMarginBottom: Integer;
// Axis range
Maximum: Double;
Minimum: Double;
UseMax: Boolean;
UseMin: Boolean;
Inverted: Boolean;
// Tick labels
LabelsVisible: Boolean;
LabelsFormat: String;
LabelsDistance: Integer;
TickLength: Integer;
TickLengthInner: Integer;
TickColor: TColor;
LabelFontName: String;
LabelFontSize: Integer;
LabelFontStyle: TFontStyles;
LabelFontColor: TColor;
LabelFontOrientation: Integer;
LabelShape: TChartLabelShape;
LabelBackgroundStyle: TBrushStyle;
LabelBackgroundColor: TColor;
LabelBorderVisible: Boolean;
LabelBorderColor: TColor;
LabelMarginLeft: Integer;
LabelMarginTop: Integer;
LabelMarginRight: Integer;
LabelMarginBottom: Integer;
// Grid
GridVisible: Boolean;
GridPenStyle: TPenStyle;
GridPenWidth: Integer;
GridPenColor: TColor;
// Frame
FrameVisible: Boolean;
FramePenStyle: TPenStyle;
FramePenWidth: Integer;
FramePenColor: TColor;
// Arrow
ArrowVisible: Boolean;
ArrowBaseLength: Integer;
ArrowLength: Integer;
ArrowWidth: Integer;
end;
{ TChartAxisEditor }
TChartAxisEditor = class(TForm)
ButtonPanel: TButtonPanel;
procedure FormActivate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure HelpButtonClick(Sender: TObject);
procedure OKButtonClick(Sender: TObject);
private
FAxis: TChartAxis;
FOKClicked: Boolean;
FAxisFrame: TChartAxisFrame;
FSavedAxisParams: TChartAxisParams;
function GetPage: TChartAxisEditorPage;
procedure SetPage(AValue: TChartAxisEditorPage);
protected
function GetChart: TChart;
procedure RestoreAxisParams; virtual;
procedure SaveAxisParams; virtual;
public
procedure Prepare(Axis: TChartAxis; ACaptionMask: String);
property Page: TChartAxisEditorPage read GetPage write SetPage;
end;
var
AxisEditor: TChartAxisEditor;
implementation
{$R *.lfm}
procedure TChartAxisEditor.FormActivate(Sender: TObject);
var
w: Integer = 0;
h: Integer = 0;
begin
FAxisFrame.GetPreferredSize(w, h);
inc(w, FAxisFrame.BorderSpacing.Around*2);
inc(h, FAxisFrame.BorderSpacing.Around*2);
Constraints.MinWidth := w;
Constraints.MinHeight := h + ButtonPanel.Height + ButtonPanel.BorderSpacing.Around*2;
// Enforce constraints
SetBounds(Left, Top, 1, 1);
end;
procedure TChartAxisEditor.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
if not CanClose then exit;
if not FOKClicked then begin
RestoreAxisParams;
GetChart.Invalidate;
end;
end;
procedure TChartAxisEditor.FormCreate(Sender: TObject);
begin
FAxisFrame := TChartAxisFrame.Create(self);
FAxisFrame.Parent := Self;
FAxisFrame.Name := '';
FAxisFrame.Align := alClient;
FAxisFrame.BorderSpacing.Around := 8;
FAxisFrame.AutoSize := true;
end;
procedure TChartAxisEditor.FormShow(Sender: TObject);
begin
FOKClicked := false;
{
FTitleShapeBrushPenMarginsFrame.AutoSize := false;
FTitleShapeBrushPenMarginsFrame.Align := alClient;
}
end;
function TChartAxisEditor.GetChart: TChart;
begin
Result := FAxis.Collection.Owner as TChart;
end;
function TChartAxisEditor.GetPage: TChartAxisEditorPage;
begin
Result := FAxisFrame.Page;
end;
procedure TChartAxisEditor.HelpButtonClick(Sender: TObject);
begin
ModalResult := mrYesToAll;
end;
procedure TChartAxisEditor.OKButtonClick(Sender: TObject);
var
msg: String;
C: TWinControl;
begin
if not FAxisFrame.Validate(msg, C) then
begin
C.SetFocus;
MessageDlg(msg, mtError, [mbOK], 0);
ModalResult := mrNone;
end else
FOKClicked := true;
end;
procedure TChartAxisEditor.Prepare(Axis: TChartAxis;
ACaptionMask: String);
begin
FAxis := Axis;
SaveAxisParams;
if FAxis.Title.Caption <> '' then
Caption := Format(ACaptionMask, [FAxis.Title.Caption])
else
Caption := Format(ACaptionMask, ['#' + IntToStr(FAxis.Index)]);
FAxisFrame.Prepare(Axis);
end;
procedure TChartAxisEditor.RestoreAxisParams;
begin
GetChart.DisableRedrawing;
try
with FSavedAxisParams do
begin
// General visibility
FAxis.Visible := Visible;
// Axis title
FAxis.Title.Visible := TitleVisible;
FAxis.Title.Caption := TitleText;
FAxis.Title.Alignment := TitleAlignment;
FAxis.Title.LabelFont.Name := TitleFontName;
FAxis.Title.LabelFont.Size := TitleFontSize;
FAxis.Title.LabelFont.Color := TitleFontColor;
FAxis.Title.LabelFont.Style := TitleFontStyle;
FAxis.Title.LabelFont.Orientation := TitleFontOrientation;
FAxis.Title.Distance := TitleDistance;
FAxis.Title.Shape := TitleShape;
FAxis.Title.LabelBrush.Color := TitleBackgroundColor;
FAxis.Title.LabelBrush.Style := TitleBackgroundStyle;
FAxis.Title.Frame.Visible := TitleBorderVisible;
FAxis.Title.Frame.Color := TitleBorderColor;
FAxis.Title.Margins.Left := TitleMarginLeft;
FAxis.Title.Margins.Top := TitleMarginTop;
FAxis.Title.Margins.Right := TitleMarginRight;
FAxis.Title.Margins.Bottom := TitleMarginBottom;
// Axis range
FAxis.Range.Max := Maximum;
FAxis.Range.Min := Minimum;
FAxis.Range.UseMax := UseMax;
FAxis.Range.UseMin := UseMin;
FAxis.Inverted := Inverted;
// Tick labels
FAxis.Marks.Visible := LabelsVisible;
FAxis.Marks.Format := LabelsFormat;
FAxis.Marks.Distance := LabelsDistance;
FAxis.TickLength := TickLength;
FAxis.TickInnerLength := TickLengthInner;
FAxis.TickColor := TickColor;
FAxis.Marks.LabelFont.Name := LabelFontName;
FAxis.Marks.LabelFont.Size := LabelFontSize;
FAxis.Marks.LabelFont.Color := LabelFontColor;
FAxis.Marks.LabelFont.Style := LabelFontStyle;
FAxis.Marks.Shape := LabelShape;
FAxis.Marks.LabelBrush.Color := LabelBackgroundColor;
FAxis.Marks.LabelBrush.Style := LabelBackgroundStyle;
FAxis.Marks.Frame.Visible := LabelBorderVisible;
FAxis.Marks.Frame.Color := LabelBorderColor;
FAxis.Marks.Margins.Left := LabelMarginLeft;
FAxis.Marks.Margins.Top := LabelMarginTop;
FAxis.Marks.Margins.Right := LabelMarginRight;
FAxis.Marks.Margins.Bottom := LabelMarginBottom;
// Grid
FAxis.Grid.Visible := GridVisible;
FAxis.Grid.Style := GridPenStyle;
FAxis.Grid.Width := GridPenWidth;
FAxis.Grid.Color := GridPenColor;
// Frame
GetChart.Frame.Visible := FrameVisible;
GetChart.Frame.Style := FramePenStyle;
GetChart.Frame.Width := FramePenWidth;
GetChart.Frame.Color := FramePenColor;
// Arrow
FAxis.Arrow.Visible := ArrowVisible;
FAxis.Arrow.BaseLength := ArrowBaseLength;
FAxis.Arrow.Length := ArrowLength;
FAxis.Arrow.Width := ArrowWidth;
end;
finally
GetChart.EnableRedrawing;
end;
end;
procedure TChartAxisEditor.SaveAxisParams;
begin
with FSavedAxisParams do
begin
// General visibility
Visible := FAxis.Visible;
// Axis title
TitleVisible := FAxis.Title.visible;
TitleText := FAxis.Title.caption;
TitleAlignment := FAxis.Title.Alignment;
TitleFontName := FAxis.Title.LabelFont.Name;
TitleFontSize := FAxis.Title.LabelFont.Size;
TitleFontStyle := FAxis.Title.LabelFont.Style;
TitleFontColor := FAxis.Title.LabelFont.Color;
TitleFontOrientation := FAxis.Title.LabelFont.Orientation;
TitleDistance := FAxis.Title.Distance;
TitleShape := FAxis.Title.Shape;
TitleBackgroundStyle := FAxis.Title.LabelBrush.Style;
TitleBackgroundColor := FAxis.Title.LabelBrush.Color;
TitleBorderVisible := FAxis.Title.Frame.Visible;
TitleBorderColor := FAxis.Title.Frame.Color;
TitleMarginLeft := FAxis.Title.Margins.Left;
TitleMarginTop := FAXis.Title.Margins.Top;
TitleMarginRight := FAxis.Title.Margins.Right;
TitleMarginBottom := FAxis.Title.Margins.Bottom;
// Axis range
Maximum := FAxis.Range.Max;
Minimum := FAxis.Range.Min;
UseMax := FAxis.Range.UseMax;
UseMin := FAxis.Range.UseMin;
Inverted := FAxis.Inverted;
// Tick labels
LabelsVisible := FAxis.Marks.Visible;
LabelsFormat := FAxis.Marks.Format;
LabelsDistance := FAxis.Marks.Distance;
TickLength := FAxis.TickLength;
TickLengthInner := FAxis.TickInnerLength;
TickColor := FAxis.TickColor;
LabelFontName := FAxis.Marks.LabelFont.Name;
LabelFontSize := FAxis.Marks.LabelFont.Size;
LabelFontStyle := FAxis.Marks.LabelFont.Style;
LabelFontColor := FAxis.Marks.LabelFont.Color;
LabelShape := FAxis.Marks.Shape;
LabelBackgroundStyle := FAxis.Marks.LabelBrush.Style;
LabelBackgroundColor := FAxis.Marks.LabelBrush.Color;
LabelBorderVisible := FAxis.Marks.Frame.Visible;
LabelBorderColor := FAxis.Marks.Frame.Color;
LabelMarginLeft := FAxis.Marks.Margins.Left;
LabelMarginTop := FAxis.Marks.Margins.Top;
LabelMarginRight := FAxis.Marks.Margins.Right;
LabelMarginBottom := FAxis.Marks.Margins.Bottom;
// Grid
GridVisible := FAxis.Grid.Visible;
GridPenStyle := FAxis.Grid.Style;
GridPenWidth := FAxis.Grid.Width;
GridPenColor := FAxis.Grid.Color;
// Frame
FrameVisible := GetChart.Frame.Visible;
FramePenStyle := GetChart.Frame.Style;
FramePenWidth := GetChart.Frame.Width;
FramePenColor := GetChart.Frame.Color;
// Arrow
ArrowVisible := FAxis.Arrow.Visible;
ArrowBaseLength := FAxis.Arrow.BaseLength;
ArrowLength := FAxis.Arrow.Length;
ArrowWidth := FAxis.Arrow.Width;
end;
end;
procedure TChartAxisEditor.SetPage(AValue: TChartAxisEditorPage);
begin
FAxisFrame.Page := AValue;
end;
end.