]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreeprivate.h
Modify the gettext translation domain for the gtk3 rename
[~andy/gtk] / gtk / gtktreeprivate.h
index 7e2e59ab8f26b29d6b751d7149a9a6bf964ca2ee..c44d61813db9027b7d9acc5e1a24b3caacec4737 100644 (file)
 #define __GTK_TREE_PRIVATE_H__
 
 
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+G_BEGIN_DECLS
+
 
 #include <gtk/gtktreeview.h>
 #include <gtk/gtktreeselection.h>
 #include <gtk/gtkrbtree.h>
 
+#define TREE_VIEW_DRAG_WIDTH 6
+
 typedef enum
 {
   GTK_TREE_VIEW_IS_LIST = 1 << 0,
@@ -37,16 +38,54 @@ typedef enum
   GTK_TREE_VIEW_ARROW_PRELIT = 1 << 3,
   GTK_TREE_VIEW_HEADERS_VISIBLE = 1 << 4,
   GTK_TREE_VIEW_DRAW_KEYFOCUS = 1 << 5,
-  GTK_TREE_VIEW_MODEL_SETUP = 1 << 6
+  GTK_TREE_VIEW_MODEL_SETUP = 1 << 6,
+  GTK_TREE_VIEW_IN_COLUMN_DRAG = 1 << 7
 } GtkTreeViewFlags;
 
+typedef enum
+{
+  GTK_TREE_SELECT_MODE_TOGGLE = 1 << 0,
+  GTK_TREE_SELECT_MODE_EXTEND = 1 << 1
+}
+GtkTreeSelectMode;
+
+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,
+  DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT = 4
+};
+
+enum
+{
+  RUBBER_BAND_OFF = 0,
+  RUBBER_BAND_MAYBE_START = 1,
+  RUBBER_BAND_ACTIVE = 2
+};
+
 #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)
-#define TREE_VIEW_COLUMN_WIDTH(column)             (CLAMP (column->width, (column->min_width!=-1)?column->min_width:column->width, (column->max_width!=-1)?column->max_width:column->width))
+#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))
 #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))
 
+ /* 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))
+
+typedef struct _GtkTreeViewColumnReorder GtkTreeViewColumnReorder;
+struct _GtkTreeViewColumnReorder
+{
+  gint left_align;
+  gint right_align;
+  GtkTreeViewColumn *left_column;
+  GtkTreeViewColumn *right_column;
+};
+
 struct _GtkTreeViewPrivate
 {
   GtkTreeModel *model;
@@ -55,36 +94,73 @@ struct _GtkTreeViewPrivate
   /* tree information */
   GtkRBTree *tree;
 
-  gint tab_offset;
-  GtkRBNode *button_pressed_node;
-  GtkRBTree *button_pressed_tree;
-
+  /* Container info */
   GList *children;
   gint width;
   gint height;
 
+  /* Adjustments */
   GtkAdjustment *hadjustment;
   GtkAdjustment *vadjustment;
 
+  /* Sub windows */
   GdkWindow *bin_window;
   GdkWindow *header_window;
 
-  gint expander_column;
-  
-  /* Selection stuff */
+  /* Scroll position state keeping */
+  GtkTreeRowReference *top_row;
+  gint top_row_dy;
+  /* dy == y pos of top_row + top_row_dy */
+  /* we cache it for simplicity of the code */
+  gint dy;
+
+  guint presize_handler_timer;
+  guint validate_rows_timer;
+  guint scroll_sync_timer;
+
+  /* Indentation and expander layout */
+  gint expander_size;
+  GtkTreeViewColumn *expander_column;
+
+  gint level_indentation;
+
+  /* Key navigation (focus), selection */
+  gint cursor_offset;
+
   GtkTreeRowReference *anchor;
   GtkTreeRowReference *cursor;
 
-  /* Column Resizing */
-  GdkCursor *cursor_drag;
-  GdkGC *xor_gc;
-  gint drag_pos;
-  gint x_drag;
+  GtkTreeViewColumn *focus_column;
+
+  /* Current pressed node, previously pressed, prelight */
+  GtkRBNode *button_pressed_node;
+  GtkRBTree *button_pressed_tree;
+
+  gint pressed_button;
+  gint press_start_x;
+  gint press_start_y;
+
+  gint event_last_x;
+  gint event_last_y;
+
+  guint last_button_time;
+  gint last_button_x;
+  gint last_button_y;
 
-  /* Prelight information */
   GtkRBNode *prelight_node;
   GtkRBTree *prelight_tree;
 
+  /* Cell Editing */
+  GtkTreeViewColumn *edited_column;
+
+  /* The node that's currently being collapsed or expanded */
+  GtkRBNode *expanded_collapsed_node;
+  GtkRBTree *expanded_collapsed_tree;
+  guint expand_collapse_timeout;
+
+  /* Auto expand/collapse timeout in hover mode */
+  guint auto_expand_timeout;
+
   /* Selection information */
   GtkTreeSelection *selection;
 
@@ -93,26 +169,135 @@ struct _GtkTreeViewPrivate
   GList *columns;
   gint header_height;
 
-  /* Scroll timeout (e.g. during dnd) */
+  GtkTreeViewColumnDropFunc column_drop_func;
+  gpointer column_drop_func_data;
+  GDestroyNotify column_drop_func_data_destroy;
+  GList *column_drag_info;
+  GtkTreeViewColumnReorder *cur_reorder;
+
+  gint prev_width_before_expander;
+
+  /* Interactive Header reordering */
+  GdkWindow *drag_window;
+  GdkWindow *drag_highlight_window;
+  GtkTreeViewColumn *drag_column;
+  gint drag_column_x;
+
+  /* Interactive Header Resizing */
+  gint drag_pos;
+  gint x_drag;
+
+  /* Non-interactive Header Resizing, expand flag support */
+  gint prev_width;
+
+  gint last_extra_space;
+  gint last_extra_space_per_column;
+  gint last_number_of_expand_columns;
+
+  /* ATK Hack */
+  GtkTreeDestroyCountFunc destroy_count_func;
+  gpointer destroy_count_data;
+  GDestroyNotify destroy_count_destroy;
+
+  /* Scroll timeout (e.g. during dnd, rubber banding) */
   guint scroll_timeout;
-  
+
   /* Row drag-and-drop */
   GtkTreeRowReference *drag_dest_row;
   GtkTreeViewDropPosition drag_dest_pos;
   guint open_dest_timeout;
-  
-  gint pressed_button;
-  gint press_start_x;
-  gint press_start_y;
+
+  /* Rubber banding */
+  gint rubber_band_status;
+  gint rubber_band_x;
+  gint rubber_band_y;
+  gint rubber_band_shift;
+  gint rubber_band_ctrl;
+
+  GtkRBNode *rubber_band_start_node;
+  GtkRBTree *rubber_band_start_tree;
+
+  GtkRBNode *rubber_band_end_node;
+  GtkRBTree *rubber_band_end_tree;
+
+  /* fixed height */
+  gint fixed_height;
 
   /* Scroll-to functionality when unrealized */
-  GtkTreePath *scroll_to_path;
+  GtkTreeRowReference *scroll_to_path;
   GtkTreeViewColumn *scroll_to_column;
   gfloat scroll_to_row_align;
   gfloat scroll_to_col_align;
 
+  /* Interactive search */
+  gint selected_iter;
+  gint search_column;
+  GtkTreeViewSearchPositionFunc search_position_func;
+  GtkTreeViewSearchEqualFunc search_equal_func;
+  gpointer search_user_data;
+  GDestroyNotify search_destroy;
+  gpointer search_position_user_data;
+  GDestroyNotify search_position_destroy;
+  GtkWidget *search_window;
+  GtkWidget *search_entry;
+  guint search_entry_changed_id;
+  guint typeselect_flush_timeout;
+
+  /* Grid and tree lines */
+  GtkTreeViewGridLines grid_lines;
+  GdkGC *grid_line_gc;
+
+  gboolean tree_lines_enabled;
+  GdkGC *tree_line_gc;
+
+  /* Row separators */
+  GtkTreeViewRowSeparatorFunc row_separator_func;
+  gpointer row_separator_data;
+  GDestroyNotify row_separator_destroy;
+
+  /* Tooltip support */
+  gint tooltip_column;
+
+  /* Here comes the bitfield */
+  guint scroll_to_use_align : 1;
+
+  guint fixed_height_mode : 1;
+  guint fixed_height_check : 1;
+
+  guint reorderable : 1;
+  guint header_has_focus : 1;
+  guint drag_column_window_state : 3;
   /* hint to display rows in alternating colors */
   guint has_rules : 1;
+  guint mark_rows_col_dirty : 1;
+
+  /* for DnD */
+  guint empty_view_drop : 1;
+
+  guint ctrl_pressed : 1;
+  guint shift_pressed : 1;
+
+  guint init_hadjust_value : 1;
+
+  guint in_top_row_to_dy : 1;
+
+  /* interactive search */
+  guint enable_search : 1;
+  guint disable_popdown : 1;
+  guint search_custom_entry_set : 1;
+  
+  guint hover_selection : 1;
+  guint hover_expand : 1;
+  guint imcontext_changed : 1;
+
+  guint rubber_banding_enable : 1;
+
+  guint in_grab : 1;
+
+  guint post_validation_flag : 1;
+
+  /* Whether our key press handler is to avoid sending an unhandled binding to the search entry */
+  guint search_entry_avoid_unhandled_binding : 1;
 };
 
 #ifdef __GNUC__
@@ -122,31 +307,29 @@ struct _GtkTreeViewPrivate
        {                                                                \
          g_log (G_LOG_DOMAIN,                                           \
                 G_LOG_LEVEL_CRITICAL,                                   \
-               "file %s: line %d (%s): assertion `%s' failed.\n"       \
+               "%s (%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__,                                    \
+                G_STRLOC,                                               \
+                G_STRFUNC,                                              \
                 #expr);                                                 \
          return ret;                                                    \
        };                               }G_STMT_END
 
-#define TREE_VIEW_INTERNAL_ASSERT_VOID(expr)     G_STMT_START{             \
+#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 (%s): assertion `%s' failed.\n"       \
+               "%s (%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__,                                    \
+                G_STRLOC,                                               \
+                G_STRFUNC,                                              \
                 #expr);                                                 \
          return;                                                        \
        };                               }G_STMT_END
@@ -186,12 +369,15 @@ struct _GtkTreeViewPrivate
        };                               }G_STMT_END
 #endif
 
+
 /* functions that shouldn't be exported */
 void         _gtk_tree_selection_internal_select_node (GtkTreeSelection  *selection,
                                                       GtkRBNode         *node,
                                                       GtkRBTree         *tree,
                                                       GtkTreePath       *path,
-                                                      GdkModifierType    state);
+                                                       GtkTreeSelectMode  mode,
+                                                      gboolean           override_browse_mode);
+void         _gtk_tree_selection_emit_changed         (GtkTreeSelection  *selection);
 gboolean     _gtk_tree_view_find_node                 (GtkTreeView       *tree_view,
                                                       GtkTreePath       *path,
                                                       GtkRBTree        **tree,
@@ -199,23 +385,85 @@ gboolean     _gtk_tree_view_find_node                 (GtkTreeView       *tree_v
 GtkTreePath *_gtk_tree_view_find_path                 (GtkTreeView       *tree_view,
                                                       GtkRBTree         *tree,
                                                       GtkRBNode         *node);
-void         _gtk_tree_view_update_size               (GtkTreeView       *tree_view);
-
-
-void _gtk_tree_view_column_set_tree_view (GtkTreeViewColumn *column,
-                                         GtkTreeView       *tree_view);
+void         _gtk_tree_view_child_move_resize         (GtkTreeView       *tree_view,
+                                                      GtkWidget         *widget,
+                                                      gint               x,
+                                                      gint               y,
+                                                      gint               width,
+                                                      gint               height);
+void         _gtk_tree_view_queue_draw_node           (GtkTreeView       *tree_view,
+                                                      GtkRBTree         *tree,
+                                                      GtkRBNode         *node,
+                                                      const GdkRectangle *clip_rect);
+
+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_model      (GtkTreeViewColumn *column,
+                                            GtkTreeModel      *old_model);
+void _gtk_tree_view_column_unset_tree_view  (GtkTreeViewColumn *column);
+void _gtk_tree_view_column_set_width        (GtkTreeViewColumn *column,
+                                            gint               width);
+void _gtk_tree_view_column_start_drag       (GtkTreeView       *tree_view,
+                                            GtkTreeViewColumn *column);
+gboolean _gtk_tree_view_column_cell_event   (GtkTreeViewColumn  *tree_column,
+                                            GtkCellEditable   **editable_widget,
+                                            GdkEvent           *event,
+                                            gchar              *path_string,
+                                            const GdkRectangle *background_area,
+                                            const GdkRectangle *cell_area,
+                                            guint               flags);
+void _gtk_tree_view_column_start_editing (GtkTreeViewColumn *tree_column,
+                                         GtkCellEditable   *editable_widget);
+void _gtk_tree_view_column_stop_editing  (GtkTreeViewColumn *tree_column);
+void _gtk_tree_view_install_mark_rows_col_dirty (GtkTreeView *tree_view);
+void             _gtk_tree_view_column_autosize          (GtkTreeView       *tree_view,
+                                                         GtkTreeViewColumn *column);
+
+gboolean         _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column);
+GtkCellRenderer *_gtk_tree_view_column_get_edited_cell   (GtkTreeViewColumn *column);
+gint             _gtk_tree_view_column_count_special_cells (GtkTreeViewColumn *column);
+GtkCellRenderer *_gtk_tree_view_column_get_cell_at_pos   (GtkTreeViewColumn *column,
+                                                         gint               x);
 
 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);
-
-
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+gboolean          _gtk_tree_selection_row_is_selectable  (GtkTreeSelection *selection,
+                                                         GtkRBNode        *node,
+                                                         GtkTreePath      *path);
+
+void             _gtk_tree_view_column_cell_render      (GtkTreeViewColumn  *tree_column,
+                                                         GdkWindow          *window,
+                                                         const GdkRectangle *background_area,
+                                                         const GdkRectangle *cell_area,
+                                                         const GdkRectangle *expose_area,
+                                                         guint               flags);
+void             _gtk_tree_view_column_get_focus_area   (GtkTreeViewColumn  *tree_column,
+                                                         const GdkRectangle *background_area,
+                                                         const GdkRectangle *cell_area,
+                                                         GdkRectangle       *focus_area);
+gboolean         _gtk_tree_view_column_cell_focus       (GtkTreeViewColumn  *tree_column,
+                                                         gint                direction,
+                                                         gboolean            left,
+                                                         gboolean            right);
+void             _gtk_tree_view_column_cell_draw_focus  (GtkTreeViewColumn  *tree_column,
+                                                         GdkWindow          *window,
+                                                         const GdkRectangle *background_area,
+                                                         const GdkRectangle *cell_area,
+                                                         const GdkRectangle *expose_area,
+                                                         guint               flags);
+void             _gtk_tree_view_column_cell_set_dirty   (GtkTreeViewColumn  *tree_column,
+                                                         gboolean            install_handler);
+void              _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column,
+                                                           GtkCellRenderer   *cell,
+                                                           gint              *left,
+                                                           gint              *right);
+
+
+G_END_DECLS
 
 
 #endif /* __GTK_TREE_PRIVATE_H__ */