campo-sirio/ba/ba1101.cpp
alex b3cd9c64a9 Patch level : xx.888
Files correlati     : no patch
Ricompilazione Demo : [ ]
Commento            : Riportata la versione 01.05 patch 888 sul main trunk


git-svn-id: svn://10.65.10.50/trunk@9217 c028cbd2-c16b-5b4b-a496-9718f37d4682
2000-10-03 13:45:12 +00:00

434 lines
9.5 KiB
C++
Executable File

// Includo stdio senno' dice che ridefinisco FILE
#include <stdio.h>
#include <fstream.h>
#include <expr.h>
#include <isam.h>
#include <msksheet.h>
#include <prefix.h>
#include <progind.h>
#include <utility.h>
#include <validate.h>
#include "ba1100.h"
TMask* TRec_sheet::_mask = NULL;
void TDir_sheet::add ()
{
_dir->get(LF_DIR, _lock, _nordir, _sysdirop);
const int nitems = (int)_dir->eod() + 1;
_dir->eod() = nitems;
if (_dir->eox() < _dir->eod())
_dir->eox() += 10;
_dir->put(LF_DIR, _nordir, _sysdirop);
TDir d;
d.zero();
d.put(nitems, _nordir, _sysdirop);
_items = nitems;
/*
isfdptr *newopenf = new isfdptr[_items];
for (int i = 0; i<_items; i++)
newopenf[i] = i<(_items-1) ? openf[i] : NULL;
delete openf;
openf = newopenf;
*/
}
TDir_sheet::TDir_sheet(const char* title, byte buttons, const char* colonne)
:TSheet(0, 0, 0, 0, title, colonne, buttons)
{
_dir = new TDir;
_rec = new TTrec;
rebuild();
}
TDir_sheet::~TDir_sheet()
{
delete _dir;
delete _rec;
}
void TDir_sheet::get_row(long n, TToken_string& l)
{
n++;
_dir->get ((int)n,_nolock,_nordir,_sysdirop);
l.format("%3d", n); // Numero progressivo del file
l.add(_dir->name());
l.add(_dir->eod());
l.add(_dir->eox());
l.add((long)_dir->len());
l.add(_dir->des());
l.add(_dir->expr());
l.add(_dir->flags());
}
TRec_sheet::TRec_sheet(int logicnum, const char * tab)
: _descr(NULL), _tab(tab)
{
_external = FALSE;
_dir = new TDir;
_rec = new TTrec;
_rec_old = new TTrec;
_mask = new TMask("ba1100d");
_dir->get(logicnum, _lock, _nordir, _sysdirop);
_rec->get(logicnum);
if (_dir->len() == 0)
_rec->zero();
*_rec_old = *_rec;
_tab.lower();
if (fexist(DESCDIR))
{
if (logicnum >= LF_TABGEN && logicnum <= LF_TAB && _tab.not_empty())
_descfname.format("%s/d%s.des", DESCDIR, (const char *) _tab);
else
_descfname.format("%s/d%d.des", DESCDIR, _dir->num());
FILE * fd = NULL;
if (!fexist(_descfname) && (fd = fopen(_descfname, "w")) == NULL)
error_box("Impossibile creare il file delle descrizioni");
else
{
if (fd != NULL)
fclose(fd);
_descr = new TConfig(_descfname, DESCPAR);
}
}
}
TRec_sheet::TRec_sheet(TExternisamfile* file)
: _descr(NULL), _tab("")
{
_external = TRUE;
_dir = new TDir;
_rec = new TTrec;
_rec_old = new TTrec;
_mask = new TMask("ba1100d");
const FileDes& d = prefix().get_filedes(file->num());
const RecDes& r = prefix().get_recdes(file->num());
memcpy(_dir->filedesc(),&d,sizeof(FileDes));
memcpy(_rec->rec(),&r,sizeof(RecDes));
if (_dir->len() == 0)
_rec->zero();
*_rec_old = *_rec;
}
TRec_sheet::~TRec_sheet()
{
if (!_external)
_dir->get(_dir->num(), _unlock, _nordir, _sysdirop);
delete _dir;
delete _rec;
delete _rec_old;
delete _mask;
_mask = NULL;
if (_descr)
delete _descr;
}
bool TRec_sheet::check_key_expr(int key, const char * key_expr)
{
TExpression expr("", _strexpr);
return expr.set(key_expr, _strexpr);
}
HIDDEN bool len_handler(TMask_field& f, KEY key)
{
const int len = atoi(f.get());
if (len < 0) return FALSE;
const int typef = atoi(f.mask().get(FLD_TIPO));
switch (typef)
{
case _alfafld:
return len <= 254;
case _intfld:
return len <= 5;
case _longfld:
return len <= 10;
case _realfld:
return len <= 18;
case _wordfld:
return len <= 5;
case _intzerofld:
return len <= 5;
case _longzerofld:
return len <= 10;
default:
return TRUE;
}
return TRUE;
}
bool TRec_sheet::fld_notify(TSheet_field& f, int r, KEY k)
{
if (k == K_CTRL + K_INS)
{
TToken_string & row = f.row(r);
row.add("1", f.cid2index(FLD_TIPO));
}
return TRUE;
}
bool TRec_sheet::key_notify(TSheet_field& f, int r, KEY k)
{
if (k == K_INS)
{
const int items = f.items();
if (f.items() >= 8) return FALSE;
}
else
if (k == K_CTRL + K_INS)
f.enable_cell(r, 1, r > 0);
return TRUE;
}
void TRec_sheet::save_desc()
{
if (_descr)
{
TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS);
const int nfields = f1.items();
for (int i = 0; i < nfields; i++)
_descr->set(_rec->rec()->Fd[i].Name, f1.row(i).items() > 4 ?
f1.row(i).get(-2) : "");
delete _descr;
_descr = new TConfig(_descfname, DESCPAR);
}
}
void TRec_sheet::save()
{
if ((*_rec == *_rec_old && !_descr) ||
!yesnocancel_box("Salvare le modifiche")) return;
if (prefix().name()[0]) // Non fare conversioni sui dati standard
{
TSystemisamfile f(_rec->num());
f.update(*_rec);
}
save_desc();
*_rec_old = *_rec;
// modifica del 16-1-98, Augusto :
// Il bottone "salva" salva anche il trr e dir in recdesc
TFilename nf;
nf << "recdesc\\f" << _dir->num();
nf.ext("trr");
{
_rec->set_des(_descr,_tab.upper());
ofstream out(nf);
out << *_rec;
_rec->set_des();
}
nf.ext("dir");
ofstream out(nf);
out << *_dir;
}
void TRec_sheet::edit()
{
bool import_dirty = FALSE;
TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS);
TSheet_field& f2 = (TSheet_field&) _mask->field(F_KEYS);
if (!_external)
{
_mask->set (F_NUM, _dir->num());
_mask->set (F_DES, _dir->des());
}
else
_mask->disable(-1);
f1.sheet_mask().field(FLD_LEN).set_handler(len_handler);
f1.set_notify(fld_notify);
f1.set_append(FALSE);
int nfields = _rec->fields();
f1.enable_column(FLD_DES - 101, _descr != NULL);
for (int i = 0; i < nfields; i++)
{
f1.row(i) = _rec->fielddef(i);
if (_descr)
f1.row(i).add(_descr->get(_rec->rec()->Fd[i].Name));
else
f1.row(i).add("");
const TFieldtypes type = (TFieldtypes) f1.row(i).get_int(1);
switch (type)
{
case _datefld :
case _wordfld :
case _charfld :
case _boolfld :
case _memofld:
f1.disable_cell(i, 2);
case _alfafld :
case _intfld :
case _longfld :
case _intzerofld :
case _longzerofld:
f1.disable_cell(i, 3);
default:
break;
}
}
f2.set_notify(key_notify);
f2.set_append(FALSE);
int nkeys = _rec->keys();
for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i);
f2.disable_cell(0, 1);
while (TRUE)
{
f1.force_update(0); // Non togliere, serve per fare l'update della descrizione quando si fa l'import!!
switch (_mask->run())
{
case K_SAVE:
{
nfields = f1.items();
int nf = 0;
for (i = 0; i < nfields; i++)
{
TToken_string s(f1.row(i));
if (s.items() > 4)
s.destroy(-2);
if (s.items() > 0)
_rec->update_fielddef(nf++, s);
}
_rec->set_fields(nf);
_rec->rehash();
nkeys = f2.items();
_rec->set_keys(nkeys);
for (i = 0; i < nkeys; i++)
{
TToken_string& s = f2.row(i);
_rec->update_keydef(i, s);
}
_dir->set_len(_rec->len());
save();
return;
}
case K_ESC:
if (_descr && (_mask->dirty() || import_dirty))
{
// Se viene premuto Annulla NON deve salvare le descrizioni! Altrimenti che annulla e'?
// Salva il vecchio file di descrizione con un altro nome...
if (!import_dirty)
fcopy(_descfname,"des.xxx");
// libera _descr (scrivendo il file)
delete _descr;
_descr = NULL;
// Ripristina il vecchio file e rimuove il file temporaneo
fcopy("des.xxx",_descfname);
}
remove("des.xxx");
return;
case K_ENTER:
dispatch_e_menu(TASK_WIN, M_FILE_PRINT);
break;
case K_F6:
{
TMask m("ba1100f");
TFilename nf;
nf << 'f' << _dir->num();
nf.ext("trr");
m.set(F_NOMEF, nf);
if (m.run() == K_ENTER)
{
nf = m.get(F_NOMEF);
if (nf.not_empty())
{
save_desc();
{
_rec->set_des(_descr,_tab.upper());
ofstream out(nf);
out << *_rec;
_rec->set_des();
}
nf.ext("dir");
ofstream out(nf);
out << *_dir;
}
}
}
break;
case K_F7:
{
TMask m("ba1100f");
TFilename nout(_dir->name());
nout.strip("$%");
nout.ext("trr");
m.set(F_NOMEF, nout);
if (m.run() == K_ENTER)
{
const TFilename nf(m.get(F_NOMEF));
if (nf.not_empty())
{
import_dirty = TRUE;
_rec->set_des(_descr,_tab.upper());
ifstream in(nf);
in >> *_rec;
nfields = _rec->fields();
fcopy(_descfname,"des.xxx"); // salva il vecchio file di descrizioni
f1.destroy(-1);
for (int i = 0; i < nfields; i++)
{
f1.row(i) = _rec->fielddef(i);
if (_descr)
f1.row(i).add(_descr->get(_rec->rec()->Fd[i].Name));
else
f1.row(i).add("");
const TFieldtypes type = (TFieldtypes) f1.row(i).get_int(1);
switch (type)
{
case _datefld :
case _wordfld :
case _charfld :
case _boolfld :
case _memofld:
f1.disable_cell(i, 2);
case _alfafld :
case _intfld :
case _longfld :
case _intzerofld :
case _longzerofld:
f1.disable_cell(i, 3);
default:
break;
}
}
nkeys = _rec->keys();
f2.reset();
for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i);
f2.disable_cell(0, 1);
}
}
}
break;
default: break;
}
}
}