
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@963 8e941d3f-bd1b-0410-a28a-d453659cc2b4
427 lines
12 KiB
ObjectPascal
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.
|