Use g_info and g_debug properly.
[lttv.git] / ltt / branches / poly / lttv / modules / gui / controlflow / drawing.c
index 2c10cb020634116c63c03c690a2e16ad397d86b4..e2138cdbbe8e474776794f3869f88610d631916c 100644 (file)
@@ -19,8 +19,9 @@
 #include <gtk/gtk.h>
 #include <gdk/gdk.h>
 
+#include <lttv/lttv.h>
 #include <lttv/processTrace.h>
-#include <lttv/gtkTraceSet.h>
+#include <lttv/gtktraceset.h>
 #include <lttv/hook.h>
 
 #include "drawing.h"
  *                              drawing functions                            *
  *****************************************************************************/
 
+static gboolean
+expose_ruler( GtkWidget *widget, GdkEventExpose *event, gpointer user_data );
+
+static gboolean
+motion_notify_ruler(GtkWidget *widget, GdkEventMotion *event, gpointer user_data);
+
+
 //FIXME Colors will need to be dynamic. Graphic context part not done so far.
 typedef enum 
 {
@@ -80,13 +88,13 @@ void drawing_data_request(Drawing_t *drawing,
   LttTime window_end = ltt_time_add(control_flow_data->time_window.time_width,
                         control_flow_data->time_window.start_time);
 
-  g_critical("req : window_end : %u, %u", window_end.tv_sec, 
+  g_debug("req : window_end : %u, %u", window_end.tv_sec, 
                                       window_end.tv_nsec);
 
-  g_critical("req : time width : %u, %u", control_flow_data->time_window.time_width.tv_sec, 
+  g_debug("req : time width : %u, %u", control_flow_data->time_window.time_width.tv_sec, 
                                 control_flow_data->time_window.time_width.tv_nsec);
   
-  g_critical("x is : %i, x+width is : %i", x, x+width);
+  g_debug("x is : %i, x+width is : %i", x, x+width);
 
   convert_pixels_to_time(drawing->drawing_area->allocation.width, x,
         &control_flow_data->time_window.start_time,
@@ -100,6 +108,8 @@ void drawing_data_request(Drawing_t *drawing,
   
   LttvTracesetContext * tsc =
         get_traceset_context(control_flow_data->mw);
+  LttvTracesetState * tss =
+        (LttvTracesetState*)tsc;
   
     //send_test_process(
   //guicontrolflow_get_process_list(drawing->control_flow_data),
@@ -116,10 +126,10 @@ void drawing_data_request(Drawing_t *drawing,
   event_request.x_begin = x;
   event_request.x_end = x+width;
 
-  g_critical("req : start : %u, %u", event_request.time_begin.tv_sec, 
+  g_debug("req : start : %u, %u", event_request.time_begin.tv_sec, 
                                       event_request.time_begin.tv_nsec);
 
-  g_critical("req : end : %u, %u", event_request.time_end.tv_sec, 
+  g_debug("req : end : %u, %u", event_request.time_end.tv_sec, 
                                       event_request.time_end.tv_nsec);
   
   LttvHooks *event = lttv_hooks_new();
@@ -131,19 +141,20 @@ void drawing_data_request(Drawing_t *drawing,
   //state_add_event_hooks_api(control_flow_data->mw);
   lttv_hooks_add(after_event, draw_after_hook, &event_request);
 
-  lttv_process_traceset_seek_time(tsc, start);
+  //lttv_process_traceset_seek_time(tsc, start);
+  lttv_state_traceset_seek_time_closest(tss, start);
   // FIXME : would like to place the after_traceset hook after the traceset,
   // but the traceset context state is not valid anymore.
   lttv_traceset_context_add_hooks(tsc,
-  //    NULL, after_traceset, NULL, NULL, NULL, NULL,
-      NULL, NULL, NULL, NULL, NULL, NULL,
-      NULL, after_traceset, NULL, event, after_event);
+      NULL, after_traceset, NULL, NULL, NULL, NULL,
+      //NULL, NULL, NULL, NULL, NULL, NULL,
+      NULL, NULL, NULL, event, after_event);
   lttv_process_traceset(tsc, end, G_MAXULONG);
   //after_data_request((void*)&event_request,(void*)tsc);
   lttv_traceset_context_remove_hooks(tsc,
-      //NULL, after_traceset, NULL, NULL, NULL, NULL,
-      NULL, NULL, NULL, NULL, NULL, NULL,
-      NULL, after_traceset, NULL, event, after_event);
+      NULL, after_traceset, NULL, NULL, NULL, NULL,
+     // NULL, NULL, NULL, NULL, NULL, NULL,
+      NULL, NULL, NULL, event, after_event);
   //Modified by xiangxiu: state update hooks are removed by the main window
   //state_remove_event_hooks_api(control_flow_data->mw);
 
@@ -182,8 +193,8 @@ configure_event( GtkWidget *widget, GdkEventConfigure *event,
   //      widget->allocation.height + SAFETY,
   //      -1);
   
-  g_critical("drawing configure event");
-  g_critical("New draw size : %i by %i",widget->allocation.width, widget->allocation.height);
+  g_debug("drawing configure event");
+  g_debug("New draw size : %i by %i",widget->allocation.width, widget->allocation.height);
   
     
   if (drawing->pixmap)
@@ -299,7 +310,7 @@ expose_event( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
                 G_OBJECT(widget),
                 "control_flow_data");
 
-  g_critical("drawing expose event");
+  g_debug("drawing expose event");
   
   guint x=0;
   LttTime* current_time = 
@@ -356,7 +367,7 @@ button_press_event( GtkWidget *widget, GdkEventButton *event, gpointer user_data
   Drawing_t *drawing = control_flow_data->drawing;
 
 
-  g_critical("click");
+  g_debug("click");
   if(event->button == 1)
   {
     LttTime time;
@@ -366,7 +377,7 @@ button_press_event( GtkWidget *widget, GdkEventButton *event, gpointer user_data
 
 
     /* left mouse button click */
-    g_critical("x click is : %f", event->x);
+    g_debug("x click is : %f", event->x);
 
     convert_pixels_to_time(widget->allocation.width, (guint)event->x,
         &control_flow_data->time_window.start_time,
@@ -376,6 +387,8 @@ button_press_event( GtkWidget *widget, GdkEventButton *event, gpointer user_data
     set_current_time(control_flow_data->mw, &time);
 
   }
+
+  set_focused_pane(control_flow_data->mw, gtk_widget_get_parent(control_flow_data->scrolled_window));
   
   return FALSE;
 }
@@ -386,10 +399,20 @@ button_press_event( GtkWidget *widget, GdkEventButton *event, gpointer user_data
 Drawing_t *drawing_construct(ControlFlowData *control_flow_data)
 {
   Drawing_t *drawing = g_new(Drawing_t, 1);
-    
-  drawing->drawing_area = gtk_drawing_area_new ();
+  
   drawing->control_flow_data = control_flow_data;
 
+  drawing->vbox = gtk_vbox_new(FALSE, 1);
+  drawing->ruler = gtk_drawing_area_new ();
+  gtk_widget_set_size_request(drawing->ruler, -1, 27);
+  
+  drawing->drawing_area = gtk_drawing_area_new ();
+
+  gtk_box_pack_start(GTK_BOX(drawing->vbox), drawing->ruler, 
+                     FALSE, FALSE, 0);
+  gtk_box_pack_end(GTK_BOX(drawing->vbox), drawing->drawing_area,
+                   TRUE, TRUE, 0);
+  
   drawing->pango_layout =
     gtk_widget_create_pango_layout(drawing->drawing_area, NULL);
   
@@ -400,6 +423,12 @@ Drawing_t *drawing_construct(ControlFlowData *control_flow_data)
       drawing,
       (GDestroyNotify)drawing_destroy);
 
+  g_object_set_data(
+      G_OBJECT(drawing->ruler),
+      "drawing",
+      drawing);
+
+
   //gtk_widget_modify_bg( drawing->drawing_area,
   //      GTK_STATE_NORMAL,
   //      &CF_Colors[BLACK]);
@@ -429,7 +458,20 @@ Drawing_t *drawing_construct(ControlFlowData *control_flow_data)
         "configure_event",
         G_CALLBACK (configure_event),
         (gpointer)drawing);
-  
+  g_signal_connect (G_OBJECT(drawing->ruler),
+        "expose_event",
+        G_CALLBACK(expose_ruler),
+        (gpointer)drawing);
+
+  gtk_widget_add_events(drawing->ruler, GDK_POINTER_MOTION_MASK);
+
+  g_signal_connect (G_OBJECT(drawing->ruler),
+        "motion-notify-event",
+        G_CALLBACK(motion_notify_ruler),
+        (gpointer)drawing);
+
+
   g_signal_connect (G_OBJECT(drawing->drawing_area),
         "expose_event",
         G_CALLBACK (expose_event),
@@ -439,7 +481,10 @@ Drawing_t *drawing_construct(ControlFlowData *control_flow_data)
         "button-press-event",
         G_CALLBACK (button_press_event),
         (gpointer)drawing);
-
+  
+  gtk_widget_show(drawing->ruler);
+  gtk_widget_show(drawing->drawing_area);
+    
   
   return drawing;
 }
@@ -454,11 +499,16 @@ void drawing_destroy(Drawing_t *drawing)
   g_free(drawing);
 }
 
-GtkWidget *drawing_get_widget(Drawing_t *drawing)
+GtkWidget *drawing_get_drawing_area(Drawing_t *drawing)
 {
   return drawing->drawing_area;
 }
 
+GtkWidget *drawing_get_widget(Drawing_t *drawing)
+{
+  return drawing->vbox;
+}
+
 /* convert_pixels_to_time
  *
  * Convert from window pixel and time interval to an absolute time.
@@ -663,4 +713,176 @@ void drawing_remove_square(Drawing_t *drawing,
   //gtk_widget_draw( drawing->drawing_area, &update_rect);
 }
 
+void drawing_update_ruler(Drawing_t *drawing, TimeWindow *time_window)
+{
+  GtkRequisition req;
+  GdkRectangle rect;
+  
+  req.width = drawing->ruler->allocation.width;
+  req.height = drawing->ruler->allocation.height;
+
+  rect.x = 0;
+  rect.y = 0;
+  rect.width = req.width;
+  rect.height = req.height;
+
+  gtk_widget_queue_draw(drawing->ruler);
+  //gtk_widget_draw( drawing->ruler, &rect);
+}
 
+/* Redraw the ruler */
+static gboolean
+expose_ruler( GtkWidget *widget, GdkEventExpose *event, gpointer user_data )
+{
+  Drawing_t *drawing = (Drawing_t*)user_data;
+
+  gchar text[255];
+  
+  PangoContext *context;
+  PangoLayout *layout;
+  PangoAttribute *attribute;
+  PangoFontDescription *FontDesc;
+  gint Font_Size;
+  PangoRectangle ink_rect;
+  guint global_width=0;
+  GdkColor foreground = { 0, 0, 0, 0 };
+  GdkColor background = { 0, 0xffff, 0xffff, 0xffff };
+
+  LttTime window_end = 
+    ltt_time_add(drawing->control_flow_data->time_window.time_width,
+                 drawing->control_flow_data->time_window.start_time);
+  LttTime half_width =
+    ltt_time_div(drawing->control_flow_data->time_window.time_width,2.0);
+  LttTime window_middle =
+    ltt_time_add(half_width,
+                 drawing->control_flow_data->time_window.start_time);
+  g_debug("ruler expose event");
+  gdk_draw_rectangle (drawing->ruler->window,
+          drawing->ruler->style->white_gc,
+          TRUE,
+          event->area.x, event->area.y,
+          event->area.width,
+          event->area.height);
+
+   GdkGC *gc = gdk_gc_new(drawing->ruler->window);
+   gdk_gc_copy(gc, drawing->ruler->style->black_gc);
+   gdk_gc_set_line_attributes(gc,
+                               2,
+                               GDK_LINE_SOLID,
+                               GDK_CAP_BUTT,
+                               GDK_JOIN_MITER);
+  gdk_draw_line (drawing->ruler->window,
+                  gc,
+                  event->area.x, 1,
+                  event->area.x + event->area.width, 1);
+
+
+  snprintf(text, 255, "%lus\n%luns",
+    drawing->control_flow_data->time_window.start_time.tv_sec,
+    drawing->control_flow_data->time_window.start_time.tv_nsec);
+
+  layout = gtk_widget_create_pango_layout(drawing->drawing_area, NULL);
+
+  context = pango_layout_get_context(layout);
+  FontDesc = pango_context_get_font_description(context);
+
+  pango_font_description_set_size(FontDesc, 6*PANGO_SCALE);
+  pango_layout_context_changed(layout);
+
+  pango_layout_set_text(layout, text, -1);
+  pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
+  global_width += ink_rect.width;
+
+  gdk_draw_layout_with_colors(drawing->ruler->window,
+      gc,
+      0,
+      6,
+      layout, &foreground, &background);
+
+  gdk_gc_set_line_attributes(gc,
+                             2,
+                             GDK_LINE_SOLID,
+                             GDK_CAP_ROUND,
+                             GDK_JOIN_ROUND);
+
+  gdk_draw_line (drawing->ruler->window,
+                   gc,
+                   1, 1,
+                   1, 7);
+
+
+  snprintf(text, 255, "%lus\n%luns", window_end.tv_sec,
+                                     window_end.tv_nsec);
+
+  pango_layout_set_text(layout, text, -1);
+  pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
+  global_width += ink_rect.width;
+
+  if(global_width <= drawing->ruler->allocation.width)
+  {
+    gdk_draw_layout_with_colors(drawing->ruler->window,
+      gc,
+      drawing->ruler->allocation.width - ink_rect.width,
+      6,
+      layout, &foreground, &background);
+
+    gdk_gc_set_line_attributes(gc,
+                               2,
+                               GDK_LINE_SOLID,
+                               GDK_CAP_ROUND,
+                               GDK_JOIN_ROUND);
+
+    gdk_draw_line (drawing->ruler->window,
+                   gc,
+                   drawing->ruler->allocation.width-1, 1,
+                   drawing->ruler->allocation.width-1, 7);
+  }
+
+
+  snprintf(text, 255, "%lus\n%luns", window_middle.tv_sec,
+                                     window_middle.tv_nsec);
+
+  pango_layout_set_text(layout, text, -1);
+  pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
+  global_width += ink_rect.width;
+
+  if(global_width <= drawing->ruler->allocation.width)
+  {
+    gdk_draw_layout_with_colors(drawing->ruler->window,
+      gc,
+      (drawing->ruler->allocation.width - ink_rect.width)/2,
+      6,
+      layout, &foreground, &background);
+
+    gdk_gc_set_line_attributes(gc,
+                               2,
+                               GDK_LINE_SOLID,
+                               GDK_CAP_ROUND,
+                               GDK_JOIN_ROUND);
+
+    gdk_draw_line (drawing->ruler->window,
+                   gc,
+                   drawing->ruler->allocation.width/2, 1,
+                   drawing->ruler->allocation.width/2, 7);
+
+
+
+
+  }
+
+  gdk_gc_unref(gc);
+  g_object_unref(layout);
+   
+  return FALSE;
+}
+
+
+/* notify mouse on ruler */
+static gboolean
+motion_notify_ruler(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
+{
+  //g_debug("motion");
+  //eventually follow mouse and show time here
+}
This page took 0.027569 seconds and 4 git commands to generate.