#include #include #include #include #include #include #include "ba8400.h" #include "ba8500.h" /////////////////////////////////////////////////////////// // Utility /////////////////////////////////////////////////////////// bool cod2app(const char* tok, TString& app) { if (tok != NULL && isalpha(tok[0]) && isalpha(tok[1]) && atoi(tok+2) > 1000) { TFilename f; f.strncpy(tok, 3); f.ext("exe"); if (!f.custom_path()) return false; app.strncpy(tok, 3); app << " -" << char(tok[3]-1); return true; } return false; } bool get_xml_attr(const TString& line, const char* attr, TString& value) { TString str; str << ' ' << attr << "=\""; const int pos = line.find(str); if (pos >= 0) { const int apicia = line.find('"', pos)+1; const int apicic = line.find('"', apicia); if (apicic > apicia) { value = line.sub(apicia, apicic); return true; } } return false; } bool get_xml_child(const TString& line, const char* tag, TString& value) { TString str; str << '<' << tag << '>'; const int pos = line.find(str); if (pos >= 0) { const int apicia = line.find('>', pos)+1; const int apicic = line.find('<', apicia); if (apicic > apicia) { value = line.sub(apicia, apicic); return true; } } return false; } bool rep2app(const char* name, TString& app, TString& desc) { app = desc = ""; TFilename report_name(name); report_name.ext("rep"); if (!report_name.custom_path()) return false; TString stringona; TScanner scan(report_name); for (int i = 0; i < 3 && scan.good(); i++) // Leggo solo le prime righe stringona << scan.line(); get_xml_child(stringona, "description", desc); get_xml_attr(stringona, "command", app); if (app.not_empty()) return true; return cod2app(report_name.name(), app); } /////////////////////////////////////////////////////////// // TKlarkKent_mask /////////////////////////////////////////////////////////// class TKlarkKent_mask : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TKlarkKent_mask() : TAutomask("ba8500a") { } }; bool TKlarkKent_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F_REPORT: if (e == fe_button) { TFilename path; if (select_custom_file(path, "rep")) { o.set(path); e = fe_modify; } } if (e == fe_init || e == fe_modify) { TFilename name = o.get(); TString app, desc; rep2app(name, app, desc); set(F_FORM, desc); set(F_DOC, app); enable(DLG_PRINT, desc.not_empty()); } break; case DLG_EDIT: if (e == fe_button && !field(F_REPORT).empty()) { TString str; str << "ba8 -2 " << get(F_REPORT); TExternal_app app(str); app.run(true); } break; default: break; } return true; } /////////////////////////////////////////////////////////// // TKlarkKent_app /////////////////////////////////////////////////////////// TReport* TKlarkKent_app::create_report(const char* name) const { TReport* r = new TReport; r->load(name); return r; } void TKlarkKent_app::main_loop() { TString_array arr; for (int i = 2; i < argc(); i++) arr.add(argv(i)); if (arr.items() == 0) arr.add(EMPTY_STRING); bool can_repeat = false; do { TReport* report = NULL; TReport_book book; FOR_EACH_ARRAY_ROW(arr, r, row) { TFilename report_name = *row; report_name.ext("rep"); if (row->blank() || !report_name.custom_path()) { TKlarkKent_mask m; m.set(F_REPORT, report_name); if (m.run() == K_ENTER) { report_name = m.get(F_REPORT); report_name.ext("rep"); report_name.custom_path(); *row = report_name; } } TString appname, desc; const bool custom_app = rep2app(report_name, appname, desc); if (custom_app) { appname << ' ' << report_name; TExternal_app app(appname); app.run(true); } else { if (report != NULL) delete report; report = create_report(report_name); if (report != NULL) { const bool ok = book.add(*report); if (ok && arr.items() == 1) // Controlla se e' pensabile ripetere la stampa { TFilename msk = report_name; msk.ext("msk"); can_repeat = msk.custom_path(); // Posso ripetere se ho una maschera collegata } else can_repeat = false; } } } // ciclo sulla lista dei report da stampare // L'anteprima funziona bene solo se non si distrugge il report corrente if (report != NULL) { if (book.pages() > 0) book.print_or_preview(); delete report; report = NULL; } } while (can_repeat); } int ba8500(int argc, char* argv[]) { TKlarkKent_app app; app.run(argc, argv, TR("Stampa Report")); return 0; }