comparison src/gtkblist.c @ 8940:b875f5d57b81

[gaim-migrate @ 9710] Gray out the Join a Chat menu item when no online accounts support chats. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 16 May 2004 00:06:25 +0000
parents 19885cb8a24c
children 6d7b403b11bb
comparison
equal deleted inserted replaced
8939:19885cb8a24c 8940:b875f5d57b81
645 g_hash_table_destroy(components); 645 g_hash_table_destroy(components);
646 } 646 }
647 } 647 }
648 648
649 static void 649 static void
650 do_joinchat(GtkWidget *dialog, int id, GaimGtkJoinChatData *info)
651 {
652 switch(id)
653 {
654 case GTK_RESPONSE_OK:
655 do_join_chat(info);
656
657 break;
658 }
659
660 gtk_widget_destroy(GTK_WIDGET(dialog));
661 g_list_free(info->entries);
662 g_free(info);
663 }
664
665 static void
650 rebuild_joinchat_entries(GaimGtkJoinChatData *data) 666 rebuild_joinchat_entries(GaimGtkJoinChatData *data)
651 { 667 {
652 GaimConnection *gc; 668 GaimConnection *gc;
653 GList *list, *tmp; 669 GList *list, *tmp;
654 struct proto_chat_entry *pce; 670 struct proto_chat_entry *pce;
732 748
733 gtk_widget_show_all(data->entries_box); 749 gtk_widget_show_all(data->entries_box);
734 } 750 }
735 751
736 static void 752 static void
737 join_chat_select_account_cb(GObject *w, GaimAccount *account, 753 joinchat_select_account_cb(GObject *w, GaimAccount *account,
738 GaimGtkJoinChatData *data) 754 GaimGtkJoinChatData *data)
739 { 755 {
740 if (gaim_account_get_protocol(data->account) == 756 if (gaim_account_get_protocol(data->account) ==
741 gaim_account_get_protocol(account)) 757 gaim_account_get_protocol(account))
742 { 758 {
748 rebuild_joinchat_entries(data); 764 rebuild_joinchat_entries(data);
749 } 765 }
750 } 766 }
751 767
752 static gboolean 768 static gboolean
753 join_chat_check_account_func(GaimAccount *account) 769 joinchat_account_filter_func(GaimAccount *account)
754 { 770 {
755 GaimConnection *gc = gaim_account_get_connection(account); 771 GaimConnection *gc = gaim_account_get_connection(account);
756 772 GaimPluginProtocolInfo *prpl_info = NULL;
757 return (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL); 773
758 } 774 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl);
759 775
760 static void 776 return (prpl_info->chat_info != NULL);
761 do_joinchat(GtkWidget *dialog, int id, GaimGtkJoinChatData *info) 777 }
762 { 778
763 switch(id) 779 gboolean
764 { 780 gaim_gtk_blist_joinchat_is_showable()
765 case GTK_RESPONSE_OK: 781 {
766 do_join_chat(info); 782 GList *c;
767 783 GaimConnection *gc;
768 break; 784
769 } 785 for (c = gaim_connections_get_all(); c != NULL; c = c->next) {
770 786 gc = c->data;
771 gtk_widget_destroy(GTK_WIDGET(dialog)); 787
772 g_list_free(info->entries); 788 if (joinchat_account_filter_func(gaim_connection_get_account(gc)))
773 g_free(info); 789 return TRUE;
790 }
791
792 return FALSE;
774 } 793 }
775 794
776 void 795 void
777 gaim_gtk_blist_show_join_chat(void) 796 gaim_gtk_blist_joinchat_show(void)
778 { 797 {
779 GtkWidget *hbox, *vbox; 798 GtkWidget *hbox, *vbox;
780 GtkWidget *rowbox; 799 GtkWidget *rowbox;
781 GtkWidget *label; 800 GtkWidget *label;
782 GList *c;
783 GaimGtkBuddyList *gtkblist; 801 GaimGtkBuddyList *gtkblist;
784 GtkWidget *img = NULL; 802 GtkWidget *img = NULL;
785 GaimConnection *gc = NULL;
786 GaimGtkJoinChatData *data = NULL; 803 GaimGtkJoinChatData *data = NULL;
787 int numaccounts = 0;
788
789 /* Count how many protocols support chat */
790 for (c = gaim_connections_get_all(); c != NULL; c = c->next)
791 {
792 gc = c->data;
793
794 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat)
795 numaccounts++;
796 }
797
798 if (numaccounts <= 0)
799 {
800 gaim_notify_error(NULL, NULL,
801 _("You are not currently signed on with any "
802 "protocols that have the ability to chat."),
803 NULL);
804
805 return;
806 }
807 804
808 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); 805 gtkblist = GAIM_GTK_BLIST(gaim_get_blist());
809 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, 806 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION,
810 GTK_ICON_SIZE_DIALOG); 807 GTK_ICON_SIZE_DIALOG);
811 data = g_new0(GaimGtkJoinChatData, 1); 808 data = g_new0(GaimGtkJoinChatData, 1);
841 rowbox = gtk_hbox_new(FALSE, 12); 838 rowbox = gtk_hbox_new(FALSE, 12);
842 gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0); 839 gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0);
843 840
844 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); 841 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
845 842
846 if (numaccounts > 1) 843 label = gtk_label_new_with_mnemonic(_("_Account:"));
847 { 844 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
848 label = gtk_label_new_with_mnemonic(_("_Account:")); 845 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0);
849 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); 846 gtk_size_group_add_widget(data->sg, label);
850 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); 847
851 gtk_size_group_add_widget(data->sg, label); 848 data->account_menu = gaim_gtk_account_option_menu_new(NULL, FALSE,
852 849 G_CALLBACK(joinchat_select_account_cb),
853 data->account_menu = gaim_gtk_account_option_menu_new(NULL, FALSE, 850 joinchat_account_filter_func, data);
854 G_CALLBACK(join_chat_select_account_cb), 851 gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0);
855 join_chat_check_account_func, data); 852 gtk_label_set_mnemonic_widget(GTK_LABEL(label),
856 gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); 853 GTK_WIDGET(data->account_menu));
857 gtk_label_set_mnemonic_widget(GTK_LABEL(label), 854 gaim_set_accessible_label (data->account_menu, label);
858 GTK_WIDGET(data->account_menu));
859 gaim_set_accessible_label (data->account_menu, label);
860 }
861 855
862 data->entries_box = gtk_vbox_new(FALSE, 5); 856 data->entries_box = gtk_vbox_new(FALSE, 5);
863 gtk_container_add(GTK_CONTAINER(vbox), data->entries_box); 857 gtk_container_add(GTK_CONTAINER(vbox), data->entries_box);
864 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); 858 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0);
865 859
866 for (c = gaim_connections_get_all(); c != NULL; c = c->next) 860 data->account = gaim_gtk_account_option_menu_get_selected(data->account_menu);
867 { 861
868 gc = c->data;
869
870 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat)
871 break;
872 }
873 data->account = gaim_connection_get_account(gc);
874 rebuild_joinchat_entries(data); 862 rebuild_joinchat_entries(data);
875 863
876 g_signal_connect(G_OBJECT(data->window), "response", 864 g_signal_connect(G_OBJECT(data->window), "response",
877 G_CALLBACK(do_joinchat), data); 865 G_CALLBACK(do_joinchat), data);
878 866
894 if (GAIM_BLIST_NODE_IS_CHAT(node)) { 882 if (GAIM_BLIST_NODE_IS_CHAT(node)) {
895 serv_join_chat(((GaimChat *)node)->account->gc, ((GaimChat *)node)->components); 883 serv_join_chat(((GaimChat *)node)->account->gc, ((GaimChat *)node)->components);
896 return; 884 return;
897 } 885 }
898 } 886 }
899 gaim_gtk_blist_show_join_chat(); 887 gaim_gtk_blist_joinchat_show();
900 } 888 }
901 889
902 static void gtk_blist_button_away_cb(GtkWidget *w, gpointer data) 890 static void gtk_blist_button_away_cb(GtkWidget *w, gpointer data)
903 { 891 {
904 gtk_menu_popup(GTK_MENU(awaymenu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME); 892 gtk_menu_popup(GTK_MENU(awaymenu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
2309 static GtkItemFactoryEntry blist_menu[] = 2297 static GtkItemFactoryEntry blist_menu[] =
2310 { 2298 {
2311 /* Buddies menu */ 2299 /* Buddies menu */
2312 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" }, 2300 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" },
2313 { N_("/Buddies/New Instant _Message..."), "<CTL>M", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM }, 2301 { N_("/Buddies/New Instant _Message..."), "<CTL>M", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM },
2314 { N_("/Buddies/Join a _Chat..."), "<CTL>C", gaim_gtk_blist_show_join_chat, 0, "<StockItem>", GAIM_STOCK_CHAT }, 2302 { N_("/Buddies/Join a _Chat..."), "<CTL>C", gaim_gtk_blist_joinchat_show, 0, "<StockItem>", GAIM_STOCK_CHAT },
2315 { N_("/Buddies/Get User _Info..."), "<CTL>I", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO }, 2303 { N_("/Buddies/Get User _Info..."), "<CTL>I", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO },
2316 { N_("/Buddies/View User _Log..."), "<CTL>L", show_log_dialog, 0, "<StockItem>" }, 2304 { N_("/Buddies/View User _Log..."), "<CTL>L", show_log_dialog, 0, "<StockItem>" },
2317 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" }, 2305 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" },
2318 { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"}, 2306 { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"},
2319 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"}, 2307 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"},
2887 GaimGtkBuddyList *gtkblist = GAIM_GTK_BLIST(blist); 2875 GaimGtkBuddyList *gtkblist = GAIM_GTK_BLIST(blist);
2888 GtkWidget *widget; 2876 GtkWidget *widget;
2889 2877
2890 gaim_gtk_blist_update_protocol_actions(); 2878 gaim_gtk_blist_update_protocol_actions();
2891 gaim_gtkpounce_menu_build(gtkblist->bpmenu); 2879 gaim_gtkpounce_menu_build(gtkblist->bpmenu);
2880
2881 /* Make menu items sensitive/insensitive where appropriate */
2882 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Buddies/Join a Chat..."));
2883 gtk_widget_set_sensitive(widget, gaim_gtk_blist_joinchat_is_showable());
2892 2884
2893 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Room List")); 2885 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Room List"));
2894 gtk_widget_set_sensitive(widget, gaim_gtk_roomlist_is_showable()); 2886 gtk_widget_set_sensitive(widget, gaim_gtk_roomlist_is_showable());
2895 2887
2896 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Privacy")); 2888 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Privacy"));