{%MainUnit ../stdctrls.pp} {****************************************************************************** TCustomCheckbox ****************************************************************************** ***************************************************************************** This file is part of the Lazarus Component Library (LCL) See the file COPYING.modifiedLGPL.txt, included in this distribution, for details about the license. ***************************************************************************** Delphi compatibility: - alignment property is missing } {------------------------------------------------------------------------------ Method: TCustomCheckBox.SetState Params: value: new state of the object Returns: Nothing Set new state of the checkbox. ------------------------------------------------------------------------------} procedure TCustomCheckBox.SetState(Value: TCheckBoxState); var OldCheckState: TCheckBoxState; OldActionListState: TActionListState; LAction: TBasicAction; begin LAction := Action; // property getter is function, call only once. // TAction does not have the 3rd state, nothing meaningful can be done then if Value <> cbGrayed then begin // no infinite recursion when we would be called again later by TAction itself if not ClicksDisabled then begin if LAction is TCustomAction then begin TCustomAction(LAction).Checked := Value = cbChecked; Exit; end; end; end; if FState <> Value then begin OldCheckState := FState; FState := Value; ApplyChanges; // some widgetsets like gtk* do not allow to uncheck a radio button // only call OnChange if effectivelly changed FState := RetrieveState; if FState <> OldCheckState then begin if LAction is TCustomAction then begin // Prevent triggering a linked Action when State = cbGrayed. if FState = cbGrayed then begin OldActionListState := TCustomAction(LAction).ActionList.State; TCustomAction(LAction).ActionList.State := asSuspended; TCustomAction(LAction).Grayed := True; end; end; DoClickOnChange; if LAction is TCustomAction then begin if FState = cbGrayed then TCustomAction(LAction).ActionList.State := OldActionListState else TCustomAction(LAction).Grayed := False; end; end; end; end; function TCustomCheckBox.GetAlignment: TLeftRight; begin Result := FAlignment; end; procedure TCustomCheckBox.SetAlignment(AValue: TLeftRight); begin if (GetAlignment = AValue) then Exit; FAlignment := AValue; if HandleAllocated and (not (csLoading in ComponentState)) then begin //debugln('TCustomCheckBox.SetAlignment ',dbgsname(Self),' ',dbgs((FAlignment)),' ',WidgetSetClass.ClassName); TWSCustomCheckBoxClass(WidgetSetClass).SetAlignment(Self, FAlignment); end; end; {------------------------------------------------------------------------------ Method: TCustomCheckBox.GetState Params: none Returns: current state of the object Get current state of the checkbox. To get the real state a call to the interface is made here. ------------------------------------------------------------------------------} function TCustomCheckBox.GetState: TCheckBoxState; begin FState := RetrieveState; Result := FState; end; procedure TCustomCheckBox.DoChange(var Msg); begin FState := RetrieveState; DoClickOnChange; end; class procedure TCustomCheckBox.WSRegisterClass; begin inherited WSRegisterClass; RegisterCustomCheckBox; end; procedure TCustomCheckBox.Click; begin // skip clicks by WM_MOUSEUP end; function TCustomCheckBox.RetrieveState: TCheckBoxState; begin Result := FState; // get the actual state of the component // don't read from interface during loading if HandleAllocated and ([csLoading,csDestroying]*ComponentState=[]) then begin Result := TWSCustomCheckBoxClass(WidgetSetClass).RetrieveState(Self); //debugln('TCustomCheckBox.RetrieveState ',dbgsname(Self),' ',dbgs(ord(Result))); end; end; {------------------------------------------------------------------------------ Method: TCustomCheckBox.Create Params: TheOwner: the owner of the class Returns: Nothing Constructor for custom checkbox. ------------------------------------------------------------------------------} constructor TCustomCheckBox.Create(TheOwner: TComponent); begin inherited Create(TheOwner); FAlignment := taRightJustify; //todo: move to TButtonControl with GetControlClassDefaultSize do SetInitialBounds(0, 0, CX, CY); end; {------------------------------------------------------------------------------ Method: TCustomCheckBox.InitializeWnd Params: none Returns: Nothing Set all properties after visual component has been created. Will be called from TWinControl. ------------------------------------------------------------------------------} procedure TCustomCheckBox.InitializeWnd; begin inherited InitializeWnd; ApplyChanges; end; {------------------------------------------------------------------------------ Method: TCustomCheckBox.GetChecked Params: none Returns: current state of the object Get current state of the checkbox and return it as boolean. ------------------------------------------------------------------------------} function TCustomCheckBox.GetChecked : Boolean; begin Result := (GetState = cbChecked); end; {------------------------------------------------------------------------------ Method: TCustomCheckBox.SetChecked Params: Value - new state of checkbox Returns: Nothing Set the new state of the checkbox as boolean. ------------------------------------------------------------------------------} procedure TCustomCheckBox.SetChecked(Value : Boolean); begin if Value then State := cbChecked else State := cbUnChecked; end; procedure TCustomCheckBox.RealSetText(const Value: TCaption); begin if Value = Text then Exit; inherited RealSetText(Value); end; {------------------------------------------------------------------------------ Method: TCustomCheckBox.Toggle Params: none Returns: Nothing Toggle the current state of the checkbox. ------------------------------------------------------------------------------} procedure TCustomCheckBox.Toggle; begin SetChecked(not GetChecked); end; {------------------------------------------------------------------------------ Method: TCustomCheckBox.ApplyChanges Params: none Returns: Nothing Sends message to update the visual apperance of the object. ------------------------------------------------------------------------------} procedure TCustomCheckBox.ApplyChanges; begin if HandleAllocated and (not (csLoading in ComponentState)) then begin //debugln('TCustomCheckBox.ApplyChanges ',dbgsname(Self),' ',dbgs(ord(FState)),' ',WidgetSetClass.ClassName); TWSCustomCheckBoxClass(WidgetSetClass).SetState(Self, FState); end; end; class function TCustomCheckBox.GetControlClassDefaultSize: TSize; begin Result.CX := 90; Result.CY := 23; end; procedure TCustomCheckBox.Loaded; begin // Send first the FState to the interface before calling inherited, // otherwise the FState will be lost and the default interface State is taken. if HandleAllocated then TWSCustomCheckBoxClass(WidgetSetClass).SetState(Self, FState); inherited Loaded; end; procedure TCustomCheckBox.WSSetText(const AText: String); var ParseStr : String; AccelIndex : Longint; begin if (not HandleAllocated) then exit; if not (csDesigning in ComponentState) then begin ParseStr := AText; AccelIndex := DeleteAmpersands(ParseStr); if AccelIndex > -1 then begin FShortCut := Menus.ShortCut(Char2VK(ParseStr[AccelIndex]), [ssCtrl]); TWSCustomCheckBoxClass(WidgetSetClass).SetShortCut(Self, FShortCut, FShortCutKey2); end; end; inherited WSSetText(AText); end; procedure TCustomCheckBox.TextChanged; begin InvalidatePreferredSize; if (Parent<>nil) and Parent.AutoSize then Parent.AdjustSize; AdjustSize; inherited TextChanged; end; procedure TCustomCheckBox.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.Style := Params.Style or BS_3STATE; if (FAlignment = taLeftJustify) then Params.Style := Params.Style or BS_RIGHTBUTTON; end; procedure TCustomCheckBox.DoClickOnChange; begin Changed; // emulate delphi OnClick behaviour (click will call OnChange) if not ClicksDisabled then inherited Click else DoOnChange; end; function TCustomCheckBox.DialogChar(var Message: TLMKey): boolean; begin if IsAccel(Message.CharCode, Caption) and CanFocus then begin SetFocus; if Focused then Toggle; Result := true; end else Result := inherited; end; // included by stdctrls.pp