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