]> Pileus Git - ~andy/gtk/blob - gtk/gtkctree.h
new class methods: (sort_list) (insert_row) (remove_row)
[~andy/gtk] / gtk / gtkctree.h
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>
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 Library 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  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library 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 #ifndef __GTK_CTREE_H__
25 #define __GTK_CTREE_H__
26
27 #include <gtk/gtkclist.h>
28
29 #ifdef __cplusplus
30 extern "C"
31 {
32 #pragma }
33 #endif                          /* __cplusplus */
34
35 #define GTK_TYPE_CTREE            (gtk_ctree_get_type ())
36 #define GTK_CTREE(obj)            (GTK_CHECK_CAST ((obj), GTK_TYPE_CTREE, GtkCTree))
37 #define GTK_CTREE_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_CTREE, GtkCTreeClass))
38 #define GTK_IS_CTREE(obj)         (GTK_CHECK_TYPE ((obj), GTK_TYPE_CTREE))
39 #define GTK_IS_CTREE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CTREE))
40
41 #define GTK_CTREE_ROW(_node_) ((GtkCTreeRow *)(((GList *)(_node_))->data))
42 #define GTK_CTREE_NODE(_node_) ((GtkCTreeNode *)((_node_)))
43 #define GTK_CTREE_NODE_NEXT(_nnode_) ((GtkCTreeNode *)(((GList *)(_nnode_))->next))
44 #define GTK_CTREE_NODE_PREV(_pnode_) ((GtkCTreeNode *)(((GList *)(_pnode_))->prev))
45 #define GTK_CTREE_FUNC(_func_) ((GtkCTreeFunc)(_func_))
46
47 typedef enum
48 {
49   GTK_CTREE_POS_BEFORE,
50   GTK_CTREE_POS_AS_CHILD,
51   GTK_CTREE_POS_AFTER
52 } GtkCTreePos;
53
54 typedef enum
55 {
56   GTK_CTREE_LINES_SOLID,
57   GTK_CTREE_LINES_DOTTED,
58   GTK_CTREE_LINES_TABBED,
59   GTK_CTREE_LINES_NONE
60 } GtkCTreeLineStyle;
61
62 typedef enum
63 {
64   GTK_CTREE_EXPANSION_EXPAND,
65   GTK_CTREE_EXPANSION_EXPAND_RECURSIVE,
66   GTK_CTREE_EXPANSION_COLLAPSE,
67   GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE,
68   GTK_CTREE_EXPANSION_TOGGLE,
69   GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE
70 } GtkCTreeExpansionType;
71
72 typedef struct _GtkCTree      GtkCTree;
73 typedef struct _GtkCTreeClass GtkCTreeClass;
74 typedef struct _GtkCTreeRow   GtkCTreeRow;
75 typedef struct _GtkCTreeNode  GtkCTreeNode;
76
77 typedef void (*GtkCTreeFunc) (GtkCTree     *ctree,
78                               GtkCTreeNode *node,
79                               gpointer      data);
80
81 typedef gboolean (*GtkCTreeGNodeFunc) (GtkCTree     *ctree,
82                                        guint         depth,
83                                        GNode        *gnode,
84                                        GtkCTreeNode *cnode,
85                                        gpointer      data);
86
87 typedef gboolean (*GtkCTreeCompareDragFunc) (GtkCTree     *ctree,
88                                              GtkCTreeNode *source_node,
89                                              GtkCTreeNode *new_parent,
90                                              GtkCTreeNode *new_sibling);
91
92 struct _GtkCTree
93 {
94   GtkCList clist;
95   
96   GdkGC *xor_gc;
97   GdkGC *lines_gc;
98   GdkWindow *drag_icon;
99   gint icon_width;
100   gint icon_height;
101   
102   gint tree_indent;
103   gint tree_column;
104   gint drag_row;
105   GtkCTreeNode *drag_source;
106   GtkCTreeNode *drag_target;
107   gint insert_pos;
108
109   guint reorderable : 1;
110   guint use_icons   : 1;
111   guint in_drag     : 1;
112   guint drag_rect   : 1;
113   guint line_style  : 2;
114   guint show_stub   : 1;
115
116   GtkCTreeCompareDragFunc drag_compare;
117 };
118
119 struct _GtkCTreeClass
120 {
121   GtkCListClass parent_class;
122   
123   void (*tree_select_row)   (GtkCTree     *ctree,
124                              GtkCTreeNode *row,
125                              gint          column);
126   void (*tree_unselect_row) (GtkCTree     *ctree,
127                              GtkCTreeNode *row,
128                              gint          column);
129   void (*tree_expand)       (GtkCTree     *ctree,
130                              GtkCTreeNode *node);
131   void (*tree_collapse)     (GtkCTree     *ctree,
132                              GtkCTreeNode *node);
133   void (*tree_move)         (GtkCTree     *ctree,
134                              GtkCTreeNode *node,
135                              GtkCTreeNode *new_parent,
136                              GtkCTreeNode *new_sibling);
137   void (*change_focus_row_expansion) (GtkCTree *ctree,
138                                       GtkCTreeExpansionType action);
139 };
140
141 struct _GtkCTreeRow
142 {
143   GtkCListRow row;
144   
145   GtkCTreeNode *parent;
146   GtkCTreeNode *sibling;
147   GtkCTreeNode *children;
148   
149   GdkPixmap *pixmap_closed;
150   GdkBitmap *mask_closed;
151   GdkPixmap *pixmap_opened;
152   GdkBitmap *mask_opened;
153   
154   guint16 level;
155   
156   guint is_leaf  : 1;
157   guint expanded : 1;
158 };
159
160 struct _GtkCTreeNode {
161   GList list;
162 };
163
164
165 /***********************************************************
166  *           Creation, insertion, deletion                 *
167  ***********************************************************/
168
169 GtkType gtk_ctree_get_type                       (void);
170 void gtk_ctree_construct                         (GtkCTree     *ctree,
171                                                   gint          columns, 
172                                                   gint          tree_column,
173                                                   gchar        *titles[]);
174 GtkWidget * gtk_ctree_new_with_titles            (gint          columns, 
175                                                   gint          tree_column,
176                                                   gchar        *titles[]);
177 GtkWidget * gtk_ctree_new                        (gint          columns, 
178                                                   gint          tree_column);
179 GtkCTreeNode * gtk_ctree_insert_node             (GtkCTree     *ctree,
180                                                   GtkCTreeNode *parent, 
181                                                   GtkCTreeNode *sibling,
182                                                   gchar        *text[],
183                                                   guint8        spacing,
184                                                   GdkPixmap    *pixmap_closed,
185                                                   GdkBitmap    *mask_closed,
186                                                   GdkPixmap    *pixmap_opened,
187                                                   GdkBitmap    *mask_opened,
188                                                   gboolean      is_leaf,
189                                                   gboolean      expanded);
190 void gtk_ctree_remove_node                       (GtkCTree     *ctree, 
191                                                   GtkCTreeNode *node);
192 GtkCTreeNode * gtk_ctree_insert_gnode            (GtkCTree          *ctree,
193                                                   GtkCTreeNode      *parent,
194                                                   GtkCTreeNode      *sibling,
195                                                   GNode             *gnode,
196                                                   GtkCTreeGNodeFunc  func,
197                                                   gpointer           data);
198 GNode * gtk_ctree_export_to_gnode                (GtkCTree          *ctree,
199                                                   GNode             *parent,
200                                                   GNode             *sibling,
201                                                   GtkCTreeNode      *node,
202                                                   GtkCTreeGNodeFunc  func,
203                                                   gpointer           data);
204
205 /***********************************************************
206  *  Generic recursive functions, querying / finding tree   *
207  *  information                                            *
208  ***********************************************************/
209
210 void gtk_ctree_post_recursive                    (GtkCTree     *ctree, 
211                                                   GtkCTreeNode *node,
212                                                   GtkCTreeFunc  func,
213                                                   gpointer      data);
214 void gtk_ctree_post_recursive_to_depth           (GtkCTree     *ctree, 
215                                                   GtkCTreeNode *node,
216                                                   gint          depth,
217                                                   GtkCTreeFunc  func,
218                                                   gpointer      data);
219 void gtk_ctree_pre_recursive                     (GtkCTree     *ctree, 
220                                                   GtkCTreeNode *node,
221                                                   GtkCTreeFunc  func,
222                                                   gpointer      data);
223 void gtk_ctree_pre_recursive_to_depth            (GtkCTree     *ctree, 
224                                                   GtkCTreeNode *node,
225                                                   gint          depth,
226                                                   GtkCTreeFunc  func,
227                                                   gpointer      data);
228 gboolean gtk_ctree_is_viewable                   (GtkCTree     *ctree, 
229                                                   GtkCTreeNode *node);
230 GtkCTreeNode * gtk_ctree_last                    (GtkCTree     *ctree,
231                                                   GtkCTreeNode *node);
232 GtkCTreeNode * gtk_ctree_find_node_ptr           (GtkCTree     *ctree,
233                                                   GtkCTreeRow  *ctree_row);
234 gboolean gtk_ctree_find                          (GtkCTree     *ctree,
235                                                   GtkCTreeNode *node,
236                                                   GtkCTreeNode *child);
237 gboolean gtk_ctree_is_ancestor                   (GtkCTree     *ctree,
238                                                   GtkCTreeNode *node,
239                                                   GtkCTreeNode *child);
240 GtkCTreeNode * gtk_ctree_find_by_row_data        (GtkCTree     *ctree,
241                                                   GtkCTreeNode *node,
242                                                   gpointer      data);
243 GtkCTreeNode * gtk_ctree_find_by_row_data_custom (GtkCTree     *ctree,
244                                                   GtkCTreeNode *node,
245                                                   gpointer      data,
246                                                   GCompareFunc  func);
247 gboolean gtk_ctree_is_hot_spot                   (GtkCTree     *ctree,
248                                                   gint          x,
249                                                   gint          y);
250
251 /***********************************************************
252  *   Tree signals : move, expand, collapse, (un)select     *
253  ***********************************************************/
254
255 void gtk_ctree_move                              (GtkCTree     *ctree,
256                                                   GtkCTreeNode *node,
257                                                   GtkCTreeNode *new_parent, 
258                                                   GtkCTreeNode *new_sibling);
259 void gtk_ctree_expand                            (GtkCTree     *ctree,
260                                                   GtkCTreeNode *node);
261 void gtk_ctree_expand_recursive                  (GtkCTree     *ctree,
262                                                   GtkCTreeNode *node);
263 void gtk_ctree_expand_to_depth                   (GtkCTree     *ctree,
264                                                   GtkCTreeNode *node,
265                                                   gint          depth);
266 void gtk_ctree_collapse                          (GtkCTree     *ctree,
267                                                   GtkCTreeNode *node);
268 void gtk_ctree_collapse_recursive                (GtkCTree     *ctree,
269                                                   GtkCTreeNode *node);
270 void gtk_ctree_collapse_to_depth                 (GtkCTree     *ctree,
271                                                   GtkCTreeNode *node,
272                                                   gint          depth);
273 void gtk_ctree_toggle_expansion                  (GtkCTree     *ctree,
274                                                   GtkCTreeNode *node);
275 void gtk_ctree_toggle_expansion_recursive        (GtkCTree     *ctree,
276                                                   GtkCTreeNode *node);
277 void gtk_ctree_select                            (GtkCTree     *ctree, 
278                                                   GtkCTreeNode *node);
279 void gtk_ctree_select_recursive                  (GtkCTree     *ctree, 
280                                                   GtkCTreeNode *node);
281 void gtk_ctree_unselect                          (GtkCTree     *ctree, 
282                                                   GtkCTreeNode *node);
283 void gtk_ctree_unselect_recursive                (GtkCTree     *ctree, 
284                                                   GtkCTreeNode *node);
285 void gtk_ctree_real_select_recursive             (GtkCTree     *ctree, 
286                                                   GtkCTreeNode *node, 
287                                                   gint          state);
288
289 /***********************************************************
290  *           Analogons of GtkCList functions               *
291  ***********************************************************/
292
293 void gtk_ctree_node_set_text                     (GtkCTree     *ctree,
294                                                   GtkCTreeNode *node,
295                                                   gint          column,
296                                                   gchar        *text);
297 void gtk_ctree_node_set_pixmap                   (GtkCTree     *ctree,
298                                                   GtkCTreeNode *node,
299                                                   gint          column,
300                                                   GdkPixmap    *pixmap,
301                                                   GdkBitmap    *mask);
302 void gtk_ctree_node_set_pixtext                  (GtkCTree     *ctree,
303                                                   GtkCTreeNode *node,
304                                                   gint          column,
305                                                   gchar        *text,
306                                                   guint8        spacing,
307                                                   GdkPixmap    *pixmap,
308                                                   GdkBitmap    *mask);
309 void gtk_ctree_set_node_info                     (GtkCTree     *ctree,
310                                                   GtkCTreeNode *node,
311                                                   gchar        *text,
312                                                   guint8        spacing,
313                                                   GdkPixmap    *pixmap_closed,
314                                                   GdkBitmap    *mask_closed,
315                                                   GdkPixmap    *pixmap_opened,
316                                                   GdkBitmap    *mask_opened,
317                                                   gboolean      is_leaf,
318                                                   gboolean      expanded);
319 void gtk_ctree_node_set_shift                    (GtkCTree     *ctree,
320                                                   GtkCTreeNode *node,
321                                                   gint          column,
322                                                   gint          vertical,
323                                                   gint          horizontal);
324 GtkCellType gtk_ctree_node_get_cell_type         (GtkCTree     *ctree,
325                                                   GtkCTreeNode *node,
326                                                   gint          column);
327 gint gtk_ctree_node_get_text                     (GtkCTree     *ctree,
328                                                   GtkCTreeNode *node,
329                                                   gint          column,
330                                                   gchar       **text);
331 gint gtk_ctree_node_get_pixmap                   (GtkCTree     *ctree,
332                                                   GtkCTreeNode *node,
333                                                   gint          column,
334                                                   GdkPixmap   **pixmap,
335                                                   GdkBitmap   **mask);
336 gint gtk_ctree_node_get_pixtext                  (GtkCTree     *ctree,
337                                                   GtkCTreeNode *node,
338                                                   gint          column,
339                                                   gchar       **text,
340                                                   guint8       *spacing,
341                                                   GdkPixmap   **pixmap,
342                                                   GdkBitmap   **mask);
343 gint gtk_ctree_get_node_info                     (GtkCTree     *ctree,
344                                                   GtkCTreeNode *node,
345                                                   gchar       **text,
346                                                   guint8       *spacing,
347                                                   GdkPixmap   **pixmap_closed,
348                                                   GdkBitmap   **mask_closed,
349                                                   GdkPixmap   **pixmap_opened,
350                                                   GdkBitmap   **mask_opened,
351                                                   gboolean     *is_leaf,
352                                                   gboolean     *expanded);
353 void gtk_ctree_node_set_foreground               (GtkCTree     *ctree,
354                                                   GtkCTreeNode *node,
355                                                   GdkColor     *color);
356 void gtk_ctree_node_set_background               (GtkCTree     *ctree,
357                                                   GtkCTreeNode *node,
358                                                   GdkColor     *color);
359 void gtk_ctree_node_set_row_data                 (GtkCTree     *ctree,
360                                                   GtkCTreeNode *node,
361                                                   gpointer      data);
362 void gtk_ctree_node_set_row_data_full            (GtkCTree     *ctree,
363                                                   GtkCTreeNode *node,
364                                                   gpointer      data,
365                                                   GtkDestroyNotify destroy);
366 gpointer gtk_ctree_node_get_row_data             (GtkCTree     *ctree,
367                                                   GtkCTreeNode *node);
368 void gtk_ctree_node_moveto                       (GtkCTree     *ctree,
369                                                   GtkCTreeNode *node,
370                                                   gint          column,
371                                                   gfloat        row_align,
372                                                   gfloat        col_align);
373 GtkVisibility gtk_ctree_node_is_visible          (GtkCTree     *ctree,
374                                                   GtkCTreeNode *node);
375
376 /***********************************************************
377  *             GtkCTree specific functions                 *
378  ***********************************************************/
379
380 void gtk_ctree_set_indent                        (GtkCTree     *ctree, 
381                                                   gint          indent);
382 void gtk_ctree_show_stub                         (GtkCTree     *ctree, 
383                                                   gboolean      show_stub);
384 void gtk_ctree_set_reorderable                   (GtkCTree     *ctree,
385                                                   gboolean      reorderable);
386 void gtk_ctree_set_use_drag_icons                (GtkCTree     *ctree,
387                                                   gboolean      use_icons);
388 void gtk_ctree_set_line_style                    (GtkCTree     *ctree, 
389                                                   GtkCTreeLineStyle line_style);
390 void gtk_ctree_set_drag_compare_func              (GtkCTree                     *ctree,
391                                                    GtkCTreeCompareDragFunc      cmp_func);            
392
393 /***********************************************************
394  *             Tree sorting functions                      *
395  ***********************************************************/
396
397 void gtk_ctree_sort_node                         (GtkCTree     *ctree, 
398                                                   GtkCTreeNode *node);
399 void gtk_ctree_sort_recursive                    (GtkCTree     *ctree, 
400                                                   GtkCTreeNode *node);
401 #ifdef __cplusplus
402 }
403 #endif                          /* __cplusplus */
404
405 #endif                          /* __GTK_CTREE_H__ */