Componentes.Terceros.jvcl/official/3.00/run/JvCheckBox.pas

476 lines
12 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvCheckBox.PAS, released on 2001-02-28.
The Initial Developer of the Original Code is Sébastien Buysse [sbuysse att buypin dott com]
Portions created by Sébastien Buysse are Copyright (C) 2001 Sébastien Buysse.
All Rights Reserved.
Contributor(s):
Michael Beck [mbeck att bigfoot dott com].
Ain Valtin - ReadOnly, Alignment, Layout, RightButton
Robert Marquardt RightButton renamed to LeftText
Peter Thörnqvist- added LinkedControls property
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvCheckBox.pas,v 1.59 2005/11/22 10:48:43 ahuser Exp $
unit JvCheckBox;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
{$IFDEF CLR}
Types,
{$ENDIF CLR}
Windows, Messages, Classes, Graphics, Controls, StdCtrls,
JvTypes, JvExStdCtrls, JvLinkedControls;
type
TJvCheckBox = class(TJvExCheckBox)
private
FHotTrack: Boolean;
FHotTrackFont: TFont;
FFontSave: TFont;
FHotTrackFontOptions: TJvTrackFontOptions;
FAutoSize: Boolean;
FCanvas: TControlCanvas;
FWordWrap: Boolean;
FAlignment: TAlignment;
FLayout: TTextLayout;
FLeftText: Boolean;
FReadOnly:Boolean;
FLinkedControls: TJvLinkedControls;
function GetCanvas: TCanvas;
procedure SetHotTrackFont(const Value: TFont);
procedure SetHotTrackFontOptions(const Value: TJvTrackFontOptions);
procedure SetWordWrap(const Value: Boolean);
procedure SetAlignment(const Value: TAlignment);
procedure SetLayout(const Value: TTextLayout);
procedure SetLeftText(const Value: Boolean);
function GetLinkedControls: TJvLinkedControls;
procedure SetLinkedControls(const Value: TJvLinkedControls);
procedure ReadAssociated(Reader: TReader);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation);override;
procedure MouseEnter(AControl: TControl); override;
procedure MouseLeave(AControl: TControl); override;
procedure TextChanged; override;
procedure FontChanged; override;
procedure EnabledChanged;override;
{$IFDEF VCL}
procedure CreateParams(var Params: TCreateParams); override;
procedure SetAutoSize(Value: Boolean); override;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure AdjustSize; override;
procedure SetAutoSize(Value: Boolean); virtual;
{$ENDIF VisualCLX}
procedure UpdateProperties;
procedure CalcAutoSize; virtual;
procedure Loaded; override;
procedure LinkedControlsChange(Sender: TObject);
procedure CheckLinkedControls; virtual;
procedure DefineProperties(Filer: TFiler); override;
{$IFDEF VCL}
procedure BmSetCheck(var Msg: TMessage); message BM_SETCHECK;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure StateChanged(State: TToggleState); override;
public
{$ENDIF VisualCLX}
procedure Toggle; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Canvas: TCanvas read GetCanvas;
published
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
// link the enabled state of other controls to the checked and/or enabled state of this control
property LinkedControls: TJvLinkedControls read GetLinkedControls write SetLinkedControls;
property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
property HintColor;
property HotTrack: Boolean read FHotTrack write FHotTrack default False;
property HotTrackFont: TFont read FHotTrackFont write SetHotTrackFont;
property HotTrackFontOptions: TJvTrackFontOptions read FHotTrackFontOptions write SetHotTrackFontOptions
default DefaultTrackFontOptions;
property Layout: TTextLayout read FLayout write SetLayout default tlCenter;
// show text to the left of the checkbox
property LeftText: Boolean read FLeftText write SetLeftText default False;
property ReadOnly: Boolean read FReadOnly write FReadOnly default False;
property WordWrap: Boolean read FWordWrap write SetWordWrap default False;
property OnMouseEnter;
property OnMouseLeave;
property OnParentColorChange;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvCheckBox.pas,v $';
Revision: '$Revision: 1.59 $';
Date: '$Date: 2005/11/22 10:48:43 $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
SysUtils,
JvJCLUtils, JvJVCLUtils;
constructor TJvCheckBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
FHotTrack := False;
FHotTrackFont := TFont.Create;
FFontSave := TFont.Create;
FHotTrackFontOptions := DefaultTrackFontOptions;
FAutoSize := True;
FWordWrap := False;
FAlignment := taLeftJustify;
FLeftText := False;
FLayout := tlCenter;
FReadOnly := False;
FLinkedControls := TJvLinkedControls.Create(Self);
FLinkedControls.OnChange := LinkedControlsChange;
end;
destructor TJvCheckBox.Destroy;
begin
FHotTrackFont.Free;
FFontSave.Free;
FreeAndNil(FLinkedControls);
inherited Destroy;
// (rom) destroy Canvas AFTER inherited Destroy
FCanvas.Free;
end;
procedure TJvCheckBox.Loaded;
begin
inherited Loaded;
CheckLinkedControls;
CalcAutoSize;
end;
{$IFDEF VCL}
procedure TJvCheckBox.CreateParams(var Params: TCreateParams);
const
cAlign: array [TAlignment] of Word = (BS_LEFT, BS_RIGHT, BS_CENTER);
cLeftText: array [Boolean] of Word = (0, BS_RIGHTBUTTON);
cLayout: array [TTextLayout] of Word = (BS_TOP, BS_VCENTER, BS_BOTTOM);
cWordWrap: array [Boolean] of Word = (0, BS_MULTILINE);
begin
inherited CreateParams(Params);
with Params do
Style := Style or cAlign[Alignment] or cLayout[Layout] or
cLeftText[LeftText] or cWordWrap[WordWrap];
end;
{$ENDIF VCL}
procedure TJvCheckBox.UpdateProperties;
begin
{$IFDEF VCL}
RecreateWnd;
{$ENDIF VCL}
{$IFDEF VisualCLX}
RecreateWidget;
{$ENDIF VisualCLX}
end;
{$IFDEF VisualCLX}
(*
procedure TJvCheckBox.UpdateProperties;
begin
{ TODO:
(ahuser) Missing features in CLX. If we implement it we must write a paint
function and do all drawing ourself.
Alignment
LeftText
Layout
WordWrap
}
end;
*)
procedure TJvCheckBox.AdjustSize;
begin
inherited AdjustSize;
CalcAutoSize;
end;
{$ENDIF VisualCLX}
procedure TJvCheckBox.MouseEnter(AControl: TControl);
begin
if csDesigning in ComponentState then
Exit;
if not MouseOver then
begin
if FHotTrack then
begin
FFontSave.Assign(Font);
Font.Assign(FHotTrackFont);
end;
inherited MouseEnter(AControl);
end;
end;
procedure TJvCheckBox.MouseLeave(AControl: TControl);
begin
if MouseOver then
begin
if FHotTrack then
Font.Assign(FFontSave);
inherited MouseLeave(AControl);
end;
end;
procedure TJvCheckBox.FontChanged;
begin
inherited FontChanged;
CalcAutoSize;
UpdateTrackFont(HotTrackFont, Font, HotTrackFontOptions);
end;
procedure TJvCheckBox.TextChanged;
begin
inherited TextChanged;
CalcAutoSize;
end;
procedure TJvCheckBox.CalcAutoSize;
const
Flags: array [Boolean] of Cardinal = (DT_SINGLELINE, DT_WORDBREAK);
var
AWidth, AHeight: Integer;
ASize: TSize;
R: TRect;
begin
if (Parent = nil) or not AutoSize or (csDestroying in ComponentState) or
(csLoading in ComponentState) then
Exit;
ASize := GetDefaultCheckBoxSize;
// add some spacing
{$IFDEF CLR}
ASize.cy := ASize.cy + 4;
{$ELSE}
Inc(ASize.cy, 4);
{$ENDIF CLR}
FCanvas.Font := Font;
R := Rect(0, 0, ClientWidth, ClientHeight);
// This is slower than GetTextExtentPoint but it does consider hotkeys
if Caption <> '' then
begin
DrawText(FCanvas, Caption, -1, R,
Flags[WordWrap] or DT_LEFT or DT_NOCLIP or DT_CALCRECT);
AWidth := (R.Right - R.Left) + ASize.cx + 8;
AHeight := R.Bottom - R.Top;
end
else
begin
AWidth := ASize.cx;
AHeight := ASize.cy;
end;
if AWidth < ASize.cx then
AWidth := ASize.cx;
if AHeight < ASize.cy then
AHeight := ASize.cy;
ClientWidth := AWidth;
ClientHeight := AHeight;
end;
procedure TJvCheckBox.SetHotTrackFont(const Value: TFont);
begin
FHotTrackFont.Assign(Value);
end;
procedure TJvCheckBox.SetAutoSize(Value: Boolean);
begin
if FAutoSize <> Value then
begin
{$IFDEF VCL}
//inherited SetAutoSize(Value);
{$ENDIF VCL}
FAutoSize := Value;
if Value then
WordWrap := False;
CalcAutoSize;
end;
end;
function TJvCheckBox.GetCanvas: TCanvas;
begin
Result := FCanvas;
end;
procedure TJvCheckBox.SetHotTrackFontOptions(const Value: TJvTrackFontOptions);
begin
if FHotTrackFontOptions <> Value then
begin
FHotTrackFontOptions := Value;
UpdateTrackFont(HotTrackFont, Font, FHotTrackFontOptions);
end;
end;
procedure TJvCheckBox.SetWordWrap(const Value: Boolean);
begin
if FWordWrap <> Value then
begin
FWordWrap := Value;
if Value then
AutoSize := False;
UpdateProperties;
end;
end;
procedure TJvCheckBox.SetAlignment(const Value: TAlignment);
begin
if FAlignment <> Value then
begin
FAlignment := Value;
UpdateProperties;
end;
end;
procedure TJvCheckBox.SetLayout(const Value: TTextLayout);
begin
if FLayout <> Value then
begin
FLayout := Value;
UpdateProperties;
end;
end;
procedure TJvCheckBox.SetLeftText(const Value: Boolean);
begin
if FLeftText <> Value then
begin
FLeftText := Value;
UpdateProperties;
end;
end;
function TJvCheckBox.GetLinkedControls: TJvLinkedControls;
begin
Result := FLinkedControls;
end;
procedure TJvCheckBox.SetLinkedControls(const Value: TJvLinkedControls);
begin
FLinkedControls.Assign(Value);
end;
procedure TJvCheckBox.CheckLinkedControls;
var
I: Integer;
begin
if LinkedControls <> nil then
for I := 0 to LinkedControls.Count - 1 do
with LinkedControls[I] do
if Control <> nil then
Control.Enabled := CheckLinkControlEnabled(Self.Enabled, Self.Checked, Options);
end;
procedure TJvCheckBox.LinkedControlsChange(Sender: TObject);
begin
CheckLinkedControls;
end;
procedure TJvCheckBox.ReadAssociated(Reader: TReader);
var
C: TComponent;
begin
if Owner <> nil then
C := Owner.FindComponent(Reader.ReadIdent)
else
C := nil;
if (C is TControl) and (LinkedControls <> nil) then
LinkedControls.Add.Control := TControl(C);
end;
procedure TJvCheckBox.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineProperty('Associated', ReadAssociated, nil, False);
end;
{$IFDEF VCL}
procedure TJvCheckBox.BmSetCheck(var Msg: TMessage);
begin
// if not ReadOnly then
// begin
inherited;
CheckLinkedControls;
// end;
end;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure TJvCheckBox.StateChanged(State: TToggleState);
begin
// if not ReadOnly then
// begin
inherited StateChanged(State);
CheckLinkedControls;
// end;
end;
{$ENDIF VisualCLX}
procedure TJvCheckBox.EnabledChanged;
begin
inherited EnabledChanged;
CheckLinkedControls;
end;
procedure TJvCheckBox.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if Assigned(FLinkedControls) then
LinkedControls.Notification(AComponent, Operation);
end;
procedure TJvCheckBox.Toggle;
begin
if not ReadOnly then
begin
inherited;
CheckLinkedControls;
end;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.