Tue, 17 Jan 2006 23:22:19 +0000
[gaim-migrate @ 15272]
Replace GaimBlistNodeAction with the more generic GaimMenuAction, this is in
preparation for letting the chat room user list have extensible menus like the
blist entries do. (I know it's not exactly the prettiest, and the callback
isn't exactly type-safe, when we eventually gobjectify everything we can get
some safety back by using (GObject, gpointer) but that's for later.)
I'm planning to look into merging GaimPluginActions into GaimMenuActions as
well.
| 8089 | 1 | /* |
| 2 | * Evolution integration plugin for Gaim | |
| 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" |
|
11735
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
23 | #include "gtkexpander.h" |
|
9824
2fc5eef80af8
[gaim-migrate @ 10695]
Mark Doliner <markdoliner@pidgin.im>
parents:
9566
diff
changeset
|
24 | #include "gtkgaim.h" |
| 8089 | 25 | #include "gtkutils.h" |
| 26 | #include "gtkimhtml.h" | |
| 27 | ||
| 28 | #include "debug.h" | |
| 29 | ||
| 30 | #include "gevolution.h" | |
| 31 | ||
| 32 | #include <stdlib.h> | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
33 | #include <gtk/gtk.h> |
| 8089 | 34 | |
| 35 | enum | |
| 36 | { | |
| 37 | COLUMN_NAME, | |
| 38 | COLUMN_DATA, | |
| 39 | NUM_COLUMNS | |
| 40 | }; | |
| 41 | ||
| 42 | static gint | |
| 43 | delete_win_cb(GtkWidget *w, GdkEvent *event, GevoAssociateBuddyDialog *dialog) | |
| 44 | { | |
| 45 | gtk_widget_destroy(dialog->win); | |
| 46 | ||
| 47 | if (dialog->contacts != NULL) | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
48 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
49 | g_list_foreach(dialog->contacts, (GFunc)g_object_unref, NULL); |
| 8089 | 50 | g_list_free(dialog->contacts); |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
51 | } |
| 8089 | 52 | |
| 53 | g_object_unref(dialog->book); | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
54 | gevo_addrbooks_model_unref(dialog->addrbooks); |
| 8089 | 55 | |
| 56 | g_free(dialog); | |
| 57 | ||
| 58 | return 0; | |
| 59 | } | |
| 60 | ||
| 61 | static void | |
| 62 | search_changed_cb(GtkEntry *entry, GevoAssociateBuddyDialog *dialog) | |
| 63 | { | |
| 64 | const char *text = gtk_entry_get_text(entry); | |
| 65 | GList *l; | |
| 66 | ||
| 67 | gtk_list_store_clear(dialog->model); | |
| 68 | ||
| 69 | for (l = dialog->contacts; l != NULL; l = l->next) | |
| 70 | { | |
| 71 | EContact *contact = E_CONTACT(l->data); | |
| 72 | const char *name; | |
| 73 | GtkTreeIter iter; | |
| 74 | ||
| 75 | name = e_contact_get_const(contact, E_CONTACT_FULL_NAME); | |
| 76 | ||
| 77 | if (text != NULL && *text != '\0' && name != NULL && | |
| 78 | g_ascii_strncasecmp(name, text, strlen(text))) | |
| 79 | { | |
| 80 | continue; | |
| 81 | } | |
| 82 | ||
| 83 | gtk_list_store_append(dialog->model, &iter); | |
| 84 | ||
| 85 | gtk_list_store_set(dialog->model, &iter, | |
| 86 | COLUMN_NAME, name, | |
| 87 | COLUMN_DATA, contact, | |
| 88 | -1); | |
| 89 | } | |
| 90 | } | |
| 91 | ||
| 92 | static void | |
| 93 | clear_cb(GtkWidget *w, GevoAssociateBuddyDialog *dialog) | |
| 94 | { | |
| 95 | static gboolean lock = FALSE; | |
| 96 | ||
| 97 | if (lock) | |
| 98 | return; | |
| 99 | ||
| 100 | lock = TRUE; | |
| 101 | gtk_entry_set_text(GTK_ENTRY(dialog->search_field), ""); | |
| 102 | lock = FALSE; | |
| 103 | } | |
| 104 | ||
| 105 | static void | |
| 106 | selected_cb(GtkTreeSelection *sel, GevoAssociateBuddyDialog *dialog) | |
| 107 | { | |
| 108 | gtk_widget_set_sensitive(dialog->assoc_button, TRUE); | |
| 109 | } | |
| 110 | ||
| 111 | static void | |
| 112 | add_columns(GevoAssociateBuddyDialog *dialog) | |
| 113 | { | |
| 114 | GtkCellRenderer *renderer; | |
| 115 | GtkTreeViewColumn *column; | |
| 116 | ||
| 117 | /* Name column */ | |
| 118 | column = gtk_tree_view_column_new(); | |
| 119 | gtk_tree_view_column_set_title(column, _("Name")); | |
| 120 | gtk_tree_view_insert_column(GTK_TREE_VIEW(dialog->treeview), column, -1); | |
| 121 | gtk_tree_view_column_set_sort_column_id(column, COLUMN_NAME); | |
| 122 | ||
| 123 | renderer = gtk_cell_renderer_text_new(); | |
| 124 | gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
| 125 | gtk_tree_view_column_add_attribute(column, renderer, | |
| 126 | "text", COLUMN_NAME); | |
| 127 | } | |
| 128 | ||
| 129 | static void | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
130 | populate_treeview(GevoAssociateBuddyDialog *dialog, const gchar *uri) |
| 8089 | 131 | { |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
132 | EBook *book; |
| 8089 | 133 | EBookQuery *query; |
| 134 | const char *prpl_id; | |
| 135 | gboolean status; | |
| 136 | GList *cards, *c; | |
| 137 | ||
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
138 | if (dialog->book != NULL) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
139 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
140 | g_object_unref(dialog->book); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
141 | dialog->book = NULL; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
142 | } |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
143 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
144 | if (dialog->contacts != NULL) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
145 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
146 | g_list_foreach(dialog->contacts, (GFunc) g_object_unref, NULL); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
147 | g_list_free(dialog->contacts); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
148 | dialog->contacts = NULL; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
149 | } |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
150 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
151 | gtk_list_store_clear(dialog->model); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
152 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
153 | if (!gevo_load_addressbook(uri, &book, NULL)) |
| 8089 | 154 | { |
| 155 | gaim_debug_error("evolution", | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
156 | "Error retrieving addressbook\n"); |
| 8089 | 157 | |
| 158 | return; | |
| 159 | } | |
| 160 | ||
| 161 | query = e_book_query_field_exists(E_CONTACT_FULL_NAME); | |
| 162 | ||
| 163 | if (query == NULL) | |
| 164 | { | |
| 165 | gaim_debug_error("evolution", "Error in creating query\n"); | |
| 166 | ||
| 167 | g_object_unref(book); | |
| 168 | ||
| 169 | return; | |
| 170 | } | |
| 171 | ||
| 172 | status = e_book_get_contacts(book, query, &cards, NULL); | |
| 173 | ||
| 174 | e_book_query_unref(query); | |
| 175 | ||
| 176 | if (!status) | |
| 177 | { | |
| 178 | gaim_debug_error("evolution", "Error %d in getting card list\n", | |
| 179 | status); | |
| 180 | ||
| 181 | g_object_unref(book); | |
| 182 | ||
| 183 | return; | |
| 184 | } | |
| 185 | ||
| 186 | prpl_id = gaim_account_get_protocol_id(dialog->buddy->account); | |
| 187 | ||
| 188 | for (c = cards; c != NULL; c = c->next) | |
| 189 | { | |
| 190 | EContact *contact = E_CONTACT(c->data); | |
| 191 | const char *name; | |
| 192 | GtkTreeIter iter; | |
| 193 | EContactField protocol_field = 0; | |
| 194 | ||
| 195 | name = e_contact_get_const(contact, E_CONTACT_FULL_NAME); | |
| 196 | ||
| 197 | gtk_list_store_append(dialog->model, &iter); | |
| 198 | ||
| 199 | gtk_list_store_set(dialog->model, &iter, | |
| 200 | COLUMN_NAME, name, | |
| 201 | COLUMN_DATA, contact, | |
| 202 | -1); | |
| 203 | ||
| 204 | /* See if this user has the buddy in its list. */ | |
| 205 | protocol_field = gevo_prpl_get_field(dialog->buddy->account, | |
| 206 | dialog->buddy); | |
| 207 | ||
| 208 | if (protocol_field > 0) | |
| 209 | { | |
| 210 | GList *ims, *l; | |
| 211 | ||
| 212 | ims = e_contact_get(contact, protocol_field); | |
| 213 | ||
| 214 | for (l = ims; l != NULL; l = l->next) | |
| 215 | { | |
| 216 | if (!strcmp(l->data, dialog->buddy->name)) | |
| 217 | { | |
| 218 | GtkTreeSelection *selection; | |
| 219 | ||
| 220 | /* This is it. Select it. */ | |
| 221 | selection = gtk_tree_view_get_selection( | |
| 222 | GTK_TREE_VIEW(dialog->treeview)); | |
| 223 | ||
| 224 | gtk_tree_selection_select_iter(selection, &iter); | |
| 225 | break; | |
| 226 | } | |
| 227 | } | |
| 228 | } | |
| 229 | } | |
| 230 | ||
| 231 | dialog->contacts = cards; | |
| 232 | dialog->book = book; | |
| 233 | } | |
| 234 | ||
| 235 | static void | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
236 | addrbook_change_cb(GtkComboBox *combo, GevoAssociateBuddyDialog *dialog) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
237 | { |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
238 | GtkTreeIter iter; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
239 | const char *esource_uri; |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
240 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
241 | if (!gtk_combo_box_get_active_iter(combo, &iter)) |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
242 | return; |
|
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 | gtk_tree_model_get(GTK_TREE_MODEL(dialog->addrbooks), &iter, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
245 | ADDRBOOK_COLUMN_URI, &esource_uri, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
246 | -1); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
247 | |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
248 | populate_treeview(dialog, esource_uri); |
|
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 | static void |
| 8089 | 252 | new_person_cb(GtkWidget *w, GevoAssociateBuddyDialog *dialog) |
| 253 | { | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
254 | gevo_new_person_dialog_show(dialog->book, NULL, dialog->buddy->account, |
| 8089 | 255 | dialog->buddy->name, NULL, dialog->buddy, |
| 256 | TRUE); | |
| 257 | ||
| 258 | delete_win_cb(NULL, NULL, dialog); | |
| 259 | } | |
| 260 | ||
| 261 | static void | |
| 262 | cancel_cb(GtkWidget *w, GevoAssociateBuddyDialog *dialog) | |
| 263 | { | |
| 264 | delete_win_cb(NULL, NULL, dialog); | |
| 265 | } | |
| 266 | ||
| 267 | static void | |
| 268 | assoc_buddy_cb(GtkWidget *w, GevoAssociateBuddyDialog *dialog) | |
| 269 | { | |
| 270 | GtkTreeSelection *selection; | |
| 271 | GtkTreeIter iter; | |
| 9566 | 272 | GList *list; |
| 8089 | 273 | const char *fullname; |
| 274 | EContactField protocol_field; | |
| 275 | EContact *contact; | |
| 276 | ||
| 277 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); | |
| 278 | ||
| 279 | gtk_tree_selection_get_selected(selection, NULL, &iter); | |
| 280 | ||
| 281 | gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, | |
| 282 | COLUMN_NAME, &fullname, | |
| 283 | COLUMN_DATA, &contact, | |
| 284 | -1); | |
| 285 | ||
| 286 | protocol_field = gevo_prpl_get_field(dialog->buddy->account, dialog->buddy); | |
| 287 | ||
| 288 | if (protocol_field == 0) | |
| 289 | return; /* XXX */ | |
| 290 | ||
| 291 | list = e_contact_get(contact, protocol_field); | |
| 9566 | 292 | list = g_list_append(list, g_strdup(dialog->buddy->name)); |
| 8089 | 293 | |
| 9566 | 294 | e_contact_set(contact, protocol_field, list); |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
295 | |
| 9566 | 296 | if (!e_book_commit_contact(dialog->book, contact, NULL)) |
| 297 | gaim_debug_error("evolution", "Error adding contact to book\n"); | |
| 8089 | 298 | |
| 299 | /* Free the list. */ | |
| 9566 | 300 | g_list_foreach(list, (GFunc)g_free, NULL); |
| 301 | g_list_free(list); | |
| 8089 | 302 | |
| 303 | delete_win_cb(NULL, NULL, dialog); | |
| 304 | } | |
| 305 | ||
| 306 | GevoAssociateBuddyDialog * | |
| 307 | gevo_associate_buddy_dialog_new(GaimBuddy *buddy) | |
| 308 | { | |
| 309 | GevoAssociateBuddyDialog *dialog; | |
| 310 | GtkWidget *button; | |
| 311 | GtkWidget *sw; | |
| 312 | GtkWidget *label; | |
| 313 | GtkWidget *vbox; | |
| 314 | GtkWidget *hbox; | |
| 315 | GtkWidget *bbox; | |
| 316 | GtkWidget *sep; | |
|
11735
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
317 | GtkWidget *expander; |
| 8089 | 318 | GtkTreeSelection *selection; |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
319 | GtkCellRenderer *cell; |
| 8089 | 320 | |
| 321 | g_return_val_if_fail(buddy != NULL, NULL); | |
| 322 | ||
| 323 | dialog = g_new0(GevoAssociateBuddyDialog, 1); | |
| 324 | ||
| 325 | dialog->buddy = buddy; | |
| 326 | ||
| 327 | dialog->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
| 328 | gtk_window_set_role(GTK_WINDOW(dialog->win), "assoc_buddy"); | |
| 329 | gtk_container_set_border_width(GTK_CONTAINER(dialog->win), 12); | |
| 330 | ||
| 331 | g_signal_connect(G_OBJECT(dialog->win), "delete_event", | |
| 332 | G_CALLBACK(delete_win_cb), dialog); | |
| 333 | ||
| 334 | /* Setup the vbox */ | |
| 335 | vbox = gtk_vbox_new(FALSE, 12); | |
| 336 | gtk_container_add(GTK_CONTAINER(dialog->win), vbox); | |
| 337 | gtk_widget_show(vbox); | |
| 338 | ||
| 339 | /* Add the label. */ | |
| 340 | label = gtk_label_new(_("Select a person from your address book to " | |
| 341 | "add this buddy to, or create a new person.")); | |
| 342 | gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
| 343 | gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
| 344 | gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0); | |
| 345 | gtk_widget_show(label); | |
| 346 | ||
| 347 | /* Add the search hbox */ | |
| 348 | hbox = gtk_hbox_new(FALSE, 6); | |
| 349 | gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); | |
| 350 | gtk_widget_show(hbox); | |
| 351 | ||
| 352 | /* "Search" */ | |
| 353 | label = gtk_label_new(_("Search")); | |
| 354 | gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
| 355 | gtk_widget_show(label); | |
| 356 | ||
| 357 | /* Addressbooks */ | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
358 | dialog->addrbooks = gevo_addrbooks_model_new(); |
| 8089 | 359 | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
360 | dialog->addrbooks_combo = gtk_combo_box_new_with_model(dialog->addrbooks); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
361 | cell = gtk_cell_renderer_text_new(); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
362 | gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dialog->addrbooks_combo), |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
363 | cell, TRUE); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
364 | gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dialog->addrbooks_combo), |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
365 | cell, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
366 | "text", ADDRBOOK_COLUMN_NAME, |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
367 | NULL); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
368 | gtk_box_pack_start(GTK_BOX(hbox), dialog->addrbooks_combo, FALSE, FALSE, 0); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
369 | gtk_widget_show(dialog->addrbooks_combo); |
| 8089 | 370 | |
| 371 | ||
| 372 | /* Search field */ | |
| 373 | dialog->search_field = gtk_entry_new(); | |
| 374 | gtk_box_pack_start(GTK_BOX(hbox), dialog->search_field, TRUE, TRUE, 0); | |
| 375 | gtk_widget_show(dialog->search_field); | |
| 376 | ||
| 377 | g_signal_connect(G_OBJECT(dialog->search_field), "changed", | |
| 378 | G_CALLBACK(search_changed_cb), dialog); | |
| 379 | ||
| 380 | /* Clear button */ | |
| 381 | button = gtk_button_new_from_stock(GTK_STOCK_CLEAR); | |
| 382 | gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
| 383 | gtk_widget_show(button); | |
| 384 | ||
| 385 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 386 | G_CALLBACK(clear_cb), dialog); | |
| 387 | ||
| 388 | /* Scrolled Window */ | |
| 389 | sw = gtk_scrolled_window_new(0, 0); | |
| 390 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
| 391 | GTK_POLICY_AUTOMATIC, | |
| 392 | GTK_POLICY_ALWAYS); | |
| 393 | gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | |
| 394 | GTK_SHADOW_IN); | |
| 395 | gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); | |
| 396 | gtk_widget_show(sw); | |
| 397 | ||
| 398 | /* Create the list model for the treeview. */ | |
| 399 | dialog->model = gtk_list_store_new(NUM_COLUMNS, | |
| 400 | G_TYPE_STRING, G_TYPE_POINTER); | |
| 401 | ||
| 402 | /* Now for the treeview */ | |
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
403 | dialog->treeview = gtk_tree_view_new_with_model( |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
404 | GTK_TREE_MODEL(dialog->model)); |
| 8089 | 405 | gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dialog->treeview), TRUE); |
| 406 | gtk_container_add(GTK_CONTAINER(sw), dialog->treeview); | |
| 407 | gtk_widget_show(dialog->treeview); | |
| 408 | ||
| 409 | selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); | |
| 410 | ||
| 411 | gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); | |
| 412 | ||
| 413 | g_signal_connect(G_OBJECT(selection), "changed", | |
| 414 | G_CALLBACK(selected_cb), dialog); | |
| 415 | ||
| 416 | add_columns(dialog); | |
| 417 | ||
|
10081
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
418 | /* |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
419 | * Catch addressbook selection and populate treeview with the first |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
420 | * addressbook |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
421 | */ |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
422 | gevo_addrbooks_model_populate( dialog->addrbooks ); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
423 | g_signal_connect(G_OBJECT(dialog->addrbooks_combo), "changed", |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
424 | G_CALLBACK(addrbook_change_cb), dialog); |
|
64e398f0eaa3
[gaim-migrate @ 11071]
Christian Hammond <chipx86@chipx86.com>
parents:
9825
diff
changeset
|
425 | gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->addrbooks_combo), 0); |
| 8089 | 426 | |
|
11735
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
427 | /* Add the expander */ |
|
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
428 | expander = gtk_expander_new_with_mnemonic(_("User _details")); |
|
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
429 | gtk_box_pack_start(GTK_BOX(vbox), expander, FALSE, FALSE, 0); |
|
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
430 | gtk_widget_show(expander); |
| 8089 | 431 | |
| 432 | /* | |
| 433 | * User details | |
| 434 | */ | |
| 435 | ||
| 436 | /* Scrolled Window */ | |
| 437 | sw = gtk_scrolled_window_new(0, 0); | |
| 438 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
| 439 | GTK_POLICY_NEVER, | |
| 440 | GTK_POLICY_ALWAYS); | |
| 441 | gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), | |
| 442 | GTK_SHADOW_IN); | |
|
11735
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
443 | gtk_container_add(GTK_CONTAINER(expander), sw); |
|
a1d2afa9b4e9
[gaim-migrate @ 14026]
Mark Doliner <markdoliner@pidgin.im>
parents:
10313
diff
changeset
|
444 | gtk_widget_show(sw); |
| 8089 | 445 | |
| 446 | /* Textview */ | |
| 447 | dialog->imhtml = gtk_imhtml_new(NULL, NULL); | |
| 448 | gtk_container_add(GTK_CONTAINER(sw), dialog->imhtml); | |
| 449 | gtk_widget_show(dialog->imhtml); | |
| 450 | ||
| 451 | /* Separator. */ | |
| 452 | sep = gtk_hseparator_new(); | |
| 453 | gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
| 454 | gtk_widget_show(sep); | |
| 455 | ||
| 456 | /* Button box */ | |
| 457 | bbox = gtk_hbutton_box_new(); | |
| 458 | gtk_box_set_spacing(GTK_BOX(bbox), 6); | |
| 459 | gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
| 460 | gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, TRUE, 0); | |
| 461 | gtk_widget_show(bbox); | |
| 462 | ||
| 463 | /* "New Person" button */ | |
| 464 | button = gaim_pixbuf_button_from_stock(_("New Person"), GTK_STOCK_NEW, | |
| 465 | GAIM_BUTTON_HORIZONTAL); | |
| 466 | gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
| 467 | gtk_widget_show(button); | |
| 468 | ||
| 469 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 470 | G_CALLBACK(new_person_cb), dialog); | |
| 471 | ||
| 472 | /* "Cancel" button */ | |
| 473 | button = gtk_button_new_from_stock(GTK_STOCK_CANCEL); | |
| 474 | gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
| 475 | gtk_widget_show(button); | |
| 476 | ||
| 477 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 478 | G_CALLBACK(cancel_cb), dialog); | |
| 479 | ||
| 480 | /* "Associate Buddy" button */ | |
| 481 | button = gaim_pixbuf_button_from_stock(_("_Associate Buddy"), | |
| 482 | GTK_STOCK_APPLY, | |
| 483 | GAIM_BUTTON_HORIZONTAL); | |
| 484 | dialog->assoc_button = button; | |
| 485 | gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
| 486 | gtk_widget_set_sensitive(button, FALSE); | |
| 487 | gtk_widget_show(button); | |
| 488 | ||
| 489 | g_signal_connect(G_OBJECT(button), "clicked", | |
| 490 | G_CALLBACK(assoc_buddy_cb), dialog); | |
| 491 | ||
| 492 | /* Show it. */ | |
| 493 | gtk_widget_show(dialog->win); | |
| 494 | ||
| 495 | return dialog; | |
| 496 | } |