summaryrefslogtreecommitdiff
path: root/gedit/gedit-commands-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'gedit/gedit-commands-file.c')
-rwxr-xr-xgedit/gedit-commands-file.c1885
1 files changed, 0 insertions, 1885 deletions
diff --git a/gedit/gedit-commands-file.c b/gedit/gedit-commands-file.c
deleted file mode 100755
index 985b0417..00000000
--- a/gedit/gedit-commands-file.c
+++ /dev/null
@@ -1,1885 +0,0 @@
-/*
- * gedit-commands-file.c
- * This file is part of gedit
- *
- * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence
- * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi
- * Copyright (C) 2002-2005 Paolo Maggi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the gedit Team, 1998-2005. See the AUTHORS file for a
- * list of people on the gedit Team.
- * See the ChangeLog files for a list of changes.
- *
- * $Id$
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h> /* For strlen and strcmp */
-
-#include <glib/gi18n.h>
-#include <gio/gio.h>
-#include <gtk/gtk.h>
-
-#include "gedit-commands.h"
-#include "gedit-window.h"
-#include "gedit-window-private.h"
-#include "gedit-statusbar.h"
-#include "gedit-debug.h"
-#include "gedit-utils.h"
-#include "gedit-file-chooser-dialog.h"
-#include "dialogs/gedit-close-confirmation-dialog.h"
-
-
-/* Defined constants */
-#define GEDIT_OPEN_DIALOG_KEY "gedit-open-dialog-key"
-#define GEDIT_TAB_TO_SAVE_AS "gedit-tab-to-save-as"
-#define GEDIT_LIST_OF_TABS_TO_SAVE_AS "gedit-list-of-tabs-to-save-as"
-#define GEDIT_IS_CLOSING_ALL "gedit-is-closing-all"
-#define GEDIT_IS_QUITTING "gedit-is-quitting"
-#define GEDIT_IS_CLOSING_TAB "gedit-is-closing-tab"
-#define GEDIT_IS_QUITTING_ALL "gedit-is-quitting-all"
-
-static void tab_state_changed_while_saving (GeditTab *tab,
- GParamSpec *pspec,
- GeditWindow *window);
-
-void
-_gedit_cmd_file_new (GtkAction *action,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- gedit_window_create_tab (window, TRUE);
-}
-
-static GeditTab *
-get_tab_from_file (GList *docs, GFile *file)
-{
- GeditTab *tab = NULL;
-
- while (docs != NULL)
- {
- GeditDocument *d;
- GFile *l;
-
- d = GEDIT_DOCUMENT (docs->data);
-
- l = gedit_document_get_location (d);
- if (l != NULL)
- {
- if (g_file_equal (l, file))
- {
- tab = gedit_tab_get_from_document (d);
- g_object_unref (l);
- break;
- }
-
- g_object_unref (l);
- }
-
- docs = g_list_next (docs);
- }
-
- return tab;
-}
-
-static gboolean
-is_duplicated_file (GSList *files, GFile *file)
-{
- while (files != NULL)
- {
- if (g_file_equal (files->data, file))
- return TRUE;
-
- files = g_slist_next (files);
- }
-
- return FALSE;
-}
-
-/* File loading */
-static gint
-load_file_list (GeditWindow *window,
- GSList *files,
- const GeditEncoding *encoding,
- gint line_pos,
- gboolean create)
-{
- GeditTab *tab;
- gint loaded_files = 0; /* Number of files to load */
- gboolean jump_to = TRUE; /* Whether to jump to the new tab */
- GList *win_docs;
- GSList *files_to_load = NULL;
- GSList *l;
-
- gedit_debug (DEBUG_COMMANDS);
-
- win_docs = gedit_window_get_documents (window);
-
- /* Remove the uris corresponding to documents already open
- * in "window" and remove duplicates from "uris" list */
- for (l = files; l != NULL; l = l->next)
- {
- if (!is_duplicated_file (files_to_load, l->data))
- {
- tab = get_tab_from_file (win_docs, l->data);
- if (tab != NULL)
- {
- if (l == files)
- {
- gedit_window_set_active_tab (window, tab);
- jump_to = FALSE;
-
- if (line_pos > 0)
- {
- GeditDocument *doc;
- GeditView *view;
-
- doc = gedit_tab_get_document (tab);
- view = gedit_tab_get_view (tab);
-
- /* document counts lines starting from 0 */
- gedit_document_goto_line (doc, line_pos - 1);
- gedit_view_scroll_to_cursor (view);
- }
- }
-
- ++loaded_files;
- }
- else
- {
- files_to_load = g_slist_prepend (files_to_load,
- l->data);
- }
- }
- }
-
- g_list_free (win_docs);
-
- if (files_to_load == NULL)
- return loaded_files;
-
- files_to_load = g_slist_reverse (files_to_load);
- l = files_to_load;
-
- tab = gedit_window_get_active_tab (window);
- if (tab != NULL)
- {
- GeditDocument *doc;
-
- doc = gedit_tab_get_document (tab);
-
- if (gedit_document_is_untouched (doc) &&
- (gedit_tab_get_state (tab) == GEDIT_TAB_STATE_NORMAL))
- {
- gchar *uri;
-
- // FIXME: pass the GFile to tab when api is there
- uri = g_file_get_uri (l->data);
- _gedit_tab_load (tab,
- uri,
- encoding,
- line_pos,
- create);
- g_free (uri);
-
- l = g_slist_next (l);
- jump_to = FALSE;
-
- ++loaded_files;
- }
- }
-
- while (l != NULL)
- {
- gchar *uri;
-
- g_return_val_if_fail (l->data != NULL, 0);
-
- // FIXME: pass the GFile to tab when api is there
- uri = g_file_get_uri (l->data);
- tab = gedit_window_create_tab_from_uri (window,
- uri,
- encoding,
- line_pos,
- create,
- jump_to);
- g_free (uri);
-
- if (tab != NULL)
- {
- jump_to = FALSE;
- ++loaded_files;
- }
-
- l = g_slist_next (l);
- }
-
- if (loaded_files == 1)
- {
- GeditDocument *doc;
- gchar *uri_for_display;
-
- g_return_val_if_fail (tab != NULL, loaded_files);
-
- doc = gedit_tab_get_document (tab);
- uri_for_display = gedit_document_get_uri_for_display (doc);
-
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- _("Loading file '%s'\342\200\246"),
- uri_for_display);
-
- g_free (uri_for_display);
- }
- else
- {
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- ngettext("Loading %d file\342\200\246",
- "Loading %d files\342\200\246",
- loaded_files),
- loaded_files);
- }
-
- /* Free uris_to_load. Note that l points to the first element of uris_to_load */
- g_slist_free (files_to_load);
-
- return loaded_files;
-}
-
-
-// FIXME: we should expose API with GFile and just make the uri
-// variants backward compat wrappers
-
-static gint
-load_uri_list (GeditWindow *window,
- const GSList *uris,
- const GeditEncoding *encoding,
- gint line_pos,
- gboolean create)
-{
- GSList *files = NULL;
- const GSList *u;
- gint ret;
-
- for (u = uris; u != NULL; u = u->next)
- {
- gchar *uri = u->data;
-
- if (gedit_utils_is_valid_uri (uri))
- files = g_slist_prepend (files, g_file_new_for_uri (uri));
- else
- g_warning ("invalid uri: %s", uri);
- }
- files = g_slist_reverse (files);
-
- ret = load_file_list (window, files, encoding, line_pos, create);
-
- g_slist_foreach (files, (GFunc) g_object_unref, NULL);
- g_slist_free (files);
-
- return ret;
-}
-
-/**
- * gedit_commands_load_uri:
- *
- * Do nothing if URI does not exist
- */
-void
-gedit_commands_load_uri (GeditWindow *window,
- const gchar *uri,
- const GeditEncoding *encoding,
- gint line_pos)
-{
- GSList *uris = NULL;
-
- g_return_if_fail (GEDIT_IS_WINDOW (window));
- g_return_if_fail (uri != NULL);
- g_return_if_fail (gedit_utils_is_valid_uri (uri));
-
- gedit_debug_message (DEBUG_COMMANDS, "Loading URI '%s'", uri);
-
- uris = g_slist_prepend (uris, (gchar *)uri);
-
- load_uri_list (window, uris, encoding, line_pos, FALSE);
-
- g_slist_free (uris);
-}
-
-/**
- * gedit_commands_load_uris:
- *
- * Ignore non-existing URIs
- */
-gint
-gedit_commands_load_uris (GeditWindow *window,
- const GSList *uris,
- const GeditEncoding *encoding,
- gint line_pos)
-{
- g_return_val_if_fail (GEDIT_IS_WINDOW (window), 0);
- g_return_val_if_fail ((uris != NULL) && (uris->data != NULL), 0);
-
- gedit_debug (DEBUG_COMMANDS);
-
- return load_uri_list (window, uris, encoding, line_pos, FALSE);
-}
-
-/*
- * This should become public once we convert all api to GFile:
- */
-static gint
-gedit_commands_load_files (GeditWindow *window,
- GSList *files,
- const GeditEncoding *encoding,
- gint line_pos)
-{
- g_return_val_if_fail (GEDIT_IS_WINDOW (window), 0);
- g_return_val_if_fail ((files != NULL) && (files->data != NULL), 0);
-
- gedit_debug (DEBUG_COMMANDS);
-
- return load_file_list (window, files, encoding, line_pos, FALSE);
-}
-
-/*
- * From the command line we can specify a line position for the
- * first doc. Beside specifying a not existing uri creates a
- * titled document.
- */
-gint
-_gedit_cmd_load_files_from_prompt (GeditWindow *window,
- GSList *files,
- const GeditEncoding *encoding,
- gint line_pos)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- return load_file_list (window, files, encoding, line_pos, TRUE);
-}
-
-static void
-open_dialog_destroyed (GeditWindow *window,
- GeditFileChooserDialog *dialog)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_OPEN_DIALOG_KEY,
- NULL);
-}
-
-static void
-open_dialog_response_cb (GeditFileChooserDialog *dialog,
- gint response_id,
- GeditWindow *window)
-{
- GSList *files;
- const GeditEncoding *encoding;
-
- gedit_debug (DEBUG_COMMANDS);
-
- if (response_id != GTK_RESPONSE_OK)
- {
- gtk_widget_destroy (GTK_WIDGET (dialog));
-
- return;
- }
-
- files = gtk_file_chooser_get_files (GTK_FILE_CHOOSER (dialog));
- g_return_if_fail (files != NULL);
-
- encoding = gedit_file_chooser_dialog_get_encoding (dialog);
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-
- /* Remember the folder we navigated to */
- _gedit_window_set_default_location (window, files->data);
-
- gedit_commands_load_files (window,
- files,
- encoding,
- 0);
-
- g_slist_foreach (files, (GFunc) g_object_unref, NULL);
- g_slist_free (files);
-}
-
-void
-_gedit_cmd_file_open (GtkAction *action,
- GeditWindow *window)
-{
- GtkWidget *open_dialog;
- gpointer data;
- GeditDocument *doc;
- GFile *default_path = NULL;
-
- gedit_debug (DEBUG_COMMANDS);
-
- data = g_object_get_data (G_OBJECT (window), GEDIT_OPEN_DIALOG_KEY);
-
- if (data != NULL)
- {
- g_return_if_fail (GEDIT_IS_FILE_CHOOSER_DIALOG (data));
-
- gtk_window_present (GTK_WINDOW (data));
-
- return;
- }
-
- /* Translators: "Open Files" is the title of the file chooser window */
- open_dialog = gedit_file_chooser_dialog_new (_("Open Files"),
- GTK_WINDOW (window),
- GTK_FILE_CHOOSER_ACTION_OPEN,
- NULL,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_OK,
- NULL);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_OPEN_DIALOG_KEY,
- open_dialog);
-
- g_object_weak_ref (G_OBJECT (open_dialog),
- (GWeakNotify) open_dialog_destroyed,
- window);
-
- /* Set the curret folder uri */
- doc = gedit_window_get_active_document (window);
- if (doc != NULL)
- {
- GFile *file;
-
- file = gedit_document_get_location (doc);
-
- if (file != NULL)
- {
- default_path = g_file_get_parent (file);
- g_object_unref (file);
- }
- }
-
- if (default_path == NULL)
- default_path = _gedit_window_get_default_location (window);
-
- if (default_path != NULL)
- {
- gchar *uri;
-
- uri = g_file_get_uri (default_path);
- gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (open_dialog),
- uri);
-
- g_free (uri);
- g_object_unref (default_path);
- }
-
- g_signal_connect (open_dialog,
- "response",
- G_CALLBACK (open_dialog_response_cb),
- window);
-
- gtk_widget_show (open_dialog);
-}
-
-/* File saving */
-static void file_save_as (GeditTab *tab, GeditWindow *window);
-
-static gboolean
-is_read_only (GFile *location)
-{
- gboolean ret = TRUE; /* default to read only */
- GFileInfo *info;
-
- gedit_debug (DEBUG_COMMANDS);
-
- info = g_file_query_info (location,
- G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE,
- G_FILE_QUERY_INFO_NONE,
- NULL,
- NULL);
-
- if (info != NULL)
- {
- if (g_file_info_has_attribute (info,
- G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
- {
- ret = !g_file_info_get_attribute_boolean (info,
- G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE);
- }
-
- g_object_unref (info);
- }
-
- return ret;
-}
-
-/* FIXME: modify this dialog to be similar to the one provided by gtk+ for
- * already existing files - Paolo (Oct. 11, 2005) */
-static gboolean
-replace_read_only_file (GtkWindow *parent, GFile *file)
-{
- GtkWidget *dialog;
- gint ret;
- gchar *parse_name;
- gchar *name_for_display;
-
- gedit_debug (DEBUG_COMMANDS);
-
- parse_name = g_file_get_parse_name (file);
-
- /* Truncate the name so it doesn't get insanely wide. Note that even
- * though the dialog uses wrapped text, if the name doesn't contain
- * white space then the text-wrapping code is too stupid to wrap it.
- */
- name_for_display = gedit_utils_str_middle_truncate (parse_name, 50);
- g_free (parse_name);
-
- dialog = gtk_message_dialog_new (parent,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- _("The file \"%s\" is read-only."),
- name_for_display);
- g_free (name_for_display);
-
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- _("Do you want to try to replace it "
- "with the one you are saving?"));
-
- gtk_dialog_add_button (GTK_DIALOG (dialog),
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL);
-
- gedit_dialog_add_button (GTK_DIALOG (dialog),
- _("_Replace"),
- GTK_STOCK_SAVE_AS,
- GTK_RESPONSE_YES);
-
- gtk_dialog_set_default_response (GTK_DIALOG (dialog),
- GTK_RESPONSE_CANCEL);
-
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
-
- ret = gtk_dialog_run (GTK_DIALOG (dialog));
-
- gtk_widget_destroy (dialog);
-
- return (ret == GTK_RESPONSE_YES);
-}
-
-static void
-save_dialog_response_cb (GeditFileChooserDialog *dialog,
- gint response_id,
- GeditWindow *window)
-{
- GFile *file;
- const GeditEncoding *encoding;
- GeditTab *tab;
- gpointer data;
- GSList *tabs_to_save_as;
- GeditDocumentNewlineType newline_type;
-
- gedit_debug (DEBUG_COMMANDS);
-
- tab = GEDIT_TAB (g_object_get_data (G_OBJECT (dialog),
- GEDIT_TAB_TO_SAVE_AS));
-
- if (response_id != GTK_RESPONSE_OK)
- {
- gtk_widget_destroy (GTK_WIDGET (dialog));
-
- goto save_next_tab;
- }
-
- file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
- g_return_if_fail (file != NULL);
-
- encoding = gedit_file_chooser_dialog_get_encoding (dialog);
- newline_type = gedit_file_chooser_dialog_get_newline_type (dialog);
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-
- if (tab != NULL)
- {
- GeditDocument *doc;
- gchar *parse_name;
- gchar *uri;
-
- doc = gedit_tab_get_document (tab);
- g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
-
- parse_name = g_file_get_parse_name (file);
-
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- _("Saving file '%s'\342\200\246"),
- parse_name);
-
- g_free (parse_name);
-
- /* let's remember the dir we navigated too,
- * even if the saving fails... */
- _gedit_window_set_default_location (window, file);
-
- // FIXME: pass the GFile to tab when api is there
- uri = g_file_get_uri (file);
- _gedit_tab_save_as (tab, uri, encoding, newline_type);
- g_free (uri);
- }
-
- g_object_unref (file);
-
-save_next_tab:
-
- data = g_object_get_data (G_OBJECT (window),
- GEDIT_LIST_OF_TABS_TO_SAVE_AS);
- if (data == NULL)
- return;
-
- /* Save As the next tab of the list (we are Saving All files) */
- tabs_to_save_as = (GSList *)data;
- g_return_if_fail (tab == GEDIT_TAB (tabs_to_save_as->data));
-
- /* Remove the first item of the list */
- tabs_to_save_as = g_slist_delete_link (tabs_to_save_as,
- tabs_to_save_as);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_LIST_OF_TABS_TO_SAVE_AS,
- tabs_to_save_as);
-
- if (tabs_to_save_as != NULL)
- {
- tab = GEDIT_TAB (tabs_to_save_as->data);
-
- if (GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (tab),
- GEDIT_IS_CLOSING_TAB)) == TRUE)
- {
- g_object_set_data (G_OBJECT (tab),
- GEDIT_IS_CLOSING_TAB,
- NULL);
-
- /* Trace tab state changes */
- g_signal_connect (tab,
- "notify::state",
- G_CALLBACK (tab_state_changed_while_saving),
- window);
- }
-
- gedit_window_set_active_tab (window, tab);
- file_save_as (tab, window);
- }
-}
-
-static GtkFileChooserConfirmation
-confirm_overwrite_callback (GtkFileChooser *dialog,
- gpointer data)
-{
- gchar *uri;
- GFile *file;
- GtkFileChooserConfirmation res;
-
- gedit_debug (DEBUG_COMMANDS);
-
- uri = gtk_file_chooser_get_uri (dialog);
- file = g_file_new_for_uri (uri);
- g_free (uri);
-
- if (is_read_only (file))
- {
- if (replace_read_only_file (GTK_WINDOW (dialog), file))
- res = GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
- else
- res = GTK_FILE_CHOOSER_CONFIRMATION_SELECT_AGAIN;
- }
- else
- {
- /* fall back to the default confirmation dialog */
- res = GTK_FILE_CHOOSER_CONFIRMATION_CONFIRM;
- }
-
- g_object_unref (file);
-
- return res;
-}
-
-static void
-file_save_as (GeditTab *tab,
- GeditWindow *window)
-{
- GtkWidget *save_dialog;
- GtkWindowGroup *wg;
- GeditDocument *doc;
- GFile *file;
- gboolean uri_set = FALSE;
- const GeditEncoding *encoding;
- GeditDocumentNewlineType newline_type;
-
- g_return_if_fail (GEDIT_IS_TAB (tab));
- g_return_if_fail (GEDIT_IS_WINDOW (window));
-
- gedit_debug (DEBUG_COMMANDS);
-
- save_dialog = gedit_file_chooser_dialog_new (_("Save As\342\200\246"),
- GTK_WINDOW (window),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- NULL,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_OK,
- NULL);
-
- gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (save_dialog),
- TRUE);
- g_signal_connect (save_dialog,
- "confirm-overwrite",
- G_CALLBACK (confirm_overwrite_callback),
- NULL);
-
- wg = gedit_window_get_group (window);
-
- gtk_window_group_add_window (wg,
- GTK_WINDOW (save_dialog));
-
- /* Save As dialog is modal to its main window */
- gtk_window_set_modal (GTK_WINDOW (save_dialog), TRUE);
-
- /* Set the suggested file name */
- doc = gedit_tab_get_document (tab);
- file = gedit_document_get_location (doc);
-
- if (file != NULL)
- {
- uri_set = gtk_file_chooser_set_file (GTK_FILE_CHOOSER (save_dialog),
- file,
- NULL);
-
- g_object_unref (file);
- }
-
-
- if (!uri_set)
- {
- GFile *default_path;
- gchar *docname;
-
- default_path = _gedit_window_get_default_location (window);
- docname = gedit_document_get_short_name_for_display (doc);
-
- if (default_path != NULL)
- {
- gchar *uri;
-
- uri = g_file_get_uri (default_path);
- gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (save_dialog),
- uri);
-
- g_free (uri);
- g_object_unref (default_path);
- }
-
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (save_dialog),
- docname);
-
- g_free (docname);
- }
-
- /* Set suggested encoding */
- encoding = gedit_document_get_encoding (doc);
- g_return_if_fail (encoding != NULL);
-
- newline_type = gedit_document_get_newline_type (doc);
-
- gedit_file_chooser_dialog_set_encoding (GEDIT_FILE_CHOOSER_DIALOG (save_dialog),
- encoding);
-
- gedit_file_chooser_dialog_set_newline_type (GEDIT_FILE_CHOOSER_DIALOG (save_dialog),
- newline_type);
-
- g_object_set_data (G_OBJECT (save_dialog),
- GEDIT_TAB_TO_SAVE_AS,
- tab);
-
- g_signal_connect (save_dialog,
- "response",
- G_CALLBACK (save_dialog_response_cb),
- window);
-
- gtk_widget_show (save_dialog);
-}
-
-static void
-file_save (GeditTab *tab,
- GeditWindow *window)
-{
- GeditDocument *doc;
- gchar *uri_for_display;
-
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_if_fail (GEDIT_IS_TAB (tab));
- g_return_if_fail (GEDIT_IS_WINDOW (window));
-
- doc = gedit_tab_get_document (tab);
- g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
-
- if (gedit_document_is_untitled (doc) ||
- gedit_document_get_readonly (doc))
- {
- gedit_debug_message (DEBUG_COMMANDS, "Untitled or Readonly");
-
- file_save_as (tab, window);
-
- return;
- }
-
- uri_for_display = gedit_document_get_uri_for_display (doc);
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- _("Saving file '%s'\342\200\246"),
- uri_for_display);
-
- g_free (uri_for_display);
-
- _gedit_tab_save (tab);
-}
-
-void
-_gedit_cmd_file_save (GtkAction *action,
- GeditWindow *window)
-{
- GeditTab *tab;
-
- gedit_debug (DEBUG_COMMANDS);
-
- tab = gedit_window_get_active_tab (window);
- if (tab == NULL)
- return;
-
- file_save (tab, window);
-}
-
-void
-_gedit_cmd_file_save_as (GtkAction *action,
- GeditWindow *window)
-{
- GeditTab *tab;
-
- gedit_debug (DEBUG_COMMANDS);
-
- tab = gedit_window_get_active_tab (window);
- if (tab == NULL)
- return;
-
- file_save_as (tab, window);
-}
-
-static gboolean
-document_needs_saving (GeditDocument *doc)
-{
- if (gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (doc)))
- return TRUE;
-
- /* we check if it was deleted only for local files
- * since for remote files it may hang */
- if (gedit_document_is_local (doc) && gedit_document_get_deleted (doc))
- return TRUE;
-
- return FALSE;
-}
-
-/*
- * The docs in the list must belong to the same GeditWindow.
- */
-void
-_gedit_cmd_file_save_documents_list (GeditWindow *window,
- GList *docs)
-{
- GList *l;
- GSList *tabs_to_save_as = NULL;
-
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_if_fail (!(gedit_window_get_state (window) &
- (GEDIT_WINDOW_STATE_PRINTING |
- GEDIT_WINDOW_STATE_SAVING_SESSION)));
-
- l = docs;
- while (l != NULL)
- {
- GeditDocument *doc;
- GeditTab *t;
- GeditTabState state;
-
- g_return_if_fail (GEDIT_IS_DOCUMENT (l->data));
-
- doc = GEDIT_DOCUMENT (l->data);
- t = gedit_tab_get_from_document (doc);
- state = gedit_tab_get_state (t);
-
- g_return_if_fail (state != GEDIT_TAB_STATE_PRINTING);
- g_return_if_fail (state != GEDIT_TAB_STATE_PRINT_PREVIEWING);
- g_return_if_fail (state != GEDIT_TAB_STATE_CLOSING);
-
- if ((state == GEDIT_TAB_STATE_NORMAL) ||
- (state == GEDIT_TAB_STATE_SHOWING_PRINT_PREVIEW) ||
- (state == GEDIT_TAB_STATE_GENERIC_NOT_EDITABLE))
- {
- /* FIXME: manage the case of local readonly files owned by the
- user is running gedit - Paolo (Dec. 8, 2005) */
- if (gedit_document_is_untitled (doc) ||
- gedit_document_get_readonly (doc))
- {
- if (document_needs_saving (doc))
- {
- tabs_to_save_as = g_slist_prepend (tabs_to_save_as,
- t);
- }
- }
- else
- {
- file_save (t, window);
- }
- }
- else
- {
- /* If the state is:
- - GEDIT_TAB_STATE_LOADING: we do not save since we are sure the file is unmodified
- - GEDIT_TAB_STATE_REVERTING: we do not save since the user wants
- to return back to the version of the file she previously saved
- - GEDIT_TAB_STATE_SAVING: well, we are already saving (no need to save again)
- - GEDIT_TAB_STATE_PRINTING, GEDIT_TAB_STATE_PRINT_PREVIEWING: there is not a
- real reason for not saving in this case, we do not save to avoid to run
- two operations using the message area at the same time (may be we can remove
- this limitation in the future). Note that SaveAll, ClosAll
- and Quit are unsensitive if the window state is PRINTING.
- - GEDIT_TAB_STATE_GENERIC_ERROR: we do not save since the document contains
- errors (I don't think this is a very frequent case, we should probably remove
- this state)
- - GEDIT_TAB_STATE_LOADING_ERROR: there is nothing to save
- - GEDIT_TAB_STATE_REVERTING_ERROR: there is nothing to save and saving the current
- document will overwrite the copy of the file the user wants to go back to
- - GEDIT_TAB_STATE_SAVING_ERROR: we do not save since we just failed to save, so there is
- no reason to automatically retry... we wait for user intervention
- - GEDIT_TAB_STATE_CLOSING: this state is invalid in this case
- */
-
- gchar *uri_for_display;
-
- uri_for_display = gedit_document_get_uri_for_display (doc);
- gedit_debug_message (DEBUG_COMMANDS,
- "File '%s' not saved. State: %d",
- uri_for_display,
- state);
- g_free (uri_for_display);
- }
-
- l = g_list_next (l);
- }
-
- if (tabs_to_save_as != NULL)
- {
- GeditTab *tab;
-
- tabs_to_save_as = g_slist_reverse (tabs_to_save_as );
-
- g_return_if_fail (g_object_get_data (G_OBJECT (window),
- GEDIT_LIST_OF_TABS_TO_SAVE_AS) == NULL);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_LIST_OF_TABS_TO_SAVE_AS,
- tabs_to_save_as);
-
- tab = GEDIT_TAB (tabs_to_save_as->data);
-
- gedit_window_set_active_tab (window, tab);
- file_save_as (tab, window);
- }
-}
-
-void
-gedit_commands_save_all_documents (GeditWindow *window)
-{
- GList *docs;
-
- g_return_if_fail (GEDIT_IS_WINDOW (window));
-
- gedit_debug (DEBUG_COMMANDS);
-
- docs = gedit_window_get_documents (window);
-
- _gedit_cmd_file_save_documents_list (window, docs);
-
- g_list_free (docs);
-}
-
-void
-_gedit_cmd_file_save_all (GtkAction *action,
- GeditWindow *window)
-{
- gedit_commands_save_all_documents (window);
-}
-
-void
-gedit_commands_save_document (GeditWindow *window,
- GeditDocument *document)
-{
- GeditTab *tab;
-
- g_return_if_fail (GEDIT_IS_WINDOW (window));
- g_return_if_fail (GEDIT_IS_DOCUMENT (document));
-
- gedit_debug (DEBUG_COMMANDS);
-
- tab = gedit_tab_get_from_document (document);
- file_save (tab, window);
-}
-
-/* File revert */
-static void
-do_revert (GeditWindow *window,
- GeditTab *tab)
-{
- GeditDocument *doc;
- gchar *docname;
-
- gedit_debug (DEBUG_COMMANDS);
-
- doc = gedit_tab_get_document (tab);
- docname = gedit_document_get_short_name_for_display (doc);
-
- gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
- window->priv->generic_message_cid,
- _("Reverting the document '%s'\342\200\246"),
- docname);
-
- g_free (docname);
-
- _gedit_tab_revert (tab);
-}
-
-static void
-revert_dialog_response_cb (GtkDialog *dialog,
- gint response_id,
- GeditWindow *window)
-{
- GeditTab *tab;
-
- gedit_debug (DEBUG_COMMANDS);
-
- /* FIXME: we are relying on the fact that the dialog is
- modal so the active tab can't be changed...
- not very nice - Paolo (Oct 11, 2005) */
- tab = gedit_window_get_active_tab (window);
- if (tab == NULL)
- return;
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-
- if (response_id == GTK_RESPONSE_OK)
- {
- do_revert (window, tab);
- }
-}
-
-static GtkWidget *
-revert_dialog (GeditWindow *window,
- GeditDocument *doc)
-{
- GtkWidget *dialog;
- gchar *docname;
- gchar *primary_msg;
- gchar *secondary_msg;
- glong seconds;
-
- gedit_debug (DEBUG_COMMANDS);
-
- docname = gedit_document_get_short_name_for_display (doc);
- primary_msg = g_strdup_printf (_("Revert unsaved changes to document '%s'?"),
- docname);
- g_free (docname);
-
- seconds = MAX (1, _gedit_document_get_seconds_since_last_save_or_load (doc));
-
- if (seconds < 55)
- {
- secondary_msg = g_strdup_printf (
- ngettext ("Changes made to the document in the last %ld second "
- "will be permanently lost.",
- "Changes made to the document in the last %ld seconds "
- "will be permanently lost.",
- seconds),
- seconds);
- }
- else if (seconds < 75) /* 55 <= seconds < 75 */
- {
- secondary_msg = g_strdup (_("Changes made to the document in the last minute "
- "will be permanently lost."));
- }
- else if (seconds < 110) /* 75 <= seconds < 110 */
- {
- secondary_msg = g_strdup_printf (
- ngettext ("Changes made to the document in the last minute and "
- "%ld second will be permanently lost.",
- "Changes made to the document in the last minute and "
- "%ld seconds will be permanently lost.",
- seconds - 60 ),
- seconds - 60);
- }
- else if (seconds < 3600)
- {
- secondary_msg = g_strdup_printf (
- ngettext ("Changes made to the document in the last %ld minute "
- "will be permanently lost.",
- "Changes made to the document in the last %ld minutes "
- "will be permanently lost.",
- seconds / 60),
- seconds / 60);
- }
- else if (seconds < 7200)
- {
- gint minutes;
- seconds -= 3600;
-
- minutes = seconds / 60;
- if (minutes < 5)
- {
- secondary_msg = g_strdup (_("Changes made to the document in the last hour "
- "will be permanently lost."));
- }
- else
- {
- secondary_msg = g_strdup_printf (
- ngettext ("Changes made to the document in the last hour and "
- "%d minute will be permanently lost.",
- "Changes made to the document in the last hour and "
- "%d minutes will be permanently lost.",
- minutes),
- minutes);
- }
- }
- else
- {
- gint hours;
-
- hours = seconds / 3600;
-
- secondary_msg = g_strdup_printf (
- ngettext ("Changes made to the document in the last %d hour "
- "will be permanently lost.",
- "Changes made to the document in the last %d hours "
- "will be permanently lost.",
- hours),
- hours);
- }
-
- dialog = gtk_message_dialog_new (GTK_WINDOW (window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE,
- "%s", primary_msg);
-
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- "%s", secondary_msg);
- g_free (primary_msg);
- g_free (secondary_msg);
-
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
-
- gtk_dialog_add_button (GTK_DIALOG (dialog),
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_CANCEL);
-
- gedit_dialog_add_button (GTK_DIALOG (dialog),
- _("_Revert"),
- GTK_STOCK_REVERT_TO_SAVED,
- GTK_RESPONSE_OK);
-
- gtk_dialog_set_default_response (GTK_DIALOG (dialog),
- GTK_RESPONSE_CANCEL);
-
- return dialog;
-}
-
-void
-_gedit_cmd_file_revert (GtkAction *action,
- GeditWindow *window)
-{
- GeditTab *tab;
- GeditDocument *doc;
- GtkWidget *dialog;
- GtkWindowGroup *wg;
-
- gedit_debug (DEBUG_COMMANDS);
-
- tab = gedit_window_get_active_tab (window);
- g_return_if_fail (tab != NULL);
-
- /* If we are already displaying a notification
- * reverting will drop local modifications, do
- * not bug the user further */
- if (gedit_tab_get_state (tab) == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
- {
- do_revert (window, tab);
- return;
- }
-
- doc = gedit_tab_get_document (tab);
- g_return_if_fail (doc != NULL);
- g_return_if_fail (!gedit_document_is_untitled (doc));
-
- dialog = revert_dialog (window, doc);
-
- wg = gedit_window_get_group (window);
-
- gtk_window_group_add_window (wg, GTK_WINDOW (dialog));
-
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-
- g_signal_connect (dialog,
- "response",
- G_CALLBACK (revert_dialog_response_cb),
- window);
-
- gtk_widget_show (dialog);
-}
-
-/* Close tab */
-static gboolean
-really_close_tab (GeditTab *tab)
-{
- GtkWidget *toplevel;
- GeditWindow *window;
-
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_val_if_fail (gedit_tab_get_state (tab) == GEDIT_TAB_STATE_CLOSING,
- FALSE);
-
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (tab));
- g_return_val_if_fail (GEDIT_IS_WINDOW (toplevel), FALSE);
-
- window = GEDIT_WINDOW (toplevel);
-
- gedit_window_close_tab (window, tab);
-
- if (gedit_window_get_active_tab (window) == NULL)
- {
- gboolean is_quitting;
-
- is_quitting = GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (window),
- GEDIT_IS_QUITTING));
-
- if (is_quitting)
- gtk_widget_destroy (GTK_WIDGET (window));
- }
-
- return FALSE;
-}
-
-static void
-tab_state_changed_while_saving (GeditTab *tab,
- GParamSpec *pspec,
- GeditWindow *window)
-{
- GeditTabState ts;
-
- ts = gedit_tab_get_state (tab);
-
- gedit_debug_message (DEBUG_COMMANDS, "State while saving: %d\n", ts);
-
- /* When the state become NORMAL, it means the saving operation is
- finished */
- if (ts == GEDIT_TAB_STATE_NORMAL)
- {
- GeditDocument *doc;
-
- g_signal_handlers_disconnect_by_func (tab,
- G_CALLBACK (tab_state_changed_while_saving),
- window);
-
- doc = gedit_tab_get_document (tab);
- g_return_if_fail (doc != NULL);
-
- /* If the saving operation failed or was interrupted, then the
- document is still "modified" -> do not close the tab */
- if (document_needs_saving (doc))
- return;
-
- /* Close the document only if it has been succesfully saved.
- Tab state is set to CLOSING (it is a state without exiting
- transitions) and the tab is closed in a idle handler */
- _gedit_tab_mark_for_closing (tab);
-
- g_idle_add_full (G_PRIORITY_HIGH_IDLE,
- (GSourceFunc)really_close_tab,
- tab,
- NULL);
- }
-}
-
-static void
-save_and_close (GeditTab *tab,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- /* Trace tab state changes */
- g_signal_connect (tab,
- "notify::state",
- G_CALLBACK (tab_state_changed_while_saving),
- window);
-
- file_save (tab, window);
-}
-
-static void
-save_as_and_close (GeditTab *tab,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- g_object_set_data (G_OBJECT (tab),
- GEDIT_IS_CLOSING_TAB,
- NULL);
-
- /* Trace tab state changes */
- g_signal_connect (tab,
- "notify::state",
- G_CALLBACK (tab_state_changed_while_saving),
- window);
-
- gedit_window_set_active_tab (window, tab);
- file_save_as (tab, window);
-}
-
-static void
-save_and_close_all_documents (const GList *docs,
- GeditWindow *window)
-{
- GList *tabs;
- GList *l;
- GSList *sl;
- GSList *tabs_to_save_as;
- GSList *tabs_to_save_and_close;
- GList *tabs_to_close;
-
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_if_fail (!(gedit_window_get_state (window) & GEDIT_WINDOW_STATE_PRINTING));
-
- tabs = gtk_container_get_children (
- GTK_CONTAINER (_gedit_window_get_notebook (window)));
-
- tabs_to_save_as = NULL;
- tabs_to_save_and_close = NULL;
- tabs_to_close = NULL;
-
- l = tabs;
- while (l != NULL)
- {
- GeditTab *t;
- GeditTabState state;
- GeditDocument *doc;
-
- t = GEDIT_TAB (l->data);
-
- state = gedit_tab_get_state (t);
- doc = gedit_tab_get_document (t);
-
- /* If the state is: ([*] invalid states)
- - GEDIT_TAB_STATE_NORMAL: close (and if needed save)
- - GEDIT_TAB_STATE_LOADING: close, we are sure the file is unmodified
- - GEDIT_TAB_STATE_REVERTING: since the user wants
- to return back to the version of the file she previously saved, we can close
- without saving (CHECK: are we sure this is the right behavior, suppose the case
- the original file has been deleted)
- - [*] GEDIT_TAB_STATE_SAVING: invalid, ClosAll
- and Quit are unsensitive if the window state is SAVING.
- - [*] GEDIT_TAB_STATE_PRINTING, GEDIT_TAB_STATE_PRINT_PREVIEWING: there is not a
- real reason for not closing in this case, we do not save to avoid to run
- two operations using the message area at the same time (may be we can remove
- this limitation in the future). Note that ClosAll
- and Quit are unsensitive if the window state is PRINTING.
- - GEDIT_TAB_STATE_SHOWING_PRINT_PREVIEW: close (and if needed save)
- - GEDIT_TAB_STATE_LOADING_ERROR: close without saving (if the state is LOADING_ERROR then the
- document is not modified)
- - GEDIT_TAB_STATE_REVERTING_ERROR: we do not close since the document contains errors
- - GEDIT_TAB_STATE_SAVING_ERROR: we do not close since the document contains errors
- - GEDIT_TAB_STATE_GENERIC_ERROR: we do not close since the document contains
- errors (CHECK: we should problably remove this state)
- - [*] GEDIT_TAB_STATE_CLOSING: this state is invalid in this case
- */
-
- g_return_if_fail (state != GEDIT_TAB_STATE_PRINTING);
- g_return_if_fail (state != GEDIT_TAB_STATE_PRINT_PREVIEWING);
- g_return_if_fail (state != GEDIT_TAB_STATE_CLOSING);
- g_return_if_fail (state != GEDIT_TAB_STATE_SAVING);
-
- if ((state != GEDIT_TAB_STATE_SAVING_ERROR) &&
- (state != GEDIT_TAB_STATE_GENERIC_ERROR) &&
- (state != GEDIT_TAB_STATE_REVERTING_ERROR))
- {
- if ((g_list_index ((GList *)docs, doc) >= 0) &&
- (state != GEDIT_TAB_STATE_LOADING) &&
- (state != GEDIT_TAB_STATE_LOADING_ERROR) &&
- (state != GEDIT_TAB_STATE_REVERTING)) /* CHECK: is this the right behavior with REVERTING ?*/
- {
- /* The document must be saved before closing */
- g_return_if_fail (document_needs_saving (doc));
-
- /* FIXME: manage the case of local readonly files owned by the
- user is running gedit - Paolo (Dec. 8, 2005) */
- if (gedit_document_is_untitled (doc) ||
- gedit_document_get_readonly (doc))
- {
- g_object_set_data (G_OBJECT (t),
- GEDIT_IS_CLOSING_TAB,
- GBOOLEAN_TO_POINTER (TRUE));
-
- tabs_to_save_as = g_slist_prepend (tabs_to_save_as,
- t);
- }
- else
- {
- tabs_to_save_and_close = g_slist_prepend (tabs_to_save_and_close,
- t);
- }
- }
- else
- {
- /* The document must be closed without saving */
- tabs_to_close = g_list_prepend (tabs_to_close,
- t);
- }
- }
-
- l = g_list_next (l);
- }
-
- g_list_free (tabs);
-
- /* Close all tabs to close (in a sync way) */
- gedit_window_close_tabs (window, tabs_to_close);
- g_list_free (tabs_to_close);
-
- /* Save and close all the files in tabs_to_save_and_close */
- sl = tabs_to_save_and_close;
- while (sl != NULL)
- {
- save_and_close (GEDIT_TAB (sl->data),
- window);
- sl = g_slist_next (sl);
- }
- g_slist_free (tabs_to_save_and_close);
-
- /* Save As and close all the files in tabs_to_save_as */
- if (tabs_to_save_as != NULL)
- {
- GeditTab *tab;
-
- tabs_to_save_as = g_slist_reverse (tabs_to_save_as );
-
- g_return_if_fail (g_object_get_data (G_OBJECT (window),
- GEDIT_LIST_OF_TABS_TO_SAVE_AS) == NULL);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_LIST_OF_TABS_TO_SAVE_AS,
- tabs_to_save_as);
-
- tab = GEDIT_TAB (tabs_to_save_as->data);
-
- save_as_and_close (tab, window);
- }
-}
-
-static void
-save_and_close_document (const GList *docs,
- GeditWindow *window)
-{
- GeditTab *tab;
-
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_if_fail (docs->next == NULL);
-
- tab = gedit_tab_get_from_document (GEDIT_DOCUMENT (docs->data));
- g_return_if_fail (tab != NULL);
-
- save_and_close (tab, window);
-}
-
-static void
-close_all_tabs (GeditWindow *window)
-{
- gboolean is_quitting;
-
- gedit_debug (DEBUG_COMMANDS);
-
- /* There is no document to save -> close all tabs */
- gedit_window_close_all_tabs (window);
-
- is_quitting = GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (window),
- GEDIT_IS_QUITTING));
-
- if (is_quitting)
- gtk_widget_destroy (GTK_WIDGET (window));
-
- return;
-}
-
-static void
-close_document (GeditWindow *window,
- GeditDocument *doc)
-{
- GeditTab *tab;
-
- gedit_debug (DEBUG_COMMANDS);
-
- tab = gedit_tab_get_from_document (doc);
- g_return_if_fail (tab != NULL);
-
- gedit_window_close_tab (window, tab);
-}
-
-static void
-close_confirmation_dialog_response_handler (GeditCloseConfirmationDialog *dlg,
- gint response_id,
- GeditWindow *window)
-{
- GList *selected_documents;
- gboolean is_closing_all;
-
- gedit_debug (DEBUG_COMMANDS);
-
- is_closing_all = GPOINTER_TO_BOOLEAN (g_object_get_data (G_OBJECT (window),
- GEDIT_IS_CLOSING_ALL));
-
- gtk_widget_hide (GTK_WIDGET (dlg));
-
- switch (response_id)
- {
- case GTK_RESPONSE_YES: /* Save and Close */
- selected_documents = gedit_close_confirmation_dialog_get_selected_documents (dlg);
- if (selected_documents == NULL)
- {
- if (is_closing_all)
- {
- /* There is no document to save -> close all tabs */
- /* We call gtk_widget_destroy before close_all_tabs
- * because close_all_tabs could destroy the gedit window */
- gtk_widget_destroy (GTK_WIDGET (dlg));
-
- close_all_tabs (window);
-
- return;
- }
- else
- g_return_if_reached ();
- }
- else
- {
- if (is_closing_all)
- {
- save_and_close_all_documents (selected_documents,
- window);
- }
- else
- {
- save_and_close_document (selected_documents,
- window);
- }
- }
-
- g_list_free (selected_documents);
-
- break;
-
- case GTK_RESPONSE_NO: /* Close without Saving */
- if (is_closing_all)
- {
- /* We call gtk_widget_destroy before close_all_tabs
- * because close_all_tabs could destroy the gedit window */
- gtk_widget_destroy (GTK_WIDGET (dlg));
-
- close_all_tabs (window);
-
- return;
- }
- else
- {
- const GList *unsaved_documents;
-
- unsaved_documents = gedit_close_confirmation_dialog_get_unsaved_documents (dlg);
- g_return_if_fail (unsaved_documents->next == NULL);
-
- close_document (window,
- GEDIT_DOCUMENT (unsaved_documents->data));
- }
-
- break;
- default: /* Do not close */
-
- /* Reset is_quitting flag */
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_QUITTING,
- GBOOLEAN_TO_POINTER (FALSE));
-
-#ifdef OS_OSX
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_QUITTING_ALL,
- GINT_TO_POINTER (FALSE));
-#endif
- break;
- }
-
- gtk_widget_destroy (GTK_WIDGET (dlg));
-}
-
-/* Returns TRUE if the tab can be immediately closed */
-static gboolean
-tab_can_close (GeditTab *tab,
- GtkWindow *window)
-{
- GeditDocument *doc;
-
- gedit_debug (DEBUG_COMMANDS);
-
- doc = gedit_tab_get_document (tab);
-
- if (!_gedit_tab_can_close (tab))
- {
- GtkWidget *dlg;
-
- dlg = gedit_close_confirmation_dialog_new_single (
- window,
- doc,
- FALSE);
-
- g_signal_connect (dlg,
- "response",
- G_CALLBACK (close_confirmation_dialog_response_handler),
- window);
-
- gtk_widget_show (dlg);
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-/* CHECK: we probably need this one public for plugins...
- * maybe even a _list variant. Or maybe it's better make
- * gedit_window_close_tab always run the confirm dialog?
- * we should not allow closing a tab without resetting the
- * GEDIT_IS_CLOSING_ALL flag!
- */
-void
-_gedit_cmd_file_close_tab (GeditTab *tab,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_if_fail (GTK_WIDGET (window) == gtk_widget_get_toplevel (GTK_WIDGET (tab)));
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_CLOSING_ALL,
- GBOOLEAN_TO_POINTER (FALSE));
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_QUITTING,
- GBOOLEAN_TO_POINTER (FALSE));
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_QUITTING_ALL,
- GINT_TO_POINTER (FALSE));
-
-
- if (tab_can_close (tab, GTK_WINDOW (window)))
- gedit_window_close_tab (window, tab);
-}
-
-void
-_gedit_cmd_file_close (GtkAction *action,
- GeditWindow *window)
-{
- GeditTab *active_tab;
-
- gedit_debug (DEBUG_COMMANDS);
-
- active_tab = gedit_window_get_active_tab (window);
-
- if (active_tab == NULL)
- {
-#ifdef OS_OSX
- /* Close the window on OS X */
- gtk_widget_destroy (GTK_WIDGET (window));
-#endif
- return;
- }
-
- _gedit_cmd_file_close_tab (active_tab, window);
-}
-
-/* Close all tabs */
-static void
-file_close_all (GeditWindow *window,
- gboolean is_quitting)
-{
- GList *unsaved_docs;
- GtkWidget *dlg;
-
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_if_fail (!(gedit_window_get_state (window) &
- (GEDIT_WINDOW_STATE_SAVING |
- GEDIT_WINDOW_STATE_PRINTING |
- GEDIT_WINDOW_STATE_SAVING_SESSION)));
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_CLOSING_ALL,
- GBOOLEAN_TO_POINTER (TRUE));
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_QUITTING,
- GBOOLEAN_TO_POINTER (is_quitting));
-
- unsaved_docs = gedit_window_get_unsaved_documents (window);
-
- if (unsaved_docs == NULL)
- {
- /* There is no document to save -> close all tabs */
- gedit_window_close_all_tabs (window);
-
- if (is_quitting)
- gtk_widget_destroy (GTK_WIDGET (window));
-
- return;
- }
-
- if (unsaved_docs->next == NULL)
- {
- /* There is only one unsaved document */
- GeditTab *tab;
- GeditDocument *doc;
-
- doc = GEDIT_DOCUMENT (unsaved_docs->data);
-
- tab = gedit_tab_get_from_document (doc);
- g_return_if_fail (tab != NULL);
-
- gedit_window_set_active_tab (window, tab);
-
- dlg = gedit_close_confirmation_dialog_new_single (
- GTK_WINDOW (window),
- doc,
- FALSE);
- }
- else
- {
- dlg = gedit_close_confirmation_dialog_new (GTK_WINDOW (window),
- unsaved_docs,
- FALSE);
- }
-
- g_list_free (unsaved_docs);
-
- g_signal_connect (dlg,
- "response",
- G_CALLBACK (close_confirmation_dialog_response_handler),
- window);
-
- gtk_widget_show (dlg);
-}
-
-void
-_gedit_cmd_file_close_all (GtkAction *action,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
- g_return_if_fail (!(gedit_window_get_state (window) &
- (GEDIT_WINDOW_STATE_SAVING |
- GEDIT_WINDOW_STATE_PRINTING |
- GEDIT_WINDOW_STATE_SAVING_SESSION)));
-
- file_close_all (window, FALSE);
-}
-
-/* Quit */
-#ifdef OS_OSX
-static void
-quit_all ()
-{
- GList *windows;
- GList *item;
- GeditApp *app;
-
- app = gedit_app_get_default ();
- windows = g_list_copy ((GList *)gedit_app_get_windows (app));
-
- for (item = windows; item; item = g_list_next (item))
- {
- GeditWindow *window = GEDIT_WINDOW (item->data);
-
- g_object_set_data (G_OBJECT (window),
- GEDIT_IS_QUITTING_ALL,
- GINT_TO_POINTER (TRUE));
-
- if (!(gedit_window_get_state (window) &
- (GEDIT_WINDOW_STATE_SAVING |
- GEDIT_WINDOW_STATE_PRINTING |
- GEDIT_WINDOW_STATE_SAVING_SESSION)))
- {
- file_close_all (window, TRUE);
- }
- }
-
- g_list_free (windows);
-}
-#endif
-
-void
-_gedit_cmd_file_quit (GtkAction *action,
- GeditWindow *window)
-{
- gedit_debug (DEBUG_COMMANDS);
-
-#ifdef OS_OSX
- if (action != NULL)
- {
- quit_all ();
- return;
- }
-#endif
-
- g_return_if_fail (!(gedit_window_get_state (window) &
- (GEDIT_WINDOW_STATE_SAVING |
- GEDIT_WINDOW_STATE_PRINTING |
- GEDIT_WINDOW_STATE_SAVING_SESSION)));
-
- file_close_all (window, TRUE);
-}