Make dialogs_show_prompt() more flexible to take up to three button/response code pairs to be shown.

Add a close button to the dialog when asking to Re-Save a deleted file (closes #2916954, based on a patch by Dominik Stadler, thanks).

git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@4495 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
Enrico Tröger 2009-12-20 15:37:40 +00:00
parent d91e7b762b
commit 0be8ea8b8c
5 changed files with 69 additions and 26 deletions

View File

@ -1,3 +1,13 @@
2009-12-20 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/dialog.c, src/dialogs.h, src/document.c, src/prefs.c:
Make dialogs_show_prompt() more flexible to take up to three
button/response code pairs to be shown.
Add a close button to the dialog when asking to Re-Save a
deleted file
(closes #2916954, based on a patch by Dominik Stadler, thanks).
2009-12-20 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
* src/editor.c:

View File

@ -1344,30 +1344,38 @@ void dialogs_show_file_properties(GeanyDocument *doc)
/* extra_text can be NULL; otherwise it is displayed below main_text.
* if parent is NULL, main_widgets.window will be used
* yes_btn, no_btn, apply_btn can be NULL.
* returns GTK_RESPONSE_YES, GTK_RESPONSE_NO, GTK_RESPONSE_APPLY */
* btn_1, btn_2, btn_3 can be NULL.
* returns response_1, response_2 or response_3 */
static gint show_prompt(GtkWidget *parent,
const gchar *yes_btn, const gchar *no_btn, const gchar *apply_btn,
const gchar *btn_1, GtkResponseType response_1,
const gchar *btn_2, GtkResponseType response_2,
const gchar *btn_3, GtkResponseType response_3,
const gchar *question_text, const gchar *extra_text)
{
gboolean ret = FALSE;
GtkWidget *dialog;
GtkWidget *btn;
if (!yes_btn)
yes_btn = GTK_STOCK_YES;
if (!no_btn)
no_btn = GTK_STOCK_NO;
if (btn_2 == NULL)
{
btn_2 = GTK_STOCK_NO;
response_2 = GTK_RESPONSE_NO;
}
if (btn_3 == NULL)
{
btn_3 = GTK_STOCK_YES;
response_3 = GTK_RESPONSE_YES;
}
#ifdef G_OS_WIN32
/* our native dialog code doesn't support custom buttons */
if (yes_btn == GTK_STOCK_YES && no_btn == GTK_STOCK_NO && !apply_btn)
if (btn_3 == GTK_STOCK_YES && btn_2 == GTK_STOCK_NO && btn_1 == NULL)
{
gchar *string = (extra_text == NULL) ? g_strdup(question_text) :
g_strconcat(question_text, "\n\n", extra_text, NULL);
ret = win32_message_dialog(parent, GTK_MESSAGE_QUESTION, string);
ret = ret ? GTK_RESPONSE_YES : GTK_RESPONSE_NO;
ret = ret ? response_3 : response_2;
g_free(string);
return ret;
}
@ -1392,21 +1400,21 @@ static gint show_prompt(GtkWidget *parent,
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s", extra_text);
if (apply_btn)
gtk_dialog_add_button(GTK_DIALOG(dialog), apply_btn, GTK_RESPONSE_APPLY);
if (btn_1 != NULL)
gtk_dialog_add_button(GTK_DIALOG(dialog), btn_1, response_1);
/* For a cancel button, use cancel response so user can press escape to cancel */
btn = gtk_dialog_add_button(GTK_DIALOG(dialog), no_btn,
utils_str_equal(no_btn, GTK_STOCK_CANCEL) ? GTK_RESPONSE_CANCEL : GTK_RESPONSE_NO);
btn = gtk_dialog_add_button(GTK_DIALOG(dialog), btn_2,
utils_str_equal(btn_2, GTK_STOCK_CANCEL) ? GTK_RESPONSE_CANCEL : response_2);
/* we don't want a default, but we need to override the apply button as default */
gtk_widget_grab_default(btn);
gtk_dialog_add_button(GTK_DIALOG(dialog), yes_btn, GTK_RESPONSE_YES);
gtk_dialog_add_button(GTK_DIALOG(dialog), btn_3, response_3);
ret = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
if (ret == GTK_RESPONSE_CANCEL)
ret = GTK_RESPONSE_NO;
ret = response_2;
return ret;
}
@ -1430,7 +1438,11 @@ gboolean dialogs_show_question(const gchar *text, ...)
va_start(args, text);
g_vsnprintf(string, 511, text, args);
va_end(args);
return show_prompt(parent, GTK_STOCK_YES, GTK_STOCK_NO, NULL, string, NULL) == GTK_RESPONSE_YES;
return show_prompt(parent,
NULL, GTK_RESPONSE_NONE,
GTK_STOCK_NO, GTK_RESPONSE_NO,
GTK_STOCK_YES, GTK_RESPONSE_YES,
string, NULL) == GTK_RESPONSE_YES;
}
@ -1446,16 +1458,22 @@ gboolean dialogs_show_question_full(GtkWidget *parent, const gchar *yes_btn, con
va_start(args, main_text);
g_vsnprintf(string, 511, main_text, args);
va_end(args);
return show_prompt(parent, yes_btn, no_btn, NULL, string, extra_text) == GTK_RESPONSE_YES;
return show_prompt(parent,
NULL, GTK_RESPONSE_NONE,
no_btn, GTK_RESPONSE_NO,
yes_btn, GTK_RESPONSE_YES,
string, extra_text) == GTK_RESPONSE_YES;
}
/* extra_text can be NULL; otherwise it is displayed below main_text.
* if parent is NULL, main_widgets.window will be used
* yes_btn, no_btn, apply_btn can be NULL.
* returns GTK_RESPONSE_YES, GTK_RESPONSE_NO, GTK_RESPONSE_APPLY */
* btn_1, btn_2, btn_3 can be NULL.
* returns response_1, response_2 or response_3 */
gint dialogs_show_prompt(GtkWidget *parent,
const gchar *yes_btn, const gchar *no_btn, const gchar *apply_btn,
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 *main_text, ...)
{
gchar string[512];
@ -1464,7 +1482,8 @@ gint dialogs_show_prompt(GtkWidget *parent,
va_start(args, main_text);
g_vsnprintf(string, 511, main_text, args);
va_end(args);
return show_prompt(parent, yes_btn, no_btn, apply_btn, string, extra_text);
return show_prompt(parent, btn_1, response_1, btn_2, response_2, btn_3, response_3,
string, extra_text);
}

View File

@ -59,8 +59,10 @@ gboolean dialogs_show_question_full(GtkWidget *parent, const gchar *yes_btn, con
const gchar *extra_text, const gchar *main_text, ...) G_GNUC_PRINTF (5, 6);
gint dialogs_show_prompt(GtkWidget *parent,
const gchar *yes_btn, const gchar *no_btn, const gchar *apply_btn,
const gchar *extra_text, const gchar *main_text, ...) G_GNUC_PRINTF (6, 7);
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 *main_text, ...) G_GNUC_PRINTF (9, 10);
void dialogs_show_msgbox(GtkMessageType type, const gchar *text, ...) G_GNUC_PRINTF (2, 3);

View File

@ -2946,19 +2946,29 @@ static gboolean monitor_reload_file(GeanyDocument *doc)
static gboolean monitor_resave_missing_file(GeanyDocument *doc)
{
gboolean want_reload = FALSE;
gint ret;
/* file is missing - set unsaved state */
document_set_text_changed(doc, TRUE);
/* don't prompt more than once */
setptr(doc->real_path, NULL);
if (dialogs_show_question_full(NULL, GTK_STOCK_SAVE, GTK_STOCK_CANCEL,
ret = dialogs_show_prompt(NULL,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
_("Try to resave the file?"),
_("File \"%s\" was not found on disk!"), doc->file_name))
_("File \"%s\" was not found on disk!"), doc->file_name);
if (ret == GTK_RESPONSE_ACCEPT)
{
dialogs_show_save_as();
want_reload = TRUE;
}
else if (ret == GTK_RESPONSE_CLOSE)
{
document_close(doc);
}
return want_reload;
}

View File

@ -1370,7 +1370,9 @@ static gboolean kb_find_duplicate(GeanyKeyBinding *search_kb,
{
gchar *label = keybindings_get_label(kb);
gint ret = dialogs_show_prompt(main_widgets.window,
_("_Override"), GTK_STOCK_CANCEL, _("_Allow"),
_("_Allow"), GTK_RESPONSE_APPLY,
GTK_STOCK_CANCEL, GTK_RESPONSE_NO,
_("_Override"), GTK_RESPONSE_YES,
_("Override that keybinding?"),
_("The combination '%s' is already used for \"%s\"."),
action, label);