with Gtk.Spin_Button;                   use Gtk.Spin_Button;

with Libsens.Virtual;                   use Libsens.Virtual;
with Libsens.Virtual.Work_Class;        use Libsens.Virtual.Work_Class;
  
with Libsens.Gtk_Plugins_Specifications;use Libsens.Gtk_Plugins_Specifications;

package Libsens.Gtk_Genetical is
   
   
   type Context_Record is tagged
      record
	 Population_Size           : Gtk_Spin_Button;
	 Max_Generations           : Gtk_Spin_Button;
	 Num_No_Change_Generations : Gtk_Spin_Button;
	 Mutation_Probability      : Gtk_Spin_Button;
	 Num_Elite_Saved           : Gtk_Spin_Button;
      end record;
   
   
   type Frame_Config_Record is tagged
      record
	 Max_B_Inf : Gtk_Spin_Button;
	 Max_B_Sup : Gtk_Spin_Button;
	 Min_Class_Id : Gtk_Spin_Button;
	 Min_Value_Id : Gtk_Spin_Button;
	 Min_Data_Id  : Gtk_Spin_Button;
	 Max_Class_Id : Gtk_Spin_Button;
	 Max_Value_Id : Gtk_Spin_Button;
	 Max_Data_Id  : Gtk_Spin_Button;
      end record;
   
   
   
   type Genetical_Bass_Specifications is
     new Abstract_Plugin_Specifications(Gen_Bass) with
      record	 
	 
	 Context : Context_Record;
	 Config  : Frame_Config_Record;
	 
      end record;
   
   
   procedure Initialize (Spec : in out Genetical_Bass_Specifications;
     			 Plugin : in Abstract_Plugin_Access);
   
   type Genetical_Synth_Specifications is
     new Abstract_Plugin_Specifications(Gen_Synth) with
      record	 
	 
	 Context : Context_Record;
	 Config  : Frame_Config_Record;
	 
      end record;
   
   procedure Initialize (Spec : in out Genetical_Synth_Specifications;
     			 Plugin : in Abstract_Plugin_Access);
   
   
   type Genetical_Drums_Specifications is
     new Abstract_Plugin_Specifications(Gen_Drums) with
      record	 
	 
	 Context : Context_Record;
	 Config  : Frame_Config_Record;
	 
      end record;
   
   procedure Initialize (Spec : in out Genetical_Drums_Specifications;
     			 Plugin : in Abstract_Plugin_Access);
         
   
end Libsens.Gtk_Genetical;