//    module FEditSets.h                                                      //
//                                                                            //
//    Form to edit the parameter sets for the parameter tuning                //
//                                                                            //                                                                            //
//    copyright (c) 2003 by Lars Haendel                                      //
//    home: www.newty.de                                                      //
//                                                                            //
//    This program is free software; you can redistribute it and/or modify    //
//    it under the terms of the GNU General Public License as published by    //
//    the Free Software Foundation as version 2 of the License.               //
//                                                                            //
//    This program is distributed in the hope that it will be useful,         //
//    but WITHOUT ANY WARRANTY; without even the implied warranty of          //
//    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., 675 Mass Ave, Cambridge, MA 02139, USA.               //
//                                                                            //

#ifndef FEditSetsH
#define FEditSetsH

#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Buttons.hpp>
#include <Mask.hpp>
#include <ExtCtrls.hpp>
#include <AppEvnts.hpp>

#include <values>             // due to:  MAXFLOAT

#include "data.h"             //          TData
#include "projectG.h"         //          TProjectG
#include "paraset.h"          //          TParaSet & TParaSetList

bool CheckParameterString(const bool& f_OnlyOne, AnsiString& szPara, const AnsiString& szName, const float& defVal,
      const float& min, const bool& f_Integer, const float& max=MAXFLOAT);

// Form to edit parameter sets for optimization
class TFEditSets : public TForm
   TListView *LvTasks;
   TBitBtn *BtEdit;
   TBitBtn *BtDelete;
   TBitBtn *BtAccept;
   TLabel *LaIntervals;
   TLabel *LaWmin;
   TLabel *LaEta;
   TLabel *LaCardinality;
   TLabel *LaSigma;
   TLabel *LaSpecial;
   TGroupBox *GbTask;
   TEdit *EIntervals;
   TEdit *EWmin;
   TEdit *EEta;
   TEdit *ECardinality;
   TEdit *ESigma;
   TEdit *ESpecial;
   TBitBtn *BtDefaults;
   TGroupBox *GbAcceptedTask;
   TLabel *LaWeights;
   TLabel *LaPrune;
   TLabel *LaEuclidean;
   TMaskEdit *EWeights;
   TMaskEdit *EPrune;
   TMaskEdit *EEuclidean;
   TBitBtn *BtClearAll;
   TLabel *LaSetCount2;
   TLabel *LaSetCount1;
   TBitBtn *BtOk;
   TBitBtn *BtWizard;
   TRadioGroup *RadioGroup1;
   TRadioButton *RbNormal;
   TRadioButton *RbFast;
   TRadioButton *RbExhaustive;
   TCheckBox *CbEnableEditing;
   void __fastcall FormShow(TObject *Sender);
   void __fastcall BtWizardClick(TObject *Sender);
   void __fastcall EIntervalsExit(TObject *Sender);
   void __fastcall EWminExit(TObject *Sender);
   void __fastcall EEtaExit(TObject *Sender);
   void __fastcall ECardinalityExit(TObject *Sender);
   void __fastcall ESigmaExit(TObject *Sender);
   void __fastcall ESpecialExit(TObject *Sender);
   void __fastcall BtAcceptClick(TObject *Sender);
   void __fastcall EWeightsExit(TObject *Sender);
   void __fastcall EPruneExit(TObject *Sender);
   void __fastcall EEuclideanExit(TObject *Sender);
   void __fastcall BtDefaultsClick(TObject *Sender);
   void __fastcall LvTasksSelectItem(TObject *Sender, TListItem *Item, bool Selected);
   void __fastcall BtDeleteClick(TObject *Sender);
   void __fastcall BtEditClick(TObject *Sender);
   void __fastcall BtClearAllClick(TObject *Sender);
   void __fastcall LvTasksKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
   void __fastcall BtOkClick(TObject *Sender);
   void __fastcall CbEnableEditingClick(TObject *Sender);


   void SetDefaults();                              // initialize parameters (edit task group box) with default values
   void DisplaySetCount();                          // display total number of runs

   const TData* data;                               // learn data, used to get # variables etc.
   TProjectG* prj;
   const TParaSet* para;                            // standard (default) parameters

   void AddTaskToListView(const TTask*const& task);
   void DeleteTask(const int& index);               // delete selected task from list
   void DeleteAllTasks();                           // delete all tasks from list

   void EnableTaskEditing(const bool& f_Enable);

   bool f_SomethingChanged;


   // constructor/destructor
   __fastcall TFEditSets(TComponent*) : TForm(Owner) {};
   __fastcall ~TFEditSets(){};

   bool SomethingChanged() const { return f_SomethingChanged; };     // return change flag

   void Associate(const TData*const& _data, TProjectG*const& _prj, const TParaSet*const& _para)
      { data =_data; prj=_prj; para=_para;};                         // set (learn) data, project and parameters
extern PACKAGE TFEditSets *FEditSets;