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

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 93 94 95 96 97 98 99
struct _GtkTreeViewPrivate
{
  GtkTreeModel *model;

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

  gint tab_offset;
  GtkRBNode *button_pressed_node;
  GtkRBTree *button_pressed_tree;

  GList *children;
  gint width;
  gint height;

  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

  /* bin_window offset */
  gint dy;
106
  gint drag_column_x;
107

108
  GtkTreeViewColumn *expander_column;
109
  GtkTreeViewColumn *edited_column;
Jonathan Blandford's avatar
Jonathan Blandford committed
110 111
  guint presize_handler_timer;
  guint validate_rows_timer;
112 113

  /* Focus code */
114
  GtkTreeViewColumn *focus_column;
115

116
  /* Selection stuff */
117 118
  GtkTreeRowReference *anchor;
  GtkTreeRowReference *cursor;
119 120 121 122 123 124 125 126 127

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

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

128 129 130 131 132
  /* The node that's currently being collapsed or expanded */
  GtkRBNode *expanded_collapsed_node;
  GtkRBTree *expanded_collapsed_tree;
  guint expand_collapse_timeout;

133 134 135 136
  /* Selection information */
  GtkTreeSelection *selection;

  /* Header information */
137 138
  gint n_columns;
  GList *columns;
139
  gint header_height;
140

141
  GtkTreeViewColumnDropFunc column_drop_func;
142 143
  gpointer column_drop_func_data;
  GtkDestroyNotify column_drop_func_data_destroy;
Jonathan Blandford's avatar
Jonathan Blandford committed
144
  GList *column_drag_info;
145
  GtkTreeViewColumnReorder *cur_reorder;
Havoc Pennington's avatar
Havoc Pennington committed
146

147 148 149 150 151
  /* ATK Hack */
  GtkTreeDestroyCountFunc destroy_count_func;
  gpointer destroy_count_data;
  GtkDestroyNotify destroy_count_destroy;

Havoc Pennington's avatar
Havoc Pennington committed
152 153
  /* Scroll timeout (e.g. during dnd) */
  guint scroll_timeout;
154

Havoc Pennington's avatar
Havoc Pennington committed
155
  /* Row drag-and-drop */
156
  GtkTreeRowReference *drag_dest_row;
Havoc Pennington's avatar
Havoc Pennington committed
157 158
  GtkTreeViewDropPosition drag_dest_pos;
  guint open_dest_timeout;
159

Havoc Pennington's avatar
Havoc Pennington committed
160 161 162
  gint pressed_button;
  gint press_start_x;
  gint press_start_y;
163 164 165 166 167 168

  /* Scroll-to functionality when unrealized */
  GtkTreePath *scroll_to_path;
  GtkTreeViewColumn *scroll_to_column;
  gfloat scroll_to_row_align;
  gfloat scroll_to_col_align;
169
  guint scroll_to_use_align : 1;
Havoc Pennington's avatar
Havoc Pennington committed
170

171
  guint reorderable : 1;
172 173
  guint header_has_focus : 1;
  guint drag_column_window_state : 3;
Havoc Pennington's avatar
Havoc Pennington committed
174 175
  /* hint to display rows in alternating colors */
  guint has_rules : 1;
Jonathan Blandford's avatar
Jonathan Blandford committed
176 177
  guint mark_rows_col_dirty : 1;
  
178 179 180 181 182 183 184
  /* interactive search */
  guint enable_search : 1;
  gint search_column;
  GtkTreeViewSearchDialogPositionFunc search_dialog_position_func;
  GtkTreeViewSearchEqualFunc search_equal_func;
  gpointer search_user_data;
  GtkDestroyNotify search_destroy;
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
};

#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
204
#define TREE_VIEW_INTERNAL_ASSERT_VOID(expr)     G_STMT_START{          \
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
     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

221

222 223 224 225 226 227 228 229 230 231 232 233 234
/* functions that shouldn't be exported */
void         _gtk_tree_selection_internal_select_node (GtkTreeSelection  *selection,
						       GtkRBNode         *node,
						       GtkRBTree         *tree,
						       GtkTreePath       *path,
						       GdkModifierType    state);
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);
235 236 237 238 239 240
void         _gtk_tree_view_child_move_resize         (GtkTreeView       *tree_view,
						       GtkWidget         *widget,
						       gint               x,
						       gint               y,
						       gint               width,
						       gint               height);
241 242


243 244 245 246 247
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);
void _gtk_tree_view_column_unset_tree_view  (GtkTreeViewColumn *column);
248 249
void _gtk_tree_view_column_set_width        (GtkTreeViewColumn *column,
					     gint               width);
Jonathan Blandford's avatar
Jonathan Blandford committed
250 251
void _gtk_tree_view_column_start_drag       (GtkTreeView       *tree_view,
					     GtkTreeViewColumn *column);
252 253 254 255 256 257 258
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);
259 260 261
void _gtk_tree_view_column_start_editing (GtkTreeViewColumn *tree_column,
					  GtkCellEditable   *editable_widget);
void _gtk_tree_view_column_stop_editing  (GtkTreeViewColumn *tree_column);
Jonathan Blandford's avatar
Jonathan Blandford committed
262
void _gtk_tree_view_install_mark_rows_col_dirty (GtkTreeView *tree_view);					 
263

264 265 266 267
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);
268

Jonathan Blandford's avatar
Jonathan Blandford committed
269 270 271



272 273 274 275 276 277 278
#ifdef __cplusplus
}
#endif /* __cplusplus */


#endif /* __GTK_TREE_PRIVATE_H__ */