diff --git a/ba/ba1100.cpp b/ba/ba1100.cpp index 44e91f8be..8e8596a3e 100755 --- a/ba/ba1100.cpp +++ b/ba/ba1100.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -12,6 +13,14 @@ #include "ba1.h" #include "ba1100.h" +#if XVT_OS==XVT_OS_SCOUNIX +#define DIRSIZ 14 +struct direct +{ + unsigned short d_ino; + char d_name[DIRSIZ]; +}; +#endif class TManutenzione_app : public TApplication { @@ -32,6 +41,7 @@ protected: void update_dir(); void convert_dir(); virtual void print(); + virtual void do_print(TPrinter & p, TRec_sheet & r); const char* dumpfilename(const FileDes& dep) const; public: @@ -39,61 +49,159 @@ public: }; -void TManutenzione_app::print() +HIDDEN void build_filelist(const char *path, TArray & list) + +{ +#if XVT_OS==XVT_OS_SCOUNIX + struct directx + { + ino_t d_ino; + char d_name[DIRSIZ + 1]; + } dlink; + int fd; + + if ((fd = open(path, 0)) == -1) + return; + dlink.d_name[DIRSIZ] = '\0'; + while(read(fd, &dlink, sizeof(struct direct)) == + sizeof(struct direct)) + { + if (dlink.d_ino > 0) + { + TFixed_string dname(dlink.d_name); + + if (dname.find(".des") > 0 && dname[0] == 'd' && !isdigit(dname[1])) + list.add(dname.mid(1,3)); + } + } + close(fd); +#endif +} + +void TManutenzione_app::do_print(TPrinter & p, TRec_sheet & r) { - if (_rec == NULL) return; const char* table[] = {"", "Alfanumerico", "Intero", "Intero Lungo", "Reale", "Data", "Intero", "Carattere", "Booleano", "Intero Zerofilled", "Intero Lungo Zerofilled"}; - TPrinter& p = printer(); TPrintrow row; TToken_string s; + TParagraph_string d("", 35); + TConfig * descr = NULL; + TTrec & rec = *r.rec(); + TDir & dir = *r.dir(); + const char * descfname = r.descfname(); + TString16 tab(r.tab()); + const bool istab = tab.not_empty(); + + tab.upper(); + if (fexist(descfname)) + descr = new TConfig(descfname, DESCPAR); + + const bool hasdescr = descr != NULL; - p.open(); - p.headerlen(6); - p.footerlen(4); row.reset(); - row.put(format("Lista tracciato %s (%s)", _rec->dir()->des(), - _rec->dir()->name()), 2); - row.put("Pag. @#", 66); + if (istab) + row.put(format("Lista tabella %s ", (const char *) tab), 2); + else + row.put(format("Lista tracciato %s (%s)", dir.des(), dir.name()), 2); + row.put("Pag. @#", 69); p.setheaderline(2, row); row.reset(); row.put("Nome", 7); row.put("Tipo", 18); - row.put("Lunghezza", 45); - row.put(" Decimali", 55); - row.put("Posizione", 65); + row.put("Lun.", 38); + row.put(" Dec.", 43); + row.put("Pos.", 48); + row.put("Descrizione", 53); p.setheaderline(4, row); - p.setbackground("l[1,6,75,6]"); - for (int i = 0; i < _rec->rec()->fields(); i ++) + p.setbackground("l[1,6,78,6]"); + for (int i = 0; i < rec.fields(); i ++) { row.reset(); - s = _rec->rec()->fielddef(i); + s = rec.fielddef(i); + TString16 name = s.get(); row.put(format("%3d", i + 1), 2); - row.put(s.get(), 7); + row.put(name, 7); row.put(table[s.get_int()], 18); - row.put(format(" %4d", s.get_int()), 45); - row.put(format(" %4d", s.get_int()), 55); - row.put(format(" %4d", _rec->rec()->rec()->Fd[i].RecOff), 65); - p.print(row); + row.put(format("%4d", s.get_int()), 38); + row.put(format("%4d", s.get_int()), 43); + row.put(format("%4d", rec.rec()->Fd[i].RecOff), 48); + const char *wd = NULL; + + d = ""; + if (hasdescr) + d = descr->get(name); + if (!istab || d.not_empty()) + { + if (hasdescr) + { + wd = d.get(); + if (wd != NULL) + row.put(wd, 53); + } + p.print(row); + wd = d.get(); + while(wd != NULL) + { + row.reset(); + row.put(wd, 53); + p.print(row); + wd = d.get(); + } + } } p.formfeed(); row.reset(); row.put("Espressione chiave", 7); row.put("Duplicabile", 68); p.setheaderline(4, row); - for (i = 0; i < _rec->rec()->keys(); i ++) + for (i = 0; i < rec.keys(); i ++) { row.reset(); - s = _rec->rec()->keydef(i); + s = rec.keydef(i); row.put(format("%3d", i + 1), 2); row.put(s.get(), 7); row.put(*s.get() == 'X' ? "Si" : "No", 68); p.print(row); } p.formfeed(); + if (hasdescr) + delete descr; +} + +void TManutenzione_app::print() + +{ + TPrinter & p = printer(); + + p.open(); + p.headerlen(6); + p.footerlen(4); + if (_rec == NULL) + { + int items = _rec->dir()->items(); + + for (int i = 2 ; i <= items; i++) + { + TRec_sheet r(i, ""); + do_print(p, r); + } + + TArray list; + + build_filelist(DESCDIR, list); + items = list.items(); + for (i = 0; i < items; i++) + { + TString & tab = (TString &) list[i]; + TRec_sheet r(4, tab); + + do_print(p, r); + } + } + else do_print(p, *_rec); p.close(); } @@ -119,6 +227,7 @@ bool TManutenzione_app::create() // initvar e arrmask _browse->add_button(DLG_ADDFILE, "Aggiunge", K_F8); dispatch_e_menu(BAR_ITEM(1)); } + enable_menu_item(M_FILE_PRINT); return TRUE ; } @@ -141,9 +250,11 @@ void TManutenzione_app::insert_riga (long riga_sel, TToken_string& riga) _mask->disable(DLG_RECORD); _mask->disable(DLG_LOAD); _mask->disable(DLG_DUMP); + _mask->show(F_TAB, logicnum >= LF_TABGEN && logicnum <= LF_TAB); _mask->hide(FLD_EXTEND); _mask->hide(FLD_EOX); _mask->set (FLD_NUM, riga.get(0)); + _mask->reset (F_TAB); if (_mask->run() == K_ENTER) { @@ -197,6 +308,7 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) _mask->enable(DLG_RECORD); _mask->enable(DLG_LOAD); _mask->enable(DLG_DUMP); + _mask->show(F_TAB, logicnum >= LF_TABGEN && logicnum <= LF_TAB); _mask->set (FLD_NUM, riga.get(0)); _mask->set (FLD_NOME, riga.get()); _mask->set (FLD_EOD, riga.get()); @@ -206,11 +318,12 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) _mask->set (FLD_FORMULA, riga.get()); _mask->set (FLD_FLAG, riga.get()); _mask->reset (FLD_EXTEND); + _mask->reset (F_TAB); const TRecnotype oldeox = atol(_mask->get(FLD_EOX)); - const bool com = strcmp(prefhndl->name(), "com") == 0 || !*prefhndl->name(); + const bool com = prefhndl->is_com() || !*prefhndl->name(); const char* name = _mask->get(FLD_NOME); - const bool enable_extend = (com ? *name == '%' : *name != '%') && (riga_sel > 0); + const bool enable_extend = (com ? *name != '$' : *name == '$') && (riga_sel > 0); _mask->show(FLD_EXTEND, enable_extend); _mask->show(FLD_EOX, enable_extend); @@ -265,12 +378,10 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) else if (tasto == K_F6) { - enable_menu_item(M_FILE_PRINT); - _rec = new TRec_sheet(logicnum); + _rec = new TRec_sheet(logicnum, _mask->get(F_TAB)); _rec->edit(); delete _rec; _rec = NULL; - disable_menu_item(M_FILE_PRINT); } else if (tasto == K_F7) @@ -338,11 +449,11 @@ void TManutenzione_app::update_dir() { const TString pref(prefhndl->name()); + const bool is_com = prefhndl->is_com(); prefhndl->set(""); TDir d; - const bool update_com = ( pref == "com"); d.get(LF_DIR); const int orig_items = (int)d.eod(); @@ -352,8 +463,8 @@ void TManutenzione_app::update_dir() const int items = (int)d.eod(); TString80 s("Aggiornamento direttorio "); - if (pref == "com") s << "comune"; - else s << " della ditta " <set(pref); d.get(i, _nolock, _nordir, _sysdirop); - bool to_create = (update_com ? *d.name() == '%' : *d.name() == '$'); + bool to_create = (is_com ? d.is_com() : d.is_firm()); - if (flags == -1 && len != d.len() && s != d.name()) + if (flags < 0 && len != d.len() && s != d.name()) { d.set(s, d.eox(), 0L, desc, d.expr()); towrite = TRUE; @@ -425,7 +536,7 @@ void TManutenzione_app::convert_dir() const int items = (int)d.eod(); TString80 s("Aggiornamento archivi "); - if (pref == "com") s << "comuni"; + if (prefhndl->is_com()) s << "comuni"; else s << " della ditta " << atol (pref); TProgind p(items ? items : 1, s, TRUE, TRUE, 70); diff --git a/ba/ba1100.h b/ba/ba1100.h index 3639f8cc4..94bceda7b 100755 --- a/ba/ba1100.h +++ b/ba/ba1100.h @@ -5,12 +5,17 @@ #include #endif +#ifndef __CONFIG_H +#include +#endif + #include "ba1100a.h" /////////////////////////////////////////////////////////// // TDir_sheet /////////////////////////////////////////////////////////// - +#define DESCPAR "FieldDescr" +#define DESCDIR "recdesc" class TDir_sheet : public TSheet { @@ -40,8 +45,11 @@ class TRec_sheet : public TObject TTrec *_rec; TTrec *_rec_old; TDir *_dir; - bool _comfile; - static TMask *_mask; + bool _comfile; + TConfig *_descr; + static TMask *_mask; + TFilename _descfname; + TString16 _tab; protected: bool check_key_expr(int key, const char* key_expr); @@ -51,10 +59,12 @@ protected: virtual long items() const { return _rec->fields(); } public: - TRec_sheet(int logicnum); + TRec_sheet(int logicnum, const char * tab); ~TRec_sheet(); TDir* dir() const { return _dir; } TTrec* rec() const { return _rec; } + const char * descfname() const { return _descfname;} + const char * tab() const { return _tab; } void edit(); }; diff --git a/ba/ba1100a.h b/ba/ba1100a.h index 40de2e0c1..c5e11d8b4 100755 --- a/ba/ba1100a.h +++ b/ba/ba1100a.h @@ -4,34 +4,36 @@ #define FLD_NUM 101 #define FLD_NOME 102 -#define FLD_DESC 103 -#define FLD_FORMULA 104 +#define FLD_DESC 103 +#define FLD_FORMULA 104 #define FLD_EOD 105 -#define FLD_FLAG 106 -#define DLG_PACK 107 +#define FLD_FLAG 106 +#define DLG_PACK 107 #define DLG_RECORD 108 -#define DLG_DUMP 109 -#define DLG_LOAD 110 -#define FLD_EXTEND 111 -#define FLD_EOX 112 -#define F_LEN 113 -#define DLG_EDIR 114 +#define DLG_DUMP 109 +#define DLG_LOAD 110 +#define FLD_EXTEND 111 +#define FLD_EOX 112 +#define F_LEN 113 +#define DLG_EDIR 114 +#define F_TAB 115 -#define FLD_OUTFILE 201 -#define FLD_WITHKEY 202 -#define FLD_KEYNO 203 -#define FLD_FS 204 -#define FLD_FD 205 -#define FLD_RS 206 -#define FLD_FIXLEN 207 -#define FLD_WITHDEL 208 +#define FLD_OUTFILE 201 +#define FLD_WITHKEY 202 +#define FLD_KEYNO 203 +#define FLD_FS 204 +#define FLD_FD 205 +#define FLD_RS 206 +#define FLD_FIXLEN 207 +#define FLD_WITHDEL 208 -#define FLD_INFILE 301 +#define FLD_INFILE 301 #define F_NOMEF 101 -#define FLD_TIPO 102 -#define FLD_LEN 103 +#define FLD_TIPO 102 +#define FLD_LEN 103 #define FLD_DEC 104 +#define FLD_DES 105 #define F_NUMF 110 #define F_NUM 501 @@ -39,8 +41,8 @@ #define F_FIELDS 503 #define F_KEYS 504 -#define F_KEXPR 101 -#define F_KDUP 102 +#define F_KEXPR 101 +#define F_KDUP 102 #define DLG_IMPORT 606 #define DLG_EXPORT 607 diff --git a/ba/ba1100a.uml b/ba/ba1100a.uml index baaa8fb02..6c853ee61 100755 --- a/ba/ba1100a.uml +++ b/ba/ba1100a.uml @@ -67,6 +67,12 @@ BEGIN FLAGS "RD" END +STRING F_TAB 3 +BEGIN + PROMPT 2 9 "Tabella " + FLAGS "U" +END + BUTTON DLG_OK 9 2 BEGIN PROMPT -14 -3 "" diff --git a/ba/ba1100d.uml b/ba/ba1100d.uml index 502087878..72d178a43 100755 --- a/ba/ba1100d.uml +++ b/ba/ba1100d.uml @@ -55,6 +55,7 @@ BEGIN ITEM "Tipo" ITEM "Lunghezza" ITEM "Decimali" + ITEM "Descrizione@50" END SPREADSHEET F_KEYS @@ -68,7 +69,7 @@ ENDPAGE ENDMASK -PAGE "Campo" -1 -1 60 9 +PAGE "Campo" -1 -1 70 11 STRING F_NUMF 3 3 BEGIN @@ -126,6 +127,12 @@ BEGIN WARNING "Numero di decimali errato" END +STRING FLD_DES 80 50 +BEGIN + PROMPT 2 6 "Descrizione " + HELP "Descrizione del campo" +END + BUTTON DLG_OK 8 2 BEGIN PROMPT -13 -1 "" diff --git a/ba/ba1101.cpp b/ba/ba1101.cpp index ffd0311b3..b57f0f9de 100755 --- a/ba/ba1101.cpp +++ b/ba/ba1101.cpp @@ -77,7 +77,8 @@ void TDir_sheet::page_build(long first, byte rows) } -TRec_sheet::TRec_sheet(int logicnum) +TRec_sheet::TRec_sheet(int logicnum, const char * tab) +: _descr(NULL), _tab(tab) { _dir = new TDir; @@ -88,6 +89,24 @@ TRec_sheet::TRec_sheet(int logicnum) _dir->get(logicnum, _lock, _nordir, _sysdirop); _rec->get(logicnum); *_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("Non riesco a creare il file delle descrizioni"); + else + { + if (fd != NULL) + fclose(fd); + _descr = new TConfig(_descfname, DESCPAR); + } + } } TRec_sheet::~TRec_sheet() @@ -97,6 +116,8 @@ TRec_sheet::~TRec_sheet() delete _rec_old; delete _mask; _mask = NULL; + if (_descr) + delete _descr; } bool TRec_sheet::check_key_expr(int key, const char * key_expr) @@ -171,10 +192,20 @@ bool TRec_sheet::key_notify(int r, KEY k) void TRec_sheet::save() { - if (*_rec == *_rec_old || + if ((*_rec == *_rec_old && !_descr) || !yesnocancel_box("Devo salvare le modifiche")) return; TSystemisamfile f(_rec->num()); + + 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).get(-2)); + delete _descr; + _descr = new TConfig(_descfname, DESCPAR); + } f.update(*_rec); *_rec_old = *_rec; } @@ -185,13 +216,22 @@ void TRec_sheet::edit() { TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS); TSheet_field& f2 = (TSheet_field&) _mask->field(F_KEYS); - + _mask->set (F_NUM, _dir->num()); _mask->set (F_DES, _dir->des()); f1.set_notify(fld_notify); f1.sheet_mask().field(FLD_LEN).set_handler(len_handler); int nfields = _rec->fields(); - for (int i = 0; i < nfields; i++) f1.row(i) = _rec->fielddef(i); + + 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(""); + } f2.set_notify(key_notify); int nkeys = _rec->keys(); for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i); @@ -205,7 +245,9 @@ void TRec_sheet::edit() _rec->set_fields(nfields); for (i = 0; i < nfields; i++) { - TToken_string& s = f1.row(i); + TToken_string s(f1.row(i)); + + s.destroy(-2); _rec->update_fielddef(i, s); } _rec->rehash();