comparison src/gtkrequest.c @ 10791:2ab4b5acc8d1

[gaim-migrate @ 12433] " When you autocomplete a screenname in a dialog box that also includes an account selector, it should also autocomplete the account. This patch implements that." --rlaager this is how I would expect things to work. I was hit by this just the other day. committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Thu, 07 Apr 2005 15:22:21 +0000
parents d83f745c997b
children 6240d7fd5b2c
comparison
equal deleted inserted replaced
10790:35edd4d021a4 10791:2ab4b5acc8d1
671 671
672 #ifdef NEW_STYLE_COMPLETION 672 #ifdef NEW_STYLE_COMPLETION
673 names = g_list_append(names, ((GaimContact *)cnode)->alias); 673 names = g_list_append(names, ((GaimContact *)cnode)->alias);
674 names = g_list_append(names, 674 names = g_list_append(names,
675 (gpointer)gaim_buddy_get_contact_alias(buddy)); 675 (gpointer)gaim_buddy_get_contact_alias(buddy));
676 names = g_list_append(names, buddy->account);
676 #endif /* NEW_STYLE_COMPLETION */ 677 #endif /* NEW_STYLE_COMPLETION */
677 678
678 names = g_list_append(names, buddy->name); 679 names = g_list_append(names, buddy->name);
679 } 680 }
680 } 681 }
803 804
804 return ret; 805 return ret;
805 } 806 }
806 807
807 static gboolean screenname_completion_match_selected_cb(GtkEntryCompletion *completion, 808 static gboolean screenname_completion_match_selected_cb(GtkEntryCompletion *completion,
808 GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { 809 GtkTreeModel *model, GtkTreeIter *iter, gpointer *user_data) {
809 810
810 GValue val = { 0, }; 811 GValue val = { 0, };
812 GaimRequestField *screen_field = user_data[1];
813 GList *fields = screen_field->group->fields;
811 814
812 gtk_tree_model_get_value(model, iter, 1, &val); 815 gtk_tree_model_get_value(model, iter, 1, &val);
813 gtk_entry_set_text(GTK_ENTRY(user_data), g_value_get_string(&val)); 816 gtk_entry_set_text(GTK_ENTRY(user_data[0]), g_value_get_string(&val));
814 g_value_unset(&val); 817 g_value_unset(&val);
818
819 do {
820 GaimRequestField *field = fields->data;
821
822 if (gaim_request_field_get_type(field) == GAIM_REQUEST_FIELD_ACCOUNT) {
823 const char *type_hint = gaim_request_field_get_type_hint(field);
824
825 if (type_hint != NULL && !strcmp(type_hint, "account")) {
826 /* We found the corresponding account field. */
827 GaimAccount *account;
828 GtkOptionMenu *optmenu = GTK_OPTION_MENU(field->ui_data);
829
830 gtk_tree_model_get_value(model, iter, 3, &val);
831 account = g_value_get_pointer(&val);
832 g_value_unset(&val);
833
834 /* Set the account in the request API. */
835 gaim_request_field_account_set_value(field, account);
836
837 if (optmenu != NULL) {
838 GList *items = GTK_MENU_SHELL(gtk_option_menu_get_menu(optmenu))->children;
839 guint index = 0;
840
841 do {
842 if (account == g_object_get_data(G_OBJECT(items->data), "account")) {
843 /* Set the account in the GUI. */
844
845 gtk_option_menu_set_history(GTK_OPTION_MENU(field->ui_data), index);
846 return TRUE;
847 }
848 index++;
849 } while ((items = items->next) != NULL);
850 }
851
852 return TRUE;
853 }
854 }
855
856 } while ((fields = fields->next) != NULL);
815 857
816 return TRUE; 858 return TRUE;
817 } 859 }
818 #endif /* !NEW_STYLE_COMPLETION */ 860 #endif /* !NEW_STYLE_COMPLETION */
819 861
822 { 864 {
823 #ifdef NEW_STYLE_COMPLETION 865 #ifdef NEW_STYLE_COMPLETION
824 GtkListStore *store; 866 GtkListStore *store;
825 GtkTreeIter iter; 867 GtkTreeIter iter;
826 GtkEntryCompletion *completion; 868 GtkEntryCompletion *completion;
827 GList *aliases_and_screennames, *l; 869 GList *aliases_and_screennames;
870 GList *l;
871 gpointer *data;
828 872
829 /* Store the displayed completion value, the screenname, and the value for comparison. */ 873 /* Store the displayed completion value, the screenname, and the value for comparison. */
830 store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); 874 store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
831 875
832 aliases_and_screennames = get_online_names(); 876 aliases_and_screennames = get_online_names();
833 877
834 /* Loop through the list three elements at a time. */ 878 /* Loop through the list four elements at a time. */
835 for (l = aliases_and_screennames; l != NULL; l = l->next->next->next) 879 for (l = aliases_and_screennames; l != NULL; l = l->next->next->next->next)
836 { 880 {
837 char *contact_alias = l->data; 881 char *contact_alias = l->data;
838 char *buddy_alias = l->next->data; 882 char *buddy_alias = l->next->data;
839 char *screenname = l->next->next->data; 883 GaimAccount *account = l->next->next->data;
884 char *screenname = l->next->next->next->data;
840 gboolean completion_added = FALSE; 885 gboolean completion_added = FALSE;
841 886
842 /* There's no sense listing things like: 'xxx "xxx"' 887 /* There's no sense listing things like: 'xxx "xxx"'
843 when the screenname and buddy alias match. */ 888 when the screenname and buddy alias match. */
844 if (buddy_alias && strcmp(buddy_alias, screenname)) { 889 if (buddy_alias && strcmp(buddy_alias, screenname)) {
846 gtk_list_store_append(store, &iter); 891 gtk_list_store_append(store, &iter);
847 gtk_list_store_set(store, &iter, 892 gtk_list_store_set(store, &iter,
848 0, completion_entry, 893 0, completion_entry,
849 1, screenname, 894 1, screenname,
850 2, buddy_alias, 895 2, buddy_alias,
896 3, account,
851 -1); 897 -1);
852 g_free(completion_entry); 898 g_free(completion_entry);
853 completion_added = TRUE; 899 completion_added = TRUE;
854 } 900 }
855 901
863 gtk_list_store_append(store, &iter); 909 gtk_list_store_append(store, &iter);
864 gtk_list_store_set(store, &iter, 910 gtk_list_store_set(store, &iter,
865 0, completion_entry, 911 0, completion_entry,
866 1, screenname, 912 1, screenname,
867 2, contact_alias, 913 2, contact_alias,
914 3, account,
868 -1); 915 -1);
869 g_free(completion_entry); 916 g_free(completion_entry);
870 completion_added = TRUE; 917 completion_added = TRUE;
871 } 918 }
872 } 919 }
876 gtk_list_store_append(store, &iter); 923 gtk_list_store_append(store, &iter);
877 gtk_list_store_set(store, &iter, 924 gtk_list_store_set(store, &iter,
878 0, screenname, 925 0, screenname,
879 1, screenname, 926 1, screenname,
880 2, NULL, 927 2, NULL,
928 3, account,
881 -1); 929 -1);
882 } 930 }
883 } 931 }
884 932
885 g_list_free(aliases_and_screennames); 933 g_list_free(aliases_and_screennames);
886 934
887 completion = gtk_entry_completion_new(); 935 completion = gtk_entry_completion_new();
888 gtk_entry_completion_set_match_func(completion, screenname_completion_match_func, NULL, NULL); 936 gtk_entry_completion_set_match_func(completion, screenname_completion_match_func, NULL, NULL);
937
938 data = g_new0(gpointer, 2);
939 data[0] = entry;
940 data[1] = field;
889 g_signal_connect(G_OBJECT(completion), "match-selected", 941 g_signal_connect(G_OBJECT(completion), "match-selected",
890 G_CALLBACK(screenname_completion_match_selected_cb), entry); 942 G_CALLBACK(screenname_completion_match_selected_cb), data);
943
891 gtk_entry_set_completion(GTK_ENTRY(entry), completion); 944 gtk_entry_set_completion(GTK_ENTRY(entry), completion);
892 g_object_unref(completion); 945 g_object_unref(completion);
893 946
894 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); 947 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store));
895 g_object_unref(store); 948 g_object_unref(store);