diff src/bar_exif.c @ 1293:48e064b37ba6

separated "normal" and advanced exif, "Normal" exif is now in the generic bar, advanced exif is in separate window.
author nadvornik
date Sun, 15 Feb 2009 09:36:53 +0000
parents 10073464e6aa
children 55ea4962887a
line wrap: on
line diff
--- a/src/bar_exif.c	Sat Feb 14 20:26:30 2009 +0000
+++ b/src/bar_exif.c	Sun Feb 15 09:36:53 2009 +0000
@@ -20,16 +20,11 @@
 #include "history_list.h"
 #include "misc.h"
 #include "ui_misc.h"
+#include "bar.h"
+
 
 #include <math.h>
 
-#define EXIF_BAR_SIZE_INCREMENT 48
-#define EXIF_BAR_ARROW_SIZE 7
-
-#define EXIF_BAR_CUSTOM_COUNT 20
-
-#define BAR_EXIF_DATA_COLUMN_WIDTH 250
-
 ExifUI ExifUIList[]={
 	{ 0, 0, EXIF_UI_IFSET,	EXIF_FORMATTED("Camera")},
 	{ 0, 0, EXIF_UI_IFSET,	EXIF_FORMATTED("DateTime")},
@@ -121,18 +116,17 @@
 
 /*
  *-------------------------------------------------------------------
- * EXIF bar
+ * EXIF widget
  *-------------------------------------------------------------------
  */
 
-typedef struct _ExifBar ExifBar;
-struct _ExifBar
+typedef struct _PaneExifData PaneExifData;
+struct _PaneExifData
 {
+	PaneData pane;
 	GtkWidget *vbox;
 	GtkWidget *scrolled;
 	GtkWidget *table;
-	GtkWidget *advanced_scrolled;
-	GtkWidget *listview;
 	GtkWidget **keys;
 	GtkWidget **labels;
 
@@ -146,288 +140,150 @@
 	gint allow_search;
 };
 
-enum {
-	EXIF_ADVCOL_ENABLED = 0,
-	EXIF_ADVCOL_TAG,
-	EXIF_ADVCOL_NAME,
-	EXIF_ADVCOL_VALUE,
-	EXIF_ADVCOL_FORMAT,
-	EXIF_ADVCOL_ELEMENTS,
-	EXIF_ADVCOL_DESCRIPTION,
-	EXIF_ADVCOL_COUNT
-};
-
-static void bar_exif_sensitive(ExifBar *eb, gint enable)
+static void bar_pane_exif_sensitive(PaneExifData *ped, gint enable)
 {
-	gtk_widget_set_sensitive(eb->table, enable);
-	if (eb->advanced_scrolled) gtk_widget_set_sensitive(eb->advanced_scrolled, enable);
+	gtk_widget_set_sensitive(ped->table, enable);
 }
 
-static gint bar_exif_row_enabled(const gchar *name)
-{
-	GList *list;
-
-	if (!name) return FALSE;
-
-	list = history_list_get_by_key("exif_extras");
-	while (list)
-		{
-		if (strcmp(name, (gchar *)(list->data)) == 0) return TRUE;
-		list = list->next;
-	}
-
-	return FALSE;
-}
-
-static void bar_exif_update(ExifBar *eb)
+static void bar_pane_exif_update(PaneExifData *ped)
 {
 	ExifData *exif;
 	gint i;
+	GList *list;
 
 	/* do we have any exif at all ? */
-	exif = exif_read_fd(eb->fd);
+	exif = exif_read_fd(ped->fd);
 
 	if (!exif)
 		{
-		bar_exif_sensitive(eb, FALSE);
+		bar_pane_exif_sensitive(ped, FALSE);
 		return;
 		}
 	else
 		{
 		/* we will use high level functions so we can release it for now.
 		   it will stay in the cache */
-		exif_free_fd(eb->fd, exif);
+		exif_free_fd(ped->fd, exif);
 		exif = NULL;
 		}
 	
 
-	bar_exif_sensitive(eb, TRUE);
-
-	if (GTK_WIDGET_VISIBLE(eb->scrolled))
-		{
-		GList *list;
-		for (i = 0; ExifUIList[i].key; i++)
-			{
-			gchar *text;
+	bar_pane_exif_sensitive(ped, TRUE);
 
-			if (ExifUIList[i].current == EXIF_UI_OFF)
-				{
-				gtk_widget_hide(eb->labels[i]);
-				gtk_widget_hide(eb->keys[i]);
-				continue;
-				}
-			text =  metadata_read_string(eb->fd, ExifUIList[i].key, METADATA_FORMATTED);
-			if (ExifUIList[i].current == EXIF_UI_IFSET
-			    && (!text || !*text))
-				{
-				gtk_widget_hide(eb->labels[i]);
-				gtk_widget_hide(eb->keys[i]);
-				g_free(text);
-				continue;
-				}
-			gtk_widget_show(eb->labels[i]);
-			gtk_widget_show(eb->keys[i]);
-			gtk_label_set_text(GTK_LABEL(eb->labels[i]), text);
-			g_free(text);
-			}
+	for (i = 0; ExifUIList[i].key; i++)
+		{
+		gchar *text;
 
-		list = g_list_last(history_list_get_by_key("exif_extras"));
-		if (list)
-			{
-			gtk_widget_show(eb->custom_sep);
-			}
-		else
-			{
-			gtk_widget_hide(eb->custom_sep);
-			}
-		i = 0;
-		while (list && i < EXIF_BAR_CUSTOM_COUNT)
+		if (ExifUIList[i].current == EXIF_UI_OFF)
 			{
-			gchar *text;
-			gchar *name;
-			gchar *buf;
-			gchar *description;
-
-			name = list->data;
-			list = list->prev;
-			
-			text =  metadata_read_string(eb->fd, name, METADATA_FORMATTED);
-
-			description = exif_get_tag_description_by_key(name);
-			if (!description || *description == '\0') 
-				{
-				g_free(description);
-				description = g_strdup(name);
-				}
-			buf = g_strconcat(description, ":", NULL);
-			g_free(description);
-			
-			gtk_label_set_text(GTK_LABEL(eb->custom_name[i]), buf);
-			g_free(buf);
-			gtk_label_set_text(GTK_LABEL(eb->custom_value[i]), text);
+			gtk_widget_hide(ped->labels[i]);
+			gtk_widget_hide(ped->keys[i]);
+			continue;
+			}
+		text =  metadata_read_string(ped->fd, ExifUIList[i].key, METADATA_FORMATTED);
+		if (ExifUIList[i].current == EXIF_UI_IFSET
+		    && (!text || !*text))
+			{
+			gtk_widget_hide(ped->labels[i]);
+			gtk_widget_hide(ped->keys[i]);
 			g_free(text);
-
-			gtk_widget_show(eb->custom_name[i]);
-			gtk_widget_show(eb->custom_value[i]);
-			g_object_set_data(G_OBJECT(eb->custom_remove[i]), "key", name);
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(eb->custom_remove[i]), TRUE);
-			gtk_widget_show(eb->custom_remove[i]);
-
-			i++;
+			continue;
 			}
-		while (i < EXIF_BAR_CUSTOM_COUNT)
-			{
-			g_object_set_data(G_OBJECT(eb->custom_remove[i]), "key", NULL);
-			gtk_widget_hide(eb->custom_name[i]);
-			gtk_widget_hide(eb->custom_value[i]);
-			gtk_widget_hide(eb->custom_remove[i]);
-
-			i++;
-			}
+		gtk_widget_show(ped->labels[i]);
+		gtk_widget_show(ped->keys[i]);
+		gtk_label_set_text(GTK_LABEL(ped->labels[i]), text);
+		g_free(text);
 		}
 
-	if (eb->advanced_scrolled && GTK_WIDGET_VISIBLE(eb->advanced_scrolled))
+	list = g_list_last(history_list_get_by_key("exif_extras"));
+	if (list)
+		{
+		gtk_widget_show(ped->custom_sep);
+		}
+	else
 		{
-		GtkListStore *store;
-		GtkTreeIter iter;
-		ExifData *exif_original;
-		ExifItem *item;
-
-		exif = exif_read_fd(eb->fd);
-		if (!exif) return;
-		
-		exif_original = exif_get_original(exif);
+		gtk_widget_hide(ped->custom_sep);
+		}
+	i = 0;
+	while (list && i < EXIF_BAR_CUSTOM_COUNT)
+		{
+		gchar *text;
+		gchar *name;
+		gchar *buf;
+		gchar *description;
 
-		store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview)));
-		gtk_list_store_clear(store);
-
-		item = exif_get_first_item(exif_original);
-		while (item)
-			{
-			gchar *tag;
-			gchar *tag_name;
-			gchar *text;
-			gchar *utf8_text;
-			const gchar *format;
-			gchar *elements;
-			gchar *description;
+		name = list->data;
+		list = list->prev;
+		
+		text =  metadata_read_string(ped->fd, name, METADATA_FORMATTED);
 
-			tag = g_strdup_printf("0x%04x", exif_item_get_tag_id(item));
-			tag_name = exif_item_get_tag_name(item);
-			format = exif_item_get_format_name(item, TRUE);
-			text = exif_item_get_data_as_text(item);
-			utf8_text = utf8_validate_or_convert(text);
-			g_free(text);
-			elements = g_strdup_printf("%d", exif_item_get_elements(item));
-			description = exif_item_get_description(item);
-			if (!description || *description == '\0') 
-				{
-				g_free(description);
-				description = g_strdup(tag_name);
-				}
+		description = exif_get_tag_description_by_key(name);
+		if (!description || *description == '\0') 
+			{
+			g_free(description);
+			description = g_strdup(name);
+			}
+		buf = g_strconcat(description, ":", NULL);
+		g_free(description);
+		
+		gtk_label_set_text(GTK_LABEL(ped->custom_name[i]), buf);
+		g_free(buf);
+		gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), text);
+		g_free(text);
 
-			gtk_list_store_append(store, &iter);
-			gtk_list_store_set(store, &iter,
-					EXIF_ADVCOL_ENABLED, bar_exif_row_enabled(tag_name),
-					EXIF_ADVCOL_TAG, tag,
-					EXIF_ADVCOL_NAME, tag_name,
-					EXIF_ADVCOL_VALUE, utf8_text,
-					EXIF_ADVCOL_FORMAT, format,
-					EXIF_ADVCOL_ELEMENTS, elements,
-					EXIF_ADVCOL_DESCRIPTION, description, -1);
-			g_free(tag);
-			g_free(utf8_text);
-			g_free(elements);
-			g_free(description);
-			g_free(tag_name);
-			item = exif_get_next_item(exif_original);
-			}
-		exif_free_fd(eb->fd, exif);
+		gtk_widget_show(ped->custom_name[i]);
+		gtk_widget_show(ped->custom_value[i]);
+		g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", name);
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ped->custom_remove[i]), TRUE);
+		gtk_widget_show(ped->custom_remove[i]);
+
+		i++;
 		}
+	while (i < EXIF_BAR_CUSTOM_COUNT)
+		{
+		g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", NULL);
+		gtk_widget_hide(ped->custom_name[i]);
+		gtk_widget_hide(ped->custom_value[i]);
+		gtk_widget_hide(ped->custom_remove[i]);
 
+		i++;
+		}
 }
 
-static void bar_exif_clear(ExifBar *eb)
+static void bar_pane_exif_clear(PaneExifData *ped)
 {
 	gint i;
 
-	if (!GTK_WIDGET_SENSITIVE(eb->labels[0])) return;
+	if (!GTK_WIDGET_SENSITIVE(ped->labels[0])) return;
 
 	for (i = 0; ExifUIList[i].key; i++)
 		{
-		gtk_label_set_text(GTK_LABEL(eb->labels[i]), "");
+		gtk_label_set_text(GTK_LABEL(ped->labels[i]), "");
 		}
 	for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
 		{
-		gtk_label_set_text(GTK_LABEL(eb->custom_value[i]), "");
-		}
-
-	if (eb->listview)
-		{
-		GtkListStore *store;
-
-		store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview)));
-		gtk_list_store_clear(store);
+		gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), "");
 		}
 }
 
-void bar_exif_set(GtkWidget *bar, FileData *fd)
+void bar_pane_exif_set_fd(GtkWidget *widget, FileData *fd)
 {
-	ExifBar *eb;
+	PaneExifData *ped;
 
-	eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data");
-	if (!eb) return;
+	ped = g_object_get_data(G_OBJECT(widget), "pane_data");
+	if (!ped) return;
 
 	/* store this, advanced view toggle needs to reload data */
-	file_data_unref(eb->fd);
-	eb->fd = file_data_ref(fd);
+	file_data_unref(ped->fd);
+	ped->fd = file_data_ref(fd);
 
-	bar_exif_clear(eb);
-	bar_exif_update(eb);
+	bar_pane_exif_clear(ped);
+	bar_pane_exif_update(ped);
 }
 
-static void bar_exif_row_toggled_cb(GtkCellRendererToggle *toggle, const gchar *path, gpointer data)
+static void bar_pane_exif_remove_advanced_cb(GtkWidget *widget, gpointer data)
 {
-	GtkWidget *listview = data;
-	GtkTreeModel *store;
-	GtkTreeIter iter;
-	GtkTreePath *tpath;
-	gchar *name = NULL;
-	gboolean active;
-
-	store = gtk_tree_view_get_model(GTK_TREE_VIEW(listview));
-
-	tpath = gtk_tree_path_new_from_string(path);
-	gtk_tree_model_get_iter(store, &iter, tpath);
-	gtk_tree_path_free(tpath);
-
-	gtk_tree_model_get(store, &iter, EXIF_ADVCOL_ENABLED, &active,
-					 EXIF_ADVCOL_NAME, &name, -1);
-	active = (!active);
-
-	if (active &&
-	    g_list_length(history_list_get_by_key("exif_extras")) >= EXIF_BAR_CUSTOM_COUNT)
-		{
-		active = FALSE;
-		}
-
-	gtk_list_store_set(GTK_LIST_STORE(store), &iter, EXIF_ADVCOL_ENABLED, active, -1);
-
-	if (active)
-		{
-		history_list_add_to_key("exif_extras", name, EXIF_BAR_CUSTOM_COUNT);
-		}
-	else
-		{
-		history_list_item_change("exif_extras", name, NULL);
-		}
-
-	g_free(name);
-}
-
-static void bar_exif_remove_advanced_cb(GtkWidget *widget, gpointer data)
-{
-	ExifBar *eb = data;
+	PaneExifData *ped = data;
 	const gchar *key;
 
 	/* continue only if the toggle was deactivated */
@@ -438,311 +294,105 @@
 
 	history_list_item_change("exif_extras", key, NULL);
 
-	bar_exif_update(eb);
-}
-
-static void bar_exif_add_column_check(GtkWidget *listview, const gchar *title, gint n)
-{
-	GtkTreeViewColumn *column;
-	GtkCellRenderer *renderer;
-
-	column = gtk_tree_view_column_new();
-	gtk_tree_view_column_set_title(column, title);
-	gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-
-	renderer = gtk_cell_renderer_toggle_new();
-	gtk_tree_view_column_pack_start(column, renderer, TRUE);
-	gtk_tree_view_column_add_attribute(column, renderer, "active", n);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column);
-
-	g_signal_connect(G_OBJECT(renderer), "toggled",
-			 G_CALLBACK(bar_exif_row_toggled_cb), listview);
+	bar_pane_exif_update(ped);
 }
 
-static void bar_exif_add_column(GtkWidget *listview, const gchar *title, gint n, gint sizable)
+void bar_pane_exif_close(GtkWidget *widget)
 {
-	GtkTreeViewColumn *column;
-	GtkCellRenderer *renderer;
-
-	column = gtk_tree_view_column_new();
-	gtk_tree_view_column_set_title(column, title);
+	PaneExifData *ped;
 
-	if (sizable)
-		{
-		gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
-		gtk_tree_view_column_set_fixed_width(column, BAR_EXIF_DATA_COLUMN_WIDTH);
-		gtk_tree_view_column_set_resizable(column, TRUE);
-		}
-	else
-		{
-		gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-		}
+	ped = g_object_get_data(G_OBJECT(widget), "pane_data");
+	if (!ped) return;
 
-	renderer = gtk_cell_renderer_text_new();
-	gtk_tree_view_column_pack_start(column, renderer, TRUE);
-	gtk_tree_view_column_add_attribute(column, renderer, "text", n);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column);
+	gtk_widget_destroy(ped->vbox);
 }
 
-static void bar_exif_advanced_build_view(ExifBar *eb)
+static void bar_pane_exif_destroy(GtkWidget *widget, gpointer data)
 {
-	GtkListStore *store;
-
-	if (eb->listview) return;
-
-	store = gtk_list_store_new(7, G_TYPE_BOOLEAN,
-				      G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
-				      G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-	eb->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
-	g_object_unref(store);
-
-	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(eb->listview), TRUE);
-	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(eb->listview), TRUE);
+	PaneExifData *ped = data;
 
-	if (eb->allow_search)
-		{
-		gtk_tree_view_set_search_column(GTK_TREE_VIEW(eb->listview), EXIF_ADVCOL_NAME);
-		}
-	else
-		{
-		gtk_tree_view_set_enable_search(GTK_TREE_VIEW(eb->listview), FALSE);
-		}
-
-	bar_exif_add_column_check(eb->listview, "", EXIF_ADVCOL_ENABLED);
-
-	bar_exif_add_column(eb->listview, _("Description"), EXIF_ADVCOL_DESCRIPTION, FALSE);
-	bar_exif_add_column(eb->listview, _("Value"), EXIF_ADVCOL_VALUE, TRUE);
-	bar_exif_add_column(eb->listview, _("Name"), EXIF_ADVCOL_NAME, FALSE);
-	bar_exif_add_column(eb->listview, _("Tag"), EXIF_ADVCOL_TAG, FALSE);
-	bar_exif_add_column(eb->listview, _("Format"), EXIF_ADVCOL_FORMAT, FALSE);
-	bar_exif_add_column(eb->listview, _("Elements"), EXIF_ADVCOL_ELEMENTS, FALSE);
-
-	eb->advanced_scrolled = gtk_scrolled_window_new(NULL, NULL);
-	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(eb->advanced_scrolled), GTK_SHADOW_IN);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eb->advanced_scrolled),
-				       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-	gtk_box_pack_start(GTK_BOX(eb->vbox), eb->advanced_scrolled, TRUE, TRUE, 0);
-	gtk_container_add(GTK_CONTAINER(eb->advanced_scrolled), eb->listview);
-	gtk_widget_show(eb->listview);
+	g_free(ped->keys);
+	g_free(ped->labels);
+	file_data_unref(ped->fd);
+	g_free(ped);
 }
 
-static void bar_exif_advanced_cb(GtkWidget *widget, gpointer data)
-{
-	ExifBar *eb = data;
-	gint advanced;
-
-	advanced = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-
-	if (advanced)
-		{
-		gtk_widget_hide(eb->scrolled);
-		bar_exif_advanced_build_view(eb);
-		gtk_widget_show(eb->advanced_scrolled);
-		}
-	else
-		{
-		gtk_widget_hide(eb->advanced_scrolled);
-		gtk_widget_show(eb->scrolled);
-		}
-
-	bar_exif_update(eb);
-}
-
-gint bar_exif_is_advanced(GtkWidget *bar)
-{
-	ExifBar *eb;
-
-	eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data");
-	if (!eb) return FALSE;
-
-	return (eb->advanced_scrolled && GTK_WIDGET_VISIBLE(eb->advanced_scrolled));
-}
-
-void bar_exif_close(GtkWidget *bar)
+GtkWidget *bar_pane_exif_new(const gchar *title)
 {
-	ExifBar *eb;
-
-	eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data");
-	if (!eb) return;
-
-	gtk_widget_destroy(eb->vbox);
-}
-
-static void bar_exif_width(ExifBar *eb, gint val)
-{
-	gint size;
-
-	size = eb->vbox->allocation.width;
-	size = CLAMP(size + val, EXIF_BAR_SIZE_INCREMENT * 2, EXIF_BAR_SIZE_INCREMENT * 16);
-
-	gtk_widget_set_size_request(eb->vbox, size, -1);
-	options->panels.exif.width = eb->vbox->allocation.width;
-}
-
-static void bar_exif_larger(GtkWidget *widget, gpointer data)
-{
-	ExifBar *eb = data;
-
-	bar_exif_width(eb, EXIF_BAR_SIZE_INCREMENT);
-}
-
-static void bar_exif_smaller(GtkWidget *widget, gpointer data)
-{
-	ExifBar *eb = data;
-
-	bar_exif_width(eb, -EXIF_BAR_SIZE_INCREMENT);
-}
-
-static void bar_exif_destroy(GtkWidget *widget, gpointer data)
-{
-	ExifBar *eb = data;
-
-	g_free(eb->keys);
-	g_free(eb->labels);
-	file_data_unref(eb->fd);
-	g_free(eb);
-}
-
-GtkWidget *bar_exif_new(gint show_title, FileData *fd, gint advanced, GtkWidget *bounding_widget)
-{
-	ExifBar *eb;
+	PaneExifData *ped;
 	GtkWidget *table;
 	GtkWidget *viewport;
 	GtkWidget *hbox;
-	GtkWidget *button;
 	gint i;
 	gint exif_len;
 
 	for (exif_len = 0; ExifUIList[exif_len].key; exif_len++)
 	      ;
 
-	eb = g_new0(ExifBar, 1);
-
-	eb->keys = g_new0(GtkWidget *, exif_len);
-	eb->labels = g_new0(GtkWidget *, exif_len);
-
-	eb->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
-	g_object_set_data(G_OBJECT(eb->vbox), "bar_exif_data", eb);
-	g_signal_connect_after(G_OBJECT(eb->vbox), "destroy",
-			       G_CALLBACK(bar_exif_destroy), eb);
-
-	eb->allow_search = !show_title;
+	ped = g_new0(PaneExifData, 1);
 
-	if (show_title)
-		{
-		GtkWidget *box;
-		GtkWidget *label;
-		GtkWidget *button;
-		GtkWidget *arrow;
-
-		box = gtk_hbox_new(FALSE, 0);
-
-		label = sizer_new(eb->vbox, bounding_widget, SIZER_POS_LEFT);
-		sizer_set_limits(label, EXIF_BAR_SIZE_INCREMENT * 2, -1, -1 , -1);
-		gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
-		gtk_widget_show(label);
+	ped->pane.pane_set_fd = bar_pane_exif_set_fd;
+	ped->pane.title = g_strdup(title);
 
-		label = gtk_label_new(_("Exif"));
-		pref_label_bold(label, TRUE, FALSE);
-		gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0);
-		gtk_widget_show(label);
+	ped->keys = g_new0(GtkWidget *, exif_len);
+	ped->labels = g_new0(GtkWidget *, exif_len);
 
-		button = gtk_button_new();
-		gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
-		g_signal_connect(G_OBJECT(button), "clicked",
-				 G_CALLBACK(bar_exif_smaller), eb);
-		gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0);
-		arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
-		gtk_widget_set_size_request(arrow, EXIF_BAR_ARROW_SIZE, EXIF_BAR_ARROW_SIZE);
-		gtk_container_add(GTK_CONTAINER(button), arrow);
-		gtk_widget_show(arrow);
-		gtk_widget_show(button);
-
-		button = gtk_button_new();
-		gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
-		g_signal_connect(G_OBJECT(button), "clicked",
-				 G_CALLBACK(bar_exif_larger), eb);
-		gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0);
-		arrow = gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_NONE);
-		gtk_widget_set_size_request(arrow, EXIF_BAR_ARROW_SIZE, EXIF_BAR_ARROW_SIZE);
-		gtk_container_add(GTK_CONTAINER(button), arrow);
-		gtk_widget_show(arrow);
-		gtk_widget_show(button);
-
-		gtk_box_pack_start(GTK_BOX(eb->vbox), box, FALSE, FALSE, 0);
-		gtk_widget_show(box);
-		}
+	ped->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+	g_object_set_data(G_OBJECT(ped->vbox), "pane_data", ped);
+	g_signal_connect_after(G_OBJECT(ped->vbox), "destroy",
+			       G_CALLBACK(bar_pane_exif_destroy), ped);
 
 
 	table = gtk_table_new(3, exif_len + 1 + EXIF_BAR_CUSTOM_COUNT, FALSE);
 
-	eb->table = table;
+	ped->table = table;
 
 	for (i = 0; ExifUIList[i].key; i++)
 		{
 		gchar *text;
 
 		text = exif_get_description_by_key(ExifUIList[i].key);
-		eb->labels[i] = table_add_line(table, 0, i, text, NULL,
-		      &eb->keys[i]);
+		ped->labels[i] = table_add_line(table, 0, i, text, NULL,
+		      &ped->keys[i]);
 		g_free(text);
 		}
 
-	eb->custom_sep = gtk_hseparator_new();
-	gtk_table_attach(GTK_TABLE(table), eb->custom_sep, 0, 3,
+	ped->custom_sep = gtk_hseparator_new();
+	gtk_table_attach(GTK_TABLE(table), ped->custom_sep, 0, 3,
 					   exif_len, exif_len + 1,
 					   GTK_FILL, GTK_FILL, 2, 2);
 
 	for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
 		{
 		table_add_line_custom(table, 0, exif_len + 1 + i,
-				      "", "",  &eb->custom_name[i], &eb->custom_value[i],
-				      &eb->custom_remove[i]);
-		g_signal_connect(G_OBJECT(eb->custom_remove[i]), "clicked", 
-				 G_CALLBACK(bar_exif_remove_advanced_cb), eb);
+				      "", "",  &ped->custom_name[i], &ped->custom_value[i],
+				      &ped->custom_remove[i]);
+		g_signal_connect(G_OBJECT(ped->custom_remove[i]), "clicked", 
+				 G_CALLBACK(bar_pane_exif_remove_advanced_cb), ped);
 		}
 
-	eb->scrolled = gtk_scrolled_window_new(NULL, NULL);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eb->scrolled),
-				       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	ped->scrolled = gtk_scrolled_window_new(NULL, NULL);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ped->scrolled),
+				       GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
 
 	viewport = gtk_viewport_new(NULL, NULL);
 	gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
-	gtk_container_add(GTK_CONTAINER(eb->scrolled), viewport);
+	gtk_container_add(GTK_CONTAINER(ped->scrolled), viewport);
 	gtk_widget_show(viewport);
 
 	gtk_container_add(GTK_CONTAINER(viewport), table);
 	gtk_widget_show(table);
 
-	gtk_box_pack_start(GTK_BOX(eb->vbox), eb->scrolled, TRUE, TRUE, 0);
+	gtk_box_pack_start(GTK_BOX(ped->vbox), ped->scrolled, TRUE, TRUE, 0);
 
 	hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
-	gtk_box_pack_end(GTK_BOX(eb->vbox), hbox, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(ped->vbox), hbox, FALSE, FALSE, 0);
 	gtk_widget_show(hbox);
 
-	button = gtk_check_button_new_with_label(_("Advanced view"));
-	if (advanced) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
-	g_signal_connect(G_OBJECT(button), "toggled",
-			 G_CALLBACK(bar_exif_advanced_cb), eb);
-	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-	gtk_widget_show(button);
-
-	eb->advanced_scrolled = NULL;
-	eb->listview = NULL;
+	gtk_widget_show(ped->scrolled);
 
-	if (advanced)
-		{
-		bar_exif_advanced_build_view(eb);
-		gtk_widget_show(eb->advanced_scrolled);
-		}
-	else
-		{
-		gtk_widget_show(eb->scrolled);
-		}
+	gtk_widget_show(ped->vbox);
 
-	eb->fd = file_data_ref(fd);
-	bar_exif_update(eb);
-
-	return eb->vbox;
+	return ped->vbox;
 }
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */