move lttv to root
[lttv.git] / lttv / modules / gui / histogram / histobuttonwidget.c
diff --git a/lttv/modules/gui/histogram/histobuttonwidget.c b/lttv/modules/gui/histogram/histobuttonwidget.c
new file mode 100644 (file)
index 0000000..d4a87f5
--- /dev/null
@@ -0,0 +1,250 @@
+/* This file is part of the Linux Trace Toolkit viewer
+ * Copyright (C) 2006 Parisa Heidari
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, 
+ * MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "histobuttonwidget.h"
+#include "histodrawing.h"
+#include "histodrawitem.h"
+
+extern void histogram_show(HistoControlFlowData *histocontrol_flow_data,
+                          guint draw_begin, guint draw_end);
+
+#ifndef g_info
+#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
+#endif
+#ifndef g_debug
+#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
+#endif
+
+/* Preallocated Size of the index_to_pixmap array */
+#define ALLOCATE_PROCESSES 1000
+
+/*****************************************************************************
+ *                                       *
+ *****************************************************************************/
+static GtkWidget *xpm_label_box( gchar     *xpm_filename,
+                                 gchar     *label_text );
+static gboolean gplus( GtkWidget *widget,gpointer user_data)
+{
+  HistoControlFlowData *histo_cfd =  (HistoControlFlowData *)user_data;
+  //histo_cfd->vertical_ratio =histo_cfd->vertical_ratio * (1.0/2.0);  
+  if(histo_cfd->max_height>1)
+  {
+       histo_cfd->max_height /= 2;
+   //just redraw.horizontal scale is not changed so Array's data are valid.
+       histogram_show(histo_cfd ,0,histo_cfd->number_of_process->len);
+  }
+  else
+       g_warning("Zoom more than 1 event is impossible");
+       
+  histo_drawing_update_vertical_ruler(histo_cfd->drawing);//, TimeWindow *time_window);
+  return 0;
+}
+
+static gboolean gMinus( GtkWidget *widget,
+                   gpointer user_data )
+{
+  HistoControlFlowData *histo_cfd = (HistoControlFlowData *)user_data;
+  histo_cfd->max_height *= 2;
+  //just redraw.horizontal scale is not changed so Array's data are valid.
+  histogram_show(histo_cfd ,0,histo_cfd->number_of_process->len);
+  histo_drawing_update_vertical_ruler(histo_cfd->drawing);//, TimeWindow *time_window);
+  return 0;
+}
+
+static gboolean gFit( GtkWidget *widget,
+                   gpointer user_data )
+{
+  /*find the maximum value and put max_height equal with this maximum*/
+  HistoControlFlowData *histo_cfd = (HistoControlFlowData *)user_data;
+  gint i=1,x;
+  guint maximum;
+  maximum =g_array_index(histo_cfd->number_of_process,guint,i);
+  for (i=1; i < histo_cfd->number_of_process-> len ;i++)
+  {
+       x=g_array_index(histo_cfd->number_of_process,guint,i);
+       maximum=MAX(x,maximum);
+  }
+  if (maximum >0)
+  {
+       histo_cfd->max_height=maximum;
+        histogram_show (histo_cfd,0,histo_cfd->number_of_process->len);
+  }
+  histo_drawing_update_vertical_ruler(histo_cfd->drawing);
+  
+  return 0;
+}
+/* Create a new hbox with an image and a label packed into it
+ * and return the box. */
+
+static GtkWidget *xpm_label_box( gchar* xpm_filename,
+                                 gchar     *label_text )
+{
+    GtkWidget *box;
+    GtkWidget *label;
+    GtkWidget *image;
+
+    GdkPixbuf *pixbufP;
+    //GError **error;
+    /* Create box for image and label */
+    box = gtk_hbox_new (FALSE, 0);
+    gtk_container_set_border_width (GTK_CONTAINER (box), 1);
+
+    /* Now on to the image stuff */
+        
+    pixbufP = gdk_pixbuf_new_from_xpm_data((const char **)&xpm_filename);
+    image =  gtk_image_new_from_pixbuf(pixbufP);
+
+    /* Create a label for the button */
+    label = gtk_label_new (label_text);
+
+    /* Pack the image and label into the box */
+    gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 1);
+    gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 1);
+
+    gtk_widget_show (image);
+    gtk_widget_show (label);
+
+    return box;
+}
+
+ButtonWidget *histo_buttonwidget_construct(HistoControlFlowData *histocontrol_flow_data)
+{
+  GtkWidget *boxPlus, *boxMinus , *boxfit;//containing text and image for each button.
+
+  ButtonWidget *buttonwidget = g_new(ButtonWidget,1);
+  buttonwidget->histo_control_flow_data = histocontrol_flow_data;
+  /* Put + and - on the vbox and assign related functions to each button */
+  buttonwidget-> vbox1 = gtk_vbox_new (FALSE, 0);
+  
+// Add 2 buttons on the vbox 
+//  buttonwidget ->buttonP = gtk_button_new_with_mnemonic ("+");
+//  buttonwidget->buttonM = gtk_button_new_with_mnemonic ("-");
+// Instead, add 2 button with image and text:
+
+  buttonwidget ->buttonP =gtk_button_new ();
+  buttonwidget ->buttonM =gtk_button_new ();
+  buttonwidget ->buttonFit =gtk_button_new ();
+
+/* This calls our box creating function */
+  boxPlus = xpm_label_box ("stock_zoom_in_24.xpm", "vertical");
+  boxMinus = xpm_label_box ("stock_zoom_out_24.xpm", "vertical");
+  boxfit = xpm_label_box ("stock_zoom_fit_24.xpm", "vertical");
+
+/* Pack and show all widgets */
+  gtk_widget_show (boxPlus);
+  gtk_widget_show (boxMinus);
+  gtk_widget_show (boxfit);
+
+  gtk_container_add (GTK_CONTAINER (buttonwidget -> buttonP), boxPlus);
+  gtk_container_add (GTK_CONTAINER (buttonwidget -> buttonM), boxMinus);
+  gtk_container_add (GTK_CONTAINER (buttonwidget -> buttonFit), boxfit);
+
+  gtk_box_pack_start (GTK_BOX (buttonwidget->vbox1),buttonwidget->buttonP, TRUE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (buttonwidget->vbox1),buttonwidget->buttonM, TRUE, FALSE, 0);
+  gtk_box_pack_end (GTK_BOX (buttonwidget->vbox1),buttonwidget->buttonFit, TRUE, FALSE, 0);
+
+    /* When the button receives the "clicked" signal, it will call the
+     * function gplus() passing it NULL as its argument.  The gplus()
+     * function is defined above . */
+
+    g_signal_connect (G_OBJECT (buttonwidget ->buttonP), "clicked",
+               G_CALLBACK (gplus), (gpointer)histocontrol_flow_data);
+    g_signal_connect (G_OBJECT ( buttonwidget->buttonM), "clicked",
+               G_CALLBACK (gMinus), (gpointer)histocontrol_flow_data);
+    g_signal_connect (G_OBJECT ( buttonwidget->buttonFit), "clicked",
+               G_CALLBACK (gFit), (gpointer)histocontrol_flow_data);
+
+  gtk_widget_show (buttonwidget -> vbox1);
+  gtk_widget_show (buttonwidget ->buttonP);
+  gtk_widget_show (buttonwidget ->buttonM);
+  gtk_widget_show (buttonwidget ->buttonFit);
+
+  return buttonwidget;
+}
+
+void histo_buttonwidget_destroy(ButtonWidget *buttonwidget)
+{
+  g_debug("buttonwidget_destroy %p", buttonwidget);
+  
+  g_free(buttonwidget);
+  g_debug("buttonwidget_destroy end");
+}
+
+GtkWidget *histo_buttonwidget_get_widget(ButtonWidget *button_widget)
+{
+  return button_widget->vbox1;
+}
+
+
+
+void histo_rectangle_pixmap (GdkGC *gc,
+    gboolean filled, gint x, gint y, gint width, gint height,
+                                  histoDrawing_t *value)
+{
+  if(height == -1)
+    height = value->drawing_area->allocation.height;
+  if(width == -1)
+    height = value->drawing_area->allocation.width; 
+  gdk_draw_rectangle (value->pixmap,
+      gc,
+      filled,
+      x, y,
+      width, height);
+}
+
+//This could be usefull if a vertical scroll bar is added to viewer:
+void histo_copy_pixmap_region(histoDrawing_t *drawing,GdkDrawable *dest,
+    GdkGC *gc, GdkDrawable *src,
+    gint xsrc, gint ysrc,
+    gint xdest, gint ydest, gint width, gint height)
+{
+
+  if(dest == NULL)
+    dest = drawing->pixmap;
+  if(src == NULL)
+    src = drawing->pixmap;
+
+  gdk_draw_drawable (dest,gc,src,xsrc, ysrc,
+      xdest, ydest,width, height);
+}
+
+void histo_update_pixmap_size(histoDrawing_t *value,
+                                    guint width)
+{
+  GdkPixmap *old_pixmap = value->pixmap;
+
+  value->pixmap = 
+        gdk_pixmap_new(old_pixmap,
+                       width,
+                       value->height,
+                       -1);
+
+  gdk_pixmap_unref(old_pixmap);
+}
+
This page took 0.024689 seconds and 4 git commands to generate.