]> Pileus Git - ~andy/gtk/blob - gtk/gtkctree.h
58df8ae8dfd758bcb84105e2103d7998f0d6cd0e
[~andy/gtk] / gtk / gtkctree.h
1 /* GTK - The GTK+ 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>
4  *
5  * GtkCTree widget for GTK+
6  * Copyright (C) 1998 Lars Hamann and Stefan Jeske
7  *
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.
12  *
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.
17  *
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.
22  */
23
24 /*
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/.
29  */
30
31 #ifndef GTK_DISABLE_DEPRECATED
32
33 #ifndef __GTK_CTREE_H__
34 #define __GTK_CTREE_H__
35
36 #include <gtk/gtkclist.h>
37
38 G_BEGIN_DECLS
39
40 #define GTK_TYPE_CTREE            (gtk_ctree_get_type ())
41 #define GTK_CTREE(obj)            (GTK_CHECK_CAST ((obj), GTK_TYPE_CTREE, GtkCTree))
42 #define GTK_CTREE_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_CTREE, GtkCTreeClass))
43 #define GTK_IS_CTREE(obj)         (GTK_CHECK_TYPE ((obj), GTK_TYPE_CTREE))
44 #define GTK_IS_CTREE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CTREE))
45 #define GTK_CTREE_GET_CLASS(obj)  (GTK_CHECK_GET_CLASS ((obj), GTK_TYPE_CTREE, GtkCTreeClass))
46
47 #define GTK_CTREE_ROW(_node_) ((GtkCTreeRow *)(((GList *)(_node_))->data))
48 #define GTK_CTREE_NODE(_node_) ((GtkCTreeNode *)((_node_)))
49 #define GTK_CTREE_NODE_NEXT(_nnode_) ((GtkCTreeNode *)(((GList *)(_nnode_))->next))
50 #define GTK_CTREE_NODE_PREV(_pnode_) ((GtkCTreeNode *)(((GList *)(_pnode_))->prev))
51 #define GTK_CTREE_FUNC(_func_) ((GtkCTreeFunc)(_func_))
52
53 #define GTK_TYPE_CTREE_NODE (gtk_ctree_node_get_type ())
54
55 typedef enum
56 {
57   GTK_CTREE_POS_BEFORE,
58   GTK_CTREE_POS_AS_CHILD,
59   GTK_CTREE_POS_AFTER
60 } GtkCTreePos;
61
62 typedef enum
63 {
64   GTK_CTREE_LINES_NONE,
65   GTK_CTREE_LINES_SOLID,
66   GTK_CTREE_LINES_DOTTED,
67   GTK_CTREE_LINES_TABBED
68 } GtkCTreeLineStyle;
69
70 typedef enum
71 {
72   GTK_CTREE_EXPANDER_NONE,
73   GTK_CTREE_EXPANDER_SQUARE,
74   GTK_CTREE_EXPANDER_TRIANGLE,
75   GTK_CTREE_EXPANDER_CIRCULAR
76 } GtkCTreeExpanderStyle;
77
78 typedef enum
79 {
80   GTK_CTREE_EXPANSION_EXPAND,
81   GTK_CTREE_EXPANSION_EXPAND_RECURSIVE,
82   GTK_CTREE_EXPANSION_COLLAPSE,
83   GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE,
84   GTK_CTREE_EXPANSION_TOGGLE,
85   GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE
86 } GtkCTreeExpansionType;
87
88 typedef struct _GtkCTree      GtkCTree;
89 typedef struct _GtkCTreeClass GtkCTreeClass;
90 typedef struct _GtkCTreeRow   GtkCTreeRow;
91 typedef struct _GtkCTreeNode  GtkCTreeNode;
92
93 typedef void (*GtkCTreeFunc) (GtkCTree     *ctree,
94                               GtkCTreeNode *node,
95                               gpointer      data);
96
97 typedef gboolean (*GtkCTreeGNodeFunc) (GtkCTree     *ctree,
98                                        guint         depth,
99                                        GNode        *gnode,
100                                        GtkCTreeNode *cnode,
101                                        gpointer      data);
102
103 typedef gboolean (*GtkCTreeCompareDragFunc) (GtkCTree     *ctree,
104                                              GtkCTreeNode *source_node,
105                                              GtkCTreeNode *new_parent,
106                                              GtkCTreeNode *new_sibling);
107
108 struct _GtkCTree
109 {
110   GtkCList clist;
111   
112   GdkGC *lines_gc;
113   
114   gint tree_indent;
115   gint tree_spacing;
116   gint tree_column;
117
118   guint line_style     : 2;
119   guint expander_style : 2;
120   guint show_stub      : 1;
121
122   GtkCTreeCompareDragFunc drag_compare;
123 };
124
125 struct _GtkCTreeClass
126 {
127   GtkCListClass parent_class;
128   
129   void (*tree_select_row)   (GtkCTree     *ctree,
130                              GtkCTreeNode *row,
131                              gint          column);
132   void (*tree_unselect_row) (GtkCTree     *ctree,
133                              GtkCTreeNode *row,
134                              gint          column);
135   void (*tree_expand)       (GtkCTree     *ctree,
136                              GtkCTreeNode *node);
137   void (*tree_collapse)     (GtkCTree     *ctree,
138                              GtkCTreeNode *node);
139   void (*tree_move)         (GtkCTree     *ctree,
140                              GtkCTreeNode *node,
141                              GtkCTreeNode *new_parent,
142                              GtkCTreeNode *new_sibling);
143   void (*change_focus_row_expansion) (GtkCTree *ctree,
144                                       GtkCTreeExpansionType action);
145 };
146
147 struct _GtkCTreeRow
148 {
149   GtkCListRow row;
150   
151   GtkCTreeNode *parent;
152   GtkCTreeNode *sibling;
153   GtkCTreeNode *children;
154   
155   GdkPixmap *pixmap_closed;
156   GdkBitmap *mask_closed;
157   GdkPixmap *pixmap_opened;
158   GdkBitmap *mask_opened;
159   
160   guint16 level;
161   
162   guint is_leaf  : 1;
163   guint expanded : 1;
164 };
165
166 struct _GtkCTreeNode {
167   GList list;
168 };
169
170
171 /***********************************************************
172  *           Creation, insertion, deletion                 *
173  ***********************************************************/
174
175 GtkType gtk_ctree_get_type                       (void) G_GNUC_CONST;
176 GtkWidget * gtk_ctree_new_with_titles            (gint          columns, 
177                                                   gint          tree_column,
178                                                   gchar        *titles[]);
179 GtkWidget * gtk_ctree_new                        (gint          columns, 
180                                                   gint          tree_column);
181 GtkCTreeNode * gtk_ctree_insert_node             (GtkCTree     *ctree,
182                                                   GtkCTreeNode *parent, 
183                                                   GtkCTreeNode *sibling,
184                                                   gchar        *text[],
185                                                   guint8        spacing,
186                                                   GdkPixmap    *pixmap_closed,
187                                                   GdkBitmap    *mask_closed,
188                                                   GdkPixmap    *pixmap_opened,
189                                                   GdkBitmap    *mask_opened,
190                                                   gboolean      is_leaf,
191                                                   gboolean      expanded);
192 void gtk_ctree_remove_node                       (GtkCTree     *ctree, 
193                                                   GtkCTreeNode *node);
194 GtkCTreeNode * gtk_ctree_insert_gnode            (GtkCTree          *ctree,
195                                                   GtkCTreeNode      *parent,
196                                                   GtkCTreeNode      *sibling,
197                                                   GNode             *gnode,
198                                                   GtkCTreeGNodeFunc  func,
199                                                   gpointer           data);
200 GNode * gtk_ctree_export_to_gnode                (GtkCTree          *ctree,
201                                                   GNode             *parent,
202                                                   GNode             *sibling,
203                                                   GtkCTreeNode      *node,
204                                                   GtkCTreeGNodeFunc  func,
205                                                   gpointer           data);
206
207 /***********************************************************
208  *  Generic recursive functions, querying / finding tree   *
209  *  information                                            *
210  ***********************************************************/
211
212 void gtk_ctree_post_recursive                    (GtkCTree     *ctree, 
213                                                   GtkCTreeNode *node,
214                                                   GtkCTreeFunc  func,
215                                                   gpointer      data);
216 void gtk_ctree_post_recursive_to_depth           (GtkCTree     *ctree, 
217                                                   GtkCTreeNode *node,
218                                                   gint          depth,
219                                                   GtkCTreeFunc  func,
220                                                   gpointer      data);
221 void gtk_ctree_pre_recursive                     (GtkCTree     *ctree, 
222                                                   GtkCTreeNode *node,
223                                                   GtkCTreeFunc  func,
224                                                   gpointer      data);
225 void gtk_ctree_pre_recursive_to_depth            (GtkCTree     *ctree, 
226                                                   GtkCTreeNode *node,
227                                                   gint          depth,
228                                                   GtkCTreeFunc  func,
229                                                   gpointer      data);
230 gboolean gtk_ctree_is_viewable                   (GtkCTree     *ctree, 
231                                                   GtkCTreeNode *node);
232 GtkCTreeNode * gtk_ctree_last                    (GtkCTree     *ctree,
233                                                   GtkCTreeNode *node);
234 GtkCTreeNode * gtk_ctree_find_node_ptr           (GtkCTree     *ctree,
235                                                   GtkCTreeRow  *ctree_row);
236 GtkCTreeNode * gtk_ctree_node_nth                (GtkCTree     *ctree,
237                                                   guint         row);
238 gboolean gtk_ctree_find                          (GtkCTree     *ctree,
239                                                   GtkCTreeNode *node,
240                                                   GtkCTreeNode *child);
241 gboolean gtk_ctree_is_ancestor                   (GtkCTree     *ctree,
242                                                   GtkCTreeNode *node,
243                                                   GtkCTreeNode *child);
244 GtkCTreeNode * gtk_ctree_find_by_row_data        (GtkCTree     *ctree,
245                                                   GtkCTreeNode *node,
246                                                   gpointer      data);
247 /* returns a GList of all GtkCTreeNodes with row->data == data. */
248 GList * gtk_ctree_find_all_by_row_data           (GtkCTree     *ctree,
249                                                   GtkCTreeNode *node,
250                                                   gpointer      data);
251 GtkCTreeNode * gtk_ctree_find_by_row_data_custom (GtkCTree     *ctree,
252                                                   GtkCTreeNode *node,
253                                                   gpointer      data,
254                                                   GCompareFunc  func);
255 /* returns a GList of all GtkCTreeNodes with row->data == data. */
256 GList * gtk_ctree_find_all_by_row_data_custom    (GtkCTree     *ctree,
257                                                   GtkCTreeNode *node,
258                                                   gpointer      data,
259                                                   GCompareFunc  func);
260 gboolean gtk_ctree_is_hot_spot                   (GtkCTree     *ctree,
261                                                   gint          x,
262                                                   gint          y);
263
264 /***********************************************************
265  *   Tree signals : move, expand, collapse, (un)select     *
266  ***********************************************************/
267
268 void gtk_ctree_move                              (GtkCTree     *ctree,
269                                                   GtkCTreeNode *node,
270                                                   GtkCTreeNode *new_parent, 
271                                                   GtkCTreeNode *new_sibling);
272 void gtk_ctree_expand                            (GtkCTree     *ctree,
273                                                   GtkCTreeNode *node);
274 void gtk_ctree_expand_recursive                  (GtkCTree     *ctree,
275                                                   GtkCTreeNode *node);
276 void gtk_ctree_expand_to_depth                   (GtkCTree     *ctree,
277                                                   GtkCTreeNode *node,
278                                                   gint          depth);
279 void gtk_ctree_collapse                          (GtkCTree     *ctree,
280                                                   GtkCTreeNode *node);
281 void gtk_ctree_collapse_recursive                (GtkCTree     *ctree,
282                                                   GtkCTreeNode *node);
283 void gtk_ctree_collapse_to_depth                 (GtkCTree     *ctree,
284                                                   GtkCTreeNode *node,
285                                                   gint          depth);
286 void gtk_ctree_toggle_expansion                  (GtkCTree     *ctree,
287                                                   GtkCTreeNode *node);
288 void gtk_ctree_toggle_expansion_recursive        (GtkCTree     *ctree,
289                                                   GtkCTreeNode *node);
290 void gtk_ctree_select                            (GtkCTree     *ctree, 
291                                                   GtkCTreeNode *node);
292 void gtk_ctree_select_recursive                  (GtkCTree     *ctree, 
293                                                   GtkCTreeNode *node);
294 void gtk_ctree_unselect                          (GtkCTree     *ctree, 
295                                                   GtkCTreeNode *node);
296 void gtk_ctree_unselect_recursive                (GtkCTree     *ctree, 
297                                                   GtkCTreeNode *node);
298 void gtk_ctree_real_select_recursive             (GtkCTree     *ctree, 
299                                                   GtkCTreeNode *node, 
300                                                   gint          state);
301
302 /***********************************************************
303  *           Analogons of GtkCList functions               *
304  ***********************************************************/
305
306 void gtk_ctree_node_set_text                     (GtkCTree     *ctree,
307                                                   GtkCTreeNode *node,
308                                                   gint          column,
309                                                   const gchar  *text);
310 void gtk_ctree_node_set_pixmap                   (GtkCTree     *ctree,
311                                                   GtkCTreeNode *node,
312                                                   gint          column,
313                                                   GdkPixmap    *pixmap,
314                                                   GdkBitmap    *mask);
315 void gtk_ctree_node_set_pixtext                  (GtkCTree     *ctree,
316                                                   GtkCTreeNode *node,
317                                                   gint          column,
318                                                   const gchar  *text,
319                                                   guint8        spacing,
320                                                   GdkPixmap    *pixmap,
321                                                   GdkBitmap    *mask);
322 void gtk_ctree_set_node_info                     (GtkCTree     *ctree,
323                                                   GtkCTreeNode *node,
324                                                   const gchar  *text,
325                                                   guint8        spacing,
326                                                   GdkPixmap    *pixmap_closed,
327                                                   GdkBitmap    *mask_closed,
328                                                   GdkPixmap    *pixmap_opened,
329                                                   GdkBitmap    *mask_opened,
330                                                   gboolean      is_leaf,
331                                                   gboolean      expanded);
332 void gtk_ctree_node_set_shift                    (GtkCTree     *ctree,
333                                                   GtkCTreeNode *node,
334                                                   gint          column,
335                                                   gint          vertical,
336                                                   gint          horizontal);
337 void gtk_ctree_node_set_selectable               (GtkCTree     *ctree,
338                                                   GtkCTreeNode *node,
339                                                   gboolean      selectable);
340 gboolean gtk_ctree_node_get_selectable           (GtkCTree     *ctree,
341                                                   GtkCTreeNode *node);
342 GtkCellType gtk_ctree_node_get_cell_type         (GtkCTree     *ctree,
343                                                   GtkCTreeNode *node,
344                                                   gint          column);
345 gboolean gtk_ctree_node_get_text                 (GtkCTree     *ctree,
346                                                   GtkCTreeNode *node,
347                                                   gint          column,
348                                                   gchar       **text);
349 gboolean gtk_ctree_node_get_pixmap               (GtkCTree     *ctree,
350                                                   GtkCTreeNode *node,
351                                                   gint          column,
352                                                   GdkPixmap   **pixmap,
353                                                   GdkBitmap   **mask);
354 gboolean gtk_ctree_node_get_pixtext              (GtkCTree     *ctree,
355                                                   GtkCTreeNode *node,
356                                                   gint          column,
357                                                   gchar       **text,
358                                                   guint8       *spacing,
359                                                   GdkPixmap   **pixmap,
360                                                   GdkBitmap   **mask);
361 gboolean gtk_ctree_get_node_info                 (GtkCTree     *ctree,
362                                                   GtkCTreeNode *node,
363                                                   gchar       **text,
364                                                   guint8       *spacing,
365                                                   GdkPixmap   **pixmap_closed,
366                                                   GdkBitmap   **mask_closed,
367                                                   GdkPixmap   **pixmap_opened,
368                                                   GdkBitmap   **mask_opened,
369                                                   gboolean     *is_leaf,
370                                                   gboolean     *expanded);
371 void gtk_ctree_node_set_row_style                (GtkCTree     *ctree,
372                                                   GtkCTreeNode *node,
373                                                   GtkStyle     *style);
374 GtkStyle * gtk_ctree_node_get_row_style          (GtkCTree     *ctree,
375                                                   GtkCTreeNode *node);
376 void gtk_ctree_node_set_cell_style               (GtkCTree     *ctree,
377                                                   GtkCTreeNode *node,
378                                                   gint          column,
379                                                   GtkStyle     *style);
380 GtkStyle * gtk_ctree_node_get_cell_style         (GtkCTree     *ctree,
381                                                   GtkCTreeNode *node,
382                                                   gint          column);
383 void gtk_ctree_node_set_foreground               (GtkCTree       *ctree,
384                                                   GtkCTreeNode   *node,
385                                                   const GdkColor *color);
386 void gtk_ctree_node_set_background               (GtkCTree       *ctree,
387                                                   GtkCTreeNode   *node,
388                                                   const GdkColor *color);
389 void gtk_ctree_node_set_row_data                 (GtkCTree     *ctree,
390                                                   GtkCTreeNode *node,
391                                                   gpointer      data);
392 void gtk_ctree_node_set_row_data_full            (GtkCTree     *ctree,
393                                                   GtkCTreeNode *node,
394                                                   gpointer      data,
395                                                   GtkDestroyNotify destroy);
396 gpointer gtk_ctree_node_get_row_data             (GtkCTree     *ctree,
397                                                   GtkCTreeNode *node);
398 void gtk_ctree_node_moveto                       (GtkCTree     *ctree,
399                                                   GtkCTreeNode *node,
400                                                   gint          column,
401                                                   gfloat        row_align,
402                                                   gfloat        col_align);
403 GtkVisibility gtk_ctree_node_is_visible          (GtkCTree     *ctree,
404                                                   GtkCTreeNode *node);
405
406 /***********************************************************
407  *             GtkCTree specific functions                 *
408  ***********************************************************/
409
410 void gtk_ctree_set_indent            (GtkCTree                *ctree, 
411                                       gint                     indent);
412 void gtk_ctree_set_spacing           (GtkCTree                *ctree, 
413                                       gint                     spacing);
414 void gtk_ctree_set_show_stub         (GtkCTree                *ctree, 
415                                       gboolean                 show_stub);
416 void gtk_ctree_set_line_style        (GtkCTree                *ctree, 
417                                       GtkCTreeLineStyle        line_style);
418 void gtk_ctree_set_expander_style    (GtkCTree                *ctree, 
419                                       GtkCTreeExpanderStyle    expander_style);
420 void gtk_ctree_set_drag_compare_func (GtkCTree                *ctree,
421                                       GtkCTreeCompareDragFunc  cmp_func);
422
423 /***********************************************************
424  *             Tree sorting functions                      *
425  ***********************************************************/
426
427 void gtk_ctree_sort_node                         (GtkCTree     *ctree, 
428                                                   GtkCTreeNode *node);
429 void gtk_ctree_sort_recursive                    (GtkCTree     *ctree, 
430                                                   GtkCTreeNode *node);
431
432
433 #define gtk_ctree_set_reorderable(t,r)                    gtk_clist_set_reorderable((GtkCList*) (t),(r))
434
435 /* GType for the GtkCTreeNode.  This is a boxed type, although it uses
436  * no-op's for the copy and free routines.  It is defined in order to
437  * provide type information for the signal arguments
438  */
439 GType   gtk_ctree_node_get_type                  (void) G_GNUC_CONST;
440
441 G_END_DECLS
442
443 #endif                          /* __GTK_CTREE_H__ */
444
445 #endif /* GTK_DISABLE_DEPRECATED */