Sun, 22 Jul 2007 08:14:16 +0000
revert 'no visible tabs when only one conversation' as it proved unpopular. Made tabs only fill the entire width of the notebook when there's only one tab to avoid http://pidgin.im/~deryni/that_just_looks_dumb.png
| 8089 | 1 | /* |
| 15884 | 2 | * Evolution integration plugin for Purple |
| 8089 | 3 | * |
| 4 | * Copyright (C) 2003 Christian Hammond. | |
| 5 | * | |
| 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. | |
| 10 | * | |
| 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. | |
| 15 | * | |
| 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., 59 Temple Place - Suite 330, Boston, MA | |
| 19 | * 02111-1307, USA. | |
| 20 | */ | |
|
9825
85a5ebe9315f
[gaim-migrate @ 10696]
Christian Hammond <chipx86@chipx86.com>
parents:
9824
diff
changeset
|
21 | #include "internal.h" |
| 8089 | 22 | #include "gtkblist.h" |
| 15577 | 23 | #include "pidgin.h" |
| 8089 | 24 | #include "gtkutils.h" |
| 25 | ||
| 26 | #include "debug.h" | |
| 27 | ||
| 28 | #include "gevolution.h" | |
| 29 | ||
| 30 | #include <stdlib.h> | |
| 31 | ||
| 32 | enum | |
| 33 | { | |
| 34 | COLUMN_NAME, | |
| 35 | COLUMN_PRPL_ICON, | |
| 36 | COLUMN_USERNAME, | |
| 37 | COLUMN_DATA, | |
| 38 | NUM_COLUMNS | |
| 39 | }; | |
| 40 | ||
| 41 | static gint | |
| 42 | delete_win_cb(GtkWidget *w, GdkEvent *event, GevoAddBuddyDialog *dialog) | |
| 43 | { | |
| 44 | gtk_widget_destroy(dialog->win); | |
| 45 | ||
| 46 | if (dialog->contacts != NULL) | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
47 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
48 | g_list_foreach(dialog->contacts, (GFunc)g_object_unref, NULL); |
| 8089 | 49 | g_list_free(dialog->contacts); |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
50 | } |
| 8089 | 51 | |
| 52 | if (dialog->book != NULL) | |
| 53 | g_object_unref(dialog->book); | |
| 54 | ||
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
55 | gevo_addrbooks_model_unref(dialog->addrbooks); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
56 | |
| 8089 | 57 | if (dialog->username != NULL) |
| 58 | g_free(dialog->username); | |
| 59 | ||
| 60 | g_free(dialog); | |
| 61 | ||
| 62 | return 0; | |
| 63 | } | |
| 64 | ||
| 65 | static void | |
| 66 | new_person_cb(GtkWidget *w, GevoAddBuddyDialog *dialog) | |
| 67 | { | |
| 68 | const char *group_name; | |
| 69 | ||
| 70 | group_name = | |
| 71 | gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(dialog->group_combo)->entry)); | |
| 72 | ||
|
10830
4b06c2ab8afc
[gaim-migrate @ 12497]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10081
diff
changeset
|
73 | gevo_new_person_dialog_show(dialog->book, NULL, dialog->account, dialog->username, |
| 8089 | 74 | (*group_name ? group_name : NULL), |
| 75 | NULL, FALSE); | |
| 76 | ||
| 77 | delete_win_cb(NULL, NULL, dialog); | |
| 78 | } | |
| 79 | ||
| 80 | static void | |
| 81 | cancel_cb(GtkWidget *w, GevoAddBuddyDialog *dialog) | |
| 82 | { | |
| 83 | delete_win_cb(NULL, NULL, dialog); | |
| 84 | } | |
| 85 | ||
| 86 | static void | |
| 87 | select_buddy_cb(GtkWidget *w, GevoAddBuddyDialog *dialog) | |
| 88 | { | |
| 89 | GtkTreeSelection *selection; | |
| 90 | GtkTreeIter iter; | |
| 91 | const char *group_name; | |
| 92 | const char *fullname; | |
| 93 | const char *username; | |
| 94 | EContact *contact; | |
| 95 | ||
| 96 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); | |
| 97 | ||
|
14747
61aa25e4f18a
[gaim-migrate @ 17437]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
14253
diff
changeset
|
98 | if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) |
|
61aa25e4f18a
[gaim-migrate @ 17437]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
14253
diff
changeset
|
99 | return; |
| 8089 | 100 | |
| 101 | gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, | |
| 102 | COLUMN_NAME, &fullname, | |
| 103 | COLUMN_USERNAME, &username, | |
| 104 | COLUMN_DATA, &contact, | |
| 105 | -1); | |
| 106 | ||
| 107 | group_name = | |
| 108 | gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(dialog->group_combo)->entry)); | |
| 109 | ||
| 110 | if (username == NULL || *username == '\0') | |
| 111 | { | |
|
10830
4b06c2ab8afc
[gaim-migrate @ 12497]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10081
diff
changeset
|
112 | gevo_new_person_dialog_show(dialog->book, NULL, dialog->account, dialog->username, |
| 8089 | 113 | (*group_name ? group_name : NULL), |
| 114 | NULL, FALSE); | |
| 115 | } | |
| 116 | else | |
| 117 | { | |
| 118 | gevo_add_buddy(dialog->account, group_name, username, fullname); | |
| 119 | } | |
| 120 | ||
| 121 | delete_win_cb(NULL, NULL, dialog); | |
| 122 | } | |
| 123 | ||
| 124 | static void | |
| 125 | add_columns(GevoAddBuddyDialog *dialog) | |
| 126 | { | |
| 127 | GtkCellRenderer *renderer; | |
| 128 | GtkTreeViewColumn *column; | |
| 129 | ||
| 130 | /* Name column */ | |
| 131 | column = gtk_tree_view_column_new(); | |
| 132 | gtk_tree_view_column_set_title(column, _("Name")); | |
| 133 | gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog->treeview), column, -1); | |
| 134 | gtk_tree_view_column_set_sort_column_id(column, COLUMN_NAME); | |
| 135 | ||
| 136 | renderer = gtk_cell_renderer_text_new(); | |
| 137 | gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
| 138 | gtk_tree_view_column_add_attribute(column, renderer, | |
| 139 | "text", COLUMN_NAME); | |
| 140 | ||
| 141 | /* Account column */ | |
| 142 | column = gtk_tree_view_column_new(); | |
| 143 | gtk_tree_view_column_set_title(column, _("Instant Messaging")); | |
| 144 | gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog->treeview), column, -1); | |
| 145 | gtk_tree_view_column_set_sort_column_id(column, COLUMN_USERNAME); | |
| 146 | ||
| 147 | /* Protocol icon */ | |
| 148 | renderer = gtk_cell_renderer_pixbuf_new(); | |
| 149 | gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
| 150 | gtk_tree_view_column_add_attribute(column, renderer, | |
| 151 | "pixbuf", COLUMN_PRPL_ICON); | |
| 152 | ||
| 153 | /* Account name */ | |
| 154 | renderer = gtk_cell_renderer_text_new(); | |
| 155 | gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
| 156 | gtk_tree_view_column_add_attribute(column, renderer, | |
| 157 | "text", COLUMN_USERNAME); | |
| 158 | } | |
| 159 | ||
| 160 | static void | |
| 161 | add_ims(GevoAddBuddyDialog *dialog, EContact *contact, const char *name, | |
| 162 | GList *list, const char *id) | |
| 163 | { | |
| 15884 | 164 | PurpleAccount *account = NULL; |
|
18122
9bf9970c1b6a
disapproval of revision '2d8ea56b90971e7851442d96b7d74ecb4f052126'
Richard Laager <rlaager@pidgin.im>
parents:
18121
diff
changeset
|
165 | GList *l; |
| 8089 | 166 | GtkTreeIter iter; |
|
13091
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
167 | GdkPixbuf *pixbuf; |
| 8089 | 168 | |
| 169 | if (list == NULL) | |
| 170 | return; | |
| 171 | ||
| 15884 | 172 | for (l = purple_connections_get_all(); l != NULL; l = l->next) |
| 8089 | 173 | { |
| 15884 | 174 | PurpleConnection *gc = (PurpleConnection *)l->data; |
| 8089 | 175 | |
| 15884 | 176 | account = purple_connection_get_account(gc); |
| 8089 | 177 | |
| 15884 | 178 | if (!strcmp(purple_account_get_protocol_id(account), id)) |
| 8089 | 179 | break; |
| 180 | ||
| 181 | account = NULL; | |
| 182 | } | |
| 183 | ||
| 184 | if (account == NULL) | |
| 185 | return; | |
| 186 | ||
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
187 | pixbuf = pidgin_create_prpl_icon(account, 0.5); |
| 8089 | 188 | |
| 189 | for (l = list; l != NULL; l = l->next) | |
| 190 | { | |
| 191 | char *account_name = (char *)l->data; | |
| 192 | ||
| 193 | if (account_name == NULL) | |
| 194 | continue; | |
| 195 | ||
| 15884 | 196 | if (purple_find_buddy(dialog->account, account_name) != NULL) |
| 8089 | 197 | continue; |
| 198 | ||
| 199 | gtk_list_store_append(dialog->model, &iter); | |
| 200 | ||
| 201 | gtk_list_store_set(dialog->model, &iter, | |
| 202 | COLUMN_NAME, name, | |
|
13091
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
203 | COLUMN_PRPL_ICON, pixbuf, |
| 8089 | 204 | COLUMN_USERNAME, account_name, |
| 205 | COLUMN_DATA, contact, | |
| 206 | -1); | |
| 207 | ||
| 15884 | 208 | if (!strcmp(purple_account_get_protocol_id(account), |
| 209 | purple_account_get_protocol_id(dialog->account)) && | |
| 8089 | 210 | dialog->username != NULL && |
| 211 | !strcmp(account_name, dialog->username)) | |
| 212 | { | |
| 213 | GtkTreeSelection *selection; | |
| 214 | ||
| 215 | /* This is it. Select it. */ | |
| 216 | selection = gtk_tree_view_get_selection( | |
| 217 | GTK_TREE_VIEW(dialog->treeview)); | |
| 218 | ||
| 219 | gtk_tree_selection_select_iter(selection, &iter); | |
| 220 | } | |
| 221 | } | |
| 222 | ||
|
13091
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
223 | if (pixbuf != NULL) |
|
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
224 | g_object_unref(G_OBJECT(pixbuf)); |
| 8089 | 225 | |
| 226 | g_list_foreach(list, (GFunc)g_free, NULL); | |
| 227 | g_list_free(list); | |
| 228 | } | |
| 229 | ||
| 230 | static void | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
231 | populate_treeview(GevoAddBuddyDialog *dialog, const gchar *uri) |
| 8089 | 232 | { |
| 233 | EBookQuery *query; | |
| 234 | EBook *book; | |
| 235 | gboolean status; | |
| 236 | GList *cards, *c; | |
| 237 | ||
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
238 | if (dialog->book != NULL) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
239 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
240 | g_object_unref(dialog->book); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
241 | dialog->book = NULL; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
242 | } |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
243 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
244 | if (dialog->contacts != NULL) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
245 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
246 | g_list_foreach(dialog->contacts, (GFunc)g_object_unref, NULL); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
247 | g_list_free(dialog->contacts); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
248 | dialog->contacts = NULL; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
249 | } |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
250 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
251 | gtk_list_store_clear(dialog->model); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
252 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
253 | if (!gevo_load_addressbook(uri, &book, NULL)) |
| 8089 | 254 | { |
| 15884 | 255 | purple_debug_error("evolution", |
| 8089 | 256 | "Error retrieving default addressbook\n"); |
| 257 | ||
| 258 | return; | |
| 259 | } | |
| 260 | ||
| 261 | query = e_book_query_field_exists(E_CONTACT_FULL_NAME); | |
| 262 | ||
| 263 | if (query == NULL) | |
| 264 | { | |
| 15884 | 265 | purple_debug_error("evolution", "Error in creating query\n"); |
| 8089 | 266 | |
| 267 | g_object_unref(book); | |
| 268 | ||
| 269 | return; | |
| 270 | } | |
| 271 | ||
| 272 | status = e_book_get_contacts(book, query, &cards, NULL); | |
| 273 | ||
| 274 | e_book_query_unref(query); | |
| 275 | ||
| 276 | if (!status) | |
| 277 | { | |
| 15884 | 278 | purple_debug_error("evolution", "Error %d in getting card list\n", |
| 8089 | 279 | status); |
| 280 | ||
| 281 | g_object_unref(book); | |
| 282 | ||
| 283 | return; | |
| 284 | } | |
| 285 | ||
| 286 | for (c = cards; c != NULL; c = c->next) | |
| 287 | { | |
| 288 | EContact *contact = E_CONTACT(c->data); | |
| 289 | const char *name; | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
290 | GList *aims, *jabbers, *yahoos, *msns, *icqs, *novells; |
| 8089 | 291 | |
| 292 | name = e_contact_get_const(contact, E_CONTACT_FULL_NAME); | |
| 293 | ||
| 294 | aims = e_contact_get(contact, E_CONTACT_IM_AIM); | |
| 295 | jabbers = e_contact_get(contact, E_CONTACT_IM_JABBER); | |
| 296 | yahoos = e_contact_get(contact, E_CONTACT_IM_YAHOO); | |
| 297 | msns = e_contact_get(contact, E_CONTACT_IM_MSN); | |
| 298 | icqs = e_contact_get(contact, E_CONTACT_IM_ICQ); | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
299 | novells = e_contact_get(contact, E_CONTACT_IM_GROUPWISE); |
| 8089 | 300 | |
| 301 | if (aims == NULL && jabbers == NULL && yahoos == NULL && | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
302 | msns == NULL && icqs == NULL && novells == NULL) |
| 8089 | 303 | { |
| 304 | GtkTreeIter iter; | |
| 305 | ||
| 306 | gtk_list_store_append(dialog->model, &iter); | |
| 307 | ||
| 308 | gtk_list_store_set(dialog->model, &iter, | |
| 309 | COLUMN_NAME, name, | |
| 310 | COLUMN_DATA, contact, | |
| 311 | -1); | |
| 312 | } | |
| 313 | else | |
| 314 | { | |
| 315 | add_ims(dialog, contact, name, aims, "prpl-oscar"); | |
| 316 | add_ims(dialog, contact, name, jabbers, "prpl-jabber"); | |
| 317 | add_ims(dialog, contact, name, yahoos, "prpl-yahoo"); | |
| 318 | add_ims(dialog, contact, name, msns, "prpl-msn"); | |
| 319 | add_ims(dialog, contact, name, icqs, "prpl-oscar"); | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
320 | add_ims(dialog, contact, name, novells, "prpl-novell"); |
| 8089 | 321 | } |
| 322 | } | |
| 323 | ||
| 324 | dialog->contacts = cards; | |
| 325 | dialog->book = book; | |
| 326 | } | |
| 327 | ||
| 328 | static void | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
329 | addrbook_change_cb(GtkComboBox *combo, GevoAddBuddyDialog *dialog) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
330 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
331 | GtkTreeIter iter; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
332 | const char *esource_uri; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
333 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
334 | if (!gtk_combo_box_get_active_iter(combo, &iter)) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
335 | return; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
336 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
337 | gtk_tree_model_get(GTK_TREE_MODEL(dialog->addrbooks), &iter, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
338 | ADDRBOOK_COLUMN_URI, &esource_uri, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
339 | -1); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
340 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
341 | populate_treeview(dialog, esource_uri); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
342 | } |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
343 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
344 | static void |
| 8089 | 345 | selected_cb(GtkTreeSelection *sel, GevoAddBuddyDialog *dialog) |
| 346 | { | |
|
14747
61aa25e4f18a
[gaim-migrate @ 17437]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
14253
diff
changeset
|
347 | GtkTreeSelection *selection; |
|
61aa25e4f18a
[gaim-migrate @ 17437]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
14253
diff
changeset
|
348 | |
|
61aa25e4f18a
[gaim-migrate @ 17437]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
14253
diff
changeset
|
349 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); |
|
61aa25e4f18a
[gaim-migrate @ 17437]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
14253
diff
changeset
|
350 | gtk_widget_set_sensitive(dialog->select_button, |
|
61aa25e4f18a
[gaim-migrate @ 17437]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
14253
diff
changeset
|
351 | gtk_tree_selection_get_selected(selection, NULL, NULL)); |
| 8089 | 352 | } |
| 353 | ||
| 354 | static void | |
| 355 | search_changed_cb(GtkEntry *entry, GevoAddBuddyDialog *dialog) | |
| 356 | { | |
| 357 | const char *text = gtk_entry_get_text(entry); | |
| 358 | GList *l; | |
| 359 | ||
| 360 | gtk_list_store_clear(dialog->model); | |
| 361 | ||
| 362 | for (l = dialog->contacts; l != NULL; l = l->next) | |
| 363 | { | |
| 364 | EContact *contact = E_CONTACT(l->data); | |
| 365 | const char *name; | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
366 | GList *aims, *jabbers, *yahoos, *msns, *icqs, *novells; |
| 8089 | 367 | |
| 368 | name = e_contact_get_const(contact, E_CONTACT_FULL_NAME); | |
| 369 | ||
| 370 | if (text != NULL && *text != '\0' && name != NULL && | |
| 371 | g_ascii_strncasecmp(name, text, strlen(text))) | |
| 372 | { | |
| 373 | continue; | |
| 374 | } | |
| 375 | ||
| 376 | aims = e_contact_get(contact, E_CONTACT_IM_AIM); | |
| 377 | jabbers = e_contact_get(contact, E_CONTACT_IM_JABBER); | |
| 378 | yahoos = e_contact_get(contact, E_CONTACT_IM_YAHOO); | |
| 379 | msns = e_contact_get(contact, E_CONTACT_IM_MSN); | |
| 380 | icqs = e_contact_get(contact, E_CONTACT_IM_ICQ); | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
381 | novells = e_contact_get(contact, E_CONTACT_IM_GROUPWISE); |
| 8089 | 382 | |
| 383 | if (aims == NULL && jabbers == NULL && yahoos == NULL && | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
384 | msns == NULL && icqs == NULL && novells == NULL) |
| 8089 | 385 | { |
| 386 | GtkTreeIter iter; | |
| 387 | ||
| 388 | gtk_list_store_append(dialog->model, &iter); | |
| 389 | ||
| 390 | gtk_list_store_set(dialog->model, &iter, | |
| 391 | COLUMN_NAME, name, | |
| 392 | COLUMN_DATA, contact, | |
| 393 | -1); | |
| 394 | } | |
| 395 | else | |
| 396 | { | |
| 397 | add_ims(dialog, contact, name, aims, "prpl-oscar"); | |
| 398 | add_ims(dialog, contact, name, jabbers, "prpl-jabber"); | |
| 399 | add_ims(dialog, contact, name, yahoos, "prpl-yahoo"); | |
| 400 | add_ims(dialog, contact, name, msns, "prpl-msn"); | |
| 401 | add_ims(dialog, contact, name, icqs, "prpl-oscar"); | |
|
11054
ba2440c5ee48
[gaim-migrate @ 12992]
Stanislav Brabec <sbrabec@suse.cz>
parents:
10884
diff
changeset
|
402 | add_ims(dialog, contact, name, novells, "prpl-novell"); |
| 8089 | 403 | } |
| 404 | } | |
| 405 | } | |
| 406 | ||
| 407 | static void | |
| 408 | clear_cb(GtkWidget *w, GevoAddBuddyDialog *dialog) | |
| 409 | { | |
| 410 | static gboolean lock = FALSE; | |
| 411 | ||
| 412 | if (lock) | |
| 413 | return; | |
| 414 | ||
| 415 | lock = TRUE; | |
| 416 | gtk_entry_set_text(GTK_ENTRY(dialog->search_field), ""); | |
| 417 | lock = FALSE; | |
| 418 | } | |
| 419 | ||
| 420 | void | |
| 15884 | 421 | gevo_add_buddy_dialog_show(PurpleAccount *account, const char *username, |
| 8089 | 422 | const char *group, const char *alias) |
| 423 | { | |
| 424 | GevoAddBuddyDialog *dialog; | |
| 425 | GtkWidget *button; | |
| 426 | GtkWidget *sw; | |
| 427 | GtkWidget *label; | |
| 428 | GtkWidget *vbox; | |
| 429 | GtkWidget *hbox; | |
| 430 | GtkWidget *bbox; | |
| 431 | GtkWidget *sep; | |
| 432 | GtkTreeSelection *selection; | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
433 | GtkCellRenderer *cell; |
| 8089 | 434 | |
| 435 | dialog = g_new0(GevoAddBuddyDialog, 1); | |
| 436 | ||
| 437 | dialog->account = | |
| 438 | (account != NULL | |
| 439 | ? account | |
| 15884 | 440 | : purple_connection_get_account(purple_connections_get_all()->data)); |
| 8089 | 441 | |
| 442 | if (username != NULL) | |
| 443 | dialog->username = g_strdup(username); | |
| 444 | ||
| 17213 | 445 | dialog->win = pidgin_create_window(_("Add Buddy"), PIDGIN_HIG_BORDER, "add_buddy", TRUE); |
| 8089 | 446 | gtk_widget_set_size_request(dialog->win, -1, 400); |
| 447 | ||
| 448 | g_signal_connect(G_OBJECT(dialog->win), "delete_event", | |
| 449 | G_CALLBACK(delete_win_cb), dialog); | |
| 450 | ||
| 451 | /* Setup the vbox */ | |
| 452 | vbox = gtk_vbox_new(FALSE, 12); | |
| 453 | gtk_container_add(GTK_CONTAINER(dialog->win), vbox); | |
| 454 | gtk_widget_show(vbox); | |
| 455 | ||
| 456 | /* Add the label. */ | |
| 457 | label = gtk_label_new(_("Select a person from your address book below, " | |
| 458 | "or add a new person.")); | |
| 459 | gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
| 460 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
| 461 | gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0); | |
| 462 | gtk_widget_show(label); | |
| 463 | ||
| 464 | /* Add the search hbox */ | |
| 465 | hbox = gtk_hbox_new(FALSE, 6); | |
| 466 | gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); | |
| 467 | gtk_widget_show(hbox); | |
| 468 | ||
| 469 | /* "Search" */ | |
| 470 | label = gtk_label_new(_("Search")); | |
| 471 | gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
| 472 | gtk_widget_show(label); | |
| 473 | ||
| 474 | /* Addressbooks */ | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
475 | dialog->addrbooks = gevo_addrbooks_model_new(); |
| 8089 | 476 | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
477 | dialog->addrbooks_combo = gtk_combo_box_new_with_model( |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
478 | dialog->addrbooks); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
479 | cell = gtk_cell_renderer_text_new(); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
480 | gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dialog->addrbooks_combo), |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
481 | cell, TRUE); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
482 | gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dialog->addrbooks_combo), |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
483 | cell, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
484 | "text", ADDRBOOK_COLUMN_NAME, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
485 | NULL); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
486 | gtk_box_pack_start(GTK_BOX(hbox), dialog->addrbooks_combo, FALSE, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
487 | FALSE, 0); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
488 | gtk_widget_show(dialog->addrbooks_combo); |
| 8089 | 489 | |
| 490 | /* Search field */ | |
| 491 | dialog->search_field = gtk_entry_new(); | |
| 492 | gtk_box_pack_start(GTK_BOX(hbox), dialog->search_field, TRUE, TRUE, 0); | |
| 493 | gtk_widget_show(dialog->search_field); | |
| 494 | ||
| 495 | g_signal_connect(G_OBJECT(dialog->search_field), "changed", | |
| 496 | G_CALLBACK(search_changed_cb), dialog); | |
| 497 | ||
| 498 | /* Clear button */ | |
| 499 | button = gtk_button_new_from_stock(GTK_STOCK_CLEAR); | |
| 500 | gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
| 501 | gtk_widget_show(button); | |
| 502 | ||
| 503 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 504 | G_CALLBACK(clear_cb), dialog); | |
| 505 | ||
| 506 | /* Scrolled Window */ | |
| 507 | sw = gtk_scrolled_window_new(0, 0); | |
| 508 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
| 509 | GTK_POLICY_AUTOMATIC, | |
| 510 | GTK_POLICY_ALWAYS); | |
| 511 | gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | |
| 512 | GTK_SHADOW_IN); | |
| 513 | gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
| 514 | gtk_widget_show(sw); | |
| 515 | ||
| 516 | /* Create the list model for the treeview. */ | |
| 517 | dialog->model = gtk_list_store_new(NUM_COLUMNS, | |
| 518 | G_TYPE_STRING, GDK_TYPE_PIXBUF, | |
| 519 | G_TYPE_STRING, G_TYPE_POINTER); | |
| 520 | ||
| 521 | /* Now for the treeview */ | |
| 522 | dialog->treeview = | |
| 523 | gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model)); | |
| 524 | gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dialog->treeview), TRUE); | |
| 525 | gtk_container_add(GTK_CONTAINER(sw), dialog->treeview); | |
| 526 | gtk_widget_show(dialog->treeview); | |
| 527 | ||
| 528 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); | |
| 529 | ||
| 530 | gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); | |
| 531 | ||
| 532 | g_signal_connect(G_OBJECT(selection), "changed", | |
| 533 | G_CALLBACK(selected_cb), dialog); | |
| 534 | ||
| 535 | add_columns(dialog); | |
| 536 | ||
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
537 | /* |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
538 | * Catch addressbook selection and populate treeview with the first |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
539 | * addressbook |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
540 | */ |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
541 | gevo_addrbooks_model_populate(dialog->addrbooks); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
542 | g_signal_connect(G_OBJECT(dialog->addrbooks_combo), "changed", |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
543 | G_CALLBACK(addrbook_change_cb), dialog); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
544 | gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->addrbooks_combo), 0); |
| 8089 | 545 | |
| 546 | /* Group box */ | |
| 547 | hbox = gtk_hbox_new(FALSE, 6); | |
| 548 | gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
| 549 | gtk_widget_show(hbox); | |
| 550 | ||
| 551 | label = gtk_label_new(_("Group:")); | |
| 552 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
| 553 | gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
| 554 | gtk_widget_show(label); | |
| 555 | ||
| 556 | dialog->group_combo = gtk_combo_new(); | |
| 557 | gtk_combo_set_popdown_strings(GTK_COMBO(dialog->group_combo), | |
| 558 | gevo_get_groups()); | |
| 559 | gtk_box_pack_start(GTK_BOX(hbox), dialog->group_combo, TRUE, TRUE, 0); | |
| 560 | gtk_widget_show(dialog->group_combo); | |
| 561 | ||
| 562 | /* Cool. Now we only have a little left... */ | |
| 563 | ||
| 564 | /* Separator. */ | |
| 565 | sep = gtk_hseparator_new(); | |
| 566 | gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
| 567 | gtk_widget_show(sep); | |
| 568 | ||
| 569 | /* Button box */ | |
| 570 | bbox = gtk_hbutton_box_new(); | |
| 571 | gtk_box_set_spacing(GTK_BOX(bbox), 6); | |
| 572 | gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
| 573 | gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, TRUE, 0); | |
| 574 | gtk_widget_show(bbox); | |
| 575 | ||
| 576 | /* "New Person" button */ | |
| 15568 | 577 | button = pidgin_pixbuf_button_from_stock(_("New Person"), GTK_STOCK_NEW, |
| 578 | PIDGIN_BUTTON_HORIZONTAL); | |
| 8089 | 579 | gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); |
| 580 | gtk_widget_show(button); | |
| 581 | ||
| 582 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 583 | G_CALLBACK(new_person_cb), dialog); | |
| 584 | ||
| 585 | /* "Cancel" button */ | |
| 586 | button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); | |
| 587 | gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
| 588 | gtk_widget_show(button); | |
| 589 | ||
| 590 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 591 | G_CALLBACK(cancel_cb), dialog); | |
| 592 | ||
| 593 | /* "Select Buddy" button */ | |
| 15568 | 594 | button = pidgin_pixbuf_button_from_stock(_("Select Buddy"), GTK_STOCK_APPLY, |
| 595 | PIDGIN_BUTTON_HORIZONTAL); | |
| 8089 | 596 | dialog->select_button = button; |
| 597 | gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
| 598 | gtk_widget_set_sensitive(button, FALSE); | |
| 599 | gtk_widget_show(button); | |
| 600 | ||
| 601 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 602 | G_CALLBACK(select_buddy_cb), dialog); | |
| 603 | ||
| 604 | /* Show it. */ | |
| 605 | gtk_widget_show(dialog->win); | |
| 606 | } | |
| 607 | ||
| 608 | void | |
| 609 | gevo_add_buddy_dialog_add_person(GevoAddBuddyDialog *dialog, | |
| 610 | EContact *contact, const char *name, | |
| 15884 | 611 | PurpleAccount *account, const char *screenname) |
| 8089 | 612 | { |
|
13091
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
613 | GdkPixbuf *pixbuf; |
| 8089 | 614 | GtkTreeIter iter; |
| 615 | ||
|
15562
8c8249fe5e3c
gaim_gtk to pidgin. I hope
Sean Egan <seanegan@pidgin.im>
parents:
15435
diff
changeset
|
616 | pixbuf = pidgin_create_prpl_icon(account, 0.5); |
| 8089 | 617 | |
| 618 | gtk_list_store_append(dialog->model, &iter); | |
| 619 | ||
| 620 | gtk_list_store_set(dialog->model, &iter, | |
| 621 | COLUMN_NAME, name, | |
|
13091
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
622 | COLUMN_PRPL_ICON, pixbuf, |
| 8089 | 623 | COLUMN_DATA, contact, |
| 624 | COLUMN_USERNAME, screenname, | |
| 625 | -1); | |
| 626 | ||
| 627 | if (contact != NULL) | |
| 628 | dialog->contacts = g_list_append(dialog->contacts, contact); | |
| 629 | ||
|
13091
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
630 | if (pixbuf != NULL) |
|
b5ed878998dd
[gaim-migrate @ 15452]
Mark Doliner <markdoliner@pidgin.im>
parents:
11807
diff
changeset
|
631 | g_object_unref(G_OBJECT(pixbuf)); |
| 8089 | 632 | } |