gtkctree.h 12.3 KB
Newer Older
Tim Janik's avatar
Tim Janik committed
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 31 32 33
/* GTK - The GIMP Toolkit
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald
 * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org>
 *
 * GtkCTree widget for GTK+
 * Copyright (C) 1998 Lars Hamann and Stefan Jeske
 *
 * 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_CTREE_H__
#define __GTK_CTREE_H__

#include <gtk/gtkclist.h>

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

34 35 36 37 38 39
#define GTK_TYPE_CTREE            (gtk_ctree_get_type ())
#define GTK_CTREE(obj)            (GTK_CHECK_CAST ((obj), GTK_TYPE_CTREE, GtkCTree))
#define GTK_CTREE_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_CTREE, GtkCTreeClass))
#define GTK_IS_CTREE(obj)         (GTK_CHECK_TYPE ((obj), GTK_TYPE_CTREE))
#define GTK_IS_CTREE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CTREE))

40
#define GTK_CTREE_ROW(_glist_) ((GtkCTreeRow *)((_glist_)->data))
41 42
#define GTK_CTREE_TREE(_ctree_, _glist_) \
  ((GtkCellTree *) &(((GtkCTreeRow *)((_glist_)->data))->cell[(_ctree_)->tree_col]))
Tim Janik's avatar
Tim Janik committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56

#define GTK_CTREE_FUNC(_func_) ((GtkCTreeFunc)(_func_))

typedef enum
{
  GTK_CTREE_POS_BEFORE,
  GTK_CTREE_POS_AS_CHILD,
  GTK_CTREE_POS_AFTER
} GtkCTreePos;

typedef enum
{
  GTK_CTREE_LINES_SOLID,
  GTK_CTREE_LINES_DOTTED,
57
  GTK_CTREE_LINES_TABBED,
Tim Janik's avatar
Tim Janik committed
58 59 60
  GTK_CTREE_LINES_NONE
} GtkCTreeLineStyle;

61 62 63 64 65 66 67 68 69 70
typedef enum
{
  GTK_CTREE_EXPANSION_EXPAND,
  GTK_CTREE_EXPANSION_EXPAND_RECURSIVE,
  GTK_CTREE_EXPANSION_COLLAPSE,
  GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE,
  GTK_CTREE_EXPANSION_TOGGLE,
  GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE
} GtkCTreeExpansion;

Tim Janik's avatar
Tim Janik committed
71 72 73 74 75
typedef struct _GtkCTree      GtkCTree;
typedef struct _GtkCTreeClass GtkCTreeClass;
typedef struct _GtkCTreeRow   GtkCTreeRow;

typedef void (*GtkCTreeFunc) (GtkCTree *ctree,
76
			      GList    *node,
Tim Janik's avatar
Tim Janik committed
77 78 79
			      gpointer  data);

typedef gint (*GtkCTreeCompareFunc) (GtkCTree    *ctree,
80 81
				     const GList *node1,
				     const GList *node2);
Tim Janik's avatar
Tim Janik committed
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

struct _GtkCTree
{
  GtkCList clist;

  GdkGC *xor_gc;
  GdkGC *lines_gc;
  GdkWindow *drag_icon;
  gint icon_width;
  gint icon_height;

  gint tree_indent;
  gint tree_column;
  gint drag_row;
  GList *drag_source;
  GList *drag_target;
  gint insert_pos;
  GtkCTreeCompareFunc node_compare;

  guint auto_sort   : 1;
  guint reorderable : 1;
  guint use_icons   : 1;
  guint in_drag     : 1;
  guint drag_rect   : 1;
  guint line_style  : 2;
};

struct _GtkCTreeClass
{
  GtkCListClass parent_class;

  void (*tree_select_row)   (GtkCTree *ctree,
114 115
			     GList    *row,
			     gint      column);
Tim Janik's avatar
Tim Janik committed
116
  void (*tree_unselect_row) (GtkCTree *ctree,
117 118
			     GList    *row,
			     gint      column);
Tim Janik's avatar
Tim Janik committed
119
  void (*tree_expand)       (GtkCTree *ctree,
120
			     GList    *node);
Tim Janik's avatar
Tim Janik committed
121
  void (*tree_collapse)     (GtkCTree *ctree,
122
			     GList    *node);
Tim Janik's avatar
Tim Janik committed
123
  void (*tree_move)         (GtkCTree *ctree,
124 125 126
			     GList    *node,
			     GList    *new_parent,
			     GList    *new_sibling);
127 128
  void (*change_focus_row_expansion) (GtkCTree *ctree,
				      GtkCTreeExpansion action);
Tim Janik's avatar
Tim Janik committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142
};

struct _GtkCTreeRow
{
  GtkCListRow row;

  GList *parent;
  GList *sibling;
  GList *children;

  GdkPixmap *pixmap_closed;
  GdkBitmap *mask_closed;
  GdkPixmap *pixmap_opened;
  GdkBitmap *mask_opened;
143 144 145 146 147

  guint16 level;

  guint is_leaf  : 1;
  guint expanded : 1;
Tim Janik's avatar
Tim Janik committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
};


/***********************************************************
 *           Creation, insertion, deletion                 *
 ***********************************************************/

GtkType     gtk_ctree_get_type              (void);
void        gtk_ctree_construct             (GtkCTree     *ctree,
					     gint          columns, 
					     gint          tree_column,
					     gchar        *titles[]);
GtkWidget * gtk_ctree_new_with_titles       (gint          columns, 
					     gint          tree_column,
					     gchar        *titles[]);
GtkWidget * gtk_ctree_new                   (gint          columns, 
					     gint          tree_column);
GList *     gtk_ctree_insert                (GtkCTree     *ctree,
					     GList        *parent, 
					     GList        *sibling,
					     gchar        *text[],
					     guint8        spacing,
					     GdkPixmap    *pixmap_closed,
					     GdkBitmap    *mask_closed,
					     GdkPixmap    *pixmap_opened,
					     GdkBitmap    *mask_opened,
					     gboolean      is_leaf,
					     gboolean      expanded);
void       gtk_ctree_remove                 (GtkCTree     *ctree, 
					     GList        *node);

/***********************************************************
 *  Generic recursive functions, querying / finding tree   *
 *  information                                            *
 ***********************************************************/

void       gtk_ctree_post_recursive         (GtkCTree     *ctree, 
					     GList        *node,
					     GtkCTreeFunc  func,
					     gpointer      data);
void       gtk_ctree_pre_recursive          (GtkCTree     *ctree, 
					     GList        *node,
					     GtkCTreeFunc  func,
					     gpointer      data);
192
gboolean   gtk_ctree_is_visible             (GtkCTree     *ctree, 
Tim Janik's avatar
Tim Janik committed
193 194 195
					     GList        *node);
GList *    gtk_ctree_last                   (GtkCTree     *ctree,
					     GList        *node);
196 197
GList *    gtk_ctree_find_glist_ptr         (GtkCTree     *ctree,
					     GtkCTreeRow  *ctree_row);
Tim Janik's avatar
Tim Janik committed
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
gint       gtk_ctree_find                   (GtkCTree     *ctree,
					     GList        *node,
					     GList        *child);
gboolean   gtk_ctree_is_ancestor            (GtkCTree     *ctree,
					     GList        *node,
					     GList        *child);
GList *    gtk_ctree_find_by_row_data       (GtkCTree     *ctree,
					     GList        *node,
					     gpointer      data);
gboolean   gtk_ctree_is_hot_spot            (GtkCTree     *ctree,
					     gint          x,
					     gint          y);

/***********************************************************
 *   Tree signals : move, expand, collapse, (un)select     *
 ***********************************************************/

void       gtk_ctree_move                   (GtkCTree     *ctree,
216
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
217 218 219 220 221 222 223 224 225 226
					     GList        *new_parent, 
					     GList        *new_sibling);
void       gtk_ctree_expand                 (GtkCTree     *ctree,
					     GList        *node);
void       gtk_ctree_expand_recursive       (GtkCTree     *ctree,
					     GList        *node);
void       gtk_ctree_collapse               (GtkCTree     *ctree,
					     GList        *node);
void       gtk_ctree_collapse_recursive     (GtkCTree     *ctree,
					     GList        *node);
227 228 229 230
void       gtk_ctree_toggle_expansion       (GtkCTree     *ctree,
					     GList        *node);
void       gtk_ctree_toggle_expansion_recursive (GtkCTree *ctree,
						 GList    *node);
Tim Janik's avatar
Tim Janik committed
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
void       gtk_ctree_select                 (GtkCTree     *ctree, 
					     GList        *node);
void       gtk_ctree_select_recursive       (GtkCTree     *ctree, 
					     GList        *node);
void       gtk_ctree_unselect               (GtkCTree     *ctree, 
					     GList        *node);
void       gtk_ctree_unselect_recursive     (GtkCTree     *ctree, 
					     GList        *node);
void       gtk_ctree_real_select_recursive  (GtkCTree     *ctree, 
					     GList        *node, 
					     gint          state);

/***********************************************************
 *           Analogons of GtkCList functions               *
 ***********************************************************/

void       gtk_ctree_set_text               (GtkCTree     *ctree,
					     GList        *node,
					     gint          column,
					     gchar        *text);
void       gtk_ctree_set_pixmap             (GtkCTree     *ctree,
252
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
253 254 255 256
					     gint          column,
					     GdkPixmap    *pixmap,
					     GdkBitmap    *mask);
void       gtk_ctree_set_pixtext            (GtkCTree     *ctree,
257
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
258 259 260 261 262 263
					     gint          column,
					     gchar        *text,
					     guint8        spacing,
					     GdkPixmap    *pixmap,
					     GdkBitmap    *mask);
void       gtk_ctree_set_node_info          (GtkCTree     *ctree,
264
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
265 266 267 268 269 270 271 272 273
					     gchar        *text,
					     guint8        spacing,
					     GdkPixmap    *pixmap_closed,
					     GdkBitmap    *mask_closed,
					     GdkPixmap    *pixmap_opened,
					     GdkBitmap    *mask_opened,
					     gboolean      is_leaf,
					     gboolean      expanded);
void       gtk_ctree_set_shift              (GtkCTree     *ctree,
274
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
275 276 277 278
					     gint          column,
					     gint          vertical,
					     gint          horizontal);
GtkCellType gtk_ctree_get_cell_type         (GtkCTree     *ctree,
279
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
280 281
					     gint          column);
gint       gtk_ctree_get_text               (GtkCTree     *ctree,
282
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
283 284 285
					     gint          column,
					     gchar       **text);
gint       gtk_ctree_get_pixmap             (GtkCTree     *ctree,
286
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
287 288 289 290
					     gint          column,
					     GdkPixmap   **pixmap,
					     GdkBitmap   **mask);
gint       gtk_ctree_get_pixtext            (GtkCTree     *ctree,
291
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
292 293 294 295 296
					     gint          column,
					     gchar       **text,
					     guint8       *spacing,
					     GdkPixmap   **pixmap,
					     GdkBitmap   **mask);
297 298 299 300 301 302 303 304 305 306
gint       gtk_ctree_get_node_info          (GtkCTree     *ctree,
					     GList        *node,
					     gchar       **text,
					     guint8       *spacing,
					     GdkPixmap   **pixmap_closed,
					     GdkBitmap   **mask_closed,
					     GdkPixmap   **pixmap_opened,
					     GdkBitmap   **mask_opened,
					     gboolean     *is_leaf,
					     gboolean     *expanded);
Tim Janik's avatar
Tim Janik committed
307
void       gtk_ctree_set_foreground         (GtkCTree     *ctree,
308
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
309 310
					     GdkColor     *color);
void       gtk_ctree_set_background         (GtkCTree     *ctree,
311
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
312 313
					     GdkColor     *color);
void       gtk_ctree_set_row_data           (GtkCTree     *ctree,
314
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
315 316
					     gpointer      data);
void       gtk_ctree_set_row_data_full      (GtkCTree     *ctree,
317
					     GList        *node,
Tim Janik's avatar
Tim Janik committed
318 319 320
					     gpointer      data,
					     GtkDestroyNotify destroy);
gpointer   gtk_ctree_get_row_data           (GtkCTree     *ctree,
321
					     GList        *node);
322
void       gtk_ctree_moveto                 (GtkCTree     *ctree,
323 324 325 326
					     GList        *node,
					     gint          column,
					     gfloat        row_align,
					     gfloat        col_align);
Tim Janik's avatar
Tim Janik committed
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358

/***********************************************************
 *             GtkCTree specific functions                 *
 ***********************************************************/

void       gtk_ctree_set_indent             (GtkCTree     *ctree, 
                                             gint          indent);
void       gtk_ctree_set_reorderable        (GtkCTree     *ctree,
					     gboolean      reorderable);
void       gtk_ctree_set_use_drag_icons     (GtkCTree     *ctree,
					     gboolean      use_icons);
void       gtk_ctree_set_line_style         (GtkCTree     *ctree, 
					     GtkCTreeLineStyle line_style);

/***********************************************************
 *             Tree sorting functions                      *
 ***********************************************************/

void       gtk_ctree_set_auto_sort          (GtkCTree     *ctree,
					     gboolean      auto_sort);
void       gtk_ctree_set_compare_func       (GtkCTree     *ctree,
					     GtkCTreeCompareFunc cmp_func);
void       gtk_ctree_sort                   (GtkCTree     *ctree, 
					     GList        *node);
void       gtk_ctree_sort_recursive         (GtkCTree     *ctree, 
					     GList        *node);

#ifdef __cplusplus
}
#endif				/* __cplusplus */

#endif				/* __GTK_CTREE_H__ */