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
};
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 180 181
  /* fixed height */
  gint fixed_height;

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

189
  guint fixed_height_mode : 1;
190 191
  guint fixed_height_check : 1;

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

199 200 201
  /* for DnD */
  guint empty_view_drop : 1;

Kristian Rietveld's avatar
Kristian Rietveld committed
202 203
  guint ctrl_pressed : 1;
  guint shift_pressed : 1;
204 205 206 207


  guint init_hadjust_value : 1;

208 209
  /* interactive search */
  guint enable_search : 1;
210
  guint disable_popdown : 1;
Matthias Clasen's avatar
Matthias Clasen committed
211 212
  
  guint hover_selection : 1;
213 214

  gint selected_iter;
215 216 217 218 219
  gint search_column;
  GtkTreeViewSearchDialogPositionFunc search_dialog_position_func;
  GtkTreeViewSearchEqualFunc search_equal_func;
  gpointer search_user_data;
  GtkDestroyNotify search_destroy;
220 221 222 223
  GtkWidget *search_window;
  GtkWidget *search_entry;

  gint prev_width;
Matthias Clasen's avatar
Matthias Clasen committed
224 225 226 227

  GtkTreeViewRowSeparatorFunc row_separator_func;
  gpointer row_separator_data;
  GtkDestroyNotify row_separator_destroy;
228 229
};

230 231
#ifdef __GNUC__

232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
#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
249
#define TREE_VIEW_INTERNAL_ASSERT_VOID(expr)     G_STMT_START{          \
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
     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

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

301

302 303 304 305 306
/* 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
307
                                                       GtkTreeSelectMode  mode,
Kristian Rietveld's avatar
Kristian Rietveld committed
308
						       gboolean           override_browse_mode);
309 310 311 312 313 314 315
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);
316 317 318 319 320 321
void         _gtk_tree_view_child_move_resize         (GtkTreeView       *tree_view,
						       GtkWidget         *widget,
						       gint               x,
						       gint               y,
						       gint               width,
						       gint               height);
322 323 324 325
void         _gtk_tree_view_queue_draw_node           (GtkTreeView       *tree_view,
						       GtkRBTree         *tree,
						       GtkRBNode         *node,
						       GdkRectangle      *clip_rect);
326

327 328 329 330
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);
331 332
void _gtk_tree_view_column_unset_model      (GtkTreeViewColumn *column,
					     GtkTreeModel      *old_model);
333
void _gtk_tree_view_column_unset_tree_view  (GtkTreeViewColumn *column);
334 335
void _gtk_tree_view_column_set_width        (GtkTreeViewColumn *column,
					     gint               width);
Jonathan Blandford's avatar
Jonathan Blandford committed
336 337
void _gtk_tree_view_column_start_drag       (GtkTreeView       *tree_view,
					     GtkTreeViewColumn *column);
338 339 340 341 342 343 344
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);
345 346 347
void _gtk_tree_view_column_start_editing (GtkTreeViewColumn *tree_column,
					  GtkCellEditable   *editable_widget);
void _gtk_tree_view_column_stop_editing  (GtkTreeViewColumn *tree_column);
348 349 350 351
void _gtk_tree_view_install_mark_rows_col_dirty (GtkTreeView *tree_view);
void             _gtk_tree_view_column_autosize          (GtkTreeView       *tree_view,
							  GtkTreeViewColumn *column);

352
gboolean         _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column);
353
GtkCellRenderer *_gtk_tree_view_column_get_edited_cell   (GtkTreeViewColumn *column);
Kristian Rietveld's avatar
Kristian Rietveld committed
354
gint             _gtk_tree_view_column_count_special_cells (GtkTreeViewColumn *column);
355 356
GtkCellRenderer *_gtk_tree_view_column_get_cell_at_pos   (GtkTreeViewColumn *column,
							  gint               x);
357

358 359 360 361
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);
362

363 364 365 366 367 368 369
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,
370 371 372
							  gint               direction,
							  gboolean           left,
							  gboolean           right);
373 374 375 376 377 378 379 380
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);
381 382 383 384
void              _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column,
							    GtkCellRenderer   *cell,
							    gint              *left,
							    gint              *right);
Jonathan Blandford's avatar
Jonathan Blandford committed
385 386


387 388 389 390 391 392 393
#ifdef __cplusplus
}
#endif /* __cplusplus */


#endif /* __GTK_TREE_PRIVATE_H__ */