medit/moo/mooedit/mooeditdialogs.cpp

838 lines
26 KiB
C++
Raw Normal View History

2006-05-21 16:11:05 -07:00
/*
* mooeditdialogs.c
2005-06-22 11:20:32 -07:00
*
2010-12-21 20:15:45 -08:00
* Copyright (C) 2004-2010 by Yevgen Muntyan <emuntyan@users.sourceforge.net>
2005-06-22 11:20:32 -07:00
*
* This file is part of medit. medit is free software; you can
* redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the
* Free Software Foundation; either version 2.1 of the License,
* or (at your option) any later version.
2005-06-22 11:20:32 -07:00
*
* You should have received a copy of the GNU Lesser General Public
* License along with medit. If not, see <http://www.gnu.org/licenses/>.
2005-06-22 11:20:32 -07:00
*/
#include "mooedit/mooeditdialogs.h"
#include "mooedit/mooeditprefs.h"
2008-09-06 22:15:07 -07:00
#include "mooedit/mooedit-fileops.h"
2010-12-12 02:29:20 -08:00
#include "mooedit/mooeditfileinfo.h"
2005-06-22 11:20:32 -07:00
#include "mooutils/moodialogs.h"
#include "mooutils/moostock.h"
2006-08-03 00:29:39 -07:00
#include "mooutils/mooi18n.h"
2006-12-17 01:23:19 -08:00
#include "mooutils/mooencodings.h"
2010-11-23 21:54:39 -08:00
#include "mooutils/mooutils.h"
#include "mooedit/mootextfind-prompt-gxml.h"
#include "mooedit/mooeditsavemult-gxml.h"
#include "mooedit/mootryencoding-gxml.h"
#include <gtk/gtk.h>
#include <mooglib/moo-glib.h>
2006-12-17 01:23:19 -08:00
#include <string.h>
2016-10-02 21:33:04 -07:00
#ifdef __WIN32__
#include <mooutils/moofiledialog-win32.h>
#include <gdk/gdkwin32.h>
#endif // __WIN32__
2005-06-22 11:20:32 -07:00
2016-01-28 03:20:29 -08:00
2016-10-02 21:33:04 -07:00
#ifndef __WIN32__
2011-01-10 02:31:07 -08:00
MooOpenInfoArray *
_moo_edit_open_dialog (GtkWidget *widget,
MooEdit *current_doc)
{
2006-04-13 03:02:33 -07:00
MooFileDialog *dialog;
const char *encoding;
2016-10-02 21:14:12 -07:00
GFile *start = NULL;
2010-11-23 21:54:39 -08:00
MooFileArray *files = NULL;
2011-01-10 02:31:07 -08:00
MooOpenInfoArray *info_array = NULL;
2010-11-23 21:54:39 -08:00
guint i;
2005-06-22 11:20:32 -07:00
2017-10-23 16:13:26 -07:00
moo_prefs_create_key (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR), MOO_PREFS_STATE, G_TYPE_STRING, nullptr);
if (current_doc && moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC)))
{
2016-10-02 21:14:12 -07:00
GFile *file = moo_edit_get_file (current_doc);
2010-11-23 21:54:39 -08:00
if (file)
2016-10-02 21:14:12 -07:00
start = g_file_get_parent (file);
g_object_unref (file);
}
2010-11-23 21:54:39 -08:00
if (!start)
2016-10-02 21:14:12 -07:00
start = moo_prefs_get_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR));
2006-04-13 03:02:33 -07:00
2006-06-08 08:50:18 -07:00
dialog = moo_file_dialog_new (MOO_FILE_DIALOG_OPEN, widget,
2016-10-02 21:14:12 -07:00
TRUE, GTK_STOCK_OPEN, start,
2017-10-23 16:13:26 -07:00
nullptr);
g_object_set (dialog, "enable-encodings", TRUE, nullptr);
2007-09-07 21:59:37 -07:00
moo_file_dialog_set_help_id (dialog, "dialog-open");
moo_file_dialog_set_remember_size (dialog, moo_edit_setting (MOO_EDIT_PREFS_DIALOG_OPEN));
2005-06-22 11:20:32 -07:00
moo_file_dialog_set_filter_mgr_id (dialog, "MooEdit");
2005-06-22 11:20:32 -07:00
2010-11-23 21:54:39 -08:00
if (moo_file_dialog_run (dialog))
{
encoding = moo_file_dialog_get_encoding (dialog);
2006-12-17 01:23:19 -08:00
2010-11-23 21:54:39 -08:00
if (encoding && !strcmp (encoding, MOO_ENCODING_AUTO))
encoding = NULL;
2006-12-17 01:23:19 -08:00
2010-11-23 21:54:39 -08:00
files = moo_file_dialog_get_files (dialog);
g_return_val_if_fail (files != NULL && files->n_elms != 0, NULL);
2011-01-10 02:31:07 -08:00
info_array = moo_open_info_array_new ();
2010-11-23 21:54:39 -08:00
for (i = 0; i < files->n_elms; ++i)
2016-10-03 00:15:41 -07:00
moo_open_info_array_take (info_array, moo_open_info_new_file (files->elms[i], encoding, -1, MooOpenFlags (0)));
2016-10-02 21:14:12 -07:00
g_object_unref (start);
start = g_file_get_parent (files->elms[0]);
moo_prefs_set_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR), start);
2010-11-23 21:54:39 -08:00
}
2016-10-02 21:14:12 -07:00
g_object_unref (start);
2006-04-13 03:02:33 -07:00
g_object_unref (dialog);
2010-11-23 21:54:39 -08:00
moo_file_array_free (files);
2010-12-12 02:29:20 -08:00
return info_array;
2005-06-22 11:20:32 -07:00
}
2011-01-10 02:31:07 -08:00
MooSaveInfo *
2010-11-23 21:54:39 -08:00
_moo_edit_save_as_dialog (MooEdit *doc,
const char *display_basename)
2005-06-22 11:20:32 -07:00
{
2006-12-17 01:23:19 -08:00
const char *encoding;
2006-04-13 03:02:33 -07:00
MooFileDialog *dialog;
2011-01-10 02:31:07 -08:00
MooSaveInfo *info;
2016-10-02 21:14:12 -07:00
GFile *start = NULL;
GFile *file = NULL;
2010-11-23 21:54:39 -08:00
2017-10-23 16:13:26 -07:00
g_return_val_if_fail (MOO_IS_EDIT (doc), nullptr);
2005-06-22 11:20:32 -07:00
moo_prefs_create_key (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR),
MOO_PREFS_STATE, G_TYPE_STRING, NULL);
if (moo_prefs_get_bool (moo_edit_setting (MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC)))
{
2016-10-02 21:14:12 -07:00
file = moo_edit_get_file (doc);
2010-11-23 21:54:39 -08:00
if (file)
2016-10-02 21:14:12 -07:00
start = g_file_get_parent (file);
g_object_unref (file);
2010-11-23 21:54:39 -08:00
file = NULL;
}
if (!start)
2016-10-02 21:14:12 -07:00
start = moo_prefs_get_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR));
2005-06-22 11:20:32 -07:00
2010-12-18 23:58:18 -08:00
dialog = moo_file_dialog_new (MOO_FILE_DIALOG_SAVE,
GTK_WIDGET (moo_edit_get_view (doc)),
2010-11-23 21:54:39 -08:00
FALSE, GTK_STOCK_SAVE_AS,
2016-10-02 21:14:12 -07:00
start, display_basename);
2017-10-23 16:13:26 -07:00
g_object_set (dialog, "enable-encodings", TRUE, nullptr);
2010-11-23 21:54:39 -08:00
moo_file_dialog_set_encoding (dialog, moo_edit_get_encoding (doc));
2007-09-07 21:59:37 -07:00
moo_file_dialog_set_help_id (dialog, "dialog-save");
moo_file_dialog_set_filter_mgr_id (dialog, "MooEdit");
if (!moo_file_dialog_run (dialog))
{
2006-04-13 03:02:33 -07:00
g_object_unref (dialog);
2016-10-02 21:14:12 -07:00
g_object_unref (start);
return NULL;
}
2006-12-17 01:23:19 -08:00
encoding = moo_file_dialog_get_encoding (dialog);
2010-11-23 21:54:39 -08:00
file = moo_file_dialog_get_file (dialog);
2016-10-02 21:14:12 -07:00
g_return_val_if_fail (file != NULL, NULL);
info = moo_save_info_new_file (file, encoding);
2016-10-02 21:14:12 -07:00
g_object_unref (start);
start = g_file_get_parent (file);
moo_prefs_set_file (moo_edit_setting (MOO_EDIT_PREFS_LAST_DIR), start);
2016-10-02 21:14:12 -07:00
g_object_unref (start);
g_object_unref (file);
2006-04-13 03:02:33 -07:00
g_object_unref (dialog);
2010-12-12 02:29:20 -08:00
return info;
}
2016-10-02 21:33:04 -07:00
#else // __WIN32__
2016-10-02 22:55:32 -07:00
static std::string
get_folder_from_document(MooEdit* doc)
{
GFile* file = moo_edit_get_file (doc);
if (!file)
return std::string();
GFile* parent = g_file_get_parent(file);
char *parent_path = g_file_get_path(parent);
std::string start_folder (parent_path);
g_free(parent_path);
g_object_unref(parent);
g_object_unref(file);
return start_folder;
}
2016-10-02 21:33:04 -07:00
MooOpenInfoArray *
_moo_edit_open_dialog(GtkWidget* parent,
MooEdit* current_doc)
{
2016-10-02 22:55:32 -07:00
std::string start_folder;
2016-10-02 21:33:04 -07:00
if (current_doc && moo_prefs_get_bool(moo_edit_setting(MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC)))
2016-10-02 22:55:32 -07:00
start_folder = get_folder_from_document(current_doc);
2016-10-02 21:33:04 -07:00
GtkWidget* toplevel = parent ? gtk_widget_get_toplevel(parent) : nullptr;
HWND hwnd = toplevel ? reinterpret_cast<HWND> (GDK_WINDOW_HWND(toplevel->window)) : nullptr;
2016-10-02 22:55:32 -07:00
std::vector<std::string> files = moo_show_win32_file_open_dialog (hwnd, start_folder);
2016-10-02 21:33:04 -07:00
if (files.empty())
return nullptr;
MooOpenInfoArray *result = moo_open_info_array_new();
2016-10-02 22:55:32 -07:00
for (const auto& path : files)
moo_open_info_array_take(result, moo_open_info_new(path.c_str(), MOO_ENCODING_AUTO, -1, MOO_OPEN_FLAGS_NONE));
2016-10-02 21:33:04 -07:00
return result;
}
MooSaveInfo*
_moo_edit_save_as_dialog(MooEdit* doc,
const char* display_basename)
{
MooEditView* view = moo_edit_get_view (doc);
GtkWidget* toplevel = view ? gtk_widget_get_toplevel(GTK_WIDGET(view)) : nullptr;
HWND hwnd = toplevel ? reinterpret_cast<HWND> (GDK_WINDOW_HWND(toplevel->window)) : nullptr;
2016-10-02 22:55:32 -07:00
std::string start_folder;
2016-10-02 21:33:04 -07:00
if (moo_prefs_get_bool(moo_edit_setting(MOO_EDIT_PREFS_DIALOGS_OPEN_FOLLOWS_DOC)))
2016-10-02 22:55:32 -07:00
start_folder = get_folder_from_document (doc);
2016-10-02 21:33:04 -07:00
2016-10-02 22:55:32 -07:00
std::string save_as = moo_show_win32_file_save_as_dialog(hwnd, start_folder, display_basename);
2016-10-02 21:33:04 -07:00
if (save_as.empty())
return nullptr;
2016-10-02 22:55:32 -07:00
return moo_save_info_new (save_as.c_str(), nullptr);
2016-10-02 21:33:04 -07:00
}
#endif // __WIN32__
2011-01-01 17:41:01 -08:00
MooSaveChangesResponse
2010-11-23 21:54:39 -08:00
_moo_edit_save_changes_dialog (MooEdit *doc)
{
2010-11-23 21:54:39 -08:00
g_return_val_if_fail (MOO_IS_EDIT (doc), MOO_SAVE_CHANGES_RESPONSE_CANCEL);
return moo_save_changes_dialog (moo_edit_get_display_basename (doc),
2010-12-18 23:58:18 -08:00
GTK_WIDGET (moo_edit_get_view (doc)));
2005-06-22 11:20:32 -07:00
}
/****************************************************************************/
/* Save multiple
*/
enum {
COLUMN_SAVE = 0,
COLUMN_EDIT,
NUM_COLUMNS
};
2016-10-02 21:14:12 -07:00
static void
name_data_func (G_GNUC_UNUSED GtkTreeViewColumn *column,
GtkCellRenderer *cell,
GtkTreeModel *model,
GtkTreeIter *iter)
{
MooEdit *doc = NULL;
gtk_tree_model_get (model, iter, COLUMN_EDIT, &doc, -1);
g_return_if_fail (MOO_IS_EDIT (doc));
2017-10-23 16:13:26 -07:00
g_object_set (cell, "text", moo_edit_get_display_basename (doc), nullptr);
2016-10-02 21:14:12 -07:00
g_object_unref (doc);
}
static void
2016-10-02 21:14:12 -07:00
save_toggled (GtkCellRendererToggle *cell,
gchar *path,
2016-10-02 21:14:12 -07:00
GtkTreeModel *model)
{
GtkTreePath *tree_path;
2016-10-02 21:14:12 -07:00
GtkTreeIter iter;
gboolean save = TRUE;
gboolean active;
gboolean sensitive;
GtkDialog *dialog;
2016-10-02 21:14:12 -07:00
g_return_if_fail (GTK_IS_LIST_STORE (model));
tree_path = gtk_tree_path_new_from_string (path);
g_return_if_fail (tree_path != NULL);
2016-10-02 21:14:12 -07:00
gtk_tree_model_get_iter (model, &iter, tree_path);
gtk_tree_model_get (model, &iter, COLUMN_SAVE, &save, -1);
2016-10-02 21:14:12 -07:00
active = gtk_cell_renderer_toggle_get_active (cell);
if (active == save)
2016-10-02 21:14:12 -07:00
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_SAVE, !save, -1);
gtk_tree_path_free (tree_path);
2016-10-02 22:55:32 -07:00
dialog = GTK_DIALOG (g_object_get_data (G_OBJECT (model), "moo-dialog"));
g_return_if_fail (dialog != NULL);
if (!save)
{
sensitive = TRUE;
}
else
{
sensitive = FALSE;
2016-10-02 21:14:12 -07:00
gtk_tree_model_get_iter_first (model, &iter);
do
{
2016-10-02 21:14:12 -07:00
gtk_tree_model_get (model, &iter, COLUMN_SAVE, &save, -1);
if (save)
{
sensitive = TRUE;
break;
}
}
2016-10-02 21:14:12 -07:00
while (gtk_tree_model_iter_next (model, &iter));
}
gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_YES, sensitive);
}
static void
2016-10-02 21:14:12 -07:00
files_treeview_init (GtkTreeView *treeview, GtkWidget *dialog, MooEditArray *docs)
{
2016-10-02 21:14:12 -07:00
GtkListStore *store;
GtkTreeViewColumn *column;
GtkCellRenderer *cell;
guint i;
2016-10-02 21:14:12 -07:00
store = gtk_list_store_new (NUM_COLUMNS, G_TYPE_BOOLEAN, MOO_TYPE_EDIT);
for (i = 0; i < docs->n_elms; ++i)
{
GtkTreeIter iter;
2016-10-02 21:14:12 -07:00
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
COLUMN_SAVE, TRUE,
COLUMN_EDIT, docs->elms[i],
-1);
}
2016-10-02 21:14:12 -07:00
gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
2016-10-02 21:14:12 -07:00
column = gtk_tree_view_column_new ();
gtk_tree_view_append_column (treeview, column);
cell = gtk_cell_renderer_toggle_new ();
gtk_tree_view_column_pack_start (column, cell, FALSE);
2017-10-23 16:13:26 -07:00
g_object_set (cell, "activatable", TRUE, nullptr);
2016-10-02 21:14:12 -07:00
gtk_tree_view_column_add_attribute (column, cell, "active", COLUMN_SAVE);
g_signal_connect (cell, "toggled", G_CALLBACK (save_toggled), store);
column = gtk_tree_view_column_new ();
gtk_tree_view_append_column (treeview, column);
cell = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (column, cell, TRUE);
gtk_tree_view_column_set_cell_data_func (column, cell,
(GtkTreeCellDataFunc) name_data_func,
NULL, NULL);
g_object_set_data (G_OBJECT (store), "moo-dialog", dialog);
g_object_unref (store);
}
2010-11-23 21:54:39 -08:00
static void
files_treeview_get_to_save (GtkTreeView *treeview,
MooEditArray *to_save)
{
GtkTreeIter iter;
GtkTreeModel *model;
2008-08-24 02:06:24 -07:00
model = gtk_tree_view_get_model (treeview);
2010-11-23 21:54:39 -08:00
g_return_if_fail (model != NULL);
gtk_tree_model_get_iter_first (model, &iter);
do
{
2010-11-23 21:54:39 -08:00
MooEdit *doc = NULL;
gboolean save = TRUE;
gtk_tree_model_get (model, &iter,
COLUMN_SAVE, &save,
2010-11-23 21:54:39 -08:00
COLUMN_EDIT, &doc, -1);
g_return_if_fail (MOO_IS_EDIT (doc));
if (save)
2010-11-23 21:54:39 -08:00
moo_edit_array_append (to_save, doc);
2010-11-23 21:54:39 -08:00
g_object_unref (doc);
}
while (gtk_tree_model_iter_next (model, &iter));
}
2010-07-13 04:51:34 -07:00
static GtkWidget *
find_widget_for_response (GtkDialog *dialog,
int response)
{
GList *l, *children;
GtkWidget *ret = NULL;
children = gtk_container_get_children (GTK_CONTAINER (dialog->action_area));
for (l = children; ret == NULL && l != NULL; l = l->next)
{
2016-10-02 22:55:32 -07:00
GtkWidget *widget = GTK_WIDGET (l->data);
2010-07-13 04:51:34 -07:00
int response_here = gtk_dialog_get_response_for_widget (dialog, widget);
if (response_here == response)
ret = widget;
}
g_list_free (children);
return ret;
}
2011-01-01 17:41:01 -08:00
MooSaveChangesResponse
2010-11-23 21:54:39 -08:00
_moo_edit_save_multiple_changes_dialog (MooEditArray *docs,
MooEditArray *to_save)
{
2016-10-02 21:14:12 -07:00
GtkWidget *dialog;
char *msg, *question;
int response;
MooSaveChangesResponse retval;
SaveMultDialogXml *xml;
2010-11-23 21:54:39 -08:00
g_return_val_if_fail (docs != NULL && docs->n_elms > 1, MOO_SAVE_CHANGES_RESPONSE_CANCEL);
g_return_val_if_fail (to_save != NULL, MOO_SAVE_CHANGES_RESPONSE_CANCEL);
2016-10-02 21:14:12 -07:00
xml = save_mult_dialog_xml_new ();
dialog = GTK_WIDGET (xml->SaveMultDialog);
2011-01-09 02:59:13 -08:00
moo_window_set_parent (dialog, GTK_WIDGET (moo_edit_get_view (docs->elms[0])));
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
MOO_STOCK_SAVE_NONE, GTK_RESPONSE_NO,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
MOO_STOCK_SAVE_SELECTED, GTK_RESPONSE_YES,
2017-10-23 16:13:26 -07:00
nullptr);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
GTK_RESPONSE_YES,
GTK_RESPONSE_NO,
GTK_RESPONSE_CANCEL, -1);
2016-10-02 21:14:12 -07:00
question = g_strdup_printf (dngettext (GETTEXT_PACKAGE,
/* Translators: number of documents here is always greater than one, so
ignore singular form (which is simply copy of the plural here) */
"There are %u documents with unsaved changes. "
"Save changes before closing?",
"There are %u documents with unsaved changes. "
"Save changes before closing?",
docs->n_elms),
(guint) docs->n_elms);
msg = g_markup_printf_escaped ("<span weight=\"bold\" size=\"larger\">%s</span>",
question);
2008-08-24 02:06:24 -07:00
gtk_label_set_markup (xml->label, msg);
2016-10-02 21:14:12 -07:00
files_treeview_init (xml->treeview, dialog, docs);
2010-07-13 04:51:34 -07:00
{
GtkWidget *button;
button = find_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
gtk_widget_grab_focus (button);
}
2016-10-02 21:14:12 -07:00
response = gtk_dialog_run (GTK_DIALOG (dialog));
switch (response)
{
case GTK_RESPONSE_NO:
retval = MOO_SAVE_CHANGES_RESPONSE_DONT_SAVE;
break;
case GTK_RESPONSE_YES:
2010-11-23 21:54:39 -08:00
files_treeview_get_to_save (xml->treeview, to_save);
retval = MOO_SAVE_CHANGES_RESPONSE_SAVE;
break;
default:
retval = MOO_SAVE_CHANGES_RESPONSE_CANCEL;
}
2016-10-02 21:14:12 -07:00
g_free (question);
g_free (msg);
gtk_widget_destroy (dialog);
return retval;
}
/*****************************************************************************/
/* Error dialogs
*/
2016-10-02 21:14:12 -07:00
void
_moo_edit_save_error_dialog (MooEdit *doc,
GFile *file,
GError *error)
{
2016-10-02 21:14:12 -07:00
char *filename, *msg = NULL;
g_return_if_fail (G_IS_FILE (file));
filename = moo_file_get_display_name (file);
msg = g_strdup_printf (_("Could not save file\n%s"), filename);
moo_error_dialog (msg, moo_error_message (error),
GTK_WIDGET (moo_edit_get_view (doc)));
2016-10-02 21:14:12 -07:00
g_free (msg);
g_free (filename);
}
static gboolean
moo_edit_question_dialog (MooEdit *doc,
const char *text,
const char *secondary,
const char *button,
int default_response)
{
int res;
MooEditView *view;
GtkWindow *parent;
GtkWidget *dialog;
view = doc ? moo_edit_get_view (doc) : NULL;
parent = view ? GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))) : NULL;
dialog = gtk_message_dialog_new (parent, GTK_DIALOG_MODAL,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_NONE,
"%s", text);
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
"%s", secondary);
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
button, GTK_RESPONSE_YES,
2017-10-23 16:13:26 -07:00
nullptr);
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
GTK_RESPONSE_YES,
GTK_RESPONSE_CANCEL,
-1);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), default_response);
res = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
return res == GTK_RESPONSE_YES;
}
2016-10-02 21:14:12 -07:00
gboolean
_moo_edit_save_error_enc_dialog (MooEdit *doc,
GFile *file,
const char *encoding)
{
2016-10-02 21:14:12 -07:00
char *filename;
char *secondary;
gboolean result;
g_return_val_if_fail (G_IS_FILE (file), FALSE);
g_return_val_if_fail (encoding != NULL, FALSE);
2016-10-02 21:14:12 -07:00
filename = moo_file_get_display_name (file);
2016-10-02 21:14:12 -07:00
secondary = g_strdup_printf (_("Could not save file %s in encoding %s. "
"Do you want to save it in UTF-8 encoding instead?"),
filename, encoding);
2016-10-02 21:14:12 -07:00
result = moo_edit_question_dialog (doc, _("Save file in UTF-8 encoding?"),
secondary, GTK_STOCK_OK, GTK_RESPONSE_YES);
g_free (secondary);
g_free (filename);
return result;
}
MooEditTryEncodingResponse
2016-10-02 21:14:12 -07:00
_moo_edit_try_encoding_dialog (G_GNUC_UNUSED GFile *file,
const char *encoding,
char **new_encoding)
{
MooEditWindow *window;
GtkWidget *dialog;
TryEncodingDialogXml *xml;
int dialog_response;
2016-10-02 21:14:12 -07:00
char *filename = NULL;
char *msg = NULL;
char *secondary = NULL;
2016-10-02 21:14:12 -07:00
filename = moo_file_get_display_name (file);
2016-10-02 21:14:12 -07:00
if (filename)
{
/* Could not open file foo.txt */
2016-10-02 21:14:12 -07:00
char *tmp = g_strdup_printf (_("Could not open file\n%s"), filename);
msg = g_markup_printf_escaped ("<b><big>%s</big></b>", tmp);
g_free (tmp);
}
else
{
const char *tmp = _("Could not open file");
2016-10-02 21:14:12 -07:00
msg = g_markup_printf_escaped ("<b><big>%s</big></b>", tmp);
}
2016-10-02 21:14:12 -07:00
if (encoding)
secondary = g_strdup_printf (_("Could not open file using character encoding %s. "
"Try to select another encoding below."), encoding);
else
2016-10-02 21:14:12 -07:00
secondary = g_strdup_printf (_("Could not detect file character encoding. "
"Try to select an encoding below."));
xml = try_encoding_dialog_xml_new ();
g_return_val_if_fail (xml && xml->TryEncodingDialog, MOO_EDIT_TRY_ENCODING_RESPONSE_CANCEL);
gtk_label_set_markup (xml->label_primary, msg);
gtk_label_set_text (xml->label_secondary, secondary);
dialog = GTK_WIDGET (xml->TryEncodingDialog);
_moo_encodings_combo_init (GTK_COMBO_BOX (xml->encoding_combo), MOO_ENCODING_COMBO_OPEN, FALSE);
_moo_encodings_combo_set_enc (GTK_COMBO_BOX (xml->encoding_combo), encoding, MOO_ENCODING_COMBO_OPEN);
if ((window = moo_editor_get_active_window (moo_editor_instance ())))
moo_window_set_parent (dialog, GTK_WIDGET (window));
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_OK,
2017-10-23 16:13:26 -07:00
nullptr);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
dialog_response = gtk_dialog_run (GTK_DIALOG (dialog));
2016-10-02 21:14:12 -07:00
*new_encoding = g_strdup (_moo_encodings_combo_get_enc (GTK_COMBO_BOX (xml->encoding_combo), MOO_ENCODING_COMBO_OPEN));
gtk_widget_destroy (dialog);
2016-10-02 21:14:12 -07:00
g_free (secondary);
g_free (msg);
return dialog_response == GTK_RESPONSE_OK ?
MOO_EDIT_TRY_ENCODING_RESPONSE_TRY_ANOTHER :
MOO_EDIT_TRY_ENCODING_RESPONSE_CANCEL;
}
void
2016-10-02 21:14:12 -07:00
_moo_edit_open_error_dialog (GtkWidget *widget,
GFile *file,
GError *error)
{
2016-10-02 21:14:12 -07:00
char *filename, *msg = NULL;
char *secondary;
2016-10-02 21:14:12 -07:00
filename = moo_file_get_display_name (file);
2016-10-02 21:14:12 -07:00
if (filename)
2006-12-12 21:53:40 -08:00
/* Could not open file foo.txt */
2016-10-02 21:14:12 -07:00
msg = g_strdup_printf (_("Could not open file\n%s"), filename);
else
2016-10-02 21:14:12 -07:00
msg = g_strdup (_("Could not open file"));
2016-10-02 21:14:12 -07:00
secondary = error ? g_strdup (error->message) : NULL;
2011-01-01 17:41:01 -08:00
moo_error_dialog (msg, secondary, widget);
2016-10-02 21:14:12 -07:00
g_free (msg);
g_free (secondary);
g_free (filename);
}
void
_moo_edit_reload_error_dialog (MooEdit *doc,
GError *error)
{
2006-12-12 21:53:40 -08:00
const char *filename;
char *msg = NULL;
g_return_if_fail (MOO_IS_EDIT (doc));
filename = moo_edit_get_display_basename (doc);
if (!filename)
{
g_critical ("oops");
2006-12-12 21:53:40 -08:00
filename = "";
}
/* Could not reload file foo.txt */
msg = g_strdup_printf (_("Could not reload file\n%s"), filename);
/* XXX */
2011-01-14 01:31:03 -08:00
moo_error_dialog (msg, moo_error_message (error),
2011-01-01 17:41:01 -08:00
GTK_WIDGET (moo_edit_get_view (doc)));
2006-12-12 21:53:40 -08:00
g_free (msg);
}
/*****************************************************************************/
/* Confirmation and alerts
*/
gboolean
2010-11-23 21:54:39 -08:00
_moo_edit_reload_modified_dialog (MooEdit *doc)
{
2006-12-12 21:53:40 -08:00
const char *name;
char *question;
gboolean result;
2010-11-23 21:54:39 -08:00
name = moo_edit_get_display_basename (doc);
2006-12-12 21:53:40 -08:00
if (!name)
{
g_critical ("oops");
2006-12-12 21:53:40 -08:00
name = "";
}
question = g_strdup_printf (_("Discard changes in file '%s'?"), name);
2010-11-23 21:54:39 -08:00
result = moo_edit_question_dialog (doc, question,
2006-12-12 21:53:40 -08:00
_("If you reload the document, changes will be discarded"),
_("_Reload"),
GTK_RESPONSE_CANCEL);
2006-12-12 21:53:40 -08:00
g_free (question);
return result;
}
gboolean
2010-11-23 21:54:39 -08:00
_moo_edit_overwrite_modified_dialog (MooEdit *doc)
{
2006-12-12 21:53:40 -08:00
const char *name;
char *question, *secondary;
gboolean result;
2010-11-23 21:54:39 -08:00
name = moo_edit_get_display_basename (doc);
2006-12-12 21:53:40 -08:00
if (!name)
{
g_critical ("oops");
2006-12-12 21:53:40 -08:00
name = "";
}
2006-12-12 21:53:40 -08:00
question = g_strdup_printf (_("Overwrite modified file '%s'?"), name);
secondary = g_strdup_printf (_("File '%s' was modified on disk by another process. If you save it, "
"changes on disk will be lost."), name);
result = moo_edit_question_dialog (doc, question, secondary, _("Over_write"), GTK_RESPONSE_CANCEL);
2006-12-12 21:53:40 -08:00
g_free (question);
g_free (secondary);
return result;
}
/***************************************************************************/
/* Search dialogs
*/
gboolean
2006-11-03 23:03:45 -08:00
_moo_text_search_from_start_dialog (GtkWidget *widget,
gboolean backwards)
2005-06-22 11:20:32 -07:00
{
GtkWidget *dialog;
int response;
const char *msg;
if (backwards)
2006-12-12 21:53:40 -08:00
msg = _("Beginning of document reached.\n"
"Continue from the end?");
2005-06-22 11:20:32 -07:00
else
2006-12-12 21:53:40 -08:00
msg = _("End of document reached.\n"
"Continue from the beginning?");
2005-06-22 11:20:32 -07:00
dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
2005-06-22 11:20:32 -07:00
GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
"%s", msg);
2006-06-27 14:20:46 -07:00
moo_window_set_parent (dialog, widget);
2005-06-22 11:20:32 -07:00
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
GTK_STOCK_YES, GTK_RESPONSE_YES,
2017-10-23 16:13:26 -07:00
nullptr);
2005-06-22 11:20:32 -07:00
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
GTK_RESPONSE_YES,
GTK_RESPONSE_CANCEL,
-1);
response = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
return response == GTK_RESPONSE_YES;
}
void
2006-11-03 23:03:45 -08:00
_moo_text_regex_error_dialog (GtkWidget *parent,
GError *error)
2005-06-22 11:20:32 -07:00
{
GtkWidget *dialog;
char *msg_text = NULL;
if (error)
{
if (error->domain != G_REGEX_ERROR)
g_warning ("unknown error domain");
msg_text = g_strdup (error->message);
2005-06-22 11:20:32 -07:00
}
else
{
msg_text = g_strdup_printf (_("Invalid regular expression"));
}
2005-06-22 11:20:32 -07:00
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
2005-06-22 11:20:32 -07:00
GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE,
"%s", msg_text);
2006-06-27 14:20:46 -07:00
moo_window_set_parent (dialog, parent);
2005-06-22 11:20:32 -07:00
gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CLOSE,
2017-10-23 16:13:26 -07:00
GTK_RESPONSE_CANCEL, nullptr);
2005-06-22 11:20:32 -07:00
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
g_free (msg_text);
}
2008-08-24 02:06:24 -07:00
GtkWidget *
2006-11-03 23:03:45 -08:00
_moo_text_prompt_on_replace_dialog (GtkWidget *parent)
2005-06-22 11:20:32 -07:00
{
2008-08-24 02:06:24 -07:00
FindPromptDialogXml *xml;
xml = find_prompt_dialog_xml_new ();
moo_window_set_parent (GTK_WIDGET (xml->FindPromptDialog), parent);
return GTK_WIDGET (xml->FindPromptDialog);
2005-06-22 11:20:32 -07:00
}