#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

// le applicazioni di questo tipo servono a leggere - scrivere - modificare
// files di configurazione. La linea di comando e'
//
//  <app> [-f <filename>] [-d] [<paragraph>, ...]
//
// dopo -f si dara' il nome file che si vuole editare, default e' CONFIG_FILE
// definito in config.h. Se si da' -d viene considerato quello relativo alla
// ditta corrente, che viene creato copiando il principale se non c'e'.
// 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', nothing happens

// Ogni modifica puo' essere controllata e porcessata con la postprocess_
// config (vedi sotto) che agisce come la change_config di application.
// La voce Scelta parametri di Application rimane come prima.

class TConfig_application : public TApplication
{

  TArray   _paragraphs;
  int      _which_config;
  MENU_TAG _last_choice;

  virtual bool create();
  virtual bool destroy();
  virtual bool menu(MENU_TAG);
  
  void    do_config(int m);

protected:
  
  virtual bool user_create()  { return TRUE; }
  virtual bool user_destroy() { return TRUE; }

  // questa viene chiamata prima della run() e ferma tutto se ritorna
  // FALSE
  virtual bool preprocess_config (TMask& mask, TConfig& config);
  // questa viene chiamata dopo e blocca tutto se FALSE
  virtual bool postprocess_config (TMask& mask, TConfig& config);
  
  // questa e' come la change_config di application ma viene usata 
  // dalla maschera principale; le viene passato in piu' il paragrafo
  // in corso di editing. E' chiamata per ogni parametro modificato
  // Se ritorna FALSE la modifica non viene accettata; default ritorna
  // TRUE e non rompe i bal
  virtual bool postprocess_config_changed (const char* par, const char* var, 
                                           const char* oldv, const char* newv);

  
public: 
  
  TConfig_application(int which_config = CONFIG_GENERAL) 
    : _which_config(which_config)
    {}
  virtual ~TConfig_application() 
  {}
};

#endif