gtktreeprivate.h 15.2 KB
Newer Older
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
/* gtktreeprivate.h
 * Copyright (C) 2000  Red Hat, Inc.,  Jonathan Blandford <jrb@redhat.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifndef __GTK_TREE_PRIVATE_H__
#define __GTK_TREE_PRIVATE_H__


#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include <gtk/gtktreeview.h>
#include <gtk/gtktreeselection.h>
#include <gtk/gtkrbtree.h>
31
  
32 33
#define TREE_VIEW_DRAG_WIDTH 6

34 35
typedef enum
{
36 37 38 39 40 41
  GTK_TREE_VIEW_IS_LIST = 1 << 0,
  GTK_TREE_VIEW_SHOW_EXPANDERS = 1 << 1,
  GTK_TREE_VIEW_IN_COLUMN_RESIZE = 1 << 2,
  GTK_TREE_VIEW_ARROW_PRELIT = 1 << 3,
  GTK_TREE_VIEW_HEADERS_VISIBLE = 1 << 4,
  GTK_TREE_VIEW_DRAW_KEYFOCUS = 1 << 5,
42
  GTK_TREE_VIEW_MODEL_SETUP = 1 << 6,
43
  GTK_TREE_VIEW_IN_COLUMN_DRAG = 1 << 7
44 45
} GtkTreeViewFlags;

Kristian Rietveld's avatar
Kristian Rietveld committed
46 47 48 49 50 51 52
typedef enum
{
  GTK_TREE_SELECT_MODE_TOGGLE = 1 << 0,
  GTK_TREE_SELECT_MODE_EXTEND = 1 << 1
}
GtkTreeSelectMode;

53 54 55 56 57 58
enum
{
  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,
59
  DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT = 4
60
};
Jonathan Blandford's avatar
Jonathan Blandford committed
61
  
62 63 64 65
#define GTK_TREE_VIEW_SET_FLAG(tree_view, flag)   G_STMT_START{ (tree_view->priv->flags|=flag); }G_STMT_END
#define GTK_TREE_VIEW_UNSET_FLAG(tree_view, flag) G_STMT_START{ (tree_view->priv->flags&=~(flag)); }G_STMT_END
#define GTK_TREE_VIEW_FLAG_SET(tree_view, flag)   ((tree_view->priv->flags&flag)==flag)
#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)
Jonathan Blandford's avatar
Jonathan Blandford committed
66
#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))
67 68
#define TREE_VIEW_DRAW_EXPANDERS(tree_view)       (!GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IS_LIST)&&GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_SHOW_EXPANDERS))

69 70 71 72 73
 /* 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.
  */
#define TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER(tree_view) (10*TREE_VIEW_HEADER_HEIGHT(tree_view))

74 75 76
typedef void (*GtkTreeViewSearchDialogPositionFunc) (GtkTreeView *tree_view,
						     GtkWidget   *search_dialog);

77 78 79 80 81 82 83 84 85
typedef struct _GtkTreeViewColumnReorder GtkTreeViewColumnReorder;
struct _GtkTreeViewColumnReorder
{
  gint left_align;
  gint right_align;
  GtkTreeViewColumn *left_column;
  GtkTreeViewColumn *right_column;
};

86 87 88 89 90 91 92 93 94 95 96 97 98 99
struct _GtkTreeViewPrivate
{
  GtkTreeModel *model;

  guint flags;
  /* tree information */
  GtkRBTree *tree;

  GtkRBNode *button_pressed_node;
  GtkRBTree *button_pressed_tree;

  GList *children;
  gint width;
  gint height;
Kristian Rietveld's avatar
Kristian Rietveld committed
100
  gint expander_size;
101 102 103 104 105 106

  GtkAdjustment *hadjustment;
  GtkAdjustment *vadjustment;

  GdkWindow *bin_window;
  GdkWindow *header_window;
Jonathan Blandford's avatar
Jonathan Blandford committed
107
  GdkWindow *drag_window;
108
  GdkWindow *drag_highlight_window;
Jonathan Blandford's avatar
Jonathan Blandford committed
109
  GtkTreeViewColumn *drag_column;
110

111 112
  GtkTreeRowReference *last_button_press;
  GtkTreeRowReference *last_button_press_2;
113

114
  /* bin_window offset */
115 116
  GtkTreeRowReference *top_row;
  gint top_row_dy;
117 118
  /* dy == y pos of top_row + top_row_dy */
  /* we cache it for simplicity of the code */
119
  gint dy;
120
  gint drag_column_x;
121

122
  GtkTreeViewColumn *expander_column;
123
  GtkTreeViewColumn *edited_column;
Jonathan Blandford's avatar
Jonathan Blandford committed
124 125
  guint presize_handler_timer;
  guint validate_rows_timer;
126
  guint scroll_sync_timer;
127 128

  /* Focus code */
129
  GtkTreeViewColumn *focus_column;
130

131
  /* Selection stuff */
132 133
  GtkTreeRowReference *anchor;
  GtkTreeRowReference *cursor;
134 135 136 137 138 139 140 141 142

  /* Column Resizing */
  gint drag_pos;
  gint x_drag;

  /* Prelight information */
  GtkRBNode *prelight_node;
  GtkRBTree *prelight_tree;

143 144 145 146 147
  /* The node that's currently being collapsed or expanded */
  GtkRBNode *expanded_collapsed_node;
  GtkRBTree *expanded_collapsed_tree;
  guint expand_collapse_timeout;

148 149 150 151
  /* Selection information */
  GtkTreeSelection *selection;

  /* Header information */
152 153
  gint n_columns;
  GList *columns;
154
  gint header_height;
155

156
  GtkTreeViewColumnDropFunc column_drop_func;
157 158
  gpointer column_drop_func_data;
  GtkDestroyNotify column_drop_func_data_destroy;
Jonathan Blandford's avatar
Jonathan Blandford committed
159
  GList *column_drag_info;
160
  GtkTreeViewColumnReorder *cur_reorder;
Havoc Pennington's avatar
Havoc Pennington committed
161

162 163 164 165 166
  /* ATK Hack */
  GtkTreeDestroyCountFunc destroy_count_func;
  gpointer destroy_count_data;
  GtkDestroyNotify destroy_count_destroy;

Havoc Pennington's avatar
Havoc Pennington committed
167 168
  /* Scroll timeout (e.g. during dnd) */
  guint scroll_timeout;
169

Havoc Pennington's avatar
Havoc Pennington committed
170
  /* Row drag-and-drop */
171
  GtkTreeRowReference *drag_dest_row;
Havoc Pennington's avatar
Havoc Pennington committed
172 173
  GtkTreeViewDropPosition drag_dest_pos;
  guint open_dest_timeout;
174

Havoc Pennington's avatar
Havoc Pennington committed
175 176 177
  gint pressed_button;
  gint press_start_x;
  gint press_start_y;
178 179

  /* Scroll-to functionality when unrealized */
180
  GtkTreeRowReference *scroll_to_path;
181 182 183
  GtkTreeViewColumn *scroll_to_column;
  gfloat scroll_to_row_align;
  gfloat scroll_to_col_align;
184
  guint scroll_to_use_align : 1;
Havoc Pennington's avatar
Havoc Pennington committed
185

186 187
  guint fixed_height_check : 1;

188
  guint reorderable : 1;
189 190
  guint header_has_focus : 1;
  guint drag_column_window_state : 3;
Havoc Pennington's avatar
Havoc Pennington committed
191 192
  /* hint to display rows in alternating colors */
  guint has_rules : 1;
Jonathan Blandford's avatar
Jonathan Blandford committed
193
  guint mark_rows_col_dirty : 1;
Kristian Rietveld's avatar
Kristian Rietveld committed
194

195 196 197
  /* for DnD */
  guint empty_view_drop : 1;

Kristian Rietveld's avatar
Kristian Rietveld committed
198 199
  guint ctrl_pressed : 1;
  guint shift_pressed : 1;
Jonathan Blandford's avatar
Jonathan Blandford committed
200
  
201 202
  /* interactive search */
  guint enable_search : 1;
203
  guint disable_popdown : 1;
204 205 206 207 208
  gint search_column;
  GtkTreeViewSearchDialogPositionFunc search_dialog_position_func;
  GtkTreeViewSearchEqualFunc search_equal_func;
  gpointer search_user_data;
  GtkDestroyNotify search_destroy;
209 210
};

211 212 213 214 215 216 217 218 219 220 221 222
/* cool ABI compat hack */
#define GTK_CELL_RENDERER_INFO_KEY "gtk-cell-renderer-info"

typedef struct _GtkCellRendererInfo GtkCellRendererInfo;
struct _GtkCellRendererInfo
{
  GdkColor cell_background;

  /* text renderer */
  gulong focus_out_id;

  /* toggle renderer */
223
  guint inconsistent :1;
224 225
};

226 227
#ifdef __GNUC__

228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
#define TREE_VIEW_INTERNAL_ASSERT(expr, ret)     G_STMT_START{          \
     if (!(expr))                                                       \
       {                                                                \
         g_log (G_LOG_DOMAIN,                                           \
                G_LOG_LEVEL_CRITICAL,                                   \
		"file %s: line %d (%s): assertion `%s' failed.\n"       \
	        "There is a disparity between the internal view of the GtkTreeView,\n"    \
		"and the GtkTreeModel.  This generally means that the model has changed\n"\
		"without letting the view know.  Any display from now on is likely to\n"  \
		"be incorrect.\n",                                                        \
                __FILE__,                                               \
                __LINE__,                                               \
                __PRETTY_FUNCTION__,                                    \
                #expr);                                                 \
         return ret;                                                    \
       };                               }G_STMT_END

Jonathan Blandford's avatar
Jonathan Blandford committed
245
#define TREE_VIEW_INTERNAL_ASSERT_VOID(expr)     G_STMT_START{          \
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
     if (!(expr))                                                       \
       {                                                                \
         g_log (G_LOG_DOMAIN,                                           \
                G_LOG_LEVEL_CRITICAL,                                   \
		"file %s: line %d (%s): assertion `%s' failed.\n"       \
	        "There is a disparity between the internal view of the GtkTreeView,\n"    \
		"and the GtkTreeModel.  This generally means that the model has changed\n"\
		"without letting the view know.  Any display from now on is likely to\n"  \
		"be incorrect.\n",                                                        \
                __FILE__,                                               \
                __LINE__,                                               \
                __PRETTY_FUNCTION__,                                    \
                #expr);                                                 \
         return;                                                        \
       };                               }G_STMT_END

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
#else

#define TREE_VIEW_INTERNAL_ASSERT(expr, ret)     G_STMT_START{          \
     if (!(expr))                                                       \
       {                                                                \
         g_log (G_LOG_DOMAIN,                                           \
                G_LOG_LEVEL_CRITICAL,                                   \
		"file %s: line %d: assertion `%s' failed.\n"       \
	        "There is a disparity between the internal view of the GtkTreeView,\n"    \
		"and the GtkTreeModel.  This generally means that the model has changed\n"\
		"without letting the view know.  Any display from now on is likely to\n"  \
		"be incorrect.\n",                                                        \
                __FILE__,                                               \
                __LINE__,                                               \
                #expr);                                                 \
         return ret;                                                    \
       };                               }G_STMT_END

#define TREE_VIEW_INTERNAL_ASSERT_VOID(expr)     G_STMT_START{          \
     if (!(expr))                                                       \
       {                                                                \
         g_log (G_LOG_DOMAIN,                                           \
                G_LOG_LEVEL_CRITICAL,                                   \
		"file %s: line %d: assertion '%s' failed.\n"            \
	        "There is a disparity between the internal view of the GtkTreeView,\n"    \
		"and the GtkTreeModel.  This generally means that the model has changed\n"\
		"without letting the view know.  Any display from now on is likely to\n"  \
		"be incorrect.\n",                                                        \
                __FILE__,                                               \
                __LINE__,                                               \
                #expr);                                                 \
         return;                                                        \
       };                               }G_STMT_END
#endif

297

298 299 300 301 302
/* functions that shouldn't be exported */
void         _gtk_tree_selection_internal_select_node (GtkTreeSelection  *selection,
						       GtkRBNode         *node,
						       GtkRBTree         *tree,
						       GtkTreePath       *path,
Kristian Rietveld's avatar
Kristian Rietveld committed
303
                                                       GtkTreeSelectMode  mode,
Kristian Rietveld's avatar
Kristian Rietveld committed
304
						       gboolean           override_browse_mode);
305 306 307 308 309 310 311
gboolean     _gtk_tree_view_find_node                 (GtkTreeView       *tree_view,
						       GtkTreePath       *path,
						       GtkRBTree        **tree,
						       GtkRBNode        **node);
GtkTreePath *_gtk_tree_view_find_path                 (GtkTreeView       *tree_view,
						       GtkRBTree         *tree,
						       GtkRBNode         *node);
312 313 314 315 316 317
void         _gtk_tree_view_child_move_resize         (GtkTreeView       *tree_view,
						       GtkWidget         *widget,
						       gint               x,
						       gint               y,
						       gint               width,
						       gint               height);
318 319 320 321
void         _gtk_tree_view_queue_draw_node           (GtkTreeView       *tree_view,
						       GtkRBTree         *tree,
						       GtkRBNode         *node,
						       GdkRectangle      *clip_rect);
322

323 324 325 326
void _gtk_tree_view_column_realize_button   (GtkTreeViewColumn *column);
void _gtk_tree_view_column_unrealize_button (GtkTreeViewColumn *column);
void _gtk_tree_view_column_set_tree_view    (GtkTreeViewColumn *column,
					     GtkTreeView       *tree_view);
327 328
void _gtk_tree_view_column_unset_model      (GtkTreeViewColumn *column,
					     GtkTreeModel      *old_model);
329
void _gtk_tree_view_column_unset_tree_view  (GtkTreeViewColumn *column);
330 331
void _gtk_tree_view_column_set_width        (GtkTreeViewColumn *column,
					     gint               width);
Jonathan Blandford's avatar
Jonathan Blandford committed
332 333
void _gtk_tree_view_column_start_drag       (GtkTreeView       *tree_view,
					     GtkTreeViewColumn *column);
334 335 336 337 338 339 340
gboolean _gtk_tree_view_column_cell_event   (GtkTreeViewColumn  *tree_column,
					     GtkCellEditable   **editable_widget,
					     GdkEvent           *event,
					     gchar              *path_string,
					     GdkRectangle       *background_area,
					     GdkRectangle       *cell_area,
					     guint               flags);
341 342 343
void _gtk_tree_view_column_start_editing (GtkTreeViewColumn *tree_column,
					  GtkCellEditable   *editable_widget);
void _gtk_tree_view_column_stop_editing  (GtkTreeViewColumn *tree_column);
344 345 346 347
void _gtk_tree_view_install_mark_rows_col_dirty (GtkTreeView *tree_view);
void             _gtk_tree_view_column_autosize          (GtkTreeView       *tree_view,
							  GtkTreeViewColumn *column);

348
gboolean         _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column);
349
GtkCellRenderer *_gtk_tree_view_column_get_edited_cell   (GtkTreeViewColumn *column);
Kristian Rietveld's avatar
Kristian Rietveld committed
350
gint             _gtk_tree_view_column_count_special_cells (GtkTreeViewColumn *column);
351 352
GtkCellRenderer *_gtk_tree_view_column_get_cell_at_pos   (GtkTreeViewColumn *column,
							  gint               x);
353

354 355 356 357
GtkTreeSelection* _gtk_tree_selection_new                (void);
GtkTreeSelection* _gtk_tree_selection_new_with_tree_view (GtkTreeView      *tree_view);
void              _gtk_tree_selection_set_tree_view      (GtkTreeSelection *selection,
                                                          GtkTreeView      *tree_view);
358

359 360 361 362 363 364 365
void		  _gtk_tree_view_column_cell_render      (GtkTreeViewColumn *tree_column,
							  GdkWindow         *window,
							  GdkRectangle      *background_area,
							  GdkRectangle      *cell_area,
							  GdkRectangle      *expose_area,
							  guint              flags);
gboolean	  _gtk_tree_view_column_cell_focus       (GtkTreeViewColumn *tree_column,
366 367 368
							  gint               direction,
							  gboolean           left,
							  gboolean           right);
369 370 371 372 373 374 375 376
void		  _gtk_tree_view_column_cell_draw_focus  (GtkTreeViewColumn *tree_column,
							  GdkWindow         *window,
							  GdkRectangle      *background_area,
							  GdkRectangle      *cell_area,
							  GdkRectangle      *expose_area,
							  guint              flags);
void		  _gtk_tree_view_column_cell_set_dirty	 (GtkTreeViewColumn *tree_column,
							  gboolean           install_handler);
377 378 379 380
void              _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column,
							    GtkCellRenderer   *cell,
							    gint              *left,
							    gint              *right);
381 382


383 384 385 386 387 388 389
#ifdef __cplusplus
}
#endif /* __cplusplus */


#endif /* __GTK_TREE_PRIVATE_H__ */