Enable support for opening multiple trace
[lttv.git] / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index 0b5756e9a2d318ba609e9d5f889737deb7eb47e2..b5f416b2b909f8e4d66a18eee1cdfd111859f534 100644 (file)
 #include <lttv/lttv.h>
 #include <lttv/module.h>
 #include <lttv/iattribute.h>
+#include <lttv/traceset.h>
+#include <lttv/state.h>
+#ifdef BABEL_CLEANUP
 #include <lttv/stats.h>
+#include <lttv/sync/sync_chain_lttv.h>
+#endif /* BABEL_CLEANUP */
 #include <lttv/filter.h>
 #include <lttvwindow/mainwindow.h>
 #include <lttvwindow/mainwindow-private.h>
 #include <lttvwindow/menu.h>
+#include <lttvwindow/timebar.h>
 #include <lttvwindow/toolbar.h>
 #include <lttvwindow/lttvwindow.h>
 #include <lttvwindow/lttvwindowtraces.h>
 #include <lttvwindow/lttv_plugin_tab.h>
 
+#include <babeltrace/babeltrace.h>
+#include <babeltrace/ctf/events.h>
+#include <babeltrace/ctf/iterator.h>
+
 static LttTime lttvwindow_default_time_width = { 1, 0 };
 #define CLIP_BUF 256 // size of clipboard buffer
 
@@ -73,12 +83,21 @@ char * get_selection(MainWindow *mw,
 void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
                  GtkNotebook * notebook, char * label);
 
+int update_traceset(Tab *tab, LttvTraceset *traceset);
+
 static void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor);
 
 LttvPluginTab *create_new_tab(GtkWidget* widget, gpointer user_data);
 
 static gboolean lttvwindow_process_pending_requests(Tab *tab);
 
+static void on_timebar_starttime_changed(Timebar *timebar,
+                               gpointer user_data);
+static void on_timebar_endtime_changed(Timebar *timebar,
+                               gpointer user_data);
+static void on_timebar_currenttime_changed(Timebar *timebar,
+                               gpointer user_data);
+
 enum {
   CHECKBOX_COLUMN,
   NAME_COLUMN,
@@ -91,262 +110,6 @@ enum
   N_COLUMNS
 };
 
-/* Pasting routines */
-
-static void MEventBox1a_receive(GtkClipboard *clipboard,
-                          const gchar *text,
-                          gpointer data)
-{
-  if(text == NULL) return;
-  Tab *tab = (Tab *)data;
-  gchar buffer[CLIP_BUF];
-  gchar *ptr = buffer, *ptr_ssec, *ptr_snsec, *ptr_esec, *ptr_ensec;
-
-  strncpy(buffer, text, CLIP_BUF);
-  /* start */
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_ssec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-  ptr++;
-
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_snsec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-
-  /* end */ 
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_esec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-  ptr++;
-
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_ensec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry1),
-                            (double)strtoul(ptr_ssec, NULL, 10));
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry2),
-                            (double)strtoul(ptr_snsec, NULL, 10));
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry3),
-                            (double)strtoul(ptr_esec, NULL, 10));
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry4),
-                            (double)strtoul(ptr_ensec, NULL, 10));
-}
-
-static gboolean on_MEventBox1a_paste(GtkWidget *widget, GdkEventButton *event,
-                                gpointer data)
-{
-  Tab *tab = (Tab*)data;
-
-  GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(),
-                                                     GDK_SELECTION_PRIMARY);
-  gtk_clipboard_request_text(clip,
-                             (GtkClipboardTextReceivedFunc)MEventBox1a_receive,
-                             (gpointer)tab);
-  return 0;
-}
-
-
-/* Start */
-static void MEventBox1b_receive(GtkClipboard *clipboard,
-                          const gchar *text,
-                          gpointer data)
-{
-  if(text == NULL) return;
-  Tab *tab = (Tab *)data;
-  gchar buffer[CLIP_BUF];
-  gchar *ptr = buffer, *ptr_sec, *ptr_nsec;
-
-  strncpy(buffer, text, CLIP_BUF);
-  
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_sec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-  ptr++;
-
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_nsec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry1),
-                            (double)strtoul(ptr_sec, NULL, 10));
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry2),
-                            (double)strtoul(ptr_nsec, NULL, 10));
-}
-
-/* Start */
-static gboolean on_MEventBox1b_paste(GtkWidget *widget, GdkEventButton *event,
-                                gpointer data)
-{
-  Tab *tab = (Tab*)data;
-
-  GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(),
-                                                     GDK_SELECTION_PRIMARY);
-  gtk_clipboard_request_text(clip,
-                             (GtkClipboardTextReceivedFunc)MEventBox1b_receive,
-                             (gpointer)tab);
-  return 0;
-}
-
-/* End */
-static void MEventBox3b_receive(GtkClipboard *clipboard,
-                          const gchar *text,
-                          gpointer data)
-{
-  if(text == NULL) return;
-  Tab *tab = (Tab *)data;
-  gchar buffer[CLIP_BUF];
-  gchar *ptr = buffer, *ptr_sec, *ptr_nsec;
-
-  strncpy(buffer, text, CLIP_BUF);
-  
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_sec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-  ptr++;
-
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_nsec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry3),
-                            (double)strtoul(ptr_sec, NULL, 10));
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry4),
-                            (double)strtoul(ptr_nsec, NULL, 10));
-}
-
-/* End */
-static gboolean on_MEventBox3b_paste(GtkWidget *widget, GdkEventButton *event,
-                                gpointer data)
-{
-  Tab *tab = (Tab*)data;
-
-  GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(),
-                                                     GDK_SELECTION_PRIMARY);
-  gtk_clipboard_request_text(clip,
-                             (GtkClipboardTextReceivedFunc)MEventBox3b_receive,
-                             (gpointer)tab);
-  return 0;
-}
-
-/* Current */
-static void MEventBox5b_receive(GtkClipboard *clipboard,
-                          const gchar *text,
-                          gpointer data)
-{
-  if(text == NULL) return;
-  Tab *tab = (Tab *)data;
-  gchar buffer[CLIP_BUF];
-  gchar *ptr = buffer, *ptr_sec, *ptr_nsec;
-
-  strncpy(buffer, text, CLIP_BUF);
-  
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_sec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-  ptr++;
-
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_nsec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry5),
-                            (double)strtoul(ptr_sec, NULL, 10));
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry6),
-                            (double)strtoul(ptr_nsec, NULL, 10));
-}
-
-/* Current */
-static gboolean on_MEventBox5b_paste(GtkWidget *widget, GdkEventButton *event,
-                                gpointer data)
-{
-  Tab *tab = (Tab*)data;
-
-  GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(),
-                                                     GDK_SELECTION_PRIMARY);
-  gtk_clipboard_request_text(clip,
-                             (GtkClipboardTextReceivedFunc)MEventBox5b_receive,
-                             (gpointer)tab);
-  return 0;
-}
-
-/* Interval */
-static void MEventBox8_receive(GtkClipboard *clipboard,
-                          const gchar *text,
-                          gpointer data)
-{
-  if(text == NULL) return;
-  Tab *tab = (Tab *)data;
-  gchar buffer[CLIP_BUF];
-  gchar *ptr = buffer, *ptr_sec, *ptr_nsec;
-
-  strncpy(buffer, text, CLIP_BUF);
-  
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_sec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-  ptr++;
-
-  while(!isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                       /* remove leading junk */
-  ptr_nsec = ptr;
-  while(isdigit(*ptr) && ptr < buffer+CLIP_BUF-1) ptr++;
-                                                 /* read all the first number */
-  *ptr = '\0';
-
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry7),
-                            (double)strtoul(ptr_sec, NULL, 10));
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry8),
-                            (double)strtoul(ptr_nsec, NULL, 10));
-}
-
-/* Interval */
-static gboolean on_MEventBox8_paste(GtkWidget *widget, GdkEventButton *event,
-                                gpointer data)
-{
-  Tab *tab = (Tab*)data;
-
-  GtkClipboard *clip = gtk_clipboard_get_for_display(gdk_display_get_default(),
-                                                     GDK_SELECTION_PRIMARY);
-  gtk_clipboard_request_text(clip,
-                             (GtkClipboardTextReceivedFunc)MEventBox8_receive,
-                             (gpointer)tab);
-  return 0;
-}
 
 #if 0
 static void on_top_notify(GObject    *gobject,
@@ -417,10 +180,8 @@ insert_viewer_wrap(GtkWidget *menuitem, gpointer user_data)
 void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
 {
   GtkWidget * viewer_container;
-  MainWindow * mw_data = get_window_data_struct(widget);
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
   GtkWidget * viewer;
-  TimeInterval * time_interval;
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
                       gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
   LttvPluginTab *ptab;
@@ -435,7 +196,7 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
 
   viewer_container = tab->viewer_container;
 
-  viewer = (GtkWidget*)constructor(ptab);
+  viewer = (GtkWidget*)constructor(&ptab->parent);
   if(viewer)
   {
     //gtk_multivpaned_widget_add(GTK_MULTIVPANED(multivpaned), viewer); 
@@ -465,12 +226,70 @@ void insert_viewer(GtkWidget* widget, lttvwindow_viewer_constructor constructor)
 
 int SetTraceset(Tab * tab, LttvTraceset *traceset)
 {
-  LttvTracesetContext *tsc =
-        LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  TimeWindow new_time_window = tab->time_window;
-  LttTime new_current_time = tab->current_time;
+  
+  TimeInterval time_span;
+  TimeWindow new_time_window;
+  LttTime new_current_time;
 
+#ifdef BABEL_CLEANUP
+  // Perform time synchronization on the traces
+  if (syncTraceset(tsc))
+  {
+    /* There is some time-dependant information that was calculated during
+     * context initialization. Destroy the old contexts and initialize new
+     * ones.
+     * Modified from lttvwindow_add_trace()
+    */
+    // Keep a reference to the traces so they are not freed
+    for(i = 0; i < lttv_traceset_number(traceset); i++)
+    {
+      LttvTrace *trace = lttv_traceset_get(traceset, i);
+      lttv_trace_ref(trace);
+    }
+
+    // Remove state update hooks
+    lttv_state_remove_event_hooks(
+      (LttvTracesetState*)tab->traceset_info->traceset_context);
+
+    lttv_context_fini(LTTV_TRACESET_CONTEXT(
+        tab->traceset_info->traceset_context));
+    g_object_unref(tab->traceset_info->traceset_context);
+
+    for(i = 0; i < lttv_traceset_number(traceset); i++)
+    {
+      LttvTrace *trace = lttv_traceset_get(traceset, i);
+      lttvwindowtraces_remove_trace(trace);
+      lttvwindowtraces_add_trace(trace);
+    }
+
+    // Create new context
+    tab->traceset_info->traceset_context =
+      g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
+    lttv_context_init(LTTV_TRACESET_CONTEXT(tab->traceset_info->
+        traceset_context), traceset);
+
+    // Add state update hooks
+    lttv_state_add_event_hooks(
+      (LttvTracesetState*)tab->traceset_info->traceset_context);
+
+    // Remove local reference to the traces
+    for(i=0; i<lttv_traceset_number(traceset); i++)
+    {
+      LttvTrace *trace = lttv_traceset_get(traceset, i);
+      lttv_trace_unref(trace);
+    }
+
+    tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
+  }
+#endif /*BABEL_CLEANUP*/
+
+  time_span = lttv_traceset_get_time_span_real(traceset);
+  
+  tab->traceset_info->traceset = traceset;
+  
+  new_time_window = tab->time_window;
+  new_current_time = tab->current_time;        
   /* Set the tab's time window and current time if
    * out of bounds */
   if(ltt_time_compare(tab->time_window.start_time, time_span.start_time) < 0
@@ -495,75 +314,54 @@ int SetTraceset(Tab * tab, LttvTraceset *traceset)
     new_time_window.end_time = ltt_time_add(new_time_window.start_time,
                                             new_time_window.time_width) ;
   }
+  lttv_state_add_event_hooks(traceset);
 
-#if 0
-  /* Set scrollbar */
-  GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar));
-  LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time);
+  //TODO ybrosseau 2012-08-03 Temporarly compute checkpoints right at the adding
+  // of the traceset
+  //Compute the traceset state checkpoint 
+  {
+    
+    EventsRequest *events_request = g_new(EventsRequest, 1);
+       
+    LttvHooks *hook_adder = lttv_hooks_new();
+    lttv_hooks_add(hook_adder, lttv_state_save_hook_add_event_hooks, NULL,
+                   LTTV_PRIO_DEFAULT);
+    LttvHooks *hook_remover = lttv_hooks_new();
+    lttv_hooks_add(hook_remover, lttv_state_save_hook_remove_event_hooks,
+                  NULL, LTTV_PRIO_DEFAULT);
       
-  g_object_set(G_OBJECT(adjustment),
-               "lower",
-                 0.0, /* lower */
-               "upper",
-               ltt_time_to_double(upper) 
-                 * NANOSECONDS_PER_SECOND, /* upper */
-               "step_increment",
-               ltt_time_to_double(tab->time_window.time_width)
-                             / SCROLL_STEP_PER_PAGE
-                             * NANOSECONDS_PER_SECOND, /* step increment */
-               "page_increment",
-               ltt_time_to_double(tab->time_window.time_width) 
-                 * NANOSECONDS_PER_SECOND, /* page increment */
-               "page_size",
-               ltt_time_to_double(tab->time_window.time_width) 
-                 * NANOSECONDS_PER_SECOND, /* page size */
-               NULL);
-  gtk_adjustment_changed(adjustment);
-
-  g_object_set(G_OBJECT(adjustment),
-               "value",
-               ltt_time_to_double(
-                ltt_time_sub(tab->time_window.start_time, time_span.start_time))
-                   * NANOSECONDS_PER_SECOND, /* value */
-               NULL);
-  gtk_adjustment_value_changed(adjustment);
-
-  /* set the time bar. The value callbacks will change their nsec themself */
-  /* start seconds */
-  gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry1),
-                            (double)time_span.start_time.tv_sec,
-                            (double)time_span.end_time.tv_sec);
-
-  /* end seconds */
-  gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry3),
-                            (double)time_span.start_time.tv_sec,
-                            (double)time_span.end_time.tv_sec);
-
-   /* current seconds */
-  gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry5),
-                            (double)time_span.start_time.tv_sec,
-                            (double)time_span.end_time.tv_sec);
-#endif //0
+    // Fill the events request
+    events_request->owner = NULL;
+    events_request->viewer_data = NULL;
+    events_request->servicing = FALSE;
+    events_request->start_time = ltt_time_zero;
+    events_request->start_position = NULL;
+    events_request->stop_flag = FALSE;
+    events_request->end_time = ltt_time_infinite;
+    events_request->num_events = G_MAXUINT;
+    events_request->end_position = NULL;
+    events_request->trace = 1; //fixed    /* FIXME */
+    events_request->before_chunk_traceset = NULL;
+    events_request->before_chunk_trace = NULL;
+    events_request->before_chunk_tracefile = NULL;
+    events_request->event = NULL;
+    events_request->after_chunk_tracefile = NULL;
+    events_request->after_chunk_trace = NULL;
+    events_request->after_chunk_traceset = NULL;
+    events_request->before_request = hook_adder;
+    events_request->after_request = hook_remover;
+      
+    lttvwindow_events_request(tab, events_request);
+  }
   
   /* Finally, call the update hooks of the viewers */
-  LttvHooks * tmp;
-  LttvAttributeValue value;
-  gint retval = 0;
-
-  g_assert( lttv_iattribute_find_by_path(tab->attributes,
-     "hooks/updatetraceset", LTTV_POINTER, &value));
-
-  tmp = (LttvHooks*)*(value.v_pointer);
-  if(tmp == NULL) retval = 1;
-  else lttv_hooks_call(tmp,traceset);
+  gint retval = update_traceset(tab, traceset);
 
   time_change_manager(tab, new_time_window);
   current_time_change_manager(tab, new_current_time);
 
   return retval;
+  
 }
 
 /**
@@ -599,17 +397,48 @@ int SetFilter(Tab * tab, gpointer filter)
  * @param tab viewer's tab 
  */
 
-void update_traceset(Tab *tab)
+int update_traceset(Tab *tab, LttvTraceset *traceset)
 {
   LttvAttributeValue value;
   LttvHooks * tmp;
-  g_assert(lttv_iattribute_find_by_path(tab->attributes,
-           "hooks/updatetraceset", LTTV_POINTER, &value));
+  gboolean retval;
+
+  retval= lttv_iattribute_find_by_path(tab->attributes,
+                                 "hooks/updatetraceset", 
+                                 LTTV_POINTER, 
+                                 &value);
+  g_assert(retval);
   tmp = (LttvHooks*)*(value.v_pointer);
-  if(tmp == NULL) return;
-  lttv_hooks_call(tmp, NULL);
+  if(tmp == NULL) {
+         retval = 1;
+  } else {
+         lttv_hooks_call(tmp, traceset);
+  }
+  return retval;
 }
 
+/** 
+    Call hooks register to get update on traceset time span changes
+*/
+int notify_time_span_changed(Tab *tab)
+{
+  LttvAttributeValue value;
+  LttvHooks * tmp;
+  gboolean retval;
+
+  retval= lttv_iattribute_find_by_path(tab->attributes,
+                                 "hooks/updatetimespan", 
+                                 LTTV_POINTER, 
+                                 &value);
+  g_assert(retval);
+  tmp = (LttvHooks*)*(value.v_pointer);
+  if(tmp == NULL) {
+         retval = 1;
+  } else {
+         lttv_hooks_call(tmp, NULL);
+  }
+  return retval;
+}
 
 /* get_label function is used to get user input, it displays an input
  * box, which allows user to input a string 
@@ -753,7 +582,6 @@ gint viewer_container_position(GtkWidget *container, GtkWidget *child)
 
 void move_down_viewer(GtkWidget * widget, gpointer user_data)
 {
-  MainWindow * mw = get_window_data_struct(widget);
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
 
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
@@ -787,7 +615,6 @@ void move_down_viewer(GtkWidget * widget, gpointer user_data)
 
 void move_up_viewer(GtkWidget * widget, gpointer user_data)
 {
-  MainWindow * mw = get_window_data_struct(widget);
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
 
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
@@ -828,7 +655,6 @@ void move_up_viewer(GtkWidget * widget, gpointer user_data)
 
 void delete_viewer(GtkWidget * widget, gpointer user_data)
 {
-  MainWindow * mw = get_window_data_struct(widget);
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
 
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
@@ -853,7 +679,8 @@ void delete_viewer(GtkWidget * widget, gpointer user_data)
   g_object_set_data(G_OBJECT(tab->viewer_container), "focused_viewer", NULL);
 }
 
-
+#if UNFINISHED_FEATURE
+/* TODO ybrosseau 2012-03-15: Function is half implemented. Should be removed */
 /* open_traceset will open a traceset saved in a file
  * Right now, it is not finished yet, (not working)
  * FIXME
@@ -890,7 +717,7 @@ void open_traceset(GtkWidget * widget, gpointer user_data)
   }
 
 }
-
+#endif
 /* lttvwindow_process_pending_requests
  *
  * Process requests for parts of the trace from viewers.
@@ -922,14 +749,14 @@ void open_traceset(GtkWidget * widget, gpointer user_data)
 
 gboolean lttvwindow_process_pending_requests(Tab *tab)
 {
-  GtkWidget* widget;
-  LttvTracesetContext *tsc;
-  LttvTracefileContext *tfc;
+
+  LttvTraceset *ts;
+
   GSList *list_in = NULL;
   LttTime end_time;
   guint end_nb_events;
   guint count;
-  LttvTracesetContextPosition *end_position;
+  LttvTracesetPosition *end_position;
   
   if(lttvwindow_preempt_count > 0) return TRUE;
   
@@ -941,7 +768,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
   /* There is no events requests pending : we should never have been called! */
   g_assert(g_slist_length(list_out) != 0);
 
-  tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
+  ts = tab->traceset_info->traceset;
 
   //set the cursor to be X shape, indicating that the computer is busy in doing its job
 #if 0
@@ -958,7 +785,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
   
   /* Preliminary check for no trace in traceset */
   /* Unregister the routine if empty, empty list_out too */
-  if(lttv_traceset_number(tsc->ts) == 0) {
+  if(lttv_traceset_number(ts) == 0) {
 
     /* - For each req in list_out */
     GSList *iter = list_out;
@@ -971,13 +798,13 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
       
       /* - Call end request for req */
       if(events_request->servicing == TRUE)
-        lttv_hooks_call(events_request->after_request, (gpointer)tsc);
+        lttv_hooks_call(events_request->after_request, (gpointer)ts);
       
       /* - remove req from list_out */
       /* Destroy the request */
       remove = TRUE;
       free_data = TRUE;
-
+      //TODO ybrosseau: This if is always true
       /* Go to next */
       if(remove)
       {
@@ -997,9 +824,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
     guint iter_trace=0;
     
     for(iter_trace=0; 
-        iter_trace<lttv_traceset_number(tsc->ts);
+        iter_trace<lttv_traceset_number(ts);
         iter_trace++) {
-      LttvTrace *trace_v = lttv_traceset_get(tsc->ts, iter_trace);
+      LttvTrace *trace_v = lttv_traceset_get(ts, iter_trace);
 
       if(lttvwindowtraces_lock(trace_v) != 0) {
         g_critical("Foreground processing : Unable to get trace lock");
@@ -1009,9 +836,10 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
   }
 
   /* 0.2 Seek tracefiles positions to context position */
+#ifdef BABEL_CLEANUP
   //g_assert(lttv_process_traceset_seek_position(tsc, sync_position) == 0);
   lttv_process_traceset_synchronize_tracefiles(tsc);
-  
+#endif
   
   /* Events processing algorithm implementation */
   /* Warning : the gtk_events_pending takes a LOT of cpu time. So what we do
@@ -1068,7 +896,8 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           if(event_request_lpos->start_position != NULL
               && event_request_list_out->start_position != NULL)
           {
-            comp = lttv_traceset_context_pos_pos_compare
+           //TODO ybrosseau: this compare is in fact an equal, so the behavior might not be right. 
+            comp = lttv_traceset_position_time_compare
                                  (event_request_lpos->start_position,
                                   event_request_list_out->start_position);
           } else {
@@ -1091,7 +920,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           
           if(event_request_lpos != NULL 
               && event_request_lpos->start_position != NULL) {
-            lpos_start_time = lttv_traceset_context_position_get_time(
+            lpos_start_time = lttv_traceset_position_get_time(
                                       event_request_lpos->start_position);
           }
           
@@ -1131,26 +960,30 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 
       /* 1.2 Seek */
       {
-        tfc = lttv_traceset_context_get_current_tfc(tsc);
         g_assert(g_slist_length(list_in)>0);
         EventsRequest *events_request = g_slist_nth_data(list_in, 0);
+#ifdef DEBUG
         guint seek_count;
+#endif
 
         /* 1.2.1 If first request in list_in is a time request */
         if(events_request->start_position == NULL) {
           /* - If first req in list_in start time != current time */
-          if(tfc == NULL || ltt_time_compare(events_request->start_time,
-                              tfc->timestamp) != 0)
+         //TODO ybrosseau: if commented out, since it was only affecting the g_debug
+          //if(tfc == NULL || ltt_time_compare(events_request->start_time,
+          //                    tfc->timestamp) != 0)
             /* - Seek to that time */
             g_debug("SEEK TIME : %lu, %lu", events_request->start_time.tv_sec,
               events_request->start_time.tv_nsec);
-            //lttv_process_traceset_seek_time(tsc, events_request->start_time);
-            lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
+           lttv_state_traceset_seek_time_closest(ts,
                                                   events_request->start_time);
 
             /* Process the traceset with only state hooks */
+#ifdef DEBUG
             seek_count =
-               lttv_process_traceset_middle(tsc,
+#endif //DEBUG
+               lttv_process_traceset_middle(ts,
                                             events_request->start_time,
                                             G_MAXUINT, NULL);
 #ifdef DEBUG
@@ -1160,46 +993,51 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 
         } else {
           LttTime pos_time;
-                                       LttvTracefileContext *tfc =
-                                               lttv_traceset_context_get_current_tfc(tsc);
+         //LttvTracefileContext *tfc =
+         //  lttv_traceset_context_get_current_tfc(tsc);
           /* Else, the first request in list_in is a position request */
           /* If first req in list_in pos != current pos */
           g_assert(events_request->start_position != NULL);
           g_debug("SEEK POS time : %lu, %lu", 
-                 lttv_traceset_context_position_get_time(
+                 lttv_traceset_position_get_time(
                       events_request->start_position).tv_sec,
-                 lttv_traceset_context_position_get_time(
+                 lttv_traceset_position_get_time(
                       events_request->start_position).tv_nsec);
                                        
-                                       if(tfc) {
-                                               g_debug("SEEK POS context time : %lu, %lu", 
-                                                        tfc->timestamp.tv_sec,
-                                                        tfc->timestamp.tv_nsec);
+         /*if(tfc) {*/ if(0) {
+           /*                                  g_debug("SEEK POS context time : %lu, %lu", 
+                                                       tfc->timestamp.tv_sec,
+                                                        tfc->timestamp.tv_nsec); */
                                        } else {
                                                g_debug("SEEK POS context time : %lu, %lu", 
                                                         ltt_time_infinite.tv_sec,
                                                         ltt_time_infinite.tv_nsec);
                                        }
           g_assert(events_request->start_position != NULL);
-          if(lttv_traceset_context_ctx_pos_compare(tsc,
-                     events_request->start_position) != 0) {
+         //TODO ybrosseau: for now, always seek
+          if(/*lttv_traceset_context_ctx_pos_compare(tsc,
+                     events_request->start_position) != 0*/1) {
             /* 1.2.2.1 Seek to that position */
             g_debug("SEEK POSITION");
             //lttv_process_traceset_seek_position(tsc, events_request->start_position);
-            pos_time = lttv_traceset_context_position_get_time(
+            pos_time = lttv_traceset_position_get_time(
                                      events_request->start_position);
             
-            lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
+            lttv_state_traceset_seek_time_closest(ts,
                                                   pos_time);
+           //lttv_traceset_seek_to_position( events_request->start_position);
 
             /* Process the traceset with only state hooks */
+#ifdef DEBUG
             seek_count =
-               lttv_process_traceset_middle(tsc,
+#endif
+               lttv_process_traceset_middle(ts,
                                             ltt_time_infinite,
                                             G_MAXUINT,
                                             events_request->start_position);
-            g_assert(lttv_traceset_context_ctx_pos_compare(tsc,
-                         events_request->start_position) == 0);
+
+            //g_assert(lttv_traceset_context_ctx_pos_compare(tsc,
+            //             events_request->start_position) == 0);
 
 
           }
@@ -1209,7 +1047,6 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
       /* 1.3 Add hooks and call before request for all list_in members */
       {
         GSList *iter = NULL;
-
         for(iter=list_in;iter!=NULL;iter=g_slist_next(iter)) {
           EventsRequest *events_request = (EventsRequest*)iter->data;
           /* 1.3.1 If !servicing */
@@ -1217,32 +1054,31 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
             /* - begin request hooks called
              * - servicing = TRUE
              */
-            lttv_hooks_call(events_request->before_request, (gpointer)tsc);
+            lttv_hooks_call(events_request->before_request, (gpointer)ts);
             events_request->servicing = TRUE;
           }
           /* 1.3.2 call before chunk
            * 1.3.3 events hooks added
            */
-          if(events_request->trace == -1)
-            lttv_process_traceset_begin(tsc,
+         //TODO ybrosseau 2012-07-10: || TRUE added since we only support
+         //     traceset wide requests
+          if(events_request->trace == -1 || TRUE) {
+
+            lttv_process_traceset_begin(ts,
                 events_request->before_chunk_traceset,
                 events_request->before_chunk_trace,
-                events_request->before_chunk_tracefile,
-                events_request->event,
-                events_request->event_by_id_channel);
-          else {
-            guint nb_trace = lttv_traceset_number(tsc->ts);
+                events_request->event
+                );
+         } else {
+            guint nb_trace = lttv_traceset_number(ts);
             g_assert((guint)events_request->trace < nb_trace &&
                       events_request->trace > -1);
-            LttvTraceContext *tc = tsc->traces[events_request->trace];
+            LttvTrace  *trace = lttv_traceset_get(ts, events_request->trace);
 
-            lttv_hooks_call(events_request->before_chunk_traceset, tsc);
+            lttv_hooks_call(events_request->before_chunk_traceset, ts);
 
-            lttv_trace_context_add_hooks(tc,
-                                         events_request->before_chunk_trace,
-                                         events_request->before_chunk_tracefile,
-                                         events_request->event,
-                                         events_request->event_by_id_channel);
+            lttv_trace_add_hooks(trace, events_request->before_chunk_trace,
+                                        events_request->event);
           }
         }
       }
@@ -1260,26 +1096,26 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           /* - Call before chunk
            * - events hooks added
            */
-          if(events_request->trace == -1)
-            lttv_process_traceset_begin(tsc,
+         //TODO ybrosseau 2012-07-10: || TRUE added since we only support
+         //     traceset wide requests
+         if(events_request->trace == -1 || TRUE)
+            lttv_process_traceset_begin(ts,
                 events_request->before_chunk_traceset,
                 events_request->before_chunk_trace,
-                events_request->before_chunk_tracefile,
-                events_request->event,
-                events_request->event_by_id_channel);
+                events_request->event
+                );
           else {
-            guint nb_trace = lttv_traceset_number(tsc->ts);
+            guint nb_trace = lttv_traceset_number(ts);
             g_assert((guint)events_request->trace < nb_trace &&
                       events_request->trace > -1);
-            LttvTraceContext *tc = tsc->traces[events_request->trace];
+            LttvTrace *trace = lttv_traceset_get(ts, events_request->trace);
 
-            lttv_hooks_call(events_request->before_chunk_traceset, tsc);
+            lttv_hooks_call(events_request->before_chunk_traceset, ts);
 
-            lttv_trace_context_add_hooks(tc,
+            lttv_trace_add_hooks(trace,
                                          events_request->before_chunk_trace,
-                                         events_request->before_chunk_tracefile,
-                                         events_request->event,
-                                         events_request->event_by_id_channel);
+                                         events_request->event
+                                         );
           }
 
           iter = g_slist_next(iter);
@@ -1287,7 +1123,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
       }
 
       {
-        tfc = lttv_traceset_context_get_current_tfc(tsc);
+
       
         /* 2.1 For each req of list_out */
         GSList *iter = list_out;
@@ -1300,7 +1136,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           
           /* if req.start time == current context time 
            * or req.start position == current position*/
-          if(  ltt_time_compare(events_request->start_time,
+         /*          if(  ltt_time_compare(events_request->start_time,
                               tfc->timestamp) == 0 
              ||
                (events_request->start_position != NULL 
@@ -1308,6 +1144,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
                lttv_traceset_context_ctx_pos_compare(tsc,
                        events_request->start_position) == 0)
              ) {
+         */
+         if(lttv_traceset_position_compare_current(ts, events_request->start_position) == 0) {
+
             /* - Add to list_in, remove from list_out */
             list_in = g_slist_append(list_in, events_request);
             remove = TRUE;
@@ -1318,32 +1157,33 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
               /* - begin request hooks called
                * - servicing = TRUE
                */
-              lttv_hooks_call(events_request->before_request, (gpointer)tsc);
+              lttv_hooks_call(events_request->before_request, (gpointer)ts);
               events_request->servicing = TRUE;
             }
             /* call before chunk
              * events hooks added
              */
-            if(events_request->trace == -1)
-              lttv_process_traceset_begin(tsc,
+         //TODO ybrosseau 2012-07-10: || TRUE added since we only support
+         //     traceset wide requests
+           if(events_request->trace == -1 || TRUE)
+              lttv_process_traceset_begin(ts,
                   events_request->before_chunk_traceset,
                   events_request->before_chunk_trace,
-                  events_request->before_chunk_tracefile,
-                  events_request->event,
-                  events_request->event_by_id_channel);
+                  events_request->event
+                  );
             else {
-              guint nb_trace = lttv_traceset_number(tsc->ts);
+              guint nb_trace = lttv_traceset_number(ts);
               g_assert((guint)events_request->trace < nb_trace &&
                         events_request->trace > -1);
-              LttvTraceContext *tc = tsc->traces[events_request->trace];
+              LttvTrace* trace = lttv_traceset_get(ts,events_request->trace);
 
-              lttv_hooks_call(events_request->before_chunk_traceset, tsc);
+              lttv_hooks_call(events_request->before_chunk_traceset, ts);
 
-              lttv_trace_context_add_hooks(tc,
-                                           events_request->before_chunk_trace,
-                                           events_request->before_chunk_tracefile,
-                                           events_request->event,
-                                           events_request->event_by_id_channel);
+              lttv_trace_add_hooks(trace,
+                                  events_request->before_chunk_trace,
+                         
+                                  events_request->event);
+                         
           }
 
 
@@ -1424,7 +1264,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
         EventsRequest *events_request = (EventsRequest*)iter->data;
 
         if(events_request->end_position != NULL && end_position != NULL &&
-            lttv_traceset_context_pos_pos_compare(events_request->end_position,
+            lttv_traceset_position_time_compare(events_request->end_position,
                                                  end_position) <0)
           end_position = events_request->end_position;
       }
@@ -1438,7 +1278,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
         EventsRequest *events_request = (EventsRequest*)iter->data;
 
         if(events_request->end_position != NULL && end_position != NULL &&
-            lttv_traceset_context_pos_pos_compare(events_request->end_position,
+            lttv_traceset_position_time_compare(events_request->end_position,
                                                  end_position) <0)
           end_position = events_request->end_position;
       }
@@ -1446,24 +1286,25 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 
     {
       /* 4. Call process traceset middle */
-      g_debug("Calling process traceset middle with %p, %lu sec %lu nsec, %u nb ev, %p end pos", tsc, end_time.tv_sec, end_time.tv_nsec, end_nb_events, end_position);
-      count = lttv_process_traceset_middle(tsc, end_time, end_nb_events, end_position);
+      g_debug("Calling process traceset middle with %p, %lu sec %lu nsec, %u nb ev, %p end pos", ts, end_time.tv_sec, end_time.tv_nsec, end_nb_events, end_position);
+      count = lttv_process_traceset_middle(ts, end_time, end_nb_events, end_position);
 
+#ifdef BABEL_CLEANUP  
       tfc = lttv_traceset_context_get_current_tfc(tsc);
       if(tfc != NULL)
         g_debug("Context time after middle : %lu, %lu", tfc->timestamp.tv_sec,
                                                         tfc->timestamp.tv_nsec);
       else
         g_debug("End of trace reached after middle.");
-
+#endif
     }
+
     {
       /* 5. After process traceset middle */
-      tfc = lttv_traceset_context_get_current_tfc(tsc);
 
-      /* - if current context time > traceset.end time */
-      if(tfc == NULL || ltt_time_compare(tfc->timestamp,
-                                         tsc->time_span.end_time) > 0) {
+      LttTime curTime = lttv_traceset_get_current_time(ts);
+      /* - if the iterator is not valid anymore (got to the end) */
+      if(bt_ctf_iter_read_event(ts->iter) == NULL) {
         /* - For each req in list_in */
         GSList *iter = list_in;
     
@@ -1476,33 +1317,33 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           /* - Remove events hooks for req
            * - Call end chunk for req
            */
-
-          if(events_request->trace == -1) 
-               lttv_process_traceset_end(tsc,
+         //TODO ybrosseau 2012-07-10: || TRUE added since we only support
+         //     traceset wide requests
+          if(events_request->trace == -1 || TRUE) 
+               lttv_process_traceset_end(ts,
                                          events_request->after_chunk_traceset,
                                          events_request->after_chunk_trace,
-                                         events_request->after_chunk_tracefile,
-                                         events_request->event,
-                                         events_request->event_by_id_channel);
+
+                                         events_request->event);
 
           else {
-            guint nb_trace = lttv_traceset_number(tsc->ts);
+            guint nb_trace = lttv_traceset_number(ts);
             g_assert(events_request->trace < nb_trace &&
                       events_request->trace > -1);
-            LttvTraceContext *tc = tsc->traces[events_request->trace];
+            LttvTrace *trace = lttv_traceset_get(ts,events_request->trace);
 
-            lttv_trace_context_remove_hooks(tc,
+            lttv_trace_remove_hooks(trace,
                                          events_request->after_chunk_trace,
-                                         events_request->after_chunk_tracefile,
-                                         events_request->event,
-                                         events_request->event_by_id_channel);
-            lttv_hooks_call(events_request->after_chunk_traceset, tsc);
+                       
+                                   events_request->event);
+                       
+            lttv_hooks_call(events_request->after_chunk_traceset, ts);
 
 
           }
 
           /* - Call end request for req */
-          lttv_hooks_call(events_request->after_request, (gpointer)tsc);
+          lttv_hooks_call(events_request->after_request, (gpointer)ts);
           
           /* - remove req from list_in */
           /* Destroy the request */
@@ -1535,34 +1376,33 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
           /* - Remove events hooks for req
            * - Call end chunk for req
            */
-          if(events_request->trace == -1) 
-               lttv_process_traceset_end(tsc,
+         //TODO ybrosseau 2012-07-10: || TRUE added since we only support
+         //     traceset wide requests
+          if(events_request->trace == -1 || TRUE) {
+               lttv_process_traceset_end(ts,
                                          events_request->after_chunk_traceset,
                                          events_request->after_chunk_trace,
-                                         events_request->after_chunk_tracefile,
-                                         events_request->event,
-                                         events_request->event_by_id_channel);
-
-          else {
-            guint nb_trace = lttv_traceset_number(tsc->ts);
+                                         events_request->event);
+         } else {
+            guint nb_trace = lttv_traceset_number(ts);
             g_assert(events_request->trace < nb_trace &&
                       events_request->trace > -1);
-            LttvTraceContext *tc = tsc->traces[events_request->trace];
+            LttvTrace *trace = lttv_traceset_get(ts, events_request->trace);
 
-            lttv_trace_context_remove_hooks(tc,
+            lttv_trace_remove_hooks(trace,
                                          events_request->after_chunk_trace,
-                                         events_request->after_chunk_tracefile,
-                                         events_request->event,
-                                         events_request->event_by_id_channel);
 
-            lttv_hooks_call(events_request->after_chunk_traceset, tsc);
+                                   events_request->event);
+
+
+            lttv_hooks_call(events_request->after_chunk_traceset, ts);
           }
 
           /* - req.num -= count */
           g_assert(events_request->num_events >= count);
           events_request->num_events -= count;
           
-          g_assert(tfc != NULL);
+          //g_assert(tfc != NULL);
           /* - if req.num == 0
            *   or
            *     current context time >= req.end time
@@ -1575,19 +1415,19 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
               ||
                 events_request->stop_flag == TRUE
               ||
-                ltt_time_compare(tfc->timestamp,
+                ltt_time_compare(lttv_traceset_get_current_time(ts),
                                          events_request->end_time) >= 0
               ||
                   (events_request->end_position != NULL 
                  &&
-                  lttv_traceset_context_ctx_pos_compare(tsc,
+                  lttv_traceset_position_compare_current(ts,
                             events_request->end_position) == 0)
 
               ) {
             g_assert(events_request->servicing == TRUE);
             /* - Call end request for req
              * - remove req from list_in */
-            lttv_hooks_call(events_request->after_request, (gpointer)tsc);
+            lttv_hooks_call(events_request->after_request, (gpointer)ts);
             /* - remove req from list_in */
             /* Destroy the request */
             remove = TRUE;
@@ -1627,9 +1467,9 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
       
       /* 1.1. Use current postition as start position */
       if(events_request->start_position != NULL)
-        lttv_traceset_context_position_destroy(events_request->start_position);
-      events_request->start_position = lttv_traceset_context_position_new(tsc);
-      lttv_traceset_context_position_save(tsc, events_request->start_position);
+        lttv_traceset_destroy_position(events_request->start_position);
+      events_request->start_position = lttv_traceset_create_current_position(ts);
 
       /* 1.2. Remove start time */
       events_request->start_time = ltt_time_infinite;
@@ -1656,15 +1496,17 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
   }
   /* C Unlock Traces */
   {
+#ifdef BABEL_CLEANUP
     lttv_process_traceset_get_sync_data(tsc);
+#endif
     //lttv_traceset_context_position_save(tsc, sync_position);
     
     guint iter_trace;
     
     for(iter_trace=0; 
-        iter_trace<lttv_traceset_number(tsc->ts);
+        iter_trace<lttv_traceset_number(ts);
         iter_trace++) {
-      LttvTrace *trace_v = lttv_traceset_get(tsc->ts, iter_trace);
+      LttvTrace *trace_v = lttv_traceset_get(ts, iter_trace);
 
       lttvwindowtraces_unlock(trace_v);
     }
@@ -1695,13 +1537,59 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
                   NULL);
   return FALSE;
   */
+  
+
 }
 
 #undef list_out
+/** 
+    Manage the periodic update of a live trace
+*/
+static gboolean
+live_trace_update_handler(Tab *tab)
+{  
+#ifdef BABEL_CLEANUP
+       unsigned int updated_count;
+       LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
+       TimeInterval initial_time_span = tsc->time_span;
+       TimeInterval updated_time_span;
+
+       updated_count = lttv_process_traceset_update(tsc);
+       
+       /* TODO ybrosseau 2011-01-12: Add trace resynchronization  */
+
+       /* Get the changed period bounds */
+       updated_time_span = tsc->time_span;
 
+       if(ltt_time_compare(updated_time_span.start_time, 
+                               initial_time_span.start_time) != 0) {
+               /* The initial time should not change on a live update */
+               g_assert(FALSE);
+       }
+
+       /* Notify viewers (only on updates) */
+       if(ltt_time_compare(updated_time_span.end_time, 
+                               initial_time_span.end_time) != 0) {
+               
+               notify_time_span_changed(tab);
+               /* TODO ybrosseau 2011-01-12: Change the timebar to register 
+                  to the time_span hook */
+               timebar_set_minmax_time(TIMEBAR(tab->MTimebar),
+                                       &updated_time_span.start_time,
+                                       &updated_time_span.end_time );
+               
+               /* To update the min max */
+               time_change_manager(tab, tab->time_window);
+       }
+
+       /* Timer will be recalled as long as there is files to update */
+       return (updated_count > 0);
+#endif /* BABEL_CLEANUP */
+}
 
 static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v)
 {
+#ifdef BABEL_CLEANUP
   LttvTraceset *traceset = tab->traceset_info->traceset;
   guint i;
   guint num_traces = lttv_traceset_number(traceset);
@@ -1753,6 +1641,16 @@ static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v)
 
   //FIXME
   //add_trace_into_traceset_selector(GTK_MULTIVPANED(tab->multivpaned), lttv_trace(trace_v));
+
+
+  if (lttv_trace(trace_v)->is_live) {
+         /* Add timer for live update */
+         /* TODO ybrosseau 2011-01-12: Parametrize the hardcoded 1 seconds */
+         g_timeout_add_seconds (1,
+                                (GSourceFunc) live_trace_update_handler,
+                                tab);
+  }
+#endif /* BABEL_CLEANUP */
 }
 
 /* add_trace adds a trace into the current traceset. It first displays a 
@@ -1762,10 +1660,9 @@ static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v)
 
 void add_trace(GtkWidget * widget, gpointer user_data)
 {
-  LttTrace *trace;
-  LttvTrace * trace_v;
-  LttvTraceset * traceset;
-  const char * dir;
+  
+  LttvTraceset * traceset = NULL;
+  const char * path;
   char abs_path[PATH_MAX];
   gint id;
   MainWindow * mw_data = get_window_data_struct(widget);
@@ -1783,74 +1680,104 @@ void add_trace(GtkWidget * widget, gpointer user_data)
     ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
     tab = ptab->tab;
   }
-
-  //GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
-  GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a trace");
-  gtk_widget_hide( (file_selector)->file_list->parent) ;
-  gtk_file_selection_hide_fileop_buttons(file_selector);
-  gtk_window_set_transient_for(GTK_WINDOW(file_selector),
-      GTK_WINDOW(mw_data->mwindow));
-  
+#if 0
+//TODO fdeslauriers 2012-07-06: Remove this popup when we support multiple traces
+  traceset = lttvwindow_get_traceset(tab);
+  if(traceset != NULL && lttv_traceset_number(traceset) > 0){
+         GtkWidget *dialogue = 
+           gtk_message_dialog_new(
+             GTK_WINDOW(gtk_widget_get_toplevel(widget)),
+             GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+             GTK_MESSAGE_ERROR,
+             GTK_BUTTONS_OK,
+             "Loading multiple traces is not supported at the moment.");
+         gtk_dialog_run(GTK_DIALOG(dialogue));
+         gtk_widget_destroy(dialogue);
+         return;
+       }
+#endif  
+  /* Create a new traceset*/
+  traceset = tab->traceset_info->traceset;
+  if(traceset == NULL) {
+    traceset = lttv_traceset_new();
+  }
+  /* File open dialog management */
+#ifdef BABEL_CLEANUP
+  GtkWidget *extra_live_button;
+#endif //babel_cleanup
+  GtkFileChooser * file_chooser = 
+         GTK_FILE_CHOOSER(
+                 gtk_file_chooser_dialog_new ("Select a trace",
+                                         GTK_WINDOW(mw_data->mwindow),
+                                         GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                         NULL));
+#ifdef BABEL_CLEANUP
+  /* Button to indicate the opening of a live trace */
+  extra_live_button = gtk_check_button_new_with_mnemonic ("Trace is live (currently being writen)");
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (extra_live_button), FALSE);
+  gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (file_chooser), extra_live_button);
+#endif //babel_cleanup
+  gtk_file_chooser_set_show_hidden (file_chooser, TRUE);
   if(remember_trace_dir[0] != '\0')
-    gtk_file_selection_set_filename(file_selector, remember_trace_dir);
-  
-  id = gtk_dialog_run(GTK_DIALOG(file_selector));
-  switch(id){
-    case GTK_RESPONSE_ACCEPT:
-    case GTK_RESPONSE_OK:
-      dir = gtk_file_selection_get_filename (file_selector);
-      strncpy(remember_trace_dir, dir, PATH_MAX);
-      strncat(remember_trace_dir, "/", PATH_MAX);
-      if(!dir || strlen(dir) == 0){
-       gtk_widget_destroy((GtkWidget*)file_selector);
-       break;
-      }
-      get_absolute_pathname(dir, abs_path);
-      trace_v = lttvwindowtraces_get_trace_by_name(abs_path);
-      if(trace_v == NULL) {
-        trace = ltt_trace_open(abs_path);
-        if(trace == NULL) {
-          g_warning("cannot open trace %s", abs_path);
-
-          GtkWidget *dialogue = 
-            gtk_message_dialog_new(
-              GTK_WINDOW(gtk_widget_get_toplevel(widget)),
-              GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
-              GTK_MESSAGE_ERROR,
-              GTK_BUTTONS_OK,
-              "Cannot open trace : maybe you should enter in the trace "
-              "directory to select it ?");
-          gtk_dialog_run(GTK_DIALOG(dialogue));
-          gtk_widget_destroy(dialogue);
+         gtk_file_chooser_set_filename(file_chooser, remember_trace_dir);
 
-        } else {
-          trace_v = lttv_trace_new(trace);
-          lttvwindowtraces_add_trace(trace_v);
-          lttvwindow_add_trace(tab, trace_v);
-        }
-      } else {
-        lttvwindow_add_trace(tab, trace_v);
-      }
-
-      gtk_widget_destroy((GtkWidget*)file_selector);
-      
-      //update current tab
-      //update_traceset(mw_data);
+   gboolean closeFileChooserDialog = TRUE;
 
-      /* Call the updatetraceset hooks */
+  do 
+  {
+    id = gtk_dialog_run(GTK_DIALOG(file_chooser));
+    switch(id){
+      case GTK_RESPONSE_ACCEPT:
+      case GTK_RESPONSE_OK:
+       path = gtk_file_chooser_get_filename (file_chooser);
+
+       strncpy(remember_trace_dir, path, PATH_MAX);
+       strncat(remember_trace_dir, "/", PATH_MAX);
+       if(!path || strlen(path) == 0){
+         break;
+       }
+       get_absolute_pathname(path, abs_path);
+       
+      if(lttv_traceset_add_path(traceset,abs_path) != 0 ){ /*failure*/
       
-      traceset = tab->traceset_info->traceset;
-      SetTraceset(tab, traceset);
-      // in expose now call_pending_read_hooks(mw_data);
+       g_warning("cannot open trace %s", abs_path);
+       strncpy(remember_trace_dir, "\0", PATH_MAX);
+         GtkWidget *dialogue = 
+           gtk_message_dialog_new(
+             GTK_WINDOW(gtk_widget_get_toplevel(widget)),
+             GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+             GTK_MESSAGE_ERROR,
+             GTK_BUTTONS_OK,
+             "Cannot open trace : maybe you should enter in the directory "
+             "to select it ?");
+         gtk_dialog_run(GTK_DIALOG(dialogue));
+         gtk_widget_destroy(dialogue);
+         closeFileChooserDialog = FALSE;
+       }
+       else{
+         closeFileChooserDialog = TRUE;
+         SetTraceset(tab, traceset);    
+       }
+       break;
+       //update current tab
+       //update_traceset(mw_data);
+
+       // in expose now call_pending_read_hooks(mw_data);
+       
+       //lttvwindow_report_current_time(mw_data,&(tab->current_time));
       
-      //lttvwindow_report_current_time(mw_data,&(tab->current_time));
-      break;
-    case GTK_RESPONSE_REJECT:
-    case GTK_RESPONSE_CANCEL:
-    default:
-      gtk_widget_destroy((GtkWidget*)file_selector);
-      break;
-  }
+      case GTK_RESPONSE_REJECT:
+      case GTK_RESPONSE_CANCEL:
+      default:
+       closeFileChooserDialog = TRUE;
+             break;    
+    }
+  }while(!closeFileChooserDialog);
+  
+  gtk_widget_destroy((GtkWidget*)file_chooser);
+
 }
 
 /* remove_trace removes a trace from the current traceset if all viewers in 
@@ -1867,6 +1794,7 @@ void add_trace(GtkWidget * widget, gpointer user_data)
 
 void remove_trace(GtkWidget *widget, gpointer user_data)
 {
+#ifdef BABEL_CLEANUP
   LttTrace *trace;
   LttvTrace * trace_v;
   LttvTraceset * traceset;
@@ -1892,7 +1820,7 @@ void remove_trace(GtkWidget *widget, gpointer user_data)
   for(i = 0; i < nb_trace; i++){
     trace_v = lttv_traceset_get(tab->traceset_info->traceset, i);
     trace = lttv_trace(trace_v);
-    name[i] = g_quark_to_string(ltt_trace_name(trace));
+    name[i] = (char *) g_quark_to_string(ltt_trace_name(trace));
   }
 
   remove_trace_name = get_remove_trace(mw_data, name, nb_trace);
@@ -1955,6 +1883,7 @@ void remove_trace(GtkWidget *widget, gpointer user_data)
     SetTraceset(tab, (gpointer)traceset);
   }
   g_free(name);
+#endif /* BABEL_CLEANUP */ 
 }
 
 #if 0
@@ -2100,6 +2029,8 @@ void redraw(GtkWidget *widget, gpointer user_data)
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
                       gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
   Tab *tab;
+  gboolean retval;
+
   if(!page) {
     return;
   } else {
@@ -2111,7 +2042,8 @@ void redraw(GtkWidget *widget, gpointer user_data)
   LttvHooks * tmp;
   LttvAttributeValue value;
 
-  g_assert(lttv_iattribute_find_by_path(tab->attributes, "hooks/redraw", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(tab->attributes, "hooks/redraw", LTTV_POINTER, &value);
+  g_assert(retval);
 
   tmp = (LttvHooks*)*(value.v_pointer);
   if(tmp != NULL)
@@ -2125,6 +2057,8 @@ void continue_processing(GtkWidget *widget, gpointer user_data)
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
                       gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)));
   Tab *tab;
+  gboolean retval;
+
   if(!page) {
     return;
   } else {
@@ -2136,8 +2070,9 @@ void continue_processing(GtkWidget *widget, gpointer user_data)
   LttvHooks * tmp;
   LttvAttributeValue value;
 
-  g_assert(lttv_iattribute_find_by_path(tab->attributes,
-     "hooks/continue", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(tab->attributes, "hooks/continue",
+    LTTV_POINTER, &value);
+  g_assert(retval);
 
   tmp = (LttvHooks*)*(value.v_pointer);
   if(tmp != NULL)
@@ -2201,11 +2136,11 @@ void save_as(GtkWidget * widget, gpointer user_data)
 
 void zoom(GtkWidget * widget, double size)
 {
+
   TimeInterval time_span;
   TimeWindow new_time_window;
   LttTime    current_time, time_delta;
-  MainWindow * mw_data = get_window_data_struct(widget);
-  LttvTracesetContext *tsc;
+  LttvTraceset *ts;
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
 
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
@@ -2222,8 +2157,8 @@ void zoom(GtkWidget * widget, double size)
 
   if(size == 1) return;
 
-  tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  time_span = tsc->time_span;
+  ts = lttvwindow_get_traceset(tab);
+  time_span = lttv_traceset_get_time_span_real(ts);
   new_time_window =  tab->time_window;
   current_time = tab->current_time;
   
@@ -2385,7 +2320,9 @@ void
 on_open_activate                       (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
+#ifdef UNFINISHED_FEATURE
   open_traceset((GtkWidget*)menuitem, user_data);
+#endif
 }
 
 
@@ -2407,8 +2344,6 @@ on_close_tab_activate                  (GtkWidget       *widget,
 {
   gint page_num;
   GtkWidget * notebook;
-  GtkWidget * page;
-  MainWindow * mw_data = get_window_data_struct(widget);
   notebook = lookup_widget(widget, "MNotebook");
   if(notebook == NULL){
     g_info("Notebook does not exist\n");
@@ -2895,7 +2830,6 @@ void
 on_unload_module_activate              (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-  GError *error = NULL;
   MainWindow * mw_data = get_window_data_struct((GtkWidget*)menuitem);
 
   LttvLibrary *library = NULL;
@@ -3025,7 +2959,6 @@ on_remove_library_search_path_activate     (GtkMenuItem     *menuitem,
   {
     GPtrArray *name;
     guint nb,i;
-    gchar *lib_name;
     name = g_ptr_array_new();
     nb = lttv_library_path_number();
     /* ask for the library name */
@@ -3065,6 +2998,18 @@ void
 on_content_activate                    (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
+  char* filename = NULL,
+                  *path;
+  GdkScreen *screen;
+  const char* relativePath = "doc/user/user_guide/html/index.html";
+  filename = g_build_filename (g_get_current_dir(), relativePath, NULL);
+  path = g_strdup_printf ("ghelp://%s", filename);
+
+  screen = gdk_screen_get_default();
+  gtk_show_uri (screen, path, gtk_get_current_event_time(), NULL);
+
+  g_free(filename);
+  g_free(path);
   g_info("Content\n");
 }
 
@@ -3086,7 +3031,6 @@ on_about_activate                      (GtkMenuItem     *menuitem,
   GtkWidget *window_widget = main_window->mwindow;
   GtkWidget *about_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   GtkWindow *about_window = GTK_WINDOW(about_widget);
-  gint window_width, window_height;
   
   gtk_window_set_title(about_window, "About Linux Trace Toolkit");
 
@@ -3096,16 +3040,12 @@ on_about_activate                      (GtkMenuItem     *menuitem,
   gtk_window_set_modal(about_window, FALSE);
 
   /* Put the about window at the center of the screen */
-  gtk_window_get_size(about_window, &window_width, &window_height);
-  gtk_window_move (about_window,
-                   (gdk_screen_width() - window_width)/2,
-                   (gdk_screen_height() - window_height)/2);
+  gtk_window_set_position(about_window, GTK_WIN_POS_CENTER_ALWAYS);
+
   GtkWidget *vbox = gtk_vbox_new(FALSE, 1);
 
   gtk_container_add(GTK_CONTAINER(about_widget), vbox);
 
-    
   /* Text to show */
   GtkWidget *label1 = gtk_label_new("");
   gtk_misc_set_padding(GTK_MISC(label1), 10, 20);
@@ -3179,7 +3119,9 @@ void
 on_button_open_clicked                 (GtkButton       *button,
                                         gpointer         user_data)
 {
+#ifdef UNFINISHED_FEATURE
   open_traceset((GtkWidget*)button, user_data);
+#endif
 }
 
 
@@ -3307,17 +3249,20 @@ on_MWindow_destroy                     (GtkWidget       *widget,
   MainWindow *main_window = get_window_data_struct(widget);
   LttvIAttribute *attributes = main_window->attributes;
   LttvAttributeValue value;
+  gboolean retval;
  
   //This is unnecessary, since widgets will be destroyed
   //by the main window widget anyway.
   //remove_all_menu_toolbar_constructors(main_window, NULL);
 
-  g_assert(lttv_iattribute_find_by_path(attributes,
-           "viewers/menu", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(attributes, "viewers/menu",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   lttv_menus_destroy((LttvMenus*)*(value.v_pointer));
 
-  g_assert(lttv_iattribute_find_by_path(attributes,
-           "viewers/toolbar", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   lttv_toolbars_destroy((LttvToolbars*)*(value.v_pointer));
 
   g_object_unref(main_window->attributes);
@@ -3333,8 +3278,6 @@ on_MWindow_configure                   (GtkWidget         *widget,
                                         GdkEventConfigure *event,
                                         gpointer           user_data)
 {
-  MainWindow * mw_data = get_window_data_struct((GtkWidget*)widget);
-       
        // MD : removed time width modification upon resizing of the main window.
        // The viewers will redraw themselves completely, without time interval
        // modification.
@@ -3372,23 +3315,27 @@ on_MNotebook_switch_page               (GtkNotebook     *notebook,
 
 void time_change_manager               (Tab *tab,
                                         TimeWindow new_time_window)
-{
+{ 
+  
   /* Only one source of time change */
   if(tab->time_manager_lock == TRUE) return;
 
   tab->time_manager_lock = TRUE;
+  TimeInterval time_span;
+  
+  LttvTraceset *ts = tab->traceset_info->traceset;
+  
+  time_span = lttv_traceset_get_time_span_real(ts);
 
-  LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
   LttTime start_time = new_time_window.start_time;
   LttTime end_time = new_time_window.end_time;
-  LttTime time_width = new_time_window.time_width;
 
   g_assert(ltt_time_compare(start_time, end_time) < 0);
   
   /* Set scrollbar */
   GtkAdjustment *adjustment = gtk_range_get_adjustment(GTK_RANGE(tab->scrollbar));
-  LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time);
+  LttTime upper = ltt_time_sub(time_span.end_time, time_span.start_time); 
+
 #if 0  
   gtk_range_set_increments(GTK_RANGE(tab->scrollbar),
                ltt_time_to_double(new_time_window.time_width)
@@ -3429,432 +3376,25 @@ void time_change_manager               (Tab *tab,
                 ltt_time_sub(start_time, time_span.start_time)) /* value */);
 
   /* set the time bar. */
-  /* start seconds */
-  gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry1),
-                            (double)time_span.start_time.tv_sec,
-                            (double)time_span.end_time.tv_sec);
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry1),
-                            (double)start_time.tv_sec);
-
-  /* start nanoseconds */
-  if(start_time.tv_sec == time_span.start_time.tv_sec) {
-    /* can be both beginning and end at the same time. */
-    if(start_time.tv_sec == time_span.end_time.tv_sec) {
-      /* If we are at the end, max nsec to end..  -1 (not zero length) */
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2),
-                                (double)time_span.start_time.tv_nsec,
-                                (double)time_span.end_time.tv_nsec-1);
-    } else {
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2),
-                                (double)time_span.start_time.tv_nsec,
-                                (double)NANOSECONDS_PER_SECOND-1);
-    }
-  } else if(start_time.tv_sec == time_span.end_time.tv_sec) {
-      /* If we are at the end, max nsec to end..  -1 (not zero length) */
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2),
-                                0.0,
-                                (double)time_span.end_time.tv_nsec-1);
-  } else /* anywhere else */
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry2),
-                              0.0,
-                              (double)NANOSECONDS_PER_SECOND-1);
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry2),
-                            (double)start_time.tv_nsec);
-
-  /* end seconds */
-  gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry3),
-                            (double)time_span.start_time.tv_sec,
-                            (double)time_span.end_time.tv_sec);
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry3),
-                            (double)end_time.tv_sec);
-
-  /* end nanoseconds */
-  if(end_time.tv_sec == time_span.start_time.tv_sec) {
-    /* can be both beginning and end at the same time. */
-    if(end_time.tv_sec == time_span.end_time.tv_sec) {
-      /* If we are at the end, max nsec to end.. */
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4),
-                                (double)time_span.start_time.tv_nsec+1,
-                                (double)time_span.end_time.tv_nsec);
-    } else {
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4),
-                                (double)time_span.start_time.tv_nsec+1,
-                                (double)NANOSECONDS_PER_SECOND-1);
-    }
-  }
-  else if(end_time.tv_sec == time_span.end_time.tv_sec) {
-    /* If we are at the end, max nsec to end.. */
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4),
-                              0.0,
-                              (double)time_span.end_time.tv_nsec);
-  }
-  else /* anywhere else */
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry4),
-                              0.0,
-                              (double)NANOSECONDS_PER_SECOND-1);
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry4),
-                            (double)end_time.tv_nsec);
-
-  /* width seconds */
-  if(time_width.tv_nsec == 0) {
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry7),
-                              (double)1,
-                              (double)upper.tv_sec);
-  } else {
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry7),
-                              (double)0,
-                              (double)upper.tv_sec);
-  }
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry7),
-                            (double)time_width.tv_sec);
-
-  /* width nanoseconds */
-  if(time_width.tv_sec == upper.tv_sec) {
-    if(time_width.tv_sec == 0) {
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8),
-                                (double)1,
-                                (double)upper.tv_nsec);
-    } else {
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8),
-                                (double)0,
-                                (double)upper.tv_nsec);
-    }
-  }
-  else if(time_width.tv_sec == 0) {
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8),
-                              1.0,
-                              (double)upper.tv_nsec);
-  }
-  else /* anywhere else */
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry8),
-                              0.0,
-                              (double)NANOSECONDS_PER_SECOND-1);
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry8),
-                            (double)time_width.tv_nsec);
 
-  /* call viewer hooks for new time window */
-  set_time_window(tab, &new_time_window);
 
-  tab->time_manager_lock = FALSE;
-}
+  timebar_set_minmax_time(TIMEBAR(tab->MTimebar),
+                         &time_span.start_time,
+                         &time_span.end_time );
+  timebar_set_start_time(TIMEBAR(tab->MTimebar),&start_time);
+  timebar_set_end_time(TIMEBAR(tab->MTimebar),&end_time);
 
 
-/* value changed for frame start s
- *
- * Check time span : if ns is out of range, clip it the nearest good value.
- */
-void
-on_MEntry1_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
-{
-  Tab *tab =(Tab *)user_data;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-
-  TimeWindow new_time_window = tab->time_window;
-  LttTime end_time = new_time_window.end_time;
-
-  new_time_window.start_time.tv_sec = value;
-
-  /* start nanoseconds */
-  if(new_time_window.start_time.tv_sec == time_span.start_time.tv_sec) {
-    if(new_time_window.start_time.tv_sec == time_span.end_time.tv_sec) {
-      if(new_time_window.start_time.tv_nsec > time_span.end_time.tv_nsec)
-        new_time_window.start_time.tv_nsec = time_span.end_time.tv_nsec-1;
-      if(new_time_window.start_time.tv_nsec < time_span.start_time.tv_nsec)
-        new_time_window.start_time.tv_nsec = time_span.start_time.tv_nsec;
-    } else {
-      if(new_time_window.start_time.tv_nsec < time_span.start_time.tv_nsec)
-        new_time_window.start_time.tv_nsec = time_span.start_time.tv_nsec;
-    }
-  }
-  else if(new_time_window.start_time.tv_sec == time_span.end_time.tv_sec) {
-    if(new_time_window.start_time.tv_nsec > time_span.end_time.tv_nsec)
-      new_time_window.start_time.tv_nsec = time_span.end_time.tv_nsec-1;
-  }
 
-  if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
-    /* Then, we must push back end time : keep the same time width
-     * if possible, else end traceset time */
-    end_time = LTT_TIME_MIN(ltt_time_add(new_time_window.start_time,
-                                         new_time_window.time_width),
-                            time_span.end_time);
-  }
-
-  /* Fix the time width to fit start time and end time */
-  new_time_window.time_width = ltt_time_sub(end_time,
-                                            new_time_window.start_time);
-  new_time_window.time_width_double =
-              ltt_time_to_double(new_time_window.time_width);
-
-  new_time_window.end_time = end_time;
-
-  time_change_manager(tab, new_time_window);
-
-}
-
-void
-on_MEntry2_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
-{
-  Tab *tab =(Tab *)user_data;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-
-  TimeWindow new_time_window = tab->time_window;
-  LttTime end_time = new_time_window.end_time;
-
-  new_time_window.start_time.tv_nsec = value;
-
-  if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
-    /* Then, we must push back end time : keep the same time width
-     * if possible, else end traceset time */
-    end_time = LTT_TIME_MIN(ltt_time_add(new_time_window.start_time,
-                                         new_time_window.time_width),
-                            time_span.end_time);
-  }
-
-  /* Fix the time width to fit start time and end time */
-  new_time_window.time_width = ltt_time_sub(end_time,
-                                            new_time_window.start_time);
-  new_time_window.time_width_double =
-              ltt_time_to_double(new_time_window.time_width);
-
-  new_time_window.end_time = end_time;
-
-  time_change_manager(tab, new_time_window);
-
-}
-
-void
-on_MEntry3_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
-{
-  Tab *tab =(Tab *)user_data;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-
-  TimeWindow new_time_window = tab->time_window;
-  LttTime end_time = new_time_window.end_time;
-
-  end_time.tv_sec = value;
-
-  /* end nanoseconds */
-  if(end_time.tv_sec == time_span.start_time.tv_sec) {
-    if(end_time.tv_sec == time_span.end_time.tv_sec) {
-      if(end_time.tv_nsec > time_span.end_time.tv_nsec)
-        end_time.tv_nsec = time_span.end_time.tv_nsec;
-      if(end_time.tv_nsec < time_span.start_time.tv_nsec)
-        end_time.tv_nsec = time_span.start_time.tv_nsec+1;
-    } else {
-      if(end_time.tv_nsec < time_span.start_time.tv_nsec)
-        end_time.tv_nsec = time_span.start_time.tv_nsec+1;
-    }
-  }
-  else if(end_time.tv_sec == time_span.end_time.tv_sec) {
-    if(end_time.tv_nsec > time_span.end_time.tv_nsec)
-      end_time.tv_nsec = time_span.end_time.tv_nsec;
-  }
-
-  if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
-    /* Then, we must push front start time : keep the same time width
-     * if possible, else end traceset time */
-    new_time_window.start_time = LTT_TIME_MAX(
-                                  ltt_time_sub(end_time,
-                                               new_time_window.time_width),
-                                  time_span.start_time);
-  }
-
-  /* Fix the time width to fit start time and end time */
-  new_time_window.time_width = ltt_time_sub(end_time,
-                                            new_time_window.start_time);
-  new_time_window.time_width_double =
-              ltt_time_to_double(new_time_window.time_width);
-
-  new_time_window.end_time = end_time;
-  
-  time_change_manager(tab, new_time_window);
-
-}
-
-void
-on_MEntry4_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
-{
-  Tab *tab =(Tab *)user_data;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-
-  TimeWindow new_time_window = tab->time_window;
-  LttTime end_time = new_time_window.end_time;
-
-  end_time.tv_nsec = value;
-
-  if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
-    /* Then, we must push front start time : keep the same time width
-     * if possible, else end traceset time */
-    new_time_window.start_time = LTT_TIME_MAX(
-                                ltt_time_sub(end_time,
-                                             new_time_window.time_width),
-                                time_span.start_time);
-  }
-
-  /* Fix the time width to fit start time and end time */
-  new_time_window.time_width = ltt_time_sub(end_time,
-                                            new_time_window.start_time);
-  new_time_window.time_width_double =
-              ltt_time_to_double(new_time_window.time_width);
-  new_time_window.end_time = end_time;
-
-  time_change_manager(tab, new_time_window);
-
-}
+  /* call viewer hooks for new time window */
+  set_time_window(tab, &new_time_window);
 
-/* value changed for time frame interval s
- *
- * Check time span : if ns is out of range, clip it the nearest good value.
- */
-void
-on_MEntry7_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
-{
-  Tab *tab =(Tab *)user_data;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-  LttTime    current_time, time_delta;
-  TimeWindow new_time_window =  tab->time_window;
-  current_time = tab->current_time;
+  tab->time_manager_lock = FALSE;
   
-  time_delta = ltt_time_sub(time_span.end_time,time_span.start_time);
-  new_time_window.time_width.tv_sec = value;
-  new_time_window.time_width_double = 
-                 ltt_time_to_double(new_time_window.time_width);
-  if(ltt_time_compare(new_time_window.time_width,time_delta) > 0)
-  { /* Case where zoom out is bigger than trace length */
-    new_time_window.start_time = time_span.start_time;
-    new_time_window.time_width = time_delta;
-    new_time_window.time_width_double = ltt_time_to_double(time_delta);
-    new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                          new_time_window.time_width) ;
-  }
-  else
-  {
-    /* Center the image on the current time */
-    new_time_window.start_time = 
-      ltt_time_sub(current_time,
-          ltt_time_from_double(new_time_window.time_width_double/2.0));
-    new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                          new_time_window.time_width) ;
-    /* If on borders, don't fall off */
-    if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0
-     || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0)
-    {
-      new_time_window.start_time = time_span.start_time;
-      new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                          new_time_window.time_width) ;
-    }
-    else 
-    {
-      if(ltt_time_compare(new_time_window.end_time,
-                          time_span.end_time) > 0
-       || ltt_time_compare(new_time_window.end_time,
-                          time_span.start_time) < 0)
-      {
-        new_time_window.start_time = 
-                ltt_time_sub(time_span.end_time, new_time_window.time_width);
-
-        new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                                new_time_window.time_width) ;
-      }
-    }
-    
-  }
 
-  if(ltt_time_compare(new_time_window.time_width, ltt_time_zero) == 0) {
-    g_warning("Zoom more than 1 ns impossible");
-  } else {
-   time_change_manager(tab, new_time_window);
-  }
 }
 
-void
-on_MEntry8_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
-{
-  Tab *tab =(Tab *)user_data;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-  LttTime    current_time, time_delta;
-  TimeWindow new_time_window =  tab->time_window;
-  current_time = tab->current_time;
-  
-  time_delta = ltt_time_sub(time_span.end_time,time_span.start_time);
-  new_time_window.time_width.tv_nsec = value;
-  new_time_window.time_width_double = 
-                 ltt_time_to_double(new_time_window.time_width);
-  if(ltt_time_compare(new_time_window.time_width,time_delta) > 0)
-  { /* Case where zoom out is bigger than trace length */
-    new_time_window.start_time = time_span.start_time;
-    new_time_window.time_width = time_delta;
-    new_time_window.time_width_double = ltt_time_to_double(time_delta);
-    new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                          new_time_window.time_width) ;
-  }
-  else
-  {
-    /* Center the image on the current time */
-    new_time_window.start_time = 
-      ltt_time_sub(current_time,
-          ltt_time_from_double(new_time_window.time_width_double/2.0));
-    new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                          new_time_window.time_width) ;
-    /* If on borders, don't fall off */
-    if(ltt_time_compare(new_time_window.start_time, time_span.start_time) <0
-     || ltt_time_compare(new_time_window.start_time, time_span.end_time) >0)
-    {
-      new_time_window.start_time = time_span.start_time;
-      new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                          new_time_window.time_width) ;
-    }
-    else 
-    {
-      if(ltt_time_compare(new_time_window.end_time,
-                          time_span.end_time) > 0
-       || ltt_time_compare(new_time_window.end_time,
-                          time_span.start_time) < 0)
-      {
-        new_time_window.start_time = 
-                ltt_time_sub(time_span.end_time, new_time_window.time_width);
 
-        new_time_window.end_time = ltt_time_add(new_time_window.start_time,
-                                                new_time_window.time_width) ;
-      }
-    }
-    
-  }
-
-  if(ltt_time_compare(new_time_window.time_width, ltt_time_zero) == 0) {
-    g_warning("Zoom more than 1 ns impossible");
-  } else {
-   time_change_manager(tab, new_time_window);
-  }
-}
 
 
 
@@ -3866,110 +3406,106 @@ void current_time_change_manager       (Tab *tab,
 
   tab->current_time_manager_lock = TRUE;
 
-  LttvTracesetContext *tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-
-  /* current seconds */
-  gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry5),
-                            (double)time_span.start_time.tv_sec,
-                            (double)time_span.end_time.tv_sec);
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry5),
-                            (double)new_current_time.tv_sec);
-
-
-  /* start nanoseconds */
-  if(new_current_time.tv_sec == time_span.start_time.tv_sec) {
-    /* can be both beginning and end at the same time. */
-    if(new_current_time.tv_sec == time_span.end_time.tv_sec) {
-      /* If we are at the end, max nsec to end..  */
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6),
-                                (double)time_span.start_time.tv_nsec,
-                                (double)time_span.end_time.tv_nsec);
-    } else {
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6),
-                                (double)time_span.start_time.tv_nsec,
-                                (double)NANOSECONDS_PER_SECOND-1);
-    }
-  } else if(new_current_time.tv_sec == time_span.end_time.tv_sec) {
-      /* If we are at the end, max nsec to end..  */
-      gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6),
-                                0.0,
-                                (double)time_span.end_time.tv_nsec);
-  } else /* anywhere else */
-    gtk_spin_button_set_range(GTK_SPIN_BUTTON(tab->MEntry6),
-                              0.0,
-                              (double)NANOSECONDS_PER_SECOND-1);
-
-  gtk_spin_button_set_value(GTK_SPIN_BUTTON(tab->MEntry6),
-                            (double)new_current_time.tv_nsec);
+  timebar_set_current_time(TIMEBAR(tab->MTimebar), &new_current_time);
 
   set_current_time(tab, &new_current_time);
 
   tab->current_time_manager_lock = FALSE;
 }
 
-void current_position_change_manager(Tab *tab,
-                                     LttvTracesetContextPosition *pos)
+void current_position_change_manager(Tab *tab, LttvTracesetPosition *pos)
 {
-  LttvTracesetContext *tsc =
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
+  lttv_traceset_seek_to_position( pos);
 
-  g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0);
-  LttTime new_time = lttv_traceset_context_position_get_time(pos);
+  LttTime new_time = lttv_traceset_position_get_time(pos);
   /* Put the context in a state coherent position */
-  lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc, ltt_time_zero);
-  
+
+   lttv_state_traceset_seek_time_closest(tab->traceset_info->traceset, ltt_time_zero);
+
   current_time_change_manager(tab, new_time);
   
   set_current_position(tab, pos);
 }
 
-
-void
-on_MEntry5_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
+static void on_timebar_starttime_changed(Timebar *timebar,
+                               gpointer user_data)
 {
-  Tab *tab = (Tab*)user_data;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-  LttTime new_current_time = tab->current_time;
-  new_current_time.tv_sec = value;
-
-  /* current nanoseconds */
-  if(new_current_time.tv_sec == time_span.start_time.tv_sec) {
-    if(new_current_time.tv_sec == time_span.end_time.tv_sec) {
-      if(new_current_time.tv_nsec > time_span.end_time.tv_nsec)
-        new_current_time.tv_nsec = time_span.end_time.tv_nsec;
-      if(new_current_time.tv_nsec < time_span.start_time.tv_nsec)
-        new_current_time.tv_nsec = time_span.start_time.tv_nsec;
-    } else {
-      if(new_current_time.tv_nsec < time_span.start_time.tv_nsec)
-        new_current_time.tv_nsec = time_span.start_time.tv_nsec;
-    }
-  }
-  else if(new_current_time.tv_sec == time_span.end_time.tv_sec) {
-    if(new_current_time.tv_nsec > time_span.end_time.tv_nsec)
-      new_current_time.tv_nsec = time_span.end_time.tv_nsec;
-  }
+       Tab *tab = (Tab *)user_data;
+       LttvTraceset * ts =tab->traceset_info->traceset;
+       TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
+
+       TimeWindow new_time_window = tab->time_window;
+       new_time_window.start_time = timebar_get_start_time(timebar);
+
+       LttTime end_time = new_time_window.end_time;
+
+       /* TODO ybrosseau 2010-12-02: This if should have been checked 
+          by the timebar already */
+       if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
+               /* Then, we must push back end time : keep the same time width
+                * if possible, else end traceset time */
+               end_time = LTT_TIME_MIN(ltt_time_add(new_time_window.start_time,
+                                                   new_time_window.time_width),
+                                       time_span.end_time);
+       }
+
+       /* Fix the time width to fit start time and end time */
+       new_time_window.time_width = ltt_time_sub(end_time,
+                                               new_time_window.start_time);
+       
+       new_time_window.time_width_double =
+               ltt_time_to_double(new_time_window.time_width);
+       
+       new_time_window.end_time = end_time;
+
+       /* Notify the time_manager */
+       time_change_manager(tab, new_time_window);
 
-  current_time_change_manager(tab, new_current_time);
 }
 
-void
-on_MEntry6_value_changed               (GtkSpinButton *spinbutton,
-                                        gpointer user_data)
+static void on_timebar_endtime_changed(Timebar *timebar,
+                               gpointer user_data)
 {
-  Tab *tab = (Tab*)user_data;
-  gint value = gtk_spin_button_get_value_as_int(spinbutton);
-  LttTime new_current_time = tab->current_time;
-  new_current_time.tv_nsec = value;
+       Tab *tab = (Tab *)user_data;
+        LttvTraceset * ts =tab->traceset_info->traceset;
+        TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
+
+       TimeWindow new_time_window = tab->time_window;
+
+       LttTime end_time = timebar_get_end_time(timebar);
+
+       /* TODO ybrosseau 2010-12-02: This if should have been 
+          checked by the timebar already */
+       if(ltt_time_compare(new_time_window.start_time, end_time) >= 0) {
+               /* Then, we must push front start time : keep the same time 
+                  width if possible, else end traceset time */
+               new_time_window.start_time = LTT_TIME_MAX(
+                       ltt_time_sub(end_time,
+                               new_time_window.time_width),
+                       time_span.start_time);
+       }
+
+       /* Fix the time width to fit start time and end time */
+       new_time_window.time_width = ltt_time_sub(end_time,
+                                               new_time_window.start_time);
+       
+       new_time_window.time_width_double =
+               ltt_time_to_double(new_time_window.time_width);
+       
+       new_time_window.end_time = end_time;
 
-  current_time_change_manager(tab, new_current_time);
+       /* Notify the time_manager */
+       time_change_manager(tab, new_time_window);
+}
+static void on_timebar_currenttime_changed(Timebar *timebar,
+                               gpointer user_data)
+{
+       Tab *tab = (Tab *)user_data;
+       
+       LttTime new_current_time = timebar_get_current_time(timebar);
+       
+       current_time_change_manager(tab, new_current_time);
 }
-
 
 void scroll_value_changed_cb(GtkWidget *scrollbar,
                              gpointer user_data)
@@ -3981,9 +3517,9 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
   gdouble value = gtk_adjustment_get_value(adjust);
  // gdouble upper, lower, ratio, page_size;
   gdouble page_size;
-  LttvTracesetContext * tsc = 
-    LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  TimeInterval time_span = tsc->time_span;
+  
+  LttvTraceset * ts = tab->traceset_info->traceset;
+  TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
 
   time = ltt_time_add(ltt_time_from_double(value),
                       time_span.start_time);
@@ -4003,6 +3539,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
 
 
   time_change_manager(tab, new_time_window);
+
 #if 0
   //time_window = tab->time_window;
 
@@ -4031,6 +3568,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
   /* call viewer hooks for new time window */
   set_time_window(tab, &time_window);
 #endif //0
+
 }
 
 
@@ -4170,29 +3708,32 @@ void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
   LttvIAttribute *global_attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
   LttvIAttribute *attributes = mw->attributes;
   GtkWidget * tool_menu_title_menu, *new_widget, *pixmap;
+  gboolean retval;
 
-  g_assert(lttv_iattribute_find_by_path(global_attributes,
-          "viewers/menu", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(global_attributes, "viewers/menu",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   if(*(value.v_pointer) == NULL)
     *(value.v_pointer) = lttv_menus_new();
   global_menu = (LttvMenus*)*(value.v_pointer);
 
-  g_assert(lttv_iattribute_find_by_path(attributes,
-          "viewers/menu", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(attributes, "viewers/menu",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   if(*(value.v_pointer) == NULL)
     *(value.v_pointer) = lttv_menus_new();
   instance_menu = (LttvMenus*)*(value.v_pointer);
 
-
-
-  g_assert(lttv_iattribute_find_by_path(global_attributes,
-          "viewers/toolbar", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(global_attributes, "viewers/toolbar",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   if(*(value.v_pointer) == NULL)
     *(value.v_pointer) = lttv_toolbars_new();
   global_toolbar = (LttvToolbars*)*(value.v_pointer);
 
-  g_assert(lttv_iattribute_find_by_path(attributes,
-          "viewers/toolbar", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   if(*(value.v_pointer) == NULL)
     *(value.v_pointer) = lttv_toolbars_new();
   instance_toolbar = (LttvToolbars*)*(value.v_pointer);
@@ -4262,6 +3803,8 @@ void add_all_menu_toolbar_constructors(MainWindow * mw, gpointer user_data)
 
 MainWindow *construct_main_window(MainWindow * parent)
 {
+  gboolean retval;
+
   g_debug("construct_main_window()");
   GtkWidget  * new_window; /* New generated main window */
   MainWindow * new_m_window;/* New main window structure */
@@ -4269,8 +3812,7 @@ MainWindow *construct_main_window(MainWindow * parent)
   LttvIAttribute *attributes =
          LTTV_IATTRIBUTE(g_object_new(LTTV_ATTRIBUTE_TYPE, NULL));
   LttvAttributeValue value;
-  Tab *new_tab;
-         
+
   new_m_window = g_new(MainWindow, 1);
 
   // Add the object's information to the module's array 
@@ -4282,12 +3824,14 @@ MainWindow *construct_main_window(MainWindow * parent)
   new_m_window->mwindow = new_window;
   new_m_window->attributes = attributes;
 
-  g_assert(lttv_iattribute_find_by_path(attributes,
-           "viewers/menu", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(attributes, "viewers/menu",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   *(value.v_pointer) = lttv_menus_new();
 
-  g_assert(lttv_iattribute_find_by_path(attributes,
-           "viewers/toolbar", LTTV_POINTER, &value));
+  retval= lttv_iattribute_find_by_path(attributes, "viewers/toolbar",
+    LTTV_POINTER, &value);
+  g_assert(retval);
   *(value.v_pointer) = lttv_toolbars_new();
 
   add_all_menu_toolbar_constructors(new_m_window, NULL);
@@ -4329,7 +3873,6 @@ MainWindow *construct_main_window(MainWindow * parent)
            "Tab_Plugin",
            ptab,
           (GDestroyNotify)tab_destructor);
-    new_tab = ptab->tab;
   } else {
     LttvPluginTab *ptab = g_object_new(LTTV_TYPE_PLUGIN_TAB, NULL);
     init_tab(ptab->tab, new_m_window, NULL, notebook, "Traceset");
@@ -4339,7 +3882,6 @@ MainWindow *construct_main_window(MainWindow * parent)
            "Tab_Plugin",
            ptab,
           (GDestroyNotify)tab_destructor);
-    new_tab = ptab->tab;
   }
 
   /* Insert default viewers */
@@ -4397,12 +3939,11 @@ MainWindow *construct_main_window(MainWindow * parent)
 
 void tab_destructor(LttvPluginTab * ptab)
 {
+#ifdef BABEL_CLEANUP
   int i, nb, ref_count;
   LttvTrace * trace;
   Tab *tab = ptab->tab;
 
-  gtk_object_destroy(GTK_OBJECT(tab->tooltips));
-  
   if(tab->attributes)
     g_object_unref(tab->attributes);
 
@@ -4437,6 +3978,7 @@ void tab_destructor(LttvPluginTab * ptab)
   g_free(tab->traceset_info);
   //g_free(tab);
   g_object_unref(ptab);
+#endif /* BABEL_CLEANUP */
 }
 
 
@@ -4446,6 +3988,7 @@ void tab_destructor(LttvPluginTab * ptab)
 void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab, 
                  GtkNotebook * notebook, char * label)
 {
+
   GList * list;
   //Tab * tab;
   //LttvFilter *filter = NULL;
@@ -4463,9 +4006,13 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
     /* Copy the previous tab's filter */
     /* We can clone the filter, as we copy the trace set also */
     /* The filter must always be in sync with the trace set */
+   
+#ifdef BABEL_CLEANUP
     tab->filter = lttv_filter_clone(copy_tab->filter);
+#endif /* BABEL_CLEANUP */
   } else {
     tab->traceset_info->traceset = lttv_traceset_new();
+
     tab->filter = NULL;
   }
 #ifdef DEBUG
@@ -4475,21 +4022,18 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
       0, 4);
   fflush(stdout);
 #endif //DEBUG
-
+// 
   tab->time_manager_lock = FALSE;
   tab->current_time_manager_lock = FALSE;
-
+#ifdef BABEL_CLEANUP
   //FIXME copy not implemented in lower level
   tab->traceset_info->traceset_context =
     g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
-  g_assert(tab->traceset_info->traceset_context != NULL);
-  lttv_context_init(
-           LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context),
-                                 tab->traceset_info->traceset);
   //add state update hooks
+#endif //BABEL_CLEANUP
   lttv_state_add_event_hooks(
-       (LttvTracesetState*)tab->traceset_info->traceset_context);
-  
+       tab->traceset_info->traceset);
+
   //determine the current_time and time_window of the tab
 #if 0
   if(copy_tab != NULL){
@@ -4546,180 +4090,8 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
 //  }
 
   /* Create the timebar */
-  {
-    tab->MTimebar = gtk_hbox_new(FALSE, 2);
-    gtk_widget_show(tab->MTimebar);
-    tab->tooltips = gtk_tooltips_new();
-
-    tab->MEventBox1a = gtk_event_box_new();
-    gtk_widget_show(tab->MEventBox1a);
-    gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox1a, 
-        "Paste Start and End Times Here", "");
-    tab->MText1a = gtk_label_new("Time Frame ");
-    gtk_widget_show(tab->MText1a);
-    gtk_container_add(GTK_CONTAINER(tab->MEventBox1a), tab->MText1a);
-    tab->MEventBox1b = gtk_event_box_new();
-    gtk_widget_show(tab->MEventBox1b);
-    gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox1b, 
-        "Paste Start Time Here", "");
-    tab->MText1b = gtk_label_new("start: ");
-    gtk_widget_show(tab->MText1b);
-    gtk_container_add(GTK_CONTAINER(tab->MEventBox1b), tab->MText1b);
-    tab->MText2 = gtk_label_new("s");
-    gtk_widget_show(tab->MText2);
-    tab->MText3a = gtk_label_new("ns");
-    gtk_widget_show(tab->MText3a);
-
-    tab->MEventBox3b = gtk_event_box_new();
-    gtk_widget_show(tab->MEventBox3b);
-    gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox3b, 
-        "Paste End Time Here", "");
-    tab->MText3b = gtk_label_new("end:");
-    gtk_widget_show(tab->MText3b);
-    gtk_container_add(GTK_CONTAINER(tab->MEventBox3b), tab->MText3b);
-    tab->MText4 = gtk_label_new("s");
-    gtk_widget_show(tab->MText4);
-    tab->MText5a = gtk_label_new("ns");
-    gtk_widget_show(tab->MText5a);
-
-    tab->MEventBox8 = gtk_event_box_new();
-    gtk_widget_show(tab->MEventBox8);
-    gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox8, 
-        "Paste Time Interval here", "");
-    tab->MText8 = gtk_label_new("Time Interval:");
-    gtk_widget_show(tab->MText8);
-    gtk_container_add(GTK_CONTAINER(tab->MEventBox8), tab->MText8);
-    tab->MText9 = gtk_label_new("s");
-    gtk_widget_show(tab->MText9);
-    tab->MText10 = gtk_label_new("ns");
-    gtk_widget_show(tab->MText10);
-
-    tab->MEventBox5b = gtk_event_box_new();
-    gtk_widget_show(tab->MEventBox5b);
-    gtk_tooltips_set_tip(tab->tooltips, tab->MEventBox5b, 
-        "Paste Current Time Here", "");
-    tab->MText5b = gtk_label_new("Current Time:");
-    gtk_widget_show(tab->MText5b);
-    gtk_container_add(GTK_CONTAINER(tab->MEventBox5b), tab->MText5b);
-    tab->MText6 = gtk_label_new("s");
-    gtk_widget_show(tab->MText6);
-    tab->MText7 = gtk_label_new("ns");
-    gtk_widget_show(tab->MText7);
-
-    tab->MEntry1 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry1),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry1),TRUE);
-    gtk_widget_show(tab->MEntry1);
-    tab->MEntry2 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry2),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry2),TRUE);
-    gtk_widget_show(tab->MEntry2);
-    tab->MEntry3 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry3),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry3),TRUE);
-    gtk_widget_show(tab->MEntry3);
-    tab->MEntry4 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry4),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry4),TRUE);
-    gtk_widget_show(tab->MEntry4);
-    tab->MEntry5 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry5),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry5),TRUE);
-    gtk_widget_show(tab->MEntry5);
-    tab->MEntry6 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry6),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry6),TRUE);
-    gtk_widget_show(tab->MEntry6);
-    tab->MEntry7 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry7),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry7),TRUE);
-    gtk_widget_show(tab->MEntry7);
-    tab->MEntry8 = gtk_spin_button_new_with_range(0.0, 1.0, 1.0);
-    gtk_spin_button_set_digits(GTK_SPIN_BUTTON(tab->MEntry8),0);
-    gtk_spin_button_set_snap_to_ticks(GTK_SPIN_BUTTON(tab->MEntry8),TRUE);
-    gtk_widget_show(tab->MEntry8);
-    
-    GtkWidget *temp_widget;
-    
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox1a, FALSE,
-                         FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox1b, FALSE,
-                         FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry1, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText2, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry2, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText3a, FALSE, FALSE, 0);
-    temp_widget = gtk_vseparator_new();
-    gtk_widget_show(temp_widget);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox3b, FALSE,
-                         FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry3, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText4, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry4, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText5a, FALSE, FALSE, 0);
-    temp_widget = gtk_vseparator_new();
-    gtk_widget_show(temp_widget);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEventBox8, FALSE,
-                         FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry7, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText9, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MEntry8, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (tab->MTimebar), tab->MText10, FALSE, FALSE, 0);
-
-    temp_widget = gtk_vseparator_new();
-    gtk_widget_show(temp_widget);
-    gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText7, FALSE, FALSE, 0);
-    gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEntry6, FALSE, FALSE, 0);
-    gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MText6, FALSE, FALSE, 0);
-    gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEntry5, FALSE, FALSE, 0);
-    gtk_box_pack_end (GTK_BOX (tab->MTimebar), tab->MEventBox5b, FALSE,
-                         FALSE, 0);
-    gtk_box_pack_end (GTK_BOX (tab->MTimebar), temp_widget, FALSE, FALSE, 0);
-    
-
-    //GtkWidget *test = gtk_button_new_with_label("drop");
-    //gtk_button_set_relief(GTK_BUTTON(test), GTK_RELIEF_NONE);
-    //gtk_widget_show(test);
-    //gtk_box_pack_end(GTK_BOX (tab->MTimebar), test, FALSE, FALSE, 0);
-    //gtk_widget_add_events(tab->MText1, GDK_ALL_EVENTS_MASK);//GDK_BUTTON_PRESS_MASK);
-    /*GtkWidget *event_box = gtk_event_box_new();
-    gtk_widget_show(event_box);
-    gtk_tooltips_set_tip(tooltips, event_box, 
-        "Paste Current Time Here", "");
-    gtk_box_pack_end(GTK_BOX (tab->MTimebar), event_box, FALSE, FALSE, 0);
-    GtkWidget *test = gtk_label_new("drop");
-    gtk_container_add(GTK_CONTAINER(event_box), test);
-    gtk_widget_show(test);
-    g_signal_connect (G_OBJECT(event_box),
-                      "button-press-event",
-                      G_CALLBACK (on_MText1_paste),
-                      (gpointer)tab);
-*/
-
-    g_signal_connect (G_OBJECT(tab->MEventBox1a),
-                      "button-press-event",
-                      G_CALLBACK (on_MEventBox1a_paste),
-                      (gpointer)tab);
-
-    g_signal_connect (G_OBJECT(tab->MEventBox1b),
-                      "button-press-event",
-                      G_CALLBACK (on_MEventBox1b_paste),
-                      (gpointer)tab);
-    g_signal_connect (G_OBJECT(tab->MEventBox3b),
-                      "button-press-event",
-                      G_CALLBACK (on_MEventBox3b_paste),
-                      (gpointer)tab);
-    g_signal_connect (G_OBJECT(tab->MEventBox5b),
-                      "button-press-event",
-                      G_CALLBACK (on_MEventBox5b_paste),
-                      (gpointer)tab);
-    g_signal_connect (G_OBJECT(tab->MEventBox8),
-                      "button-press-event",
-                      G_CALLBACK (on_MEventBox8_paste),
-                      (gpointer)tab);
-  }
+  
+  tab->MTimebar = timebar_new(); 
 
   gtk_box_pack_end(GTK_BOX(tab->vbox),
                    tab->scrollbar,
@@ -4772,8 +4144,10 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
 
   gtk_widget_show(tab->label);
   gtk_widget_show(tab->scrollbar);
+  gtk_widget_show(tab->MTimebar);
   gtk_widget_show(tab->viewer_container);
   gtk_widget_show(tab->vbox);
+
   //gtk_widget_show(tab->multivpaned);
 
 
@@ -4787,30 +4161,14 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
   g_signal_connect(G_OBJECT(tab->scrollbar), "value-changed",
       G_CALLBACK(scroll_value_changed_cb), tab);
 
-  g_signal_connect ((gpointer) tab->MEntry1, "value-changed",
-                    G_CALLBACK (on_MEntry1_value_changed),
-                    tab);
-  g_signal_connect ((gpointer) tab->MEntry2, "value-changed",
-                    G_CALLBACK (on_MEntry2_value_changed),
-                    tab);
-  g_signal_connect ((gpointer) tab->MEntry3, "value-changed",
-                    G_CALLBACK (on_MEntry3_value_changed),
-                    tab);
-  g_signal_connect ((gpointer) tab->MEntry4, "value-changed",
-                    G_CALLBACK (on_MEntry4_value_changed),
-                    tab);
-  g_signal_connect ((gpointer) tab->MEntry5, "value-changed",
-                    G_CALLBACK (on_MEntry5_value_changed),
-                    tab);
-  g_signal_connect ((gpointer) tab->MEntry6, "value-changed",
-                    G_CALLBACK (on_MEntry6_value_changed),
-                    tab);
-  g_signal_connect ((gpointer) tab->MEntry7, "value-changed",
-                    G_CALLBACK (on_MEntry7_value_changed),
-                    tab);
-  g_signal_connect ((gpointer) tab->MEntry8, "value-changed",
-                    G_CALLBACK (on_MEntry8_value_changed),
-                    tab);
+
+  /* Timebar signal handler */
+  g_signal_connect(G_OBJECT(tab->MTimebar), "start-time-changed",
+                 G_CALLBACK(on_timebar_starttime_changed), tab);
+  g_signal_connect(G_OBJECT(tab->MTimebar), "end-time-changed",
+                 G_CALLBACK(on_timebar_endtime_changed), tab);  
+  g_signal_connect(G_OBJECT(tab->MTimebar), "current-time-changed",
+                 G_CALLBACK(on_timebar_currenttime_changed), tab);                 
 
   //g_signal_connect(G_OBJECT(tab->scrollbar), "changed",
   //    G_CALLBACK(scroll_value_changed_cb), tab);
@@ -4840,7 +4198,7 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
     lttvwindow_report_time_window(tab, time_window);
     lttvwindow_report_current_time(tab, ltt_time_zero);
   }
+
   LttvTraceset *traceset = tab->traceset_info->traceset;
   SetTraceset(tab, traceset);
 }
@@ -4860,6 +4218,7 @@ gboolean execute_events_requests(Tab *tab)
 
 __EXPORT void create_main_window_with_trace_list(GSList *traces)
 {
+
   GSList *iter = NULL;
 
   /* Create window */
@@ -4879,20 +4238,19 @@ __EXPORT void create_main_window_with_trace_list(GSList *traces)
     ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
     tab = ptab->tab;
   }
-
+  
+  LttvTraceset * traceset = lttv_traceset_new();
   for(iter=traces; iter!=NULL; iter=g_slist_next(iter)) {
     gchar *path = (gchar*)iter->data;
     /* Add trace */
     gchar abs_path[PATH_MAX];
-    LttvTrace *trace_v;
-    LttTrace *trace;
 
     get_absolute_pathname(path, abs_path);
-    trace_v = lttvwindowtraces_get_trace_by_name(abs_path);
-    if(trace_v == NULL) {
-      trace = ltt_trace_open(abs_path);
-      if(trace == NULL) {
-        g_warning("cannot open trace %s", abs_path);
+    
+    if(lttv_traceset_add_path(traceset,abs_path) != 0 ){ /*failure*/
+    
+      g_warning("cannot open trace %s", abs_path);
 
         GtkWidget *dialogue = 
           gtk_message_dialog_new(
@@ -4904,19 +4262,10 @@ __EXPORT void create_main_window_with_trace_list(GSList *traces)
             "to select it ?");
         gtk_dialog_run(GTK_DIALOG(dialogue));
         gtk_widget_destroy(dialogue);
-      } else {
-        trace_v = lttv_trace_new(trace);
-        lttvwindowtraces_add_trace(trace_v);
-        lttvwindow_add_trace(tab, trace_v);
-      }
-    } else {
-      lttvwindow_add_trace(tab, trace_v);
     }
-  }
-  
-  LttvTraceset *traceset;
-
-  traceset = tab->traceset_info->traceset;
-  SetTraceset(tab, traceset);
+    else{
+        SetTraceset(tab, traceset);
+    }
+  } 
 }
 
This page took 0.064121 seconds and 4 git commands to generate.