1 /* gtktreemodelmapping.c
2 * Copyright (C) 2000 Red Hat, Inc., Alexander Larsson <alexl@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.
20 #include "gtktreemodelmapping.h"
21 #include "gtksignal.h"
31 static guint tree_model_mapping_signals[LAST_SIGNAL] = { 0 };
33 static void gtk_tree_model_mapping_init (GtkTreeModelMapping *tree_model_mapping);
34 static void gtk_tree_model_mapping_class_init (GtkTreeModelMappingClass *tree_model_mapping_class);
35 static void gtk_tree_model_mapping_tree_model_init (GtkTreeModelIface *iface);
36 static void gtk_tree_model_mapping_finalize (GObject *object);
38 static void gtk_tree_model_mapping_changed (GtkTreeModel *model,
42 static void gtk_tree_model_mapping_inserted (GtkTreeModel *model,
46 static void gtk_tree_model_mapping_child_toggled (GtkTreeModel *model,
50 static void gtk_tree_model_mapping_deleted (GtkTreeModel *model,
53 static void gtk_tree_model_mapping_reordered (GtkTreeModel *model,
57 static GtkTreeModelFlags gtk_tree_model_mapping_get_flags (GtkTreeModel *tree_model);
58 static gint gtk_tree_model_mapping_get_n_columns (GtkTreeModel *tree_model);
59 static GType gtk_tree_model_mapping_get_column_type (GtkTreeModel *tree_model,
61 static gboolean gtk_tree_model_mapping_get_iter (GtkTreeModel *tree_model,
64 static GtkTreePath *gtk_tree_model_mapping_get_path (GtkTreeModel *tree_model,
66 static void gtk_tree_model_mapping_get_value (GtkTreeModel *tree_model,
70 static gboolean gtk_tree_model_mapping_iter_next (GtkTreeModel *tree_model,
72 static gboolean gtk_tree_model_mapping_iter_children (GtkTreeModel *tree_model,
75 static gboolean gtk_tree_model_mapping_iter_has_child (GtkTreeModel *tree_model,
77 static gint gtk_tree_model_mapping_iter_n_children (GtkTreeModel *tree_model,
79 static gboolean gtk_tree_model_mapping_iter_nth_child (GtkTreeModel *tree_model,
83 static gboolean gtk_tree_model_mapping_iter_parent (GtkTreeModel *tree_model,
86 static void gtk_tree_model_mapping_ref_iter (GtkTreeModel *tree_model,
88 static void gtk_tree_model_mapping_unref_iter (GtkTreeModel *tree_model,
93 gtk_tree_model_mapping_get_type (void)
95 static GtkType tree_model_mapping_type = 0;
97 if (!tree_model_mapping_type)
99 static const GTypeInfo tree_model_mapping_info =
101 sizeof (GtkTreeModelMappingClass),
102 NULL, /* base_init */
103 NULL, /* base_finalize */
104 (GClassInitFunc) gtk_tree_model_mapping_class_init,
105 NULL, /* class_finalize */
106 NULL, /* class_data */
107 sizeof (GtkTreeModelMapping),
109 (GInstanceInitFunc) gtk_tree_model_mapping_init
112 static const GInterfaceInfo tree_model_info =
114 (GInterfaceInitFunc) gtk_tree_model_mapping_tree_model_init,
119 tree_model_mapping_type = g_type_register_static (GTK_TYPE_OBJECT, "GtkTreeModelMapping", &tree_model_mapping_info, 0);
120 g_type_add_interface_static (tree_model_mapping_type,
125 return tree_model_mapping_type;
129 gtk_tree_model_mapping_class_init (GtkTreeModelMappingClass *tree_model_mapping_class)
131 GObjectClass *object_class;
133 object_class = (GObjectClass *) tree_model_mapping_class;
135 object_class->finalize = gtk_tree_model_mapping_finalize;
137 tree_model_mapping_signals[CHANGED] =
138 gtk_signal_new ("changed",
140 GTK_CLASS_TYPE (object_class),
141 GTK_SIGNAL_OFFSET (GtkTreeModelMappingClass, changed),
142 gtk_marshal_VOID__POINTER_POINTER,
146 tree_model_mapping_signals[INSERTED] =
147 gtk_signal_new ("inserted",
149 GTK_CLASS_TYPE (object_class),
150 GTK_SIGNAL_OFFSET (GtkTreeModelMappingClass, inserted),
151 gtk_marshal_VOID__POINTER_POINTER,
155 tree_model_mapping_signals[CHILD_TOGGLED] =
156 gtk_signal_new ("child_toggled",
158 GTK_CLASS_TYPE (object_class),
159 GTK_SIGNAL_OFFSET (GtkTreeModelMappingClass, child_toggled),
160 gtk_marshal_VOID__POINTER_POINTER,
164 tree_model_mapping_signals[DELETED] =
165 gtk_signal_new ("deleted",
167 GTK_CLASS_TYPE (object_class),
168 GTK_SIGNAL_OFFSET (GtkTreeModelMappingClass, deleted),
169 gtk_marshal_VOID__POINTER,
175 gtk_tree_model_mapping_tree_model_init (GtkTreeModelIface *iface)
177 iface->get_flags = gtk_tree_model_mapping_get_flags;
178 iface->get_n_columns = gtk_tree_model_mapping_get_n_columns;
179 iface->get_column_type = gtk_tree_model_mapping_get_column_type;
180 iface->get_iter = gtk_tree_model_mapping_get_iter;
181 iface->get_path = gtk_tree_model_mapping_get_path;
182 iface->get_value = gtk_tree_model_mapping_get_value;
183 iface->iter_next = gtk_tree_model_mapping_iter_next;
184 iface->iter_children = gtk_tree_model_mapping_iter_children;
185 iface->iter_has_child = gtk_tree_model_mapping_iter_has_child;
186 iface->iter_n_children = gtk_tree_model_mapping_iter_n_children;
187 iface->iter_nth_child = gtk_tree_model_mapping_iter_nth_child;
188 iface->iter_parent = gtk_tree_model_mapping_iter_parent;
189 iface->ref_iter = gtk_tree_model_mapping_ref_iter;
190 iface->unref_iter = gtk_tree_model_mapping_unref_iter;
194 gtk_tree_model_mapping_init (GtkTreeModelMapping *tree_model_mapping)
199 gtk_tree_model_mapping_new (void)
201 return GTK_TREE_MODEL (gtk_type_new (gtk_tree_model_mapping_get_type ()));
205 gtk_tree_model_mapping_new_with_model (GtkTreeModel *child_model)
207 GtkTreeModel *retval;
209 retval = gtk_tree_model_mapping_new ();
210 gtk_tree_model_mapping_set_model (GTK_TREE_MODEL_MAPPING (retval), child_model);
215 gtk_tree_model_mapping_set_n_columns (GtkTreeModelMapping *tree_model_mapping,
218 g_return_if_fail (tree_model_mapping != NULL);
219 g_return_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model_mapping));
221 tree_model_mapping->n_columns = n_columns;
222 tree_model_mapping->column_maps = g_realloc (tree_model_mapping->column_maps, sizeof (GtkTreeModelMapping)*n_columns);
226 gtk_tree_model_mapping_set_column_mapping (GtkTreeModelMapping *tree_model_mapping,
230 GValueMapFunc map_func,
233 GtkTreeModelMappingMap *map;
235 g_return_if_fail (tree_model_mapping != NULL);
236 g_return_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model_mapping));
237 g_return_if_fail (column < tree_model_mapping->n_columns);
239 map = &tree_model_mapping->column_maps[column];
240 map->src_column = src_column;
241 map->col_type = col_type;
242 map->map_func = map_func;
243 map->user_data = user_data;
247 * gtk_tree_model_mapping_set_model:
248 * @tree_model_mapping: The #GtkTreeModelMapping.
249 * @child_model: A #GtkTreeModel, or NULL.
251 * Sets the model of @tree_model_mapping to be @model. If @model is NULL, then the
252 * old model is unset.
255 gtk_tree_model_mapping_set_model (GtkTreeModelMapping *tree_model_mapping,
256 GtkTreeModel *child_model)
258 g_return_if_fail (tree_model_mapping != NULL);
259 g_return_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model_mapping));
262 g_object_ref (G_OBJECT (child_model));
264 if (tree_model_mapping->child_model)
266 gtk_signal_disconnect_by_func (GTK_OBJECT (tree_model_mapping->child_model),
267 gtk_tree_model_mapping_changed,
269 gtk_signal_disconnect_by_func (GTK_OBJECT (tree_model_mapping->child_model),
270 gtk_tree_model_mapping_inserted,
272 gtk_signal_disconnect_by_func (GTK_OBJECT (tree_model_mapping->child_model),
273 gtk_tree_model_mapping_child_toggled,
275 gtk_signal_disconnect_by_func (GTK_OBJECT (tree_model_mapping->child_model),
276 gtk_tree_model_mapping_deleted,
279 g_object_unref (G_OBJECT (tree_model_mapping->child_model));
282 tree_model_mapping->child_model = child_model;
286 gtk_signal_connect (GTK_OBJECT (child_model),
288 gtk_tree_model_mapping_changed,
290 gtk_signal_connect (GTK_OBJECT (child_model),
292 gtk_tree_model_mapping_inserted,
294 gtk_signal_connect (GTK_OBJECT (child_model),
296 gtk_tree_model_mapping_child_toggled,
298 gtk_signal_connect (GTK_OBJECT (child_model),
300 gtk_tree_model_mapping_deleted,
306 * gtk_tree_model_mapping_get_model:
307 * @tree_model: a #GtkTreeModelMapping
309 * Returns the model the #GtkTreeModelMapping is mappinging.
311 * Return value: the "child model" being mappinged
314 gtk_tree_model_mapping_get_model (GtkTreeModelMapping *tree_model)
316 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), NULL);
318 return tree_model->child_model;
322 gtk_tree_model_mapping_finalize (GObject *object)
324 GtkTreeModelMapping *tree_model_mapping = (GtkTreeModelMapping *) object;
326 g_free (tree_model_mapping->column_maps);
327 tree_model_mapping->column_maps = NULL;
329 if (tree_model_mapping->child_model)
331 g_object_unref (G_OBJECT (tree_model_mapping->child_model));
332 tree_model_mapping->child_model = NULL;
337 gtk_tree_model_mapping_changed (GtkTreeModel *model,
342 gtk_signal_emit_by_name (GTK_OBJECT (data), "changed", path, iter);
346 gtk_tree_model_mapping_inserted (GtkTreeModel *model,
351 gtk_signal_emit_by_name (GTK_OBJECT (data), "inserted", path, iter);
355 gtk_tree_model_mapping_child_toggled (GtkTreeModel *model,
360 gtk_signal_emit_by_name (GTK_OBJECT (data), "child_toggled", path, iter);
364 gtk_tree_model_mapping_deleted (GtkTreeModel *model,
368 gtk_signal_emit_by_name (GTK_OBJECT (data), "deleted", path);
372 static GtkTreeModelFlags
373 gtk_tree_model_mapping_get_flags (GtkTreeModel *tree_model)
375 GtkTreeModel *child_model;
377 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
378 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
380 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
382 return gtk_tree_model_get_flags (child_model);
386 gtk_tree_model_mapping_get_n_columns (GtkTreeModel *tree_model)
388 GtkTreeModelMapping *tree_model_mapping;
390 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
392 tree_model_mapping = GTK_TREE_MODEL_MAPPING (tree_model);
394 return tree_model_mapping->n_columns;
398 gtk_tree_model_mapping_get_column_type (GtkTreeModel *tree_model,
401 GtkTreeModelMapping *tree_model_mapping;
403 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
405 tree_model_mapping = GTK_TREE_MODEL_MAPPING (tree_model);
407 return tree_model_mapping->column_maps[index].col_type;
411 gtk_tree_model_mapping_get_iter (GtkTreeModel *tree_model,
415 GtkTreeModel *child_model;
417 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
418 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
420 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
422 return gtk_tree_model_get_iter (child_model, iter, path);
426 gtk_tree_model_mapping_get_path (GtkTreeModel *tree_model,
429 GtkTreeModel *child_model;
431 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
432 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
434 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
436 return gtk_tree_model_get_path (child_model, iter);
440 gtk_tree_model_mapping_get_value (GtkTreeModel *tree_model,
445 GValue src_val = { 0, };
446 GtkTreeModel *child_model;
447 GtkTreeModelMapping *tree_model_mapping;
448 GtkTreeModelMappingMap *map;
450 g_return_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model));
451 g_return_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL);
453 tree_model_mapping = GTK_TREE_MODEL_MAPPING (tree_model);
454 child_model = tree_model_mapping->child_model;
456 map = &tree_model_mapping->column_maps[column];
458 gtk_tree_model_get_value (child_model, iter, map->src_column, &src_val);
459 (* map->map_func) (&src_val, value, map->user_data);
460 g_value_unset (&src_val);
464 gtk_tree_model_mapping_iter_next (GtkTreeModel *tree_model,
467 GtkTreeModel *child_model;
469 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
470 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
472 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
474 return gtk_tree_model_iter_next (child_model, iter);
478 gtk_tree_model_mapping_iter_children (GtkTreeModel *tree_model,
482 GtkTreeModel *child_model;
484 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
485 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
487 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
488 return gtk_tree_model_iter_children (child_model, iter, parent);
492 gtk_tree_model_mapping_iter_has_child (GtkTreeModel *tree_model,
496 GtkTreeModel *child_model;
498 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
499 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
501 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
502 return gtk_tree_model_iter_has_child (child_model, iter);
506 gtk_tree_model_mapping_iter_n_children (GtkTreeModel *tree_model,
509 GtkTreeModel *child_model;
511 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
512 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
514 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
515 return gtk_tree_model_iter_n_children (child_model, iter);
519 gtk_tree_model_mapping_iter_nth_child (GtkTreeModel *tree_model,
524 GtkTreeModel *child_model;
526 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
527 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
529 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
530 return gtk_tree_model_iter_nth_child (child_model, iter, parent, n);
534 gtk_tree_model_mapping_iter_parent (GtkTreeModel *tree_model,
538 GtkTreeModel *child_model;
540 g_return_val_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model), 0);
541 g_return_val_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL, 0);
543 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
544 return gtk_tree_model_iter_parent (child_model, iter, child);
548 gtk_tree_model_mapping_ref_iter (GtkTreeModel *tree_model,
551 GtkTreeModel *child_model;
553 g_return_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model));
554 g_return_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL);
556 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
557 gtk_tree_model_ref_iter (child_model, iter);
561 gtk_tree_model_mapping_unref_iter (GtkTreeModel *tree_model,
564 GtkTreeModel *child_model;
566 g_return_if_fail (GTK_IS_TREE_MODEL_MAPPING (tree_model));
567 g_return_if_fail (GTK_TREE_MODEL_MAPPING (tree_model)->child_model != NULL);
569 child_model = GTK_TREE_MODEL_MAPPING (tree_model)->child_model;
570 gtk_tree_model_unref_iter (child_model, iter);