[gthumb: 2/23] started work on a contact sheet creator



commit eb5add4c12a04df8acdeab14fabd9f05c1dc8041
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Wed Dec 8 17:04:19 2010 +0100

    started work on a contact sheet creator

 configure.ac                                       |    4 +
 extensions/Makefile.am                             |    4 +-
 extensions/contact_sheet/Makefile.am               |   42 +
 extensions/contact_sheet/actions.c                 |   48 +
 extensions/contact_sheet/actions.h                 |   31 +
 extensions/contact_sheet/callbacks.c               |   98 ++
 extensions/contact_sheet/callbacks.h               |   29 +
 .../contact_sheet/contact_sheet.extension.in.in    |   12 +
 extensions/contact_sheet/data/Makefile.am          |   18 +
 .../data/contact_sheet_themes/Makefile.am          |    8 +
 .../data/gthumb_contact_sheet.schemas.in           |  200 ++++
 extensions/contact_sheet/data/ui/Makefile.am       |    5 +
 .../contact_sheet/data/ui/contact-sheet-creator.ui | 1081 ++++++++++++++++++++
 extensions/contact_sheet/dlg-contact-sheet.c       |  510 +++++++++
 extensions/contact_sheet/dlg-contact-sheet.h       |   30 +
 .../contact_sheet/gth-contact-sheet-creator.c      |  280 +++++
 .../contact_sheet/gth-contact-sheet-creator.h      |   86 ++
 extensions/contact_sheet/main.c                    |   52 +
 extensions/contact_sheet/preferences.h             |   47 +
 19 files changed, 2584 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index be79633..5c88493 100644
--- a/configure.ac
+++ b/configure.ac
@@ -500,6 +500,10 @@ extensions/change_date/data/ui/Makefile
 extensions/comments/Makefile
 extensions/comments/data/Makefile
 extensions/comments/data/ui/Makefile
+extensions/contact_sheet/Makefile
+extensions/contact_sheet/data/Makefile
+extensions/contact_sheet/data/contact_sheet_themes/Makefile
+extensions/contact_sheet/data/ui/Makefile
 extensions/convert_format/Makefile
 extensions/convert_format/data/Makefile
 extensions/convert_format/data/ui/Makefile
diff --git a/extensions/Makefile.am b/extensions/Makefile.am
index 024bb49..dce6130 100644
--- a/extensions/Makefile.am
+++ b/extensions/Makefile.am
@@ -33,7 +33,9 @@ SUBDIRS = 			\
 	webalbums		\
 	flicker			\
 	burn_disc		\
-	desktop_background
+	desktop_background	\
+	contact_sheet		\
+	$(NULL)
 
 EXTRA_DIST = example
 
diff --git a/extensions/contact_sheet/Makefile.am b/extensions/contact_sheet/Makefile.am
new file mode 100644
index 0000000..fadbf4b
--- /dev/null
+++ b/extensions/contact_sheet/Makefile.am
@@ -0,0 +1,42 @@
+SUBDIRS = data
+
+extensiondir = $(pkglibdir)/extensions
+extension_LTLIBRARIES = libcontact_sheet.la
+
+libcontact_sheet_la_SOURCES = 		\
+	actions.c			\
+	actions.h			\
+	callbacks.c			\
+	callbacks.h			\
+	dlg-contact-sheet.c		\
+	dlg-contact-sheet.h		\
+	gth-contact-sheet-creator.c	\
+	gth-contact-sheet-creator.h	\
+	main.c				\
+	preferences.h
+
+if RUN_IN_PLACE
+contact_sheet_datadir = $(abs_top_srcdir)/extensions/contact_sheet/data
+else
+contact_sheet_datadir = $(pkgdatadir)
+endif
+
+libcontact_sheet_la_CFLAGS = $(GTHUMB_CFLAGS) -I$(top_srcdir) -I$(top_builddir)/gthumb -DCONTACT_SHEET_DATADIR=\"$(contact_sheet_datadir)\"
+libcontact_sheet_la_LDFLAGS = $(EXTENSION_LIBTOOL_FLAGS)
+libcontact_sheet_la_LIBADD = $(GTHUMB_LIBS) ../image_rotation/libimage_rotation.la ../export_tools/libexport_tools.la
+libcontact_sheet_la_DEPENDENCIES = $(top_builddir)/gthumb/gthumb$(EXEEXT)
+
+extensioninidir = $(extensiondir)
+extensionini_DATA = $(extensionini_in_files:.extension.in.in=.extension)
+DISTCLEANFILES = $(extensionini_DATA)
+
+extensionini_in_files = contact_sheet.extension.in.in
+
+ GTHUMB_EXTENSION_IN_RULE@
+ GTHUMB_EXTENSION_RULE@
+
+EXTRA_DIST = $(extensionini_in_files)
+
+CLEANFILES = $(BUILT_SOURCES) 
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/actions.c b/extensions/contact_sheet/actions.c
new file mode 100644
index 0000000..213c511
--- /dev/null
+++ b/extensions/contact_sheet/actions.c
@@ -0,0 +1,48 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <gthumb.h>
+#include "dlg-contact-sheet.h"
+
+
+void
+gth_browser_activate_action_create_contact_sheet (GtkAction  *action,
+						  GthBrowser *browser)
+{
+	GList *items;
+	GList *file_data_list;
+	GList *file_list;
+
+	items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser)));
+	file_data_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items);
+	if (file_data_list == NULL)
+		file_data_list = gth_file_store_get_visibles (gth_browser_get_file_store (browser));
+	file_list = gth_file_data_list_to_file_list (file_data_list);
+
+	dlg_contact_sheet (browser, file_list);
+
+	_g_object_list_unref (file_list);
+	_g_object_list_unref (file_data_list);
+	_gtk_tree_path_list_free (items);
+}
diff --git a/extensions/contact_sheet/actions.h b/extensions/contact_sheet/actions.h
new file mode 100644
index 0000000..240731f
--- /dev/null
+++ b/extensions/contact_sheet/actions.h
@@ -0,0 +1,31 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ACTIONS_H
+#define ACTIONS_H
+
+#include <gtk/gtk.h>
+
+#define DEFINE_ACTION(x) void x (GtkAction *action, gpointer data);
+
+DEFINE_ACTION(gth_browser_activate_action_create_contact_sheet)
+
+#endif /* ACTIONS_H */
diff --git a/extensions/contact_sheet/callbacks.c b/extensions/contact_sheet/callbacks.c
new file mode 100644
index 0000000..28908e2
--- /dev/null
+++ b/extensions/contact_sheet/callbacks.c
@@ -0,0 +1,98 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+#include <gthumb.h>
+#include "actions.h"
+
+
+#define BROWSER_DATA_KEY "contact-sheet-browser-data"
+
+
+static const char *ui_info =
+"<ui>"
+"  <menubar name='MenuBar'>"
+"    <menu name='File' action='FileMenu'>"
+"      <menu name='Export' action='ExportMenu'>"
+"        <placeholder name='Web_Services'>"
+"          <menuitem action='Tool_CreateContactSheet'/>"
+"        </placeholder>"
+"      </menu>"
+"    </menu>"
+"  </menubar>"
+"  <popup name='ExportPopup'>"
+"    <placeholder name='Misc_Actions'>"
+"      <menuitem action='Tool_CreateContactSheet'/>"
+"    </placeholder>"
+"  </popup>"
+"</ui>";
+
+
+static GtkActionEntry action_entries[] = {
+	{ "Tool_CreateContactSheet", "contact-sheet",
+	  N_("Contact _Sheet..."), NULL,
+	  N_("Create a contact sheet"),
+	  G_CALLBACK (gth_browser_activate_action_create_contact_sheet) },
+};
+
+
+typedef struct {
+	GtkActionGroup *action_group;
+} BrowserData;
+
+
+static void
+browser_data_free (BrowserData *data)
+{
+	g_free (data);
+}
+
+
+void
+cs__gth_browser_construct_cb (GthBrowser *browser)
+{
+	BrowserData *data;
+	GError      *error = NULL;
+	guint        merge_id;
+
+	g_return_if_fail (GTH_IS_BROWSER (browser));
+
+	data = g_new0 (BrowserData, 1);
+
+	data->action_group = gtk_action_group_new ("Web Albums Actions");
+	gtk_action_group_set_translation_domain (data->action_group, NULL);
+	gtk_action_group_add_actions (data->action_group,
+				      action_entries,
+				      G_N_ELEMENTS (action_entries),
+				      browser);
+	gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), data->action_group, 0);
+
+	merge_id = gtk_ui_manager_add_ui_from_string (gth_browser_get_ui_manager (browser), ui_info, -1, &error);
+	if (merge_id == 0) {
+		g_warning ("building ui failed: %s", error->message);
+		g_clear_error (&error);
+	}
+
+	g_object_set_data_full (G_OBJECT (browser), BROWSER_DATA_KEY, data, (GDestroyNotify) browser_data_free);
+}
diff --git a/extensions/contact_sheet/callbacks.h b/extensions/contact_sheet/callbacks.h
new file mode 100644
index 0000000..d895b06
--- /dev/null
+++ b/extensions/contact_sheet/callbacks.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CALLBACKS_H
+#define CALLBACKS_H
+
+#include <gthumb.h>
+
+void cs__gth_browser_construct_cb (GthBrowser *browser);
+
+#endif /* CALLBACKS_H */
diff --git a/extensions/contact_sheet/contact_sheet.extension.in.in b/extensions/contact_sheet/contact_sheet.extension.in.in
new file mode 100644
index 0000000..bd30d79
--- /dev/null
+++ b/extensions/contact_sheet/contact_sheet.extension.in.in
@@ -0,0 +1,12 @@
+[Extension]
+_Name=Contact Sheet
+_Description=Create an index image displaying the thumbnails of the selected files.
+_Authors=gthumb development team
+Copyright=Copyright © 2010 The Free Software Foundation, Inc.
+Version=%VERSION%
+Category=Exporter
+
+[Loader]
+Type=module
+File=%LIBRARY%
+Requires=export_tools
diff --git a/extensions/contact_sheet/data/Makefile.am b/extensions/contact_sheet/data/Makefile.am
new file mode 100644
index 0000000..68c070f
--- /dev/null
+++ b/extensions/contact_sheet/data/Makefile.am
@@ -0,0 +1,18 @@
+SUBDIRS = contact_sheet_themes ui
+
+schemadir = @GCONF_SCHEMA_FILE_DIR@
+schema_in_files = gthumb_contact_sheet.schemas.in
+schema_DATA = $(schema_in_files:.schemas.in=.schemas)
+
+ INTLTOOL_SCHEMAS_RULE@
+
+if GCONF_SCHEMAS_INSTALL
+install-data-local:
+	GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(top_builddir)/extensions/contact_sheet/data/$(schema_DATA)
+endif
+
+EXTRA_DIST = $(schema_in_files)
+
+CLEANFILES = $(schema_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/data/contact_sheet_themes/Makefile.am b/extensions/contact_sheet/data/contact_sheet_themes/Makefile.am
new file mode 100644
index 0000000..343cdb2
--- /dev/null
+++ b/extensions/contact_sheet/data/contact_sheet_themes/Makefile.am
@@ -0,0 +1,8 @@
+themedir   = $(pkgdatadir)/contactsheetthemes
+theme_DATA =		\
+	default.ini	\
+	$(NULL)
+
+EXTRA_DIST = $(theme_DATA) 
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/data/contact_sheet_themes/default.ini b/extensions/contact_sheet/data/contact_sheet_themes/default.ini
new file mode 100644
index 0000000..e69de29
diff --git a/extensions/contact_sheet/data/gthumb_contact_sheet.schemas.in b/extensions/contact_sheet/data/gthumb_contact_sheet.schemas.in
new file mode 100644
index 0000000..ab6aca7
--- /dev/null
+++ b/extensions/contact_sheet/data/gthumb_contact_sheet.schemas.in
@@ -0,0 +1,200 @@
+<gconfschemafile>
+    <schemalist>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/header</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/header</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default></default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/footer</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/footer</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default></default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/destination</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/destination</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default></default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+      
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/template</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/template</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default>###</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/extension</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/extension</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default>jpeg</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/html_image_map</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/html_image_map</applyto>
+	<owner>gthumb</owner>
+	<type>bool</type>
+	<default>false</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/theme</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/theme</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default>default</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+      
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/images_per_page</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/images_per_page</applyto>
+	<owner>gthumb</owner>
+	<type>int</type>
+	<default>25</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+      
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/single_page</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/single_page</applyto>
+	<owner>gthumb</owner>
+	<type>bool</type>
+	<default>false</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+      
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/columns</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/columns</applyto>
+	<owner>gthumb</owner>
+	<type>int</type>
+	<default>5</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+      
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/sort_type</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/sort_type</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default>general::unsorted</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/sort_inverse</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/sort_inverse</applyto>
+	<owner>gthumb</owner>
+	<type>bool</type>
+	<default>false</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+      
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/same_size</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/same_size</applyto>
+	<owner>gthumb</owner>
+	<type>bool</type>
+	<default>true</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+      
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/thumbnail_size</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/thumbnail_size</applyto>
+	<owner>gthumb</owner>
+	<type>int</type>
+	<default>128</default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>
+
+      <schema>
+	<key>/schemas/apps/gthumb/ext/contact_sheet/thumbnail_caption</key>
+	<applyto>/apps/gthumb/ext/contact_sheet/thumbnail_caption</applyto>
+	<owner>gthumb</owner>
+	<type>string</type>
+	<default></default>
+	<locale name="C">
+	  <short></short>
+	  <long>
+	  </long>
+	</locale>
+      </schema>      
+
+    </schemalist>
+</gconfschemafile>
diff --git a/extensions/contact_sheet/data/ui/Makefile.am b/extensions/contact_sheet/data/ui/Makefile.am
new file mode 100644
index 0000000..09ea396
--- /dev/null
+++ b/extensions/contact_sheet/data/ui/Makefile.am
@@ -0,0 +1,5 @@
+uidir = $(pkgdatadir)/ui
+ui_DATA = contact-sheet-creator.ui
+EXTRA_DIST = $(ui_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/extensions/contact_sheet/data/ui/contact-sheet-creator.ui b/extensions/contact_sheet/data/ui/contact-sheet-creator.ui
new file mode 100644
index 0000000..10af8b6
--- /dev/null
+++ b/extensions/contact_sheet/data/ui/contact-sheet-creator.ui
@@ -0,0 +1,1081 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkDialog" id="contact_sheet_dialog">
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes">Web Album</property>
+    <property name="type_hint">dialog</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox3">
+        <property name="visible">True</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkNotebook" id="notebook1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child>
+              <object class="GtkVBox" id="vbox1">
+                <property name="visible">True</property>
+                <property name="border_width">6</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkFrame" id="frame7">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment3">
+                        <property name="visible">True</property>
+                        <property name="top_padding">6</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkTable" id="table2">
+                            <property name="visible">True</property>
+                            <property name="n_rows">3</property>
+                            <property name="n_columns">2</property>
+                            <property name="column_spacing">6</property>
+                            <property name="row_spacing">6</property>
+                            <child>
+                              <object class="GtkTable" id="page_footer_help_table">
+                                <property name="n_rows">4</property>
+                                <property name="n_columns">2</property>
+                                <property name="column_spacing">12</property>
+                                <property name="row_spacing">6</property>
+                                <child>
+                                  <object class="GtkLabel" id="label7">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">%p</property>
+                                    <attributes>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </object>
+                                  <packing>
+                                    <property name="top_attach">1</property>
+                                    <property name="bottom_attach">2</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label8">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">%P</property>
+                                    <attributes>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </object>
+                                  <packing>
+                                    <property name="top_attach">2</property>
+                                    <property name="bottom_attach">3</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label10">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">The current page number</property>
+                                    <attributes>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </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="label11">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">The total number of pages</property>
+                                    <attributes>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </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="label14">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Special code</property>
+                                    <attributes>
+                                      <attribute name="weight" value="bold"/>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label15">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Description</property>
+                                    <attributes>
+                                      <attribute name="weight" value="bold"/>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </object>
+                                  <packing>
+                                    <property name="left_attach">1</property>
+                                    <property name="right_attach">2</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label16">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes" comments="translate only the text in the curly brackets">%D{ format }</property>
+                                    <attributes>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </object>
+                                  <packing>
+                                    <property name="top_attach">3</property>
+                                    <property name="bottom_attach">4</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label17">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">The current date</property>
+                                    <attributes>
+                                      <attribute name="size" value="8000"/>
+                                    </attributes>
+                                  </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>
+                              </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>
+                                <property name="y_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="footer_entry">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                                <property name="activates_default">True</property>
+                                <property name="secondary_icon_stock">gtk-help</property>
+                                <property name="secondary_icon_activatable">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                                <property name="secondary_icon_tooltip_text">Help</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>
+                                <property name="y_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label122">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">_Footer:</property>
+                                <property name="use_underline">True</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"></property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="header_entry">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">&#x25CF;</property>
+                                <property name="activates_default">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="label86">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">_Header:</property>
+                                <property name="use_underline">True</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_FILL</property>
+                                <property name="y_options"></property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label30">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Contact Sheet</property>
+                        <property name="use_markup">True</property>
+                        <attributes>
+                          <attribute name="weight" value="bold"/>
+                        </attributes>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFrame" id="frame1">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment2">
+                        <property name="visible">True</property>
+                        <property name="top_padding">6</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox5">
+                            <property name="visible">True</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <object class="GtkTable" id="table4">
+                                <property name="visible">True</property>
+                                <property name="n_rows">3</property>
+                                <property name="n_columns">2</property>
+                                <property name="column_spacing">6</property>
+                                <property name="row_spacing">6</property>
+                                <child>
+                                  <object class="GtkLabel" id="label84">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">_Destination:</property>
+                                    <property name="use_underline">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="x_options">GTK_FILL</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkFileChooserButton" id="destination_filechooserbutton">
+                                    <property name="visible">True</property>
+                                    <property name="local_only">False</property>
+                                    <property name="action">select-folder</property>
+                                    <property name="title" translatable="yes">Choose destination folder</property>
+                                  </object>
+                                  <packing>
+                                    <property name="left_attach">1</property>
+                                    <property name="right_attach">2</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label54">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">File_name:</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="mnemonic_widget">template_entry</property>
+                                  </object>
+                                  <packing>
+                                    <property name="top_attach">1</property>
+                                    <property name="bottom_attach">2</property>
+                                    <property name="x_options">GTK_FILL</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox47">
+                                    <property name="visible">True</property>
+                                    <property name="spacing">6</property>
+                                    <child>
+                                      <object class="GtkEntry" id="template_entry">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="invisible_char">&#x25CF;</property>
+                                        <property name="activates_default">True</property>
+                                        <property name="text" translatable="yes">###</property>
+                                        <property name="secondary_icon_stock">gtk-help</property>
+                                        <property name="secondary_icon_activatable">True</property>
+                                        <property name="secondary_icon_sensitive">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkComboBox" id="filetype_combobox">
+                                        <property name="visible">True</property>
+                                        <property name="model">filetype_liststore</property>
+                                        <property name="active">0</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext1"/>
+                                          <attributes>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </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>
+                                    <property name="y_options">GTK_FILL</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkTable" id="template_help_table">
+                                    <property name="n_rows">2</property>
+                                    <property name="n_columns">2</property>
+                                    <property name="column_spacing">12</property>
+                                    <property name="row_spacing">6</property>
+                                    <child>
+                                      <object class="GtkLabel" id="label32">
+                                        <property name="visible">True</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">#</property>
+                                        <attributes>
+                                          <attribute name="size" value="8000"/>
+                                        </attributes>
+                                      </object>
+                                      <packing>
+                                        <property name="top_attach">1</property>
+                                        <property name="bottom_attach">2</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label34">
+                                        <property name="visible">True</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">New enumerator digit</property>
+                                        <attributes>
+                                          <attribute name="size" value="8000"/>
+                                        </attributes>
+                                      </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="label36">
+                                        <property name="visible">True</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">Special code</property>
+                                        <attributes>
+                                          <attribute name="weight" value="bold"/>
+                                          <attribute name="size" value="8000"/>
+                                        </attributes>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label37">
+                                        <property name="visible">True</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">Description</property>
+                                        <attributes>
+                                          <attribute name="weight" value="bold"/>
+                                          <attribute name="size" value="8000"/>
+                                        </attributes>
+                                      </object>
+                                      <packing>
+                                        <property name="left_attach">1</property>
+                                        <property name="right_attach">2</property>
+                                      </packing>
+                                    </child>
+                                  </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>
+                                    <property name="y_options">GTK_FILL</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="image_map_checkbutton">
+                                <property name="label" translatable="yes">Create _HTML image map</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Saving</property>
+                        <property name="use_markup">True</property>
+                        <attributes>
+                          <attribute name="weight" value="bold"/>
+                        </attributes>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFrame" id="frame6">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment8">
+                        <property name="visible">True</property>
+                        <property name="top_padding">6</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox1">
+                            <property name="visible">True</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow4">
+                                <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">in</property>
+                                <child>
+                                  <object class="GtkIconView" id="theme_iconview">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="selection_mode">browse</property>
+                                    <property name="model">theme_liststore</property>
+                                    <property name="row_spacing">0</property>
+                                    <property name="column_spacing">0</property>
+                                    <property name="margin">0</property>
+                                    <child>
+                                      <object class="GtkCellRendererPixbuf" id="cellrenderertext3">
+                                        <property name="follow_state">True</property>
+                                      </object>
+                                      <attributes>
+                                        <attribute name="pixbuf">2</attribute>
+                                      </attributes>
+                                    </child>
+                                    <child>
+                                      <object class="GtkCellRendererText" id="cellrenderertext4">
+                                        <property name="alignment">center</property>
+                                        <property name="ellipsize">end</property>
+                                      </object>
+                                      <attributes>
+                                        <attribute name="text">1</attribute>
+                                      </attributes>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkVBox" id="vbox2">
+                                <property name="visible">True</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkButton" id="add_theme_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="tooltip_text" translatable="yes">Create a new theme</property>
+                                    <child>
+                                      <object class="GtkImage" id="image1">
+                                        <property name="visible">True</property>
+                                        <property name="stock">gtk-add</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="edit_theme_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="tooltip_text" translatable="yes">Edit the selected theme</property>
+                                    <child>
+                                      <object class="GtkImage" id="image3">
+                                        <property name="visible">True</property>
+                                        <property name="stock">gtk-edit</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkButton" id="delete_theme_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="tooltip_text" translatable="yes">Delete the selected theme</property>
+                                    <child>
+                                      <object class="GtkImage" id="image2">
+                                        <property name="visible">True</property>
+                                        <property name="stock">gtk-remove</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label13">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Theme</property>
+                        <property name="use_markup">True</property>
+                        <attributes>
+                          <attribute name="weight" value="bold"/>
+                        </attributes>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">General</property>
+              </object>
+              <packing>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="vbox3">
+                <property name="visible">True</property>
+                <property name="border_width">6</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkFrame" id="frame3">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment5">
+                        <property name="visible">True</property>
+                        <property name="top_padding">6</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkTable" id="table3">
+                            <property name="visible">True</property>
+                            <property name="n_rows">4</property>
+                            <property name="n_columns">3</property>
+                            <property name="column_spacing">6</property>
+                            <property name="row_spacing">6</property>
+                            <child>
+                              <object class="GtkLabel" id="label18">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">Columns:</property>
+                              </object>
+                              <packing>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                                <property name="x_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox3">
+                                <property name="visible">True</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkSpinButton" id="cols_spinbutton">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">&#x25CF;</property>
+                                    <property name="adjustment">cols_adjustment</property>
+                                    <property name="climb_rate">1</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                              </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>
+                                <property name="x_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox4">
+                                <property name="visible">True</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkSpinButton" id="images_per_index_spinbutton">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">&#x25CF;</property>
+                                    <property name="adjustment">rows_adjustment</property>
+                                    <property name="climb_rate">1</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="x_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label28">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">Images per page:</property>
+                                <property name="use_underline">True</property>
+                                <property name="mnemonic_widget">images_per_index_spinbutton</property>
+                              </object>
+                              <packing>
+                                <property name="x_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="single_index_checkbutton">
+                                <property name="label" translatable="yes">All images on a single page</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">2</property>
+                                <property name="right_attach">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="same_size_checkbutton">
+                                <property name="label" translatable="yes">_All pages with the same size</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="right_attach">3</property>
+                                <property name="top_attach">2</property>
+                                <property name="bottom_attach">3</property>
+                                <property name="x_options">GTK_FILL</property>
+                                <property name="y_options"></property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label6">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Layout</property>
+                        <property name="use_markup">True</property>
+                        <attributes>
+                          <attribute name="weight" value="bold"/>
+                        </attributes>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFrame" id="frame4">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">none</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment6">
+                        <property name="visible">True</property>
+                        <property name="top_padding">6</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox4">
+                            <property name="visible">True</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <object class="GtkTable" id="table1">
+                                <property name="visible">True</property>
+                                <property name="n_rows">2</property>
+                                <property name="n_columns">2</property>
+                                <property name="column_spacing">6</property>
+                                <property name="row_spacing">6</property>
+                                <child>
+                                  <object class="GtkLabel" id="label112">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">S_ort:</property>
+                                    <property name="use_underline">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="x_options">GTK_FILL</property>
+                                    <property name="y_options"></property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox62">
+                                    <property name="visible">True</property>
+                                    <property name="spacing">6</property>
+                                    <child>
+                                      <object class="GtkComboBox" id="sort_combobox">
+                                        <property name="visible">True</property>
+                                        <property name="model">sort_liststore</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext2"/>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkCheckButton" id="reverse_order_checkbutton">
+                                        <property name="label" translatable="yes">Re_verse order</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">False</property>
+                                        <property name="use_underline">True</property>
+                                        <property name="draw_indicator">True</property>
+                                      </object>
+                                      <packing>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </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="size_label">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">_Size:</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="justify">center</property>
+                                  </object>
+                                  <packing>
+                                    <property name="top_attach">1</property>
+                                    <property name="bottom_attach">2</property>
+                                    <property name="x_options">GTK_FILL</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox2">
+                                    <property name="visible">True</property>
+                                    <child>
+                                      <object class="GtkComboBox" id="thumbnail_size_combobox">
+                                        <property name="visible">True</property>
+                                        <property name="model">thumbnail_size_liststore</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="cellrenderertext5"/>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                  </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>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkVBox" id="vbox6">
+                                <property name="visible">True</property>
+                                <child>
+                                  <object class="GtkLabel" id="label3">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Caption:</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkScrolledWindow" id="thumbnail_caption_scrolledwindow">
+                                    <property name="height_request">200</property>
+                                    <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">in</property>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label5">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Thumbnails</property>
+                        <property name="use_markup">True</property>
+                        <attributes>
+                          <attribute name="weight" value="bold"/>
+                        </attributes>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Layout</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area3">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="help_button">
+                <property name="label">gtk-help</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="ok_button">
+                <property name="label">gtk-save</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-11">help_button</action-widget>
+      <action-widget response="-6">cancel_button</action-widget>
+      <action-widget response="-5">ok_button</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkListStore" id="filetype_liststore">
+    <columns>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">jpeg</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">png</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkAdjustment" id="rows_adjustment">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkAdjustment" id="cols_adjustment">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkListStore" id="sort_liststore">
+    <columns>
+      <!-- column-name data -->
+      <column type="gpointer"/>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="theme_liststore">
+    <columns>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+      <!-- column-name preview -->
+      <column type="GdkPixbuf"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="thumbnail_size_liststore">
+    <columns>
+      <!-- column-name size -->
+      <column type="gint"/>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+</interface>
diff --git a/extensions/contact_sheet/dlg-contact-sheet.c b/extensions/contact_sheet/dlg-contact-sheet.c
new file mode 100644
index 0000000..144930c
--- /dev/null
+++ b/extensions/contact_sheet/dlg-contact-sheet.c
@@ -0,0 +1,510 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include "dlg-contact-sheet.h"
+#include "gth-contact-sheet-creator.h"
+#include "preferences.h"
+
+#define GET_WIDGET(name) _gtk_builder_get_widget (data->builder, (name))
+#define STRING_IS_VOID(x) (((x) == NULL) || (*(x) == 0))
+#define DEFAULT_CONTACT_SHEET_THEME "default"
+#define DEFAULT_CONTACT_SHEET_THUMBNAIL_CAPTION ("general::datetime,general::dimensions,gth::file::display-size")
+
+enum {
+	FILETYPE_COLUMN_NAME
+};
+
+enum {
+	THEME_COLUMN_ID,
+	THEME_COLUMN_NAME,
+	THEME_COLUMN_PREVIEW
+};
+
+enum {
+	SORT_TYPE_COLUMN_DATA,
+	SORT_TYPE_COLUMN_NAME
+};
+
+enum {
+	THUMBNAIL_SIZE_TYPE_COLUMN_SIZE,
+	THUMBNAIL_SIZE_TYPE_COLUMN_NAME
+};
+
+typedef struct {
+	GthBrowser *browser;
+	GList      *file_list;
+	GtkBuilder *builder;
+	GtkWidget  *dialog;
+	GtkWidget  *thumbnail_caption_chooser;
+} DialogData;
+
+
+static int thumb_size[] = { 112, 128, 164, 200, 256, 312 };
+static int thumb_sizes = sizeof (thumb_size) / sizeof (int);
+
+
+static int
+get_idx_from_size (int size)
+{
+	int i;
+
+	for (i = 0; i < thumb_sizes; i++)
+		if (size == thumb_size[i])
+			return i;
+	return -1;
+}
+
+
+static void
+destroy_cb (GtkWidget  *widget,
+	    DialogData *data)
+{
+	gth_browser_set_dialog (data->browser, "contact_sheet", NULL);
+	_g_object_list_unref (data->file_list);
+	g_object_unref (data->builder);
+	g_free (data);
+}
+
+
+static void
+help_clicked_cb (GtkWidget  *widget,
+		 DialogData *data)
+{
+	show_help_dialog (GTK_WINDOW (data->dialog), "contact-sheet");
+}
+
+
+static void
+ok_clicked_cb (GtkWidget  *widget,
+	       DialogData *data)
+{
+	const char      *header;
+	const char      *footer;
+	char            *s_value;
+	GFile           *destination;
+	const char      *template;
+	char            *extension;
+	gboolean         create_image_map;
+	char            *theme_name;
+	int              images_per_index;
+	int              single_page;
+	int              columns;
+	GthFileDataSort *sort_type;
+	gboolean         sort_inverse;
+	gboolean         same_size;
+	int              thumbnail_size;
+	char            *thumbnail_caption;
+	GtkTreeIter      iter;
+	GthTask         *task;
+
+	/* save the options */
+
+	header = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("header_entry")));
+	eel_gconf_set_string (PREF_CONTACT_SHEET_HEADER, header);
+
+	footer = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("footer_entry")));
+	eel_gconf_set_string (PREF_CONTACT_SHEET_FOOTER, footer);
+
+	s_value = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (GET_WIDGET ("destination_filechooserbutton")));
+	destination = g_file_new_for_uri (s_value);
+	eel_gconf_set_path (PREF_CONTACT_SHEET_DESTINATION, s_value);
+	g_free (s_value);
+
+	template = gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("template_entry")));
+	eel_gconf_set_string (PREF_CONTACT_SHEET_TEMPLATE, template);
+
+	extension = NULL;
+	if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (GET_WIDGET ("filetype_combobox")), &iter)) {
+		gtk_tree_model_get (GTK_TREE_MODEL (GET_WIDGET ("filetype_combobox")),
+				    &iter,
+				    FILETYPE_COLUMN_NAME, &extension,
+				    -1);
+		eel_gconf_set_string (PREF_CONTACT_SHEET_EXTENSION, extension);
+	}
+
+	create_image_map = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("image_map_checkbutton")));
+	eel_gconf_set_boolean (PREF_CONTACT_SHEET_HTML_IMAGE_MAP, create_image_map);
+
+	theme_name = NULL;
+	{
+		GList *list;
+
+		list = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (GET_WIDGET ("theme_iconview")));
+		if (list != NULL) {
+			GtkTreePath *path;
+			GtkTreeIter  iter;
+
+			path = g_list_first (list)->data;
+			gtk_tree_model_get_iter (GTK_TREE_MODEL (GET_WIDGET ("theme_liststore")), &iter, path);
+			gtk_tree_model_get (GTK_TREE_MODEL (GET_WIDGET ("theme_liststore")), &iter,
+					    THEME_COLUMN_NAME, &theme_name,
+					    -1);
+		}
+
+		g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
+		g_list_free (list);
+	}
+	g_return_if_fail (theme_name != NULL);
+	eel_gconf_set_string (PREF_CONTACT_SHEET_THEME, theme_name);
+
+	images_per_index = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("images_per_index_spinbutton")));
+	eel_gconf_set_integer (PREF_CONTACT_SHEET_IMAGES_PER_PAGE, images_per_index);
+
+	single_page = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_index_checkbutton")));
+	eel_gconf_set_boolean (PREF_CONTACT_SHEET_SINGLE_PAGE, single_page);
+
+	columns = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (GET_WIDGET ("cols_spinbutton")));
+	eel_gconf_set_integer (PREF_CONTACT_SHEET_COLUMNS, columns);
+
+	if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (GET_WIDGET ("sort_combobox")), &iter)) {
+		gtk_tree_model_get (GTK_TREE_MODEL (GET_WIDGET ("sort_liststore")),
+				    &iter,
+				    SORT_TYPE_COLUMN_DATA, &sort_type,
+				    -1);
+		eel_gconf_set_string (PREF_CONTACT_SHEET_SORT_TYPE, sort_type->name);
+	}
+
+	sort_inverse = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("reverse_order_checkbutton")));
+	eel_gconf_set_boolean (PREF_CONTACT_SHEET_SORT_INVERSE, sort_inverse);
+
+	same_size = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("same_size_checkbutton")));
+	eel_gconf_set_boolean (PREF_CONTACT_SHEET_SAME_SIZE, same_size);
+
+	thumbnail_size = thumb_size[gtk_combo_box_get_active (GTK_COMBO_BOX (GET_WIDGET ("thumbnail_size_combobox")))];
+	eel_gconf_set_integer (PREF_CONTACT_SHEET_THUMBNAIL_SIZE, thumbnail_size);
+
+	thumbnail_caption = gth_metadata_chooser_get_selection (GTH_METADATA_CHOOSER (data->thumbnail_caption_chooser));
+	eel_gconf_set_string (PREF_CONTACT_SHEET_THUMBNAIL_CAPTION, thumbnail_caption);
+
+	/* exec the task */
+
+	task = gth_contact_sheet_creator_new (data->browser, data->file_list);
+
+	gth_contact_sheet_creator_set_header (GTH_CONTACT_SHEET_CREATOR (task), header);
+	gth_contact_sheet_creator_set_footer (GTH_CONTACT_SHEET_CREATOR (task), footer);
+	gth_contact_sheet_creator_set_destination (GTH_CONTACT_SHEET_CREATOR (task), destination);
+	gth_contact_sheet_creator_set_filename_template (GTH_CONTACT_SHEET_CREATOR (task), template);
+	gth_contact_sheet_creator_set_filetype (GTH_CONTACT_SHEET_CREATOR (task), extension);
+	gth_contact_sheet_creator_set_write_image_map (GTH_CONTACT_SHEET_CREATOR (task), create_image_map);
+	gth_contact_sheet_creator_set_theme (GTH_CONTACT_SHEET_CREATOR (task), theme_name);
+	gth_contact_sheet_creator_set_images_per_index (GTH_CONTACT_SHEET_CREATOR (task), images_per_index);
+	gth_contact_sheet_creator_set_single_index (GTH_CONTACT_SHEET_CREATOR (task), single_page);
+	gth_contact_sheet_creator_set_columns (GTH_CONTACT_SHEET_CREATOR (task), columns);
+	gth_contact_sheet_creator_set_sort_order (GTH_CONTACT_SHEET_CREATOR (task), sort_type, sort_inverse);
+	gth_contact_sheet_creator_set_same_size (GTH_CONTACT_SHEET_CREATOR (task), same_size);
+	gth_contact_sheet_creator_set_thumb_size (GTH_CONTACT_SHEET_CREATOR (task), FALSE, thumbnail_size, thumbnail_size);
+	gth_contact_sheet_creator_set_thumbnail_caption (GTH_CONTACT_SHEET_CREATOR (task), thumbnail_caption);
+
+	gth_browser_exec_task (data->browser, task, FALSE);
+	gtk_widget_destroy (data->dialog);
+
+	g_free (thumbnail_caption);
+	g_free (theme_name);
+	g_free (extension);
+	g_object_unref (destination);
+}
+
+
+static void
+update_sensitivity (DialogData *data)
+{
+	gtk_widget_set_sensitive (GET_WIDGET ("images_per_index_spinbutton"), ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_index_checkbutton"))));
+}
+
+
+static void
+entry_help_icon_press_cb (GtkEntry             *entry,
+			  GtkEntryIconPosition  icon_pos,
+			  GdkEvent             *event,
+			  gpointer              user_data)
+{
+	DialogData *data = user_data;
+	GtkWidget  *help_box;
+
+	if (GTK_WIDGET (entry) == GET_WIDGET ("footer_entry"))
+		help_box = GET_WIDGET ("page_footer_help_table");
+	else if (GTK_WIDGET (entry) == GET_WIDGET ("template_entry"))
+		help_box = GET_WIDGET ("template_help_table");
+
+	if (gtk_widget_get_visible (help_box))
+		gtk_widget_hide (help_box);
+	else
+		gtk_widget_show (help_box);
+}
+
+
+static void
+add_themes_from_dir (DialogData *data,
+		     GFile      *dir)
+{
+	GFileEnumerator *enumerator;
+	GFileInfo       *file_info;
+
+	enumerator = g_file_enumerate_children (dir,
+						(G_FILE_ATTRIBUTE_STANDARD_NAME ","
+						 G_FILE_ATTRIBUTE_STANDARD_TYPE ","
+						 G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME),
+						G_FILE_QUERY_INFO_NONE,
+						NULL,
+						NULL);
+	if (enumerator == NULL)
+		return;
+
+	while ((file_info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
+		GFile     *file;
+		char      *filename;
+		GdkPixbuf *preview;
+
+		if (g_file_info_get_file_type (file_info) != G_FILE_TYPE_DIRECTORY) {
+			g_object_unref (file_info);
+			continue;
+		}
+
+		file = _g_file_get_child (dir, g_file_info_get_name (file_info), "preview.png", NULL);
+		filename = g_file_get_path (file);
+		preview = gdk_pixbuf_new_from_file_at_size (filename, 128, 128, NULL);
+		if (preview != NULL) {
+			GtkTreeIter iter;
+
+			gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("theme_liststore")), &iter);
+			gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("theme_liststore")), &iter,
+					    THEME_COLUMN_ID, g_file_info_get_name (file_info),
+					    THEME_COLUMN_NAME, g_file_info_get_display_name (file_info),
+					    THEME_COLUMN_PREVIEW, preview,
+					    -1);
+		}
+
+		g_object_unref (preview);
+		g_free (filename);
+		g_object_unref (file);
+		g_object_unref (file_info);
+	}
+
+	g_object_unref (enumerator);
+}
+
+
+static void
+load_themes (DialogData *data)
+{
+	char         *style_path;
+	GFile        *style_dir;
+	GFile        *data_dir;
+	char         *default_theme;
+	GtkTreeModel *model;
+	GtkTreeIter   iter;
+
+	/* local themes */
+
+	style_path = gth_user_dir_get_file (GTH_DIR_DATA, GTHUMB_DIR, "contact_sheet_themes", NULL);
+	style_dir = g_file_new_for_path (style_path);
+	add_themes_from_dir (data, style_dir);
+	g_object_unref (style_dir);
+	g_free (style_path);
+
+	/* system themes */
+
+	data_dir = g_file_new_for_path (CONTACT_SHEET_DATADIR);
+	style_dir = _g_file_get_child (data_dir, "contact_sheet_themes", NULL);
+	add_themes_from_dir (data, style_dir);
+	g_object_unref (style_dir);
+	g_object_unref (data_dir);
+
+	/**/
+
+	/* gtk_widget_set_size_request (GET_WIDGET ("theme_iconview"), (150 * 3), 140); FIXME */
+	gtk_widget_realize (GET_WIDGET ("theme_iconview"));
+
+	default_theme = eel_gconf_get_string (PREF_CONTACT_SHEET_THEME, DEFAULT_CONTACT_SHEET_THEME);
+
+	model = GTK_TREE_MODEL (GET_WIDGET ("theme_liststore"));
+	if (gtk_tree_model_get_iter_first (model, &iter)) {
+		do {
+			char *name;
+
+			gtk_tree_model_get(model, &iter, THEME_COLUMN_ID, &name, -1);
+
+			if (g_strcmp0 (name, default_theme) == 0) {
+				GtkTreePath *path;
+
+				path = gtk_tree_model_get_path (model, &iter);
+				gtk_icon_view_select_path (GTK_ICON_VIEW (GET_WIDGET ("theme_iconview")), path);
+				gtk_icon_view_scroll_to_path (GTK_ICON_VIEW (GET_WIDGET ("theme_iconview")), path, TRUE, 0.5, 0.5);
+
+				gtk_tree_path_free (path);
+				g_free (name);
+				break;
+			}
+
+			g_free (name);
+		}
+		while (gtk_tree_model_iter_next (model, &iter));
+	}
+
+	g_free (default_theme);
+}
+
+
+void
+dlg_contact_sheet (GthBrowser *browser,
+		   GList      *file_list)
+{
+	DialogData *data;
+	int         i;
+	int         active_index;
+	char       *default_sort_type;
+	GList      *sort_types;
+	GList      *scan;
+	char       *caption;
+	char       *s_value;
+
+	if (gth_browser_get_dialog (browser, "contact_sheet") != NULL) {
+		gtk_window_present (GTK_WINDOW (gth_browser_get_dialog (browser, "contact_sheet")));
+		return;
+	}
+
+	data = g_new0 (DialogData, 1);
+	data->browser = browser;
+	data->file_list = _g_object_list_ref (file_list);
+	data->builder = _gtk_builder_new_from_file ("contact-sheet-creator.ui", "contact_sheet");
+
+	data->dialog = _gtk_builder_get_widget (data->builder, "contact_sheet_dialog");
+	gth_browser_set_dialog (browser, "contact_sheet", data->dialog);
+	g_object_set_data (G_OBJECT (data->dialog), "dialog_data", data);
+
+	data->thumbnail_caption_chooser = gth_metadata_chooser_new (GTH_METADATA_ALLOW_IN_FILE_LIST);
+	gtk_widget_show (data->thumbnail_caption_chooser);
+	gtk_container_add (GTK_CONTAINER (GET_WIDGET ("thumbnail_caption_scrolledwindow")), data->thumbnail_caption_chooser);
+
+	/* Set widgets data. */
+
+	gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("images_per_index_spinbutton")), eel_gconf_get_integer (PREF_CONTACT_SHEET_IMAGES_PER_PAGE, 25));
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("single_index_checkbutton")), eel_gconf_get_boolean (PREF_CONTACT_SHEET_SINGLE_PAGE, FALSE));
+	gtk_spin_button_set_value (GTK_SPIN_BUTTON (GET_WIDGET ("cols_spinbutton")), eel_gconf_get_integer (PREF_CONTACT_SHEET_COLUMNS, 5));
+
+	default_sort_type = eel_gconf_get_string (PREF_CONTACT_SHEET_SORT_TYPE, "general::unsorted");
+	active_index = 0;
+	sort_types = gth_main_get_all_sort_types ();
+	for (i = 0, scan = sort_types; scan; scan = scan->next, i++) {
+		GthFileDataSort *sort_type = scan->data;
+		GtkTreeIter      iter;
+
+		if (g_str_equal (sort_type->name, default_sort_type))
+			active_index = i;
+
+		gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("sort_liststore")), &iter);
+		gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("sort_liststore")), &iter,
+				    SORT_TYPE_COLUMN_DATA, sort_type,
+				    SORT_TYPE_COLUMN_NAME, _(sort_type->display_name),
+				    -1);
+	}
+	g_list_free (sort_types);
+
+	gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("sort_combobox")), active_index);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("reverse_order_checkbutton")), eel_gconf_get_boolean (PREF_CONTACT_SHEET_SORT_INVERSE, FALSE));
+
+	g_free (default_sort_type);
+
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("header_entry")),
+			    g_file_info_get_edit_name (gth_browser_get_location_data (browser)->info));
+
+	s_value = eel_gconf_get_string (PREF_CONTACT_SHEET_FOOTER, "");
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("footer_entry")), s_value);
+	g_free (s_value);
+
+	caption = eel_gconf_get_string (PREF_CONTACT_SHEET_THUMBNAIL_CAPTION, DEFAULT_CONTACT_SHEET_THUMBNAIL_CAPTION);
+	gth_metadata_chooser_set_selection (GTH_METADATA_CHOOSER (data->thumbnail_caption_chooser), caption);
+	g_free (caption);
+
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GET_WIDGET ("theme_liststore")),
+					      THEME_COLUMN_NAME,
+					      GTK_SORT_ASCENDING);
+
+	for (i = 0; i < thumb_sizes; i++) {
+		char        *name;
+		GtkTreeIter  iter;
+
+		name = g_strdup_printf ("%d", thumb_size[i]);
+
+		gtk_list_store_append (GTK_LIST_STORE (GET_WIDGET ("thumbnail_size_liststore")), &iter);
+		gtk_list_store_set (GTK_LIST_STORE (GET_WIDGET ("thumbnail_size_liststore")), &iter,
+				    THUMBNAIL_SIZE_TYPE_COLUMN_SIZE, thumb_size[i],
+				    THUMBNAIL_SIZE_TYPE_COLUMN_NAME, name,
+				    -1);
+
+		g_free (name);
+	}
+	gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("thumbnail_size_combobox")), get_idx_from_size (eel_gconf_get_integer (PREF_CONTACT_SHEET_THUMBNAIL_SIZE, 128)));
+
+	load_themes (data);
+	update_sensitivity (data);
+
+	{
+		char *destination;
+
+		destination = eel_gconf_get_path (PREF_CONTACT_SHEET_DESTINATION, NULL);
+		if (destination == NULL)
+			destination = g_strdup (get_home_uri ());
+		gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (GET_WIDGET ("destination_filechooserbutton")), destination);
+
+		g_free (destination);
+	}
+
+	/* Set the signals handlers. */
+
+	g_signal_connect (G_OBJECT (data->dialog),
+			  "destroy",
+			  G_CALLBACK (destroy_cb),
+			  data);
+	g_signal_connect (GET_WIDGET ("ok_button"),
+			  "clicked",
+			  G_CALLBACK (ok_clicked_cb),
+			  data);
+        g_signal_connect (GET_WIDGET ("help_button"),
+                          "clicked",
+                          G_CALLBACK (help_clicked_cb),
+                          data);
+	g_signal_connect_swapped (GET_WIDGET ("cancel_button"),
+				  "clicked",
+				  G_CALLBACK (gtk_widget_destroy),
+				  data->dialog);
+	g_signal_connect (GET_WIDGET ("footer_entry"),
+			  "icon-press",
+			  G_CALLBACK (entry_help_icon_press_cb),
+			  data);
+	g_signal_connect (GET_WIDGET ("template_entry"),
+			  "icon-press",
+			  G_CALLBACK (entry_help_icon_press_cb),
+			  data);
+	g_signal_connect_swapped (GET_WIDGET ("single_index_checkbutton"),
+				  "toggled",
+				  G_CALLBACK (update_sensitivity),
+				  data);
+
+	/* Run dialog. */
+
+	gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (browser));
+	gtk_window_set_modal (GTK_WINDOW (data->dialog), FALSE);
+	gtk_widget_show (data->dialog);
+}
diff --git a/extensions/contact_sheet/dlg-contact-sheet.h b/extensions/contact_sheet/dlg-contact-sheet.h
new file mode 100644
index 0000000..95e71cd
--- /dev/null
+++ b/extensions/contact_sheet/dlg-contact-sheet.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DLG_CONTACT_SHEET_H
+#define DLG_CONTACT_SHEET_H
+
+#include <gthumb.h>
+
+void  dlg_contact_sheet (GthBrowser *browser,
+			 GList      *file_list); /* GFile list */
+
+#endif /* DLG_CONTACT_SHEET_H */
diff --git a/extensions/contact_sheet/gth-contact-sheet-creator.c b/extensions/contact_sheet/gth-contact-sheet-creator.c
new file mode 100644
index 0000000..f6276a1
--- /dev/null
+++ b/extensions/contact_sheet/gth-contact-sheet-creator.c
@@ -0,0 +1,280 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gthumb.h>
+#include <extensions/image_rotation/rotation-utils.h>
+#include "gth-contact-sheet-creator.h"
+#include "preferences.h"
+
+#define DEFAULT_THUMB_SIZE 128
+
+static GObjectClass *parent_class = NULL;
+
+
+struct _GthContactSheetCreatorPrivate {
+	GthBrowser        *browser;
+	GList             *gfile_list;             /* GFile list */
+
+	/* options */
+
+	char              *header;
+	char              *footer;
+	GFile             *destination;            /* Save files in this location. */
+	GthFileDataSort   *sort_type;
+	gboolean           sort_inverse;
+	int                images_per_index;
+	gboolean           single_index;
+	int                columns_per_page;
+	int                rows_per_page;
+	gboolean           squared_thumbnails;
+	int                thumb_width;
+	int                thumb_height;
+	char              *thumbnail_caption;
+};
+
+
+static void
+gth_contact_sheet_creator_exec (GthTask *task)
+{
+	/* TODO */
+}
+
+
+static void
+gth_contact_sheet_creator_cancelled (GthTask *task)
+{
+	/* TODO */
+}
+
+
+static void
+gth_contact_sheet_creator_finalize (GObject *object)
+{
+	GthContactSheetCreator *self;
+
+	g_return_if_fail (GTH_IS_CONTACT_SHEET_CREATOR (object));
+
+	self = GTH_CONTACT_SHEET_CREATOR (object);
+	g_free (self->priv->header);
+	g_free (self->priv->footer);
+	g_free (self->priv->thumbnail_caption);
+	_g_object_list_unref (self->priv->gfile_list);
+
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+
+static void
+gth_contact_sheet_creator_class_init (GthContactSheetCreatorClass *klass)
+{
+	GObjectClass *object_class;
+	GthTaskClass *task_class;
+
+	parent_class = g_type_class_peek_parent (klass);
+	g_type_class_add_private (klass, sizeof (GthContactSheetCreatorPrivate));
+
+	object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = gth_contact_sheet_creator_finalize;
+
+	task_class = GTH_TASK_CLASS (klass);
+	task_class->exec = gth_contact_sheet_creator_exec;
+	task_class->cancelled = gth_contact_sheet_creator_cancelled;
+}
+
+
+static void
+gth_contact_sheet_creator_init (GthContactSheetCreator *self)
+{
+	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreatorPrivate);
+	self->priv->header = NULL;
+	self->priv->footer = NULL;
+	self->priv->sort_type = NULL;
+	self->priv->sort_inverse = FALSE;
+	self->priv->images_per_index = 0;
+	self->priv->columns_per_page = 0;
+	self->priv->rows_per_page = 0;
+	self->priv->single_index = FALSE;
+	self->priv->thumb_width = DEFAULT_THUMB_SIZE;
+	self->priv->thumb_height = DEFAULT_THUMB_SIZE;
+	self->priv->thumbnail_caption = NULL;
+}
+
+
+GType
+gth_contact_sheet_creator_get_type (void)
+{
+	static GType type = 0;
+
+	if (! type) {
+		GTypeInfo type_info = {
+			sizeof (GthContactSheetCreatorClass),
+			NULL,
+			NULL,
+			(GClassInitFunc) gth_contact_sheet_creator_class_init,
+			NULL,
+			NULL,
+			sizeof (GthContactSheetCreator),
+			0,
+			(GInstanceInitFunc) gth_contact_sheet_creator_init
+                };
+
+                type = g_type_register_static (GTH_TYPE_TASK,
+					       "GthContactSheetCreator",
+					       &type_info,
+					       0);
+        }
+
+	return type;
+}
+
+
+GthTask *
+gth_contact_sheet_creator_new (GthBrowser *browser,
+			       GList      *file_list)
+{
+	GthContactSheetCreator *self;
+
+	g_return_val_if_fail (browser != NULL, NULL);
+
+	self = (GthContactSheetCreator *) g_object_new (GTH_TYPE_CONTACT_SHEET_CREATOR, NULL);
+	self->priv->browser = browser;
+	self->priv->gfile_list = _g_object_list_ref (file_list);
+
+	return (GthTask *) self;
+}
+
+
+void
+gth_contact_sheet_creator_set_header (GthContactSheetCreator *self,
+				      const char             *value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_footer (GthContactSheetCreator *self,
+				      const char             *value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_destination (GthContactSheetCreator *self,
+					   GFile                  *destination)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_filename_template (GthContactSheetCreator *self,
+						 const char             *filename_template)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_filetype (GthContactSheetCreator *self,
+					const char             *filetype)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_write_image_map (GthContactSheetCreator *self,
+					       gboolean                value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_theme (GthContactSheetCreator *self,
+				     const char             *theme_name)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_images_per_index (GthContactSheetCreator *self,
+					        int                     value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_single_index (GthContactSheetCreator *self,
+					    gboolean                value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_columns (GthContactSheetCreator *self,
+			   	       int                     columns)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_sort_order (GthContactSheetCreator *self,
+					  GthFileDataSort        *sort_type,
+					  gboolean                sort_inverse)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_same_size (GthContactSheetCreator *self,
+					 gboolean                value)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_thumb_size (GthContactSheetCreator *self,
+					  gboolean                squared,
+					  int                     width,
+					  int                     height)
+{
+
+}
+
+
+void
+gth_contact_sheet_creator_set_thumbnail_caption (GthContactSheetCreator *self,
+						 const char             *caption)
+{
+
+}
diff --git a/extensions/contact_sheet/gth-contact-sheet-creator.h b/extensions/contact_sheet/gth-contact-sheet-creator.h
new file mode 100644
index 0000000..ceaddaf
--- /dev/null
+++ b/extensions/contact_sheet/gth-contact-sheet-creator.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GTH_CONTACT_SHEET_CREATOR_H
+#define GTH_CONTACT_SHEET_CREATOR_H
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+#include <gthumb.h>
+
+#define GTH_TYPE_CONTACT_SHEET_CREATOR            (gth_contact_sheet_creator_get_type ())
+#define GTH_CONTACT_SHEET_CREATOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreator))
+#define GTH_CONTACT_SHEET_CREATOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreatorClass))
+#define GTH_IS_CONTACT_SHEET_CREATOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTH_TYPE_CONTACT_SHEET_CREATOR))
+#define GTH_IS_CONTACT_SHEET_CREATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTH_TYPE_CONTACT_SHEET_CREATOR))
+#define GTH_CONTACT_SHEET_CREATOR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GTH_TYPE_CONTACT_SHEET_CREATOR, GthContactSheetCreatorClass))
+
+typedef struct _GthContactSheetCreator        GthContactSheetCreator;
+typedef struct _GthContactSheetCreatorClass   GthContactSheetCreatorClass;
+typedef struct _GthContactSheetCreatorPrivate GthContactSheetCreatorPrivate;
+
+struct _GthContactSheetCreator {
+	GthTask __parent;
+	GthContactSheetCreatorPrivate *priv;
+
+};
+
+struct _GthContactSheetCreatorClass {
+	GthTaskClass __parent;
+};
+
+GType      gth_contact_sheet_creator_get_type              (void);
+GthTask *  gth_contact_sheet_creator_new                   (GthBrowser               *browser,
+							    GList                    *file_list); /* GFile list */
+void       gth_contact_sheet_creator_set_header            (GthContactSheetCreator   *self,
+							    const char               *value);
+void       gth_contact_sheet_creator_set_footer            (GthContactSheetCreator   *self,
+						   	    const char               *value);
+void       gth_contact_sheet_creator_set_destination       (GthContactSheetCreator   *self,
+						   	    GFile                    *destination);
+void       gth_contact_sheet_creator_set_filename_template (GthContactSheetCreator   *self,
+						   	    const char               *filename_template);
+void       gth_contact_sheet_creator_set_filetype          (GthContactSheetCreator   *self,
+							    const char               *filetype);
+void       gth_contact_sheet_creator_set_write_image_map   (GthContactSheetCreator   *self,
+							    gboolean                  value);
+void       gth_contact_sheet_creator_set_theme             (GthContactSheetCreator   *self,
+						   	    const char               *theme_name);
+void       gth_contact_sheet_creator_set_images_per_index  (GthContactSheetCreator   *self,
+							    int                       value);
+void       gth_contact_sheet_creator_set_single_index      (GthContactSheetCreator   *self,
+						   	    gboolean                  value);
+void       gth_contact_sheet_creator_set_columns           (GthContactSheetCreator   *self,
+						   	    int                       columns);
+void       gth_contact_sheet_creator_set_sort_order        (GthContactSheetCreator   *self,
+							    GthFileDataSort          *sort_type,
+							    gboolean                  sort_inverse);
+void       gth_contact_sheet_creator_set_same_size         (GthContactSheetCreator   *self,
+						   	    gboolean                  value);
+void       gth_contact_sheet_creator_set_thumb_size        (GthContactSheetCreator   *self,
+						            gboolean                  squared,
+						            int                       width,
+						            int                       height);
+void       gth_contact_sheet_creator_set_thumbnail_caption (GthContactSheetCreator   *self,
+						            const char               *caption);
+
+#endif /* GTH_CONTACT_SHEET_CREATOR_H */
diff --git a/extensions/contact_sheet/main.c b/extensions/contact_sheet/main.c
new file mode 100644
index 0000000..285ad0f
--- /dev/null
+++ b/extensions/contact_sheet/main.c
@@ -0,0 +1,52 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <config.h>
+#include <gtk/gtk.h>
+#include <gthumb.h>
+#include "callbacks.h"
+
+
+G_MODULE_EXPORT void
+gthumb_extension_activate (void)
+{
+	gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (cs__gth_browser_construct_cb), NULL);
+}
+
+
+G_MODULE_EXPORT void
+gthumb_extension_deactivate (void)
+{
+}
+
+
+G_MODULE_EXPORT gboolean
+gthumb_extension_is_configurable (void)
+{
+	return FALSE;
+}
+
+
+G_MODULE_EXPORT void
+gthumb_extension_configure (GtkWindow *parent)
+{
+}
diff --git a/extensions/contact_sheet/preferences.h b/extensions/contact_sheet/preferences.h
new file mode 100644
index 0000000..99bcade
--- /dev/null
+++ b/extensions/contact_sheet/preferences.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ *  GThumb
+ *
+ *  Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PREFERENCES_H
+#define PREFERENCES_H
+
+#include <gthumb.h>
+
+G_BEGIN_DECLS
+
+#define PREF_CONTACT_SHEET_HEADER                   "/apps/gthumb/ext/contact_sheet/header"
+#define PREF_CONTACT_SHEET_FOOTER                   "/apps/gthumb/ext/contact_sheet/footer"
+#define PREF_CONTACT_SHEET_DESTINATION              "/apps/gthumb/ext/contact_sheet/destination"
+#define PREF_CONTACT_SHEET_TEMPLATE                 "/apps/gthumb/ext/contact_sheet/template"
+#define PREF_CONTACT_SHEET_EXTENSION                "/apps/gthumb/ext/contact_sheet/extension"
+#define PREF_CONTACT_SHEET_HTML_IMAGE_MAP           "/apps/gthumb/ext/contact_sheet/html_image_map"
+#define PREF_CONTACT_SHEET_THEME                    "/apps/gthumb/ext/contact_sheet/theme"
+#define PREF_CONTACT_SHEET_IMAGES_PER_PAGE          "/apps/gthumb/ext/contact_sheet/images_per_page"
+#define PREF_CONTACT_SHEET_SINGLE_PAGE              "/apps/gthumb/ext/contact_sheet/single_page"
+#define PREF_CONTACT_SHEET_COLUMNS                  "/apps/gthumb/ext/contact_sheet/columns"
+#define PREF_CONTACT_SHEET_SORT_TYPE                "/apps/gthumb/ext/contact_sheet/sort_type"
+#define PREF_CONTACT_SHEET_SORT_INVERSE             "/apps/gthumb/ext/contact_sheet/sort_inverse"
+#define PREF_CONTACT_SHEET_SAME_SIZE                "/apps/gthumb/ext/contact_sheet/same_size"
+#define PREF_CONTACT_SHEET_THUMBNAIL_SIZE           "/apps/gthumb/ext/contact_sheet/thumbnail_size"
+#define PREF_CONTACT_SHEET_THUMBNAIL_CAPTION        "/apps/gthumb/ext/contact_sheet/thumbnail_caption"
+
+G_END_DECLS
+
+#endif /* PREFERENCES_H */



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