summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2001-03-10 01:34:48 +0000
committerJonathan Blandford <jrb@src.gnome.org>2001-03-10 01:34:48 +0000
commit351052e1662110612b2c850977a70f2948a68496 (patch)
tree6620125ed4b3386fac6ac4d8c101f84abe5640f2
parent79fed460d99ffeb75d8b4f71654a01ebf657b5e9 (diff)
downloadgtk+-351052e1662110612b2c850977a70f2948a68496.tar.gz
Make select_all not work if you're in SINGLE mode (it doesn't make that
Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make select_all not work if you're in SINGLE mode (it doesn't make that much sense, anyway.) * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value): handle types more sanely. (_gtk_tree_data_list_value_to_node): handle types more sanely. (_gtk_tree_data_list_node_copy): handle types more sanely. * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with GValue better. Converts the type as well. * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with GValue better. Converts the type as well.
-rw-r--r--ChangeLog17
-rw-r--r--ChangeLog.pre-2-017
-rw-r--r--ChangeLog.pre-2-1017
-rw-r--r--ChangeLog.pre-2-217
-rw-r--r--ChangeLog.pre-2-417
-rw-r--r--ChangeLog.pre-2-617
-rw-r--r--ChangeLog.pre-2-817
-rw-r--r--gtk/gtkliststore.c63
-rw-r--r--gtk/gtktreedatalist.c233
-rw-r--r--gtk/gtktreedatalist.h3
-rw-r--r--gtk/gtktreeselection.c68
-rw-r--r--gtk/gtktreestore.c77
-rw-r--r--gtk/gtktreeview.c1
13 files changed, 384 insertions, 180 deletions
diff --git a/ChangeLog b/ChangeLog
index 5a90922c7b..154483afe4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make
+ select_all not work if you're in SINGLE mode (it doesn't make that
+ much sense, anyway.)
+
+ * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
+ handle types more sanely.
+ (_gtk_tree_data_list_value_to_node): handle types more sanely.
+ (_gtk_tree_data_list_node_copy): handle types more sanely.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
Wed Mar 7 20:47:41 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c gtk/gtkoldeditable.[ch] gdk/gdk.[ch]
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index 5a90922c7b..154483afe4 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,20 @@
+Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make
+ select_all not work if you're in SINGLE mode (it doesn't make that
+ much sense, anyway.)
+
+ * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
+ handle types more sanely.
+ (_gtk_tree_data_list_value_to_node): handle types more sanely.
+ (_gtk_tree_data_list_node_copy): handle types more sanely.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
Wed Mar 7 20:47:41 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c gtk/gtkoldeditable.[ch] gdk/gdk.[ch]
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 5a90922c7b..154483afe4 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,20 @@
+Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make
+ select_all not work if you're in SINGLE mode (it doesn't make that
+ much sense, anyway.)
+
+ * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
+ handle types more sanely.
+ (_gtk_tree_data_list_value_to_node): handle types more sanely.
+ (_gtk_tree_data_list_node_copy): handle types more sanely.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
Wed Mar 7 20:47:41 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c gtk/gtkoldeditable.[ch] gdk/gdk.[ch]
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index 5a90922c7b..154483afe4 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,20 @@
+Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make
+ select_all not work if you're in SINGLE mode (it doesn't make that
+ much sense, anyway.)
+
+ * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
+ handle types more sanely.
+ (_gtk_tree_data_list_value_to_node): handle types more sanely.
+ (_gtk_tree_data_list_node_copy): handle types more sanely.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
Wed Mar 7 20:47:41 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c gtk/gtkoldeditable.[ch] gdk/gdk.[ch]
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 5a90922c7b..154483afe4 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,20 @@
+Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make
+ select_all not work if you're in SINGLE mode (it doesn't make that
+ much sense, anyway.)
+
+ * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
+ handle types more sanely.
+ (_gtk_tree_data_list_value_to_node): handle types more sanely.
+ (_gtk_tree_data_list_node_copy): handle types more sanely.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
Wed Mar 7 20:47:41 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c gtk/gtkoldeditable.[ch] gdk/gdk.[ch]
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 5a90922c7b..154483afe4 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,20 @@
+Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make
+ select_all not work if you're in SINGLE mode (it doesn't make that
+ much sense, anyway.)
+
+ * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
+ handle types more sanely.
+ (_gtk_tree_data_list_value_to_node): handle types more sanely.
+ (_gtk_tree_data_list_node_copy): handle types more sanely.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
Wed Mar 7 20:47:41 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c gtk/gtkoldeditable.[ch] gdk/gdk.[ch]
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 5a90922c7b..154483afe4 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,20 @@
+Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make
+ select_all not work if you're in SINGLE mode (it doesn't make that
+ much sense, anyway.)
+
+ * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value):
+ handle types more sanely.
+ (_gtk_tree_data_list_value_to_node): handle types more sanely.
+ (_gtk_tree_data_list_node_copy): handle types more sanely.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with
+ GValue better. Converts the type as well.
+
Wed Mar 7 20:47:41 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c gtk/gtkoldeditable.[ch] gdk/gdk.[ch]
diff --git a/gtk/gtkliststore.c b/gtk/gtkliststore.c
index 53a13e29fa..123308d07e 100644
--- a/gtk/gtkliststore.c
+++ b/gtk/gtkliststore.c
@@ -236,7 +236,17 @@ gtk_list_store_new_with_types (gint n_columns,
va_start (args, n_columns);
for (i = 0; i < n_columns; i++)
- gtk_list_store_set_column_type (retval, i, va_arg (args, GType));
+ {
+ GType type = va_arg (args, GType);
+ if (! _gtk_tree_data_list_check_type (type))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_list_store_new_with_types\n", G_STRLOC, g_type_name (type));
+ g_object_unref (G_OBJECT (retval));
+ return NULL;
+ }
+
+ gtk_list_store_set_column_type (retval, i, type);
+ }
va_end (args);
@@ -287,9 +297,9 @@ gtk_list_store_set_n_columns (GtkListStore *list_store,
* @type: type of the data stored in @column
*
* Supported types include: %G_TYPE_UINT, %G_TYPE_INT, %G_TYPE_UCHAR,
- * %G_TYPE_CHAR, %G_TYPE_BOOLEAN, %G_TYPE_POINTER, %G_TYPE_FLOAT, %G_TYPE_STRING,
- * %G_TYPE_OBJECT, and %G_TYPE_BOXED, along with subclasses of those types such
- * as %GDK_TYPE_PIXBUF.
+ * %G_TYPE_CHAR, %G_TYPE_BOOLEAN, %G_TYPE_POINTER, %G_TYPE_FLOAT,
+ * %G_TYPE_DOUBLE, %G_TYPE_STRING, %G_TYPE_OBJECT, and %G_TYPE_BOXED, along with
+ * subclasses of those types such as %GDK_TYPE_PIXBUF.
*
**/
void
@@ -300,6 +310,11 @@ gtk_list_store_set_column_type (GtkListStore *list_store,
g_return_if_fail (list_store != NULL);
g_return_if_fail (GTK_IS_LIST_STORE (list_store));
g_return_if_fail (column >=0 && column < list_store->n_columns);
+ if (!_gtk_tree_data_list_check_type (type))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_list_store_new_with_types\n", G_STRLOC, g_type_name (type));
+ return;
+ }
list_store->column_headers[column] = type;
}
@@ -525,11 +540,37 @@ gtk_list_store_set_cell (GtkListStore *list_store,
GtkTreeDataList *list;
GtkTreeDataList *prev;
GtkTreePath *path;
+ GValue real_value = {0, };
+ gboolean converted = FALSE;
g_return_if_fail (list_store != NULL);
g_return_if_fail (GTK_IS_LIST_STORE (list_store));
g_return_if_fail (iter != NULL);
g_return_if_fail (column >= 0 && column < list_store->n_columns);
+ g_return_if_fail (value != NULL);
+
+ if (! g_type_is_a (G_VALUE_TYPE (value), column->type))
+ {
+ if (! (g_value_type_compatible (G_VALUE_TYPE (value), column->type) &&
+ g_value_type_compatible (column->type, G_VALUE_TYPE (value))))
+ {
+ g_warning ("%s: Unable to convert from %s to %s\n",
+ G_STRLOC,
+ g_type_name (G_VALUE_TYPE (value)),
+ g_type_name (column->type));
+ return;
+ }
+ if (!g_value_transform (value, &real_value))
+ {
+ g_warning ("%s: Unable to make conversion from %s to %s\n",
+ G_STRLOC,
+ g_type_name (G_VALUE_TYPE (value)),
+ g_type_name (column->type));
+ g_value_unset (&real_value);
+ return;
+ }
+ converted = TRUE;
+ }
prev = list = G_SLIST (iter->user_data)->data;
@@ -538,9 +579,14 @@ gtk_list_store_set_cell (GtkListStore *list_store,
if (column == 0)
{
path = gtk_list_store_get_path (GTK_TREE_MODEL (list_store), iter);
- _gtk_tree_data_list_value_to_node (list, value);
+ if (converted)
+ _gtk_tree_data_list_value_to_node (list, &real_value);
+ else
+ _gtk_tree_data_list_value_to_node (list, value);
gtk_tree_model_changed (GTK_TREE_MODEL (list_store), path, iter);
gtk_tree_path_free (path);
+ if (converted)
+ g_value_unset (&real_value);
return;
}
@@ -569,9 +615,14 @@ gtk_list_store_set_cell (GtkListStore *list_store,
}
path = gtk_list_store_get_path (GTK_TREE_MODEL (list_store), iter);
- _gtk_tree_data_list_value_to_node (list, value);
+ if (converted)
+ _gtk_tree_data_list_value_to_node (list, real_value);
+ else
+ _gtk_tree_data_list_value_to_node (list, value);
gtk_tree_model_changed (GTK_TREE_MODEL (list_store), path, iter);
gtk_tree_path_free (path);
+ if (converted)
+ g_value_unset (&real_value);
}
/**
diff --git a/gtk/gtktreedatalist.c b/gtk/gtktreedatalist.c
index c0ff3fb7a9..099e01ee6f 100644
--- a/gtk/gtktreedatalist.c
+++ b/gtk/gtktreedatalist.c
@@ -126,17 +126,12 @@ _gtk_tree_data_list_free (GtkTreeDataList *list,
for (tmp = list; tmp; tmp = tmp->next)
{
- switch (column_headers [i])
- {
- case G_TYPE_STRING:
- g_free ((gchar *) tmp->data.v_pointer);
- break;
- case G_TYPE_OBJECT:
- g_object_unref (G_OBJECT (tmp->data.v_pointer));
- break;
- default:
- break;
- }
+ if (g_type_is_a (column_headers [i], G_TYPE_STRING))
+ g_free ((gchar *) tmp->data.v_pointer);
+ else if (g_type_is_a (column_headers [i], G_TYPE_OBJECT))
+ g_object_unref (G_OBJECT (tmp->data.v_pointer));
+ else if (g_type_is_a (column_headers [i], G_TYPE_BOXED))
+ g_boxed_free (column_headers [i], (gpointer) tmp->data.v_pointer);
i++;
}
@@ -146,6 +141,38 @@ _gtk_tree_data_list_free (GtkTreeDataList *list,
G_UNLOCK (current_allocator);
}
+gboolean
+_gtk_tree_data_list_check_type (GType type)
+{
+ gint i = 0;
+
+ static GType type_list[] =
+ {
+ G_TYPE_BOOLEAN,
+ G_TYPE_CHAR,
+ G_TYPE_UCHAR,
+ G_TYPE_INT,
+ G_TYPE_UINT,
+ G_TYPE_ENUM,
+ G_TYPE_FLAGS,
+ G_TYPE_FLOAT,
+ G_TYPE_DOUBLE,
+ G_TYPE_STRING,
+ G_TYPE_POINTER,
+ G_TYPE_BOXED,
+ G_TYPE_OBJECT,
+ G_TYPE_INVALID
+ };
+
+ while (type_list[i] != G_TYPE_INVALID)
+ {
+ if (g_type_is_a (type, type_list[i]))
+ return TRUE;
+ i++;
+ }
+ return FALSE;
+}
+
void
_gtk_tree_data_list_node_to_value (GtkTreeDataList *list,
GType type,
@@ -153,83 +180,68 @@ _gtk_tree_data_list_node_to_value (GtkTreeDataList *list,
{
g_value_init (value, type);
- switch (type)
- {
- case G_TYPE_BOOLEAN:
- g_value_set_boolean (value, (gboolean) list->data.v_int);
- break;
- case G_TYPE_CHAR:
- g_value_set_char (value, list->data.v_char);
- break;
- case G_TYPE_UCHAR:
- g_value_set_uchar (value, list->data.v_uchar);
- break;
- case G_TYPE_INT:
- g_value_set_int (value, list->data.v_int);
- break;
- case G_TYPE_UINT:
- g_value_set_uint (value, list->data.v_uint);
- break;
- case G_TYPE_POINTER:
- g_value_set_pointer (value, (gpointer) list->data.v_pointer);
- break;
- case G_TYPE_FLOAT:
- g_value_set_float (value, list->data.v_float);
- break;
- case G_TYPE_STRING:
- g_value_set_string (value, (gchar *) list->data.v_pointer);
- break;
-
- default:
- if (g_type_is_a (type, G_TYPE_OBJECT))
- g_value_set_object (value, (GObject *) list->data.v_pointer);
- else if (g_type_is_a (type, G_TYPE_BOXED))
- g_value_set_boxed (value, (GObject *) list->data.v_pointer);
- else
- g_warning ("Unsupported type (%s) retrieved.", g_type_name (value->g_type));
- break;
- }
+ if (g_type_is_a (type, G_TYPE_BOOLEAN))
+ g_value_set_boolean (value, (gboolean) list->data.v_int);
+ else if (g_type_is_a (type, G_TYPE_CHAR))
+ g_value_set_char (value, (gchar) list->data.v_char);
+ else if (g_type_is_a (type, G_TYPE_UCHAR))
+ g_value_set_uchar (value, (guchar) list->data.v_uchar);
+ else if (g_type_is_a (type, G_TYPE_INT))
+ g_value_set_int (value, (gint) list->data.v_int);
+ else if (g_type_is_a (type, G_TYPE_UINT))
+ g_value_set_uint (value, (guint) list->data.v_uint);
+ else if (g_type_is_a (type, G_TYPE_ENUM))
+ g_value_set_enum (value, list->data.v_int);
+ else if (g_type_is_a (type, G_TYPE_FLAGS))
+ g_value_set_flags (value, (int) list->data.v_int);
+ else if (g_type_is_a (type, G_TYPE_FLOAT))
+ g_value_set_float (value, (gfloat) list->data.v_float);
+ else if (g_type_is_a (type, G_TYPE_DOUBLE))
+ g_value_set_double (value, (gdouble) list->data.v_double);
+ else if (g_type_is_a (type, G_TYPE_STRING))
+ g_value_set_string (value, (gchar *) list->data.v_pointer);
+ else if (g_type_is_a (type, G_TYPE_POINTER))
+ g_value_set_pointer (value, (gpointer) list->data.v_pointer);
+ else if (g_type_is_a (type, G_TYPE_BOXED))
+ g_value_set_boxed (value, (gpointer) list->data.v_pointer);
+ else if (g_type_is_a (type, G_TYPE_OBJECT))
+ g_value_set_object (value, (GObject *) list->data.v_pointer);
+ else
+ g_warning ("%s: Unsupported type (%s) retrieved.", G_STRLOC, g_type_name (value->g_type));
}
void
_gtk_tree_data_list_value_to_node (GtkTreeDataList *list,
GValue *value)
{
- switch (value->g_type)
- {
- case G_TYPE_BOOLEAN:
- list->data.v_int = g_value_get_boolean (value);
- break;
- case G_TYPE_CHAR:
- list->data.v_char = g_value_get_char (value);
- break;
- case G_TYPE_UCHAR:
- list->data.v_uchar = g_value_get_uchar (value);
- break;
- case G_TYPE_INT:
- list->data.v_int = g_value_get_int (value);
- break;
- case G_TYPE_UINT:
- list->data.v_uint = g_value_get_uint (value);
- break;
- case G_TYPE_POINTER:
- list->data.v_pointer = g_value_get_pointer (value);
- break;
- case G_TYPE_FLOAT:
- list->data.v_float = g_value_get_float (value);
- break;
- case G_TYPE_STRING:
- list->data.v_pointer = g_value_dup_string (value);
- break;
- default:
- if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_OBJECT))
- list->data.v_pointer = g_value_dup_object (value);
- else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_BOXED))
- list->data.v_pointer = g_value_dup_boxed (value);
- else
- g_warning ("Unsupported type (%s) stored.", g_type_name (value->g_type));
- break;
- }
+ if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_BOOLEAN))
+ list->data.v_int = g_value_get_boolean (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_CHAR))
+ list->data.v_char = g_value_get_char (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_UCHAR))
+ list->data.v_uchar = g_value_get_uchar (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_INT))
+ list->data.v_int = g_value_get_int (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_ENUM))
+ list->data.v_int = g_value_get_enum (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_FLAGS))
+ list->data.v_int = g_value_get_flags (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_UINT))
+ list->data.v_uint = g_value_get_uint (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_POINTER))
+ list->data.v_pointer = g_value_get_pointer (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_FLOAT))
+ list->data.v_float = g_value_get_float (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_DOUBLE))
+ list->data.v_double = g_value_get_double (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_STRING))
+ list->data.v_pointer = g_value_dup_string (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_OBJECT))
+ list->data.v_pointer = g_value_dup_object (value);
+ else if (g_type_is_a (G_VALUE_TYPE (value), G_TYPE_BOXED))
+ list->data.v_pointer = g_value_dup_boxed (value);
+ else
+ g_warning ("%s: Unsupported type (%s) stored.", G_STRLOC, g_type_name (G_VALUE_TYPE (value)));
}
GtkTreeDataList*
@@ -243,41 +255,34 @@ _gtk_tree_data_list_node_copy (GtkTreeDataList *list,
new_list = _gtk_tree_data_list_alloc ();
new_list->next = NULL;
- switch (type)
- {
- case G_TYPE_UINT:
- case G_TYPE_INT:
- case G_TYPE_UCHAR:
- case G_TYPE_CHAR:
- case G_TYPE_BOOLEAN:
- case G_TYPE_POINTER:
- case G_TYPE_FLOAT:
- new_list->data = list->data;
- break;
+ if ((g_type_is_a (type, G_TYPE_UINT)) ||
+ (g_type_is_a (type, G_TYPE_INT)) ||
+ (g_type_is_a (type, G_TYPE_UCHAR)) ||
+ (g_type_is_a (type, G_TYPE_CHAR)) ||
+ (g_type_is_a (type, G_TYPE_BOOLEAN)) ||
+ (g_type_is_a (type, G_TYPE_POINTER)) ||
+ (g_type_is_a (type, G_TYPE_FLOAT)) ||
+ (g_type_is_a (type, G_TYPE_DOUBLE)))
+ new_list->data = list->data;
- case G_TYPE_STRING:
- new_list->data.v_pointer = g_strdup (list->data.v_pointer);
- break;
-
- default:
- if (g_type_is_a (type, G_TYPE_OBJECT))
- {
- new_list->data.v_pointer = list->data.v_pointer;
- if (new_list->data.v_pointer)
- g_object_ref (G_OBJECT (new_list->data.v_pointer));
- }
- else if (g_type_is_a (type, G_TYPE_BOXED))
- {
- if (list->data.v_pointer)
- new_list->data.v_pointer = g_boxed_copy (type, list->data.v_pointer);
- else
- new_list->data.v_pointer = NULL;
- }
+ else if (g_type_is_a (type, G_TYPE_STRING))
+ new_list->data.v_pointer = g_strdup (list->data.v_pointer);
+ else if (g_type_is_a (type, G_TYPE_OBJECT))
+ {
+ new_list->data.v_pointer = list->data.v_pointer;
+ if (new_list->data.v_pointer)
+ g_object_ref (G_OBJECT (new_list->data.v_pointer));
+ }
+ else if (g_type_is_a (type, G_TYPE_BOXED))
+ {
+ if (list->data.v_pointer)
+ new_list->data.v_pointer = g_boxed_copy (type, list->data.v_pointer);
else
- g_warning ("Unsupported node type (%s) copied.", g_type_name (type));
- break;
+ new_list->data.v_pointer = NULL;
}
-
+ else
+ g_warning ("Unsupported node type (%s) copied.", g_type_name (type));
+
return new_list;
}
diff --git a/gtk/gtktreedatalist.h b/gtk/gtktreedatalist.h
index cdcf602da1..3bd24ddf5a 100644
--- a/gtk/gtktreedatalist.h
+++ b/gtk/gtktreedatalist.h
@@ -35,15 +35,18 @@ struct _GtkTreeDataList
guint8 v_uchar;
guint v_uint;
gfloat v_float;
+ gdouble v_double;
gpointer v_pointer;
} data;
};
+
void _gtk_tree_data_list_push_allocator (GAllocator *allocator);
void _gtk_tree_data_list_pop_allocator (void);
GtkTreeDataList *_gtk_tree_data_list_alloc (void);
void _gtk_tree_data_list_free (GtkTreeDataList *list,
GType *column_headers);
+gboolean _gtk_tree_data_list_check_type (GType type);
void _gtk_tree_data_list_node_to_value (GtkTreeDataList *list,
GType type,
GValue *value);
diff --git a/gtk/gtktreeselection.c b/gtk/gtktreeselection.c
index 5e81a11616..02629ebff3 100644
--- a/gtk/gtktreeselection.c
+++ b/gtk/gtktreeselection.c
@@ -602,68 +602,35 @@ static gint
gtk_tree_selection_real_select_all (GtkTreeSelection *selection)
{
struct _TempTuple *tuple;
+
if (selection->tree_view->priv->tree == NULL)
return FALSE;
- if (selection->type == GTK_TREE_SELECTION_SINGLE)
- {
- GtkRBTree *tree;
- GtkRBNode *node;
- gint dirty;
-
- /* Just select the last row */
-
- dirty = gtk_tree_selection_real_unselect_all (selection);
-
- tree = selection->tree_view->priv->tree;
- node = tree->root;
- do
- {
- while (node->right != selection->tree_view->priv->tree->nil)
- node = node->right;
-
- if (node->children)
- {
- tree = node->children;
- node = tree->root;
- }
- else
- break;
- } while (TRUE);
-
- dirty |= gtk_tree_selection_real_select_node (selection, tree, node, TRUE);
-
- return dirty;
- }
- else
+ /* Mark all nodes selected */
+ tuple = g_new (struct _TempTuple, 1);
+ tuple->selection = selection;
+ tuple->dirty = FALSE;
+
+ _gtk_rbtree_traverse (selection->tree_view->priv->tree,
+ selection->tree_view->priv->tree->root,
+ G_PRE_ORDER,
+ select_all_helper,
+ tuple);
+ if (tuple->dirty)
{
- /* Mark all nodes selected */
-
- tuple = g_new (struct _TempTuple, 1);
- tuple->selection = selection;
- tuple->dirty = FALSE;
-
- _gtk_rbtree_traverse (selection->tree_view->priv->tree,
- selection->tree_view->priv->tree->root,
- G_PRE_ORDER,
- select_all_helper,
- tuple);
- if (tuple->dirty)
- {
- g_free (tuple);
- return TRUE;
- }
g_free (tuple);
- return FALSE;
+ return TRUE;
}
+ g_free (tuple);
+ return FALSE;
}
/**
* gtk_tree_selection_select_all:
* @selection: A #GtkTreeSelection.
*
- * Selects all the nodes. If the type of @selection is
- * #GTK_TREE_SELECTION_SINGLE, then the last row is selected.
+ * Selects all the nodes. @selection is must be set to
+ * #GTK_TREE_SELECTION_MULTI mode.
**/
void
gtk_tree_selection_select_all (GtkTreeSelection *selection)
@@ -672,6 +639,7 @@ gtk_tree_selection_select_all (GtkTreeSelection *selection)
g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
g_return_if_fail (selection->tree_view != NULL);
g_return_if_fail (selection->tree_view->priv->tree != NULL);
+ g_return_if_fail (selection->type != GTK_TREE_SELECTION_MULTI);
if (gtk_tree_selection_real_select_all (selection))
gtk_signal_emit (GTK_OBJECT (selection), tree_selection_signals[SELECTION_CHANGED]);
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c
index d26e3a21ca..f632ed3460 100644
--- a/gtk/gtktreestore.c
+++ b/gtk/gtktreestore.c
@@ -213,8 +213,16 @@ gtk_tree_store_new_with_types (gint n_columns,
va_start (args, n_columns);
for (i = 0; i < n_columns; i++)
- gtk_tree_store_set_column_type (retval, i, va_arg (args, GType));
-
+ {
+ GType type = va_arg (args, GType);
+ if (! _gtk_tree_data_list_check_type (type))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_tree_store_new_with_types\n", G_STRLOC, g_type_name (type));
+ g_object_unref (G_OBJECT (retval));
+ return NULL;
+ }
+ gtk_tree_store_set_column_type (retval, i, type);
+ }
va_end (args);
return retval;
@@ -248,6 +256,18 @@ gtk_tree_store_set_n_columns (GtkTreeStore *tree_store,
tree_store->n_columns = n_columns;
}
+/**
+ * gtk_tree_store_set_column_type:
+ * @tree_store: a #GtkTreeStore
+ * @column: column number
+ * @type: type of the data to be stored in @column
+ *
+ * Supported types include: %G_TYPE_UINT, %G_TYPE_INT, %G_TYPE_UCHAR,
+ * %G_TYPE_CHAR, %G_TYPE_BOOLEAN, %G_TYPE_POINTER, %G_TYPE_FLOAT,
+ * %G_TYPE_DOUBLE, %G_TYPE_STRING, %G_TYPE_OBJECT, and %G_TYPE_BOXED, along with
+ * subclasses of those types such as %GDK_TYPE_PIXBUF.
+ *
+ **/
void
gtk_tree_store_set_column_type (GtkTreeStore *tree_store,
gint column,
@@ -256,7 +276,11 @@ gtk_tree_store_set_column_type (GtkTreeStore *tree_store,
g_return_if_fail (tree_store != NULL);
g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
g_return_if_fail (column >=0 && column < tree_store->n_columns);
-
+ if (!_gtk_tree_data_list_check_type (type))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_tree_store_new_with_types\n", G_STRLOC, g_type_name (type));
+ return;
+ }
tree_store->column_headers[column] = type;
}
@@ -533,10 +557,36 @@ gtk_tree_store_set_cell (GtkTreeStore *tree_store,
GtkTreeDataList *list;
GtkTreeDataList *prev;
GtkTreePath *path = NULL;
+ GValue real_value = {0, };
+ gboolean converted = FALSE;
g_return_if_fail (tree_store != NULL);
g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
g_return_if_fail (column >= 0 && column < tree_store->n_columns);
+ g_return_if_fail (value != NULL);
+
+ if (! g_type_is_a (G_VALUE_TYPE (value), column->type))
+ {
+ if (! (g_value_type_compatible (G_VALUE_TYPE (value), column->type) &&
+ g_value_type_compatible (column->type, G_VALUE_TYPE (value))))
+ {
+ g_warning ("%s: Unable to convert from %s to %s\n",
+ G_STRLOC,
+ g_type_name (G_VALUE_TYPE (value)),
+ g_type_name (column->type));
+ return;
+ }
+ if (!g_value_transform (value, &real_value))
+ {
+ g_warning ("%s: Unable to make conversion from %s to %s\n",
+ G_STRLOC,
+ g_type_name (G_VALUE_TYPE (value)),
+ g_type_name (column->type));
+ g_value_unset (&real_value);
+ return;
+ }
+ converted = TRUE;
+ }
prev = list = G_NODE (iter->user_data)->data;
@@ -546,9 +596,14 @@ gtk_tree_store_set_cell (GtkTreeStore *tree_store,
{
if (column == 0)
{
- _gtk_tree_data_list_value_to_node (list, value);
+ if (converted)
+ _gtk_tree_data_list_value_to_node (list, &real_value);
+ else
+ _gtk_tree_data_list_value_to_node (list, value);
gtk_tree_model_changed (GTK_TREE_MODEL (tree_store), path, iter);
gtk_tree_path_free (path);
+ if (converted)
+ g_value_unset (&real_value);
return;
}
@@ -575,9 +630,14 @@ gtk_tree_store_set_cell (GtkTreeStore *tree_store,
list->next = NULL;
column --;
}
- _gtk_tree_data_list_value_to_node (list, value);
+ if (converted)
+ _gtk_tree_data_list_value_to_node (list, real_value);
+ else
+ _gtk_tree_data_list_value_to_node (list, value);
gtk_tree_model_changed (GTK_TREE_MODEL (tree_store), path, iter);
gtk_tree_path_free (path);
+ if (converted)
+ g_value_unset (&real_value);
}
/**
@@ -1004,8 +1064,7 @@ copy_node_data (GtkTreeStore *tree_store,
col = 0;
while (dl)
{
- copy_iter = _gtk_tree_data_list_node_copy (dl,
- tree_store->column_headers[col]);
+ copy_iter = _gtk_tree_data_list_node_copy (dl, tree_store->column_headers[col]);
if (copy_head == NULL)
copy_head = copy_iter;
@@ -1018,10 +1077,10 @@ copy_node_data (GtkTreeStore *tree_store,
dl = dl->next;
++col;
}
-
+
G_NODE (dest_iter->user_data)->data = copy_head;
- path = gtk_tree_store_get_path (tree_store, dest_iter);
+ path = gtk_tree_store_get_path (GTK_TREE_MODEL (tree_store), dest_iter);
gtk_tree_model_changed (GTK_TREE_MODEL (tree_store), path, dest_iter);
gtk_tree_path_free (path);
}
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index e6d119f8ef..b61ddd8efd 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -35,7 +35,6 @@
#include <gdk/gdkkeysyms.h>
-
/* The "background" areas of all rows/cells add up to cover the entire tree.
* The background includes all inter-row and inter-cell spacing.
* The "cell" areas are the cell_area passed in to gtk_cell_renderer_render(),