2 * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #include "gtktreemodel.h"
32 gtk_tree_model_get_type (void)
34 static GtkType tree_model_type = 0;
38 static const GTypeInfo tree_model_info =
40 sizeof (GtkTreeModelIface), /* class_size */
42 NULL, /* base_finalize */
45 tree_model_type = g_type_register_static (G_TYPE_INTERFACE, "GtkTreeModel", &tree_model_info);
48 return tree_model_type;
51 /* GtkTreePath Operations */
53 gtk_tree_path_new (void)
56 retval = (GtkTreePath *) g_new (GtkTreePath, 1);
58 retval->indices = NULL;
64 gtk_tree_path_new_from_string (gchar *path)
70 g_return_val_if_fail (path != NULL, gtk_tree_path_new ());
72 retval = gtk_tree_path_new ();
76 i = strtol (path, &ptr, 10);
77 gtk_tree_path_append_index (retval, i);
88 gtk_tree_path_to_string (GtkTreePath *path)
96 ptr = retval = (gchar *) g_new0 (char *, path->depth*8);
97 sprintf (retval, "%d", path->indices[0]);
98 while (*ptr != '\000')
101 for (i = 1; i < path->depth; i++)
103 sprintf (ptr, ":%d", path->indices[i]);
104 while (*ptr != '\000')
112 gtk_tree_path_new_root (void)
116 retval = gtk_tree_path_new ();
117 gtk_tree_path_append_index (retval, 0);
123 gtk_tree_path_append_index (GtkTreePath *path,
126 gint *new_indices = g_new (gint, ++path->depth);
127 if (path->indices == NULL)
129 path->indices = new_indices;
130 path->indices[0] = index;
134 memcpy (new_indices, path->indices, (path->depth - 1)*sizeof (gint));
135 g_free (path->indices);
136 path->indices = new_indices;
137 path->indices[path->depth - 1] = index;
141 gtk_tree_path_prepend_index (GtkTreePath *path,
144 gint *new_indices = g_new (gint, ++path->depth);
145 if (path->indices == NULL)
147 path->indices = new_indices;
148 path->indices[0] = index;
151 memcpy (new_indices + 1, path->indices, (path->depth - 1)*sizeof (gint));
152 g_free (path->indices);
153 path->indices = new_indices;
154 path->indices[0] = index;
158 gtk_tree_path_get_depth (GtkTreePath *path)
164 gtk_tree_path_get_indices (GtkTreePath *path)
166 return path->indices;
170 gtk_tree_path_free (GtkTreePath *path)
172 g_free (path->indices);
177 gtk_tree_path_copy (GtkTreePath *path)
181 retval = g_new (GtkTreePath, 1);
182 retval->depth = path->depth;
183 retval->indices = g_new (gint, path->depth);
184 memcpy (retval->indices, path->indices, path->depth * sizeof (gint));
189 gtk_tree_path_compare (GtkTreePath *a,
194 g_return_val_if_fail (a != NULL, 0);
195 g_return_val_if_fail (b != NULL, 0);
196 g_return_val_if_fail (a->depth > 0, 0);
197 g_return_val_if_fail (b->depth > 0, 0);
201 if (a->indices[p] == b->indices[q])
203 return (a->indices[p] < b->indices[q]?1:-1);
205 while (++p < a->depth && ++q < b->depth);
206 if (a->depth == b->depth)
208 return (a->depth < b->depth?1:-1);
212 gtk_tree_path_next (GtkTreePath *path)
214 g_return_if_fail (path != NULL);
216 path->indices[path->depth - 1] ++;
220 gtk_tree_path_prev (GtkTreePath *path)
222 g_return_val_if_fail (path != NULL, FALSE);
224 if (path->indices[path->depth] == 0)
227 path->indices[path->depth - 1] --;
233 gtk_tree_path_up (GtkTreePath *path)
235 g_return_val_if_fail (path != NULL, FALSE);
237 if (path->depth == 1)
246 gtk_tree_path_down (GtkTreePath *path)
248 g_return_if_fail (path != NULL);
250 gtk_tree_path_append_index (path, 0);
254 gtk_tree_model_get_n_columns (GtkTreeModel *tree_model)
256 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->get_n_columns != NULL, 0);
257 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_n_columns) (tree_model);
262 gtk_tree_model_get_node (GtkTreeModel *tree_model,
265 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->get_node != NULL, NULL);
266 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_node) (tree_model, path);
270 gtk_tree_model_get_path (GtkTreeModel *tree_model,
273 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->get_path != NULL, NULL);
274 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->get_path) (tree_model, node);
278 gtk_tree_model_node_get_value (GtkTreeModel *tree_model,
283 g_return_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_get_value != NULL);
284 (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_get_value) (tree_model, node, column, value);
288 gtk_tree_model_node_next (GtkTreeModel *tree_model,
291 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_next != NULL, FALSE);
292 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_next) (tree_model, node);
296 gtk_tree_model_node_children (GtkTreeModel *tree_model,
299 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_children != NULL, NULL);
300 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_children) (tree_model, node);
304 gtk_tree_model_node_has_child (GtkTreeModel *tree_model,
307 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_has_child != NULL, FALSE);
308 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_has_child) (tree_model, node);
312 gtk_tree_model_node_n_children (GtkTreeModel *tree_model,
315 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_n_children != NULL, -1);
316 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_n_children) (tree_model, node);
320 gtk_tree_model_node_nth_child (GtkTreeModel *tree_model,
324 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_nth_child != NULL, NULL);
325 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_nth_child) (tree_model, node, n);
329 gtk_tree_model_node_parent (GtkTreeModel *tree_model,
332 g_return_val_if_fail (GTK_TREE_MODEL_GET_IFACE (tree_model)->node_parent != NULL, NULL);
333 return (* GTK_TREE_MODEL_GET_IFACE (tree_model)->node_parent) (tree_model, node);