Mercurial > pidgin
comparison src/gtkrequest.c @ 6337:957c1d28b96a
[gaim-migrate @ 6836]
The multi-field dialog code seems to be working with multi-line text views
in it. It may not work when the text view is in the middle somewhere, but I
don't care. I don't ever want to touch this code again.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Wed, 30 Jul 2003 07:39:23 +0000 |
parents | ea47bddc7376 |
children | 644ebf75f686 |
comparison
equal
deleted
inserted
replaced
6336:aeb8c2119a58 | 6337:957c1d28b96a |
---|---|
93 | 93 |
94 gaim_request_close(GAIM_REQUEST_INPUT, data); | 94 gaim_request_close(GAIM_REQUEST_INPUT, data); |
95 } | 95 } |
96 | 96 |
97 static gboolean | 97 static gboolean |
98 field_string_focus_out_cb(GtkEntry *entry, GdkEventFocus *event, | 98 field_string_focus_out_cb(GtkWidget *entry, GdkEventFocus *event, |
99 GaimRequestField *field) | 99 GaimRequestField *field) |
100 { | 100 { |
101 const char *value = gtk_entry_get_text(entry); | 101 const char *value; |
102 | |
103 if (gaim_request_field_string_is_multiline(field)) { | |
104 GtkTextBuffer *buffer; | |
105 GtkTextIter start_iter, end_iter; | |
106 | |
107 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry)); | |
108 | |
109 gtk_text_buffer_get_start_iter(buffer, &start_iter); | |
110 gtk_text_buffer_get_end_iter(buffer, &end_iter); | |
111 | |
112 value = gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, FALSE); | |
113 } | |
114 else | |
115 value = gtk_entry_get_text(GTK_ENTRY(entry)); | |
102 | 116 |
103 gaim_request_field_string_set_value(field, | 117 gaim_request_field_string_set_value(field, |
104 (*value == '\0' ? NULL : value)); | 118 (*value == '\0' ? NULL : value)); |
105 | 119 |
106 return FALSE; | 120 return FALSE; |
419 GtkWidget *hbox; | 433 GtkWidget *hbox; |
420 GtkWidget *bbox; | 434 GtkWidget *bbox; |
421 GtkWidget *frame; | 435 GtkWidget *frame; |
422 GtkWidget *label; | 436 GtkWidget *label; |
423 GtkWidget *table; | 437 GtkWidget *table; |
424 /* GtkWidget *sep; */ | |
425 GtkWidget *button; | 438 GtkWidget *button; |
426 GtkWidget *img; | 439 GtkWidget *img; |
427 GtkSizeGroup *sg; | 440 GtkSizeGroup *sg; |
428 GList *gl, *fl; | 441 GList *gl, *fl; |
429 GaimRequestFieldGroup *group; | 442 GaimRequestFieldGroup *group; |
494 GList *field_list; | 507 GList *field_list; |
495 size_t field_count = 0; | 508 size_t field_count = 0; |
496 size_t cols = 1; | 509 size_t cols = 1; |
497 size_t rows; | 510 size_t rows; |
498 size_t col_num; | 511 size_t col_num; |
499 size_t row_num; | 512 size_t row_num = 0; |
500 | 513 |
501 group = gl->data; | 514 group = gl->data; |
502 field_list = gaim_request_field_group_get_fields(group); | 515 field_list = gaim_request_field_group_get_fields(group); |
503 | 516 |
504 if (gaim_request_field_group_get_title(group) != NULL) { | 517 if (gaim_request_field_group_get_title(group) != NULL) { |
515 cols++; | 528 cols++; |
516 } | 529 } |
517 else | 530 else |
518 rows = field_count; | 531 rows = field_count; |
519 | 532 |
533 for (fl = field_list; fl != NULL; fl = fl->next) { | |
534 GaimRequestFieldType type; | |
535 | |
536 field = (GaimRequestField *)fl->data; | |
537 | |
538 type = gaim_request_field_get_type(field); | |
539 | |
540 if (type == GAIM_REQUEST_FIELD_STRING && | |
541 gaim_request_field_string_is_multiline(field)) { | |
542 | |
543 rows += 2; | |
544 } | |
545 } | |
546 | |
520 table = gtk_table_new(rows, 2 * cols, FALSE); | 547 table = gtk_table_new(rows, 2 * cols, FALSE); |
521 gtk_table_set_row_spacings(GTK_TABLE(table), 6); | 548 gtk_table_set_row_spacings(GTK_TABLE(table), 6); |
522 gtk_table_set_col_spacings(GTK_TABLE(table), 6); | 549 gtk_table_set_col_spacings(GTK_TABLE(table), 6); |
523 | 550 |
524 gtk_container_add(GTK_CONTAINER(frame), table); | 551 gtk_container_add(GTK_CONTAINER(frame), table); |
525 gtk_widget_show(table); | 552 gtk_widget_show(table); |
526 | 553 |
554 for (row_num = 0, fl = field_list; | |
555 row_num < rows && fl != NULL; | |
556 row_num++) { | |
557 | |
558 for (col_num = 0; | |
559 col_num < cols && fl != NULL; | |
560 col_num++, fl = fl->next) { | |
561 | |
562 size_t col_offset = col_num * 2; | |
563 GaimRequestFieldType type; | |
564 GtkWidget *widget = NULL; | |
565 | |
566 field = fl->data; | |
567 | |
568 type = gaim_request_field_get_type(field); | |
569 | |
570 gaim_debug(GAIM_DEBUG_INFO, "gtkrequest", | |
571 "Adding %s (%d, %d - %d, %d)\n", | |
572 gaim_request_field_get_label(field), | |
573 row_num, col_num, rows, cols); | |
574 | |
575 if (type != GAIM_REQUEST_FIELD_BOOLEAN) { | |
576 text = g_strdup_printf("%s:", | |
577 gaim_request_field_get_label(field)); | |
578 | |
579 label = gtk_label_new(NULL); | |
580 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), text); | |
581 g_free(text); | |
582 | |
583 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
584 | |
585 gtk_size_group_add_widget(sg, label); | |
586 | |
587 if (type == GAIM_REQUEST_FIELD_STRING && | |
588 gaim_request_field_string_is_multiline(field)) { | |
589 | |
590 gtk_table_attach_defaults(GTK_TABLE(table), label, | |
591 0, 2 * cols, | |
592 row_num, row_num + 1); | |
593 | |
594 row_num++; | |
595 } | |
596 else { | |
597 gtk_table_attach_defaults(GTK_TABLE(table), label, | |
598 col_offset, col_offset + 1, | |
599 row_num, row_num + 1); | |
600 } | |
601 | |
602 gtk_widget_show(label); | |
603 } | |
604 | |
605 if (type == GAIM_REQUEST_FIELD_STRING) { | |
606 const char *value; | |
607 | |
608 value = gaim_request_field_string_get_default_value(field); | |
609 | |
610 if (gaim_request_field_string_is_multiline(field)) { | |
611 GtkWidget *textview; | |
612 | |
613 widget = gtk_scrolled_window_new(NULL, NULL); | |
614 gtk_scrolled_window_set_shadow_type( | |
615 GTK_SCROLLED_WINDOW(widget), | |
616 GTK_SHADOW_IN); | |
617 gtk_scrolled_window_set_policy( | |
618 GTK_SCROLLED_WINDOW(widget), | |
619 GTK_POLICY_NEVER, | |
620 GTK_POLICY_AUTOMATIC); | |
621 | |
622 textview = gtk_text_view_new(); | |
623 gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), | |
624 TRUE); | |
625 gtk_container_add(GTK_CONTAINER(widget), textview); | |
626 gtk_widget_show(textview); | |
627 | |
628 gtk_widget_set_size_request(widget, -1, 75); | |
629 | |
630 if (value != NULL) { | |
631 GtkTextBuffer *buffer; | |
632 | |
633 buffer = gtk_text_view_get_buffer( | |
634 GTK_TEXT_VIEW(textview)); | |
635 | |
636 gtk_text_buffer_set_text(buffer, value, -1); | |
637 } | |
638 } | |
639 else { | |
640 widget = gtk_entry_new(); | |
641 | |
642 if (value != NULL) | |
643 gtk_entry_set_text(GTK_ENTRY(widget), value); | |
644 } | |
645 | |
646 g_signal_connect(G_OBJECT(widget), "focus-out-event", | |
647 G_CALLBACK(field_string_focus_out_cb), | |
648 field); | |
649 } | |
650 else if (type == GAIM_REQUEST_FIELD_INTEGER) { | |
651 int value; | |
652 | |
653 widget = gtk_entry_new(); | |
654 | |
655 value = gaim_request_field_int_get_default_value(field); | |
656 | |
657 if (value != 0) { | |
658 char buf[32]; | |
659 | |
660 g_snprintf(buf, sizeof(buf), "%d", value); | |
661 | |
662 gtk_entry_set_text(GTK_ENTRY(widget), buf); | |
663 } | |
664 | |
665 g_signal_connect(G_OBJECT(widget), "focus-out-event", | |
666 G_CALLBACK(field_int_focus_out_cb), | |
667 field); | |
668 } | |
669 else if (type == GAIM_REQUEST_FIELD_BOOLEAN) { | |
670 widget = gtk_check_button_new_with_label( | |
671 gaim_request_field_get_label(field)); | |
672 | |
673 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), | |
674 gaim_request_field_bool_get_default_value(field)); | |
675 | |
676 g_signal_connect(G_OBJECT(widget), "toggled", | |
677 G_CALLBACK(field_bool_cb), field); | |
678 } | |
679 else if (type == GAIM_REQUEST_FIELD_CHOICE) { | |
680 GList *labels; | |
681 GList *l; | |
682 | |
683 labels = gaim_request_field_choice_get_labels(field); | |
684 | |
685 if (g_list_length(labels) > 5) { | |
686 GtkWidget *menu; | |
687 GtkWidget *item; | |
688 | |
689 widget = gtk_option_menu_new(); | |
690 | |
691 menu = gtk_menu_new(); | |
692 | |
693 gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), menu); | |
694 | |
695 for (l = labels; l != NULL; l = l->next) { | |
696 const char *text = l->data; | |
697 | |
698 item = gtk_menu_item_new_with_label(text); | |
699 | |
700 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); | |
701 } | |
702 | |
703 g_signal_connect(G_OBJECT(widget), "changed", | |
704 G_CALLBACK(field_choice_menu_cb), | |
705 field); | |
706 } | |
707 else { | |
708 GtkWidget *box; | |
709 GtkWidget *first_radio = NULL; | |
710 GtkWidget *radio; | |
711 | |
712 if (g_list_length(labels) == 2) | |
713 box = gtk_hbox_new(FALSE, 6); | |
714 else | |
715 box = gtk_vbox_new(FALSE, 0); | |
716 | |
717 widget = box; | |
718 | |
719 for (l = labels; l != NULL; l = l->next) { | |
720 const char *text = l->data; | |
721 | |
722 radio = | |
723 gtk_radio_button_new_with_label_from_widget( | |
724 GTK_RADIO_BUTTON(first_radio), text); | |
725 | |
726 if (first_radio == NULL) | |
727 first_radio = radio; | |
728 | |
729 gtk_box_pack_start(GTK_BOX(box), radio, | |
730 TRUE, TRUE, 0); | |
731 gtk_widget_show(radio); | |
732 | |
733 g_signal_connect(G_OBJECT(radio), "toggled", | |
734 G_CALLBACK(field_choice_option_cb), | |
735 field); | |
736 } | |
737 } | |
738 } | |
739 | |
740 if (type == GAIM_REQUEST_FIELD_STRING && | |
741 gaim_request_field_string_is_multiline(field)) { | |
742 | |
743 gtk_table_attach(GTK_TABLE(table), widget, | |
744 0, 2 * cols, | |
745 row_num, row_num + 1, | |
746 GTK_FILL | GTK_EXPAND, | |
747 GTK_FILL | GTK_EXPAND, | |
748 5, 0); | |
749 } | |
750 else if (type != GAIM_REQUEST_FIELD_BOOLEAN) { | |
751 gtk_table_attach(GTK_TABLE(table), widget, | |
752 col_offset + 1, col_offset + 2, | |
753 row_num, row_num + 1, | |
754 GTK_FILL | GTK_EXPAND, | |
755 GTK_FILL | GTK_EXPAND, | |
756 5, 0); | |
757 } | |
758 else { | |
759 gtk_table_attach(GTK_TABLE(table), widget, | |
760 col_offset, col_offset + 1, | |
761 row_num, row_num + 1, | |
762 GTK_FILL | GTK_EXPAND, | |
763 GTK_FILL | GTK_EXPAND, | |
764 5, 0); | |
765 } | |
766 | |
767 gtk_widget_show(widget); | |
768 | |
769 field->ui_data = widget; | |
770 } | |
771 } | |
772 | |
773 #if 0 | |
527 for (col_num = 0, fl = field_list; | 774 for (col_num = 0, fl = field_list; |
528 col_num < cols && fl != NULL; | 775 col_num < cols && fl != NULL; |
529 col_num++) { | 776 col_num++) { |
530 | 777 |
531 for (row_num = 0; | 778 for (row_num = 0; |
538 | 785 |
539 field = fl->data; | 786 field = fl->data; |
540 | 787 |
541 type = gaim_request_field_get_type(field); | 788 type = gaim_request_field_get_type(field); |
542 | 789 |
543 gaim_debug(GAIM_DEBUG_MISC, "gtkrequest", | 790 gaim_debug(GAIM_DEBUG_INFO, "gtkrequest", |
544 "type = %d (%d)\n", | 791 "Adding %s (%d, %d - %d, %d)\n", |
545 type, field->type); | 792 gaim_request_field_get_label(field), |
793 row_num, col_num, rows, cols); | |
546 | 794 |
547 if (type != GAIM_REQUEST_FIELD_BOOLEAN) { | 795 if (type != GAIM_REQUEST_FIELD_BOOLEAN) { |
548 text = g_strdup_printf("%s:", | 796 text = g_strdup_printf("%s:", |
549 gaim_request_field_get_label(field)); | 797 gaim_request_field_get_label(field)); |
550 | 798 |
554 | 802 |
555 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | 803 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
556 | 804 |
557 gtk_size_group_add_widget(sg, label); | 805 gtk_size_group_add_widget(sg, label); |
558 | 806 |
559 gtk_table_attach_defaults(GTK_TABLE(table), label, | 807 if (type == GAIM_REQUEST_FIELD_STRING && |
560 col_offset, col_offset + 1, | 808 gaim_request_field_string_is_multiline(field)) { |
561 row_num, row_num + 1); | 809 |
810 gtk_table_attach_defaults(GTK_TABLE(table), label, | |
811 0, 2 * cols, | |
812 row_num, row_num + 1); | |
813 | |
814 row_num++; | |
815 } | |
816 else { | |
817 gtk_table_attach_defaults(GTK_TABLE(table), label, | |
818 col_offset, col_offset + 1, | |
819 row_num, row_num + 1); | |
820 } | |
821 | |
562 gtk_widget_show(label); | 822 gtk_widget_show(label); |
563 } | 823 } |
564 | 824 |
565 if (type == GAIM_REQUEST_FIELD_STRING) { | 825 if (type == GAIM_REQUEST_FIELD_STRING) { |
566 const char *value; | 826 const char *value; |
686 row_num, row_num + 1, | 946 row_num, row_num + 1, |
687 GTK_FILL | GTK_EXPAND, | 947 GTK_FILL | GTK_EXPAND, |
688 GTK_FILL | GTK_EXPAND, | 948 GTK_FILL | GTK_EXPAND, |
689 5, 0); | 949 5, 0); |
690 } | 950 } |
951 else if (type == GAIM_REQUEST_FIELD_STRING && | |
952 gaim_request_field_string_is_multiline(field)) { | |
953 | |
954 gtk_table_attach(GTK_TABLE(table), widget, | |
955 0, 2 * cols, | |
956 row_num, row_num + 1, | |
957 GTK_FILL | GTK_EXPAND, | |
958 GTK_FILL | GTK_EXPAND, | |
959 5, 0); | |
960 } | |
691 else { | 961 else { |
692 gtk_table_attach(GTK_TABLE(table), widget, | 962 gtk_table_attach(GTK_TABLE(table), widget, |
693 col_offset, col_offset + 1, | 963 col_offset, col_offset + 1, |
694 row_num, row_num + 1, | 964 row_num, row_num + 1, |
695 GTK_FILL | GTK_EXPAND, | 965 GTK_FILL | GTK_EXPAND, |
700 gtk_widget_show(widget); | 970 gtk_widget_show(widget); |
701 | 971 |
702 field->ui_data = widget; | 972 field->ui_data = widget; |
703 } | 973 } |
704 } | 974 } |
975 #endif | |
705 } | 976 } |
706 | 977 |
707 g_object_unref(sg); | 978 g_object_unref(sg); |
708 | |
709 #if 0 | |
710 /* Separator */ | |
711 sep = gtk_hseparator_new(); | |
712 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
713 gtk_widget_show(sep); | |
714 #endif | |
715 | 979 |
716 /* Button box. */ | 980 /* Button box. */ |
717 bbox = gtk_hbutton_box_new(); | 981 bbox = gtk_hbutton_box_new(); |
718 gtk_box_set_spacing(GTK_BOX(bbox), 6); | 982 gtk_box_set_spacing(GTK_BOX(bbox), 6); |
719 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | 983 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); |