campo-sirio/ba/ba1102.cpp
villa dd837f0172 Modifiche a BA1 per usare i campi memo, che naturalmente non funzionano
ma intanto eccole qua


git-svn-id: svn://10.65.10.50/trunk@1492 c028cbd2-c16b-5b4b-a496-9718f37d4682
1995-06-22 09:28:46 +00:00

280 lines
6.8 KiB
C++
Executable File

#include <defmask.h>
#include <mask.h>
#include <relation.h>
#include <prefix.h>
#include <progind.h>
#include <sheet.h>
#include "ba1100.h"
// ORRIBILERRIMO
// ma chemmefotte?
HIDDEN TRectype* __rec;
HIDDEN TRelation* __rel;
HIDDEN TMask* __msk;
HIDDEN int __mid;
bool TEdit_file::memo_handler(TMask_field& f, KEY k)
{
bool ok = TRUE;
if (k == K_SPACE)
{
int memoidx = f.dlg() - 400;
// recuperate memo id and god (it.: godi)
int mcnt = 0;
long val = -1l;
for (int i = 0; i < __rec->items(); i++)
{
if (__rec->type(__rec->fieldname(i)) == _memofld)
{
if (memoidx == mcnt++)
{
val = __rec->get_long(__rec->fieldname(i));
break;
}
}
}
ok = val != -1l;
if (ok)
{
// edit memo with apposit maskerings
TMask mm("Edit campo memo", 1, 78, 20);
mm.add_memo(501, 0, __rec->fieldname(i), 1, 1, 76,16);
mm.add_button(DLG_OK, 0, "", -12, -1, 9, 2);
mm.add_button(DLG_CANCEL, 0, "", -22, -1, 9, 2);
// build fieldref
TString80 fref;
// UARNIN! Non funziona necessariamente per le tabelle
// ma non abbiamo tabelle coi memo e quindi camm' ifottamme'
fref << __rec->num() << "->" << __rec->fieldname(i);
mm.field(501).set_field(fref);
// se tutto va bene basta fare cosi'
mm.autoload(__rel);
if (mm.run() == K_ENTER)
{
mm.autosave(__rel);
__msk->set (__mid,__rec->get(__rec->fieldname(i)));
}
// se invece va male, l'e' istes
}
}
return ok;
}
bool TEdit_file::browse(int logicnum, const char* name)
{
TRelation relation(logicnum);
TCursor cursor(&relation);
TRectype& curr = cursor.curr();
TRectype svrec(cursor.curr());
TToken_string head(256);
TToken_string trac(256);
// DIO CHE ORRORE! MA CHECCEPOSSOFA'?
__rel = &relation;
// E POI, DICIAMOLO, CHEMMEFOTTAMME'?
const char* n;
trac.add("");
head.add("@1");
for(int i = 0; (n = curr.fieldname(i)) != NULL; i++)
{
trac.add(n);
TString16 name(n); name.lower(); name[0] = toupper(name[0]);
head.add(name);
TFieldtypes t = curr.type(n);
const int len = (t == _datefld) ? 10 : curr.length(n);
head << '@' << max(len, (int)strlen(n));
if (t == _realfld || t == _intfld || t == _longfld || t == _wordfld || t == _realfld)
head << 'R';
}
const bool superprassi = user() == "PRASSI";
KEY ch;
TCursor_sheet sheet(&cursor, trac, name, head, superprassi ? 6 : 0);
while ((ch = sheet.run()) != K_ESC)
{
if (!superprassi)
{
error_box("Funzione non ammessa per l'utente %s", (const char*)user());
ch = K_ESC;
}
if (ch == K_DEL && sheet.one_checked())
{
TProgind* pind = NULL;
cursor.freeze(TRUE);
bool go = FALSE;
bool first = FALSE;
int j;
for (j = 0, cursor = 0; j < sheet.items(); ++cursor, j++)
{
if (sheet.checked(j))
{
if (!go && !first)
go = yesno_box("Si desidera cancellare i %d record indicati?", sheet.checked());
first = TRUE;
if (!pind)
{
pind = new TProgind(sheet.checked(),"Attendere...",
TRUE, TRUE, 32);
pind->addstatus(1);
}
else
{
if (pind->iscancelled()) break;
pind->addstatus(1);
}
if (go) cursor.file().remove();
sheet.uncheck(j);
}
}
if (pind) delete pind;
cursor.freeze(FALSE);
if (first) {sheet.select(1); continue;}
}
if (ch == K_ENTER || ch == K_DEL)
cursor = sheet.selected();
switch(ch)
{
case K_ENTER: // edit fields
svrec = curr;
if (edit_record(curr, FALSE) == K_ENTER)
{
TString s(svrec.key(1));
if (s != curr.key(1))
{
cursor.file().write();
if (cursor.file().good())
{
curr = svrec;
cursor.file().remove();
}
}
else
cursor.file().rewrite();
}
break;
case K_DEL: // delete record
if (yesno_box("Confermare la cancellazione del record"))
cursor.file().remove();
break;
case K_CTRL+'N': // insert new record
curr.zero();
if (edit_record(curr,FALSE) == K_ENTER)
cursor.file().write();
break;
default:
break;
}
sheet.force_update();
}
return K_ESC;
}
KEY TEdit_file::edit_record(TRectype& rec, bool readonly)
{
for(int recs = 0; rec.fieldname(recs) != NULL; recs++);
const int fpp = 16; // Fields per page
const int rows = recs > fpp ? 20 : recs+4;
const int pages = recs/fpp + (recs % fpp ? 1 : 0);
TMask m("Modifica record", pages, 78, rows);
int curpage = 0, currow = 1, nid = 100;
const char* cp;
int mcnt =0;
for(int i = 0; (cp = rec.fieldname(i)) != NULL; i++)
{
// add fields ONE by ONE
TString16 s(cp); s.left_just(16);
const int len = rec.length(cp);
switch (rec.type(cp))
{
case _alfafld:
m.add_string(nid++,curpage, s, 3, currow, len, "", len > 50 ? 50 : len);
break;
case _intfld:
case _longfld:
case _wordfld:
case _realfld:
m.add_number(nid++, curpage, s, 3, currow, len, "R", rec.ndec(cp));
break;
case _datefld:
m.add_date(nid++, curpage, s, 3, currow);
break;
case _charfld:
case _boolfld:
m.add_string(nid++,curpage, s, 3, currow, 1);
break;
case _intzerofld:
case _longzerofld:
m.add_number(nid++, curpage, s, 3, currow, len, "Z", rec.ndec(cp));
break;
case _memofld:
m.add_number(nid++, curpage, s, 3, currow, len, "Z", rec.ndec(cp));
m.enable(nid-1, FALSE);
// memo del caz: add bottone per l'editing etc
m.add_button (400+(mcnt++), curpage, "Edit", 35, currow, 9, 1);
__rec = &rec;
__msk = &m;
__mid = nid-1;
m.set_handler(400+(mcnt-1), memo_handler);
break;
default:
break;
}
m.field(nid-1).set(rec.get(cp));
if (((i+1) % fpp) == 0 || i == recs-1)
{
m.add_button(DLG_OK, curpage, "", -12, -1, 9, 2);
m.add_button(DLG_CANCEL, curpage, "", -22, -1, 9, 2);
curpage++; currow = 1;
}
else currow++;
}
if (readonly)
{
const int max = m.fields();
for (int i = 0; i < max; i++)
{
TMask_field& f = m.fld(i);
if (f.class_id() != CLASS_BUTTON_FIELD)
f.disable();
}
}
const KEY k = m.run();
if (k == K_ENTER && !readonly)
{
nid = 100;
for(i = 0; (cp = rec.fieldname(i)) != NULL; i++)
rec.put(cp, m.get(nid++));
}
return k;
}