#ifndef __PRINTER_H
#define __PRINTER_H

#ifndef XVT_INCL_XVT
#include <xvt.h>
#endif                   

#ifndef __STDIO_H
#include <stdio.h>
#endif

#ifndef __DATE_H
#include <date.h>
#endif

#ifndef __TEXT_H
#include <text.h>
#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
  exportprinter       = 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 <mf TObject::dup>)
  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 <p position>-esimo (vedi <t TPrintstyle>)
  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 <p position>-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 <t TPrintstyle>)
  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
// Ritorna true se e' necessario ripetere la stampa
typedef bool (*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) Nome dell'ultimo TForm utilizzato
  TFilename _formname;
  // @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 <mf TPrint_application::set_multiple_link>)
  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 <p t> 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 <mf TPrintwin::do_print>
  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 <p linetoget>-esima linea dell'header
  TPrintrow*  getheaderline (int linetoget);
  // @cmember Ritorna il contenuto della <p linetoget>-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 <c TViswin>)
  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; }  
  const TFilename& get_export_file() const  { return _exportfile; }
  // @cmember Dirige la stampa sul file specificato, preservando gli attributi di formato.
  //          Se <p header> = TRUE si stampano su file anche gli header    
  void set_export_file(const char* n, bool header = TRUE, int len = 0) 
  { _printertype = exportprinter; _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 <p _print_rcd>
  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;
  // @cmember Setta la stampante per l'abilitazione a stampare in grafica
  bool set_graphics(bool 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; }

  void set_form_name(const char* n) { _formname = n; }
  const TFilename& get_form_name() const { return _formname; }
  
  // @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() const;
  
  // @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 <p line>
  void set_record (int record_to_set, TPrintrow* line) 
  {_record.add(line, record_to_set); }

  // @cmember Ritorna l'array di tipo record della posizione <p line>
  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 <p volume>
  int  num_volumi () 
  { return _volume; }
  // @cmember Ritorna il numero progressivo <p volume> 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