Mercurial > pidgin
annotate finch/gntrequest.c @ 15828:2edbd4fede72
merge of '921657d3f21f5190639852247331d608f5946095'
and 'fab2ec4334c8c32a4a33cf74896fdbf48dc76365'
| author | Daniel Atallah <daniel.atallah@gmail.com> |
|---|---|
| date | Mon, 19 Mar 2007 13:31:34 +0000 |
| parents | 32c366eeeb99 f59cfcce68a8 |
| children | c12bf63ba2cc |
| rev | line source |
|---|---|
| 15817 | 1 /** |
| 2 * @file gntrequest.c GNT Request API | |
| 3 * @ingroup gntui | |
| 4 * | |
| 15822 | 5 * purple |
| 15817 | 6 * |
| 15822 | 7 * Purple is the legal property of its developers, whose names are too numerous |
| 15817 | 8 * to list here. Please refer to the COPYRIGHT file distributed with this |
| 9 * source distribution. | |
| 10 * | |
| 11 * This program is free software; you can redistribute it and/or modify | |
| 12 * it under the terms of the GNU General Public License as published by | |
| 13 * the Free Software Foundation; either version 2 of the License, or | |
| 14 * (at your option) any later version. | |
| 15 * | |
| 16 * This program is distributed in the hope that it will be useful, | |
| 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 * GNU General Public License for more details. | |
| 20 * | |
| 21 * You should have received a copy of the GNU General Public License | |
| 22 * along with this program; if not, write to the Free Software | |
| 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 24 */ | |
| 25 #include <gnt.h> | |
| 26 #include <gntbox.h> | |
| 27 #include <gntbutton.h> | |
| 28 #include <gntcheckbox.h> | |
| 29 #include <gntcombobox.h> | |
| 30 #include <gntentry.h> | |
| 31 #include <gntlabel.h> | |
| 32 #include <gntline.h> | |
| 33 #include <gnttree.h> | |
| 34 | |
| 15822 | 35 #include "finch.h" |
| 15817 | 36 #include "gntrequest.h" |
| 37 #include "util.c" | |
| 38 | |
| 39 typedef struct | |
| 40 { | |
| 41 void *user_data; | |
| 42 GntWidget *entry, *dialog; | |
| 43 GCallback *cbs; | |
| 15822 | 44 } PurpleGntFileRequest; |
| 15817 | 45 |
| 46 static GntWidget * | |
| 47 setup_request_window(const char *title, const char *primary, | |
| 15822 | 48 const char *secondary, PurpleRequestType type) |
| 15817 | 49 { |
| 50 GntWidget *window; | |
| 51 | |
| 52 window = gnt_vbox_new(FALSE); | |
| 53 gnt_box_set_toplevel(GNT_BOX(window), TRUE); | |
| 54 gnt_box_set_title(GNT_BOX(window), title); | |
| 55 gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); | |
| 56 | |
| 57 if (primary) | |
| 58 gnt_box_add_widget(GNT_BOX(window), | |
| 59 gnt_label_new_with_format(primary, GNT_TEXT_FLAG_BOLD)); | |
| 60 if (secondary) | |
| 61 gnt_box_add_widget(GNT_BOX(window), gnt_label_new(secondary)); | |
| 62 | |
| 15822 | 63 g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(purple_request_close), |
| 15817 | 64 GINT_TO_POINTER(type)); |
| 65 | |
| 66 return window; | |
| 67 } | |
| 68 | |
| 69 static GntWidget * | |
| 70 setup_button_box(gpointer userdata, gpointer cb, gpointer data, ...) | |
| 71 { | |
| 72 GntWidget *box, *button; | |
| 73 va_list list; | |
| 74 const char *text; | |
| 75 gpointer callback; | |
| 76 | |
| 77 box = gnt_hbox_new(FALSE); | |
| 78 | |
| 79 va_start(list, data); | |
| 80 | |
| 81 while ((text = va_arg(list, const char *))) | |
| 82 { | |
| 83 callback = va_arg(list, gpointer); | |
| 84 button = gnt_button_new(text); | |
| 85 gnt_box_add_widget(GNT_BOX(box), button); | |
| 86 g_object_set_data(G_OBJECT(button), "activate-callback", callback); | |
| 87 g_object_set_data(G_OBJECT(button), "activate-userdata", userdata); | |
| 88 g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(cb), data); | |
| 89 } | |
| 90 | |
| 91 va_end(list); | |
| 92 return box; | |
| 93 } | |
| 94 | |
| 95 static void | |
| 96 notify_input_cb(GntWidget *button, GntWidget *entry) | |
| 97 { | |
| 15822 | 98 PurpleRequestInputCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); |
| 15817 | 99 gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); |
| 100 const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); | |
| 101 | |
| 102 if (callback) | |
| 103 callback(data, text); | |
| 104 | |
| 105 while (button->parent) | |
| 106 button = button->parent; | |
| 107 | |
| 15822 | 108 purple_request_close(PURPLE_REQUEST_INPUT, button); |
| 15817 | 109 } |
| 110 | |
| 111 static void * | |
| 112 finch_request_input(const char *title, const char *primary, | |
| 113 const char *secondary, const char *default_value, | |
| 114 gboolean multiline, gboolean masked, gchar *hint, | |
| 115 const char *ok_text, GCallback ok_cb, | |
| 116 const char *cancel_text, GCallback cancel_cb, | |
| 117 void *user_data) | |
| 118 { | |
| 119 GntWidget *window, *box, *entry; | |
| 120 | |
| 15822 | 121 window = setup_request_window(title, primary, secondary, PURPLE_REQUEST_INPUT); |
| 15817 | 122 |
| 123 entry = gnt_entry_new(default_value); | |
| 124 if (masked) | |
| 125 gnt_entry_set_masked(GNT_ENTRY(entry), TRUE); | |
| 126 gnt_box_add_widget(GNT_BOX(window), entry); | |
| 127 | |
| 128 box = setup_button_box(user_data, notify_input_cb, entry, | |
| 129 ok_text, ok_cb, cancel_text, cancel_cb, NULL); | |
| 130 gnt_box_add_widget(GNT_BOX(window), box); | |
| 131 | |
| 132 gnt_widget_show(window); | |
| 133 | |
| 134 return window; | |
| 135 } | |
| 136 | |
| 137 static void | |
| 15822 | 138 finch_close_request(PurpleRequestType type, gpointer ui_handle) |
| 15817 | 139 { |
| 140 GntWidget *widget = GNT_WIDGET(ui_handle); | |
| 141 while (widget->parent) | |
| 142 widget = widget->parent; | |
| 143 gnt_widget_destroy(widget); | |
| 144 } | |
| 145 | |
| 146 static void | |
| 147 request_choice_cb(GntWidget *button, GntComboBox *combo) | |
| 148 { | |
| 15822 | 149 PurpleRequestChoiceCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); |
| 15817 | 150 gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); |
| 151 int choice = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo))) - 1; | |
| 152 | |
| 153 if (callback) | |
| 154 callback(data, choice); | |
| 155 | |
| 156 while (button->parent) | |
| 157 button = button->parent; | |
| 158 | |
| 15822 | 159 purple_request_close(PURPLE_REQUEST_INPUT, button); |
| 15817 | 160 } |
| 161 | |
| 162 static void * | |
| 163 finch_request_choice(const char *title, const char *primary, | |
| 164 const char *secondary, unsigned int default_value, | |
| 165 const char *ok_text, GCallback ok_cb, | |
| 166 const char *cancel_text, GCallback cancel_cb, | |
| 167 void *user_data, va_list choices) | |
| 168 { | |
| 169 GntWidget *window, *combo, *box; | |
| 170 const char *text; | |
| 171 int val; | |
| 172 | |
| 15822 | 173 window = setup_request_window(title, primary, secondary, PURPLE_REQUEST_CHOICE); |
| 15817 | 174 |
| 175 combo = gnt_combo_box_new(); | |
| 176 gnt_box_add_widget(GNT_BOX(window), combo); | |
| 177 while ((text = va_arg(choices, const char *))) | |
| 178 { | |
| 179 val = va_arg(choices, int); | |
| 180 gnt_combo_box_add_data(GNT_COMBO_BOX(combo), GINT_TO_POINTER(val + 1), text); | |
| 181 } | |
| 182 gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), GINT_TO_POINTER(default_value + 1)); | |
| 183 | |
| 184 box = setup_button_box(user_data, request_choice_cb, combo, | |
| 185 ok_text, ok_cb, cancel_text, cancel_cb, NULL); | |
| 186 gnt_box_add_widget(GNT_BOX(window), box); | |
| 187 | |
| 188 gnt_widget_show(window); | |
| 189 | |
| 190 return window; | |
| 191 } | |
| 192 | |
| 193 static void | |
| 194 request_action_cb(GntWidget *button, GntWidget *window) | |
| 195 { | |
| 15822 | 196 PurpleRequestActionCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); |
| 15817 | 197 gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); |
| 198 int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "activate-id")); | |
| 199 | |
| 200 if (callback) | |
| 201 callback(data, id); | |
| 202 | |
| 15822 | 203 purple_request_close(PURPLE_REQUEST_ACTION, window); |
| 15817 | 204 } |
| 205 | |
| 206 static void* | |
| 207 finch_request_action(const char *title, const char *primary, | |
| 208 const char *secondary, unsigned int default_value, | |
| 209 void *user_data, size_t actioncount, | |
| 210 va_list actions) | |
| 211 { | |
| 212 GntWidget *window, *box, *button; | |
| 213 int i; | |
| 214 | |
| 15822 | 215 window = setup_request_window(title, primary, secondary, PURPLE_REQUEST_ACTION); |
| 15817 | 216 |
| 217 box = gnt_hbox_new(FALSE); | |
| 218 gnt_box_add_widget(GNT_BOX(window), box); | |
| 219 for (i = 0; i < actioncount; i++) | |
| 220 { | |
| 221 const char *text = va_arg(actions, const char *); | |
| 15822 | 222 PurpleRequestActionCb callback = va_arg(actions, PurpleRequestActionCb); |
| 15817 | 223 |
| 224 button = gnt_button_new(text); | |
| 225 gnt_box_add_widget(GNT_BOX(box), button); | |
| 226 | |
| 227 g_object_set_data(G_OBJECT(button), "activate-callback", callback); | |
| 228 g_object_set_data(G_OBJECT(button), "activate-userdata", user_data); | |
| 229 g_object_set_data(G_OBJECT(button), "activate-id", GINT_TO_POINTER(i)); | |
| 230 g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(request_action_cb), window); | |
| 231 } | |
| 232 | |
| 233 gnt_widget_show(window); | |
| 234 | |
| 235 return window; | |
| 236 } | |
| 237 | |
| 238 static void | |
| 15822 | 239 request_fields_cb(GntWidget *button, PurpleRequestFields *fields) |
| 15817 | 240 { |
| 15822 | 241 PurpleRequestFieldsCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); |
| 15817 | 242 gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); |
| 243 GList *list; | |
| 244 | |
| 15822 | 245 /* Update the data of the fields. GtkPurple does this differently. Instead of |
| 15817 | 246 * updating the fields at the end like here, it updates the appropriate field |
| 247 * instantly whenever a change is made. That allows it to make sure the | |
| 248 * 'required' fields are entered before the user can hit OK. It's not the case | |
| 249 * here, althought it can be done. I am not honouring the 'required' fields | |
| 250 * for the moment. */ | |
| 15822 | 251 for (list = purple_request_fields_get_groups(fields); list; list = list->next) |
| 15817 | 252 { |
| 15822 | 253 PurpleRequestFieldGroup *group = list->data; |
| 254 GList *fields = purple_request_field_group_get_fields(group); | |
| 15817 | 255 |
| 256 for (; fields ; fields = fields->next) | |
| 257 { | |
| 15822 | 258 PurpleRequestField *field = fields->data; |
| 259 PurpleRequestFieldType type = purple_request_field_get_type(field); | |
| 260 if (type == PURPLE_REQUEST_FIELD_BOOLEAN) | |
| 15817 | 261 { |
| 262 GntWidget *check = field->ui_data; | |
| 263 gboolean value = gnt_check_box_get_checked(GNT_CHECK_BOX(check)); | |
| 15822 | 264 purple_request_field_bool_set_value(field, value); |
| 15817 | 265 } |
| 15822 | 266 else if (type == PURPLE_REQUEST_FIELD_STRING) |
| 15817 | 267 { |
| 268 GntWidget *entry = field->ui_data; | |
| 269 const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); | |
| 15822 | 270 purple_request_field_string_set_value(field, (text && *text) ? text : NULL); |
| 15817 | 271 } |
| 15822 | 272 else if (type == PURPLE_REQUEST_FIELD_INTEGER) |
| 15817 | 273 { |
| 274 GntWidget *entry = field->ui_data; | |
| 275 const char *text = gnt_entry_get_text(GNT_ENTRY(entry)); | |
| 276 int value = (text && *text) ? atoi(text) : 0; | |
| 15822 | 277 purple_request_field_int_set_value(field, value); |
| 15817 | 278 } |
| 15822 | 279 else if (type == PURPLE_REQUEST_FIELD_CHOICE) |
| 15817 | 280 { |
| 281 GntWidget *combo = field->ui_data; | |
| 282 int id; | |
| 283 id = GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo))); | |
| 15822 | 284 purple_request_field_choice_set_value(field, id); |
| 15817 | 285 } |
| 15822 | 286 else if (type == PURPLE_REQUEST_FIELD_LIST) |
| 15817 | 287 { |
| 288 GList *list = NULL; | |
| 15822 | 289 if (purple_request_field_list_get_multi_select(field)) |
| 15817 | 290 { |
| 291 const GList *iter; | |
| 292 GntWidget *tree = field->ui_data; | |
| 293 | |
| 15822 | 294 iter = purple_request_field_list_get_items(field); |
| 15817 | 295 for (; iter; iter = iter->next) |
| 296 { | |
| 297 const char *text = iter->data; | |
| 15822 | 298 gpointer key = purple_request_field_list_get_data(field, text); |
| 15817 | 299 if (gnt_tree_get_choice(GNT_TREE(tree), key)) |
| 300 list = g_list_prepend(list, key); | |
| 301 } | |
| 302 } | |
| 303 else | |
| 304 { | |
| 305 GntWidget *combo = field->ui_data; | |
| 306 gpointer data = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); | |
| 307 list = g_list_append(list, data); | |
| 308 } | |
| 309 | |
| 15822 | 310 purple_request_field_list_set_selected(field, list); |
| 15817 | 311 g_list_free(list); |
| 312 } | |
| 15822 | 313 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) |
| 15817 | 314 { |
| 315 GntWidget *combo = field->ui_data; | |
| 15822 | 316 PurpleAccount *acc = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(combo)); |
| 317 purple_request_field_account_set_value(field, acc); | |
| 15817 | 318 } |
| 319 } | |
| 320 } | |
| 321 | |
| 322 if (callback) | |
| 323 callback(data, fields); | |
| 324 | |
| 325 while (button->parent) | |
| 326 button = button->parent; | |
| 327 | |
| 15822 | 328 purple_request_close(PURPLE_REQUEST_FIELDS, button); |
| 15817 | 329 } |
| 330 | |
| 331 static void * | |
| 332 finch_request_fields(const char *title, const char *primary, | |
| 15822 | 333 const char *secondary, PurpleRequestFields *allfields, |
| 15817 | 334 const char *ok, GCallback ok_cb, |
| 335 const char *cancel, GCallback cancel_cb, | |
| 336 void *userdata) | |
| 337 { | |
| 338 GntWidget *window, *box; | |
| 339 GList *grlist; | |
| 340 | |
| 15822 | 341 window = setup_request_window(title, primary, secondary, PURPLE_REQUEST_FIELDS); |
| 15817 | 342 |
| 343 /* This is how it's going to work: the request-groups are going to be | |
| 344 * stacked vertically one after the other. A GntLine will be separating | |
| 345 * the groups. */ | |
| 346 box = gnt_vbox_new(FALSE); | |
| 347 gnt_box_set_pad(GNT_BOX(box), 0); | |
| 348 gnt_box_set_fill(GNT_BOX(box), TRUE); | |
| 15822 | 349 for (grlist = purple_request_fields_get_groups(allfields); grlist; grlist = grlist->next) |
| 15817 | 350 { |
| 15822 | 351 PurpleRequestFieldGroup *group = grlist->data; |
| 352 GList *fields = purple_request_field_group_get_fields(group); | |
| 15817 | 353 GntWidget *hbox; |
| 15822 | 354 const char *title = purple_request_field_group_get_title(group); |
| 15817 | 355 |
| 356 if (title) | |
| 357 gnt_box_add_widget(GNT_BOX(box), | |
| 358 gnt_label_new_with_format(title, GNT_TEXT_FLAG_BOLD)); | |
| 359 | |
| 360 for (; fields ; fields = fields->next) | |
| 361 { | |
| 362 /* XXX: Break each of the fields into a separate function? */ | |
| 15822 | 363 PurpleRequestField *field = fields->data; |
| 364 PurpleRequestFieldType type = purple_request_field_get_type(field); | |
| 365 const char *label = purple_request_field_get_label(field); | |
| 15817 | 366 |
| 367 hbox = gnt_hbox_new(TRUE); /* hrm */ | |
| 368 gnt_box_add_widget(GNT_BOX(box), hbox); | |
| 369 | |
| 15822 | 370 if (type != PURPLE_REQUEST_FIELD_BOOLEAN && label) |
| 15817 | 371 { |
| 372 GntWidget *l = gnt_label_new(label); | |
| 373 gnt_widget_set_size(l, 0, 1); | |
| 374 gnt_box_add_widget(GNT_BOX(hbox), l); | |
| 375 } | |
| 376 | |
| 15822 | 377 if (type == PURPLE_REQUEST_FIELD_BOOLEAN) |
| 15817 | 378 { |
| 379 GntWidget *check = gnt_check_box_new(label); | |
| 380 gnt_check_box_set_checked(GNT_CHECK_BOX(check), | |
| 15822 | 381 purple_request_field_bool_get_default_value(field)); |
| 15817 | 382 gnt_box_add_widget(GNT_BOX(hbox), check); |
| 383 field->ui_data = check; | |
| 384 } | |
| 15822 | 385 else if (type == PURPLE_REQUEST_FIELD_STRING) |
| 15817 | 386 { |
|
15826
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
387 const char *hint = gaim_request_field_get_type_hint(field); |
| 15817 | 388 GntWidget *entry = gnt_entry_new( |
| 15822 | 389 purple_request_field_string_get_default_value(field)); |
| 15817 | 390 gnt_entry_set_masked(GNT_ENTRY(entry), |
| 15822 | 391 purple_request_field_string_is_masked(field)); |
|
15826
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
392 if (gaim_str_has_prefix(hint, "screenname")) { |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
393 GaimBlistNode *node = gaim_blist_get_root(); |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
394 gboolean offline = gaim_str_has_suffix(hint, "all"); |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
395 for (; node; node = gaim_blist_node_next(node, offline)) { |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
396 if (!GAIM_BLIST_NODE_IS_BUDDY(node)) |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
397 continue; |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
398 gnt_entry_add_suggest(GNT_ENTRY(entry), gaim_buddy_get_name((GaimBuddy*)node)); |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
399 } |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
400 gnt_entry_set_always_suggest(GNT_ENTRY(entry), TRUE); |
|
f59cfcce68a8
Add auto-complete support in request-entries that have 'screenname' hint set. This can be useful in, for example, 'send im' dialog etc.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
401 } |
| 15817 | 402 gnt_box_add_widget(GNT_BOX(hbox), entry); |
| 403 field->ui_data = entry; | |
| 404 } | |
| 15822 | 405 else if (type == PURPLE_REQUEST_FIELD_INTEGER) |
| 15817 | 406 { |
| 407 char str[256]; | |
| 15822 | 408 int val = purple_request_field_int_get_default_value(field); |
| 15817 | 409 GntWidget *entry; |
| 410 | |
| 411 snprintf(str, sizeof(str), "%d", val); | |
| 412 entry = gnt_entry_new(str); | |
| 413 gnt_entry_set_flag(GNT_ENTRY(entry), GNT_ENTRY_FLAG_INT); | |
| 414 gnt_box_add_widget(GNT_BOX(hbox), entry); | |
| 415 field->ui_data = entry; | |
| 416 } | |
| 15822 | 417 else if (type == PURPLE_REQUEST_FIELD_CHOICE) |
| 15817 | 418 { |
| 419 int id; | |
| 420 const GList *list; | |
| 421 GntWidget *combo = gnt_combo_box_new(); | |
| 422 gnt_box_add_widget(GNT_BOX(hbox), combo); | |
| 423 field->ui_data = combo; | |
| 424 | |
| 15822 | 425 list = purple_request_field_choice_get_labels(field); |
| 15817 | 426 for (id = 1; list; list = list->next, id++) |
| 427 { | |
| 428 gnt_combo_box_add_data(GNT_COMBO_BOX(combo), | |
| 429 GINT_TO_POINTER(id), list->data); | |
| 430 } | |
| 431 gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), | |
| 15822 | 432 GINT_TO_POINTER(purple_request_field_choice_get_default_value(field))); |
| 15817 | 433 } |
| 15822 | 434 else if (type == PURPLE_REQUEST_FIELD_LIST) |
| 15817 | 435 { |
| 436 const GList *list; | |
| 15822 | 437 gboolean multi = purple_request_field_list_get_multi_select(field); |
| 15817 | 438 if (multi) |
| 439 { | |
| 440 GntWidget *tree = gnt_tree_new(); | |
| 441 gnt_box_add_widget(GNT_BOX(hbox), tree); | |
| 442 field->ui_data = tree; | |
| 443 | |
| 15822 | 444 list = purple_request_field_list_get_items(field); |
| 15817 | 445 for (; list; list = list->next) |
| 446 { | |
| 447 const char *text = list->data; | |
| 15822 | 448 gpointer key = purple_request_field_list_get_data(field, text); |
| 15817 | 449 gnt_tree_add_choice(GNT_TREE(tree), key, |
| 450 gnt_tree_create_row(GNT_TREE(tree), text), NULL, NULL); | |
| 15822 | 451 if (purple_request_field_list_is_selected(field, text)) |
| 15817 | 452 gnt_tree_set_choice(GNT_TREE(tree), key, TRUE); |
| 453 } | |
| 454 } | |
| 455 else | |
| 456 { | |
| 457 GntWidget *combo = gnt_combo_box_new(); | |
| 458 gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); | |
| 459 gnt_box_add_widget(GNT_BOX(hbox), combo); | |
| 460 field->ui_data = combo; | |
| 461 | |
| 15822 | 462 list = purple_request_field_list_get_items(field); |
| 15817 | 463 for (; list; list = list->next) |
| 464 { | |
| 465 const char *text = list->data; | |
| 15822 | 466 gpointer key = purple_request_field_list_get_data(field, text); |
| 15817 | 467 gnt_combo_box_add_data(GNT_COMBO_BOX(combo), key, text); |
| 15822 | 468 if (purple_request_field_list_is_selected(field, text)) |
| 15817 | 469 gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), key); |
| 470 } | |
| 471 } | |
| 472 } | |
| 15822 | 473 else if (type == PURPLE_REQUEST_FIELD_ACCOUNT) |
| 15817 | 474 { |
| 475 gboolean all; | |
| 15822 | 476 PurpleAccount *def; |
| 15817 | 477 GList *list; |
| 478 GntWidget *combo = gnt_combo_box_new(); | |
| 479 gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); | |
| 480 gnt_box_add_widget(GNT_BOX(hbox), combo); | |
| 481 field->ui_data = combo; | |
| 482 | |
| 15822 | 483 all = purple_request_field_account_get_show_all(field); |
| 484 def = purple_request_field_account_get_default_value(field); | |
| 15817 | 485 |
| 486 if (all) | |
| 15822 | 487 list = purple_accounts_get_all(); |
| 15817 | 488 else |
| 15822 | 489 list = purple_connections_get_all(); |
| 15817 | 490 |
| 491 for (; list; list = list->next) | |
| 492 { | |
| 15822 | 493 PurpleAccount *account; |
| 15817 | 494 char *text; |
| 495 | |
| 496 if (all) | |
| 497 account = list->data; | |
| 498 else | |
| 15822 | 499 account = purple_connection_get_account(list->data); |
| 15817 | 500 |
| 501 text = g_strdup_printf("%s (%s)", | |
| 15822 | 502 purple_account_get_username(account), |
| 503 purple_account_get_protocol_name(account)); | |
| 15817 | 504 gnt_combo_box_add_data(GNT_COMBO_BOX(combo), account, text); |
| 505 g_free(text); | |
| 506 if (account == def) | |
| 507 gnt_combo_box_set_selected(GNT_COMBO_BOX(combo), account); | |
| 508 } | |
| 509 gnt_widget_set_size(combo, 20, 3); /* ew */ | |
| 510 } | |
| 511 else | |
| 512 { | |
| 513 gnt_box_add_widget(GNT_BOX(hbox), | |
| 514 gnt_label_new_with_format(_("Not implemented yet."), | |
| 515 GNT_TEXT_FLAG_BOLD)); | |
| 516 } | |
| 517 } | |
| 518 if (grlist->next) | |
| 519 gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); | |
| 520 } | |
| 521 gnt_box_add_widget(GNT_BOX(window), box); | |
| 522 | |
| 523 box = setup_button_box(userdata, request_fields_cb, allfields, | |
| 524 ok, ok_cb, cancel, cancel_cb, NULL); | |
| 525 gnt_box_add_widget(GNT_BOX(window), box); | |
| 526 | |
| 527 gnt_widget_show(window); | |
| 528 | |
| 529 return window; | |
| 530 } | |
| 531 | |
| 532 static void | |
| 533 file_cancel_cb(GntWidget *wid, gpointer fq) | |
| 534 { | |
| 15822 | 535 PurpleGntFileRequest *data = fq; |
| 15817 | 536 if (data->cbs[1] != NULL) |
| 15822 | 537 ((PurpleRequestFileCb)data->cbs[1])(data->user_data, NULL); |
| 15817 | 538 |
| 15822 | 539 purple_request_close(PURPLE_REQUEST_FILE, data->dialog); |
| 15817 | 540 } |
| 541 | |
| 542 static void | |
| 543 file_ok_cb(GntWidget *wid, gpointer fq) | |
| 544 { | |
| 15822 | 545 PurpleGntFileRequest *data = fq; |
| 15817 | 546 if (data->cbs[0] != NULL) |
| 15822 | 547 ((PurpleRequestFileCb)data->cbs[0])(data->user_data, gnt_entry_get_text(GNT_ENTRY(data->entry))); |
| 15817 | 548 |
| 15822 | 549 purple_request_close(PURPLE_REQUEST_FILE, data->dialog); |
| 15817 | 550 } |
| 551 | |
| 552 static void | |
| 15822 | 553 file_request_destroy(PurpleGntFileRequest *data) |
| 15817 | 554 { |
| 555 g_free(data->cbs); | |
| 556 g_free(data); | |
| 557 } | |
| 558 | |
| 559 static void * | |
| 560 finch_request_file(const char *title, const char *filename, | |
| 561 gboolean savedialog, | |
| 562 GCallback ok_cb, GCallback cancel_cb, | |
| 563 void *user_data) | |
| 564 { | |
| 565 GntWidget *window = gnt_vbox_new(FALSE); | |
| 566 GntWidget *entry, *hbox, *button; | |
| 15822 | 567 PurpleGntFileRequest *data = g_new0(PurpleGntFileRequest, 1); |
| 15817 | 568 |
| 569 data->user_data = user_data; | |
| 570 data->cbs = g_new0(GCallback, 2); | |
| 571 data->cbs[0] = ok_cb; | |
| 572 data->cbs[1] = cancel_cb; | |
| 573 data->dialog = window; | |
| 15822 | 574 data->entry = entry = gnt_entry_new(g_strconcat(purple_home_dir(), G_DIR_SEPARATOR_S, filename, NULL)); |
| 15817 | 575 gnt_widget_set_size(entry, 30, 1); |
| 576 gnt_box_set_toplevel(GNT_BOX(window), TRUE); | |
| 577 gnt_box_set_title(GNT_BOX(window), title ? title : (savedialog ? _("Save File...") : _("Open File..."))); | |
| 578 #if 0 | |
| 579 /* After the string freeze */ | |
| 580 gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("Please enter a full path for a file"))); | |
| 581 #endif | |
| 582 gnt_box_add_widget(GNT_BOX(window), entry); | |
| 583 | |
| 584 hbox = gnt_hbox_new(TRUE); | |
| 585 gnt_box_set_alignment(GNT_BOX(hbox), GNT_ALIGN_MID); | |
| 586 | |
| 587 button = gnt_button_new(_("Cancel")); | |
| 588 g_signal_connect(G_OBJECT(button), "activate", | |
| 589 G_CALLBACK(file_cancel_cb), data); | |
| 590 gnt_box_add_widget(GNT_BOX(hbox), button); | |
| 591 | |
| 592 button = gnt_button_new(_("OK")); | |
| 593 g_signal_connect(G_OBJECT(button), "activate", | |
| 594 G_CALLBACK(file_ok_cb), data); | |
| 595 gnt_box_add_widget(GNT_BOX(hbox), button); | |
| 596 | |
| 597 gnt_box_add_widget(GNT_BOX(window), hbox); | |
| 598 | |
| 599 g_signal_connect_swapped(G_OBJECT(window), "destroy", | |
| 600 G_CALLBACK(file_request_destroy), data); | |
| 601 | |
| 602 gnt_widget_show(window); | |
| 603 | |
| 604 return window; | |
| 605 } | |
| 606 | |
| 15822 | 607 static PurpleRequestUiOps uiops = |
| 15817 | 608 { |
| 609 .request_input = finch_request_input, | |
| 610 .close_request = finch_close_request, | |
| 611 .request_choice = finch_request_choice, | |
| 612 .request_action = finch_request_action, | |
| 613 .request_fields = finch_request_fields, | |
| 614 .request_file = finch_request_file, | |
| 615 .request_folder = NULL /* No plans for this */ | |
| 616 }; | |
| 617 | |
| 15822 | 618 PurpleRequestUiOps *finch_request_get_ui_ops() |
| 15817 | 619 { |
| 620 return &uiops; | |
| 621 } | |
| 622 | |
| 623 void finch_request_init() | |
| 624 { | |
| 625 } | |
| 626 | |
| 627 void finch_request_uninit() | |
| 628 { | |
| 629 } | |
| 630 |
