| 325 gtk_widget_show_all(dialog); |
325 gtk_widget_show_all(dialog); |
| 326 |
326 |
| 327 return data; |
327 return data; |
| 328 } |
328 } |
| 329 |
329 |
| |
330 void * |
| |
331 gaim_gtk_request_fields(const char *title, const char *primary, |
| |
332 const char *secondary, GaimRequestFields *fields, |
| |
333 const char *ok_text, GCallback ok_cb, |
| |
334 const char *cancel_text, GCallback cancel_cb, |
| |
335 void *user_data) |
| |
336 { |
| |
337 GaimGtkRequestData *data; |
| |
338 GtkWidget *win; |
| |
339 GtkWidget *vbox; |
| |
340 GtkWidget *frame; |
| |
341 GtkWidget *label; |
| |
342 GtkWidget *table; |
| |
343 GList *gl, *fl; |
| |
344 GaimRequestFieldGroup *group; |
| |
345 GaimRequestField *field; |
| |
346 char *text; |
| |
347 char *label_text; |
| |
348 |
| |
349 data = g_new0(GaimGtkRequestData, 1); |
| |
350 data->type = GAIM_REQUEST_FIELDS; |
| |
351 data->user_data = user_data; |
| |
352 |
| |
353 data->cb_count = 2; |
| |
354 data->cbs = g_new0(GCallback, 2); |
| |
355 |
| |
356 data->cbs[0] = ok_cb; |
| |
357 data->cbs[1] = cancel_cb; |
| |
358 |
| |
359 data->dialog = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| |
360 gtk_window_set_role(GTK_WINDOW(win), "fields request"); |
| |
361 gtk_container_set_border_width(GTK_CONTAINER(win), 12); |
| |
362 gtk_window_set_resizable(GTK_WINDOW(win), FALSE); |
| |
363 |
| |
364 /* Setup the vbox */ |
| |
365 vbox = gtk_vbox_new(FALSE, 12); |
| |
366 gtk_container_add(GTK_CONTAINER(win), vbox); |
| |
367 gtk_widget_show(vbox); |
| |
368 |
| |
369 if (primary != NULL || secondary != NULL) { |
| |
370 label_text = g_strdup_printf("<span weight=\"bold\" size=\"larger\">" |
| |
371 "%s</span>\n\n%s", |
| |
372 (primary ? primary : ""), |
| |
373 (secondary ? secondary : "")); |
| |
374 |
| |
375 label = gtk_label_new(NULL); |
| |
376 |
| |
377 gtk_label_set_markup(GTK_LABEL(label), label_text); |
| |
378 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
| |
379 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); |
| |
380 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); |
| |
381 |
| |
382 g_free(label_text); |
| |
383 } |
| |
384 |
| |
385 for (gl = gaim_request_fields_get_groups(fields); |
| |
386 gl != NULL; |
| |
387 gl = gl->next) { |
| |
388 |
| |
389 GList *fields; |
| |
390 size_t field_count = 0; |
| |
391 size_t cols = 1; |
| |
392 size_t rows; |
| |
393 size_t col_num; |
| |
394 size_t row_num; |
| |
395 |
| |
396 group = gl->data; |
| |
397 fields = gaim_request_field_group_get_fields(group); |
| |
398 |
| |
399 frame = gaim_gtk_make_frame(vbox, |
| |
400 gaim_request_field_group_get_title(group)); |
| |
401 |
| |
402 field_count = g_list_length(fields); |
| |
403 |
| |
404 if (field_count > 9) { |
| |
405 rows = field_count / 2; |
| |
406 cols++; |
| |
407 } |
| |
408 else |
| |
409 rows = field_count; |
| |
410 |
| |
411 table = gtk_table_new(rows, 2 * cols, FALSE); |
| |
412 gtk_table_set_row_spacings(GTK_TABLE(table), 6); |
| |
413 gtk_table_set_col_spacings(GTK_TABLE(table), 6); |
| |
414 |
| |
415 gtk_container_add(GTK_CONTAINER(frame), table); |
| |
416 gtk_widget_show(table); |
| |
417 |
| |
418 for (col_num = 0, fl = fields; |
| |
419 col_num < cols && fl != NULL; |
| |
420 col_num++) { |
| |
421 |
| |
422 for (row_num = 0; |
| |
423 row_num < rows && fl != NULL; |
| |
424 row_num++, fl = fl->next) { |
| |
425 |
| |
426 size_t col_offset = col_num * 2; |
| |
427 GaimRequestFieldType type; |
| |
428 GtkWidget *widget = NULL; |
| |
429 |
| |
430 field = fl->data; |
| |
431 |
| |
432 type = gaim_request_field_get_type(field); |
| |
433 |
| |
434 if (type != GAIM_REQUEST_FIELD_BOOLEAN) { |
| |
435 text = g_strdup_printf("%s:", |
| |
436 gaim_request_field_get_label(field)); |
| |
437 label = gtk_label_new(text); |
| |
438 g_free(text); |
| |
439 |
| |
440 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
| |
441 |
| |
442 gtk_table_attach_defaults(GTK_TABLE(table), label, |
| |
443 col_offset, col_offset + 1, |
| |
444 row_num, row_num + 1); |
| |
445 gtk_widget_show(label); |
| |
446 } |
| |
447 |
| |
448 if (type == GAIM_REQUEST_FIELD_STRING) { |
| |
449 const char *value; |
| |
450 |
| |
451 widget = gtk_entry_new(); |
| |
452 |
| |
453 value = gaim_request_field_string_get_default_value(field); |
| |
454 |
| |
455 if (value != NULL) |
| |
456 gtk_entry_set_text(GTK_ENTRY(widget), value); |
| |
457 } |
| |
458 else if (type == GAIM_REQUEST_FIELD_INTEGER) { |
| |
459 int value; |
| |
460 |
| |
461 widget = gtk_entry_new(); |
| |
462 |
| |
463 value = gaim_request_field_int_get_default_value(field); |
| |
464 |
| |
465 if (value != 0) { |
| |
466 char buf[32]; |
| |
467 |
| |
468 g_snprintf(buf, sizeof(buf), "%d", value); |
| |
469 |
| |
470 gtk_entry_set_text(GTK_ENTRY(widget), buf); |
| |
471 } |
| |
472 } |
| |
473 else if (type == GAIM_REQUEST_FIELD_BOOLEAN) { |
| |
474 widget = gtk_check_button_new_with_label( |
| |
475 gaim_request_field_get_label(field)); |
| |
476 |
| |
477 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), |
| |
478 gaim_request_field_bool_get_default_value(field)); |
| |
479 } |
| |
480 else if (type == GAIM_REQUEST_FIELD_CHOICE) { |
| |
481 GList *labels; |
| |
482 GList *l; |
| |
483 |
| |
484 labels = gaim_request_field_choice_get_labels(field); |
| |
485 |
| |
486 if (g_list_length(labels) > 5) { |
| |
487 GtkWidget *menu; |
| |
488 GtkWidget *item; |
| |
489 |
| |
490 widget = gtk_option_menu_new(); |
| |
491 |
| |
492 menu = gtk_menu_new(); |
| |
493 |
| |
494 gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), menu); |
| |
495 |
| |
496 for (l = labels; l != NULL; l = l->next) { |
| |
497 const char *text = l->data; |
| |
498 |
| |
499 item = gtk_menu_item_new_with_label(text); |
| |
500 |
| |
501 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); |
| |
502 } |
| |
503 } |
| |
504 else { |
| |
505 GtkWidget *box; |
| |
506 GtkWidget *first_radio = NULL; |
| |
507 GtkWidget *radio; |
| |
508 |
| |
509 if (g_list_length(labels) == 2) |
| |
510 box = gtk_hbox_new(FALSE, 6); |
| |
511 else |
| |
512 box = gtk_vbox_new(FALSE, 0); |
| |
513 |
| |
514 widget = box; |
| |
515 |
| |
516 for (l = labels; l != NULL; l = l->next) { |
| |
517 const char *text = l->data; |
| |
518 |
| |
519 radio = |
| |
520 gtk_radio_button_new_with_label_from_widget( |
| |
521 GTK_RADIO_BUTTON(first_radio), text); |
| |
522 |
| |
523 if (first_radio == NULL) |
| |
524 first_radio = radio; |
| |
525 |
| |
526 gtk_box_pack_start(GTK_BOX(box), radio, |
| |
527 TRUE, TRUE, 0); |
| |
528 gtk_widget_show(radio); |
| |
529 } |
| |
530 } |
| |
531 } |
| |
532 |
| |
533 if (type != GAIM_REQUEST_FIELD_BOOLEAN) { |
| |
534 gtk_table_attach(GTK_TABLE(table), widget, |
| |
535 col_offset + 1, col_offset + 2, |
| |
536 row_num, row_num + 1, |
| |
537 GTK_FILL | GTK_EXPAND, |
| |
538 GTK_FILL | GTK_EXPAND, |
| |
539 5, 0); |
| |
540 } |
| |
541 else { |
| |
542 gtk_table_attach(GTK_TABLE(table), widget, |
| |
543 col_offset, col_offset + 1, |
| |
544 row_num, row_num + 1, |
| |
545 GTK_FILL | GTK_EXPAND, |
| |
546 GTK_FILL | GTK_EXPAND, |
| |
547 5, 0); |
| |
548 } |
| |
549 |
| |
550 gtk_widget_show(widget); |
| |
551 |
| |
552 field->ui_data = widget; |
| |
553 } |
| |
554 } |
| |
555 } |
| |
556 |
| |
557 gtk_widget_show(win); |
| |
558 |
| |
559 return data; |
| |
560 } |
| |
561 |
| 330 void |
562 void |
| 331 gaim_gtk_close_request(GaimRequestType type, void *ui_handle) |
563 gaim_gtk_close_request(GaimRequestType type, void *ui_handle) |
| 332 { |
564 { |
| 333 GaimRequestData *data = (GaimRequestData *)ui_handle; |
565 GaimGtkRequestData *data = (GaimGtkRequestData *)ui_handle; |
| 334 |
566 |
| 335 if (data->cbs != NULL) |
567 if (data->cbs != NULL) |
| 336 g_free(data->cbs); |
568 g_free(data->cbs); |
| 337 |
569 |
| 338 gtk_widget_destroy(data->dialog); |
570 gtk_widget_destroy(data->dialog); |