// gestione tabelle Contabilita' Analitica
#include <automask.h>
#include <modaut.h>
#include <tabapp.h>

#include "calib01.h"
#include "calibmsk.h"
#include "catbauc.h"

////////////////////////////////////////////////////////////////////////
//MASCHERA GENERICA DI TABELLA NON GERARCHICA 
////////////////////////////////////////////////////////////////////////
// maschere delle tabelle di Contabilita' Analitica
class TMask_tabca : public TAutomask
{

protected:
  bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
  TMask_tabca(const char * ,const TString16 &);
  virtual ~TMask_tabca();
};

TMask_tabca::TMask_tabca(const char * _maskname,const TString16 &tabname):
  TAutomask(_maskname)
{
}

TMask_tabca::~TMask_tabca()
{
}

bool TMask_tabca::on_field_event(TOperable_field& o, TField_event e, long jolly)
{ 
/*  switch (o.dlg())
  {

  default: break;
  }*/  
  return true;
}


////////////////////////////////////////////////////////////////////////
//MASCHERA GENERICA DI TABELLA GERARCHICA (attualmente usata per tutte le tabelle catbxxx)
////////////////////////////////////////////////////////////////////////
class TMask_tabanal : public TSimple_anal_msk
{
  const char* _codtab;
  const char* _keyvar;
  const char* _desvar;

protected:
  virtual int get_logicnum() const { return LF_TAB; }
  virtual const char* get_tabname() const {return _codtab; }
  virtual const char* get_key_var() const { return _keyvar; }
  virtual const char* get_des_var() const { return _desvar; }
  virtual short get_field_id(int n, int k) const;

public:
  TMask_tabanal(const char* c, const char* k, const char* d);
};

short TMask_tabanal::get_field_id(int n, int k) const
{
  const int tot = fieldrefs(1);
  short id = 0;
  if (n >= 0 && n < tot)
  {
    if (k == 2)
      id = F_DES1+n;
    else
      id = F_KEY1+n;
  }
  return id;
}


TMask_tabanal::TMask_tabanal(const char* c, const char* k, const char* d)
             : _codtab(c),_keyvar(k),_desvar(d)
{ 
  TString16 maskname;
  maskname << "catb" << c;
  read(maskname); 
}

////////////////////////////////////////////////////////////////////////
//APPLICAZIONE
////////////////////////////////////////////////////////////////////////

// applicazione per la gestione delle tabelle di Contabilita' Analitica
class TTab_app_ca : public Tab_application
{

protected:  // TRelation_application
  virtual bool user_destroy() ;          
  virtual bool user_create() ;
  virtual int rewrite(const TMask& m);
  virtual void  common_mode(TMask& m, const bool mode_insert);
  virtual void  init_insert_mode(TMask& m);
  virtual void  init_modify_mode(TMask& m);
	virtual void  init_query_mode(TMask& m);
  virtual void  init_query_insert_mode(TMask& m);

  virtual TMask * set_mask(TMask * _m=NULL);
  
public:
  TTab_app_ca();
  virtual ~TTab_app_ca() {}
};

HIDDEN inline TTab_app_ca& app() { return (TTab_app_ca&)main_app(); }

// costruttore
TTab_app_ca::TTab_app_ca() {}


// alloca/cambia la maschera dell'applicazione
TMask * TTab_app_ca::set_mask(TMask * _m)
{
  if (_m != NULL)
    return Tab_application::set_mask(_m);
  else 
  {
    const TFixed_string tabname(get_tabname());
    TString maskname;
    TMask * m = NULL;
    if (tabname == "CDC")
      m = new TMask_tabanal("CDC", "CdC", "CdCDes"); else
    if (tabname == "CMS")
      m = new TMask_tabanal("CMS", "Cms", "CmsDes"); else
    if (tabname == "FSC")
      m = new TMask_tabanal("FSC", "Fsc", "FscDes");
    else
      m = new TMask_tabca((const char *)get_mask_name(maskname),tabname);
    return Tab_application::set_mask(m);
  }
}

bool TTab_app_ca::user_create()
{
  bool ok = Tab_application::user_create();
  
  if (ok) 
  {
    TMask& mask = *set_mask();
  }
  
  return ok;
}

bool TTab_app_ca::user_destroy()
{
  return Tab_application::user_destroy();
}

int TTab_app_ca::rewrite(const TMask& m)
{
  return Tab_application::rewrite(m);
}

void TTab_app_ca::init_insert_mode(TMask& m)
{
  Tab_application::init_insert_mode(m);
  m.show_default();
}

void TTab_app_ca::init_modify_mode(TMask& m)
{
  Tab_application::init_modify_mode(m);
  m.show_default();
}

void TTab_app_ca::common_mode(TMask& m, const bool mode_insert)
{
  //Solo per tabella %AUC
  //in ricerca semplice la ricerca viene fatta sulla tabella %AUC (quindi usa il campo F_AUC_CODICE)
  //in inserimento la ricerca va fatta sul file USER (quindi usa il campo F_AUC_CODICE1)
	if (get_tabname() == "%AUC")
  {
    if (mode_insert)
    {
      m.hide(F_AUC_CODICE);
      m.show(F_AUC_CODICE1);
    }
    else
    {
		  m.hide(F_AUC_CODICE1);
      m.show(F_AUC_CODICE);
    }
  }
}

void TTab_app_ca::init_query_mode(TMask& m)
{
  Tab_application::init_query_mode(m);
	m.show_default();

  common_mode(m, false);
}

void TTab_app_ca::init_query_insert_mode(TMask& m)
{
	Tab_application::init_query_insert_mode(m);
	m.show_default();
  
  common_mode(m, true);
}

int ca0100(int argc, char* argv[])
{
  TTab_app_ca a;
  a.run(argc, argv, TR("Tabella"));
  return 0;
}