#include #include #include #include #include #include #include #include #include "ba2100.h" class TForm_editor : public TApplication { TForm* _form; bool _edit; protected: virtual bool create(); virtual bool destroy(); virtual bool menu(MENU_TAG); virtual void print(); static bool file_handler(TMask_field& f, KEY k); bool edit_relation(); bool edit(char s, pagetype p); bool form_config() const; public: TForm_editor(); virtual ~TForm_editor(); }; TForm_editor::TForm_editor() : _form(NULL) {} TForm_editor::~TForm_editor() {} bool TForm_editor::create() { TApplication::create(); if (argc() < 3) return error_box("Specificare il nome del profilo di stampa"); TFilename form(argv(2)); form.ext("frm"); if (!fexist(form)) { TFilename base(form.left(3)); base.ext("frm"); if (!fexist(base)) return error_box("Non esiste il profilo campione %s", (const char*)base); if (!yesno_box("Si desidera creare un nuovo profilo %s", (const char*)form)) return FALSE; if (!fcopy(base, form)) return error_box("Impossibile copiare %s in %s", (const char*)base, (const char*)form); } _edit = argc() > 3; _form = new TForm(form); enable_menu_item(M_FILE_PRINT); if (!_edit) dispatch_e_menu(MENU_ITEM(31)); return TRUE; } bool TForm_editor::destroy() { if (_form) delete _form; return TApplication::destroy(); } bool TForm_editor::menu(MENU_TAG tag) { char sec = 'B'; pagetype pt = odd_page; switch(tag) { case MENU_ITEM(11): sec = 'R'; pt = odd_page; break; case MENU_ITEM(12): sec = 'D'; pt = odd_page; break; case MENU_ITEM(21): sec = 'H'; pt = odd_page; break; case MENU_ITEM(22): sec = 'H'; pt = even_page; break; case MENU_ITEM(23): sec = 'H'; pt = first_page; break; case MENU_ITEM(24): sec = 'H'; pt = last_page; break; case MENU_ITEM(31): sec = 'B'; pt = odd_page; break; case MENU_ITEM(32): sec = 'B'; pt = even_page; break; case MENU_ITEM(33): sec = 'B'; pt = first_page; break; case MENU_ITEM(34): sec = 'B'; pt = last_page; break; case MENU_ITEM(41): sec = 'F'; pt = odd_page; break; case MENU_ITEM(42): sec = 'F'; pt = even_page; break; case MENU_ITEM(43): sec = 'F'; pt = first_page; break; case MENU_ITEM(44): sec = 'F'; pt = last_page; break; case MENU_ITEM(51): sec = 'G'; pt = odd_page; break; case MENU_ITEM(52): sec = 'G'; pt = even_page; break; case MENU_ITEM(53): sec = 'G'; pt = first_page; break; case MENU_ITEM(54): sec = 'G'; pt = last_page; break; default: break; } edit(sec, pt); return _edit; } 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* d = prefix().description(f.get()); if (*d == '\0') ok = error_box("Nome di file o tabella errato"); f.mask().set(f.dlg()+1, d); } return ok; } 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) { rel->print_on(s.rows_array()); s.force_update(); s.disable_cell(0, 2); s.disable_cell(0, 5); } 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); r.get(); // Skip description int alias = 0, to = 0, key = r.get_int(2); TString80 exp = r.get(4); 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); to = name2log(r.get()); key = r.get_int(); alias = r.get_int(); exp = r.get(); 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 } } return TRUE; } bool TForm_editor::edit(char s, pagetype t) { bool dirty = FALSE; if (s == 'R') dirty = edit_relation(); if (s == 'D') form_config(); else { TString80 caption; switch(s) { case 'F': caption << "Piede"; break; case 'G': caption << "Sfondo"; break; case 'H': caption << "Testa"; break; default: caption << "Corpo"; break; } switch(t) { case first_page: caption << " della prima pagina"; break; case even_page: caption << " delle pagine pari"; break; case last_page: caption << " dell'ultima pagina"; break; default: caption << " standard"; break; } dirty = TRUE; if (!_form->exist(s, t)) { const KEY k = yesnocancel_box("La sezione %s non esiste:\n" "si 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, _edit); } if (dirty && yesno_box("Salvare le modifiche?")) { const TFilename& n = _form->name(); TFilename bak(n); bak.ext("bak"); rename(n, bak); ofstream out(n); _form->print_on(out); } return dirty; } bool TForm_editor::form_config() const { TFilename cnfnam(_form->name().path()); const TString16 n(_form->name().name()); cnfnam.add(n.left(3)); cnfnam.ext("ini"); TFilename cnfpar(_form->name()); cnfpar.ext(""); TConfig cnf(cnfnam, cnfpar); bool ok = FALSE; const TFilename maskname(cnf.get("EdMask")); if (maskname.empty()) return warning_box("Nessun parametro da configurare"); TMask m(maskname); // carica campi for (int 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; } int ba2100(int argc, char* argv[]) { TForm_editor a; a.run(argc, argv, "Parametrizzazione stampa"); return 0; }