// trattasi di -*-c++-*- #ifndef __PRINTAPP_H #define __PRINTAPP_H #ifndef __APPLICATION_H #include #endif #ifndef __PRINTER_H #include #endif #ifndef __RELATION_H #include #endif // compatibility #define TPrintapp TPrint_application enum print_action { REPEAT_PAGE, NEXT_PAGE }; // user functions to pass field informations to setrow() // no class or nice C++ interface since varargs is nasty // FLD(Num.logico, Nome campo [, da [, a]]) const char* FLD(int lognum, const char* f, int from = -1, int to = -1); // FLD(Num. logico, Nome campo numerico, Picture string) const char* FLD(int lognum, const char* f, const char* picture); // FLD(Nome tabella, Nome campo numerico, Picture string) const char* FLD(const char* tabname, const char* f, const char* picture); // FLD(Num.logico, Nome campo [, da [, a]]) const char* FLD(const char* tabname, const char* f, int from = -1, int to = -1); struct link_item { int _logicnum; link_item* _son; link_item* _brother; int _cnt; link_item(int l) { _logicnum = l; _son = NULL; _brother = NULL; _cnt = 0; } }; class TProgind; class TPrint_application : public TApplication { TArray _rows; // rows descriptor TArray _cursors; // cursor array TCursor* _cur; // current cursor TArray _transtab; // field translation table TArray _header; // header lines TArray _footer; // footer lines int _currow; // current print row TPrintstyle _curstyle; // current print style bool _auto_ff; // automatic form feed after each page const char* _wmess; // wait message for progind bool _wbar; // bar y/n for progind bool _wcancel; // cancel button enabled int _wthr; // minimum # of items to show print progind const char* _confpr; // config filename for printer char _fillchar; // fill character for empty fields link_item* _pr_tree; // functions for autom. printing of relations int _maxrow; // reference to maxrow int _cur_file; bool _print_defined; bool _force_progind; bool _force_setpage; bool _print_zero; TProgind* _prind; const char* _picture; MENU_TAG _last_choice; int _ncopies; bool _repeat_print; bool _cancelled; // set the printer void set_printer() { printer().set(); } // print a single record; does not advance cursor // returns failure or success bool print_one(int file); // to be documented but very fig bool print_tree(link_item* head); static void _pp_header(TPrinter& pr); static void _pp_footer(TPrinter& pr); static void _pp_link(int id, const char* s); link_item* _look_print_node(link_item* head, int logicnum); void _reset_tree(link_item* head); virtual bool create(); virtual bool destroy(); protected: // **************************************************** // ISTRUZIONI PER l'USO // **************************************************** // // La Printapp, saggiamente, consente di operare su uno // o piu' cursori stampando automaticamente anche files // collegati. La sequenza delle operazioni e' la seguente: // // 1) Derivare una classe da TPrint_application // 2) Implementare user_create() e user_destroy(); // Nella user_create() si creino i // necessari cursori, e li si dia in pasto a Printapp // usando add_cursor(). Si puo' fare add_cursor(new TCursor(...)) // dato che il cursore viene distrutto automaticamente. // 3) Per ciascun file del cursore che si desidera porre // nell'albero di stampa, si faccia add_file(logicnum [,from]); // [from] sara' il file a cui e' collegato nella relazione. // add_file VA FATTA anche per il file principale, se no // non stampera' nulla; // ********************************************************* // FUNZIONI VIRTUALI OBBLIGATORIE // ********************************************************* // 4) Si definiscono le necessarie funzioni virtuali: e' // sicuramente necessaria la set_page(file) nella quale // si metteranno (sotto if o switch) le istruzioni // set_row (vedi sotto) corrispondenti alla pagina // logica relativa a ciascun record di ogni file da stampare. // Va definita anche set_print() in cui si presentera' ;a // maschera di scelta se necessaria o una box yes_no; // Ritornando TRUE da set_print la stampa viene eseguita // automaticamente (in genere ritorna FALSE se l'utente // annulla la stampa con ESC.) // // Alla set_page, come alle pre_ e post_ process, viene // passato 0 se il cursore attuale e' nullo (vedi sotto). // ********************************************************* // FUNZIONI VIRTUALI FACOLTATIVE // ********************************************************* // 5) Le varie funzioni pre_ e post_ process _page e _print // vengono chiamate prima e dopo la stampa di ogni record // o gruppo di record relativo alla relazione immessa; // ad esempio, postprocess_print() viene chiamata per il // file principale una volta dopo l'intera stampa; per // un file collegato nella relazione, e' chiamata tante // volte quanti gruppi di almeno un record esistono per // record del file genitore. Qui si possono modificare // righe, calcolare totali etc. A queste funzioni // viene sempre passato il file (logicnum) in corso di stampa e // un contatore che indica quante volte la stampa e' stata // ripetuta. le pre_ ritornano TRUE o FALSE, nell'ultimo // caso interrompono la stampa; le post_ ritornano // NEXT_PAGE (comportamento normale) o REPEAT_PAGE // (indovina cosa fa). // 6) set_print() viene chiamata dalla voce Selezione, // unica del secondo menu. E' il posto dove mettere // una buona maschera di selezione di cosa stampare. // Alla fine, si esegua enable_print_menu() per // abilitare la voce Stampa, inizialmente inattiva. // 7) cancel_hook() permette di intercettare la // cancellazione della stampa; ritornando TRUE // la stampa viene effettivamente cancellata // Tutti i parametri relativi al progress indicator // vengono settati da funzioni apposite (vedi oltre) // **************************************************** // Molte altre minchiatine (form feed automatici, header, // footer etc) sono spiegate nel seguito // **************************************************** virtual bool user_create() pure; virtual bool user_destroy() pure; // set print, bound to menu :Selezione:Stampa // chiamata automaticamente dopo user_create() virtual bool set_print(int i = 1) { return FALSE; } // set_row functions MUST be called here in a switch // for each particular file being printed virtual void set_page(int file, int cnt) {} // called before processing each page // used to set print strings from tables or files // not included in relation // returning FALSE cancels page printing // counter is the current print page number virtual bool preprocess_page(int file, int counter) { return TRUE; } // same before each print request // e.g. to initialize counters // returning FALSE cancels print request or subtree virtual bool preprocess_print(int file, int counter) { return TRUE; } // postprocessing; returning REPEAT_PAGE reprints the // whole page (after all sons are printed) or print // counter is the current page or print number virtual print_action postprocess_page(int file, int counter) { return NEXT_PAGE; } virtual print_action postprocess_print(int file, int counter) { return NEXT_PAGE; } // executed after all print job is completed virtual void postclose_print() {} // called when LINK button is pressed with active selection in // preview window virtual void process_link(int id, const char* text) {} // called when user cancels print; returning TRUE // actually stops printing; not called if no cancel virtual bool cancel_hook() {return TRUE;} // bound to TApplication print menu // redefined ONLY for very special purposes virtual void print(); // bound to