lazarus-ccr/components/orpheus/ovceditf.pas

427 lines
12 KiB
ObjectPascal

{*********************************************************}
{* OVCEDITF.PAS 4.06 *}
{*********************************************************}
{* ***** BEGIN LICENSE BLOCK ***** *}
{* Version: MPL 1.1 *}
{* *}
{* 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/ *}
{* *}
{* Software distributed under the License is distributed on an "AS IS" basis, *}
{* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License *}
{* for the specific language governing rights and limitations under the *}
{* License. *}
{* *}
{* The Original Code is TurboPower Orpheus *}
{* *}
{* The Initial Developer of the Original Code is TurboPower Software *}
{* *}
{* Portions created by TurboPower Software Inc. are Copyright (C)1995-2002 *}
{* TurboPower Software Inc. All Rights Reserved. *}
{* *}
{* Contributor(s): *}
{* *}
{* ***** END LICENSE BLOCK ***** *}
{$I OVC.INC}
{$B-} {Complete Boolean Evaluation}
{$I+} {Input/Output-Checking}
{$P+} {Open Parameters}
{$T-} {Typed @ Operator}
{.W-} {Windows Stack Frame}
{$X+} {Extended Syntax}
{$J+} {Writable constants}
unit ovceditf;
{-old style base edit field class w/ attached label}
{to be deprecated in a future release}
interface
uses
{$IFNDEF LCL} Windows, Messages, {$ELSE} LclIntf, LMessages, MyMisc, {$ENDIF}
Buttons, Classes, Controls, ExtCtrls, Forms, Graphics, Menus,
StdCtrls, SysUtils, OvcBase, OvcConst, OvcData, OvcExcpt, OvcVer, OvcMisc;
type
TOvcCustomEdit = class(TCustomEdit)
protected {private}
{property variables}
FController : TOvcController;
FLabelInfo : TOvcLabelInfo;
{$IFDEF LCL}
FCtl3D : Boolean;
{$ENDIF}
{property methods}
function GetAbout : string;
function GetAttachedLabel : TOvcAttachedLabel;
procedure SetAbout(const Value : string);
procedure SetController(Value : TOvcController);
{internal methods}
procedure LabelChange(Sender : TObject);
procedure LabelAttach(Sender : TObject; Value : Boolean);
procedure PositionLabel;
{VCL message methods}
procedure CMVisibleChanged(var Msg : TMessage); message CM_VISIBLECHANGED;
procedure OrAssignLabel(var Msg : TMessage); message OM_ASSIGNLABEL;
procedure OrPositionLabel(var Msg : TMessage); message OM_POSITIONLABEL;
procedure OrRecordLabelPosition(var Msg : TMessage);
message OM_RECORDLABELPOSITION;
protected
{descendants can set the value of this variable after calling inherited }
{create to set the default location and point-of-reference (POR) for the}
{attached label. if dlpTopLeft, the default location and POR will be at }
{the top left of the control. if dlpBottomLeft, the default location and}
{POR will be at the bottom left}
DefaultLabelPosition : TOvcLabelPosition;
procedure CreateWnd; override;
procedure Notification(AComponent : TComponent; Operation: TOperation);
override;
function ControllerAssigned : Boolean;
property About : string read GetAbout write SetAbout stored False;
property LabelInfo : TOvcLabelInfo read FLabelInfo write FLabelInfo;
{$IFDEF LCL}
property Ctl3D : Boolean read FCtl3D write FCtl3D;
{$ENDIF}
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
property AttachedLabel : TOvcAttachedLabel read GetAttachedLabel;
property Controller : TOvcController read FController write SetController;
end;
TOvcEdit = class(TOvcCustomEdit)
published
{properties}
{$IFDEF VERSION4}
property Anchors;
{$IFNDEF LCL}
property BiDiMode;
property ParentBiDiMode;
{$ENDIF}
property Constraints;
property DragKind;
{$ENDIF}
property About;
{$IFNDEF LCL}
property AutoSelect;
{$ENDIF}
property AutoSize;
property BorderStyle;
property CharCase;
property Color;
property Controller;
property Ctl3D;
property Cursor;
property DragCursor;
property DragMode;
property Enabled;
property Font;
{$IFNDEF LCL}
property HideSelection;
property ImeMode;
property ImeName;
{$ENDIF}
property LabelInfo;
property MaxLength;
{$IFNDEF LCL}
property OEMConvert;
{$ENDIF}
property ParentColor;
{$IFNDEF LCL}
property ParentCtl3D;
{$ENDIF}
property ParentFont;
property ParentShowHint;
property PasswordChar;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
{events}
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
{$IFDEF VERSION4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
end;
implementation
{===== TOvcCustomEdit ================================================}
procedure TOvcCustomEdit.CMVisibleChanged(var Msg : TMessage);
begin
inherited;
if csLoading in ComponentState then
Exit;
if LabelInfo.Visible then
AttachedLabel.Visible := Visible;
end;
{=====}
function TOvcCustomEdit.ControllerAssigned : Boolean;
begin
Result := Assigned(FController);
end;
{=====}
constructor TOvcCustomEdit.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csSetCaption];
{set default position and reference point}
DefaultLabelPosition := lpTopLeft;
FLabelInfo := TOvcLabelInfo.Create;
FLabelInfo.OnChange := LabelChange;
FLabelInfo.OnAttach := LabelAttach;
end;
{=====}
procedure TOvcCustomEdit.CreateWnd;
var
OurForm : TWinControl;
begin
OurForm := GetImmediateParentForm(Self);
{do this only when the component is first dropped on the form, not during loading}
if (csDesigning in ComponentState) and not (csLoading in ComponentState) then
ResolveController(OurForm, FController);
if not Assigned(FController) and not (csLoading in ComponentState) then begin
{try to find a controller on this form that we can use}
FController := FindController(OurForm);
{if not found and we are not designing, use default controller}
if not Assigned(FController) and not (csDesigning in ComponentState) then
FController := DefaultController;
end;
inherited CreateWnd;
end;
{=====}
destructor TOvcCustomEdit.Destroy;
begin
{detatch and destroy label, if any}
FLabelInfo.Visible := False;
{destroy label info}
FLabelInfo.Free;
FLabelInfo := nil;
inherited Destroy;
end;
{=====}
function TOvcCustomEdit.GetAttachedLabel : TOvcAttachedLabel;
begin
if not FLabelInfo.Visible then
raise Exception.Create(GetOrphStr(SCLabelNotAttached));
Result := FLabelInfo.ALabel;
end;
{=====}
function TOvcCustomEdit.GetAbout : string;
begin
Result := OrVersionStr;
end;
{=====}
procedure TOvcCustomEdit.LabelAttach(Sender : TObject; Value : Boolean);
var
{$IFDEF VERSION5}
PF : TWinControl;
{$ELSE}
PF : TForm;
{$ENDIF}
S :string;
begin
if csLoading in ComponentState then
Exit;
{$IFDEF VERSION5}
PF := GetImmediateParentForm(Self);
{$ELSE}
PF := TForm(GetParentForm(Self));
{$ENDIF}
if Value then begin
if Assigned(PF) then begin
FLabelInfo.ALabel.Free;
FLabelInfo.ALabel := TOvcAttachedLabel.CreateEx(PF, Self);
FLabelInfo.ALabel.Parent := Parent;
S := GenerateComponentName(PF, Name + 'Label');
FLabelInfo.ALabel.Name := S;
FLabelInfo.ALabel.Caption := S;
FLabelInfo.SetOffsets(0, 0);
PositionLabel;
FLabelInfo.ALabel.BringToFront;
{turn off auto size}
TLabel(FLabelInfo.ALabel).AutoSize := False;
end;
end else begin
if Assigned(PF) then begin
FLabelInfo.ALabel.Free;
FLabelInfo.ALabel := nil;
end;
end;
end;
{=====}
procedure TOvcCustomEdit.LabelChange(Sender : TObject);
begin
if not (csLoading in ComponentState) then
PositionLabel;
end;
{=====}
procedure TOvcCustomEdit.Notification(AComponent : TComponent; Operation: TOperation);
var
{$IFDEF VERSION5}
PF : TWinControl;
{$ELSE}
PF : TForm;
{$ENDIF}
begin
inherited Notification(AComponent, Operation);
if Operation = opRemove then
if Assigned(FLabelInfo) and (AComponent = FLabelInfo.ALabel) then begin
{$IFDEF VERSION5}
PF := GetImmediateParentForm(Self);
{$ELSE}
PF := TForm(GetParentForm(Self));
{$ENDIF}
if Assigned(PF) and not (csDestroying in PF.ComponentState) then begin
FLabelInfo.FVisible := False;
FLabelInfo.ALabel := nil;
end
end;
if (AComponent = FController) and (Operation = opRemove) then
FController := nil
else if (Operation = opInsert) and (FController = nil) then begin
if (AComponent is TOvcController) then
FController := TOvcController(AComponent);
end;
end;
{=====}
procedure TOvcCustomEdit.OrAssignLabel(var Msg : TMessage);
begin
FLabelInfo.ALabel := TOvcAttachedLabel(Msg.lParam);
end;
{=====}
procedure TOvcCustomEdit.OrPositionLabel(var Msg : TMessage);
const
DX : Integer = 0;
DY : Integer = 0;
begin
if FLabelInfo.Visible and Assigned(FLabelInfo.ALabel) and
(FLabelInfo.ALabel.Parent <> nil) and
not (csLoading in ComponentState) then begin
if DefaultLabelPosition = lpTopLeft then begin
DX := FLabelInfo.ALabel.Left - Left;
DY := FLabelInfo.ALabel.Top + FLabelInfo.ALabel.Height - Top;
end else begin
DX := FLabelInfo.ALabel.Left - Left;
DY := FLabelInfo.ALabel.Top - Top - Height;
end;
if (DX <> FLabelInfo.OffsetX) or (DY <> FLabelInfo.OffsetY) then
PositionLabel;
end;
end;
{=====}
procedure TOvcCustomEdit.OrRecordLabelPosition(var Msg : TMessage);
begin
if Assigned(FLabelInfo.ALabel) and (FLabelInfo.ALabel.Parent <> nil) then begin
{if the label was cut and then pasted, this will complete the reattachment}
FLabelInfo.FVisible := True;
if DefaultLabelPosition = lpTopLeft then
FLabelInfo.SetOffsets(FLabelInfo.ALabel.Left - Left,
FLabelInfo.ALabel.Top + FLabelInfo.ALabel.Height - Top)
else
FLabelInfo.SetOffsets(FLabelInfo.ALabel.Left - Left,
FLabelInfo.ALabel.Top - Top - Height);
end;
end;
{=====}
procedure TOvcCustomEdit.PositionLabel;
begin
if FLabelInfo.Visible and Assigned(FLabelInfo.ALabel) and
(FLabelInfo.ALabel.Parent <> nil) and
not (csLoading in ComponentState) then begin
if DefaultLabelPosition = lpTopLeft then begin
FLabelInfo.ALabel.SetBounds(Left + FLabelInfo.OffsetX,
FLabelInfo.OffsetY - FLabelInfo.ALabel.Height + Top,
FLabelInfo.ALabel.Width, FLabelInfo.ALabel.Height);
end else begin
FLabelInfo.ALabel.SetBounds(Left + FLabelInfo.OffsetX,
FLabelInfo.OffsetY + Top + Height,
FLabelInfo.ALabel.Width, FLabelInfo.ALabel.Height);
end;
end;
end;
{=====}
procedure TOvcCustomEdit.SetBounds(ALeft, ATop, AWidth, AHeight : Integer);
begin
inherited SetBounds(ALeft, ATop, AWidth, AHeight);
if not HandleAllocated then
Exit;
if HandleAllocated then
PostMessage(Handle, OM_POSITIONLABEL, 0, 0);
end;
{=====}
procedure TOvcCustomEdit.SetController(Value : TOvcController);
begin
FController := Value;
if Value <> nil then
Value.FreeNotification(Self);
end;
{=====}
procedure TOvcCustomEdit.SetAbout(const Value : string);
begin
end;
end.