2 * Evolution integration plugin for Purple
4 * Copyright (C) 2003 Christian Hammond.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 #include "gtk3compat.h"
30 #include "gevolution.h"
44 delete_win_cb(GtkWidget
*w
, GdkEvent
*event
, GevoAddBuddyDialog
*dialog
)
46 gtk_widget_destroy(dialog
->win
);
48 g_list_free_full(dialog
->contacts
, g_object_unref
);
50 if (dialog
->book
!= NULL
)
51 g_object_unref(dialog
->book
);
53 gevo_addrbooks_model_unref(dialog
->addrbooks
);
55 g_free(dialog
->username
);
63 new_person_cb(GtkWidget
*w
, GevoAddBuddyDialog
*dialog
)
65 const char *group_name
;
68 pidgin_text_combo_box_entry_get_text(dialog
->group_combo
);
70 gevo_new_person_dialog_show(dialog
->book
, NULL
, dialog
->account
, dialog
->username
,
71 (*group_name
? group_name
: NULL
),
74 delete_win_cb(NULL
, NULL
, dialog
);
78 cancel_cb(GtkWidget
*w
, GevoAddBuddyDialog
*dialog
)
80 delete_win_cb(NULL
, NULL
, dialog
);
84 select_buddy_cb(GtkWidget
*w
, GevoAddBuddyDialog
*dialog
)
86 GtkTreeSelection
*selection
;
88 const char *group_name
;
93 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog
->treeview
));
95 if (!gtk_tree_selection_get_selected(selection
, NULL
, &iter
))
98 gtk_tree_model_get(GTK_TREE_MODEL(dialog
->model
), &iter
,
99 COLUMN_NAME
, &fullname
,
100 COLUMN_USERNAME
, &username
,
101 COLUMN_DATA
, &contact
,
105 pidgin_text_combo_box_entry_get_text(dialog
->group_combo
);
107 if (username
== NULL
|| *username
== '\0')
109 gevo_new_person_dialog_show(dialog
->book
, NULL
, dialog
->account
, dialog
->username
,
110 (*group_name
? group_name
: NULL
),
115 gevo_add_buddy(dialog
->account
, group_name
, username
, fullname
);
118 delete_win_cb(NULL
, NULL
, dialog
);
122 add_columns(GevoAddBuddyDialog
*dialog
)
124 GtkCellRenderer
*renderer
;
125 GtkTreeViewColumn
*column
;
128 column
= gtk_tree_view_column_new();
129 gtk_tree_view_column_set_title(column
, _("Name"));
130 gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog
->treeview
), column
, -1);
131 gtk_tree_view_column_set_sort_column_id(column
, COLUMN_NAME
);
133 renderer
= gtk_cell_renderer_text_new();
134 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
135 gtk_tree_view_column_add_attribute(column
, renderer
,
136 "text", COLUMN_NAME
);
139 column
= gtk_tree_view_column_new();
140 gtk_tree_view_column_set_title(column
, _("Instant Messaging"));
141 gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog
->treeview
), column
, -1);
142 gtk_tree_view_column_set_sort_column_id(column
, COLUMN_USERNAME
);
145 renderer
= gtk_cell_renderer_pixbuf_new();
146 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
147 gtk_tree_view_column_add_attribute(column
, renderer
,
148 "pixbuf", COLUMN_PROTOCOL_ICON
);
151 renderer
= gtk_cell_renderer_text_new();
152 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
153 gtk_tree_view_column_add_attribute(column
, renderer
,
154 "text", COLUMN_USERNAME
);
158 add_ims(GevoAddBuddyDialog
*dialog
, EContact
*contact
, const char *name
,
159 GList
*list
, const char *id
)
161 PurpleAccount
*account
= NULL
;
169 for (l
= purple_connections_get_all(); l
!= NULL
; l
= l
->next
)
171 PurpleConnection
*gc
= (PurpleConnection
*)l
->data
;
173 account
= purple_connection_get_account(gc
);
175 if (purple_strequal(purple_account_get_protocol_id(account
), id
))
184 pixbuf
= pidgin_create_protocol_icon(account
, PIDGIN_PROTOCOL_ICON_SMALL
);
186 for (l
= list
; l
!= NULL
; l
= l
->next
)
188 char *account_name
= (char *)l
->data
;
190 if (account_name
== NULL
)
193 if (purple_blist_find_buddy(dialog
->account
, account_name
) != NULL
)
196 gtk_list_store_append(dialog
->model
, &iter
);
198 gtk_list_store_set(dialog
->model
, &iter
,
200 COLUMN_PROTOCOL_ICON
, pixbuf
,
201 COLUMN_USERNAME
, account_name
,
202 COLUMN_DATA
, contact
,
205 if (purple_strequal(purple_account_get_protocol_id(account
),
206 purple_account_get_protocol_id(dialog
->account
)) &&
207 dialog
->username
!= NULL
&&
208 purple_strequal(account_name
, dialog
->username
))
210 GtkTreeSelection
*selection
;
212 /* This is it. Select it. */
213 selection
= gtk_tree_view_get_selection(
214 GTK_TREE_VIEW(dialog
->treeview
));
216 gtk_tree_selection_select_iter(selection
, &iter
);
221 g_object_unref(G_OBJECT(pixbuf
));
223 g_list_free_full(list
, g_free
);
227 populate_treeview(GevoAddBuddyDialog
*dialog
, const gchar
*uid
)
235 if (dialog
->book
!= NULL
)
237 g_object_unref(dialog
->book
);
241 if (dialog
->contacts
!= NULL
)
243 g_list_free_full(dialog
->contacts
, g_object_unref
);
244 dialog
->contacts
= NULL
;
247 gtk_list_store_clear(dialog
->model
);
249 if (!gevo_load_addressbook(uid
, &book
, &err
)) {
250 purple_debug_error("evolution",
251 "Error retrieving default addressbook: %s\n", err
->message
);
257 query
= e_book_query_field_exists(E_CONTACT_FULL_NAME
);
261 purple_debug_error("evolution", "Error in creating query\n");
263 g_object_unref(book
);
268 status
= e_book_get_contacts(book
, query
, &cards
, NULL
);
270 e_book_query_unref(query
);
274 purple_debug_error("evolution", "Error %d in getting card list\n",
277 g_object_unref(book
);
282 for (c
= cards
; c
!= NULL
; c
= c
->next
)
284 EContact
*contact
= E_CONTACT(c
->data
);
286 GList
*aims
, *jabbers
, *icqs
, *novells
, *ggs
;
288 name
= e_contact_get_const(contact
, E_CONTACT_FULL_NAME
);
290 aims
= e_contact_get(contact
, E_CONTACT_IM_AIM
);
291 jabbers
= e_contact_get(contact
, E_CONTACT_IM_JABBER
);
292 icqs
= e_contact_get(contact
, E_CONTACT_IM_ICQ
);
293 novells
= e_contact_get(contact
, E_CONTACT_IM_GROUPWISE
);
294 ggs
= e_contact_get(contact
, E_CONTACT_IM_GADUGADU
);
296 if (aims
== NULL
&& jabbers
== NULL
&&
297 icqs
== NULL
&& novells
== NULL
&& ggs
== NULL
)
301 gtk_list_store_append(dialog
->model
, &iter
);
303 gtk_list_store_set(dialog
->model
, &iter
,
305 COLUMN_DATA
, contact
,
310 add_ims(dialog
, contact
, name
, aims
, "prpl-aim");
311 add_ims(dialog
, contact
, name
, jabbers
, "prpl-jabber");
312 add_ims(dialog
, contact
, name
, icqs
, "prpl-icq");
313 add_ims(dialog
, contact
, name
, novells
, "prpl-novell");
314 add_ims(dialog
, contact
, name
, ggs
, "prpl-gg");
318 dialog
->contacts
= cards
;
323 addrbook_change_cb(GtkComboBox
*combo
, GevoAddBuddyDialog
*dialog
)
326 const char *esource_uid
;
328 if (!gtk_combo_box_get_active_iter(combo
, &iter
))
331 gtk_tree_model_get(GTK_TREE_MODEL(dialog
->addrbooks
), &iter
,
332 ADDRBOOK_COLUMN_UID
, &esource_uid
, -1);
334 populate_treeview(dialog
, esource_uid
);
338 selected_cb(GtkTreeSelection
*sel
, GevoAddBuddyDialog
*dialog
)
340 GtkTreeSelection
*selection
;
342 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog
->treeview
));
343 gtk_widget_set_sensitive(dialog
->select_button
,
344 gtk_tree_selection_get_selected(selection
, NULL
, NULL
));
348 search_changed_cb(GtkEntry
*entry
, GevoAddBuddyDialog
*dialog
)
350 const char *text
= gtk_entry_get_text(entry
);
353 gtk_list_store_clear(dialog
->model
);
355 for (l
= dialog
->contacts
; l
!= NULL
; l
= l
->next
)
357 EContact
*contact
= E_CONTACT(l
->data
);
359 GList
*aims
, *jabbers
, *icqs
, *novells
, *ggs
;
361 name
= e_contact_get_const(contact
, E_CONTACT_FULL_NAME
);
363 if (text
!= NULL
&& *text
!= '\0' && name
!= NULL
&&
364 g_ascii_strncasecmp(name
, text
, strlen(text
)))
369 aims
= e_contact_get(contact
, E_CONTACT_IM_AIM
);
370 jabbers
= e_contact_get(contact
, E_CONTACT_IM_JABBER
);
371 icqs
= e_contact_get(contact
, E_CONTACT_IM_ICQ
);
372 novells
= e_contact_get(contact
, E_CONTACT_IM_GROUPWISE
);
373 ggs
= e_contact_get(contact
, E_CONTACT_IM_GADUGADU
);
375 if (aims
== NULL
&& jabbers
== NULL
&&
376 icqs
== NULL
&& novells
== NULL
&& ggs
== NULL
)
380 gtk_list_store_append(dialog
->model
, &iter
);
382 gtk_list_store_set(dialog
->model
, &iter
,
384 COLUMN_DATA
, contact
,
389 add_ims(dialog
, contact
, name
, aims
, "prpl-aim");
390 add_ims(dialog
, contact
, name
, jabbers
, "prpl-jabber");
391 add_ims(dialog
, contact
, name
, icqs
, "prpl-icq");
392 add_ims(dialog
, contact
, name
, novells
, "prpl-novell");
393 add_ims(dialog
, contact
, name
, ggs
, "prpl-gg");
399 clear_cb(GtkWidget
*w
, GevoAddBuddyDialog
*dialog
)
401 static gboolean lock
= FALSE
;
407 gtk_entry_set_text(GTK_ENTRY(dialog
->search_field
), "");
412 gevo_add_buddy_dialog_show(PurpleAccount
*account
, const char *username
,
413 const char *group
, const char *alias
)
415 GevoAddBuddyDialog
*dialog
;
422 GtkTreeSelection
*selection
;
423 GtkCellRenderer
*cell
;
425 dialog
= g_new0(GevoAddBuddyDialog
, 1);
430 : purple_connection_get_account(purple_connections_get_all()->data
));
432 if (username
!= NULL
)
433 dialog
->username
= g_strdup(username
);
435 dialog
->win
= pidgin_create_window(_("Add Buddy"), PIDGIN_HIG_BORDER
, "add_buddy", TRUE
);
436 gtk_widget_set_size_request(dialog
->win
, -1, 400);
438 g_signal_connect(G_OBJECT(dialog
->win
), "delete_event",
439 G_CALLBACK(delete_win_cb
), dialog
);
442 vbox
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, 12);
443 gtk_container_add(GTK_CONTAINER(dialog
->win
), vbox
);
444 gtk_widget_show(vbox
);
447 label
= gtk_label_new(_("Select a person from your address book below, "
448 "or add a new person."));
449 gtk_label_set_line_wrap(GTK_LABEL(label
), TRUE
);
450 gtk_label_set_xalign(GTK_LABEL(label
), 0);
451 gtk_label_set_yalign(GTK_LABEL(label
), 0);
452 gtk_box_pack_start(GTK_BOX(vbox
), label
, FALSE
, TRUE
, 0);
453 gtk_widget_show(label
);
455 /* Add the search hbox */
456 hbox
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 6);
457 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, TRUE
, 0);
458 gtk_widget_show(hbox
);
461 label
= gtk_label_new(_("Search"));
462 gtk_box_pack_start(GTK_BOX(hbox
), label
, FALSE
, FALSE
, 0);
463 gtk_widget_show(label
);
466 dialog
->addrbooks
= gevo_addrbooks_model_new();
468 dialog
->addrbooks_combo
= gtk_combo_box_new_with_model(
470 cell
= gtk_cell_renderer_text_new();
471 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dialog
->addrbooks_combo
),
473 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dialog
->addrbooks_combo
),
475 "text", ADDRBOOK_COLUMN_NAME
,
477 gtk_box_pack_start(GTK_BOX(hbox
), dialog
->addrbooks_combo
, FALSE
,
479 gtk_widget_show(dialog
->addrbooks_combo
);
482 dialog
->search_field
= gtk_entry_new();
483 gtk_box_pack_start(GTK_BOX(hbox
), dialog
->search_field
, TRUE
, TRUE
, 0);
484 gtk_widget_show(dialog
->search_field
);
486 g_signal_connect(G_OBJECT(dialog
->search_field
), "changed",
487 G_CALLBACK(search_changed_cb
), dialog
);
490 button
= gtk_button_new_with_mnemonic(_("C_lear"));
491 gtk_box_pack_start(GTK_BOX(hbox
), button
, FALSE
, FALSE
, 0);
492 gtk_widget_show(button
);
494 g_signal_connect(G_OBJECT(button
), "clicked",
495 G_CALLBACK(clear_cb
), dialog
);
497 /* Create the list model for the treeview. */
498 dialog
->model
= gtk_list_store_new(NUM_COLUMNS
,
499 G_TYPE_STRING
, GDK_TYPE_PIXBUF
,
500 G_TYPE_STRING
, G_TYPE_POINTER
);
502 /* Now for the treeview */
504 gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog
->model
));
505 gtk_box_pack_start(GTK_BOX(vbox
),
506 pidgin_make_scrollable(dialog
->treeview
, GTK_POLICY_AUTOMATIC
, GTK_POLICY_ALWAYS
, GTK_SHADOW_IN
, -1, -1),
508 gtk_widget_show(dialog
->treeview
);
510 selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog
->treeview
));
512 gtk_tree_selection_set_mode(selection
, GTK_SELECTION_SINGLE
);
514 g_signal_connect(G_OBJECT(selection
), "changed",
515 G_CALLBACK(selected_cb
), dialog
);
520 * Catch addressbook selection and populate treeview with the first
523 gevo_addrbooks_model_populate(dialog
->addrbooks
);
524 g_signal_connect(G_OBJECT(dialog
->addrbooks_combo
), "changed",
525 G_CALLBACK(addrbook_change_cb
), dialog
);
526 gtk_combo_box_set_active(GTK_COMBO_BOX(dialog
->addrbooks_combo
), 0);
529 dialog
->group_combo
=
530 pidgin_text_combo_box_entry_new(group
, gevo_get_groups());
531 pidgin_add_widget_to_vbox(GTK_BOX(vbox
), _("Group:"), NULL
,
532 dialog
->group_combo
, TRUE
, NULL
);
533 gtk_widget_show_all(dialog
->group_combo
);
535 /* Cool. Now we only have a little left... */
538 sep
= gtk_separator_new(GTK_ORIENTATION_HORIZONTAL
);
539 gtk_box_pack_start(GTK_BOX(vbox
), sep
, FALSE
, FALSE
, 0);
540 gtk_widget_show(sep
);
543 bbox
= gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL
);
544 gtk_box_set_spacing(GTK_BOX(bbox
), 6);
545 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox
), GTK_BUTTONBOX_END
);
546 gtk_box_pack_end(GTK_BOX(vbox
), bbox
, FALSE
, TRUE
, 0);
547 gtk_widget_show(bbox
);
549 /* "New Person" button */
550 button
= gtk_button_new_with_mnemonic(_("_New Person"));
551 gtk_box_pack_start(GTK_BOX(bbox
), button
, FALSE
, FALSE
, 0);
552 gtk_widget_show(button
);
554 g_signal_connect(G_OBJECT(button
), "clicked",
555 G_CALLBACK(new_person_cb
), dialog
);
557 /* "Cancel" button */
558 button
= gtk_button_new_with_mnemonic(_("_Cancel"));
559 gtk_box_pack_start(GTK_BOX(bbox
), button
, FALSE
, FALSE
, 0);
560 gtk_widget_show(button
);
562 g_signal_connect(G_OBJECT(button
), "clicked",
563 G_CALLBACK(cancel_cb
), dialog
);
565 /* "Select Buddy" button */
566 button
= gtk_button_new_with_mnemonic(_("_Select Buddy"));
567 dialog
->select_button
= button
;
568 gtk_box_pack_start(GTK_BOX(bbox
), button
, FALSE
, FALSE
, 0);
569 gtk_widget_set_sensitive(button
, FALSE
);
570 gtk_widget_show(button
);
572 g_signal_connect(G_OBJECT(button
), "clicked",
573 G_CALLBACK(select_buddy_cb
), dialog
);
576 gtk_widget_show(dialog
->win
);
580 gevo_add_buddy_dialog_add_person(GevoAddBuddyDialog
*dialog
,
581 EContact
*contact
, const char *name
,
582 PurpleAccount
*account
, const char *screenname
)
587 pixbuf
= pidgin_create_protocol_icon(account
, PIDGIN_PROTOCOL_ICON_SMALL
);
589 gtk_list_store_append(dialog
->model
, &iter
);
591 gtk_list_store_set(dialog
->model
, &iter
,
593 COLUMN_PROTOCOL_ICON
, pixbuf
,
594 COLUMN_DATA
, contact
,
595 COLUMN_USERNAME
, screenname
,
599 dialog
->contacts
= g_list_append(dialog
->contacts
, contact
);
602 g_object_unref(G_OBJECT(pixbuf
));