campo-sirio/include/tabapp.cpp

343 lines
6.9 KiB
C++
Executable File

#include <execp.h>
#include <tabapp.h>
#include <tabmod.h>
#include <tabutil.h>
// @cmember Costruttore
TTable_application::TTable_application()
: _msk(NULL), _rel(NULL)
{ }
// @cmember Distruttore
TTable_application::~TTable_application()
{ }
// @cmember Indica se la futura <mf TTable_application::get_mask> ritornera' una maschera diversa
// dalla corrente.
bool TTable_application::changing_mask(int mode)
{ return false; }
// @cmember Richiede la maschera da usare
TMask* TTable_application::get_mask(int mode)
{
CHECK(_msk, "Null mask");
return _msk;
}
// @cmember Ritorna la relazione da modificare
TRelation* TTable_application::get_relation() const
{
CHECK(_rel, "Null relation");
return _rel;
}
void TTable_application::print()
{
TString16 cmd;
cmd << "ba3 -1 " << get_tabname();
TExternal_app stampa(cmd);
stampa.run();
}
void TTable_application::init_query_mode(TMask& m)
{
m.enable(-GR_MODIFY_PROTECTED);
m.enable(-GR_RECORD_PROTECTED);
}
void TTable_application::init_modify_mode(TMask& m)
{
m.disable(-GR_MODIFY_PROTECTED);
const bool enable = !_rel->curr().get_bool(FPC);
m.enable(-GR_RECORD_PROTECTED,enable);
}
bool TTable_application::protected_record(TRectype& rec)
{
return rec.get_bool(FPC);
}
TString& TTable_application::get_mask_name(TString& t) const
{
CHECK(_rel, "Can't use a NULL relation to retrieve table module");
TString16 m = _tabname; // Lasciare TString16 per tabelle di cmodulo con codice cliente!
if (m[0] == '%' || m[0] == '$')
m.ltrim(1); else
if (m[0] == '&')
m = _tabname.right(3);
t = _rel->lfile().module();
t << "tb" << m;
t.lower();
TFilename n(t); n.ext("msk");
if (!n.custom_path())
t.overwrite("ba");
return t;
}
TMask* TTable_application::set_mask(TMask* m)
{
if (_msk != NULL)
{
delete _msk;
_msk = NULL;
}
if (m != NULL)
{
// imposta la maschera come maschera della applicazione
_msk = m;
}
else
{
// alloca la maschera standard come maschera della applicazione
TFilename name; get_mask_name(name); name.ext("msk");
if (name.custom_path())
_msk = new TMask(name);
else
cantread_box(name);
}
return _msk;
}
bool TTable_application::user_create()
{
if (argc() < 3)
return false;
_tabname = argv(2);
_tabname.upper();
_rel = new TRelation(_tabname);
if (set_mask() == NULL)
return false;
FOR_EACH_MASK_FIELD(*_msk, i, f)
{
if (f->in_group(GR_SEARCH))
{
set_search_field(f->dlg());
break;
}
}
TFilename rpt;
get_mask_name(rpt); rpt.ext("rpt");
bool can_print = rpt.custom_path();
if (!can_print)
{
get_mask_name(rpt); rpt.ext("rep");
can_print = rpt.custom_path();
}
enable_menu_item(M_FILE_PREVIEW, can_print);
enable_menu_item(M_FILE_PRINT, can_print);
TString title;
_msk->get_caption(title);
set_title(title);
return true;
}
bool TTable_application::user_destroy()
{
if (_msk) delete _msk;
if (_rel) delete _rel;
return true;
}
///////////////////////////////////////////////////
// Tabelle Multirel
///////////////////////////////////////////////////
// @cmember Indica se la futura <mf TMultirel_application::get_mask> ritornera' una maschera diversa
// dalla corrente.
bool TMultirel_application::changing_mask(int mode)
{ return false; }
// @cmember Richiede la maschera da usare
TMask* TMultirel_application::get_mask(int mode)
{
CHECK(_msk, "Null mask");
return _msk;
}
// @cmember Ritorna la relazione da modificare
TRelation* TMultirel_application::get_relation() const
{
CHECK(_rel, "Null relation");
return _rel;
}
void TMultirel_application::print()
{
TString16 tabname;
get_mask_name(tabname);
TString cmd;
cmd << "ba8 -4 "<< tabname;
TExternal_app stampa(cmd);
stampa.run();
}
void TMultirel_application::get_mask_name(TString& tabname) const
{
tabname = name().left(4);
tabname << _tabname;
}
bool TMultirel_application::find(word k)
{
bool ok = TRelation_application::find(k);
if (!ok && k < 2)
{
file().setkey(1);
file().zero();
for (TEditable_field* e = get_mask()->get_key_field(1, true); e; e = get_mask()->get_key_field(1, false))
{
if (e->shown() || e->ghost()) // Ignora campi invisibili non ghost
e->autosave(*get_relation());
}
TRectype rec(file().curr());
ok = file().read(_isequal) == NOERR;
}
return ok;
}
void TMultirel_application::init_insert_mode(TMask& m)
{
TLocalisamfile multi(LF_MULTIREL);
file().curr().zero();
for (TEditable_field* e = get_mask()->get_key_field(1, true); e; e = get_mask()->get_key_field(1, false))
{
if ((!e->in_group(1)) && (e->shown() || e->ghost()))
e->autosave(*get_relation());
}
multi.curr() = file().curr();
if (multi.read(_isgteq) == NOERR && multi.curr() == file().curr())
set_descr(m, multi.get("DATA"));
for (int i = m.fields() - 1; i >= 0; i--)
{
TMask_field& c = m.fld(i);
if (c.in_group(1))
{
c.enable();
if (c.is_edit())
{
TEdit_field& e = (TEdit_field&)c;
if (e.browse() != NULL)
e.enable_check();
}
}
}
_second.cut(0);
}
void TMultirel_application::init_modify_mode(TMask& m)
{
for (int i = m.fields() - 1; i >= 0; i--)
{
TMask_field& c = m.fld(i);
const TFieldref * f = c.field();
if (f != NULL && f->name() == "SECOND")
_second = c.get();
if (c.in_group(1))
{
c.enable();
if (c.is_edit())
{
TEdit_field& e = (TEdit_field&)c;
if (e.browse() != NULL)
e.enable_check();
}
}
}
}
int TMultirel_application::rewrite(const TMask& m)
{
int err = TRelation_application::rewrite(m);
if (err != NOERR)
err = TRelation_application::write(m);
TRelation & rel = *get_relation();
const TString & second = rel.lfile().get("SECOND");
if (err == NOERR && second != _second)
{
rel.save_status();
rel.lfile().put("SECOND", _second);
rel.read(_isequal);
rel.remove();
rel.restore_status();
}
return err;
}
bool TMultirel_application::user_create()
{
if (argc() < 3)
return false;
_tabname = argv(2);
_tabname.upper();
_rel = new TRelation(LF_MULTIREL);
//costruisce il nome della maschera interessata
//nome modulo + 'ts' + nome tabella
TString16 tabname;
get_mask_name(tabname);
_msk = new TMask(tabname);
FOR_EACH_MASK_FIELD((*_msk), i, f)
{
if (f->in_key(1) && !f->in_group(1))
{
set_search_field(f->dlg());
break;
}
}
TFilename rep = tabname;
rep.ext("rep");
if (rep.custom_path())
{
enable_menu_item(M_FILE_PREVIEW);
enable_menu_item(M_FILE_PRINT);
}
TString title;
_msk->get_caption(title);
set_title(title);
return true;
}
bool TMultirel_application::user_destroy()
{
if (_msk) delete _msk;
if (_rel) delete _rel;
return true;
}
// @cmember Costruttore
TMultirel_application::TMultirel_application()
: _msk(NULL), _rel(NULL)
{ }
// @cmember Distruttore
TMultirel_application::~TMultirel_application()
{ }