| |
1 /* gtkcelllayout.c |
| |
2 * Copyright (C) 2003 Kristian Rietveld <kris@gtk.org> |
| |
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 /* |
| |
21 #include <config.h> |
| |
22 */ |
| |
23 #include <gtk/gtkversion.h> |
| |
24 #if !GTK_CHECK_VERSION(2,4,0) |
| |
25 #include "gtkcelllayout.h" |
| |
26 |
| |
27 GType |
| |
28 gtk_cell_layout_get_type (void) |
| |
29 { |
| |
30 static GType cell_layout_type = 0; |
| |
31 |
| |
32 if (! cell_layout_type) |
| |
33 { |
| |
34 static const GTypeInfo cell_layout_info = |
| |
35 { |
| |
36 sizeof (GtkCellLayoutIface), |
| |
37 NULL, |
| |
38 NULL, |
| |
39 NULL, |
| |
40 NULL, |
| |
41 NULL, |
| |
42 0, |
| |
43 0, |
| |
44 NULL |
| |
45 }; |
| |
46 |
| |
47 cell_layout_type = |
| |
48 g_type_register_static (G_TYPE_INTERFACE, "PidginCellLayout", |
| |
49 &cell_layout_info, 0); |
| |
50 |
| |
51 g_type_interface_add_prerequisite (cell_layout_type, G_TYPE_OBJECT); |
| |
52 } |
| |
53 |
| |
54 return cell_layout_type; |
| |
55 } |
| |
56 |
| |
57 /** |
| |
58 * gtk_cell_layout_pack_start: |
| |
59 * @cell_layout: A #GtkCellLayout. |
| |
60 * @cell: A #GtkCellRenderer. |
| |
61 * @expand: %TRUE if @cell is to be given extra space allocated to @cell_layout. |
| |
62 * |
| |
63 * Packs the @cell into the beginning of @cell_layout. If @expand is %FALSE, |
| |
64 * then the @cell is allocated no more space than it needs. Any unused space |
| |
65 * is divided evenly between cells for which @expand is %TRUE. |
| |
66 * |
| |
67 * Since: 2.4 |
| |
68 */ |
| |
69 void |
| |
70 gtk_cell_layout_pack_start (GtkCellLayout *cell_layout, |
| |
71 GtkCellRenderer *cell, |
| |
72 gboolean expand) |
| |
73 { |
| |
74 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
75 g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); |
| |
76 |
| |
77 (* GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->pack_start) (cell_layout, |
| |
78 cell, |
| |
79 expand); |
| |
80 } |
| |
81 |
| |
82 /** |
| |
83 * gtk_cell_layout_pack_end: |
| |
84 * @cell_layout: A #GtkCellLayout. |
| |
85 * @cell: A #GtkCellRenderer. |
| |
86 * @expand: %TRUE if @cell is to be given extra space allocated to @cell_layout. |
| |
87 * |
| |
88 * Adds the @cell to the end of @cell_layout. If @expand is %FALSE, then the |
| |
89 * @cell is allocated no more space than it needs. Any unused space is |
| |
90 * divided evenly between cells for which @expand is %TRUE. |
| |
91 * |
| |
92 * Since: 2.4 |
| |
93 */ |
| |
94 void |
| |
95 gtk_cell_layout_pack_end (GtkCellLayout *cell_layout, |
| |
96 GtkCellRenderer *cell, |
| |
97 gboolean expand) |
| |
98 { |
| |
99 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
100 g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); |
| |
101 |
| |
102 (* GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->pack_end) (cell_layout, |
| |
103 cell, |
| |
104 expand); |
| |
105 } |
| |
106 |
| |
107 /** |
| |
108 * gtk_cell_layout_clear: |
| |
109 * @cell_layout: A #GtkCellLayout. |
| |
110 * |
| |
111 * Unsets all the mappings on all renderers on @cell_layout and |
| |
112 * removes all renderers from @cell_layout. |
| |
113 * |
| |
114 * Since: 2.4 |
| |
115 */ |
| |
116 void |
| |
117 gtk_cell_layout_clear (GtkCellLayout *cell_layout) |
| |
118 { |
| |
119 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
120 |
| |
121 (* GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->clear) (cell_layout); |
| |
122 } |
| |
123 |
| |
124 static void |
| |
125 gtk_cell_layout_set_attributesv (GtkCellLayout *cell_layout, |
| |
126 GtkCellRenderer *cell, |
| |
127 va_list args) |
| |
128 { |
| |
129 gchar *attribute; |
| |
130 gint column; |
| |
131 GtkCellLayoutIface *iface; |
| |
132 |
| |
133 attribute = va_arg (args, gchar *); |
| |
134 |
| |
135 iface = GTK_CELL_LAYOUT_GET_IFACE (cell_layout); |
| |
136 |
| |
137 (* iface->clear_attributes) (cell_layout, cell); |
| |
138 |
| |
139 while (attribute != NULL) |
| |
140 { |
| |
141 column = va_arg (args, gint); |
| |
142 (* iface->add_attribute) (cell_layout, cell, attribute, column); |
| |
143 attribute = va_arg (args, gchar *); |
| |
144 } |
| |
145 } |
| |
146 |
| |
147 /** |
| |
148 * gtk_cell_layout_set_attributes: |
| |
149 * @cell_layout: A #GtkCellLayout. |
| |
150 * @cell: A #GtkCellRenderer. |
| |
151 * @Varargs: A %NULL-terminated list of attributes. |
| |
152 * |
| |
153 * Sets the attributes in list as the attributes of @cell_layout. The |
| |
154 * attributes should be in attribute/column order, as in |
| |
155 * gtk_cell_layout_add_attribute(). All existing attributes are removed, and |
| |
156 * replaced with the new attributes. |
| |
157 * |
| |
158 * Since: 2.4 |
| |
159 */ |
| |
160 void |
| |
161 gtk_cell_layout_set_attributes (GtkCellLayout *cell_layout, |
| |
162 GtkCellRenderer *cell, |
| |
163 ...) |
| |
164 { |
| |
165 va_list args; |
| |
166 |
| |
167 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
168 g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); |
| |
169 |
| |
170 va_start (args, cell); |
| |
171 gtk_cell_layout_set_attributesv (cell_layout, cell, args); |
| |
172 va_end (args); |
| |
173 } |
| |
174 |
| |
175 /** |
| |
176 * gtk_cell_layout_add_attribute: |
| |
177 * @cell_layout: A #GtkCellLayout. |
| |
178 * @cell: A #GtkCellRenderer. |
| |
179 * @attribute: An attribute on the renderer. |
| |
180 * @column: The column position on the model to get the attribute from. |
| |
181 * |
| |
182 * Adds an attribute mapping to the list in @cell_layout. The @column is the |
| |
183 * column of the model to get a value from, and the @attribute is the |
| |
184 * parameter on @cell to be set from the value. So for example if column 2 |
| |
185 * of the model contains strings, you could have the "text" attribute of a |
| |
186 * #GtkCellRendererText get its values from column 2. |
| |
187 * |
| |
188 * Since: 2.4 |
| |
189 */ |
| |
190 void |
| |
191 gtk_cell_layout_add_attribute (GtkCellLayout *cell_layout, |
| |
192 GtkCellRenderer *cell, |
| |
193 const gchar *attribute, |
| |
194 gint column) |
| |
195 { |
| |
196 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
197 g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); |
| |
198 g_return_if_fail (attribute != NULL); |
| |
199 g_return_if_fail (column >= 0); |
| |
200 |
| |
201 (* GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->add_attribute) (cell_layout, |
| |
202 cell, |
| |
203 attribute, |
| |
204 column); |
| |
205 } |
| |
206 |
| |
207 /** |
| |
208 * gtk_cell_layout_set_cell_data_func: |
| |
209 * @cell_layout: A #GtkCellLayout. |
| |
210 * @cell: A #GtkCellRenderer. |
| |
211 * @func: The #GtkCellLayoutDataFunc to use. |
| |
212 * @func_data: The user data for @func. |
| |
213 * @destroy: The destroy notification for @func_data. |
| |
214 * |
| |
215 * Sets the #GtkCellLayoutDataFunc to use for @cell_layout. This function |
| |
216 * is used instead of the standard attributes mapping for setting the |
| |
217 * column value, and should set the value of @cell_layout's cell renderer(s) |
| |
218 * as appropriate. @func may be %NULL to remove and older one. |
| |
219 * |
| |
220 * Since: 2.4 |
| |
221 */ |
| |
222 void |
| |
223 gtk_cell_layout_set_cell_data_func (GtkCellLayout *cell_layout, |
| |
224 GtkCellRenderer *cell, |
| |
225 GtkCellLayoutDataFunc func, |
| |
226 gpointer func_data, |
| |
227 GDestroyNotify destroy) |
| |
228 { |
| |
229 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
230 g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); |
| |
231 |
| |
232 (* GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->set_cell_data_func) (cell_layout, |
| |
233 cell, |
| |
234 func, |
| |
235 func_data, |
| |
236 destroy); |
| |
237 } |
| |
238 |
| |
239 /** |
| |
240 * gtk_cell_layout_clear_attributes: |
| |
241 * @cell_layout: A #GtkCellLayout. |
| |
242 * @cell: A #GtkCellRenderer to clear the attribute mapping on. |
| |
243 * |
| |
244 * Clears all existing attributes previously set with |
| |
245 * gtk_cell_layout_set_attributes(). |
| |
246 * |
| |
247 * Since: 2.4 |
| |
248 */ |
| |
249 void |
| |
250 gtk_cell_layout_clear_attributes (GtkCellLayout *cell_layout, |
| |
251 GtkCellRenderer *cell) |
| |
252 { |
| |
253 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
254 g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); |
| |
255 |
| |
256 (* GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->clear_attributes) (cell_layout, |
| |
257 cell); |
| |
258 } |
| |
259 |
| |
260 /** |
| |
261 * gtk_cell_layout_reorder: |
| |
262 * @cell_layout: A #GtkCellLayout. |
| |
263 * @cell: A #GtkCellRenderer to reorder. |
| |
264 * @position: New position to insert @cell at. |
| |
265 * |
| |
266 * Re-inserts @cell at @position. Note that @cell has already to be packed |
| |
267 * into @cell_layout for this to function properly. |
| |
268 * |
| |
269 * Since: 2.4 |
| |
270 */ |
| |
271 void |
| |
272 gtk_cell_layout_reorder (GtkCellLayout *cell_layout, |
| |
273 GtkCellRenderer *cell, |
| |
274 gint position) |
| |
275 { |
| |
276 g_return_if_fail (GTK_IS_CELL_LAYOUT (cell_layout)); |
| |
277 g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); |
| |
278 |
| |
279 (* GTK_CELL_LAYOUT_GET_IFACE (cell_layout)->reorder) (cell_layout, |
| |
280 cell, |
| |
281 position); |
| |
282 } |
| |
283 #endif /* Gtk 2.4 */ |