summaryrefslogtreecommitdiff
path: root/packages/extra/gtk2/gtk+/gtk/gtktreeprivate.inc
blob: 1c31ea123ddb7a7b05f9d083450fe9260f330dbb (plain)
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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
// included by gtk2.pas

{$IFDEF read_forward_definitions}
{$ENDIF read_forward_definitions}

//------------------------------------------------------------------------------

{$IFDEF read_interface_types}
   // internal type
   PGtkTreeRowReference = pointer;

   PGtkTreeViewFlags = ^TGtkTreeViewFlags;
   TGtkTreeViewFlags = longint;

   TGtkTreeViewSearchDialogPositionFunc = procedure (tree_view:PGtkTreeView; search_dialog:PGtkWidget); cdecl;
   PGtkTreeViewColumnReorder = ^TGtkTreeViewColumnReorder;
   TGtkTreeViewColumnReorder = record
        left_align : gint;
        right_align : gint;
        left_column : PGtkTreeViewColumn;
        right_column : PGtkTreeViewColumn;
     end;

{ tree information  }
{ bin_window offset  }
{ dy == y pos of top_row + top_row_dy  }
{ we cache it for simplicity of the code  }
{ Focus code  }
{ Selection stuff  }
{ Column Resizing  }
{ Prelight information  }
{ The node that's currently being collapsed or expanded  }
{ Selection information  }
{ Header information  }
{ ATK Hack  }
{ Scroll timeout (e.g. during dnd)  }
{ Row drag-and-drop  }
{ Scroll-to functionality when unrealized  }
{ hint to display rows in alternating colors  }
{ interactive search  }
   PGtkTreeViewPrivate = ^TGtkTreeViewPrivate;
   TGtkTreeViewPrivate = record
        model : PGtkTreeModel;
        flags : guint;
        tree : PGtkRBTree;
        button_pressed_node : PGtkRBNode;
        button_pressed_tree : PGtkRBTree;
        children : PGList;
        width : gint;
        height : gint;
        expander_size : gint;
        hadjustment : PGtkAdjustment;
        vadjustment : PGtkAdjustment;
        bin_window : PGdkWindow;
        header_window : PGdkWindow;
        drag_window : PGdkWindow;
        drag_highlight_window : PGdkWindow;
        drag_column : PGtkTreeViewColumn;
        last_button_press : PGtkTreeRowReference;
        last_button_press_2 : PGtkTreeRowReference;
        top_row : PGtkTreeRowReference;
        top_row_dy : gint;
        dy : gint;
        drag_column_x : gint;
        expander_column : PGtkTreeViewColumn;
        edited_column : PGtkTreeViewColumn;
        presize_handler_timer : guint;
        validate_rows_timer : guint;
        scroll_sync_timer : guint;
        focus_column : PGtkTreeViewColumn;
        anchor : PGtkTreeRowReference;
        cursor : PGtkTreeRowReference;
        drag_pos : gint;
        x_drag : gint;
        prelight_node : PGtkRBNode;
        prelight_tree : PGtkRBTree;
        expanded_collapsed_node : PGtkRBNode;
        expanded_collapsed_tree : PGtkRBTree;
        expand_collapse_timeout : guint;
        selection : PGtkTreeSelection;
        n_columns : gint;
        columns : PGList;
        header_height : gint;
        column_drop_func : TGtkTreeViewColumnDropFunc;
        column_drop_func_data : gpointer;
        column_drop_func_data_destroy : TGtkDestroyNotify;
        column_drag_info : PGList;
        cur_reorder : PGtkTreeViewColumnReorder;
        destroy_count_func : TGtkTreeDestroyCountFunc;
        destroy_count_data : gpointer;
        destroy_count_destroy : TGtkDestroyNotify;
        scroll_timeout : guint;
        drag_dest_row : PGtkTreeRowReference;
        drag_dest_pos : TGtkTreeViewDropPosition;
        open_dest_timeout : guint;
        pressed_button : gint;
        press_start_x : gint;
        press_start_y : gint;
        scroll_to_path : PGtkTreeRowReference;
        scroll_to_column : PGtkTreeViewColumn;
        scroll_to_row_align : gfloat;
        scroll_to_col_align : gfloat;
        flag0 : word;
        search_column : gint;
        search_dialog_position_func : TGtkTreeViewSearchDialogPositionFunc;
        search_equal_func : TGtkTreeViewSearchEqualFunc;
        search_user_data : gpointer;
        search_destroy : TGtkDestroyNotify;
     end;
{$ENDIF read_interface_types}

//------------------------------------------------------------------------------

{$IFDEF read_interface_rest}
const
   TREE_VIEW_DRAG_WIDTH = 6;

   GTK_TREE_VIEW_IS_LIST = 1 shl 0;
   GTK_TREE_VIEW_SHOW_EXPANDERS = 1 shl 1;
   GTK_TREE_VIEW_IN_COLUMN_RESIZE = 1 shl 2;
   GTK_TREE_VIEW_ARROW_PRELIT = 1 shl 3;
   GTK_TREE_VIEW_HEADERS_VISIBLE = 1 shl 4;
   GTK_TREE_VIEW_DRAW_KEYFOCUS = 1 shl 5;
   GTK_TREE_VIEW_MODEL_SETUP = 1 shl 6;
   GTK_TREE_VIEW_IN_COLUMN_DRAG = 1 shl 7;

   DRAG_COLUMN_WINDOW_STATE_UNSET = 0;
   DRAG_COLUMN_WINDOW_STATE_ORIGINAL = 1;
   DRAG_COLUMN_WINDOW_STATE_ARROW = 2;
   DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT = 3;
   DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT = 4;

procedure GTK_TREE_VIEW_SET_FLAG(tree_view: PGtkTreeView; flag : guint);
procedure GTK_TREE_VIEW_UNSET_FLAG(tree_view: PGtkTreeView; flag : guint);
function GTK_TREE_VIEW_FLAG_SET(tree_view: PGtkTreeView; flag : guint) : boolean;
function TREE_VIEW_HEADER_HEIGHT(tree_view : PGtkTreeView) : longint;
function TREE_VIEW_COLUMN_REQUESTED_WIDTH(column : PGtkTreeViewColumn) : longint;
function TREE_VIEW_DRAW_EXPANDERS(tree_view : PGtkTreeView) : boolean;

{ This lovely little value is used to determine how far away from the title bar
    you can move the mouse and still have a column drag work.
   }
function TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER(tree_view : PGtkTreeView) : longint;


const
   bm_TGtkTreeViewPrivate_scroll_to_use_align = $1;
   bp_TGtkTreeViewPrivate_scroll_to_use_align = 0;
   bm_TGtkTreeViewPrivate_fixed_height_check = $2;
   bp_TGtkTreeViewPrivate_fixed_height_check = 1;
   bm_TGtkTreeViewPrivate_reorderable = $4;
   bp_TGtkTreeViewPrivate_reorderable = 2;
   bm_TGtkTreeViewPrivate_header_has_focus = $8;
   bp_TGtkTreeViewPrivate_header_has_focus = 3;
   bm_TGtkTreeViewPrivate_drag_column_window_state = $70;
   bp_TGtkTreeViewPrivate_drag_column_window_state = 4;
   bm_TGtkTreeViewPrivate_has_rules = $80;
   bp_TGtkTreeViewPrivate_has_rules = 7;
   bm_TGtkTreeViewPrivate_mark_rows_col_dirty = $100;
   bp_TGtkTreeViewPrivate_mark_rows_col_dirty = 8;
   bm_TGtkTreeViewPrivate_enable_search = $200;
   bp_TGtkTreeViewPrivate_enable_search = 9;
   bm_TGtkTreeViewPrivate_disable_popdown = $400;
   bp_TGtkTreeViewPrivate_disable_popdown = 10;

function scroll_to_use_align(var a : TGtkTreeViewPrivate) : guint;
procedure set_scroll_to_use_align(var a : TGtkTreeViewPrivate; __scroll_to_use_align : guint);
function fixed_height_check(var a : TGtkTreeViewPrivate) : guint;
procedure set_fixed_height_check(var a : TGtkTreeViewPrivate; __fixed_height_check : guint);
function reorderable(var a : TGtkTreeViewPrivate) : guint; overload;
procedure set_reorderable(var a : TGtkTreeViewPrivate; __reorderable : guint); overload;
function header_has_focus(var a : TGtkTreeViewPrivate) : guint;
procedure set_header_has_focus(var a : TGtkTreeViewPrivate; __header_has_focus : guint);
function drag_column_window_state(var a : TGtkTreeViewPrivate) : guint;
procedure set_drag_column_window_state(var a : TGtkTreeViewPrivate; __drag_column_window_state : guint);
function has_rules(var a : TGtkTreeViewPrivate) : guint;
procedure set_has_rules(var a : TGtkTreeViewPrivate; __has_rules : guint);
function mark_rows_col_dirty(var a : TGtkTreeViewPrivate) : guint;
procedure set_mark_rows_col_dirty(var a : TGtkTreeViewPrivate; __mark_rows_col_dirty : guint);
function enable_search(var a : TGtkTreeViewPrivate) : guint;
procedure set_enable_search(var a : TGtkTreeViewPrivate; __enable_search : guint);
function disable_popdown(var a : TGtkTreeViewPrivate) : guint;
procedure set_disable_popdown(var a : TGtkTreeViewPrivate; __disable_popdown : guint);


{ functions that shouldn't be exported }
procedure _gtk_tree_selection_internal_select_node(selection:PGtkTreeSelection; node:PGtkRBNode; tree:PGtkRBTree; path:PGtkTreePath; state:TGdkModifierType;
            override_browse_mode:gboolean); cdecl; external gtklib;
function _gtk_tree_view_find_node(tree_view:PGtkTreeView; path:PGtkTreePath; var tree:PGtkRBTree; var node:PGtkRBNode):gboolean; cdecl; external gtklib;
function _gtk_tree_view_find_path(tree_view:PGtkTreeView; tree:PGtkRBTree; node:PGtkRBNode):PGtkTreePath; cdecl; external gtklib;
procedure _gtk_tree_view_child_move_resize(tree_view:PGtkTreeView; widget:PGtkWidget; x:gint; y:gint; width:gint;
            height:gint); cdecl; external gtklib;
procedure _gtk_tree_view_queue_draw_node(tree_view:PGtkTreeView; tree:PGtkRBTree; node:PGtkRBNode; clip_rect:PGdkRectangle); cdecl; external gtklib;
procedure _gtk_tree_view_column_realize_button(column:PGtkTreeViewColumn); cdecl; external gtklib;
procedure _gtk_tree_view_column_unrealize_button(column:PGtkTreeViewColumn); cdecl; external gtklib;
procedure _gtk_tree_view_column_set_tree_view(column:PGtkTreeViewColumn; tree_view:PGtkTreeView); cdecl; external gtklib;
procedure _gtk_tree_view_column_unset_tree_view(column:PGtkTreeViewColumn); cdecl; external gtklib;
procedure _gtk_tree_view_column_set_width(column:PGtkTreeViewColumn; width:gint); cdecl; external gtklib;
procedure _gtk_tree_view_column_start_drag(tree_view:PGtkTreeView; column:PGtkTreeViewColumn); cdecl; external gtklib;
function _gtk_tree_view_column_cell_event(tree_column:PGtkTreeViewColumn; var editable_widget:PGtkCellEditable; event:PGdkEvent; path_string:Pgchar; background_area:PGdkRectangle;
           cell_area:PGdkRectangle; flags:guint):gboolean; cdecl; external gtklib;
procedure _gtk_tree_view_column_start_editing(tree_column:PGtkTreeViewColumn; editable_widget:PGtkCellEditable); cdecl; external gtklib;
procedure _gtk_tree_view_column_stop_editing(tree_column:PGtkTreeViewColumn); cdecl; external gtklib;
procedure _gtk_tree_view_install_mark_rows_col_dirty(tree_view:PGtkTreeView); cdecl; external gtklib;
procedure _gtk_tree_view_column_autosize(tree_view:PGtkTreeView; column:PGtkTreeViewColumn); cdecl; external gtklib;
function _gtk_tree_view_column_has_editable_cell(column:PGtkTreeViewColumn):gboolean; cdecl; external gtklib;
function _gtk_tree_view_column_get_edited_cell(column:PGtkTreeViewColumn):PGtkCellRenderer; cdecl; external gtklib;
function _gtk_tree_view_column_count_special_cells(column:PGtkTreeViewColumn):gint; cdecl; external gtklib;
function _gtk_tree_view_column_get_cell_at_pos(column:PGtkTreeViewColumn; x:gint):PGtkCellRenderer; cdecl; external gtklib;
function _gtk_tree_selection_new:PGtkTreeSelection; cdecl; external gtklib;
function _gtk_tree_selection_new_with_tree_view(tree_view:PGtkTreeView):PGtkTreeSelection; cdecl; external gtklib;
procedure _gtk_tree_selection_set_tree_view(selection:PGtkTreeSelection; tree_view:PGtkTreeView); cdecl; external gtklib;
procedure _gtk_tree_view_column_cell_render(tree_column:PGtkTreeViewColumn; window:PGdkWindow; background_area:PGdkRectangle; cell_area:PGdkRectangle; expose_area:PGdkRectangle;
            flags:guint); cdecl; external gtklib;
function _gtk_tree_view_column_cell_focus(tree_column:PGtkTreeViewColumn; direction:gint; left:gboolean; right:gboolean):gboolean; cdecl; external gtklib;
procedure _gtk_tree_view_column_cell_draw_focus(tree_column:PGtkTreeViewColumn; window:PGdkWindow; background_area:PGdkRectangle; cell_area:PGdkRectangle; expose_area:PGdkRectangle;
            flags:guint); cdecl; external gtklib;
procedure _gtk_tree_view_column_cell_set_dirty(tree_column:PGtkTreeViewColumn; install_handler:gboolean); cdecl; external gtklib;
procedure _gtk_tree_view_column_get_neighbor_sizes(column:PGtkTreeViewColumn; cell:PGtkCellRenderer; left:Pgint; right:Pgint); cdecl; external gtklib;
{$ENDIF read_interface_rest}

//------------------------------------------------------------------------------

{$IFDEF read_implementation}
function GTK_TREE_VIEW_FLAG_SET(tree_view: PGtkTreeView; flag : guint) : boolean;
begin
   GTK_TREE_VIEW_FLAG_SET:=((tree_view^.priv^.flags) and flag) = flag;
end;

function TREE_VIEW_HEADER_HEIGHT(tree_view : PGtkTreeView) : longint;
var
   if_local1 : longint;
begin
   if GTK_TREE_VIEW_FLAG_SET(tree_view,GTK_TREE_VIEW_HEADERS_VISIBLE) then
     if_local1:=tree_view^.priv^.header_height
   else
     if_local1:=0;
   TREE_VIEW_HEADER_HEIGHT:=if_local1;
end;

function TREE_VIEW_COLUMN_REQUESTED_WIDTH(column : PGtkTreeViewColumn) : longint;
var
   MinWidth, MaxWidth: integer;
begin
   if column^.min_width<>-1 then
     MinWidth:=column^.min_width
   else
     MinWidth:=column^.requested_width;
   if column^.max_width<>-1 then
     MaxWidth:=column^.max_width
   else
     MaxWidth:=column^.requested_width;
   TREE_VIEW_COLUMN_REQUESTED_WIDTH:=CLAMP(column^.requested_width,MinWidth,MaxWidth);
end;

function TREE_VIEW_DRAW_EXPANDERS(tree_view : PGtkTreeView) : boolean;
begin
   TREE_VIEW_DRAW_EXPANDERS:=(not (GTK_TREE_VIEW_FLAG_SET(tree_view,GTK_TREE_VIEW_IS_LIST)))
            and (GTK_TREE_VIEW_FLAG_SET(tree_view,GTK_TREE_VIEW_SHOW_EXPANDERS));
end;

function TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER(tree_view : PGtkTreeView) : longint;
begin
   TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER:=10 * (TREE_VIEW_HEADER_HEIGHT(tree_view));
end;

function scroll_to_use_align(var a : TGtkTreeViewPrivate) : guint;
begin
   scroll_to_use_align:=(a.flag0 and bm_TGtkTreeViewPrivate_scroll_to_use_align) shr bp_TGtkTreeViewPrivate_scroll_to_use_align;
end;

procedure set_scroll_to_use_align(var a : TGtkTreeViewPrivate; __scroll_to_use_align : guint);
begin
   a.flag0:=a.flag0 or ((__scroll_to_use_align shl bp_TGtkTreeViewPrivate_scroll_to_use_align) and bm_TGtkTreeViewPrivate_scroll_to_use_align);
end;

function fixed_height_check(var a : TGtkTreeViewPrivate) : guint;
begin
   fixed_height_check:=(a.flag0 and bm_TGtkTreeViewPrivate_fixed_height_check) shr bp_TGtkTreeViewPrivate_fixed_height_check;
end;

procedure set_fixed_height_check(var a : TGtkTreeViewPrivate; __fixed_height_check : guint);
begin
   a.flag0:=a.flag0 or ((__fixed_height_check shl bp_TGtkTreeViewPrivate_fixed_height_check) and bm_TGtkTreeViewPrivate_fixed_height_check);
end;

function reorderable(var a : TGtkTreeViewPrivate) : guint;
begin
   reorderable:=(a.flag0 and bm_TGtkTreeViewPrivate_reorderable) shr bp_TGtkTreeViewPrivate_reorderable;
end;

procedure set_reorderable(var a : TGtkTreeViewPrivate; __reorderable : guint);
begin
   a.flag0:=a.flag0 or ((__reorderable shl bp_TGtkTreeViewPrivate_reorderable) and bm_TGtkTreeViewPrivate_reorderable);
end;

function header_has_focus(var a : TGtkTreeViewPrivate) : guint;
begin
   header_has_focus:=(a.flag0 and bm_TGtkTreeViewPrivate_header_has_focus) shr bp_TGtkTreeViewPrivate_header_has_focus;
end;

procedure set_header_has_focus(var a : TGtkTreeViewPrivate; __header_has_focus : guint);
begin
   a.flag0:=a.flag0 or ((__header_has_focus shl bp_TGtkTreeViewPrivate_header_has_focus) and bm_TGtkTreeViewPrivate_header_has_focus);
end;

function drag_column_window_state(var a : TGtkTreeViewPrivate) : guint;
begin
   drag_column_window_state:=(a.flag0 and bm_TGtkTreeViewPrivate_drag_column_window_state) shr bp_TGtkTreeViewPrivate_drag_column_window_state;
end;

procedure set_drag_column_window_state(var a : TGtkTreeViewPrivate; __drag_column_window_state : guint);
begin
   a.flag0:=a.flag0 or ((__drag_column_window_state shl bp_TGtkTreeViewPrivate_drag_column_window_state) and bm_TGtkTreeViewPrivate_drag_column_window_state);
end;

function has_rules(var a : TGtkTreeViewPrivate) : guint;
begin
   has_rules:=(a.flag0 and bm_TGtkTreeViewPrivate_has_rules) shr bp_TGtkTreeViewPrivate_has_rules;
end;

procedure set_has_rules(var a : TGtkTreeViewPrivate; __has_rules : guint);
begin
   a.flag0:=a.flag0 or ((__has_rules shl bp_TGtkTreeViewPrivate_has_rules) and bm_TGtkTreeViewPrivate_has_rules);
end;

function mark_rows_col_dirty(var a : TGtkTreeViewPrivate) : guint;
begin
   mark_rows_col_dirty:=(a.flag0 and bm_TGtkTreeViewPrivate_mark_rows_col_dirty) shr bp_TGtkTreeViewPrivate_mark_rows_col_dirty;
end;

procedure set_mark_rows_col_dirty(var a : TGtkTreeViewPrivate; __mark_rows_col_dirty : guint);
begin
   a.flag0:=a.flag0 or ((__mark_rows_col_dirty shl bp_TGtkTreeViewPrivate_mark_rows_col_dirty) and bm_TGtkTreeViewPrivate_mark_rows_col_dirty);
end;

function enable_search(var a : TGtkTreeViewPrivate) : guint;
begin
   enable_search:=(a.flag0 and bm_TGtkTreeViewPrivate_enable_search) shr bp_TGtkTreeViewPrivate_enable_search;
end;

procedure set_enable_search(var a : TGtkTreeViewPrivate; __enable_search : guint);
begin
   a.flag0:=a.flag0 or ((__enable_search shl bp_TGtkTreeViewPrivate_enable_search) and bm_TGtkTreeViewPrivate_enable_search);
end;

function disable_popdown(var a : TGtkTreeViewPrivate) : guint;
begin
   disable_popdown:=(a.flag0 and bm_TGtkTreeViewPrivate_disable_popdown) shr bp_TGtkTreeViewPrivate_disable_popdown;
end;

procedure set_disable_popdown(var a : TGtkTreeViewPrivate; __disable_popdown : guint);
begin
   a.flag0:=a.flag0 or ((__disable_popdown shl bp_TGtkTreeViewPrivate_disable_popdown) and bm_TGtkTreeViewPrivate_disable_popdown);
end;

procedure GTK_TREE_VIEW_SET_FLAG(tree_view: PGtkTreeView; flag : guint);
begin
  tree_view^.priv^.flags:=tree_view^.priv^.flags or flag;
end;

procedure GTK_TREE_VIEW_UNSET_FLAG(tree_view: PGtkTreeView; flag : guint);
begin
  tree_view^.priv^.flags:=tree_view^.priv^.flags and not flag;
end;


{$ENDIF read_implementation}
// included by gtk2.pas