File: cesimplepenframe.pas

package info (click to toggle)
lazarus 2.2.6%2Bdfsg2-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 219,980 kB
  • sloc: pascal: 1,944,919; xml: 357,634; makefile: 270,608; cpp: 57,115; sh: 3,249; java: 609; perl: 297; sql: 222; ansic: 137
file content (134 lines) | stat: -rw-r--r-- 3,429 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
unit ceSimplePenFrame;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Graphics, Forms, Controls, StdCtrls, Dialogs,
  TATypes, TAChartCombos;

type

  { TSimpleChartPenFrame }

  TSimpleChartPenFrame = class(TFrame)
    cbPenColor: TColorButton;
    cbVisible: TCheckBox;
    cbPenWidth: TChartComboBox;
    lblPenWidth: TLabel;
    procedure cbPenColorColorChanged(Sender: TObject);
    procedure cbPenWidthChange(Sender: TObject);
    procedure cbVisibleChange(Sender: TObject);
    procedure FrameResize(Sender: TObject);
  private
    FPen: TChartPen;
    FOnChange: TNotifyEvent;
    procedure DoChange;
    function GetWidthLeft: Integer;
    procedure SetWidthLeft(const AValue: Integer);
  protected
    procedure CalculatePreferredSize(
      var PreferredWidth, PreferredHeight: integer;
      {%H-}WithThemeSpace: Boolean); override;
  public
    constructor Create(AOwner: TComponent); override;
    procedure GetData(APen: TChartPen);
    procedure Prepare(APen: TChartPen);
    property WidthLeft: Integer read GetWidthLeft write SetWidthLeft;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;

implementation

{$R *.lfm}

uses
  LCLIntf, LCLType, Math;

{ TSimpleChartPenFrame }

constructor TSimpleChartPenFrame.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  cbPenWidth.DropdownCount := DEFAULT_DROPDOWN_COUNT;
  cbPenColor.Width := cbPenColor.Height;
end;

procedure TSimpleChartPenFrame.CalculatePreferredSize(
  var PreferredWidth, PreferredHeight: integer;
  WithThemeSpace: Boolean);
begin
  PreferredWidth := Max(
    cbPenColor.Left + cbPenColor.Width,
    cbPenWidth.Left + cbPenWidth.Constraints.MinWidth
  );
  PreferredHeight := cbPenWidth.Top + cbPenWidth.Height;
end;

procedure TSimpleChartPenFrame.cbPenColorColorChanged(Sender: TObject);
begin
  FPen.Color := cbPenColor.ButtonColor;
  DoChange;
end;

procedure TSimpleChartPenFrame.cbPenWidthChange(Sender: TObject);
begin
  FPen.Width := cbPenWidth.PenWidth;
  DoChange;
end;

procedure TSimpleChartPenFrame.cbVisibleChange(Sender: TObject);
begin
  FPen.Visible := cbVisible.Checked;
  if FPen.Visible then FPen.Style := psSolid else FPen.Style := psClear;
  cbPenColor.Enabled := cbVisible.Checked;
  cbPenWidth.Enabled := cbVisible.Checked;
  lblPenWidth.Enabled := cbVisible.Checked;
  DoChange;
end;

procedure TSimpleChartPenFrame.DoChange;
begin
  if Assigned(FOnChange) then FOnChange(FPen);
end;

procedure TSimpleChartPenFrame.FrameResize(Sender: TObject);
begin
  cbPenWidth.SymbolWidth := cbPenWidth.ClientWidth - GetSystemMetrics(SM_CXVSCROLL) - 16;
end;

// Transfers the properties of the GUI elements (or the internal pen) to the pen.
procedure TSimpleChartPenFrame.GetData(APen: TChartPen);
begin
  APen.Assign(FPen);
end;

function TSimpleChartPenFrame.GetWidthLeft: Integer;
begin
  Result := cbPenWidth.Left;
end;

// Applies the pen properties to the GUI elements
procedure TSimpleChartPenFrame.Prepare(APen: TChartPen);
begin
  FPen := APen;
  cbVisible.Checked := APen.EffVisible;
  cbPenWidth.PenWidth := APen.Width;
  if APen.Color = clDefault then
    cbPenColor.ButtonColor := ColorToRGB(clWindowText)
  else
    cbPenColor.ButtonColor := ColorToRGB(APen.Color);
end;

procedure TSimpleChartPenFrame.SetWidthLeft(const AValue: Integer);
var
  d: Integer;
begin
  d := AValue - lblPenWidth.Width;
  if d > 0 then
    cbPenWidth.BorderSpacing.Left := d;
end;

end.