1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2004-2007 Imendio AB
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public
16 * License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Authors: Mikael Hallendal <micke@imendio.com>
27 #include "empathy-cell-renderer-text.h"
29 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_CELL_RENDERER_TEXT, EmpathyCellRendererTextPriv))
31 struct _EmpathyCellRendererTextPriv {
42 static void empathy_cell_renderer_text_class_init (EmpathyCellRendererTextClass *klass);
43 static void empathy_cell_renderer_text_init (EmpathyCellRendererText *cell);
44 static void cell_renderer_text_finalize (GObject *object);
45 static void cell_renderer_text_get_property (GObject *object,
49 static void cell_renderer_text_set_property (GObject *object,
53 static void cell_renderer_text_get_size (GtkCellRenderer *cell,
55 GdkRectangle *cell_area,
60 static void cell_renderer_text_render (GtkCellRenderer *cell,
63 GdkRectangle *background_area,
64 GdkRectangle *cell_area,
65 GdkRectangle *expose_area,
66 GtkCellRendererState flags);
67 static void cell_renderer_text_update_text (EmpathyCellRendererText *cell,
80 G_DEFINE_TYPE (EmpathyCellRendererText, empathy_cell_renderer_text, GTK_TYPE_CELL_RENDERER_TEXT);
83 empathy_cell_renderer_text_class_init (EmpathyCellRendererTextClass *klass)
85 GObjectClass *object_class;
86 GtkCellRendererClass *cell_class;
88 object_class = G_OBJECT_CLASS (klass);
89 cell_class = GTK_CELL_RENDERER_CLASS (klass);
91 object_class->finalize = cell_renderer_text_finalize;
93 object_class->get_property = cell_renderer_text_get_property;
94 object_class->set_property = cell_renderer_text_set_property;
96 cell_class->get_size = cell_renderer_text_get_size;
97 cell_class->render = cell_renderer_text_render;
99 g_object_class_install_property (object_class,
101 g_param_spec_string ("name",
106 g_object_class_install_property (object_class,
108 g_param_spec_string ("status",
110 "Contact status string",
113 g_object_class_install_property (object_class,
115 g_param_spec_boolean ("is_group",
117 "Whether this cell is a group",
120 g_object_class_install_property (object_class,
122 g_param_spec_boolean ("show-status",
124 "Whether to show the status line",
128 g_type_class_add_private (object_class, sizeof (EmpathyCellRendererTextPriv));
132 empathy_cell_renderer_text_init (EmpathyCellRendererText *cell)
134 EmpathyCellRendererTextPriv *priv;
136 priv = GET_PRIV (cell);
139 "ellipsize", PANGO_ELLIPSIZE_END,
142 priv->name = g_strdup ("");
143 priv->status = g_strdup ("");
144 priv->show_status = TRUE;
148 cell_renderer_text_finalize (GObject *object)
150 EmpathyCellRendererText *cell;
151 EmpathyCellRendererTextPriv *priv;
153 cell = EMPATHY_CELL_RENDERER_TEXT (object);
154 priv = GET_PRIV (cell);
157 g_free (priv->status);
159 (G_OBJECT_CLASS (empathy_cell_renderer_text_parent_class)->finalize) (object);
163 cell_renderer_text_get_property (GObject *object,
168 EmpathyCellRendererText *cell;
169 EmpathyCellRendererTextPriv *priv;
171 cell = EMPATHY_CELL_RENDERER_TEXT (object);
172 priv = GET_PRIV (cell);
176 g_value_set_string (value, priv->name);
179 g_value_set_string (value, priv->status);
182 g_value_set_boolean (value, priv->is_group);
184 case PROP_SHOW_STATUS:
185 g_value_set_boolean (value, priv->show_status);
188 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
194 cell_renderer_text_set_property (GObject *object,
199 EmpathyCellRendererText *cell;
200 EmpathyCellRendererTextPriv *priv;
203 cell = EMPATHY_CELL_RENDERER_TEXT (object);
204 priv = GET_PRIV (cell);
209 str = g_value_get_string (value);
210 priv->name = g_strdup (str ? str : "");
211 g_strdelimit (priv->name, "\n\r\t", ' ');
212 priv->is_valid = FALSE;
215 g_free (priv->status);
216 str = g_value_get_string (value);
217 priv->status = g_strdup (str ? str : "");
218 g_strdelimit (priv->status, "\n\r\t", ' ');
219 priv->is_valid = FALSE;
222 priv->is_group = g_value_get_boolean (value);
223 priv->is_valid = FALSE;
225 case PROP_SHOW_STATUS:
226 priv->show_status = g_value_get_boolean (value);
227 priv->is_valid = FALSE;
230 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
236 cell_renderer_text_get_size (GtkCellRenderer *cell,
238 GdkRectangle *cell_area,
244 EmpathyCellRendererText *celltext;
245 EmpathyCellRendererTextPriv *priv;
247 celltext = EMPATHY_CELL_RENDERER_TEXT (cell);
248 priv = GET_PRIV (cell);
250 /* Only update if not already valid so we get the right size. */
251 cell_renderer_text_update_text (celltext, widget, priv->is_selected);
253 (GTK_CELL_RENDERER_CLASS (empathy_cell_renderer_text_parent_class)->get_size) (cell, widget,
260 cell_renderer_text_render (GtkCellRenderer *cell,
263 GdkRectangle *background_area,
264 GdkRectangle *cell_area,
265 GdkRectangle *expose_area,
266 GtkCellRendererState flags)
268 EmpathyCellRendererText *celltext;
270 celltext = EMPATHY_CELL_RENDERER_TEXT (cell);
272 cell_renderer_text_update_text (celltext,
274 (flags & GTK_CELL_RENDERER_SELECTED));
276 (GTK_CELL_RENDERER_CLASS (empathy_cell_renderer_text_parent_class)->render) (
285 cell_renderer_text_update_text (EmpathyCellRendererText *cell,
289 EmpathyCellRendererTextPriv *priv;
290 PangoAttrList *attr_list;
291 PangoAttribute *attr_color, *attr_style, *attr_size;
295 priv = GET_PRIV (cell);
297 if (priv->is_valid && priv->is_selected == selected) {
301 if (priv->is_group) {
304 "weight", PANGO_WEIGHT_BOLD,
311 priv->is_selected = selected;
312 priv->is_valid = TRUE;
316 style = gtk_widget_get_style (widget);
318 attr_list = pango_attr_list_new ();
320 attr_style = pango_attr_style_new (PANGO_STYLE_ITALIC);
321 attr_style->start_index = strlen (priv->name) + 1;
322 attr_style->end_index = -1;
323 pango_attr_list_insert (attr_list, attr_style);
328 color = style->text_aa[GTK_STATE_NORMAL];
330 attr_color = pango_attr_foreground_new (color.red, color.green, color.blue);
331 attr_color->start_index = attr_style->start_index;
332 attr_color->end_index = -1;
333 pango_attr_list_insert (attr_list, attr_color);
336 attr_size = pango_attr_size_new (pango_font_description_get_size (style->font_desc) / 1.2);
338 attr_size->start_index = attr_style->start_index;
339 attr_size->end_index = -1;
340 pango_attr_list_insert (attr_list, attr_size);
342 if (!priv->status || !priv->status[0] || !priv->show_status) {
343 str = g_strdup (priv->name);
345 str = g_strdup_printf ("%s\n%s", priv->name, priv->status);
350 "weight", PANGO_WEIGHT_NORMAL,
352 "attributes", attr_list,
358 pango_attr_list_unref (attr_list);
360 priv->is_selected = selected;
361 priv->is_valid = TRUE;
365 empathy_cell_renderer_text_new (void)
367 return g_object_new (EMPATHY_TYPE_CELL_RENDERER_TEXT, NULL);