create directories branches, tags, trunk
[lttv.git] / ltt / branches / poly / lttv / modules / gui / filter / filter.c
index c21239e5eb74852c7c9831853d1f4c153a4035a5..66108652e08061c69766f72a62cbf8c8e8afcd90 100644 (file)
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <gtk/gtk.h>
 #include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
 
 #include <lttv/lttv.h>
 #include <lttv/module.h>
@@ -60,21 +61,25 @@ typedef struct _FilterViewerDataLine FilterViewerDataLine;
  * Prototypes
  */
 GtkWidget *guifilter_get_widget(FilterViewerData *fvd);
-FilterViewerData *gui_filter(Tab *tab);
+FilterViewerData *gui_filter(LttvPlugin *plugin);
 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);
-GtkWidget* h_guifilter(Tab *tab);
+GtkWidget* h_guifilter(LttvPlugin *plugin);
 void filter_destroy_walk(gpointer data, gpointer user_data);
   
 /*
  * Callback functions
  */
 void callback_process_button(GtkWidget *widget, gpointer data);
+gboolean callback_enter_check(GtkWidget *widget,
+    GdkEventKey *event,
+    gpointer user_data);
 void callback_add_button(GtkWidget *widget, gpointer data);
 void callback_logical_op_box(GtkWidget *widget, gpointer data);
 void callback_expression_field(GtkWidget *widget, gpointer data);
+void callback_cancel_button(GtkWidget *widget, gpointer data);
 
 /**
  *  @struct _FilterViewerDataLine
@@ -101,8 +106,10 @@ struct _FilterViewerDataLine {
  *  Main struct for the filter gui module
  */
 struct _FilterViewerData {
-  Tab *tab;                             /**< current tab of module */
+  LttvPlugin *plugin;                   /**< Plugin on which we interact. */
 
+  GtkWidget *f_window;                  /**< filter window */
+  
   GtkWidget *f_main_box;                /**< main container */
 
   GtkWidget *f_expression_field;        /**< entire expression (GtkEntry) */
@@ -119,7 +126,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) */
-  
+  GtkWidget *f_cancel_button;           /**< cancel and close dialog (GtkButton) */
 };
 
 /**
@@ -133,7 +141,7 @@ struct _FilterViewerData {
 GtkWidget*
 guifilter_get_widget(FilterViewerData *fvd)
 {
-  return fvd->f_main_box;
+  return fvd->f_window;
 }
 
 /**
@@ -144,9 +152,9 @@ guifilter_get_widget(FilterViewerData *fvd)
  *  @return The Filter viewer data created.
  */
 FilterViewerData*
-gui_filter(Tab *tab)
+gui_filter(LttvPlugin *plugin)
 {
-  g_print("filter::gui_filter()");
+  g_debug("filter::gui_filter()");
 
   unsigned i;
   GtkCellRenderer *renderer;
@@ -154,7 +162,7 @@ gui_filter(Tab *tab)
 
   FilterViewerData* fvd = g_new(FilterViewerData,1);
 
-  fvd->tab  = tab;
+  fvd->plugin = plugin;
 
 //  lttvwindow_register_traceset_notify(fvd->tab,
 //                                      filter_traceset_changed,
@@ -179,14 +187,18 @@ 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"));
+  g_ptr_array_add(fvd->f_field_options,(gpointer) g_string_new("event.target_pid"));
   /*
    * TODO: Add core.xml fields here !
    */
   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.thread_brand"));
   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"));
@@ -206,6 +218,13 @@ 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);
+  gtk_window_set_title(GTK_WINDOW(fvd->f_window), "LTTV Filter");
+  gtk_window_set_transient_for(GTK_WINDOW(fvd->f_window),
+      GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(fvd->plugin->top_widget))));
+  gtk_window_set_destroy_with_parent(GTK_WINDOW(fvd->f_window), TRUE);
+  gtk_window_set_resizable(GTK_WINDOW(fvd->f_window), FALSE);
+
   /* 
    * Initiating GtkTable layout 
    * starts with 2 rows and 5 columns and 
@@ -215,12 +234,16 @@ 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
    *  - processing button
    */
   fvd->f_expression_field = gtk_entry_new(); //gtk_scrolled_window_new (NULL, NULL);
+  g_signal_connect (G_OBJECT(fvd->f_expression_field),
+      "key-press-event", G_CALLBACK (callback_enter_check), (gpointer)fvd);
 //  gtk_entry_set_text(GTK_ENTRY(fvd->f_expression_field),"state.cpu>0");
   gtk_widget_show (fvd->f_expression_field);
 
@@ -248,7 +271,14 @@ gui_filter(Tab *tab)
   g_signal_connect (G_OBJECT (fvd->f_add_button), "clicked",
       G_CALLBACK (callback_add_button), (gpointer) fvd);
   
-  gtk_table_attach( GTK_TABLE(fvd->f_main_box),fvd->f_add_button,6,7,1,2,GTK_FILL,GTK_FILL,0,0);
+  gtk_table_attach( GTK_TABLE(fvd->f_main_box),fvd->f_add_button,6,7,2,3,GTK_FILL,GTK_FILL,0,0);
+
+  fvd->f_cancel_button = gtk_button_new_with_label("Cancel");
+  gtk_widget_show (fvd->f_cancel_button);
+  g_signal_connect (G_OBJECT (fvd->f_cancel_button), "clicked",
+      G_CALLBACK (callback_cancel_button), (gpointer) fvd);
+
+  gtk_table_attach( GTK_TABLE(fvd->f_main_box),fvd->f_cancel_button,6,7,1,2,GTK_FILL,GTK_FILL,0,0);
   
   fvd->f_logical_op_junction_box = gtk_combo_box_new_text();
   for(i=0;i<fvd->f_logical_op_options->len;i++) {
@@ -273,6 +303,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(
@@ -403,8 +434,6 @@ gui_filter_line_reset(FilterViewerDataLine *fvdl) {
 void
 gui_filter_destructor(FilterViewerData *fvd)
 {
-  Tab *tab = fvd->tab;
-
   /* May already been done by GTK window closing */
   if(GTK_IS_WIDGET(guifilter_get_widget(fvd))){
     g_info("widget still exists");
@@ -417,7 +446,7 @@ gui_filter_destructor(FilterViewerData *fvd)
   lttvwindowtraces_background_notify_remove(fvd);
   
   g_filter_list = g_slist_remove(g_filter_list, fvd);
-  
   g_free(fvd);
 }
 
@@ -429,18 +458,15 @@ gui_filter_destructor(FilterViewerData *fvd)
  *
  *  This constructor is given as a parameter to the menuitem and toolbar button
  *  registration. It creates the list.
- *  @param tab A pointer to the parent window.
+ *  @param obj Object to interact with.
  *  @return The widget created.
  */
 GtkWidget *
-h_guifilter(Tab *tab)
+h_guifilter(LttvPlugin *plugin)
 {
-  FilterViewerData* f = gui_filter(tab) ;
+  FilterViewerData* f = gui_filter(plugin) ;
 
-  if(f)
-    return guifilter_get_widget(f);
-  else return NULL;
-  
+  return NULL;
 }
 
 /**
@@ -505,15 +531,53 @@ callback_process_button(GtkWidget *widget, gpointer data) {
   g_debug("callback_process_button(): Processing expression");
   
   FilterViewerData *fvd = (FilterViewerData*)data;
+  LttvFilter* filter;
 
   if(strlen(gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field))) !=0) {
-    LttvFilter* filter = lttv_filter_new();
+    filter = lttv_filter_new();
     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);
+  } else {
+    filter = NULL;
   }
+  /* Remove the old filter if present */
+  //g_object_set_data_full(fvd->obj, "filter", filter,
+  //                      (GDestroyNotify)lttv_filter_destroy);
+  //g_object_notify(fvd->obj, "filter");
+  lttv_plugin_update_filter(fvd->plugin, filter);
+}
+
+/**
+ *  @fn void callback_cancel_button(GtkWidget*,gpointer)
+ * 
+ *  The Cancel Button callback function
+ *  @param widget The Button widget passed to the callback function
+ *  @param data Data sent along with the callback function
+ */
+void 
+callback_cancel_button(GtkWidget *widget, gpointer data) {
+
+  FilterViewerData *fvd = (FilterViewerData*)data;
+  gtk_widget_destroy(fvd->f_window);
+}
+
+gboolean callback_enter_check(GtkWidget *widget,
+    GdkEventKey *event,
+    gpointer user_data)
+{
+ g_debug("typed : %x", event->keyval);
+ switch(event->keyval) {
+   case GDK_Return:
+   case GDK_KP_Enter:
+   case GDK_ISO_Enter:
+   case GDK_3270_Enter:
+     callback_process_button(widget, user_data);
+     break;
+   default:
+     break;
+ }
+ return FALSE;
 }
 
 /**
@@ -560,11 +624,11 @@ callback_add_button(GtkWidget *widget, gpointer data) {
    */
   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_string_append(a_filter_string,s->str);
+  a_filter_string = g_string_append(a_filter_string,s->str);
   gtk_combo_box_set_active(GTK_COMBO_BOX(fvd->f_logical_op_junction_box),0);
 
   /* begin expression */
-  g_string_append_c(a_filter_string,'(');
+  a_filter_string = g_string_append_c(a_filter_string,'(');
 
   /*
    * For each simple expression, add the resulting string 
@@ -577,18 +641,18 @@ callback_add_button(GtkWidget *widget, gpointer data) {
     fvdl = (FilterViewerDataLine*)g_ptr_array_index(fvd->f_lines,i);
  
     s = g_ptr_array_index(fvd->f_not_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_not_op_box)));
-    g_string_append(a_filter_string,s->str);
+    a_filter_string = g_string_append(a_filter_string,s->str);
     
     s = g_ptr_array_index(fvd->f_field_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_field_box)));
-    g_string_append(a_filter_string,s->str);
+    a_filter_string = g_string_append(a_filter_string,s->str);
     
     s = g_ptr_array_index(fvd->f_math_op_options,gtk_combo_box_get_active(GTK_COMBO_BOX(fvdl->f_math_op_box)));
-    g_string_append(a_filter_string,s->str);
+    a_filter_string = g_string_append(a_filter_string,s->str);
     
-    g_string_append(a_filter_string,gtk_entry_get_text(GTK_ENTRY(fvdl->f_value_field)));
+    a_filter_string = g_string_append(a_filter_string,gtk_entry_get_text(GTK_ENTRY(fvdl->f_value_field)));
     
     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);
+    a_filter_string = g_string_append(a_filter_string,s->str);
     
     /*
      * resetting simple expression lines
@@ -598,7 +662,7 @@ callback_add_button(GtkWidget *widget, gpointer data) {
   }
 
   /* end expression */
-  g_string_append_c(a_filter_string,')');
+  a_filter_string = g_string_append_c(a_filter_string,')');
 
   g_string_prepend(a_filter_string,gtk_entry_get_text(GTK_ENTRY(fvd->f_expression_field)));
   gtk_entry_set_text(GTK_ENTRY(fvd->f_expression_field),a_filter_string->str);
This page took 0.026148 seconds and 4 git commands to generate.