From babe69f0738a9eb02569fba70d6621df80be9371 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Wed, 30 Aug 2006 19:15:49 +0000
Subject: [PATCH] more fields are editable now.

---
 src/sview/common.c    |  58 +++++++++++++----------
 src/sview/node_info.c |   2 +-
 src/sview/part_info.c | 105 ++++++++++++++++++++++++++++++++----------
 src/sview/sview.c     |  15 +++---
 4 files changed, 123 insertions(+), 57 deletions(-)

diff --git a/src/sview/common.c b/src/sview/common.c
index fd7864a4463..01f7c60375f 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -117,14 +117,15 @@ static void _editing_canceled(GtkCellRenderer *cell,
 			       gpointer         data)
 {
 	g_static_mutex_unlock(&sview_mutex);
-
 }
 
-static void *_editing_thr(void *arg)
+static void *_editing_thr(gpointer arg)
 {
+	int msg_id = GPOINTER_TO_INT(arg);
 	sleep(5);
 	gdk_threads_enter();
-	gtk_statusbar_pop(GTK_STATUSBAR(main_statusbar), STATUS_ADMIN_EDIT);
+	gtk_statusbar_remove(GTK_STATUSBAR(main_statusbar), 
+			     STATUS_ADMIN_EDIT, msg_id);
 	gdk_flush();
 	gdk_threads_leave();
 	return NULL;	
@@ -135,29 +136,35 @@ static void _add_col_to_treeview(GtkTreeView *tree_view,
 				 display_data_t *display_data)
 {
 	GtkTreeViewColumn *col = gtk_tree_view_column_new();
-	GtkCellRenderer *renderer = gtk_cell_renderer_combo_new();
 	GtkListStore *model = (display_data->create_model)(display_data->id);
-		
-	if(model) {
+	GtkCellRenderer *renderer = NULL;
+	if(model && display_data->extra != -1) {
+		renderer = gtk_cell_renderer_combo_new();
 		g_object_set(renderer,
 			     "model", model,
 			     "text-column", 0,
-			     "has-entry", FALSE,
+			     "has-entry", display_data->extra,
 			     "editable", TRUE,
 			     NULL);
-
-		g_signal_connect(renderer, "editing-started",
-				 G_CALLBACK(_editing_started), NULL);
-		g_signal_connect(renderer, "editing-canceled",
-				 G_CALLBACK(_editing_canceled), NULL);
-  		g_signal_connect(renderer, "edited",
-				 G_CALLBACK(display_data->admin_edit), 
-				 gtk_tree_view_get_model(tree_view));
-		
-		g_object_set_data(G_OBJECT(renderer), "column", 
-				  GINT_TO_POINTER(display_data->id));
-	}
-
+	} else if(display_data->extra == 1) {
+		renderer = gtk_cell_renderer_text_new();
+		g_object_set(renderer,
+			     "editable", TRUE,
+			     NULL);
+	} else
+		renderer = gtk_cell_renderer_combo_new();
+	
+	g_signal_connect(renderer, "editing-started",
+			 G_CALLBACK(_editing_started), NULL);
+	g_signal_connect(renderer, "editing-canceled",
+			 G_CALLBACK(_editing_canceled), NULL);
+	
+	g_signal_connect(renderer, "edited",
+			 G_CALLBACK(display_data->admin_edit), 
+			 gtk_tree_view_get_model(tree_view));
+	g_object_set_data(G_OBJECT(renderer), "column", 
+			  GINT_TO_POINTER(display_data->id));
+	
 	gtk_tree_view_column_pack_start(col, renderer, TRUE);
 	gtk_tree_view_column_add_attribute(col, renderer, 
 					   "text", display_data->id);
@@ -876,12 +883,13 @@ extern char *get_reason()
 extern void display_edit_note(char *edit_note)
 {
 	GError *error = NULL;
-	
+	int msg_id = 0;
 	gtk_statusbar_pop(GTK_STATUSBAR(main_statusbar), STATUS_ADMIN_EDIT);
-	gtk_statusbar_push(GTK_STATUSBAR(main_statusbar), STATUS_ADMIN_EDIT,
-			   edit_note);
-		
-	if (!g_thread_create(_editing_thr, NULL, FALSE, &error))
+	msg_id = gtk_statusbar_push(GTK_STATUSBAR(main_statusbar), 
+				    STATUS_ADMIN_EDIT,
+				    edit_note);
+	if (!g_thread_create(_editing_thr, GINT_TO_POINTER(msg_id),
+			     FALSE, &error))
 	{
 		g_printerr ("Failed to create edit thread: %s\n",
 			    error->message);
diff --git a/src/sview/node_info.c b/src/sview/node_info.c
index e8fe99a5cae..463e21c7bb1 100644
--- a/src/sview/node_info.c
+++ b/src/sview/node_info.c
@@ -51,7 +51,7 @@ static display_data_t display_data_node[] = {
 	 create_model_node, admin_edit_node},
 	{G_TYPE_STRING, SORTID_NAME, "Name", TRUE, -1, refresh_node,
 	 create_model_node, admin_edit_node},
-	{G_TYPE_STRING, SORTID_STATE, "State", TRUE, -1, refresh_node,
+	{G_TYPE_STRING, SORTID_STATE, "State", TRUE, 0, refresh_node,
 	 create_model_node, admin_edit_node},
 	{G_TYPE_INT, SORTID_STATE_NUM, NULL, FALSE, -1, refresh_node,
 	 create_model_node, admin_edit_node},
diff --git a/src/sview/part_info.c b/src/sview/part_info.c
index 37f46558423..d8f8d35b55e 100644
--- a/src/sview/part_info.c
+++ b/src/sview/part_info.c
@@ -88,28 +88,28 @@ enum {
 
 static display_data_t display_data_part[] = {
 	{G_TYPE_INT, SORTID_POS, NULL, FALSE, -1, refresh_part},
-	{G_TYPE_STRING, SORTID_NAME, "Partition", TRUE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_NAME, "Partition", TRUE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_DEFAULT, "Default", TRUE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_DEFAULT, "Default", TRUE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_HIDDEN, "Hidden", FALSE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_HIDDEN, "Hidden", FALSE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_AVAIL, "Availablity", TRUE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_AVAIL, "Availablity", TRUE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
 	{G_TYPE_STRING, SORTID_TIMELIMIT, "Time Limit", 
-	 TRUE, -1, refresh_part,
+	 TRUE, 1, refresh_part,
 	 create_model_part, admin_edit_part},
 	{G_TYPE_STRING, SORTID_JOB_SIZE, "Job Size", FALSE, -1, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_INT, SORTID_MIN_NODES, "Min Nodes", FALSE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_MIN_NODES, "Min Nodes", FALSE, 1, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_INT, SORTID_MAX_NODES, "Max Nodes", FALSE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_MAX_NODES, "Max Nodes", FALSE, 1, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_ROOT, "Root", FALSE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_ROOT, "Root", FALSE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_SHARE, "Share", FALSE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_SHARE, "Share", FALSE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_GROUPS, "Groups", FALSE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_GROUPS, "Groups", FALSE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
 	{G_TYPE_STRING, SORTID_NODES, "Nodes", TRUE, -1, refresh_part,
 	 create_model_part, admin_edit_part},
@@ -119,15 +119,15 @@ static display_data_t display_data_part[] = {
 	 create_model_part, admin_edit_part},
 	{G_TYPE_STRING, SORTID_MEM, "MEM", FALSE, -1, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_STATE, "State", TRUE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_STATE, "State", TRUE, 0, refresh_part,
 	 create_model_part, admin_edit_part},
-	{G_TYPE_STRING, SORTID_WEIGHT, "Weight", TRUE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_WEIGHT, "Weight", FALSE, -1, refresh_part,
 	 create_model_part, admin_edit_part},
 #ifdef HAVE_BG
-	{G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE, 1, refresh_part,
 	 create_model_part, admin_edit_part},
 #else
-	{G_TYPE_STRING, SORTID_NODELIST, "NodeList", TRUE, -1, refresh_part,
+	{G_TYPE_STRING, SORTID_NODELIST, "NodeList", TRUE, 1, refresh_part,
 	 create_model_part, admin_edit_part},
 #endif
 	{G_TYPE_INT, SORTID_STATE_NUM, NULL, FALSE, -1, refresh_part,
@@ -303,10 +303,23 @@ static void _update_part_record(sview_part_info_t *sview_part_info,
 			      part_ptr->min_nodes, 
 			      part_ptr->max_nodes, true);
 	gtk_tree_store_set(treestore, iter, SORTID_JOB_SIZE, time_buf, -1);
+	
+	if (part_ptr->min_nodes == INFINITE)
+		snprintf(time_buf, sizeof(time_buf), "infinite");
+	else {
+		convert_num_unit((float)part_ptr->min_nodes, 
+				 time_buf, UNIT_NONE);
+	}
 	gtk_tree_store_set(treestore, iter, SORTID_MIN_NODES, 
-			   part_ptr->min_nodes, -1);
+			   time_buf, -1);
+	if (part_ptr->max_nodes == INFINITE)
+		snprintf(time_buf, sizeof(time_buf), "infinite");
+	else {
+		convert_num_unit((float)part_ptr->max_nodes, 
+				 time_buf, UNIT_NONE);
+	}
 	gtk_tree_store_set(treestore, iter, SORTID_MAX_NODES, 
-			   part_ptr->max_nodes, -1);
+			   time_buf, -1);
 
 	if(part_ptr->root_only)
 		gtk_tree_store_set(treestore, iter, SORTID_ROOT, "yes", -1);
@@ -388,10 +401,20 @@ static void _update_part_sub_record(sview_part_sub_t *sview_part_sub,
 			      part_ptr->min_nodes, 
 			      part_ptr->max_nodes, true);
 	gtk_tree_store_set(treestore, iter, SORTID_JOB_SIZE, time_buf, -1);
+
+	convert_num_unit((float)part_ptr->min_nodes, 
+			 time_buf, UNIT_NONE);
+
 	gtk_tree_store_set(treestore, iter, SORTID_MIN_NODES, 
-			   part_ptr->min_nodes, -1);
+			   time_buf, -1);
+	if (part_ptr->max_nodes == INFINITE)
+		snprintf(time_buf, sizeof(time_buf), "infinite");
+	else {
+		convert_num_unit((float)part_ptr->max_nodes, 
+				 time_buf, UNIT_NONE);
+	}
 	gtk_tree_store_set(treestore, iter, SORTID_MAX_NODES, 
-			   part_ptr->max_nodes, -1);
+			   time_buf, -1);
 	
 	_build_min_max_string(time_buf, sizeof(time_buf), 
 			      sview_part_sub->min_cpus, 
@@ -947,6 +970,7 @@ extern GtkListStore *create_model_part(int type)
 				   -1);	
 
 		break;
+	case SORTID_TIMELIMIT:
 	case SORTID_MIN_NODES:
 		break;
 	case SORTID_MAX_NODES:
@@ -1037,6 +1061,10 @@ extern void admin_edit_part(GtkCellRendererText *cell,
 	char *type = NULL;
 	int column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), 
 						       "column"));
+	
+	if(!new_text || !strcmp(new_text, ""))
+		goto no_input;
+
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), &iter, path);
 
 	if(column != SORTID_STATE) {
@@ -1067,14 +1095,26 @@ extern void admin_edit_part(GtkCellRendererText *cell,
 		}
 		type = "hidden";
 		break;
-	case SORTID_MIN_NODES:
-		if (!strcasecmp(new_text, "infinite")) {
-			part_msg.min_nodes = INFINITE;
-		} else {
-			part_msg.min_nodes = 
+	case SORTID_TIMELIMIT:
+		if ((strcasecmp(new_text,"infinite") == 0))
+			part_msg.max_time = INFINITE;
+		else
+			part_msg.max_time = 
 				(uint32_t)strtol(new_text, (char **)NULL, 10);
-		}
+		temp = (char *)new_text;
+		type = "timelimit";
+		if((int32_t)part_msg.max_time <= 0
+		   && part_msg.max_time != INFINITE)
+			goto print_error;
+		break;
+	case SORTID_MIN_NODES:
+		part_msg.min_nodes = 
+			(uint32_t)strtol(new_text, (char **)NULL, 10);
+		
+		temp = (char *)new_text;
 		type = "min_nodes";
+		if((int32_t)part_msg.max_time <= 0)
+			goto print_error;
 		break;
 	case SORTID_MAX_NODES:
 		if (!strcasecmp(new_text, "infinite")) {
@@ -1083,7 +1123,11 @@ extern void admin_edit_part(GtkCellRendererText *cell,
 			part_msg.max_nodes = 
 				(uint32_t)strtol(new_text, (char **)NULL, 10);
 		}
+		temp = (char *)new_text;
 		type = "max_nodes";
+		if((int32_t)part_msg.max_time <= 0 
+		   && part_msg.max_nodes != INFINITE)
+			goto print_error;
 		break;
 	case SORTID_ROOT:
 		if (!strcasecmp(new_text, "yes")) {
@@ -1108,6 +1152,8 @@ extern void admin_edit_part(GtkCellRendererText *cell,
 		type = "groups";
 		break;
 	case SORTID_NODELIST:
+		temp = (char *)new_text;
+		part_msg.nodes = temp;
 		type = "nodelist";
 		break;
 	case SORTID_AVAIL:
@@ -1142,11 +1188,20 @@ extern void admin_edit_part(GtkCellRendererText *cell,
 					       new_text);
 			display_edit_note(temp);
 			g_free(temp);
+		} else {
+		print_error:
+			temp = g_strdup_printf("Partition %s %s can't be "
+					       "set to %s",
+					       part_msg.name,
+					       type,
+					       new_text);
+			display_edit_note(temp);
+			g_free(temp);
 		}
 		g_free(part_msg.name);
 		
 	}
-
+no_input:
 	gtk_tree_path_free (path);
 	
 	g_static_mutex_unlock(&sview_mutex);
diff --git a/src/sview/sview.c b/src/sview/sview.c
index 009ceb1409c..c436c5774e8 100644
--- a/src/sview/sview.c
+++ b/src/sview/sview.c
@@ -110,11 +110,13 @@ void *_page_thr(void *arg)
 	return NULL;
 }
 
-void *_refresh_thr(void *arg)
+void *_refresh_thr(gpointer arg)
 {
+	int msg_id = GPOINTER_TO_INT(arg);
 	sleep(5);
 	gdk_threads_enter();
-	gtk_statusbar_pop(GTK_STATUSBAR(main_statusbar), STATUS_REFRESH);
+	gtk_statusbar_remove(GTK_STATUSBAR(main_statusbar), 
+			     STATUS_REFRESH, msg_id);
 	gdk_flush();
 	gdk_threads_leave();
 	return NULL;	
@@ -238,11 +240,12 @@ static void _change_refresh(GtkToggleAction *action, gpointer user_data)
 				       global_sleep_time);
 		gtk_statusbar_pop(GTK_STATUSBAR(main_statusbar), 
 				  STATUS_REFRESH);
-		gtk_statusbar_push(GTK_STATUSBAR(main_statusbar), 
-				   STATUS_REFRESH,
-				   temp);
+		response = gtk_statusbar_push(GTK_STATUSBAR(main_statusbar), 
+					      STATUS_REFRESH,
+					      temp);
 		g_free(temp);
-		if (!g_thread_create(_refresh_thr, NULL, FALSE, &error))
+		if (!g_thread_create(_refresh_thr, GINT_TO_POINTER(response),
+				     FALSE, &error))
 		{
 			g_printerr ("Failed to create refresh thread: %s\n", 
 				    error->message);
-- 
GitLab