#ifndef __CONFAPP_H
#define __CONFAPP_H

#ifndef __APPLICAT_H
#include <applicat.h>
#endif

#ifndef __CONFIG_H
#include <config.h>
#endif

#ifndef __MASK_H
#include <mask.h>
#endif


// @doc EXTERNAL

// @class TConfig_application | le applicazioni di questo tipo servono a leggere - 
//        scrivere - modificare files di configurazione.
//
// @base public | TApplication
class TConfig_application : public TApplication

// @author:(INTERNAL) Villa
//
// @comm La linea di comando e'
//
//       <nl><nl><lt>app<gt> [-f <lt>filename<gt>] [-d] [<lt>paragraph<gt>, ...]
//
//       <nl><nl>dopo <p -f> si dara' il nome file che si vuole editare, default e' CONFIG_FILE
//       definito in config.h.
//       <nl>Se si da' <p -d> viene considerato quello relativo alla
//       ditta corrente, che viene creato copiando il principale se non c'e'.
//       <nl>Quindi si da' la lista dei paragrafi che si vuole editare; se non ne vengono
//       dati sara' il modulo corrente preso dal nome dell'applicazione. Se si
//       indicano piu' paragrafi questi vengono assegnati nell'ordine alle voci
//       di menu (da mettere nell'URL) da 1 in poi. La maschera usata e' la 
//       EditMask specificata nel paragrafo; se non c'e', non accade nulla
//       <nl>Ogni modifica puo' essere controllata e porcessata con la 
//       <mf TConfig_application::postprocess_config> che agisce come la <mf TApplication::change_config>.
//       <nl>La voce Scelta parametri di <c TApplication> rimane come prima.

// @access:(INTERNAL) Private Member
{
  // @cmember:(INTERNAL) Array di paragrafi da editare
  TArray _paragraphs;
  // @cmember:(INTERNAL) Numero del file di configurazione da modificare
  int _which_config;
  // @cmember:(INTERNAL) Ultima voce di menu' selezionata
  MENU_TAG _last_choice;

  // @cmember:(INTERNAL) Config corrente
  TConfig *_cnf ;
  // @cmember:(INTERNAL) Paragrafo corrente 
  TString16 _parag;
  // @cmember:(INTERNAL) Maschera di modifica
  TMask *_m;
  // @cmember:(INTERNAL) Crea la finestra principale (vedi <c TApplication>)
  virtual bool create();
  // @cmember:(INTERNAL) Rimuove l'applicazione (vedi <c TApplication>)
  virtual bool destroy();
  // @cmember:(INTERNAL) Controlla il menu' (vedi <c TApplication>)
  virtual bool menu(MENU_TAG);

  // @cmember:(INTERNAL) Carica il config
  void load_config();

  // @cmember:(INTERNAL) Permette di modificare la configurazione del paragrafo <p m>
  void do_config(int m);

// @access Protected Member
protected:
  // @cmember:(INTERNAL) Carica i parametri su maschera
  virtual void load_mask();
  // @cmember:(INTERNAL) Salva i parametri dalla maschera
  virtual void save_mask(bool tosave) ;

  virtual bool user_create()  ;
  virtual bool user_destroy() ;

  // @cmember Viene chiamata prima della <mf TApplication::run> e ferma tutto se ritorna FALSE
  virtual bool preprocess_config (TMask& mask, TConfig& config);
  // @cmember Viene chiamata dopo la <mf TApplication::run> e blocca tutto se ritorna FALSE
  virtual bool postprocess_config (TMask& mask, TConfig& config);
  
  // @cmember Simile alla <mf TApplication::change_config>, ma viene usata 
  //      dalla maschera principale.
  virtual bool postprocess_config_changed (const char* par, const char* var, const char* oldv, const char* newv);

  virtual void on_firm_change();
  // funzione di settaggio maschere (per uso di maschere derivate)

  virtual const char* get_mask_name() const;
  virtual TMask* create_mask(const TFilename& f);
  // anche queste funzioni vanno derivata quando viene derivata la precedente; faranno uso di un puntatore a maschera diverso
  virtual TMask* get_mask() { return _m; }
  virtual void   destroy_mask() { delete _m; }
  // metodo che ritorna il config
  virtual TConfig* get_config() {return _cnf; }

// @access Public Member  
public: 
  // @cmember Setta il tipo di file di configurazione al quale e' associata l'applicazione
  void set_config(int which);
  // @cmember Costruttore
  TConfig_application(int which_config = CONFIG_GENERAL) ;
  // @cmember Distruttore
  virtual ~TConfig_application() ;
};

#endif