Updated Spanish translation
[anjuta-git-plugin.git] / plugins / profiler / gprof-call-graph-view.c
blob5d45f038308eb1a58107e420d1c177f3082608b6
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * gprof-call-graph-view.c
4 * Copyright (C) James Liggett 2006 <jrliggett@cox.net>
5 *
6 * gprof-call-graph-view.c is free software.
7 *
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
29 GladeXML *gxml;
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 */
37 enum
39 FUNCTIONS_COL_RECURSIVE = 0,
40 FUNCTIONS_COL_NAME,
41 FUNCTIONS_COL_TIME,
42 FUNCTIONS_COL_SELF,
43 FUNCTIONS_COL_CHILDREN,
44 FUNCTIONS_COL_CALLS,
45 FUNCTIONS_NUM_COLS
48 /* Called list columsns (also used by the Called By list) */
49 enum
51 CALLED_COL_RECURSIVE = 0,
52 CALLED_COL_NAME,
53 CALLED_COL_SELF,
54 CALLED_COL_CHILDREN,
55 CALLED_COL_CALLS,
56 CALLED_NUM_COLS
59 /* Add an item to Called/Called by lists */
60 static void gprof_call_graph_view_add_list_item (GProfCallGraphView *self,
61 GtkListStore *store,
62 GProfCallGraphBlockEntry *entry,
63 GtkTreeIter *iter)
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),
75 CALLED_COL_SELF,
76 gprof_call_graph_block_entry_get_self_sec (entry),
77 CALLED_COL_CHILDREN,
78 gprof_call_graph_block_entry_get_child_sec (entry),
79 CALLED_COL_CALLS,
80 gprof_call_graph_block_entry_get_calls (entry),
81 -1);
83 block = gprof_call_graph_find_block (call_graph,
84 gprof_call_graph_block_entry_get_name (entry));
87 if (block)
89 if (gprof_call_graph_block_is_recursive (block))
90 gtk_list_store_set (store, iter, CALLED_COL_RECURSIVE,
91 GTK_STOCK_REFRESH);
96 /* Function selection callback */
97 static gboolean
98 on_function_selected (GtkTreeSelection *selection, GtkTreeModel *model,
99 GtkTreePath *path, gboolean path_currently_selected,
100 gpointer user_data)
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;
109 GList *entry_iter;
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,
117 "called_list_view");
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,
138 &entry_iter);
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,
149 &entry_iter);
152 current_entry = gprof_call_graph_block_get_first_parent (block,
153 &entry_iter);
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,
162 &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),
174 CALLED_COL_NAME);
175 gtk_tree_view_set_search_column (GTK_TREE_VIEW (called_by_list_view),
176 CALLED_COL_NAME);
179 return TRUE;
182 /* Select a function in the Functions list by name */
183 static void
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,
196 name);
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,
206 0.0);
208 gtk_tree_path_free (functions_list_path);
213 static void
214 on_functions_list_view_row_activated (GtkTreeView *list_view,
215 GtkTreePath *path,
216 GtkTreeViewColumn *col,
217 gpointer user_data)
219 GProfView *self;
220 GtkTreeIter list_iter;
221 GtkTreeModel *model;
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,
241 GtkTreePath *path,
242 GtkTreeViewColumn *col,
243 gpointer user_data)
245 GProfCallGraphView *self;
246 GtkTreeIter list_iter;
247 GtkTreeModel *model;
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);
265 static void
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,
277 "called_list_view");
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. */
284 /* Recursive icon */
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);
310 /* Function Name */
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",
317 FUNCTIONS_COL_NAME);
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",
327 CALLED_COL_NAME);
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",
337 CALLED_COL_NAME);
338 gtk_tree_view_column_set_resizable (col, TRUE);
339 gtk_tree_view_column_set_reorderable (col, TRUE);
342 /* Time */
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),
352 NULL);
353 gtk_tree_view_column_set_resizable (col, TRUE);
354 gtk_tree_view_column_set_reorderable (col, TRUE);
356 /* Self */
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),
368 NULL);
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),
382 NULL);
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),
396 NULL);
397 gtk_tree_view_column_set_resizable (col, TRUE);
398 gtk_tree_view_column_set_reorderable (col, TRUE);
400 /* Children */
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),
409 NULL);
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),
421 NULL);
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),
433 NULL);
434 gtk_tree_view_column_set_resizable (col, TRUE);
435 gtk_tree_view_column_set_reorderable (col, TRUE);
437 /* Calls */
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",
454 CALLED_COL_CALLS);
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",
464 CALLED_COL_CALLS);
465 gtk_tree_view_column_set_resizable (col, TRUE);
466 gtk_tree_view_column_set_reorderable (col, TRUE);
468 /* Model setup */
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);
484 static void
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",
498 NULL, NULL);
499 self->priv->functions_list_store = gtk_list_store_new (FUNCTIONS_NUM_COLS,
500 G_TYPE_STRING,
501 G_TYPE_STRING,
502 G_TYPE_FLOAT,
503 G_TYPE_FLOAT,
504 G_TYPE_FLOAT,
505 G_TYPE_STRING);
507 self->priv->called_list_store = gtk_list_store_new (CALLED_NUM_COLS,
508 G_TYPE_STRING,
509 G_TYPE_STRING,
510 G_TYPE_FLOAT,
511 G_TYPE_FLOAT,
512 G_TYPE_STRING);
514 self->priv->called_by_list_store = gtk_list_store_new (CALLED_NUM_COLS,
515 G_TYPE_STRING,
516 G_TYPE_STRING,
517 G_TYPE_FLOAT,
518 G_TYPE_FLOAT,
519 G_TYPE_STRING);
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,
526 "called_list_view");
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),
544 (gpointer) self);
545 g_signal_connect (called_list_view, "row-activated",
546 G_CALLBACK (on_called_list_view_row_activated),
547 (gpointer) self);
548 g_signal_connect (called_by_list_view, "row-activated",
549 G_CALLBACK (on_called_list_view_row_activated),
550 (gpointer) self);
553 static void
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);
565 g_free (self->priv);
568 static void
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;
582 GType
583 gprof_call_graph_view_get_type (void)
585 static GType obj_type = 0;
587 if (!obj_type)
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),
598 0, /* n_preallocs */
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);
605 return obj_type;
608 GProfCallGraphView *
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);
620 return view;
623 void
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;
634 GList *block_iter;
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,
644 "called_list_view");
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
675 * functions list. */
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,
680 g_str_equal, NULL,
681 g_free);
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,
689 FUNCTIONS_COL_NAME,
690 gprof_call_graph_block_entry_get_name (primary_entry),
691 FUNCTIONS_COL_TIME,
692 gprof_call_graph_block_entry_get_time_perc (primary_entry),
693 FUNCTIONS_COL_SELF,
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),
697 FUNCTIONS_COL_CALLS,
698 gprof_call_graph_block_entry_get_calls (primary_entry),
699 -1);
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,
714 &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),
724 FUNCTIONS_COL_NAME);
727 GtkWidget *
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");