[gedit/multiviews: 49/49] Merge branch 'master' into multiviews
- From: Ignacio Casal Quinteiro <icq src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gedit/multiviews: 49/49] Merge branch 'master' into multiviews
- Date: Sun, 24 Jan 2010 19:15:02 +0000 (UTC)
commit 0eca0872b06d906f27a795db5b3aca650f563174
Merge: 1096f41 df91511
Author: Ignacio Casal Quinteiro <icq gnome org>
Date: Sun Jan 24 20:14:23 2010 +0100
Merge branch 'master' into multiviews
Conflicts:
gedit/Makefile.am
gedit/gedit-commands-file.c
gedit/gedit-document-interface.h
gedit/gedit-document-loader.c
gedit/gedit-gio-document-saver.c
gedit/gedit-tab-label.c
gedit/gedit-tab.c
gedit/gedit-tab.h
gedit/gedit-text-buffer.c
gedit/gedit-window.c
Makefile.am | 2 +-
NEWS | 26 +
README | 6 +-
configure.ac | 7 +-
docs/reference/gedit.types | 4 +-
gedit/Makefile.am | 12 +-
gedit/dialogs/gedit-encodings-dialog.c | 5 +-
gedit/dialogs/gedit-preferences-dialog.c | 5 +-
gedit/dialogs/gedit-search-dialog.c | 5 +-
gedit/dialogs/gedit-style-scheme-dialog.c | 5 +-
gedit/gedit-commands-file.c | 11 +-
gedit/gedit-commands-help.c | 6 +-
gedit/gedit-document-input-stream.c | 430 +++++++++
gedit/gedit-document-input-stream.h | 68 ++
gedit/gedit-document-interface.c | 71 ++-
gedit/gedit-document-interface.h | 30 +-
gedit/gedit-document-loader.c | 196 +----
gedit/gedit-document-loader.h | 8 +-
gedit/gedit-document-saver.c | 36 +-
gedit/gedit-document-saver.h | 10 +-
gedit/gedit-encodings-combo-box.c | 464 +++++++++
gedit/gedit-encodings-combo-box.h | 78 ++
gedit/gedit-encodings-option-menu.c | 418 ---------
gedit/gedit-encodings-option-menu.h | 78 --
gedit/gedit-encodings.c | 8 +-
gedit/gedit-file-chooser-dialog.c | 221 ++++-
gedit/gedit-file-chooser-dialog.h | 17 +-
gedit/gedit-gio-document-loader.c | 322 ++++++-
gedit/gedit-gio-document-saver.c | 246 +++--
gedit/gedit-io-error-message-area.c | 231 +++--
gedit/gedit-io-error-message-area.h | 7 +-
gedit/gedit-smart-charset-converter.c | 407 ++++++++
gedit/gedit-smart-charset-converter.h | 66 ++
gedit/gedit-tab-label.c | 29 +-
gedit/gedit-text-buffer.c | 119 ++-
gedit/gedit-text-buffer.h | 6 +
gedit/gedit-view-container.c | 163 ++--
gedit/gedit-view-container.h | 7 +-
gedit/gedit-window.c | 33 +-
gedit/gedit.c | 30 +-
plugins/pythonconsole/pythonconsole/__init__.py | 25 +-
plugins/pythonconsole/pythonconsole/config.py | 37 +-
plugins/quickopen/quickopen/popup.py | 3 +-
plugins/quickopen/quickopen/windowhelper.py | 3 +-
plugins/snippets/snippets/Placeholder.py | 14 +
plugins/spell/Makefile.am | 2 +-
plugins/spell/gedit-spell-language-dialog.c | 5 +-
plugins/time/gedit-time-plugin.c | 5 +-
po/POTFILES.in | 4 +-
po/ar.po | 745 ++++++++-------
po/bn.po | 1146 ++++++++++++-----------
po/es.po | 793 ++++++++--------
po/fr.po | 890 +++++++++---------
po/nb.po | 853 +++++++++---------
po/sv.po | 731 ++++++++-------
po/ta.po | 1067 +++++++++++-----------
tests/Makefile.am | 22 +
tests/document-input-stream.c | 147 +++
tests/document-loader.c | 232 +++++
tests/document-saver.c | 722 ++++++++++++++
tests/setup-document-saver.sh | 27 +
tests/smart-converter.c | 331 +++++++
win32/build-installer.sh | 53 +-
win32/gedit.iss.in | 3 +-
64 files changed, 7478 insertions(+), 4275 deletions(-)
---
diff --cc configure.ac
index b7a705f,a7a95eb..7613a6c
--- a/configure.ac
+++ b/configure.ac
@@@ -278,11 -278,10 +278,11 @@@ PKG_CHECK_MODULES(GEDIT,
libxml-2.0 >= 2.5.0
glib-2.0 >= 2.22.0
gthread-2.0 >= 2.13.0
- gio-2.0 >= 2.22.0
+ gio-2.0 >= 2.23.1
gtk+-2.0 >= 2.16.0
- gtksourceview-2.0 >= 2.8.0
+ gtksourceview-2.0 >= 2.9.4
gconf-2.0 >= 1.1.11
+ webkit-1.0
])
dnl FIXME: Remove this when removing gedit-message-area
diff --cc gedit/Makefile.am
index 0708a5b,5757ac0..6534260
--- a/gedit/Makefile.am
+++ b/gedit/Makefile.am
@@@ -64,7 -64,8 +64,9 @@@ endi
NOINST_H_FILES = \
gedit-close-button.h \
++ gedit-data-binding.h \
gedit-dirs.h \
+ gedit-document-input-stream.h \
gedit-document-loader.h \
gedit-document-saver.h \
gedit-documents-panel.h \
@@@ -89,6 -89,6 +90,7 @@@
gedit-tab-label.h \
gedittextregion.h \
gedit-ui.h \
++ gedit-web-view.h \
gedit-window-private.h
INST_H_FILES = \
@@@ -96,9 -96,9 +98,9 @@@
gedit-commands.h \
gedit-convert.h \
gedit-debug.h \
- gedit-document.h \
+ gedit-document-interface.h \
gedit-encodings.h \
- gedit-encodings-option-menu.h \
+ gedit-encodings-combo-box.h \
gedit-file-chooser-dialog.h \
gedit-help.h \
gedit-message-bus.h \
@@@ -154,7 -151,8 +156,8 @@@ libgedit_la_SOURCES =
gedit-convert.c \
gedit-debug.c \
gedit-dirs.c \
- gedit-document.c \
+ gedit-document-interface.c \
+ gedit-document-input-stream.c \
gedit-document-loader.c \
gedit-gio-document-loader.c \
gedit-document-saver.c \
diff --cc gedit/gedit-commands-file.c
index 7b95433,f055d8a..d6fb65d
--- a/gedit/gedit-commands-file.c
+++ b/gedit/gedit-commands-file.c
@@@ -610,9 -602,10 +610,10 @@@ save_dialog_response_cb (GeditFileChoos
{
GFile *file;
const GeditEncoding *encoding;
- GeditTab *tab;
+ GeditPage *page;
gpointer data;
- GSList *tabs_to_save_as;
+ GSList *pages_to_save_as;
+ GeditDocumentNewlineType newline_type;
gedit_debug (DEBUG_COMMANDS);
@@@ -659,7 -651,7 +661,8 @@@
// FIXME: pass the GFile to tab when api is there
uri = g_file_get_uri (file);
- _gedit_view_container_save_as (container, uri, encoding);
- _gedit_tab_save_as (tab, uri, encoding, newline_type);
++ _gedit_view_container_save_as (container, uri, encoding,
++ newline_type);
g_free (uri);
}
@@@ -752,9 -741,9 +755,10 @@@ file_save_as (GeditPage *page
GFile *file;
gboolean uri_set = FALSE;
const GeditEncoding *encoding;
+ GeditViewContainer *container;
+ GeditDocumentNewlineType newline_type;
- g_return_if_fail (GEDIT_IS_TAB (tab));
+ g_return_if_fail (GEDIT_IS_PAGE (page));
g_return_if_fail (GEDIT_IS_WINDOW (window));
gedit_debug (DEBUG_COMMANDS);
@@@ -830,9 -820,12 +836,12 @@@
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);
+ GEDIT_PAGE_TO_SAVE_AS,
+ page);
g_signal_connect (save_dialog,
"response",
diff --cc gedit/gedit-document-input-stream.h
index 0000000,01f6a49..a347f34
mode 000000,100644..100644
--- a/gedit/gedit-document-input-stream.h
+++ b/gedit/gedit-document-input-stream.h
@@@ -1,0 -1,68 +1,68 @@@
+ /*
+ * gedit-document-input-stream.h
+ * This file is part of gedit
+ *
+ * Copyright (C) 2010 - Ignacio Casal Quinteiro
+ *
+ * gedit 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.
+ *
+ * gedit 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 gedit; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+ #ifndef __GEDIT_DOCUMENT_INPUT_STREAM_H__
+ #define __GEDIT_DOCUMENT_INPUT_STREAM_H__
+
+ #include <gio/gio.h>
+ #include <gtk/gtk.h>
+
-#include "gedit-document.h"
++#include "gedit-document-interface.h"
+
+ G_BEGIN_DECLS
+
+ #define GEDIT_TYPE_DOCUMENT_INPUT_STREAM (gedit_document_input_stream_get_type ())
+ #define GEDIT_DOCUMENT_INPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEDIT_TYPE_DOCUMENT_INPUT_STREAM, GeditDocumentInputStream))
+ #define GEDIT_DOCUMENT_INPUT_STREAM_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEDIT_TYPE_DOCUMENT_INPUT_STREAM, GeditDocumentInputStream const))
+ #define GEDIT_DOCUMENT_INPUT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEDIT_TYPE_DOCUMENT_INPUT_STREAM, GeditDocumentInputStreamClass))
+ #define GEDIT_IS_DOCUMENT_INPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEDIT_TYPE_DOCUMENT_INPUT_STREAM))
+ #define GEDIT_IS_DOCUMENT_INPUT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEDIT_TYPE_DOCUMENT_INPUT_STREAM))
+ #define GEDIT_DOCUMENT_INPUT_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEDIT_TYPE_DOCUMENT_INPUT_STREAM, GeditDocumentInputStreamClass))
+
+ typedef struct _GeditDocumentInputStream GeditDocumentInputStream;
+ typedef struct _GeditDocumentInputStreamClass GeditDocumentInputStreamClass;
+ typedef struct _GeditDocumentInputStreamPrivate GeditDocumentInputStreamPrivate;
+
+ struct _GeditDocumentInputStream
+ {
+ GInputStream parent;
+
+ GeditDocumentInputStreamPrivate *priv;
+ };
+
+ struct _GeditDocumentInputStreamClass
+ {
+ GInputStreamClass parent_class;
+ };
+
+ GType gedit_document_input_stream_get_type (void) G_GNUC_CONST;
+
+ GInputStream *gedit_document_input_stream_new (GtkTextBuffer *buffer,
+ GeditDocumentNewlineType type);
+
+ gsize gedit_document_input_stream_get_total_size (GeditDocumentInputStream *stream);
+
+ gsize gedit_document_input_stream_tell (GeditDocumentInputStream *stream);
+
+ G_END_DECLS
+
+ #endif /* __GEDIT_DOCUMENT_INPUT_STREAM_H__ */
diff --cc gedit/gedit-document-interface.c
index 4969b9c,0000000..b653b28
mode 100644,000000..100644
--- a/gedit/gedit-document-interface.c
+++ b/gedit/gedit-document-interface.c
@@@ -1,806 -1,0 +1,875 @@@
+/*
+ * gedit-document-interface.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2009 - Ignacio Casal Quinteiro
+ *
+ * gedit 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.
+ *
+ * gedit 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 gedit; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+
+#include "gedit-document-interface.h"
+#include "gedit-marshal.h"
+#include "gedit-enum-types.h"
+#include "gedit-utils.h"
+
+enum {
+ MODIFIED_CHANGED,
+ LOAD,
+ LOADING,
+ LOADED,
+ SAVE,
+ SAVING,
+ SAVED,
+ LAST_SIGNAL
+};
+
+static guint document_signals[LAST_SIGNAL] = { 0 };
+
+/* Default implementation */
+
+static GFile *
+gedit_document_get_location_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static gchar *
+gedit_document_get_uri_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static void
+gedit_document_set_uri_default (GeditDocument *doc,
+ const gchar *uri)
+{
+ g_return_if_reached ();
+}
+
+static gchar *
+gedit_document_get_uri_for_display_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static gchar *
+gedit_document_get_short_name_for_display_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static gchar *
+gedit_document_get_content_type_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static gchar *
+gedit_document_get_mime_type_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static gboolean
+gedit_document_get_readonly_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_load_cancel_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_is_untouched_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_is_untitled_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_is_local_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_get_deleted_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_goto_line_default (GeditDocument *doc,
+ gint line)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_goto_line_offset_default (GeditDocument *doc,
+ gint line,
+ gint line_offset)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static const GeditEncoding *
+gedit_document_get_encoding_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static glong
+gedit_document_get_seconds_since_last_save_or_load_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (0);
+}
+
+static gboolean
+gedit_document_check_externally_modified_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static void
+gedit_document_undo_default (GeditDocument *doc)
+{
+ g_return_if_reached ();
+}
+
+static void
+gedit_document_redo_default (GeditDocument *doc)
+{
+ g_return_if_reached ();
+}
+
+static gboolean
+gedit_document_can_undo_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_can_redo_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static void
+gedit_document_begin_not_undoable_action_default (GeditDocument *doc)
+{
+ g_return_if_reached ();
+}
+
+static void
+gedit_document_end_not_undoable_action_default (GeditDocument *doc)
+{
+ g_return_if_reached ();
+}
+
+static void
+gedit_document_set_text_default (GeditDocument *doc,
+ const gchar *text,
+ gint len)
+{
+ g_return_if_reached ();
+}
+
+static void
+gedit_document_set_modified_default (GeditDocument *doc,
+ gboolean setting)
+{
+ g_return_if_reached ();
+}
+
+static gboolean
+gedit_document_get_modified_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gboolean
+gedit_document_get_has_selection_default (GeditDocument *doc)
+{
+ g_return_val_if_reached (FALSE);
+}
+
+static gchar *
+gedit_document_get_metadata_default (GeditDocument *doc,
+ const gchar *key)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static void
+gedit_document_set_metadata_va_list_default (GeditDocument *doc,
+ const gchar *first_key,
+ va_list var_args)
+{
+ g_return_if_reached ();
+}
+
++static void
++gedit_document_set_readonly_default (GeditDocument *doc,
++ gboolean readonly)
++{
++ g_return_if_reached ();
++}
++
++static void
++gedit_document_set_newline_type_default (GeditDocument *doc,
++ GeditDocumentNewlineType newline_type)
++{
++ g_return_if_reached ();
++}
++
++static GeditDocumentNewlineType
++gedit_document_get_newline_type_default (GeditDocument *doc)
++{
++ g_return_val_if_reached (GEDIT_DOCUMENT_NEWLINE_TYPE_DEFAULT);
++}
++
+static void
+gedit_document_init (GeditDocumentIface *iface)
+{
+ static gboolean initialized = FALSE;
+
+ iface->get_location = gedit_document_get_location_default;
+ iface->get_uri = gedit_document_get_uri_default;
+ iface->set_uri = gedit_document_set_uri_default;
+ iface->get_uri_for_display = gedit_document_get_uri_for_display_default;
+ iface->get_short_name_for_display = gedit_document_get_short_name_for_display_default;
+ iface->get_content_type = gedit_document_get_content_type_default;
+ iface->get_mime_type = gedit_document_get_mime_type_default;
+ iface->get_readonly = gedit_document_get_readonly_default;
+ iface->load_cancel = gedit_document_load_cancel_default;
+ iface->is_untouched = gedit_document_is_untouched_default;
+ iface->is_untitled = gedit_document_is_untitled_default;
+ iface->is_local = gedit_document_is_local_default;
+ iface->get_deleted = gedit_document_get_deleted_default;
+ iface->goto_line = gedit_document_goto_line_default;
+ iface->goto_line_offset = gedit_document_goto_line_offset_default;
+ iface->get_encoding = gedit_document_get_encoding_default;
+ iface->get_seconds_since_last_save_or_load = gedit_document_get_seconds_since_last_save_or_load_default;
+ iface->check_externally_modified = gedit_document_check_externally_modified_default;
+ iface->undo = gedit_document_undo_default;
+ iface->redo = gedit_document_redo_default;
+ iface->can_undo = gedit_document_can_undo_default;
+ iface->can_redo = gedit_document_can_redo_default;
+ iface->begin_not_undoable_action = gedit_document_begin_not_undoable_action_default;
+ iface->end_not_undoable_action = gedit_document_end_not_undoable_action_default;
+ iface->set_text = gedit_document_set_text_default;
+ iface->set_modified = gedit_document_set_modified_default;
+ iface->get_modified = gedit_document_get_modified_default;
+ iface->get_has_selection = gedit_document_get_has_selection_default;
+ iface->get_metadata = gedit_document_get_metadata_default;
+ iface->set_metadata_va_list = gedit_document_set_metadata_va_list_default;
++ iface->set_readonly = gedit_document_set_readonly_default;
++ iface->set_newline_type = gedit_document_set_newline_type_default;
++ iface->get_newline_type = gedit_document_get_newline_type_default;
+
+ if (!initialized)
+ {
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("uri",
+ "URI",
+ "The document's URI",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("shortname",
+ "Short Name",
+ "The document's short name",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("content-type",
+ "Content Type",
+ "The document's Content Type",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_interface_install_property (iface,
+ g_param_spec_boolean ("read-only",
+ "Read Only",
+ "Whether the document is read only or not",
+ FALSE,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
-
++
++ /**
++ * GeditDocument:newline-type:
++ *
++ * The :newline-type property determines what is considered
++ * as a line ending when saving the document
++ */
++ g_object_interface_install_property (iface,
++ g_param_spec_enum ("newline-type",
++ "Newline type",
++ "The accepted types of line ending",
++ GEDIT_TYPE_DOCUMENT_NEWLINE_TYPE,
++ GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
++ G_PARAM_READWRITE |
++ G_PARAM_STATIC_NAME |
++ G_PARAM_STATIC_BLURB));
++
+ document_signals[MODIFIED_CHANGED] =
+ g_signal_new ("modified-changed",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditDocumentIface, modified_changed),
+ NULL, NULL,
+ gedit_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ /**
+ * GeditDocument::load:
+ * @document: the #GeditDocument.
+ * @uri: the uri where to load the document from.
+ * @encoding: the #GeditEncoding to encode the document.
+ * @line_pos: the line to show.
+ * @create: whether the document should be created if it doesn't exist.
+ *
+ * The "load" signal is emitted when a document is loaded.
+ */
+ document_signals[LOAD] =
+ g_signal_new ("load",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditDocumentIface, load),
+ NULL, NULL,
+ gedit_marshal_VOID__STRING_BOXED_INT_BOOLEAN,
+ G_TYPE_NONE,
+ 4,
+ G_TYPE_STRING,
+ /* we rely on the fact that the GeditEncoding pointer stays
+ * the same forever */
+ GEDIT_TYPE_ENCODING | G_SIGNAL_TYPE_STATIC_SCOPE,
+ G_TYPE_INT,
+ G_TYPE_BOOLEAN);
+
+
+ document_signals[LOADING] =
+ g_signal_new ("loading",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditDocumentIface, loading),
+ NULL, NULL,
+ gedit_marshal_VOID__UINT64_UINT64,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_UINT64,
+ G_TYPE_UINT64);
+
+ document_signals[LOADED] =
+ g_signal_new ("loaded",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditDocumentIface, loaded),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
+
+ /**
+ * GeditDocument::save:
+ * @document: the #GeditDocument.
+ * @uri: the uri where the document is about to be saved.
+ * @encoding: the #GeditEncoding used to save the document.
+ * @flags: the #GeditDocumentSaveFlags for the save operation.
+ *
+ * The "save" signal is emitted when the document is saved.
+ */
+ document_signals[SAVE] =
+ g_signal_new ("save",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditDocumentIface, save),
+ NULL, NULL,
+ gedit_marshal_VOID__STRING_BOXED_FLAGS,
+ G_TYPE_NONE,
+ 3,
+ G_TYPE_STRING,
+ /* we rely on the fact that the GeditEncoding pointer stays
+ * the same forever */
+ GEDIT_TYPE_ENCODING | G_SIGNAL_TYPE_STATIC_SCOPE,
+ GEDIT_TYPE_DOCUMENT_SAVE_FLAGS);
+
+ document_signals[SAVING] =
+ g_signal_new ("saving",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditDocumentIface, saving),
+ NULL, NULL,
+ gedit_marshal_VOID__UINT64_UINT64,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_UINT64,
+ G_TYPE_UINT64);
+
+ document_signals[SAVED] =
+ g_signal_new ("saved",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GeditDocumentIface, saved),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
+
+ initialized = TRUE;
+ }
+}
+
+GType
+gedit_document_get_type ()
+{
+ static GType gedit_document_type_id = 0;
+
+ if (!gedit_document_type_id)
+ {
+ static const GTypeInfo g_define_type_info =
+ {
+ sizeof (GeditDocumentIface),
+ (GBaseInitFunc) gedit_document_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL
+ };
+
+ gedit_document_type_id =
+ g_type_register_static (G_TYPE_INTERFACE,
+ "GeditDocument",
+ &g_define_type_info,
+ 0);
+
+ g_type_interface_add_prerequisite (gedit_document_type_id,
+ G_TYPE_OBJECT);
+ }
+
+ return gedit_document_type_id;
+}
+
+
+GQuark
+gedit_document_error_quark (void)
+{
+ static GQuark quark = 0;
+
+ if (G_UNLIKELY (quark == 0))
+ quark = g_quark_from_static_string ("gedit_io_load_error");
+
+ return quark;
+}
+
+GFile *
+gedit_document_get_location (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), NULL);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_location (doc);
+}
+
+gchar *
+gedit_document_get_uri (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), NULL);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_uri (doc);
+}
+
+void
+gedit_document_set_uri (GeditDocument *doc,
+ const gchar *uri)
+{
+ g_return_if_fail (GEDIT_DOCUMENT (doc));
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->set_uri (doc, uri);
+}
+
+gchar *
+gedit_document_get_uri_for_display (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), g_strdup (""));
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_uri_for_display (doc);
+}
+
+gchar *
+gedit_document_get_short_name_for_display (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), g_strdup (""));
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_short_name_for_display (doc);
+}
+
+/* FIXME: Only gedit-text-buffer? */
+gchar *
+gedit_document_get_content_type (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), NULL);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_content_type (doc);
+}
+
+/* FIXME: Only gedit-text-buffer? */
+gchar *
+gedit_document_get_mime_type (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), g_strdup ("text/plain"));
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_mime_type (doc);
+}
+
+gboolean
+gedit_document_get_readonly (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_readonly (doc);
+}
+
+/**
+ * gedit_document_load_document:
+ * @doc: the #GeditDocument.
+ * @uri: the uri where to load the document from.
+ * @encoding: the #GeditEncoding to encode the document.
+ * @line_pos: the line to show.
+ * @create: whether the document should be created if it doesn't exist.
+ *
+ * Load a document. This results in the "load" signal to be emitted.
+ */
+void
+gedit_document_load (GeditDocument *doc,
+ const gchar *uri,
+ const GeditEncoding *encoding,
+ gint line_pos,
+ gboolean create)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (uri != NULL);
+ g_return_if_fail (gedit_utils_is_valid_uri (uri));
+
+ g_signal_emit (doc, document_signals[LOAD], 0, uri, encoding, line_pos, create);
+}
+
+/**
+ * gedit_document_load_cancel:
+ * @doc: the #GeditDocument.
+ *
+ * Cancel load of a document.
+ */
+gboolean
+gedit_document_load_cancel (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->load_cancel (doc);
+}
+
+/**
+ * gedit_document_save:
+ * @doc: the #GeditDocument.
+ * @flags: optionnal #GeditDocumentSaveFlags.
+ *
+ * Save the document to its previous location. This results in the "save"
+ * signal to be emitted.
+ */
+void
+gedit_document_save (GeditDocument *doc,
+ GeditDocumentSaveFlags flags)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (gedit_document_get_uri (doc) != NULL);
+
+ g_signal_emit (doc,
+ document_signals[SAVE],
+ 0,
+ gedit_document_get_uri (doc),
+ gedit_document_get_encoding (doc),
+ flags);
+}
+
+/**
+ * gedit_document_save_as:
+ * @doc: the #GeditDocument.
+ * @uri: the uri where to save the document.
+ * @encoding: the #GeditEncoding to encode the document.
+ * @flags: optionnal #GeditDocumentSaveFlags.
+ *
+ * Save the document to a new location. This results in the "save" signal
+ * to be emitted.
+ */
+void
+gedit_document_save_as (GeditDocument *doc,
+ const gchar *uri,
+ const GeditEncoding *encoding,
+ GeditDocumentSaveFlags flags)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (uri != NULL);
+ g_return_if_fail (encoding != NULL);
+
+ /* priv->mtime refers to the the old uri (if any). Thus, it should be
+ * ignored when saving as. */
+ g_signal_emit (doc,
+ document_signals[SAVE],
+ 0,
+ uri,
+ encoding,
+ flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME);
+}
+
+gboolean
+gedit_document_is_untouched (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->is_untouched (doc);
+}
+
+gboolean
+gedit_document_is_untitled (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->is_untitled (doc);
+}
+
+gboolean
+gedit_document_is_local (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->is_local (doc);
+}
+
+gboolean
+gedit_document_get_deleted (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_deleted (doc);
+}
+
+gboolean
+gedit_document_goto_line (GeditDocument *doc,
+ gint line)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
+ g_return_val_if_fail (line >= -1, FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->goto_line (doc, line);
+}
+
+gboolean
+gedit_document_goto_line_offset (GeditDocument *doc,
+ gint line,
+ gint line_offset)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
+ g_return_val_if_fail (line >= -1, FALSE);
+ g_return_val_if_fail (line_offset >= -1, FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->goto_line_offset (doc, line,
+ line_offset);
+}
+
+const GeditEncoding *
+gedit_document_get_encoding (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), NULL);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_encoding (doc);
+}
+
+glong
+gedit_document_get_seconds_since_last_save_or_load (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), -1);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_seconds_since_last_save_or_load (doc);
+}
+
+gboolean
+gedit_document_check_externally_modified (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->check_externally_modified (doc);
+}
+
+void
+gedit_document_undo (GeditDocument *doc)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->undo (doc);
+}
+
+void
+gedit_document_redo (GeditDocument *doc)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->redo (doc);
+}
+
+gboolean
+gedit_document_can_undo (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->can_undo (doc);
+}
+
+gboolean
+gedit_document_can_redo (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->can_redo (doc);
+}
+
+void
+gedit_document_begin_not_undoable_action (GeditDocument *doc)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->begin_not_undoable_action (doc);
+}
+
+void
+gedit_document_end_not_undoable_action (GeditDocument *doc)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->end_not_undoable_action (doc);
+}
+
+void
+gedit_document_set_text (GeditDocument *doc,
+ const gchar *text,
+ gint len)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (text != NULL);
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->set_text (doc, text, len);
+}
+
+void
+gedit_document_set_modified (GeditDocument *doc,
+ gboolean setting)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->set_modified (doc, setting);
+}
+
+gboolean
+gedit_document_get_modified (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_modified (doc);
+}
+
+gboolean
+gedit_document_get_has_selection (GeditDocument *doc)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_has_selection (doc);
+}
+
+/**
+ * gedit_document_get_metadata:
+ * @doc: a #GeditDocument
+ * @key: name of the key
+ *
+ * Gets the metadata assigned to @key.
+ *
+ * Returns: the value assigned to @key.
+ */
+gchar *
+gedit_document_get_metadata (GeditDocument *doc,
+ const gchar *key)
+{
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_metadata (doc, key);
+}
+
+void
+gedit_document_set_metadata_va_list (GeditDocument *doc,
+ const gchar *first_key,
+ va_list var_args)
+{
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (first_key != NULL);
+ GEDIT_DOCUMENT_GET_INTERFACE (doc)->set_metadata_va_list (doc, first_key,
+ var_args);
+}
+
+/**
+ * gedit_document_set_metadata:
+ * @doc: a #GeditDocument
+ * @first_key: name of the first key to set
+ * @...: value for the first key, followed optionally by more key/value pairs,
+ * followed by %NULL.
+ *
+ * Sets metadata on a document.
+ */
+void
+gedit_document_set_metadata (GeditDocument *doc,
+ const gchar *first_key,
+ ...)
+{
+ va_list var_args;
+
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (first_key != NULL);
+
+ va_start (var_args, first_key);
+
+ gedit_document_set_metadata_va_list (doc, first_key, var_args);
+
+ va_end (var_args);
+}
++
++/**
++ * gedit_document_set_readonly:
++ * @doc: a #GeditDocument
++ * @readonly: %TRUE to se the document as read-only
++ *
++ * If @readonly is %TRUE sets @doc as read-only.
++ */
++void
++gedit_document_set_readonly (GeditDocument *doc,
++ gboolean readonly)
++{
++ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
++ GEDIT_DOCUMENT_GET_INTERFACE (doc)->set_readonly (doc, readonly);
++}
++
++void
++gedit_document_set_newline_type (GeditDocument *doc,
++ GeditDocumentNewlineType newline_type)
++{
++ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
++ GEDIT_DOCUMENT_GET_INTERFACE (doc)->set_newline_type (doc, newline_type);
++}
++
++GeditDocumentNewlineType
++gedit_document_get_newline_type (GeditDocument *doc)
++{
++ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), GEDIT_DOCUMENT_NEWLINE_TYPE_DEFAULT);
++ return GEDIT_DOCUMENT_GET_INTERFACE (doc)->get_newline_type (doc);
++}
diff --cc gedit/gedit-document-interface.h
index 98cd1cd,a5d2730..83cccc9
--- a/gedit/gedit-document-interface.h
+++ b/gedit/gedit-document-interface.h
@@@ -59,12 -63,25 +59,17 @@@ typedef struct _GeditDocumentIface Gedi
typedef enum
{
- GEDIT_SEARCH_DONT_SET_FLAGS = 1 << 0,
- GEDIT_SEARCH_ENTIRE_WORD = 1 << 1,
- GEDIT_SEARCH_CASE_SENSITIVE = 1 << 2
+ GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+ GEDIT_DOCUMENT_NEWLINE_TYPE_CR,
+ GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF
+ } GeditDocumentNewlineType;
- } GeditSearchFlags;
+ #ifdef G_OS_WIN32
+ #define GEDIT_DOCUMENT_NEWLINE_TYPE_DEFAULT GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF
+ #else
+ #define GEDIT_DOCUMENT_NEWLINE_TYPE_DEFAULT GEDIT_DOCUMENT_NEWLINE_TYPE_LF
+ #endif
-typedef enum
-{
- GEDIT_SEARCH_DONT_SET_FLAGS = 1 << 0,
- GEDIT_SEARCH_ENTIRE_WORD = 1 << 1,
- GEDIT_SEARCH_CASE_SENSITIVE = 1 << 2
-
-} GeditSearchFlags;
-
/**
* GeditDocumentSaveFlags:
* @GEDIT_DOCUMENT_SAVE_IGNORE_MTIME: save file despite external modifications.
@@@ -112,83 -150,13 +117,91 @@@ struct _GeditDocumentIfac
void (* saved) (GeditDocument *document,
const GError *error);
+
+ /* Virtual table */
+
+ GFile * (* get_location) (GeditDocument *doc);
+
+ gchar * (* get_uri) (GeditDocument *doc);
+
+ void (* set_uri) (GeditDocument *doc,
+ const gchar *uri);
+
+ gchar * (* get_uri_for_display) (GeditDocument *doc);
+
+ gchar * (* get_short_name_for_display)
+ (GeditDocument *doc);
+
+ gchar * (* get_content_type) (GeditDocument *doc);
+
+ gchar * (* get_mime_type) (GeditDocument *doc);
+
+ gboolean (* get_readonly) (GeditDocument *doc);
- void (* search_highlight_updated)
- (GeditDocument *document,
- GtkTextIter *start,
- GtkTextIter *end);
-};
+ gboolean (* load_cancel) (GeditDocument *doc);
+
+ gboolean (* is_untouched) (GeditDocument *doc);
+ gboolean (* is_untitled) (GeditDocument *doc);
+
+ gboolean (* is_local) (GeditDocument *doc);
+
+ gboolean (* get_deleted) (GeditDocument *doc);
+
+ gboolean (* goto_line) (GeditDocument *doc,
+ gint line);
+ gboolean (* goto_line_offset) (GeditDocument *doc,
+ gint line,
+ gint line_offset);
+
+ const GeditEncoding * (* get_encoding)
+ (GeditDocument *doc);
+
+ glong (* get_seconds_since_last_save_or_load)
+ (GeditDocument *doc);
+
+ gboolean (* check_externally_modified)
+ (GeditDocument *doc);
+
+ /* GSV releated functions */
+
+ void (* undo) (GeditDocument *doc);
+ void (* redo) (GeditDocument *doc);
+
+ gboolean (* can_undo) (GeditDocument *doc);
+ gboolean (* can_redo) (GeditDocument *doc);
+
+ void (* begin_not_undoable_action) (GeditDocument *doc);
+ void (* end_not_undoable_action) (GeditDocument *doc);
+
+ /* GtkTextBuffer releated functions */
+
+ void (* set_text) (GeditDocument *doc,
+ const gchar *text,
+ gint len);
+
+ void (* set_modified) (GeditDocument *doc,
+ gboolean setting);
+
+ gboolean (* get_modified) (GeditDocument *doc);
+
+ gboolean (* get_has_selection) (GeditDocument *doc);
+
+ gchar * (* get_metadata) (GeditDocument *doc,
+ const gchar *key);
+
+ void (* set_metadata_va_list) (GeditDocument *doc,
+ const gchar *first_key,
+ va_list var_args);
++
++ void (* set_readonly) (GeditDocument *doc,
++ gboolean readonly);
++
++ void (* set_newline_type) (GeditDocument *doc,
++ GeditDocumentNewlineType newline_type);
++ GeditDocumentNewlineType (* get_newline_type)
++ (GeditDocument *doc);
+};
#define GEDIT_DOCUMENT_ERROR gedit_document_error_quark ()
@@@ -297,6 -283,47 +311,14 @@@ void gedit_document_set_metadata (Ged
const gchar *first_key,
...);
-/*
- * Non exported functions
- */
-void _gedit_document_set_readonly (GeditDocument *doc,
++void gedit_document_set_readonly (GeditDocument *doc,
+ gboolean readonly);
+
-glong _gedit_document_get_seconds_since_last_save_or_load
- (GeditDocument *doc);
-
-/* Note: this is a sync stat: use only on local files */
-gboolean _gedit_document_check_externally_modified
- (GeditDocument *doc);
-
-void _gedit_document_search_region (GeditDocument *doc,
- const GtkTextIter *start,
- const GtkTextIter *end);
-
-/* Search macros */
-#define GEDIT_SEARCH_IS_DONT_SET_FLAGS(sflags) ((sflags & GEDIT_SEARCH_DONT_SET_FLAGS) != 0)
-#define GEDIT_SEARCH_SET_DONT_SET_FLAGS(sflags,state) ((state == TRUE) ? \
-(sflags |= GEDIT_SEARCH_DONT_SET_FLAGS) : (sflags &= ~GEDIT_SEARCH_DONT_SET_FLAGS))
-
-#define GEDIT_SEARCH_IS_ENTIRE_WORD(sflags) ((sflags & GEDIT_SEARCH_ENTIRE_WORD) != 0)
-#define GEDIT_SEARCH_SET_ENTIRE_WORD(sflags,state) ((state == TRUE) ? \
-(sflags |= GEDIT_SEARCH_ENTIRE_WORD) : (sflags &= ~GEDIT_SEARCH_ENTIRE_WORD))
-
-#define GEDIT_SEARCH_IS_CASE_SENSITIVE(sflags) ((sflags & GEDIT_SEARCH_CASE_SENSITIVE) != 0)
-#define GEDIT_SEARCH_SET_CASE_SENSITIVE(sflags,state) ((state == TRUE) ? \
-(sflags |= GEDIT_SEARCH_CASE_SENSITIVE) : (sflags &= ~GEDIT_SEARCH_CASE_SENSITIVE))
-
-typedef GMountOperation *(*GeditMountOperationFactory)(GeditDocument *doc,
- gpointer userdata);
-
-void _gedit_document_set_mount_operation_factory
- (GeditDocument *doc,
- GeditMountOperationFactory callback,
- gpointer userdata);
-GMountOperation
- *_gedit_document_create_mount_operation
- (GeditDocument *doc);
++void gedit_document_set_newline_type(GeditDocument *doc,
++ GeditDocumentNewlineType newline_type);
++GeditDocumentNewlineType
++ gedit_document_get_newline_type(GeditDocument *doc);
+
G_END_DECLS
#endif /* __GEDIT_DOCUMENT_H__ */
diff --cc gedit/gedit-file-chooser-dialog.h
index 5900a34,090045c..44d40c1
--- a/gedit/gedit-file-chooser-dialog.h
+++ b/gedit/gedit-file-chooser-dialog.h
@@@ -34,6 -34,8 +34,8 @@@
#include <gtk/gtk.h>
#include <gedit/gedit-encodings.h>
+ #include <gedit/gedit-enum-types.h>
-#include <gedit/gedit-document.h>
++#include <gedit/gedit-document-interface.h>
G_BEGIN_DECLS
diff --cc gedit/gedit-io-error-message-area.c
index 8f3573e,2204d44..da5bb15
--- a/gedit/gedit-io-error-message-area.c
+++ b/gedit/gedit-io-error-message-area.c
@@@ -44,10 -44,10 +44,10 @@@
#include "gedit-utils.h"
#include "gedit-convert.h"
-#include "gedit-document.h"
+#include "gedit-document-interface.h"
#include "gedit-io-error-message-area.h"
#include "gedit-prefs-manager.h"
- #include <gedit/gedit-encodings-option-menu.h>
+ #include <gedit/gedit-encodings-combo-box.h>
#if !GTK_CHECK_VERSION (2, 17, 1)
#include "gedit-message-area.h"
diff --cc gedit/gedit-tab-label.c
index 9e9273f,7ccb129..b28447d
--- a/gedit/gedit-tab-label.c
+++ b/gedit/gedit-tab-label.c
@@@ -24,8 -28,11 +28,12 @@@
#include <gtk/gtk.h>
#include "gedit-tab-label.h"
#include "gedit-close-button.h"
+#include "gedit-view-container.h"
+ #ifdef BUILD_SPINNER
+ #include "gedit-spinner.h"
+ #endif
+
#define GEDIT_TAB_LABEL_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GEDIT_TYPE_TAB_LABEL, GeditTabLabelPrivate))
struct _GeditTabLabelPrivate
@@@ -86,26 -93,31 +94,34 @@@ close_button_clicked_cb (GtkWidget
}
static void
-sync_tip (GeditTab *tab, GeditTabLabel *tab_label)
++sync_tip (GeditViewContainer *container, GeditTabLabel *tab_label)
+ {
+ gchar *str;
+
- str = _gedit_tab_get_tooltips (tab);
++ str = _gedit_view_container_get_tooltips (container);
+ g_return_if_fail (str != NULL);
+
+ gtk_widget_set_tooltip_markup (tab_label->priv->ebox, str);
+ g_free (str);
+ }
+
+ static void
-sync_name (GeditTab *tab, GParamSpec *pspec, GeditTabLabel *tab_label)
+sync_name (GeditPage *page, GParamSpec *pspec, GeditTabLabel *tab_label)
{
+ GeditViewContainer *container;
gchar *str;
- g_return_if_fail (tab == tab_label->priv->tab);
+ g_return_if_fail (page == tab_label->priv->page);
- str = _gedit_tab_get_name (tab);
+ container = gedit_page_get_active_view_container (page);
+
+ str = _gedit_view_container_get_name (container);
g_return_if_fail (str != NULL);
gtk_label_set_text (GTK_LABEL (tab_label->priv->label), str);
g_free (str);
- str = _gedit_view_container_get_tooltips (container);
- g_return_if_fail (str != NULL);
-
- gtk_widget_set_tooltip_markup (tab_label->priv->ebox, str);
- g_free (str);
- sync_tip (tab, tab_label);
++ sync_tip (container, tab_label);
}
static void
@@@ -158,6 -168,9 +174,9 @@@ sync_state (GeditPage *page, GParamSpe
gtk_spinner_stop (GTK_SPINNER (tab_label->priv->spinner));
#endif
}
+
+ /* sync tip since encoding is known only after load/save end */
- sync_tip (tab, tab_label);
++ sync_tip (container, tab_label);
}
static void
diff --cc gedit/gedit-text-buffer.c
index 0cfe590,b35e952..2cc44e3
--- a/gedit/gedit-text-buffer.c
+++ b/gedit/gedit-text-buffer.c
@@@ -41,8 -41,8 +41,9 @@@
#include <gtksourceview/gtksourceiter.h>
#include "gedit-prefs-manager-app.h"
-#include "gedit-document.h"
+#include "gedit-document-interface.h"
+#include "gedit-text-buffer.h"
+ #include "gedit-convert.h"
#include "gedit-debug.h"
#include "gedit-utils.h"
#include "gedit-language-manager.h"
@@@ -88,23 -88,19 +89,21 @@@ static void gedit_text_buffer_save_rea
const gchar *uri,
const GeditEncoding *encoding,
GeditDocumentSaveFlags flags);
- static void gedit_text_buffer_set_readonly (GeditTextBuffer *doc,
- gboolean readonly);
-static void to_search_region_range (GeditDocument *doc,
- GtkTextIter *start,
+static void to_search_region_range (GeditTextBuffer *doc,
- GtkTextIter *start,
++ GtkTextIter *start,
GtkTextIter *end);
-static void insert_text_cb (GeditDocument *doc,
- GtkTextIter *pos,
- const gchar *text,
+static void insert_text_cb (GeditTextBuffer *doc,
+ GtkTextIter *pos,
+ const gchar *text,
gint length);
-static void delete_range_cb (GeditDocument *doc,
- GtkTextIter *start,
- GtkTextIter *end);
+static void delete_range_cb (GeditTextBuffer *doc,
+ GtkTextIter *start,
+ GtkTextIter *end);
-struct _GeditDocumentPrivate
+static void gedit_text_buffer_iface_init (GeditDocumentIface *iface);
+
+struct _GeditTextBufferPrivate
{
gchar *uri;
gint untitled_number;
@@@ -320,18 -330,24 +322,21 @@@ gedit_text_buffer_get_property (GObjec
case PROP_CONTENT_TYPE:
g_value_take_string (value, gedit_document_get_content_type (doc));
break;
- case PROP_MIME_TYPE:
- g_value_take_string (value, gedit_document_get_mime_type (doc));
- break;
case PROP_READ_ONLY:
- g_value_set_boolean (value, doc->priv->readonly);
+ g_value_set_boolean (value, buf->priv->readonly);
break;
case PROP_ENCODING:
- g_value_set_boxed (value, doc->priv->encoding);
+ g_value_set_boxed (value, buf->priv->encoding);
break;
case PROP_CAN_SEARCH_AGAIN:
- g_value_set_boolean (value, gedit_document_get_can_search_again (doc));
+ g_value_set_boolean (value, gedit_text_buffer_get_can_search_again (buf));
break;
case PROP_ENABLE_SEARCH_HIGHLIGHTING:
- g_value_set_boolean (value, gedit_document_get_enable_search_highlighting (doc));
+ g_value_set_boolean (value, gedit_text_buffer_get_enable_search_highlighting (buf));
break;
+ case PROP_NEWLINE_TYPE:
- g_value_set_enum (value, doc->priv->newline_type);
++ g_value_set_enum (value, buf->priv->newline_type);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@@ -349,8 -365,13 +354,13 @@@ gedit_text_buffer_set_property (GObjec
switch (prop_id)
{
case PROP_ENABLE_SEARCH_HIGHLIGHTING:
- gedit_document_set_enable_search_highlighting (doc,
- g_value_get_boolean (value));
+ gedit_text_buffer_set_enable_search_highlighting (doc,
+ g_value_get_boolean (value));
+ break;
+ case PROP_NEWLINE_TYPE:
- gedit_document_set_newline_type (doc,
++ gedit_document_set_newline_type (GEDIT_DOCUMENT (doc),
+ g_value_get_enum (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@@ -400,30 -421,57 +410,34 @@@ gedit_text_buffer_class_init (GeditText
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkTextBufferClass *buf_class = GTK_TEXT_BUFFER_CLASS (klass);
- object_class->dispose = gedit_document_dispose;
- object_class->finalize = gedit_document_finalize;
- object_class->get_property = gedit_document_get_property;
- object_class->set_property = gedit_document_set_property;
-
- buf_class->mark_set = gedit_document_mark_set;
- buf_class->changed = gedit_document_changed;
-
- klass->load = gedit_document_load_real;
- klass->save = gedit_document_save_real;
-
- g_object_class_install_property (object_class, PROP_URI,
- g_param_spec_string ("uri",
- "URI",
- "The document's URI",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (object_class, PROP_SHORTNAME,
- g_param_spec_string ("shortname",
- "Short Name",
- "The document's short name",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (object_class, PROP_CONTENT_TYPE,
- g_param_spec_string ("content-type",
- "Content Type",
- "The document's Content Type",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (object_class, PROP_MIME_TYPE,
- g_param_spec_string ("mime-type",
- "MIME Type",
- "The document's MIME Type",
- "text/plain",
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (object_class, PROP_READ_ONLY,
- g_param_spec_boolean ("read-only",
- "Read Only",
- "Whether the document is read only or not",
- FALSE,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+ object_class->dispose = gedit_text_buffer_dispose;
+ object_class->finalize = gedit_text_buffer_finalize;
+ object_class->get_property = gedit_text_buffer_get_property;
+ object_class->set_property = gedit_text_buffer_set_property;
+
+ buf_class->mark_set = gedit_text_buffer_mark_set;
+ buf_class->changed = gedit_text_buffer_changed;
+
+ g_object_class_override_property (object_class,
+ PROP_URI,
+ "uri");
+
+ g_object_class_override_property (object_class,
+ PROP_SHORTNAME,
+ "shortname");
+
+ g_object_class_override_property (object_class,
+ PROP_CONTENT_TYPE,
+ "content-type");
+
+ g_object_class_override_property (object_class,
+ PROP_READ_ONLY,
+ "read-only");
+
++ g_object_class_override_property (object_class,
++ PROP_NEWLINE_TYPE,
++ "newline-type");
+
g_object_class_install_property (object_class, PROP_ENCODING,
g_param_spec_boxed ("encoding",
"Encoding",
@@@ -998,335 -1131,14 +1012,362 @@@ gedit_text_buffer_check_externally_modi
g_file_info_get_modification_time (info, &timeval);
g_object_unref (info);
+
+ return (timeval.tv_sec > buf->priv->mtime.tv_sec) ||
+ (timeval.tv_sec == buf->priv->mtime.tv_sec &&
+ timeval.tv_usec > buf->priv->mtime.tv_usec);
+}
+
+static void
+gedit_text_buffer_undo_impl (GeditDocument *doc)
+{
+ gtk_source_buffer_undo (GTK_SOURCE_BUFFER (doc));
+}
+
+static void
+gedit_text_buffer_redo_impl (GeditDocument *doc)
+{
+ gtk_source_buffer_redo (GTK_SOURCE_BUFFER (doc));
+}
+
+static gboolean
+gedit_text_buffer_can_undo_impl (GeditDocument *doc)
+{
+ return gtk_source_buffer_can_undo (GTK_SOURCE_BUFFER (doc));
+}
+
+static gboolean
+gedit_text_buffer_can_redo_impl (GeditDocument *doc)
+{
+ return gtk_source_buffer_can_redo (GTK_SOURCE_BUFFER (doc));
+}
+
+static void
+gedit_text_buffer_begin_not_undoable_action_impl (GeditDocument *doc)
+{
+ gtk_source_buffer_begin_not_undoable_action (GTK_SOURCE_BUFFER (doc));
+}
+
+static void
+gedit_text_buffer_end_not_undoable_action_impl (GeditDocument *doc)
+{
+ gtk_source_buffer_end_not_undoable_action (GTK_SOURCE_BUFFER (doc));
+}
+
+static void
+gedit_text_buffer_set_text_impl (GeditDocument *doc,
+ const gchar *text,
+ gint len)
+{
+ gtk_text_buffer_set_text (GTK_TEXT_BUFFER (doc), text, len);
+}
+
+static void
+gedit_text_buffer_set_modified_impl (GeditDocument *doc,
+ gboolean setting)
+{
+ gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (doc), setting);
+}
+
+static gboolean
+gedit_text_buffer_get_modified_impl (GeditDocument *doc)
+{
+ return gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (doc));
+}
+
+static gboolean
+gedit_text_buffer_get_has_selection_impl (GeditDocument *doc)
+{
+ return gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc));
+}
+
+#ifdef G_OS_WIN32
+static gchar *
+gedit_text_buffer_get_metadata_impl (GeditDocument *doc,
+ const gchar *key)
+{
+ gchar *value = NULL;
+
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ if (doc->priv->uri != NULL)
+ value = gedit_metadata_manager_get (doc->priv->uri, key);
+
+ return value;
+}
+
+static void
+gedit_text_buffer_set_metadata_impl (GeditDocument *doc,
+ const gchar *first_key,
+ va_list var_args)
+{
+ const gchar *key;
+ const gchar *value;
+
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (first_key != NULL);
+
+ for (key = first_key; key; key = va_arg (var_args, const gchar *))
+ {
+ value = va_arg (var_args, const gchar *);
+
+ gedit_metadata_manager_set (doc->priv->uri,
+ key,
+ value);
+ }
+}
+
+#else
+
+static gchar *
+gedit_text_buffer_get_metadata_impl (GeditDocument *doc,
+ const gchar *key)
+{
+ GeditTextBuffer *buf = GEDIT_TEXT_BUFFER (doc);
+ gchar *value = NULL;
+
+ if (buf->priv->metadata_info && g_file_info_has_attribute (buf->priv->metadata_info,
+ key))
+ {
+ value = g_strdup (g_file_info_get_attribute_string (buf->priv->metadata_info,
+ key));
+ }
+
+ return value;
+}
+
+static void
+set_attributes_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer useless)
+{
+ g_file_set_attributes_finish (G_FILE (source),
+ res,
+ NULL,
+ NULL);
+}
+
+
+static void
+gedit_text_buffer_set_metadata_va_list_impl (GeditDocument *doc,
+ const gchar *first_key,
+ va_list var_args)
+{
+ GeditTextBuffer *buf = GEDIT_TEXT_BUFFER (doc);
+ const gchar *key;
+ const gchar *value;
+ GFileInfo *info;
+ GFile *location;
+
+ info = g_file_info_new ();
+
+ for (key = first_key; key; key = va_arg (var_args, const gchar *))
+ {
+ value = va_arg (var_args, const gchar *);
+
+ if (value != NULL)
+ {
+ g_file_info_set_attribute_string (info,
+ key, value);
+ }
+ else
+ {
+ /* Unset the key */
+ g_file_info_set_attribute (info, key,
+ G_FILE_ATTRIBUTE_TYPE_INVALID,
+ NULL);
+ }
+ }
+
+ if (buf->priv->metadata_info != NULL)
+ g_file_info_copy_into (info, buf->priv->metadata_info);
+
+ location = gedit_document_get_location (doc);
+
+ if (location != NULL)
+ {
+ g_file_set_attributes_async (location,
+ info,
+ G_FILE_QUERY_INFO_NONE,
+ G_PRIORITY_DEFAULT,
+ NULL,
+ set_attributes_cb,
+ NULL);
+
+ g_object_unref (location);
+ }
- return (timeval.tv_sec > doc->priv->mtime.tv_sec) ||
- (timeval.tv_sec == doc->priv->mtime.tv_sec &&
- timeval.tv_usec > doc->priv->mtime.tv_usec);
+ g_object_unref (info);
}
+#endif
++/* Note: do not emit the notify::read-only signal */
+ static void
-reset_temp_loading_data (GeditDocument *doc)
++set_readonly (GeditTextBuffer *doc,
++ gboolean readonly)
++{
++ gedit_debug (DEBUG_DOCUMENT);
++
++ readonly = (readonly != FALSE);
++
++ if (doc->priv->readonly == readonly)
++ return;
++
++ doc->priv->readonly = readonly;
++}
++
++static void
++gedit_text_buffer_set_readonly_impl (GeditDocument *doc,
++ gboolean readonly)
++{
++ GeditTextBuffer *buf = GEDIT_TEXT_BUFFER (doc);
++
++ gedit_debug (DEBUG_DOCUMENT);
++
++ set_readonly (buf, readonly);
++
++ g_object_notify (G_OBJECT (buf), "read-only");
++}
++
++static void
++gedit_text_buffer_set_newline_type_impl (GeditDocument *doc,
++ GeditDocumentNewlineType newline_type)
++{
++ GeditTextBuffer *buf = GEDIT_TEXT_BUFFER (doc);
++
++ if (buf->priv->newline_type != newline_type)
++ {
++ buf->priv->newline_type = newline_type;
++
++ g_object_notify (G_OBJECT (buf), "newline-type");
++ }
++}
++
++static GeditDocumentNewlineType
++gedit_text_buffer_get_newline_type_impl (GeditDocument *doc)
++{
++ GeditTextBuffer *buf = GEDIT_TEXT_BUFFER (doc);
++
++ return buf->priv->newline_type;
++}
++
+static void
+gedit_text_buffer_iface_init (GeditDocumentIface *iface)
+{
+ iface->get_location = gedit_text_buffer_get_location_impl;
+ iface->get_uri = gedit_text_buffer_get_uri_impl;
+ iface->set_uri = gedit_text_buffer_set_uri_impl;
+ iface->get_uri_for_display = gedit_text_buffer_get_uri_for_display_impl;
+ iface->get_short_name_for_display = gedit_text_buffer_get_short_name_for_display_impl;
+ iface->get_content_type = gedit_text_buffer_get_content_type_impl;
+ iface->get_mime_type = gedit_text_buffer_get_mime_type_impl;
+ iface->get_readonly = gedit_text_buffer_get_readonly_impl;
+ iface->load_cancel = gedit_text_buffer_load_cancel_impl;
+ iface->is_untouched = gedit_text_buffer_is_untouched_impl;
+ iface->is_untitled = gedit_text_buffer_is_untitled_impl;
+ iface->is_local = gedit_text_buffer_is_local_impl;
+ iface->get_deleted = gedit_text_buffer_get_deleted_impl;
+ iface->goto_line = gedit_text_buffer_goto_line_impl;
+ iface->goto_line_offset = gedit_text_buffer_goto_line_offset_impl;
+ iface->get_encoding = gedit_text_buffer_get_encoding_impl;
+ iface->get_seconds_since_last_save_or_load = gedit_text_buffer_get_seconds_since_last_save_or_load_impl;
+ iface->check_externally_modified = gedit_text_buffer_check_externally_modified_impl;
+ iface->undo = gedit_text_buffer_undo_impl;
+ iface->redo = gedit_text_buffer_redo_impl;
+ iface->can_undo = gedit_text_buffer_can_undo_impl;
+ iface->can_redo = gedit_text_buffer_can_redo_impl;
+ iface->begin_not_undoable_action = gedit_text_buffer_begin_not_undoable_action_impl;
+ iface->end_not_undoable_action = gedit_text_buffer_end_not_undoable_action_impl;
+ iface->set_text = gedit_text_buffer_set_text_impl;
+ iface->set_modified = gedit_text_buffer_set_modified_impl;
+ iface->get_modified = gedit_text_buffer_get_modified_impl;
+ iface->get_has_selection = gedit_text_buffer_get_has_selection_impl;
+ iface->get_metadata = gedit_text_buffer_get_metadata_impl;
+ iface->set_metadata_va_list = gedit_text_buffer_set_metadata_va_list_impl;
++ iface->set_readonly = gedit_text_buffer_set_readonly_impl;
++ iface->set_newline_type = gedit_text_buffer_set_newline_type_impl;
++ iface->get_newline_type = gedit_text_buffer_get_newline_type_impl;
+
+ /* signals */
+ iface->load = gedit_text_buffer_load_real;
+ iface->save = gedit_text_buffer_save_real;
+}
+
+static void
+gedit_text_buffer_init (GeditTextBuffer *doc)
+{
+ GtkSourceStyleScheme *style_scheme;
+
+ gedit_debug (DEBUG_DOCUMENT);
+
+ doc->priv = GEDIT_TEXT_BUFFER_GET_PRIVATE (doc);
+
+ doc->priv->uri = NULL;
+ doc->priv->untitled_number = get_untitled_number ();
+
+ doc->priv->metadata_info = NULL;
+
+ doc->priv->content_type = g_content_type_from_mime_type ("text/plain");
+
+ doc->priv->readonly = FALSE;
+
+ doc->priv->stop_cursor_moved_emission = FALSE;
+
+ doc->priv->last_save_was_manually = TRUE;
+ doc->priv->language_set_by_user = FALSE;
+
+ doc->priv->dispose_has_run = FALSE;
+
+ doc->priv->mtime.tv_sec = 0;
+ doc->priv->mtime.tv_usec = 0;
+
+ g_get_current_time (&doc->priv->time_of_last_save_or_load);
+
+ doc->priv->encoding = gedit_encoding_get_utf8 ();
+
++ doc->priv->newline_type = GEDIT_DOCUMENT_NEWLINE_TYPE_DEFAULT;
++
+ gtk_source_buffer_set_max_undo_levels (GTK_SOURCE_BUFFER (doc),
+ gedit_prefs_manager_get_undo_actions_limit ());
+
+ gtk_source_buffer_set_highlight_matching_brackets (GTK_SOURCE_BUFFER (doc),
+ gedit_prefs_manager_get_bracket_matching ());
+
+ gedit_text_buffer_set_enable_search_highlighting (doc,
+ gedit_prefs_manager_get_enable_search_highlighting ());
+
+ style_scheme = get_default_style_scheme ();
+ if (style_scheme != NULL)
+ gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (doc),
+ style_scheme);
+
+ g_signal_connect_after (doc,
+ "insert-text",
+ G_CALLBACK (insert_text_cb),
+ NULL);
+
+ g_signal_connect_after (doc,
+ "delete-range",
+ G_CALLBACK (delete_range_cb),
+ NULL);
+
+ g_signal_connect (doc,
+ "notify::content-type",
+ G_CALLBACK (on_content_type_changed),
+ NULL);
+}
+
+GeditDocument *
+gedit_text_buffer_new (void)
+{
+ gedit_debug (DEBUG_DOCUMENT);
+
+ return GEDIT_DOCUMENT (g_object_new (GEDIT_TYPE_TEXT_BUFFER, NULL));
+}
+
- /* Note: do not emit the notify::read-only signal */
- static void
- set_readonly (GeditTextBuffer *doc,
- gboolean readonly)
- {
- gedit_debug (DEBUG_DOCUMENT);
-
- readonly = (readonly != FALSE);
-
- if (doc->priv->readonly == readonly)
- return;
-
- doc->priv->readonly = readonly;
- }
-
- static void
- gedit_text_buffer_set_readonly (GeditTextBuffer *doc,
- gboolean readonly)
- {
- gedit_debug (DEBUG_DOCUMENT);
-
- g_return_if_fail (GEDIT_IS_TEXT_BUFFER (doc));
-
- set_readonly (doc, readonly);
-
- g_object_notify (G_OBJECT (doc), "read-only");
- }
-
+static void
+reset_temp_loading_data (GeditTextBuffer *doc)
{
/* the loader has been used, throw it away */
g_object_unref (doc->priv->loader);
@@@ -1339,10 -1151,10 +1380,10 @@@
static void
document_loader_loaded (GeditDocumentLoader *loader,
const GError *error,
- GeditDocument *doc)
+ GeditTextBuffer *doc)
{
/* load was successful */
- if (error == NULL)
+ if (error == NULL || error->code == GEDIT_DOCUMENT_ERROR_CONVERSION_FALLBACK)
{
GtkTextIter iter;
GFileInfo *info;
@@@ -1375,9 -1187,13 +1416,13 @@@
set_encoding (doc,
gedit_document_loader_get_encoding (loader),
(doc->priv->requested_encoding != NULL));
-
+
+
set_content_type (doc, content_type);
- gedit_document_set_newline_type (doc,
++ gedit_document_set_newline_type (GEDIT_DOCUMENT (doc),
+ gedit_document_loader_get_newline_type (loader));
+
/* move the cursor at the requested line if any */
if (doc->priv->requested_line_pos > 0)
{
@@@ -1542,7 -1399,7 +1587,7 @@@ document_saver_saving (GeditDocumentSav
g_get_current_time (&doc->priv->time_of_last_save_or_load);
- gedit_text_buffer_set_readonly (doc, FALSE);
- _gedit_document_set_readonly (doc, FALSE);
++ gedit_document_set_readonly (GEDIT_DOCUMENT (doc), FALSE);
gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (doc),
FALSE);
@@@ -1578,19 -1437,19 +1623,21 @@@
}
static void
-gedit_document_save_real (GeditDocument *doc,
- const gchar *uri,
- const GeditEncoding *encoding,
- GeditDocumentSaveFlags flags)
+gedit_text_buffer_save_real (GeditDocument *doc,
+ const gchar *uri,
+ const GeditEncoding *encoding,
+ GeditDocumentSaveFlags flags)
{
- g_return_if_fail (doc->priv->saver == NULL);
+ GeditTextBuffer *buf = GEDIT_TEXT_BUFFER (doc);
+
+ g_return_if_fail (buf->priv->saver == NULL);
/* create a saver, it will be destroyed once saving is complete */
- buf->priv->saver = gedit_document_saver_new (doc, uri, encoding, flags);
- doc->priv->saver = gedit_document_saver_new (doc, uri, encoding,
- doc->priv->newline_type,
++ buf->priv->saver = gedit_document_saver_new (doc, uri, encoding,
++ buf->priv->newline_type,
+ flags);
- g_signal_connect (doc->priv->saver,
+ g_signal_connect (buf->priv->saver,
"saving",
G_CALLBACK (document_saver_saving),
doc);
diff --cc gedit/gedit-text-buffer.h
index 85eeba2,0000000..7d1152c
mode 100644,000000..100644
--- a/gedit/gedit-text-buffer.h
+++ b/gedit/gedit-text-buffer.h
@@@ -1,172 -1,0 +1,178 @@@
+/*
+ * gedit-document.h
+ * 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$
+ */
+
+#ifndef __GEDIT_TEXT_BUFFER_H__
+#define __GEDIT_TEXT_BUFFER_H__
+
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+#include <gtksourceview/gtksourcebuffer.h>
+
+
+G_BEGIN_DECLS
+
+/*
+ * Type checking and casting macros
+ */
+#define GEDIT_TYPE_TEXT_BUFFER (gedit_text_buffer_get_type())
+#define GEDIT_TEXT_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GEDIT_TYPE_TEXT_BUFFER, GeditTextBuffer))
+#define GEDIT_TEXT_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GEDIT_TYPE_TEXT_BUFFER, GeditTextBufferClass))
+#define GEDIT_IS_TEXT_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GEDIT_TYPE_TEXT_BUFFER))
+#define GEDIT_IS_TEXT_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEDIT_TYPE_TEXT_BUFFER))
+#define GEDIT_TEXT_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GEDIT_TYPE_TEXT_BUFFER, GeditTextBufferClass))
+
++typedef enum
++{
++ GEDIT_SEARCH_DONT_SET_FLAGS = 1 << 0,
++ GEDIT_SEARCH_ENTIRE_WORD = 1 << 1,
++ GEDIT_SEARCH_CASE_SENSITIVE = 1 << 2
++} GeditSearchFlags;
+
+/* Private structure type */
+typedef struct _GeditTextBufferPrivate GeditTextBufferPrivate;
+
+/*
+ * Main object structure
+ */
+typedef struct _GeditTextBuffer GeditTextBuffer;
+
+struct _GeditTextBuffer
+{
+ GtkSourceBuffer buffer;
+
+ /*< private > */
+ GeditTextBufferPrivate *priv;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _GeditTextBufferClass GeditTextBufferClass;
+
+struct _GeditTextBufferClass
+{
+ GtkSourceBufferClass parent_class;
+
+ /* signals */
+ void (* cursor_moved) (GeditTextBuffer *document);
+
+ void (* search_highlight_updated)
+ (GeditTextBuffer *document,
+ GtkTextIter *start,
+ GtkTextIter *end);
+};
+
+
+GType gedit_text_buffer_get_type (void) G_GNUC_CONST;
+
+GeditDocument *gedit_text_buffer_new (void);
+
+void gedit_text_buffer_set_search_text (GeditTextBuffer *doc,
+ const gchar *text,
+ guint flags);
+
+gchar *gedit_text_buffer_get_search_text (GeditTextBuffer *doc,
+ guint *flags);
+
+gboolean gedit_text_buffer_get_can_search_again (GeditTextBuffer *doc);
+
+gboolean gedit_text_buffer_search_forward (GeditTextBuffer *doc,
+ const GtkTextIter *start,
+ const GtkTextIter *end,
+ GtkTextIter *match_start,
+ GtkTextIter *match_end);
+
+gboolean gedit_text_buffer_search_backward (GeditTextBuffer *doc,
+ const GtkTextIter *start,
+ const GtkTextIter *end,
+ GtkTextIter *match_start,
+ GtkTextIter *match_end);
+
+gint gedit_text_buffer_replace_all (GeditTextBuffer *doc,
+ const gchar *find,
+ const gchar *replace,
+ guint flags);
+
+void gedit_text_buffer_set_language (GeditTextBuffer *doc,
+ GtkSourceLanguage *lang);
+GtkSourceLanguage
+ *gedit_text_buffer_get_language (GeditTextBuffer *doc);
+
+void gedit_text_buffer_set_enable_search_highlighting
+ (GeditTextBuffer *doc,
+ gboolean enable);
+
+gboolean gedit_text_buffer_get_enable_search_highlighting
+ (GeditTextBuffer *doc);
+
+void gedit_text_buffer_get_cursor_position (GeditTextBuffer *buffer,
+ gint tab_size,
+ gint *row,
+ gint *col);
+
+/*
+ * Non exported functions
+ */
+
+/* Note: this is a sync stat: use only on local files */
+void _gedit_text_buffer_search_region (GeditTextBuffer *doc,
+ const GtkTextIter *start,
+ const GtkTextIter *end);
+
+/* Search macros */
+#define GEDIT_SEARCH_IS_DONT_SET_FLAGS(sflags) ((sflags & GEDIT_SEARCH_DONT_SET_FLAGS) != 0)
+#define GEDIT_SEARCH_SET_DONT_SET_FLAGS(sflags,state) ((state == TRUE) ? \
+(sflags |= GEDIT_SEARCH_DONT_SET_FLAGS) : (sflags &= ~GEDIT_SEARCH_DONT_SET_FLAGS))
+
+#define GEDIT_SEARCH_IS_ENTIRE_WORD(sflags) ((sflags & GEDIT_SEARCH_ENTIRE_WORD) != 0)
+#define GEDIT_SEARCH_SET_ENTIRE_WORD(sflags,state) ((state == TRUE) ? \
+(sflags |= GEDIT_SEARCH_ENTIRE_WORD) : (sflags &= ~GEDIT_SEARCH_ENTIRE_WORD))
+
+#define GEDIT_SEARCH_IS_CASE_SENSITIVE(sflags) ((sflags & GEDIT_SEARCH_CASE_SENSITIVE) != 0)
+#define GEDIT_SEARCH_SET_CASE_SENSITIVE(sflags,state) ((state == TRUE) ? \
+(sflags |= GEDIT_SEARCH_CASE_SENSITIVE) : (sflags &= ~GEDIT_SEARCH_CASE_SENSITIVE))
+
+/* FIXME
+typedef GMountOperation *(*GeditMountOperationFactory)(GeditTextBuffer *doc,
+ gpointer userdata);
+
+void _gedit_text_buffer_set_mount_operation_factory
+ (GeditTextBuffer *doc,
+ GeditMountOperationFactory callback,
+ gpointer userdata);
+GMountOperation
+ *_gedit_text_buffer_create_mount_operation
+ (GeditTextBuffer *doc);*/
+
+G_END_DECLS
+
+#endif /* __GEDIT_TEXT_BUFFER_H__ */
diff --cc gedit/gedit-view-container.c
index 3a1f518,0000000..be76b57
mode 100644,000000..100644
--- a/gedit/gedit-view-container.c
+++ b/gedit/gedit-view-container.c
@@@ -1,3060 -1,0 +1,3055 @@@
+/*
+ * gedit-view-container.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 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, 2005. See the AUTHORS file for a
+ * list of people on the gedit Team.
+ * See the ChangeLog files for a list of changes.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#include "gedit-app.h"
+#include "gedit-notebook.h"
+#include "gedit-view-container.h"
+#include "gedit-utils.h"
+#include "gedit-io-error-message-area.h"
+#include "gedit-print-job.h"
+#include "gedit-print-preview.h"
+#include "gedit-progress-message-area.h"
+#include "gedit-debug.h"
+#include "gedit-prefs-manager-app.h"
+#include "gedit-convert.h"
+#include "gedit-enum-types.h"
+#include "gedit-text-view.h"
+#include "gedit-web-view.h"
+
+#if !GTK_CHECK_VERSION (2, 17, 1)
+#include "gedit-message-area.h"
+#endif
+
+#define GEDIT_VIEW_CONTAINER_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), GEDIT_TYPE_VIEW_CONTAINER,\
+ GeditViewContainerPrivate))
+
+#define GEDIT_VIEW_CONTAINER_KEY "GEDIT_VIEW_CONTAINER_KEY"
+
+struct _GeditViewContainerPrivate
+{
+ GeditViewContainerState state;
+ GeditViewContainerMode mode;
+
+ GeditDocument *doc;
+
+ GtkWidget *notebook;
+ GList *views;
+ GtkWidget *active_view;
+ GtkWidget *active_view_scrolled_window;
+
+ GtkWidget *message_area;
+ GtkWidget *print_preview;
+
+ GeditPrintJob *print_job;
+
+ /* tmp data for saving */
+ gchar *tmp_save_uri;
+
+ /* tmp data for loading */
+ gint tmp_line_pos;
+ const GeditEncoding *tmp_encoding;
+
+ GTimer *timer;
+ guint times_called;
+
+ GeditDocumentSaveFlags save_flags;
+
+ gint auto_save_interval;
+ guint auto_save_timeout;
+
+ gint not_editable : 1;
+ gint auto_save : 1;
+
+ gint ask_if_externally_modified : 1;
+};
+
+/* Signals */
+enum
+{
+ VIEW_ADDED,
+ VIEW_REMOVED,
+ ACTIVE_VIEW_CHANGED,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE(GeditViewContainer, gedit_view_container, GTK_TYPE_VBOX)
+
+enum
+{
+ PROP_0,
+ PROP_DOCUMENT,
+ PROP_MODE,
+ PROP_NAME,
+ PROP_STATE,
+ PROP_AUTO_SAVE,
+ PROP_AUTO_SAVE_INTERVAL
+};
+
+static gboolean gedit_view_container_auto_save (GeditViewContainer *container);
+
+static void
+install_auto_save_timeout (GeditViewContainer *container)
+{
+ gint timeout;
+
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ g_return_if_fail (container->priv->auto_save_timeout <= 0);
+ g_return_if_fail (container->priv->auto_save);
+ g_return_if_fail (container->priv->auto_save_interval > 0);
+
+ g_return_if_fail (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_LOADING);
+ g_return_if_fail (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_SAVING);
+ g_return_if_fail (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_REVERTING);
+ g_return_if_fail (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR);
+ g_return_if_fail (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR);
+ g_return_if_fail (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR);
+ g_return_if_fail (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR);
+
+ /* Add a new timeout */
+ timeout = g_timeout_add_seconds (container->priv->auto_save_interval * 60,
+ (GSourceFunc) gedit_view_container_auto_save,
+ container);
+
+ container->priv->auto_save_timeout = timeout;
+}
+
+static gboolean
+install_auto_save_timeout_if_needed (GeditViewContainer *container)
+{
+ GeditDocument *doc;
+
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ g_return_val_if_fail (container->priv->auto_save_timeout <= 0, FALSE);
+ g_return_val_if_fail ((container->priv->state == GEDIT_VIEW_CONTAINER_STATE_NORMAL) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_CLOSING), FALSE);
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_CLOSING)
+ return FALSE;
+
+ doc = gedit_view_container_get_document (container);
+
+ if (container->priv->auto_save &&
+ !gedit_document_is_untitled (doc) &&
+ !gedit_document_get_readonly (doc))
+ {
+ install_auto_save_timeout (container);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+remove_auto_save_timeout (GeditViewContainer *container)
+{
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ /* FIXME: check sugli stati */
+
+ g_return_if_fail (container->priv->auto_save_timeout > 0);
+
+ g_source_remove (container->priv->auto_save_timeout);
+ container->priv->auto_save_timeout = 0;
+}
+
+static void
+gedit_view_container_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GeditViewContainer *container = GEDIT_VIEW_CONTAINER (object);
+
+ switch (prop_id)
+ {
+ case PROP_DOCUMENT:
+ g_value_take_object (value,
+ gedit_view_container_get_document (container));
+ break;
+ case PROP_MODE:
+ g_value_set_enum (value,
+ gedit_view_container_get_mode (container));
+ break;
+ case PROP_NAME:
+ g_value_take_string (value,
+ _gedit_view_container_get_name (container));
+ break;
+ case PROP_STATE:
+ g_value_set_enum (value,
+ gedit_view_container_get_state (container));
+ break;
+ case PROP_AUTO_SAVE:
+ g_value_set_boolean (value,
+ gedit_view_container_get_auto_save_enabled (container));
+ break;
+ case PROP_AUTO_SAVE_INTERVAL:
+ g_value_set_int (value,
+ gedit_view_container_get_auto_save_interval (container));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gedit_view_container_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GeditViewContainer *container = GEDIT_VIEW_CONTAINER (object);
+
+ switch (prop_id)
+ {
+ case PROP_AUTO_SAVE:
+ gedit_view_container_set_auto_save_enabled (container,
+ g_value_get_boolean (value));
+ break;
+ case PROP_AUTO_SAVE_INTERVAL:
+ gedit_view_container_set_auto_save_interval (container,
+ g_value_get_int (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gedit_view_container_finalize (GObject *object)
+{
+ GeditViewContainer *container = GEDIT_VIEW_CONTAINER (object);
+
+ if (container->priv->timer != NULL)
+ g_timer_destroy (container->priv->timer);
+
+ g_free (container->priv->tmp_save_uri);
+
+ if (container->priv->auto_save_timeout > 0)
+ remove_auto_save_timeout (container);
+
+ g_list_free (container->priv->views);
+
+ G_OBJECT_CLASS (gedit_view_container_parent_class)->finalize (object);
+}
+
+static void
+gedit_view_container_class_init (GeditViewContainerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gedit_view_container_finalize;
+ object_class->get_property = gedit_view_container_get_property;
+ object_class->set_property = gedit_view_container_set_property;
+
+ g_object_class_install_property (object_class,
+ PROP_DOCUMENT,
+ g_param_spec_object ("document",
+ "Document",
+ "The container's document",
+ GEDIT_TYPE_DOCUMENT,
+ G_PARAM_READABLE));
+
+ g_object_class_install_property (object_class,
+ PROP_MODE,
+ g_param_spec_enum ("mode",
+ "Mode",
+ "The container's mode",
+ GEDIT_TYPE_VIEW_CONTAINER_MODE,
+ GEDIT_VIEW_CONTAINER_MODE_TEXT,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_NAME,
+ g_param_spec_string ("name",
+ "Name",
+ "The container's name",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_STATE,
+ g_param_spec_enum ("state",
+ "State",
+ "The container's state",
+ GEDIT_TYPE_VIEW_CONTAINER_STATE,
+ GEDIT_VIEW_CONTAINER_STATE_NORMAL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_AUTO_SAVE,
+ g_param_spec_boolean ("autosave",
+ "Autosave",
+ "Autosave feature",
+ TRUE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_AUTO_SAVE_INTERVAL,
+ g_param_spec_int ("autosave-interval",
+ "AutosaveInterval",
+ "Time between two autosaves",
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ signals[VIEW_ADDED] =
+ g_signal_new ("view-added",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GeditViewContainerClass, view_added),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1,
+ GEDIT_TYPE_VIEW);
+
+ signals[VIEW_ADDED] =
+ g_signal_new ("view-removed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GeditViewContainerClass, view_removed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1,
+ GEDIT_TYPE_VIEW);
+
+ signals[ACTIVE_VIEW_CHANGED] =
+ g_signal_new ("active-view-changed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GeditViewContainerClass, active_view_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1,
+ GEDIT_TYPE_VIEW);
+
+ g_type_class_add_private (object_class, sizeof (GeditViewContainerPrivate));
+}
+
+/**
+ * gedit_view_container_get_state:
+ * @container: a #GeditViewContainer
+ *
+ * Gets the #GeditViewContainerState of @container.
+ *
+ * Returns: the #GeditViewContainerState of @container
+ */
+GeditViewContainerState
+gedit_view_container_get_state (GeditViewContainer *container)
+{
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ return container->priv->state;
+}
+
+GeditViewContainerMode
+gedit_view_container_get_mode (GeditViewContainer *container)
+{
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), GEDIT_VIEW_CONTAINER_MODE_TEXT);
+
+ return container->priv->mode;
+}
+
+static void
+set_cursor_according_to_state (GtkTextView *view,
+ GeditViewContainerState state)
+{
+ GdkCursor *cursor;
+ GdkWindow *text_window;
+ GdkWindow *left_window;
+
+ text_window = gtk_text_view_get_window (view, GTK_TEXT_WINDOW_TEXT);
+ left_window = gtk_text_view_get_window (view, GTK_TEXT_WINDOW_LEFT);
+
+ if ((state == GEDIT_VIEW_CONTAINER_STATE_LOADING) ||
+ (state == GEDIT_VIEW_CONTAINER_STATE_REVERTING) ||
+ (state == GEDIT_VIEW_CONTAINER_STATE_SAVING) ||
+ (state == GEDIT_VIEW_CONTAINER_STATE_PRINTING) ||
+ (state == GEDIT_VIEW_CONTAINER_STATE_PRINT_PREVIEWING) ||
+ (state == GEDIT_VIEW_CONTAINER_STATE_CLOSING))
+ {
+ cursor = gdk_cursor_new_for_display (
+ gtk_widget_get_display (GTK_WIDGET (view)),
+ GDK_WATCH);
+
+ if (text_window != NULL)
+ gdk_window_set_cursor (text_window, cursor);
+ if (left_window != NULL)
+ gdk_window_set_cursor (left_window, cursor);
+
+ gdk_cursor_unref (cursor);
+ }
+ else
+ {
+ cursor = gdk_cursor_new_for_display (
+ gtk_widget_get_display (GTK_WIDGET (view)),
+ GDK_XTERM);
+
+ if (text_window != NULL)
+ gdk_window_set_cursor (text_window, cursor);
+ if (left_window != NULL)
+ gdk_window_set_cursor (left_window, NULL);
+
+ gdk_cursor_unref (cursor);
+ }
+}
+
+static void
+view_realized (GtkWidget *view,
+ GeditViewContainer *container)
+{
+ /* FIXME: Maybe we should take care of all views? */
+ if (GTK_IS_TEXT_VIEW (view))
+ set_cursor_according_to_state (GTK_TEXT_VIEW (view), container->priv->state);
+}
+
+static void
+set_view_properties_according_to_state (GeditViewContainer *container,
+ GeditViewContainerState state)
+{
+ gboolean val;
+
+ val = ((state == GEDIT_VIEW_CONTAINER_STATE_NORMAL) &&
+ (container->priv->print_preview == NULL) &&
+ !container->priv->not_editable);
+ gedit_view_set_editable (GEDIT_VIEW (container->priv->active_view), val);
+
+ if (GEDIT_IS_TEXT_VIEW (GEDIT_TEXT_VIEW (container->priv->active_view)))
+ {
+ val = ((state != GEDIT_VIEW_CONTAINER_STATE_LOADING) &&
+ (state != GEDIT_VIEW_CONTAINER_STATE_CLOSING));
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (container->priv->active_view), val);
+
+
+ val = ((state != GEDIT_VIEW_CONTAINER_STATE_LOADING) &&
+ (state != GEDIT_VIEW_CONTAINER_STATE_CLOSING) &&
+ (gedit_prefs_manager_get_highlight_current_line ()));
+ gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (container->priv->active_view), val);
+ }
+}
+
+static void
+gedit_view_container_set_state (GeditViewContainer *container,
+ GeditViewContainerState state)
+{
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+ g_return_if_fail ((state >= 0) && (state < GEDIT_VIEW_CONTAINER_NUM_OF_STATES));
+
+ if (container->priv->state == state)
+ return;
+
+ container->priv->state = state;
+
+ set_view_properties_according_to_state (container, state);
+
+ if ((state == GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR) || /* FIXME: add other states if needed */
+ (state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW))
+ {
+ gtk_widget_hide (container->priv->active_view_scrolled_window);
+ }
+ else
+ {
+ if (container->priv->print_preview == NULL)
+ gtk_widget_show (container->priv->active_view_scrolled_window);
+ }
+
+ /* FIXME: Should we take care of all views? */
+ if (GTK_IS_TEXT_VIEW (container->priv->active_view))
+ set_cursor_according_to_state (GTK_TEXT_VIEW (container->priv->active_view),
+ state);
+
+ g_object_notify (G_OBJECT (container), "state");
+}
+
+static void
+document_uri_notify_handler (GeditDocument *document,
+ GParamSpec *pspec,
+ GeditViewContainer *container)
+{
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ /* Notify the change in the URI */
+ g_object_notify (G_OBJECT (container), "name");
+}
+
+static void
+document_modified_changed (GtkTextBuffer *document,
+ GeditViewContainer *container)
+{
+ g_object_notify (G_OBJECT (container), "name");
+}
+
+static void
+set_message_area (GeditViewContainer *container,
+ GtkWidget *message_area)
+{
+ if (container->priv->message_area == message_area)
+ return;
+
+ if (container->priv->message_area != NULL)
+ gtk_widget_destroy (container->priv->message_area);
+
+ container->priv->message_area = message_area;
+
+ if (message_area == NULL)
+ return;
+
+ gtk_box_pack_start (GTK_BOX (container),
+ container->priv->message_area,
+ FALSE,
+ FALSE,
+ 0);
+
+ g_object_add_weak_pointer (G_OBJECT (container->priv->message_area),
+ (gpointer *)&container->priv->message_area);
+}
+
+/* FIXME: This can't be here when we add GeditPage */
+static void
+remove_container (GeditViewContainer *container)
+{
+ /*GeditNotebook *notebook;
+
+ notebook = GEDIT_NOTEBOOK (gtk_widget_get_parent (GTK_WIDGET (container)));
+
+ gedit_notebook_remove_page (notebook, container);*/
+}
+
+static void
+io_loading_error_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
- if (response_id == GTK_RESPONSE_OK)
- {
- GeditDocument *doc;
- gchar *uri;
-
- doc = gedit_view_container_get_document (container);
- g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
-
- uri = gedit_document_get_uri (doc);
- g_return_if_fail (uri != NULL);
-
- set_message_area (container, NULL);
- gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_LOADING);
-
- g_return_if_fail (container->priv->auto_save_timeout <= 0);
-
- gedit_document_load (doc,
- uri,
- container->priv->tmp_encoding,
- container->priv->tmp_line_pos,
- FALSE);
- }
- else
- {
- remove_container (container);
- }
- }
-
- static void
- conversion_loading_error_message_area_response (GtkWidget *message_area,
- gint response_id,
- GeditViewContainer *container)
- {
+ GeditDocument *doc;
++ GeditView *view;
+ gchar *uri;
++ const GeditEncoding *encoding;
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
++ view = gedit_view_container_get_view (container);
++ g_return_if_fail (GEDIT_IS_VIEW (view));
++
+ uri = gedit_document_get_uri (doc);
+ g_return_if_fail (uri != NULL);
+
- if (response_id == GTK_RESPONSE_OK)
++ switch (response_id)
+ {
- const GeditEncoding *encoding;
++ case GTK_RESPONSE_OK:
++ encoding = gedit_conversion_error_message_area_get_encoding (
++ GTK_WIDGET (message_area));
+
- encoding = gedit_conversion_error_message_area_get_encoding (
- GTK_WIDGET (message_area));
-
- g_return_if_fail (encoding != NULL);
-
- set_message_area (container, NULL);
- gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_LOADING);
++ if (encoding != NULL)
++ {
++ container->priv->tmp_encoding = encoding;
++ }
+
- container->priv->tmp_encoding = encoding;
++ set_message_area (container, NULL);
++ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_LOADING);
+
- g_return_if_fail (container->priv->auto_save_timeout <= 0);
++ g_return_if_fail (container->priv->auto_save_timeout <= 0);
+
- gedit_document_load (doc,
- uri,
- encoding,
- container->priv->tmp_line_pos,
- FALSE);
- }
- else
- {
- _gedit_recent_remove (GEDIT_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))), uri);
++ gedit_document_load (doc,
++ uri,
++ container->priv->tmp_encoding,
++ container->priv->tmp_line_pos,
++ FALSE);
++ break;
++ case GTK_RESPONSE_YES:
++ /* This means that we want to edit the document anyway */
++ set_message_area (container, NULL);
++ gedit_document_set_readonly (doc, FALSE);
++ break;
++ case GTK_RESPONSE_NO:
++ /* We don't want to edit the document just show it */
++ set_message_area (container, NULL);
++ break;
++ default:
++ _gedit_recent_remove (GEDIT_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))), uri);
+
- remove_container (container);
++ remove_container (container);
++ break;
+ }
-
- g_free (uri);
+}
+
+static void
+file_already_open_warning_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ GeditView *view;
+
+ view = gedit_view_container_get_view (container);
+
+ if (response_id == GTK_RESPONSE_YES)
+ {
+ container->priv->not_editable = FALSE;
+
+ gedit_view_set_editable (GEDIT_VIEW (view),
+ TRUE);
+ }
+
+ gtk_widget_destroy (message_area);
+
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+}
+
+static void
+load_cancelled (GtkWidget *area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ g_return_if_fail (GEDIT_IS_PROGRESS_MESSAGE_AREA (container->priv->message_area));
+
+ g_object_ref (container);
+ gedit_document_load_cancel (gedit_view_container_get_document (container));
+ g_object_unref (container);
+}
+
+static void
+unrecoverable_reverting_error_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ GeditView *view;
+
+ gedit_view_container_set_state (container,
+ GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ set_message_area (container, NULL);
+
+ view = gedit_view_container_get_view (container);
+
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+
+ install_auto_save_timeout_if_needed (container);
+}
+
+#define MAX_MSG_LENGTH 100
+
+static void
+show_loading_message_area (GeditViewContainer *container)
+{
+ GtkWidget *area;
+ GeditDocument *doc = NULL;
+ gchar *name;
+ gchar *dirname = NULL;
+ gchar *msg = NULL;
+ gchar *name_markup;
+ gchar *dirname_markup;
+ gint len;
+
+ if (container->priv->message_area != NULL)
+ return;
+
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (doc != NULL);
+
+ name = gedit_document_get_short_name_for_display (doc);
+ len = g_utf8_strlen (name, -1);
+
+ /* if the name is awfully long, truncate it and be done with it,
+ * otherwise also show the directory (ellipsized if needed)
+ */
+ if (len > MAX_MSG_LENGTH)
+ {
+ gchar *str;
+
+ str = gedit_utils_str_middle_truncate (name, MAX_MSG_LENGTH);
+ g_free (name);
+ name = str;
+ }
+ else
+ {
+ GFile *file;
+
+ file = gedit_document_get_location (doc);
+ if (file != NULL)
+ {
+ gchar *str;
+
+ str = gedit_utils_location_get_dirname_for_display (file);
+ g_object_unref (file);
+
+ /* use the remaining space for the dir, but use a min of 20 chars
+ * so that we do not end up with a dirname like "(a...b)".
+ * This means that in the worst case when the filename is long 99
+ * we have a title long 99 + 20, but I think it's a rare enough
+ * case to be accepcontainerle. It's justa darn title afterall :)
+ */
+ dirname = gedit_utils_str_middle_truncate (str,
+ MAX (20, MAX_MSG_LENGTH - len));
+ g_free (str);
+ }
+ }
+
+ name_markup = g_markup_printf_escaped ("<b>%s</b>", name);
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_REVERTING)
+ {
+ if (dirname != NULL)
+ {
+ dirname_markup = g_markup_printf_escaped ("<b>%s</b>", dirname);
+
+ /* Translators: the first %s is a file name (e.g. test.txt) the second one
+ is a directory (e.g. ssh://master.gnome.org/home/users/paolo) */
+ msg = g_strdup_printf (_("Reverting %s from %s"),
+ name_markup,
+ dirname_markup);
+ g_free (dirname_markup);
+ }
+ else
+ {
+ msg = g_strdup_printf (_("Reverting %s"),
+ name_markup);
+ }
+
+ area = gedit_progress_message_area_new (GTK_STOCK_REVERT_TO_SAVED,
+ msg,
+ TRUE);
+ }
+ else
+ {
+ if (dirname != NULL)
+ {
+ dirname_markup = g_markup_printf_escaped ("<b>%s</b>", dirname);
+
+ /* Translators: the first %s is a file name (e.g. test.txt) the second one
+ is a directory (e.g. ssh://master.gnome.org/home/users/paolo) */
+ msg = g_strdup_printf (_("Loading %s from %s"),
+ name_markup,
+ dirname_markup);
+ g_free (dirname_markup);
+ }
+ else
+ {
+ msg = g_strdup_printf (_("Loading %s"),
+ name_markup);
+ }
+
+ area = gedit_progress_message_area_new (GTK_STOCK_OPEN,
+ msg,
+ TRUE);
+ }
+
+ g_signal_connect (area,
+ "response",
+ G_CALLBACK (load_cancelled),
+ container);
+
+ gtk_widget_show (area);
+
+ set_message_area (container, area);
+
+ g_free (msg);
+ g_free (name);
+ g_free (name_markup);
+ g_free (dirname);
+}
+
+static void
+show_saving_message_area (GeditViewContainer *container)
+{
+ GtkWidget *area;
+ GeditDocument *doc = NULL;
+ gchar *short_name;
+ gchar *from;
+ gchar *to = NULL;
+ gchar *from_markup;
+ gchar *to_markup;
+ gchar *msg = NULL;
+ gint len;
+
+ g_return_if_fail (container->priv->tmp_save_uri != NULL);
+
+ if (container->priv->message_area != NULL)
+ return;
+
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (doc != NULL);
+
+ short_name = gedit_document_get_short_name_for_display (doc);
+
+ len = g_utf8_strlen (short_name, -1);
+
+ /* if the name is awfully long, truncate it and be done with it,
+ * otherwise also show the directory (ellipsized if needed)
+ */
+ if (len > MAX_MSG_LENGTH)
+ {
+ from = gedit_utils_str_middle_truncate (short_name,
+ MAX_MSG_LENGTH);
+ g_free (short_name);
+ }
+ else
+ {
+ gchar *str;
+
+ from = short_name;
+
+ to = gedit_utils_uri_for_display (container->priv->tmp_save_uri);
+
+ str = gedit_utils_str_middle_truncate (to,
+ MAX (20, MAX_MSG_LENGTH - len));
+ g_free (to);
+
+ to = str;
+ }
+
+ from_markup = g_markup_printf_escaped ("<b>%s</b>", from);
+
+ if (to != NULL)
+ {
+ to_markup = g_markup_printf_escaped ("<b>%s</b>", to);
+
+ /* Translators: the first %s is a file name (e.g. test.txt) the second one
+ is a directory (e.g. ssh://master.gnome.org/home/users/paolo) */
+ msg = g_strdup_printf (_("Saving %s to %s"),
+ from_markup,
+ to_markup);
+ g_free (to_markup);
+ }
+ else
+ {
+ msg = g_strdup_printf (_("Saving %s"), from_markup);
+ }
+
+ area = gedit_progress_message_area_new (GTK_STOCK_SAVE,
+ msg,
+ FALSE);
+
+ gtk_widget_show (area);
+
+ set_message_area (container, area);
+
+ g_free (msg);
+ g_free (to);
+ g_free (from);
+ g_free (from_markup);
+}
+
+static void
+message_area_set_progress (GeditViewContainer *container,
+ goffset size,
+ goffset total_size)
+{
+ if (container->priv->message_area == NULL)
+ return;
+
+ gedit_debug_message (DEBUG_VIEW_CONTAINER, "%" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT, size, total_size);
+
+ g_return_if_fail (GEDIT_IS_PROGRESS_MESSAGE_AREA (container->priv->message_area));
+
+ if (total_size == 0)
+ {
+ if (size != 0)
+ gedit_progress_message_area_pulse (
+ GEDIT_PROGRESS_MESSAGE_AREA (container->priv->message_area));
+ else
+ gedit_progress_message_area_set_fraction (
+ GEDIT_PROGRESS_MESSAGE_AREA (container->priv->message_area),
+ 0);
+ }
+ else
+ {
+ gdouble frac;
+
+ frac = (gdouble)size / (gdouble)total_size;
+
+ gedit_progress_message_area_set_fraction (
+ GEDIT_PROGRESS_MESSAGE_AREA (container->priv->message_area),
+ frac);
+ }
+}
+
+static void
+document_loading (GeditDocument *document,
+ goffset size,
+ goffset total_size,
+ GeditViewContainer *container)
+{
+ double et;
+
+ g_return_if_fail ((container->priv->state == GEDIT_VIEW_CONTAINER_STATE_LOADING) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_REVERTING));
+
+ gedit_debug_message (DEBUG_VIEW_CONTAINER, "%" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT, size, total_size);
+
+ if (container->priv->timer == NULL)
+ {
+ g_return_if_fail (container->priv->times_called == 0);
+ container->priv->timer = g_timer_new ();
+ }
+
+ et = g_timer_elapsed (container->priv->timer, NULL);
+
+ if (container->priv->times_called == 1)
+ {
+ if ((total_size == 0) || (total_size > 51200UL) /* 50 KB */)
+ {
+ show_loading_message_area (container);
+ }
+ }
+ else
+ {
+ if ((container->priv->times_called == 3) && (total_size != 0))
+ {
+ gdouble total_time;
+
+ /* et : total_time = size : total_size */
+ total_time = (et * total_size)/size;
+
+ if ((total_time - et) > 3.0)
+ {
+ show_loading_message_area (container);
+ }
+ }
+ else
+ {
+ if (et > 3.0)
+ {
+ show_loading_message_area (container);
+ }
+ }
+ }
+
+ message_area_set_progress (container, size, total_size);
+
+ container->priv->times_called++;
+}
+
+static gboolean
+remove_container_idle (GeditViewContainer *container)
+{
+ remove_container (container);
+
+ return FALSE;
+}
+
+static void
+document_loaded (GeditDocument *document,
+ const GError *error,
+ GeditViewContainer *container)
+{
+ GtkWidget *emsg;
+ GFile *location;
+ gchar *uri;
+ const GeditEncoding *encoding;
+
+ g_return_if_fail ((container->priv->state == GEDIT_VIEW_CONTAINER_STATE_LOADING) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_REVERTING));
+ g_return_if_fail (container->priv->auto_save_timeout <= 0);
+
+ if (container->priv->timer != NULL)
+ {
+ g_timer_destroy (container->priv->timer);
+ container->priv->timer = NULL;
+ }
+ container->priv->times_called = 0;
+
+ set_message_area (container, NULL);
+
+ location = gedit_document_get_location (document);
+ uri = gedit_document_get_uri (document);
+
- if (error != NULL)
++ /* if the error is CONVERSION FALLBACK don't treat it as a normal error */
++ if (error != NULL && error->code != GEDIT_DOCUMENT_ERROR_CONVERSION_FALLBACK)
+ {
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_LOADING)
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR);
+ else
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR);
+
+ encoding = gedit_document_get_encoding (document);
+
+ if (error->domain == G_IO_ERROR &&
+ error->code == G_IO_ERROR_CANCELLED)
+ {
+ /* remove the container, but in an idle handler, since
+ * we are in the handler of doc loaded and we
+ * don't want doc and container to be finalized now.
+ */
+ g_idle_add ((GSourceFunc) remove_container_idle, container);
+
+ goto end;
+ }
- else if (error->domain == G_IO_ERROR ||
- error->domain == GEDIT_DOCUMENT_ERROR)
++ else
+ {
+ _gedit_recent_remove (GEDIT_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))), uri);
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR)
+ {
- emsg = gedit_io_loading_error_message_area_new (uri,
++ emsg = gedit_io_loading_error_message_area_new (uri,
++ container->priv->tmp_encoding,
+ error);
+ g_signal_connect (emsg,
+ "response",
+ G_CALLBACK (io_loading_error_message_area_response),
+ container);
+ }
+ else
+ {
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR);
+
- emsg = gedit_unrecoverable_reverting_error_message_area_new (uri,
++ emsg = gedit_unrecoverable_reverting_error_message_area_new (uri,
+ error);
+
+ g_signal_connect (emsg,
+ "response",
+ G_CALLBACK (unrecoverable_reverting_error_message_area_response),
+ container);
+ }
+
+ set_message_area (container, emsg);
+ }
- else
- {
- g_return_if_fail ((error->domain == G_CONVERT_ERROR) ||
- (error->domain == GEDIT_CONVERT_ERROR));
-
- // TODO: different error messages if container->priv->state == GEDIT_VIEW_CONTAINER_STATE_REVERTING?
- // note that while reverting encoding should be ok, so this is unlikely to happen
- emsg = gedit_conversion_error_while_loading_message_area_new (
- uri,
- container->priv->tmp_encoding,
- error);
-
- set_message_area (container, emsg);
-
- g_signal_connect (emsg,
- "response",
- G_CALLBACK (conversion_loading_error_message_area_response),
- container);
- }
+
+#if !GTK_CHECK_VERSION (2, 17, 1)
+ gedit_message_area_set_default_response (GEDIT_MESSAGE_AREA (emsg),
+ GTK_RESPONSE_CANCEL);
+#else
+ gtk_info_bar_set_default_response (GTK_INFO_BAR (emsg),
+ GTK_RESPONSE_CANCEL);
+#endif
+
+ gtk_widget_show (emsg);
+
+ g_object_unref (location);
+ g_free (uri);
+
+ return;
+ }
+ else
+ {
+ gchar *mime;
+ GList *all_documents;
+ GList *l;
+
+ g_return_if_fail (uri != NULL);
+
+ mime = gedit_document_get_mime_type (document);
+ _gedit_recent_add (GEDIT_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))),
+ uri,
+ mime);
+ g_free (mime);
-
++
++ if (error && error->code == GEDIT_DOCUMENT_ERROR_CONVERSION_FALLBACK)
++ {
++ GtkWidget *emsg;
++
++ gedit_document_set_readonly (document, TRUE);
++
++ emsg = gedit_io_loading_error_message_area_new (uri,
++ container->priv->tmp_encoding,
++ error);
++
++ set_message_area (container, emsg);
++
++ g_signal_connect (emsg,
++ "response",
++ G_CALLBACK (io_loading_error_message_area_response),
++ container);
++
++#if !GTK_CHECK_VERSION (2, 17, 1)
++ gedit_message_area_set_default_response (GEDIT_MESSAGE_AREA (emsg),
++ GTK_RESPONSE_CANCEL);
++#else
++ gtk_info_bar_set_default_response (GTK_INFO_BAR (emsg),
++ GTK_RESPONSE_CANCEL);
++#endif
++
++ gtk_widget_show (emsg);
++ }
++
+ /* Scroll to the cursor when the document is loaded */
+ for (l = container->priv->views; l != NULL; l = g_list_next (l))
+ {
+ gedit_view_scroll_to_cursor (GEDIT_VIEW (l->data));
+ }
+
+ all_documents = gedit_app_get_documents (gedit_app_get_default ());
+
+ for (l = all_documents; l != NULL; l = g_list_next (l))
+ {
+ GeditDocument *d = GEDIT_DOCUMENT (l->data);
+
+ if (d != document)
+ {
+ GFile *loc;
+
+ loc = gedit_document_get_location (d);
+
+ if ((loc != NULL) &&
+ g_file_equal (location, loc))
+ {
+ GtkWidget *w;
+ GeditView *view;
+
+ view = gedit_view_container_get_view (container);
+
+ container->priv->not_editable = TRUE;
+
+ w = gedit_file_already_open_warning_message_area_new (uri);
+
+ set_message_area (container, w);
+
+#if !GTK_CHECK_VERSION (2, 17, 1)
+ gedit_message_area_set_default_response (GEDIT_MESSAGE_AREA (w),
+ GTK_RESPONSE_CANCEL);
+#else
+ gtk_info_bar_set_default_response (GTK_INFO_BAR (w),
+ GTK_RESPONSE_CANCEL);
+#endif
+
+ gtk_widget_show (w);
+
+ g_signal_connect (w,
+ "response",
+ G_CALLBACK (file_already_open_warning_message_area_response),
+ container);
+
+ g_object_unref (loc);
+ break;
+ }
+
+ if (loc != NULL)
+ g_object_unref (loc);
+ }
+ }
+
+ g_list_free (all_documents);
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ install_auto_save_timeout_if_needed (container);
+
+ container->priv->ask_if_externally_modified = TRUE;
+ }
+
+ end:
+ g_object_unref (location);
+ g_free (uri);
+
+ container->priv->tmp_line_pos = 0;
+ container->priv->tmp_encoding = NULL;
+}
+
+static void
+document_saving (GeditDocument *document,
+ goffset size,
+ goffset total_size,
+ GeditViewContainer *container)
+{
+ double et;
+
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ gedit_debug_message (DEBUG_VIEW_CONTAINER, "%" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT, size, total_size);
+
+
+ if (container->priv->timer == NULL)
+ {
+ g_return_if_fail (container->priv->times_called == 0);
+ container->priv->timer = g_timer_new ();
+ }
+
+ et = g_timer_elapsed (container->priv->timer, NULL);
+
+ if (container->priv->times_called == 1)
+ {
+ if ((total_size == 0) || (total_size > 51200UL) /* 50 KB */)
+ {
+ show_saving_message_area (container);
+ }
+ }
+ else
+ {
+ if ((container->priv->times_called == 3) && (total_size != 0))
+ {
+ gdouble total_time;
+
+ /* et : total_time = size : total_size */
+ total_time = (et * total_size)/size;
+
+ if ((total_time - et) > 3.0)
+ {
+ show_saving_message_area (container);
+ }
+ }
+ else
+ {
+ if (et > 3.0)
+ {
+ show_saving_message_area (container);
+ }
+ }
+ }
+
+ message_area_set_progress (container, size, total_size);
+
+ container->priv->times_called++;
+}
+
+static void
+end_saving (GeditViewContainer *container)
+{
+ /* Reset tmp data for saving */
+ g_free (container->priv->tmp_save_uri);
+ container->priv->tmp_save_uri = NULL;
+ container->priv->tmp_encoding = NULL;
+
+ install_auto_save_timeout_if_needed (container);
+}
+
+static void
+unrecoverable_saving_error_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ GeditView *view;
+
+ if (container->priv->print_preview != NULL)
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW);
+ else
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ end_saving (container);
+
+ set_message_area (container, NULL);
+
+ view = gedit_view_container_get_view (container);
+
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+}
+
+static void
+no_backup_error_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ if (response_id == GTK_RESPONSE_YES)
+ {
+ GeditDocument *doc;
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
+ set_message_area (container, NULL);
+
+ g_return_if_fail (container->priv->tmp_save_uri != NULL);
+ g_return_if_fail (container->priv->tmp_encoding != NULL);
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ /* don't bug the user again with this... */
+ container->priv->save_flags |= GEDIT_DOCUMENT_SAVE_IGNORE_BACKUP;
+
+ g_return_if_fail (container->priv->auto_save_timeout <= 0);
+
+ /* Force saving */
+ gedit_document_save (doc, container->priv->save_flags);
+ }
+ else
+ {
+ unrecoverable_saving_error_message_area_response (message_area,
+ response_id,
+ container);
+ }
+}
+
+static void
+externally_modified_error_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ if (response_id == GTK_RESPONSE_YES)
+ {
+ GeditDocument *doc;
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
+ set_message_area (container, NULL);
+
+ g_return_if_fail (container->priv->tmp_save_uri != NULL);
+ g_return_if_fail (container->priv->tmp_encoding != NULL);
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ g_return_if_fail (container->priv->auto_save_timeout <= 0);
+
+ /* ignore mtime should not be persisted in save flags across saves */
+
+ /* Force saving */
+ gedit_document_save (doc, container->priv->save_flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME);
+ }
+ else
+ {
+ unrecoverable_saving_error_message_area_response (message_area,
+ response_id,
+ container);
+ }
+}
+
+static void
+recoverable_saving_error_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ GeditDocument *doc;
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ const GeditEncoding *encoding;
+
+ encoding = gedit_conversion_error_message_area_get_encoding (
+ GTK_WIDGET (message_area));
+
+ g_return_if_fail (encoding != NULL);
+
+ set_message_area (container, NULL);
+
+ g_return_if_fail (container->priv->tmp_save_uri != NULL);
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ container->priv->tmp_encoding = encoding;
+
+ gedit_debug_message (DEBUG_VIEW_CONTAINER, "Force saving with URI '%s'", container->priv->tmp_save_uri);
+
+ g_return_if_fail (container->priv->auto_save_timeout <= 0);
+
+ gedit_document_save_as (doc,
+ container->priv->tmp_save_uri,
+ container->priv->tmp_encoding,
+ container->priv->save_flags);
+ }
+ else
+ {
+ unrecoverable_saving_error_message_area_response (message_area,
+ response_id,
+ container);
+ }
+}
+
+static void
+document_saved (GeditDocument *document,
+ const GError *error,
+ GeditViewContainer *container)
+{
+ GtkWidget *emsg;
+
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ g_return_if_fail (container->priv->tmp_save_uri != NULL);
+ g_return_if_fail (container->priv->tmp_encoding != NULL);
+ g_return_if_fail (container->priv->auto_save_timeout <= 0);
+
+ g_timer_destroy (container->priv->timer);
+ container->priv->timer = NULL;
+ container->priv->times_called = 0;
+
+ set_message_area (container, NULL);
+
+ if (error != NULL)
+ {
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR);
+
+ if (error->domain == GEDIT_DOCUMENT_ERROR &&
+ error->code == GEDIT_DOCUMENT_ERROR_EXTERNALLY_MODIFIED)
+ {
+ /* This error is recoverable */
+ emsg = gedit_externally_modified_saving_error_message_area_new (
+ container->priv->tmp_save_uri,
+ error);
+ g_return_if_fail (emsg != NULL);
+
+ set_message_area (container, emsg);
+
+ g_signal_connect (emsg,
+ "response",
+ G_CALLBACK (externally_modified_error_message_area_response),
+ container);
+ }
+ else if ((error->domain == GEDIT_DOCUMENT_ERROR &&
+ error->code == GEDIT_DOCUMENT_ERROR_CANT_CREATE_BACKUP) ||
+ (error->domain == G_IO_ERROR &&
+ error->code == G_IO_ERROR_CANT_CREATE_BACKUP))
+ {
+ /* This error is recoverable */
+ emsg = gedit_no_backup_saving_error_message_area_new (
+ container->priv->tmp_save_uri,
+ error);
+ g_return_if_fail (emsg != NULL);
+
+ set_message_area (container, emsg);
+
+ g_signal_connect (emsg,
+ "response",
+ G_CALLBACK (no_backup_error_message_area_response),
+ container);
+ }
+ else if (error->domain == GEDIT_DOCUMENT_ERROR ||
+ error->domain == G_IO_ERROR)
+ {
+ /* These errors are _NOT_ recoverable */
+ _gedit_recent_remove (GEDIT_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))),
+ container->priv->tmp_save_uri);
+
+ emsg = gedit_unrecoverable_saving_error_message_area_new (container->priv->tmp_save_uri,
+ error);
+ g_return_if_fail (emsg != NULL);
+
+ set_message_area (container, emsg);
+
+ g_signal_connect (emsg,
+ "response",
+ G_CALLBACK (unrecoverable_saving_error_message_area_response),
+ container);
+ }
+ else
+ {
+ /* This error is recoverable */
+ g_return_if_fail (error->domain == G_CONVERT_ERROR);
+
+ emsg = gedit_conversion_error_while_saving_message_area_new (
+ container->priv->tmp_save_uri,
+ container->priv->tmp_encoding,
+ error);
+
+ set_message_area (container, emsg);
+
+ g_signal_connect (emsg,
+ "response",
+ G_CALLBACK (recoverable_saving_error_message_area_response),
+ container);
+ }
+
+#if !GTK_CHECK_VERSION (2, 17, 1)
+ gedit_message_area_set_default_response (GEDIT_MESSAGE_AREA (emsg),
+ GTK_RESPONSE_CANCEL);
+#else
+ gtk_info_bar_set_default_response (GTK_INFO_BAR (emsg),
+ GTK_RESPONSE_CANCEL);
+#endif
+
+ gtk_widget_show (emsg);
+ }
+ else
+ {
+ gchar *mime = gedit_document_get_mime_type (document);
+
+ _gedit_recent_add (GEDIT_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))),
+ container->priv->tmp_save_uri,
+ mime);
+ g_free (mime);
+
+ if (container->priv->print_preview != NULL)
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW);
+ else
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ container->priv->ask_if_externally_modified = TRUE;
+
+ end_saving (container);
+ }
+}
+
+static void
+externally_modified_notification_message_area_response (GtkWidget *message_area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ GeditView *view;
+
+ set_message_area (container, NULL);
+ view = gedit_view_container_get_view (container);
+
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ _gedit_view_container_revert (container);
+ }
+ else
+ {
+ container->priv->ask_if_externally_modified = FALSE;
+
+ /* go back to normal state */
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+ }
+
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+}
+
+static void
+display_externally_modified_notification (GeditViewContainer *container)
+{
+ GtkWidget *message_area;
+ GeditDocument *doc;
+ gchar *uri;
+ gboolean document_modified;
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
+ /* uri cannot be NULL, we're here because
+ * the file we're editing changed on disk */
+ uri = gedit_document_get_uri (doc);
+ g_return_if_fail (uri != NULL);
+
+ document_modified = gedit_document_get_modified (doc);
+ message_area = gedit_externally_modified_message_area_new (uri, document_modified);
+ g_free (uri);
+
+ container->priv->message_area = NULL;
+ set_message_area (container, message_area);
+ gtk_widget_show (message_area);
+
+ g_signal_connect (message_area,
+ "response",
+ G_CALLBACK (externally_modified_notification_message_area_response),
+ container);
+}
+
+static gboolean
+view_focused_in (GtkWidget *widget,
+ GdkEventFocus *event,
+ GeditViewContainer *container)
+{
+ GeditDocument *doc;
+
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), FALSE);
+
+ /* we try to detect file changes only in the normal state */
+ if (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_NORMAL)
+ {
+ return FALSE;
+ }
+
+ /* we already asked, don't bug the user again */
+ if (!container->priv->ask_if_externally_modified)
+ {
+ return FALSE;
+ }
+
+ doc = gedit_view_container_get_document (container);
+
+ /* If file was never saved or is remote we do not check */
+ if (!gedit_document_is_local (doc))
+ {
+ return FALSE;
+ }
+
+ if (gedit_document_check_externally_modified (doc))
+ {
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION);
+
+ display_externally_modified_notification (container);
+
+ return FALSE;
+ }
+
+ return FALSE;
+}
+/*
+static GMountOperation *
+container_mount_operation_factory (GeditDocument *doc,
+ gpointer userdata)
+{
+ GeditViewContainer *container = GEDIT_VIEW_CONTAINER (userdata);
+ GtkWidget *window;
+
+ window = gtk_widget_get_toplevel (GTK_WIDGET (container));
+ return gtk_mount_operation_new (GTK_WINDOW (window));
+}*/
+
+static void
+install_view (GeditViewContainer *container,
+ GtkWidget *view)
+{
+ GtkWidget *sw;
+
+ container->priv->views = g_list_append (container->priv->views, view);
+ if (!GTK_WIDGET_VISIBLE (view))
+ gtk_widget_show (view);
+
+ g_object_set_data (G_OBJECT (view), GEDIT_VIEW_CONTAINER_KEY, container);
+
+ /* FIXME: We need to know if we need viewport */
+ /* Create the scrolled window */
+ sw = gtk_scrolled_window_new (NULL, NULL);
+
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ gtk_container_add (GTK_CONTAINER (sw), view);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
+ GTK_SHADOW_IN);
+ gtk_widget_show (sw);
+
+ /* Add view to notebook */
+ gtk_notebook_append_page (GTK_NOTEBOOK (container->priv->notebook),
+ sw, NULL);
+
+ g_signal_connect_after (view,
+ "focus-in-event",
+ G_CALLBACK (view_focused_in),
+ container);
+
+ g_signal_connect_after (view,
+ "realize",
+ G_CALLBACK (view_realized),
+ container);
+
+ g_signal_emit (G_OBJECT (container),
+ signals[VIEW_ADDED],
+ 0,
+ view);
+}
+
+static void
+uninstall_view (GeditViewContainer *container,
+ GtkWidget *view)
+{
+ GtkWidget *sw;
+ gint page_num;
+
+ /* FIXME: Check that the parent is indeed a scrolled window */
+ sw = gtk_widget_get_parent (view);
+
+ page_num = gtk_notebook_page_num (GTK_NOTEBOOK (container->priv->notebook),
+ sw);
+
+ g_object_ref (view);
+
+ gtk_notebook_remove_page (GTK_NOTEBOOK (container->priv->notebook),
+ page_num);
+
+ g_signal_emit (G_OBJECT (container),
+ signals[VIEW_REMOVED],
+ 0,
+ view);
+
+ g_object_unref (view);
+}
+
+static void
+on_switch_page_cb (GtkNotebook *notebook,
+ GtkNotebookPage *page,
+ guint page_num,
+ GeditViewContainer *container)
+{
+ GtkWidget *sw;
+ GtkWidget *view;
+
+ sw = gtk_notebook_get_nth_page (notebook, page_num);
+
+ if (sw == container->priv->active_view_scrolled_window)
+ return;
+
+ view = gtk_bin_get_child (GTK_BIN (sw));
+
+ container->priv->active_view = view;
+ container->priv->active_view_scrolled_window = sw;
+
+ g_signal_emit (G_OBJECT (container),
+ signals[ACTIVE_VIEW_CHANGED],
+ 0,
+ container->priv->active_view);
+}
+
+static void
+gedit_view_container_init (GeditViewContainer *container)
+{
+ GeditLockdownMask lockdown;
+ GtkWidget *view;
+
+ container->priv = GEDIT_VIEW_CONTAINER_GET_PRIVATE (container);
+
+ container->priv->active_view = NULL;
+ container->priv->state = GEDIT_VIEW_CONTAINER_STATE_NORMAL;
+ container->priv->mode = GEDIT_VIEW_CONTAINER_MODE_TEXT;
+
+ container->priv->not_editable = FALSE;
+
+ container->priv->save_flags = 0;
+
+ container->priv->ask_if_externally_modified = TRUE;
+
+ /* Manage auto save data */
+ lockdown = gedit_app_get_lockdown (gedit_app_get_default ());
+ container->priv->auto_save = gedit_prefs_manager_get_auto_save () &&
+ !(lockdown & GEDIT_LOCKDOWN_SAVE_TO_DISK);
+ container->priv->auto_save = (container->priv->auto_save != FALSE);
+
+ container->priv->auto_save_interval = gedit_prefs_manager_get_auto_save_interval ();
+ if (container->priv->auto_save_interval <= 0)
+ container->priv->auto_save_interval = GPM_DEFAULT_AUTO_SAVE_INTERVAL;
+
+ /*FIXME
+ _gedit_document_set_mount_operation_factory (doc,
+ container_mount_operation_factory,
+ container);*/
+
+ /* Create the notebook */
+ container->priv->notebook = gtk_notebook_new ();
+ gtk_widget_show (container->priv->notebook);
+ gtk_box_pack_end (GTK_BOX (container),
+ container->priv->notebook,
+ TRUE, TRUE, 0);
+
+ g_signal_connect (container->priv->notebook,
+ "switch-page",
+ G_CALLBACK (on_switch_page_cb),
+ container);
+
+ /* Create the main document */
+ container->priv->doc = gedit_text_buffer_new ();
+
+ g_object_set_data (G_OBJECT (container->priv->doc),
+ GEDIT_VIEW_CONTAINER_KEY, container);
+
+ g_signal_connect (container->priv->doc,
+ "notify::uri",
+ G_CALLBACK (document_uri_notify_handler),
+ container);
+ g_signal_connect (container->priv->doc,
+ "modified_changed",
+ G_CALLBACK (document_modified_changed),
+ container);
+ g_signal_connect (container->priv->doc,
+ "loading",
+ G_CALLBACK (document_loading),
+ container);
+ g_signal_connect (container->priv->doc,
+ "loaded",
+ G_CALLBACK (document_loaded),
+ container);
+ g_signal_connect (container->priv->doc,
+ "saving",
+ G_CALLBACK (document_saving),
+ container);
+ g_signal_connect (container->priv->doc,
+ "saved",
+ G_CALLBACK (document_saved),
+ container);
+
+ /* Add the text view */
+ view = gedit_text_view_new (GEDIT_TEXT_BUFFER (container->priv->doc));
+ install_view (container, view);
+
+ /* FIXME: This is only for testing */
+ view = GTK_WIDGET (gedit_web_view_new ());
+ install_view (container, view);
+}
+
+GtkWidget *
+_gedit_view_container_new ()
+{
+ return GTK_WIDGET (g_object_new (GEDIT_TYPE_VIEW_CONTAINER, NULL));
+}
+
+/* Whether create is TRUE, creates a new empty document if location does
+ not refer to an existing file */
+GtkWidget *
+_gedit_view_container_new_from_uri (const gchar *uri,
+ const GeditEncoding *encoding,
+ gint line_pos,
+ gboolean create)
+{
+ GeditViewContainer *container;
+
+ g_return_val_if_fail (uri != NULL, NULL);
+
+ container = GEDIT_VIEW_CONTAINER (_gedit_view_container_new ());
+
+ _gedit_view_container_load (container,
+ uri,
+ encoding,
+ line_pos,
+ create);
+
+ return GTK_WIDGET (container);
+}
+
+/**
+ * gedit_view_container_get_view:
+ * @container: a #GeditViewContainer
+ *
+ * Gets the #GeditView inside @container.
+ *
+ * Returns: the #GeditView inside @container
+ */
+GeditView *
+gedit_view_container_get_view (GeditViewContainer *container)
+{
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), NULL);
+
+ return GEDIT_VIEW (container->priv->active_view);
+}
+
+GList *
+gedit_view_container_get_views (GeditViewContainer *container)
+{
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), NULL);
+
+ return container->priv->views;
+}
+
+/**
+ * gedit_view_container_get_document:
+ * @container: a #GeditViewContainer
+ *
+ * Gets the #GeditDocument associated to @container.
+ *
+ * Returns: the #GeditDocument associated to @container
+ */
+GeditDocument *
+gedit_view_container_get_document (GeditViewContainer *container)
+{
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), NULL);
+
+ return container->priv->doc;
+}
+
+#define MAX_DOC_NAME_LENGTH 40
+
+gchar *
+_gedit_view_container_get_name (GeditViewContainer *container)
+{
+ GeditDocument *doc;
+ gchar *name;
+ gchar *docname;
+ gchar *container_name;
+
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), NULL);
+
+ doc = gedit_view_container_get_document (container);
+
+ name = gedit_document_get_short_name_for_display (doc);
+
+ /* Truncate the name so it doesn't get insanely wide. */
+ docname = gedit_utils_str_middle_truncate (name, MAX_DOC_NAME_LENGTH);
+
+ if (gedit_document_get_modified (doc))
+ {
+ container_name = g_strdup_printf ("*%s", docname);
+ }
+ else
+ {
+ #if 0
+ if (gedit_document_get_readonly (doc))
+ {
+ container_name = g_strdup_printf ("%s [%s]", docname,
+ /*Read only*/ _("RO"));
+ }
+ else
+ {
+ container_name = g_strdup_printf ("%s", docname);
+ }
+#endif
+ container_name = g_strdup (docname);
+ }
+
+ g_free (docname);
+ g_free (name);
+
+ return container_name;
+}
+
+gchar *
+_gedit_view_container_get_tooltips (GeditViewContainer *container)
+{
+ GeditDocument *doc;
+ gchar *tip;
+ gchar *uri;
+ gchar *ruri;
+ gchar *ruri_markup;
+
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), NULL);
+
+ doc = gedit_view_container_get_document (container);
+
+ uri = gedit_document_get_uri_for_display (doc);
+ g_return_val_if_fail (uri != NULL, NULL);
+
+ ruri = gedit_utils_replace_home_dir_with_tilde (uri);
+ g_free (uri);
+
+ ruri_markup = g_markup_printf_escaped ("<i>%s</i>", ruri);
+
+ switch (container->priv->state)
+ {
+ gchar *content_type;
+ gchar *mime_type;
+ gchar *content_description;
+ gchar *content_full_description;
+ gchar *encoding;
+ const GeditEncoding *enc;
+
+ case GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR:
+ tip = g_strdup_printf (_("Error opening file %s"),
+ ruri_markup);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR:
+ tip = g_strdup_printf (_("Error reverting file %s"),
+ ruri_markup);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR:
+ tip = g_strdup_printf (_("Error saving file %s"),
+ ruri_markup);
+ break;
+ default:
+ content_type = gedit_document_get_content_type (doc);
+ mime_type = gedit_document_get_mime_type (doc);
+ content_description = g_content_type_get_description (content_type);
+
+ if (content_description == NULL)
+ content_full_description = g_strdup (mime_type);
+ else
+ content_full_description = g_strdup_printf ("%s (%s)",
+ content_description, mime_type);
+
+ g_free (content_type);
+ g_free (mime_type);
+ g_free (content_description);
+
+ enc = gedit_document_get_encoding (doc);
+
+ if (enc == NULL)
+ encoding = g_strdup (_("Unicode (UTF-8)"));
+ else
+ encoding = gedit_encoding_to_string (enc);
+
+ tip = g_markup_printf_escaped ("<b>%s</b> %s\n\n"
+ "<b>%s</b> %s\n"
+ "<b>%s</b> %s",
+ _("Name:"), ruri,
+ _("MIME Type:"), content_full_description,
+ _("Encoding:"), encoding);
+
+ g_free (encoding);
+ g_free (content_full_description);
+
+ break;
+ }
+
+ g_free (ruri);
+ g_free (ruri_markup);
+
+ return tip;
+}
+
+static GdkPixbuf *
+resize_icon (GdkPixbuf *pixbuf,
+ gint size)
+{
+ gint width, height;
+
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+
+ /* if the icon is larger than the nominal size, scale down */
+ if (MAX (width, height) > size)
+ {
+ GdkPixbuf *scaled_pixbuf;
+
+ if (width > height)
+ {
+ height = height * size / width;
+ width = size;
+ }
+ else
+ {
+ width = width * size / height;
+ height = size;
+ }
+
+ scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf,
+ width,
+ height,
+ GDK_INTERP_BILINEAR);
+ g_object_unref (pixbuf);
+ pixbuf = scaled_pixbuf;
+ }
+
+ return pixbuf;
+}
+
+static GdkPixbuf *
+get_stock_icon (GtkIconTheme *theme,
+ const gchar *stock,
+ gint size)
+{
+ GdkPixbuf *pixbuf;
+
+ pixbuf = gtk_icon_theme_load_icon (theme, stock, size, 0, NULL);
+ if (pixbuf == NULL)
+ return NULL;
+
+ return resize_icon (pixbuf, size);
+}
+
+static GdkPixbuf *
+get_icon (GtkIconTheme *theme,
+ GFile *location,
+ gint size)
+{
+ GdkPixbuf *pixbuf;
+ GtkIconInfo *icon_info;
+ GFileInfo *info;
+ GIcon *gicon;
+
+ if (location == NULL)
+ return get_stock_icon (theme, GTK_STOCK_FILE, size);
+
+ /* FIXME: Doing a sync stat is bad, this should be fixed */
+ info = g_file_query_info (location,
+ G_FILE_ATTRIBUTE_STANDARD_ICON,
+ G_FILE_QUERY_INFO_NONE,
+ NULL,
+ NULL);
+ if (info == NULL)
+ return get_stock_icon (theme, GTK_STOCK_FILE, size);
+
+ gicon = g_file_info_get_icon (info);
+
+ if (gicon == NULL)
+ {
+ g_object_unref (info);
+ return get_stock_icon (theme, GTK_STOCK_FILE, size);
+ }
+
+ icon_info = gtk_icon_theme_lookup_by_gicon (theme, gicon, size, 0);
+ g_object_unref (info);
+
+ if (icon_info == NULL)
+ return get_stock_icon (theme, GTK_STOCK_FILE, size);
+
+ pixbuf = gtk_icon_info_load_icon (icon_info, NULL);
+ gtk_icon_info_free (icon_info);
+
+ if (pixbuf == NULL)
+ return get_stock_icon (theme, GTK_STOCK_FILE, size);
+
+ return resize_icon (pixbuf, size);
+}
+
+/* FIXME: add support for theme changed. I think it should be as easy as
+ call g_object_notify (container, "name") when the icon theme changes */
+GdkPixbuf *
+_gedit_view_container_get_icon (GeditViewContainer *container)
+{
+ GdkPixbuf *pixbuf;
+ GtkIconTheme *theme;
+ GdkScreen *screen;
+ gint icon_size;
+
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), NULL);
+
+ screen = gtk_widget_get_screen (GTK_WIDGET (container));
+
+ theme = gtk_icon_theme_get_for_screen (screen);
+ g_return_val_if_fail (theme != NULL, NULL);
+
+ gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (GTK_WIDGET (container)),
+ GTK_ICON_SIZE_MENU,
+ NULL,
+ &icon_size);
+
+ switch (container->priv->state)
+ {
+ case GEDIT_VIEW_CONTAINER_STATE_LOADING:
+ pixbuf = get_stock_icon (theme,
+ GTK_STOCK_OPEN,
+ icon_size);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_REVERTING:
+ pixbuf = get_stock_icon (theme,
+ GTK_STOCK_REVERT_TO_SAVED,
+ icon_size);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_SAVING:
+ pixbuf = get_stock_icon (theme,
+ GTK_STOCK_SAVE,
+ icon_size);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_PRINTING:
+ pixbuf = get_stock_icon (theme,
+ GTK_STOCK_PRINT,
+ icon_size);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_PRINT_PREVIEWING:
+ case GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW:
+ pixbuf = get_stock_icon (theme,
+ GTK_STOCK_PRINT_PREVIEW,
+ icon_size);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR:
+ case GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR:
+ case GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR:
+ case GEDIT_VIEW_CONTAINER_STATE_GENERIC_ERROR:
+ pixbuf = get_stock_icon (theme,
+ GTK_STOCK_DIALOG_ERROR,
+ icon_size);
+ break;
+
+ case GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION:
+ pixbuf = get_stock_icon (theme,
+ GTK_STOCK_DIALOG_WARNING,
+ icon_size);
+ break;
+
+ default:
+ {
+ GFile *location;
+ GeditDocument *doc;
+
+ doc = gedit_view_container_get_document (container);
+
+ location = gedit_document_get_location (doc);
+ pixbuf = get_icon (theme, location, icon_size);
+
+ if (location)
+ g_object_unref (location);
+ }
+ }
+
+ return pixbuf;
+}
+
+/**
+ * gedit_view_container_get_from_document:
+ * @doc: a #GeditDocument
+ *
+ * Gets the #GeditViewContainer associated with @doc.
+ *
+ * Returns: the #GeditViewContainer associated with @doc
+ */
+GeditViewContainer *
+gedit_view_container_get_from_document (GeditDocument *doc)
+{
+ gpointer res;
+
+ g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), NULL);
+
+ res = g_object_get_data (G_OBJECT (doc), GEDIT_VIEW_CONTAINER_KEY);
+
+ return (res != NULL) ? GEDIT_VIEW_CONTAINER (res) : NULL;
+}
+
+GeditViewContainer *
+gedit_view_container_get_from_view (GeditView *view)
+{
+ gpointer res;
+
+ g_return_val_if_fail (GEDIT_IS_VIEW (view), NULL);
+
+ res = g_object_get_data (G_OBJECT (view), GEDIT_VIEW_CONTAINER_KEY);
+
+ return (res != NULL) ? GEDIT_VIEW_CONTAINER (res) : NULL;
+}
+
+void
+_gedit_view_container_load (GeditViewContainer *container,
+ const gchar *uri,
+ const GeditEncoding *encoding,
+ gint line_pos,
+ gboolean create)
+{
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_LOADING);
+
+ container->priv->tmp_line_pos = line_pos;
+ container->priv->tmp_encoding = encoding;
+
+ if (container->priv->auto_save_timeout > 0)
+ remove_auto_save_timeout (container);
+
+ gedit_document_load (container->priv->doc,
+ uri,
+ encoding,
+ line_pos,
+ create);
+}
+
+void
+_gedit_view_container_revert (GeditViewContainer *container)
+{
+ GeditDocument *doc;
+ gchar *uri;
+
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+ g_return_if_fail ((container->priv->state == GEDIT_VIEW_CONTAINER_STATE_NORMAL) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION));
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
+ {
+ set_message_area (container, NULL);
+ }
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_REVERTING);
+
+ uri = gedit_document_get_uri (doc);
+ g_return_if_fail (uri != NULL);
+
+ container->priv->tmp_line_pos = 0;
+ container->priv->tmp_encoding = gedit_document_get_encoding (doc);
+
+ if (container->priv->auto_save_timeout > 0)
+ remove_auto_save_timeout (container);
+
+ gedit_document_load (doc,
+ uri,
+ container->priv->tmp_encoding,
+ 0,
+ FALSE);
+
+ g_free (uri);
+}
+
+void
+_gedit_view_container_save (GeditViewContainer *container)
+{
+ GeditDocument *doc;
+ GeditDocumentSaveFlags save_flags;
+
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+ g_return_if_fail ((container->priv->state == GEDIT_VIEW_CONTAINER_STATE_NORMAL) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW));
+ g_return_if_fail (container->priv->tmp_save_uri == NULL);
+ g_return_if_fail (container->priv->tmp_encoding == NULL);
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (!gedit_document_is_untitled (doc));
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
+ {
+ /* We already told the user about the external
+ * modification: hide the message area and set
+ * the save flag.
+ */
+
+ set_message_area (container, NULL);
+ save_flags = container->priv->save_flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME;
+ }
+ else
+ {
+ save_flags = container->priv->save_flags;
+ }
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ /* uri used in error messages, will be freed in document_saved */
+ container->priv->tmp_save_uri = gedit_document_get_uri (doc);
+ container->priv->tmp_encoding = gedit_document_get_encoding (doc);
+
+ if (container->priv->auto_save_timeout > 0)
+ remove_auto_save_timeout (container);
+
+ gedit_document_save (doc, save_flags);
+}
+
+static gboolean
+gedit_view_container_auto_save (GeditViewContainer *container)
+{
+ GeditDocument *doc;
+
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ g_return_val_if_fail (container->priv->tmp_save_uri == NULL, FALSE);
+ g_return_val_if_fail (container->priv->tmp_encoding == NULL, FALSE);
+
+ doc = gedit_view_container_get_document (container);
+
+ g_return_val_if_fail (!gedit_document_is_untitled (doc), FALSE);
+ g_return_val_if_fail (!gedit_document_get_readonly (doc), FALSE);
+
+ g_return_val_if_fail (container->priv->auto_save_timeout > 0, FALSE);
+ g_return_val_if_fail (container->priv->auto_save, FALSE);
+ g_return_val_if_fail (container->priv->auto_save_interval > 0, FALSE);
+
+ if (!gedit_document_get_modified (doc))
+ {
+ gedit_debug_message (DEBUG_VIEW_CONTAINER, "Document not modified");
+
+ return TRUE;
+ }
+
+ if ((container->priv->state != GEDIT_VIEW_CONTAINER_STATE_NORMAL) &&
+ (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW))
+ {
+ /* Retry after 30 seconds */
+ guint timeout;
+
+ gedit_debug_message (DEBUG_VIEW_CONTAINER, "Retry after 30 seconds");
+
+ /* Add a new timeout */
+ timeout = g_timeout_add_seconds (30,
+ (GSourceFunc) gedit_view_container_auto_save,
+ container);
+
+ container->priv->auto_save_timeout = timeout;
+
+ /* Returns FALSE so the old timeout is "destroyed" */
+ return FALSE;
+ }
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ /* uri used in error messages, will be freed in document_saved */
+ container->priv->tmp_save_uri = gedit_document_get_uri (doc);
+ container->priv->tmp_encoding = gedit_document_get_encoding (doc);
+
+ /* Set auto_save_timeout to 0 since the timeout is going to be destroyed */
+ container->priv->auto_save_timeout = 0;
+
+ /* Since we are autosaving, we need to preserve the backup that was produced
+ the last time the user "manually" saved the file. In the case a recoverable
+ error happens while saving, the last backup is not preserved since the user
+ expressed his willing of saving the file */
+ gedit_document_save (doc, container->priv->save_flags | GEDIT_DOCUMENT_SAVE_PRESERVE_BACKUP);
+
+ gedit_debug_message (DEBUG_VIEW_CONTAINER, "Done");
+
+ /* Returns FALSE so the old timeout is "destroyed" */
+ return FALSE;
+}
+
+void
- _gedit_view_container_save_as (GeditViewContainer *container,
- const gchar *uri,
- const GeditEncoding *encoding)
++_gedit_view_container_save_as (GeditViewContainer *container,
++ const gchar *uri,
++ const GeditEncoding *encoding,
++ GeditDocumentNewlineType newline_type)
+{
+ GeditDocument *doc;
+ GeditDocumentSaveFlags save_flags;
+
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+ g_return_if_fail ((container->priv->state == GEDIT_VIEW_CONTAINER_STATE_NORMAL) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) ||
+ (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW));
+ g_return_if_fail (encoding != NULL);
+
+ g_return_if_fail (container->priv->tmp_save_uri == NULL);
+ g_return_if_fail (container->priv->tmp_encoding == NULL);
+
+ doc = gedit_view_container_get_document (container);
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
+ /* reset the save flags, when saving as */
+ container->priv->save_flags = 0;
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)
+ {
+ /* We already told the user about the external
+ * modification: hide the message area and set
+ * the save flag.
+ */
+
+ set_message_area (container, NULL);
+ save_flags = container->priv->save_flags | GEDIT_DOCUMENT_SAVE_IGNORE_MTIME;
+ }
+ else
+ {
+ save_flags = container->priv->save_flags;
+ }
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SAVING);
+
+ /* uri used in error messages... strdup because errors are async
+ * and the string can go away, will be freed in document_saved */
+ container->priv->tmp_save_uri = g_strdup (uri);
+ container->priv->tmp_encoding = encoding;
+
+ if (container->priv->auto_save_timeout > 0)
+ remove_auto_save_timeout (container);
+
++ /* FIXME: this should behave the same as encoding, setting it here
++ makes it persistent (if save fails, it's remembered). It's not
++ a very big deal, but would be nice to have them follow the
++ same pattern. This can be changed once we break API for 3.0 */
++ gedit_document_set_newline_type (doc, newline_type);
+ gedit_document_save_as (doc, uri, encoding, container->priv->save_flags);
+}
+
+#define GEDIT_PAGE_SETUP_KEY "gedit-page-setup-key"
+#define GEDIT_PRINT_SETTINGS_KEY "gedit-print-settings-key"
+
+static GtkPageSetup *
+get_page_setup (GeditViewContainer *container)
+{
+ gpointer data;
+ GeditDocument *doc;
+
+ doc = gedit_view_container_get_document (container);
+
+ data = g_object_get_data (G_OBJECT (doc),
+ GEDIT_PAGE_SETUP_KEY);
+
+ if (data == NULL)
+ {
+ return _gedit_app_get_default_page_setup (gedit_app_get_default());
+ }
+ else
+ {
+ return gtk_page_setup_copy (GTK_PAGE_SETUP (data));
+ }
+}
+
+static GtkPrintSettings *
+get_print_settings (GeditViewContainer *container)
+{
+ gpointer data;
+ GeditDocument *doc;
+
+ doc = gedit_view_container_get_document (container);
+
+ data = g_object_get_data (G_OBJECT (doc),
+ GEDIT_PRINT_SETTINGS_KEY);
+
+ if (data == NULL)
+ {
+ return _gedit_app_get_default_print_settings (gedit_app_get_default());
+ }
+ else
+ {
+ return gtk_print_settings_copy (GTK_PRINT_SETTINGS (data));
+ }
+}
+
+/* FIXME: show the message area only if the operation will be "long" */
+static void
+printing_cb (GeditPrintJob *job,
+ GeditPrintJobStatus status,
+ GeditViewContainer *container)
+{
+ g_return_if_fail (GEDIT_IS_PROGRESS_MESSAGE_AREA (container->priv->message_area));
+
+ gtk_widget_show (container->priv->message_area);
+
+ gedit_progress_message_area_set_text (GEDIT_PROGRESS_MESSAGE_AREA (container->priv->message_area),
+ gedit_print_job_get_status_string (job));
+
+ gedit_progress_message_area_set_fraction (GEDIT_PROGRESS_MESSAGE_AREA (container->priv->message_area),
+ gedit_print_job_get_progress (job));
+}
+
+static void
+store_print_settings (GeditViewContainer *container,
+ GeditPrintJob *job)
+{
+ GeditDocument *doc;
+ GtkPrintSettings *settings;
+ GtkPageSetup *page_setup;
+
+ doc = gedit_view_container_get_document (container);
+
+ settings = gedit_print_job_get_print_settings (job);
+
+ /* clear n-copies settings since we do not want to
+ * persist that one */
+ gtk_print_settings_unset (settings,
+ GTK_PRINT_SETTINGS_N_COPIES);
+
+ /* remember settings for this document */
+ g_object_set_data_full (G_OBJECT (doc),
+ GEDIT_PRINT_SETTINGS_KEY,
+ g_object_ref (settings),
+ (GDestroyNotify)g_object_unref);
+
+ /* make them the default */
+ _gedit_app_set_default_print_settings (gedit_app_get_default (),
+ settings);
+
+ page_setup = gedit_print_job_get_page_setup (job);
+
+ /* remember page setup for this document */
+ g_object_set_data_full (G_OBJECT (doc),
+ GEDIT_PAGE_SETUP_KEY,
+ g_object_ref (page_setup),
+ (GDestroyNotify)g_object_unref);
+
+ /* make it the default */
+ _gedit_app_set_default_page_setup (gedit_app_get_default (),
+ page_setup);
+}
+
+static void
+done_printing_cb (GeditPrintJob *job,
+ GeditPrintJobResult result,
+ const GError *error,
+ GeditViewContainer *container)
+{
+ GeditView *view;
+
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_PRINT_PREVIEWING ||
+ container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW ||
+ container->priv->state == GEDIT_VIEW_CONTAINER_STATE_PRINTING);
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW)
+ {
+ /* print preview has been destroyed... */
+ container->priv->print_preview = NULL;
+ }
+ else
+ {
+ g_return_if_fail (GEDIT_IS_PROGRESS_MESSAGE_AREA (container->priv->message_area));
+
+ set_message_area (container, NULL); /* destroy the message area */
+ }
+
+ // TODO: check status and error
+
+ if (result == GEDIT_PRINT_JOB_RESULT_OK)
+ {
+ store_print_settings (container, job);
+ }
+
+#if 0
+ if (container->priv->print_preview != NULL)
+ {
+ /* If we were printing while showing the print preview,
+ see bug #352658 */
+ gtk_widget_destroy (container->priv->print_preview);
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_PRINTING);
+ }
+#endif
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ view = gedit_view_container_get_view (container);
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+
+ g_object_unref (container->priv->print_job);
+ container->priv->print_job = NULL;
+}
+
+#if 0
+static void
+print_preview_destroyed (GtkWidget *preview,
+ GeditViewContainer *container)
+{
+ container->priv->print_preview = NULL;
+
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW)
+ {
+ GeditView *view;
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ view = gedit_view_container_get_view (container);
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+ }
+ else
+ {
+ /* This should happen only when printing while showing the print
+ * preview. In this case let us continue whithout changing
+ * the state and show the document. See bug #352658 */
+ gtk_widget_show (container->priv->view_scrolled_window);
+
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_PRINTING);
+ }
+}
+#endif
+
+static void
+show_preview_cb (GeditPrintJob *job,
+ GeditPrintPreview *preview,
+ GeditViewContainer *container)
+{
+// g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_PRINT_PREVIEWING);
+ g_return_if_fail (container->priv->print_preview == NULL);
+
+ set_message_area (container, NULL); /* destroy the message area */
+
+ container->priv->print_preview = GTK_WIDGET (preview);
+ gtk_box_pack_end (GTK_BOX (container),
+ container->priv->print_preview,
+ TRUE,
+ TRUE,
+ 0);
+ gtk_widget_show (container->priv->print_preview);
+ gtk_widget_grab_focus (container->priv->print_preview);
+
+/* when the preview gets destroyed we get "done" signal
+ g_signal_connect (container->priv->print_preview,
+ "destroy",
+ G_CALLBACK (print_preview_destroyed),
+ container);
+*/
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW);
+}
+
+#if 0
+
+static void
+set_print_preview (GeditViewContainer *container,
+ GtkWidget *print_preview)
+{
+ if (container->priv->print_preview == print_preview)
+ return;
+
+ if (container->priv->print_preview != NULL)
+ gtk_widget_destroy (container->priv->print_preview);
+
+ container->priv->print_preview = print_preview;
+
+ gtk_box_pack_end (GTK_BOX (container),
+ container->priv->print_preview,
+ TRUE,
+ TRUE,
+ 0);
+
+ gtk_widget_grab_focus (container->priv->print_preview);
+
+ g_signal_connect (container->priv->print_preview,
+ "destroy",
+ G_CALLBACK (print_preview_destroyed),
+ container);
+}
+
+static void
+preview_finished_cb (GtkSourcePrintJob *pjob, GeditViewContainer *container)
+{
+ GnomePrintJob *gjob;
+ GtkWidget *preview = NULL;
+
+ g_return_if_fail (GEDIT_IS_PROGRESS_MESSAGE_AREA (container->priv->message_area));
+ set_message_area (container, NULL); /* destroy the message area */
+
+ gjob = gtk_source_print_job_get_print_job (pjob);
+
+ preview = gedit_print_job_preview_new (gjob);
+ g_object_unref (gjob);
+
+ set_print_preview (container, preview);
+
+ gtk_widget_show (preview);
+ g_object_unref (pjob);
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW);
+}
+
+
+#endif
+
+static void
+print_cancelled (GtkWidget *area,
+ gint response_id,
+ GeditViewContainer *container)
+{
+ g_return_if_fail (GEDIT_IS_PROGRESS_MESSAGE_AREA (container->priv->message_area));
+
+ gedit_print_job_cancel (container->priv->print_job);
+
+ g_debug ("print_cancelled");
+}
+
+static void
+show_printing_message_area (GeditViewContainer *container,
+ gboolean preview)
+{
+ GtkWidget *area;
+
+ if (preview)
+ area = gedit_progress_message_area_new (GTK_STOCK_PRINT_PREVIEW,
+ "",
+ TRUE);
+ else
+ area = gedit_progress_message_area_new (GTK_STOCK_PRINT,
+ "",
+ TRUE);
+
+ g_signal_connect (area,
+ "response",
+ G_CALLBACK (print_cancelled),
+ container);
+
+ set_message_area (container, area);
+}
+
+#if !GTK_CHECK_VERSION (2, 17, 4)
+
+static void
+page_setup_done_cb (GtkPageSetup *setup,
+ GeditViewContainer *container)
+{
+ if (setup != NULL)
+ {
+ GeditDocument *doc;
+
+ doc = gedit_view_container_get_document (container);
+
+ /* remember it for this document */
+ g_object_set_data_full (G_OBJECT (doc),
+ GEDIT_PAGE_SETUP_KEY,
+ g_object_ref (setup),
+ (GDestroyNotify)g_object_unref);
+
+ /* make it the default */
+ _gedit_app_set_default_page_setup (gedit_app_get_default(),
+ setup);
+ }
+}
+
+void
+_gedit_view_container_page_setup (GeditViewContainer *container)
+{
+ GtkPageSetup *setup;
+ GtkPrintSettings *settings;
+
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+
+ setup = get_page_setup (container);
+ settings = get_print_settings (container);
+
+ gtk_print_run_page_setup_dialog_async (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))),
+ setup,
+ settings,
+ (GtkPageSetupDoneFunc) page_setup_done_cb,
+ container);
+
+ /* CHECK: should we unref setup and settings? */
+}
+
+#endif
+
+static void
+gedit_view_container_print_or_print_preview (GeditViewContainer *container,
+ GtkPrintOperationAction print_action)
+{
+ GeditView *view;
+ gboolean is_preview;
+ GtkPageSetup *setup;
+ GtkPrintSettings *settings;
+ GtkPrintOperationResult res;
+ GError *error = NULL;
+
+ g_return_if_fail (container->priv->print_job == NULL);
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ view = gedit_view_container_get_view (container);
+
+ is_preview = (print_action == GTK_PRINT_OPERATION_ACTION_PREVIEW);
+
+ container->priv->print_job = gedit_print_job_new (view);
+ g_object_add_weak_pointer (G_OBJECT (container->priv->print_job),
+ (gpointer *) &container->priv->print_job);
+
+ show_printing_message_area (container, is_preview);
+
+ g_signal_connect (container->priv->print_job,
+ "printing",
+ G_CALLBACK (printing_cb),
+ container);
+ g_signal_connect (container->priv->print_job,
+ "show-preview",
+ G_CALLBACK (show_preview_cb),
+ container);
+ g_signal_connect (container->priv->print_job,
+ "done",
+ G_CALLBACK (done_printing_cb),
+ container);
+
+ if (is_preview)
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_PRINT_PREVIEWING);
+ else
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_PRINTING);
+
+ setup = get_page_setup (container);
+ settings = get_print_settings (container);
+
+ res = gedit_print_job_print (container->priv->print_job,
+ print_action,
+ setup,
+ settings,
+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (container))),
+ &error);
+
+ // TODO: manage res in the correct way
+ if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
+ {
+ /* FIXME: go in error state */
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+ g_warning ("Async print preview failed (%s)", error->message);
+ g_object_unref (container->priv->print_job);
+ g_error_free (error);
+ }
+}
+
+void
+_gedit_view_container_print (GeditViewContainer *container)
+{
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+
+ /* FIXME: currently we can have just one printoperation going on
+ * at a given time, so before starting the print we close the preview.
+ * Would be nice to handle it properly though */
+ if (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW)
+ {
+ gtk_widget_destroy (container->priv->print_preview);
+ }
+
+ gedit_view_container_print_or_print_preview (container,
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+}
+
+void
+_gedit_view_container_print_preview (GeditViewContainer *container)
+{
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+
+ gedit_view_container_print_or_print_preview (container,
+ GTK_PRINT_OPERATION_ACTION_PREVIEW);
+}
+
+void
+_gedit_view_container_mark_for_closing (GeditViewContainer *container)
+{
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+ g_return_if_fail (container->priv->state == GEDIT_VIEW_CONTAINER_STATE_NORMAL);
+
+ gedit_view_container_set_state (container, GEDIT_VIEW_CONTAINER_STATE_CLOSING);
+}
+
+gboolean
+_gedit_view_container_can_close (GeditViewContainer *container)
+{
+ GeditDocument *doc;
+ GeditViewContainerState ts;
+
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), FALSE);
+
+ ts = gedit_view_container_get_state (container);
+
+ /* if we are loading or reverting, the container can be closed */
+ if ((ts == GEDIT_VIEW_CONTAINER_STATE_LOADING) ||
+ (ts == GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR) ||
+ (ts == GEDIT_VIEW_CONTAINER_STATE_REVERTING) ||
+ (ts == GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR)) /* CHECK: I'm not sure this is the right behavior for REVERTING ERROR */
+ return TRUE;
+
+ /* Do not close container with saving errors */
+ if (ts == GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR)
+ return FALSE;
+
+ doc = gedit_view_container_get_document (container);
+
+ /* TODO: we need to save the file also if it has been externally
+ modified - Paolo (Oct 10, 2005) */
+
+ return (!gedit_document_get_modified (doc) &&
+ !gedit_document_get_deleted (doc));
+}
+
+/**
+ * gedit_view_container_get_auto_save_enabled:
+ * @container: a #GeditViewContainer
+ *
+ * Gets the current state for the autosave feature
+ *
+ * Return value: %TRUE if the autosave is enabled, else %FALSE
+ **/
+gboolean
+gedit_view_container_get_auto_save_enabled (GeditViewContainer *container)
+{
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), FALSE);
+
+ return container->priv->auto_save;
+}
+
+/**
+ * gedit_view_container_set_auto_save_enabled:
+ * @container: a #GeditViewContainer
+ * @enable: enable (%TRUE) or disable (%FALSE) auto save
+ *
+ * Enables or disables the autosave feature. It does not install an
+ * autosave timeout if the document is new or is read-only
+ **/
+void
+gedit_view_container_set_auto_save_enabled (GeditViewContainer *container,
+ gboolean enable)
+{
+ GeditDocument *doc = NULL;
+ GeditLockdownMask lockdown;
+
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+
+ /* Force disabling when lockdown is active */
+ lockdown = gedit_app_get_lockdown (gedit_app_get_default());
+ if (lockdown & GEDIT_LOCKDOWN_SAVE_TO_DISK)
+ enable = FALSE;
+
+ doc = gedit_view_container_get_document (container);
+
+ if (container->priv->auto_save == enable)
+ return;
+
+ container->priv->auto_save = enable;
+
+ if (enable &&
+ (container->priv->auto_save_timeout <=0) &&
+ !gedit_document_is_untitled (doc) &&
+ !gedit_document_get_readonly (doc))
+ {
+ if ((container->priv->state != GEDIT_VIEW_CONTAINER_STATE_LOADING) &&
+ (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_SAVING) &&
+ (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_REVERTING) &&
+ (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR) &&
+ (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR) &&
+ (container->priv->state != GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR))
+ {
+ install_auto_save_timeout (container);
+ }
+ /* else: the timeout will be installed when loading/saving/reverting
+ will terminate */
+
+ return;
+ }
+
+ if (!enable && (container->priv->auto_save_timeout > 0))
+ {
+ remove_auto_save_timeout (container);
+
+ return;
+ }
+
+ g_return_if_fail ((!enable && (container->priv->auto_save_timeout <= 0)) ||
+ gedit_document_is_untitled (doc) || gedit_document_get_readonly (doc));
+}
+
+/**
+ * gedit_view_container_get_auto_save_interval:
+ * @container: a #GeditViewContainer
+ *
+ * Gets the current interval for the autosaves
+ *
+ * Return value: the value of the autosave
+ **/
+gint
+gedit_view_container_get_auto_save_interval (GeditViewContainer *container)
+{
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ g_return_val_if_fail (GEDIT_IS_VIEW_CONTAINER (container), 0);
+
+ return container->priv->auto_save_interval;
+}
+
+/**
+ * gedit_view_container_set_auto_save_interval:
+ * @container: a #GeditViewContainer
+ * @interval: the new interval
+ *
+ * Sets the interval for the autosave feature. It does nothing if the
+ * interval is the same as the one already present. It removes the old
+ * interval timeout and adds a new one with the autosave passed as
+ * argument.
+ **/
+void
+gedit_view_container_set_auto_save_interval (GeditViewContainer *container,
+ gint interval)
+{
+ GeditDocument *doc = NULL;
+
+ gedit_debug (DEBUG_VIEW_CONTAINER);
+
+ g_return_if_fail (GEDIT_IS_VIEW_CONTAINER (container));
+
+ doc = gedit_view_container_get_document (container);
+
+ g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+ g_return_if_fail (interval > 0);
+
+ if (container->priv->auto_save_interval == interval)
+ return;
+
+ container->priv->auto_save_interval = interval;
+
+ if (!container->priv->auto_save)
+ return;
+
+ if (container->priv->auto_save_timeout > 0)
+ {
+ g_return_if_fail (!gedit_document_is_untitled (doc));
+ g_return_if_fail (!gedit_document_get_readonly (doc));
+
+ remove_auto_save_timeout (container);
+
+ install_auto_save_timeout (container);
+ }
+}
diff --cc gedit/gedit-view-container.h
index 5113b72,0000000..0ec2151
mode 100644,000000..100644
--- a/gedit/gedit-view-container.h
+++ b/gedit/gedit-view-container.h
@@@ -1,181 -1,0 +1,182 @@@
+/*
+ * gedit-view-container.h
+ * This file is part of gedit
+ *
+ * Copyright (C) 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, 2005. See the AUTHORS file for a
+ * list of people on the gedit Team.
+ * See the ChangeLog files for a list of changes.
+ *
+ * $Id$
+ */
+
+#ifndef __GEDIT_VIEW_CONTAINER_H__
+#define __GEDIT_VIEW_CONTAINER_H__
+
+#include <gtk/gtk.h>
+
+#include <gedit/gedit-view-interface.h>
+#include <gedit/gedit-document-interface.h>
+
+G_BEGIN_DECLS
+
+typedef enum
+{
+ GEDIT_VIEW_CONTAINER_STATE_NORMAL = 0,
+ GEDIT_VIEW_CONTAINER_STATE_LOADING,
+ GEDIT_VIEW_CONTAINER_STATE_REVERTING,
- GEDIT_VIEW_CONTAINER_STATE_SAVING,
++ GEDIT_VIEW_CONTAINER_STATE_SAVING,
+ GEDIT_VIEW_CONTAINER_STATE_PRINTING,
+ GEDIT_VIEW_CONTAINER_STATE_PRINT_PREVIEWING,
+ GEDIT_VIEW_CONTAINER_STATE_SHOWING_PRINT_PREVIEW,
+ GEDIT_VIEW_CONTAINER_STATE_GENERIC_NOT_EDITABLE,
+ GEDIT_VIEW_CONTAINER_STATE_LOADING_ERROR,
- GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR,
++ GEDIT_VIEW_CONTAINER_STATE_REVERTING_ERROR,
+ GEDIT_VIEW_CONTAINER_STATE_SAVING_ERROR,
+ GEDIT_VIEW_CONTAINER_STATE_GENERIC_ERROR,
+ GEDIT_VIEW_CONTAINER_STATE_CLOSING,
+ GEDIT_VIEW_CONTAINER_STATE_EXTERNALLY_MODIFIED_NOTIFICATION,
+ GEDIT_VIEW_CONTAINER_NUM_OF_STATES /* This is not a valid state */
+} GeditViewContainerState;
+
+typedef enum
+{
+ GEDIT_VIEW_CONTAINER_MODE_TEXT = 0,
+ GEDIT_VIEW_CONTAINER_MODE_BINARY
+} GeditViewContainerMode;
+
+/*
+ * Type checking and casting macros
+ */
+#define GEDIT_TYPE_VIEW_CONTAINER (gedit_view_container_get_type())
+#define GEDIT_VIEW_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GEDIT_TYPE_VIEW_CONTAINER, GeditViewContainer))
+#define GEDIT_VIEW_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GEDIT_TYPE_VIEW_CONTAINER, GeditViewContainerClass))
+#define GEDIT_IS_VIEW_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GEDIT_TYPE_VIEW_CONTAINER))
+#define GEDIT_IS_VIEW_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEDIT_TYPE_VIEW_CONTAINER))
+#define GEDIT_VIEW_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GEDIT_TYPE_VIEW_CONTAINER, GeditViewContainerClass))
+
+/* Private structure type */
+typedef struct _GeditViewContainerPrivate GeditViewContainerPrivate;
+
+/*
+ * Main object structure
+ */
+typedef struct _GeditViewContainer GeditViewContainer;
+
+struct _GeditViewContainer
+{
+ GtkVBox vbox;
+
+ /*< private > */
+ GeditViewContainerPrivate *priv;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _GeditViewContainerClass GeditViewContainerClass;
+
+struct _GeditViewContainerClass
+{
+ GtkVBoxClass parent_class;
+
+ void (* view_added) (GeditViewContainer *container,
+ GeditView *view);
+ void (* view_removed) (GeditViewContainer *container,
+ GeditView *view);
+ void (* active_view_changed) (GeditViewContainer *container,
+ GeditView *view);
+};
+
+/*
+ * Public methods
+ */
+GType gedit_view_container_get_type (void) G_GNUC_CONST;
+
+GeditView *gedit_view_container_get_view (GeditViewContainer *container);
+
+GList *gedit_view_container_get_views (GeditViewContainer *container);
+
+/* This is only an helper function */
+GeditDocument *gedit_view_container_get_document (GeditViewContainer *container);
+
+GeditViewContainer *gedit_view_container_get_from_view (GeditView *view);
+
+GeditViewContainer *gedit_view_container_get_from_document (GeditDocument *doc);
+
+GeditViewContainerState gedit_view_container_get_state (GeditViewContainer *container);
+
+GeditViewContainerMode gedit_view_container_get_mode (GeditViewContainer *container);
+
+gboolean gedit_view_container_get_auto_save_enabled
+ (GeditViewContainer *container);
+
+void gedit_view_container_set_auto_save_enabled
+ (GeditViewContainer *container,
+ gboolean enable);
+
+gint gedit_view_container_get_auto_save_interval
+ (GeditViewContainer *container);
+
+void gedit_view_container_set_auto_save_interval
+ (GeditViewContainer *container,
+ gint interval);
+
+/*
+ * Non exported methods
+ */
+GtkWidget *_gedit_view_container_new (void);
+
+/* Whether create is TRUE, creates a new empty document if location does
+ not refer to an existing file */
+GtkWidget *_gedit_view_container_new_from_uri (const gchar *uri,
+ const GeditEncoding *encoding,
+ gint line_pos,
+ gboolean create);
+gchar *_gedit_view_container_get_name (GeditViewContainer *container);
+gchar *_gedit_view_container_get_tooltips (GeditViewContainer *container);
+GdkPixbuf *_gedit_view_container_get_icon (GeditViewContainer *container);
+void _gedit_view_container_load (GeditViewContainer *container,
+ const gchar *uri,
+ const GeditEncoding *encoding,
+ gint line_pos,
+ gboolean create);
+void _gedit_view_container_revert (GeditViewContainer *container);
+void _gedit_view_container_save (GeditViewContainer *container);
+void _gedit_view_container_save_as (GeditViewContainer *container,
+ const gchar *uri,
- const GeditEncoding *encoding);
++ const GeditEncoding *encoding,
++ GeditDocumentNewlineType newline_type);
+
+void _gedit_view_container_print (GeditViewContainer *container);
+void _gedit_view_container_print_preview (GeditViewContainer *container);
+
+void _gedit_view_container_mark_for_closing (GeditViewContainer *container);
+
+gboolean _gedit_view_container_can_close (GeditViewContainer *container);
+
+#if !GTK_CHECK_VERSION (2, 17, 4)
+void _gedit_view_container_page_setup (GeditViewContainer *container);
+#endif
+
+G_END_DECLS
+
+#endif /* __GEDIT_VIEW_CONTAINER_H__ */
diff --cc gedit/gedit-window.c
index 6433d51,7e290c6..647e49e
--- a/gedit/gedit-window.c
+++ b/gedit/gedit-window.c
@@@ -3273,6 -3202,19 +3274,23 @@@ sync_languages_menu (GeditDocument *doc
}
static void
+ readonly_changed (GeditDocument *doc,
+ GParamSpec *pspec,
+ GeditWindow *window)
+ {
- set_sensitivity_according_to_tab (window, window->priv->active_tab);
++ GeditViewContainer *container;
++
++ set_sensitivity_according_to_page (window, window->priv->active_page);
++
++ container = gedit_window_get_active_view_container (window);
+
- sync_name (window->priv->active_tab, NULL, window);
++ sync_name (container, NULL, window);
+
+ gedit_plugins_engine_update_plugins_ui (gedit_plugins_engine_get_default (),
- window);
++ window);
+ }
+
+ static void
editable_changed (GeditView *view,
GParamSpec *arg1,
GeditWindow *window)
@@@ -3303,40 -3245,44 +3321,44 @@@ update_sensitivity_according_to_open_pa
}
static void
-notebook_tab_added (GeditNotebook *notebook,
- GeditTab *tab,
- GeditWindow *window)
+connect_per_container_signals (GeditWindow *window,
+ GeditViewContainer *container)
{
- GeditView *view;
+ GList *views, *l;
GeditDocument *doc;
- gedit_debug (DEBUG_WINDOW);
-
- g_return_if_fail ((window->priv->state & GEDIT_WINDOW_STATE_SAVING_SESSION) == 0);
-
- ++window->priv->num_tabs;
-
- update_sensitivity_according_to_open_tabs (window);
-
- view = gedit_tab_get_view (tab);
- doc = gedit_tab_get_document (tab);
-
- /* IMPORTANT: remember to disconnect the signal in notebook_tab_removed
- * if a new signal is connected here */
+ views = gedit_view_container_get_views (container);
+ doc = gedit_view_container_get_document (container);
- g_signal_connect (tab,
+ g_signal_connect (container,
"notify::name",
- G_CALLBACK (sync_name),
+ G_CALLBACK (sync_name),
window);
- g_signal_connect (tab,
+ g_signal_connect (container,
"notify::state",
- G_CALLBACK (sync_state),
+ G_CALLBACK (sync_state),
window);
+ if (GEDIT_IS_TEXT_BUFFER (doc))
+ {
+ g_signal_connect (doc,
+ "cursor-moved",
+ G_CALLBACK (update_cursor_position_statusbar),
+ window);
+ g_signal_connect (doc,
+ "notify::language",
+ G_CALLBACK (sync_languages_menu),
+ window);
+ g_signal_connect (doc,
+ "notify::can-search-again",
+ G_CALLBACK (can_search_again),
+ window);
+ }
-
++
+ g_signal_connect (doc,
- "cursor-moved",
- G_CALLBACK (update_cursor_position_statusbar),
- window);
- g_signal_connect (doc,
- "notify::can-search-again",
- G_CALLBACK (can_search_again),
++ "notify::read-only",
++ G_CALLBACK (readonly_changed),
+ window);
g_signal_connect (doc,
"notify::can-undo",
G_CALLBACK (can_undo),
@@@ -3349,163 -3295,21 +3371,166 @@@
"notify::has-selection",
G_CALLBACK (selection_changed),
window);
- g_signal_connect (doc,
- "notify::language",
- G_CALLBACK (sync_languages_menu),
- window);
- g_signal_connect (doc,
- "notify::read-only",
- G_CALLBACK (readonly_changed),
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ GeditView *view = GEDIT_VIEW (l->data);
+
+ if (GEDIT_IS_TEXT_VIEW (view))
+ {
+ g_signal_connect (view,
+ "toggle_overwrite",
+ G_CALLBACK (update_overwrite_mode_statusbar),
+ window);
+ }
+ g_signal_connect (view,
+ "notify::editable",
+ G_CALLBACK (editable_changed),
+ window);
+
+ g_signal_connect (view,
+ "drop_uris",
+ G_CALLBACK (drop_uris_cb),
+ NULL);
+ }
+}
+
+static void
+disconnect_per_container_signals (GeditWindow *window,
+ GeditViewContainer *container)
+{
+ GList *views, *l;
+ GeditDocument *doc;
+
+ views = gedit_view_container_get_views (container);
+ doc = gedit_view_container_get_document (container);
+
+ g_signal_handlers_disconnect_by_func (container,
+ G_CALLBACK (sync_name),
+ window);
+ g_signal_handlers_disconnect_by_func (container,
+ G_CALLBACK (sync_state),
+ window);
+
+ if (GEDIT_IS_TEXT_BUFFER (doc))
+ {
+ g_signal_handlers_disconnect_by_func (doc,
+ G_CALLBACK (update_cursor_position_statusbar),
+ window);
+ g_signal_handlers_disconnect_by_func (doc,
+ G_CALLBACK (can_search_again),
+ window);
+ g_signal_handlers_disconnect_by_func (doc,
+ G_CALLBACK (sync_languages_menu),
+ window);
+ }
- g_signal_handlers_disconnect_by_func (doc,
++ g_signal_handlers_disconnect_by_func (doc,
++ G_CALLBACK (readonly_changed),
++ window);
++ g_signal_handlers_disconnect_by_func (doc,
+ G_CALLBACK (can_undo),
+ window);
- g_signal_handlers_disconnect_by_func (doc,
++ g_signal_handlers_disconnect_by_func (doc,
+ G_CALLBACK (can_redo),
+ window);
+ g_signal_handlers_disconnect_by_func (doc,
+ G_CALLBACK (selection_changed),
+ window);
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ GeditView *view = GEDIT_VIEW (l->data);
+
+ if (GEDIT_IS_TEXT_VIEW (view))
+ {
+ g_signal_handlers_disconnect_by_func (view,
+ G_CALLBACK (update_overwrite_mode_statusbar),
+ window);
+ }
+ g_signal_handlers_disconnect_by_func (view,
+ G_CALLBACK (editable_changed),
+ window);
+ g_signal_handlers_disconnect_by_func (view,
+ G_CALLBACK (drop_uris_cb),
+ NULL);
+ }
+}
+
+static void
+on_container_added (GeditPage *page,
+ GeditViewContainer *container,
+ GeditWindow *window)
+{
+ connect_per_container_signals (window, container);
+}
+
+static void
+on_container_removed (GeditPage *page,
+ GeditViewContainer *container,
+ GeditWindow *window)
+{
+ if (window->priv->active_container == container)
+ {
+ window->priv->active_container = NULL;
+ }
+}
+
+static void
+on_active_container_changed (GeditPage *page,
+ GeditViewContainer *container,
+ GeditWindow *window)
+{
+ disconnect_per_container_properties (window, window->priv->active_container);
+
+ window->priv->active_container = container;
+
+ connect_per_container_properties (window, container);
+}
+
+static void
+notebook_page_added (GeditNotebook *notebook,
+ GeditPage *page,
+ GeditWindow *window)
+{
+ GList *containers, *l;
+ GtkAction *action;
+
+ gedit_debug (DEBUG_WINDOW);
+
+ g_return_if_fail ((window->priv->state & GEDIT_WINDOW_STATE_SAVING_SESSION) == 0);
+
+ ++window->priv->num_pages;
+
+ /* Set sensitivity */
+ if (!gtk_action_group_get_sensitive (window->priv->action_group))
+ gtk_action_group_set_sensitive (window->priv->action_group,
+ TRUE);
+
+ action = gtk_action_group_get_action (window->priv->action_group,
+ "DocumentsMoveToNewWindow");
+ gtk_action_set_sensitive (action,
+ window->priv->num_pages > 1);
+
+ containers = gedit_page_get_view_containers (page);
+
+ /* IMPORTANT: remember to disconnect the signal in notebook_page_removed
+ * if a new signal is connected here */
+
+ /* By default we have at least one container then we have to listen
+ * container-added to catch the new ones */
+ for (l = containers; l != NULL; l = g_list_next (l))
+ {
+ connect_per_container_signals (window, l->data);
+ }
+
+ g_signal_connect (page, "container-added",
+ G_CALLBACK (on_container_added),
window);
- g_signal_connect (view,
- "toggle_overwrite",
- G_CALLBACK (update_overwrite_mode_statusbar),
+ g_signal_connect (page, "container-removed",
+ G_CALLBACK (on_container_removed),
window);
- g_signal_connect (view,
- "notify::editable",
- G_CALLBACK (editable_changed),
+ g_signal_connect (page, "active-container-changed",
+ G_CALLBACK (on_active_container_changed),
window);
update_documents_list_menu (window);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]