campo-sirio/ba/baformed.cpp
guy 88f63a260c Patch level : 10.0
Files correlati     : ba1 ba2 ba3
Ricompilazione Demo : [ ]
Commento            :
Aggiornato uso TWindow::handler


git-svn-id: svn://10.65.10.50/trunk@19486 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-10-21 13:43:17 +00:00

718 lines
17 KiB
C++
Executable File

#include "baformed.h"
#include <colors.h>
#include <tabutil.h>
// -----------------------------------------------------------------
// maschera per le finkature
// -----------------------------------------------------------------
#include "ba21fn.h"
class TFink_mask : public TMask
{
TString16 _chars;
enum pos { // posizioni scatoletta
xl = 1,
xm = 15,
xr = 29,
yt = 1,
ym = 5,
yb = 9,
ofs = 36
};
protected:
void paint_example();
virtual long handler(WINDOW win, EVENT* ep);
static bool char_handler(TMask_field& f, KEY k);
virtual void start_run();
virtual bool stop_run(KEY k);
virtual PNT log2dev(long x, long y) const;
public:
TString & get_chars() { return _chars; }
TFink_mask(const char* def) : TMask("ba21fn")
{
_chars = def;
set_handler(C_TR, char_handler);
set_handler(C_TL, char_handler);
set_handler(C_TM, char_handler);
set_handler(C_BR, char_handler);
set_handler(C_BL, char_handler);
set_handler(C_BM, char_handler);
set_handler(C_CM, char_handler);
set_handler(C_CR, char_handler);
set_handler(C_CL, char_handler);
set_handler(C_HR, char_handler);
set_handler(C_VR, char_handler);
}
virtual ~TFink_mask() {}
};
PNT TFink_mask::log2dev(long x, long y) const
{
PNT p;
p.h = ((short)x+1)*CHARX;
p.v = (short)y*ROWY;
return p;
}
long TFink_mask::handler(WINDOW win, EVENT* ep)
{
long ret = TMask::handler(win, ep);
if (ep->type == E_UPDATE)
paint_example();
return ret;
}
void TFink_mask::paint_example()
{
// pittura un'immaginetta finculata
// on the right of the mask
TString line(xr);
set_font(XVT_FFN_COURIER);
set_color(MASK_LIGHT_COLOR,MASK_BACK_COLOR);
set_opaque_text(TRUE);
for (int i = yt; i <= yb; i++)
{
line.spaces();
if (i == yt)
{
line.fill(_chars[9]);
line[xl-1] = _chars[0];
line[xm-1] = _chars[1];
line[xr-1] = _chars[2];
}
else if (i == ym)
{
line.fill(_chars[9]);
line[xl-1] = _chars[6];
line[xm-1] = _chars[7];
line[xr-1] = _chars[8];
}
else if (i == yb)
{
line.fill(_chars[9]);
line[xl-1] = _chars[3];
line[xm-1] = _chars[4];
line[xr-1] = _chars[5];
}
else
{
line[xl-1] = _chars[10];
line[xm-1] = _chars[10];
line[xr-1] = _chars[10];
}
stringat(ofs, i, line);
}
}
void TFink_mask::start_run()
{
TMask::start_run();
for (int i = 101; i <= 111; i++)
{
field(i).allow_pipe(); // allowa la pipa, se no son cazzi
field(i).set(format("%c",_chars[i - 101]));
}
}
bool TFink_mask::stop_run(KEY k)
{
if (k == K_ENTER)
{
_chars.cut(0);
for (int i = 101; i <= 111; i++)
_chars << field(i).get()[0];
}
return TMask::stop_run(k);
}
bool TFink_mask::char_handler(TMask_field& f, KEY k)
{
if (f.focusdirty() && k == K_TAB)
{
TFink_mask& m = (TFink_mask&)f.mask();
TString & ch = m.get_chars();
const char cp = f.get()[0];
ch[f.dlg() - 101] = cp == '\0' ? ' ' : cp;
m.paint_example();
}
return TRUE;
}
// -----------------------------------------------------------------
// form editor
// -----------------------------------------------------------------
TForm_editor::TForm_editor() : _form(NULL), _m(NULL), _extra(FALSE)
{}
TForm_editor::~TForm_editor()
{}
bool TForm_editor::create()
{
TApplication::create();
const char* form = NULL;
long code = 0;
for (int a = 2; a < argc(); a++)
{
if (xvt_str_compare_ignoring_case(argv(a), "-E") == 0)
{
_extra = TRUE;
continue;
}
if (form == NULL)
form = argv(a);
else
if (code == 0)
code = atol(argv(a));
}
if (!_extra)
{
remove_menu(BAR_ITEM_ID(1));
remove_menu(BAR_ITEM_ID(2));
remove_menu(BAR_ITEM_ID(3));
remove_menu(BAR_ITEM_ID(4));
remove_menu(BAR_ITEM_ID(5));
}
enable_menu_item(M_FILE_PRINT);
_m = new TMask(selection_mask());
if ((form && code) || (form && code == 0 && _extra))
{
_form = new TForm(form, (code!=0) ? format("%05ld",code) : "", _extra ? 2 : 1);
if (!_extra) dispatch_e_menu(MENU_ITEM_ID(14));
}
else
dispatch_e_menu(MENU_ITEM_ID(14));
if (form)
{
_m->set(F_BASE, form);
_m->disable(F_BASE);
}
if (code) _m->set(F_CODE, code);
return TRUE;
}
bool TForm_editor::destroy()
{
if (_form) delete _form;
if (_m) delete _m;
return TApplication::destroy();
}
bool TForm_editor::menu(MENU_TAG tag)
{
char sec = 'B';
pagetype pt = odd_page;
bool quit = FALSE;
switch(tag)
{
case MENU_ITEM_ID(11):
sec = 'R'; pt = odd_page; break;
case MENU_ITEM_ID(12):
sec = 'D'; pt = odd_page; break;
case MENU_ITEM_ID(13):
sec = 'K'; break;
case MENU_ITEM_ID(14):
quit = ask_profile();
sec = 'B'; pt = odd_page; break;
case MENU_ITEM_ID(15): // formato numeri
sec = 'J'; break;
case MENU_ITEM_ID(16): // formato date
sec = 'Y'; break;
case MENU_ITEM_ID(21):
sec = 'H'; pt = odd_page; break;
case MENU_ITEM_ID(22):
sec = 'H'; pt = even_page; break;
case MENU_ITEM_ID(23):
sec = 'H'; pt = first_page; break;
case MENU_ITEM_ID(24):
sec = 'H'; pt = last_page; break;
case MENU_ITEM_ID(31):
sec = 'B'; pt = odd_page; break;
case MENU_ITEM_ID(32):
sec = 'B'; pt = even_page; break;
case MENU_ITEM_ID(33):
sec = 'B'; pt = first_page; break;
case MENU_ITEM_ID(34):
sec = 'B'; pt = last_page; break;
case MENU_ITEM_ID(41):
sec = 'F'; pt = odd_page; break;
case MENU_ITEM_ID(42):
sec = 'F'; pt = even_page; break;
case MENU_ITEM_ID(43):
sec = 'F'; pt = first_page; break;
case MENU_ITEM_ID(44):
sec = 'F'; pt = last_page; break;
case MENU_ITEM_ID(51):
sec = 'G'; pt = odd_page; break;
case MENU_ITEM_ID(52):
sec = 'G'; pt = even_page; break;
case MENU_ITEM_ID(53):
sec = 'G'; pt = first_page; break;
case MENU_ITEM_ID(54):
sec = 'G'; pt = last_page; break;
default:
break;
}
if (!quit)
{
TString status;
status << TR("Profilo: ") << _form->name();
status << TR(" codice: ") << _form->code();
xvtil_statbar_set(status);
edit(sec, pt);
xvtil_statbar_set(" ");
}
return TRUE;
}
void TForm_editor::print()
{
_form->print();
}
bool TForm_editor::file_handler(TMask_field& f, KEY k)
{
bool ok = TRUE;
if (k == K_TAB && f.dirty())
{
const char* n = f.get();
if (*n > ' ')
{
const char* d = prefix().description(n);
if (*d == '\0') ok = error_box(TR("Nome di file o tabella errato"));
f.mask().set(f.dlg()+1, d);
}
}
return ok;
}
bool TForm_editor::cod_handler(TMask_field& f, KEY k)
{
bool ok = TRUE;
if (k==K_TAB && f.dirty())
{
TLocalisamfile frm(LF_FORM);
frm.zero();
frm.put("TIPOPROF",f.mask().get(F_BASE));
frm.put("CODPROF",f.mask().get(F_CODE));
if (frm.read() == NOERR)
f.mask().set(F_DESC,frm.get("DESC"));
}
return ok;
}
bool TForm_editor::edit_fincatura()
{
TFink_mask m(_form->get_fincatura());
bool dirty = FALSE;
if (m.run() == K_ENTER)
{
_form->set_fincatura(m.get_chars());
dirty = TRUE;
}
return dirty;
}
bool TForm_editor::date_example(TMask_field& f, KEY k)
{
if (k == K_TAB && f.focusdirty())
{
TMask& m = f.mask();
char format[6];
format[0] = m.get(F_DFORMAT)[0];
format[1] = m.get(F_DDAY )[0];
format[2] = m.get(F_DMONTH )[0];
format[3] = m.get(F_DYEAR )[0];
format[4] = m.get(F_DSEP )[0];
format[5] = '\0';
TDate dd(TODAY);
TFormatted_date d(dd);
d.set_format(format);
m.set(F_DEXAMPLE, d.string());
}
return TRUE;
}
bool TForm_editor::edit_formato_numero()
{
bool dirty = FALSE;
TMask m("ba21nm");
m.set(F_WIDTH,_frm_number.get(0));
m.set(F_DECIMALS,_frm_number.get(1));
m.set(F_PICTURE,_frm_number.get(2));
if (dirty = (m.run() == K_ENTER))
{
int w = m.get_int(F_WIDTH);
int d = m.get_int(F_DECIMALS);
TString p(m.get(F_PICTURE));
_frm_number = "";
_frm_number.add(w);_frm_number.add(d);_frm_number.add(p);
_form->change_number_format(w, d, p);
}
return dirty;
}
bool TForm_editor::edit_formato_data()
{
bool dirty = FALSE;
TString16 fmt("1"),sep("-"),day("4"),month("4"),year("4");
if (_frm_date.len() == 5) // Se e' settato il formato globale lo prende...
{
fmt.format("%c", _frm_date[0]);
sep.format("%c", _frm_date[4]);
day.format("%c", _frm_date[1]);
month.format("%c",_frm_date[2]);
year.format("%c", _frm_date[3]);
}
if (_frm_date.empty() && _form->code()[4] != '\0') // ...altrimenti cerca sulla tabella lingue...
{//Loads date format from %LNG
TTable l("%LNG");
l.put("CODTAB",_form->code()[4]);
if (l.read() == NOERR)
{
fmt = l.get("S7");//formato
fmt.cut(3);
sep.format("%c", l.get("S7")[3]);//separatore
if (sep!="-" && sep!="/" && sep!="." && sep!="," && sep!=" ") sep = "-";
if (fmt=="MAG") fmt = "2";
else if (fmt=="AMG") fmt = "3";
else fmt = "1";
}
}
TMask m("ba21dt");
m.set_handler(F_DFORMAT, date_example);
m.set_handler(F_DDAY, date_example);
m.set_handler(F_DMONTH, date_example);
m.set_handler(F_DYEAR, date_example);
m.set_handler(F_DSEP, date_example);
m.set(F_DFORMAT, fmt);
m.set(F_DDAY, day);
m.set(F_DMONTH, month);
m.set(F_DYEAR, year);
m.set(F_DSEP, sep);
TDate dd(TODAY);
TFormatted_date d(dd);
fmt<< day << month << year<< sep;
d.set_format(fmt);
m.set(F_DEXAMPLE, d.string());
dirty = m.run() == K_ENTER;
if (dirty)
{
char format[6];
format[0] = m.get(F_DFORMAT)[0];
format[1] = m.get(F_DDAY )[0];
format[2] = m.get(F_DMONTH )[0];
format[3] = m.get(F_DYEAR )[0];
format[4] = m.get(F_DSEP )[0];
format[5] = '\0';
_frm_date = format;
_form->change_date_format(format);
}
return dirty;
}
bool TForm_editor::edit_relation()
{
TMask m("ba2100r");
TSheet_field& s = (TSheet_field&)m.field(F_ITEMS);
s.sheet_mask().set_handler(101, file_handler);
TRelation* & rel = _form->_relation;
TCursor* & cur = _form->_cursor;
if (rel)
{
s.rows_array() = _form->rel_desc().get_all_desc();
// Disable meaningless fields for main file
s.disable_cell(0, 2); // Join
s.disable_cell(0, 4); // Alias
}
if (m.run() != K_ENTER || !m.dirty())
return FALSE;
if (rel)
{
delete cur; cur = NULL;
delete rel; rel = NULL;
}
TToken_string& r = s.row(0);
TString16 name = r.get(0);
if (name.not_empty())
{
int logicnum = atoi(name);
int alias = 0, to = 0, key = r.get_int(3);
TString80 exp = r.get(5);
rel = (logicnum > 0) ? new TRelation(logicnum) : new TRelation(name);
cur = new TCursor(rel, exp, key);
for (int i = 1; i < s.items(); i++)
{
TToken_string& r = s.row(i);
name = r.get(0); logicnum = atoi(name);
r.get(); // Skip description
to = name2log(r.get()); // Join
key = r.get_int(); // Key
alias = r.get_int(); // Alias
exp = r.get(); // Expression
const int l = exp.len();
for (int j = 0; j < l; j++)
if (exp[j] == ' ') exp[j] = '|';
if (logicnum > 0)
rel->add(logicnum, exp, key, to, alias); // join file
else
rel->add(name, exp, key, to, alias); // join table
}
_form->rel_desc().change_relation(*rel, s.rows_array());
}
return TRUE;
}
bool TForm_editor::edit(char s, pagetype t)
{
bool dirty = FALSE;
if (s == 'R')
dirty = edit_relation();
else
if (s == 'D')
form_config();
else
if (s == 'K')
dirty = edit_fincatura();
else
if (s == 'J')
dirty = edit_formato_numero();
else
if (s == 'Y')
dirty = edit_formato_data();
else
{
TString80 caption;
switch(s)
{
case 'F':
caption << TR("Piede"); break;
case 'G':
caption << TR("Sfondo"); break;
case 'H':
caption << TR("Testa"); break;
default:
caption << TR("Corpo"); break;
}
switch(t)
{
case first_page:
caption << TR(" della prima pagina"); break;
case even_page:
caption << TR(" delle pagine pari"); break;
case last_page:
caption << TR(" dell'ultima pagina"); break;
default:
caption << TR(" standard"); break;
}
dirty = TRUE;
if (!_form->exist(s, t))
{
const KEY k = yesnocancel_box(FR("La sezione %s non esiste:\nsi desidera generare quella standard?"),
(const char*)caption);
if (k == K_ESC)
dirty = FALSE;
else
{
TPrint_section* sec = _form->exist(s, t, TRUE);
if (k == K_YES)
{
const TPrint_section* def = _form->exist(s, odd_page);
if (def) *sec = *def;
else dirty = FALSE;
}
}
}
if (dirty)
dirty = _form->section(s, t).edit(caption);
}
if (dirty && yesno_box(TR("Salvare le modifiche?")))
{
if (_form->code() == "")
{
TFilename n(_form->name()); n.ext("frm");
TFilename bak(n); bak.ext("bak");
rename(n, bak);
ofstream out(n);
_form->print_on(out);
}
else
_form->write_profile();
}
if (!_extra) dispatch_e_menu(MENU_ITEM_ID(14));
return dirty;
}
bool TForm_editor::form_config() const
{
TFilename cnfnam(_form->name()); cnfnam.ext("ini");
TString16 cnfpar;
if (_form->code() != "")
cnfpar << _form->code();
else
cnfpar << "Main";
TConfig cnf(cnfnam, cnfpar);
bool ok = FALSE;
const TFilename maskname(cnf.get("EdMask"));
if (maskname.empty())
return warning_box(TR("Nessun parametro da configurare"));
TMask m(maskname);
// carica campi
int i;
for (i = 0; i < m.fields(); i++)
{
TMask_field& f = m.fld(i);
const TFieldref* fref = f.field();
if (fref != NULL)
{
const char* fname = fref->name();
if (fname != NULL)
{
const TString& oldvl = cnf.get(fname);
if (!oldvl.empty())
f.set(oldvl);
}
}
}
if (m.run() == K_ENTER && m.dirty())
{
// aggiusta campi
for (i = 0; i < m.fields(); i++)
{
TMask_field& f = m.fld(i);
if (f.dirty())
{
const TFieldref* fref = f.field();
if (fref != NULL)
cnf.set(fref->name(), f.get(), NULL, TRUE);
}
}
ok = TRUE;
}
return ok;
}
bool TForm_editor::ask_profile()
{
_m->set_handler(F_CODE, cod_handler);
// choose form from mask
KEY k;
while ((k = _m->run()) != K_QUIT)
{
TString16 fform = _m->get(F_BASE);
TString80 fdesc = _m->get(F_DESC);
long fcode = _m->get_long(F_CODE);
TString16 cod;
cod.format("%05ld",fcode);
if (!_extra && (fcode == 0 || fform.left(3) == "BOL"))
{
error_box(TR("Non e' possibile modificare i profili standard o i bollettini.")) ;
continue;
}
if (k == K_ENTER)
{
if (_form != NULL) delete _form;
_form = new TForm(fform, (fcode!=0) ? cod : "", _extra ? 2 :1, fdesc);
break;
}
else if (k == K_DEL)
{
if (fcode != 0 && yesno_box(FR("Confermare la cancellazione del profilo %05ld"), fcode))
{
TLocalisamfile frm(LF_FORM);
frm.zero();
frm.put("TIPOPROF", fform);
if (fcode != 0 )
frm.put("CODPROF", format("%05ld",fcode));
if (frm.read() == NOERR)
frm.remove();
TLocalisamfile rfr(LF_RFORM);
rfr.zero();
rfr.put("TIPOPROF", fform);
rfr.put("CODPROF", format("%05ld",fcode));
if (rfr.read(_isgteq) == NOERR)
{
for ( ; rfr.status() == NOERR && atol(rfr.get("CODPROF")) == fcode && rfr.get("TIPOPROF") == fform; rfr.next())
rfr.remove();
}
_m->set(F_CODE,"");
_m->set(F_BASE,"");
_m->set(F_DESC,"");
}
}
}
if (k == K_QUIT)
{
dispatch_e_menu(M_FILE_QUIT);
return TRUE;
}
return FALSE;
}