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., 51 Franklin St, Fifth Floor,
18 * Boston, MA 02110-1301 USA
20 * Authors: Mikael Hallendal <micke@imendio.com>
27 #include <libempathy/empathy-utils.h>
28 #include "empathy-cell-renderer-text.h"
30 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyCellRendererText)
40 } EmpathyCellRendererTextPriv;
42 static void cell_renderer_text_finalize (GObject *object);
43 static void cell_renderer_text_get_property (GObject *object,
47 static void cell_renderer_text_set_property (GObject *object,
51 static void cell_renderer_text_get_size (GtkCellRenderer *cell,
53 GdkRectangle *cell_area,
58 static void cell_renderer_text_render (GtkCellRenderer *cell,
61 GdkRectangle *background_area,
62 GdkRectangle *cell_area,
63 GdkRectangle *expose_area,
64 GtkCellRendererState flags);
65 static void cell_renderer_text_update_text (EmpathyCellRendererText *cell,
78 G_DEFINE_TYPE (EmpathyCellRendererText, empathy_cell_renderer_text, GTK_TYPE_CELL_RENDERER_TEXT);
81 empathy_cell_renderer_text_class_init (EmpathyCellRendererTextClass *klass)
83 GObjectClass *object_class;
84 GtkCellRendererClass *cell_class;
86 object_class = G_OBJECT_CLASS (klass);
87 cell_class = GTK_CELL_RENDERER_CLASS (klass);
89 object_class->finalize = cell_renderer_text_finalize;
91 object_class->get_property = cell_renderer_text_get_property;
92 object_class->set_property = cell_renderer_text_set_property;
94 cell_class->get_size = cell_renderer_text_get_size;
95 cell_class->render = cell_renderer_text_render;
97 g_object_class_install_property (object_class,
99 g_param_spec_string ("name",
104 g_object_class_install_property (object_class,
106 g_param_spec_string ("status",
108 "Contact status string",
111 g_object_class_install_property (object_class,
113 g_param_spec_boolean ("is_group",
115 "Whether this cell is a group",
118 g_object_class_install_property (object_class,
120 g_param_spec_boolean ("show-status",
122 "Whether to show the status line",
126 g_type_class_add_private (object_class, sizeof (EmpathyCellRendererTextPriv));
130 empathy_cell_renderer_text_init (EmpathyCellRendererText *cell)
132 EmpathyCellRendererTextPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
133 EMPATHY_TYPE_CELL_RENDERER_TEXT, EmpathyCellRendererTextPriv);
137 "ellipsize", PANGO_ELLIPSIZE_END,
140 priv->name = g_strdup ("");
141 priv->status = g_strdup ("");
142 priv->show_status = TRUE;
146 cell_renderer_text_finalize (GObject *object)
148 EmpathyCellRendererText *cell;
149 EmpathyCellRendererTextPriv *priv;
151 cell = EMPATHY_CELL_RENDERER_TEXT (object);
152 priv = GET_PRIV (cell);
155 g_free (priv->status);
157 (G_OBJECT_CLASS (empathy_cell_renderer_text_parent_class)->finalize) (object);
161 cell_renderer_text_get_property (GObject *object,
166 EmpathyCellRendererText *cell;
167 EmpathyCellRendererTextPriv *priv;
169 cell = EMPATHY_CELL_RENDERER_TEXT (object);
170 priv = GET_PRIV (cell);
174 g_value_set_string (value, priv->name);
177 g_value_set_string (value, priv->status);
180 g_value_set_boolean (value, priv->is_group);
182 case PROP_SHOW_STATUS:
183 g_value_set_boolean (value, priv->show_status);
186 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
192 cell_renderer_text_set_property (GObject *object,
197 EmpathyCellRendererText *cell;
198 EmpathyCellRendererTextPriv *priv;
201 cell = EMPATHY_CELL_RENDERER_TEXT (object);
202 priv = GET_PRIV (cell);
207 str = g_value_get_string (value);
208 priv->name = g_strdup (str ? str : "");
209 g_strdelimit (priv->name, "\n\r\t", ' ');
210 priv->is_valid = FALSE;
213 g_free (priv->status);
214 str = g_value_get_string (value);
215 priv->status = g_strdup (str ? str : "");
216 g_strdelimit (priv->status, "\n\r\t", ' ');
217 priv->is_valid = FALSE;
220 priv->is_group = g_value_get_boolean (value);
221 priv->is_valid = FALSE;
223 case PROP_SHOW_STATUS:
224 priv->show_status = g_value_get_boolean (value);
225 priv->is_valid = FALSE;
228 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
234 cell_renderer_text_get_size (GtkCellRenderer *cell,
236 GdkRectangle *cell_area,
242 EmpathyCellRendererText *celltext;
243 EmpathyCellRendererTextPriv *priv;
245 celltext = EMPATHY_CELL_RENDERER_TEXT (cell);
246 priv = GET_PRIV (cell);
248 /* Only update if not already valid so we get the right size. */
249 cell_renderer_text_update_text (celltext, widget, priv->is_selected);
251 (GTK_CELL_RENDERER_CLASS (empathy_cell_renderer_text_parent_class)->get_size) (cell, widget,
258 cell_renderer_text_render (GtkCellRenderer *cell,
261 GdkRectangle *background_area,
262 GdkRectangle *cell_area,
263 GdkRectangle *expose_area,
264 GtkCellRendererState flags)
266 EmpathyCellRendererText *celltext;
268 celltext = EMPATHY_CELL_RENDERER_TEXT (cell);
270 cell_renderer_text_update_text (celltext,
272 (flags & GTK_CELL_RENDERER_SELECTED));
274 (GTK_CELL_RENDERER_CLASS (empathy_cell_renderer_text_parent_class)->render) (
283 cell_renderer_text_update_text (EmpathyCellRendererText *cell,
287 EmpathyCellRendererTextPriv *priv;
288 PangoAttrList *attr_list;
289 PangoAttribute *attr_color, *attr_size;
293 priv = GET_PRIV (cell);
295 if (priv->is_valid && priv->is_selected == selected) {
299 if (priv->is_group) {
302 "weight", PANGO_WEIGHT_BOLD,
309 priv->is_selected = selected;
310 priv->is_valid = TRUE;
314 style = gtk_widget_get_style (widget);
316 attr_list = pango_attr_list_new ();
318 attr_size = pango_attr_size_new (pango_font_description_get_size (style->font_desc) / 1.2);
319 attr_size->start_index = strlen (priv->name) + 1;
320 attr_size->end_index = -1;
321 pango_attr_list_insert (attr_list, attr_size);
326 color = style->text_aa[GTK_STATE_NORMAL];
328 attr_color = pango_attr_foreground_new (color.red, color.green, color.blue);
329 attr_color->start_index = attr_size->start_index;
330 attr_color->end_index = -1;
331 pango_attr_list_insert (attr_list, attr_color);
334 if (!priv->status || !priv->status[0] || !priv->show_status) {
335 str = g_strdup (priv->name);
337 str = g_strdup_printf ("%s\n%s", priv->name, priv->status);
342 "weight", PANGO_WEIGHT_NORMAL,
344 "attributes", attr_list,
350 pango_attr_list_unref (attr_list);
352 priv->is_selected = selected;
353 priv->is_valid = TRUE;
357 empathy_cell_renderer_text_new (void)
359 return g_object_new (EMPATHY_TYPE_CELL_RENDERER_TEXT, NULL);