From 944c033b1f90091e291644dac920d41022b7dd3c Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Thu, 11 Nov 2010 17:14:08 +0000
Subject: [PATCH] get sview working with selection of multiple reservations

---
 src/sview/common.c    |  7 +++----
 src/sview/resv_info.c | 47 +++++++++++++++++++++++++++++++++++++++----
 src/sview/sview.h     |  4 +++-
 3 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/src/sview/common.c b/src/sview/common.c
index 3dc75e8486b..d36447dac98 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -593,8 +593,7 @@ static void _selected_page(GtkMenuItem *menuitem, display_data_t *display_data)
 		each.pfunc = &popup_all_block;
 		break;
 	case RESV_PAGE:
-		popup_all_resv(treedata->model, &treedata->iter,
-			       display_data->id);
+		each.pfunc = &popup_all_resv;
 		break;
 	case ADMIN_PAGE:
 		switch(display_data->id) {
@@ -613,8 +612,8 @@ static void _selected_page(GtkMenuItem *menuitem, display_data_t *display_data)
 					   display_data, treedata->treeview);
 			break;
 		case RESV_PAGE:
-			admin_resv(treedata->model, &treedata->iter,
-				   display_data->name);
+			select_admin_resv(treedata->model, &treedata->iter,
+					  display_data, treedata->treeview);
 			break;
 		case NODE_PAGE:
 			select_admin_nodes(treedata->model, &treedata->iter,
diff --git a/src/sview/resv_info.c b/src/sview/resv_info.c
index b8b05317673..0133bb1a1c5 100644
--- a/src/sview/resv_info.c
+++ b/src/sview/resv_info.c
@@ -141,6 +141,10 @@ static display_data_t *local_display_data = NULL;
 
 static char *got_edit_signal = NULL;
 
+static void _admin_resv(GtkTreeModel *model, GtkTreeIter *iter, char *type);
+static void _process_each_resv(GtkTreeModel *model, GtkTreePath *path,
+			       GtkTreeIter*iter, gpointer userdata);
+
 /*
  *  _parse_flags  is used to parse the Flags= option.  It handles
  *  daily, weekly, and maint, optionally preceded by + or -,
@@ -904,7 +908,7 @@ extern void admin_edit_resv(GtkCellRendererText *cell,
 	if(got_edit_signal) {
 		temp = got_edit_signal;
 		got_edit_signal = NULL;
-		admin_resv(GTK_TREE_MODEL(treestore), &iter, temp);
+		_admin_resv(GTK_TREE_MODEL(treestore), &iter, temp);
 		xfree(temp);
 		goto no_input;
 	}
@@ -1057,7 +1061,9 @@ display_it:
 	if(!display_widget) {
 		tree_view = create_treeview(local_display_data,
 					    &grid_button_list);
-
+		gtk_tree_selection_set_mode(
+			gtk_tree_view_get_selection(tree_view),
+			GTK_SELECTION_MULTIPLE);
 		display_widget = gtk_widget_ref(GTK_WIDGET(tree_view));
 		gtk_table_attach_defaults(table,
 					  GTK_WIDGET(tree_view),
@@ -1145,6 +1151,9 @@ display_it:
 	if(spec_info->type != INFO_PAGE && !spec_info->display_widget) {
 		tree_view = create_treeview(local_display_data,
 					    &popup_win->grid_button_list);
+		gtk_tree_selection_set_mode(
+			gtk_tree_view_get_selection(tree_view),
+			GTK_SELECTION_MULTIPLE);
 		spec_info->display_widget =
 			gtk_widget_ref(GTK_WIDGET(tree_view));
 		gtk_table_attach_defaults(popup_win->table,
@@ -1371,7 +1380,37 @@ extern void popup_all_resv(GtkTreeModel *model, GtkTreeIter *iter, int id)
 	}
 }
 
-extern void admin_resv(GtkTreeModel *model, GtkTreeIter *iter, char *type)
+static void _process_each_resv(GtkTreeModel *model, GtkTreePath *path,
+			       GtkTreeIter*iter, gpointer userdata)
+{
+	char *type = userdata;
+	if (_DEBUG)
+		g_print("process_each_resv: global_multi_error = %d\n",
+			global_multi_error);
+
+	if (!global_multi_error) {
+		_admin_resv(model, iter, type);
+	}
+}
+
+extern void select_admin_resv(GtkTreeModel *model, GtkTreeIter *iter,
+			      display_data_t *display_data,
+			      GtkTreeView *treeview)
+{
+	if (treeview) {
+		if (display_data->extra & EXTRA_NODES) {
+			select_admin_nodes(model, iter, display_data,
+					   SORTID_NODELIST, treeview);
+			return;
+		}
+		global_multi_error = FALSE;
+		gtk_tree_selection_selected_foreach(
+			gtk_tree_view_get_selection(treeview),
+			_process_each_resv, display_data->name);
+	}
+}
+
+static void _admin_resv(GtkTreeModel *model, GtkTreeIter *iter, char *type)
 {
 	resv_desc_msg_t *resv_msg = xmalloc(sizeof(resv_desc_msg_t));
 	reservation_name_msg_t resv_name_msg;
@@ -1483,7 +1522,7 @@ end_it:
 	if(got_edit_signal) {
 		type = got_edit_signal;
 		got_edit_signal = NULL;
-		admin_resv(model, iter, type);
+		_admin_resv(model, iter, type);
 		xfree(type);
 	}
 	return;
diff --git a/src/sview/sview.h b/src/sview/sview.h
index b252e152ee8..fcaf0553995 100644
--- a/src/sview/sview.h
+++ b/src/sview/sview.h
@@ -515,7 +515,9 @@ extern void get_info_resv(GtkTable *table, display_data_t *display_data);
 extern void specific_info_resv(popup_info_t *popup_win);
 extern void set_menus_resv(void *arg, void *arg2, GtkTreePath *path, int type);
 extern void popup_all_resv(GtkTreeModel *model, GtkTreeIter *iter, int id);
-extern void admin_resv(GtkTreeModel *model, GtkTreeIter *iter, char *type);
+extern void select_admin_resv(GtkTreeModel *model, GtkTreeIter *iter,
+			      display_data_t *display_data,
+			      GtkTreeView *treeview);
 extern void cluster_change_resv();
 
 
-- 
GitLab