#include "ve2400.h" #include "ve2401.h" #include #include #include #include /////////////////////////////////////////////////////////// // Utility per gestione struttura codice avanzato /////////////////////////////////////////////////////////// const TString& root_code() { static TString4 _root_code; if (_root_code.empty()) { const TString query = "USE FSA SELECT B0=\"X\""; TISAM_recordset set(query); if (set.move_first()) _root_code = set.get("CODTAB").as_string(); else _root_code = " "; // Evito riletture inutili } return _root_code; } static const TRectype& get_sublevel_info(const TString& code) { return cache().get("FSA", code.full() ? code : root_code()); } /////////////////////////////////////////////////////////// // Maschera dianamica per inserimento codici /////////////////////////////////////////////////////////// class TCodart_mask : public TAutomask { static TString4 _restart; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void create_level(int level, const TString& subcode); void build_children(); public: bool restart() const { return _restart.full(); } TCodart_mask(); }; TString4 TCodart_mask::_restart; bool TCodart_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case 101: if (e == fe_init && restart()) { o.set(_restart); _restart.cut(0); o.check(STARTING_CHECK); e = fe_modify; } if (e == fe_modify) // Se cambio il contenuto del primo livello ... { if (id2pos(102) < 0) build_children(); // Ricostruisco la maschera else { _restart = o.get(); stop_run(K_FORCE_CLOSE); } } break; default: break; } return true; } void TCodart_mask::create_level(int level, const TString& subcode) { const TRectype& fsa = get_sublevel_info(subcode); if (!fsa.empty()) { const TString4 code = fsa.get("CODTAB"); // Puo' essere diverso da subcode! TString80 prompt = fsa.get("S0"); prompt.left_just(30); const TString& picture = fsa.get("S1"); const int length = picture.len(); TEdit_field& kfld = add_string(100+level, 0, prompt, 1, level, length, "B"); TEdit_field& dfld = add_string(200+level, 0, "", 40, level, 36, "D"); TFilename tmp; tmp.temp(); ofstream out(tmp); out << "USE GSA" << endl; //usa la tabella dei sottolivelli articolo out << "IN CODTAB[1,3] \"" << code << "\" SELECT" << endl; out << "IN CODTAB[4,0] " << kfld.dlg() << endl; out << "DI \"" << prompt; if (length > prompt.len()) out << '@' << length; out << "\" CODTAB[4,0]" << endl; out << "DI \"" << HR("Descrizione") << "@50\" S0" << endl; out << "OU " << kfld.dlg() << " CODTAB[4,0]" << endl; out << "OU " << dfld.dlg() << " S0" << endl; out << "CH RE" << endl; out << "EN" << endl; out.close(); TScanner scan(tmp); while (scan.pop() != "EN") kfld.parse_item(scan); xvt_fsys_removefile(tmp); set_handlers(); } } void TCodart_mask::build_children() { TArray& a = fields_array(); TString8 code = root_code(); code << get(101); const TString& children = cache().get("GSA", code, "S1"); for (int i = 0; i < 8; i++) { const TString& subcode = children.mid(i*3, 3); if (subcode.full()) create_level(i+2, subcode); else break; } force_update(); } TCodart_mask::TCodart_mask() : TAutomask(TR("Articolo guidato"), 1, 78, 13) { add_button(DLG_OK, 0, "", -12, -1, 10, 2); add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2); create_level(1, EMPTY_STRING); } bool advanced_get_codart(TString& code, TString& desc) { bool ok = false; bool running = true; while (running) { TCodart_mask m; ok = m.run() == K_ENTER; if (ok) { code.cut(0); desc.cut(0); for (short id = 101; m.id2pos(id) >= 0; id++) { code << m.get(id); if (id == 102) desc << ' '; desc << m.get(id+100); } running = false; } else running = m.restart(); } return ok; } /////////////////////////////////////////////////////////// // Essenzialissima interfaccia pubblica /////////////////////////////////////////////////////////// bool advanced_codart_enabled() { return root_code().full(); } bool advanced_codart_handler(TMask_field& fld, KEY key) { if (key == K_SPACE) { TString code, desc; if (advanced_get_codart(code, desc)) { TMask& msk = fld.mask(); msk.set(F_DESCR, desc); msk.set(F_CODART, code, true); msk.field(F_CODART).set_focus(); } } return true; }