gtkctree.h 16.4 KB
Newer Older
Tim Janik's avatar
Tim Janik committed
1 2 3 4 5 6 7 8
/* 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
9
 * modify it under the terms of the GNU Lesser General Public
Tim Janik's avatar
Tim Janik committed
10 11 12 13 14 15
 * 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
16
 * Lesser General Public License for more details.
Tim Janik's avatar
Tim Janik committed
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
Tim Janik's avatar
Tim Janik committed
19 20 21 22 23
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

24
/*
25
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
26 27 28 29 30
 * file for a list of people on the GTK+ Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
 */

31 32
#ifndef GTK_DISABLE_DEPRECATED

Tim Janik's avatar
Tim Janik committed
33 34 35 36 37 38
#ifndef __GTK_CTREE_H__
#define __GTK_CTREE_H__

#include <gtk/gtkclist.h>

#ifdef __cplusplus
39
extern "C" {
Tim Janik's avatar
Tim Janik committed
40 41
#endif				/* __cplusplus */

42 43 44 45 46
#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))
Tim Janik's avatar
Tim Janik committed
47
#define GTK_CTREE_GET_CLASS(obj)  (GTK_CHECK_GET_CLASS ((obj), GTK_TYPE_CTREE, GtkCTreeClass))
48

49 50 51 52
#define GTK_CTREE_ROW(_node_) ((GtkCTreeRow *)(((GList *)(_node_))->data))
#define GTK_CTREE_NODE(_node_) ((GtkCTreeNode *)((_node_)))
#define GTK_CTREE_NODE_NEXT(_nnode_) ((GtkCTreeNode *)(((GList *)(_nnode_))->next))
#define GTK_CTREE_NODE_PREV(_pnode_) ((GtkCTreeNode *)(((GList *)(_pnode_))->prev))
Tim Janik's avatar
Tim Janik committed
53 54
#define GTK_CTREE_FUNC(_func_) ((GtkCTreeFunc)(_func_))

55 56
#define GTK_TYPE_CTREE_NODE (gtk_ctree_node_get_type ())

Tim Janik's avatar
Tim Janik committed
57 58 59 60 61 62 63 64 65
typedef enum
{
  GTK_CTREE_POS_BEFORE,
  GTK_CTREE_POS_AS_CHILD,
  GTK_CTREE_POS_AFTER
} GtkCTreePos;

typedef enum
{
66
  GTK_CTREE_LINES_NONE,
Tim Janik's avatar
Tim Janik committed
67 68
  GTK_CTREE_LINES_SOLID,
  GTK_CTREE_LINES_DOTTED,
69
  GTK_CTREE_LINES_TABBED
Tim Janik's avatar
Tim Janik committed
70 71
} GtkCTreeLineStyle;

72 73 74 75 76 77 78 79
typedef enum
{
  GTK_CTREE_EXPANDER_NONE,
  GTK_CTREE_EXPANDER_SQUARE,
  GTK_CTREE_EXPANDER_TRIANGLE,
  GTK_CTREE_EXPANDER_CIRCULAR
} GtkCTreeExpanderStyle;

80 81 82 83 84 85 86 87
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
88
} GtkCTreeExpansionType;
89

Tim Janik's avatar
Tim Janik committed
90 91 92
typedef struct _GtkCTree      GtkCTree;
typedef struct _GtkCTreeClass GtkCTreeClass;
typedef struct _GtkCTreeRow   GtkCTreeRow;
93
typedef struct _GtkCTreeNode  GtkCTreeNode;
Tim Janik's avatar
Tim Janik committed
94

95 96 97
typedef void (*GtkCTreeFunc) (GtkCTree     *ctree,
			      GtkCTreeNode *node,
			      gpointer      data);
Tim Janik's avatar
Tim Janik committed
98

99 100 101 102 103 104
typedef gboolean (*GtkCTreeGNodeFunc) (GtkCTree     *ctree,
                                       guint         depth,
                                       GNode        *gnode,
				       GtkCTreeNode *cnode,
                                       gpointer      data);

105 106 107 108 109
typedef gboolean (*GtkCTreeCompareDragFunc) (GtkCTree     *ctree,
                                             GtkCTreeNode *source_node,
                                             GtkCTreeNode *new_parent,
                                             GtkCTreeNode *new_sibling);

Tim Janik's avatar
Tim Janik committed
110 111 112
struct _GtkCTree
{
  GtkCList clist;
113
  
Tim Janik's avatar
Tim Janik committed
114
  GdkGC *lines_gc;
115
  
Tim Janik's avatar
Tim Janik committed
116
  gint tree_indent;
117
  gint tree_spacing;
Tim Janik's avatar
Tim Janik committed
118
  gint tree_column;
119

120 121 122
  guint line_style     : 2;
  guint expander_style : 2;
  guint show_stub      : 1;
123 124

  GtkCTreeCompareDragFunc drag_compare;
Tim Janik's avatar
Tim Janik committed
125 126 127 128 129
};

struct _GtkCTreeClass
{
  GtkCListClass parent_class;
130
  
131 132 133 134 135 136 137 138 139 140 141 142 143 144
  void (*tree_select_row)   (GtkCTree     *ctree,
			     GtkCTreeNode *row,
			     gint          column);
  void (*tree_unselect_row) (GtkCTree     *ctree,
			     GtkCTreeNode *row,
			     gint          column);
  void (*tree_expand)       (GtkCTree     *ctree,
			     GtkCTreeNode *node);
  void (*tree_collapse)     (GtkCTree     *ctree,
			     GtkCTreeNode *node);
  void (*tree_move)         (GtkCTree     *ctree,
			     GtkCTreeNode *node,
			     GtkCTreeNode *new_parent,
			     GtkCTreeNode *new_sibling);
145
  void (*change_focus_row_expansion) (GtkCTree *ctree,
146
				      GtkCTreeExpansionType action);
Tim Janik's avatar
Tim Janik committed
147 148 149 150 151
};

struct _GtkCTreeRow
{
  GtkCListRow row;
152
  
153 154 155
  GtkCTreeNode *parent;
  GtkCTreeNode *sibling;
  GtkCTreeNode *children;
156
  
Tim Janik's avatar
Tim Janik committed
157 158 159 160
  GdkPixmap *pixmap_closed;
  GdkBitmap *mask_closed;
  GdkPixmap *pixmap_opened;
  GdkBitmap *mask_opened;
161
  
162
  guint16 level;
163
  
164 165
  guint is_leaf  : 1;
  guint expanded : 1;
Tim Janik's avatar
Tim Janik committed
166 167
};

168 169 170 171
struct _GtkCTreeNode {
  GList list;
};

Tim Janik's avatar
Tim Janik committed
172 173 174 175 176

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

Elliot Lee's avatar
Elliot Lee committed
177
GtkType gtk_ctree_get_type                       (void) G_GNUC_CONST;
178 179
GtkWidget * gtk_ctree_new_with_titles            (gint          columns, 
						  gint          tree_column,
180
						  gchar        *titles[]);
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
GtkWidget * gtk_ctree_new                        (gint          columns, 
						  gint          tree_column);
GtkCTreeNode * gtk_ctree_insert_node             (GtkCTree     *ctree,
						  GtkCTreeNode *parent, 
						  GtkCTreeNode *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_node                       (GtkCTree     *ctree, 
						  GtkCTreeNode *node);
GtkCTreeNode * gtk_ctree_insert_gnode            (GtkCTree          *ctree,
						  GtkCTreeNode      *parent,
						  GtkCTreeNode      *sibling,
						  GNode             *gnode,
						  GtkCTreeGNodeFunc  func,
						  gpointer           data);
GNode * gtk_ctree_export_to_gnode                (GtkCTree          *ctree,
						  GNode             *parent,
						  GNode             *sibling,
						  GtkCTreeNode      *node,
						  GtkCTreeGNodeFunc  func,
						  gpointer           data);
Tim Janik's avatar
Tim Janik committed
208 209 210 211 212 213

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

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
void gtk_ctree_post_recursive                    (GtkCTree     *ctree, 
						  GtkCTreeNode *node,
						  GtkCTreeFunc  func,
						  gpointer      data);
void gtk_ctree_post_recursive_to_depth           (GtkCTree     *ctree, 
						  GtkCTreeNode *node,
						  gint          depth,
						  GtkCTreeFunc  func,
						  gpointer      data);
void gtk_ctree_pre_recursive                     (GtkCTree     *ctree, 
						  GtkCTreeNode *node,
						  GtkCTreeFunc  func,
						  gpointer      data);
void gtk_ctree_pre_recursive_to_depth            (GtkCTree     *ctree, 
						  GtkCTreeNode *node,
						  gint          depth,
						  GtkCTreeFunc  func,
						  gpointer      data);
gboolean gtk_ctree_is_viewable                   (GtkCTree     *ctree, 
					          GtkCTreeNode *node);
GtkCTreeNode * gtk_ctree_last                    (GtkCTree     *ctree,
					          GtkCTreeNode *node);
GtkCTreeNode * gtk_ctree_find_node_ptr           (GtkCTree     *ctree,
					          GtkCTreeRow  *ctree_row);
238 239
GtkCTreeNode * gtk_ctree_node_nth                (GtkCTree     *ctree,
						  guint         row);
240 241 242 243 244 245 246 247 248
gboolean gtk_ctree_find                          (GtkCTree     *ctree,
					          GtkCTreeNode *node,
					          GtkCTreeNode *child);
gboolean gtk_ctree_is_ancestor                   (GtkCTree     *ctree,
					          GtkCTreeNode *node,
					          GtkCTreeNode *child);
GtkCTreeNode * gtk_ctree_find_by_row_data        (GtkCTree     *ctree,
					          GtkCTreeNode *node,
					          gpointer      data);
249 250 251 252
/* returns a GList of all GtkCTreeNodes with row->data == data. */
GList * gtk_ctree_find_all_by_row_data           (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gpointer      data);
253 254 255 256
GtkCTreeNode * gtk_ctree_find_by_row_data_custom (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gpointer      data,
						  GCompareFunc  func);
257 258 259 260 261
/* returns a GList of all GtkCTreeNodes with row->data == data. */
GList * gtk_ctree_find_all_by_row_data_custom    (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gpointer      data,
						  GCompareFunc  func);
262 263 264
gboolean gtk_ctree_is_hot_spot                   (GtkCTree     *ctree,
					          gint          x,
					          gint          y);
Tim Janik's avatar
Tim Janik committed
265 266 267 268 269

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

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 301 302
void gtk_ctree_move                              (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  GtkCTreeNode *new_parent, 
						  GtkCTreeNode *new_sibling);
void gtk_ctree_expand                            (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_expand_recursive                  (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_expand_to_depth                   (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          depth);
void gtk_ctree_collapse                          (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_collapse_recursive                (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_collapse_to_depth                 (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          depth);
void gtk_ctree_toggle_expansion                  (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_toggle_expansion_recursive        (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_select                            (GtkCTree     *ctree, 
						  GtkCTreeNode *node);
void gtk_ctree_select_recursive                  (GtkCTree     *ctree, 
						  GtkCTreeNode *node);
void gtk_ctree_unselect                          (GtkCTree     *ctree, 
						  GtkCTreeNode *node);
void gtk_ctree_unselect_recursive                (GtkCTree     *ctree, 
						  GtkCTreeNode *node);
void gtk_ctree_real_select_recursive             (GtkCTree     *ctree, 
						  GtkCTreeNode *node, 
						  gint          state);
Tim Janik's avatar
Tim Janik committed
303 304 305 306 307

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

308 309 310
void gtk_ctree_node_set_text                     (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column,
Tim Janik's avatar
Tim Janik committed
311
						  const gchar  *text);
312 313 314 315 316 317 318 319
void gtk_ctree_node_set_pixmap                   (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column,
						  GdkPixmap    *pixmap,
						  GdkBitmap    *mask);
void gtk_ctree_node_set_pixtext                  (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column,
Tim Janik's avatar
Tim Janik committed
320
						  const gchar  *text,
321 322 323 324 325
						  guint8        spacing,
						  GdkPixmap    *pixmap,
						  GdkBitmap    *mask);
void gtk_ctree_set_node_info                     (GtkCTree     *ctree,
						  GtkCTreeNode *node,
Tim Janik's avatar
Tim Janik committed
326
						  const gchar  *text,
327 328 329 330 331 332 333 334 335 336 337 338
						  guint8        spacing,
						  GdkPixmap    *pixmap_closed,
						  GdkBitmap    *mask_closed,
						  GdkPixmap    *pixmap_opened,
						  GdkBitmap    *mask_opened,
						  gboolean      is_leaf,
						  gboolean      expanded);
void gtk_ctree_node_set_shift                    (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column,
						  gint          vertical,
						  gint          horizontal);
339 340 341 342 343
void gtk_ctree_node_set_selectable               (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gboolean      selectable);
gboolean gtk_ctree_node_get_selectable           (GtkCTree     *ctree,
						  GtkCTreeNode *node);
344 345 346
GtkCellType gtk_ctree_node_get_cell_type         (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column);
347
gboolean gtk_ctree_node_get_text                 (GtkCTree     *ctree,
348 349 350
						  GtkCTreeNode *node,
						  gint          column,
						  gchar       **text);
351
gboolean gtk_ctree_node_get_pixmap               (GtkCTree     *ctree,
352 353 354 355
						  GtkCTreeNode *node,
						  gint          column,
						  GdkPixmap   **pixmap,
						  GdkBitmap   **mask);
356
gboolean gtk_ctree_node_get_pixtext              (GtkCTree     *ctree,
357 358 359 360 361 362
						  GtkCTreeNode *node,
						  gint          column,
						  gchar       **text,
						  guint8       *spacing,
						  GdkPixmap   **pixmap,
						  GdkBitmap   **mask);
363
gboolean gtk_ctree_get_node_info                 (GtkCTree     *ctree,
364 365 366 367 368 369 370 371 372
						  GtkCTreeNode *node,
						  gchar       **text,
						  guint8       *spacing,
						  GdkPixmap   **pixmap_closed,
						  GdkBitmap   **mask_closed,
						  GdkPixmap   **pixmap_opened,
						  GdkBitmap   **mask_opened,
						  gboolean     *is_leaf,
						  gboolean     *expanded);
373 374 375 376 377 378 379 380 381 382 383 384
void gtk_ctree_node_set_row_style                (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  GtkStyle     *style);
GtkStyle * gtk_ctree_node_get_row_style          (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_node_set_cell_style               (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column,
						  GtkStyle     *style);
GtkStyle * gtk_ctree_node_get_cell_style         (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column);
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
void gtk_ctree_node_set_foreground               (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  GdkColor     *color);
void gtk_ctree_node_set_background               (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  GdkColor     *color);
void gtk_ctree_node_set_row_data                 (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gpointer      data);
void gtk_ctree_node_set_row_data_full            (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gpointer      data,
						  GtkDestroyNotify destroy);
gpointer gtk_ctree_node_get_row_data             (GtkCTree     *ctree,
						  GtkCTreeNode *node);
void gtk_ctree_node_moveto                       (GtkCTree     *ctree,
						  GtkCTreeNode *node,
						  gint          column,
						  gfloat        row_align,
						  gfloat        col_align);
GtkVisibility gtk_ctree_node_is_visible          (GtkCTree     *ctree,
						  GtkCTreeNode *node);
Tim Janik's avatar
Tim Janik committed
407 408 409 410 411

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

412 413 414 415
void gtk_ctree_set_indent            (GtkCTree                *ctree, 
				      gint                     indent);
void gtk_ctree_set_spacing           (GtkCTree                *ctree, 
				      gint                     spacing);
416
void gtk_ctree_set_show_stub         (GtkCTree                *ctree, 
417 418 419 420 421 422 423
				      gboolean                 show_stub);
void gtk_ctree_set_line_style        (GtkCTree                *ctree, 
				      GtkCTreeLineStyle        line_style);
void gtk_ctree_set_expander_style    (GtkCTree                *ctree, 
				      GtkCTreeExpanderStyle    expander_style);
void gtk_ctree_set_drag_compare_func (GtkCTree     	      *ctree,
				      GtkCTreeCompareDragFunc  cmp_func);
Tim Janik's avatar
Tim Janik committed
424 425 426 427 428

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

429 430 431 432
void gtk_ctree_sort_node                         (GtkCTree     *ctree, 
						  GtkCTreeNode *node);
void gtk_ctree_sort_recursive                    (GtkCTree     *ctree, 
						  GtkCTreeNode *node);
433 434


435
#define gtk_ctree_set_reorderable(t,r)                    gtk_clist_set_reorderable((GtkCList*) (t),(r))
436

437 438 439 440 441 442
/* GType for the GtkCTreeNode.  This is a boxed type, although it uses
 * no-op's for the copy and free routines.  It is defined in order to
 * provide type information for the signal arguments
 */
GType   gtk_ctree_node_get_type                  (void) G_GNUC_CONST;

Tim Janik's avatar
Tim Janik committed
443 444 445 446 447
#ifdef __cplusplus
}
#endif				/* __cplusplus */

#endif				/* __GTK_CTREE_H__ */
448 449

#endif /* GTK_DISABLE_DEPRECATED */