#ifndef __PRINTER_H #define __PRINTER_H #ifndef XVT_INCL_XVT #include #endif #ifndef __STDIO_H #include #endif #ifndef __DATE_H #include #endif #ifndef __TEXT_H #include #endif // @doc EXTERNAL // @enum TPrintstyle | Indica lo stile da assegnare al carattere enum TPrintstyle { normalstyle = 0, // @emem Stile normale boldstyle = 1, // @emem Stile grassetto underlinedstyle = 2, // @emem Stile sttolineato italicstyle = 4 // @emem Stile corsivo }; // @doc EXTERNAL // @enum TPrtype | Indica il tipo di stampante da utilizzare per la stampa enum TPrtype { winprinter = 0, // @emem Stampa su stampante normale fileprinter = 1, // @emem Stampa su file screenvis = 2, // @emem Anteprima a video export = 3 // @emem Esporatzione di stampa }; // @doc EXTERNAL // @enum TGraphic_shape | Indica la forma grafica da utilizzare per la stampa enum TGraphic_shape { line, // @emem Disgna una linea box // @emem Disgna un box }; // 256 | Lunghezza massima della riga da stampare #define MAX_PR_WIDTH 256 // @doc EXTERNAL // @class TPrintrow | Classe per la definizione della stampa di una riga // // @base public | TObject class TPrintrow : public TObject // @author:(INTERNAL) Villa // @access:(INTERNAL) Private Member { // @cmember:(INTERNAL) Stringa da stampare nella riga TString256 _row; // @cmember:(INTERNAL) Attributi stile dei caratteri char _attr[MAX_PR_WIDTH]; // @cmember:(INTERNAL) Attributi colore dei caratteri int _cols[MAX_PR_WIDTH]; // @cmember:(INTERNAL) Inizio delle nuove posizioni di tabulazione TBit_array _tab; // @cmember:(INTERNAL) Immagini TToken_string* _images; // @cmember:(INTERNAL) Attributo carattere corrente TPrintstyle _currentstyle; // @cmember:(INTERNAL) Attributo colore corrente int _currentcolor; // @cmember:(INTERNAL) Ultima posizione di stampa int _lastpos; // @access Public Member public: // @cmember Costruttore TPrintrow(); // @cmember Costruttore TPrintrow(const TPrintrow& pr); // @cmember Distruttore virtual ~TPrintrow(); // TPrintrow& center(const char* str, int position); // @cmember Ritorna l'identificatore della classe virtual word class_id() const; // @cmember Ritorna il nome della classe virtual const char* class_name() const; // @cmember Duplica una riga (vedi ) virtual TObject* dup() const; // @cmember Ritorna la stringa da stampare nella riga const char* row() const { return _row; } // @cmember Ritorna la riga con i codici '@' per lo stile ed il colore del font const char* row_codified() const; // @cmember Svuota la riga TPrintrow& reset(); // @cmember Ritorna lo stile del carattere

-esimo (vedi ) TPrintstyle get_style(int position) const { return (TPrintstyle)_attr[position]; } // @cmember Ritorna l'attributo carattere corrente TPrintstyle get_style() const { return _currentstyle; } // @cmember Ritorna il colore del carattere

-esimo int get_color(int position) const { return (TPrintstyle)_cols[position]; } // @cmember Ritorna l'attributo colore corrente int get_color() const { return _currentcolor; } // @cmember Scrive una stringa (!!!-1=tab) TPrintrow& put(const char* str, int position = -1, int len=0); // @cmember Setta l'attributo carattere corrente (vedi ) void set_style(TPrintstyle style) { _currentstyle=style; } // @cmember Ritorna l'ultima posizione di stampa int lastpos() const { return _lastpos; } }; // @doc INTERNAL // @class BkDef | Classe per la definizione dei bookmark in anteprima di stampa // // @base public | TObject class BkDef : public TObject // @author:(INTERNAL) Villa // @comm Questo oggetto e' in grado di costruire l'intero menu' gerarchico dei bookmark { // @access Public Member public: // @cmember Identificatore del bookmark creato int _id; // @cmember Identificatore del bookmark padre int _father_id; // @cmember Testo del bookmark TString _txt; // @cmember Numero della riga sulla quale e' inserito il bookmark long _row; // @cmember Costruttore BkDef() {} // @cmember Distruttore virtual ~BkDef() {} }; class TPrinter; class TPrint_intersector; // @doc EXTERNAL // @type PRINTSECTIONHANDLER | Prototipo funzione definita dall'utente chiamata all'inizio della stampa // dell'header o del footer typedef void (*PRINTSECTIONHANDLER)(TPrinter& printer); // @doc EXTERNAL // @type LINKHANDLER | Prototipo funzione definita dall'utente per la gestione del link typedef void (*LINKHANDLER)(int, const char*); class TViswin; // @doc EXTERNAL // @class TPrinter | Classe per la definzione delle operazioni sulla stampante // // @base public | TObject class TPrinter : public TObject // @author:(INTERNAL) Villa // @access:(INTERNAL) Private Member { friend class TPrinter_setup_mask; // @cmember:(INTERNAL) Puntatore al file di configurazione FILE* _cnfptr; // @cmember:(INTERNAL) Puntatore al file della stampante FILE* _fp; // @cmember:(INTERNAL) Puntatore al file di visualizzaizone TViswin* _vf; // @cmember:(INTERNAL) Stampante di default di sistema TString _defPrinter; // @cmember:(INTERNAL) Testo da stampare TTextfile _txt; // @cmember:(INTERNAL) Nome del file di esportazione TFilename _exportfile; // @cmember:(INTERNAL) Dimensione dell'header int _headersize; // @cmember:(INTERNAL) Dimensione del footer int _footersize; // @cmember:(INTERNAL) Contenuto dell'header TArray _header; // @cmember:(INTERNAL) Contenuto del footer TArray _footer; // @cmember:(INTERNAL) Nome della stampante corrente TString _prname; // @cmember:(INTERNAL) Lunghezza della pagina logica int _formlen; // @cmember:(INTERNAL) Larghezza della pagina logica int _formwidth; // @cmember:(INTERNAL) Prossima riga da stampare int _currentrow; // @cmember:(INTERNAL) Nome del font per la stampa TString _fontname; // @cmember:(INTERNAL) Dimensione del font per la stampa int _ch_size; // @cmember:(INTERNAL) Pagina logica contenente la prossima riga da stampare word _currentpage; // @cmember:(INTERNAL) Prima pagina da stampare (normalmente 0) word _frompage; // @cmember:(INTERNAL) Ultima pagina da stampare (normalmente USHRT_MAX) word _topage; // @cmember:(INTERNAL) Indica la stampa di un form feed dopo ogni footer bool _hwformfeed; // @cmember:(INTERNAL) Indica il tipo di output selezionato dall'utente per la stampa TPrtype _printertype; // @cmember:(INTERNAL) Indica se la stampante e' inizializzata bool _isopen; // @cmember:(INTERNAL) Data di stampa TDate _date; // @cmember:(INTERNAL) Nome del file per la stampa su disco TFilename _printerfile; // @cmember:(INTERNAL) Array di nomi dei link TString_array _linksdescr; // @cmember:(INTERNAL) Array di nomi di segnalibri TArray _bookmarks; // @cmember:(INTERNAL) Indica se e' attivo il link multiplo (vedi ) bool _multiple_link; // @cmember:(INTERNAL) Nome del paragrafo di configurazione TString _config; // @cmember:(INTERNAL) Array di stringhe per la descrizione del background TArray _backgrounds; // @cmember:(INTERNAL) Nomi dei file delle immagini da stampare TString_array _image_names; // @cmember:(INTERNAL) Indica se la stampante e' abilitata a trattare grafica bool _isgraphics; // @cmember:(INTERNAL) Indica se la stampante e' stata momentaneamente interrotta bool _frozen; // @cmember:(INTERNAL) Descrizione completa dello stato della stampante PRINT_RCD* _print_rcd; // @cmember:(INTERNAL) Dimensione del record per la descrizione completa dello stato della stampante int _print_rcd_size; // @cmember:(INTERNAL) Numero di linee per pollice int _lines_per_inch; // @cmember:(INTERNAL) Offset verticale in pixels int _vert_offset; // @cmember:(INTERNAL) Offset orizzontale in pixels int _horz_offset; // @cmember:(INTERNAL) Offset verticale in linee (in caratteri) int _l_offset; // @cmember:(INTERNAL) Offset orizzontale in colonne (in caratteri) int _c_offset; // @cmember:(INTERNAL) Definizione dell stampa in punti per linea int _dots_per_line; // @cmember:(INTERNAL) Setta

con il profilo della stampante void _get_windows_printer_names(TToken_string& t); // @cmember:(INTERNAL) Indica se occorre esportare l'header di stampa bool _export_header; // @cmember:(INTERNAL) Lunghezza dell'header di stampa da esportare int _export_header_len; // @cmember:(INTERNAL) Handler dell'header PRINTSECTIONHANDLER _headerhandler; // @cmember:(INTERNAL) Handler del footer PRINTSECTIONHANDLER _footerhandler; // @cmember:(INTERNAL) Header del link ipertestuale LINKHANDLER _linkhandler; // @cmember:(INTERNAL) Caratteri per fincatura char _fink[11]; // @cmember:(INTERNAL) Flag per aggiungere ad una stampa su file gia' esistente (TRUE aggiunge in coda, FALSE sovrascrive) bool _appendfile; // @cmember:(INTERNAL) Tipo di fincatura (TRUE grafica, FALSE testo) bool _fink_mode; // @cmember:(INTERNAL) Fincatore per modo testo TPrint_intersector* _finker; // @access Protected Member protected: // @cmember Ritorna il carattere di newline virtual char newline() { return '\n'; } // @cmember Metodo base per la stampa bool printrow (TPrintrow* rowtoprint=NULL); // @cmember Stampa un formfeed (ritorna sempre TRUE) bool printformfeed (); // @cmember Stampa l'header della pagina bool printheader(); // @cmember Stampa il footer della pagina bool printfooter(); // @cmember Salva i parametri di configurazione correnti void save_configuration(); // @access Public Member public: // @cmember Costruttore TPrinter (); // @cmember Distruttore virtual ~TPrinter(); // @cmember Inizia una nuova sessione di stampa. Viene passata alla static BOOLEAN start_print(long data); // @cmember Setta il numero della prima pagina da stampare void set_from_page (word from) { _frompage = from; } // @cmember Setta il numero dell'ultima pagina da stampare void set_to_page (word to) { _topage = to; } // @cmember Indica se stampare un formfeed dopo ogni footer void set_hwff (bool hwff) { _hwformfeed = hwff; } // @cmember Permette di tradurre la stringa con i codici @codes in un array utilizzabile dalla stampa void parse_background(const char* bgdesc, TString_array& background); // @cmember Ritorna il nome della classe virtual const char* class_name() const; // @cmember Ritorna l'identificatore della classe virtual word class_id() const; // @cmember Ritorna la lunghezza della pagina logica int formlen () const { return _formlen; } // @cmember Ritorna la larghezza della pagina logica int formwidth () const { return _formwidth; } // @cmember Ritorna il numero della prima pagina da stampare word frompage () const { return _frompage; } // @cmember Ritorna il numero dell'ultima pagina da stampare word topage () const { return _topage; } // @cmember Ritorna la riga corrente all' interno della pagina int current_row () const { return _currentrow; } // @cmember Ritorna la dimensione dell'header int headersize () const { return _headersize; } // @cmember Ritorna la dimensione del footer int footersize () const { return _footersize; } // @cmember Ritorna il contenuto della

-esima linea dell'header TPrintrow* getheaderline (int linetoget); // @cmember Ritorna il contenuto della

-esima linea del footer TPrintrow* getfooterline (int linetoget); // @cmember Setta la lunghezza della pagina logica da stampare int formlen (int fl) { return (_formlen=fl); } // @cmember Setta la dimensione del footer int footerlen (int fl) { CHECKD(fl >= 0 && fl < 1024, "Bad footerlen ", fl); return _footersize = fl; } // @cmember Setta la dimensione dell'header int headerlen (int hl) { return (_headersize=hl); } // @cmember Setta il numero della prima pagina da stampare word frompage (word fp) { return (_frompage=fp);} // @cmember Setta il numero dell'ultima pagina da stampare word topage (word tp) { return (_topage=tp); } // @cmember Setta il contenuto di una line dell'header void setheaderline (int linetoset, TPrintrow* line); // @cmember Setta il contenuto di una line dell'header passata per indirizzo void setheaderline (int linetoset, const TPrintrow& line); // @cmember Setta il contenuto di una line del footer void setfooterline (int linetoset, TPrintrow* line); // @cmember Setta il contenuto di una line del footer passata per indirizzo void setfooterline (int linetoset, const TPrintrow& line); // @cmember Elimina il contenuto dell'header void resetheader(); // @cmember Elimina il contenuto del footer void resetfooter(); // @cmember Setta il colore del background void setbackground(const char* bg, int index = 0); // @cmember Ritorna l'array con i nomi delle immagini da stampare!!! TString_array& image_names() { return _image_names; } // @cmember Ritorna l'array con i nomi dei colori da stampare!!! TString_array& getbgdesc(word page = 0) const; // @cmember Ritorna l'array con i segalibri settati TArray& get_bookmarks() { return _bookmarks; } // @cmember Ritorna se la stampante e' stata momentaneamente interrotta bool frozen() { return _frozen; } // @cmember Setta l'interruzione momentanea della stampante void freeze(bool b = TRUE) { _frozen = b; } // @cmember Ritorna il testo da stampare TTextfile& get_txt() { return _txt; } // @cmember Stampa il testo void print_txt(TTextfile& txt); // @cmember Setta l'handle dell'header void setheaderhandler(PRINTSECTIONHANDLER h) { _headerhandler = h; } // @cmember Setta l'handle del footer void setfooterhandler(PRINTSECTIONHANDLER h) { _footerhandler = h; } // sono qui e non nella printapp per poter usare una viswin // completamente anche da un'altra application // @cmember Setta l'header del link (usata dalla ) void setlinkhandler(LINKHANDLER h) { _linkhandler = h; } // @cmember Ritorna l'header del link LINKHANDLER getlinkhandler() { return _linkhandler; } // @cmember Ritorna l'array con i nomi dei link TString_array& links() { return _linksdescr; } // @cmember Abilita/disabilita il link multiplo void setmultiplelink(bool on) { _multiple_link = on; } // @cmember Indica se attivato il link multiplo bool ismultiplelink() { return _multiple_link; } // @cmember Ritorna i caratteri di fincatura const char* get_fincatura() { return _fink; } // @cmember Setta i caratteri di fincatura void set_fincatura(const char* s) { strncpy(_fink, s, sizeof(_fink)); } // @cmember Setta/forza il tipo di fincatura void set_fink_mode(bool f) ; // @cmember Ritorna il tipo di fincatura bool get_fink_mode() { return _fink_mode; } // @cmember Ritorna il carattere di fincatura alto-sinistra char f_topleft() const { return _fink[0]; } // @cmember Ritorna il carattere di fincatura alto-centro char f_topmiddle() const { return _fink[1]; } // @cmember Ritorna il carattere di fincatura alto-destra char f_topright() const { return _fink[2]; } // @cmember Ritorna il carattere di fincatura basso-sinistra char f_botleft() const { return _fink[3]; } // @cmember Ritorna il carattere di fincatura basso-centro char f_botmiddle() const { return _fink[4]; } // @cmember Ritorna il carattere di fincatura basso-destra char f_botright() const { return _fink[5]; } // @cmember Ritorna il carattere di fincatura centro-sinistra char f_centerleft() const { return _fink[6]; } // @cmember Ritorna il carattere di fincatura centro-centro char f_centermiddle() const { return _fink[7]; } // @cmember Ritorna il carattere di fincatura centro-destra char f_centerright() const { return _fink[8]; } // @cmember Ritorna il carattere di fincatura orizzontale char f_horizontal() const { return _fink[9]; } // @cmember Ritorna il carattere di fincatura verticale char f_vertical() const { return _fink[10]; } // @cmember Permette di saltare alcune righe dalla posizione corrente bool skip (int linetoskip); // @cmember Permette di saltare alla riga indicata bool jump (int linestojump); // @cmember Resetta la stampa eliminando header e footer correnti e riportando i valori di // pagina corrente e riga corrente a 1 void reset (); // @cmember Permette di settare i parametri di stampa tramite la maschera bagn001a virtual bool set (); // @cmember Apre un processo di stampa bool open (); // @cmember Chiude un processo di stampa void close (); // @cmember Stampa un formfeed. bool formfeed (); // @cmember Permette di stampare una riga bool print (TPrintrow& rowtoprint); // @cmember Ritorna se la stampante e' stat inizializzata bool isopen() { return _isopen; } // @cmember Permette di settare la data di stampa void setdate(const TDate& d) { _date = d; } // @cmember Ritorna la data di stampa const TDate& getdate() const { return _date; } // @cmember Ritorna il tipo di output selezionato dall'utente per la stampa TPrtype printtype() { return _printertype; } // @cmember Setta il tipo di output selezionato dall'utente per la stampa void set_printtype(TPrtype dest) { _printertype=dest; } // @cmember Setta il nome del file per la stampa su disco void set_printerfile(const char* ffile) { _printerfile=ffile; } const TFilename& get_printerfile() const { return _printerfile; } // @cmember Setta il flag per la stampa in coda al file su disco void set_append(const bool append = TRUE) { _appendfile = append; } // @cmember Ritorna il numero della pagina logica da stampare word getcurrentpage() const { return _currentpage; } // @cmember Setta il numero della pagina logica da stampare void setcurrentpage(word n) { _currentpage = n; } // @cmember Dirige la stampa sul file specificato, preservando gli attributi di formato. // Se

= TRUE si stampano su file anche gli header void set_export_file(const char* n, bool header = TRUE, int len = 0) { _printertype = export; _exportfile = n; _export_header = header; _export_header_len = len;} // @cmember Inserisce un file di export fatto da un'altra printer void merge_export_file(const char* file, bool header = TRUE); // @cmember Ritorna il numero di righe disponibili poer la stampa word rows() const { return word(_formlen-_headersize-_footersize); } // @cmember Ritorna il numero di righe che rimangono a disposizione per la stampa word rows_left() const; // @cmember Setta il record per la descrizione dello stato dell stampante void set_printrcd(); // @cmember Ritorna il record per la descrizione dello stato dell stampante PRINT_RCD* get_printrcd(int* size = NULL); // @cmember Setta le caratteristiche della stampante leggendole da

void init_formlen(WINDOW prwin = NULL_WIN); // @cmember Setta la definizione della stampante in linee per pollice void set_lines_per_inch(int n) { _lines_per_inch = n; } // @cmember Ritorna la definizione della stampante in linee per pollice int get_lines_per_inch() const { return _lines_per_inch; } // @cmember Ritorna l'offset verticale int get_vert_offset() const { return _vert_offset; } // @cmember Ritorna l'offset orizzontale int get_horz_offset() const { return _horz_offset; } // @cmember Ritorna l'offset verticale in caratteri (linee) int get_line_offset() const { return _l_offset; } // @cmember Ritorna l'offset orizzontale in caratteri (colonne) int get_column_offset() const { return _c_offset; } // @cmember Ritorna la definizione di stampa in punti per linea int get_dots_per_line() const { return _dots_per_line; } // @cmember Ritorna se la stampante e' abilitata a stampare grafica bool isgraphics() const { return _isgraphics; } // @cmember Setta la stampante per l'abilitazione a stampare in grafica void set_graphics(bool g) { _isgraphics=g; } // @cmember Setta l'offset verticale e orizzontale in caratteri void set_offset(int a, int b) { _l_offset=a; _c_offset=b;} // @cmember ritorna la riga di background se si stampa in modo testo const char* background_chars(int l) const; // @cmember Ritorna la dimensione dei caratteri da stampare int get_char_size() const { return _ch_size; } // @cmember Ritorna il nome del font di stampa const TString& fontname() const { return _fontname; } // @cmember Ritorna il nome della stampante const TString& printername() const { return _prname; } // @cmember Setta la dimensione dei caratteri da stampare void set_char_size(int size) { _ch_size = size; } // @cmember Setta il nome del font di stampa void set_fontname(const char *name) { _fontname = name; } // @cmember Legge la configurazione della stampante void read_configuration(const char* parag = NULL); // @cmember Crea un segnalibro int set_bookmark(const char* txt, int father = -1); // @cmember Ritorna vero se la stampante e' generica/solo testo bool is_generic() { return (_dots_per_line == 1); } // @cmember Calcola la dimensione del font per le colonne desiderate int calc_font_size(int columns) const; // @cmember Calcola il numero di colonne per il font/size attuale int calc_num_cols() const; }; // @doc EXTERNAL // @class TFile_printer | Classe per la definizione delle operazioni per la stampa su file // // @base public | TPrinter class TFile_printer : public TPrinter // @author:(INTERNAL) Nicola // @access:(INTERNAL) Private Member { // @cmember:(INTERNAL) Dimensione del file long _size; // @cmember:(INTERNAL) Disco al quale appartiene il file const char * _drive; // @cmember:(INTERNAL) Numero progressivo volume int _volume; // @cmember:(INTERNAL) Numero di record per disco int _num_rec_volume; // @cmember:(INTERNAL) Numero di record per inizio e fine volume int _num_rec_testa_coda; // @cmember:(INTERNAL) Numero di record per inizio volume int _num_rec_inizio; // @cmember:(INTERNAL) Numero di record per coda volume int _num_rec_fine; // @cmember:(INTERNAL) Lunghezza del record int _len_rec; // @cmember:(INTERNAL) Array di tipi record TArray _record; // @cmember:(INTERNAL) Indica se il file sui dischetti deve avere un nome NON modificabile dall'utente bool _nome_file_fissato; // @cmember:(INTERNAL) Indica se l'etichetta dei dischetti deve essere fissa bool _label_fissata; // @cmember:(INTERNAL) File da generare sui dischetti const char* _file; // @cmember:(INTERNAL) Etichetta da scrivere sui dischetti const char* _label; // @cmember:(INTERNAL) Array dei file temporanei generati TArray _tmp_files; // @cmember:(INTERNAL) Puntatore al file creato FILE* _fd; // bool scrivi_volume(); // @access Public Member public: // @cmember Ritorna il valore di una newline virtual char newline() { return '\0'; } // @cmember Setta se il file sui dischetti deve avere un nome NON modificabile dall'utente void set_file_fissato (bool fissato) { _nome_file_fissato = fissato; } // @cmember Setta se l'etichetta dei dischetti deve essere fissa void set_label_fissata (bool fissata) { _label_fissata = fissata; } // @cmember Setta la lunghezza del record void set_len_rec (int len) { _len_rec = len; } // @cmember Setta il file da generare sui dischetti void set_file (const char * ffile) { _file = ffile; } // @cmember Setta l'etichetta da scrivere sui dischetti void set_label (const char * label) { _label = label; } // @cmember Aggiunge un array di tipo record alla posizione

void set_record (int record_to_set, TPrintrow* line) {_record.add(line, record_to_set); } // @cmember Ritorna l'array di tipo record della posizione

TPrintrow * get_record (int record_to_get) {return (TPrintrow *)&_record[record_to_get]; } // @cmember Ritorna il record di inizio volume TPrintrow* get_record_inizio_volume() const { return (TPrintrow*)&_record[0];} // @cmember Ritorna il record di inizio elenco TPrintrow* get_record_inizio_elenco() const {return (TPrintrow*)&_record[1];} // @cmember Ritorna il record del dettaglio TPrintrow* get_record_dettaglio() const { return (TPrintrow*)&_record[2]; } // @cmember Ritorna il record di fine elenco TPrintrow* get_record_fine_elenco() const {return (TPrintrow*)&_record[3]; } // @cmember Ritorna il record di fine volume TPrintrow* get_record_fine_volume() const { return (TPrintrow*)&_record[4]; } // @cmember Ritorna ??? TPrintrow* get_record_filler() const { return (TPrintrow*)&_record[5]; } // @cmember Ritorna il numero di record per disco int num_rec_volume () { return _num_rec_volume; } // @cmember Ritorna il numero progressivo

int num_volumi () { return _volume; } // @cmember Ritorna il numero progressivo

dopo averlo incrementato void inc_volume () { _volume++; } // @cmember Aggiunge il nome di un file temporaneo void add_file (TFilename nomef) { _tmp_files.add(nomef); } // @cmember Apre il file void open(); // @cmember Chiude il file void close(); // void scrivi(); // @cmember Genera i dischetti bool genera_dischetti(); // @cmember Setta i parametri di stampa su disco virtual bool set (); // // tipo_disco: // 0 per 360 // 1 per 1.2 // 2 per 720 // 3 per 1,44 // 4 per 2,88 // @cmember Costruttore TFile_printer (const char* file, const char* label, int len_rec, int num_rec_inizio = 1, int num_rec_fine = 1, int tipo_disco=0); // @cmember Distruttore virtual ~TFile_printer(); }; // @doc EXTERNAL // @func Ritorna la stampante corrente // // @rdesc Ritorna l'identificatore della stamapnte corrente TPrinter& printer(); // @func Distrugge l'oggetto della stampante corrente void printer_destroy(); #endif // __PRINTER_H