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
);