1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald
3 * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org>
5 * GtkCMCTree widget for GTK+
6 * Copyright (C) 1998 Lars Hamann and Stefan Jeske
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
25 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
26 * file for a list of people on the GTK+ Team. See the ChangeLog
27 * files for a list of changes. These files are distributed with
28 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
31 #ifndef __GTK_CMCTREE_H__
32 #define __GTK_CMCTREE_H__
34 #include "gtkcmclist.h"
38 #define GTK_TYPE_CMCTREE (gtk_cmctree_get_type ())
39 #define GTK_CMCTREE(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_CMCTREE, GtkCMCTree))
40 #define GTK_CMCTREE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_CMCTREE, GtkCMCTreeClass))
41 #define GTK_IS_CMCTREE(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_CMCTREE))
42 #define GTK_IS_CMCTREE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CMCTREE))
43 #define GTK_CMCTREE_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), GTK_TYPE_CMCTREE, GtkCMCTreeClass))
45 #define GTK_CMCTREE_ROW(_node_) ((GtkCMCTreeRow *)(((GList *)(_node_))->data))
46 #define GTK_CMCTREE_NODE(_node_) ((GtkCMCTreeNode *)((_node_)))
47 #define GTK_CMCTREE_NODE_NEXT(_nnode_) ((GtkCMCTreeNode *)(((GList *)(_nnode_))->next))
48 #define GTK_CMCTREE_NODE_PREV(_pnode_) ((GtkCMCTreeNode *)(((GList *)(_pnode_))->prev))
49 #define GTK_CMCTREE_FUNC(_func_) ((GtkCMCTreeFunc)(_func_))
51 #define GTK_TYPE_CMCTREE_NODE (gtk_cmctree_node_get_type ())
53 GType gtk_cmctree_pos_get_type (void) G_GNUC_CONST;
54 #define GTK_TYPE_CMCTREE_POS (gtk_cmctree_pos_get_type())
55 GType gtk_cmctree_line_style_get_type (void) G_GNUC_CONST;
56 #define GTK_TYPE_CMCTREE_LINE_STYLE (gtk_cmctree_line_style_get_type())
57 GType gtk_cmctree_expander_style_get_type (void) G_GNUC_CONST;
58 #define GTK_TYPE_CMCTREE_EXPANDER_STYLE (gtk_cmctree_expander_style_get_type())
59 GType gtk_cmctree_expansion_type_get_type (void) G_GNUC_CONST;
60 #define GTK_TYPE_CMCTREE_EXPANSION_TYPE (gtk_cmctree_expansion_type_get_type())
64 GTK_CMCTREE_POS_BEFORE,
65 GTK_CMCTREE_POS_AS_CHILD,
71 GTK_CMCTREE_LINES_NONE,
72 GTK_CMCTREE_LINES_SOLID,
73 GTK_CMCTREE_LINES_DOTTED,
74 GTK_CMCTREE_LINES_TABBED
75 } GtkCMCTreeLineStyle;
79 GTK_CMCTREE_EXPANDER_NONE,
80 GTK_CMCTREE_EXPANDER_SQUARE,
81 GTK_CMCTREE_EXPANDER_TRIANGLE,
82 GTK_CMCTREE_EXPANDER_CIRCULAR
83 } GtkCMCTreeExpanderStyle;
87 GTK_CMCTREE_EXPANSION_EXPAND,
88 GTK_CMCTREE_EXPANSION_EXPAND_RECURSIVE,
89 GTK_CMCTREE_EXPANSION_COLLAPSE,
90 GTK_CMCTREE_EXPANSION_COLLAPSE_RECURSIVE,
91 GTK_CMCTREE_EXPANSION_TOGGLE,
92 GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE
93 } GtkCMCTreeExpansionType;
95 typedef struct _GtkCMCTree GtkCMCTree;
96 typedef struct _GtkCMCTreeClass GtkCMCTreeClass;
97 typedef struct _GtkCMCTreeRow GtkCMCTreeRow;
98 typedef struct _GtkCMCTreeNode GtkCMCTreeNode;
100 typedef void (*GtkCMCTreeFunc) (GtkCMCTree *ctree,
101 GtkCMCTreeNode *node,
104 typedef gboolean (*GtkCMCTreeGNodeFunc) (GtkCMCTree *ctree,
107 GtkCMCTreeNode *cnode,
110 typedef gboolean (*GtkCMCTreeCompareDragFunc) (GtkCMCTree *ctree,
111 GtkCMCTreeNode *source_node,
112 GtkCMCTreeNode *new_parent,
113 GtkCMCTreeNode *new_sibling);
125 guint line_style : 2;
126 guint expander_style : 2;
129 GtkCMCTreeCompareDragFunc drag_compare;
132 struct _GtkCMCTreeClass
134 GtkCMCListClass parent_class;
136 void (*tree_select_row) (GtkCMCTree *ctree,
139 void (*tree_unselect_row) (GtkCMCTree *ctree,
142 void (*tree_expand) (GtkCMCTree *ctree,
143 GtkCMCTreeNode *node);
144 void (*tree_collapse) (GtkCMCTree *ctree,
145 GtkCMCTreeNode *node);
146 void (*tree_move) (GtkCMCTree *ctree,
147 GtkCMCTreeNode *node,
148 GtkCMCTreeNode *new_parent,
149 GtkCMCTreeNode *new_sibling);
150 void (*change_focus_row_expansion) (GtkCMCTree *ctree,
151 GtkCMCTreeExpansionType action);
154 struct _GtkCMCTreeRow
158 GtkCMCTreeNode *parent;
159 GtkCMCTreeNode *sibling;
160 GtkCMCTreeNode *children;
162 GdkPixmap *pixmap_closed;
163 GdkBitmap *mask_closed;
164 GdkPixmap *pixmap_opened;
165 GdkBitmap *mask_opened;
173 struct _GtkCMCTreeNode {
178 /***********************************************************
179 * Creation, insertion, deletion *
180 ***********************************************************/
182 GType gtk_cmctree_get_type (void);
183 GtkWidget * gtk_cmctree_new_with_titles (gint columns,
186 GtkWidget * gtk_cmctree_new (gint columns,
188 GtkCMCTreeNode * gtk_cmctree_insert_node (GtkCMCTree *ctree,
189 GtkCMCTreeNode *parent,
190 GtkCMCTreeNode *sibling,
193 GdkPixmap *pixmap_closed,
194 GdkBitmap *mask_closed,
195 GdkPixmap *pixmap_opened,
196 GdkBitmap *mask_opened,
199 void gtk_cmctree_remove_node (GtkCMCTree *ctree,
200 GtkCMCTreeNode *node);
201 GtkCMCTreeNode * gtk_cmctree_insert_gnode (GtkCMCTree *ctree,
202 GtkCMCTreeNode *parent,
203 GtkCMCTreeNode *sibling,
205 GtkCMCTreeGNodeFunc func,
207 GNode * gtk_cmctree_export_to_gnode (GtkCMCTree *ctree,
210 GtkCMCTreeNode *node,
211 GtkCMCTreeGNodeFunc func,
214 /***********************************************************
215 * Generic recursive functions, querying / finding tree *
217 ***********************************************************/
219 void gtk_cmctree_post_recursive (GtkCMCTree *ctree,
220 GtkCMCTreeNode *node,
223 void gtk_cmctree_post_recursive_to_depth (GtkCMCTree *ctree,
224 GtkCMCTreeNode *node,
228 void gtk_cmctree_pre_recursive (GtkCMCTree *ctree,
229 GtkCMCTreeNode *node,
232 void gtk_cmctree_pre_recursive_to_depth (GtkCMCTree *ctree,
233 GtkCMCTreeNode *node,
237 gboolean gtk_cmctree_is_viewable (GtkCMCTree *ctree,
238 GtkCMCTreeNode *node);
239 GtkCMCTreeNode * gtk_cmctree_last (GtkCMCTree *ctree,
240 GtkCMCTreeNode *node);
241 GtkCMCTreeNode * gtk_cmctree_find_node_ptr (GtkCMCTree *ctree,
242 GtkCMCTreeRow *ctree_row);
243 GtkCMCTreeNode * gtk_cmctree_node_nth (GtkCMCTree *ctree,
245 gboolean gtk_cmctree_find (GtkCMCTree *ctree,
246 GtkCMCTreeNode *node,
247 GtkCMCTreeNode *child);
248 gboolean gtk_cmctree_is_ancestor (GtkCMCTree *ctree,
249 GtkCMCTreeNode *node,
250 GtkCMCTreeNode *child);
251 GtkCMCTreeNode * gtk_cmctree_find_by_row_data (GtkCMCTree *ctree,
252 GtkCMCTreeNode *node,
254 /* returns a GList of all GtkCMCTreeNodes with row->data == data. */
255 GList * gtk_cmctree_find_all_by_row_data (GtkCMCTree *ctree,
256 GtkCMCTreeNode *node,
258 GtkCMCTreeNode * gtk_cmctree_find_by_row_data_custom (GtkCMCTree *ctree,
259 GtkCMCTreeNode *node,
262 /* returns a GList of all GtkCMCTreeNodes with row->data == data. */
263 GList * gtk_cmctree_find_all_by_row_data_custom (GtkCMCTree *ctree,
264 GtkCMCTreeNode *node,
267 gboolean gtk_cmctree_is_hot_spot (GtkCMCTree *ctree,
271 /***********************************************************
272 * Tree signals : move, expand, collapse, (un)select *
273 ***********************************************************/
275 void gtk_cmctree_move (GtkCMCTree *ctree,
276 GtkCMCTreeNode *node,
277 GtkCMCTreeNode *new_parent,
278 GtkCMCTreeNode *new_sibling);
279 void gtk_cmctree_expand (GtkCMCTree *ctree,
280 GtkCMCTreeNode *node);
281 void gtk_cmctree_expand_recursive (GtkCMCTree *ctree,
282 GtkCMCTreeNode *node);
283 void gtk_cmctree_expand_to_depth (GtkCMCTree *ctree,
284 GtkCMCTreeNode *node,
286 void gtk_cmctree_collapse (GtkCMCTree *ctree,
287 GtkCMCTreeNode *node);
288 void gtk_cmctree_collapse_recursive (GtkCMCTree *ctree,
289 GtkCMCTreeNode *node);
290 void gtk_cmctree_collapse_to_depth (GtkCMCTree *ctree,
291 GtkCMCTreeNode *node,
293 void gtk_cmctree_toggle_expansion (GtkCMCTree *ctree,
294 GtkCMCTreeNode *node);
295 void gtk_cmctree_toggle_expansion_recursive (GtkCMCTree *ctree,
296 GtkCMCTreeNode *node);
297 void gtk_cmctree_select (GtkCMCTree *ctree,
298 GtkCMCTreeNode *node);
299 void gtk_cmctree_select_recursive (GtkCMCTree *ctree,
300 GtkCMCTreeNode *node);
301 void gtk_cmctree_unselect (GtkCMCTree *ctree,
302 GtkCMCTreeNode *node);
303 void gtk_cmctree_unselect_recursive (GtkCMCTree *ctree,
304 GtkCMCTreeNode *node);
305 void gtk_cmctree_real_select_recursive (GtkCMCTree *ctree,
306 GtkCMCTreeNode *node,
309 /***********************************************************
310 * Analogons of GtkCMCList functions *
311 ***********************************************************/
313 void gtk_cmctree_node_set_text (GtkCMCTree *ctree,
314 GtkCMCTreeNode *node,
317 void gtk_cmctree_node_set_pixmap (GtkCMCTree *ctree,
318 GtkCMCTreeNode *node,
322 void gtk_cmctree_node_set_pixtext (GtkCMCTree *ctree,
323 GtkCMCTreeNode *node,
329 void gtk_cmctree_set_node_info (GtkCMCTree *ctree,
330 GtkCMCTreeNode *node,
333 GdkPixmap *pixmap_closed,
334 GdkBitmap *mask_closed,
335 GdkPixmap *pixmap_opened,
336 GdkBitmap *mask_opened,
339 void gtk_cmctree_node_set_shift (GtkCMCTree *ctree,
340 GtkCMCTreeNode *node,
344 void gtk_cmctree_node_set_selectable (GtkCMCTree *ctree,
345 GtkCMCTreeNode *node,
346 gboolean selectable);
347 gboolean gtk_cmctree_node_get_selectable (GtkCMCTree *ctree,
348 GtkCMCTreeNode *node);
349 GtkCMCellType gtk_cmctree_node_get_cell_type (GtkCMCTree *ctree,
350 GtkCMCTreeNode *node,
352 gboolean gtk_cmctree_node_get_text (GtkCMCTree *ctree,
353 GtkCMCTreeNode *node,
356 gboolean gtk_cmctree_node_get_pixmap (GtkCMCTree *ctree,
357 GtkCMCTreeNode *node,
361 gboolean gtk_cmctree_node_get_pixtext (GtkCMCTree *ctree,
362 GtkCMCTreeNode *node,
368 gboolean gtk_cmctree_get_node_info (GtkCMCTree *ctree,
369 GtkCMCTreeNode *node,
372 GdkPixmap **pixmap_closed,
373 GdkBitmap **mask_closed,
374 GdkPixmap **pixmap_opened,
375 GdkBitmap **mask_opened,
378 void gtk_cmctree_node_set_row_style (GtkCMCTree *ctree,
379 GtkCMCTreeNode *node,
381 GtkStyle * gtk_cmctree_node_get_row_style (GtkCMCTree *ctree,
382 GtkCMCTreeNode *node);
383 void gtk_cmctree_node_set_cell_style (GtkCMCTree *ctree,
384 GtkCMCTreeNode *node,
387 GtkStyle * gtk_cmctree_node_get_cell_style (GtkCMCTree *ctree,
388 GtkCMCTreeNode *node,
390 void gtk_cmctree_node_set_foreground (GtkCMCTree *ctree,
391 GtkCMCTreeNode *node,
392 const GdkColor *color);
393 void gtk_cmctree_node_set_background (GtkCMCTree *ctree,
394 GtkCMCTreeNode *node,
395 const GdkColor *color);
396 void gtk_cmctree_node_set_row_data (GtkCMCTree *ctree,
397 GtkCMCTreeNode *node,
399 void gtk_cmctree_node_set_row_data_full (GtkCMCTree *ctree,
400 GtkCMCTreeNode *node,
402 GtkDestroyNotify destroy);
403 gpointer gtk_cmctree_node_get_row_data (GtkCMCTree *ctree,
404 GtkCMCTreeNode *node);
405 void gtk_cmctree_node_moveto (GtkCMCTree *ctree,
406 GtkCMCTreeNode *node,
410 GtkVisibility gtk_cmctree_node_is_visible (GtkCMCTree *ctree,
411 GtkCMCTreeNode *node);
413 /***********************************************************
414 * GtkCMCTree specific functions *
415 ***********************************************************/
417 void gtk_cmctree_set_indent (GtkCMCTree *ctree,
419 void gtk_cmctree_set_spacing (GtkCMCTree *ctree,
421 void gtk_cmctree_set_show_stub (GtkCMCTree *ctree,
423 void gtk_cmctree_set_line_style (GtkCMCTree *ctree,
424 GtkCMCTreeLineStyle line_style);
425 void gtk_cmctree_set_expander_style (GtkCMCTree *ctree,
426 GtkCMCTreeExpanderStyle expander_style);
427 void gtk_cmctree_set_drag_compare_func (GtkCMCTree *ctree,
428 GtkCMCTreeCompareDragFunc cmp_func);
430 /***********************************************************
431 * Tree sorting functions *
432 ***********************************************************/
434 void gtk_cmctree_sort_node (GtkCMCTree *ctree,
435 GtkCMCTreeNode *node);
436 void gtk_cmctree_sort_recursive (GtkCMCTree *ctree,
437 GtkCMCTreeNode *node);
440 #define gtk_cmctree_set_reorderable(t,r) gtk_cmclist_set_reorderable((GtkCMCList*) (t),(r))
442 /* GType for the GtkCMCTreeNode. This is a boxed type, although it uses
443 * no-op's for the copy and free routines. It is defined in order to
444 * provide type information for the signal arguments
446 GType gtk_cmctree_node_get_type (void) G_GNUC_CONST;
450 #endif /* __GTK_CMCTREE_H__ */