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 empathy_roster_view_constructed (GObject *object)
133 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
134 void (*chain_up) (GObject *) =
135 ((GObjectClass *) empathy_roster_view_parent_class)->constructed;
136 GList *individuals, *l;
138 if (chain_up != NULL)
141 g_assert (EMPATHY_IS_INDIVIDUAL_MANAGER (self->priv->manager));
143 individuals = empathy_individual_manager_get_members (self->priv->manager);
144 for (l = individuals; l != NULL; l = g_list_next (l))
146 FolksIndividual *individual = l->data;
148 individual_added (self, individual);
151 tp_g_signal_connect_object (self->priv->manager, "members-changed",
152 G_CALLBACK (members_changed_cb), self, 0);
154 g_list_free (individuals);
158 empathy_roster_view_dispose (GObject *object)
160 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
161 void (*chain_up) (GObject *) =
162 ((GObjectClass *) empathy_roster_view_parent_class)->dispose;
164 g_clear_object (&self->priv->manager);
166 if (chain_up != NULL)
171 empathy_roster_view_finalize (GObject *object)
173 EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (object);
174 void (*chain_up) (GObject *) =
175 ((GObjectClass *) empathy_roster_view_parent_class)->finalize;
177 g_hash_table_unref (self->priv->items);
179 if (chain_up != NULL)
184 empathy_roster_view_class_init (
185 EmpathyRosterViewClass *klass)
187 GObjectClass *oclass = G_OBJECT_CLASS (klass);
190 oclass->get_property = empathy_roster_view_get_property;
191 oclass->set_property = empathy_roster_view_set_property;
192 oclass->constructed = empathy_roster_view_constructed;
193 oclass->dispose = empathy_roster_view_dispose;
194 oclass->finalize = empathy_roster_view_finalize;
196 spec = g_param_spec_object ("manager", "Manager",
197 "EmpathyIndividualManager",
198 EMPATHY_TYPE_INDIVIDUAL_MANAGER,
199 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
200 g_object_class_install_property (oclass, PROP_MANAGER, spec);
202 g_type_class_add_private (klass, sizeof (EmpathyRosterViewPriv));
206 empathy_roster_view_init (EmpathyRosterView *self)
208 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
209 EMPATHY_TYPE_ROSTER_VIEW, EmpathyRosterViewPriv);
211 self->priv->items = g_hash_table_new (NULL, NULL);
215 empathy_roster_view_new (EmpathyIndividualManager *manager)
217 g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_MANAGER (manager), NULL);
219 return g_object_new (EMPATHY_TYPE_ROSTER_VIEW,
224 EmpathyIndividualManager *
225 empathy_roster_view_get_manager (EmpathyRosterView *self)
227 return self->priv->manager;