/* * Pops up an error dialog */ static void balsa_information_dialog(GtkWindow *parent, LibBalsaInformationType type, const char *msg) { GtkMessageType message_type; GtkWidget *messagebox; switch (type) { case LIBBALSA_INFORMATION_MESSAGE: message_type = GTK_MESSAGE_INFO; break; case LIBBALSA_INFORMATION_WARNING: message_type = GTK_MESSAGE_WARNING; break; case LIBBALSA_INFORMATION_ERROR: message_type = GTK_MESSAGE_ERROR; break; case LIBBALSA_INFORMATION_DEBUG: message_type = GTK_MESSAGE_INFO; break; case LIBBALSA_INFORMATION_FATAL: message_type = GTK_MESSAGE_ERROR; break; default: message_type = GTK_MESSAGE_INFO; break; } /* Use explicit format so that message_dialog does not try to interpret * the message string. */ messagebox = gtk_message_dialog_new(GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT | libbalsa_dialog_flags(), message_type, GTK_BUTTONS_CLOSE, "%s", msg); #if HAVE_MACOSX_DESKTOP libbalsa_macosx_menu_for_parent(messagebox, GTK_WINDOW(parent)); #endif gtk_dialog_run(GTK_DIALOG(messagebox)); gtk_widget_destroy(messagebox); }
/* create the toolbar-customization dialog */ void customize_dialog_cb(GtkWidget * widget, gpointer data) { GtkWidget *notebook; GtkWidget *child; GtkWidget *option_frame; GtkWidget *option_box; GtkWidget *wrap_button; GtkWidget *active_window = data; BalsaToolbarType type; BalsaToolbarModel *model; GSimpleActionGroup *group; GtkWidget *content_area; /* There can only be one */ if (customize_widget) { gtk_window_present(GTK_WINDOW(customize_widget)); return; } customize_widget = gtk_dialog_new_with_buttons(_("Customize Toolbars"), GTK_WINDOW(active_window), GTK_DIALOG_DESTROY_WITH_PARENT | libbalsa_dialog_flags(), _("_Close"), GTK_RESPONSE_CLOSE, _("_Help"), GTK_RESPONSE_HELP, NULL); #if HAVE_MACOSX_DESKTOP libbalsa_macosx_menu_for_parent(customize_widget, GTK_WINDOW(active_window)); #endif g_object_add_weak_pointer(G_OBJECT(customize_widget), (gpointer) & customize_widget); g_signal_connect(G_OBJECT(customize_widget), "response", G_CALLBACK(tp_dialog_response_cb), NULL); notebook = gtk_notebook_new(); content_area = gtk_dialog_get_content_area(GTK_DIALOG(customize_widget)); gtk_box_pack_start(GTK_BOX(content_area), notebook, TRUE, TRUE, 0); gtk_window_set_role(GTK_WINDOW(customize_widget), "customize"); gtk_window_set_default_size(GTK_WINDOW(customize_widget), 600, 440); /* The order of pages must be consistent with the BalsaToolbarType * enum. */ model = balsa_window_get_toolbar_model(); group = g_simple_action_group_new(); balsa_window_add_action_entries(G_ACTION_MAP(group)); #ifdef BALSA_TOOLBAR_DEBUG_ACTIONS g_print("main window\n"); #endif /* BALSA_TOOLBAR_DEBUG_ACTIONS */ child = create_toolbar_page(model, G_ACTION_MAP(group)); g_object_unref(group); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, gtk_label_new(_("Main window"))); model = sendmsg_window_get_toolbar_model(); group = g_simple_action_group_new(); sendmsg_window_add_action_entries(G_ACTION_MAP(group)); #ifdef BALSA_TOOLBAR_DEBUG_ACTIONS g_print("compose window\n"); #endif /* BALSA_TOOLBAR_DEBUG_ACTIONS */ child = create_toolbar_page(model, G_ACTION_MAP(group)); g_object_unref(group); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, gtk_label_new(_("Compose window"))); model = message_window_get_toolbar_model(); group = g_simple_action_group_new(); message_window_add_action_entries(G_ACTION_MAP(group)); #ifdef BALSA_TOOLBAR_DEBUG_ACTIONS g_print("message window\n"); #endif /* BALSA_TOOLBAR_DEBUG_ACTIONS */ child = create_toolbar_page(model, G_ACTION_MAP(group)); g_object_unref(group); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, gtk_label_new(_("Message window"))); option_frame = gtk_frame_new(_("Toolbar options")); gtk_container_set_border_width(GTK_CONTAINER(option_frame), 6); gtk_box_pack_start(GTK_BOX(content_area), option_frame, FALSE, FALSE, 0); option_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); gtk_container_set_border_width(GTK_CONTAINER(option_box), 6); gtk_container_add(GTK_CONTAINER(option_frame), option_box); wrap_button = gtk_check_button_new_with_mnemonic(_("_Wrap button labels")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wrap_button), balsa_app.toolbar_wrap_button_text); g_signal_connect(G_OBJECT(wrap_button), "toggled", G_CALLBACK(wrap_toggled_cb), notebook); gtk_box_pack_start(GTK_BOX(option_box), wrap_button, FALSE, FALSE, 0); gtk_widget_show_all(customize_widget); /* Now that the pages are shown, we can switch to the page * corresponding to the toolbar that the user clicked on. */ type = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(widget), BALSA_TOOLBAR_MODEL_TYPE)); gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), type); }
/* * Pops up a dialog containing a list of warnings. * * This is because their can be many warnings (eg while you are away) and popping up * hundreds of windows is ugly. */ static void balsa_information_list(GtkWindow *parent, LibBalsaInformationType type, const char *msg) { static GtkWidget *information_list = NULL; GtkTextBuffer *buffer; GtkTextIter iter; if (information_list == NULL) { GtkWidget *information_dialog; GtkWidget *scrolled_window; information_dialog = gtk_dialog_new_with_buttons(_("Information — Balsa"), parent, GTK_DIALOG_DESTROY_WITH_PARENT | libbalsa_dialog_flags(), _("_Clear"), GTK_RESPONSE_APPLY, _("Cl_ose"), GTK_RESPONSE_CANCEL, NULL); #if HAVE_MACOSX_DESKTOP libbalsa_macosx_menu_for_parent(information_dialog, parent); #endif /* Default is to close */ gtk_dialog_set_default_response(GTK_DIALOG(information_dialog), GTK_RESPONSE_CANCEL); /* Reset the policy gtk_dialog_new makes itself non-resizable */ gtk_window_set_resizable(GTK_WINDOW(information_dialog), TRUE); gtk_window_set_default_size(GTK_WINDOW(information_dialog), 350, 200); gtk_window_set_role(GTK_WINDOW(information_dialog), "Information"); g_object_add_weak_pointer(G_OBJECT(information_dialog), (gpointer *) &information_list); /* A scrolled window for the list. */ scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG(information_dialog))), scrolled_window, TRUE, TRUE, 1); gtk_container_set_border_width(GTK_CONTAINER(scrolled_window), 6); gtk_widget_show(scrolled_window); /* The list itself */ information_list = balsa_information_list_new(); gtk_container_add(GTK_CONTAINER(scrolled_window), information_list); g_signal_connect(G_OBJECT(information_dialog), "response", G_CALLBACK(balsa_information_list_response_cb), information_list); gtk_widget_show_all(information_dialog); } buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(information_list)); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_place_cursor(buffer, &iter); if (gtk_text_buffer_get_char_count(buffer)) gtk_text_buffer_insert_at_cursor(buffer, "\n", 1); gtk_text_buffer_insert_at_cursor(buffer, msg, -1); gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(information_list), gtk_text_buffer_get_insert(buffer), 0, FALSE, 0, 0); if (balsa_app.main_window) { gchar *line; GtkStatusbar *statusbar; guint context_id; statusbar = GTK_STATUSBAR(balsa_app.main_window->statusbar); context_id = gtk_statusbar_get_context_id(statusbar, "Information list"); gtk_statusbar_pop(statusbar, context_id); line = g_strdup(msg); g_strdelimit(line, "\r\n", ' '); gtk_statusbar_push(statusbar, context_id, line); g_free(line); } }