#include <confapp.h>
#include <mask.h>
#include <relation.h>
#include <urldefid.h>

bool TConfig_application::create()
{
  TApplication::create();

  _last_choice = BAR_ITEM(1);

  // process args
  TString arg(16);
  for (int i = 0; i < argc(); i++)
  {
    arg = argv(i);
    if (arg == "-c")
      _which_config = atoi(argv(++i));
    else
      if (arg[0] == '-')
        continue;
      else
      {
        TString* argp = new TString(arg);
        _paragraphs.add(argp);
      }
  }

  user_create();
  dispatch_e_menu(_last_choice);
  return TRUE;
}

bool TConfig_application::destroy()
{
  bool b = user_destroy();
  TApplication::destroy();
  return b;
}

bool TConfig_application::menu(MENU_TAG m)
{
  // funziona da se' fino a 20 voci della menubar
  if (m >= BAR_ITEM(1) && m <= BAR_ITEM(20))
  {
    _last_choice = m;
    do_config((m - BAR_ITEM(0))/100);
  }
  return xvt_test_menu_tag(BAR_ITEM(2));
}

void TConfig_application::do_config(int m)
{
  TString par(name()); 
  if (m < _paragraphs.items())
    par = (TString&)_paragraphs[m];
  else par.cut(2); 

  for (;;)
  {
    TConfig cnf(_which_config, par);
    
    const TFilename maskname(cnf.get("EdMask"));
    if (!maskname.empty())
    {
      TMask m(maskname);
      
      // carica campi
      const int max = m.fields();
      for (int i = 0; i < max; i++)
      {                    
        TMask_field& f = m.fld(i);
        if (f.field() != NULL)
        {
          const TFieldref* fr = f.field();
          const char* fname = fr->name();
          const int index = fr->to();
          TString& oldvl = cnf.get(fname,NULL, index > -1 ? index : -1);
          if (!oldvl.empty())
            f.set(oldvl);
        }  
      }
      
      // run mask
      if (!preprocess_config(m,cnf)) 
        break;

      int k = m.run();
      if (postprocess_config(m,cnf))
      {
        bool tosave = k == K_ENTER || k == K_SAVE;
        
        if (k == K_ENTER || k == K_QUIT)
        {
          // aggiusta campi
          for (i = 0; i < max; i++)
          {
            TMask_field& f = m.fld(i);
            if (f.dirty() && f.field())
            {
              const char* fname = f.field()->name();
              const char* value = f.get();
              const int index = f.field()->to();
              const char* oldvl = cnf.get(fname);
                
              if (!tosave)
                tosave = yesno_box("Modifiche non registrate. Salvare?");
                
              if (!tosave) break;
                
              if (postprocess_config_changed(par, fname, oldvl, value))
                cnf.set(fname, value, NULL, TRUE, index > -1 ? index : -1); 
            }
          }
        }
        else break;  
      }  
      if (k == K_QUIT) 
        break;
    }
    else 
    {
      warning_box("Nessun parametro da configurare");
      break;
    }
  }
}

bool TConfig_application::preprocess_config (TMask& mask, TConfig& config)
{ 
  return TRUE;
}

bool TConfig_application::postprocess_config (TMask& mask, TConfig& config)
{ 
  return TRUE;
}

// @doc EXTERNAL

// @mfunc Simile alla <mf TApplication::change_config>, ma viene usata 
//        dalla maschera principale.
//
// @rdesc Ritorna i seguenti valori:
//
// @flag TRUE | Se la modifica viene acettatta (dafault)
// @flag FALSE | Se la modifica non viene accettata
bool TConfig_application::postprocess_config_changed(
     const char* par,  // @parm Paragrafo in corso di editing
     const char* var,  // @parm vedi <c TApplication>
     const char* oldv, // @parm vedi <c TApplication>
     const char* newv) // @parm vedi <c TApplication>

// @comm Rispetto alla <mf TApplication::change_config> le viene passato in piu' il paragrafo
//       in corso di editing. E' chiamata per ogni parametro modificato.

{
  return TRUE; 
}