with Glib;                              use Glib;
with Gtk.Handlers;                      use Gtk.Handlers;
pragma Elaborate_All (Gtk.Handlers);
with Gtk.Widget;                        use Gtk.Widget;
with Gtk.Enums;                         use Gtk.Enums;
with Gtk.Frame;                         use Gtk.Frame;
with Gtk.Box;                           use Gtk.Box;
with Gtk.Label;                         use Gtk.Label;

with Libsens.Virtual.Gen_plugin;        use Libsens.Virtual.Gen_Plugin;

with Text_Io;                           use Text_Io;

package body Libsens.Gtk_Genetical is
   
   ----------------------
   -- genetical plugin --
   ----------------------         
   
   package Plugin_Cb is new Gtk.Handlers.User_Callback 
     (Gtk.Widget.Gtk_Widget_Record, 
      Abstract_Plugin_Access);
   
   
   
   procedure Max_B_Inf_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Max_B_Inf := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_B_Inf_Bass_Callback;
   
   procedure Max_B_Sup_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Max_B_Sup := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_B_Sup_Bass_Callback;
   
   
   procedure Min_Class_Id_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Min_Class_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Class_Id_Bass_Callback;
   
   procedure Max_Class_Id_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Max_Class_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Class_Id_Bass_Callback;

   
   procedure Min_Value_Id_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Min_Value_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Value_Id_Bass_Callback;
   
   procedure Max_Value_Id_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Max_Value_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Value_Id_Bass_Callback;
   
   procedure Min_Data_Id_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Min_Data_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Data_Id_Bass_Callback;
   
   procedure Max_Data_Id_Bass_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Bass_Plugin_Record(Plugin.all).Max_Data_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Data_Id_Bass_Callback;

   
            
   procedure Initialize (Spec : in out Genetical_Bass_Specifications;
     			 Plugin : in Abstract_Plugin_access) is
      
      
      Vbox : Gtk_Vbox;
      Label : Gtk_Label;
      Hbox : Gtk_Hbox;
   begin
            
      Gtk_New(Spec.Specifications_Frame, "Genetical bass : ");      
      
      Gtk_New_Vbox(Vbox, Homogeneous => False);
      
      Put_Line("Genetical bass :  0.0.0");
      Gtk_New(Spec.Config.Max_B_inf, 1.0, 1.0, 1.0);
      --Put_Line("Genetical bass :  0.1.0");
      Set_Value(Spec.Config.Max_B_inf, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Max_B_Inf));
      --Put_Line("Genetical bass :  0.2.0");
      Gtk_New_Hbox(Hbox);      
      Gtk_New(Label, "Frame b_inf  (has constant 1 : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_B_Inf, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.1");
      Plugin_Cb.Connect
        (Spec.config.Max_B_Inf, "value_changed", Plugin_Cb.To_Marshaller(Max_B_inf_Bass_Callback'Access),
	 User_Data => Plugin);
      --Put_Line("Genetical bass :  0.0.2");
      Gtk_New(Spec.Config.Max_B_Sup, 1.0, 4.0, 1.0);
      Set_Value(Spec.Config.Max_B_Sup, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Max_B_Sup));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame b_Sup (has max element)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_B_Sup, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.3");
      Plugin_Cb.Connect
        (Spec.config.Max_B_Sup, "value_changed", Plugin_Cb.To_Marshaller(Max_B_Sup_Bass_Callback'Access),
	 User_Data => Plugin);
      --Put_Line("Genetical bass :  0.0.4");
      Gtk_New(Spec.Config.Min_Class_Id, 5.0, 63.0, 1.0);
      Set_Value(Spec.Config.Min_Class_Id, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Min_Class_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min class id (has key type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Class_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.5");
      Plugin_Cb.Connect
        (Spec.config.Min_Class_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Class_Id_Bass_Callback'Access),
	 User_Data => Plugin);
      --Put_Line("Genetical bass :  0.0.6");
      Gtk_New(Spec.Config.Max_Class_Id, 24.0, 65.0, 1.0);
      Set_Value(Spec.Config.Max_Class_Id, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Max_Class_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max class id (has key type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Class_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.7");
      Plugin_Cb.Connect
        (Spec.config.Max_Class_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Class_Id_Bass_Callback'Access),
	 User_Data => Plugin);
      --Put_Line("Genetical bass :  0.0.8");
      
      Gtk_New(Spec.Config.Min_Value_Id, 25.0, 65.0, 1.0);
      Set_Value(Spec.Config.Min_Value_Id, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Min_Value_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min Value id  (has sens type) : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Value_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.9");
      Plugin_Cb.Connect
        (Spec.config.Min_Value_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Value_Id_Bass_Callback'Access),
	 User_Data => Plugin);
      --Put_Line("Genetical bass :  0.0.10");
      Gtk_New(Spec.Config.Max_Value_Id, 29.0, 127.0, 1.0);
      Set_Value(Spec.Config.Max_Value_Id, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Max_Value_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max Value id (has sens type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Value_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.11");
      Plugin_Cb.Connect
        (Spec.config.Max_Value_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Value_Id_Bass_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Min_Data_Id, 2.0, 64.0, 1.0);
      Set_Value(Spec.Config.Min_Data_Id, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Min_Data_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min Data id (has length type  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Data_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.12");
      Plugin_Cb.Connect
        (Spec.config.Min_Data_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Data_Id_Bass_Callback'Access),
	 User_Data => Plugin);
      --Put_Line("Genetical bass :  0.0.13");
      Gtk_New(Spec.Config.Max_Data_Id, 6.0, 127.0, 1.0);
      Set_Value(Spec.Config.Max_Data_Id, Gdouble(Gen_Bass_Plugin_Record(Plugin.all).Max_Data_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max Data id (has length type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Data_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
      --Put_Line("Genetical bass :  0.0.14");
      Plugin_Cb.Connect
        (Spec.config.Max_Data_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Data_Id_Bass_Callback'Access),
	 User_Data => Plugin);
      --Put_Line("Genetical bass :  0.0.15");
      
      
      Add (Spec.Specifications_Frame, Vbox);
      
      
      --Put_Line("Load seq 0.1.8.1");
      
   end Initialize;
   
   procedure Max_B_Inf_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Max_B_Inf := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_B_Inf_Synth_Callback;
   
   procedure Max_B_Sup_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Max_B_Sup := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_B_Sup_Synth_Callback;
   
   
   procedure Min_Class_Id_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Min_Class_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Class_Id_Synth_Callback;
   
   procedure Max_Class_Id_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Max_Class_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Class_Id_Synth_Callback;

   
   procedure Min_Value_Id_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Min_Value_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Value_Id_Synth_Callback;
   
   procedure Max_Value_Id_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Max_Value_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Value_Id_Synth_Callback;
   
   procedure Min_Data_Id_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Min_Data_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Data_Id_Synth_Callback;
   
   procedure Max_Data_Id_Synth_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Synth_Plugin_Record(Plugin.all).Max_Data_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Data_Id_Synth_Callback;

   
   
   procedure Initialize (Spec : in out Genetical_Synth_Specifications;
     			 Plugin : in Abstract_Plugin_access) is
      
      
      Vbox : Gtk_Vbox;
      Label : Gtk_Label;
      Hbox : Gtk_Hbox;
   begin
      
      
      
      Gtk_New(Spec.Specifications_Frame, "Genetical synth : ");      
      
      Gtk_New_Vbox(Vbox, Homogeneous => False);
      
      Gtk_New(Spec.Config.Max_B_inf, 1.0, 1.0, 1.0);
      Set_Value(Spec.Config.Max_B_inf, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Max_B_Inf));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame b_inf (has constant 1  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_B_Inf, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_B_Inf, "value_changed", Plugin_Cb.To_Marshaller(Max_B_inf_Synth_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_B_Sup, 1.0, 4.0, 1.0);
      Set_Value(Spec.Config.Max_B_Sup, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Max_B_Sup));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame b_Sup (has max element)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_B_Sup, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_B_Sup, "value_changed", Plugin_Cb.To_Marshaller(Max_B_Sup_Synth_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Min_Class_Id, 5.0, 65.0, 1.0);
      Set_Value(Spec.Config.Min_Class_Id, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Min_Class_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min class id  (has key type) : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Class_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Min_Class_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Class_Id_Synth_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_Class_Id, 24.0, 49.0, 1.0);
      Set_Value(Spec.Config.Max_Class_Id, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Max_Class_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max class id  (has key type) : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Class_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_Class_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Class_Id_Synth_Callback'Access),
	 User_Data => Plugin);
      
      
      Gtk_New(Spec.Config.Min_Value_Id, 25.0, 65.0, 1.0);
      Set_Value(Spec.Config.Min_Value_Id, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Min_Value_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min Value id (has sens type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Value_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Min_Value_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Value_Id_Synth_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_Value_Id, 25.0, 127.0, 1.0);
      Set_Value(Spec.Config.Max_Value_Id, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Max_Value_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max Value id (has sens type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Value_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_Value_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Value_Id_Synth_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Min_Data_Id, 2.0, 64.0, 1.0);
      Set_Value(Spec.Config.Min_Data_Id, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Min_Data_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min Data id (has length type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Data_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Min_Data_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Data_Id_Synth_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_Data_Id, 4.0, 127.0, 1.0);
      Set_Value(Spec.Config.Max_Data_Id, Gdouble(Gen_Synth_Plugin_Record(Plugin.all).Max_Data_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max Data id (has length type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Data_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_Data_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Data_Id_Synth_Callback'Access),
	 User_Data => Plugin);
      
      Add (Spec.Specifications_Frame, Vbox);
      
      
      --Put_Line("Load seq 0.1.8.1");
      
   end Initialize;
   
   
   procedure Max_B_Inf_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Max_B_Inf := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_B_Inf_Drums_Callback;
   
   procedure Max_B_Sup_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Max_B_Sup := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_B_Sup_Drums_Callback;
   
   
   procedure Min_Class_Id_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Min_Class_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Class_Id_Drums_Callback;
   
   procedure Max_Class_Id_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Max_Class_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Class_Id_Drums_Callback;

   
   procedure Min_Value_Id_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Min_Value_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Value_Id_Drums_Callback;
   
   procedure Max_Value_Id_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Max_Value_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Value_Id_Drums_Callback;
   
   procedure Min_Data_Id_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Min_Data_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Min_Data_Id_Drums_Callback;
   
   procedure Max_Data_Id_Drums_Callback
     (Widget  : access Gtk_Widget_Record'Class;      
      Plugin : Abstract_Plugin_Access) is
   begin      
      Gen_Drums_Plugin_Record(Plugin.all).Max_Data_Id := Integer(Gtk.Spin_Button.Get_Value(Gtk_Spin_Button(Widget)));
   exception
      when others =>
	 null;
   end Max_Data_Id_Drums_Callback;

   
   procedure Initialize (Spec : in out Genetical_Drums_Specifications;
     			 Plugin : in Abstract_Plugin_access) is
      
      
      Vbox : Gtk_Vbox;
      Label : Gtk_Label;
      Hbox : Gtk_Hbox;
   begin                  
      
      
      Gtk_New(Spec.Specifications_Frame, "Genetical Drums : ");      
      
      Gtk_New_Vbox(Vbox, Homogeneous => False);
      
      Gtk_New(Spec.Config.Max_B_inf, 1.0, 1.0, 1.0);
      Set_Value(Spec.Config.Max_B_inf, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Max_B_Inf));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame b_inf (has constant 1  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_B_Inf, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_B_Inf, "value_changed", Plugin_Cb.To_Marshaller(Max_B_inf_Drums_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_B_Sup, 1.0, 4.0, 1.0);
      Set_Value(Spec.Config.Max_B_Sup, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Max_B_Sup));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame b_Sup (has max element)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_B_Sup, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_B_Sup, "value_changed", Plugin_Cb.To_Marshaller(Max_B_Sup_Drums_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Min_Class_Id, 5.0, 24.0, 1.0);
      Set_Value(Spec.Config.Min_Class_Id, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Min_Class_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min class id  (has key type) : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Class_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Min_Class_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Class_Id_Drums_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_Class_Id, 25.0, 49.0, 1.0);
      Set_Value(Spec.Config.Max_Class_Id, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Max_Class_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max class id  (has key type) : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Class_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_Class_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Class_Id_Drums_Callback'Access),
	 User_Data => Plugin);
      
      
      Gtk_New(Spec.Config.Min_Value_Id, 5.0, 25.0, 1.0);
      Set_Value(Spec.Config.Min_Value_Id, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Min_Value_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min Value id (has sens type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Value_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Min_Value_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Value_Id_Drums_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_Value_Id, 25.0, 127.0, 1.0);
      Set_Value(Spec.Config.Max_Value_Id, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Max_Value_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max Value id (has sens type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Value_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_Value_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Value_Id_Drums_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Min_Data_Id, 2.0, 24.0, 1.0);
      Set_Value(Spec.Config.Min_Data_Id, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Min_Data_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame min Data id (has length type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Min_Data_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Min_Data_Id, "value_changed", Plugin_Cb.To_Marshaller(Min_Data_Id_Drums_Callback'Access),
	 User_Data => Plugin);
      
      Gtk_New(Spec.Config.Max_Data_Id, 28.0, 65.0, 1.0);
      Set_Value(Spec.Config.Max_Data_Id, Gdouble(Gen_Drums_Plugin_Record(Plugin.all).Max_Data_Id));
      Gtk_New_Hbox(Hbox);
      Gtk_New(Label, "Frame max Data id (has length type)  : ");      
      Pack_Start(Hbox, Label, False, False, 2);
      Pack_Start(Hbox, Spec.Config.Max_Data_Id, False, False, 2);
      Pack_Start(Vbox, Hbox, False, False, 2);
            
      Plugin_Cb.Connect
        (Spec.config.Max_Data_Id, "value_changed", Plugin_Cb.To_Marshaller(Max_Data_Id_Drums_Callback'Access),
	 User_Data => Plugin);
      
      Add (Spec.Specifications_Frame, Vbox);
      --Put_Line("Load seq 0.1.8.1");
      
   end Initialize;
      
end Libsens.Gtk_Genetical;