File: dsgn_bearcontrols.pas

package info (click to toggle)
lazarus 4.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 275,760 kB
  • sloc: pascal: 2,341,904; xml: 509,420; makefile: 348,726; cpp: 93,608; sh: 3,387; java: 609; perl: 297; sql: 222; ansic: 137
file content (221 lines) | stat: -rw-r--r-- 4,820 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
{
  Simple components for testing the RTTI capabilities of codetools

}
unit Dsgn_BearControls;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils;

type

  { TBearComponent }

  TBearComponent = class(TComponent)

  end;

  TBearCaption = type string;

  { TBearControl }

  TBearControl = class(TBearComponent)
  private
    FCaption: TBearCaption;
    FControls: TFPList; // list of TBearControl
    FHeight: integer;
    FLeft: integer;
    FParent: TBearControl;
    FTop: integer;
    FVisible: boolean;
    FWidth: integer;
    function GetControlCount: integer;
    function GetControls(Index: integer): TBearControl;
    procedure SetParent(const AValue: TBearControl);
    procedure SetVisible(const AValue: boolean);
  protected
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
    procedure Notification(AComponent: TComponent; Operation: TOperation);
      override;
    procedure SetParentComponent(Value: TComponent); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function GetParentComponent: TComponent; override;
    function IsParentOf(AControl: TBearControl): boolean;
    function HasParent: Boolean; override;
    property Caption: TBearCaption read FCaption write FCaption;
    property ControlCount: integer read GetControlCount;
    property Controls[Index: integer]: TBearControl read GetControls;
    property Height: integer read FHeight write FHeight;
    property Left: integer read FLeft write FLeft;
    property Parent: TBearControl read FParent write SetParent;
    property Top: integer read FTop write FTop;
    property Visible: boolean read FVisible write SetVisible;
    property Width: integer read FWidth write FWidth;
  end;

  { TBearCustomForm }

  TBearCustomForm = class(TBearControl)

  end;

  { TBearForm }

  TBearForm = class(TBearCustomForm)
  published
    property Caption;
    property Height;
    property Left;
    property Top;
    property Visible;
    property Width;
  end;

  { TBearCustomLabel }

  TBearCustomLabel = class(TBearControl)

  end;

  { TBearLabel }

  TBearLabel = class(TBearCustomLabel)
  published
    property Caption;
    property Height;
    property Left;
    property Top;
    property Visible;
    property Width;
  end;

  { TBearCustomPanel }

  TBearCustomPanel = class(TBearControl)
  private
    FBevelWidth: word;
  public
    property BevelWidth: word read FBevelWidth write FBevelWidth;
  end;

  { TBearPanel }

  TBearPanel = class(TBearCustomPanel)
  published
    property BevelWidth;
    property Height;
    property Left;
    property Top;
    property Visible;
    property Width;
  end;

implementation

{ TBearControl }

function TBearControl.GetControlCount: integer;
begin
  Result:=FControls.Count;
end;

function TBearControl.GetControls(Index: integer): TBearControl;
begin
  Result:=TBearControl(FControls[Index]);
end;

procedure TBearControl.SetParent(const AValue: TBearControl);
begin
  if FParent=AValue then Exit;
  if AValue=Self then
    raise Exception.Create('TBearControl.SetParent Self');
  if (AValue<>nil) and IsParentOf(AValue) then
    raise Exception.Create('TBearControl.SetParent cycle');
  if FParent<>nil then
    FParent.FControls.Remove(Self);
  FParent:=AValue;
  if FParent<>nil then begin
    FParent.FControls.Add(Self);
    FreeNotification(FParent);
  end;
end;

procedure TBearControl.SetVisible(const AValue: boolean);
begin
  if FVisible=AValue then Exit;
  FVisible:=AValue;
end;

procedure TBearControl.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
  I: Integer;
  Control: TBearControl;
begin
  for I := 0 to ControlCount-1 do
  begin
    Control := Controls[i];
    if Control.Owner = Root then Proc(Control);
  end;
end;

procedure TBearControl.SetParentComponent(Value: TComponent);
begin
  if Value is TBearControl then
    Parent:=TBearControl(Value);
end;

procedure TBearControl.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if Operation=opRemove then
  begin
    if AComponent=FParent then
      FParent:=nil
    else
      FControls.Remove(AComponent);
  end;
end;

constructor TBearControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FControls:=TFPList.Create;
end;

destructor TBearControl.Destroy;
begin
  Parent:=nil;
  FreeAndNil(FControls);
  inherited Destroy;
end;

function TBearControl.GetParentComponent: TComponent;
begin
  Result:=Parent;
end;

function TBearControl.IsParentOf(AControl: TBearControl): boolean;
begin
  Result := False;
  while Assigned(AControl) do
  begin
    AControl := AControl.Parent;
    if Self = AControl then
      Exit(True);
  end;
end;

function TBearControl.HasParent: Boolean;
begin
  Result:=Parent<>nil;
end;

end.