1
// included by gtk2.pas
3
{$IFDEF read_forward_definitions}
4
{$ENDIF read_forward_definitions}
6
//------------------------------------------------------------------------------
8
{$IFDEF read_interface_types}
9
PGtkRBNodeColor = ^TGtkRBNodeColor;
10
TGtkRBNodeColor = longint;
12
PGtkRBTree = ^TGtkRBTree;
13
PGtkRBNode = ^TGtkRBNode;
15
TGtkRBTreeTraverseFunc = procedure (tree:PGtkRBTree; node:PGtkRBNode; data:gpointer); cdecl;
19
parent_tree : PGtkRBTree;
20
parent_node : PGtkRBNode;
23
{ We keep track of whether the aggregate count of children plus 1
24
for the node itself comes to an even number. The parity flag is
25
the total count of children mod 2, where the total count of
26
children gets computed in the same way that the total offset gets
27
computed. i.e. not the same as the "count" field below which
28
doesn't include children. We could replace parity with a
29
full-size int field here, and then take % 2 to get the parity flag,
30
but that would use extra memory.
32
{ count is the number of nodes beneath us, plus 1 for ourselves.
33
i.e. node->left->count + node->right->count + 1
35
{ this is the total of sizes of
36
node->left, node->right, our own height, and the height
37
of all trees in ->children, iff children exists because
38
the thing is expanded.
48
children : PGtkRBTree;
51
{$ENDIF read_interface_types}
53
//------------------------------------------------------------------------------
55
{$IFDEF read_interface_rest}
57
GTK_RBNODE_BLACK = 1 shl 0;
58
GTK_RBNODE_RED = 1 shl 1;
59
GTK_RBNODE_IS_PARENT = 1 shl 2;
60
GTK_RBNODE_IS_SELECTED = 1 shl 3;
61
GTK_RBNODE_IS_PRELIT = 1 shl 4;
62
GTK_RBNODE_IS_SEMI_COLLAPSED = 1 shl 5;
63
GTK_RBNODE_IS_SEMI_EXPANDED = 1 shl 6;
64
GTK_RBNODE_INVALID = 1 shl 7;
65
GTK_RBNODE_COLUMN_INVALID = 1 shl 8;
66
GTK_RBNODE_DESCENDANTS_INVALID = 1 shl 9;
67
GTK_RBNODE_NON_COLORS = GTK_RBNODE_IS_PARENT
68
or GTK_RBNODE_IS_SELECTED
69
or GTK_RBNODE_IS_PRELIT
70
or GTK_RBNODE_IS_SEMI_COLLAPSED
71
or GTK_RBNODE_IS_SEMI_EXPANDED
73
or GTK_RBNODE_COLUMN_INVALID
74
or GTK_RBNODE_DESCENDANTS_INVALID;
77
bm_TGtkRBNode_flags = $3FFF;
78
bp_TGtkRBNode_flags = 0;
79
bm_TGtkRBNode_parity = $4000;
80
bp_TGtkRBNode_parity = 14;
82
function flags(a : PGtkRBNode) : guint;
83
procedure set_flags(a : PGtkRBNode; __flags : guint);
84
function parity(a : PGtkRBNode) : guint;
85
procedure set_parity(a : PGtkRBNode; __parity : guint);
86
function GTK_RBNODE_GET_COLOR(node: PGtkRBNode) : guint;
87
procedure GTK_RBNODE_SET_COLOR(node: PGtkRBNode; color: guint);
88
function GTK_RBNODE_GET_HEIGHT(node: PGtkRBNode) : gint;
90
procedure GTK_RBNODE_SET_FLAG(node: PGtkRBNode; flag: word);
91
procedure GTK_RBNODE_UNSET_FLAG(node: PGtkRBNode; flag: word);
92
function GTK_RBNODE_FLAG_SET(node: PGtkRBNode; flag : guint) : boolean;
94
procedure _gtk_rbtree_push_allocator(allocator:PGAllocator); cdecl; external gtklib;
95
procedure _gtk_rbtree_pop_allocator; cdecl; external gtklib;
96
function _gtk_rbtree_new:PGtkRBTree; cdecl; external gtklib;
97
procedure _gtk_rbtree_free(tree:PGtkRBTree); cdecl; external gtklib;
98
procedure _gtk_rbtree_remove(tree:PGtkRBTree); cdecl; external gtklib;
99
procedure _gtk_rbtree_destroy(tree:PGtkRBTree); cdecl; external gtklib;
100
function _gtk_rbtree_insert_before(tree:PGtkRBTree; node:PGtkRBNode; height:gint; valid:gboolean):PGtkRBNode; cdecl; external gtklib;
101
function _gtk_rbtree_insert_after(tree:PGtkRBTree; node:PGtkRBNode; height:gint; valid:gboolean):PGtkRBNode; cdecl; external gtklib;
102
procedure _gtk_rbtree_remove_node(tree:PGtkRBTree; node:PGtkRBNode); cdecl; external gtklib;
103
procedure _gtk_rbtree_reorder(tree:PGtkRBTree; new_order:Pgint; length:gint); cdecl; external gtklib;
104
function _gtk_rbtree_find_count(tree:PGtkRBTree; count:gint):PGtkRBNode; cdecl; external gtklib;
105
procedure _gtk_rbtree_node_set_height(tree:PGtkRBTree; node:PGtkRBNode; height:gint); cdecl; external gtklib;
106
procedure _gtk_rbtree_node_mark_invalid(tree:PGtkRBTree; node:PGtkRBNode); cdecl; external gtklib;
107
procedure _gtk_rbtree_node_mark_valid(tree:PGtkRBTree; node:PGtkRBNode); cdecl; external gtklib;
108
procedure _gtk_rbtree_column_invalid(tree:PGtkRBTree); cdecl; external gtklib;
109
procedure _gtk_rbtree_mark_invalid(tree:PGtkRBTree); cdecl; external gtklib;
110
procedure _gtk_rbtree_set_fixed_height(tree:PGtkRBTree; height:gint); cdecl; external gtklib;
111
function _gtk_rbtree_node_find_offset(tree:PGtkRBTree; node:PGtkRBNode):gint; cdecl; external gtklib;
112
function _gtk_rbtree_node_find_parity(tree:PGtkRBTree; node:PGtkRBNode):gint; cdecl; external gtklib;
113
function _gtk_rbtree_find_offset(tree:PGtkRBTree; offset:gint; var new_tree:PGtkRBTree; var new_node:PGtkRBNode):gint; cdecl; external gtklib;
114
procedure _gtk_rbtree_traverse(tree:PGtkRBTree; node:PGtkRBNode; order:TGTraverseType; func:TGtkRBTreeTraverseFunc; data:gpointer); cdecl; external gtklib;
115
function _gtk_rbtree_next(tree:PGtkRBTree; node:PGtkRBNode):PGtkRBNode; cdecl; external gtklib;
116
function _gtk_rbtree_prev(tree:PGtkRBTree; node:PGtkRBNode):PGtkRBNode; cdecl; external gtklib;
117
procedure _gtk_rbtree_next_full(tree:PGtkRBTree; node:PGtkRBNode; var new_tree:PGtkRBTree; var new_node:PGtkRBNode); cdecl; external gtklib;
118
procedure _gtk_rbtree_prev_full(tree:PGtkRBTree; node:PGtkRBNode; var new_tree:PGtkRBTree; var new_node:PGtkRBNode); cdecl; external gtklib;
119
function _gtk_rbtree_get_depth(tree:PGtkRBTree):gint; cdecl; external gtklib;
120
{ This func checks the integrity of the tree }
121
{$ifdef G_ENABLE_DEBUG }
122
procedure _gtk_rbtree_test(where:Pgchar; tree:PGtkRBTree); cdecl; external gtklib;
123
procedure _gtk_rbtree_debug_spew(tree:PGtkRBTree); cdecl; external gtklib;
125
{$ENDIF read_interface_rest}
127
//------------------------------------------------------------------------------
129
{$IFDEF read_implementation}
130
function flags(a : PGtkRBNode) : guint;
132
flags:=(a^.flag0 and bm_TGtkRBNode_flags) shr bp_TGtkRBNode_flags;
135
procedure set_flags(a : PGtkRBNode; __flags : guint);
137
a^.flag0:=a^.flag0 or ((__flags shl bp_TGtkRBNode_flags) and bm_TGtkRBNode_flags);
140
function parity(a : PGtkRBNode) : guint;
142
parity:=(a^.flag0 and bm_TGtkRBNode_parity) shr bp_TGtkRBNode_parity;
145
procedure set_parity(a : PGtkRBNode; __parity : guint);
147
a^.flag0:=a^.flag0 or ((__parity shl bp_TGtkRBNode_parity) and bm_TGtkRBNode_parity);
150
function GTK_RBNODE_GET_COLOR(node : PGtkRBNode) : guint;
153
Result:=GTK_RBNODE_BLACK
155
if (flags(node) and GTK_RBNODE_RED) = GTK_RBNODE_RED then
156
Result:=GTK_RBNODE_RED
158
Result:=GTK_RBNODE_BLACK;
161
procedure GTK_RBNODE_SET_COLOR(node : PGtkRBNode; color: guint);
163
if node=nil then exit;
164
if ((flags(node) and color)<>color) then
165
set_flags(node,flags(node) xor (GTK_RBNODE_RED or GTK_RBNODE_BLACK));
168
function GTK_RBNODE_GET_HEIGHT(node : PGtkRBNode) : gint;
172
if node^.children<>nil then
173
if_local1:=node^.children^.root^.offset
176
GTK_RBNODE_GET_HEIGHT:=node^.offset -
177
(node^.left^.offset + node^.right^.offset + if_local1);
180
function GTK_RBNODE_FLAG_SET(node: PGtkRBNode; flag : guint) : boolean;
182
GTK_RBNODE_FLAG_SET:=(node<>nil) and ((flags(node) and flag) = flag);
185
procedure GTK_RBNODE_SET_FLAG(node: PGtkRBNode; flag: word);
187
set_flags(node,flag or flags(node));
190
procedure GTK_RBNODE_UNSET_FLAG(node: PGtkRBNode; flag: word);
192
set_flags(node,(not flag) and flags(node));
196
{$ENDIF read_implementation}
197
// included by gtk2.pas