git-svn-id: http://ltt.polymtl.ca/svn@222 04897980-b3bd-0310-b5e0-8ef037075253
[lttv.git] / ltt / branches / poly / lttv / modules / guiEvents.c
index 32da6cbd448e66791ceae9f172b9a4ab912ac73e..6392a3d74cb207618c6d04c26b11ffec3b7a283a 100644 (file)
  *          Integrated to LTTng by Mathieu Desnoyers, June 2003
  */
 
+#include <math.h>
+
 #include <glib.h>
 #include <gmodule.h>
 #include <gtk/gtk.h>
 #include <gdk/gdk.h>
 
 #include <lttv/module.h>
-//#include <lttv/gtkTraceSet.h>
-#include "mw_api.h"
+#include <lttv/hook.h>
+#include <lttv/gtkTraceSet.h>
+//#include "mw_api.h"
+#include "gtktreeprivate.h"
 
 #include "icons/hGuiEventsInsert.xpm"
 
+
 /** Array containing instanced objects. Used when module is unloaded */
 static GSList *sEvent_Viewer_Data_List = NULL ;
 
+
 typedef struct _EventViewerData {
 
+  mainWindow * mw;
        /* Model containing list data */
   GtkListStore *Store_M;
 
@@ -49,7 +56,7 @@ typedef struct _EventViewerData {
   GtkWidget *Tree_V;
   GtkAdjustment *VTree_Adjust_C ;
        GdkWindow *TreeWindow ;
-
+       
        /* Vertical scrollbar and it's adjustment */
        GtkWidget *VScroll_VC;
   GtkAdjustment *VAdjust_C ;
@@ -57,33 +64,42 @@ typedef struct _EventViewerData {
        /* Selection handler */
        GtkTreeSelection *Select_C;
        
-       guint Visible_Events;
+       guint Num_Visible_Events;
+       guint First_Event, Last_Event;
+
+       /* TEST DATA, TO BE READ FROM THE TRACE */
+       gint Number_Of_Events ;
+       guint Currently_Selected_Event  ;
+       gboolean Selected_Event ;
 
 } EventViewerData ;
 
 //! Event Viewer's constructor hook
-GtkWidget *hGuiEvents(GtkWidget *pmParentWindow);
+GtkWidget *hGuiEvents(mainWindow *pmParentWindow);
 //! Event Viewer's constructor
-EventViewerData *GuiEvents(void);
+EventViewerData *GuiEvents(mainWindow *pmParentWindow);
 //! Event Viewer's destructor
 void GuiEvents_Destructor(EventViewerData *Event_Viewer_Data);
 
+static int Event_Selected_Hook(void *hook_data, void *call_data);
+
+void Tree_V_set_cursor(EventViewerData *Event_Viewer_Data);
+void Tree_V_get_cursor(EventViewerData *Event_Viewer_Data);
+
 /* Prototype for selection handler callback */
 static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data);
 static void v_scroll_cb (GtkAdjustment *adjustment, gpointer data);
 static void Tree_V_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data);
 static void Tree_V_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data);
+static void Tree_V_cursor_changed_cb (GtkWidget *widget, gpointer data);
+static void Tree_V_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data);
 
 
-void add_test_data(EventViewerData *Event_Viewer_Data);
 
-/* TEST DATA, TO BE READ FROM THE TRACE */
-static int Number_Of_Events = 1000;
+static void get_test_data(guint Event_Number, guint List_Height, 
+                                                                        EventViewerData *Event_Viewer_Data);
 
-//FIXME: use the size of the widget to get number of rows.
-static int Number_Of_Rows = 50 ;
-//FIXME
-static int Cell_Height = 52;
+void add_test_data(EventViewerData *Event_Viewer_Data);
 
 /**
  * plugin's init function
@@ -95,10 +111,10 @@ G_MODULE_EXPORT void init() {
        g_critical("GUI Event Viewer init()");
 
        /* Register the toolbar insert button */
-       //ToolbarItemReg(hGuiEventsInsert_xpm, "Insert Event Viewer", hGuiEvents);
+       ToolbarItemReg(hGuiEventsInsert_xpm, "Insert Event Viewer", hGuiEvents);
 
        /* Register the menu item insert entry */
-       //MenuItemReg("/", "Insert Event Viewer", hGuiEvents);
+       MenuItemReg("/", "Insert Event Viewer", hGuiEvents);
 }
 
 void destroy_walk(gpointer data, gpointer user_data)
@@ -122,10 +138,10 @@ G_MODULE_EXPORT void destroy() {
        g_slist_foreach(sEvent_Viewer_Data_List, destroy_walk, NULL );
        
        /* Unregister the toolbar insert button */
-       //ToolbarItemUnreg(hGuiEvents);
+       ToolbarItemUnreg(hGuiEvents);
 
        /* Unregister the menu item insert entry */
-       //MenuItemUnreg(hGuiEvents);
+       MenuItemUnreg(hGuiEvents);
 }
 
 /* Enumeration of the columns */
@@ -150,9 +166,9 @@ enum
  * @return The widget created.
  */
 GtkWidget *
-hGuiEvents(GtkWidget *pmParentWindow)
+hGuiEvents(mainWindow * pmParentWindow)
 {
-       EventViewerData* Event_Viewer_Data = GuiEvents() ;
+       EventViewerData* Event_Viewer_Data = GuiEvents(pmParentWindow) ;
 
        return Event_Viewer_Data->HBox_V ;
        
@@ -165,12 +181,21 @@ hGuiEvents(GtkWidget *pmParentWindow)
  * @return The Event viewer data created.
  */
 EventViewerData *
-GuiEvents(void)
+GuiEvents(mainWindow *pmParentWindow)
 {
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer;
        EventViewerData* Event_Viewer_Data = g_new(EventViewerData,1) ;
-       gint width, height;
+
+       Event_Viewer_Data->mw = pmParentWindow;
+       
+       /* TEST DATA, TO BE READ FROM THE TRACE */
+       Event_Viewer_Data->Number_Of_Events = 1000 ;
+       Event_Viewer_Data->Currently_Selected_Event = FALSE  ;
+       Event_Viewer_Data->Selected_Event = 0;
+
+       /* FIXME register Event_Selected_Hook */
+       
        /* Create a model for storing the data list */
   Event_Viewer_Data->Store_M = gtk_list_store_new (N_COLUMNS,       /* Total number of columns */
                                             G_TYPE_INT,      /* CPUID                  */
@@ -182,7 +207,7 @@ GuiEvents(void)
        
        /* Create the viewer widget for the columned list */
        Event_Viewer_Data->Tree_V = gtk_tree_view_new_with_model (GTK_TREE_MODEL (Event_Viewer_Data->Store_M));
-       
+               
        g_signal_connect (G_OBJECT (Event_Viewer_Data->Tree_V), "size-allocate",
                          G_CALLBACK (Tree_V_size_allocate_cb),
                          Event_Viewer_Data);
@@ -190,7 +215,13 @@ GuiEvents(void)
                          G_CALLBACK (Tree_V_size_request_cb),
                          Event_Viewer_Data);
        
+               g_signal_connect (G_OBJECT (Event_Viewer_Data->Tree_V), "cursor-changed",
+                         G_CALLBACK (Tree_V_cursor_changed_cb),
+                         Event_Viewer_Data);
        
+               g_signal_connect (G_OBJECT (Event_Viewer_Data->Tree_V), "move-cursor",
+                         G_CALLBACK (Tree_V_move_cursor_cb),
+                         Event_Viewer_Data);
 // Use on each column!
 //gtk_tree_view_column_set_sizing(Event_Viewer_Data->Tree_V, GTK_TREE_VIEW_COLUMN_FIXED);
        
@@ -256,14 +287,12 @@ GuiEvents(void)
   gtk_tree_view_append_column (GTK_TREE_VIEW (Event_Viewer_Data->Tree_V), column);
 
 
-       gtk_cell_renderer_get_size(renderer, GTK_WIDGET(Event_Viewer_Data->Tree_V), NULL, NULL, NULL, &width, &height);
-       g_critical("first size h : %i",height);
        /* Setup the selection handler */
        Event_Viewer_Data->Select_C = gtk_tree_view_get_selection (GTK_TREE_VIEW (Event_Viewer_Data->Tree_V));
        gtk_tree_selection_set_mode (Event_Viewer_Data->Select_C, GTK_SELECTION_SINGLE);
        g_signal_connect (G_OBJECT (Event_Viewer_Data->Select_C), "changed",
                          G_CALLBACK (tree_selection_changed_cb),
-                         NULL);
+                         Event_Viewer_Data);
        
   Event_Viewer_Data->HBox_V = gtk_hbox_new(0, 0);
   gtk_box_pack_start(GTK_BOX(Event_Viewer_Data->HBox_V), Event_Viewer_Data->Tree_V, TRUE, TRUE, 0);
@@ -282,12 +311,11 @@ GuiEvents(void)
                          Event_Viewer_Data);
        /* Set the upper bound to the last event number */
        Event_Viewer_Data->VAdjust_C->lower = 0;
-       Event_Viewer_Data->VAdjust_C->upper = Number_Of_Events;
+       Event_Viewer_Data->VAdjust_C->upper = Event_Viewer_Data->Number_Of_Events;
        Event_Viewer_Data->VAdjust_C->value = 0;
        Event_Viewer_Data->VAdjust_C->step_increment = 1;
        Event_Viewer_Data->VAdjust_C->page_increment = 
                                 Event_Viewer_Data->VTree_Adjust_C->upper;
-       //FIXME change page size dynamically to fit event list size
        Event_Viewer_Data->VAdjust_C->page_size =
                                 Event_Viewer_Data->VTree_Adjust_C->upper;
        g_critical("value : %u",Event_Viewer_Data->VTree_Adjust_C->upper);
@@ -297,61 +325,421 @@ GuiEvents(void)
   gtk_widget_show(Event_Viewer_Data->VScroll_VC);
 
        /* Add the object's information to the module's array */
-  g_slist_append(sEvent_Viewer_Data_List, Event_Viewer_Data);
+  sEvent_Viewer_Data_List = g_slist_append(sEvent_Viewer_Data_List, Event_Viewer_Data);
+
+       Event_Viewer_Data->First_Event = -1 ;
+       Event_Viewer_Data->Last_Event = 0 ;
+
+       Event_Viewer_Data->Num_Visible_Events = 1;
 
        /* Test data */
-       add_test_data(Event_Viewer_Data);
+       get_test_data((int)Event_Viewer_Data->VAdjust_C->value,
+                                                                        Event_Viewer_Data->Num_Visible_Events, 
+                                                                        Event_Viewer_Data);
 
+       /* Set the Selected Event */
+       Tree_V_set_cursor(Event_Viewer_Data);
+       
        return Event_Viewer_Data;
 }
 
-void v_scroll_cb (GtkAdjustment *adjustment, gpointer data)
+void Tree_V_set_cursor(EventViewerData *Event_Viewer_Data)
 {
-       g_critical("DEBUG : scroll signal");
+       GtkTreePath *path;
 
+       if(Event_Viewer_Data->Selected_Event && Event_Viewer_Data->First_Event != -1)
+       {
+               gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+                                                                                                                Event_Viewer_Data->Currently_Selected_Event);
+               
+               path = gtk_tree_path_new_from_indices(
+                                                               Event_Viewer_Data->Currently_Selected_Event-
+                                                               Event_Viewer_Data->First_Event,
+                                                               -1);
+
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+               gtk_tree_path_free(path);
+       }
 }
 
-void Tree_V_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data)
+void Tree_V_get_cursor(EventViewerData *Event_Viewer_Data)
 {
-       EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+       GtkTreePath *path;
+       gint *indices;
        
-       g_critical("size-allocate");
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), &path, NULL);
+       indices = gtk_tree_path_get_indices(path);
+
+       if(indices != NULL)
+       {
+               Event_Viewer_Data->Selected_Event = TRUE;
+               Event_Viewer_Data->Currently_Selected_Event =
+                                       Event_Viewer_Data->First_Event + indices[0];
+
+       } else {
+               Event_Viewer_Data->Selected_Event = FALSE;
+               Event_Viewer_Data->Currently_Selected_Event = 0;
+       }
+       g_critical("DEBUG : Event Selected : %i , num: %u", Event_Viewer_Data->Selected_Event,  Event_Viewer_Data->Currently_Selected_Event) ;
+
+       gtk_tree_path_free(path);
+
+}
+
+
+
+void Tree_V_move_cursor_cb (GtkWidget *widget, GtkMovementStep arg1, gint arg2, gpointer data)
+{
+       GtkTreePath *path; // = gtk_tree_path_new();
+       gint *indices;
+       gdouble value;
+       EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), &path, NULL);
+       if(path == NULL)
+       {
+               /* No prior cursor, put it at beginning of page and let the execution do */
+               path = gtk_tree_path_new_from_indices(0, -1);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+       }
+               
+       indices = gtk_tree_path_get_indices(path);
+
+       g_critical("DEBUG : move cursor step : %u , int : %i , indice : %i", (guint)arg1, arg2, indices[0]) ;
+
+       value = gtk_adjustment_get_value(Event_Viewer_Data->VAdjust_C);
+
+       if(arg1 == GTK_MOVEMENT_DISPLAY_LINES)
+       {
+               /* Move one line */
+               if(arg2 == 1)
+               {
+                       /* move one line down */
+                       if(indices[0] == Event_Viewer_Data->Num_Visible_Events - 1)
+                       {
+                               if(value + Event_Viewer_Data->Num_Visible_Events <= 
+                                                                                                               Event_Viewer_Data->Number_Of_Events -1)
+                               {
+                                       g_critical("need 1 event down") ;
+                                       Event_Viewer_Data->Currently_Selected_Event += 1;
+                                       gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, value+1);
+                                       //gtk_tree_path_free(path);
+                                       //path = gtk_tree_path_new_from_indices(Event_Viewer_Data->Num_Visible_Events-1, -1);
+                                       //gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+                                       g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
+                               }
+                       }
+               } else {
+                       /* Move one line up */
+                       if(indices[0] == 0)
+                       {
+                               if(value - 1 >= 0 )
+                               {
+                                       g_critical("need 1 event up") ;
+                                       Event_Viewer_Data->Currently_Selected_Event -= 1;
+                                       gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, value-1);
+                                       //gtk_tree_path_free(path);
+                                       //path = gtk_tree_path_new_from_indices(0, -1);
+                                       //gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+                                       g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
+                               }
+               
+                       }
+               }
+
+       }
+
+       if(arg1 == GTK_MOVEMENT_PAGES)
+       {
+               /* Move one page */
+               if(arg2 == 1)
+               {
+                       if(Event_Viewer_Data->Num_Visible_Events == 1)
+                               value += 1 ;
+                       /* move one page down */
+                       if(value + Event_Viewer_Data->Num_Visible_Events-1 <= 
+                                                                                       Event_Viewer_Data->Number_Of_Events )
+                       {
+                               g_critical("need 1 page down") ;
+
+                               Event_Viewer_Data->Currently_Selected_Event += Event_Viewer_Data->Num_Visible_Events-1;
+                               gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+                                                                                                                               value+(Event_Viewer_Data->Num_Visible_Events-1));
+                               //gtk_tree_path_free(path);
+                               //path = gtk_tree_path_new_from_indices(0, -1);
+                               //gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+                               g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
+                       }
+               } else {
+                       /* Move one page up */
+                       if(Event_Viewer_Data->Num_Visible_Events == 1)
+                                       value -= 1 ;
+
+                       if(indices[0] < Event_Viewer_Data->Num_Visible_Events - 2 )
+                       {
+                               if(value - (Event_Viewer_Data->Num_Visible_Events-1) >= 0)
+                               {
+                                       g_critical("need 1 page up") ;
+                                       
+                                       Event_Viewer_Data->Currently_Selected_Event -= Event_Viewer_Data->Num_Visible_Events-1;
+
+                                       gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+                                                                                                                                       value-(Event_Viewer_Data->Num_Visible_Events-1));
+                                       //gtk_tree_path_free(path);
+                                       //path = gtk_tree_path_new_from_indices(0, -1);
+                                       //gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+                                       g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
+
+                               } else {
+                                       /* Go to first Event */
+                                       g_critical("need 1 page up") ;
+
+                                       Event_Viewer_Data->Currently_Selected_Event == 0 ;
+                                       gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+                                                                                                                                       0);
+                                       //gtk_tree_path_free(path);
+                                       //path = gtk_tree_path_new_from_indices(0, -1);
+                                       //gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+                                       g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
+
+                               }
+                       }
+                       
+               }
+
+       }
+
+       if(arg1 == GTK_MOVEMENT_BUFFER_ENDS)
+       {
+               /* Move to the ends of the buffer */
+               if(arg2 == 1)
+               {
+                       /* move end of buffer */
+                       g_critical("End of buffer") ;
+                       Event_Viewer_Data->Currently_Selected_Event = Event_Viewer_Data->Number_Of_Events-1 ;
+                       gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, 
+                                       Event_Viewer_Data->Number_Of_Events -
+                                               Event_Viewer_Data->Num_Visible_Events);
+                       //gtk_tree_path_free(path);
+                       //path = gtk_tree_path_new_from_indices(Event_Viewer_Data->Num_Visible_Events-1, -1);
+                       //gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+                       g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
+               } else {
+                       /* Move beginning of buffer */
+                       g_critical("Beginning of buffer") ;
+                       Event_Viewer_Data->Currently_Selected_Event = 0 ;
+                       gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, 0);
+                       //gtk_tree_path_free(path);
+                       //path = gtk_tree_path_new_from_indices(0, -1);
+                       //gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
+                       g_signal_stop_emission_by_name(G_OBJECT(widget), "move-cursor");
+               }
+
+       }
+
+
+       gtk_tree_path_free(path);
+}
+
+void Tree_V_cursor_changed_cb (GtkWidget *widget, gpointer data)
+{
+       EventViewerData *Event_Viewer_Data = (EventViewerData*) data;
+
+       g_critical("DEBUG : cursor change");
+       /* On cursor change, modify the currently selected event by calling
+        * the right API function */
+       Tree_V_get_cursor(Event_Viewer_Data);
+}
+
+
+void v_scroll_cb (GtkAdjustment *adjustment, gpointer data)
+{
+       EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+       GtkTreePath *Tree_Path;
 
-       Event_Viewer_Data->Visible_Events = alloc->y ;
-       g_critical("num of event shown : %u",Event_Viewer_Data->Visible_Events);
+       g_critical("DEBUG : scroll signal, value : %f", adjustment->value);
        
+       get_test_data((int)adjustment->value, Event_Viewer_Data->Num_Visible_Events, 
+                                                                        Event_Viewer_Data);
        
+       
+       if(Event_Viewer_Data->Currently_Selected_Event
+                                                               >= Event_Viewer_Data->First_Event
+                                                               &&
+                Event_Viewer_Data->Currently_Selected_Event
+                                                               <= Event_Viewer_Data->Last_Event
+                                                               &&
+                Event_Viewer_Data->Selected_Event)
+       {
+
+               Tree_Path = gtk_tree_path_new_from_indices(
+                                                               Event_Viewer_Data->Currently_Selected_Event-
+                                                               Event_Viewer_Data->First_Event,
+                                                               -1);
+
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), Tree_Path,
+                                                                                                                               NULL, FALSE);
+               gtk_tree_path_free(Tree_Path);
+       }
+
+
 }
 
-void Tree_V_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data)
+gint get_cell_height(GtkTreeView *TreeView)
 {
-       gint w, h;
        gint height, width;
-
-       EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
-       GtkTreeViewColumn *Column = gtk_tree_view_get_column(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), 1);
+       GtkTreeViewColumn *Column = gtk_tree_view_get_column(TreeView, 0);
        GList *Render_List = gtk_tree_view_column_get_cell_renderers(Column);
        GtkCellRenderer *Renderer = g_list_first(Render_List)->data;
        
-       g_critical("size-request");
+       gtk_tree_view_column_cell_get_size(Column, NULL, NULL, NULL, NULL, &height);
+       g_critical("cell 0 height : %u",height);
+       
+       return height;
+}
+
+void Tree_V_size_allocate_cb (GtkWidget *widget, GtkAllocation *alloc, gpointer data)
+{
+       EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+       gint Cell_Height = get_cell_height(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V));
+       gint Last_Num_Visible_Events = Event_Viewer_Data->Num_Visible_Events;
+       gdouble Exact_Num_Visible;
+       
+       g_critical("size-allocate");
+
+       Exact_Num_Visible = ( alloc->height -
+                       TREE_VIEW_HEADER_HEIGHT (GTK_TREE_VIEW(Event_Viewer_Data->Tree_V)) )
+                               / (double)Cell_Height ;
 
-       //gtk_tree_view_column_cell_get_size(Column, NULL, NULL, NULL, &width, &height);
-       //h = height;
-       //gtk_cell_renderer_get_size(Renderer, GTK_WIDGET(Event_Viewer_Data->Tree_V), NULL, NULL, NULL, &width, &height);
-       //h += height;
-       //gtk_cell_renderer_get_fixed_size(Renderer,w,h);
+       Event_Viewer_Data->Num_Visible_Events = ceil(Exact_Num_Visible) ;
 
-       gtk_tree_view_tree_to_widget_coords(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V),
-                               1,1,&width, &height);
-       w = width;
-       h = height;
-       //requisition->height = Cell_Height;
-       requisition->height = 46;
-       g_critical("width : %i height : %i", w, h); 
+       g_critical("number of events shown : %u",Event_Viewer_Data->Num_Visible_Events);
+       g_critical("ex number of events shown : %f",Exact_Num_Visible);
+
+       Event_Viewer_Data->VAdjust_C->page_increment = 
+                                floor(Exact_Num_Visible);
+       Event_Viewer_Data->VAdjust_C->page_size =
+                                floor(Exact_Num_Visible);
+
+       if(Event_Viewer_Data->Num_Visible_Events != Last_Num_Visible_Events)
+       {
+               get_test_data((int)Event_Viewer_Data->VAdjust_C->value,
+                                                                                Event_Viewer_Data->Num_Visible_Events, 
+                                                                                Event_Viewer_Data);
+       }
+
+
+}
+
+void Tree_V_size_request_cb (GtkWidget *widget, GtkRequisition *requisition, gpointer data)
+{
+       gint h;
+       EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
+       gint Cell_Height = get_cell_height(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V));
        
+       g_critical("size-request");
+
+       h = Cell_Height + TREE_VIEW_HEADER_HEIGHT
+                                                                                       (GTK_TREE_VIEW(Event_Viewer_Data->Tree_V));
+       requisition->height = h;
        
 }
 
+void get_test_data(guint Event_Number, guint List_Height, 
+                                                                        EventViewerData *Event_Viewer_Data)
+{
+       GtkTreeIter iter;
+       int i;
+       GtkTreeModel *model = GTK_TREE_MODEL(Event_Viewer_Data->Store_M);
+       GtkTreePath *Tree_Path;
+       gchar *test_string;
+
+//     if(Event_Number > Event_Viewer_Data->Last_Event ||
+//              Event_Number + List_Height-1 < Event_Viewer_Data->First_Event ||
+//              Event_Viewer_Data->First_Event == -1)
+       {
+               /* no event can be reused, clear and start from nothing */
+               gtk_list_store_clear(Event_Viewer_Data->Store_M);
+               for(i=Event_Number; i<Event_Number+List_Height; i++)
+               {
+                       if(i>=Event_Viewer_Data->Number_Of_Events) break;
+                 /* Add a new row to the model */
+                       gtk_list_store_append (Event_Viewer_Data->Store_M, &iter);
+                       gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+                                                                                                       CPUID_COLUMN, 0,
+                                                                                               EVENT_COLUMN, "event irq",
+                                                                                                 TIME_COLUMN, i,
+                                                                                                 PID_COLUMN, 100,
+                                                                                                 ENTRY_LEN_COLUMN, 17,
+                                                                                                 EVENT_DESCR_COLUMN, "Detailed information",
+                                                                                                       -1);
+               }
+       }
+#ifdef DEBUG //do not use this, it's slower and broken
+//     } else {
+               /* Some events will be reused */
+               if(Event_Number < Event_Viewer_Data->First_Event)
+               {
+                       /* scrolling up, prepend events */
+                       Tree_Path = gtk_tree_path_new_from_indices
+                                                                               (Event_Number+List_Height-1 -
+                                                                                Event_Viewer_Data->First_Event + 1,
+                                                                                -1);
+                       for(i=0; i<Event_Viewer_Data->Last_Event-(Event_Number+List_Height-1);
+                                                                                                                                                               i++)
+                       {
+                               /* Remove the last events from the list */
+                               if(gtk_tree_model_get_iter(model, &iter, Tree_Path))
+                                       gtk_list_store_remove(Event_Viewer_Data->Store_M, &iter);
+                       }
+
+                       for(i=Event_Viewer_Data->First_Event-1; i>=Event_Number; i--)
+                       {
+                               if(i>=Event_Viewer_Data->Number_Of_Events) break;
+                               /* Prepend new events */
+                               gtk_list_store_prepend (Event_Viewer_Data->Store_M, &iter);
+                               gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+                                                                                                               CPUID_COLUMN, 0,
+                                                                                                       EVENT_COLUMN, "event irq",
+                                                                                                         TIME_COLUMN, i,
+                                                                                                         PID_COLUMN, 100,
+                                                                                                         ENTRY_LEN_COLUMN, 17,
+                                                                                                         EVENT_DESCR_COLUMN, "Detailed information",
+                                                                                                               -1);
+                       }
+               } else {
+                       /* Scrolling down, append events */
+                       for(i=Event_Viewer_Data->First_Event; i<Event_Number; i++)
+                       {
+                               /* Remove these events from the list */
+                               gtk_tree_model_get_iter_first(model, &iter);
+                               gtk_list_store_remove(Event_Viewer_Data->Store_M, &iter);
+                       }
+                       for(i=Event_Viewer_Data->Last_Event+1; i<Event_Number+List_Height; i++)
+                       {
+                               if(i>=Event_Viewer_Data->Number_Of_Events) break;
+                               /* Append new events */
+                               gtk_list_store_append (Event_Viewer_Data->Store_M, &iter);
+                               gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+                                                                                                               CPUID_COLUMN, 0,
+                                                                                                       EVENT_COLUMN, "event irq",
+                                                                                                         TIME_COLUMN, i,
+                                                                                                         PID_COLUMN, 100,
+                                                                                                         ENTRY_LEN_COLUMN, 17,
+                                                                                                         EVENT_DESCR_COLUMN, "Detailed information",
+                                                                                                               -1);
+                       }
+
+               }
+       }
+#endif //DEBUG
+       Event_Viewer_Data->First_Event = Event_Number ;
+       Event_Viewer_Data->Last_Event = Event_Number+List_Height-1 ;
+       
+
+
+}
+       
 
 void add_test_data(EventViewerData *Event_Viewer_Data)
 {
@@ -392,6 +780,7 @@ GuiEvents_Destructor(EventViewerData *Event_Viewer_Data)
        //gtk_widget_destroy(GTK_WIDGET(Event_Viewer_Data->Store_M));
 
        g_slist_remove(sEvent_Viewer_Data_List,Event_Viewer_Data);
+       g_free(Event_Viewer_Data);
 }
 
 //FIXME : call hGuiEvents_Destructor for corresponding data upon widget destroy
@@ -399,8 +788,9 @@ GuiEvents_Destructor(EventViewerData *Event_Viewer_Data)
 static void
 tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data)
 {
+                               EventViewerData *Event_Viewer_Data = (EventViewerData*)data;
         GtkTreeIter iter;
-        GtkTreeModel *model;
+                               GtkTreeModel *model = GTK_TREE_MODEL(Event_Viewer_Data->Store_M);
         gchar *Event;
 
         if (gtk_tree_selection_get_selected (selection, &model, &iter))
@@ -414,6 +804,25 @@ tree_selection_changed_cb (GtkTreeSelection *selection, gpointer data)
 }
 
 
+/* it will be registered and called by the main window */
+int Event_Selected_Hook(void *hook_data, void *call_data)
+{
+       EventViewerData *Event_Viewer_Data = (EventViewerData*) hook_data;
+       guint *Event_Number = (guint*) call_data;
+
+       g_critical("DEBUG : event selected by main window : %u", *Event_Number);
+       
+       Event_Viewer_Data->Currently_Selected_Event = *Event_Number;
+       Event_Viewer_Data->Selected_Event = TRUE ;
+       
+       Tree_V_set_cursor(Event_Viewer_Data);
+
+}
+
+
+
+
+
 
 
 /* Imported code from LTT 0.9.6pre2 tracevisualizer */
@@ -778,18 +1187,19 @@ static void destroy_cb( GtkWidget *widget,
 }
 
 
-
+/*
 int main(int argc, char **argv)
 {
        GtkWidget *Window;
        GtkWidget *ListViewer;
        GtkWidget *VBox_V;
        EventViewerData *Event_Viewer_Data;
-
-       /* Initialize i18n support */
+       guint ev_sel = 444 ;
+       
+       // Initialize i18n support 
   gtk_set_locale ();
 
-  /* Initialize the widget set */
+  // Initialize the widget set 
   gtk_init (&argc, &argv);
 
        init();
@@ -804,15 +1214,21 @@ int main(int argc, char **argv)
   VBox_V = gtk_vbox_new(0, 0);
        gtk_container_add (GTK_CONTAINER (Window), VBox_V);
 
-  ListViewer = hGuiEvents(Window);
-  gtk_box_pack_start(GTK_BOX(VBox_V), ListViewer, TRUE, TRUE, 0);
-
-  ListViewer = hGuiEvents(Window);
-  gtk_box_pack_start(GTK_BOX(VBox_V), ListViewer, FALSE, TRUE, 0);
+   //ListViewer = hGuiEvents(Window);
+  //gtk_box_pack_start(GTK_BOX(VBox_V), ListViewer, TRUE, TRUE, 0);
 
+  //ListViewer = hGuiEvents(Window);
+  //gtk_box_pack_start(GTK_BOX(VBox_V), ListViewer, FALSE, TRUE, 0);
+       
+       Event_Viewer_Data = GuiEvents(g_new(mainWindow,1));
+       ListViewer = Event_Viewer_Data->HBox_V;
+       gtk_box_pack_start(GTK_BOX(VBox_V), ListViewer, TRUE, TRUE, 0);
+       
   gtk_widget_show (VBox_V);
        gtk_widget_show (Window);
 
+       //      Event_Selected_Hook(Event_Viewer_Data, &ev_sel);
+       
        gtk_main ();
 
        g_critical("main loop finished");
@@ -824,7 +1240,7 @@ int main(int argc, char **argv)
        
        return 0;
 }
-
+*/
 
 /*\@}*/
 
This page took 0.032868 seconds and 4 git commands to generate.