{ fpGUI - Free Pascal GUI Toolkit Copyright (C) 2006 - 2008 See the file AUTHORS.txt, included in this distribution, for details of the copyright. See the file COPYING.modifiedLGPL, included in this distribution, for details about redistributing fpGUI. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Description: Defines a CheckBox control. Also known as a Check Button control. } unit gui_checkbox; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fpgfx, gfxbase, gfx_widget; type { TfpgCheckBox } TfpgCheckBox = class(TfpgWidget) private FChecked: boolean; FOnChange: TNotifyEvent; FText: string; FFont: TfpgFont; FBoxSize: integer; FIsPressed: boolean; function GetFontDesc: string; procedure SetChecked(const AValue: boolean); procedure SetFontDesc(const AValue: string); procedure SetText(const AValue: string); protected procedure HandlePaint; override; procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override; procedure HandleLMouseUp(x, y: integer; shiftstate: TShiftState); override; procedure HandleKeyRelease(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Font: TfpgFont read FFont; published property BackgroundColor; property Checked: boolean read FChecked write SetChecked default False; property FontDesc: string read GetFontDesc write SetFontDesc; property TabOrder; property Text: string read FText write SetText; property TextColor; property OnChange: TNotifyEvent read FOnChange write FOnChange; end; function CreateCheckBox(AOwner: TComponent; x, y: TfpgCoord; AText: string): TfpgCheckBox; implementation function CreateCheckBox(AOwner: TComponent; x, y: TfpgCoord; AText: string): TfpgCheckBox; begin Result := TfpgCheckBox.Create(AOwner); Result.Top := y; Result.Left := x; Result.Text := AText; Result.Width := Result.Font.TextWidth(Result.Text) + 24; end; { TfpgCheckBox } procedure TfpgCheckBox.SetChecked(const AValue: boolean); begin if FChecked = AValue then Exit; //==> FChecked := AValue; RePaint; end; function TfpgCheckBox.GetFontDesc: string; begin Result := FFont.FontDesc; end; procedure TfpgCheckBox.SetFontDesc(const AValue: string); begin FFont.Free; FFont := fpgGetFont(AValue); RePaint; end; procedure TfpgCheckBox.SetText(const AValue: string); begin if FText = AValue then Exit; //==> FText := AValue; RePaint; end; procedure TfpgCheckBox.HandlePaint; var r: TfpgRect; ty: integer; tx: integer; ix: integer; img: TfpgImage; begin inherited HandlePaint; Canvas.SetColor(FBackgroundColor); Canvas.FillRectangle(0, 0, Width, Height); Canvas.SetFont(Font); if FFocused then begin Canvas.SetColor(clText1); Canvas.SetLineStyle(1, lsDot); Canvas.DrawRectangle(1, 1, Width-1, Height-1); end; Canvas.SetLineStyle(1, lsSolid); r.SetRect(2, (Height div 2) - (FBoxSize div 2), FBoxSize, FBoxSize); if r.top < 0 then r.top := 0; // calculate which image to paint. if Enabled then begin ix := Ord(FChecked); if FIsPressed then Inc(ix, 2); end else ix := (2 + (Ord(FChecked) * 2)) - Ord(FChecked); // paint the check (in this case a X) tx := r.right + 8; inc(r.left, 2); inc(r.top, 1); img := fpgImages.GetImage('sys.checkboxes'); // Do NOT localize Canvas.DrawImagePart(r.Left, r.Top, img, ix*13, 0, 13, 13); ty := (Height div 2) - (Font.Height div 2); if ty < 0 then ty := 0; Canvas.SetTextColor(FTextColor); fpgStyle.DrawString(Canvas, tx, ty, FText, Enabled); end; procedure TfpgCheckBox.HandleLMouseDown(x, y: integer; shiftstate: TShiftState); begin inherited HandleLMouseDown(x, y, shiftstate); FIsPressed := True; Repaint; end; procedure TfpgCheckBox.HandleLMouseUp(x, y: integer; shiftstate: TShiftState); begin inherited HandleLMouseUp(x, y, shiftstate); FIsPressed := False; Checked := not FChecked; if Assigned(FOnChange) then FOnChange(self); end; procedure TfpgCheckBox.HandleKeyRelease(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); begin if (keycode = keySpace) or (keycode = keyReturn) or (keycode = keyPEnter) then begin consumed := True; Checked := not FChecked; if Assigned(FOnChange) then FOnChange(self); end; if consumed then Exit; //==> inherited HandleKeyRelease(keycode, shiftstate, consumed); end; constructor TfpgCheckBox.Create(AOwner: TComponent); begin inherited Create(AOwner); FText := 'CheckBox'; FFont := fpgGetFont('#Label1'); FHeight := FFont.Height + 4; FWidth := 120; FTextColor := Parent.TextColor; FBackgroundColor := Parent.BackgroundColor; FFocusable := True; FBoxSize := 14; FChecked := False; FIsPressed := False; FOnChange := nil; end; destructor TfpgCheckBox.Destroy; begin FFont.Free; inherited Destroy; end; end.