comparison plugins/gevolution/assoc-buddy.c @ 10081:ff4be2d1401d

[gaim-migrate @ 11071] Merge the gevolution changes back to HEAD. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 06 Oct 2004 03:17:24 +0000
parents c00def44d76a
children 455c0830d108
comparison
equal deleted inserted replaced
10080:8e6329b8dcc1 10081:ff4be2d1401d
29 29
30 #include "gevolution.h" 30 #include "gevolution.h"
31 31
32 #include <stdlib.h> 32 #include <stdlib.h>
33 #include <bonobo/bonobo-main.h> 33 #include <bonobo/bonobo-main.h>
34 #include <gtk/gtk.h>
34 35
35 enum 36 enum
36 { 37 {
37 COLUMN_NAME, 38 COLUMN_NAME,
38 COLUMN_DATA, 39 COLUMN_DATA,
42 static gint 43 static gint
43 delete_win_cb(GtkWidget *w, GdkEvent *event, GevoAssociateBuddyDialog *dialog) 44 delete_win_cb(GtkWidget *w, GdkEvent *event, GevoAssociateBuddyDialog *dialog)
44 { 45 {
45 gtk_widget_destroy(dialog->win); 46 gtk_widget_destroy(dialog->win);
46 47
47 g_list_foreach(dialog->contacts, (GFunc)g_free, NULL);
48
49 if (dialog->contacts != NULL) 48 if (dialog->contacts != NULL)
49 {
50 g_list_foreach(dialog->contacts, (GFunc)g_object_unref, NULL);
50 g_list_free(dialog->contacts); 51 g_list_free(dialog->contacts);
52 }
51 53
52 g_object_unref(dialog->book); 54 g_object_unref(dialog->book);
55 gevo_addrbooks_model_unref(dialog->addrbooks);
53 56
54 g_free(dialog); 57 g_free(dialog);
55 58
56 return 0; 59 return 0;
57 }
58
59 static void
60 populate_address_books(GevoAssociateBuddyDialog *dialog)
61 {
62 GtkWidget *item;
63 GtkWidget *menu;
64 #if notyet
65 ESourceList *addressbooks;
66 GSList *groups, *g;
67 #endif
68
69 menu =
70 gtk_option_menu_get_menu(GTK_OPTION_MENU(dialog->addressbooks_menu));
71
72 item = gtk_menu_item_new_with_label(_("Local Addressbook"));
73 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
74 gtk_widget_show(item);
75
76 #if notyet
77 if (!e_book_get_addressbooks(&addressbooks, NULL))
78 {
79 gaim_debug_error("evolution",
80 "Unable to fetch list of address books.\n");
81
82 item = gtk_menu_item_new_with_label(_("None"));
83 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
84 gtk_widget_show(item);
85
86 return;
87 }
88
89 groups = e_source_list_peek_groups(addressbooks);
90
91 if (groups == NULL)
92 {
93 item = gtk_menu_item_new_with_label(_("None"));
94 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
95 gtk_widget_show(item);
96
97 return;
98 }
99
100 for (g = groups; g != NULL; g = g->next)
101 {
102 GSList *sources, *s;
103
104 sources = e_source_group_peek_sources(g->data);
105
106 for (s = sources; s != NULL; s = s->next)
107 {
108 ESource *source = E_SOURCE(s->data);
109
110 item = gtk_menu_item_new_with_label(e_source_peek_name(source));
111 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
112 gtk_widget_show(item);
113 }
114 }
115 #endif
116 } 60 }
117 61
118 static void 62 static void
119 search_changed_cb(GtkEntry *entry, GevoAssociateBuddyDialog *dialog) 63 search_changed_cb(GtkEntry *entry, GevoAssociateBuddyDialog *dialog)
120 { 64 {
182 gtk_tree_view_column_add_attribute(column, renderer, 126 gtk_tree_view_column_add_attribute(column, renderer,
183 "text", COLUMN_NAME); 127 "text", COLUMN_NAME);
184 } 128 }
185 129
186 static void 130 static void
187 populate_treeview(GevoAssociateBuddyDialog *dialog) 131 populate_treeview(GevoAssociateBuddyDialog *dialog, const gchar *uri)
188 { 132 {
133 EBook *book;
189 EBookQuery *query; 134 EBookQuery *query;
190 EBook *book;
191 const char *prpl_id; 135 const char *prpl_id;
192 gboolean status; 136 gboolean status;
193 GList *cards, *c; 137 GList *cards, *c;
194 138
195 if (!gevo_load_addressbook(&book, NULL)) 139 if (dialog->book != NULL)
140 {
141 g_object_unref(dialog->book);
142 dialog->book = NULL;
143 }
144
145 if (dialog->contacts != NULL)
146 {
147 g_list_foreach(dialog->contacts, (GFunc) g_object_unref, NULL);
148 g_list_free(dialog->contacts);
149 dialog->contacts = NULL;
150 }
151
152 gtk_list_store_clear(dialog->model);
153
154 if (!gevo_load_addressbook(uri, &book, NULL))
196 { 155 {
197 gaim_debug_error("evolution", 156 gaim_debug_error("evolution",
198 "Error retrieving default addressbook\n"); 157 "Error retrieving addressbook\n");
199 158
200 return; 159 return;
201 } 160 }
202 161
203 query = e_book_query_field_exists(E_CONTACT_FULL_NAME); 162 query = e_book_query_field_exists(E_CONTACT_FULL_NAME);
273 dialog->contacts = cards; 232 dialog->contacts = cards;
274 dialog->book = book; 233 dialog->book = book;
275 } 234 }
276 235
277 static void 236 static void
237 addrbook_change_cb(GtkComboBox *combo, GevoAssociateBuddyDialog *dialog)
238 {
239 GtkTreeIter iter;
240 const char *esource_uri;
241
242 if (!gtk_combo_box_get_active_iter(combo, &iter))
243 return;
244
245 gtk_tree_model_get(GTK_TREE_MODEL(dialog->addrbooks), &iter,
246 ADDRBOOK_COLUMN_URI, &esource_uri,
247 -1);
248
249 populate_treeview(dialog, esource_uri);
250 }
251
252 static void
278 new_person_cb(GtkWidget *w, GevoAssociateBuddyDialog *dialog) 253 new_person_cb(GtkWidget *w, GevoAssociateBuddyDialog *dialog)
279 { 254 {
280 gevo_new_person_dialog_show(NULL, dialog->buddy->account, 255 gevo_new_person_dialog_show(dialog->book, NULL, dialog->buddy->account,
281 dialog->buddy->name, NULL, dialog->buddy, 256 dialog->buddy->name, NULL, dialog->buddy,
282 TRUE); 257 TRUE);
283 258
284 delete_win_cb(NULL, NULL, dialog); 259 delete_win_cb(NULL, NULL, dialog);
285 } 260 }
313 288
314 if (protocol_field == 0) 289 if (protocol_field == 0)
315 return; /* XXX */ 290 return; /* XXX */
316 291
317 list = e_contact_get(contact, protocol_field); 292 list = e_contact_get(contact, protocol_field);
318
319 list = g_list_append(list, g_strdup(dialog->buddy->name)); 293 list = g_list_append(list, g_strdup(dialog->buddy->name));
320 294
321 e_contact_set(contact, protocol_field, list); 295 e_contact_set(contact, protocol_field, list);
296
322 if (!e_book_commit_contact(dialog->book, contact, NULL)) 297 if (!e_book_commit_contact(dialog->book, contact, NULL))
323 {
324 gaim_debug_error("evolution", "Error adding contact to book\n"); 298 gaim_debug_error("evolution", "Error adding contact to book\n");
325 }
326 299
327 /* Free the list. */ 300 /* Free the list. */
328 g_list_foreach(list, (GFunc)g_free, NULL); 301 g_list_foreach(list, (GFunc)g_free, NULL);
329 g_list_free(list); 302 g_list_free(list);
330 303
339 GtkWidget *sw; 312 GtkWidget *sw;
340 GtkWidget *label; 313 GtkWidget *label;
341 GtkWidget *vbox; 314 GtkWidget *vbox;
342 GtkWidget *hbox; 315 GtkWidget *hbox;
343 GtkWidget *bbox; 316 GtkWidget *bbox;
344 GtkWidget *menu;
345 GtkWidget *sep; 317 GtkWidget *sep;
346 GtkWidget *disclosure; 318 GtkWidget *disclosure;
347 GtkTreeSelection *selection; 319 GtkTreeSelection *selection;
320 GtkCellRenderer *cell;
348 321
349 g_return_val_if_fail(buddy != NULL, NULL); 322 g_return_val_if_fail(buddy != NULL, NULL);
350 323
351 dialog = g_new0(GevoAssociateBuddyDialog, 1); 324 dialog = g_new0(GevoAssociateBuddyDialog, 1);
352 325
381 label = gtk_label_new(_("Search")); 354 label = gtk_label_new(_("Search"));
382 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 355 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
383 gtk_widget_show(label); 356 gtk_widget_show(label);
384 357
385 /* Addressbooks */ 358 /* Addressbooks */
386 dialog->addressbooks_menu = gtk_option_menu_new(); 359 dialog->addrbooks = gevo_addrbooks_model_new();
387 menu = gtk_menu_new(); 360
388 gtk_option_menu_set_menu(GTK_OPTION_MENU(dialog->addressbooks_menu), menu); 361 dialog->addrbooks_combo = gtk_combo_box_new_with_model(dialog->addrbooks);
389 362 cell = gtk_cell_renderer_text_new();
390 populate_address_books(dialog); 363 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dialog->addrbooks_combo),
391 364 cell, TRUE);
392 gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->addressbooks_menu), 0); 365 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dialog->addrbooks_combo),
393 366 cell,
394 gtk_box_pack_start(GTK_BOX(hbox), dialog->addressbooks_menu, 367 "text", ADDRBOOK_COLUMN_NAME,
395 FALSE, FALSE, 0); 368 NULL);
396 gtk_widget_show(dialog->addressbooks_menu); 369 gtk_box_pack_start(GTK_BOX(hbox), dialog->addrbooks_combo, FALSE, FALSE, 0);
370 gtk_widget_show(dialog->addrbooks_combo);
371
397 372
398 /* Search field */ 373 /* Search field */
399 dialog->search_field = gtk_entry_new(); 374 dialog->search_field = gtk_entry_new();
400 gtk_box_pack_start(GTK_BOX(hbox), dialog->search_field, TRUE, TRUE, 0); 375 gtk_box_pack_start(GTK_BOX(hbox), dialog->search_field, TRUE, TRUE, 0);
401 gtk_widget_show(dialog->search_field); 376 gtk_widget_show(dialog->search_field);
424 /* Create the list model for the treeview. */ 399 /* Create the list model for the treeview. */
425 dialog->model = gtk_list_store_new(NUM_COLUMNS, 400 dialog->model = gtk_list_store_new(NUM_COLUMNS,
426 G_TYPE_STRING, G_TYPE_POINTER); 401 G_TYPE_STRING, G_TYPE_POINTER);
427 402
428 /* Now for the treeview */ 403 /* Now for the treeview */
429 dialog->treeview = 404 dialog->treeview = gtk_tree_view_new_with_model(
430 gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); 405 GTK_TREE_MODEL(dialog->model));
431 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dialog->treeview), TRUE); 406 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dialog->treeview), TRUE);
432 gtk_container_add(GTK_CONTAINER(sw), dialog->treeview); 407 gtk_container_add(GTK_CONTAINER(sw), dialog->treeview);
433 gtk_widget_show(dialog->treeview); 408 gtk_widget_show(dialog->treeview);
434 409
435 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); 410 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview));
439 g_signal_connect(G_OBJECT(selection), "changed", 414 g_signal_connect(G_OBJECT(selection), "changed",
440 G_CALLBACK(selected_cb), dialog); 415 G_CALLBACK(selected_cb), dialog);
441 416
442 add_columns(dialog); 417 add_columns(dialog);
443 418
444 populate_treeview(dialog); 419 /*
420 * Catch addressbook selection and populate treeview with the first
421 * addressbook
422 */
423 gevo_addrbooks_model_populate( dialog->addrbooks );
424 g_signal_connect(G_OBJECT(dialog->addrbooks_combo), "changed",
425 G_CALLBACK(addrbook_change_cb), dialog);
426 gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->addrbooks_combo), 0);
445 427
446 /* Add the disclosure */ 428 /* Add the disclosure */
447 disclosure = gaim_disclosure_new(_("Show user details"), 429 disclosure = gaim_disclosure_new(_("Show user details"),
448 _("Hide user details")); 430 _("Hide user details"));
449 gtk_box_pack_start(GTK_BOX(vbox), disclosure, FALSE, FALSE, 0); 431 gtk_box_pack_start(GTK_BOX(vbox), disclosure, FALSE, FALSE, 0);