]> Pileus Git - ~andy/gtk/blob - gtk/gtktreedatalist.c
Fix up focus code a lot.
[~andy/gtk] / gtk / gtktreedatalist.c
1 /* gtktreedatalist.c
2  * Copyright (C) 2000  Red Hat, Inc.,  Jonathan Blandford <jrb@redhat.com>
3  *
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.
8  *
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.
13  *
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.
18  */
19
20 #include "gtktreedatalist.h"
21
22 static GMemChunk *tree_chunk = NULL;
23 #define TREE_CHUNK_PREALLOCS 64
24
25 /* node allocation
26  */
27 GtkTreeDataList *
28 _gtk_tree_data_list_alloc (void)
29 {
30   GtkTreeDataList *list;
31
32   if (tree_chunk == NULL)
33     tree_chunk = g_mem_chunk_new ("treedatalist mem chunk",
34                                   sizeof (GtkTreeDataList),
35                                   sizeof (GtkTreeDataList) * TREE_CHUNK_PREALLOCS,
36                                   G_ALLOC_AND_FREE);
37
38   list = g_chunk_new (GtkTreeDataList, tree_chunk);
39
40   return list;
41 }
42
43 void
44 _gtk_tree_data_list_free (GtkTreeDataList *list,
45                           GType           *column_headers)
46 {
47   GtkTreeDataList *tmp, *next;
48   gint i = 0;
49
50   tmp = list;
51
52   while (tmp)
53     {
54       next = tmp->next;
55       if (g_type_is_a (column_headers [i], G_TYPE_STRING))
56         g_free ((gchar *) tmp->data.v_pointer);
57       else if (g_type_is_a (column_headers [i], G_TYPE_OBJECT))
58         g_object_unref (G_OBJECT (tmp->data.v_pointer));
59       else if (g_type_is_a (column_headers [i], G_TYPE_BOXED))
60         g_boxed_free (column_headers [i], (gpointer) tmp->data.v_pointer);
61
62       g_mem_chunk_free (tree_chunk, tmp);
63       i++;
64       tmp = next;
65     }
66 }
67
68 gboolean
69 _gtk_tree_data_list_check_type (GType type)
70 {
71   gint i = 0;
72   static GType type_list[] =
73   {
74     G_TYPE_BOOLEAN,
75     G_TYPE_CHAR,
76     G_TYPE_UCHAR,
77     G_TYPE_INT,
78     G_TYPE_UINT,
79     G_TYPE_ENUM,
80     G_TYPE_FLAGS,
81     G_TYPE_FLOAT,
82     G_TYPE_DOUBLE,
83     G_TYPE_STRING,
84     G_TYPE_POINTER,
85     G_TYPE_BOXED,
86     G_TYPE_OBJECT,
87     G_TYPE_INVALID
88   };
89
90   if (! G_TYPE_IS_VALUE_TYPE (type))
91     return FALSE;
92
93
94   while (type_list[i] != G_TYPE_INVALID)
95     {
96       if (g_type_is_a (type, type_list[i]))
97         return TRUE;
98       i++;
99     }
100   return FALSE;
101 }
102
103 void
104 _gtk_tree_data_list_node_to_value (GtkTreeDataList *list,
105                                    GType            type,
106                                    GValue          *value)
107 {
108   g_value_init (value, type);
109
110   switch (G_TYPE_FUNDAMENTAL (type))
111     {
112     case G_TYPE_BOOLEAN:
113       g_value_set_boolean (value, (gboolean) list->data.v_int);
114       break;
115     case G_TYPE_CHAR:
116       g_value_set_char (value, (gchar) list->data.v_char);
117       break;
118     case G_TYPE_UCHAR:
119       g_value_set_uchar (value, (guchar) list->data.v_uchar);
120       break;
121     case G_TYPE_INT:
122       g_value_set_int (value, (gint) list->data.v_int);
123       break;
124     case G_TYPE_UINT:
125       g_value_set_uint (value, (guint) list->data.v_uint);
126       break;
127     case G_TYPE_ENUM:
128       g_value_set_enum (value, list->data.v_int);
129       break;
130     case G_TYPE_FLAGS:
131       g_value_set_flags (value, (int) list->data.v_int);
132       break;
133     case G_TYPE_FLOAT:
134       g_value_set_float (value, (gfloat) list->data.v_float);
135       break;
136     case G_TYPE_DOUBLE:
137       g_value_set_double (value, (gdouble) list->data.v_double);
138       break;
139     case G_TYPE_STRING:
140       g_value_set_string (value, (gchar *) list->data.v_pointer);
141       break;
142     case G_TYPE_POINTER:
143       g_value_set_pointer (value, (gpointer) list->data.v_pointer);
144       break;
145     case G_TYPE_BOXED:
146       g_value_set_boxed (value, (gpointer) list->data.v_pointer);
147       break;
148     case G_TYPE_OBJECT:
149       g_value_set_object (value, (GObject *) list->data.v_pointer);
150       break;
151     default:
152       g_warning ("%s: Unsupported type (%s) retrieved.", G_STRLOC, g_type_name (value->g_type));
153       break;
154     }
155 }
156
157 void
158 _gtk_tree_data_list_value_to_node (GtkTreeDataList *list,
159                                    GValue          *value)
160 {
161   switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)))
162     {
163     case G_TYPE_BOOLEAN:
164       list->data.v_int = g_value_get_boolean (value);
165       break;
166     case G_TYPE_CHAR:
167       list->data.v_char = g_value_get_char (value);
168       break;
169     case G_TYPE_UCHAR:
170       list->data.v_uchar = g_value_get_uchar (value);
171       break;
172     case G_TYPE_INT:
173       list->data.v_int = g_value_get_int (value);
174       break;
175     case G_TYPE_ENUM:
176       list->data.v_int = g_value_get_enum (value);
177       break;
178     case G_TYPE_FLAGS:
179       list->data.v_int = g_value_get_flags (value);
180       break;
181     case G_TYPE_UINT:
182       list->data.v_uint = g_value_get_uint (value);
183       break;
184     case G_TYPE_POINTER:
185       list->data.v_pointer = g_value_get_pointer (value);
186       break;
187     case G_TYPE_FLOAT:
188       list->data.v_float = g_value_get_float (value);
189       break;
190     case G_TYPE_DOUBLE:
191       list->data.v_double = g_value_get_double (value);
192       break;
193     case G_TYPE_STRING:
194       list->data.v_pointer = g_value_dup_string (value);
195       break;
196     case G_TYPE_OBJECT:
197       list->data.v_pointer = g_value_dup_object (value);
198       break;
199     case G_TYPE_BOXED:
200       list->data.v_pointer = g_value_dup_boxed (value);
201       break;
202     default:
203       g_warning ("%s: Unsupported type (%s) stored.", G_STRLOC, g_type_name (G_VALUE_TYPE (value)));
204       break;
205     }
206 }
207
208 GtkTreeDataList *
209 _gtk_tree_data_list_node_copy (GtkTreeDataList *list,
210                                GType            type)
211 {
212   GtkTreeDataList *new_list;
213
214   g_return_val_if_fail (list != NULL, NULL);
215   
216   new_list = _gtk_tree_data_list_alloc ();
217   new_list->next = NULL;
218
219   switch (G_TYPE_FUNDAMENTAL (type))
220     {
221     case G_TYPE_UINT:
222     case G_TYPE_INT:
223     case G_TYPE_UCHAR:
224     case G_TYPE_CHAR:
225     case G_TYPE_BOOLEAN:
226     case G_TYPE_POINTER:
227     case G_TYPE_FLOAT:
228     case G_TYPE_DOUBLE:
229       new_list->data = list->data;
230       break;
231     case G_TYPE_STRING:
232       new_list->data.v_pointer = g_strdup (list->data.v_pointer);
233       break;
234     case G_TYPE_OBJECT:
235       new_list->data.v_pointer = list->data.v_pointer;
236       if (new_list->data.v_pointer)
237         g_object_ref (G_OBJECT (new_list->data.v_pointer));
238       break;
239     case G_TYPE_BOXED:
240       if (list->data.v_pointer)
241         new_list->data.v_pointer = g_boxed_copy (type, list->data.v_pointer);
242       else
243         new_list->data.v_pointer = NULL;
244       break;
245     default:
246       g_warning ("Unsupported node type (%s) copied.", g_type_name (type));
247       break;
248     }
249
250   return new_list;
251 }
252