2 * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #ifndef __GTK_TREE_PRIVATE_H__
21 #define __GTK_TREE_PRIVATE_H__
26 #endif /* __cplusplus */
28 #include <gtk/gtktreeview.h>
29 #include <gtk/gtktreeselection.h>
30 //#include <gtk/gtkrbtree.h>
31 #include "gtkrbtree.h"
33 #define TREE_VIEW_DRAG_WIDTH 6
37 GTK_TREE_VIEW_IS_LIST
= 1 << 0,
38 GTK_TREE_VIEW_SHOW_EXPANDERS
= 1 << 1,
39 GTK_TREE_VIEW_IN_COLUMN_RESIZE
= 1 << 2,
40 GTK_TREE_VIEW_ARROW_PRELIT
= 1 << 3,
41 GTK_TREE_VIEW_HEADERS_VISIBLE
= 1 << 4,
42 GTK_TREE_VIEW_DRAW_KEYFOCUS
= 1 << 5,
43 GTK_TREE_VIEW_MODEL_SETUP
= 1 << 6,
44 GTK_TREE_VIEW_IN_COLUMN_DRAG
= 1 << 7
49 DRAG_COLUMN_WINDOW_STATE_UNSET
= 0,
50 DRAG_COLUMN_WINDOW_STATE_ORIGINAL
= 1,
51 DRAG_COLUMN_WINDOW_STATE_ARROW
= 2,
52 DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT
= 3,
53 DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT
= 4
56 #define GTK_TREE_VIEW_SET_FLAG(tree_view, flag) G_STMT_START{ (tree_view->priv->flags|=flag); }G_STMT_END
57 #define GTK_TREE_VIEW_UNSET_FLAG(tree_view, flag) G_STMT_START{ (tree_view->priv->flags&=~(flag)); }G_STMT_END
58 #define GTK_TREE_VIEW_FLAG_SET(tree_view, flag) ((tree_view->priv->flags&flag)==flag)
59 #define TREE_VIEW_HEADER_HEIGHT(tree_view) (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE)?tree_view->priv->header_height:0)
60 #define TREE_VIEW_COLUMN_REQUESTED_WIDTH(column) (CLAMP (column->requested_width, (column->min_width!=-1)?column->min_width:column->requested_width, (column->max_width!=-1)?column->max_width:column->requested_width))
61 #define TREE_VIEW_DRAW_EXPANDERS(tree_view) (!GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IS_LIST)&>K_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_SHOW_EXPANDERS))
63 /* This lovely little value is used to determine how far away from the title bar
64 * you can move the mouse and still have a column drag work.
66 #define TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER(tree_view) (10*TREE_VIEW_HEADER_HEIGHT(tree_view))
68 typedef void (*GtkTreeViewSearchDialogPositionFunc
) (GtkTreeView
*tree_view
,
69 GtkWidget
*search_dialog
);
71 typedef struct _GtkTreeViewColumnReorder GtkTreeViewColumnReorder
;
72 struct _GtkTreeViewColumnReorder
76 GtkTreeViewColumn
*left_column
;
77 GtkTreeViewColumn
*right_column
;
80 struct _GtkTreeViewPrivate
85 /* tree information */
88 GtkRBNode
*button_pressed_node
;
89 GtkRBTree
*button_pressed_tree
;
96 GtkAdjustment
*hadjustment
;
97 GtkAdjustment
*vadjustment
;
99 GdkWindow
*bin_window
;
100 GdkWindow
*header_window
;
101 GdkWindow
*drag_window
;
102 GdkWindow
*drag_highlight_window
;
103 GtkTreeViewColumn
*drag_column
;
105 GtkTreeRowReference
*last_button_press
;
106 GtkTreeRowReference
*last_button_press_2
;
108 /* bin_window offset */
109 GtkTreeRowReference
*top_row
;
111 /* dy == y pos of top_row + top_row_dy */
112 /* we cache it for simplicity of the code */
116 GtkTreeViewColumn
*expander_column
;
117 GtkTreeViewColumn
*edited_column
;
118 guint presize_handler_timer
;
119 guint validate_rows_timer
;
120 guint scroll_sync_timer
;
123 GtkTreeViewColumn
*focus_column
;
125 /* Selection stuff */
126 GtkTreeRowReference
*anchor
;
127 GtkTreeRowReference
*cursor
;
129 /* Column Resizing */
133 /* Prelight information */
134 GtkRBNode
*prelight_node
;
135 GtkRBTree
*prelight_tree
;
137 /* The node that's currently being collapsed or expanded */
138 GtkRBNode
*expanded_collapsed_node
;
139 GtkRBTree
*expanded_collapsed_tree
;
140 guint expand_collapse_timeout
;
142 /* Selection information */
143 GtkTreeSelection
*selection
;
145 /* Header information */
150 GtkTreeViewColumnDropFunc column_drop_func
;
151 gpointer column_drop_func_data
;
152 GtkDestroyNotify column_drop_func_data_destroy
;
153 GList
*column_drag_info
;
154 GtkTreeViewColumnReorder
*cur_reorder
;
157 GtkTreeDestroyCountFunc destroy_count_func
;
158 gpointer destroy_count_data
;
159 GtkDestroyNotify destroy_count_destroy
;
161 /* Scroll timeout (e.g. during dnd) */
162 guint scroll_timeout
;
164 /* Row drag-and-drop */
165 GtkTreeRowReference
*drag_dest_row
;
166 GtkTreeViewDropPosition drag_dest_pos
;
167 guint open_dest_timeout
;
173 /* Scroll-to functionality when unrealized */
174 GtkTreeRowReference
*scroll_to_path
;
175 GtkTreeViewColumn
*scroll_to_column
;
176 gfloat scroll_to_row_align
;
177 gfloat scroll_to_col_align
;
178 guint scroll_to_use_align
: 1;
180 guint fixed_height_check
: 1;
182 guint reorderable
: 1;
183 guint header_has_focus
: 1;
184 guint drag_column_window_state
: 3;
185 /* hint to display rows in alternating colors */
187 guint mark_rows_col_dirty
: 1;
189 /* interactive search */
190 guint enable_search
: 1;
191 guint disable_popdown
: 1;
193 GtkTreeViewSearchDialogPositionFunc search_dialog_position_func
;
194 GtkTreeViewSearchEqualFunc search_equal_func
;
195 gpointer search_user_data
;
196 GtkDestroyNotify search_destroy
;
199 /* cool ABI compat hack */
200 #define GTK_CELL_RENDERER_INFO_KEY "gtk-cell-renderer-info"
202 typedef struct _GtkCellRendererInfo GtkCellRendererInfo
;
203 struct _GtkCellRendererInfo
205 GdkColor cell_background
;
210 /* toggle renderer */
211 gboolean inconsistent
:1;
216 #define TREE_VIEW_INTERNAL_ASSERT(expr, ret) G_STMT_START{ \
219 g_log (G_LOG_DOMAIN, \
220 G_LOG_LEVEL_CRITICAL, \
221 "file %s: line %d (%s): assertion `%s' failed.\n" \
222 "There is a disparity between the internal view of the GtkTreeView,\n" \
223 "and the GtkTreeModel. This generally means that the model has changed\n"\
224 "without letting the view know. Any display from now on is likely to\n" \
228 __PRETTY_FUNCTION__, \
233 #define TREE_VIEW_INTERNAL_ASSERT_VOID(expr) G_STMT_START{ \
236 g_log (G_LOG_DOMAIN, \
237 G_LOG_LEVEL_CRITICAL, \
238 "file %s: line %d (%s): assertion `%s' failed.\n" \
239 "There is a disparity between the internal view of the GtkTreeView,\n" \
240 "and the GtkTreeModel. This generally means that the model has changed\n"\
241 "without letting the view know. Any display from now on is likely to\n" \
245 __PRETTY_FUNCTION__, \
252 #define TREE_VIEW_INTERNAL_ASSERT(expr, ret) G_STMT_START{ \
255 g_log (G_LOG_DOMAIN, \
256 G_LOG_LEVEL_CRITICAL, \
257 "file %s: line %d: assertion `%s' failed.\n" \
258 "There is a disparity between the internal view of the GtkTreeView,\n" \
259 "and the GtkTreeModel. This generally means that the model has changed\n"\
260 "without letting the view know. Any display from now on is likely to\n" \
268 #define TREE_VIEW_INTERNAL_ASSERT_VOID(expr) G_STMT_START{ \
271 g_log (G_LOG_DOMAIN, \
272 G_LOG_LEVEL_CRITICAL, \
273 "file %s: line %d: assertion '%s' failed.\n" \
274 "There is a disparity between the internal view of the GtkTreeView,\n" \
275 "and the GtkTreeModel. This generally means that the model has changed\n"\
276 "without letting the view know. Any display from now on is likely to\n" \
286 /* functions that shouldn't be exported */
287 void _gtk_tree_selection_internal_select_node (GtkTreeSelection
*selection
,
291 GdkModifierType state
,
292 gboolean override_browse_mode
);
293 gboolean
_gtk_tree_view_find_node (GtkTreeView
*tree_view
,
297 GtkTreePath
*_gtk_tree_view_find_path (GtkTreeView
*tree_view
,
300 void _gtk_tree_view_child_move_resize (GtkTreeView
*tree_view
,
306 void _gtk_tree_view_queue_draw_node (GtkTreeView
*tree_view
,
309 GdkRectangle
*clip_rect
);
311 void _gtk_tree_view_column_realize_button (GtkTreeViewColumn
*column
);
312 void _gtk_tree_view_column_unrealize_button (GtkTreeViewColumn
*column
);
313 void _gtk_tree_view_column_set_tree_view (GtkTreeViewColumn
*column
,
314 GtkTreeView
*tree_view
);
315 void _gtk_tree_view_column_unset_model (GtkTreeViewColumn
*column
,
316 GtkTreeModel
*old_model
);
317 void _gtk_tree_view_column_unset_tree_view (GtkTreeViewColumn
*column
);
318 void _gtk_tree_view_column_set_width (GtkTreeViewColumn
*column
,
320 void _gtk_tree_view_column_start_drag (GtkTreeView
*tree_view
,
321 GtkTreeViewColumn
*column
);
322 gboolean
_gtk_tree_view_column_cell_event (GtkTreeViewColumn
*tree_column
,
323 GtkCellEditable
**editable_widget
,
326 GdkRectangle
*background_area
,
327 GdkRectangle
*cell_area
,
329 void _gtk_tree_view_column_start_editing (GtkTreeViewColumn
*tree_column
,
330 GtkCellEditable
*editable_widget
);
331 void _gtk_tree_view_column_stop_editing (GtkTreeViewColumn
*tree_column
);
332 void _gtk_tree_view_install_mark_rows_col_dirty (GtkTreeView
*tree_view
);
333 void _gtk_tree_view_column_autosize (GtkTreeView
*tree_view
,
334 GtkTreeViewColumn
*column
);
336 gboolean
_gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn
*column
);
337 GtkCellRenderer
*_gtk_tree_view_column_get_edited_cell (GtkTreeViewColumn
*column
);
338 gint
_gtk_tree_view_column_count_special_cells (GtkTreeViewColumn
*column
);
339 GtkCellRenderer
*_gtk_tree_view_column_get_cell_at_pos (GtkTreeViewColumn
*column
,
342 GtkTreeSelection
* _gtk_tree_selection_new (void);
343 GtkTreeSelection
* _gtk_tree_selection_new_with_tree_view (GtkTreeView
*tree_view
);
344 void _gtk_tree_selection_set_tree_view (GtkTreeSelection
*selection
,
345 GtkTreeView
*tree_view
);
347 void _gtk_tree_view_column_cell_render (GtkTreeViewColumn
*tree_column
,
349 GdkRectangle
*background_area
,
350 GdkRectangle
*cell_area
,
351 GdkRectangle
*expose_area
,
353 gboolean
_gtk_tree_view_column_cell_focus (GtkTreeViewColumn
*tree_column
,
357 void _gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn
*tree_column
,
359 GdkRectangle
*background_area
,
360 GdkRectangle
*cell_area
,
361 GdkRectangle
*expose_area
,
363 void _gtk_tree_view_column_cell_set_dirty (GtkTreeViewColumn
*tree_column
,
364 gboolean install_handler
);
365 void _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn
*column
,
366 GtkCellRenderer
*cell
,
373 #endif /* __cplusplus */
376 #endif /* __GTK_TREE_PRIVATE_H__ */