Branch: refs/heads/master Author: Matthew Brush matt@geany.org Committer: Thomas Martitz kugel@rockbox.org Date: Sat, 24 May 2014 12:47:57 UTC Commit: a6bbea53c8a7f9e1d278c00eebbc6aa483fee416 https://github.com/geany/geany/commit/a6bbea53c8a7f9e1d278c00eebbc6aa483fee4...
Log Message: ----------- Add new function document_show_message()
Modified Paths: -------------- src/document.c
Modified: src/document.c 115 lines changed, 114 insertions(+), 1 deletions(-) =================================================================== @@ -38,6 +38,7 @@ #include "filetypesprivate.h" #include "geany.h" /* FIXME: why is this needed for DOC_FILENAME()? should come from documentprivate.h/document.h */ #include "geanyobject.h" +#include "geanywraplabel.h" /* for document_show_message() using GtkInfoBar */ #include "highlighting.h" #include "main.h" #include "msgwindow.h" @@ -74,7 +75,6 @@ /*#define USE_GIO_FILEMON 1*/ #include <gio/gio.h>
- GeanyFilePrefs file_prefs;
@@ -2989,6 +2989,119 @@ gboolean document_close_all(void) }
+ +/* * + * Shows a message related to a document. + * + * Use this whenever the user needs to see a document-related message, + * for example when the file was externally modified or deleted. + * + * Any of the buttons can be @c NULL. If not @c NULL, @a btn_1's + * @a response_1 response will be the default for the @c GtkInfoBar or + * @c GtkDialog. + * + * @param doc @c GeanyDocument. + * @param msgtype The type of message. + * @param response_cb A callback function called when there's a response. + * @param btn_1 The first action area button. + * @param response_1 The response for @a btn_1. + * @param btn_2 The second action area button. + * @param response_2 The response for @a btn_2. + * @param btn_3 The third action area button. + * @param response_3 The response for @a btn_3. + * @param extra_text Text to show below the main message. + * @param format The text format for the main message. + * @param ... Used with @a format as in @c printf. + * + * @since 1.25 + * */ +static GtkWidget* document_show_message(GeanyDocument *doc, GtkMessageType msgtype, + void (*response_cb)(GtkWidget *info_bar, gint response_id, GeanyDocument *doc), + const gchar *btn_1, GtkResponseType response_1, + const gchar *btn_2, GtkResponseType response_2, + const gchar *btn_3, GtkResponseType response_3, + const gchar *extra_text, const gchar *format, ...) +{ + va_list args; + gchar *text, *markup; + GtkWidget *hbox, *vbox, *icon, *label, *extra_label, *content_area; + GtkWidget *info_widget, *ok_button, *cancel_button, *parent; + parent = gtk_notebook_get_nth_page(GTK_NOTEBOOK(main_widgets.notebook), + document_get_notebook_page(doc)); + + va_start(args, format); + text = g_strdup_vprintf(format, args); + va_end(args); + + markup = g_strdup_printf("<span size="larger">%s</span>", text); + g_free(text); + + info_widget = gtk_info_bar_new(); + /* must be done now else Gtk-WARNING: widget not within a GtkWindow */ + gtk_box_pack_start(GTK_BOX(parent), info_widget, FALSE, TRUE, 0); + + gtk_info_bar_set_message_type(GTK_INFO_BAR(info_widget), msgtype); + + if (btn_1) + gtk_info_bar_add_button(GTK_INFO_BAR(info_widget), btn_1, response_1); + if (btn_2) + gtk_info_bar_add_button(GTK_INFO_BAR(info_widget), btn_2, response_2); + if (btn_3) + gtk_info_bar_add_button(GTK_INFO_BAR(info_widget), btn_3, response_3); + + content_area = gtk_info_bar_get_content_area(GTK_INFO_BAR(info_widget)); + + label = geany_wrap_label_new(NULL); + + gtk_label_set_markup(GTK_LABEL(label), markup); + g_free(markup); + + g_signal_connect(info_widget, "response", G_CALLBACK(response_cb), doc); + g_signal_connect_after(info_widget, "response", G_CALLBACK(gtk_widget_destroy), NULL); + + hbox = gtk_hbox_new(FALSE, 12); + gtk_container_add(GTK_CONTAINER(content_area), hbox); + + switch (msgtype) + { + case GTK_MESSAGE_INFO: + icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); + break; + case GTK_MESSAGE_WARNING: + icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); + break; + case GTK_MESSAGE_QUESTION: + icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); + break; + case GTK_MESSAGE_ERROR: + icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); + break; + default: + icon = NULL; + break; + } + + if (icon) + gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, TRUE, 0); + + if (extra_text) + { + vbox = gtk_vbox_new(FALSE, 6); + extra_label = geany_wrap_label_new(extra_text); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(vbox), extra_label, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(hbox), vbox); + } + else + gtk_container_add(GTK_CONTAINER(hbox), label); + + gtk_box_reorder_child(GTK_BOX(parent), info_widget, 0); + + gtk_widget_show_all(info_widget); + + return info_widget; +} + static void monitor_reload_file(GeanyDocument *doc) { gchar *base_name = g_path_get_basename(doc->file_name);
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).