// 776500.cpp - Parametri di generazione - Maschera di immissione
#include <applicat.h>
#include <mask.h>
#include <relation.h>
#include <config.h>
#include <urldefid.h> 
#include <tabutil.h>
#include <utility.h>
#include <lffiles.h>
#include <mailbox.h>
#include <execp.h>
#include "776.h"
#include "776500.h"
#include "77lib.h"
                                             
// derivazione della classe Tmask per reimplementare
// la funzione membro can_be_closed() in modo da poter
// avvertire l'utente in caso di pressione del tasto ALT+F4
class TMaskDerived : public TMask  
{ 

public:
	// @cmember Controlla se la maschera puo' essere chiusa (TRUE se puo' esserlo)
	virtual bool can_be_closed() const;                                           
	// @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk)
  TMaskDerived(const char* title) : TMask(title) {};
	// @cmember Distruttore
  virtual ~TMaskDerived(){};
};

class TParametri_genera : public TApplication
{ 
    char  _liv;       // Se stampa a livello di studio
    int   _anno_dic;  // Anno dichiarazione nei paramentri utente o studio
    TRelation*       _rel;
    TString16        _section;
    TConfig*         _cnf;
    int              _risposta;
    bool    init_print();
  protected:                    
    virtual void on_config_change();
    virtual bool create() ;
    virtual bool destroy();
    virtual bool menu(MENU_TAG m);
  public:                   
    KEY  registra(TMask& m, bool check_dirty);
    bool main_loop();      
    static bool tipo_handler(TMask_field& f, KEY k);
    
// D = stampa ditta, S = stampa a livello di studio 
    TParametri_genera(char livello='D') : _liv(toupper(livello)) {}
};

HIDDEN TParametri_genera& app() { return (TParametri_genera&) main_app(); }

// implementazione della funzione TMaskDerived::can_be_closed()
// per segnalare all'utente l'interruzione del processo di generazione
bool TMaskDerived::can_be_closed() const
{
  bool ok = TRUE;
  if (is_running())
    ok = yesno_box("Annullare la generazione dei versamenti?");
  return ok;
}

void TParametri_genera::on_config_change()
{ 
  TConfig conf(CONFIG_STUDIO);
  _anno_dic = (int)conf.get_long(ANNO_SEL, _section); 
}

KEY TParametri_genera::registra(TMask& m, bool check_dirty)
{
	KEY k = K_YES;
	
	if (check_dirty && m.dirty())                   
		k = yesnocancel_box("Registrare le modifiche?");

  if (k == K_YES) 
  { 
		m.autosave(*_rel);
    _rel->rewrite();	
	}
	
	return k; 			
}

bool TParametri_genera::main_loop()
{                  
  long  codditta;
  int   i = 0;

  KEY tasto;

	TMaskDerived msk("776500a"); 
	msk.set_handler(F_TIPOVERS, tipo_handler); 
	msk.set_handler(F_LUOVERS, tipo_handler);
	msk.open_modal();   
  codditta = get_firm_770();   
  _rel->lfile().put("CODDITTA", codditta);
  _rel->read();
  msk.autoload(*_rel); 
  tasto = K_TAB; 
  _risposta = 0;
      
  // loop di gestione maschera 
  while (tasto != K_ESC && tasto != K_QUIT)
  {	
  	tasto = msk.run(); 
  	switch (tasto)
    {
     	case K_ESC: 
     		if (registra(msk,TRUE) == K_ESC)
     			tasto = K_TAB;
     		_risposta = 1;
     		break; 
     	case K_QUIT:  
     		if (yesno_box("Annullare la generazione dei versamenti?"))
     			_risposta = 0;  
     		else tasto = K_TAB;	
     		break;	
       case K_SAVE:     
       	registra(msk,FALSE);
       	_risposta = 1;
     	default:
     		break;
    }				
  } // endloop di gestione maschera
	msk.close_modal();

  return FALSE;
}

bool TParametri_genera::create()
{ 
  TApplication::create();
// Parametri configurazione
  _section = name(); 
  _section.cut(2); 
  _cnf     = new TConfig(CONFIG_USER, _section);
  _rel     = new TRelation (LF_BASE);
  dispatch_e_menu (BAR_ITEM(1));
  return TRUE;
}

bool TParametri_genera::destroy()
{
  delete _rel;   
  delete _cnf; 
  
  TString appname;
  TString body = "";
  
  if (_liv == 'D') 
  	appname = "771mod -3";
  else	                  
  	appname = "774 -0";
   
  body << _risposta;
  TMessage msg (appname,"",(const char*) body);
  TMailbox mb;
  mb.send(msg);

  return TApplication::destroy();
}
               
bool TParametri_genera::menu(MENU_TAG m)
{
  if (m == BAR_ITEM(1))
    return main_loop(); 
  return FALSE;
}                                                   

bool TParametri_genera::tipo_handler(TMask_field& f, KEY k) 
{   
	if (k == K_SPACE)
	{
		TString16 luogo = f.mask().get(F_LUOVERS);
		TString16 tipo = f.mask().get(F_TIPOVERS);
		if (tipo == "D")
			f.mask().show(-G_DISTINTA);
		if (luogo == "T")
			f.mask().hide(-G_SERIE);	
	}	                         
	
	return TRUE;
}
               
int ParametriGenera(int argc, char* argv[])
{
  TParametri_genera a(*argv[2]);
  a.run(argc, argv, "Parametri di generazione");
  return 0;
}