# HG changeset patch # User Christian Hammond # Date 1059550763 0 # Node ID 957c1d28b96afbb9225d7a5f2f5926961a4e47a5 # Parent aeb8c2119a5816f80c430d5e90cff4c21d0cb42a [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 diff -r aeb8c2119a58 -r 957c1d28b96a src/gtkrequest.c --- a/src/gtkrequest.c Wed Jul 30 04:50:00 2003 +0000 +++ b/src/gtkrequest.c Wed Jul 30 07:39:23 2003 +0000 @@ -95,10 +95,24 @@ } static gboolean -field_string_focus_out_cb(GtkEntry *entry, GdkEventFocus *event, +field_string_focus_out_cb(GtkWidget *entry, GdkEventFocus *event, GaimRequestField *field) { - const char *value = gtk_entry_get_text(entry); + const char *value; + + if (gaim_request_field_string_is_multiline(field)) { + GtkTextBuffer *buffer; + GtkTextIter start_iter, end_iter; + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry)); + + gtk_text_buffer_get_start_iter(buffer, &start_iter); + gtk_text_buffer_get_end_iter(buffer, &end_iter); + + value = gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, FALSE); + } + else + value = gtk_entry_get_text(GTK_ENTRY(entry)); gaim_request_field_string_set_value(field, (*value == '\0' ? NULL : value)); @@ -421,7 +435,6 @@ GtkWidget *frame; GtkWidget *label; GtkWidget *table; - /* GtkWidget *sep; */ GtkWidget *button; GtkWidget *img; GtkSizeGroup *sg; @@ -496,7 +509,7 @@ size_t cols = 1; size_t rows; size_t col_num; - size_t row_num; + size_t row_num = 0; group = gl->data; field_list = gaim_request_field_group_get_fields(group); @@ -517,6 +530,20 @@ else rows = field_count; + for (fl = field_list; fl != NULL; fl = fl->next) { + GaimRequestFieldType type; + + field = (GaimRequestField *)fl->data; + + type = gaim_request_field_get_type(field); + + if (type == GAIM_REQUEST_FIELD_STRING && + gaim_request_field_string_is_multiline(field)) { + + rows += 2; + } + } + table = gtk_table_new(rows, 2 * cols, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 6); gtk_table_set_col_spacings(GTK_TABLE(table), 6); @@ -524,6 +551,226 @@ gtk_container_add(GTK_CONTAINER(frame), table); gtk_widget_show(table); + for (row_num = 0, fl = field_list; + row_num < rows && fl != NULL; + row_num++) { + + for (col_num = 0; + col_num < cols && fl != NULL; + col_num++, fl = fl->next) { + + size_t col_offset = col_num * 2; + GaimRequestFieldType type; + GtkWidget *widget = NULL; + + field = fl->data; + + type = gaim_request_field_get_type(field); + + gaim_debug(GAIM_DEBUG_INFO, "gtkrequest", + "Adding %s (%d, %d - %d, %d)\n", + gaim_request_field_get_label(field), + row_num, col_num, rows, cols); + + if (type != GAIM_REQUEST_FIELD_BOOLEAN) { + text = g_strdup_printf("%s:", + gaim_request_field_get_label(field)); + + label = gtk_label_new(NULL); + gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), text); + g_free(text); + + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + + gtk_size_group_add_widget(sg, label); + + if (type == GAIM_REQUEST_FIELD_STRING && + gaim_request_field_string_is_multiline(field)) { + + gtk_table_attach_defaults(GTK_TABLE(table), label, + 0, 2 * cols, + row_num, row_num + 1); + + row_num++; + } + else { + gtk_table_attach_defaults(GTK_TABLE(table), label, + col_offset, col_offset + 1, + row_num, row_num + 1); + } + + gtk_widget_show(label); + } + + if (type == GAIM_REQUEST_FIELD_STRING) { + const char *value; + + value = gaim_request_field_string_get_default_value(field); + + if (gaim_request_field_string_is_multiline(field)) { + GtkWidget *textview; + + widget = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type( + GTK_SCROLLED_WINDOW(widget), + GTK_SHADOW_IN); + gtk_scrolled_window_set_policy( + GTK_SCROLLED_WINDOW(widget), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + + textview = gtk_text_view_new(); + gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), + TRUE); + gtk_container_add(GTK_CONTAINER(widget), textview); + gtk_widget_show(textview); + + gtk_widget_set_size_request(widget, -1, 75); + + if (value != NULL) { + GtkTextBuffer *buffer; + + buffer = gtk_text_view_get_buffer( + GTK_TEXT_VIEW(textview)); + + gtk_text_buffer_set_text(buffer, value, -1); + } + } + else { + widget = gtk_entry_new(); + + if (value != NULL) + gtk_entry_set_text(GTK_ENTRY(widget), value); + } + + g_signal_connect(G_OBJECT(widget), "focus-out-event", + G_CALLBACK(field_string_focus_out_cb), + field); + } + else if (type == GAIM_REQUEST_FIELD_INTEGER) { + int value; + + widget = gtk_entry_new(); + + value = gaim_request_field_int_get_default_value(field); + + if (value != 0) { + char buf[32]; + + g_snprintf(buf, sizeof(buf), "%d", value); + + gtk_entry_set_text(GTK_ENTRY(widget), buf); + } + + g_signal_connect(G_OBJECT(widget), "focus-out-event", + G_CALLBACK(field_int_focus_out_cb), + field); + } + else if (type == GAIM_REQUEST_FIELD_BOOLEAN) { + widget = gtk_check_button_new_with_label( + gaim_request_field_get_label(field)); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), + gaim_request_field_bool_get_default_value(field)); + + g_signal_connect(G_OBJECT(widget), "toggled", + G_CALLBACK(field_bool_cb), field); + } + else if (type == GAIM_REQUEST_FIELD_CHOICE) { + GList *labels; + GList *l; + + labels = gaim_request_field_choice_get_labels(field); + + if (g_list_length(labels) > 5) { + GtkWidget *menu; + GtkWidget *item; + + widget = gtk_option_menu_new(); + + menu = gtk_menu_new(); + + gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), menu); + + for (l = labels; l != NULL; l = l->next) { + const char *text = l->data; + + item = gtk_menu_item_new_with_label(text); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + } + + g_signal_connect(G_OBJECT(widget), "changed", + G_CALLBACK(field_choice_menu_cb), + field); + } + else { + GtkWidget *box; + GtkWidget *first_radio = NULL; + GtkWidget *radio; + + if (g_list_length(labels) == 2) + box = gtk_hbox_new(FALSE, 6); + else + box = gtk_vbox_new(FALSE, 0); + + widget = box; + + for (l = labels; l != NULL; l = l->next) { + const char *text = l->data; + + radio = + gtk_radio_button_new_with_label_from_widget( + GTK_RADIO_BUTTON(first_radio), text); + + if (first_radio == NULL) + first_radio = radio; + + gtk_box_pack_start(GTK_BOX(box), radio, + TRUE, TRUE, 0); + gtk_widget_show(radio); + + g_signal_connect(G_OBJECT(radio), "toggled", + G_CALLBACK(field_choice_option_cb), + field); + } + } + } + + if (type == GAIM_REQUEST_FIELD_STRING && + gaim_request_field_string_is_multiline(field)) { + + gtk_table_attach(GTK_TABLE(table), widget, + 0, 2 * cols, + row_num, row_num + 1, + GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, + 5, 0); + } + else if (type != GAIM_REQUEST_FIELD_BOOLEAN) { + gtk_table_attach(GTK_TABLE(table), widget, + col_offset + 1, col_offset + 2, + row_num, row_num + 1, + GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, + 5, 0); + } + else { + gtk_table_attach(GTK_TABLE(table), widget, + col_offset, col_offset + 1, + row_num, row_num + 1, + GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, + 5, 0); + } + + gtk_widget_show(widget); + + field->ui_data = widget; + } + } + +#if 0 for (col_num = 0, fl = field_list; col_num < cols && fl != NULL; col_num++) { @@ -540,9 +787,10 @@ type = gaim_request_field_get_type(field); - gaim_debug(GAIM_DEBUG_MISC, "gtkrequest", - "type = %d (%d)\n", - type, field->type); + gaim_debug(GAIM_DEBUG_INFO, "gtkrequest", + "Adding %s (%d, %d - %d, %d)\n", + gaim_request_field_get_label(field), + row_num, col_num, rows, cols); if (type != GAIM_REQUEST_FIELD_BOOLEAN) { text = g_strdup_printf("%s:", @@ -556,9 +804,21 @@ gtk_size_group_add_widget(sg, label); - gtk_table_attach_defaults(GTK_TABLE(table), label, - col_offset, col_offset + 1, - row_num, row_num + 1); + if (type == GAIM_REQUEST_FIELD_STRING && + gaim_request_field_string_is_multiline(field)) { + + gtk_table_attach_defaults(GTK_TABLE(table), label, + 0, 2 * cols, + row_num, row_num + 1); + + row_num++; + } + else { + gtk_table_attach_defaults(GTK_TABLE(table), label, + col_offset, col_offset + 1, + row_num, row_num + 1); + } + gtk_widget_show(label); } @@ -688,6 +948,16 @@ GTK_FILL | GTK_EXPAND, 5, 0); } + else if (type == GAIM_REQUEST_FIELD_STRING && + gaim_request_field_string_is_multiline(field)) { + + gtk_table_attach(GTK_TABLE(table), widget, + 0, 2 * cols, + row_num, row_num + 1, + GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, + 5, 0); + } else { gtk_table_attach(GTK_TABLE(table), widget, col_offset, col_offset + 1, @@ -702,17 +972,11 @@ field->ui_data = widget; } } +#endif } g_object_unref(sg); -#if 0 - /* Separator */ - sep = gtk_hseparator_new(); - gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); - gtk_widget_show(sep); -#endif - /* Button box. */ bbox = gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(bbox), 6);