]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-contact-menu.c
Updated kn translations
[empathy.git] / libempathy-gtk / empathy-contact-menu.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2008 Collabora Ltd.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library 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  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18  *
19  * Authors: Xavier Claessens <xclaesse@gmail.com>
20  */
21
22 #include "config.h"
23
24 #include <string.h>
25
26 #include <glib/gi18n-lib.h>
27 #include <gtk/gtk.h>
28 #include <telepathy-logger/log-manager.h>
29
30 #include <libempathy/empathy-contact-manager.h>
31 #include <libempathy/empathy-request-util.h>
32 #include <libempathy/empathy-utils.h>
33 #include <libempathy/empathy-chatroom-manager.h>
34 #include <libempathy/empathy-contact-manager.h>
35
36 #include "empathy-contact-menu.h"
37 #include "empathy-images.h"
38 #include "empathy-log-window.h"
39 #include "empathy-contact-dialogs.h"
40 #include "empathy-ui-utils.h"
41 #include "empathy-share-my-desktop.h"
42
43 static GtkWidget *empathy_contact_block_menu_item_new (EmpathyContact *);
44
45 GtkWidget *
46 empathy_contact_menu_new (EmpathyContact             *contact,
47                           EmpathyContactFeatureFlags  features)
48 {
49         GtkWidget    *menu;
50         GtkMenuShell *shell;
51         GtkWidget    *item;
52
53         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
54
55         if (features == EMPATHY_CONTACT_FEATURE_NONE) {
56                 return NULL;
57         }
58
59         menu = gtk_menu_new ();
60         shell = GTK_MENU_SHELL (menu);
61
62         /* Add Contact */
63         item = empathy_contact_add_menu_item_new (contact);
64         if (item) {
65                 gtk_menu_shell_append (shell, item);
66                 gtk_widget_show (item);
67         }
68
69         /* Chat */
70         if (features & EMPATHY_CONTACT_FEATURE_CHAT) {
71                 item = empathy_contact_chat_menu_item_new (contact);
72                 gtk_menu_shell_append (shell, item);
73                 gtk_widget_show (item);
74         }
75
76         if (features & EMPATHY_CONTACT_FEATURE_CALL) {
77                 /* Audio Call */
78                 item = empathy_contact_audio_call_menu_item_new (contact);
79                 gtk_menu_shell_append (shell, item);
80                 gtk_widget_show (item);
81
82                 /* Video Call */
83                 item = empathy_contact_video_call_menu_item_new (contact);
84                 gtk_menu_shell_append (shell, item);
85                 gtk_widget_show (item);
86         }
87
88         /* Log */
89         if (features & EMPATHY_CONTACT_FEATURE_LOG) {
90                 item = empathy_contact_log_menu_item_new (contact);
91                 gtk_menu_shell_append (shell, item);
92                 gtk_widget_show (item);
93         }
94
95         /* Invite */
96         item = empathy_contact_invite_menu_item_new (contact);
97         gtk_menu_shell_append (shell, item);
98         gtk_widget_show (item);
99
100         /* File transfer */
101         if (features & EMPATHY_CONTACT_FEATURE_FT) {
102                 item = empathy_contact_file_transfer_menu_item_new (contact);
103                 gtk_menu_shell_append (shell, item);
104                 gtk_widget_show (item);
105         }
106
107         /* Share my desktop */
108         /* FIXME we should add the "Share my desktop" menu item if Vino is
109         a registered handler in MC5 */
110         item = empathy_contact_share_my_desktop_menu_item_new (contact);
111         gtk_menu_shell_append (shell, item);
112         gtk_widget_show (item);
113
114         /* Separator */
115         if (features & (EMPATHY_CONTACT_FEATURE_EDIT |
116                         EMPATHY_CONTACT_FEATURE_INFO |
117                         EMPATHY_CONTACT_FEATURE_FAVOURITE)) {
118                 item = gtk_separator_menu_item_new ();
119                 gtk_menu_shell_append (shell, item);
120                 gtk_widget_show (item);
121         }
122
123         /* Edit */
124         if (features & EMPATHY_CONTACT_FEATURE_EDIT) {
125                 item = empathy_contact_edit_menu_item_new (contact);
126                 gtk_menu_shell_append (shell, item);
127                 gtk_widget_show (item);
128         }
129
130         /* Info */
131         if (features & EMPATHY_CONTACT_FEATURE_INFO) {
132                 item = empathy_contact_info_menu_item_new (contact);
133                 gtk_menu_shell_append (shell, item);
134                 gtk_widget_show (item);
135         }
136
137         /* Favorite checkbox */
138         if (features & EMPATHY_CONTACT_FEATURE_FAVOURITE) {
139                 item = empathy_contact_favourite_menu_item_new (contact);
140                 gtk_menu_shell_append (shell, item);
141                 gtk_widget_show (item);
142         }
143
144         /* Separator & Block */
145         if (features & EMPATHY_CONTACT_FEATURE_BLOCK &&
146             (item = empathy_contact_block_menu_item_new (contact)) != NULL) {
147                 GtkWidget *sep;
148
149                 sep = gtk_separator_menu_item_new ();
150                 gtk_menu_shell_append (shell, sep);
151                 gtk_widget_show (sep);
152
153                 gtk_menu_shell_append (shell, item);
154                 gtk_widget_show (item);
155         }
156
157         return menu;
158 }
159
160 static void
161 empathy_contact_add_menu_item_activated (GtkMenuItem *item,
162         EmpathyContact *contact)
163 {
164         GtkWidget *toplevel;
165
166         toplevel = gtk_widget_get_toplevel (GTK_WIDGET (item));
167         if (!gtk_widget_is_toplevel (toplevel) || !GTK_IS_WINDOW (toplevel)) {
168                 toplevel = NULL;
169         }
170
171         empathy_new_contact_dialog_show_with_contact (GTK_WINDOW (toplevel),
172                                                       contact);
173 }
174
175 GtkWidget *
176 empathy_contact_add_menu_item_new (EmpathyContact *contact)
177 {
178         GtkWidget *item;
179         GtkWidget *image;
180         EmpathyContactManager *manager;
181         TpConnection *connection;
182         GList *l, *members;
183         gboolean found = FALSE;
184         EmpathyContactListFlags flags;
185
186         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
187
188         if (!empathy_contact_manager_initialized ()) {
189                 return NULL;
190         }
191
192         manager = empathy_contact_manager_dup_singleton ();
193         connection = empathy_contact_get_connection (contact);
194
195         flags = empathy_contact_manager_get_flags_for_connection (manager,
196                         connection);
197
198         if (!(flags & EMPATHY_CONTACT_LIST_CAN_ADD)) {
199                 return NULL;
200         }
201
202         members = empathy_contact_list_get_members (EMPATHY_CONTACT_LIST (manager));
203         for (l = members; l; l = l->next) {
204                 if (!found && empathy_contact_equal (l->data, contact)) {
205                         found = TRUE;
206                         /* we keep iterating so that we don't leak contact
207                          * refs */
208                 }
209
210                 g_object_unref (l->data);
211         }
212         g_list_free (members);
213         g_object_unref (manager);
214
215         if (found) {
216                 return NULL;
217         }
218
219         item = gtk_image_menu_item_new_with_mnemonic (_("_Add Contact…"));
220         image = gtk_image_new_from_icon_name (GTK_STOCK_ADD,
221                                               GTK_ICON_SIZE_MENU);
222         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
223
224         g_signal_connect (item, "activate",
225                         G_CALLBACK (empathy_contact_add_menu_item_activated),
226                         contact);
227
228         return item;
229 }
230
231 static void
232 empathy_contact_block_menu_item_toggled (GtkCheckMenuItem *item,
233                                          EmpathyContact   *contact)
234 {
235         static guint block_signal = 0;
236         EmpathyContactManager *manager;
237         gboolean blocked, abusive;
238
239         if (block_signal > 0)
240                 return;
241
242         blocked = gtk_check_menu_item_get_active (item);
243
244         if (blocked) {
245                 /* confirm the user really wishes to block the contact */
246                 GtkWidget *parent;
247
248                 /* gtk_menu_get_attach_widget () doesn't behave properly here
249                  * for some reason */
250                 parent = g_object_get_data (
251                         G_OBJECT (gtk_widget_get_parent (GTK_WIDGET (item))),
252                         "window");
253
254                 if (!empathy_block_contact_dialog_show (GTK_WINDOW (parent),
255                                         contact, &abusive))
256                         return;
257         }
258
259         manager = empathy_contact_manager_dup_singleton ();
260         empathy_contact_list_set_blocked (EMPATHY_CONTACT_LIST (manager),
261                                           contact, blocked, abusive);
262         g_object_unref (manager);
263
264         /* update the toggle with the blocked status */
265         block_signal++;
266         gtk_check_menu_item_set_active (item, blocked);
267         block_signal--;
268 }
269
270 static GtkWidget *
271 empathy_contact_block_menu_item_new (EmpathyContact *contact)
272 {
273         GtkWidget *item;
274         EmpathyContactManager *manager;
275         TpConnection *connection;
276         EmpathyContactListFlags flags;
277         gboolean blocked;
278
279         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
280
281         manager = empathy_contact_manager_dup_singleton ();
282
283         if (!empathy_contact_manager_initialized ()) {
284                 return NULL;
285         }
286
287         connection = empathy_contact_get_connection (contact);
288
289         flags = empathy_contact_manager_get_flags_for_connection (manager,
290                         connection);
291
292         if (!(flags & EMPATHY_CONTACT_LIST_CAN_BLOCK)) {
293                 return NULL;
294         }
295
296         item = gtk_check_menu_item_new_with_mnemonic (_("_Block Contact"));
297         blocked = empathy_contact_list_get_blocked (
298                         EMPATHY_CONTACT_LIST (manager),
299                         contact);
300
301         gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), blocked);
302
303         g_signal_connect (item, "toggled",
304                         G_CALLBACK (empathy_contact_block_menu_item_toggled),
305                         contact);
306
307         return item;
308 }
309
310 static void
311 empathy_contact_chat_menu_item_activated (GtkMenuItem *item,
312         EmpathyContact *contact)
313 {
314   empathy_chat_with_contact (contact, gtk_get_current_event_time ());
315 }
316
317 GtkWidget *
318 empathy_contact_chat_menu_item_new (EmpathyContact *contact)
319 {
320         GtkWidget *item;
321         GtkWidget *image;
322
323         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
324
325         item = gtk_image_menu_item_new_with_mnemonic (_("_Chat"));
326         image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_MESSAGE,
327                                               GTK_ICON_SIZE_MENU);
328         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
329         gtk_widget_set_sensitive (item, !empathy_contact_is_user (contact));
330         gtk_widget_show (image);
331
332         g_signal_connect (item, "activate",
333                                   G_CALLBACK (empathy_contact_chat_menu_item_activated),
334                                   contact);
335
336         return item;
337 }
338
339 static void
340 empathy_contact_audio_call_menu_item_activated (GtkMenuItem *item,
341         EmpathyContact *contact)
342 {
343
344         empathy_call_new_with_streams (contact, TRUE, FALSE,
345                 gtk_get_current_event_time ());
346 }
347
348 GtkWidget *
349 empathy_contact_audio_call_menu_item_new (EmpathyContact *contact)
350 {
351         GtkWidget *item;
352         GtkWidget *image;
353
354         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
355
356         item = gtk_image_menu_item_new_with_mnemonic (C_("menu item", "_Audio Call"));
357         image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_VOIP,
358                                               GTK_ICON_SIZE_MENU);
359         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
360         gtk_widget_set_sensitive (item, empathy_contact_can_voip_audio (contact) &&
361                                         !empathy_contact_is_user (contact));
362         gtk_widget_show (image);
363
364         g_signal_connect (item, "activate",
365                                   G_CALLBACK (empathy_contact_audio_call_menu_item_activated),
366                                   contact);
367
368         return item;
369 }
370
371 static void
372 empathy_contact_video_call_menu_item_activated (GtkMenuItem *item,
373         EmpathyContact *contact)
374 {
375         empathy_call_new_with_streams (contact, TRUE, TRUE,
376                 gtk_get_current_event_time ());
377 }
378
379 GtkWidget *
380 empathy_contact_video_call_menu_item_new (EmpathyContact *contact)
381 {
382         GtkWidget *item;
383         GtkWidget *image;
384
385         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
386
387         item = gtk_image_menu_item_new_with_mnemonic (C_("menu item", "_Video Call"));
388         image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_VIDEO_CALL,
389                                               GTK_ICON_SIZE_MENU);
390         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
391         gtk_widget_set_sensitive (item, empathy_contact_can_voip_video (contact) &&
392                                         !empathy_contact_is_user (contact));
393         gtk_widget_show (image);
394
395         g_signal_connect (item, "activate",
396                                   G_CALLBACK (empathy_contact_video_call_menu_item_activated),
397                                   contact);
398
399         return item;
400 }
401
402 static void
403 contact_log_menu_item_activate_cb (EmpathyContact *contact)
404 {
405         empathy_log_window_show (empathy_contact_get_account (contact),
406                                  empathy_contact_get_id (contact),
407                                  FALSE, NULL);
408 }
409
410 GtkWidget *
411 empathy_contact_log_menu_item_new (EmpathyContact *contact)
412 {
413         TplLogManager     *manager;
414         TplEntity         *entity;
415         gboolean           have_log;
416         GtkWidget         *item;
417         GtkWidget         *image;
418
419         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
420
421         manager = tpl_log_manager_dup_singleton ();
422         entity = tpl_entity_new_from_tp_contact (empathy_contact_get_tp_contact (contact),
423                                                  TPL_ENTITY_CONTACT);
424
425         have_log = tpl_log_manager_exists (manager,
426                                            empathy_contact_get_account (contact),
427                                            entity,
428                                            TPL_EVENT_MASK_TEXT);
429
430         g_object_unref (entity);
431         g_object_unref (manager);
432
433         item = gtk_image_menu_item_new_with_mnemonic (_("_Previous Conversations"));
434         image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_LOG,
435                                               GTK_ICON_SIZE_MENU);
436         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
437         gtk_widget_set_sensitive (item, have_log);
438         gtk_widget_show (image);
439
440         g_signal_connect_swapped (item, "activate",
441                                   G_CALLBACK (contact_log_menu_item_activate_cb),
442                                   contact);
443
444         return item;
445 }
446
447 GtkWidget *
448 empathy_contact_file_transfer_menu_item_new (EmpathyContact *contact)
449 {
450         GtkWidget         *item;
451         GtkWidget         *image;
452
453         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
454
455         item = gtk_image_menu_item_new_with_mnemonic (_("Send File"));
456         image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_DOCUMENT_SEND,
457                                               GTK_ICON_SIZE_MENU);
458         gtk_widget_set_sensitive (item, empathy_contact_can_send_files (contact) &&
459                                         !empathy_contact_is_user (contact));
460         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
461         gtk_widget_show (image);
462
463         g_signal_connect_swapped (item, "activate",
464                                   G_CALLBACK (empathy_send_file_with_file_chooser),
465                                   contact);
466
467         return item;
468 }
469
470 GtkWidget *
471 empathy_contact_share_my_desktop_menu_item_new (EmpathyContact *contact)
472 {
473         GtkWidget         *item;
474         GtkWidget         *image;
475
476         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
477
478         item = gtk_image_menu_item_new_with_mnemonic (_("Share My Desktop"));
479         image = gtk_image_new_from_icon_name (GTK_STOCK_NETWORK,
480                                               GTK_ICON_SIZE_MENU);
481         gtk_widget_set_sensitive (item, empathy_contact_can_use_rfb_stream_tube (
482                 contact));
483         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
484         gtk_widget_show (image);
485
486         g_signal_connect_swapped (item, "activate",
487                                   G_CALLBACK (empathy_share_my_desktop_share_with_contact),
488                                   contact);
489
490         return item;
491 }
492
493 static void
494 favourite_menu_item_toggled_cb (GtkCheckMenuItem *item,
495         EmpathyContact *contact)
496 {
497         EmpathyContactManager *manager;
498         EmpathyContactList *list;
499
500         manager = empathy_contact_manager_dup_singleton ();
501         list = EMPATHY_CONTACT_LIST (manager);
502
503         if (gtk_check_menu_item_get_active (item)) {
504                 empathy_contact_list_add_to_favourites (list, contact);
505         } else {
506                 empathy_contact_list_remove_from_favourites (list, contact);
507         }
508
509         g_object_unref (manager);
510 }
511
512 GtkWidget *
513 empathy_contact_favourite_menu_item_new (EmpathyContact *contact)
514 {
515         GtkWidget *item;
516         EmpathyContactManager *manager;
517
518         item = gtk_check_menu_item_new_with_label (_("Favorite"));
519
520         manager = empathy_contact_manager_dup_singleton ();
521         gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
522                 empathy_contact_list_is_favourite (EMPATHY_CONTACT_LIST (manager),
523                                                    contact));
524
525         g_signal_connect (item, "toggled",
526                           G_CALLBACK (favourite_menu_item_toggled_cb),
527                           contact);
528
529         g_object_unref (manager);
530         return item;
531 }
532
533 static void
534 contact_info_menu_item_activate_cb (EmpathyContact *contact)
535 {
536         empathy_contact_information_dialog_show (contact, NULL);
537 }
538
539 GtkWidget *
540 empathy_contact_info_menu_item_new (EmpathyContact *contact)
541 {
542         GtkWidget *item;
543         GtkWidget *image;
544
545         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
546
547         item = gtk_image_menu_item_new_with_mnemonic (_("Infor_mation"));
548         image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_CONTACT_INFORMATION,
549                                               GTK_ICON_SIZE_MENU);
550         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
551         gtk_widget_show (image);
552
553         g_signal_connect_swapped (item, "activate",
554                                   G_CALLBACK (contact_info_menu_item_activate_cb),
555                                   contact);
556
557         return item;
558 }
559
560 static void
561 contact_edit_menu_item_activate_cb (EmpathyContact *contact)
562 {
563         empathy_contact_edit_dialog_show (contact, NULL);
564 }
565
566 GtkWidget *
567 empathy_contact_edit_menu_item_new (EmpathyContact *contact)
568 {
569         EmpathyContactManager *manager;
570         GtkWidget *item;
571         GtkWidget *image;
572         gboolean enable = FALSE;
573
574         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
575
576         if (empathy_contact_manager_initialized ()) {
577                 TpConnection *connection;
578                 EmpathyContactListFlags flags;
579
580                 manager = empathy_contact_manager_dup_singleton ();
581                 connection = empathy_contact_get_connection (contact);
582                 flags = empathy_contact_manager_get_flags_for_connection (
583                                 manager, connection);
584
585                 enable = (flags & EMPATHY_CONTACT_LIST_CAN_ALIAS ||
586                           flags & EMPATHY_CONTACT_LIST_CAN_GROUP);
587
588                 g_object_unref (manager);
589         }
590
591         item = gtk_image_menu_item_new_with_mnemonic (
592                                                      C_("Edit contact (contextual menu)",
593                                                         "_Edit"));
594         image = gtk_image_new_from_icon_name (GTK_STOCK_EDIT,
595                                               GTK_ICON_SIZE_MENU);
596         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
597         gtk_widget_show (image);
598
599         gtk_widget_set_sensitive (item, enable);
600
601         g_signal_connect_swapped (item, "activate",
602                                   G_CALLBACK (contact_edit_menu_item_activate_cb),
603                                   contact);
604
605         return item;
606 }
607
608 typedef struct  {
609         EmpathyContact *contact;
610         EmpathyChatroom *chatroom;
611 } RoomSubMenuData;
612
613 static RoomSubMenuData *
614 room_sub_menu_data_new (EmpathyContact *contact,
615                         EmpathyChatroom *chatroom)
616 {
617         RoomSubMenuData *data;
618
619         data = g_slice_new (RoomSubMenuData);
620         data->contact = g_object_ref (contact);
621         data->chatroom = g_object_ref (chatroom);
622         return data;
623 }
624
625 static void
626 room_sub_menu_data_free (RoomSubMenuData *data)
627 {
628         g_object_unref (data->contact);
629         g_object_unref (data->chatroom);
630         g_slice_free (RoomSubMenuData, data);
631 }
632
633 static void
634 room_sub_menu_activate_cb (GtkWidget *item,
635                            RoomSubMenuData *data)
636 {
637         EmpathyTpChat *chat;
638
639         chat = empathy_chatroom_get_tp_chat (data->chatroom);
640         if (chat == NULL) {
641                 /* channel was invalidated. Ignoring */
642                 return;
643         }
644
645         /* send invitation */
646         empathy_contact_list_add (EMPATHY_CONTACT_LIST (chat), data->contact,
647                 _("Inviting you to this room"));
648 }
649
650 static GtkWidget *
651 create_room_sub_menu (EmpathyContact *contact,
652                       EmpathyChatroom *chatroom)
653 {
654         GtkWidget *item;
655         RoomSubMenuData *data;
656
657         item = gtk_menu_item_new_with_label (empathy_chatroom_get_name (chatroom));
658         data = room_sub_menu_data_new (contact, chatroom);
659         g_signal_connect_data (item, "activate",
660                                G_CALLBACK (room_sub_menu_activate_cb), data,
661                                (GClosureNotify) room_sub_menu_data_free, 0);
662
663         return item;
664 }
665
666 GtkWidget *
667 empathy_contact_invite_menu_item_new (EmpathyContact *contact)
668 {
669         GtkWidget *item;
670         GtkWidget *image;
671         GtkWidget *room_item;
672         EmpathyChatroomManager *mgr;
673         GList *rooms, *l;
674         GtkWidget *submenu = NULL;
675
676         g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
677
678         item = gtk_image_menu_item_new_with_mnemonic (_("_Invite to Chat Room"));
679         image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_GROUP_MESSAGE,
680                                               GTK_ICON_SIZE_MENU);
681         gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
682
683         if (empathy_contact_is_user (contact)) {
684                 gtk_widget_set_sensitive (item, FALSE);
685                 gtk_widget_show (image);
686                 return item;
687         }
688
689         mgr = empathy_chatroom_manager_dup_singleton (NULL);
690         rooms = empathy_chatroom_manager_get_chatrooms (mgr,
691                 empathy_contact_get_account (contact));
692
693         for (l = rooms; l != NULL; l = g_list_next (l)) {
694                 EmpathyChatroom *chatroom = l->data;
695
696                 if (empathy_chatroom_get_tp_chat (chatroom) != NULL) {
697                         if (G_UNLIKELY (submenu == NULL))
698                                 submenu = gtk_menu_new ();
699
700                         room_item = create_room_sub_menu (contact, chatroom);
701                         gtk_menu_shell_append ((GtkMenuShell *) submenu, room_item);
702                         gtk_widget_show (room_item);
703                 }
704         }
705
706         if (submenu) {
707                 gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
708         } else {
709                 gtk_widget_set_sensitive (item, FALSE);
710         }
711
712         gtk_widget_show (image);
713
714         g_object_unref (mgr);
715         g_list_free (rooms);
716
717         return item;
718 }
719