From e806b5a2d4926c5d8095ca4737d4c5745d9a2b26 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Thu, 11 Nov 2010 17:01:27 +0000
Subject: [PATCH] Enable multiple sview select of BG blocks

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

diff --git a/src/sview/block_info.c b/src/sview/block_info.c
index bd0909c255b..f9c2f51c3d6 100644
--- a/src/sview/block_info.c
+++ b/src/sview/block_info.c
@@ -169,10 +169,13 @@ static display_data_t options_data_block[] = {
 
 static display_data_t *local_display_data = NULL;
 
-static int _in_slurm_partition(int *part_inx, int *block_inx);
+static void _admin_block(GtkTreeModel *model, GtkTreeIter *iter, char *type);
 static void _append_block_record(sview_block_info_t *block_ptr,
 				 GtkTreeStore *treestore, GtkTreeIter *iter,
 				 int line);
+static int _in_slurm_partition(int *part_inx, int *block_inx);
+static void _process_each_block(GtkTreeModel *model, GtkTreePath *path,
+				GtkTreeIter*iter, gpointer userdata);
 
 static void _block_list_del(void *object)
 {
@@ -1048,6 +1051,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),
@@ -1161,6 +1167,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,
@@ -1437,7 +1446,37 @@ extern void popup_all_block(GtkTreeModel *model, GtkTreeIter *iter, int id)
 	}
 }
 
-extern void admin_block(GtkTreeModel *model, GtkTreeIter *iter, char *type)
+static void _process_each_block(GtkTreeModel *model, GtkTreePath *path,
+				GtkTreeIter*iter, gpointer userdata)
+{
+	char *type = userdata;
+	if (_DEBUG)
+		g_print("process_each_block: global_multi_error = %d\n",
+			global_multi_error);
+
+	if (!global_multi_error) {
+		_admin_block(model, iter, type);
+	}
+}
+
+extern void select_admin_block(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_block, display_data->name);
+	}
+}
+
+static void _admin_block(GtkTreeModel *model, GtkTreeIter *iter, char *type)
 {
 	char *blockid = NULL;
 	GtkWidget *popup = gtk_dialog_new_with_buttons(
diff --git a/src/sview/common.c b/src/sview/common.c
index b3c12913601..3dc75e8486b 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -590,8 +590,7 @@ static void _selected_page(GtkMenuItem *menuitem, display_data_t *display_data)
 		each.pfunc = &popup_all_node;
 		break;
 	case BLOCK_PAGE:
-		popup_all_block(treedata->model, &treedata->iter,
-				display_data->id);
+		each.pfunc = &popup_all_block;
 		break;
 	case RESV_PAGE:
 		popup_all_resv(treedata->model, &treedata->iter,
@@ -610,8 +609,8 @@ static void _selected_page(GtkMenuItem *menuitem, display_data_t *display_data)
 						treedata->treeview);
 			break;
 		case BLOCK_PAGE:
-			admin_block(treedata->model, &treedata->iter,
-				    display_data->name);
+			select_admin_block(treedata->model, &treedata->iter,
+					   display_data, treedata->treeview);
 			break;
 		case RESV_PAGE:
 			admin_resv(treedata->model, &treedata->iter,
diff --git a/src/sview/sview.h b/src/sview/sview.h
index e76d84f2200..b252e152ee8 100644
--- a/src/sview/sview.h
+++ b/src/sview/sview.h
@@ -452,7 +452,9 @@ extern void get_info_block(GtkTable *table, display_data_t *display_data);
 extern void specific_info_block(popup_info_t *popup_win);
 extern void set_menus_block(void *arg, void *arg2, GtkTreePath *path, int type);
 extern void popup_all_block(GtkTreeModel *model, GtkTreeIter *iter, int id);
-extern void admin_block(GtkTreeModel *model, GtkTreeIter *iter, char *type);
+extern void select_admin_block(GtkTreeModel *model, GtkTreeIter *iter,
+			       display_data_t *display_data,
+			       GtkTreeView *treeview);
 extern void cluster_change_block();
 
 // job_info.c
-- 
GitLab