Index: src/sj-main.c
===================================================================
--- src/sj-main.c	(revision 1815)
+++ src/sj-main.c	(working copy)
@@ -52,6 +52,7 @@
 #include "sj-main.h"
 #include "sj-prefs.h"
 #include "sj-play.h"
+#include "sj-message-area.h"
 #include "bacon-volume.h"
 
 gboolean on_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data);
@@ -71,6 +72,7 @@
 GConfClient *gconf_client;
 
 GtkWidget *main_window;
+static GtkWidget *message_area_vbox;
 static GtkWidget *title_entry, *artist_entry, *duration_label, *genre_entry;
 static GtkWidget *track_listview, *extract_button, *play_button;
 static GtkWidget *status_bar;
@@ -80,6 +82,8 @@
 static BaconMessageConnection *connection;
 GtkCellRenderer *toggle_renderer, *title_renderer, *artist_renderer;
 
+GtkWidget *current_message_area;
+
 const char *path_pattern, *file_pattern;
 char *base_uri;
 NautilusBurnDrive *drive = NULL;
@@ -346,6 +350,130 @@
   }
 }
 
+/* Taken from gedit */
+static void
+set_message_area_text_and_icon (SjMessageArea *message_area,
+				const gchar   *icon_stock_id,
+				const gchar   *primary_text,
+				const gchar   *secondary_text)
+{
+  GtkWidget *hbox_content;
+  GtkWidget *image;
+  GtkWidget *vbox;
+  gchar *primary_markup;
+  gchar *secondary_markup;
+  GtkWidget *primary_label;
+  GtkWidget *secondary_label;
+
+  hbox_content = gtk_hbox_new (FALSE, 8);
+  gtk_widget_show (hbox_content);
+
+  image = gtk_image_new_from_stock (icon_stock_id, GTK_ICON_SIZE_DIALOG);
+  gtk_widget_show (image);
+  gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0);
+  gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0);
+
+  vbox = gtk_vbox_new (FALSE, 6);
+  gtk_widget_show (vbox);
+  gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0);
+
+  primary_markup = g_strdup_printf ("<b>%s</b>", primary_text);
+  primary_label = gtk_label_new (primary_markup);
+  g_free (primary_markup);
+  gtk_widget_show (primary_label);
+  gtk_box_pack_start (GTK_BOX (vbox), primary_label, TRUE, TRUE, 0);
+  gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE);
+  gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE);
+  gtk_misc_set_alignment (GTK_MISC (primary_label), 0, 0.5);
+  GTK_WIDGET_SET_FLAGS (primary_label, GTK_CAN_FOCUS);
+  gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE);
+
+  if (secondary_text != NULL) {
+    secondary_markup = g_strdup_printf ("<small>%s</small>",
+					secondary_text);
+    secondary_label = gtk_label_new (secondary_markup);
+    g_free (secondary_markup);
+    gtk_widget_show (secondary_label);
+    gtk_box_pack_start (GTK_BOX (vbox), secondary_label, TRUE, TRUE, 0);
+    GTK_WIDGET_SET_FLAGS (secondary_label, GTK_CAN_FOCUS);
+    gtk_label_set_use_markup (GTK_LABEL (secondary_label), TRUE);
+    gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE);
+    gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (secondary_label), 0, 0.5);
+  }
+
+  sj_message_area_set_contents (SJ_MESSAGE_AREA (message_area),
+				   hbox_content);
+}
+
+/* Taken from gedit */
+static void
+set_message_area (GtkWidget *container,
+		  GtkWidget *message_area)
+{
+  if (current_message_area == message_area)
+      return;
+
+  if (current_message_area != NULL)
+    gtk_widget_destroy (current_message_area);
+
+  current_message_area = message_area;
+
+  if (message_area == NULL)
+    return;
+
+  gtk_box_pack_start (GTK_BOX (container),
+		      current_message_area,
+		      FALSE,
+		      FALSE,
+		      0);
+
+  g_object_add_weak_pointer (G_OBJECT (current_message_area),
+			     (gpointer *)&current_message_area);
+}
+
+static GtkWidget* musicbrainz_submit_message_area_new (char *title,
+						       char *artist)
+{
+  GtkWidget *message_area;
+  char *primary_text;
+
+  g_return_val_if_fail (title != NULL, NULL);
+  g_return_val_if_fail (artist != NULL, NULL);
+
+  message_area = sj_message_area_new ();
+
+  sj_message_area_add_button (SJ_MESSAGE_AREA (message_area),
+			      _("_Submit Album"),
+			      GTK_RESPONSE_OK);
+  sj_message_area_add_button (SJ_MESSAGE_AREA (message_area),
+			      GTK_STOCK_CANCEL,
+			      GTK_RESPONSE_CANCEL);
+
+  /* TODO: add a comment for translators */
+  primary_text = g_strdup_printf (_("Could not find %s by %s on MusicBrainz."), title, artist);
+
+  set_message_area_text_and_icon (SJ_MESSAGE_AREA (message_area),
+				  "gtk-dialog-info",
+				  primary_text,
+				  _("You can improve MusicBrainz database by adding this album."));
+
+  g_free (primary_text);
+
+  return message_area;
+}
+
+static void musicbrainz_submit_message_area_response (SjMessageArea *message_area,
+						      gint           response_id,
+						      gpointer       user_data)
+{
+  if (response_id == GTK_RESPONSE_OK) {
+
+  }
+
+  set_message_area (message_area_vbox, NULL);
+}
+
 /**
  * Utility function to update the UI for a given Album
  */
@@ -376,6 +504,8 @@
     gtk_widget_set_sensitive (deselect_all_menuitem, FALSE);
     gtk_widget_set_sensitive (prev_menuitem, FALSE);
     gtk_widget_set_sensitive (next_menuitem, FALSE);
+
+    set_message_area (message_area_vbox, NULL);
   } else {
     gtk_list_store_clear (track_store);
 
@@ -426,6 +556,28 @@
     } else {
       gtk_label_set_text (GTK_LABEL (duration_label), _("(unknown)"));
     }
+
+    /* If album details don't come from MusicBrainz ask user to add them */
+album->metadata_source = FREEDB;
+
+    if (album->metadata_source != MUSICBRAINZ) {
+      GtkWidget *message_area;
+
+      message_area = musicbrainz_submit_message_area_new (album->title,
+							  album->artist);
+
+      set_message_area (message_area_vbox, message_area);
+
+      g_signal_connect (message_area,
+			"response",
+			G_CALLBACK (musicbrainz_submit_message_area_response),
+			NULL);
+
+      sj_message_area_set_default_response (SJ_MESSAGE_AREA (message_area),
+					    GTK_RESPONSE_CANCEL);
+
+      gtk_widget_show (message_area);
+    }
   }
 }
 
@@ -1414,6 +1566,7 @@
   glade_xml_signal_autoconnect (glade);
 
   main_window = glade_xml_get_widget (glade, "main_window");
+  message_area_vbox = glade_xml_get_widget (glade, "message_area_vbox");
   select_all_menuitem = glade_xml_get_widget (glade, "select_all");
   deselect_all_menuitem = glade_xml_get_widget (glade, "deselect_all");
   submit_menuitem = glade_xml_get_widget (glade, "submit");
Index: src/sj-message-area.c
===================================================================
--- src/sj-message-area.c	(revision 0)
+++ src/sj-message-area.c	(revision 0)
@@ -0,0 +1,525 @@
+/*
+ * Sound Juicer - sj-message-area.c
+ *
+ * Based on gedit code
+ * Copyright (C) 2005 - Paolo Maggi
+ * Copyright (C) 2007 - The Free Software Foundation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, 
+ * Boston, MA 02111-1307, USA. 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "sj-message-area.h"
+
+#define SJ_MESSAGE_AREA_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), SJ_TYPE_MESSAGE_AREA, SjMessageAreaPrivate))
+
+struct _SjMessageAreaPrivate
+{
+	GtkWidget *main_hbox;
+
+	GtkWidget *contents;
+	GtkWidget *action_area;
+
+	gboolean changing_style;
+};
+
+typedef struct _ResponseData ResponseData;
+
+struct _ResponseData
+{
+	gint response_id;
+};
+
+enum {
+	RESPONSE,
+	CLOSE,
+	LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+G_DEFINE_TYPE(SjMessageArea, sj_message_area, GTK_TYPE_HBOX)
+
+
+
+static void
+sj_message_area_finalize (GObject *object)
+{
+	/*
+	SjMessageArea *message_area = SJ_MESSAGE_AREA (object); 
+	*/
+
+	G_OBJECT_CLASS (sj_message_area_parent_class)->finalize (object);
+}
+
+static ResponseData *
+get_response_data (GtkWidget *widget,
+		   gboolean   create)
+{
+	ResponseData *ad = g_object_get_data (G_OBJECT (widget),
+                                       	      "sj-message-area-response-data");
+
+	if (ad == NULL && create)
+	{
+		ad = g_new (ResponseData, 1);
+
+		g_object_set_data_full (G_OBJECT (widget),
+					"sj-message-area-response-data",
+					ad,
+					g_free);
+    	}
+
+	return ad;
+}
+
+static GtkWidget *
+find_button (SjMessageArea *message_area,
+	     gint           response_id)
+{
+	GList *children, *tmp_list;
+	GtkWidget *child = NULL;
+
+	children = gtk_container_get_children (
+			GTK_CONTAINER (message_area->priv->action_area));
+
+	for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
+	{
+		ResponseData *rd = get_response_data (tmp_list->data, FALSE);
+
+		if (rd && rd->response_id == response_id)
+		{
+			child = tmp_list->data;
+			break;
+		}
+	}
+
+	g_list_free (children);
+
+	return child;
+}
+
+static void
+sj_message_area_close (SjMessageArea *message_area)
+{
+	if (!find_button (message_area, GTK_RESPONSE_CANCEL))
+		return;
+
+	/* emit response signal */
+	sj_message_area_response (SJ_MESSAGE_AREA (message_area), 
+				  GTK_RESPONSE_CANCEL);
+}
+
+static gboolean
+paint_message_area (GtkWidget      *widget,
+		    GdkEventExpose *event,
+		    gpointer        user_data)
+{
+	gtk_paint_flat_box (widget->style,
+			    widget->window,
+			    GTK_STATE_NORMAL,
+			    GTK_SHADOW_OUT,
+			    NULL,
+			    widget,
+			    "tooltip",
+			    widget->allocation.x + 1,
+			    widget->allocation.y + 1,
+			    widget->allocation.width - 2,
+			    widget->allocation.height - 2);
+
+	return FALSE;
+}
+
+static void
+style_set (GtkWidget *widget,
+	   GtkStyle  *prev_style)
+{
+	GtkTooltips *tooltips;
+	GtkStyle *style;
+
+	SjMessageArea *message_area = SJ_MESSAGE_AREA (widget);
+
+	if (message_area->priv->changing_style)
+		return;
+
+	tooltips = gtk_tooltips_new ();
+	g_object_ref_sink (tooltips);
+
+	gtk_tooltips_force_window (tooltips);
+	gtk_widget_ensure_style (tooltips->tip_window);
+	style = gtk_widget_get_style (tooltips->tip_window);
+
+	message_area->priv->changing_style = TRUE;
+	gtk_widget_set_style (GTK_WIDGET (widget), style);
+	message_area->priv->changing_style = FALSE;
+
+	g_object_unref (tooltips);
+}
+
+static void
+sj_message_area_class_init (SjMessageAreaClass *klass)
+{
+	GObjectClass *object_class;
+	GtkWidgetClass *widget_class;
+	GtkBindingSet *binding_set;
+
+	object_class = G_OBJECT_CLASS (klass);
+	widget_class = GTK_WIDGET_CLASS (klass);
+	object_class->finalize = sj_message_area_finalize;
+
+	widget_class->style_set = style_set;
+
+	klass->close = sj_message_area_close;
+
+	g_type_class_add_private (object_class, sizeof(SjMessageAreaPrivate));
+
+	signals[RESPONSE] = g_signal_new ("response",
+					  G_OBJECT_CLASS_TYPE (klass),
+					  G_SIGNAL_RUN_LAST,
+					  G_STRUCT_OFFSET (SjMessageAreaClass, response),
+					  NULL, NULL,
+					  g_cclosure_marshal_VOID__INT,
+					  G_TYPE_NONE, 1,
+					  G_TYPE_INT);
+
+	signals[CLOSE] =  g_signal_new ("close",
+					G_OBJECT_CLASS_TYPE (klass),
+					G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+					G_STRUCT_OFFSET (SjMessageAreaClass, close),
+		  			NULL, NULL,
+		  			g_cclosure_marshal_VOID__VOID,
+					G_TYPE_NONE, 0);
+
+	binding_set = gtk_binding_set_by_class (klass);
+
+	gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, "close", 0);
+}
+
+static void
+sj_message_area_init (SjMessageArea *message_area)
+{
+	message_area->priv = SJ_MESSAGE_AREA_GET_PRIVATE (message_area);
+
+	message_area->priv->main_hbox = gtk_hbox_new (FALSE, 16); /* FIXME: use style properties */
+	gtk_widget_show (message_area->priv->main_hbox);
+	gtk_container_set_border_width (GTK_CONTAINER (message_area->priv->main_hbox),
+					8); /* FIXME: use style properties */
+
+	message_area->priv->action_area = gtk_vbox_new (TRUE, 10); /* FIXME: use style properties */
+	gtk_widget_show (message_area->priv->action_area);
+	gtk_box_pack_end (GTK_BOX (message_area->priv->main_hbox),
+			  message_area->priv->action_area,
+			  FALSE,
+			  TRUE,
+			  0);
+
+	gtk_box_pack_start (GTK_BOX (message_area),
+			    message_area->priv->main_hbox,
+			    TRUE,
+			    TRUE,
+			    0);
+
+	/* CHECK: do we really need it? */
+	gtk_widget_set_name (GTK_WIDGET (message_area), "gtk-tooltips");
+
+	g_signal_connect (message_area,
+			  "expose_event",
+			  G_CALLBACK (paint_message_area),
+			  NULL);
+}
+
+static gint
+get_response_for_widget (SjMessageArea *message_area,
+			 GtkWidget     *widget)
+{
+	ResponseData *rd;
+
+	rd = get_response_data (widget, FALSE);
+	if (!rd)
+		return GTK_RESPONSE_NONE;
+	else
+		return rd->response_id;
+}
+
+static void
+action_widget_activated (GtkWidget *widget, SjMessageArea *message_area)
+{
+	gint response_id;
+
+	response_id = get_response_for_widget (message_area, widget);
+
+	sj_message_area_response (message_area, response_id);
+}
+
+void
+sj_message_area_add_action_widget (SjMessageArea *message_area,
+				   GtkWidget     *child,
+				   gint           response_id)
+{
+	ResponseData *ad;
+	guint signal_id;
+
+	g_return_if_fail (SJ_IS_MESSAGE_AREA (message_area));
+	g_return_if_fail (GTK_IS_WIDGET (child));
+
+	ad = get_response_data (child, TRUE);
+
+	ad->response_id = response_id;
+
+	if (GTK_IS_BUTTON (child))
+		signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON);
+	else
+		signal_id = GTK_WIDGET_GET_CLASS (child)->activate_signal;
+
+	if (signal_id)
+	{
+		GClosure *closure;
+
+		closure = g_cclosure_new_object (G_CALLBACK (action_widget_activated),
+						 G_OBJECT (message_area));
+
+		g_signal_connect_closure_by_id (child,
+						signal_id,
+						0,
+						closure,
+						FALSE);
+	}
+	else
+		g_warning ("Only 'activatable' widgets can be packed into the action area of a SjMessageArea");
+
+	if (response_id != GTK_RESPONSE_HELP)
+		gtk_box_pack_start (GTK_BOX (message_area->priv->action_area),
+				    child,
+				    FALSE,
+				    FALSE,
+				    0);
+	else
+		gtk_box_pack_end (GTK_BOX (message_area->priv->action_area),
+				  child,
+				  FALSE,
+				  FALSE,
+				  0);
+}
+
+void
+sj_message_area_set_contents (SjMessageArea *message_area,
+			      GtkWidget     *contents)
+{
+	g_return_if_fail (SJ_IS_MESSAGE_AREA (message_area));
+	g_return_if_fail (GTK_IS_WIDGET (contents));
+
+  	message_area->priv->contents = contents;
+	gtk_box_pack_start (GTK_BOX (message_area->priv->main_hbox),
+			    message_area->priv->contents,
+			    TRUE,
+			    TRUE,
+			    0);
+}
+
+GtkWidget*
+sj_message_area_add_button (SjMessageArea *message_area,
+			    const gchar   *button_text,
+			    gint           response_id)
+{
+	GtkWidget *button;
+
+	g_return_val_if_fail (SJ_IS_MESSAGE_AREA (message_area), NULL);
+	g_return_val_if_fail (button_text != NULL, NULL);
+
+	button = gtk_button_new_from_stock (button_text);
+
+	GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+
+	gtk_widget_show (button);
+
+	sj_message_area_add_action_widget (message_area,
+					   button,
+					   response_id);
+
+	return button;
+}
+
+static void
+add_buttons_valist (SjMessageArea *message_area,
+		    const gchar   *first_button_text,
+		    va_list        args)
+{
+	const gchar* text;
+	gint response_id;
+
+	g_return_if_fail (SJ_IS_MESSAGE_AREA (message_area));
+
+	if (first_button_text == NULL)
+		return;
+
+	text = first_button_text;
+	response_id = va_arg (args, gint);
+
+	while (text != NULL)
+	{
+		sj_message_area_add_button (message_area,
+					    text,
+					    response_id);
+
+		text = va_arg (args, gchar*);
+		if (text == NULL)
+        		break;
+
+		response_id = va_arg (args, int);
+	}
+}
+
+void
+sj_message_area_add_buttons (SjMessageArea *message_area,
+			     const gchar   *first_button_text,
+			     ...)
+{
+	va_list args;
+
+	va_start (args, first_button_text);
+
+	add_buttons_valist (message_area,
+                            first_button_text,
+                            args);
+
+	va_end (args);
+}
+
+GtkWidget *
+sj_message_area_new (void)
+{
+	return g_object_new (SJ_TYPE_MESSAGE_AREA, NULL);
+}
+
+GtkWidget *
+sj_message_area_new_with_buttons (const gchar *first_button_text,
+				  ...)
+{
+	SjMessageArea *message_area;
+	va_list args;
+
+	message_area = SJ_MESSAGE_AREA (sj_message_area_new ());
+
+	va_start (args, first_button_text);
+
+	add_buttons_valist (message_area,
+			    first_button_text,
+			    args);
+
+	va_end (args);
+
+	return GTK_WIDGET (message_area);
+}
+
+void
+sj_message_area_set_response_sensitive (SjMessageArea *message_area,
+					gint           response_id,
+					gboolean       setting)
+{
+	GList *children;
+	GList *tmp_list;
+
+	g_return_if_fail (SJ_IS_MESSAGE_AREA (message_area));
+
+	children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
+
+	tmp_list = children;
+	while (tmp_list != NULL)
+	{
+		GtkWidget *widget = tmp_list->data;
+		ResponseData *rd = get_response_data (widget, FALSE);
+
+		if (rd && rd->response_id == response_id)
+			gtk_widget_set_sensitive (widget, setting);
+
+		tmp_list = g_list_next (tmp_list);
+	}
+
+	g_list_free (children);
+}
+
+void
+sj_message_area_set_default_response (SjMessageArea *message_area,
+				      gint           response_id)
+{
+	GList *children;
+	GList *tmp_list;
+
+	g_return_if_fail (SJ_IS_MESSAGE_AREA (message_area));
+
+	children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
+
+	tmp_list = children;
+	while (tmp_list != NULL)
+	{
+		GtkWidget *widget = tmp_list->data;
+		ResponseData *rd = get_response_data (widget, FALSE);
+
+		if (rd && rd->response_id == response_id)
+		gtk_widget_grab_default (widget);
+
+		tmp_list = g_list_next (tmp_list);
+	}
+
+	g_list_free (children);
+}
+
+void
+sj_message_area_response (SjMessageArea *message_area,
+			  gint           response_id)
+{
+	g_return_if_fail (SJ_IS_MESSAGE_AREA (message_area));
+
+	g_signal_emit (message_area,
+		       signals[RESPONSE],
+		       0,
+		       response_id);
+}
+
+GtkWidget *
+sj_message_area_add_stock_button_with_text (SjMessageArea *message_area, 
+					    const gchar   *text,
+					    const gchar   *stock_id,
+					    gint           response_id)
+{
+	GtkWidget *button;
+
+	g_return_val_if_fail (SJ_IS_MESSAGE_AREA (message_area), NULL);
+	g_return_val_if_fail (text != NULL, NULL);
+	g_return_val_if_fail (stock_id != NULL, NULL);
+
+	button = gtk_button_new_with_mnemonic (text);
+        gtk_button_set_image (GTK_BUTTON (button),
+                              gtk_image_new_from_stock (stock_id,
+                                                        GTK_ICON_SIZE_BUTTON));
+
+	GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+
+	gtk_widget_show (button);
+
+	sj_message_area_add_action_widget (message_area,
+					   button,
+					   response_id);
+
+	return button;
+}
Index: src/sj-message-area.h
===================================================================
--- src/sj-message-area.h	(revision 0)
+++ src/sj-message-area.h	(revision 0)
@@ -0,0 +1,123 @@
+/*
+ * Sound Juicer - sj-message-area.h
+ *
+ * Based on gedit code
+ * Copyright (C) 2005 - Paolo Maggi
+ * Copyright (C) 2007 - The Free Software Foundation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, 
+ * Boston, MA 02111-1307, USA. 
+ */
+
+#ifndef __SJ_MESSAGE_AREA_H__
+#define __SJ_MESSAGE_AREA_H__
+
+#include <gtk/gtkdialog.h>
+
+G_BEGIN_DECLS
+
+/*
+ * Type checking and casting macros
+ */
+#define SJ_TYPE_MESSAGE_AREA              (sj_message_area_get_type())
+#define SJ_MESSAGE_AREA(obj)              (G_TYPE_CHECK_INSTANCE_CAST((obj), SJ_TYPE_MESSAGE_AREA, SjMessageArea))
+#define SJ_MESSAGE_AREA_CONST(obj)        (G_TYPE_CHECK_INSTANCE_CAST((obj), SJ_TYPE_MESSAGE_AREA, SjMessageArea const))
+#define SJ_MESSAGE_AREA_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass), SJ_TYPE_MESSAGE_AREA, SjMessageAreaClass))
+#define SJ_IS_MESSAGE_AREA(obj)           (G_TYPE_CHECK_INSTANCE_TYPE((obj), SJ_TYPE_MESSAGE_AREA))
+#define SJ_IS_MESSAGE_AREA_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), SJ_TYPE_MESSAGE_AREA))
+#define SJ_MESSAGE_AREA_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS((obj), SJ_TYPE_MESSAGE_AREA, SjMessageAreaClass))
+
+/* Private structure type */
+typedef struct _SjMessageAreaPrivate SjMessageAreaPrivate;
+
+/*
+ * Main object structure
+ */
+typedef struct _SjMessageArea SjMessageArea;
+
+struct _SjMessageArea 
+{
+	GtkHBox parent;
+
+	/*< private > */
+	SjMessageAreaPrivate *priv;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _SjMessageAreaClass SjMessageAreaClass;
+
+struct _SjMessageAreaClass
+{
+	GtkHBoxClass parent_class;
+
+	/* Signals */
+	void (* response) (SjMessageArea *message_area, gint response_id);
+
+	/* Keybinding signals */
+	void (* close)    (SjMessageArea *message_area);
+
+	/* Padding for future expansion */
+	void (*_sj_reserved1) (void);
+	void (*_sj_reserved2) (void);
+};
+
+/*
+ * Public methods
+ */
+GType 		 sj_message_area_get_type 		(void) G_GNUC_CONST;
+
+GtkWidget	*sj_message_area_new      		(void);
+
+GtkWidget	*sj_message_area_new_with_buttons	(const gchar   *first_button_text,
+                                        		 ...);
+
+void		 sj_message_area_set_contents		(SjMessageArea *message_area,
+                                             		 GtkWidget     *contents);
+
+void		 sj_message_area_add_action_widget	(SjMessageArea *message_area,
+                                         		 GtkWidget     *child,
+                                         		 gint           response_id);
+
+GtkWidget	*sj_message_area_add_button        	(SjMessageArea *message_area,
+                                         		 const gchar   *button_text,
+                                         		 gint           response_id);
+
+GtkWidget	*sj_message_area_add_stock_button_with_text
+							(SjMessageArea *message_area,
+				    			 const gchar   *text,
+				    			 const gchar   *stock_id,
+				    			 gint           response_id);
+
+void       	 sj_message_area_add_buttons 		(SjMessageArea *message_area,
+                                         		 const gchar   *first_button_text,
+                                         		 ...);
+
+void		 sj_message_area_set_response_sensitive
+							(SjMessageArea *message_area,
+                                        		 gint           response_id,
+                                        		 gboolean       setting);
+void 		 sj_message_area_set_default_response
+							(SjMessageArea *message_area,
+                                        		 gint           response_id);
+
+/* Emit response signal */
+void		 sj_message_area_response           	(SjMessageArea *message_area,
+                                    			 gint           response_id);
+
+G_END_DECLS
+
+#endif  /* __SJ_MESSAGE_AREA_H__  */
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 1815)
+++ src/Makefile.am	(working copy)
@@ -13,6 +13,8 @@
 	sj-about.c \
 	sj-extracting.h \
 	sj-extracting.c \
+	sj-message-area.h \
+	sj-message-area.c \
 	gconf-bridge.h \
 	gconf-bridge.c \
 	bacon-volume.c \
Index: libjuicer/sj-structures.h
===================================================================
--- libjuicer/sj-structures.h	(revision 1815)
+++ libjuicer/sj-structures.h	(working copy)
@@ -26,9 +26,16 @@
 #include <glib/glist.h>
 #include <gtk/gtktreemodel.h>
 
+typedef enum _MetadataSource MetadataSource;
+
 typedef struct _AlbumDetails AlbumDetails;
 typedef struct _TrackDetails TrackDetails;
 
+enum _MetadataSource {
+  CDTEXT,
+  FREEDB,
+  MUSICBRAINZ
+};
 
 struct _TrackDetails {
   AlbumDetails *album;
@@ -52,6 +59,7 @@
   GDate *release_date; /* MusicBrainz support multiple releases per album */
   char* album_id;
   char* artist_id;
+  MetadataSource metadata_source;
 };
 
 void album_details_free(AlbumDetails *album);
Index: libjuicer/sj-metadata-musicbrainz.c
===================================================================
--- libjuicer/sj-metadata-musicbrainz.c	(revision 1815)
+++ libjuicer/sj-metadata-musicbrainz.c	(working copy)
@@ -519,6 +519,12 @@
       convert_encoding(&album->artist_sortname);
     }
 
+    if (from_freedb) {
+      album->metadata_source = FREEDB;
+    } else {
+      album->metadata_source = MUSICBRAINZ;
+    }
+
     albums = g_list_append (albums, album);
 
     mb_Select (priv->mb, MBS_Rewind);
Index: libjuicer/sj-metadata-cdtext.c
===================================================================
--- libjuicer/sj-metadata-cdtext.c	(revision 1815)
+++ libjuicer/sj-metadata-cdtext.c	(working copy)
@@ -148,6 +148,8 @@
   album->artist = g_strdup (cdtext_get (CDTEXT_PERFORMER, cdtext));
   album->genre = g_strdup (cdtext_get (CDTEXT_GENRE, cdtext));
 
+  album->metadata_source = CDTEXT;
+
   priv->error = NULL;
   priv->albums = g_list_append (NULL, album);
   g_idle_add ((GSourceFunc)fire_signal_idle, metadata);
Index: data/sound-juicer.glade
===================================================================
--- data/sound-juicer.glade	(revision 1815)
+++ data/sound-juicer.glade	(working copy)
@@ -142,7 +142,7 @@
 		    <widget class="GtkImageMenuItem" id="extract_menuitem">
 		      <property name="visible">True</property>
 		      <property name="label">sj-stock-extract</property>
-		      <property name="use_stock">True</property>
+		      <property name="use_underline">True</property>
 		      <signal name="activate" handler="on_extract_activate" last_modification_time="Tue, 25 Mar 2003 07:45:51 GMT"/>
 		    </widget>
 		  </child>
@@ -288,372 +288,389 @@
       </child>
 
       <child>
-	<widget class="GtkVBox" id="vbox2">
-	  <property name="border_width">8</property>
+	<widget class="GtkVBox" id="message_area_vbox">
 	  <property name="visible">True</property>
 	  <property name="homogeneous">False</property>
-	  <property name="spacing">8</property>
+	  <property name="spacing">0</property>
 
 	  <child>
-	    <widget class="GtkTable" id="table1">
+	    <widget class="GtkVBox" id="vbox2">
+	      <property name="border_width">8</property>
 	      <property name="visible">True</property>
-	      <property name="n_rows">4</property>
-	      <property name="n_columns">2</property>
 	      <property name="homogeneous">False</property>
-	      <property name="row_spacing">6</property>
-	      <property name="column_spacing">12</property>
+	      <property name="spacing">8</property>
 
 	      <child>
-		<widget class="GtkLabel" id="label1">
+		<widget class="GtkTable" id="table1">
 		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">&lt;b&gt;_Title:&lt;/b&gt;</property>
-		  <property name="use_underline">True</property>
-		  <property name="use_markup">True</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="mnemonic_widget">title_entry</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
+		  <property name="n_rows">4</property>
+		  <property name="n_columns">2</property>
+		  <property name="homogeneous">False</property>
+		  <property name="row_spacing">6</property>
+		  <property name="column_spacing">12</property>
 
-	      <child>
-		<widget class="GtkEntry" id="title_entry">
-		  <property name="visible">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="editable">True</property>
-		  <property name="visibility">True</property>
-		  <property name="max_length">0</property>
-		  <property name="text" translatable="yes"></property>
-		  <property name="has_frame">True</property>
-		  <property name="invisible_char">*</property>
-		  <property name="activates_default">False</property>
-		  <signal name="changed" handler="on_title_edit_changed" after="yes" last_modification_time="Sun, 06 Jul 2003 17:49:40 GMT"/>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
+		  <child>
+		    <widget class="GtkLabel" id="label1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;_Title:&lt;/b&gt;</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">title_entry</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
 
-	      <child>
-		<widget class="GtkLabel" id="label2">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">&lt;b&gt;_Artist:&lt;/b&gt;</property>
-		  <property name="use_underline">True</property>
-		  <property name="use_markup">True</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="mnemonic_widget">artist_entry</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
+		  <child>
+		    <widget class="GtkEntry" id="title_entry">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		      <signal name="changed" handler="on_title_edit_changed" after="yes" last_modification_time="Sun, 06 Jul 2003 17:49:40 GMT"/>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
 
-	      <child>
-		<widget class="GtkEntry" id="artist_entry">
-		  <property name="visible">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="editable">True</property>
-		  <property name="visibility">True</property>
-		  <property name="max_length">0</property>
-		  <property name="text" translatable="yes"></property>
-		  <property name="has_frame">True</property>
-		  <property name="invisible_char">*</property>
-		  <property name="activates_default">False</property>
-		  <signal name="changed" handler="on_artist_edit_changed" after="yes" last_modification_time="Sun, 06 Jul 2003 18:19:12 GMT"/>
-		</widget>
-		<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"></property>
-		</packing>
-	      </child>
+		  <child>
+		    <widget class="GtkLabel" id="label2">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;_Artist:&lt;/b&gt;</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">artist_entry</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
 
-	      <child>
-		<widget class="GtkLabel" id="label31">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">&lt;b&gt;_Genre:&lt;/b&gt;</property>
-		  <property name="use_underline">True</property>
-		  <property name="use_markup">True</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="mnemonic_widget">genre_entry</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">2</property>
-		  <property name="bottom_attach">3</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
+		  <child>
+		    <widget class="GtkEntry" id="artist_entry">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		      <signal name="changed" handler="on_artist_edit_changed" after="yes" last_modification_time="Sun, 06 Jul 2003 18:19:12 GMT"/>
+		    </widget>
+		    <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"></property>
+		    </packing>
+		  </child>
 
-	      <child>
-		<widget class="GtkEntry" id="genre_entry">
-		  <property name="visible">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="editable">True</property>
-		  <property name="visibility">True</property>
-		  <property name="max_length">0</property>
-		  <property name="text" translatable="yes"></property>
-		  <property name="has_frame">True</property>
-		  <property name="invisible_char">*</property>
-		  <property name="activates_default">False</property>
-		  <signal name="changed" handler="on_genre_edit_changed" last_modification_time="Wed, 29 Jun 2005 19:34:25 GMT"/>
-		</widget>
-		<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"></property>
-		</packing>
-	      </child>
+		  <child>
+		    <widget class="GtkLabel" id="label31">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;_Genre:&lt;/b&gt;</property>
+		      <property name="use_underline">True</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">genre_entry</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
 
-	      <child>
-		<widget class="GtkLabel" id="label3">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">True</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		  <accessibility>
-		    <atkrelation target="duration_label" type="label-for"/>
-		  </accessibility>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">3</property>
-		  <property name="bottom_attach">4</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
+		  <child>
+		    <widget class="GtkEntry" id="genre_entry">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char">*</property>
+		      <property name="activates_default">False</property>
+		      <signal name="changed" handler="on_genre_edit_changed" last_modification_time="Wed, 29 Jun 2005 19:34:25 GMT"/>
+		    </widget>
+		    <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"></property>
+		    </packing>
+		  </child>
 
-	      <child>
-		<widget class="GtkLabel" id="duration_label">
-		  <property name="visible">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="label"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">True</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">3</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		  <accessibility>
-		    <atkrelation target="label3" type="labelled-by"/>
-		  </accessibility>
+		  <child>
+		    <widget class="GtkLabel" id="label3">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		      <accessibility>
+			<atkrelation target="duration_label" type="label-for"/>
+		      </accessibility>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">3</property>
+		      <property name="bottom_attach">4</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="duration_label">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">True</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">3</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		      <accessibility>
+			<atkrelation target="label3" type="labelled-by"/>
+		      </accessibility>
+		    </widget>
+		    <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>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
 		</widget>
 		<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>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
 		</packing>
 	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
 
-	  <child>
-	    <widget class="GtkScrolledWindow" id="scrolledwindow1">
-	      <property name="visible">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-	      <property name="shadow_type">GTK_SHADOW_IN</property>
-	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
 	      <child>
-		<widget class="GtkTreeView" id="track_listview">
+		<widget class="GtkScrolledWindow" id="scrolledwindow1">
 		  <property name="visible">True</property>
 		  <property name="can_focus">True</property>
-		  <property name="has_focus">True</property>
-		  <property name="headers_visible">True</property>
-		  <property name="rules_hint">True</property>
-		  <property name="reorderable">False</property>
-		  <property name="enable_search">True</property>
-		  <property name="fixed_height_mode">False</property>
-		  <property name="hover_selection">False</property>
-		  <property name="hover_expand">False</property>
-		  <accessibility>
-		    <atkproperty name="AtkObject::accessible_name" translatable="yes">Tracks</atkproperty>
-		  </accessibility>
-		  <signal name="row_activated" handler="on_tracklist_row_activate" last_modification_time="Thu, 23 Jun 2005 07:54:15 GMT"/>
-		  <signal name="cursor-changed" handler="on_tracklist_row_selected" last_modification_time="Sat, 30 Jul 2005 00:54:15 GMT"/>
-		</widget>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
 
-	  <child>
-	    <widget class="GtkHBox" id="hbox10">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="Custom" id="volume_button">
-		  <property name="visible">True</property>
-		  <property name="creation_function">sj_make_volume_button</property>
-		  <property name="int1">0</property>
-		  <property name="int2">0</property>
-		  <property name="last_modification_time">Wed, 13 Jul 2005 09:05:56 GMT</property>
-		  <signal name="value-changed" handler="on_volume_changed" last_modification_time="Thu, 23 Jun 2005 12:53:25 GMT"/>
+		  <child>
+		    <widget class="GtkTreeView" id="track_listview">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="has_focus">True</property>
+		      <property name="headers_visible">True</property>
+		      <property name="rules_hint">True</property>
+		      <property name="reorderable">False</property>
+		      <property name="enable_search">True</property>
+		      <property name="fixed_height_mode">False</property>
+		      <property name="hover_selection">False</property>
+		      <property name="hover_expand">False</property>
+		      <accessibility>
+			<atkproperty name="AtkObject::accessible_name" translatable="yes">Tracks</atkproperty>
+		      </accessibility>
+		      <signal name="row_activated" handler="on_tracklist_row_activate" last_modification_time="Thu, 23 Jun 2005 07:54:15 GMT"/>
+		      <signal name="cursor-changed" handler="on_tracklist_row_selected" last_modification_time="Sat, 30 Jul 2005 00:54:15 GMT"/>
+		    </widget>
+		  </child>
 		</widget>
 		<packing>
 		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		  <property name="pack_type">GTK_PACK_END</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
 		</packing>
 	      </child>
 
 	      <child>
-		<widget class="GtkHButtonBox" id="hbuttonbox1">
+		<widget class="GtkHBox" id="hbox10">
 		  <property name="visible">True</property>
-		  <property name="layout_style">GTK_BUTTONBOX_END</property>
+		  <property name="homogeneous">False</property>
 		  <property name="spacing">6</property>
 
 		  <child>
-		    <widget class="GtkButton" id="play_button">
+		    <widget class="Custom" id="volume_button">
 		      <property name="visible">True</property>
-		      <property name="can_default">True</property>
-		      <property name="can_focus">True</property>
-		      <property name="label">gtk-media-play</property>
-		      <property name="use_stock">True</property>
-		      <property name="relief">GTK_RELIEF_NORMAL</property>
-		      <property name="focus_on_click">True</property>
-		      <signal name="clicked" handler="on_play_activate" last_modification_time="Wed, 22 Jun 2005 21:15:28 GMT"/>
+		      <property name="creation_function">sj_make_volume_button</property>
+		      <property name="int1">0</property>
+		      <property name="int2">0</property>
+		      <property name="last_modification_time">Wed, 13 Jul 2005 09:05:56 GMT</property>
+		      <signal name="value-changed" handler="on_volume_changed" last_modification_time="Thu, 23 Jun 2005 12:53:25 GMT"/>
 		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		      <property name="pack_type">GTK_PACK_END</property>
+		    </packing>
 		  </child>
 
 		  <child>
-		    <widget class="GtkButton" id="extract_button">
+		    <widget class="GtkHButtonBox" id="hbuttonbox1">
 		      <property name="visible">True</property>
-		      <property name="can_default">True</property>
+		      <property name="layout_style">GTK_BUTTONBOX_END</property>
+		      <property name="spacing">6</property>
+
+		      <child>
+			<widget class="GtkButton" id="play_button">
+			  <property name="visible">True</property>
+			  <property name="can_default">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label">gtk-media-play</property>
+			  <property name="use_stock">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <signal name="clicked" handler="on_play_activate" last_modification_time="Wed, 22 Jun 2005 21:15:28 GMT"/>
+			</widget>
+		      </child>
+
+		      <child>
+			<widget class="GtkButton" id="extract_button">
+			  <property name="visible">True</property>
+			  <property name="can_default">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label">sj-stock-extract</property>
+			  <property name="use_stock">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <signal name="clicked" handler="on_extract_activate" last_modification_time="Wed, 22 Jun 2005 21:14:23 GMT"/>
+			</widget>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHScale" id="seek_scale">
 		      <property name="can_focus">True</property>
-		      <property name="label">sj-stock-extract</property>
-		      <property name="use_stock">True</property>
-		      <property name="relief">GTK_RELIEF_NORMAL</property>
-		      <property name="focus_on_click">True</property>
-		      <signal name="clicked" handler="on_extract_activate" last_modification_time="Wed, 22 Jun 2005 21:14:23 GMT"/>
+		      <property name="draw_value">False</property>
+		      <property name="value_pos">GTK_POS_TOP</property>
+		      <property name="digits">0</property>
+		      <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+		      <property name="inverted">False</property>
+		      <property name="adjustment">0 0 1 0.00999999977648 0.10000000149 0</property>
+		      <accessibility>
+			<atkproperty name="AtkObject::accessible_name" translatable="yes">Track Progress</atkproperty>
+		      </accessibility>
+		      <signal name="value_changed" handler="on_seek_moved" last_modification_time="Thu, 23 Jun 2005 09:04:46 GMT"/>
+		      <signal name="button_press_event" handler="on_seek_press" last_modification_time="Thu, 23 Jun 2005 09:05:46 GMT"/>
+		      <signal name="button_release_event" handler="on_seek_release" last_modification_time="Thu, 23 Jun 2005 09:05:55 GMT"/>
 		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
 		  </child>
 		</widget>
 		<packing>
 		  <property name="padding">0</property>
 		  <property name="expand">False</property>
-		  <property name="fill">True</property>
+		  <property name="fill">False</property>
 		</packing>
 	      </child>
-
-	      <child>
-		<widget class="GtkHScale" id="seek_scale">
-		  <property name="can_focus">True</property>
-		  <property name="draw_value">False</property>
-		  <property name="value_pos">GTK_POS_TOP</property>
-		  <property name="digits">0</property>
-		  <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
-		  <property name="inverted">False</property>
-		  <property name="adjustment">0 0 1 0.00999999977648 0.10000000149 0</property>
-		  <accessibility>
-		    <atkproperty name="AtkObject::accessible_name" translatable="yes">Track Progress</atkproperty>
-		  </accessibility>
-		  <signal name="value_changed" handler="on_seek_moved" last_modification_time="Thu, 23 Jun 2005 09:04:46 GMT"/>
-		  <signal name="button_press_event" handler="on_seek_press" last_modification_time="Thu, 23 Jun 2005 09:05:46 GMT"/>
-		  <signal name="button_release_event" handler="on_seek_release" last_modification_time="Thu, 23 Jun 2005 09:05:55 GMT"/>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
 	    </widget>
 	    <packing>
 	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">False</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
 	      <property name="pack_type">GTK_PACK_END</property>
 	    </packing>
 	  </child>
+
+	  <child>
+	    <placeholder/>
+	  </child>
 	</widget>
 	<packing>
 	  <property name="padding">0</property>
@@ -1174,7 +1191,6 @@
 		      <child>
 			<widget class="GtkFileChooserButton" id="path_chooser">
 			  <property name="visible">True</property>
-			  <property name="focus_on_click">True</property>
 			  <property name="title" translatable="yes">Select A Folder</property>
 			  <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
 			  <property name="local_only">False</property>
