diff options
Diffstat (limited to 'saedit/file.c')
-rw-r--r-- | saedit/file.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/saedit/file.c b/saedit/file.c new file mode 100644 index 0000000..5496c86 --- /dev/null +++ b/saedit/file.c @@ -0,0 +1,103 @@ +#include <gtksourceview/gtksource.h> +#include "errors.h" +#include "buffer.h" +#include "main.h" +#include "file.h" + +#include <string.h> + + +gchar *opened_file_name = NULL; + +gboolean +show_unsaved_changes_dialog () { + gint result; + GtkWidget *dialog; + + if (!buffer_get_modified ()) { + return FALSE; + } + + dialog = gtk_message_dialog_new ( + GTK_WINDOW (main_window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_YES_NO, + "There are unsaved changes in the current file. " + "Do you wish to proceed?" + ); + + result = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + return result == GTK_RESPONSE_NO; +} + +void +open_file ( + const gchar *filename +) { + gsize len; + gchar *text; + + if (show_unsaved_changes_dialog ()) + return; + + release_context (); + + if (filename != NULL) { + g_file_get_contents ( + filename, + &text, + &len, + NULL + ); + } else { + text = g_strdup (""); + len = 0; + } + + g_free (opened_file_name); + opened_file_name = g_strdup (filename); + + buffer_set_text (text, len); + buffer_set_modified (FALSE); + + update_window_title (); + + g_free (text); +} + +void +save_file (const gchar *filename) { + GError *error = NULL; + gboolean success; + gchar *text = buffer_get_text (); + + success = g_file_set_contents ( + filename == NULL ? opened_file_name : filename, + text, + strlen (text), + &error + ); + + if (!success) { + post_error ("Saving", error->message); + } else { + if (filename != NULL) { + g_free (opened_file_name); + opened_file_name = g_strdup (filename); + } + + buffer_set_modified (FALSE); + update_window_title (); + } + + g_free (text); +} + +const gchar * +get_opened_file_name () { + return opened_file_name; +} + |