filter by facility
[lttv.git] / ltt / branches / poly / lttv / modules / gui / filter / filter.c
index a73f14669db7c119849c0d7a88ce9601fcb9fde3..23ff43d74d55b1cce7eb2833d94c70020cf16aa5 100644 (file)
  * MA 02111-1307, USA.
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <glib.h>
 #include <string.h>
 #include <gtk/gtk.h>
@@ -31,6 +35,9 @@
 
 #include "hGuiFilterInsert.xpm"
 
+
+GSList *g_filter_list = NULL ;
+
 /*! \file lttv/modules/gui/filter/filter.c
  *  \brief Graphic filter interface.
  *
  *  expression text entry or add simple expressions using the 
  *  many choices boxes.
  *  
- *  NOTE: 
- *  The version of gtk-2.0 currently installed on 
+ *  \note The version of gtk-2.0 currently installed on 
  *  my desktop misses some function of the newer 
- *  gtk+ api.
- *
- *  For the time being, I'll use the older api 
+ *  gtk+ api.  For the time being, I'll use the older api 
  *  to keep compatibility with most systems.
  */
 
@@ -61,8 +65,6 @@ void gui_filter_destructor(FilterViewerData *fvd);
 FilterViewerDataLine* gui_filter_add_line(FilterViewerData *fvd);
 void gui_filter_line_set_visible(FilterViewerDataLine *fvdl, gboolean v);
 void gui_filter_line_reset(FilterViewerDataLine *fvdl);
-gboolean filter_traceset_changed(void * hook_data, void * call_data);
-gboolean filter_viewer_data(void * hook_data, void * call_data); 
 GtkWidget* h_guifilter(Tab *tab);
 void filter_destroy_walk(gpointer data, gpointer user_data);
   
@@ -101,6 +103,8 @@ struct _FilterViewerDataLine {
 struct _FilterViewerData {
   Tab *tab;                             /**< current tab of module */
 
+  GtkWidget *f_window;                  /**< filter window */
+  
   GtkWidget *f_main_box;                /**< main container */
 
   GtkWidget *f_expression_field;        /**< entire expression (GtkEntry) */
@@ -117,7 +121,8 @@ struct _FilterViewerData {
   GPtrArray *f_math_op_options;         /**< array of operators types for math_op box */
   
   GtkWidget *f_add_button;              /**< add expression to current expression (GtkButton) */
-  
+  gchar *name;                          /**< Name of the window in the main window */
 };
 
 /**
@@ -131,7 +136,7 @@ struct _FilterViewerData {
 GtkWidget*
 guifilter_get_widget(FilterViewerData *fvd)
 {
-  return fvd->f_main_box;
+  return fvd->f_window;
 }
 
 /**
@@ -144,7 +149,7 @@ guifilter_get_widget(FilterViewerData *fvd)
 FilterViewerData*
 gui_filter(Tab *tab)
 {
-  g_print("filter::gui_filter()");
+  g_debug("filter::gui_filter()");
 
   unsigned i;
   GtkCellRenderer *renderer;
@@ -154,9 +159,9 @@ gui_filter(Tab *tab)
 
   fvd->tab  = tab;
 
-  lttvwindow_register_traceset_notify(fvd->tab,
-                                      filter_traceset_changed,
-                                      filter_viewer_data);
+//  lttvwindow_register_traceset_notify(fvd->tab,
+//                                      filter_traceset_changed,
+//                                     filter_viewer_data);
 //  request_background_data(filter_viewer_data);
  
   /*
@@ -177,6 +182,7 @@ gui_filter(Tab *tab)
   fvd->f_field_options = g_ptr_array_new(); //g_array_new(FALSE,FALSE,16);
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new(""));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.name"));
+  g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.facility"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.category"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.time"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.tsc"));
@@ -185,6 +191,7 @@ gui_filter(Tab *tab)
    */
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("tracefile.name"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("trace.name"));
+  g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.process_name"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.pid"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.ppid"));
   g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("state.creation_time"));
@@ -204,6 +211,8 @@ gui_filter(Tab *tab)
   g_ptr_array_add(fvd->f_math_op_options,(gpointer) g_string_new(">="));
   
 
+  fvd->f_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
   /* 
    * Initiating GtkTable layout 
    * starts with 2 rows and 5 columns and 
@@ -213,6 +222,8 @@ gui_filter(Tab *tab)
   gtk_table_set_row_spacings(GTK_TABLE(fvd->f_main_box),5);
   gtk_table_set_col_spacings(GTK_TABLE(fvd->f_main_box),5);
   
+  gtk_container_add(GTK_CONTAINER(fvd->f_window), GTK_WIDGET(fvd->f_main_box));
+  
   /*
    *  First half of the filter window
    *  - textual entry of filter expression
@@ -259,6 +270,8 @@ gui_filter(Tab *tab)
  
   gtk_table_attach( GTK_TABLE(fvd->f_main_box),fvd->f_logical_op_junction_box,0,1,1,2,GTK_SHRINK,GTK_FILL,0,0);
 
+  gtk_container_set_border_width(GTK_CONTAINER(fvd->f_main_box), 1);
+  
   /* initialize a new line */
   fvd->f_lines = g_ptr_array_new();
   fvd->rows = 1;
@@ -269,6 +282,7 @@ gui_filter(Tab *tab)
    * show main container 
    */
   gtk_widget_show(fvd->f_main_box);
+  gtk_widget_show(fvd->f_window);
   
   
   g_object_set_data_full(
@@ -277,6 +291,9 @@ gui_filter(Tab *tab)
       fvd,
       (GDestroyNotify)gui_filter_destructor);
 
+  g_filter_list = g_slist_append(
+      g_filter_list,
+      fvd);
   
   return fvd;
 }
@@ -383,7 +400,7 @@ gui_filter_line_reset(FilterViewerDataLine *fvdl) {
   gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_not_op_box),0);
   gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_field_box),0);
   gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_math_op_box),0);
-  gtk_entry_set_text(GTK_COMBO_BOX(fvdl->f_value_field),"");
+  gtk_entry_set_text(GTK_ENTRY(fvdl->f_value_field),"");
   gtk_combo_box_set_active(GTK_COMBO_BOX(fvdl->f_logical_op_box),0);
 }
 
@@ -402,43 +419,22 @@ gui_filter_destructor(FilterViewerData *fvd)
   if(GTK_IS_WIDGET(guifilter_get_widget(fvd))){
     g_info("widget still exists");
   }
-  if(tab != NULL) {
-    lttvwindow_unregister_traceset_notify(fvd->tab,
-                                          filter_traceset_changed,
-                                          filter_viewer_data);
-  }
+//  if(tab != NULL) {
+//    lttvwindow_unregister_traceset_notify(fvd->tab,
+//                                          filter_traceset_changed,
+//                                          filter_viewer_data);
+//  }
   lttvwindowtraces_background_notify_remove(fvd);
-
+  
+  g_filter_list = g_slist_remove(g_filter_list, fvd);
+  main_window_remove_child_window(tab, fvd->name);
+  
+  g_free(fvd->name);
+  
   g_free(fvd);
 }
 
-/**
- *  @fn gboolean filter_traceset_changed(void*,void*)
- * 
- *  Hook function
- *  @param hook_data The hook data
- *  @param call_data The call data
- *  @return Success/Failure of operation
- */
-gboolean
-filter_traceset_changed(void * hook_data, void * call_data) {
-
-  return FALSE;
-}
-
-/**
- *  @fn gboolean filter_viewer_data(void*,void*)
- * 
- *  Hook function
- *  @param hook_data The hook data
- *  @param call_data The call data
- *  @return Success/Failure of operation
- */
-gboolean
-filter_viewer_data(void * hook_data, void * call_data) {
-
-  return FALSE;
-}
 
 /**
  *  @fn GtkWidget* h_guifilter(Tab*)
@@ -454,11 +450,14 @@ GtkWidget *
 h_guifilter(Tab *tab)
 {
   FilterViewerData* f = gui_filter(tab) ;
+  f->name = g_new(gchar, 256);
+
+  snprintf(f->name, 256, "guifilter %p", f);
 
-  g_print("FilterViewerData:%p\n",f);
   if(f)
-    return guifilter_get_widget(f);
-  else return NULL;
+    main_window_add_child_window(tab, f,
+        f->name, (GDestroyNotify)gui_filter_destructor);
+  return NULL;
   
 }
 
@@ -490,6 +489,7 @@ filter_destroy_walk(gpointer data, gpointer user_data)
   FilterViewerData *fvd = (FilterViewerData*)data;
 
   g_debug("CFV.c : filter_destroy_walk, %p", fvd);
+
   /* May already have been done by GTK window closing */
   if(GTK_IS_WIDGET(guifilter_get_widget(fvd)))
     gtk_widget_destroy(guifilter_get_widget(fvd));
@@ -503,6 +503,8 @@ filter_destroy_walk(gpointer data, gpointer user_data)
  *  everything that has been registered in the gtkTraceSet API.
  */
 static void destroy() {
+  g_slist_foreach(g_filter_list, filter_destroy_walk, NULL );
   
   lttvwindow_unregister_constructor(h_guifilter);
   
@@ -518,12 +520,17 @@ static void destroy() {
 void 
 callback_process_button(GtkWidget *widget, gpointer data) {
 
+  g_debug("callback_process_button(): Processing expression");
+  
   FilterViewerData *fvd = (FilterViewerData*)data;
 
   if(strlen(gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field))) !=0) {
     LttvFilter* filter = lttv_filter_new();
-    lttv_filter_append_expression(filter,gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field)));
-    SetFilter(fvd->tab,filter);
+    GString* s = g_string_new(gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field)));
+    lttv_filter_append_expression(filter,s->str);
+    g_string_free(s,TRUE);
+    //SetFilter(fvd->tab,filter);
+    lttvwindow_report_filter(fvd->tab, filter);
   }
 }
 
@@ -536,7 +543,7 @@ callback_process_button(GtkWidget *widget, gpointer data) {
  */
 void 
 callback_expression_field(GtkWidget *widget, gpointer data) {
-
+  
   FilterViewerData *fvd = (FilterViewerData*)data;
 
   if(strlen(gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field))) !=0) {
@@ -557,24 +564,33 @@ callback_expression_field(GtkWidget *widget, gpointer data) {
 void 
 callback_add_button(GtkWidget *widget, gpointer data) {
 
-  g_print("filter::callback_add_button()\n");
+  g_debug("callback_add_button(): processing simple expressions");
 
+  unsigned i;
+  
   FilterViewerData *fvd = (FilterViewerData*)data;
   FilterViewerDataLine *fvdl = NULL;
   GString* a_filter_string = g_string_new("");
 
+  /*
+   * adding linking operator to 
+   * string
+   */
   GString* s;
   s = g_ptr_array_index(fvd->f_logical_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvd->f_logical_op_junction_box)));
-  g_print("s:%p\n",s);
-  g_print("string:%s\n",s);
   g_string_append(a_filter_string,s->str);
-  gtk_combo_box_set_active(fvd->f_logical_op_junction_box,0);
+  gtk_combo_box_set_active(GTK_COMBO_BOX(fvd->f_logical_op_junction_box),0);
 
-  g_print("passe junction\n");
-  
+  /* begin expression */
   g_string_append_c(a_filter_string,'(');
 
-  int i;
+  /*
+   * For each simple expression, add the resulting string 
+   * to the filter string
+   *
+   * Each simple expression takes the following schema
+   * [not operator '!',' '] [field type] [math operator '<','<=','>','>=','=','!='] [value]
+   */
   for(i=0;i<fvd->f_lines->len;i++) {
     fvdl = (FilterViewerDataLine*)g_ptr_array_index(fvd->f_lines,i);
  
@@ -592,10 +608,14 @@ callback_add_button(GtkWidget *widget, gpointer data) {
     s = g_ptr_array_index(fvd->f_logical_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_logical_op_box)));
     g_string_append(a_filter_string,s->str);
     
+    /*
+     * resetting simple expression lines
+     */
     gui_filter_line_reset(fvdl);
     if(i) gui_filter_line_set_visible(fvdl,FALSE); // Only keep the first line
   }
 
+  /* end expression */
   g_string_append_c(a_filter_string,')');
 
   g_string_prepend(a_filter_string,gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field)));
@@ -613,7 +633,7 @@ callback_add_button(GtkWidget *widget, gpointer data) {
 void 
 callback_logical_op_box(GtkWidget *widget, gpointer data) {
  
-  g_print("filter::callback_logical_op_box()\n");
+  g_debug("callback_logical_op_box(): adding new simple expression");
 
   FilterViewerData *fvd = (FilterViewerData*)data;
   FilterViewerDataLine *fvdl = NULL;
@@ -622,7 +642,7 @@ callback_logical_op_box(GtkWidget *widget, gpointer data) {
   for(i=0;i<fvd->f_lines->len;i++) {
     fvdl = (FilterViewerDataLine*)g_ptr_array_index(fvd->f_lines,i);
     if(fvdl->f_logical_op_box == widget) {
-      if(gtk_combo_box_get_active(fvdl->f_logical_op_box) == 0) return;
+      if(gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_logical_op_box)) == 0) return;
       if(i==fvd->f_lines->len-1) {  /* create a new line */
         fvd->rows++;
         FilterViewerDataLine* fvdl2 = gui_filter_add_line(fvd);
This page took 0.032391 seconds and 4 git commands to generate.