lasarus_compotents/bgracontrols/bgrathemecheckbox.pas

224 lines
5.1 KiB
ObjectPascal

// SPDX-License-Identifier: LGPL-3.0-linking-exception
unit BGRAThemeCheckBox;
{$mode delphi}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
BGRATheme, Types, LMessages, LCLType;
type
{ TBGRAThemeCheckBox }
TBGRAThemeCheckBox = class(TBGRAThemeControl)
private
FChecked: boolean;
FOnChange: TNotifyEvent;
FState: TBGRAThemeButtonState;
procedure SetChecked(AValue: boolean);
protected
procedure KeyDown(var Key: word; Shift: TShiftState); override;
procedure KeyUp(var Key: word; Shift: TShiftState); override;
procedure WMSetFocus(var Message: {$IFDEF FPC}TLMSetFocus{$ELSE}TWMSetFocus{$ENDIF}); message {$IFDEF FPC}LM_SETFOCUS{$ELSE}WM_SETFOCUS{$ENDIF};
procedure WMKillFocus(var Message: {$IFDEF FPC}TLMKillFocus{$ELSE}TWMKillFocus{$ENDIF}); message {$IFDEF FPC}LM_KILLFOCUS{$ELSE}WM_KILLFOCUS{$ENDIF};
procedure UpdateFocus(AFocused: boolean);
class function GetControlClassDefaultSize: TSize; override;
procedure MouseEnter; override;
procedure MouseLeave; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
procedure Click; override;
procedure SetEnabled(Value: boolean); override;
procedure TextChanged; override;
procedure Paint; override;
procedure Resize; override;
public
constructor Create(AOwner: TComponent); override;
published
property Align;
property Anchors;
property BorderSpacing;
property Caption;
property Checked: boolean read FChecked write SetChecked;
property Font;
property Enabled;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property TabStop;
property TabOrder;
end;
procedure Register;
implementation
uses BGRABitmapTypes;
procedure Register;
begin
RegisterComponents('BGRA Themes', [TBGRAThemeCheckBox]);
end;
{ TBGRAThemeCheckBox }
procedure TBGRAThemeCheckBox.SetChecked(AValue: boolean);
begin
if FChecked = AValue then
Exit;
FChecked := AValue;
Invalidate;
if Assigned(FOnChange) then FOnChange(Self);
end;
procedure TBGRAThemeCheckBox.KeyDown(var Key: word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
if (Key = VK_SPACE) or (Key = VK_RETURN) then
MouseDown(mbLeft, [], 0, 0);
end;
procedure TBGRAThemeCheckBox.KeyUp(var Key: word; Shift: TShiftState);
begin
if (Key = VK_SPACE) or (Key = VK_RETURN) then
begin
MouseUp(mbLeft, [], 0, 0);
MouseLeave;
end;
inherited KeyUp(Key, Shift);
end;
procedure TBGRAThemeCheckBox.WMSetFocus(var Message: TLMSetFocus);
begin
inherited;
UpdateFocus(True);
end;
procedure TBGRAThemeCheckBox.WMKillFocus(var Message: TLMKillFocus);
begin
inherited;
if Message.FocusedWnd <> Handle then
UpdateFocus(False);
end;
procedure TBGRAThemeCheckBox.UpdateFocus(AFocused: boolean);
var
lForm: TCustomForm;
begin
lForm := GetParentForm(Self);
if lForm = nil then
exit;
{$IFDEF FPC}//#
if AFocused then
ActiveDefaultControlChanged(lForm.ActiveControl)
else
ActiveDefaultControlChanged(nil);
{$ENDIF}
Invalidate;
end;
class function TBGRAThemeCheckBox.GetControlClassDefaultSize: TSize;
begin
Result.CX := 165;
Result.CY := 19;
end;
procedure TBGRAThemeCheckBox.MouseEnter;
begin
inherited MouseEnter;
FState := btbsHover;
Invalidate;
end;
procedure TBGRAThemeCheckBox.MouseLeave;
begin
inherited MouseLeave;
FState := btbsNormal;
Invalidate;
end;
procedure TBGRAThemeCheckBox.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: integer);
begin
inherited MouseDown(Button, Shift, X, Y);
FState := btbsActive;
Invalidate;
end;
procedure TBGRAThemeCheckBox.MouseUp(Button: TMouseButton;
Shift: TShiftState; X, Y: integer);
begin
inherited MouseUp(Button, Shift, X, Y);
if ClientRect.Contains(Point(X, Y)) then
FState := btbsHover
else
FState := btbsNormal;
if ClientRect.Contains(Point(X, Y)) then
Checked := not FChecked
else
Invalidate;
end;
procedure TBGRAThemeCheckBox.Click;
begin
inherited Click;
end;
procedure TBGRAThemeCheckBox.SetEnabled(Value: boolean);
begin
inherited SetEnabled(Value);
if Value then
FState := btbsNormal
else
FState := btbsDisabled;
Invalidate;
end;
procedure TBGRAThemeCheckBox.TextChanged;
begin
inherited TextChanged;
Invalidate;
end;
procedure TBGRAThemeCheckBox.Paint;
var
surface: TBGRAThemeSurface;
begin
surface := TBGRAThemeSurface.Create(self);
try
if Assigned(Theme) then
Theme.DrawCheckBox(Caption, FState, Focused, Checked, ClientRect, surface)
else
BGRADefaultTheme.DrawCheckBox(Caption, FState, Focused, Checked, ClientRect, surface);
finally
surface.Free;
end;
end;
procedure TBGRAThemeCheckBox.Resize;
begin
Invalidate;
inherited Resize;
end;
constructor TBGRAThemeCheckBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FState := btbsNormal;
ControlStyle := ControlStyle + [csParentBackground, csAcceptsControls];
with GetControlClassDefaultSize do
SetInitialBounds(0, 0, CX, CY);
end;
end.