From 41a79a4bb65377c99a85497f1ff6184c2b1b0b51 Mon Sep 17 00:00:00 2001 From: cris Date: Tue, 10 Dec 1996 08:54:43 +0000 Subject: [PATCH] calcolo dimensione font (a partire da quella impostata) per stampa 132 col. git-svn-id: svn://10.65.10.50/trunk@3989 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/printer.cpp | 54 ++ include/printer.h | 1675 ++++++++++++++++++++++--------------------- 2 files changed, 893 insertions(+), 836 deletions(-) diff --git a/include/printer.cpp b/include/printer.cpp index 79c9cbea1..c976e03b1 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -2185,6 +2185,60 @@ const char* TPrinter::background_chars(int l) const { return _finker == NULL ? "" : _finker->get_chars(l); } + +/////////////////////////////////////////////////////////// +// Calcolo dimensione font +/////////////////////////////////////////////////////////// + +struct font_data +{ + TString _name; + int _size; + int _columns; +}; + +BOOLEAN XVT_CALLCONV1 calc_font_callback(long data) +{ + font_data& fd = *(font_data*)data; + + // Create pint window + WINDOW win = xvt_print_create_win(printer().get_printrcd(), "Calcolo font"); + + // Set print font + xvt_set_font(win, fd._name, XVT_FS_NONE, fd._size); + + long pw, ph, phr, pvr; // Printer width, height, horizontal and vertical resolution + xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, printer().get_printrcd(), &ph, &pw, &pvr, &phr); + + TString test(fd._columns); + test.fill('M', fd._columns); + for (int size = fd._size; size > 0; size--) + { + const int w = xvt_dwin_get_text_width(win, (char*)(const char*)test, fd._columns); + if (w <= phr) + break; + } + + if (size > 0) + fd._size = size; + + return FALSE; +} + +int TPrinter::calc_font_size(int columns) const +{ + font_data fd; + fd._name = fontname(); + fd._size = get_char_size(); + fd._columns = columns; + + xvt_print_open(); + xvt_print_start_thread(calc_font_callback, (long)&fd); + xvt_print_close(); + + return fd._size; +} + /////////////////////////////////////////////////////////// // Gestione fax diff --git a/include/printer.h b/include/printer.h index fb44427b3..fa5005a32 100755 --- a/include/printer.h +++ b/include/printer.h @@ -1,836 +1,839 @@ -#ifndef __PRINTER_H -#define __PRINTER_H - -#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 -{ - normprinter = 0, // @emem Stampa su stampante normale - fileprinter = 1, // @emem Stampa su file - spoolprinter = 2, // @emem Stampa utilizzando lo spool - localprinter = 3, // @emem Stampa su la stampante locale - screenvis = 4, // @emem Anteprima a video - winprinter = 5, // @emem Stampa su stampante definita da Windows - export = 6 // @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 -}; - -// @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 -{ - // @ccost:(INTERNAL) MAXSTR | 256 | Lunghezza massima della riga da stampare - enum { MAXSTR = 256 }; - - // @cmember:(INTERNAL) Stringa da stampare nella riga - TString256 _row; - // @cmember:(INTERNAL) Attributi carattere dei caratteri - char _attr[MAXSTR]; - // @cmember:(INTERNAL) Attributi colore dei caratteri - int _cols[MAXSTR]; - // @cmember:(INTERNAL) Inizio delle nuove posizioni di tabulazione - TBit_array _tab; - - // @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 PrinterDef | Classe per la definizione delle stampanti da utilizzare -// -// @base public | TObject -class PrinterDef : public TObject - -// @author:(INTERNAL) Villa - -{ - // @cfriend TPrinter - friend class TPrinter; - - // @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Nome del file della stampante - TString _printername; - // @cmember:(INTERNAL) Tipo di stampante da utilizzare (0=diretta,1=locale,2=spool) - TString _printertype; - // @cmember:(INTERNAL) Filtro per la pipe '' (solo per unix - TString _filtername; - // @cmember:(INTERNAL) Nome del device di stampa - TString _devicename; - // @cmember:(INTERNAL) Codici attributo per la stampante corrente - char _atstr[4][10]; - // @cmember:(INTERNAL) Codici di stampa - TString_array _codes; - // @cmember:(INTERNAL) Nome dei codici di stampa - TString_array _names; - // @cmember:(INTERNAL) Codice del formfeed per la stampante corrente - TString _ffcode; - // @cmember:(INTERNAL) Codice del new line per la stampante corrente - TString _nlcode; - - // @access Public Member -public: - // @cmember Legge la descrizione della stampante dal file - bool read(const char* name, FILE* fd); - // @cmember Controlla se il nome del file della stampante e' "Default" - bool isdefault(); - // @cmember Ritorna l'

-esimo nome del codice di stampa - const char* get_codenames(word i) const - { return i < (word)_names.items() ? (const char*)_names.row(i) : NULL; } - // @cmember Ritorna l'

-esimo codice di stampa - const char* get_codes(word i) const - { return i < (word)_codes.items() ? (const char*)_codes.row(i) : NULL; } - // @cmember Costruttore - PrinterDef() : _printername(10), _filtername(10), _ffcode("\f"), _nlcode("\n") - {} -}; - -// @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 -{ - // @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) 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) Descrizione delle stampanti - TArray _printers; - // @cmember:(INTERNAL) Indice corrente della stampante - int _curprn; - // @cmember:(INTERNAL) Codice corrente della stampante - int _curcode; - // @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 - TString80 _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 - TArray _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 desccrizione del background - TString_array _background; - // @cmember:(INTERNAL) Nomi dei file delle immagini da stampare - TString_array _image_names; - - // @cmember:(INTERNAL) Stringa contenente i @codes per il disegno dello sfondo - const char* _bg_desc; - // @cmember:(INTERNAL) Nomi delle stampanti utilizzabile - TToken_string _printer_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) Numero di copie da fare - int _ncopies; - // @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 si tratta di copia multipla - bool _multiple_copies; - // @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) 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(); - // @cmember Stampa il testo - void print_txt(TTextfile& txt); - - // @cmember Chiude il fax server - void close_fax_server() const; - - // @access Public Member -public: - - // @cmember Costruttore - TPrinter (); - // @cmember Distruttore - virtual ~TPrinter(); - - -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT - // @cmember Inizia una nuova sessione di stampa. Viene passata alla - static BOOLEAN XVT_CALLCONV1 start_winprint(long); -#endif - - // @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, TArray& bg); - - // @cmember Ritorna il numero delle stampanti disponibili - int descriptions() - { return _printers.items(); } - // @cmember Ritorna il nome della

-esima stampante disponibile - const PrinterDef& get_description(word i) const - { return (const PrinterDef&) _printers[i]; } - - // @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) - { 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); - // @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() - { return _background; } - // @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 numero delle copie da stampare - int n_copies() { return _ncopies; } - // @cmember Abilita/disabilita la copia multipla!!! - void enable_multiple_copies(bool b = TRUE) - { _multiple_copies = b; } - - // @cmember Ritorna il nome delle stampanti utilizzabili - TToken_string& getprinternames(); - // @cmember Ritorna il testo da stampare - TTextfile& get_txt() - { return _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 - TArray& 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 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; } - // @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 _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); -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT - // @cmember Setta le caratteristiche della stampante leggendole da

- void set_win_formlen(WINDOW prwin = NULL_WIN); -#endif - // @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 TRUE se la stampante e' un fax - bool isfax() const; - // @cmember Lancia ik fax server - bool start_fax_server() const; - // @cmember Spedisce la stampa attuale via fax - bool send_fax(const char* tipo, const char* codice); - - // @cmember Ritorna la dimensione dei caratteri da stampare - int get_char_size() const - { return _ch_size; } - // @cmember Ritorna il nome del font di stampa - char* fontname() const - { return (char*)(const char*)_fontname; } - - // @cmember Ritorna il nome della stampante - const char* printername() const - { return (const char*)get_description (_curprn)._devicename; } - - // @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); } -}; - -// @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) Indica se il disco deve essere formattato prima di fare la stampa - bool _formatta; - // @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 +#ifndef __PRINTER_H +#define __PRINTER_H + +#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 +{ + normprinter = 0, // @emem Stampa su stampante normale + fileprinter = 1, // @emem Stampa su file + spoolprinter = 2, // @emem Stampa utilizzando lo spool + localprinter = 3, // @emem Stampa su la stampante locale + screenvis = 4, // @emem Anteprima a video + winprinter = 5, // @emem Stampa su stampante definita da Windows + export = 6 // @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 +}; + +// @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 +{ + // @ccost:(INTERNAL) MAXSTR | 256 | Lunghezza massima della riga da stampare + enum { MAXSTR = 256 }; + + // @cmember:(INTERNAL) Stringa da stampare nella riga + TString256 _row; + // @cmember:(INTERNAL) Attributi carattere dei caratteri + char _attr[MAXSTR]; + // @cmember:(INTERNAL) Attributi colore dei caratteri + int _cols[MAXSTR]; + // @cmember:(INTERNAL) Inizio delle nuove posizioni di tabulazione + TBit_array _tab; + + // @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 PrinterDef | Classe per la definizione delle stampanti da utilizzare +// +// @base public | TObject +class PrinterDef : public TObject + +// @author:(INTERNAL) Villa + +{ + // @cfriend TPrinter + friend class TPrinter; + + // @access:(INTERNAL) Private Member + + // @cmember:(INTERNAL) Nome del file della stampante + TString _printername; + // @cmember:(INTERNAL) Tipo di stampante da utilizzare (0=diretta,1=locale,2=spool) + TString _printertype; + // @cmember:(INTERNAL) Filtro per la pipe '' (solo per unix + TString _filtername; + // @cmember:(INTERNAL) Nome del device di stampa + TString _devicename; + // @cmember:(INTERNAL) Codici attributo per la stampante corrente + char _atstr[4][10]; + // @cmember:(INTERNAL) Codici di stampa + TString_array _codes; + // @cmember:(INTERNAL) Nome dei codici di stampa + TString_array _names; + // @cmember:(INTERNAL) Codice del formfeed per la stampante corrente + TString _ffcode; + // @cmember:(INTERNAL) Codice del new line per la stampante corrente + TString _nlcode; + + // @access Public Member +public: + // @cmember Legge la descrizione della stampante dal file + bool read(const char* name, FILE* fd); + // @cmember Controlla se il nome del file della stampante e' "Default" + bool isdefault(); + // @cmember Ritorna l'

-esimo nome del codice di stampa + const char* get_codenames(word i) const + { return i < (word)_names.items() ? (const char*)_names.row(i) : NULL; } + // @cmember Ritorna l'

-esimo codice di stampa + const char* get_codes(word i) const + { return i < (word)_codes.items() ? (const char*)_codes.row(i) : NULL; } + // @cmember Costruttore + PrinterDef() : _printername(10), _filtername(10), _ffcode("\f"), _nlcode("\n") + {} +}; + +// @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 +{ + // @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) 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) Descrizione delle stampanti + TArray _printers; + // @cmember:(INTERNAL) Indice corrente della stampante + int _curprn; + // @cmember:(INTERNAL) Codice corrente della stampante + int _curcode; + // @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 + TString80 _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 + TArray _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 desccrizione del background + TString_array _background; + // @cmember:(INTERNAL) Nomi dei file delle immagini da stampare + TString_array _image_names; + + // @cmember:(INTERNAL) Stringa contenente i @codes per il disegno dello sfondo + const char* _bg_desc; + // @cmember:(INTERNAL) Nomi delle stampanti utilizzabile + TToken_string _printer_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) Numero di copie da fare + int _ncopies; + // @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 si tratta di copia multipla + bool _multiple_copies; + // @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) 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(); + // @cmember Stampa il testo + void print_txt(TTextfile& txt); + + // @cmember Chiude il fax server + void close_fax_server() const; + + // @access Public Member +public: + + // @cmember Costruttore + TPrinter (); + // @cmember Distruttore + virtual ~TPrinter(); + + +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT + // @cmember Inizia una nuova sessione di stampa. Viene passata alla + static BOOLEAN XVT_CALLCONV1 start_winprint(long); +#endif + + // @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, TArray& bg); + + // @cmember Ritorna il numero delle stampanti disponibili + int descriptions() + { return _printers.items(); } + // @cmember Ritorna il nome della

-esima stampante disponibile + const PrinterDef& get_description(word i) const + { return (const PrinterDef&) _printers[i]; } + + // @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) + { 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); + // @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() + { return _background; } + // @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 numero delle copie da stampare + int n_copies() { return _ncopies; } + // @cmember Abilita/disabilita la copia multipla!!! + void enable_multiple_copies(bool b = TRUE) + { _multiple_copies = b; } + + // @cmember Ritorna il nome delle stampanti utilizzabili + TToken_string& getprinternames(); + // @cmember Ritorna il testo da stampare + TTextfile& get_txt() + { return _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 + TArray& 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 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; } + // @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 _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); +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT + // @cmember Setta le caratteristiche della stampante leggendole da

+ void set_win_formlen(WINDOW prwin = NULL_WIN); +#endif + // @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 TRUE se la stampante e' un fax + bool isfax() const; + // @cmember Lancia ik fax server + bool start_fax_server() const; + // @cmember Spedisce la stampa attuale via fax + bool send_fax(const char* tipo, const char* codice); + + // @cmember Ritorna la dimensione dei caratteri da stampare + int get_char_size() const + { return _ch_size; } + // @cmember Ritorna il nome del font di stampa + char* fontname() const + { return (char*)(const char*)_fontname; } + + // @cmember Ritorna il nome della stampante + const char* printername() const + { return (const char*)get_description (_curprn)._devicename; } + + // @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; +}; + +// @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) Indica se il disco deve essere formattato prima di fare la stampa + bool _formatta; + // @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