| 646 gtk_widget_set_sensitive(req_data->ok_button, |
646 gtk_widget_set_sensitive(req_data->ok_button, |
| 647 gaim_request_fields_all_required_filled(field->group->fields_list)); |
647 gaim_request_fields_all_required_filled(field->group->fields_list)); |
| 648 } |
648 } |
| 649 |
649 |
| 650 static GList * |
650 static GList * |
| 651 get_online_names(void) |
651 get_screenname_completion_data(gboolean all) |
| 652 { |
652 { |
| 653 GList *names = NULL; |
653 GList *names = NULL; |
| 654 GaimBlistNode *gnode, *cnode, *bnode; |
654 GaimBlistNode *gnode, *cnode, *bnode; |
| |
655 GList *log_sets; |
| |
656 GList *log_set; |
| 655 |
657 |
| 656 for (gnode = gaim_get_blist()->root; gnode != NULL; gnode = gnode->next) |
658 for (gnode = gaim_get_blist()->root; gnode != NULL; gnode = gnode->next) |
| 657 { |
659 { |
| 658 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
660 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
| 659 continue; |
661 continue; |
| 665 |
667 |
| 666 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) |
668 for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) |
| 667 { |
669 { |
| 668 GaimBuddy *buddy = (GaimBuddy *)bnode; |
670 GaimBuddy *buddy = (GaimBuddy *)bnode; |
| 669 |
671 |
| 670 if (!gaim_account_is_connected(buddy->account)) |
672 if (!all && !gaim_account_is_connected(buddy->account)) |
| 671 continue; |
673 continue; |
| 672 |
674 |
| 673 #ifdef NEW_STYLE_COMPLETION |
675 #ifdef NEW_STYLE_COMPLETION |
| 674 names = g_list_append(names, ((GaimContact *)cnode)->alias); |
676 names = g_list_append(names, ((GaimContact *)cnode)->alias); |
| 675 names = g_list_append(names, |
677 names = g_list_append(names, |
| 676 (gpointer)gaim_buddy_get_contact_alias(buddy)); |
678 (gpointer)gaim_buddy_get_contact_alias(buddy)); |
| 677 names = g_list_append(names, buddy->account); |
679 names = g_list_append(names, buddy->account); |
| 678 #endif /* NEW_STYLE_COMPLETION */ |
680 #endif /* NEW_STYLE_COMPLETION */ |
| 679 |
681 |
| 680 names = g_list_append(names, buddy->name); |
682 names = g_list_append(names, g_strdup(buddy->name)); |
| 681 } |
683 } |
| 682 } |
684 } |
| |
685 } |
| |
686 |
| |
687 log_sets = gaim_log_get_log_sets(); |
| |
688 for (log_set = log_sets ; log_set != NULL ; log_set = log_set->next) { |
| |
689 GaimLogSet *set = log_set->data; |
| |
690 |
| |
691 /* 1. Don't show buddies because we will have gotten them above. |
| |
692 * 2. If we're not showing all accounts, then only show those with |
| |
693 * non-NULL accounts that are currently connected. |
| |
694 * 3. The boxes that use this autocomplete code handle only IMs. */ |
| |
695 if (!set->buddy && |
| |
696 (all || (set->account != NULL && gaim_account_is_connected(set->account))) && |
| |
697 set->type != GAIM_LOG_CHAT) { |
| |
698 #ifdef NEW_STYLE_COMPLETION |
| |
699 names = g_list_append(names, NULL); |
| |
700 names = g_list_append(names, NULL); |
| |
701 names = g_list_append(names, set->account); |
| |
702 #endif /* NEW_STYLE_COMPLETION */ |
| |
703 |
| |
704 names = g_list_append(names, set->name); |
| |
705 } |
| |
706 |
| |
707 g_free(set); |
| 683 } |
708 } |
| 684 |
709 |
| 685 return names; |
710 return names; |
| 686 } |
711 } |
| 687 |
712 |
| 859 return TRUE; |
885 return TRUE; |
| 860 } |
886 } |
| 861 #endif /* !NEW_STYLE_COMPLETION */ |
887 #endif /* !NEW_STYLE_COMPLETION */ |
| 862 |
888 |
| 863 static void |
889 static void |
| 864 setup_screenname_autocomplete(GtkWidget *entry, GaimRequestField *field) |
890 setup_screenname_autocomplete(GtkWidget *entry, GaimRequestField *field, gboolean all) |
| 865 { |
891 { |
| 866 #ifdef NEW_STYLE_COMPLETION |
892 #ifdef NEW_STYLE_COMPLETION |
| 867 GtkListStore *store; |
893 GtkListStore *store; |
| 868 GtkTreeIter iter; |
894 GtkTreeIter iter; |
| 869 GtkEntryCompletion *completion; |
895 GtkEntryCompletion *completion; |
| 870 GList *aliases_and_screennames; |
896 GList *screenname_completion_data; |
| 871 GList *l; |
897 GList *l; |
| 872 gpointer *data; |
898 gpointer *data; |
| 873 |
899 |
| 874 /* Store the displayed completion value, the screenname, and the value for comparison. */ |
900 /* Store the displayed completion value, the screenname, the value for comparison, and the account. */ |
| 875 store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
901 store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
| 876 |
902 |
| 877 aliases_and_screennames = get_online_names(); |
903 screenname_completion_data = get_screenname_completion_data(all); |
| 878 |
904 |
| 879 /* Loop through the list four elements at a time. */ |
905 /* Loop through the list four elements at a time. */ |
| 880 for (l = aliases_and_screennames; l != NULL; l = l->next->next->next->next) |
906 for (l = screenname_completion_data; l != NULL; l = l->next->next->next->next) |
| 881 { |
907 { |
| 882 char *contact_alias = l->data; |
908 char *contact_alias = l->data; |
| 883 char *buddy_alias = l->next->data; |
909 char *buddy_alias = l->next->data; |
| 884 GaimAccount *account = l->next->next->data; |
910 GaimAccount *account = l->next->next->data; |
| 885 char *screenname = l->next->next->next->data; |
911 char *screenname = l->next->next->next->data; |
| 927 1, screenname, |
953 1, screenname, |
| 928 2, NULL, |
954 2, NULL, |
| 929 3, account, |
955 3, account, |
| 930 -1); |
956 -1); |
| 931 } |
957 } |
| 932 } |
958 |
| 933 |
959 g_free(screenname); |
| 934 g_list_free(aliases_and_screennames); |
960 } |
| |
961 |
| |
962 g_list_free(screenname_completion_data); |
| |
963 |
| |
964 /* Sort the completion list by screenname. */ |
| |
965 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), |
| |
966 1, GTK_SORT_ASCENDING); |
| 935 |
967 |
| 936 completion = gtk_entry_completion_new(); |
968 completion = gtk_entry_completion_new(); |
| 937 gtk_entry_completion_set_match_func(completion, screenname_completion_match_func, NULL, NULL); |
969 gtk_entry_completion_set_match_func(completion, screenname_completion_match_func, NULL, NULL); |
| 938 |
970 |
| 939 data = g_new0(gpointer, 2); |
971 data = g_new0(gpointer, 2); |
| 958 |
990 |
| 959 data->completion = g_completion_new(NULL); |
991 data->completion = g_completion_new(NULL); |
| 960 |
992 |
| 961 g_completion_set_compare(data->completion, g_ascii_strncasecmp); |
993 g_completion_set_compare(data->completion, g_ascii_strncasecmp); |
| 962 |
994 |
| 963 screennames = get_online_names(); |
995 screennames = get_screenname_completion_data(all); |
| 964 |
996 |
| 965 g_completion_add_items(data->completion, screennames); |
997 g_completion_add_items(data->completion, screennames); |
| 966 |
998 |
| 967 g_list_free(screennames); |
999 g_list_free(screennames); |
| 968 |
1000 |
| 987 G_CALLBACK(req_entry_field_changed_cb), field); |
1019 G_CALLBACK(req_entry_field_changed_cb), field); |
| 988 } |
1020 } |
| 989 |
1021 |
| 990 if ((type_hint = gaim_request_field_get_type_hint(field)) != NULL) |
1022 if ((type_hint = gaim_request_field_get_type_hint(field)) != NULL) |
| 991 { |
1023 { |
| 992 if (!strcmp(type_hint, "screenname")) |
1024 if (!strncmp(type_hint, "screenname", sizeof("screenname") - 1)) |
| 993 { |
1025 { |
| 994 setup_screenname_autocomplete(entry, field); |
1026 setup_screenname_autocomplete(entry, field, !strcmp(type_hint, "screenname-all")); |
| 995 } |
1027 } |
| 996 } |
1028 } |
| 997 } |
1029 } |
| 998 |
1030 |
| 999 static GtkWidget * |
1031 static GtkWidget * |