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) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CMCTREE, GtkCMCTree))
40 #define GTK_CMCTREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CMCTREE, GtkCMCTreeClass))
41 #define GTK_IS_CMCTREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CMCTREE))
42 #define GTK_IS_CMCTREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CMCTREE))
43 #define GTK_CMCTREE_GET_CLASS(obj) (G_TYPE_INSTANCE_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 } GtkCMCTreeLineStyle
;
76 GTK_CMCTREE_EXPANDER_NONE
,
77 GTK_CMCTREE_EXPANDER_TRIANGLE
78 } GtkCMCTreeExpanderStyle
;
82 GTK_CMCTREE_EXPANSION_EXPAND
,
83 GTK_CMCTREE_EXPANSION_EXPAND_RECURSIVE
,
84 GTK_CMCTREE_EXPANSION_COLLAPSE
,
85 GTK_CMCTREE_EXPANSION_COLLAPSE_RECURSIVE
,
86 GTK_CMCTREE_EXPANSION_TOGGLE
,
87 GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE
88 } GtkCMCTreeExpansionType
;
90 typedef struct _GtkCMCTree GtkCMCTree
;
91 typedef struct _GtkCMCTreeClass GtkCMCTreeClass
;
92 typedef struct _GtkCMCTreeRow GtkCMCTreeRow
;
93 typedef struct _GtkCMCTreeNode GtkCMCTreeNode
;
95 typedef void (*GtkCMCTreeFunc
) (GtkCMCTree
*ctree
,
99 typedef gboolean (*GtkCMCTreeGNodeFunc
) (GtkCMCTree
*ctree
,
102 GtkCMCTreeNode
*cnode
,
105 typedef gboolean (*GtkCMCTreeCompareDragFunc
) (GtkCMCTree
*ctree
,
106 GtkCMCTreeNode
*source_node
,
107 GtkCMCTreeNode
*new_parent
,
108 GtkCMCTreeNode
*new_sibling
);
118 guint line_style
: 2;
119 guint expander_style
: 2;
122 GtkCMCTreeCompareDragFunc drag_compare
;
125 struct _GtkCMCTreeClass
127 GtkCMCListClass parent_class
;
129 void (*tree_select_row
) (GtkCMCTree
*ctree
,
132 void (*tree_unselect_row
) (GtkCMCTree
*ctree
,
135 void (*tree_expand
) (GtkCMCTree
*ctree
,
136 GtkCMCTreeNode
*node
);
137 void (*tree_collapse
) (GtkCMCTree
*ctree
,
138 GtkCMCTreeNode
*node
);
139 void (*tree_move
) (GtkCMCTree
*ctree
,
140 GtkCMCTreeNode
*node
,
141 GtkCMCTreeNode
*new_parent
,
142 GtkCMCTreeNode
*new_sibling
);
143 void (*change_focus_row_expansion
) (GtkCMCTree
*ctree
,
144 GtkCMCTreeExpansionType action
);
147 struct _GtkCMCTreeRow
151 GtkCMCTreeNode
*parent
;
152 GtkCMCTreeNode
*sibling
;
153 GtkCMCTreeNode
*children
;
155 GdkPixbuf
*pixbuf_closed
;
156 GdkPixbuf
*pixbuf_opened
;
164 struct _GtkCMCTreeNode
{
169 /***********************************************************
170 * Creation, insertion, deletion *
171 ***********************************************************/
173 GType
gtk_cmctree_get_type (void);
174 GtkWidget
* gtk_cmctree_new_with_titles (gint columns
,
177 GtkWidget
* gtk_cmctree_new (gint columns
,
179 GtkCMCTreeNode
* gtk_cmctree_insert_node (GtkCMCTree
*ctree
,
180 GtkCMCTreeNode
*parent
,
181 GtkCMCTreeNode
*sibling
,
184 GdkPixbuf
*pixbuf_closed
,
185 GdkPixbuf
*pixbuf_opened
,
188 void gtk_cmctree_remove_node (GtkCMCTree
*ctree
,
189 GtkCMCTreeNode
*node
);
190 GtkCMCTreeNode
* gtk_cmctree_insert_gnode (GtkCMCTree
*ctree
,
191 GtkCMCTreeNode
*parent
,
192 GtkCMCTreeNode
*sibling
,
194 GtkCMCTreeGNodeFunc func
,
196 GNode
* gtk_cmctree_export_to_gnode (GtkCMCTree
*ctree
,
199 GtkCMCTreeNode
*node
,
200 GtkCMCTreeGNodeFunc func
,
203 /***********************************************************
204 * Generic recursive functions, querying / finding tree *
206 ***********************************************************/
208 void gtk_cmctree_post_recursive (GtkCMCTree
*ctree
,
209 GtkCMCTreeNode
*node
,
212 void gtk_cmctree_post_recursive_to_depth (GtkCMCTree
*ctree
,
213 GtkCMCTreeNode
*node
,
217 void gtk_cmctree_pre_recursive (GtkCMCTree
*ctree
,
218 GtkCMCTreeNode
*node
,
221 void gtk_cmctree_pre_recursive_to_depth (GtkCMCTree
*ctree
,
222 GtkCMCTreeNode
*node
,
226 gboolean
gtk_cmctree_is_viewable (GtkCMCTree
*ctree
,
227 GtkCMCTreeNode
*node
);
228 GtkCMCTreeNode
* gtk_cmctree_last (GtkCMCTree
*ctree
,
229 GtkCMCTreeNode
*node
);
230 GtkCMCTreeNode
* gtk_cmctree_find_node_ptr (GtkCMCTree
*ctree
,
231 GtkCMCTreeRow
*ctree_row
);
232 GtkCMCTreeNode
* gtk_cmctree_node_nth (GtkCMCTree
*ctree
,
234 gboolean
gtk_cmctree_find (GtkCMCTree
*ctree
,
235 GtkCMCTreeNode
*node
,
236 GtkCMCTreeNode
*child
);
237 gboolean
gtk_cmctree_is_ancestor (GtkCMCTree
*ctree
,
238 GtkCMCTreeNode
*node
,
239 GtkCMCTreeNode
*child
);
240 GtkCMCTreeNode
* gtk_cmctree_find_by_row_data (GtkCMCTree
*ctree
,
241 GtkCMCTreeNode
*node
,
243 /* returns a GList of all GtkCMCTreeNodes with row->data == data. */
244 GList
* gtk_cmctree_find_all_by_row_data (GtkCMCTree
*ctree
,
245 GtkCMCTreeNode
*node
,
247 GtkCMCTreeNode
* gtk_cmctree_find_by_row_data_custom (GtkCMCTree
*ctree
,
248 GtkCMCTreeNode
*node
,
251 /* returns a GList of all GtkCMCTreeNodes with row->data == data. */
252 GList
* gtk_cmctree_find_all_by_row_data_custom (GtkCMCTree
*ctree
,
253 GtkCMCTreeNode
*node
,
257 /* This assumes that x and y coordinates are inside the clist_window.
258 * Returns true if the coordinates are inside a tree expander on
259 * one of the rows. */
260 gboolean
gtk_cmctree_is_hot_spot (GtkCMCTree
*ctree
,
264 /***********************************************************
265 * Tree signals : move, expand, collapse, (un)select *
266 ***********************************************************/
268 void gtk_cmctree_move (GtkCMCTree
*ctree
,
269 GtkCMCTreeNode
*node
,
270 GtkCMCTreeNode
*new_parent
,
271 GtkCMCTreeNode
*new_sibling
);
272 void gtk_cmctree_expand (GtkCMCTree
*ctree
,
273 GtkCMCTreeNode
*node
);
274 void gtk_cmctree_expand_recursive (GtkCMCTree
*ctree
,
275 GtkCMCTreeNode
*node
);
276 void gtk_cmctree_expand_to_depth (GtkCMCTree
*ctree
,
277 GtkCMCTreeNode
*node
,
279 void gtk_cmctree_collapse (GtkCMCTree
*ctree
,
280 GtkCMCTreeNode
*node
);
281 void gtk_cmctree_collapse_recursive (GtkCMCTree
*ctree
,
282 GtkCMCTreeNode
*node
);
283 void gtk_cmctree_collapse_to_depth (GtkCMCTree
*ctree
,
284 GtkCMCTreeNode
*node
,
286 void gtk_cmctree_toggle_expansion (GtkCMCTree
*ctree
,
287 GtkCMCTreeNode
*node
);
288 void gtk_cmctree_toggle_expansion_recursive (GtkCMCTree
*ctree
,
289 GtkCMCTreeNode
*node
);
290 void gtk_cmctree_select (GtkCMCTree
*ctree
,
291 GtkCMCTreeNode
*node
);
292 void gtk_cmctree_select_recursive (GtkCMCTree
*ctree
,
293 GtkCMCTreeNode
*node
);
294 void gtk_cmctree_unselect (GtkCMCTree
*ctree
,
295 GtkCMCTreeNode
*node
);
296 void gtk_cmctree_unselect_recursive (GtkCMCTree
*ctree
,
297 GtkCMCTreeNode
*node
);
298 void gtk_cmctree_real_select_recursive (GtkCMCTree
*ctree
,
299 GtkCMCTreeNode
*node
,
302 /***********************************************************
303 * Analogons of GtkCMCList functions *
304 ***********************************************************/
306 void gtk_cmctree_node_set_text (GtkCMCTree
*ctree
,
307 GtkCMCTreeNode
*node
,
310 void gtk_cmctree_node_set_pixbuf (GtkCMCTree
*ctree
,
311 GtkCMCTreeNode
*node
,
314 void gtk_cmctree_node_set_pixtext (GtkCMCTree
*ctree
,
315 GtkCMCTreeNode
*node
,
320 void gtk_cmctree_set_node_info (GtkCMCTree
*ctree
,
321 GtkCMCTreeNode
*node
,
324 GdkPixbuf
*pixbuf_closed
,
325 GdkPixbuf
*pixbuf_opened
,
328 void gtk_cmctree_node_set_shift (GtkCMCTree
*ctree
,
329 GtkCMCTreeNode
*node
,
333 void gtk_cmctree_node_set_selectable (GtkCMCTree
*ctree
,
334 GtkCMCTreeNode
*node
,
335 gboolean selectable
);
336 gboolean
gtk_cmctree_node_get_selectable (GtkCMCTree
*ctree
,
337 GtkCMCTreeNode
*node
);
338 GtkCMCellType
gtk_cmctree_node_get_cell_type (GtkCMCTree
*ctree
,
339 GtkCMCTreeNode
*node
,
341 gboolean
gtk_cmctree_node_get_text (GtkCMCTree
*ctree
,
342 GtkCMCTreeNode
*node
,
345 gboolean
gtk_cmctree_node_get_pixbuf (GtkCMCTree
*ctree
,
346 GtkCMCTreeNode
*node
,
349 gboolean
gtk_cmctree_node_get_pixtext (GtkCMCTree
*ctree
,
350 GtkCMCTreeNode
*node
,
355 gboolean
gtk_cmctree_get_node_info (GtkCMCTree
*ctree
,
356 GtkCMCTreeNode
*node
,
359 GdkPixbuf
**pixbuf_closed
,
360 GdkPixbuf
**pixbuf_opened
,
363 void gtk_cmctree_node_set_row_style (GtkCMCTree
*ctree
,
364 GtkCMCTreeNode
*node
,
366 GtkStyle
* gtk_cmctree_node_get_row_style (GtkCMCTree
*ctree
,
367 GtkCMCTreeNode
*node
);
368 void gtk_cmctree_node_set_cell_style (GtkCMCTree
*ctree
,
369 GtkCMCTreeNode
*node
,
372 GtkStyle
* gtk_cmctree_node_get_cell_style (GtkCMCTree
*ctree
,
373 GtkCMCTreeNode
*node
,
375 void gtk_cmctree_node_set_foreground (GtkCMCTree
*ctree
,
376 GtkCMCTreeNode
*node
,
377 const GdkRGBA
*color
);
378 void gtk_cmctree_node_set_background (GtkCMCTree
*ctree
,
379 GtkCMCTreeNode
*node
,
380 const GdkRGBA
*color
);
381 void gtk_cmctree_node_set_row_data (GtkCMCTree
*ctree
,
382 GtkCMCTreeNode
*node
,
384 void gtk_cmctree_node_set_row_data_full (GtkCMCTree
*ctree
,
385 GtkCMCTreeNode
*node
,
387 GDestroyNotify destroy
);
388 gpointer
gtk_cmctree_node_get_row_data (GtkCMCTree
*ctree
,
389 GtkCMCTreeNode
*node
);
390 void gtk_cmctree_node_moveto (GtkCMCTree
*ctree
,
391 GtkCMCTreeNode
*node
,
395 GtkVisibility
gtk_cmctree_node_is_visible (GtkCMCTree
*ctree
,
396 GtkCMCTreeNode
*node
);
398 /***********************************************************
399 * GtkCMCTree specific functions *
400 ***********************************************************/
402 void gtk_cmctree_set_indent (GtkCMCTree
*ctree
,
404 void gtk_cmctree_set_spacing (GtkCMCTree
*ctree
,
406 void gtk_cmctree_set_show_stub (GtkCMCTree
*ctree
,
408 void gtk_cmctree_set_line_style (GtkCMCTree
*ctree
,
409 GtkCMCTreeLineStyle line_style
);
410 void gtk_cmctree_set_expander_style (GtkCMCTree
*ctree
,
411 GtkCMCTreeExpanderStyle expander_style
);
412 void gtk_cmctree_set_drag_compare_func (GtkCMCTree
*ctree
,
413 GtkCMCTreeCompareDragFunc cmp_func
);
415 /***********************************************************
416 * Tree sorting functions *
417 ***********************************************************/
419 void gtk_cmctree_sort_node (GtkCMCTree
*ctree
,
420 GtkCMCTreeNode
*node
);
421 void gtk_cmctree_sort_recursive (GtkCMCTree
*ctree
,
422 GtkCMCTreeNode
*node
);
425 #define gtk_cmctree_set_reorderable(t,r) gtk_cmclist_set_reorderable((GtkCMCList*) (t),(r))
427 /* GType for the GtkCMCTreeNode. This is a boxed type, although it uses
428 * no-op's for the copy and free routines. It is defined in order to
429 * provide type information for the signal arguments
431 GType
gtk_cmctree_node_get_type (void) G_GNUC_CONST
;
435 #endif /* __GTK_CMCTREE_H__ */