[gedit/multiviews: 49/49] Merge branch 'master' into multiviews



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]