Reorganized and completed menus:

- Separated "File" into "Filters and "Messages" menus.
- Added "Enable filtering".
- Added "Reload messages file".
- Added "Go to first message".
- Added "Go to message".
- Added "Go to last message".
- Added "Display message header"
- Added "Display brace"
- Added menu key shortcuts (mnemonic and accelerator).
Created an entry box for message goto input number and modified the search function to select the closest lower number if input number is not present in messages list.
Cleared message content view when needed.
Blocked message content redisplay when not needed.
Added a signal handler to capture events on message list tree view.
Modified message content display format.
Modified some log points.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4426 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
winckel
2013-11-18 10:32:48 +00:00
parent f6c2677a76
commit 7a178e0190
39 changed files with 645 additions and 337 deletions
+119 -51
View File
@@ -101,6 +101,16 @@ gboolean ui_callback_on_save_filters(GtkWidget *widget, gpointer data)
return TRUE;
}
gboolean ui_callback_on_enable_filters(GtkWidget *widget, gpointer data)
{
gboolean enabled;
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled));
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), !enabled);
return TRUE;
}
gboolean ui_callback_on_about(GtkWidget *widget, gpointer data)
{
#if defined(PACKAGE_STRING)
@@ -115,55 +125,92 @@ gboolean ui_callback_on_about(GtkWidget *widget, gpointer data)
gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path,
gboolean path_currently_selected, gpointer user_data)
{
static gpointer buffer_current;
ui_text_view_t *text_view;
GtkTreeIter iter;
text_view = (ui_text_view_t *) user_data;
g_assert(text_view != NULL);
if (gtk_tree_model_get_iter (model, &iter, path))
if (ui_tree_view_last_event)
{
GValue buffer_store = G_VALUE_INIT;
gpointer buffer;
g_debug("last_event %p %d %d", ui_tree_view_last_event, ui_tree_view_last_event->type, ui_tree_view_last_event->button);
GValue message_id_store = G_VALUE_INIT;
guint message_id;
gtk_tree_model_get_value (model, &iter, COL_BUFFER, &buffer_store);
buffer = g_value_get_pointer (&buffer_store);
gtk_tree_model_get_value (model, &iter, COL_MESSAGE_ID, &message_id_store);
message_id = g_value_get_uint(&message_id_store);
if (!path_currently_selected)
if (ui_tree_view_last_event->type == GDK_BUTTON_PRESS)
{
/* Clear the view */
CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE);
/* Callback is due to a button click */
ui_main_data.follow_last = FALSE;
if ((strcmp (message_id_to_string (message_id), "ERROR") == 0)
|| (strcmp (message_id_to_string (message_id), "WARNING") == 0)
|| (strcmp (message_id_to_string (message_id), "GENERIC_LOG") == 0))
if (ui_tree_view_last_event->button == 3)
{
gchar *data;
gint data_size;
uint32_t message_header_type_size;
CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
message_header_type_size = get_message_header_type_size ();
data = (gchar *) buffer_at_offset ((buffer_t*) buffer, message_header_type_size);
data_size = get_message_size ((buffer_t*) buffer);
g_debug("message header type size: %u, data size: %u", message_header_type_size, data_size);
ui_signal_set_text (text_view, "\n", 1);
ui_signal_set_text (text_view, data, data_size);
/* It was a right mouse click */
}
else
}
ui_tree_view_last_event = NULL;
}
g_debug("Message selected %d %p %p %s", path_currently_selected, buffer_current, path, gtk_tree_path_to_string(path));
if (!path_currently_selected)
{
text_view = (ui_text_view_t *) user_data;
g_assert(text_view != NULL);
if (gtk_tree_model_get_iter(model, &iter, path))
{
GValue buffer_store = G_VALUE_INIT;
gpointer buffer;
GValue message_id_store = G_VALUE_INIT;
guint message_id;
gtk_tree_model_get_value(model, &iter, COL_BUFFER, &buffer_store);
buffer = g_value_get_pointer(&buffer_store);
g_debug(" Get iter %p %p", buffer_current, buffer);
if (buffer_current != buffer)
{
/* Dissect the signal */
CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
buffer_current = buffer;
gtk_tree_model_get_value(model, &iter, COL_MESSAGE_ID, &message_id_store);
message_id = g_value_get_uint(&message_id_store);
/* Clear the view */
CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE);
if (ui_main_data.display_message_header)
{
CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
}
if ((strcmp(message_id_to_string(message_id), "ERROR_LOG") == 0)
|| (strcmp(message_id_to_string(message_id), "WARNING_LOG") == 0)
|| (strcmp(message_id_to_string(message_id), "GENERIC_LOG") == 0))
{
gchar *data;
gint data_size;
uint32_t message_header_type_size;
if (ui_main_data.display_message_header)
{
ui_signal_set_text(text_view, "\n", 1);
}
message_header_type_size = get_message_header_type_size();
data = (gchar *) buffer_at_offset((buffer_t*) buffer, message_header_type_size);
data_size = get_message_size((buffer_t*) buffer);
g_debug(" message header type size: %u, data size: %u %p %d", message_header_type_size, data_size,
buffer, ui_main_data.follow_last);
ui_signal_set_text(text_view, data, data_size);
} else
{
g_debug(" dissect message %d %p %d", message_id, buffer, ui_main_data.follow_last);
/* Dissect the signal */
CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
}
}
}
}
@@ -172,6 +219,7 @@ gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel
void ui_signal_add_to_list(gpointer data, gpointer user_data)
{
gboolean goto_last = user_data ? TRUE : FALSE;
buffer_t *signal_buffer;
GtkTreePath *path;
GtkTreeViewColumn *focus_column;
@@ -205,11 +253,10 @@ void ui_signal_add_to_list(gpointer data, gpointer user_data)
/* Increment number of messages */
ui_main_data.nb_message_received++;
/* Check if no signal was selected in the list or if it was the last signal */
if ((ui_main_data.path_last == NULL) || (path == NULL) || (gtk_tree_path_compare(ui_main_data.path_last, path) == 0))
if ((ui_main_data.follow_last) && (goto_last))
{
/* Advance to the new last signal */
ui_callback_signal_go_to_last (NULL, NULL);
ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1);
}
}
@@ -225,7 +272,7 @@ static gboolean ui_handle_update_signal_list(gint fd, void *data, size_t data_le
g_assert(signal_list_message != NULL);
g_assert(signal_list_message->signal_list != NULL);
g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, NULL);
g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, (gpointer) TRUE);
/* Free the list but not user data associated with each element */
g_list_free (signal_list_message->signal_list);
@@ -378,25 +425,46 @@ gboolean ui_callback_on_disconnect(GtkWidget *widget, gpointer data)
return TRUE;
}
gboolean ui_callback_signal_go_to(GtkWidget *widget, gpointer data)
gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data)
{
ui_tree_view_select_row (ui_main_data.nb_message_received / 2, NULL);
ui_tree_view_select_row (0);
ui_main_data.follow_last = FALSE;
return TRUE;
}
gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data)
gboolean ui_callback_signal_go_to(GtkWidget *widget, gpointer data)
{
ui_tree_view_select_row (0, NULL);
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signals_go_to_entry);
return TRUE;
}
gboolean ui_callback_signal_go_to_entry(GtkWidget *widget, gpointer data)
{
// gtk_entry_buffer_set_text(GTK_ENTRY(ui_main_data.signals_go_to_entry), "");
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signalslist);
return TRUE;
}
gboolean ui_callback_signal_go_to_last(GtkWidget *widget, gpointer data)
{
GtkTreePath *path;
ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1);
ui_main_data.follow_last = TRUE;
ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1, &path);
ui_main_data.path_last = path;
return TRUE;
}
gboolean ui_callback_display_message_header(GtkWidget *widget, gpointer data)
{
ui_main_data.display_message_header = !ui_main_data.display_message_header;
// TODO refresh textview.
return TRUE;
}
gboolean ui_callback_display_brace(GtkWidget *widget, gpointer data)
{
ui_main_data.display_brace = !ui_main_data.display_brace;
// TODO refresh textview.
return TRUE;
}
@@ -411,7 +479,7 @@ gboolean ui_callback_signal_clear_list(GtkWidget *widget, gpointer data)
if (ui_main_data.text_view != NULL)
{
// ui_signal_dissect_clear_view(ui_main_data.text_view);
ui_signal_dissect_clear_view(ui_main_data.text_view);
}
return TRUE;
@@ -18,6 +18,9 @@ gboolean ui_callback_on_open_filters(GtkWidget *widget,
gboolean ui_callback_on_save_filters(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_enable_filters(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_about(GtkWidget *widget,
gpointer data);
@@ -41,15 +44,24 @@ ui_callback_on_select_signal(GtkTreeSelection *selection,
gboolean path_currently_selected,
gpointer userdata);
gboolean ui_callback_signal_go_to(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_go_to_first(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_go_to(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_go_to_entry(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_go_to_last(GtkWidget *widget,
gpointer data);
gboolean ui_callback_display_message_header(GtkWidget *widget,
gpointer data);
gboolean ui_callback_display_brace(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_clear_list(GtkWidget *widget,
gpointer data);
@@ -22,7 +22,7 @@ gboolean ui_callback_on_pipe_notification(
/* avoid reentrancy problems and stack overflow */
g_source_remove(pipe_input->pipe_input_id);
// g_debug("Received new data on pipe %d", pipe_input->pipe_input_id);
g_debug("Received new data on pipe %d", pipe_input->pipe_input_id);
if (pipe_input->input_cb(pipe_input->source_fd, pipe_input->user_data)) {
/* restore pipe handler */
@@ -22,6 +22,11 @@
ui_main_data_t ui_main_data;
gchar *LOG_DOMAIN_PARSE = "Parse";
gchar *LOG_DOMAIN_PIPE = "Pipe";
gchar *LOG_DOMAIN_SOCKET = "Socket";
gchar *LOG_DOMAIN_UI = "UI";
static void ui_help(void)
{
printf ("Usage: itti_analyser [options]\n\n"
@@ -112,6 +117,8 @@ static int ui_idle_callback(gpointer data)
{
g_debug("Entering idle state");
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signalslist);
/* Read filters file */
if (ui_main_data.filters_file_name != NULL)
{
@@ -168,6 +175,7 @@ int ui_gtk_initialize(int argc, char *argv[])
ui_main_data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
ui_init_filters (TRUE, FALSE);
// gtk_window_set_default_icon_from_file ("../analyzer.png", NULL);
gtk_window_set_default_icon_name (GTK_STOCK_FIND);
gtk_window_set_position (GTK_WINDOW(ui_main_data.window), GTK_WIN_POS_CENTER);
@@ -1,8 +1,10 @@
#include "ui_signal_dissect_view.h"
#ifndef UI_MAIN_SCREEN_H_
#define UI_MAIN_SCREEN_H_
#include <gtk/gtk.h>
#include "ui_signal_dissect_view.h"
typedef struct {
GtkWidget *window;
GtkWidget *ip_entry;
@@ -29,12 +31,14 @@ typedef struct {
/* Signal list buttons */
/* Clear signals button */
GtkToolItem *signals_go_to_button;
GtkWidget *signals_go_to_entry;
GtkToolItem *signals_go_to_last_button;
GtkToolItem *signals_go_to_first_button;
gboolean display_message_header;
gboolean display_brace;
GtkTreeSelection *selection;
GtkTreePath *path_last;
gboolean follow_last;
/* Nb of messages received */
guint nb_message_received;
+149 -67
View File
@@ -1,4 +1,5 @@
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "rc.h"
#include "ui_main_screen.h"
@@ -19,78 +20,162 @@ void ui_set_sensitive_move_buttons(gboolean enable)
int ui_menu_bar_create(GtkWidget *vbox)
{
GtkWidget *menubar;
GtkWidget *filemenu, *helpmenu;
GtkWidget *file;
GtkAccelGroup *accel_group;
GtkWidget *menu_bar;
GtkWidget *filters_menu;
GtkWidget *messages_menu;
GtkWidget *help_menu;
GtkWidget *filters;
GtkWidget *messages;
GtkWidget *help;
GtkWidget *open_messages;
GtkWidget *save_messages;
GtkWidget *open_filters;
GtkWidget *save_filters;
GtkWidget *enable_filters;
GtkWidget *open_messages;
GtkWidget *reload_messages;
GtkWidget *save_messages;
GtkWidget *goto_first_messages;
GtkWidget *goto_messages;
GtkWidget *goto_last_messages;
GtkWidget *display_message_header;
GtkWidget *display_brace;
GtkWidget *quit;
GtkWidget *about;
GtkWidget *separator1;
GtkWidget *separator2;
if (!vbox)
return RC_BAD_PARAM;
menubar = gtk_menu_bar_new();
accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(ui_main_data.window), accel_group);
/* Create the File submenu */
filemenu = gtk_menu_new();
menu_bar = gtk_menu_bar_new();
file = gtk_menu_item_new_with_label("File");
open_messages = gtk_menu_item_new_with_label("Open messages file");
save_messages = gtk_menu_item_new_with_label("Save messages file");
open_filters = gtk_menu_item_new_with_label("Open filters file");
save_filters = gtk_menu_item_new_with_label("Save filters file");
quit = gtk_menu_item_new_with_label("Quit");
separator1 = gtk_menu_item_new();
separator2 = gtk_menu_item_new();
/* Create the Filters sub-menu */
{
filters = gtk_menu_item_new_with_mnemonic ("_Filters");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), filters);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
filters_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(filters), filters_menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open_messages);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save_messages);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), separator1);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open_filters);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save_filters);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), separator2);
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
/* Create the Filters menu items */
{
open_filters = gtk_menu_item_new_with_mnemonic ("_Open filters file");
gtk_widget_add_accelerator (open_filters, "activate", accel_group, GDK_KEY_p, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), open_filters);
g_signal_connect(G_OBJECT(open_filters), "activate", G_CALLBACK(ui_callback_on_open_filters), NULL);
/* Create the Help submenu */
helpmenu = gtk_menu_new();
save_filters = gtk_menu_item_new_with_mnemonic ("_Save filters file");
gtk_widget_add_accelerator (save_filters, "activate", accel_group, GDK_KEY_a, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), save_filters);
g_signal_connect(G_OBJECT(save_filters), "activate", G_CALLBACK(ui_callback_on_save_filters), NULL);
help = gtk_menu_item_new_with_label("Help");
about = gtk_menu_item_new_with_label("About");
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator
gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), helpmenu);
enable_filters = gtk_menu_item_new_with_mnemonic ("_Enable filtering");
gtk_widget_add_accelerator (enable_filters, "activate", accel_group, GDK_KEY_e, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), enable_filters);
g_signal_connect(G_OBJECT(enable_filters), "activate", G_CALLBACK(ui_callback_on_enable_filters), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help);
gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu), about);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator
quit = gtk_menu_item_new_with_mnemonic ("_Quit");
gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), quit);
g_signal_connect(G_OBJECT(quit), "activate", G_CALLBACK(gtk_main_quit), NULL);
}
}
/* Create the Messages sub-menu */
{
messages = gtk_menu_item_new_with_mnemonic ("_Messages");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), messages);
messages_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(messages), messages_menu);
/* Crate the Messages menu items */
{
open_messages = gtk_menu_item_new_with_mnemonic ("_Open messages file");
gtk_widget_add_accelerator (open_messages, "activate", accel_group, GDK_KEY_o, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), open_messages);
g_signal_connect(G_OBJECT(open_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
(gpointer) FALSE);
reload_messages = gtk_menu_item_new_with_mnemonic ("_Reload messages file");
gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_r, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_F5, 0, GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), reload_messages);
g_signal_connect(G_OBJECT(reload_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
(gpointer) TRUE);
save_messages = gtk_menu_item_new_with_mnemonic ("_Save messages file");
gtk_widget_add_accelerator (save_messages, "activate", accel_group, GDK_KEY_s, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), save_messages);
g_signal_connect(G_OBJECT(save_messages), "activate", G_CALLBACK(ui_callback_on_save_messages), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
goto_first_messages = gtk_menu_item_new_with_mnemonic ("Go to _first message");
gtk_widget_add_accelerator (goto_first_messages, "activate", accel_group, GDK_KEY_f, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_first_messages);
g_signal_connect(G_OBJECT(goto_first_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_first),
NULL);
goto_messages = gtk_menu_item_new_with_mnemonic ("_Go to message ...");
gtk_widget_add_accelerator (goto_messages, "activate", accel_group, GDK_KEY_g, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_messages);
g_signal_connect(G_OBJECT(goto_messages), "activate", G_CALLBACK(ui_callback_signal_go_to), NULL);
goto_last_messages = gtk_menu_item_new_with_mnemonic ("Go to _last message");
gtk_widget_add_accelerator (goto_last_messages, "activate", accel_group, GDK_KEY_l, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_last_messages);
g_signal_connect(G_OBJECT(goto_last_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_last), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
display_message_header = gtk_menu_item_new_with_mnemonic ("Display message _header");
gtk_widget_add_accelerator (display_message_header, "activate", accel_group, GDK_KEY_h, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_message_header);
g_signal_connect(G_OBJECT(display_message_header), "activate",
G_CALLBACK(ui_callback_display_message_header), NULL);
display_brace = gtk_menu_item_new_with_mnemonic ("Display _brace");
gtk_widget_add_accelerator (display_brace, "activate", accel_group, GDK_KEY_b, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_brace);
g_signal_connect(G_OBJECT(display_brace), "activate", G_CALLBACK(ui_callback_display_brace), NULL);
}
}
/* Create the Help sub-menu */
{
help = gtk_menu_item_new_with_mnemonic ("_Help");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), help);
help_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(help), help_menu);
/* Create the Help menu item */
{
about = gtk_menu_item_new_with_mnemonic ("_About");
gtk_menu_shell_append (GTK_MENU_SHELL(help_menu), about);
g_signal_connect(G_OBJECT(about), "activate", G_CALLBACK(ui_callback_on_about), NULL);
}
}
/* Add the menubar to the vbox */
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);
g_signal_connect(G_OBJECT(open_messages), "activate",
G_CALLBACK(ui_callback_on_open_messages), NULL);
g_signal_connect(G_OBJECT(save_messages), "activate",
G_CALLBACK(ui_callback_on_save_messages), NULL);
g_signal_connect(G_OBJECT(open_filters), "activate",
G_CALLBACK(ui_callback_on_open_filters), NULL);
g_signal_connect(G_OBJECT(save_filters), "activate",
G_CALLBACK(ui_callback_on_save_filters), NULL);
g_signal_connect(G_OBJECT(quit), "activate",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(about), "activate",
G_CALLBACK(ui_callback_on_about), NULL);
gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 3);
return RC_OK;
}
@@ -163,20 +248,6 @@ int ui_toolbar_create(GtkWidget *vbox)
G_CALLBACK(ui_callback_on_save_messages), NULL);
}
#if 0 /* This function is already handled by GTK */
/* Button to go given signal number */
{
ui_main_data.signals_go_to_button = gtk_tool_button_new_from_stock(GTK_STOCK_INDEX);
/* Set the tooltip text */
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.signals_go_to_button), "Goto signal");
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_button), FALSE);
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_button), "clicked",
G_CALLBACK(ui_callback_signal_go_to), NULL);
}
#endif
/* Button to go to first signal in list */
{
ui_main_data.signals_go_to_first_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_FIRST);
@@ -189,6 +260,16 @@ int ui_toolbar_create(GtkWidget *vbox)
G_CALLBACK(ui_callback_signal_go_to_first), NULL);
}
/* Entry to go to given signal number */
{
ui_main_data.signals_go_to_entry = gtk_entry_new ();
gtk_entry_set_width_chars (GTK_ENTRY(ui_main_data.signals_go_to_entry), 10);
// gtk_entry_set_input_purpose (GTK_ENTRY(ui_main_data.signals_go_to_entry), GTK_INPUT_PURPOSE_DIGITS);
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_entry), "activate",
G_CALLBACK(ui_callback_signal_go_to_entry), NULL);
}
/* Button to go to last signal in list */
{
ui_main_data.signals_go_to_last_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_LAST);
@@ -251,6 +332,7 @@ int ui_toolbar_create(GtkWidget *vbox)
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_entry), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
@@ -27,6 +27,11 @@ int ui_notebook_create(GtkWidget *vbox)
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Messages list");
vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Filters");
/* Add the notebook to the vbox of the main window */
gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
@@ -104,6 +104,7 @@ int ui_messages_read(char *filename)
size = st.st_size;
ui_callback_signal_clear_list (NULL, NULL);
ui_main_data.follow_last = TRUE;
/* Initialize the progress bar */
ui_progress_bar_set_fraction(0);
@@ -162,18 +163,20 @@ int ui_messages_read(char *filename)
buffer->message_number = itti_signal_header->message_number;
ui_signal_add_to_list (buffer, NULL);
read_messages++;
ui_signal_add_to_list (buffer, ((read_messages % 100) == 0) ? (gpointer) 1: NULL);
if (read_messages % 100 == 0)
if ((read_messages % 100) == 0)
{
ui_progress_bar_set_fraction(read_fraction);
ui_gtk_flush_events ();
}
read_messages++;
break;
}
case ITTI_DUMP_XML_DEFINITION:
ui_gtk_flush_events ();
xml_parse_buffer (input_data, input_data_length);
ui_gtk_flush_events ();
break;
@@ -197,6 +200,12 @@ int ui_messages_read(char *filename)
/* Enable buttons to move in the list of signals */
ui_set_sensitive_move_buttons (TRUE);
if (ui_main_data.follow_last)
{
/* Advance to the last signal */
ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1);
}
basename = g_path_get_basename(filename);
ui_set_title ("\"%s\"", basename);
}
@@ -51,12 +51,11 @@ int ui_signal_dissect_clear_view(ui_text_view_t *text_view)
if (text_view->text_view != NULL)
{
text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view->text_view));
/* Create an empty text buffer */
text_buffer = gtk_text_buffer_new(NULL);
gtk_text_buffer_set_text(text_buffer, "", 0);
/* If a text buffer is present for the textview remove it */
if (text_buffer != NULL) {
gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), NULL);
}
gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), text_buffer);
}
return RC_OK;
@@ -25,6 +25,8 @@ typedef struct
static ui_store_t ui_store;
GdkEventButton *ui_tree_view_last_event;
static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter, ui_store_t *store)
{
uint32_t msg_number;
@@ -52,6 +54,24 @@ static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter,
return enabled;
}
static gboolean onButtonPressed(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
{
g_debug("onButtonPressed %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
ui_tree_view_last_event = event;
return FALSE;
}
/*
static gboolean onButtonRelease(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
{
g_debug("onButtonRelease %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
// last_event = event;
return FALSE;
}
*/
static void
ui_tree_view_init_list(GtkWidget *list)
{
@@ -176,7 +196,45 @@ void ui_tree_view_destroy_list(GtkWidget *list)
/* Reset number of messages */
ui_main_data.nb_message_received = 0;
ui_main_data.path_last = NULL;
}
/* Search for the message with its message number equal to the given value or the previous one */
static gboolean ui_tree_view_search (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter,
gpointer search_data)
{
uint32_t msg_number;
uint32_t key_value = atoi(key);
gtk_tree_model_get (model, iter, column, &msg_number, -1);
g_debug ("ui_tree_view_search %d %d", key_value, msg_number);
if (key_value == msg_number)
{
/* Value found, use this message */
return 0;
}
{
GtkTreeIter iter_next = *iter;
if (gtk_tree_model_iter_next(model, &iter_next))
{
gtk_tree_model_get (model, &iter_next, column, &msg_number, -1);
if (key_value < msg_number)
{
/* Next value will be greater, use this message */
return 0;
}
}
else
{
/* Last value, use this message */
return 0;
}
}
return 1;
}
int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
@@ -192,6 +250,8 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
ui_main_data.signalslist = gtk_tree_view_new();
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(ui_main_data.signalslist), TRUE);
gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(ui_main_data.signalslist), ui_tree_view_search, NULL, NULL);
gtk_tree_view_set_search_entry (GTK_TREE_VIEW(ui_main_data.signalslist), GTK_ENTRY(ui_main_data.signals_go_to_entry));
/* Disable multiple selection */
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ui_main_data.signalslist));
@@ -210,6 +270,9 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-press-event", G_CALLBACK (onButtonPressed), NULL);
// g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-release-event", G_CALLBACK (onButtonRelease), NULL);
/* Connect callback on row selection */
gtk_tree_selection_set_select_function(selection, ui_callback_on_select_signal,
ui_main_data.text_view, NULL);
@@ -249,20 +312,16 @@ int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_
return RC_OK;
}
void ui_tree_view_select_row(gint row, GtkTreePath **path)
void ui_tree_view_select_row(gint row)
{
GtkTreePath *path_row;
path_row = gtk_tree_path_new_from_indices(row, -1);
/* Select the message in requested row */
gtk_tree_view_set_cursor(GTK_TREE_VIEW(ui_main_data.signalslist), path_row, NULL, FALSE);
/* Center the message in the middle of the list if possible */
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(ui_main_data.signalslist), path_row, NULL, TRUE, 0.5, 0.0);
if (path != NULL)
{
*path = path_row;
}
}
void ui_tree_view_refilter(void)
@@ -18,6 +18,8 @@ typedef enum
NUM_COLS
} col_type_e;
extern GdkEventButton *ui_tree_view_last_event;
int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox);
int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_time,
@@ -28,7 +30,7 @@ int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_
void ui_tree_view_destroy_list(GtkWidget *list);
void ui_tree_view_select_row(gint row, GtkTreePath **path);
void ui_tree_view_select_row(gint row);
void ui_tree_view_refilter(void);