10
TLukForEachProcedure = procedure (item : pointer; data : pointer) of object;
12
TLList = class (TList)
17
FClassesChanged,FSlistChanged,FListChanged : Boolean;
20
function CreateGList : PGList;
21
function GetTheGtkList : PGList;
22
procedure SetGtkList (Value : PGList);
23
function CreateGSList : PGSList;
24
function GetTheGtkSList : PGSlist;
25
procedure SetGtkSList (Value : PGSList);
26
procedure BuildFromGtkList;
27
procedure BuildFromGtkSList;
29
procedure Notify (Ptr: Pointer; Action: TListNotification); override;
30
function GetData (index : integer) : pointer; dynamic;
31
function UngetData (data : pointer) : pointer; dynamic;
32
// GetData needs to give the pointer to the data in the List or SList of GTK
33
// UngetData needs to give the item in this list from the datapointer of GTK
36
destructor destroy; override;
37
function GetGtkList (buffered : boolean) : PGList;
38
function GetGtkSList (buffered : boolean) : PGSlist;
39
procedure BeginUpdate; // Currently only changes in 1 list are possible
40
procedure EndUpdate; // without memory leaks and/or errors in the list
41
procedure ForEach (Proc : TLukForEachprocedure; data : pointer);
42
property GtkList : PGList read GetTheGtkList write SetGtkList;
43
property GtkSList : PGSList read GetTheGtkSList write SetGtkSList;
50
procedure TLList.FreeList;
52
if FGList <> null then
59
procedure TLList.FreeSList;
61
if FGSList <> null then
63
g_slist_free (FGSList);
68
procedure TLList.Notify(Ptr: Pointer; Action: TListNotification);
71
FClassesChanged := True;
74
constructor TLList.create;
77
FClassesChanged := False;
78
FListChanged := false;
79
FSListChanged := False;
85
destructor TLList.destroy;
92
function TLList.GetGtkList (buffered : boolean) : PGList;
95
if FClasseschanged then
97
else if FSListChanged then
100
result := CreateGList;
105
result := CreateGList;
108
function TLList.GetGtkSList (buffered : boolean) : PGSList;
111
if FClassesChanged then
112
result := CreateGSList
113
else if FListChanged then
116
result := CreateGSList;
121
result := CreateGSList;
124
function TLList.CreateGList : PGList;
129
for r := pred(count) downto 0 do
130
result := g_list_prepend (result, GetData(r));
134
function TLList.CreateGSList : PGSList;
139
for r := pred(count) downto 0 do
140
result := g_slist_prepend (result, GetData(r));
144
function TLList.GetData (index : integer) : pointer;
146
result := items[index];
149
function TLList.UngetData (data : pointer) : pointer;
154
function TLList.GetTheGtkList : PGList;
156
result := GetGtkList (True);
159
procedure TLList.SetGtkList (Value : PGList);
165
FListChanged := True;
168
function TLList.GetTheGtkSList : PGSlist;
170
result := GetGtkSList (True);
173
procedure TLList.SetGtkSList (Value : PGSList);
179
FSListChanged := True;
182
procedure TLList.BuildFromGtkList;
189
add (UngetData(p^.data));
192
FListChanged := False;
193
FSListChanged := False;
194
FClassesChanged := False;
198
procedure TLList.BuildFromGtkSList;
205
add (UngetData(p^.data));
208
FListChanged := False;
209
FSListChanged := False;
210
FClassesChanged := False;
214
procedure TLList.BeginUpdate;
216
FNotUpdating := False;
219
procedure TLList.EndUpdate;
221
FNotUpdating := True;
224
else if FSListChanged then
226
else if FClassesChanged then
233
procedure TLList.ForEach (Proc : TLukForEachProcedure; data : pointer);
236
for r := 0 to pred(count) do
237
Proc (items[r], data);