diff --git a/include/printapp.h b/include/printapp.h index abb5b2c28..07254b4de 100755 --- a/include/printapp.h +++ b/include/printapp.h @@ -21,7 +21,9 @@ enum print_action { REPEAT_PAGE, NEXT_PAGE }; // user functions to pass field informations to setrow() +// allow passing file, field and optional substring or format informations // no class or nice C++ interface since varargs is nasty +// vedi papiro per spiegazioni // FLD(Num.logico, Nome campo [, da [, a]]) const char* FLD(int lognum, const char* f, int from = -1, int to = -1); @@ -64,7 +66,7 @@ class TPrint_application : public TApplication char _fillchar; // fill character for empty fields link_item* _pr_tree; // functions for autom. printing of relations int _maxrow; // reference to maxrow - int _cur_file; + int _cur_file; // per questi vedi le funzioni inline bool _print_defined; bool _force_progind; bool _force_setpage; @@ -80,10 +82,13 @@ class TPrint_application : public TApplication void set_printer() { printer().set(); } // print a single record; does not advance cursor // returns failure or success - bool print_one(int file); + bool print_one(int file); // to be documented but very fig bool print_tree(link_item* head); - + + // metahandlers per controllare header, footer, e links quando si usa la + // viswin; servono per controllare handlers di altre classi e chiamano + // virtuali di TPrintapp static void _pp_header(TPrinter& pr); static void _pp_footer(TPrinter& pr); static void _pp_link(int id, const char* s); @@ -164,6 +169,7 @@ protected: // footer etc) sono spiegate nel seguito // **************************************************** + // vedi sopra, per chi non l'ha capito virtual bool user_create() pure; virtual bool user_destroy() pure; @@ -193,7 +199,8 @@ protected: // whole page (after all sons are printed) or print // counter is the current page or print number virtual print_action postprocess_page(int file, int counter) - { return NEXT_PAGE; } + { return NEXT_PAGE; } + // vedi papiro precedente virtual print_action postprocess_print(int file, int counter) { return NEXT_PAGE; } // executed after all print job is completed @@ -203,7 +210,6 @@ protected: // preview window virtual void process_link(int id, const char* text) {} - // called when user cancels print; returning TRUE // actually stops printing; not called if no cancel virtual bool cancel_hook() {return TRUE;} @@ -253,6 +259,8 @@ public: // real, TParagraph_string e a TString, memorizzandoli. Non ci sono problemi con la resize. // Comunque, il modo corretto di adoperare il codice # e' // usarlo solo per stampare MEMBRI della classe derivata da TPrint_application + // Credo che Bonazzi abbia aggiunto #p per le TParagraph_string ma bisogna + // chiederlo a lui, che non si e' preoccupato di documentare // ---------------------------------------------- // field codes (match one of FLD() functions) // @@ -> @ @@ -310,12 +318,14 @@ public: // Includi ditte abilitato) per un esempio. // -------------------------------------------------------- + // azzera la definizione della riga row void reset_row(int r); // chiamare reset_print() durante la stampa forza la // rilettura di set_page() alla prossima volta void reset_print(); - + + // se n'e' parlato diffusamente void set_row(int r, const char* fmt, ...); // --------------------------------------------- @@ -356,8 +366,39 @@ public: // viene passata a enable_link una tokenstring con tutti i 'bottoni' dello // stesso colore presenti sulla riga void set_multiple_link(bool on); - - // BACKGROUND PAINTING! Chefigata! poi vi spiego.... + + // ------------------------------------------------------------- + // BACKGROUND PAINTING! Chefigata! + // ------------------------------------------------------------- + // gli si passa uno stringone che contiene codici per stampare + // box, linee, bitmap sullo sfondo, e per variarne gli attributi: + // se null lo azzera. Il background e' stampato sia su viswin + // che su stampante, e riguarda una PAGINA fisica e non le righe o le + // "pages" relative al cursore; viene replicato ad ogni nuova + // pagina fisica a meno che non venga cancellato o ridefinito in una + // process(). + // --------------------------------------------------------------- + // CODICI BACKGROUND + // --------------------------------------------------------------- + // Una stringa con n codici, opzionalmente separati da spazi o tab + // + // -- SETTINGS ---------------------------------------------------- + // + // P setta pen style (n = codice XVT) + // B setta brush style (idem) + // W line width in pixel + // C pen color (codice colore solito) + // + // -- DRAWING COMMANDS -------------------------------------------- + // + // i{string,x1,y1,x2,y2} disegna bitmap (nome file) + // alle coordinate indicate + // l{x1,y1,x2,y2} linea da/a (la resa delle oblique + // dipende dalla stampante) + // b{x1,y1,x2,y2} box + // r{x1,y1,x2,y2} rounded box + // t{text,x,y} testo a x,y + // ----------------------------------------------------------------- void set_background(const char* bgdesc = NULL); @@ -475,16 +516,14 @@ public: // se header == TRUE gli header stanno nel file e non vengono stampati // se direct == FALSE le rigne vengono aggiunte con set_row da printapp, altrimenti // si usa printer::merge_export_file - void merge_export_file(const char* file, bool header = TRUE, bool direct = FALSE); + void merge_export_file(const char* file, bool header = TRUE, bool direct = FALSE); - void set_n_copies(int n) { _ncopies = n; } - int get_n_copies() const { return _ncopies; } - void repeat_print() { _repeat_print = TRUE; } + int get_n_copies() const { return _ncopies; } + void repeat_print() { _repeat_print = TRUE; } bool is_cancelled() const { return _cancelled; } - TPrint_application(); virtual ~TPrint_application(); }; diff --git a/include/printwin.h b/include/printwin.h index 9aaab40bd..0c4e76c7b 100755 --- a/include/printwin.h +++ b/include/printwin.h @@ -13,34 +13,43 @@ #include #endif +// Implementazione di una finestra XVT per la stampa: scrivendoci su tutto l'output +// va sulla stampante corrente. Usata direttamente da TPrinter. + class TPrintwin : public TWindow { - - bool _aborted; - PRINT_RCD* _printrcd; - int _formlen; - int _formwidth; - TArray* _bg; - TTextfile& _txt; + bool _aborted; // stampa abortita + PRINT_RCD* _printrcd; // record di stampa XVT + int _formlen; // indovina + int _formwidth; // indovina + TArray* _bg; // l'intero background della pagina (vedi TPrintapp) + TTextfile& _txt; // il TText da stampare - TArray _images; + TArray _images; // bitmaps da stampare sotto al testo + // un'orrenda quantita' di dettagli relativi ai font e alle loro dimensioni int _lead, _ascent, _descent; int _hofs, _vofs; int _chary; int _char_size; + // tutto ok per stampare bool _inited; - void paint_background(long j); - void paint_row(long j); - bool print_band(int, RCT&); + // pitta lo sfondo della riga j + void paint_background(long j); + // pitta la riga j + void paint_row(long j); + // pitta la fetta di finestra che XVT gli lascia pittare per la pagina data + // (dipende dal driver, ma di solito pitta l'intera pagina) + bool print_band(int page, RCT&); public: // check if aborted; also returned by do_print bool aborted() const { return _aborted; } - // starts printing; FALSE if aborted + // starts printing; FALSE if aborted; when possible starts concurrent thread + // (not possible in WIN 3.1) bool do_print(); TPrintwin(TTextfile& txt); diff --git a/include/text.h b/include/text.h index 8300a8ba0..653569714 100755 --- a/include/text.h +++ b/include/text.h @@ -27,42 +27,42 @@ class TTextfile: public TObject { enum {DEFAULT_PAGESIZE = 128}; - TArray _page; - TBit_array _dirty_lines; - long _page_start; - long _page_end; - long _page_size; - long _lines; - long _cur_line; - TFilename _filename; - TFilename _indname; - FILE* _index; - FILE* _instr; - direction _direction; + TArray _page; // pagina di testo correntemente in memoria + TBit_array _dirty_lines; // un bit per ogni riga, TRUE se ci si e' fatto replace + long _page_start; // inizio... + long _page_end; // e fine della _page in coordinate testo + long _page_size; // n. righe in _page + long _lines; // n. totale linee testo + long _cur_line; // linea corrente + TFilename _filename; // nome file testo (puo' essere temporaneo) + TFilename _indname; // nome file indice (sempre temporaneo) + FILE* _index; // handle file indice + FILE* _instr; // handle file testo + direction _direction; // direzione ottimale lettura file int _item; // Piece corrente TToken_string _line; // Testo riga corrente long _styles[256]; // Stile e colore carattere - bool _tabbed_piece; + bool _tabbed_piece; // uso dei tab con @t - TArray _hotspots; - TArray _spots; - bool _dirty; - bool _isopen; - bool _istemp; - bool _accept; - bool _interactive; + TArray _hotspots; // punti ipertestuali come passati da utente (viswin) + TArray _spots; // rappr. interna punti ipertestuali + bool _dirty; // modificato con replace + bool _isopen; // files aperti + bool _istemp; // si usa un file temporaneo + bool _accept; // append permessa + bool _interactive; // si sta modificando con add e si puo' fare replace // for merging with database fields - TRelation* _rel; + TRelation* _rel; // gestisce sostituzione di campi al posto di tag nel testo - void _read_page(long line); - bool _in_page(long l) + void _read_page(long line); // riempi pagina contenente line, ottimizzando start/end + bool _in_page(long l) // la riga l e' nella pagina corrente { return l >= _page_start && l < _page_end; } - void _save_changes(); + void _save_changes(); // salva i replace fatti sul file (anche temporaneo) // void _parse_style(long j); - style _trans_style(char c); + style _trans_style(char c); // traduci il tag dello stile in stile XVT public: @@ -71,34 +71,40 @@ public: // line() ritorna la stringa di caratteri senza formattazione // ed eventualmente con i campi sostituiti se la relazione - // non e' NULL + // non e' NULL; parte da row e column, per howmuch caratteri utili + // default tutta la riga const char* line(long row, long column = 0, int howmuch = -1); // line_formatted() la ritorna, come e' logico attendersi, con - // la formattazione + // la formattazione (ovvero tutti i @eccetera, che anche la printer capisce) const char* line_formatted(long row); // appende una riga al text (con i formati del caso) bool append(const char* l); // chide tutti i files per poter copiare o eseguire operazioni // dopo close() non si puo' piu' fare nulla - void close(); + void close(); + // stampa sulla carta void print(); // chiude l'aggiunta di nuove linee void freeze() { _accept = FALSE; } bool frozen() { return !_accept; } // per leggere il testo formattato, si fa prima read_line, poi - // si prende un pezzo per volta + // si prende un pezzo per volta; le si passa la riga, pos e' la y iniziale + // (mai usato) e pg fa si' che se la linea non e' nella pagina corrente + // non si faccia nulla; diversamente rilegge una nuova pagina dal file // style() ritorna lo stile (vedi enum) del piece() corrente // se chiamata con parametri ritorna lo stile del carattere alla // posizione data // get_background() e get_foreground() ritornano il suo colore di bg e fg // piece() ritorna il pezzo di linea successivo con stile e colore // invarianti, o NULL quando non ce n'e' piu' - // bello, vero? - + // bello, vero? void read_line(long j, long b = 0, bool pg = TRUE); - const char* piece(); + const char* piece(); + + // ritornano stile testo, colori bg e fg, o l'intero long contenente tutti gli + // attributi carattere alla pos corrente (piece corrente) o a quella specificata int get_style(int pos = -1); char get_background(int pos = -1); char get_foreground(int pos = -1); @@ -139,8 +145,11 @@ public: // <@file->fieldname@[format]@[len]@[just]> void set_relation(TRelation* r) { _rel = r; } + // se si prevede lo scorrimento in una sola direzione, gli si dia + // up o down come 3o parametro, e si sara' felici TTextfile(const char* file = NULL, int pagesize = DEFAULT_PAGESIZE, direction preferred = updown, bool interactive = TRUE); + virtual ~TTextfile(); }; diff --git a/include/viswin.h b/include/viswin.h index c477717ec..d7002ca99 100755 --- a/include/viswin.h +++ b/include/viswin.h @@ -18,7 +18,7 @@ class TBrowsefile_field; class TViswin : public TScroll_window { - friend class TBrowsefile_field; + friend class TBrowsefile_field; // yes, perche' puo' anche essere un controllo di una mask enum { MAXBUT = 4, MAXLEN = 256, BUFFERSIZE = 256, MAXPIC=4}; enum scroll { none, up, down, left, right }; @@ -36,10 +36,10 @@ class TViswin : public TScroll_window bool _istimer; // timer successivo attivo? bool _isopen; // new lines may arrive bool _selflag; - bool _sel_displayed; - bool _link_displayed; - bool _cross_displayed; - bool _point_displayed; + bool _sel_displayed; // selezione evidenziata + bool _link_displayed; // link ipertestuale evidenziato + bool _cross_displayed; // visualizzato cursore a croce + bool _point_displayed; // visualizzato cursore a carattere long _timer; // timer per evitare autorepeat tasti long _wtimer; // wait timer before close() scroll _need_scroll; // scrolling required? @@ -48,8 +48,8 @@ class TViswin : public TScroll_window int _curbut; // button which currently has focus int _buttons; // button count - WINDOW _link_button; - WINDOW _print_button; + WINDOW _link_button; // ID bottone "Collega" + WINDOW _print_button; // ID bottone "Stampa" long _textrows; // righe di testo long _textcolumns; // indovina indovinello @@ -57,11 +57,12 @@ class TViswin : public TScroll_window TTextfile _txt; // text being displayed long _firstline; // 1rst text line being displayed long _lastline; // last text line being displayed - - TString _txt_to_find; // text to find - TPoint _last_found; // position of last find - bool _down_dir; // search direction - bool _case_sensitive; + + // Ricerca testo + TString _txt_to_find; // text to find + TPoint _last_found; // position of last find + bool _down_dir; // search direction + bool _case_sensitive; // case sensitivity int _formlen; // length of a page @@ -78,21 +79,23 @@ class TViswin : public TScroll_window TArray _modules; // Scrolling module icons TArray _images; // pictures properly resized - - bool _multiple; - TString80 _linktxt; - int _linkID; - TToken_string _multiple_link; - TArray* _bg; - bool _frozen; - bool _toplevel; - bool _rulers; - bool _showbuts; - bool _inside_linkexec; - bool _menu_present; + // link multiplo: se si' vengono passati all'handler tutti i link presenti sulla + // stessa riga anziche' solo il selezionato + bool _multiple; // si/no + TString80 _linktxt; // testo del link + int _linkID; // ID del link specificata + TToken_string _multiple_link; // tutti i link della riga - // viene istanziato soltanto se e' usata come controllo BROWSEFILE + TArray* _bg; // internal structure to hold parsed background + bool _frozen; // non si tocca piu' nulla (files temp. cancellati), gestito internamente + bool _toplevel; // e' una finestra colle palle (se FALSE e' un campo di una mask) + bool _rulers; // righello mostrato + bool _showbuts; // bottoni mostrati + bool _inside_linkexec; // var di comodo per sapere se si sta attivando un link + bool _menu_present; // c'e' il menu specifico della viswin + + // viene istanziato soltanto se e' usata come controllo BROWSEFILE in una mask TBrowsefile_field* _brwfld; protected: @@ -103,43 +106,71 @@ protected: int tabx(int x) const; // Convert charx to pixels int taby(int y) const; // Convert chary to pixels - void shift_screen(scroll); - void paint_screen(); - void draw_crossbars(); + void shift_screen(scroll); // shift di 1 su, giu', dx, sin a seconda di scroll passato + void paint_screen(); // pittura lo schermo sulla porzione corrente di testo + void draw_crossbars(); // pittura il cursore a crossbar in xor - void paint_header(); - void paint_point(bool erase = FALSE); - void paint_row(long r); - void paint_column(long r, bool end); - void paint_selection(); - void paint_waitbar(bool xor = TRUE); - void paint_background(long, int); - bool call_editor(); - bool in_text(const TPoint& p) const; + // pittura header (righello) + void paint_header(); + // pittura il cursore (in xor) nello stile del momento, se + // necessario e erase == TRUE cancella quello di prima + void paint_point(bool erase = FALSE); + // pittura la riga r (in coordinate testo) + void paint_row(long r); + // pittura una sola colonna: se end == true e' l'ultima e implica uno scroll orizz. avvenuto + void paint_column(long r, bool end); + // pittura (in xor) la selezione corrente a meno che non sia gia' pitturata + void paint_selection(); + // controlla l'immaginetta di 'busy'; xor serve solo per UNIX, dove si + // pittura una barretta che viene cancellata alla prossima paint + void paint_waitbar(bool xor = TRUE); + // pittura il background specificato a riga long e colonna int + void paint_background(long, int); + // chiama l'editor definito nei parametri con il testo corrente + bool call_editor(); + // utility per sapere se il punto e' nel testo mostrato + bool in_text(const TPoint& p) const; + WINDOW add_button(short id, const char* caption); void repos_buttons(); - void adjust_selection(TPoint& p1, TPoint& p2); + // assicura che la selezione rimanga nei limiti fisici del testo + void adjust_selection(TPoint& p1, TPoint& p2); + // interfaccia furba a paint_selection: display mostra se non c'e', erase cancella se c'e' void display_selection(); void erase_selection(); + // interfaccia furba a paint_point (se cross): display mostra se non c'e', erase cancella se c'e' void display_crossbar(); void erase_crossbar(); + // interfaccia furba a paint_point (se point): display mostra se non c'e', erase cancella se c'e' void display_point(); - void erase_point(); - bool check_link(TPoint* where = NULL); + void erase_point(); + // controlla se la nuova posizione cursore (se NULL e' il curs. corrente) cade su un + // link ipertestuale e si comporta di conseguenza + bool check_link(TPoint* where = NULL); + // sistema x1 e x2 in modo che il minore sia il primo, e controlla che y sia + // nel testo (box e' su una sola riga, usata solo per i link) bool adjust_box(long& x1, long& x2, long y); + // display mostra il link ipertestuale se non c'e', erase cancella se c'e' void paint_link(long, long, long); - void erase_link(long, long, long); + void erase_link(long, long, long); + // mostra in xor sto cazzo di link ipertesticolare (usata da paint/erase link) void display_link(long, long, long, const char*); - void freeze() { _frozen = TRUE; } - void exec_link(); + // usata internamente per bloccare l'aggiunta di nuove righe + void freeze() { _frozen = TRUE; } + // chiama l'handler del link se si preme collega o si batte spazio su un link + void exec_link(); + // controlla la generazione del menu indice se ci sono bookmarks void build_index_menu(); -protected: - void scroll_error(long x, long y); +protected: + // chiamata quando si fa uno scroll impossibile da x,y + // fa beep e torna li' + void scroll_error(long x, long y); + + // son tutte figlie di mamma application virtual void update(); - virtual void handler(WINDOW win, EVENT* ep); - + virtual void handler(WINDOW win, EVENT* ep); void check_menu_item(MENU_TAG item, bool on = TRUE); void enable_menu_item(MENU_TAG item, bool on = TRUE); @@ -150,29 +181,32 @@ public: // non c'e' selezione non viene chiamata affatto (il bottone non fa nulla) // Se serve, si faccia stop_run() qui dentro virtual void process_link(TTextfile& txt, TPoint start, TPoint end) { } + // termina la stampa su video e crea il menu indice se c'e' void close_print(); - bool frozen() { return _frozen; } + bool frozen() { return _frozen; } + // terminazione by user (ESC durante stampa) void abort_print(); long lines() { return _txt.lines(); } TTextfile& text() { return _txt; } + // bound to keys and menu actions void goto_end(); void goto_top(); void goto_pos(long r, long c, bool moveorigin = TRUE); void refresh(); - void show_rulers (bool on = TRUE); void show_buttons(bool on = TRUE); + // usata da chi la usa (es. printer) per stampare nella finestra void add_line(const char* l); - // non_interactive search and replace + // non-interactive search and replace long search (const char* txt, int& pos, long from = 0, bool down = TRUE, bool casesens = FALSE); int replace(long line, const char* txt, int pos = 0, int len = -1); - // interactive search + // interactive search (con maschera, bound to F7/F8) void find(); void find_next();