[gitg] Started with modularized panels



commit afd4ca204647c15d1ba5753bfc7e519a03b3c661
Author: Jesse van den Kieboom <jessevdk gnome org>
Date:   Mon May 31 02:27:48 2010 +0200

    Started with modularized panels

 gitg/Makefile.am                      |   84 ++--
 gitg/gitg-revision-files-view-panel.c | 1040 +++++++++++++++++++++++++++++++++
 gitg/gitg-revision-files-view-panel.h |   61 ++
 gitg/gitg-revision-files-view.ui      |   64 ++
 gitg/gitg-revision-panel.c            |   67 +++
 gitg/gitg-revision-panel.h            |   39 ++
 gitg/gitg-revision-tree-store.c       |  123 ----
 gitg/gitg-revision-tree-store.h       |   65 --
 gitg/gitg-revision-tree-view.c        |  731 -----------------------
 gitg/gitg-revision-tree-view.h        |   62 --
 gitg/gitg-revision-view.ui            |  241 ++++++++
 gitg/gitg-utils.c                     |   18 +-
 gitg/gitg-utils.h                     |    3 +-
 gitg/gitg-window.c                    |  147 ++++--
 gitg/gitg-window.ui                   |  331 +-----------
 15 files changed, 1672 insertions(+), 1404 deletions(-)
---
diff --git a/gitg/Makefile.am b/gitg/Makefile.am
index a9db2fe..1a1e86d 100644
--- a/gitg/Makefile.am
+++ b/gitg/Makefile.am
@@ -11,48 +11,48 @@ AM_CPPFLAGS =							\
 	-DGITG_DATADIR=\""$(datadir)/gitg"\"			\
 	-DGITG_LOCALEDIR=\""$(datadir)/locale"\"
 
-NOINST_H_FILES = 			\
-	gitg-branch-actions.h		\
-	gitg-cell-renderer-path.h	\
-	gitg-commit-view.h		\
-	gitg-data-binding.h		\
-	gitg-diff-line-renderer.h	\
-	gitg-diff-view.h		\
-	gitg-dirs.h			\
-	gitg-dnd.h			\
-	gitg-label-renderer.h		\
-	gitg-preferences-dialog.h	\
-	gitg-preferences.h		\
-	gitg-repository-dialog.h	\
-	gitg-revision-tree-store.h	\
-	gitg-revision-tree-view.h	\
-	gitg-revision-view.h		\
-	gitg-settings.h			\
-	gitg-utils.h			\
-	gitg-window.h			\
+NOINST_H_FILES = 				\
+	gitg-branch-actions.h			\
+	gitg-cell-renderer-path.h		\
+	gitg-commit-view.h			\
+	gitg-data-binding.h			\
+	gitg-diff-line-renderer.h		\
+	gitg-diff-view.h			\
+	gitg-dirs.h				\
+	gitg-dnd.h				\
+	gitg-label-renderer.h			\
+	gitg-preferences-dialog.h		\
+	gitg-preferences.h			\
+	gitg-repository-dialog.h		\
+	gitg-revision-panel.h			\
+	gitg-revision-files-view-panel.h	\
+	gitg-revision-view.h			\
+	gitg-settings.h				\
+	gitg-utils.h				\
+	gitg-window.h				\
 	gseal-gtk-compat.h
 
-gitg_SOURCES = 				\
-	$(BUILT_SOURCES)		\
-	gitg.c				\
-	gitg-branch-actions.c		\
-	gitg-cell-renderer-path.c	\
-	gitg-commit-view.c		\
-	gitg-data-binding.c		\
-	gitg-diff-line-renderer.c	\
-	gitg-diff-view.c		\
-	gitg-dirs.c			\
-	gitg-dnd.c			\
-	gitg-label-renderer.c		\
-	gitg-preferences.c		\
-	gitg-preferences-dialog.c	\
-	gitg-repository-dialog.c	\
-	gitg-revision-tree-store.c	\
-	gitg-revision-tree-view.c	\
-	gitg-revision-view.c		\
-	gitg-settings.c			\
-	gitg-utils.c			\
-	gitg-window.c			\
+gitg_SOURCES = 					\
+	$(BUILT_SOURCES)			\
+	gitg.c					\
+	gitg-branch-actions.c			\
+	gitg-cell-renderer-path.c		\
+	gitg-commit-view.c			\
+	gitg-data-binding.c			\
+	gitg-diff-line-renderer.c		\
+	gitg-diff-view.c			\
+	gitg-dirs.c				\
+	gitg-dnd.c				\
+	gitg-label-renderer.c			\
+	gitg-preferences.c			\
+	gitg-preferences-dialog.c		\
+	gitg-repository-dialog.c		\
+	gitg-revision-panel.c			\
+	gitg-revision-files-view-panel.c	\
+	gitg-revision-view.c			\
+	gitg-settings.c				\
+	gitg-utils.c				\
+	gitg-window.c				\
 	$(NOINST_H_FILES)
 
 gitg_LDADD =		\
@@ -70,7 +70,9 @@ ui_DATA = \
 	gitg-menus.xml			\
 	gitg-preferences.ui		\
 	gitg-tag.ui			\
-	gitg-repository.ui
+	gitg-repository.ui		\
+	gitg-revision-view.ui		\
+	gitg-revision-files-view.ui
 
 EXTRA_DIST = 				\
 	$(ui_DATA)
diff --git a/gitg/gitg-revision-files-view-panel.c b/gitg/gitg-revision-files-view-panel.c
new file mode 100644
index 0000000..1ccd5ea
--- /dev/null
+++ b/gitg/gitg-revision-files-view-panel.c
@@ -0,0 +1,1040 @@
+/*
+ * gitg-revision-tree-view.c
+ * This file is part of gitg - git repository viewer
+ *
+ * Copyright (C) 2009 - Jesse van den Kieboom
+ *
+ * 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.
+ */
+
+#include <gtksourceview/gtksourceview.h>
+#include <gtksourceview/gtksourcelanguagemanager.h>
+#include <string.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <libgitg/gitg-revision.h>
+#include <libgitg/gitg-runner.h>
+
+#include "gitg-revision-files-view-panel.h"
+#include "gitg-utils.h"
+#include "gitg-revision-panel.h"
+#include "gitg-dirs.h"
+
+#define GITG_REVISION_FILES_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GITG_TYPE_REVISION_FILES_VIEW, GitgRevisionFilesViewPrivate))
+
+#define GITG_REVISION_FILES_VIEW_PANEL_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanelPrivate))
+
+enum
+{
+	ICON_COLUMN,
+	NAME_COLUMN,
+	CONTENT_TYPE_COLUMN,
+	N_COLUMNS
+};
+
+typedef struct _GitgRevisionFilesView GitgRevisionFilesView;
+typedef struct _GitgRevisionFilesViewClass GitgRevisionFilesViewClass;
+typedef struct _GitgRevisionFilesViewPrivate GitgRevisionFilesViewPrivate;
+
+struct _GitgRevisionFilesViewPrivate
+{
+	GtkTreeView *tree_view;
+	GtkSourceView *contents;
+	GitgRunner *content_runner;
+	GtkTreeStore *store;
+
+	gchar *drag_dir;
+	gchar **drag_files;
+
+	GitgRepository *repository;
+	GitgRevision *revision;
+	GitgRunner *loader;
+	GtkTreePath *load_path;
+
+	gboolean skipped_blank_line;
+};
+
+struct _GitgRevisionFilesView
+{
+	GtkHPaned parent;
+
+	GitgRevisionFilesViewPrivate *priv;
+};
+
+struct _GitgRevisionFilesViewClass
+{
+	GtkHPanedClass parent_class;
+};
+
+struct _GitgRevisionFilesViewPanelPrivate
+{
+	GitgRevisionFilesView *panel;
+};
+
+#define GITG_TYPE_REVISION_FILES_VIEW		(gitg_revision_files_view_get_type ())
+#define GITG_REVISION_FILES_VIEW(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_FILES_VIEW, GitgRevisionFilesView))
+
+static void gitg_revision_files_view_buildable_iface_init (GtkBuildableIface *iface);
+static void gitg_revision_panel_iface_init (GitgRevisionPanelInterface *iface);
+
+static void load_node (GitgRevisionFilesView *view, GtkTreeIter *parent);
+static gchar *node_identity (GitgRevisionFilesView *view, GtkTreeIter *iter);
+
+G_DEFINE_TYPE_EXTENDED (GitgRevisionFilesViewPanel,
+                        gitg_revision_files_view_panel,
+                        G_TYPE_OBJECT,
+                        0,
+                        G_IMPLEMENT_INTERFACE (GITG_TYPE_REVISION_PANEL,
+                                               gitg_revision_panel_iface_init));
+
+G_DEFINE_TYPE_EXTENDED (GitgRevisionFilesView,
+                        gitg_revision_files_view,
+                        GTK_TYPE_HPANED,
+                        0,
+                        G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                                               gitg_revision_files_view_buildable_iface_init));
+
+static GtkBuildableIface parent_iface;
+
+static void
+gitg_revision_files_view_finalize (GObject *object)
+{
+	GitgRevisionFilesView *self = GITG_REVISION_FILES_VIEW (object);
+
+	if (self->priv->load_path)
+	{
+		gtk_tree_path_free (self->priv->load_path);
+	}
+
+	g_free (self->priv->drag_dir);
+
+	if (self->priv->drag_files)
+	{
+		g_strfreev (self->priv->drag_files);
+	}
+
+	gitg_runner_cancel (self->priv->loader);
+	g_object_unref (self->priv->loader);
+
+	G_OBJECT_CLASS (gitg_revision_files_view_parent_class)->finalize (object);
+}
+
+static void
+load_tree (GitgRevisionFilesView *files_view)
+{
+	load_node (files_view, NULL);
+}
+
+static void
+set_revision (GitgRevisionFilesView *files_view,
+              GitgRepository       *repository,
+              GitgRevision         *revision)
+{
+	gitg_runner_cancel (files_view->priv->loader);
+	gtk_tree_store_clear (files_view->priv->store);
+
+	if (files_view->priv->repository)
+	{
+		g_object_unref (files_view->priv->repository);
+	}
+
+	if (files_view->priv->revision)
+	{
+		gitg_revision_unref (files_view->priv->revision);
+	}
+
+	if (repository)
+	{
+		files_view->priv->repository = g_object_ref (repository);
+	}
+	else
+	{
+		files_view->priv->repository = NULL;
+	}
+
+	if (revision)
+	{
+		files_view->priv->revision = gitg_revision_ref (revision);
+	}
+	else
+	{
+		files_view->priv->revision = NULL;
+	}
+
+	if (files_view->priv->repository && files_view->priv->revision)
+	{
+		load_tree (files_view);
+	}
+
+}
+
+static void
+gitg_revision_files_view_dispose (GObject *object)
+{
+	set_revision (GITG_REVISION_FILES_VIEW (object), NULL, NULL);
+
+	G_OBJECT_CLASS (gitg_revision_files_view_parent_class)->dispose (object);
+}
+
+static gboolean
+loaded (GitgRevisionFilesView *view,
+        GtkTreeIter          *iter)
+{
+	gint num;
+
+	num = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(view->priv->store),
+	                                      iter);
+
+	if (num != 1)
+	{
+		return TRUE;
+	}
+
+	gchar *content_type = NULL;
+	GtkTreeIter child;
+
+	if (!gtk_tree_model_iter_children (GTK_TREE_MODEL(view->priv->store),
+	                                   &child,
+	                                   iter))
+	{
+		return FALSE;
+	}
+
+	gtk_tree_model_get (GTK_TREE_MODEL(view->priv->store),
+	                    &child,
+	                    CONTENT_TYPE_COLUMN,
+	                    &content_type,
+	                    -1);
+
+	gboolean ret = content_type != NULL;
+	g_free (content_type);
+
+	return ret;
+}
+
+static void
+on_row_expanded (GtkTreeView          *files_view,
+                 GtkTreeIter          *iter,
+                 GtkTreePath          *path,
+                 GitgRevisionFilesView *view)
+{
+	if (loaded (view, iter))
+	{
+		return;
+	}
+
+	load_node (view, iter);
+}
+
+static void
+show_binary_information (GitgRevisionFilesView *tree)
+{
+	GtkTextBuffer *buffer;
+
+	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(tree->priv->contents));
+
+	gtk_text_buffer_set_text (buffer,
+	                          _ ("Cannot display file content as text"),
+	                          -1);
+
+	gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buffer), NULL);
+}
+
+static void
+on_selection_changed (GtkTreeSelection     *selection,
+                      GitgRevisionFilesView *tree)
+{
+	GtkTextBuffer *buffer;
+
+	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->contents));
+
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+
+	gitg_runner_cancel (tree->priv->content_runner);
+
+	gtk_text_buffer_set_text (buffer, "", -1);
+
+	if (!tree->priv->revision)
+	{
+		return;
+	}
+
+	GList *rows = gtk_tree_selection_get_selected_rows (selection, &model);
+	GtkTreePath *path = NULL;
+
+	if (g_list_length (rows) == 1)
+	{
+		path = gtk_tree_path_copy ((GtkTreePath *)rows->data);
+	}
+
+	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free (rows);
+
+	if (!path)
+	{
+		return;
+	}
+
+	gchar *name;
+	gchar *content_type;
+	gtk_tree_model_get_iter (model, &iter, path);
+	gtk_tree_path_free (path);
+	gtk_tree_model_get (model,
+	                    &iter,
+	                    NAME_COLUMN,
+	                    &name,
+	                    CONTENT_TYPE_COLUMN,
+	                    &content_type,
+	                    -1);
+
+	if (!content_type)
+	{
+		return;
+	}
+
+	if (!gitg_utils_can_display_content_type (content_type))
+	{
+		show_binary_information (tree);
+	}
+	else
+	{
+		GtkSourceLanguage *language;
+
+		language = gitg_utils_get_language (name, content_type);
+		gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buffer),
+		                                language);
+
+		gchar *id = node_identity (tree, &iter);
+
+		gitg_repository_run_commandv (tree->priv->repository,
+		                              tree->priv->content_runner,
+		                              NULL,
+		                              "show",
+		                              "--encoding=UTF-8",
+		                              id,
+		                              NULL);
+
+		g_free (id);
+	}
+
+	g_free (name);
+	g_free (content_type);
+}
+
+static gchar *
+node_path (GtkTreeModel *model,
+           GtkTreeIter  *parent)
+{
+	if (!parent)
+	{
+		return NULL;
+	}
+
+	gchar *name;
+	gtk_tree_model_get (model,
+	                    parent,
+	                    NAME_COLUMN,
+	                    &name,
+	                    -1);
+
+	GtkTreeIter parent_iter;
+	gchar *ret;
+
+	if (gtk_tree_model_iter_parent (model, &parent_iter, parent))
+	{
+		gchar *path = node_path (model, &parent_iter);
+		ret = g_build_filename (path, name, NULL);
+		g_free (path);
+		g_free (name);
+	}
+	else
+	{
+		ret = name;
+	}
+
+	return ret;
+}
+
+static void
+export_drag_files (GitgRevisionFilesView *files_view)
+{
+	GtkTreeSelection *selection;
+	GtkTreeModel *model;
+
+	selection = gtk_tree_view_get_selection (files_view->priv->tree_view);
+
+	GList *rows = gtk_tree_selection_get_selected_rows (selection, &model);
+	gint num = g_list_length (rows);
+	
+	if (num == 0)
+	{
+		g_list_free (rows);
+		return;
+	}
+
+	GList *item;
+
+	files_view->priv->drag_files = g_new (gchar *, num + 1);
+	gchar **ptr = files_view->priv->drag_files;
+
+	for (item = rows; item; item = item->next)
+	{
+		GtkTreePath *path = (GtkTreePath *)item->data;
+		GtkTreeIter iter;
+		gtk_tree_model_get_iter (model, &iter, path);
+
+		*ptr++ = node_path (model, &iter);
+		gtk_tree_path_free (path);
+	}
+
+	*ptr = NULL;
+	g_list_free (rows);
+
+	// Prepend temporary directory in uri list
+	g_free (files_view->priv->drag_dir);
+	gchar const *tmp = g_get_tmp_dir ();
+	files_view->priv->drag_dir = g_build_filename (tmp,
+	                                              "gitg-export-XXXXXX",
+	                                              NULL);
+
+	if (!mkdtemp (files_view->priv->drag_dir))
+	{
+		g_warning ("Could not create temporary directory for export");
+		return;
+	}
+
+	// Do the export
+	gitg_utils_export_files (files_view->priv->repository,
+	                         files_view->priv->revision,
+	                         files_view->priv->drag_dir,
+	                         files_view->priv->drag_files);
+
+	ptr = files_view->priv->drag_files;
+
+	while (*ptr)
+	{
+		gchar *tmp = g_build_filename (files_view->priv->drag_dir, *ptr, NULL);
+		g_free (*ptr);
+
+		GFile *file = g_file_new_for_path (tmp);
+		*ptr++ = g_file_get_uri (file);
+
+		g_free (tmp);
+	}
+}
+
+static void
+on_drag_data_get (GtkWidget            *widget,
+                  GdkDragContext       *context,
+                  GtkSelectionData     *selection,
+                  guint                 info,
+                  guint                 time,
+                  GitgRevisionFilesView *files_view)
+{
+	if (!files_view->priv->drag_files)
+	{
+		export_drag_files (files_view);
+	}
+
+	gtk_selection_data_set_uris (selection, files_view->priv->drag_files);
+}
+
+static gboolean
+test_selection (GtkTreeSelection *selection,
+                GtkTreeModel     *model,
+                GtkTreePath      *path,
+                gboolean          path_currently_selected,
+                gpointer          data)
+{
+	if (path_currently_selected)
+	{
+		return TRUE;
+	}
+
+	// Test for (Empty)
+	GtkTreeIter iter;
+
+	if (!gtk_tree_model_get_iter (model, &iter, path))
+	{
+		return FALSE;
+	}
+
+	gchar *content_type;
+	gtk_tree_model_get (model,
+	                    &iter,
+	                    CONTENT_TYPE_COLUMN,
+	                    &content_type,
+	                    -1);
+
+	if (!content_type)
+	{
+		return FALSE;
+	}
+
+	g_free (content_type);
+	return TRUE;
+}
+
+static void
+on_drag_end (GtkWidget            *widget,
+             GdkDragContext       *context,
+             GitgRevisionFilesView *files_view)
+{
+	if (files_view->priv->drag_files != NULL)
+	{
+		g_strfreev (files_view->priv->drag_files);
+		files_view->priv->drag_files = NULL;
+
+		g_free (files_view->priv->drag_dir);
+		files_view->priv->drag_dir = NULL;
+	}
+}
+
+static void
+gitg_revision_files_view_parser_finished (GtkBuildable *buildable,
+                                         GtkBuilder   *builder)
+{
+	if (parent_iface.parser_finished)
+	{
+		parent_iface.parser_finished (buildable, builder);
+	}
+
+	// Store widgets
+	GitgRevisionFilesView *files_view = GITG_REVISION_FILES_VIEW(buildable);
+	files_view->priv->tree_view = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+	                                            "revision_files"));
+	files_view->priv->contents = GTK_SOURCE_VIEW (gtk_builder_get_object (builder,
+	                                             "revision_files_contents"));
+
+	gtk_text_view_set_buffer (GTK_TEXT_VIEW(files_view->priv->contents),
+	                          GTK_TEXT_BUFFER(gtk_source_buffer_new (NULL)));
+
+	gitg_utils_set_monospace_font (GTK_WIDGET(files_view->priv->contents));
+	gtk_tree_view_set_model (files_view->priv->tree_view,
+	                         GTK_TREE_MODEL(files_view->priv->store));
+
+	GtkTreeSelection *selection;
+
+	selection = gtk_tree_view_get_selection (files_view->priv->tree_view);
+	gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
+	gtk_tree_selection_set_select_function (selection,
+	                                        test_selection,
+	                                        NULL,
+	                                        NULL);
+
+	// Setup drag source
+	GtkTargetEntry targets[] = {
+		{"text/uri-list", GTK_TARGET_OTHER_APP, 0}
+	};
+
+	// Set tree view as a drag source
+	gtk_drag_source_set (GTK_WIDGET(files_view->priv->tree_view),
+	                     GDK_BUTTON1_MASK,
+	                     targets,
+	                     1,
+	                     GDK_ACTION_DEFAULT | GDK_ACTION_COPY);
+
+	// Connect signals
+	g_signal_connect_after (files_view->priv->tree_view,
+	                        "row-expanded",
+	                        G_CALLBACK(on_row_expanded),
+	                        files_view);
+
+	g_signal_connect (files_view->priv->tree_view,
+	                  "drag-data-get",
+	                  G_CALLBACK(on_drag_data_get),
+	                  files_view);
+
+	g_signal_connect (files_view->priv->tree_view,
+	                  "drag-end",
+	                  G_CALLBACK(on_drag_end),
+	                  files_view);
+
+	g_signal_connect (selection,
+	                  "changed",
+	                  G_CALLBACK(on_selection_changed),
+	                  files_view);
+}
+
+static void
+gitg_revision_panel_update_impl (GitgRevisionPanel *panel,
+                                 GitgRepository    *repository,
+                                 GitgRevision      *revision)
+{
+	GitgRevisionFilesViewPanel *files_view_panel;
+
+	files_view_panel = GITG_REVISION_FILES_VIEW_PANEL (panel);
+
+	set_revision (files_view_panel->priv->panel, repository, revision);
+}
+
+static gchar *
+gitg_revision_panel_get_label_impl (GitgRevisionPanel *panel)
+{
+	return g_strdup (_("Files"));
+}
+
+static GtkWidget *
+gitg_revision_panel_get_panel_impl (GitgRevisionPanel *panel)
+{
+	GtkBuilder *builder;
+	GtkWidget *ret;
+	GitgRevisionFilesViewPanel *files_view_panel;
+
+	files_view_panel = GITG_REVISION_FILES_VIEW_PANEL (panel);
+
+	if (files_view_panel->priv->panel)
+	{
+		return GTK_WIDGET (files_view_panel->priv->panel);
+	}
+
+	builder = gitg_utils_new_builder ("gitg-revision-files-view.ui");
+	ret = GTK_WIDGET (gtk_builder_get_object (builder, "revision_files_view"));
+	files_view_panel->priv->panel = g_object_ref (ret);
+
+	g_object_unref (builder);
+
+	return ret;
+}
+
+static void
+gitg_revision_panel_iface_init (GitgRevisionPanelInterface *iface)
+{
+	iface->update = gitg_revision_panel_update_impl;
+	iface->get_label = gitg_revision_panel_get_label_impl;
+	iface->get_panel = gitg_revision_panel_get_panel_impl;
+}
+
+static void
+gitg_revision_files_view_buildable_iface_init (GtkBuildableIface *iface)
+{
+	parent_iface = *iface;
+
+	iface->parser_finished = gitg_revision_files_view_parser_finished;
+}
+
+static void
+gitg_revision_files_view_class_init (GitgRevisionFilesViewClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS(klass);
+
+	object_class->finalize = gitg_revision_files_view_finalize;
+	object_class->dispose = gitg_revision_files_view_dispose;
+
+	g_type_class_add_private (object_class, sizeof (GitgRevisionFilesViewPrivate));
+}
+
+static void
+gitg_revision_files_view_panel_dispose (GObject *object)
+{
+	GitgRevisionFilesViewPanel *panel;
+
+	panel = GITG_REVISION_FILES_VIEW_PANEL (object);
+
+	if (panel->priv->panel)
+	{
+		g_object_unref (panel->priv->panel);
+		panel->priv->panel = NULL;
+	}
+
+	G_OBJECT_CLASS (gitg_revision_files_view_panel_parent_class)->dispose (object);
+}
+
+static void
+gitg_revision_files_view_panel_class_init (GitgRevisionFilesViewPanelClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->dispose = gitg_revision_files_view_panel_dispose;
+
+	g_type_class_add_private (object_class, sizeof (GitgRevisionFilesViewPanelPrivate));
+}
+
+static gchar *
+get_content_type (gchar    *name,
+                  gboolean  dir)
+{
+	if (dir)
+	{
+		return g_strdup ("inode/directory");
+	}
+	else
+	{
+		return g_content_type_guess (name, NULL, 0, NULL);
+	}
+}
+
+static void
+remove_dummy (GitgRevisionFilesView *tree)
+{
+	if (!tree->priv->load_path)
+	{
+		return;
+	}
+
+	GtkTreeIter parent;
+	GtkTreeModel *model = GTK_TREE_MODEL(tree->priv->store);
+	gtk_tree_model_get_iter (model, &parent, tree->priv->load_path);
+
+	if (gtk_tree_model_iter_n_children (model, &parent) != 2)
+	{
+		return;
+	}
+
+	GtkTreeIter child;
+	gtk_tree_model_iter_children (model, &child, &parent);
+
+	do
+	{
+		gchar *content_type;
+		gtk_tree_model_get (model,
+		                    &child,
+		                    CONTENT_TYPE_COLUMN,
+		                    &content_type,
+		                    -1);
+
+		if (!content_type)
+		{
+			gtk_tree_store_remove (tree->priv->store, &child);
+			break;
+		}
+		g_free (content_type);
+	} while (gtk_tree_model_iter_next (model, &child));
+}
+
+static void
+append_node (GitgRevisionFilesView *tree,
+             gchar                *line)
+{
+	GtkTreeIter parent;
+	GtkTreeIter iter;
+
+	if (tree->priv->load_path)
+	{
+		gtk_tree_model_get_iter (GTK_TREE_MODEL(tree->priv->store),
+		                         &parent,
+		                         tree->priv->load_path);
+		gtk_tree_store_append (tree->priv->store, &iter, &parent);
+	}
+	else
+	{
+		gtk_tree_store_append (tree->priv->store, &iter, NULL);
+	}
+
+	int len = strlen (line);
+	gboolean isdir = FALSE;
+
+	if (line[len - 1] == '/')
+	{
+		isdir = TRUE;
+		line[len - 1] = '\0';
+	}
+
+	GIcon *icon;
+
+	if (isdir)
+	{
+		GtkTreeIter empty;
+		gtk_tree_store_append (tree->priv->store, &empty, &iter);
+		gtk_tree_store_set (tree->priv->store,
+		                    &empty,
+		                    NAME_COLUMN,
+		                    _ ("(Empty)"),
+		                    -1);
+
+		gchar *content_type = get_content_type (line, TRUE);
+		gtk_tree_store_set (tree->priv->store,
+		                    &iter,
+		                    CONTENT_TYPE_COLUMN,
+		                    content_type,
+		                    -1);
+		icon = g_content_type_get_icon (content_type);
+		g_free (content_type);
+
+		if (icon && G_IS_THEMED_ICON(icon))
+		{
+			g_themed_icon_append_name (G_THEMED_ICON(icon), "folder");
+		}
+	}
+	else
+	{
+		gchar *content_type = get_content_type (line, FALSE);
+		icon = g_content_type_get_icon (content_type);
+		gtk_tree_store_set (tree->priv->store,
+		                    &iter,
+		                    CONTENT_TYPE_COLUMN,
+		                    content_type,
+		                    -1);
+		g_free (content_type);
+
+		if (icon && G_IS_THEMED_ICON(icon))
+		{
+			g_themed_icon_append_name (G_THEMED_ICON(icon),
+			                           "text-x-generic");
+		}
+	}
+
+	if (G_IS_THEMED_ICON(icon))
+	{
+		GtkIconTheme *theme = gtk_icon_theme_get_default ();
+
+		gchar **names;
+		g_object_get (icon, "names", &names, NULL);
+
+		GtkIconInfo *info;
+
+		info = gtk_icon_theme_choose_icon (theme,
+		                                   (gchar const **)names,
+		                                   16,
+		                                   0);
+
+		if (info)
+		{
+			GError *error = NULL;
+			GdkPixbuf *pixbuf = gtk_icon_info_load_icon (info, &error);
+
+			if (!pixbuf)
+			{
+				g_warning ("Error loading icon: %s", error->message);
+				g_error_free (error);
+			}
+
+			gtk_tree_store_set (tree->priv->store,
+			                    &iter,
+			                    ICON_COLUMN,
+			                    pixbuf,
+			                    -1);
+
+			if (pixbuf)
+			{
+				g_object_unref (pixbuf);
+			}
+
+			gtk_icon_info_free (info);
+		}
+
+		g_strfreev (names);
+	}
+
+	if (icon)
+	{
+		g_object_unref (icon);
+	}
+
+	gtk_tree_store_set (tree->priv->store,
+	                    &iter,
+	                    NAME_COLUMN,
+	                    line,
+	                    -1);
+	remove_dummy (tree);
+}
+
+static void
+on_update (GitgRunner            *runner,
+           gchar                **buffer,
+           GitgRevisionFilesView  *tree)
+{
+	gchar *line;
+
+	while ((line = *buffer++))
+	{
+		if (!tree->priv->skipped_blank_line)
+		{
+			if (*line == '\0')
+			{
+				tree->priv->skipped_blank_line = TRUE;
+			}
+
+			continue;
+		}
+
+		append_node (tree, line);
+	}
+}
+
+static gint
+compare_func (GtkTreeModel *model,
+              GtkTreeIter *a,
+              GtkTreeIter *b,
+              GitgRevisionFilesView *self)
+{
+	// First sort directories before files
+	gboolean da = gtk_tree_model_iter_has_child (model, a) != 0;
+	gboolean db = gtk_tree_model_iter_has_child (model, b) != 0;
+
+	if (da != db)
+	{
+		return da ? -1 : 1;
+	}
+
+	// Then sort on name
+	gchar *s1;
+	gchar *s2;
+
+	gtk_tree_model_get (model,
+	                    a,
+	                    NAME_COLUMN,
+	                    &s1,
+	                    -1);
+
+	gtk_tree_model_get (model,
+	                    b,
+	                    NAME_COLUMN,
+	                    &s2,
+	                    -1);
+
+	int ret = gitg_utils_sort_names (s1, s2);
+
+	g_free (s1);
+	g_free (s2);
+
+	return ret;
+}
+
+static void
+on_contents_update (GitgRunner *runner,
+                    gchar **buffer,
+                    GitgRevisionFilesView *tree)
+{
+	gchar *line;
+	GtkTextBuffer *buf;
+	GtkTextIter iter;
+
+	buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(tree->priv->contents));
+
+	gtk_text_buffer_get_end_iter (buf, &iter);
+
+	while ((line = *buffer++))
+	{
+		gtk_text_buffer_insert (buf, &iter, line, -1);
+		gtk_text_buffer_insert (buf, &iter, "\n", -1);
+	}
+
+	if (gtk_source_buffer_get_language (GTK_SOURCE_BUFFER(buf)) == NULL)
+	{
+		gchar *content_type = gitg_utils_guess_content_type (buf);
+
+		if (content_type && !gitg_utils_can_display_content_type (content_type))
+		{
+			gitg_runner_cancel (runner);
+			show_binary_information (tree);
+		}
+		else
+		{
+			GtkSourceLanguage *language;
+
+			language = gitg_utils_get_language (NULL, content_type);
+			gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buf),
+			                                language);
+		}
+
+		g_free (content_type);
+	}
+}
+
+static void
+gitg_revision_files_view_init (GitgRevisionFilesView *self)
+{
+	self->priv = GITG_REVISION_FILES_VIEW_GET_PRIVATE (self);
+	self->priv->store = gtk_tree_store_new (N_COLUMNS,
+	                                        GDK_TYPE_PIXBUF,
+	                                        G_TYPE_STRING,
+	                                        G_TYPE_STRING);
+
+	gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (self->priv->store),
+	                                 1,
+	                                 (GtkTreeIterCompareFunc)compare_func,
+	                                 self,
+	                                 NULL);
+
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self->priv->store),
+	                                      NAME_COLUMN,
+	                                      GTK_SORT_ASCENDING);
+
+	self->priv->loader = gitg_runner_new (1000);
+	g_signal_connect (self->priv->loader,
+	                  "update",
+	                  G_CALLBACK (on_update),
+	                  self);
+
+	self->priv->content_runner = gitg_runner_new (5000);
+	g_signal_connect (self->priv->content_runner,
+	                  "update",
+	                  G_CALLBACK (on_contents_update),
+	                  self);
+}
+
+static void
+gitg_revision_files_view_panel_init (GitgRevisionFilesViewPanel *self)
+{
+	self->priv = GITG_REVISION_FILES_VIEW_PANEL_GET_PRIVATE (self);
+}
+
+static gchar *
+node_identity (GitgRevisionFilesView *tree,
+               GtkTreeIter          *parent)
+{
+	gchar *sha = gitg_revision_get_sha1 (tree->priv->revision);
+
+	// Path consists of the SHA1 of the revision and the actual file path
+	// from parent
+	gchar *par = node_path (GTK_TREE_MODEL (tree->priv->store), parent);
+	gchar *path = g_strconcat (sha, ":", par, NULL);
+	g_free (sha);
+	g_free (par);
+
+	return path;
+}
+
+static void
+load_node (GitgRevisionFilesView *tree,
+           GtkTreeIter          *parent)
+{
+	if (gitg_runner_running (tree->priv->loader))
+	{
+		return;
+	}
+
+	if (tree->priv->load_path)
+	{
+		gtk_tree_path_free (tree->priv->load_path);
+	}
+
+	gchar *id = node_identity (tree, parent);
+
+	if (parent)
+	{
+		tree->priv->load_path =
+			gtk_tree_model_get_path (GTK_TREE_MODEL (tree->priv->store),
+			                         parent);
+	}
+	else
+	{
+		tree->priv->load_path = NULL;
+	}
+
+	tree->priv->skipped_blank_line = FALSE;
+	gitg_repository_run_commandv (tree->priv->repository,
+	                              tree->priv->loader,
+	                              NULL,
+	                              "show",
+	                              "--encoding=UTF-8",
+	                              id,
+	                              NULL);
+	g_free (id);
+}
diff --git a/gitg/gitg-revision-files-view-panel.h b/gitg/gitg-revision-files-view-panel.h
new file mode 100644
index 0000000..76cf132
--- /dev/null
+++ b/gitg/gitg-revision-files-view-panel.h
@@ -0,0 +1,61 @@
+/*
+ * gitg-revision-files-view_panel.h
+ * This file is part of gitg - git repository view_paneler
+ *
+ * Copyright (C) 2009 - Jesse van den Kieboom
+ *
+ * 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.
+ */
+
+#ifndef __GITG_REVISION_FILES_VIEW_PANEL_H__
+#define __GITG_REVISION_FILES_VIEW_PANEL_H__
+
+#include <gtk/gtk.h>
+#include <libgitg/gitg-repository.h>
+#include <libgitg/gitg-revision.h>
+
+G_BEGIN_DECLS
+
+#define GITG_TYPE_REVISION_FILES_VIEW_PANEL		(gitg_revision_files_view_panel_get_type ())
+#define GITG_REVISION_FILES_VIEW_PANEL(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanel))
+#define GITG_REVISION_FILES_VIEW_PANEL_CONST(obj)	(G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanel const))
+#define GITG_REVISION_FILES_VIEW_PANEL_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanelClass))
+#define GITG_IS_REVISION_FILES_VIEW_PANEL(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL))
+#define GITG_IS_REVISION_FILES_VIEW_PANEL_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), GITG_TYPE_REVISION_FILES_VIEW_PANEL))
+#define GITG_REVISION_FILES_VIEW_PANEL_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanelClass))
+
+typedef struct _GitgRevisionFilesViewPanel		GitgRevisionFilesViewPanel;
+typedef struct _GitgRevisionFilesViewPanelClass		GitgRevisionFilesViewPanelClass;
+typedef struct _GitgRevisionFilesViewPanelPrivate	GitgRevisionFilesViewPanelPrivate;
+
+struct _GitgRevisionFilesViewPanel
+{
+	GObject parent;
+
+	GitgRevisionFilesViewPanelPrivate *priv;
+};
+
+struct _GitgRevisionFilesViewPanelClass
+{
+	GObjectClass parent_class;
+};
+
+GType gitg_revision_files_view_panel_get_type (void) G_GNUC_CONST;
+GType gitg_revision_files_view_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GITG_REVISION_FILES_VIEW_PANEL_H__ */
diff --git a/gitg/gitg-revision-files-view.ui b/gitg/gitg-revision-files-view.ui
new file mode 100644
index 0000000..4d490c8
--- /dev/null
+++ b/gitg/gitg-revision-files-view.ui
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<interface>
+  <object class="GitgRevisionFilesView" id="revision_files_view">
+    <property name="visible">True</property>
+    <property name="can_focus">True</property>
+    <property name="position">200</property>
+    <child>
+      <object class="GtkScrolledWindow" id="scrolled_window_revision_files">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="hscrollbar_policy">automatic</property>
+        <property name="vscrollbar_policy">automatic</property>
+        <property name="shadow_type">etched-in</property>
+        <child>
+          <object class="GtkTreeView" id="revision_files">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="headers_visible">False</property>
+            <child>
+              <object class="GtkTreeViewColumn" id="revision_files_column">
+                <property name="title">Filename</property>
+                <child>
+                  <object class="GtkCellRendererPixbuf" id="renderer_icon"/>
+                  <attributes>
+                    <attribute name="pixbuf">0</attribute>
+                  </attributes>
+                </child>
+                <child>
+                  <object class="GtkCellRendererText" id="renderer_date"/>
+                  <attributes>
+                    <attribute name="text">1</attribute>
+                  </attributes>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="resize">False</property>
+        <property name="shrink">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkScrolledWindow" id="scrolled_window_files_contents">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="hscrollbar_policy">automatic</property>
+        <property name="vscrollbar_policy">automatic</property>
+        <property name="shadow_type">etched-in</property>
+        <child>
+          <object class="GtkSourceView" id="revision_files_contents">
+            <property name="editable">False</property>
+            <property name="show_line_numbers">True</property>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="resize">True</property>
+        <property name="shrink">True</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/gitg/gitg-revision-panel.c b/gitg/gitg-revision-panel.c
new file mode 100644
index 0000000..e575be2
--- /dev/null
+++ b/gitg/gitg-revision-panel.c
@@ -0,0 +1,67 @@
+#include "gitg-revision-panel.h"
+
+G_DEFINE_INTERFACE (GitgRevisionPanel, gitg_revision_panel, G_TYPE_INVALID)
+
+/* Default implementation */
+static gchar *
+gitg_revision_panel_get_label_default (GitgRevisionPanel *panel)
+{
+	g_return_val_if_reached (NULL);
+}
+
+static GtkWidget *
+gitg_revision_panel_get_panel_default (GitgRevisionPanel *panel)
+{
+	g_return_val_if_reached (NULL);
+}
+
+static void
+gitg_revision_panel_update_default (GitgRevisionPanel *panel,
+                                    GitgRepository    *repository,
+                                    GitgRevision      *revision)
+{
+	/* No default implementation */
+}
+
+static void
+gitg_revision_panel_default_init (GitgRevisionPanelInterface *iface)
+{
+	static gboolean initialized = FALSE;
+
+	iface->get_label = gitg_revision_panel_get_label_default;
+	iface->get_panel = gitg_revision_panel_get_panel_default;
+	iface->update = gitg_revision_panel_update_default;
+
+	if (!initialized)
+	{
+		initialized = TRUE;
+	}
+}
+
+gchar *
+gitg_revision_panel_get_label (GitgRevisionPanel *panel)
+{
+	g_return_val_if_fail (GITG_IS_REVISION_PANEL (panel), NULL);
+
+	return GITG_REVISION_PANEL_GET_INTERFACE (panel)->get_label (panel);
+}
+
+GtkWidget *
+gitg_revision_panel_get_panel (GitgRevisionPanel *panel)
+{
+	g_return_val_if_fail (GITG_IS_REVISION_PANEL (panel), NULL);
+
+	return GITG_REVISION_PANEL_GET_INTERFACE (panel)->get_panel (panel);
+}
+
+void
+gitg_revision_panel_update (GitgRevisionPanel *panel,
+                            GitgRepository    *repository,
+                            GitgRevision      *revision)
+{
+	g_return_if_fail (GITG_IS_REVISION_PANEL (panel));
+
+	GITG_REVISION_PANEL_GET_INTERFACE (panel)->update (panel,
+	                                                  repository,
+	                                                  revision);
+}
diff --git a/gitg/gitg-revision-panel.h b/gitg/gitg-revision-panel.h
new file mode 100644
index 0000000..d0a7c10
--- /dev/null
+++ b/gitg/gitg-revision-panel.h
@@ -0,0 +1,39 @@
+#ifndef __GITG_REVISION_PANEL_H__
+#define __GITG_REVISION_PANEL_H__
+
+#include <gtk/gtk.h>
+#include <libgitg/gitg-repository.h>
+
+G_BEGIN_DECLS
+
+#define GITG_TYPE_REVISION_PANEL		(gitg_revision_panel_get_type ())
+#define GITG_REVISION_PANEL(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_PANEL, GitgRevisionPanel))
+#define GITG_IS_REVISION_PANEL(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GITG_TYPE_REVISION_PANEL))
+#define GITG_REVISION_PANEL_GET_INTERFACE(obj)	(G_TYPE_INSTANCE_GET_INTERFACE ((obj), GITG_TYPE_REVISION_PANEL, GitgRevisionPanelInterface))
+
+typedef struct _GitgRevisionPanel		GitgRevisionPanel;
+typedef struct _GitgRevisionPanelInterface	GitgRevisionPanelInterface;
+
+struct _GitgRevisionPanelInterface
+{
+	GTypeInterface parent;
+
+	void       (*update)   ( GitgRevisionPanel *panel,
+	                         GitgRepository    *repository,
+	                         GitgRevision      *revision);
+
+	gchar     *(*get_label) (GitgRevisionPanel *panel);
+	GtkWidget *(*get_panel) (GitgRevisionPanel *panel);
+};
+
+GType gitg_revision_panel_get_type (void) G_GNUC_CONST;
+
+GtkWidget *gitg_revision_panel_get_panel (GitgRevisionPanel *panel);
+gchar     *gitg_revision_panel_get_label (GitgRevisionPanel *panel);
+void       gitg_revision_panel_update    (GitgRevisionPanel *panel,
+                                          GitgRepository    *repository,
+                                          GitgRevision      *revision);
+
+G_END_DECLS
+
+#endif /* __GITG_REVISION_PANEL_H__ */
diff --git a/gitg/gitg-revision-view.ui b/gitg/gitg-revision-view.ui
new file mode 100644
index 0000000..b106888
--- /dev/null
+++ b/gitg/gitg-revision-view.ui
@@ -0,0 +1,241 @@
+<?xml version="1.0"?>
+<interface>
+  <object class="GitgRevisionView" id="revision_view">
+    <property name="visible">True</property>
+    <property name="spacing">3</property>
+    <child>
+      <object class="GtkTable" id="table1">
+        <property name="visible">True</property>
+        <property name="n_rows">5</property>
+        <property name="n_columns">2</property>
+        <property name="column_spacing">6</property>
+        <property name="row_spacing">2</property>
+        <child>
+          <object class="GtkTable" id="table_parents">
+            <property name="visible">True</property>
+            <property name="n_columns">2</property>
+            <property name="column_spacing">3</property>
+            <property name="row_spacing">2</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="top_attach">4</property>
+            <property name="bottom_attach">5</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_subject">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="use_markup">True</property>
+            <property name="selectable">True</property>
+            <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="top_attach">3</property>
+            <property name="bottom_attach">4</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_date">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="use_markup">True</property>
+            <property name="selectable">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="top_attach">2</property>
+            <property name="bottom_attach">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_author">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="use_markup">True</property>
+            <property name="selectable">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="top_attach">1</property>
+            <property name="bottom_attach">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_sha">
+            <property name="visible">True</property>
+            <property name="xalign">0</property>
+            <property name="use_markup">True</property>
+            <property name="selectable">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="y_options">GTK_FILL</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_parent_lbl">
+            <property name="visible">True</property>
+            <property name="xalign">1</property>
+            <property name="yalign">0</property>
+            <property name="label" translatable="yes">Parent:</property>
+          </object>
+          <packing>
+            <property name="top_attach">4</property>
+            <property name="bottom_attach">5</property>
+            <property name="x_options">GTK_FILL</property>
+            <property name="y_options">GTK_FILL</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_subject_lbl">
+            <property name="visible">True</property>
+            <property name="xalign">1</property>
+            <property name="label" translatable="yes">Subject:</property>
+          </object>
+          <packing>
+            <property name="top_attach">3</property>
+            <property name="bottom_attach">4</property>
+            <property name="x_options">GTK_FILL</property>
+            <property name="y_options">GTK_FILL</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_date_lbl">
+            <property name="visible">True</property>
+            <property name="xalign">1</property>
+            <property name="label" translatable="yes">Date:</property>
+          </object>
+          <packing>
+            <property name="top_attach">2</property>
+            <property name="bottom_attach">3</property>
+            <property name="x_options">GTK_FILL</property>
+            <property name="y_options">GTK_FILL</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_author_lbl">
+            <property name="visible">True</property>
+            <property name="xalign">1</property>
+            <property name="label" translatable="yes">Author:</property>
+          </object>
+          <packing>
+            <property name="top_attach">1</property>
+            <property name="bottom_attach">2</property>
+            <property name="x_options">GTK_FILL</property>
+            <property name="y_options">GTK_FILL</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label_sha_lbl">
+            <property name="visible">True</property>
+            <property name="xalign">1</property>
+            <property name="label" translatable="yes">SHA:</property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="x_options">GTK_FILL</property>
+            <property name="y_options">GTK_FILL</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="padding">3</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHSeparator" id="hseparator1">
+        <property name="visible">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkHPaned" id="hpaned_revision_view">
+        <property name="visible">True</property>
+        <property name="position">200</property>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolled_window_revision_files">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <property name="shadow_type">etched-in</property>
+            <child>
+              <object class="GtkTreeView" id="tree_view_revision_files">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="headers_visible">False</property>
+                <child>
+                  <object class="GtkTreeViewColumn" id="revision_files_column_icon">
+                    <property name="sizing">fixed</property>
+                    <property name="fixed_width">20</property>
+                    <property name="title">Icon</property>
+                    <child>
+                      <object class="GtkCellRendererPixbuf" id="revision_files_cell_renderer_icon"/>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="revision_files_column_name">
+                    <property name="title">Filename</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="revision_files_cell_renderer_name"/>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="resize">False</property>
+            <property name="shrink">True</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolled_window_details">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <property name="shadow_type">etched-in</property>
+            <child>
+              <object class="GitgDiffView" id="revision_diff">
+                <property name="editable">False</property>
+                <property name="cursor_visible">False</property>
+                <property name="show_line_numbers">False</property>
+                <property name="tab_width">4</property>
+                <property name="diff_enabled">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="resize">True</property>
+            <property name="shrink">True</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="position">2</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/gitg/gitg-utils.c b/gitg/gitg-utils.c
index 570a9c1..61df5ac 100644
--- a/gitg/gitg-utils.c
+++ b/gitg/gitg-utils.c
@@ -164,23 +164,23 @@ gitg_utils_set_monospace_font(GtkWidget *widget)
 }
 
 GtkBuilder *
-gitg_utils_new_builder(gchar const *filename)
+gitg_utils_new_builder (gchar const *filename)
 {
-	GtkBuilder *b = gtk_builder_new();
+	GtkBuilder *b = gtk_builder_new ();
 	GError *error = NULL;
 
-	gchar *path = gitg_dirs_get_data_filename("ui", filename, NULL);
+	gchar *path = gitg_dirs_get_data_filename ("ui", filename, NULL);
 
-	if (!gtk_builder_add_from_file(b, path, &error))
+	if (!gtk_builder_add_from_file (b, path, &error))
 	{
-		g_critical("Could not open UI file: %s (%s)", path, error->message);
-		g_error_free(error);
+		g_critical ("Could not open UI file: %s (%s)", path, error->message);
+		g_error_free (error);
 
-		g_free(path);
-		exit(1);
+		g_free (path);
+		exit (1);
 	}
 
-	g_free(path);
+	g_free (path);
 	return b;
 }
 
diff --git a/gitg/gitg-utils.h b/gitg/gitg-utils.h
index e5f5e42..f202fb7 100644
--- a/gitg/gitg-utils.h
+++ b/gitg/gitg-utils.h
@@ -24,6 +24,7 @@
 #define __GITG_UTILS_H__
 
 #include <glib.h>
+#include <gio/gio.h>
 #include <gtksourceview/gtksourcelanguagemanager.h>
 #include <gtksourceview/gtksourcelanguage.h>
 
@@ -42,7 +43,7 @@ GtkSourceLanguage *gitg_utils_get_language(gchar const *filename, gchar const *c
 gchar *gitg_utils_get_monospace_font_name(void);
 void gitg_utils_set_monospace_font(GtkWidget *widget);
 
-GtkBuilder *gitg_utils_new_builder(gchar const *filename);
+GtkBuilder *gitg_utils_new_builder (gchar const *filename);
 
 gint gitg_utils_sort_names(gchar const *s1, gchar const *s2);
 
diff --git a/gitg/gitg-window.c b/gitg/gitg-window.c
index a847ff2..e201059 100644
--- a/gitg/gitg-window.c
+++ b/gitg/gitg-window.c
@@ -34,8 +34,6 @@
 #include "gitg-data-binding.h"
 #include "gitg-dirs.h"
 #include "gitg-window.h"
-#include "gitg-revision-view.h"
-#include "gitg-revision-tree-view.h"
 #include "gitg-cell-renderer-path.h"
 #include "gitg-commit-view.h"
 #include "gitg-settings.h"
@@ -45,6 +43,8 @@
 #include "gitg-branch-actions.h"
 #include "gitg-preferences.h"
 #include "gitg-utils.h"
+#include "gitg-revision-panel.h"
+#include "gitg-revision-files-view-panel.h"
 
 #define DYNAMIC_ACTION_DATA_KEY "GitgDynamicActionDataKey"
 #define DYNAMIC_ACTION_DATA_REMOTE_KEY "GitgDynamicActionDataRemoteKey"
@@ -70,8 +70,6 @@ struct _GitgWindowPrivate
 	GtkNotebook *notebook_main;
 	GtkTreeView *tree_view;
 	GtkStatusbar *statusbar;
-	GitgRevisionView *revision_view;
-	GitgRevisionTreeView *revision_tree_view;
 	GitgCommitView *commit_view;
 	GtkWidget *search_popup;
 	GtkComboBox *combo_branches;
@@ -82,6 +80,7 @@ struct _GitgWindowPrivate
 	GtkWidget *hpaned_commit1;
 	GtkWidget *hpaned_commit2;
 	GtkWidget *vpaned_commit;
+	GtkNotebook *notebook_revision;
 
 	GtkActionGroup *edit_group;
 	GtkActionGroup *repository_group;
@@ -102,6 +101,8 @@ struct _GitgWindowPrivate
 
 	GList *branch_actions;
 	GitgHash select_on_load;
+
+	GSList *revision_panels;
 };
 
 static gboolean on_tree_view_motion (GtkTreeView *treeview,
@@ -194,7 +195,77 @@ gitg_window_finalize (GObject *object)
 
 	g_list_free (copy);
 
-	G_OBJECT_CLASS(gitg_window_parent_class)->finalize (object);
+	G_OBJECT_CLASS (gitg_window_parent_class)->finalize (object);
+}
+
+static void
+on_revision_panel_mapped (GtkWidget  *page,
+                          GitgWindow *window)
+{
+	gint nth;
+	GitgRevisionPanel *panel;
+	GitgRevision *revision = NULL;
+	GtkTreeModel *model;
+	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+
+	selection = gtk_tree_view_get_selection (window->priv->tree_view);
+
+	if (gtk_tree_selection_get_selected (selection, &model, &iter))
+	{
+		gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &revision, -1);
+	}
+
+	if (!revision)
+	{
+		return;
+	}
+
+	nth = gtk_notebook_page_num (window->priv->notebook_revision,
+	                             page);
+
+	panel = g_slist_nth_data (window->priv->revision_panels, nth);
+
+	gitg_revision_panel_update (panel,
+	                            window->priv->repository,
+	                            revision);
+
+	gitg_revision_unref (revision);
+}
+
+static void
+add_revision_panel (GitgWindow *window,
+                    GType       panel_type)
+{
+	GitgRevisionPanel *panel;
+	gchar *label;
+	GtkWidget *label_widget;
+	GtkWidget *page;
+
+	g_return_if_fail (g_type_is_a (panel_type, GITG_TYPE_REVISION_PANEL));
+
+	panel = g_object_new (panel_type, NULL);
+
+	window->priv->revision_panels = g_slist_append (window->priv->revision_panels,
+	                                                panel);
+
+	label = gitg_revision_panel_get_label (panel);
+	label_widget = gtk_label_new (label);
+	gtk_widget_show (label_widget);
+
+	g_free (label);
+
+	page = gitg_revision_panel_get_panel (panel);
+	gtk_widget_show (page);
+
+	g_signal_connect (page,
+	                  "map",
+	                  G_CALLBACK (on_revision_panel_mapped),
+	                  window);
+
+	gtk_notebook_append_page (window->priv->notebook_revision,
+	                          page,
+	                          label_widget);
 }
 
 static void
@@ -204,19 +275,29 @@ on_selection_changed (GtkTreeSelection *selection,
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	GitgRevision *revision = NULL;
+	GSList *item;
 
 	if (gtk_tree_selection_get_selected (selection, &model, &iter))
 	{
 		gtk_tree_model_get (GTK_TREE_MODEL(model), &iter, 0, &revision, -1);
 	}
 
-	gitg_revision_view_update (window->priv->revision_view,
-	                           window->priv->repository,
-	                           revision);
+	gint i = 0;
+
+	for (item = window->priv->revision_panels; item; item = g_slist_next (item))
+	{
+		GtkWidget *page;
+
+		page = gtk_notebook_get_nth_page (window->priv->notebook_revision,
+		                                  i++);
 
-	gitg_revision_tree_view_update (window->priv->revision_tree_view,
-	                                window->priv->repository,
-	                                revision);
+		if (gtk_widget_get_mapped (page) || !revision)
+		{
+			gitg_revision_panel_update (item->data,
+			                            window->priv->repository,
+			                            revision);
+		}
+	}
 
 	if (revision)
 	{
@@ -423,14 +504,6 @@ goto_hash (GitgWindow  *window,
 }
 
 static void
-on_parent_activated (GitgRevisionView *view,
-                     gchar            *hash,
-                     GitgWindow       *window)
-{
-	goto_hash (window, hash);
-}
-
-static void
 on_renderer_path (GtkTreeViewColumn    *column,
                   GitgCellRendererPath *renderer,
                   GtkTreeModel         *model,
@@ -605,10 +678,6 @@ restore_state (GitgWindow *window)
 	gitg_utils_restore_pane_position (GTK_PANED(window->priv->hpaned_commit2),
 	                                  gitg_settings_get_hpaned_commit2_position (settings, 200),
 	                                  TRUE);
-
-	gitg_utils_restore_pane_position (GTK_PANED(window->priv->revision_tree_view),
-	                                  gitg_settings_get_revision_tree_view_position (settings, -1),
-	                                  FALSE);
 }
 
 static void
@@ -846,18 +915,15 @@ gitg_window_parser_finished (GtkBuildable *buildable,
 	window->priv->notebook_main = GTK_NOTEBOOK (gtk_builder_get_object (builder,
 	                                            "notebook_main"));
 
+	window->priv->notebook_revision = GTK_NOTEBOOK (gtk_builder_get_object (builder,
+	                                                "notebook_revision"));
+
 	window->priv->tree_view = GTK_TREE_VIEW (gtk_builder_get_object (builder,
 	                                         "tree_view_rv"));
 
 	window->priv->statusbar = GTK_STATUSBAR (gtk_builder_get_object (builder,
 	                                         "statusbar"));
 
-	window->priv->revision_view = GITG_REVISION_VIEW (gtk_builder_get_object (builder,
-	                                                  "revision_view"));
-
-	window->priv->revision_tree_view = GITG_REVISION_TREE_VIEW (gtk_builder_get_object (builder,
-	                                                            "revision_tree_view"));
-
 	window->priv->commit_view = GITG_COMMIT_VIEW (gtk_builder_get_object (builder,
 	                                              "vpaned_commit"));
 
@@ -881,6 +947,9 @@ gitg_window_parser_finished (GtkBuildable *buildable,
 
 	gtk_builder_connect_signals (builder, window);
 
+	// Initialize revision panels
+	add_revision_panel (window, GITG_TYPE_REVISION_FILES_VIEW_PANEL);
+
 	// Connect signals
 	GtkTreeSelection *selection = gtk_tree_view_get_selection (window->priv->tree_view);
 	g_signal_connect (selection,
@@ -888,11 +957,6 @@ gitg_window_parser_finished (GtkBuildable *buildable,
 	                  G_CALLBACK(on_selection_changed),
 	                  window);
 
-	g_signal_connect (window->priv->revision_view,
-	                  "parent-activated",
-	                  G_CALLBACK(on_parent_activated),
-	                  window);
-
 	g_signal_connect (window->priv->tree_view,
 	                  "motion-notify-event",
 	                  G_CALLBACK(on_tree_view_motion),
@@ -968,10 +1032,6 @@ save_state (GitgWindow *window)
 		                                           position);
 	}
 
-	position = gtk_paned_get_position (GTK_PANED (window->priv->revision_tree_view));
-	gitg_settings_set_revision_tree_view_position (settings,
-	                                               position);
-
 	gitg_settings_save (settings);
 }
 
@@ -1000,6 +1060,11 @@ gitg_window_destroy (GtkObject *object)
 	if (!window->priv->destroy_has_run)
 	{
 		gtk_tree_view_set_model (window->priv->tree_view, NULL);
+
+		g_slist_foreach (window->priv->revision_panels, (GFunc)g_object_unref, NULL);
+		g_slist_free (window->priv->revision_panels);
+
+		window->priv->revision_panels = NULL;
 		window->priv->destroy_has_run = TRUE;
 	}
 
@@ -1740,9 +1805,6 @@ load_repository (GitgWindow   *window,
 		gitg_commit_view_set_repository (window->priv->commit_view,
 		                                 window->priv->repository);
 
-		gitg_revision_view_set_repository (window->priv->revision_view,
-		                                  window->priv->repository);
-
 		add_recent_item (window);
 	}
 	else
@@ -1752,9 +1814,6 @@ load_repository (GitgWindow   *window,
 		gitg_commit_view_set_repository (window->priv->commit_view,
 		                                 NULL);
 
-		gitg_revision_view_set_repository (window->priv->revision_view,
-		                                   NULL);
-
 		update_window_title (window);
 	}
 
diff --git a/gitg/gitg-window.ui b/gitg/gitg-window.ui
index 54173eb..76117df 100644
--- a/gitg/gitg-window.ui
+++ b/gitg/gitg-window.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <interface>
-  <!-- interface-requires gtk+ 2.16 -->
-  <!-- interface-requires gitg 0.2 -->
+  <!-- interface-requires gtk+ 2.20 -->
+  <!-- interface-requires gitg 0.0.6 -->
   <!-- interface-requires sourceview2 0.0 -->
   <!-- interface-naming-policy toplevel-contextual -->
   <object class="GtkAdjustment" id="adjustment_context">
@@ -147,335 +147,10 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkNotebook" id="notebook">
+                      <object class="GtkNotebook" id="notebook_revision">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="border_width">6</property>
-                        <child>
-                          <object class="GitgRevisionView" id="revision_view">
-                            <property name="visible">True</property>
-                            <property name="spacing">3</property>
-                            <child>
-                              <object class="GtkTable" id="table1">
-                                <property name="visible">True</property>
-                                <property name="n_rows">5</property>
-                                <property name="n_columns">2</property>
-                                <property name="column_spacing">6</property>
-                                <property name="row_spacing">2</property>
-                                <child>
-                                  <object class="GtkTable" id="table_parents">
-                                    <property name="visible">True</property>
-                                    <property name="n_columns">2</property>
-                                    <property name="column_spacing">3</property>
-                                    <property name="row_spacing">2</property>
-                                    <child>
-                                      <placeholder/>
-                                    </child>
-                                    <child>
-                                      <placeholder/>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="left_attach">1</property>
-                                    <property name="right_attach">2</property>
-                                    <property name="top_attach">4</property>
-                                    <property name="bottom_attach">5</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_subject">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="use_markup">True</property>
-                                    <property name="selectable">True</property>
-                                    <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
-                                  </object>
-                                  <packing>
-                                    <property name="left_attach">1</property>
-                                    <property name="right_attach">2</property>
-                                    <property name="top_attach">3</property>
-                                    <property name="bottom_attach">4</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_date">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="use_markup">True</property>
-                                    <property name="selectable">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="left_attach">1</property>
-                                    <property name="right_attach">2</property>
-                                    <property name="top_attach">2</property>
-                                    <property name="bottom_attach">3</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_author">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="use_markup">True</property>
-                                    <property name="selectable">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="left_attach">1</property>
-                                    <property name="right_attach">2</property>
-                                    <property name="top_attach">1</property>
-                                    <property name="bottom_attach">2</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_sha">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="use_markup">True</property>
-                                    <property name="selectable">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="left_attach">1</property>
-                                    <property name="right_attach">2</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_parent_lbl">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">1</property>
-                                    <property name="yalign">0</property>
-                                    <property name="label" translatable="yes">Parent:</property>
-                                  </object>
-                                  <packing>
-                                    <property name="top_attach">4</property>
-                                    <property name="bottom_attach">5</property>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_subject_lbl">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">1</property>
-                                    <property name="label" translatable="yes">Subject:</property>
-                                  </object>
-                                  <packing>
-                                    <property name="top_attach">3</property>
-                                    <property name="bottom_attach">4</property>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_date_lbl">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">1</property>
-                                    <property name="label" translatable="yes">Date:</property>
-                                  </object>
-                                  <packing>
-                                    <property name="top_attach">2</property>
-                                    <property name="bottom_attach">3</property>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_author_lbl">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">1</property>
-                                    <property name="label" translatable="yes">Author:</property>
-                                  </object>
-                                  <packing>
-                                    <property name="top_attach">1</property>
-                                    <property name="bottom_attach">2</property>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label_sha_lbl">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">1</property>
-                                    <property name="label" translatable="yes">SHA:</property>
-                                    <property name="use_markup">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="padding">3</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkHSeparator" id="hseparator1">
-                                <property name="visible">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkHPaned" id="hpaned_revision_view">
-                                <property name="visible">True</property>
-                                <property name="position">200</property>
-                                <child>
-                                  <object class="GtkScrolledWindow" id="scrolled_window_revision_files">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="hscrollbar_policy">automatic</property>
-                                    <property name="vscrollbar_policy">automatic</property>
-                                    <property name="shadow_type">etched-in</property>
-                                    <child>
-                                      <object class="GtkTreeView" id="tree_view_revision_files">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="headers_visible">False</property>
-                                        <child>
-                                          <object class="GtkTreeViewColumn" id="revision_files_column_icon">
-                                            <property name="sizing">fixed</property>
-                                            <property name="fixed_width">20</property>
-                                            <property name="title">Icon</property>
-                                            <child>
-                                              <object class="GtkCellRendererPixbuf" id="revision_files_cell_renderer_icon"/>
-                                            </child>
-                                          </object>
-                                        </child>
-                                        <child>
-                                          <object class="GtkTreeViewColumn" id="revision_files_column_name">
-                                            <property name="title">Filename</property>
-                                            <child>
-                                              <object class="GtkCellRendererText" id="revision_files_cell_renderer_name"/>
-                                            </child>
-                                          </object>
-                                        </child>
-                                      </object>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="resize">False</property>
-                                    <property name="shrink">True</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkScrolledWindow" id="scrolled_window_details">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="hscrollbar_policy">automatic</property>
-                                    <property name="vscrollbar_policy">automatic</property>
-                                    <property name="shadow_type">etched-in</property>
-                                    <child>
-                                      <object class="GitgDiffView" id="revision_diff">
-                                        <property name="editable">False</property>
-                                        <property name="cursor_visible">False</property>
-                                        <property name="show_line_numbers">False</property>
-                                        <property name="tab_width">4</property>
-                                        <property name="diff_enabled">True</property>
-                                      </object>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="resize">True</property>
-                                    <property name="shrink">True</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
-                          </object>
-                        </child>
-                        <child type="tab">
-                          <object class="GtkLabel" id="label_details">
-                            <property name="visible">True</property>
-                            <property name="label" translatable="yes">Details</property>
-                          </object>
-                          <packing>
-                            <property name="tab_fill">False</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GitgRevisionTreeView" id="revision_tree_view">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="position">200</property>
-                            <child>
-                              <object class="GtkScrolledWindow" id="scrolled_window_revision_tree">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="hscrollbar_policy">automatic</property>
-                                <property name="vscrollbar_policy">automatic</property>
-                                <property name="shadow_type">etched-in</property>
-                                <child>
-                                  <object class="GtkTreeView" id="revision_tree">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="headers_visible">False</property>
-                                    <child>
-                                      <object class="GtkTreeViewColumn" id="revision_tree_column">
-                                        <property name="title">Filename</property>
-                                        <child>
-                                          <object class="GtkCellRendererPixbuf" id="renderer_icon"/>
-                                          <attributes>
-                                            <attribute name="pixbuf">0</attribute>
-                                          </attributes>
-                                        </child>
-                                        <child>
-                                          <object class="GtkCellRendererText" id="renderer_date"/>
-                                          <attributes>
-                                            <attribute name="text">1</attribute>
-                                          </attributes>
-                                        </child>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="resize">False</property>
-                                <property name="shrink">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkScrolledWindow" id="scrolled_window_tree_contents">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="hscrollbar_policy">automatic</property>
-                                <property name="vscrollbar_policy">automatic</property>
-                                <property name="shadow_type">etched-in</property>
-                                <child>
-                                  <object class="GtkSourceView" id="revision_tree_contents">
-                                    <property name="editable">False</property>
-                                    <property name="show_line_numbers">True</property>
-                                  </object>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="resize">True</property>
-                                <property name="shrink">True</property>
-                              </packing>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child type="tab">
-                          <object class="GtkLabel" id="label_tree">
-                            <property name="visible">True</property>
-                            <property name="label" translatable="yes">Tree</property>
-                          </object>
-                          <packing>
-                            <property name="position">1</property>
-                            <property name="tab_fill">False</property>
-                          </packing>
-                        </child>
                       </object>
                       <packing>
                         <property name="resize">False</property>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]