#ifndef __BRWBUT_H #define __BRWBUT_H /////////////////////////////////////////////////////////// // TBrowse_button /////////////////////////////////////////////////////////// class TEdit_field; class TEditable_field; class TBrowse_button : public TObject { TEdit_field* _fld; protected: // @cmember Ritorna il primo valore di
TEdit_field& field() const { return *_fld; } // @cmember Ritorna il campo
-esimo
  TEditable_field& field(short id) const;
public:             
  // @cmember Controlla la sintassi della input del campo e ne setta i membri
  virtual void parse_input(TScanner& scanner) pure;
  // @cmember Controlla la sintassi della output del campo e ne setta i membri
  virtual void parse_output(TScanner& scanner) pure;
          
  virtual KEY run() pure;
  
  // @cmember Controlla la validita' del campo
  virtual bool check(CheckTime = RUNNING_CHECK) pure;
  
  virtual bool is_browse() const  { return false; }
  virtual bool is_sheet() const   { return false; }
  virtual bool is_filesel() const { return false; }
  virtual bool is_profile() const { return false; }
  
  TBrowse_button(TEdit_field* f);
  virtual ~TBrowse_button();
};
///////////////////////////////////////////////////////////
// TBrowse
///////////////////////////////////////////////////////////
                
// @class TList_sheet | Classe per la gestione dei list sheet
class TList_sheet : public TBrowse_button
// @author:(INTERNAL) Guido
{
  // @access:(INTERNAL) Private Memeber
  // @cmember:(INTERNAL) Numero di riga corrente dello sheet
  int _row;
  
  // @cmember:(INTERNAL) Titolo dello sheet
  TString       _caption;
  
  // @cmember:(INTERNAL) Testate delle colonne dello sheet
  TToken_string _head;
  
  // @cmember:(INTERNAL) Righe dello sheet
  TString_array _data;
  // @cmember:(INTERNAL) Campi di input sulla maschera
  TToken_string _inp_id;
  
  // @cmember:(INTERNAL) Campi di output sulla maschera
  TToken_string _out_id;
  // @access Protected Member
protected:
  // @cmember Ritorna il numero di riga selezionata
  int do_input();
  // @cmember Scrive l'output della ricerca sulla maschera
  void do_output(CheckTime = RUNNING_CHECK);
  // @cmember Controlla la sintassi della input del campo e ne setta i membri 
  void parse_input(TScanner& scanner);
  // @cmember Controlla la sintassi della output del campo e ne setta i membri
  void parse_output(TScanner& scanner);
  
  // @access Public Memeber
public:
  // @cmember Legge dal file gli item dello sheet
  void parse_item(TScanner& scanner);
  // @cmember Controlla la validita' del campo
  virtual bool check(CheckTime = RUNNING_CHECK);
  // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca
  virtual KEY run();
  virtual bool is_sheet() const  { return true; }
  
  TString_array& rows_array() { return _data; }
  
    // @cmember Costruttore
  TList_sheet(TEdit_field* f, const char* caption, const char* head);
  // @cmember Distruttore
  virtual ~TList_sheet();
};
                
// @doc INTERNAL
// @class TBrowse | Classe per la definizione dei campi con ricerca
class TBrowse : public TBrowse_button
// @author:(INTERNAL) Guido
{
  // @access:(INTERNAL) Private Member
  // @cmember:(INTERNAL) Relazione della ricerca    
  TRelation* _relation;
  // @cmember:(INTERNAL) Cursore sulla relazione
  TCursor* _cursor;
  // @cmember:(INTERNAL) Comando da eseguire alla pressione del tasto Gestione
  TString _insert;
  // @cmember:(INTERNAL) Filtro sul cursore
  TString _filter;
  // @cmember:(INTERNAL) Record selezionato
  long _rec;
  // @cmember:(INTERNAL) Indica se e' presente un campo secondario nella ricerca
  bool _secondary;
  // @cmember:(INTERNAL) Indica se sul campo e' gia' stato effettuato il check
  bool _checked;
  // @cmember:(INTERNAL) Chiave di ricerca alternativa (quando il testo del campo comincia con %)
  TBrowse_button* _alt_browse;  
  // @cmember:(INTERNAL) Testate della maschera di ricerca
  TToken_string _head;
  // @cmember:(INTERNAL) Campi visualizzati dalla maschera di ricerca
  TToken_string _items;
  // @cmember:(INTERNAL) Campi di input sulla maschera
  TToken_string _inp_id;
  // @cmember:(INTERNAL) Campi di input sul file
  TToken_string _inp_fn;
  // @cmember:(INTERNAL) Campi di output sulla maschera
  TToken_string _out_id;
  // @cmember:(INTERNAL) Campi di output sul file
  TToken_string _out_fn;
  // @cmember:(INTERNAL) handler di filtro custom
	CONTROL_HANDLER _custom_filter_handler;
  // @access Protected Member
protected:
  // @cmember Azzera i campi di output sulla maschera
  void do_clear(CheckTime t);
  // @cmember Chiama la maschera di gestione della ricerca
  bool do_link(bool insert);
  // @cmember Modifica il cursore
	void custom_cursor();
  // @cmember Crea lista identificatori di ricerca
  TToken_string& create_siblings(TToken_string& siblings) const;
  // @access Public Member
public:
  // @cmember Modifica il display
	void custom_display();
	// @cmember Ritorna il numero di inputs senza contare quelli che funzionano
  //          solo da filtro
  int input_fields();
  // @cmember Ritorna la lista completa degli identificatori dei campi di input
  const char* get_input_fields() const;
  
  // @cmember Ritorna la lista completa dei nomi dei campi di input
  const char* get_input_field_names() const;
  
  // @cmember Aggiorna la lista completa degli identificatori dei campi di input
	void set_input_fields(const char * inp_id) { _inp_id = inp_id;}
	// @cmember Aggiorna la lista completa degli identificatori dei campi di input da un campo
	void copy_input(const TBrowse * b);
  
  // @cmember Aggiorna la lista completa dei nomi dei campi di input
	void set_input_field_names(const char * inp_names) { _inp_fn = inp_names;}
  
  // @cmember Aggiunge un campo di input alla posizione  
  const TString& get_insert() const
  { return _insert;}
  
  // @cmember Ritorna il valore di  
  const TString& get_filter() const
  { return _filter;}
  // @cmember Cambia il filtro della browse 
  void set_filter(const char * filter)
  { _filter = filter;}
  // @cmember Cambia il cursore della browse 
  void set_cursor(TCursor * c);
  // @cmember Cambia il filtro della browse 
	void set_custom_filter_handler(CONTROL_HANDLER custom_filter_handler) { _custom_filter_handler = custom_filter_handler;}
  // @cmember Controlla la validita' del campo
  bool check(CheckTime = RUNNING_CHECK);
  // @cmember Controlla se il campo puo' essere vuoto
  bool empty_check();
  // @cmember Ritorna il valore di  
  const TToken_string& head() const
  { return _head;}
  // @cmember Ritorna il valore di  
  const TToken_string& items() const
  { return _items;}
  // @cmember Ritorna il valore di  
  TCursor* cursor() const
  { return _cursor;}
  // @cmember Ritorna il valore di  
  bool checked() const
  { return _checked;}
  // @cmember Ritorna il valore di  
  bool secondary() const
  { return _secondary;}
  bool set_alt_browse(int altkey);
  
  virtual bool is_browse() const { return true; }
  // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca
  virtual KEY run();
};
class TFuzzy_browse : public TBrowse_button
{
protected:
  virtual void parse_input(TScanner&) {}
  virtual void parse_output(TScanner&) {}
  long find_magic(const TString& magic_val, double& best);
protected:
  const int _altkey;
  TString16 _altfld, _outfld;
  virtual TCursor& cursor();
public:
  virtual bool check(CheckTime = RUNNING_CHECK);
  virtual KEY run();
  virtual long find(const TString& val);
  TFuzzy_browse (TEdit_field* ef, int key);
};
class TAlternative_browse : public TFuzzy_browse
{
  TCursor* _cursor;
protected:
  virtual TCursor& cursor();
public:
  virtual KEY run();
  
  TAlternative_browse(TEdit_field* ef, int altkey);
  ~TAlternative_browse();
};
class TFile_select : public TBrowse_button
{
  TFilename _filter;
public:
  // @cmember Controlla la sintassi della input del campo e ne setta i membri
  virtual void parse_input(TScanner& scanner);
  // @cmember Controlla la sintassi della output del campo e ne setta i membri
  virtual void parse_output(TScanner& scanner);
          
  virtual KEY run();
  
  // @cmember Controlla la validita' del campo
  virtual bool check(CheckTime = RUNNING_CHECK);
  virtual bool is_filesel() const { return true; }
  TFile_select(TEdit_field* ef, const char* filter);
  virtual ~TFile_select() { }
};
class TDir_select : public TBrowse_button
{
public:
  // @cmember Controlla la sintassi della input del campo e ne setta i membri
  virtual void parse_input(TScanner& scanner);
  // @cmember Controlla la sintassi della output del campo e ne setta i membri
  virtual void parse_output(TScanner& scanner);
          
  virtual KEY run();
  
  // @cmember Controlla la validita' del campo
  virtual bool check(CheckTime = RUNNING_CHECK);
  virtual bool is_filesel() const { return TRUE; }
  TDir_select(TEdit_field* ef);
  virtual ~TDir_select() { }
};
class TReport_select : public TBrowse_button
{
  TString _classe;
public:
  // @cmember Controlla la sintassi della input del campo e ne setta i membri
  virtual void parse_input(TScanner& scanner);
  // @cmember Controlla la sintassi della output del campo e ne setta i membri
  virtual void parse_output(TScanner& scanner);
          
  virtual KEY run();
  
  // @cmember Controlla la validita' del campo
  virtual bool check(CheckTime = RUNNING_CHECK);
  virtual bool is_filesel() const { return true; }
  TReport_select(TEdit_field* ef, const char* classe);
  virtual ~TReport_select() { }
};
class TProfile_select : public TBrowse_button
{      
protected:
  // @cmember Controlla la sintassi della input del campo e ne setta i membri
  virtual void parse_input(TScanner& scanner);
  // @cmember Controlla la sintassi della output del campo e ne setta i membri
  virtual void parse_output(TScanner& scanner);
public:
  virtual KEY run();
  
  // @cmember Controlla la validita' del campo
  virtual bool check(CheckTime = RUNNING_CHECK);
  // @cmember E' un campo profilo
  virtual bool is_profile() const { return true; }
  
  // @cmember Estrae dal .ini tutti i profili
  int get_descriptions(TString_array& a) const;
  TProfile_select(TEdit_field* ef);
  virtual ~TProfile_select() { }
};
#endif