224 lines
5.1 KiB
ObjectPascal
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.
|