From a4f75cc77d0580a3f2b27a74278bf2597a3ec2b5 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Fri, 29 Sep 2006 18:46:02 +0000
Subject: [PATCH] tooltips for the grid

---
 src/sview/common.c    |  3 ++
 src/sview/grid.c      | 66 +++++++++++++++++++++++++++++++---
 src/sview/node_info.c | 82 ++++++++++++++++++++-----------------------
 src/sview/sview.h     | 15 ++++++--
 4 files changed, 114 insertions(+), 52 deletions(-)

diff --git a/src/sview/common.c b/src/sview/common.c
index de064c42f70..132adf85f88 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -642,6 +642,9 @@ extern popup_info_t *create_popup_info(int type, int dest_type, char *title)
 			   popup_win->event_box, FALSE, FALSE, 0);
 
 	window = create_scrolled_window();
+	gtk_scrolled_window_set_policy(window,
+				       GTK_POLICY_NEVER,
+				       GTK_POLICY_AUTOMATIC);
 	bin = GTK_BIN(&window->container);
 	view = GTK_VIEWPORT(bin->child);
 	bin = GTK_BIN(&view->bin);
diff --git a/src/sview/grid.c b/src/sview/grid.c
index e414af3670a..8b1aec95d52 100644
--- a/src/sview/grid.c
+++ b/src/sview/grid.c
@@ -132,6 +132,10 @@ void _put_button_as_down(grid_button_t *grid_button)
 	gtk_widget_destroy(grid_button->button);		
 				
 	grid_button->button = gtk_event_box_new();
+	gtk_tooltips_set_tip(grid_button->tip,
+			     grid_button->button,
+			     grid_button->node_name,
+			     "click for node stats");
 	gtk_widget_set_size_request(grid_button->button, 10, 10);
 	gtk_event_box_set_above_child(GTK_EVENT_BOX(grid_button->button),
 				      FALSE);
@@ -167,6 +171,10 @@ void _put_button_as_up(grid_button_t *grid_button)
 	gtk_widget_destroy(grid_button->button);		
 	grid_button->button = gtk_button_new();
 	gtk_widget_set_size_request(grid_button->button, 10, 10);
+	gtk_tooltips_set_tip(grid_button->tip,
+			     grid_button->button,
+			     grid_button->node_name,
+			     "click for node stats");
 	g_signal_connect(G_OBJECT(grid_button->button), 
 			 "button-press-event",
 			 G_CALLBACK(_open_node),
@@ -188,6 +196,7 @@ extern void destroy_grid_button(void *arg)
 			gtk_widget_destroy(grid_button->button);
 			grid_button->button = NULL;
 		}
+		xfree(grid_button->node_name);
 		xfree(grid_button);
 	}
 }
@@ -260,7 +269,6 @@ extern void get_button_list_from_main(List *button_list, int start, int end,
 		*button_list = list_create(NULL);
 	
 	color_inx %= sview_colors_cnt;
-	gdk_color_parse(sview_colors[color_inx], &color);
 	
 	itr = list_iterator_create(grid_button_list);
 	while((grid_button = list_next(itr))) {
@@ -300,14 +308,22 @@ extern void get_button_list_from_main(List *button_list, int start, int end,
 			
 		} else {
 			send_grid_button->button = gtk_button_new();
+			gdk_color_parse(sview_colors[color_inx], &color);
 			gtk_widget_modify_bg(send_grid_button->button, 
 					     GTK_STATE_NORMAL, &color);
 		}
 		gtk_widget_set_size_request(send_grid_button->button, 10, 10);
+		send_grid_button->tip = gtk_tooltips_new();
+		send_grid_button->node_name = xstrdup(grid_button->node_name);
+				
 		g_signal_connect(G_OBJECT(send_grid_button->button),
 				 "button-press-event",
 				 G_CALLBACK(_open_node),
 				 send_grid_button);
+		gtk_tooltips_set_tip(send_grid_button->tip,
+				     send_grid_button->button,
+				     send_grid_button->node_name,
+				     "click for node stats");
 		grid_button->color = sview_colors[color_inx];
 		
 		list_append(*button_list, send_grid_button);
@@ -419,12 +435,14 @@ extern int get_system_stats()
 {
 	int error_code = SLURM_SUCCESS;
 	node_info_msg_t *node_info_ptr = NULL;
-	
+	List node_list = NULL;
+	int changed = 1;
 #ifdef HAVE_BG
 	int y=0, z=0;
 #endif
 	if((error_code = get_new_info_node(&node_info_ptr, force_refresh))
 	   == SLURM_NO_CHANGE_IN_DATA) { 
+		changed = 0;
 		goto update_it;
 	} 
 	if (error_code != SLURM_SUCCESS) {
@@ -436,19 +454,29 @@ update_it:
 	if(grid_button_list)
 		return SLURM_SUCCESS;
 	grid_button_list = list_create(destroy_grid_button);
-	setup_grid_table(main_grid_table, grid_button_list, DIM_SIZE[X]);
+	node_list = create_node_info_list(node_info_ptr, changed);
+	setup_grid_table(main_grid_table, grid_button_list, node_list);
 
 	return SLURM_SUCCESS;
 }
 
-extern int setup_grid_table(GtkTable *table, List button_list, int node_count)
+extern int setup_grid_table(GtkTable *table, List button_list, List node_list)
 {
 	int error_code = SLURM_SUCCESS;
 	int x=0, table_x=0, table_y=0;
 	int coord_x=0, coord_y=0, i=0;
 	grid_button_t *grid_button = NULL;
+	int node_count = 0;
+	ListIterator itr = NULL;
+	sview_node_info_t *sview_node_info_ptr = NULL;
 
+	if(!node_list) {
+		g_print("setup_grid_table: no node_list given\n");
+		return SLURM_ERROR;
+	}
+	
 #ifndef HAVE_BG
+	node_count = list_count(node_list);
 	if(node_count < 50) {
 		table_x = 1;
 	} else if(node_count < 500) {
@@ -466,7 +494,7 @@ extern int setup_grid_table(GtkTable *table, List button_list, int node_count)
 #endif
 
 	gtk_table_resize(table, table_y, table_x);
-	
+	itr = list_iterator_create(node_list);
 	for (x=0; x<node_count; x++) {
 #ifdef HAVE_BG
 		for (y=0; y<DIM_SIZE[Y]; y++) {
@@ -480,6 +508,19 @@ extern int setup_grid_table(GtkTable *table, List button_list, int node_count)
 				grid_button->table_x = coord_x;
 				grid_button->table_y = coord_y;
 				grid_button->button = gtk_button_new();
+				grid_button->tip = gtk_tooltips_new();
+				if(!(sview_node_info_ptr = list_next(itr))) {
+					g_print("no node for this "
+						"inx %d!!!!\n",
+						grid_button->inx);
+					goto end_it;
+				}
+				grid_button->node_name = xstrdup(
+					sview_node_info_ptr->node_ptr->name);
+				gtk_tooltips_set_tip(grid_button->tip,
+						     grid_button->button,
+						     grid_button->node_name,
+						     "click for node stats");
 				gtk_widget_set_size_request(
 					grid_button->button, 10, 10);
 				g_signal_connect(G_OBJECT(grid_button->button),
@@ -527,6 +568,19 @@ extern int setup_grid_table(GtkTable *table, List button_list, int node_count)
 		grid_button->table_y = coord_y;
 		
 		grid_button->button = gtk_button_new();
+		grid_button->tip = gtk_tooltips_new();
+		if(!(sview_node_info_ptr = list_next(itr))) {
+			g_print("no node for this "
+				"inx %d!!!!\n",
+				grid_button->inx);
+			goto end_it;
+		}
+		grid_button->node_name = xstrdup(
+			sview_node_info_ptr->node_ptr->name);
+		gtk_tooltips_set_tip(grid_button->tip,
+				     grid_button->button,
+				     grid_button->node_name,
+				     "click for node stats");
 		gtk_widget_set_size_request(grid_button->button, 10, 10);
 		g_signal_connect(G_OBJECT(grid_button->button), 
 				 "button-press-event",
@@ -561,6 +615,8 @@ extern int setup_grid_table(GtkTable *table, List button_list, int node_count)
 	
 #endif
 	}
+end_it:
+	list_iterator_destroy(itr);
 	list_sort(button_list, (ListCmpF) _sort_button_inx);
 
 	return error_code;
diff --git a/src/sview/node_info.c b/src/sview/node_info.c
index 45688ecd406..a8cd7224ce0 100644
--- a/src/sview/node_info.c
+++ b/src/sview/node_info.c
@@ -31,11 +31,6 @@
 #define _DEBUG 0
 DEF_TIMERS;
 
-typedef struct {
-	node_info_t *node_ptr;
-	char *color;
-} sview_node_info_t;
-
 enum { 
 	SORTID_POS = POS_LOC,
 	SORTID_NAME, 
@@ -256,43 +251,6 @@ static void _node_info_list_del(void *object)
 	}
 }
 
-
-static List _create_node_info_list(node_info_msg_t *node_info_ptr,
-				   int changed)
-{
-	static List info_list = NULL;
-	int i = 0;
-	sview_node_info_t *sview_node_info_ptr = NULL;
-	node_info_t *node_ptr = NULL;
-	
-	if(!changed && info_list) {
-		goto update_color;
-	}
-	
-	if(info_list) {
-		list_destroy(info_list);
-	}
-
-	info_list = list_create(_node_info_list_del);
-	if (!info_list) {
-		g_print("malloc error\n");
-		return NULL;
-	}
-	
-	for (i=0; i<node_info_ptr->record_count; i++) {
-		node_ptr = &(node_info_ptr->node_array[i]);
-		if (!node_ptr->name || (node_ptr->name[0] == '\0'))
-			continue;	/* bad node */
-	
-		sview_node_info_ptr = xmalloc(sizeof(sview_node_info_t));
-		list_append(info_list, sview_node_info_ptr);
-		sview_node_info_ptr->node_ptr = node_ptr;		
-	}
-update_color:
-	
-	return info_list;
-}
-
 void _display_info_node(List info_list,	popup_info_t *popup_win)
 {
 	specific_info_t *spec_info = popup_win->spec_info;
@@ -372,6 +330,42 @@ extern void refresh_node(GtkAction *action, gpointer user_data)
 	specific_info_node(popup_win);
 }
 
+/* don't destroy the list from this function */
+extern List create_node_info_list(node_info_msg_t *node_info_ptr, int changed)
+{
+	static List info_list = NULL;
+	int i = 0;
+	sview_node_info_t *sview_node_info_ptr = NULL;
+	node_info_t *node_ptr = NULL;
+	
+	if(!changed && info_list) {
+		goto update_color;
+	}
+	
+	if(info_list) {
+		list_destroy(info_list);
+	}
+
+	info_list = list_create(_node_info_list_del);
+	if (!info_list) {
+		g_print("malloc error\n");
+		return NULL;
+	}
+	
+	for (i=0; i<node_info_ptr->record_count; i++) {
+		node_ptr = &(node_info_ptr->node_array[i]);
+		if (!node_ptr->name || (node_ptr->name[0] == '\0'))
+			continue;	/* bad node */
+	
+		sview_node_info_ptr = xmalloc(sizeof(sview_node_info_t));
+		list_append(info_list, sview_node_info_ptr);
+		sview_node_info_ptr->node_ptr = node_ptr;		
+	}
+update_color:
+	
+	return info_list;
+}
+
 extern int get_new_info_node(node_info_msg_t **info_ptr, int force)
 {
 	static node_info_msg_t *node_info_ptr = NULL, *new_node_ptr = NULL;
@@ -571,7 +565,7 @@ extern void get_info_node(GtkTable *table, display_data_t *display_data)
 		goto end_it;
 	}
 display_it:
-	info_list = _create_node_info_list(node_info_ptr, changed);
+	info_list = create_node_info_list(node_info_ptr, changed);
 
 	if(!info_list)
 		return;
@@ -662,7 +656,7 @@ extern void specific_info_node(popup_info_t *popup_win)
 		return;
 	}
 display_it:	
-	info_list = _create_node_info_list(node_info_ptr, changed);
+	info_list = create_node_info_list(node_info_ptr, changed);
 
 	if(!info_list)
 		return;
diff --git a/src/sview/sview.h b/src/sview/sview.h
index 4dc3335a5ca..cefff694b95 100644
--- a/src/sview/sview.h
+++ b/src/sview/sview.h
@@ -177,15 +177,22 @@ typedef struct {
 
 typedef struct {
 	GtkWidget *button;
+	GtkTooltips *tip;
 	GtkTable *table;
-	int coord[BA_SYSTEM_DIMENSIONS];
+	char *node_name;
+	char *color;
 	int inx;
 	int state;
-	char *color;
 	int table_x;
 	int table_y;
+	int coord[BA_SYSTEM_DIMENSIONS];
 } grid_button_t;
 
+typedef struct {
+	node_info_t *node_ptr;
+	char *color;
+} sview_node_info_t;
+
 extern sview_parameters_t params;
 extern int text_line_cnt;
 
@@ -234,7 +241,7 @@ extern void get_button_list_from_main(List *button_list, int start, int end,
 				      int color_inx);
 extern void put_buttons_in_table(GtkTable *table, List button_list);
 extern int get_system_stats();
-extern int setup_grid_table(GtkTable *table, List button_list, int node_count);
+extern int setup_grid_table(GtkTable *table, List button_list, List node_list);
 extern void sview_init_grid();
 extern void sview_reset_grid();
 
@@ -285,6 +292,8 @@ extern void popup_all_job(GtkTreeModel *model, GtkTreeIter *iter, int id);
 
 // node_info.c
 extern void refresh_node(GtkAction *action, gpointer user_data);
+/* don't destroy the list from this function */
+extern List create_node_info_list(node_info_msg_t *node_info_ptr, int changed);
 extern int update_state_node(GtkTreeStore *treestore, GtkTreeIter *iter, 
 			     int text_column, int num_column,
 			     const char *new_text,
-- 
GitLab