1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2004-2007 Imendio AB
4 * Copyright (C) 2010 Collabora Ltd
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301 USA
21 * Authors: Mikael Hallendal <micke@imendio.com>
28 #include <libempathy/empathy-utils.h>
29 #include "empathy-cell-renderer-text.h"
31 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyCellRendererText)
41 } EmpathyCellRendererTextPriv;
43 static void cell_renderer_text_finalize (GObject *object);
44 static void cell_renderer_text_get_property (GObject *object,
48 static void cell_renderer_text_set_property (GObject *object,
52 static void cell_renderer_text_get_size (GtkCellRenderer *cell,
54 GdkRectangle *cell_area,
59 static void cell_renderer_text_render (GtkCellRenderer *cell,
62 GdkRectangle *background_area,
63 GdkRectangle *cell_area,
64 GdkRectangle *expose_area,
65 GtkCellRendererState flags);
66 static void cell_renderer_text_update_text (EmpathyCellRendererText *cell,
79 G_DEFINE_TYPE (EmpathyCellRendererText, empathy_cell_renderer_text, GTK_TYPE_CELL_RENDERER_TEXT);
82 empathy_cell_renderer_text_class_init (EmpathyCellRendererTextClass *klass)
84 GObjectClass *object_class;
85 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 spec = g_param_spec_string ("name", "Name", "Contact name", NULL,
101 g_object_class_install_property (object_class, PROP_NAME, spec);
103 spec = g_param_spec_string ("status", "Status",
104 "Contact status string", NULL, G_PARAM_READWRITE);
105 g_object_class_install_property (object_class, PROP_STATUS, spec);
107 spec = g_param_spec_boolean ("is_group", "Is group",
108 "Whether this cell is a group", FALSE, G_PARAM_READWRITE);
109 g_object_class_install_property (object_class, PROP_IS_GROUP, spec);
111 spec = g_param_spec_boolean ("show-status", "Show status",
112 "Whether to show the status line", TRUE, G_PARAM_READWRITE);
113 g_object_class_install_property (object_class, PROP_SHOW_STATUS, spec);
115 g_type_class_add_private (object_class, sizeof (EmpathyCellRendererTextPriv));
119 empathy_cell_renderer_text_init (EmpathyCellRendererText *cell)
121 EmpathyCellRendererTextPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
122 EMPATHY_TYPE_CELL_RENDERER_TEXT, EmpathyCellRendererTextPriv);
126 "ellipsize", PANGO_ELLIPSIZE_END,
129 priv->name = g_strdup ("");
130 priv->status = g_strdup ("");
131 priv->show_status = TRUE;
135 cell_renderer_text_finalize (GObject *object)
137 EmpathyCellRendererText *cell;
138 EmpathyCellRendererTextPriv *priv;
140 cell = EMPATHY_CELL_RENDERER_TEXT (object);
141 priv = GET_PRIV (cell);
144 g_free (priv->status);
146 (G_OBJECT_CLASS (empathy_cell_renderer_text_parent_class)->finalize) (object);
150 cell_renderer_text_get_property (GObject *object,
155 EmpathyCellRendererText *cell;
156 EmpathyCellRendererTextPriv *priv;
158 cell = EMPATHY_CELL_RENDERER_TEXT (object);
159 priv = GET_PRIV (cell);
163 g_value_set_string (value, priv->name);
166 g_value_set_string (value, priv->status);
169 g_value_set_boolean (value, priv->is_group);
171 case PROP_SHOW_STATUS:
172 g_value_set_boolean (value, priv->show_status);
175 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
181 cell_renderer_text_set_property (GObject *object,
186 EmpathyCellRendererText *cell;
187 EmpathyCellRendererTextPriv *priv;
190 cell = EMPATHY_CELL_RENDERER_TEXT (object);
191 priv = GET_PRIV (cell);
196 str = g_value_get_string (value);
197 priv->name = g_strdup (str ? str : "");
198 g_strdelimit (priv->name, "\n\r\t", ' ');
199 priv->is_valid = FALSE;
202 g_free (priv->status);
203 str = g_value_get_string (value);
204 priv->status = g_strdup (str ? str : "");
205 g_strdelimit (priv->status, "\n\r\t", ' ');
206 priv->is_valid = FALSE;
209 priv->is_group = g_value_get_boolean (value);
210 priv->is_valid = FALSE;
212 case PROP_SHOW_STATUS:
213 priv->show_status = g_value_get_boolean (value);
214 priv->is_valid = FALSE;
217 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
223 cell_renderer_text_get_size (GtkCellRenderer *cell,
225 GdkRectangle *cell_area,
231 EmpathyCellRendererText *celltext;
232 EmpathyCellRendererTextPriv *priv;
234 celltext = EMPATHY_CELL_RENDERER_TEXT (cell);
235 priv = GET_PRIV (cell);
237 /* Only update if not already valid so we get the right size. */
238 cell_renderer_text_update_text (celltext, widget, priv->is_selected);
240 (GTK_CELL_RENDERER_CLASS (empathy_cell_renderer_text_parent_class)->get_size) (cell, widget,
247 cell_renderer_text_render (GtkCellRenderer *cell,
250 GdkRectangle *background_area,
251 GdkRectangle *cell_area,
252 GdkRectangle *expose_area,
253 GtkCellRendererState flags)
255 EmpathyCellRendererText *celltext;
257 celltext = EMPATHY_CELL_RENDERER_TEXT (cell);
259 cell_renderer_text_update_text (celltext,
261 (flags & GTK_CELL_RENDERER_SELECTED));
263 (GTK_CELL_RENDERER_CLASS (empathy_cell_renderer_text_parent_class)->render) (
272 cell_renderer_text_update_text (EmpathyCellRendererText *cell,
276 EmpathyCellRendererTextPriv *priv;
277 PangoAttrList *attr_list;
278 PangoAttribute *attr_color, *attr_size;
282 priv = GET_PRIV (cell);
284 if (priv->is_valid && priv->is_selected == selected) {
288 if (priv->is_group) {
291 "weight", PANGO_WEIGHT_BOLD,
298 priv->is_selected = selected;
299 priv->is_valid = TRUE;
303 style = gtk_widget_get_style (widget);
305 attr_list = pango_attr_list_new ();
307 attr_size = pango_attr_size_new (pango_font_description_get_size (style->font_desc) / 1.2);
308 attr_size->start_index = strlen (priv->name) + 1;
309 attr_size->end_index = -1;
310 pango_attr_list_insert (attr_list, attr_size);
315 color = style->text_aa[GTK_STATE_NORMAL];
317 attr_color = pango_attr_foreground_new (color.red, color.green, color.blue);
318 attr_color->start_index = attr_size->start_index;
319 attr_color->end_index = -1;
320 pango_attr_list_insert (attr_list, attr_color);
323 if (!priv->status || !priv->status[0] || !priv->show_status) {
324 str = g_strdup (priv->name);
326 str = g_strdup_printf ("%s\n%s", priv->name, priv->status);
331 "weight", PANGO_WEIGHT_NORMAL,
333 "attributes", attr_list,
339 pango_attr_list_unref (attr_list);
341 priv->is_selected = selected;
342 priv->is_valid = TRUE;
346 empathy_cell_renderer_text_new (void)
348 return g_object_new (EMPATHY_TYPE_CELL_RENDERER_TEXT, NULL);