// Copyright (C) 1999 Jean-Marc Valin

#include "PlotProbe.h"
#include "net_types.h"
#include "Object.h"
#include <gnome.h>
#include "Vector.h"

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

using namespace std;

namespace FD {

DECLARE_NODE(PlotProbe)
/*Node
 *
 * @name PlotProbe
 * @category Probe
 * @description No description available
 *
 * @input_name INPUT
 * @input_description No description available
 *
 * @output_name OUTPUT
 * @output_description No description available
 *
 * @parameter_name BREAK_AT
 * @parameter_description No description available
 *
 * @parameter_name SHOW
 * @parameter_description No description available
 *
 * @parameter_name SKIP
 * @parameter_description No description available
 *
END*/



PlotProbe::PlotProbe(string nodeName, ParameterSet params) 
   : Probe(nodeName, params)
   , xmin(0.0)
   , xmax(400)
   , ymin(0.0)
   , ymax(250)
{
}

PlotProbe::~PlotProbe()
{

}

void PlotProbe::initialize()
{
   Probe::initialize();
   gdk_threads_enter(); 

   try {
   GtkWidget *scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
   gtk_widget_ref (scrolledwindow1);
   gtk_object_set_data_full (GTK_OBJECT (vbox2), "scrolledwindow1", scrolledwindow1,
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (scrolledwindow1);

   
   gtk_widget_push_visual (gdk_rgb_get_visual ());
   gtk_widget_push_colormap (gdk_rgb_get_cmap ());
   GtkWidget *canvas1 = gnome_canvas_new ();
   gtk_widget_pop_colormap ();
   gtk_widget_pop_visual ();

   gtk_window_set_default_size(GTK_WINDOW(window1), int(xmax-xmin+20), int(ymax-ymin+70));
   //gtk_window_set_policy (GTK_WINDOW(window1), FALSE, FALSE, TRUE);
   //canvas1 = gtk_scrolled_window_new (NULL, NULL);
   //canvas1 = gtk_layout_new();

   gtk_widget_ref (canvas1);
   gtk_object_set_data_full (GTK_OBJECT (window1), "canvas1", canvas1,
			     (GtkDestroyNotify) gtk_widget_unref);

   gtk_widget_show (canvas1);

   //gtk_widget_show (canvas1);
   gtk_container_add (GTK_CONTAINER (scrolledwindow1), canvas1);
   //gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas1), -400, -400, 400, 400);


   gtk_box_pack_start (GTK_BOX (vbox2), scrolledwindow1, TRUE, TRUE, 0);
   //gtk_box_pack_start (GTK_BOX (vbox2), canvas1, TRUE, TRUE, 0);
   
   canvas = GNOME_CANVAS(canvas1);


   gnome_canvas_set_scroll_region(canvas, xmin, ymin, xmax, ymax);

   group = GNOME_CANVAS_GROUP (
      gnome_canvas_item_new (gnome_canvas_root(canvas),
			     gnome_canvas_group_get_type(),
			     "x", 0.0,
			     "y", 0.0,
			     NULL));
   

   GnomeCanvasPoints *points;
   points = gnome_canvas_points_new(2);
   points->coords[0]=xmin;
   points->coords[1]=.5*(ymin+ymax);
   points->coords[2]=xmax;
   points->coords[3]=.5*(ymin+ymax);
   
   
   item = gnome_canvas_item_new(group,
                                gnome_canvas_line_get_type(),
                                "points" , points,
                                "fill_color", "black",
                                "width_pixels", 1,
                                NULL);

   gnome_canvas_points_unref(points);

   //gtk_box_pack_start (GTK_BOX (vbox2), scrolledwindow2, TRUE, TRUE, 0);

   } catch (BaseException *e)
   {
      gdk_threads_leave();
      throw e->add(new NodeException(this, "Exception caught in Probe::specifigInitialize", __FILE__, __LINE__));
   }
   
   gdk_threads_leave();

}

void PlotProbe::reset()
{
   Probe::reset();
}


void PlotProbe::display()
{
   GnomeCanvasPoints *points;
   gdk_threads_enter();
   
   Vector<float> &data = object_cast<Vector<float> > (inputValue);
   points = gnome_canvas_points_new(data.size());
      
   double datamin, datamax;
   datamin = datamax = data[0];
   for (int i=0;i<data.size();i++)
   {
      if (data[i] > datamax)
	 datamax = data[i];
      if (data[i] < datamin)
	 datamin = data[i];
   }
   datamax+=.00001;
   for (int i=0;i<data.size();i++)
   {
      //points->coords[2*i]=(100.0*i)/length;
      points->coords[2*i]=xmin+((xmax-xmin)*i)/(data.size()-1);
      points->coords[2*i+1]= ymin + (ymax-ymin)*(1-(data[i]-datamin)/(datamax-datamin));
   }
      
   gnome_canvas_item_set(item, "points", points, NULL);
      
   gnome_canvas_points_unref(points);
      
   gdk_threads_leave();
}

void PlotProbe::show_hide()
{
   Probe::show_hide();
   if (!displayEnable)
   {
      GnomeCanvasPoints *points;
      points = gnome_canvas_points_new(2);
      points->coords[0]=xmin;
      points->coords[1]=.5*(ymin+ymax);
      points->coords[2]=xmax;
      points->coords[3]=.5*(ymin+ymax);
      gnome_canvas_item_set(item, "points", points, NULL);
   
      
      
      gnome_canvas_points_unref(points);
      
   }
}
}//namespace FD


syntax highlighted by Code2HTML, v. 0.9.1