File gnome-packagekit-pack-list-tabs.patch of Package gnome-packagekit.import4854

diff --git a/src/gpk-dialog.c b/src/gpk-dialog.c
index 5feb288..31b8c17 100644
--- a/src/gpk-dialog.c
+++ b/src/gpk-dialog.c
@@ -365,3 +365,112 @@ out:
 	return TRUE;
 }
 
+/**
+ * gpk_dialog_embed_tabbed_widget
+ **/
+gboolean
+gpk_dialog_embed_tabbed_widget (GtkDialog *dialog, GtkNotebook *tabbed_widget)
+{
+	GtkWidget *widget;
+
+	if (! GTK_IS_NOTEBOOK (tabbed_widget))
+		return FALSE;
+
+	widget = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+	gtk_container_add_with_properties (GTK_CONTAINER (widget),
+					   GTK_WIDGET (tabbed_widget),
+					   "expand", FALSE,
+					   "fill", FALSE,
+					   NULL);
+
+	return TRUE;
+}
+
+/**
+ * gpk_dialog_tabbed_package_list_widget:
+ **/
+gboolean
+gpk_dialog_tabbed_package_list_widget (GtkWidget *tab_page, GPtrArray *array)
+{
+	GtkWidget *scroll;
+	GtkListStore *store;
+	GtkWidget *widget;
+	const guint row_height = 48;
+
+	/* convert to a store */
+	store = gpk_dialog_package_array_to_list_store (array);
+
+	/* create a treeview to hold the store */
+	widget = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
+	gpk_dialog_treeview_for_package_list (GTK_TREE_VIEW (widget));
+	gtk_widget_show (widget);
+
+	/* scroll the treeview */
+	scroll = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), widget);
+	gtk_widget_show (scroll);
+
+	/* add some spacing to conform to the GNOME HIG */
+	gtk_container_set_border_width (GTK_CONTAINER (scroll), 6);
+
+	/* only allow more space if there are a large number of items */
+	if (array->len > 5) {
+		gtk_widget_set_size_request (GTK_WIDGET (scroll), -1, (row_height * 5) + 8);
+	} else if (array->len > 1) {
+		gtk_widget_set_size_request (GTK_WIDGET (scroll), -1, (row_height * array->len) + 8);
+	}
+
+	/* add scrolled window */
+	gtk_container_add_with_properties (GTK_CONTAINER (tab_page), scroll,
+					   "expand", TRUE,
+					   "fill", TRUE,
+					   NULL);
+
+	/* free the store */
+	g_signal_connect (G_OBJECT (tab_page), "unrealize",
+			  G_CALLBACK (gpk_dialog_widget_unrealize_unref_cb), store);
+
+	return TRUE;
+}
+
+/**
+ * gpk_dialog_tabbed_download_size_widget:
+ **/
+gboolean
+gpk_dialog_tabbed_download_size_widget (GtkWidget *tab_page, const gchar *title, guint64 size)
+{
+	GtkWidget *label;
+	GtkWidget *hbox;
+	gchar *text = NULL;
+	gchar *size_str = NULL;
+
+	/* size is zero, don't show "0 bytes" */
+	if (size == 0) {
+		label = gtk_label_new (title);
+		gtk_container_add_with_properties (GTK_CONTAINER (tab_page), label,
+						   "expand", FALSE,
+						   "fill", FALSE,
+						   NULL);
+		goto out;
+	}
+
+	/* add a hbox with the size for deps screen */
+	size_str = g_format_size_for_display (size);
+	text = g_strdup_printf ("%s: %s", title, size_str);
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_container_add_with_properties (GTK_CONTAINER (tab_page), hbox,
+					   "expand", FALSE,
+					   "fill", FALSE,
+					   NULL);
+
+	/* add a label */
+	label = gtk_label_new (text);
+	gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_widget_show (hbox);
+out:
+	gtk_widget_show (label);
+	g_free (text);
+	g_free (size_str);
+	return TRUE;
+}
diff --git a/src/gpk-dialog.h b/src/gpk-dialog.h
index 233be22..3fd252b 100644
--- a/src/gpk-dialog.h
+++ b/src/gpk-dialog.h
@@ -38,6 +38,13 @@ gboolean	 gpk_dialog_embed_download_size_widget	(GtkDialog	*dialog,
 							 const gchar	*title,
 							 guint64	 size);
 gchar		*gpk_dialog_package_id_name_join_locale	(gchar		**package_ids);
+gboolean	 gpk_dialog_embed_tabbed_widget		(GtkDialog      *dialog,
+							 GtkNotebook	*tabbed_widget);
+gboolean	 gpk_dialog_tabbed_package_list_widget	(GtkWidget	*tab_page,
+							 GPtrArray	*array);
+gboolean	 gpk_dialog_tabbed_download_size_widget	(GtkWidget	*tab_page,
+							 const gchar	*title,
+							 guint64	 size);
 
 G_END_DECLS
 
diff --git a/src/gpk-task.c b/src/gpk-task.c
index 1fa7c66..41e513c 100644
--- a/src/gpk-task.c
+++ b/src/gpk-task.c
@@ -378,7 +378,10 @@ out:
  * gpk_task_add_dialog_deps_section:
  **/
 static void
-gpk_task_add_dialog_deps_section (PkTask *task, PkPackageSack *sack, PkInfoEnum info)
+gpk_task_add_dialog_deps_section (PkTask *task,
+				  GtkNotebook *tabbed_widget,
+				  PkPackageSack *sack,
+				  PkInfoEnum info)
 {
 	PkPackageSack *sack_tmp;
 	GPtrArray *array_tmp = NULL;
@@ -386,7 +389,8 @@ gpk_task_add_dialog_deps_section (PkTask *task, PkPackageSack *sack, PkInfoEnum
 	GError *error = NULL;
 	guint64 size;
 	const gchar *title;
-	GpkTaskPrivate *priv = GPK_TASK(task)->priv;
+	GtkWidget *tab_page;
+	GtkWidget *tab_label;
 
 	sack_tmp = pk_package_sack_filter_by_info (sack, info);
 	if (pk_package_sack_get_size (sack_tmp) == 0) {
@@ -394,32 +398,41 @@ gpk_task_add_dialog_deps_section (PkTask *task, PkPackageSack *sack, PkInfoEnum
 		goto out;
 	}
 
+	tab_page = gtk_vbox_new (FALSE, 6);
+	gtk_container_set_border_width (GTK_CONTAINER (tab_page), 12);
+
 	/* get the header */
 	switch (info) {
 	case PK_INFO_ENUM_INSTALLING:
 		/* TRANSLATORS: additional message text for the deps dialog */
 		title = _("The following software also needs to be installed");
+		tab_label = gtk_label_new (_("Install"));
 		break;
 	case PK_INFO_ENUM_REMOVING:
 	case PK_INFO_ENUM_OBSOLETING:
 		/* TRANSLATORS: additional message text for the deps dialog */
 		title = _("The following software also needs to be removed");
+		tab_label = gtk_label_new (_("Remove"));
 		break;
 	case PK_INFO_ENUM_UPDATING:
 		/* TRANSLATORS: additional message text for the deps dialog */
 		title = _("The following software also needs to be updated");
+		tab_label = gtk_label_new (_("Update"));
 		break;
 	case PK_INFO_ENUM_REINSTALLING:
 		/* TRANSLATORS: additional message text for the deps dialog */
 		title = _("The following software also needs to be re-installed");
+		tab_label = gtk_label_new (_("Reinstall"));
 		break;
 	case PK_INFO_ENUM_DOWNGRADING:
 		/* TRANSLATORS: additional message text for the deps dialog */
 		title = _("The following software also needs to be downgraded");
+		tab_label = gtk_label_new (_("Downgrade"));
 		break;
 	default:
 		/* TRANSLATORS: additional message text for the deps dialog (we don't know how it's going to be processed -- eeek) */
 		title = _("The following software also needs to be processed");
+		tab_label = gtk_label_new (_("Other"));
 		break;
 	}
 
@@ -433,8 +446,9 @@ gpk_task_add_dialog_deps_section (PkTask *task, PkPackageSack *sack, PkInfoEnum
 
 	/* embed title */
 	array_tmp = pk_package_sack_get_array (sack_tmp);
-	gpk_dialog_embed_download_size_widget (GTK_DIALOG(priv->current_window), title, size);
-	gpk_dialog_embed_package_list_widget (GTK_DIALOG(priv->current_window), array_tmp);
+	gpk_dialog_tabbed_download_size_widget (tab_page, title, size);
+	gpk_dialog_tabbed_package_list_widget (tab_page, array_tmp);
+	gtk_notebook_append_page (tabbed_widget, tab_page, tab_label);
 out:
 	if (array_tmp != NULL)
 		g_ptr_array_unref (array_tmp);
@@ -456,6 +470,7 @@ gpk_task_simulate_question (PkTask *task, guint request, PkResults *results)
 	guint inputs;
 	const gchar *title;
 	const gchar *message = NULL;
+	GtkNotebook *tabbed_widget = NULL;
 
 	/* save the current request */
 	priv->request = request;
@@ -513,25 +528,36 @@ gpk_task_simulate_question (PkTask *task, guint request, PkResults *results)
 	gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (priv->current_window), "%s", message);
 
 #if PK_CHECK_VERSION(0,6,2)
+	tabbed_widget = GTK_NOTEBOOK (gtk_notebook_new ());
+
 	/* get the details for all the packages */
 	sack = pk_results_get_package_sack (results);
 
-	gpk_task_add_dialog_deps_section (task, sack, PK_INFO_ENUM_INSTALLING);
+	gpk_task_add_dialog_deps_section (task, tabbed_widget, sack,
+					  PK_INFO_ENUM_INSTALLING);
 
 	/* TRANSLATORS: additional message text for the deps dialog */
-	gpk_task_add_dialog_deps_section (task, sack, PK_INFO_ENUM_REMOVING);
+	gpk_task_add_dialog_deps_section (task, tabbed_widget, sack,
+					  PK_INFO_ENUM_REMOVING);
 
 	/* TRANSLATORS: additional message text for the deps dialog */
-	gpk_task_add_dialog_deps_section (task, sack, PK_INFO_ENUM_UPDATING);
+	gpk_task_add_dialog_deps_section (task, tabbed_widget, sack,
+					  PK_INFO_ENUM_UPDATING);
 
 	/* TRANSLATORS: additional message text for the deps dialog */
-	gpk_task_add_dialog_deps_section (task, sack, PK_INFO_ENUM_OBSOLETING);
+	gpk_task_add_dialog_deps_section (task, tabbed_widget, sack,
+					  PK_INFO_ENUM_OBSOLETING);
 
 	/* TRANSLATORS: additional message text for the deps dialog */
-	gpk_task_add_dialog_deps_section (task, sack, PK_INFO_ENUM_REINSTALLING);
+	gpk_task_add_dialog_deps_section (task, tabbed_widget, sack,
+					  PK_INFO_ENUM_REINSTALLING);
 
 	/* TRANSLATORS: additional message text for the deps dialog */
-	gpk_task_add_dialog_deps_section (task, sack, PK_INFO_ENUM_DOWNGRADING);
+	gpk_task_add_dialog_deps_section (task, tabbed_widget, sack,
+					  PK_INFO_ENUM_DOWNGRADING);
+
+	gpk_dialog_embed_tabbed_widget (GTK_DIALOG(priv->current_window),
+					tabbed_widget);
 #else
 	/* get all the data */
 	array = pk_results_get_package_array (results);
openSUSE Build Service is sponsored by