#ifndef __VARMASK_H

#define __VARMASK_H

#include <mask.h>
#include <msksheet.h>

// @doc EXTERNAL

// @type SPREADSHEET_GETMASK | Prototipo funzione che ritorna una maschera di edit diversa a seconda della riga
typedef TMask* (*SPREADSHEET_GETMASK)( int numriga, TMask& fullmask, bool destroy );

// @doc EXTERNAL

// @class TVariable_mask | Maschere con spreadsheet a righe variabili e con campi virtuali
//
// @base public | TMask
class TVariable_mask : public TMask
{
  // @author:(INTERNAL) Matteo    
                                              
  protected:
    bool present( short fld_id ) const { return ( id2pos( fld_id ) >= 0 ); };
    
  public:
   
  // @cmember Esegue il check e i messaggi sul campo <p fld_id> della maschera
  virtual void check_field( short fld_id );
  // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk)
  TVariable_mask( const char* name, int num = 0, int max = MAX_PAGES);
  // @cmember Setta il campo con una stringa
  virtual void set(short fld_id, const char* str, bool hit=FALSE);
  // @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di stringa
  virtual const TString& get(short fld_id) const;
  // @cmember Definsce l'handler del campo <p fld_id>
  virtual void set_handler(short fld_id, CONTROL_HANDLER handler);
  // @cmember Permette di mostrare/nascondere un campo
  virtual void show(short fld_id = -1, bool on = TRUE);
  // @cmember Abilita/disabilita un campo
  virtual void enable(short fld_id, bool on = TRUE);
  // @cmember Legge il campo da file
  virtual TMask_field* parse_field(TScanner& scanner);
        
};

// @doc EXTERNAL

// @class TVariable_sheet_field | Classe per la gestione dei campi di uno spreadsheet con righe variabili
//
// @base public | TSheet_field
class TVariable_sheet_field : public TSheet_field
{
  // @author:(INTERNAL) Alex + Guido

  // @cmember:(INTERNAL) Funzione per l'apertura della maschera di edit della riga
  //              (vedi <t SPREADSHEET_GETMASK>)
  SPREADSHEET_GETMASK _getmask;
  
protected:

  
public:
  // @cmember Setta il membro <p _set_getmask> con il valore <p n>
  void set_getmask(SPREADSHEET_GETMASK n)
  { _getmask = n; }      
                    
    // @cmember Ritorna la maschera corrispondente ad una riga dello spreadsheet
  virtual TMask& sheet_mask() const;

  // @cmember Costruttore
  TVariable_sheet_field(TMask* m) : TSheet_field(m) {}
  // @cmember Distruttore
  virtual ~TVariable_sheet_field();
};

#endif