gtktreeprivate.h 14.9 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;

46 47 48 49 50 51
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,
52
  DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT = 4
53
};
Jonathan Blandford's avatar
Jonathan Blandford committed
54
  
55 56 57 58
#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
59
#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))
60 61
#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))

62 63 64 65 66
 /* 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))

67 68 69
typedef void (*GtkTreeViewSearchDialogPositionFunc) (GtkTreeView *tree_view,
						     GtkWidget   *search_dialog);

70 71 72 73 74 75 76 77 78
typedef struct _GtkTreeViewColumnReorder GtkTreeViewColumnReorder;
struct _GtkTreeViewColumnReorder
{
  gint left_align;
  gint right_align;
  GtkTreeViewColumn *left_column;
  GtkTreeViewColumn *right_column;
};

79 80 81 82 83 84 85 86 87 88 89 90 91 92
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
93
  gint expander_size;
94 95 96 97 98 99

  GtkAdjustment *hadjustment;
  GtkAdjustment *vadjustment;

  GdkWindow *bin_window;
  GdkWindow *header_window;
Jonathan Blandford's avatar
Jonathan Blandford committed
100
  GdkWindow *drag_window;
101
  GdkWindow *drag_highlight_window;
Jonathan Blandford's avatar
Jonathan Blandford committed
102
  GtkTreeViewColumn *drag_column;
103

104 105
  GtkTreeRowReference *last_button_press;
  GtkTreeRowReference *last_button_press_2;
106

107
  /* bin_window offset */
108 109
  GtkTreeRowReference *top_row;
  gint top_row_dy;
110 111
  /* dy == y pos of top_row + top_row_dy */
  /* we cache it for simplicity of the code */
112
  gint dy;
113
  gint drag_column_x;
114

115
  GtkTreeViewColumn *expander_column;
116
  GtkTreeViewColumn *edited_column;
Jonathan Blandford's avatar
Jonathan Blandford committed
117 118
  guint presize_handler_timer;
  guint validate_rows_timer;
119
  guint scroll_sync_timer;
120 121

  /* Focus code */
122
  GtkTreeViewColumn *focus_column;
123

124
  /* Selection stuff */
125 126
  GtkTreeRowReference *anchor;
  GtkTreeRowReference *cursor;
127 128 129 130 131 132 133 134 135

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

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

136 137 138 139 140
  /* The node that's currently being collapsed or expanded */
  GtkRBNode *expanded_collapsed_node;
  GtkRBTree *expanded_collapsed_tree;
  guint expand_collapse_timeout;

141 142 143 144
  /* Selection information */
  GtkTreeSelection *selection;

  /* Header information */
145 146
  gint n_columns;
  GList *columns;
147
  gint header_height;
148

149
  GtkTreeViewColumnDropFunc column_drop_func;
150 151
  gpointer column_drop_func_data;
  GtkDestroyNotify column_drop_func_data_destroy;
Jonathan Blandford's avatar
Jonathan Blandford committed
152
  GList *column_drag_info;
153
  GtkTreeViewColumnReorder *cur_reorder;
Havoc Pennington's avatar
Havoc Pennington committed
154

155 156 157 158 159
  /* ATK Hack */
  GtkTreeDestroyCountFunc destroy_count_func;
  gpointer destroy_count_data;
  GtkDestroyNotify destroy_count_destroy;

Havoc Pennington's avatar
Havoc Pennington committed
160 161
  /* Scroll timeout (e.g. during dnd) */
  guint scroll_timeout;
162

Havoc Pennington's avatar
Havoc Pennington committed
163
  /* Row drag-and-drop */
164
  GtkTreeRowReference *drag_dest_row;
Havoc Pennington's avatar
Havoc Pennington committed
165 166
  GtkTreeViewDropPosition drag_dest_pos;
  guint open_dest_timeout;
167

Havoc Pennington's avatar
Havoc Pennington committed
168 169 170
  gint pressed_button;
  gint press_start_x;
  gint press_start_y;
171 172

  /* Scroll-to functionality when unrealized */
173
  GtkTreeRowReference *scroll_to_path;
174 175 176
  GtkTreeViewColumn *scroll_to_column;
  gfloat scroll_to_row_align;
  gfloat scroll_to_col_align;
177
  guint scroll_to_use_align : 1;
Havoc Pennington's avatar
Havoc Pennington committed
178

179 180
  guint fixed_height_check : 1;

181
  guint reorderable : 1;
182 183
  guint header_has_focus : 1;
  guint drag_column_window_state : 3;
Havoc Pennington's avatar
Havoc Pennington committed
184 185
  /* hint to display rows in alternating colors */
  guint has_rules : 1;
Jonathan Blandford's avatar
Jonathan Blandford committed
186 187
  guint mark_rows_col_dirty : 1;
  
188 189
  /* interactive search */
  guint enable_search : 1;
190
  guint disable_popdown : 1;
191 192 193 194 195
  gint search_column;
  GtkTreeViewSearchDialogPositionFunc search_dialog_position_func;
  GtkTreeViewSearchEqualFunc search_equal_func;
  gpointer search_user_data;
  GtkDestroyNotify search_destroy;
196 197
};

198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
/* 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 */
  gboolean inconsistent :1;
};

213 214
#ifdef __GNUC__

215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
#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
232
#define TREE_VIEW_INTERNAL_ASSERT_VOID(expr)     G_STMT_START{          \
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
     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

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

284

285 286 287 288 289
/* 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
290 291
						       GdkModifierType    state,
						       gboolean           override_browse_mode);
292 293 294 295 296 297 298
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);
299 300 301 302 303 304
void         _gtk_tree_view_child_move_resize         (GtkTreeView       *tree_view,
						       GtkWidget         *widget,
						       gint               x,
						       gint               y,
						       gint               width,
						       gint               height);
305 306 307 308
void         _gtk_tree_view_queue_draw_node           (GtkTreeView       *tree_view,
						       GtkRBTree         *tree,
						       GtkRBNode         *node,
						       GdkRectangle      *clip_rect);
309

310 311 312 313
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);
314 315
void _gtk_tree_view_column_unset_model      (GtkTreeViewColumn *column,
					     GtkTreeModel      *old_model);
316
void _gtk_tree_view_column_unset_tree_view  (GtkTreeViewColumn *column);
317 318
void _gtk_tree_view_column_set_width        (GtkTreeViewColumn *column,
					     gint               width);
Jonathan Blandford's avatar
Jonathan Blandford committed
319 320
void _gtk_tree_view_column_start_drag       (GtkTreeView       *tree_view,
					     GtkTreeViewColumn *column);
321 322 323 324 325 326 327
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);
328 329 330
void _gtk_tree_view_column_start_editing (GtkTreeViewColumn *tree_column,
					  GtkCellEditable   *editable_widget);
void _gtk_tree_view_column_stop_editing  (GtkTreeViewColumn *tree_column);
331 332 333 334
void _gtk_tree_view_install_mark_rows_col_dirty (GtkTreeView *tree_view);
void             _gtk_tree_view_column_autosize          (GtkTreeView       *tree_view,
							  GtkTreeViewColumn *column);

335
gboolean         _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column);
336
GtkCellRenderer *_gtk_tree_view_column_get_edited_cell   (GtkTreeViewColumn *column);
Kristian Rietveld's avatar
Kristian Rietveld committed
337
gint             _gtk_tree_view_column_count_special_cells (GtkTreeViewColumn *column);
338 339
GtkCellRenderer *_gtk_tree_view_column_get_cell_at_pos   (GtkTreeViewColumn *column,
							  gint               x);
340

341 342 343 344
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);
345

346 347 348 349 350 351 352
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,
353 354 355
							  gint               direction,
							  gboolean           left,
							  gboolean           right);
356 357 358 359 360 361 362 363
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);
364 365 366 367
void              _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column,
							    GtkCellRenderer   *cell,
							    gint              *left,
							    gint              *right);
Jonathan Blandford's avatar
Jonathan Blandford committed
368 369


370 371 372 373 374 375 376
#ifdef __cplusplus
}
#endif /* __cplusplus */


#endif /* __GTK_TREE_PRIVATE_H__ */