4 #include "empathy-roster-view.h"
6 #include <libempathy-gtk/empathy-roster-item.h>
8 G_DEFINE_TYPE (EmpathyRosterView, empathy_roster_view, EGG_TYPE_LIST_BOX)
22 static guint signals[LAST_SIGNAL];
25 struct _EmpathyRosterViewPriv
27 EmpathyIndividualManager *manager;
29 /* FolksIndividual (borrowed) -> EmpathyRosterItem (borrowed) */
34 empathy_roster_view_get_property (GObject *object,
39 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
44 g_value_set_object (value, self->priv->manager);
47 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
53 empathy_roster_view_set_property (GObject *object,
58 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
63 g_assert (self->priv->manager == NULL); /* construct only */
64 self->priv->manager = g_value_dup_object (value);
67 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
73 individual_added (EmpathyRosterView *self,
74 FolksIndividual *individual)
78 item = g_hash_table_lookup (self->priv->items, individual);
82 item = empathy_roster_item_new (individual);
84 gtk_widget_show (item);
85 gtk_container_add (GTK_CONTAINER (self), item);
87 g_hash_table_insert (self->priv->items, individual, item);
91 individual_removed (EmpathyRosterView *self,
92 FolksIndividual *individual)
96 item = g_hash_table_lookup (self->priv->items, individual);
100 gtk_container_remove (GTK_CONTAINER (self), item);
102 g_hash_table_remove (self->priv->items, individual);
106 members_changed_cb (EmpathyIndividualManager *manager,
107 const gchar *message,
110 TpChannelGroupChangeReason reason,
111 EmpathyRosterView *self)
115 for (l = added; l != NULL; l = g_list_next (l))
117 FolksIndividual *individual = l->data;
119 individual_added (self, individual);
122 for (l = removed; l != NULL; l = g_list_next (l))
124 FolksIndividual *individual = l->data;
126 individual_removed (self, individual);
131 roster_view_sort (EmpathyRosterItem *a,
132 EmpathyRosterItem *b,
133 EmpathyRosterView *self)
135 FolksIndividual *ind_a, *ind_b;
136 const gchar *alias_a, *alias_b;
138 ind_a = empathy_roster_item_get_individual (a);
139 ind_b = empathy_roster_item_get_individual (b);
141 alias_a = folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (ind_a));
142 alias_b = folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (ind_b));
144 return g_ascii_strcasecmp (alias_a, alias_b);
148 update_separator (GtkWidget **separator,
155 /* No separator before the first row */
156 g_clear_object (separator);
160 if (*separator != NULL)
163 *separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
164 g_object_ref_sink (*separator);
168 empathy_roster_view_constructed (GObject *object)
170 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
171 void (*chain_up) (GObject *) =
172 ((GObjectClass *) empathy_roster_view_parent_class)->constructed;
173 GList *individuals, *l;
175 if (chain_up != NULL)
178 g_assert (EMPATHY_IS_INDIVIDUAL_MANAGER (self->priv->manager));
180 individuals = empathy_individual_manager_get_members (self->priv->manager);
181 for (l = individuals; l != NULL; l = g_list_next (l))
183 FolksIndividual *individual = l->data;
185 individual_added (self, individual);
188 tp_g_signal_connect_object (self->priv->manager, "members-changed",
189 G_CALLBACK (members_changed_cb), self, 0);
191 g_list_free (individuals);
193 egg_list_box_set_sort_func (EGG_LIST_BOX (self),
194 (GCompareDataFunc) roster_view_sort, self, NULL);
196 egg_list_box_set_separator_funcs (EGG_LIST_BOX (self), update_separator,
201 empathy_roster_view_dispose (GObject *object)
203 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
204 void (*chain_up) (GObject *) =
205 ((GObjectClass *) empathy_roster_view_parent_class)->dispose;
207 g_clear_object (&self->priv->manager);
209 if (chain_up != NULL)
214 empathy_roster_view_finalize (GObject *object)
216 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
217 void (*chain_up) (GObject *) =
218 ((GObjectClass *) empathy_roster_view_parent_class)->finalize;
220 g_hash_table_unref (self->priv->items);
222 if (chain_up != NULL)
227 empathy_roster_view_class_init (
228 EmpathyRosterViewClass *klass)
230 GObjectClass *oclass = G_OBJECT_CLASS (klass);
233 oclass->get_property = empathy_roster_view_get_property;
234 oclass->set_property = empathy_roster_view_set_property;
235 oclass->constructed = empathy_roster_view_constructed;
236 oclass->dispose = empathy_roster_view_dispose;
237 oclass->finalize = empathy_roster_view_finalize;
239 spec = g_param_spec_object ("manager", "Manager",
240 "EmpathyIndividualManager",
241 EMPATHY_TYPE_INDIVIDUAL_MANAGER,
242 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
243 g_object_class_install_property (oclass, PROP_MANAGER, spec);
245 g_type_class_add_private (klass, sizeof (EmpathyRosterViewPriv));
249 empathy_roster_view_init (EmpathyRosterView *self)
251 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
252 EMPATHY_TYPE_ROSTER_VIEW, EmpathyRosterViewPriv);
254 self->priv->items = g_hash_table_new (NULL, NULL);
258 empathy_roster_view_new (EmpathyIndividualManager *manager)
260 g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_MANAGER (manager), NULL);
262 return g_object_new (EMPATHY_TYPE_ROSTER_VIEW,
267 EmpathyIndividualManager *
268 empathy_roster_view_get_manager (EmpathyRosterView *self)
270 return self->priv->manager;