1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
3 * gprof-call-graph-view.c
4 * Copyright (C) James Liggett 2006 <jrliggett@cox.net>
6 * gprof-call-graph-view.c is free software.
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2, or (at your option) any later version.
12 * plugin.c is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 * See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with plugin.c. See the file "COPYING". If not,
19 * write to: The Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
24 #include "gprof-call-graph-view.h"
25 #include <glib/gi18n-lib.h>
27 struct _GProfCallGraphViewPriv
30 GtkListStore
*functions_list_store
;
31 GtkListStore
*called_list_store
;
32 GtkListStore
*called_by_list_store
;
33 GHashTable
*functions_iter_table
; /* Map functions names to list iters */
36 /* Function list columsns */
39 FUNCTIONS_COL_RECURSIVE
= 0,
43 FUNCTIONS_COL_CHILDREN
,
48 /* Called list columsns (also used by the Called By list) */
51 CALLED_COL_RECURSIVE
= 0,
59 /* Add an item to Called/Called by lists */
60 static void gprof_call_graph_view_add_list_item (GProfCallGraphView
*self
,
62 GProfCallGraphBlockEntry
*entry
,
65 GProfProfileData
*data
;
66 GProfCallGraph
*call_graph
;
67 GProfCallGraphBlock
*block
;
69 data
= gprof_view_get_data (GPROF_VIEW (self
));
70 call_graph
= gprof_profile_data_get_call_graph (data
);
72 gtk_list_store_append (store
, iter
);
73 gtk_list_store_set (store
, iter
, CALLED_COL_NAME
,
74 gprof_call_graph_block_entry_get_name (entry
),
76 gprof_call_graph_block_entry_get_self_sec (entry
),
78 gprof_call_graph_block_entry_get_child_sec (entry
),
80 gprof_call_graph_block_entry_get_calls (entry
),
83 block
= gprof_call_graph_find_block (call_graph
,
84 gprof_call_graph_block_entry_get_name (entry
));
89 if (gprof_call_graph_block_is_recursive (block
))
90 gtk_list_store_set (store
, iter
, CALLED_COL_RECURSIVE
,
96 /* Function selection callback */
98 on_function_selected (GtkTreeSelection
*selection
, GtkTreeModel
*model
,
99 GtkTreePath
*path
, gboolean path_currently_selected
,
102 GProfCallGraphView
*self
;
103 GProfProfileData
*data
;
104 GProfCallGraph
*call_graph
;
105 GProfCallGraphBlock
*block
;
106 GProfCallGraphBlockEntry
*current_entry
;
107 GtkWidget
*called_list_view
;
108 GtkWidget
*called_by_list_view
;
110 GtkTreeIter list_iter
;
111 gchar
*selected_function_name
;
113 self
= GPROF_CALL_GRAPH_VIEW (user_data
);
114 data
= gprof_view_get_data (GPROF_VIEW (self
));
115 call_graph
= gprof_profile_data_get_call_graph (data
);
116 called_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
118 called_by_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
119 "called_by_list_view");
121 gtk_tree_model_get_iter (model
, &list_iter
, path
);
122 gtk_tree_model_get (model
, &list_iter
, FUNCTIONS_COL_NAME
,
123 &selected_function_name
, -1);
125 if (selected_function_name
)
127 g_object_ref (self
->priv
->called_list_store
);
128 g_object_ref (self
->priv
->called_by_list_store
);
130 gtk_tree_view_set_model (GTK_TREE_VIEW (called_list_view
), NULL
);
131 gtk_tree_view_set_model (GTK_TREE_VIEW (called_by_list_view
), NULL
);
132 gtk_list_store_clear (self
->priv
->called_list_store
);
133 gtk_list_store_clear (self
->priv
->called_by_list_store
);
135 block
= gprof_call_graph_find_block (call_graph
,
136 selected_function_name
);
137 current_entry
= gprof_call_graph_block_get_first_child (block
,
140 g_free (selected_function_name
);
142 while (current_entry
)
144 gprof_call_graph_view_add_list_item (self
,
145 self
->priv
->called_list_store
,
146 current_entry
, &list_iter
);
148 current_entry
= gprof_call_graph_block_entry_get_next (entry_iter
,
152 current_entry
= gprof_call_graph_block_get_first_parent (block
,
155 while (current_entry
)
157 gprof_call_graph_view_add_list_item (self
,
158 self
->priv
->called_by_list_store
,
159 current_entry
, &list_iter
);
161 current_entry
= gprof_call_graph_block_entry_get_next (entry_iter
,
165 gtk_tree_view_set_model (GTK_TREE_VIEW (called_list_view
),
166 GTK_TREE_MODEL (self
->priv
->called_list_store
));
167 gtk_tree_view_set_model (GTK_TREE_VIEW (called_by_list_view
),
168 GTK_TREE_MODEL (self
->priv
->called_by_list_store
));
169 g_object_unref (self
->priv
->called_list_store
);
170 g_object_unref (self
->priv
->called_by_list_store
);
172 /* Set up search colums again */
173 gtk_tree_view_set_search_column (GTK_TREE_VIEW (called_list_view
),
175 gtk_tree_view_set_search_column (GTK_TREE_VIEW (called_by_list_view
),
182 /* Select a function in the Functions list by name */
184 gprof_call_graph_view_select_function (GProfCallGraphView
*self
, gchar
*name
)
186 GtkWidget
*functions_list_view
;
187 GtkTreeSelection
*functions_list_selection
;
188 GtkTreeIter
*functions_list_iter
;
189 GtkTreePath
*functions_list_path
;
191 functions_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
192 "functions_list_view");
193 functions_list_selection
= gtk_tree_view_get_selection (GTK_TREE_VIEW (functions_list_view
));
195 functions_list_iter
= g_hash_table_lookup (self
->priv
->functions_iter_table
,
198 if (functions_list_iter
)
200 gtk_tree_selection_select_iter (functions_list_selection
,
201 functions_list_iter
);
202 functions_list_path
= gtk_tree_model_get_path (GTK_TREE_MODEL (self
->priv
->functions_list_store
),
203 functions_list_iter
);
204 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (functions_list_view
),
205 functions_list_path
, NULL
, TRUE
, 0.5,
208 gtk_tree_path_free (functions_list_path
);
214 on_functions_list_view_row_activated (GtkTreeView
*list_view
,
216 GtkTreeViewColumn
*col
,
220 GtkTreeIter list_iter
;
222 gchar
*selected_function_name
;
224 self
= GPROF_VIEW (user_data
);
225 model
= gtk_tree_view_get_model (list_view
);
227 if (gtk_tree_model_get_iter (model
, &list_iter
, path
))
229 gtk_tree_model_get (model
,
230 &list_iter
, CALLED_COL_NAME
,
231 &selected_function_name
, -1);
233 gprof_view_show_symbol_in_editor (self
, selected_function_name
);
235 g_free (selected_function_name
);
239 /* Called/Called By list row activation callbacks */
240 static void on_called_list_view_row_activated (GtkTreeView
*list_view
,
242 GtkTreeViewColumn
*col
,
245 GProfCallGraphView
*self
;
246 GtkTreeIter list_iter
;
248 gchar
*selected_function_name
;
250 self
= GPROF_CALL_GRAPH_VIEW (user_data
);
251 model
= gtk_tree_view_get_model (list_view
);
253 if (gtk_tree_model_get_iter (model
, &list_iter
, path
))
255 gtk_tree_model_get (model
,
256 &list_iter
, CALLED_COL_NAME
,
257 &selected_function_name
, -1);
259 gprof_call_graph_view_select_function (self
, selected_function_name
);
261 g_free (selected_function_name
);
266 gprof_call_graph_view_create_columns (GProfCallGraphView
*self
)
268 GtkTreeViewColumn
*col
;
269 GtkCellRenderer
*renderer
;
270 GtkWidget
*functions_list_view
;
271 GtkWidget
*called_list_view
;
272 GtkWidget
*called_by_list_view
;
274 functions_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
275 "functions_list_view");
276 called_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
278 called_by_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
279 "called_by_list_view");
281 /* The Functions list will have all fields; all others have everything
282 * except a time field. */
285 col
= gtk_tree_view_column_new ();
286 gtk_tree_view_append_column (GTK_TREE_VIEW (functions_list_view
), col
);
287 renderer
= gtk_cell_renderer_pixbuf_new ();
288 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
289 gtk_tree_view_column_add_attribute (col
, renderer
, "stock-id",
290 FUNCTIONS_COL_RECURSIVE
);
291 gtk_tree_view_column_set_reorderable (col
, TRUE
);
293 col
= gtk_tree_view_column_new ();
294 gtk_tree_view_append_column (GTK_TREE_VIEW (called_list_view
), col
);
295 renderer
= gtk_cell_renderer_pixbuf_new ();
296 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
297 gtk_tree_view_column_add_attribute (col
, renderer
, "stock-id",
298 CALLED_COL_RECURSIVE
);
299 gtk_tree_view_column_set_reorderable (col
, TRUE
);
302 col
= gtk_tree_view_column_new ();
303 gtk_tree_view_append_column (GTK_TREE_VIEW (called_by_list_view
), col
);
304 renderer
= gtk_cell_renderer_pixbuf_new ();
305 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
306 gtk_tree_view_column_add_attribute (col
, renderer
, "stock-id",
307 CALLED_COL_RECURSIVE
);
308 gtk_tree_view_column_set_reorderable (col
, TRUE
);
311 col
= gtk_tree_view_column_new ();
312 gtk_tree_view_column_set_title (col
, _("Function Name"));
313 gtk_tree_view_append_column (GTK_TREE_VIEW (functions_list_view
), col
);
314 renderer
= gtk_cell_renderer_text_new ();
315 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
316 gtk_tree_view_column_add_attribute (col
, renderer
, "text",
318 gtk_tree_view_column_set_resizable (col
, TRUE
);
319 gtk_tree_view_column_set_reorderable (col
, TRUE
);
321 col
= gtk_tree_view_column_new ();
322 gtk_tree_view_column_set_title (col
, _("Function Name"));
323 gtk_tree_view_append_column (GTK_TREE_VIEW (called_list_view
), col
);
324 renderer
= gtk_cell_renderer_text_new ();
325 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
326 gtk_tree_view_column_add_attribute (col
, renderer
, "text",
328 gtk_tree_view_column_set_resizable (col
, TRUE
);
329 gtk_tree_view_column_set_reorderable (col
, TRUE
);
331 col
= gtk_tree_view_column_new ();
332 gtk_tree_view_column_set_title (col
, _("Function Name"));
333 gtk_tree_view_append_column (GTK_TREE_VIEW (called_by_list_view
), col
);
334 renderer
= gtk_cell_renderer_text_new ();
335 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
336 gtk_tree_view_column_add_attribute (col
, renderer
, "text",
338 gtk_tree_view_column_set_resizable (col
, TRUE
);
339 gtk_tree_view_column_set_reorderable (col
, TRUE
);
343 col
= gtk_tree_view_column_new ();
344 gtk_tree_view_column_set_title (col
, _("Time"));
345 gtk_tree_view_append_column (GTK_TREE_VIEW (functions_list_view
), col
);
347 renderer
= gtk_cell_renderer_text_new ();
348 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
349 gtk_tree_view_column_set_cell_data_func (col
, renderer
,
350 gprof_view_format_float
,
351 GINT_TO_POINTER (FUNCTIONS_COL_TIME
),
353 gtk_tree_view_column_set_resizable (col
, TRUE
);
354 gtk_tree_view_column_set_reorderable (col
, TRUE
);
357 col
= gtk_tree_view_column_new ();
359 /* Total amount of time spent in this function, excluding those it calla.
360 * This is the same as the "Seconds" field in the flat profile. */
361 gtk_tree_view_column_set_title (col
, _("Self"));
362 gtk_tree_view_append_column (GTK_TREE_VIEW (functions_list_view
), col
);
363 renderer
= gtk_cell_renderer_text_new ();
364 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
365 gtk_tree_view_column_set_cell_data_func (col
, renderer
,
366 gprof_view_format_float
,
367 GINT_TO_POINTER (FUNCTIONS_COL_SELF
),
369 gtk_tree_view_column_set_resizable (col
, TRUE
);
370 gtk_tree_view_column_set_reorderable (col
, TRUE
);
372 col
= gtk_tree_view_column_new ();
374 /* Time spent in a subroutine of a function. */
375 gtk_tree_view_column_set_title (col
, _("Self"));
376 gtk_tree_view_append_column (GTK_TREE_VIEW (called_list_view
), col
);
377 renderer
= gtk_cell_renderer_text_new ();
378 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
379 gtk_tree_view_column_set_cell_data_func (col
, renderer
,
380 gprof_view_format_float
,
381 GINT_TO_POINTER (CALLED_COL_SELF
),
383 gtk_tree_view_column_set_resizable (col
, TRUE
);
384 gtk_tree_view_column_set_reorderable (col
, TRUE
);
386 col
= gtk_tree_view_column_new ();
388 /* Time spent in this function when it was called by its caller */
389 gtk_tree_view_column_set_title (col
, _("Self"));
390 gtk_tree_view_append_column (GTK_TREE_VIEW (called_by_list_view
), col
);
391 renderer
= gtk_cell_renderer_text_new ();
392 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
393 gtk_tree_view_column_set_cell_data_func (col
, renderer
,
394 gprof_view_format_float
,
395 GINT_TO_POINTER (CALLED_COL_SELF
),
397 gtk_tree_view_column_set_resizable (col
, TRUE
);
398 gtk_tree_view_column_set_reorderable (col
, TRUE
);
401 col
= gtk_tree_view_column_new ();
402 gtk_tree_view_column_set_title (col
, _("Children"));
403 gtk_tree_view_append_column (GTK_TREE_VIEW (functions_list_view
), col
);
404 renderer
= gtk_cell_renderer_text_new ();
405 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
406 gtk_tree_view_column_set_cell_data_func (col
, renderer
,
407 gprof_view_format_float
,
408 GINT_TO_POINTER (FUNCTIONS_COL_CHILDREN
),
410 gtk_tree_view_column_set_resizable (col
, TRUE
);
411 gtk_tree_view_column_set_reorderable (col
, TRUE
);
413 col
= gtk_tree_view_column_new ();
414 gtk_tree_view_column_set_title (col
, _("Children"));
415 gtk_tree_view_append_column (GTK_TREE_VIEW (called_list_view
), col
);
416 renderer
= gtk_cell_renderer_text_new ();
417 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
418 gtk_tree_view_column_set_cell_data_func (col
, renderer
,
419 gprof_view_format_float
,
420 GINT_TO_POINTER (CALLED_COL_CHILDREN
),
422 gtk_tree_view_column_set_resizable (col
, TRUE
);
423 gtk_tree_view_column_set_reorderable (col
, TRUE
);
425 col
= gtk_tree_view_column_new ();
426 gtk_tree_view_column_set_title (col
, _("Children"));
427 gtk_tree_view_append_column (GTK_TREE_VIEW (called_by_list_view
), col
);
428 renderer
= gtk_cell_renderer_text_new ();
429 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
430 gtk_tree_view_column_set_cell_data_func (col
, renderer
,
431 gprof_view_format_float
,
432 GINT_TO_POINTER (CALLED_COL_CHILDREN
),
434 gtk_tree_view_column_set_resizable (col
, TRUE
);
435 gtk_tree_view_column_set_reorderable (col
, TRUE
);
438 col
= gtk_tree_view_column_new ();
439 gtk_tree_view_column_set_title (col
, _("Calls"));
440 gtk_tree_view_append_column (GTK_TREE_VIEW (functions_list_view
), col
);
441 renderer
= gtk_cell_renderer_text_new ();
442 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
443 gtk_tree_view_column_add_attribute (col
, renderer
, "text",
444 FUNCTIONS_COL_CALLS
);
445 gtk_tree_view_column_set_resizable (col
, TRUE
);
446 gtk_tree_view_column_set_reorderable (col
, TRUE
);
448 col
= gtk_tree_view_column_new ();
449 gtk_tree_view_column_set_title (col
, _("Calls"));
450 gtk_tree_view_append_column (GTK_TREE_VIEW (called_list_view
), col
);
451 renderer
= gtk_cell_renderer_text_new ();
452 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
453 gtk_tree_view_column_add_attribute (col
, renderer
, "text",
455 gtk_tree_view_column_set_resizable (col
, TRUE
);
456 gtk_tree_view_column_set_reorderable (col
, TRUE
);
458 col
= gtk_tree_view_column_new ();
459 gtk_tree_view_column_set_title (col
, _("Calls"));
460 gtk_tree_view_append_column (GTK_TREE_VIEW (called_by_list_view
), col
);
461 renderer
= gtk_cell_renderer_text_new ();
462 gtk_tree_view_column_pack_start (col
, renderer
, TRUE
);
463 gtk_tree_view_column_add_attribute (col
, renderer
, "text",
465 gtk_tree_view_column_set_resizable (col
, TRUE
);
466 gtk_tree_view_column_set_reorderable (col
, TRUE
);
469 gtk_tree_view_set_model (GTK_TREE_VIEW (functions_list_view
),
470 GTK_TREE_MODEL (self
->priv
->functions_list_store
));
471 g_object_unref (self
->priv
->functions_list_store
);
473 gtk_tree_view_set_model (GTK_TREE_VIEW (called_list_view
),
474 GTK_TREE_MODEL (self
->priv
->called_list_store
));
475 g_object_unref (self
->priv
->called_list_store
);
477 gtk_tree_view_set_model (GTK_TREE_VIEW (called_by_list_view
),
478 GTK_TREE_MODEL (self
->priv
->called_by_list_store
));
479 g_object_unref (self
->priv
->called_by_list_store
);
485 gprof_call_graph_view_init (GProfCallGraphView
*self
)
487 GtkWidget
*functions_list_view
;
488 GtkWidget
*called_list_view
;
489 GtkWidget
*called_by_list_view
;
490 GtkWidget
*called_jump_to_button
;
491 GtkWidget
*called_by_jump_to_button
;
492 GtkTreeSelection
*functions_list_selection
;
494 self
->priv
= g_new0 (GProfCallGraphViewPriv
, 1);
496 self
->priv
->gxml
= glade_xml_new (PACKAGE_DATA_DIR
497 "/glade/profiler-call-graph.glade",
499 self
->priv
->functions_list_store
= gtk_list_store_new (FUNCTIONS_NUM_COLS
,
507 self
->priv
->called_list_store
= gtk_list_store_new (CALLED_NUM_COLS
,
514 self
->priv
->called_by_list_store
= gtk_list_store_new (CALLED_NUM_COLS
,
521 gprof_call_graph_view_create_columns (self
);
523 functions_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
524 "functions_list_view");
525 called_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
527 called_by_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
528 "called_by_list_view");
530 /* Function selection */
531 functions_list_selection
= gtk_tree_view_get_selection (GTK_TREE_VIEW (functions_list_view
));
532 gtk_tree_selection_set_select_function (functions_list_selection
,
533 on_function_selected
,
534 (gpointer
) self
, NULL
);
536 /* Jump to button callbacks */
537 called_jump_to_button
= glade_xml_get_widget (self
->priv
->gxml
,
538 "called_jump_to_button");
539 called_by_jump_to_button
= glade_xml_get_widget (self
->priv
->gxml
,
540 "called_by_jump_to_button");
542 g_signal_connect (functions_list_view
, "row-activated",
543 G_CALLBACK (on_functions_list_view_row_activated
),
545 g_signal_connect (called_list_view
, "row-activated",
546 G_CALLBACK (on_called_list_view_row_activated
),
548 g_signal_connect (called_by_list_view
, "row-activated",
549 G_CALLBACK (on_called_list_view_row_activated
),
554 gprof_call_graph_view_finalize (GObject
*obj
)
556 GProfCallGraphView
*self
;
558 self
= (GProfCallGraphView
*) obj
;
560 g_object_unref (self
->priv
->gxml
);
562 if (self
->priv
->functions_iter_table
)
563 g_hash_table_destroy (self
->priv
->functions_iter_table
);
569 gprof_call_graph_view_class_init (GProfCallGraphViewClass
*klass
)
571 GObjectClass
*object_class
;
572 GProfViewClass
*view_class
;
574 object_class
= (GObjectClass
*) klass
;
575 view_class
= GPROF_VIEW_CLASS (klass
);
577 object_class
->finalize
= gprof_call_graph_view_finalize
;
578 view_class
->refresh
= gprof_call_graph_view_refresh
;
579 view_class
->get_widget
= gprof_call_graph_view_get_widget
;
583 gprof_call_graph_view_get_type (void)
585 static GType obj_type
= 0;
589 static const GTypeInfo obj_info
=
591 sizeof (GProfCallGraphViewClass
),
592 (GBaseInitFunc
) NULL
,
593 (GBaseFinalizeFunc
) NULL
,
594 (GClassInitFunc
) gprof_call_graph_view_class_init
,
595 (GClassFinalizeFunc
) NULL
,
596 NULL
, /* class_data */
597 sizeof (GProfCallGraphView
),
599 (GInstanceInitFunc
) gprof_call_graph_view_init
,
600 NULL
/* value_table */
602 obj_type
= g_type_register_static (GPROF_VIEW_TYPE
,
603 "GProfCallGraphView", &obj_info
, 0);
609 gprof_call_graph_view_new (GProfProfileData
*profile_data
,
610 IAnjutaSymbolManager
*symbol_manager
,
611 IAnjutaDocumentManager
*document_manager
)
613 GProfCallGraphView
*view
;
615 view
= g_object_new (GPROF_CALL_GRAPH_VIEW_TYPE
, NULL
);
616 gprof_view_set_data (GPROF_VIEW (view
), profile_data
);
617 gprof_view_set_symbol_manager (GPROF_VIEW (view
), symbol_manager
);
618 gprof_view_set_document_manager (GPROF_VIEW (view
), document_manager
);
624 gprof_call_graph_view_refresh (GProfView
*view
)
626 GProfCallGraphView
*self
;
627 GtkWidget
*functions_list_view
;
628 GtkWidget
*called_list_view
;
629 GtkWidget
*called_by_list_view
;
630 GProfProfileData
*data
;
631 GProfCallGraph
*call_graph
;
632 GProfCallGraphBlock
*current_block
;
633 GProfCallGraphBlockEntry
*primary_entry
;
635 GtkTreeIter list_iter
;
637 self
= GPROF_CALL_GRAPH_VIEW (view
);
638 data
= gprof_view_get_data (view
);
639 call_graph
= gprof_profile_data_get_call_graph (data
);
641 functions_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
642 "functions_list_view");
643 called_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
645 called_by_list_view
= glade_xml_get_widget (self
->priv
->gxml
,
646 "called_by_list_view");
648 /* Clear all lists and repopulate the functions list. The two others won't
649 * be repopulated until a user selects a function from the Functions list */
650 g_object_ref (self
->priv
->functions_list_store
);
651 g_object_ref (self
->priv
->called_list_store
);
652 g_object_ref (self
->priv
->called_by_list_store
);
654 gtk_tree_view_set_model (GTK_TREE_VIEW (functions_list_view
), NULL
);
655 gtk_tree_view_set_model (GTK_TREE_VIEW (called_list_view
), NULL
);
656 gtk_tree_view_set_model (GTK_TREE_VIEW (called_by_list_view
), NULL
);
657 gtk_list_store_clear (self
->priv
->functions_list_store
);
658 gtk_list_store_clear (self
->priv
->called_list_store
);
659 gtk_list_store_clear (self
->priv
->called_by_list_store
);
661 gtk_tree_view_set_model (GTK_TREE_VIEW (called_list_view
),
662 GTK_TREE_MODEL (self
->priv
->called_list_store
));
663 gtk_tree_view_set_model (GTK_TREE_VIEW (called_by_list_view
),
664 GTK_TREE_MODEL (self
->priv
->called_by_list_store
));
666 g_object_unref (self
->priv
->called_list_store
);
667 g_object_unref (self
->priv
->called_by_list_store
);
669 current_block
= gprof_call_graph_get_first_block (call_graph
, &block_iter
);
671 /* Rebuild the Functions iter table. This table maps function names to
672 * GtkTreeIters in the functions list to be used by the Jump to buttons
673 * next to the Called and Called by lists. When a user selects a function
674 * in either of these lists, that function should be selected in the
676 if (self
->priv
->functions_iter_table
)
677 g_hash_table_destroy (self
->priv
->functions_iter_table
);
679 self
->priv
->functions_iter_table
= g_hash_table_new_full (g_str_hash
,
683 while (current_block
)
685 primary_entry
= gprof_call_graph_block_get_primary_entry (current_block
);
687 gtk_list_store_append (self
->priv
->functions_list_store
, &list_iter
);
688 gtk_list_store_set (self
->priv
->functions_list_store
, &list_iter
,
690 gprof_call_graph_block_entry_get_name (primary_entry
),
692 gprof_call_graph_block_entry_get_time_perc (primary_entry
),
694 gprof_call_graph_block_entry_get_self_sec (primary_entry
),
695 FUNCTIONS_COL_CHILDREN
,
696 gprof_call_graph_block_entry_get_child_sec (primary_entry
),
698 gprof_call_graph_block_entry_get_calls (primary_entry
),
701 if (gprof_call_graph_block_is_recursive (current_block
))
703 gtk_list_store_set (self
->priv
->functions_list_store
, &list_iter
,
704 FUNCTIONS_COL_RECURSIVE
,
705 GTK_STOCK_REFRESH
, -1);
708 /* Add the current iter to the Functions iter lookup table */
709 g_hash_table_insert (self
->priv
->functions_iter_table
,
710 gprof_call_graph_block_entry_get_name (primary_entry
),
711 g_memdup (&list_iter
, sizeof (GtkTreeIter
)));
713 current_block
= gprof_call_graph_block_get_next (block_iter
,
717 gtk_tree_view_set_model (GTK_TREE_VIEW (functions_list_view
),
718 GTK_TREE_MODEL (self
->priv
->functions_list_store
));
720 g_object_unref (self
->priv
->functions_list_store
);
722 /* Set search column on Functions list */
723 gtk_tree_view_set_search_column (GTK_TREE_VIEW (functions_list_view
),
728 gprof_call_graph_view_get_widget (GProfView
*view
)
730 GProfCallGraphView
*self
;
732 self
= GPROF_CALL_GRAPH_VIEW (view
);
734 return glade_xml_get_widget (self
->priv
->gxml
, "call_graph_vbox");