| 165 |
165 |
| 166 return window; |
166 return window; |
| 167 } |
167 } |
| 168 |
168 |
| 169 static void |
169 static void |
| 170 finch_close_request(PurpleRequestType type, gpointer ui_handle) |
170 finch_close_request(G_GNUC_UNUSED PurpleRequestType type, gpointer ui_handle) { |
| 171 { |
|
| 172 GntWidget *widget = GNT_WIDGET(ui_handle); |
171 GntWidget *widget = GNT_WIDGET(ui_handle); |
| 173 if (type == PURPLE_REQUEST_FIELDS) { |
|
| 174 PurpleRequestFields *fields = g_object_get_data(G_OBJECT(widget), "fields"); |
|
| 175 purple_request_fields_destroy(fields); |
|
| 176 } |
|
| 177 |
|
| 178 widget = gnt_widget_get_toplevel(widget); |
172 widget = gnt_widget_get_toplevel(widget); |
| 179 gnt_widget_destroy(widget); |
173 gnt_widget_destroy(widget); |
| 180 } |
174 } |
| 181 |
175 |
| 182 static void |
176 static void |
| 276 |
270 |
| 277 return window; |
271 return window; |
| 278 } |
272 } |
| 279 |
273 |
| 280 static void |
274 static void |
| 281 request_fields_cb(GntWidget *button, PurpleRequestFields *fields) |
275 request_fields_cb(GntWidget *button, PurpleRequestPage *page) { |
| 282 { |
|
| 283 PurpleRequestFieldsCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); |
276 PurpleRequestFieldsCb callback = g_object_get_data(G_OBJECT(button), "activate-callback"); |
| 284 gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); |
277 gpointer data = g_object_get_data(G_OBJECT(button), "activate-userdata"); |
| 285 GList *list; |
278 GList *list; |
| 286 GntWidget *window; |
279 GntWidget *window; |
| 287 |
280 |
| 288 /* Update the data of the fields. Pidgin does this differently. Instead of |
281 /* Update the data of the fields. Pidgin does this differently. Instead of |
| 289 * updating the fields at the end like here, it updates the appropriate field |
282 * updating the fields at the end like here, it updates the appropriate field |
| 290 * instantly whenever a change is made. That allows it to make sure the |
283 * instantly whenever a change is made. That allows it to make sure the |
| 291 * 'required' fields are entered before the user can hit OK. It's not the case |
284 * 'required' fields are entered before the user can hit OK. It's not the case |
| 292 * here, although it can be done. */ |
285 * here, although it can be done. */ |
| 293 for (list = purple_request_fields_get_groups(fields); list; list = list->next) |
286 for(list = purple_request_page_get_groups(page); list; list = list->next) { |
| 294 { |
|
| 295 PurpleRequestGroup *group = list->data; |
287 PurpleRequestGroup *group = list->data; |
| 296 GList *fields = purple_request_group_get_fields(group); |
288 GList *fields = purple_request_group_get_fields(group); |
| 297 |
289 |
| 298 for (; fields ; fields = fields->next) |
290 for (; fields ; fields = fields->next) |
| 299 { |
291 { |
| 379 } |
371 } |
| 380 |
372 |
| 381 purple_notify_close_with_handle(button); |
373 purple_notify_close_with_handle(button); |
| 382 |
374 |
| 383 if (!g_object_get_data(G_OBJECT(button), "cancellation-function") && |
375 if (!g_object_get_data(G_OBJECT(button), "cancellation-function") && |
| 384 (!purple_request_fields_all_required_filled(fields) || |
376 (!purple_request_page_all_required_filled(page) || |
| 385 !purple_request_fields_all_valid(fields))) { |
377 !purple_request_page_all_valid(page))) { |
| 386 purple_notify_error(button, _("Error"), |
378 purple_notify_error(button, _("Error"), |
| 387 _("You must properly fill all the required fields."), |
379 _("You must properly fill all the required fields."), |
| 388 _("The required fields are underlined."), NULL); |
380 _("The required fields are underlined."), NULL); |
| 389 return; |
381 return; |
| 390 } |
382 } |
| 391 |
383 |
| 392 if (callback) |
384 if(callback) { |
| 393 callback(data, fields); |
385 callback(data, page); |
| |
386 } |
| 394 |
387 |
| 395 window = gnt_widget_get_toplevel(button); |
388 window = gnt_widget_get_toplevel(button); |
| 396 purple_request_close(PURPLE_REQUEST_FIELDS, window); |
389 purple_request_close(PURPLE_REQUEST_FIELDS, window); |
| 397 } |
390 } |
| 398 |
391 |
| 581 gnt_widget_set_size(combo, 20, 3); /* ew */ |
574 gnt_widget_set_size(combo, 20, 3); /* ew */ |
| 582 return combo; |
575 return combo; |
| 583 } |
576 } |
| 584 |
577 |
| 585 static void |
578 static void |
| 586 multifield_extra_cb(GntWidget *button, PurpleRequestFields *allfields) |
579 multifield_extra_cb(GntWidget *button, PurpleRequestPage *page) { |
| 587 { |
|
| 588 PurpleRequestFieldsCb cb; |
580 PurpleRequestFieldsCb cb; |
| 589 gpointer cb_data; |
581 gpointer cb_data; |
| 590 gpointer handle; |
582 gpointer handle; |
| 591 |
583 |
| 592 handle = g_object_get_data(G_OBJECT(button), "ui-handle"); |
584 handle = g_object_get_data(G_OBJECT(button), "ui-handle"); |
| 593 cb = g_object_get_data(G_OBJECT(button), "extra-cb"); |
585 cb = g_object_get_data(G_OBJECT(button), "extra-cb"); |
| 594 cb_data = g_object_get_data(G_OBJECT(button), "extra-cb-data"); |
586 cb_data = g_object_get_data(G_OBJECT(button), "extra-cb-data"); |
| 595 |
587 |
| 596 if (cb != NULL) |
588 if(cb != NULL) { |
| 597 cb(cb_data, allfields); |
589 cb(cb_data, page); |
| |
590 } |
| 598 |
591 |
| 599 action_performed(button, handle); |
592 action_performed(button, handle); |
| 600 purple_request_close(PURPLE_REQUEST_FIELDS, handle); |
593 purple_request_close(PURPLE_REQUEST_FIELDS, handle); |
| 601 } |
594 } |
| 602 |
595 |
| 603 static void * |
596 static void * |
| 604 finch_request_fields(const char *title, const char *primary, |
597 finch_request_fields(const char *title, const char *primary, |
| 605 const char *secondary, PurpleRequestFields *allfields, |
598 const char *secondary, PurpleRequestPage *page, |
| 606 const char *ok, GCallback ok_cb, |
599 const char *ok, GCallback ok_cb, |
| 607 const char *cancel, GCallback cancel_cb, |
600 const char *cancel, GCallback cancel_cb, |
| 608 PurpleRequestCommonParameters *cpar, |
601 PurpleRequestCommonParameters *cpar, |
| 609 void *userdata) |
602 void *userdata) |
| 610 { |
603 { |
| 621 * stacked vertically one after the other. A GntLine will be separating |
614 * stacked vertically one after the other. A GntLine will be separating |
| 622 * the groups. */ |
615 * the groups. */ |
| 623 box = gnt_vbox_new(FALSE); |
616 box = gnt_vbox_new(FALSE); |
| 624 gnt_box_set_pad(GNT_BOX(box), 0); |
617 gnt_box_set_pad(GNT_BOX(box), 0); |
| 625 gnt_box_set_fill(GNT_BOX(box), TRUE); |
618 gnt_box_set_fill(GNT_BOX(box), TRUE); |
| 626 for (grlist = purple_request_fields_get_groups(allfields); grlist; grlist = grlist->next) |
619 for(grlist = purple_request_page_get_groups(page); grlist; |
| |
620 grlist = grlist->next) |
| 627 { |
621 { |
| 628 PurpleRequestGroup *group = grlist->data; |
622 PurpleRequestGroup *group = grlist->data; |
| 629 GList *fields = purple_request_group_get_fields(group); |
623 GList *fields = purple_request_group_get_fields(group); |
| 630 GntWidget *hbox; |
624 GntWidget *hbox; |
| 631 const char *title = purple_request_group_get_title(group); |
625 const char *title = purple_request_group_get_title(group); |
| 682 if (grlist->next) |
676 if (grlist->next) |
| 683 gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); |
677 gnt_box_add_widget(GNT_BOX(box), gnt_hline_new()); |
| 684 } |
678 } |
| 685 gnt_box_add_widget(GNT_BOX(window), box); |
679 gnt_box_add_widget(GNT_BOX(window), box); |
| 686 |
680 |
| 687 box = setup_button_box(window, userdata, request_fields_cb, allfields, |
681 box = setup_button_box(window, userdata, request_fields_cb, page, |
| 688 ok, ok_cb, cancel, cancel_cb, NULL); |
682 ok, ok_cb, cancel, cancel_cb, NULL); |
| 689 |
683 |
| 690 extra_actions = purple_request_cpar_get_extra_actions(cpar); |
684 extra_actions = purple_request_cpar_get_extra_actions(cpar); |
| 691 for (GSList *it = extra_actions; it; it = it->next) { |
685 for (GSList *it = extra_actions; it; it = it->next) { |
| 692 PurpleKeyValuePair *extra_action = it->data; |
686 PurpleKeyValuePair *extra_action = it->data; |
| 693 |
687 |
| 695 gnt_box_add_widget_in_front(GNT_BOX(box), button); |
689 gnt_box_add_widget_in_front(GNT_BOX(box), button); |
| 696 g_object_set_data(G_OBJECT(button), "ui-handle", window); |
690 g_object_set_data(G_OBJECT(button), "ui-handle", window); |
| 697 g_object_set_data(G_OBJECT(button), "extra-cb", extra_action->value); |
691 g_object_set_data(G_OBJECT(button), "extra-cb", extra_action->value); |
| 698 g_object_set_data(G_OBJECT(button), "extra-cb-data", userdata); |
692 g_object_set_data(G_OBJECT(button), "extra-cb-data", userdata); |
| 699 g_signal_connect(G_OBJECT(button), "activate", |
693 g_signal_connect(G_OBJECT(button), "activate", |
| 700 G_CALLBACK(multifield_extra_cb), allfields); |
694 G_CALLBACK(multifield_extra_cb), page); |
| 701 } |
695 } |
| 702 |
696 |
| 703 help_cb = purple_request_cpar_get_help_cb(cpar, &help_data); |
697 help_cb = purple_request_cpar_get_help_cb(cpar, &help_data); |
| 704 if (help_cb) { |
698 if (help_cb) { |
| 705 GntWidget *button = gnt_button_new(_("Help")); |
699 GntWidget *button = gnt_button_new(_("Help")); |
| 715 |
709 |
| 716 if (username && accountlist) { |
710 if (username && accountlist) { |
| 717 g_signal_connect(username, "completion", G_CALLBACK(update_selected_account), accountlist); |
711 g_signal_connect(username, "completion", G_CALLBACK(update_selected_account), accountlist); |
| 718 } |
712 } |
| 719 |
713 |
| 720 g_object_set_data(G_OBJECT(window), "fields", allfields); |
714 g_object_set_data_full(G_OBJECT(window), "fields", page, g_object_unref); |
| 721 |
715 |
| 722 return window; |
716 return window; |
| 723 } |
717 } |
| 724 |
718 |
| 725 static void |
719 static void |
| 855 { |
849 { |
| 856 } |
850 } |
| 857 |
851 |
| 858 void |
852 void |
| 859 finch_request_save_in_prefs(G_GNUC_UNUSED gpointer data, |
853 finch_request_save_in_prefs(G_GNUC_UNUSED gpointer data, |
| 860 PurpleRequestFields *allfields) |
854 PurpleRequestPage *page) |
| 861 { |
855 { |
| 862 GList *list; |
856 GList *list; |
| 863 for (list = purple_request_fields_get_groups(allfields); list; list = list->next) { |
857 for(list = purple_request_page_get_groups(page); list; list = list->next) { |
| 864 PurpleRequestGroup *group = list->data; |
858 PurpleRequestGroup *group = list->data; |
| 865 GList *fields = purple_request_group_get_fields(group); |
859 GList *fields = purple_request_group_get_fields(group); |
| 866 |
860 |
| 867 for (; fields ; fields = fields->next) { |
861 for (; fields ; fields = fields->next) { |
| 868 PurpleRequestField *field = fields->data; |
862 PurpleRequestField *field = fields->data; |