Aggiunta documentazione in linea

git-svn-id: svn://10.65.10.50/trunk@1987 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
andrea 1995-10-20 18:27:01 +00:00
parent 28f6eaba95
commit c59d3540c2
16 changed files with 2075 additions and 1055 deletions

View File

@ -866,7 +866,7 @@ bool TMask_field::on_hit()
// @flag FALSE | Se il check ha dato esito negativo
bool TMask_field::to_check(
KEY k, // @parm Tasto da passare al campo come simulazione di inizio controllo
bool checkrun) const // @parm Indice se il controllo va effettuato mentre il campo ha il focus??
bool checkrun) const // @parm Permette di testare sanche e la maschera e' in esecuzione
{
bool yes = (k == K_TAB && focusdirty()) || (k == K_ENTER && dirty());
@ -1412,7 +1412,7 @@ int TBrowse::inputs()
// @mfunc Ritorna il numero di campi non vuoti e non filtrati
//
// @rdesc Numero di campi vuoti e non filtrati
// @rdesc Numero di campi non vuoti e non filtrati
int TBrowse::do_input(
bool filter) // @parm ??

View File

@ -56,7 +56,7 @@ class TMask_field : public TObject
// @cmember Gruppo al quale appartiene il campo
TBit_array _groups;
// @cmember User Data??
// @cmember Stringa definibile dall'utilizzatore della classe da utilizzare a piacimento
TToken_string _userdata;
// @access Protected Member
@ -624,7 +624,7 @@ protected:
int do_input();
// @cmember Scrive l'output della ricerca sulla maschera
void do_output(CheckTime = RUNNING_CHECK);
// non esiste nel cpp??
// @cmember Chiamata dal tasto Gestione. Non essendo presente nei list_sheet non fa niente
bool do_insert();
// @cmember Ritorna il campo <p id>
TMask_field& field(short id) const;
@ -896,9 +896,9 @@ class TButton_field : public TMask_field
{
// @access Private Member
// @access Valore della combinazione di tasti che sostituisce il bottone??
// @cmember Valore della combinazione di tasti che sostituisce il bottone
KEY _virtual_key;
// @access Tasto d'uscita (cos'e'??)
// @cmember Tasto generato quando viene premuto il bottone che si sta gestendo
KEY _exit_key;
// @access Protected Member
@ -1006,9 +1006,10 @@ public:
// @struct TField_Flags | ATTENZIONE: questa struttura e' deifnita nella calsse <c TMask_field>.
// <nl>Serve per definire i flegs di settaggio di un campo
// <nl>Serve per definire i flegs di settaggio di un campo
//
// @field bool | automagic | TRUE se il campo e' automagic??
// @field bool | automagic | TRUE se il campo e' automagic (campi data e numero che assumono data
// odierna e anno corrente nel caso non venga inserito nessun valore)
// @field bool | dirty | TRUE se il campo e' stato modificato durante l' esecuzione della maschera
// @field bool | enabled | TRUE se il campo e' editabile
// @field bool | enable_default | TRUE se il campo e' abilitato di default
@ -1022,9 +1023,9 @@ public:
// @field bool | shown | TRUE se il campo e' visibile
// @field bool | show_default | TRUE se il campo e' visibile di default
// @field bool | trim | TRUE se occorre fare la trim su una stringa (vedi <mf TString::ltrim> e
// <mf TString::rtrim>
// <mf TString::rtrim>)
// @field bool | uppercase | TRUE se il campo e' maiuscolo
// @field bool | exchange | TRUE se il campo e' in valuta
// @field bool | zerofilled | TRUE se il campo
// @field void | TField_Flags() | Costruttore
// @field char | update(const char*) | ??
// @field char | update(const char*) | Aggiorna i bit della struttura secondo i valori letti da file

View File

@ -1,4 +1,3 @@
// $Id: printapp.cpp,v 1.28 1995-05-30 14:14:40 angelo Exp $
#include <ctype.h>
#include <stdarg.h>
@ -10,6 +9,8 @@
#include <printapp.h>
#include <urldefid.h>
// @doc EXTERNAL
TLocalisamfile *fff;
const char* const printf_types = "dDiIuUoOxXfeEgGcCnNsSpPrRtTaA";
@ -158,11 +159,16 @@ void TPrint_application::_reset_tree(link_item * head)
}
}
link_item *TPrint_application::_look_print_node (link_item * head, int logicnum)
// @mfunc Cerca per il nodo <p head> dove agganciarsi per rispettare la relazione
//
// @rdesc Ritorna il nodo a cui agganciarsi
link_item *TPrint_application::_look_print_node (
link_item * head, // @parm Nodo per cui effettuare la ricerca
int logicnum) // @parm Numero logico del file
// @comm E' necessario che non esistano piu' nodi per lo stesso file/alias, altrimenti la
// la ricerca termina alla proma occorrenza incontrata
{
// look for <from> node to attach to
// since it reflects a relation, it won't have more than
// one node for the same file/alias, so it stops at first match
link_item *s;
while (head)
{
@ -176,7 +182,18 @@ link_item *TPrint_application::_look_print_node (link_item * head, int logicnum)
return NULL;
}
int TPrint_application::set_bookmark(const char* txt, int father)
// @mfunc Setta un segnalibro nell'anteprima di stampa
//
// @rdesc Ritorna il numero identificatore il segnalibro creato
int TPrint_application::set_bookmark(
const char* txt, // @parm Testo del segnalibro
int father) // @parm Identificatore del segnalibro padre (default -1)
// @comm L'aggiunta dei segnalibri causa la comparsa del menu 'Indice' nella viswin,
// con la lista dei segnalibri inseriti; questi possono essere legati ad albero n-ario
// specificando il bookmark padre, in tal caso il menu sara' gerarchico a sua volta.
// <nl>Nella prossima release di XVT il menu indice sara' pop-up nella finestra
{
return printer().set_bookmark(txt, father);
}
@ -186,7 +203,15 @@ void TPrint_application::add_file (const char *tab, int from)
add_file(TTable::name2log (tab), from);
}
void TPrint_application::add_file (int file, int from)
// @mfunc Aggiunge un file del cursore nell'albero di stampa
void TPrint_application::add_file (
int file, // @parm Numero logico del file da aggiungere
int from) // @parm Posizione nell'albero di stampa nel quale aggiungere il file
// @parm const char* | tab | Nome del del file da aggiungere
// @syntax add_file(int file, int from = 0);
// @syntax add_file(const char* tab, int from = 0);
{
link_item *nw = new link_item (file);
if (_pr_tree == NULL)
@ -218,7 +243,14 @@ void TPrint_application::add_file (int file, int from)
static char tb[120];
int TPrint_application::find_link(const char* descr) const
// @mfunc Permette di trovare un link ipertestuale
//
// @rdesc Ritorna l'ID del link ipertestuale trovato (-1 se non viene trovato)
int TPrint_application::find_link(
const char* descr) const // @parm Testo del link da trovare
// @xref <mf TPrint_application::enable_link>
{
const TArray& arr = printer().links();
for (int i = 0; i < arr.items(); i++)
@ -231,7 +263,18 @@ int TPrint_application::find_link(const char* descr) const
return -1;
}
int TPrint_application::enable_link(const char *descr, char fg, char bg)
// @mfunc Permette di abilitare determinati colori come indicatori di legame ipertestuale
//
// @rdesc Ritorna l'ID del link ipertestuale di cui sono stati abilitati i colori
int TPrint_application::enable_link(
const char *descr, // @parm Testo del link da abilitare
char fg, // @parm Colore del carattere
char bg) // @parm Colore dello sfondo (default 'w')
// @comm Quando si vogliono abilitare determinati colori come indicatori di legame ipertestuale,
// si faccia enable_link nella create. L' ID ritornato viene passato a process_link
// assieme al testo selezionato.
{
int lnk = find_link(descr);
if (lnk < 0)
@ -264,7 +307,14 @@ void TPrint_application::disable_link (char fg, char bg)
}
}
void TPrint_application::set_multiple_link (bool on)
// @mfunc Abilita/disabilita più link per la <mf TPrint_application::enable_link>
void TPrint_application::set_multiple_link (
bool on) // @parm Indica se effettuare il link con tutti gli elementi selezioanti della riga
// @comm Se si setta <p on> a TRUE anziche' la descrizione del testo selezionato
// viene passata a <mf TPrint_application::enable_link> una tokenstring con tutti i
// 'bottoni' dello stesso colore presenti sulla riga.
{
printer().setmultiplelink (on);
}
@ -300,7 +350,32 @@ void TPrint_application::_pp_footer (TPrinter &)
new TPrintrow ((TPrintrow &) (prapp._footer)[i]));
}
void TPrint_application::set_background (const char *bgdesc)
// @mfunc Permette di stampare sullo sfondo e per variarne gli attributi
void TPrint_application::set_background (
const char *bgdesc) // @parm Stringa contente i codici per la stampa (vedi descrizione)
// @comm Occorre passare una stringa che contiene codici per stampare box, linee, bitmap
// sullo sfondo, e per variarne gli attributi: se NULL lo azzera.
// <nl>Il background e' stampato sia su <c TViswin> 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 <lt>qualcosa<gt>process<lt>qualcos'altro<gt>().
// <nl><nl>CODICI BACKGROUND
// <nl>Una stringa con n codici, opzionalmente separati da spazi o tab
// <nl>SETTINGS
// @flag P<lt>n<gt> | Setta pen style (n = codice XVT)
// @flag B<lt>n<gt> | Setta brush style (idem)
// @flag W<lt>n<gt> | Altezza della linea in pixel
// @flag C<lt>n<gt> | Colore della penna (codice colore solito)
// @comm <nl><nl> DRAWING COMMANDS
// @flag i{string,x1,y1,x2,y2} | Disegna la bitmap <p string> (nome file) alle coordinate indicate
// @flag l{x1,y1,x2,y2} | Linea da/a (la resa delle oblique dipende dalla stampante)
// @flag b{x1,y1,x2,y2} | Box
// @flag r{x1,y1,x2,y2} | Rounded box
// @flag t{text,x,y} | Testo <lt>text<gt> a <p x>, <p y>
{
printer().setbackground (bgdesc);
}
@ -385,7 +460,16 @@ TCursor* TPrint_application::get_cursor (int c)
return (TCursor *) & _cursors[c];
}
int TPrint_application::add_cursor (TCursor * c)
// @mfunc Aggiunge un cursore alla classe
//
// @rdesc Ritorna l'identificatore del cursore aggiunto
int TPrint_application::add_cursor (
TCursor * c) // @parm Cursore da aggiungere all'albero
// @comm Nel caso sia passato NULL a <p c> non viene utilizzato nessun file, ma la
// <mf TPirnt_application::print_one> viene chaiamta e le iterazione sono valoutate da
// pre_ e post_ process.
{
if (c == NULL)
return -1;
@ -419,7 +503,12 @@ void TPrint_application::reset_print ()
_print_defined = FALSE;
}
void TPrint_application::set_header (int r, const char *fmt, ...)
// @mfunc Permette di definire l'header della stampa
void TPrint_application::set_header (
int r, // @parm Numero della riga nella quale stampare l'header
const char *fmt, // @parm Testo dell'header da stampare
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
{
CHECK (r >= 1, "Header rows start at 1");
va_list vl;
@ -436,7 +525,12 @@ void TPrint_application::set_header (int r, const char *fmt, ...)
pp->put (__tmp_string);
}
void TPrint_application::set_footer (int r, const char *fmt,...)
// @mfunc Permette di definire il footer della stampa
void TPrint_application::set_footer (
int r, // @parm Numero della riga nella quale stampare il footer
const char *fmt, // @parm Testo del footer da stampare
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
{
CHECK (r >= 1, "Footer rows start at 1");
va_list vl;
@ -486,8 +580,100 @@ void TPrint_application::merge_export_file(const char* file, bool header, bool d
}
}
// @mfunc Permette di settare una riga di stampa
void TPrint_application::set_row (
int r, // @parm Numero della riga da settare
const char *frmt, // @parm Contenuto della riga da stampare
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p frmt>
// @comm COME SETTARE LE RIGHE DI STAMPA
// <nl><nl>Questa funzione si usa come una printf per settare le righe di stampa
// che vengono stampate da <mf TPrint_application::print>.
// <nl>I codici per gli argomenti variabili sono di 3 tipi:
// @flag @ | Si usa per stampare campi di database o informazioni di controllo
// posizione carrello e font
// ATTENZIONE: i codici di formato sono diversi da quelli di printf e
// sono elencati sotto. Per i campi di database occorre che il codice
// sia accoppiato ad una delle funzioni <f FLD> passata come argomento;
// questa provoca la stampa di campi della relazione corrente,
// posizionata come e' stato deciso nell'inizializzazione
// @flag % | Si usa esattamente come in una printf con un plus: se il codice di
// formato e' maiuscolo (es. S per stringa, D per intero) viene
// ignorato il carattere di riempimento eventualmente specificato
// con <mf TPrint_application::set_fillchar>. Cio' vale anche per i codici @ (vedi)
// <nl>E' possibile usare due codici aggiuntivi: r(R) e t(T). A questi
// va fatto seguire un PUNTATORE a <c real> o a <c TString>. Il formato
// viene interpretato con le stesse regole di %t in dsprintf per real
// (come %d o %f) e di %s per TString. Il puntatore NON
// viene memorizzato; per questo occorre il codice # (sotto).
// @flag # | Si usa come % (stessi codici di printf) ma memorizza gli argomenti
// per riferimento: ovvero, ogni volta che la riga viene stampata
// viene stampato il contenuto in quel momento (che si puo' cambiare
// in una delle pre- o post- process). Cio' implica che:
// 1) gli argomenti vanno passati per RIFERIMENTO (set_row(1,"#5d",&i))
// 2) i puntatori devono rimanere validi e costanti tra la set_row e
// la fine della stampa
// Quindi, attenzione a %s con <c TString> ridimensionate; si possono
// usare solo se predimensionate alla dimensione massima, ma e' meglio
// usare char* o il codice apposito. I codici #r, #a e #t prendono puntatori a
// real, <c TParagraph_string> e a <c 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
//
// @comm <nl><nl>CODICI DI CAMPO (da utilizzare con una delle funzione <f FLD>):
// @flag @@ | Carattere @
// @flag @[n[,{l<pipe>c<pipe>r}]s | STRING: n = pad, lcr = alignment
// @flag @{[n[.d=0]]<pipe>[n[,{l<pipe>c<pipe>r}]]p}n | NUMBER: n = digits, d = decimals
// p = picture string (first matching arg)
// @flag @[l]d | DATE: l = full year
// @flag @f | BOOL: prints si/no
// @flag @[n,{l<pipe>c<pipe>r}]t | Translated field (must set translation)
//
// @comm Tutti questi codici possono essere usati anche maiuscoli, il che inibisce
// l'uso del carattere di riempimento (set_fillchar) per uno specifico campo.
//
// <nl><nl>Per tutti i codici che riguardano la stampa di <c real> (@n, %r, #r)
// se non vengono date ulteriori specifiche di formato viene usata
// una picture che e' "" per default, ma puo' essere modificata con
// <mf TPint_application::set_real_picture>.
// <nl>Normalmente un real uguale a zero viene stampato come stringa vuota
// a meno che non si specifichi TRUE nella <mf TPrint_application::set_print_zero>.
//
// <nl><nl>CODICI POSIZIONAMENTO E MOVIMENTO CARRELLO
// @flag @<lt>n<gt>g | Vai a posizione n
// @flag @<lt>n<gt>j | Salta di n posizioni (in orizzontale)
// @comm <nl><nl>CODICI STILE
// @flag @b | Grassetto
// @flag @i | Corsivo
// @flag @u | Sottolineato
// @flag @r | Ritorna allo stile normale
//
// @comm <nl><nl>CODICI COLORE PER VISUALIZZAZIONE E COLLEGAMENTO
//
// <nl><nl>Se si vuole che in visualizzazione il testo sia colorato
// si usa il codice $[]; tra le quadre si scrive il colore
// di foreground, opzionalmente seguito da una virgola e dal
// colore di background (bianco per default). I colori si
// specificano con un singolo carattere come segue:
// @flag n | Nero
// @flag g | Verde
// @flag b | Blu
// @flag c | Cyan
// @flag y | Giallo
// @flag v | Magenta
// @flag m | Colore background maschere (azzurrotto)
// @flag d | Grigio scuro
// @flag l | Grigio chiaro
// @flag k | Grigio normale
//
// @comm <nl><nl>Se si fa <mf TPrint_application::enable_link> con un certo colore, tutto
// cio che e' scritto in quel colore diventa selezionabile
// e alla sua selezione (premendo 'Collega') si puo' associare
// un'azione in <mf TPrint_application::process_link>. A quest'ultima viene passata
// l'ID ritornata da enable_link() e il testo selezionato alla
// pressione di Collega. Vedere ba6 e stampare l'elenco (con
// Includi ditte abilitato) per un esempio.
void TPrint_application::set_row (int r, const char *frmt,...)
{
CHECK (r >= 1, "Print rows start at 1");
@ -782,8 +968,18 @@ void TPrint_application::set_row (int r, const char *frmt,...)
va_end (params);
}
void TPrint_application::set_translation (int lognum, const char *field,
const char *from, const char *to)
// @mfunc Setta i valori di traduzione dei campi
void TPrint_application::set_translation (
int lognum, // @parm Numero logido del file condenete il campo da tradurre
const char *field, // @parm Campo di cui effettuare la straduzione
const char *from, // @parm Valore da tradurre
const char *to) // @parm Valore che assume il campo
// @comm Questa funzione occorre che sia chiamata per ogni traduzione da effettuare.
// <nl>Esempio: set_translation(12,"STATOCIV","1","Celibe") provoca la stampa
// automatica di stringhe al posto di determinati valori dei campi se e' dato
// il codice @t.
// <nl>Il posto giusto per chiamarla e' nella <mf TPrint_application::user_create>.
{
_transtab.add (new _Transfield (lognum, field, from, to));
}
@ -919,7 +1115,17 @@ bool TPrint_application::print_tree (link_item * head)
return go;
}
bool TPrint_application::print_one (int file)
// @mfunc Stampa un singolo record
//
// @rdesc Ritorna il risultato dell'operazione:
//
// @flag TRUE | Se e' riuscito a stampare il record
// @flag FALSE | Se la stampa non ha avuto successo
bool TPrint_application::print_one (
int file) // @parm Numero logico del file di cui stampare il record
// @comm Dopo la stampa del record non viene spostato in avanti il cursore
{
int i = 0;

View File

@ -1,4 +1,3 @@
// trattasi di -*-c++-*-
#ifndef __PRINTAPP_H
#define __PRINTAPP_H
@ -17,519 +16,445 @@
// compatibility
#define TPrintapp TPrint_application
// @doc EXTERNAL
enum print_action { REPEAT_PAGE, NEXT_PAGE };
// @enum print_action
enum print_action {
REPEAT_PAGE, // @emem Ripeta la stampa dell'ultima pagina
NEXT_PAGE }; // @emem Stampa la prossima pagina
// 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);
// FLD(Num. logico, Nome campo numerico, Picture string)
const char* FLD(int lognum, const char* f, const char* picture);
// FLD(Nome tabella, Nome campo numerico, Picture string)
const char* FLD(const char* tabname, const char* f, const char* picture);
// FLD(Num.logico, Nome campo [, da [, a]])
const char* FLD(const char* tabname, const char* f, int from = -1, int to = -1);
// @func funzione per il passaggio delle informazioni alla <mf TPrint_application::set_row>
//
// @rdesc Ritorna una stringa contenente i parametri passati separati dal pipe
const char* FLD(
int lognum, // @parm Numero logico
const char* f, // @parm Nome campo numerico
int from = -1, // @parm Da (default -1)
int to = -1); // @parm A (default -1)
// @parm const char* | picture | Picture string
// @parm const char* | tabname | Nome tabella
struct link_item {
int _logicnum;
link_item* _son;
link_item* _brother;
int _cnt;
// @syntax const char* FLD(int lognum, const char* f, int from, int to);
// @syntax const char* FLD(int lognum, const char* f, const char* picture);
// @syntax const char* FLD(const char* tabname, const char* f, const char* picture);
// @syntax const char* FLD(const char* tabname, const char* f, int from, int to);
// @devnote Non viene creata una classe o una interfaccia C++ gradevole fino a quando varargs
// non assume un aspetto adeguato
const char* FLD(int lognum, const char* f, const char* picture);
const char* FLD(const char* tabname, const char* f, const char* picture);
const char* FLD(const char* tabname, const char* f, int from = -1, int to = -1);
// @struct link_item | Definisce il file a cui si riferisce il link da effettuare sulla stampa
struct link_item {
int _logicnum; // @field Numero logico del link (default l)
link_item* _son; // @field File link figlio (default NULL)
link_item* _brother; // @field File link fratello (default NULL)
int _cnt; // @field Contatore indicante il numero di volte che viene ripetuta
// la stampa (default 0)
link_item(int l) // @field void | link_item(int l) | Inizializza il numero logico del link
{ _logicnum = l; _son = NULL; _brother = NULL; _cnt = 0; }
};
link_item(int l)
{ _logicnum = l; _son = NULL; _brother = NULL; _cnt = 0; }
};
class TProgind;
// @class TPrint_application | Classe per la definizione delle applicazioni per la stampa
//
// @base public | TApplication
class TPrint_application : public TApplication
// @author:(INTERNAL)Villa
// @comm ISTRUZIONI PER l'USO
// <nl>La Printapp consente di operare su uno
// o piu' cursori stampando automaticamente anche files
// collegati. La sequenza delle operazioni e' la seguente:
//
// <nl>1) Derivare una classe da TPrint_application
// <nl>2) Implementare <mf TPrint_application::user_create> e <mf TPrint_application::user_destroy>;
// Nella user_create() si creino i necessari cursori,
// che vengono passati alla Printapp usando <mf TPrint_application::add_cursor>.
// Si puo' fare add_cursor (new TCursor(...))
// dato che il cursore viene distrutto automaticamente.
// <nl>3) Per ciascun file del cursore che si desidera porre
// nell'albero di stampa, si chiami la <mf TPrint_application::add_file>
// es.: add_file(logicnum [,from]); <p from> sara' il file a cui e'
// collegato nella relazione. add_file VA FATTA anche per il file principale,
// altrimenti non stampera' nulla;
// <nl><nl>FUNZIONI VIRTUALI OBBLIGATORIE
// <nl>4) Si definiscono le necessarie funzioni virtuali: e'
// necessaria la <mf TPrint_application::set_page> nella quale
// si metteranno (sotto if o switch) le istruzioni
// <mf TPrint_application::set_row> corrispondenti alla pagina
// logica relativa a ciascun record di ogni file da stampare.
// Va definita anche <mf TPrint_application::set_print> in cui si presentera'
// la maschera di scelta se necessaria o una box yes_no.
// Ritornando TRUE da set_print la stampa viene eseguita
// automaticamente (in genere ritorna FALSE se l'utente
// annulla la stampa con ESC.)
//
// <nl><nl>Alla set_page, come alle pre_ e post_ process, viene
// passato 0 se il cursore attuale e' nullo (vedi sotto).
// <nl><nl>FUNZIONI VIRTUALI FACOLTATIVE
// <nl>5) Le varie funzioni <mf TApplication::pre_process_page>
// <mf TApplication::pre_process_print> <mf TApplication::post_process_page>
// <mf TApplication::post_process_print>
// vengono chiamate prima e dopo la stampa di ogni record
// o gruppo di record relativo alla relazione immessa;
// ad esempio, post_process_print() viene chiamata per il
// file principale una volta dopo l'intera stampa; per
// un file collegato nella relazione, e' chiamata tante
// volte quanti gruppi di almeno un record esistono per
// record del file genitore. Qui si possono modificare
// righe, calcolare totali etc. A queste funzioni
// viene sempre passato il file (logicnum) in corso di stampa e
// un contatore che indica quante volte la stampa e' stata
// ripetuta. le pre_ ritornano TRUE o FALSE, nell'ultimo
// caso interrompono la stampa; le post_ ritornano
// <e print_action.NEXT_PAGE> (comportamento normale) o <e print_action.REPEAT_PAGE>
// <nl>6) <mf Tprint_application::set_print> viene chiamata dalla voce Selezione,
// unica del secondo menu. E' il posto dove mettere
// una buona maschera di selezione di cosa stampare.
// Alla fine, si esegua <mf TPrint_application::enable_print_menu> per
// abilitare la voce Stampa, inizialmente inattiva.
// <nl>7) <mf TPrint_application::cancel_hook> permette di intercettare la
// cancellazione della stampa; ritornando TRUE
// la stampa viene effettivamente cancellata
// Tutti i parametri relativi al progress indicator
// vengono settati da funzioni apposite (vedi oltre)
// @access Private Member
{
TArray _rows; // rows descriptor
TArray _cursors; // cursor array
TCursor* _cur; // current cursor
TArray _transtab; // field translation table
TArray _header; // header lines
TArray _footer; // footer lines
int _currow; // current print row
TPrintstyle _curstyle; // current print style
bool _auto_ff; // automatic form feed after each page
const char* _wmess; // wait message for progind
bool _wbar; // bar y/n for progind
bool _wcancel; // cancel button enabled
int _wthr; // minimum # of items to show print progind
const char* _confpr; // config filename for printer
char _fillchar; // fill character for empty fields
link_item* _pr_tree; // functions for autom. printing of relations
int _maxrow; // reference to maxrow
int _cur_file; // per questi vedi le funzioni inline
bool _print_defined;
bool _force_progind;
bool _force_setpage;
bool _print_zero;
TProgind* _prind;
// @cmember Descrittore delle righe
TArray _rows;
// @cmember Array di cursroi
TArray _cursors;
// @cmember Cursore corrente
TCursor* _cur;
// @cmember Tabella di traduzione dei campi
TArray _transtab;
// @cmember Header delle linee
TArray _header;
// @cmember Footer delle linee
TArray _footer;
// @cmember Riga corrente di stampa
int _currow;
// @cmember Stile corrente di stampa
TPrintstyle _curstyle;
// @cmember Indica se effettuare il form feed automatico dopo ogni pagina
bool _auto_ff;
// @cmember Messaggio di attesa per la classe <c TProgind>
const char* _wmess;
// @cmember Indica se attivare barra per la classe <c TProgind>
bool _wbar;
// @cmember Indica se abilitare o disabilitare il bottone Annulla
bool _wcancel;
// @cmember Numero minimo di item per mostrare la barra di attesa
int _wthr;
// @cmember Nome del file di configurazione per la stampante
const char* _confpr;
// @cmember Carattere di riempimento per campi vuoti
char _fillchar;
// @cmember Funzioni per la stampa automatica delle relazioni
link_item* _pr_tree;
// @cmember Numero massimo di righe
int _maxrow;
// @cmember Identificatore del file corrente
int _cur_file;
// @cmember Indica se è stat definita la stampante
bool _print_defined;
// @cmember Indica se forzare la presenza della barra di attesa anche nella stampe a video
bool _force_progind;
// @cmember Indica se forzare la rilettura delle <mf TPrint_application::set_row>
bool _force_setpage;
// @cmember Indica se stampare il valore 0 per i campi vuoti
bool _print_zero;
// @cmember Barra di attesa
TProgind* _prind;
// @cmember Picture default per i reali
const char* _picture;
MENU_TAG _last_choice;
int _ncopies;
bool _repeat_print;
bool _cancelled;
// @cmember Ultima scelta di menù
MENU_TAG _last_choice;
// @cmember Numero di copie da stampare
int _ncopies;
// @cmember Indica se si volgia ripetere la stampa
bool _repeat_print;
// @cmember Indica se la stampa e' stata interrotta
bool _cancelled;
// set the printer
void set_printer() { printer().set(); }
// print a single record; does not advance cursor
// returns failure or success
bool print_one(int file);
// to be documented but very fig
// @cmember Setta la stampante
void set_printer()
{ printer().set(); }
// @cmember Stampa un singolo record
bool print_one(int file);
// @cmember Permette di stampare tutti i campi record cercando nell'albero i file corrispondenti
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
// @cmember Metahandlers per controllare l'header quando si usa la
// <c TViswin>; servono per controllare handlers di altre classi e chiamano
// virtuali di <c TPrintapp>.
static void _pp_header(TPrinter& pr);
// @cmember Metahandlers per controllare il footer quando si usa la
// <c TViswin>; servono per controllare handlers di altre classi e chiamano
// virtuali di <c TPrintapp>.
static void _pp_footer(TPrinter& pr);
// @cmember Metahandlers per controllare i links quando si usa la
// <c TViswin>; servono per controllare handlers di altre classi e chiamano
// virtuali di <c TPrintapp>.
static void _pp_link(int id, const char* s);
// @cmember Cerca per il nodo <p head> dove agganciarsi per rispettare la relazione
link_item* _look_print_node(link_item* head, int logicnum);
void _reset_tree(link_item* head);
// @cmember Annulla l'aleber a partire dal nodo <p head>
void _reset_tree(link_item* head);
// @cmember ???!!!???
virtual bool create();
// @cmember ???!!!???
virtual bool destroy();
// @access Protected Member
protected:
// ****************************************************
// ISTRUZIONI PER l'USO
// ****************************************************
//
// La Printapp, saggiamente, consente di operare su uno
// o piu' cursori stampando automaticamente anche files
// collegati. La sequenza delle operazioni e' la seguente:
//
// 1) Derivare una classe da TPrint_application
// 2) Implementare user_create() e user_destroy();
// Nella user_create() si creino i
// necessari cursori, e li si dia in pasto a Printapp
// usando add_cursor(). Si puo' fare add_cursor(new TCursor(...))
// dato che il cursore viene distrutto automaticamente.
// 3) Per ciascun file del cursore che si desidera porre
// nell'albero di stampa, si faccia add_file(logicnum [,from]);
// [from] sara' il file a cui e' collegato nella relazione.
// add_file VA FATTA anche per il file principale, se no
// non stampera' nulla;
// *********************************************************
// FUNZIONI VIRTUALI OBBLIGATORIE
// *********************************************************
// 4) Si definiscono le necessarie funzioni virtuali: e'
// sicuramente necessaria la set_page(file) nella quale
// si metteranno (sotto if o switch) le istruzioni
// set_row (vedi sotto) corrispondenti alla pagina
// logica relativa a ciascun record di ogni file da stampare.
// Va definita anche set_print() in cui si presentera' ;a
// maschera di scelta se necessaria o una box yes_no;
// Ritornando TRUE da set_print la stampa viene eseguita
// automaticamente (in genere ritorna FALSE se l'utente
// annulla la stampa con ESC.)
//
// Alla set_page, come alle pre_ e post_ process, viene
// passato 0 se il cursore attuale e' nullo (vedi sotto).
// *********************************************************
// FUNZIONI VIRTUALI FACOLTATIVE
// *********************************************************
// 5) Le varie funzioni pre_ e post_ process _page e _print
// vengono chiamate prima e dopo la stampa di ogni record
// o gruppo di record relativo alla relazione immessa;
// ad esempio, postprocess_print() viene chiamata per il
// file principale una volta dopo l'intera stampa; per
// un file collegato nella relazione, e' chiamata tante
// volte quanti gruppi di almeno un record esistono per
// record del file genitore. Qui si possono modificare
// righe, calcolare totali etc. A queste funzioni
// viene sempre passato il file (logicnum) in corso di stampa e
// un contatore che indica quante volte la stampa e' stata
// ripetuta. le pre_ ritornano TRUE o FALSE, nell'ultimo
// caso interrompono la stampa; le post_ ritornano
// NEXT_PAGE (comportamento normale) o REPEAT_PAGE
// (indovina cosa fa).
// 6) set_print() viene chiamata dalla voce Selezione,
// unica del secondo menu. E' il posto dove mettere
// una buona maschera di selezione di cosa stampare.
// Alla fine, si esegua enable_print_menu() per
// abilitare la voce Stampa, inizialmente inattiva.
// 7) cancel_hook() permette di intercettare la
// cancellazione della stampa; ritornando TRUE
// la stampa viene effettivamente cancellata
// Tutti i parametri relativi al progress indicator
// vengono settati da funzioni apposite (vedi oltre)
// ****************************************************
// Molte altre minchiatine (form feed automatici, header,
// footer etc) sono spiegate nel seguito
// ****************************************************
// vedi sopra, per chi non l'ha capito
virtual bool user_create() pure;
// @cmember Utilizzata per la creazione dei cursori necessari
virtual bool user_create() pure;
// @cmember Utilizzata per la distruzione dei cursori
virtual bool user_destroy() pure;
// set print, bound to menu :Selezione:Stampa
// chiamata automaticamente dopo user_create()
virtual bool set_print(int i = 1) { return FALSE; }
// @cmember Chiamata automaticamente dopo <mf TPrint_application::user_create>
virtual bool set_print(int i = 1)
{ return FALSE; }
// set_row functions MUST be called here in a switch
// for each particular file being printed
virtual void set_page(int file, int cnt) {}
// @cmember Setta la pagina logica logica. La funzione <mf TPrint_application::set_row>
// DEVE essere chiamata qui in uno switch per ogni file particolare da stampare.
virtual void set_page(int file, int cnt)
{}
// called before processing each page
// used to set print strings from tables or files
// not included in relation
// returning FALSE cancels page printing
// counter is the current print page number
// @cmember Setta la strina di stampa dalla tabella o dal file. Viene chiamata prima di
// processare ogni pagina, Non è inclusa nelle relazioni. <p count> è il numero
// corrente della pagina da stampare.
// <nl>Ritornando FALSE viene cancellata la stampa delle pagine
virtual bool preprocess_page(int file, int counter)
{ return TRUE; }
// same before each print request
// e.g. to initialize counters
// returning FALSE cancels print request or subtree
// @cmember Permette di eseguire qualcosa prima della richiesta di un processo di stampa
// (es. per inizializzare i contatori).
// <nl> Ritornando FALSE cencella la richeista di stampa o i sottoalberi
virtual bool preprocess_print(int file, int counter)
{ return TRUE; }
// postprocessing; returning REPEAT_PAGE reprints the
// whole page (after all sons are printed); print
// counter is the current page or print number
// @cmember Ritornando <e print_action.REPEAT_PAGE> ristampa l'intera pagina (dopo che sono
// stati stampanti tutti i figli); <p counter> e' la pagina corrente o il numero di
// stampe effettuate.
virtual print_action postprocess_page(int file, int counter)
{ return NEXT_PAGE; }
// vedi papiro precedente
{ return NEXT_PAGE; }
// @cmember Utilizzata per modificare righe, calcolare totali, ecc. Per maggiori dettagli
// vedere punto 5)
virtual print_action postprocess_print(int file, int counter)
{ return NEXT_PAGE; }
// executed after all print job is completed
virtual void postclose_print() {}
// called when LINK button is pressed with active selection in
// preview window
virtual void process_link(int id, const char* text) {}
// called when user cancels print; returning TRUE
// actually stops printing; not called if no cancel
virtual bool cancel_hook() {return TRUE;}
// @cmember Viene eseguita dopo che tutti i lavori di stampa sono stati completati
virtual void postclose_print()
{}
// @cmember Chiamata quando viene premuto il bottone Collega con la selezione attiva nella
// finestra di anteprima
virtual void process_link(int id, const char* text)
{}
// @cmember Chiamata quando l'utente annulla la stampa. Ritornando TRUE viene immediata fermata
// la stampa. Non viene chaimata nel caso non si voglia interrompere la stampa
virtual bool cancel_hook()
{return TRUE;}
// bound to TApplication print menu
// redefined ONLY for very special purposes
// @cmember Legata al menu' di stampa della <c TApplication>. Viene ridefinita solo in casi
// particolari
virtual void print();
// bound to <select> menu and automatically called after
// user_create()
void do_print(int n);
// @cmember Legata alla voce Selezione del menu' e chiamata dopo <mf TPrint_application::user_create>
void do_print(int n);
// access Public Member
public:
// --------------------------------------------------------------
// COME SETTARE LE RIGHE DI STAMPA
// --------------------------------------------------------------
// setrow() si usa come una printf per settare le righe di stampa
// che vengono stampate da print()
// I codici per gli argomenti variabili sono di 3 tipi:
// @ si usa per stampare campi di database o informazioni di controllo
// posizione carrello e font
// ACHTUNG: i codici di formato sono diversi da quelli di printf e
// sono elencati sotto. Per i campi di database occorre che il codice
// sia accoppiato ad una delle funzioni FLD() passata come argomento;
// questa provoca la stampa di campi della relazione corrente,
// posizionata come e' stato deciso nell'inizializzazione
// % si usa esattamente come in una printf con un plus: se il codice di
// formato e' maiuscolo (es. S per stringa, D per intero) viene
// ignorato il carattere di riempimento eventualmente specificato
// con set_fillchar. Cio' vale anche per i codici @ (vedi)
// E' possibile usare due codici aggiuntivi: r(R) e t(T). A questi
// va fatto seguire un PUNTATORE a real o a TString. Il formato
// viene interpretato con le stesse regole di %t in dsprintf per real
// (come %d o %f) e di %s per TString. Il puntatore NON
// viene memorizzato; per questo occorre il codice # (sotto).
// # si usa come % (stessi codici di printf) ma memorizza gli argomenti
// per riferimento: ovvero, ogni volta che la riga viene stampata
// viene stampato il contenuto in quel momento (che si puo' cambiare
// in una delle pre- o post- process). Cio' implica che:
// 1) gli argomenti vanno passati per RIFERIMENTO (set_row(1,"#5d",&i))
// 2) i puntatori devono rimanere validi e costanti tra la set_row e
// la fine della stampa
// Quindi, attenzione a %s con TString ridimensionate; si possono
// usare solo se predimensionate alla dimensione massima, ma e' meglio
// usare char* o il codice apposito. I codici #r, #a e #t prendono puntatori a
// 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)
// @@ -> @
// @[n[,{l|c|r}]s -> STRING: n = pad, lcr = alignment
// @{[n[.d=0]]|[n[,{l|c|r}]]p}n
// -> NUMBER: n = digits, d = decimals
// p = picture string (first matching arg)
// @[l]d -> DATE: l = full year
// @f -> BOOL: prints si/no
// @[n,{l|c|r}]t -> Translated field (must set translation)
//
// Tutti questi codici possono essere usati anche maiuscoli, il che inibisce
// l'uso del carattere di riempimento (set_fillchar) per uno specifico campo.
// ---------------------------------------------
// Per tutti i codici che riguardano la stampa di real (@n, %r, #r)
// se non vengono date ulteriori specifiche di formato viene usata
// una picture che e' "" per default, ma puo' essere modificata con
// set_real_picture(). Anche questo e' assai carino.
// Normalmente un real uguale a zero viene stampato come stringa vuota
// a meno che non si specifichi set_print_zero([TRUE]).
// ---------------------------------------------
// codici posizionamento e movimento carrello
// @<n>g vai a posizione n
// @<n>j salta di n posizioni (in orizzontale)
// codici stile
// @b bold
// @i italic
// @u underlined
// @r reset to normal
// ---------------------------------------------------
// CODICI COLORE PER VISUALIZZAZIONE E COLLEGAMENTO
// ---------------------------------------------------
// Se si vuole che in visualizzazione il testo sia colorato
// si usa il codice $[]; tra le quadre si scrive il colore
// di foreground, opzionalmente seguito da una virgola e dal
// colore di background (bianco per default). I colori si
// specificano con un singolo carattere come segue:
// n nero
// g verde
// b blu
// c cyan
// y giallo
// v magenta
// m colore background maschere (azzurrotto)
// d grigio scuro
// l grigio chiaro
// k grigio normale
// ------------------------------------------------------
// Se si fa enable_link(..) con un certo colore, tutto
// cio; che e' scritto in quel colore diventa selezionabile
// e alla sua selezione (premendo 'Collega') si puo' associare
// un'azione in process_link. A quest'ultima viene passata
// l'ID ritornata da enable_link() e il testo selezionato alla
// pressione di Collega. Vedere ba6 e stampare l'elenco (con
// Includi ditte abilitato) per un esempio.
// --------------------------------------------------------
// azzera la definizione della riga row
// @cmember Riporta i valori standard per la riga <p r>-esima
void reset_row(int r);
// chiamare reset_print() durante la stampa forza la
// rilettura di set_page() alla prossima volta
// @cmember Durante la stampa forza la rilettura di <mf TPrint_application::set_page> alla prossima volta
void reset_print();
// se n'e' parlato diffusamente
// @cmember Permette di settare una riga di stampa
void set_row(int r, const char* fmt, ...);
// ---------------------------------------------
// set translation values for field
// called once for each translation: example
// set_translation(12,"STATOCIV","1","Celibe")
// provoca la stampa automatica di stringhe al
// posto di determinati valori dei campi se e' dato
// il codice @t
// Il posto giusto per chiamarla: user_create()
// ---------------------------------------------
void set_translation(int lognum, const char* field,
const char* from, const char* to);
// @cmember Setta i valori di traduzione per campi
void set_translation(int lognum, const char* field, const char* from, const char* to);
// --------------------------------------------------------
// bookmarks for viswin
// --------------------------------------------------------
// Aggiungere 'bookmarks' causa la comparsa del menu
// 'Indice' nella viswin, con la lista dei bookmark inseriti;
// questi possono essere legati ad albero n-ario specificando
// il bookmark padre, in tal caso il menu sara' gerarchico a
// sua volta. Prossima release di XVT il menu indice sara'
// pop-up nella finestra
// @cmember Setta un segnalibro nell'anteprima di stampa
int set_bookmark(const char* txt, int father = -1);
// --------------------------------------------------------
// hypertext interface for viswin
// --------------------------------------------------------
// Quando si vogliono abilitare determinati colori come
// indicatori di legame ipertestuale, si faccia enable_link
// nella create. L' ID ritornato viene passato a process_link
// assieme al testo selezionato
int find_link(const char* descr) const;
int enable_link (const char* descr, char fg, char bg = 'w');
// @cmember Permette di trovare un link ipertestuale
int find_link(const char* descr) const;
// @cmember Permette di abilitare determinati colori come indicatori di legame ipertestuale
int enable_link (const char* descr, char fg, char bg = 'w');
// @cmember Permette di disabilitare i link ipertestuali
void disable_link(char fg, char bg = 'w');
void disable_links() { printer().links().destroy(); }
// se si setta multiple a TRUE anziche' la descrizione del testo selezionato
// viene passata a enable_link una tokenstring con tutti i 'bottoni' dello
// stesso colore presenti sulla riga
// @cmember Elimina tutti i legami ipertestuali
void disable_links()
{ printer().links().destroy(); }
// @cmember Abilita/disabilita più link per la <mf TPrint_application::enable_link>
void set_multiple_link(bool on);
// -------------------------------------------------------------
// 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
// <qualcosa>process<qualcos'altro>().
// ---------------------------------------------------------------
// CODICI BACKGROUND
// ---------------------------------------------------------------
// Una stringa con n codici, opzionalmente separati da spazi o tab
//
// -- SETTINGS ----------------------------------------------------
//
// P<n> setta pen style (n = codice XVT)
// B<n> setta brush style (idem)
// W<n> line width in pixel
// C<n> pen color (codice colore solito)
//
// -- DRAWING COMMANDS --------------------------------------------
//
// i{string,x1,y1,x2,y2} disegna bitmap <string> (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 <text> a x,y
// -----------------------------------------------------------------
// @cmember Permette di stampare sullo sfondo e per variarne gli attributi
void set_background(const char* bgdesc = NULL);
// ---------------------------------------------
// set/select cursor
// ---------------------------------------------
// selects i-th cursor
// inutile se c'e' un cursore solo
// @cmember Setta/seleziona l'<p i>-esimo cursore. Inutile sec'e' un solo cursore
void select_cursor(int i);
// return i-th cursor without making it current
// @cmember Ritorna l'<p i>-esimo cursore senza renderlo corrente
TCursor* get_cursor(int i);
// returns maximum row defined
int get_maxrow() { return _maxrow; }
// adds cursor to class; return identifier
// cursor* can be NULL: no file is used but
// print_one is called and iterations are performed
// by pre_ and post_ process
int add_cursor(TCursor* c);
// @cmember Ritorna il numero massimo di righe definite
int get_maxrow()
{ return _maxrow; }
// retrieve current cursor
TCursor* current_cursor() { return _cur; }
// @cmember Aggiunge un cursore alla classe
int add_cursor(TCursor* c);
// ---------------------------------------------
// set_auto_ff(TRUE) fa si' che dopo ogni pagina logica (relativa ad
// un record) si stampi un form feed. (anche se il cursore e' nullo)
// @cmember Ritorna il cursore corrente
TCursor* current_cursor()
{ return _cur; }
// @cmember Permette di stampare (<p b>=TRUE) o non stampare (<p b>=FALSE) dopo ogni pagina
// logica (relativa ad un record) un form feed, anche se il cursore e' nullo.
void set_auto_ff( bool b = TRUE)
{ _auto_ff = b; }
// il carattere specificato con set_fillchar (default ' ') viene
// usato per riempire davanti e dietro i campi in cui si e' specificata
// una dimensione maggiore della lunghezza effettiva del contenuto,
// (a meno che non si sia usato un codice di formato maiuscolo)
// @cmember Permette di definire il carattere di riempimento.
// <nl>Il carattere specificato con set_fillchar (default ' ') viene
// usato per riempire a destra e a sinistra i campi in cui si e' specificata
// una dimensione maggiore della lunghezza effettiva del contenuto,
// (a meno che non si sia usato un codice di formato maiuscolo)
void set_fillchar(char c)
{ _fillchar = c; }
// riempie di righe vuote la pagina corrente fino alla dimensione
// della pagina
// @cmember Riempie di righe vuote la pagina corrente fino alla dimensione della pagina
void fill_page(int from = -1);
// di solito basta e avanza quella di default
// @cmember Aggiunge un menu nella barra dei menu. Di solito basta e avanza quella di default
virtual bool menu(MENU_TAG m);
virtual word class_id() const { return CLASS_PRINT_APPLICATION; }
// @cmember Ritorna l'identificatore della classe
virtual word class_id() const
{ return CLASS_PRINT_APPLICATION; }
// print menu is enabled when set_print returns TRUE
// @cmember Permette di abilitare il menu' di stampa. In genere e' abilitato quando
// <mf TPrint_application::set_print> ritorna TRUE
void enable_print_menu();
// @cmember Permette di disabilitare il menu' di stampa.
void disable_print_menu();
// @cmember Permette di abilitare il menu' di settaggio della stampante.
void enable_setprint_menu();
// @cmember Permette di disabilitare il menu' di settaggio della stampante.
void disable_setprint_menu();
// header/footer (printf, not set_row analogues)
// only understand @-codes for setting font attributes,
// date and page number
// plus every printf %-code
// con queste si possono ridefinire header e footer al
// verificarsi di condizioni durante la stampa
virtual void preprocess_header() {}
virtual void preprocess_footer() {}
// @cmember Permette di ridefinire l'header al verificarsi di condizioni durante la stampa
virtual void preprocess_header()
{}
// @cmember Permette di ridefinire il footer al verificarsi di condizioni durante la stampa
virtual void preprocess_footer()
{}
// @cmember Permette di definire l'header della stampa
void set_header(int row, const char* fmt, ...);
// @cmember Permette di definire il footer della stampa
void set_footer(int row, const char* fmt, ...);
// @cmember Elimina l'header della stampa
void reset_header();
// @cmember Elimina il footer della stampa
void reset_footer();
// vedi sopra per capire
// @cmember Azzera l'albero di stampa con i file presenti
void reset_files();
// @cmember Aggiunge un file del cursore nell'albero di stampa
void add_file(int file, int from = 0);
// @cmember Aggiunge un file del cursore nell'albero di stampa
void add_file(const char* tab, int from = 0);
// set default picture for reals
void set_real_picture(const char* p) { _picture = p; }
void set_print_zero(bool b = TRUE) { _print_zero = b; }
// @cmember Setta la picture default per i reali
void set_real_picture(const char* p)
{ _picture = p; }
// @cmember Permette di stampare (<p b>=TRUE) o di non stampare (<p b>=FALSE) il valore 0
// nel caso di campo vuoto.
void set_print_zero(bool b = TRUE)
{ _print_zero = b; }
// progress indicator control
void set_wait_message(const char* m)
{ _wmess = m; }
void set_wait_bar(bool m)
// default yes
// @cmember Setta il messaggio della barra di attesa
void set_wait_message(const char* m)
{ _wmess = m; }
// @cmember Abilita (<p m>=TRUE) o disabilita (<p m>=FALSE) la barra di attesa (default abilitata)
void set_wait_bar(bool m)
{ _wbar = m; }
void set_wait_cancel(bool m)
// default yes
// @cmember Abilita (<p m>=TRUE) o disabilita (<p m>=FALSE) il bottone Annulla nella barra
// di attesa (default abilitato)
void set_wait_cancel(bool m)
{ _wcancel = m; }
void set_wait_threshold(int m)
// minimum number of print items to show progress indicator;
// default 2
// @cmember Setta il numero minimo di elementi per mostrare la barra di attesa (default 2)
void set_wait_threshold(int m)
{ _wthr = m; }
// questa forza la progind anche se si stampa su video
// @cmember Permette di forzare (<p b>=TRUE) o non forzare (<p b>=FALSE) la progind anche per
// le stampe a video
void force_progind(bool b = TRUE)
{ _force_progind = b; }
// questa forza la rilettura delle setrow in set_page ad ogni
// record stampato, in modo che i dati siano
// sempre quelli del record corrente anche se si usano codici %
// s'intende che rallenta un po' la stampa
// @cmember Permette di forzare (<p b>=TRUE) o non forzare (<p b>=FALSE) la rilettura delle
// <mf TPrint_application::set_row> in <mf TPirnt_application::set_page> ad ogni
// record stampato, in modo che i dati siano sempre quelli del record corrente
// anche se si usano codici %. Chiaramente la stampa viene un po' rallentata
void force_setpage(bool b = TRUE)
{ _force_setpage = b; }
// @cmember Setta il nome del file di configurazione per la stampante
void set_config_file(const char* s)
{ _confpr = s; }
// @cmember Ritorna il numero della pagina attualmente in stampa
word get_page_number()
{ return printer().getcurrentpage(); }
// @cmember Setta il numero della pagina attualmente in stampa
void set_page_number(word n)
{ printer().setcurrentpage(n); }
// dirige la stampa sul file specificato, preservando gli attributi di formato
// se header == TRUE si stampano su file anche gli header
void set_export_file(const char* name, bool header = TRUE)
// @cmember Dirige la stampa sul file specificato con <p name>, preservando gli attributi
// di formato. Se <p header> == TRUE si stampano su file anche gli header.
void set_export_file(const char* name, bool header = TRUE)
{ printer().set_export_file(name,header); }
// infila un file di export fatto da un'altra printer (con formati e tutto, ignora
// gli header supponendo che siano gia' presenti nel file)
// 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
// @cmember Inserisce un file di export fatto da un'altra printer (con formati e tutto).
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; }
// @cmember Setta il numero di copie da stampare
void set_n_copies(int n)
{ _ncopies = n; }
// @cmember Ritorna il numero di copie da stampare
int get_n_copies() const
{ return _ncopies; }
// @cmember Setta la ripetizione della stampa
void repeat_print()
{ _repeat_print = TRUE; }
bool is_cancelled() const { return _cancelled; }
// @cmember Ritorna se la stampa e' stata interrotta
bool is_cancelled() const
{ return _cancelled; }
// @cmember Costruttore
TPrint_application();
// @cmember Distruttore
virtual ~TPrint_application();
};
// buon divertimento
#endif

View File

@ -27,6 +27,8 @@
HIDDEN TPrinter* _printer = NULL;
// @doc EXTERNAL
TPrinter& printer()
{
if (_printer == NULL)
@ -318,7 +320,15 @@ bool printers_on_key(TMask_field & f, KEY key);
// fv support structs for config
bool PrinterDef::read(const char *name, FILE * fd)
// @mfunc Legge la descrizione della stampante dal file
//
// @rdesc Ritorna il risultato dell'operazione:
//
// @flag TRUE | Se e' riuscito a leggere la descrizione della stampante
// @flag FALSE | Se non e' riuscito a leggere la descrizione della stampante
bool PrinterDef::read(
const char *name, // @parm Nome della stampante di cui cercarne la descrizione
FILE * fd) // @parm Puntatore al file contenente la descrizione
{
_printername = name;
_printername.trim ();
@ -462,7 +472,7 @@ TPrintrow & TPrintrow::reset ()
const char* TPrintrow::row_codified() const
{
// returns the row with @-codes for font style and color
char last_attr = -1;
int last_color = -1;
int last = 0, k = 0, len = -1;
@ -681,7 +691,11 @@ PRINT_RCD* TPrinter::get_printrcd(int *size)
#if XVT_OS == XVT_OS_WIN
void TPrinter::set_win_formlen(WINDOW prwin)
// @mfunc Setta le caratteristiche della stampante leggendole da <p _print_rcd>
void TPrinter::set_win_formlen(
WINDOW prwin) // @parm Finestra effettiva di stampa (default NULL_WIN)
// @comm Nel caso <p prwin> sia NULL_WIN vengono solamente aggiornati i valori
{
long pw, ph, phr, pvr; // Printer width, height, horizontal and vertical resolution
xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, get_printrcd(), &ph, &pw, &pvr, &phr);
@ -876,7 +890,11 @@ TToken_string& TPrinter::getprinternames ()
return _printer_names;
}
void TPrinter::read_configuration(const char* parag)
// @mfunc Legge la configurazione della stampante
void TPrinter::read_configuration(
const char* parag) // parm Nome del file di configurazione della stampante (default NULL)
// @comm Se <p parag> e' NULL viene letta la configurazione della stamapnte di default.
{
main_app().begin_wait();
@ -1080,7 +1098,16 @@ TPrintrow *TPrinter::getfooterline (int linetoget)
return ((TPrintrow *) _footer.objptr (linetoget));
}
void TPrinter::setheaderline (int linetoset, TPrintrow * line)
// @mfunc Setta il contenuto di una line dell'header
void TPrinter::setheaderline (
int linetoset, // @parm Numero della linea da settare
TPrintrow * line) // @parm Contenuto della linea dell'header
// @parm const TPrintrow& | line | Indirizzo con il contenuto della
// linea dell'header
// @syntax void setheaderline (int linetoset, TPrintrow* line);
// @syntax void setheaderline (int linetoset, const TPrintrow& line);
{
_header.add (line, linetoset);
if (linetoset >= _headersize)
@ -1093,7 +1120,16 @@ void TPrinter::setheaderline (int linetoset, const TPrintrow & line)
setheaderline (linetoset, p);
}
void TPrinter::setfooterline (int linetoset, TPrintrow* line)
// @mfunc Setta il contenuto di una line dell'header
void TPrinter::setfooterline (
int linetoset, // @parm Numero della linea da settare
TPrintrow * line) // @parm Contenuto della linea del footer
// @parm const TPrintrow& | line | Indirizzo con il contenuto della
// linea del footer
// @syntax void setfooterline (int linetoset, TPrintrow* line);
// @syntax void setfooterline (int linetoset, const TPrintrow& line);
{
_footer.add (line, linetoset);
}
@ -1116,7 +1152,17 @@ void TPrinter::resetfooter ()
// _footersize = 0;
}
bool TPrinter::printrow(TPrintrow* rowtoprint)
// @mfunc Metodo base per la stampa
//
// @rdesc Ritorna il risulato della stampa:
//
// @flag TRUE | Se la stampa ha avuto successo
// @flag FALSE | Se la stampante non e' attiva
bool TPrinter::printrow(
TPrintrow* rowtoprint) // @parm Riga da stampare
// @comm Se la pagina logica corrente e' precedente alla prima pagina logica o successiva
// all'ultima pagina logica viene ritornato TRUE.
{
if (!isopen ())
return FALSE;
@ -1216,8 +1262,18 @@ word TPrinter::rows_left() const
return left;
}
// @mfunc Permette di stampare una riga
//
// @rdesc Ritorna il risultato della stampa:
//
// @flag TRUE | Se la stampa ha avuto successo
// @flag FALSE | Se non e' riuscito ad effettuare la stampa
bool TPrinter::print(
TPrintrow& rowtoprint) // @parm Riga da stampare
bool TPrinter::print(TPrintrow& rowtoprint)
// @comm Nel caso la riga non ci stia nella pagina logica corrente vengono stampanti il footer
// della pagina corrente e l'header della successiva prima prima della stampa della riga
// vera e propria.
{
bool ok = TRUE;
@ -1271,7 +1327,16 @@ bool TPrinter::printfooter()
return ok;
}
bool TPrinter::skip(int linestoskip)
// @mfunc Permette di saltare alcune righe dalla posizione corrente
//
// @rdesc Ritorna il risulato dell'operazione:
//
// @flag TRUE | Se e' riuscito a saltare le righe
// @flag FALSE | Se non e' riuscito a saltare le righe
bool TPrinter::skip(
int linestoskip) // @parm Vengono accettai solo valori positivi
// @xref <mf TPrinter::jump>
{
int jumpline;
@ -1280,7 +1345,20 @@ bool TPrinter::skip(int linestoskip)
return jump(jumpline);
}
bool TPrinter::jump(int jumpline)
// @mfunc Permette di saltare alla riga indicata
//
// @rdesc Ritorna il risultato dell'operazione
//
// @flag TRUE | Se e' riuscito a saltare alla riga
// @flag FALSE | Se non e' riuscito a saltare alla riga o se viene inserito un formfeed
bool TPrinter::jump(
int jumpline) // @parm Numero della riga a cui saltare nella stampa. Vengono accettai
// solo valori positivi
// @comm Nel caso si cerchi di saltare ad una riga superiore alla lunghezza della pagina attiva
// viene inserito un formfeed.
// @xref <mf TPrinter::skip>
{
int i = 0;
bool ok = TRUE;
@ -1619,7 +1697,16 @@ bool TPrinter::set()
}
void TPrinter::merge_export_file(const char* file, bool header)
// @mfunc Inserisce un file di export fatto da un'altra printer
void TPrinter::merge_export_file(
const char* file,
bool header) // @parm Indica se gli header sono presenti nel file:
//
// @flag TRUE | Gli header sono nel file e quindi non vengono stampanti (default)
// @flag FALSE | Gli header non sono nel file e quindi vengono stampanti
// @comm Vengono inseriti nel file di export i formati e tutto il resto. Vengono ignorati gli
// header supponendo che siano gia' presenti nel file
{
TTextfile txt(file);
@ -1633,7 +1720,13 @@ void TPrinter::merge_export_file(const char* file, bool header)
}
int TPrinter::set_bookmark(const char* txt, int father)
// @mfunc Crea un segnalibro
//
// @rdesc Ritorna l'identificatore del segnalibro creato
int TPrinter::set_bookmark(
const char* txt, // @parm Nome del segnalibro da creare
int father) // @parm Identificatore del segnalibro padre a cui collegare quello
// da creare
{
if (_printertype == screenvis)
{

View File

@ -14,371 +14,688 @@
#endif
// @DPUB
// @doc EXTERNAL
// @enum TPrintstyle | Indica lo stile da assegnare al carattere
enum TPrintstyle
{
normalstyle = 0,
boldstyle = 1,
underlinedstyle = 2,
italicstyle = 4
normalstyle = 0, // @emem Stile normale
boldstyle = 1, // @emem Stile grassetto
underlinedstyle = 2, // @emem Stile sttolineato
italicstyle = 4 // @emem Stile corsivo
};
// @enum TPrtype | Indica il tipo di stampante da utilizzare per la stampa
enum TPrtype
{
normprinter = 0,
fileprinter = 1,
spoolprinter = 2,
localprinter = 3,
screenvis = 4,
winprinter = 5,
export = 6
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<tm>
export = 6 // @emem Esporatzione di stampa
};
// @END
// @C
// class TPrintrow : public TObject
// @END
// @class TPrintrow | Classe per la definizione della stampa di una riga
//
// @base public | TObject
class TPrintrow : public TObject
// @author(:INETRNAL)Villa
// @access Private Member
{
// @ccost MAXSTR | 256 | Lunghezza massima della riga da stampare
enum { MAXSTR = 256 };
// @DPROT
TString256 _row; // the actual string to print
char _attr[MAXSTR]; // contains char attributes of _row
int _cols[MAXSTR]; // contains color attributes of _row
TBit_array _tab;
// @cmember Stringa da stampare nella riga
TString256 _row;
// @cmember Attributi carattere dei caratteri
char _attr[MAXSTR];
// @cmember Attributi colore dei caratteri
int _cols[MAXSTR];
// @cmember Inizio delle nuove posizioni di tabulazione
TBit_array _tab;
TPrintstyle _currentstyle; // the current char attribute
int _currentcolor; // the current color attribute
int _lastpos; // last print position
// @cmember Attributo carattere corrente
TPrintstyle _currentstyle;
// @cmember Attributo colore corrente
int _currentcolor;
// @cmember Ultima posizione di stampa
int _lastpos;
// @access Public Member
public:
// @FPUB
// @cmember Costruttore
TPrintrow();
// @cmember Costruttore
TPrintrow(const TPrintrow& pr);
virtual ~TPrintrow() {}
// @cmember Distruttore
virtual ~TPrintrow()
{}
// TPrintrow& center(const char* str, int position);
virtual word class_id() const;
// 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;
const char* row() const { return _row; }
// @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();
TPrintstyle get_style(int position) const { return (TPrintstyle)_attr[position]; }
TPrintstyle get_style() const { return _currentstyle; }
int get_color(int position) const { return (TPrintstyle)_cols[position]; }
int get_color() const { return _currentcolor; }
// @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);
void set_style(TPrintstyle style) { _currentstyle=style; }
int lastpos() const { return _lastpos; }
// @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; }
};
// @class PrinterDef | Classe per la definizione delle stampanti da utilizzare
//
// @base public | TObject
class PrinterDef : public TObject
{
friend class TPrinter;
TString _printername; // name of the printer file
TString _printertype; // type of printer (0=diretta,1=locale,2=spool)
TString _filtername; // filter for the pipe (UNIX only)
TString _devicename; // name of print device
char _atstr[4][10]; // attribute codes for the current printer
TString_array _codes; // print codes
TString_array _names; // name of print codes
TString _ffcode; // formfeed code for the current printer
TString _nlcode; // special newline code for the current printer
// @author(:INTERNAL)Villa
// @access Private Member
{
// @cfriend TPrinter
friend class TPrinter;
// @cmember Nome del file della stampante
TString _printername;
// @cmember Tipo di stampante da utilizzare (0=diretta,1=locale,2=spool)
TString _printertype;
// @cmember Filtro pèer la pipe '<pipe>' (solo per unix
TString _filtername;
// @cmember Nome del device di stampa
TString _devicename;
// @cmember Codici attributo per la stampante corrente
char _atstr[4][10];
// @cmember Codici di stampa
TString_array _codes;
// @cmember Nome dei codici di stampa
TString_array _names;
// @cmember Codice del formfeed per la stampante corrente
TString _ffcode;
// @cmember Codice del new line per la stampante corrente
TString _nlcode;
// @access Public Member
public:
bool read(const char* name, FILE* fd); // read description from file;
bool isdefault(); // name matches "Default"
const char* get_codenames(word i) const { return i < (word)_names.items() ? (const char*)_names.row(i) : NULL; }
const char* get_codes(word i) const { return i < (word)_codes.items() ? (const char*)_codes.row(i) : NULL; }
PrinterDef() : _printername(10), _filtername(10), _ffcode("\f"), _nlcode("\n") {}
// @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'<p i>-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'<p i>-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")
{}
};
// @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 costrutire l'intero menu' gerarchico dei bookmark
{
// @access Public Member
public:
int _id;
int _father_id;
// @cmember Identificatore del bookmark creato
int _id;
// @cmember Identificatore del bookmark padre
int _father_id;
// @cmember Testo del bookmark
TString _txt;
long _row;
// @cmember Numero della riga sulla quale e' inserito il bookmark
long _row;
BkDef() {}
virtual ~BkDef() {}
// @cmember Costruttore
BkDef()
{}
// @cmember Distruttore
virtual ~BkDef()
{}
};
class TPrinter;
// @type PRINTSECTIONHANDLER | Funzione definita dall'utente chiamata all'inizio della stampa
// dell'header o del footer
typedef void (*PRINTSECTIONHANDLER)(TPrinter& printer);
// @type LINKHANDLER | Funzione definita dall'utente per la gestione del link
typedef void (*LINKHANDLER)(int, const char*);
// @C
// class TPrinter : public TObject
// @END
class TViswin;
// @class TPrinter | Classe per la definzione delle operazioni sulla stampante
//
// @base public | TObject
class TPrinter : public TObject
// @author(:INTERNAL) Villa
// @access Private Member
{
// @DPROT
FILE* _cnfptr; // config file
FILE* _fp; // pointer to the printer file
TViswin* _vf; // pointer to file visualizer
// @cmember Puntatore al file di configurazione
FILE* _cnfptr;
// @cmember Puntatore al file della stampante
FILE* _fp;
// @cmember Puntatore al file di visualizzaizone
TViswin* _vf;
// @cmember Testo da stampare
TTextfile _txt;
TFilename _exportfile; // name of export file
// @cmember Nome del file di esportazione
TFilename _exportfile;
// @cmember Dimensione dell'header
int _headersize;
// @cmember Dimensione del footer
int _footersize;
// @cmember Contenuto dell'header
TArray _header;
// @cmember Contenuto del footer
TArray _footer;
TArray _printers; // printers descriptions
int _curprn; // current printer index
int _curcode; // current printer index
int _formlen; // length of the logic page
int _formwidth; // size of the logic page
int _currentrow; // next row to print
// @cmember Descrizione delle stampanti
TArray _printers;
// @cmember Indice corrente della stampante
int _curprn;
// @cmember Codice corrente della stampante
int _curcode;
// @cmember Lunghezza della pagina logica
int _formlen;
// @cmember Larghezza della pagina logica
int _formwidth;
// @cmember Prossima riga da stampare
int _currentrow;
TString80 _fontname; // Font name
int _ch_size; // Font height
// @cmember Nome del font per la stampa
TString80 _fontname;
// @cmember Dimensione del font per la stampa
int _ch_size;
word _currentpage; // logic page containing _currentrow
word _frompage; // first page to print (normally 0)
word _topage; // last page to print (normally = USHRT_MAX)
bool _hwformfeed; // if TRUE a ff will be printed after any footer
TPrtype _printertype; // specifies the kind of output the user wants
bool _isopen; // printer open
TDate _date; // printing date
TFilename _printerfile; // filename for printing on file
TArray _linksdescr;
TArray _bookmarks; // bookmarks
bool _multiple_link; //
// @cmember Pagina logica contenente la prossima riga da stampare
word _currentpage;
// @cmember Prima pagina da stampare (normalmente 0)
word _frompage;
// @cmember Ultima pagina da stampare (normalmente USHRT_MAX)
word _topage;
// @cmember Indica la stampa di un form feed dopo ogni footer
bool _hwformfeed;
// @cmember Indica il tipo di output selezionato dall'utente per la stampa
TPrtype _printertype;
// @cmember Indica se la stampante e' inizializzata
bool _isopen;
// @cmember Data di stampa
TDate _date;
// @cmember Nome del file per la stampa su disco
TFilename _printerfile;
// @cmember Array di nomi dei link
TArray _linksdescr;
// @cmember Array di nomi di segnalibri
TArray _bookmarks;
// @cmember Indica se e' attivo il link multiplo (vedi <mf TPrint_application::set_multiple_link>)
bool _multiple_link;
TString _config; // Nome del paragrafo di configurazione
// @cmember Nome del paragrafo di configurazione
TString _config;
// @cmember Array di stringhe per la desccrizione del background
TString_array _background;
// @cmember Nomi dei file delle immagini da stampare
TString_array _image_names;
const char* _bg_desc;
// @cmember Stringa contenente i @codes per il disegno dello sfondo
const char* _bg_desc;
// @cmember Nomi delle stampanti utilizzabile
TToken_string _printer_names;
bool _isgraphics;
bool _frozen;
int _ncopies;
PRINT_RCD* _print_rcd;
int _print_rcd_size;
int _lines_per_inch;
int _vert_offset;
int _horz_offset;
int _dots_per_line;
// @cmember Indica se la stampante e' abilitata a trattare grafica
bool _isgraphics;
// @cmember Indica se la stampante e' stata momentaneamente interrotta
bool _frozen;
// @cmember Numero di copie da fare
int _ncopies;
// @cmember Descrizione completa dello stato della stampante
PRINT_RCD* _print_rcd;
// @cmember Dimensione del record per la descrizione completa dello stato della stampante
int _print_rcd_size;
// @cmember Numero di linee per pollice
int _lines_per_inch;
// @cmember Offset verticale
int _vert_offset;
// @cmember Offset orizzontale
int _horz_offset;
// @cmember Definizione dell stampa in punti per linea
int _dots_per_line;
void _get_windows_printer_names(TToken_string& t);
bool _multiple_copies;
bool _export_header;
int _export_header_len;
// @cmember Setta <p t> con il profilo della stampante
void _get_windows_printer_names(TToken_string& t);
// @cmember Indica se si tratta di copia multipla
bool _multiple_copies;
// @cmember Indica se occorre esportare l'header di stampa
bool _export_header;
// @cmember Lunghezza dell'header di stampa da esportare
int _export_header_len;
PRINTSECTIONHANDLER _headerhandler, _footerhandler;
LINKHANDLER _linkhandler;
// @cmember Handler dell'header
PRINTSECTIONHANDLER _headerhandler;
// @cmember Handler del footer
PRINTSECTIONHANDLER _footerhandler;
// @cmember Header del link ipertestuale
LINKHANDLER _linkhandler;
// @END
// @FPROT
// @access Protected Member
protected:
virtual char newline() { return '\n'; }
bool printrow (TPrintrow* rowtoprint=NULL); // base methods for printing
// @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);
// @access Public Member
public:
// @FPUB
// @cmember Costruttore
TPrinter ();
// @cmember Distruttore
virtual ~TPrinter();
#if XVT_OS == XVT_OS_WIN
// @cmember Inizia una nuova sessione di stampa. Viene passata alla <mf TPrintwin::do_print>
static BOOLEAN XVT_CALLCONV1 start_winprint(long);
#endif
void set_from_page (word from) { _frompage = from; }
void set_to_page (word to) { _topage = to; }
void set_hwff (bool hwff) { _hwformfeed = hwff; }
// @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; }
// resa pubblica per farsi usare dagli altri
// la stampante e' un servizio, se non si fa usare
// che servizio e'?
// @cmember Permette di tradurre la stringa con i codici @codes in un array utilizzabile dalla stampa
void parse_background(const char* bgdesc, TArray& bg);
int descriptions() { return _printers.items(); }
const PrinterDef& get_description(word i) const { return (const PrinterDef&) _printers[i]; }
// @cmember Ritorna il numero delle stampanti disponibili
int descriptions()
{ return _printers.items(); }
// @cmember Ritorna il nome della <p i>-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;
virtual word class_id() const;
// @cmember Ritorna l'identificatore della classe
virtual word class_id() const;
int formlen () const { return _formlen; }
int formwidth () const { return _formwidth; }
// @cmember Ritorna la lunghezza della pagina logica
int formlen () const
{ return _formlen; }
// @cmember Ritorna la larghezza della pagina logica
int formwidth () const
{ return _formwidth; }
word frompage () const { return _frompage; }
word topage () const { return _topage; }
int headersize () const { return _headersize; }
int footersize () const { return _footersize; }
// @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 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);
int formlen (int fl) { return (_formlen=fl); }
int footerlen (int fl) { return (_footersize=fl); }
int headerlen (int hl) { return (_headersize=hl); }
word frompage (word fp) { return (_frompage=fp);}
word topage (word tp) { return (_topage=tp); }
void setheaderline (int linetoset, TPrintrow* line);
void setheaderline (int linetoset, const TPrintrow& line);
void setfooterline (int linetoset, TPrintrow* line);
void setfooterline (int linetoset, const TPrintrow& line);
void resetheader();
void resetfooter();
void setbackground(const char* bg);
TString_array& image_names() { return _image_names; }
TString_array& getbgdesc() { return _background; }
TArray& get_bookmarks() { return _bookmarks; }
bool frozen() { return _frozen; }
void freeze(bool b = TRUE) { _frozen = b; }
int n_copies() { return _ncopies; }
void enable_multiple_copies(bool b = TRUE) { _multiple_copies = b; }
// @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();
TTextfile& get_txt() { return _txt; }
// @cmember Ritorna il testo da stampare
TTextfile& get_txt()
{ return _txt; }
void setheaderhandler(PRINTSECTIONHANDLER h) { _headerhandler = h; }
void setfooterhandler(PRINTSECTIONHANDLER h) { _footerhandler = h; }
// @cmember Setta l'handle dell'header
void setheaderhandler(PRINTSECTIONHANDLER h)
{ _headerhandler = h; }
// @cmember Setta l'handle del footer
void setfooterhandler(PRINTSECTIONHANDLER h)
{ _footerhandler = h; }
// used by viswin()
// sono qui e non nella printapp per poter usare una viswin
// completamente anche da un'altra application
void setlinkhandler(LINKHANDLER h) { _linkhandler = h; }
LINKHANDLER getlinkhandler() { return _linkhandler; }
TArray& links() { return _linksdescr; }
void setmultiplelink(bool on) { _multiple_link = on; }
bool ismultiplelink() { return _multiple_link; }
// @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
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; }
bool skip (int linetoskip);
bool jump (int linestojump);
void reset ();
virtual bool set ();
bool open ();
void close ();
bool formfeed ();
bool print (TPrintrow& rowtoprint);
bool isopen() { return _isopen; }
void setdate(const TDate& d) { _date = d; }
const TDate& getdate() const { return _date; }
TPrtype printtype() { return _printertype; }
void set_printtype(TPrtype dest) { _printertype=dest; }
void set_printerfile(const char * ffile) { _printerfile=ffile; }
word getcurrentpage() const { return _currentpage; }
void setcurrentpage(word n) { _currentpage = n; }
// dirige la stampa sul file specificato, preservando gli attributi di formato
// se header == 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;}
// infila un file di export fatto da un'altra printer (con formati e tutto, ignora
// gli header supponendo che siano gia' presenti nel file)
// se header == TRUE gli header stanno nel file e non vengono stampati
void merge_export_file(const char* file, bool header = TRUE);
word rows() const { return _formlen-_headersize-_footersize; }
// @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 <p header> = 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;
void set_printrcd();
PRINT_RCD* get_printrcd(int* size = NULL);
#if XVT_OS == XVT_OS_WIN
void set_win_formlen(WINDOW prwin = NULL_WIN);
// @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
// @cmember Setta le caratteristiche della stampante leggendole da <p _print_rcd>
void set_win_formlen(WINDOW prwin = NULL_WIN);
#endif
void set_lines_per_inch(int n) { _lines_per_inch = n; }
int get_lines_per_inch() const { return _lines_per_inch; }
int get_vert_offset() const { return _vert_offset; }
int get_horz_offset() const { return _horz_offset; }
int get_dots_per_line() const { return _dots_per_line; }
bool isgraphics() const { return _isgraphics; }
// @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 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; }
int get_char_size() const { return _ch_size; }
char* fontname() const { return (char*)(const char*)_fontname; }
// @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; }
void set_char_size(int size) { _ch_size = size; }
void set_fontname(const char *name) { _fontname = name; }
// @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);
// bookmarks
// @cmember Crea un segnalibro
int set_bookmark(const char* txt, int father = -1);
};
// @class TFile_printer | Classe per la definizione delle operazini per la stampa su file
//
// @base public | TPrinter
class TFile_printer : public TPrinter
// @author(:INTERNAL) Nicola
// @access Private Member
{
long _size;
// @cmember Dimensione del file
long _size;
// @cmember Disco al quale appertiene il file
const char * _drive;
int _volume; // numero progressivo volume
int _num_rec_volume; // numero di record per disco
int _num_rec_testa_coda; // numero di record per inizio e fine volume
int _num_rec_inizio; // numero di record per inizio volume
int _num_rec_fine; // numero di record per coda volume
int _len_rec; // lunghezza record
TArray _record; // array di tipi record
bool _nome_file_fissato; // se il file sui dischetti deve avere un nome NON modificabile dall'utente
bool _label_fissata; // se l'etichetta dei dischetti deve essere fissa
bool _formatta;
const char * _file; // file da generare sui dischetti
const char * _label; // etichetta da scrivere sui dischetti
TArray _tmp_files; // array dei file temporanei generati
FILE * _fd;
// @cmember Numero progressivo volume
int _volume;
// @cmember Numero di record per disco
int _num_rec_volume;
// @cmember Numero di record per inizio e fine volume
int _num_rec_testa_coda;
// @cmember Numero di record per inizio volume
int _num_rec_inizio;
// @cmember Numero di record per coda volume
int _num_rec_fine;
// @cmember Lunghezza del record
int _len_rec;
// @cmember Array di tipi record
TArray _record;
// @cmember Indica se il file sui dischetti deve avere un nome NON modificabile dall'utente
bool _nome_file_fissato;
// @cmember Indica se l'etichetta dei dischetti deve essere fissa
bool _label_fissata;
// @cmember Indica se il disco deve essere formattato prima di fare la stampa
bool _formatta;
// @cmember File da generare sui dischetti
const char* _file;
// @cmember Etichetta da scrivere sui dischetti
const char* _label;
// @cmember Array dei file temporanei generati
TArray _tmp_files;
// @cmember Puntatore al file creato
FILE* _fd;
// bool scrivi_volume();
// @access Public Member
public:
// @cmember Ritorna il nalore 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; }
virtual char newline() { return '\0'; }
void set_file_fissato (bool fissato) { _nome_file_fissato = fissato; }
void set_label_fissata (bool fissata) { _label_fissata = fissata; }
void set_len_rec (int len) { _len_rec = len; }
void set_file (const char * ffile) { _file = ffile; }
void set_label (const char * label) { _label = label; }
// @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]; }
TPrintrow* get_record_inizio_volume() const { return (TPrintrow*)&_record[0];}
TPrintrow* get_record_inizio_elenco() const {return (TPrintrow*)&_record[1];}
TPrintrow* get_record_dettaglio() const { return (TPrintrow*)&_record[2]; }
TPrintrow* get_record_fine_elenco() const {return (TPrintrow*)&_record[3]; }
TPrintrow* get_record_fine_volume() const { return (TPrintrow*)&_record[4]; }
TPrintrow* get_record_filler() const { return (TPrintrow*)&_record[5]; }
// @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]; }
int num_rec_volume () { return _num_rec_volume; }
int num_volumi () { return _volume; }
void inc_volume () { _volume++; }
// @cmember Ritorna il numero di record per disco
int num_rec_volume ()
{ return _num_rec_volume; }
// @cmember Ritorna il numero progressivo volume
int num_volumi ()
{ return _volume; }
// @cmember Incremente il numero progressivo volume
void inc_volume ()
{ _volume++; }
void add_file (TFilename nomef) { _tmp_files.add(nomef); }
// @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 ();
//
@ -388,17 +705,18 @@ public:
// 2 per 720
// 3 per 1,44
// 4 per 2,88
//
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 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();
};
// @func Ritorna la stampante corrente
//
// @rdesc Ritorna l'identificatore della stamapnte corrente
TPrinter& printer();
// @func Distrugge la stampante corrente
void printer_destroy();
#endif // __PRINTER_H

View File

@ -207,8 +207,14 @@ void TPrintwin::paint_row(long j)
}
}
// @mfunc Permette di stampare un rettangolo a video
//
// @rdesc Ritorna se e' riuscito a stampare in una unica pagina
bool TPrintwin::print_band(
int page, // @parm Numero della pagina in cui stampare
RCT& r) // @parm Parte di finestra da stampare
bool TPrintwin::print_band(int page, RCT& r)
// @comm Di solito viene disegnata l'intera pagina, ma la cosa dipende dal driver di stampa
{
const long j = ((long)page) * _formlen;
const int rows = (r.bottom - r.top) / _chary;
@ -223,8 +229,16 @@ bool TPrintwin::print_band(int page, RCT& r)
return j+k < _txt.lines();
}
// @mfunc Inizia la stampa
//
// @rdesc Ritorna se viene interrotta la stampa:
//
// @flag TRUE | La stampa e' andata a buon fine
// @flag FALSE | La stampa e' stata interrotta
bool TPrintwin::do_print()
// @comm Quando possibile parte un processo concorrente (dipende dal sistema operativo)
{
int page = 0;
RCT* rct;

View File

@ -13,46 +13,73 @@
#include <text.h>
#endif
// Implementazione di una finestra XVT per la stampa: scrivendoci su tutto l'output
// va sulla stampante corrente. Usata direttamente da TPrinter.
// @doc EXTERNAL
// @class TPrintwin | Classe per la implementazione di una finestra XVT per la stampa:
// scrivendoci su tutto l'output va sulla stampante corrente.
// Usata direttamente da <c TPrinter>.
//
// @base public | TWindow
class TPrintwin : public TWindow
// @author:(INTERNAL)Viila
// @access Private Member
{
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
// @cmember Indica se la stampa e' stata interrotta
bool _aborted;
// @cmember Descrizione completa dello stato della stampante
PRINT_RCD* _printrcd;
// @cmember Lunghezza del modulo di stampa
int _formlen;
// @cmember Larghezza del modulo di stampa
int _formwidth;
// @cmember L'intero background della pagina (vedi <c TPrintapp>)
TArray* _bg;
// @cmember TText da stampare
TTextfile& _txt;
// @cmember Array di immagini di stampare nel modulo sotto al testo
TArray _images;
TArray _images; // bitmaps da stampare sotto al testo
// @cmember Distanza in pixel tra una riga e la successiva
int _lead;
// @cmember Numero di pixel dalla linea base al limite superiore del font
int _ascent;
// @cmember Numero di pixel dalla linea base al limite inferiore del font
int _descent;
// @cmember Dimensione dell'offset orizzontale
int _hofs;
// @cmember Dimensione dell'offset verticale
int _vofs;
// @cmember Altre caratteristihce del font (vedi XVT)
int _chary;
// @cmember Dimensione del font di stampa
int _char_size;
// @cmember Altre caratteristihce del font (vedi XVT)
bool _inited;
// 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;
// pitta lo sfondo della riga j
void paint_background(long j);
// pitta la riga j
// @cmember Permette di disegnare lo sfondo della riga <p j>-esima
void paint_background(long j);
// @cmember Permette di disegnare la riga <p j>-esima
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)
// @cmember Permette di disegnare la parte di finestra per la pagina <p page>
bool print_band(int page, RCT&);
// @access Public Member
public:
// check if aborted; also returned by do_print
bool aborted() const { return _aborted; }
// @cmember Ritorna se la stampa e' stata interrotta (viene ritornata anche della
// <mf TPrintwin::do_print>)
bool aborted() const
{ return _aborted; }
// starts printing; FALSE if aborted; when possible starts concurrent thread
// (not possible in WIN 3.1)
// @cmember Inizia la stampa (Ritorna FALSE se viene interrotta)
bool do_print();
// @cmember Costruttore
TPrintwin(TTextfile& txt);
// @cmember Distruttore
virtual ~TPrintwin();
};

View File

@ -18,36 +18,69 @@ class TEdit_field;
#endif
// @C
// class TSheet : public TScroll_window
// @END
// @doc EXTERNAL
// @class TSheet | Classe per la definizione e la gestione degli sheet per le ricerche
//
// @base public | TScroll_window
class TSheet : public TScroll_window
// @author(:INTERNAL) Guido
// @access Privete Member
{
// @DPRIV
enum { MAX_BUT = 8, MAX_COL = 128 };
// @ccost MAX_BUT | 8 | Numero massimo di bottoni
enum { MAX_BUT = 8,
// @ccost MAX_COL | 128 | Numero massimo di colonne
MAX_COL = 128 };
// @cmember Array di stringhe con il contenuto dello sheet
TString_array _page;
// @cmember Numero di colonne dello sheet
byte _columns;
byte _size[MAX_COL], _type[MAX_COL];
long _curr, _last_update;
// @cmember Dimensione di ogni colonna
byte _size[MAX_COL];
// @cmember Tipo di ogni colonne
byte _type[MAX_COL];
// @cmember Riga corrente
long _curr;
// @cmember Indice della prima riga visibile
long _last_update;
// @cmember Numero di righe visibili
short _visible_rows;
// @cmember Indica se e' possibile inserire un check (X di selezione) sulle righe sheet
bool _checkable;
// @cmember Indica se e attivata la gestione dei check delle righe
bool _check_enabled;
TBit_array _checked, _disabled;
// @cmember Array di righe attivate
TBit_array _checked;
// @cmember Array di righe disabilitate
TBit_array _disabled;
// @cmember Handles dei bottoni presenti nella finestra
WINDOW _button[MAX_BUT];
KEY _key[MAX_BUT];
// @cmember Tasto associato ad ogni bottone
KEY _key[MAX_BUT];
// @cmember Maschera di bit corrispondente ai bottoni standard
byte _buttonmask;
// @access Protected Member
protected:
// @FPROT
bool head_on() const { return _columns > 1; }
bool buttons_on() const { return *_button != NULL_WIN; }
short visible_rows() const { return _visible_rows; }
// @cmember Ritorna se il numero di colonne e' maggioer di 1!!!
bool head_on() const
{ return _columns > 1; }
// @cmember Indica se esitono i bottoni in fondo
bool buttons_on() const
{ return *_button != NULL_WIN; }
// @cmember Ritorna il numero di righe!!! visibili
short visible_rows() const
{ return _visible_rows; }
// @cmember Ritorna il numero di righe riservate ai bottoni
virtual short reserved_rows() const;
//ANDREA//
void build_page(long first = -1);
PNT log2dev(long x, long y) const;
@ -57,13 +90,17 @@ protected:
virtual void open();
void set_first(long n);
bool is_visible(long n) const { return n >= first() && n < first()+visible_rows(); }
// @cmember Ritorna se la riga!!! <p n>-esima e' visibile
bool is_visible(long n) const
{ return n >= first() && n < first()+visible_rows(); }
int width() const;
int row_to_page(long n) const;
int row_to_win(long n) const;
long first() const { return origin().y; }
// @cmember ???
long first() const
{ return origin().y; }
bool update_row(long n);
void invert_row(long n);
@ -74,35 +111,54 @@ protected:
virtual void page_build(long first, byte num) pure;
void print();
// @access Public Member
public:
// @FPUB
TSheet(short x, short y, short dx, short dy,
const char* title, const char* head, byte buttons = 0,
long first = 0L, WINDOW parent = NULL_WIN);
// @cmember Costruttore
TSheet(short x,short y,short dx,short dy,const char* title,const char* head,byte buttons = 0,long first = 0L,WINDOW parent = NULL_WIN);
void add_button(short id, const char* caption, KEY key = K_ESC);
virtual long items() const pure;
virtual TToken_string& row(long s = -1);
long selected() const { return _curr; }
// @cmember Ritorna il numero di cella corrente
long selected() const
{ return _curr; }
void select(long n);
byte column_flag(int c) const { return _type[c]; }
byte& column_flag(int c) { return _type[c]; }
// @cmember Ritorna il tipo della colonna <p c>-esima
byte column_flag(int c) const
{ return _type[c]; }
// @cmember Ritorna l'indirizzo??? del tipo della colonna <p c>-esima
byte& column_flag(int c)
{ return _type[c]; }
bool checked(long n) const { return _checked[n]; }
// @cmember Ritorna se la cella <p n>-esima possiede un check
bool checked(long n) const
{ return _checked[n]; }
void check(long n, bool on = TRUE);
void uncheck(long n) { check(n, FALSE); }
void enable_check(bool yn = TRUE) { _check_enabled = yn; }
void disable_check() { enable_check(FALSE); }
void uncheck(long n)
{ check(n, FALSE); }
// @cmember Permette di abilitare (<p yn> = TRUE) o disbilitare (<p yn> = FALSE)
// i check sullo sheet
void enable_check(bool yn = TRUE)
{ _check_enabled = yn; }
// @cmember Permette di disbilitare (<p yn> = FALSE) i check sullo sheet
void disable_check()
{ enable_check(FALSE); }
void enable(long n = -1, bool on = TRUE);
void disable(long n = -1) { enable(n, FALSE); }
bool enabled(long n) const { return !_disabled[n]; }
bool disabled(long n) const { return _disabled[n]; }
void disable(long n = -1)
{ enable(n, FALSE); }
bool enabled(long n) const
{ return !_disabled[n]; }
bool disabled(long n) const
{ return _disabled[n]; }
bool one_checked() const { return _checked.first_one() != -1; }
long checked() const { return _checked.ones(); }
bool one_checked() const
{ return _checked.first_one() != -1; }
long checked() const
{ return _checked.ones(); }
};
class TArray_sheet : public TSheet
@ -112,7 +168,8 @@ class TArray_sheet : public TSheet
protected:
virtual void page_build(long first, byte num);
TToken_string& data(long n) { return _data.row((int)n); }
TToken_string& data(long n)
{ return _data.row((int)n); }
public:
TArray_sheet(short x, short y, short dx, short dy, const char* caption,

View File

@ -282,6 +282,12 @@ public:
// gli stessi, la differenza e' solo nel numero di caratteri della stringa.
};
// @class TString80 | Definisce le stringhe di 80 caratteri
//
// @base public | TFixed_string
//
// @comm Questa classe e' identica alla <c TString16> per quanto riguarda i public member e quindi
// si rimanda a tale classe per ulteriori spiegazioni.
class TString80 : public TFixed_string
{
char _str80[81];
@ -293,6 +299,12 @@ public:
const TString& operator =(const TString& s) { return set((const char*)s); }
};
// @class TString256 | Definisce le stringhe di 256 caratteri
//
// @base public | TFixed_string
//
// @comm Questa classe e' identica alla <c TString16> per quanto riguarda i public member e quindi
// si rimanda a tale classe per ulteriori spiegazioni.
class TString256 : public TFixed_string
{
char _str256[257];

View File

@ -5,6 +5,8 @@
static char TEXT_TMP[257];
// @doc EXTERNAL
class _HotSpot : public TObject
{
public:
@ -21,7 +23,14 @@ public:
}
};
void TTextfile::set_hotspots (char fg, char bg)
// @mfunc Permette di settare gli hot_spot!!!
void TTextfile::set_hotspots (
char fg, // @parm Colore di foreground da utilizzare per l'hotspot
char bg) // @parm Colore di background da utilizzare per l'hotspot
// @comm Aggiunge all'array gli hotspots relativi alla pagina in memoria
// (come <c TToken_string> con x<pipe>y<pipe>text)
{
_HotSpot *hp = new _HotSpot (fg, bg);
_hotspots.add (hp);
@ -186,7 +195,14 @@ void TTextfile::_read_page (long n)
}
}
void TTextfile::read_line (long n, long pos, bool pg)
// @mfunc Legge il testo formattato
void TTextfile::read_line (
long n, // @parm Numero della linea da leggere
long pos, // @parm Numero della colonna da leggere (mai utilizzata)
bool pg) // @parm Fa si' che se la linea non e' nella pagina corrente non si faccia nulla,
// diversamente rilegge una nuova pagina dal file.
{
CHECK (_isopen, "Attempt operation on closed file");
CHECKD (n >= 0 && n < _lines, "Line not present", n);
@ -367,7 +383,17 @@ void TTextfile::read_line (long n, long pos, bool pg)
_item = 0;
}
const char *TTextfile::line(long j, long pos, int howmuch)
// @mfunc Ritorna la stringa di caratteri senza formattazione
//
// @rdesc Ritorna la stringa di caratteri ed eventualmente con i campi sostituiti
// se la relazione non e' NULL
const char *TTextfile::line(
long j, // @parm Riga di cui ritornare la stringa
long pos, // @parm Colonna di cui ritornare la stringa
int howmuch) // @parm Numero di caratteri utili della stringa da ritornare (default -1)
// @comm Se <p howmuch> assume valore -1 ritorna tutta la pagina
{
if (_cur_line != j)
read_line (j);
@ -383,9 +409,24 @@ const char *TTextfile::line(long j, long pos, int howmuch)
return strlen(TEXT_TMP) > (word)pos ? &(TEXT_TMP[pos]) : "";
}
// search and replace (una riga per volta, rispetta i formati)
// txt = text to search; pos = int to put the char position in;
// from = where to start; down = FALSE == up
// @mfunc Cerca una stringa di testo all'interno di una riga
//
// @rdesc Ritorna la posizione in cui e' stato rintracciato il testo. Ritorna -1 se non e' stato
// trovato il testo passato.
long TTextfile::search(
const char* txt, // @parm Testo da cercare
int& ret, // @parm Intero in cui posizionare la posizne del carattere
long from, // @parm Posizione all'interno della riga da cui iniziare la ricerca (default 0)
bool down, // @parm Indica se la ricerca va effettuata all'indietro:
//
// @flag TRUE | Ricerca dalla posizione indicata all'inizio della riga (default)
// @flag FALSE | Ricerca dalla posizione indicata alla fine della riga
bool casesens) // @parm Indica se ricerca il testo con criterio case sensitive (default FALSE)
long TTextfile::search(const char* txt, int& ret, long from, bool down,
bool casesens)
// @comm Cerca in una riga per volta rispettando i formati
{
TString256 lin; TString80 text(txt);
if (!casesens)
@ -401,7 +442,15 @@ long TTextfile::search(const char* txt, int& ret, long from, bool down,
return -1l;
}
int TTextfile::replace(long l, const char* txt, int pos, int len)
// @mfunc Sostituisce un testo all'interno di una riga
//
// @rdesc Ritorna la posizione in cui e' stato sostituito il testo. Ritorna -1 se non e' stata
// fatto nessuna operazione di sostituzione.
int TTextfile::replace(
long l, // @parm Numero della riga nella quale sostituire il testo
const char* txt, // @parm Test da inserire nella riga
int pos, // @parm Posizione nella quale inserire il testo (default 0)
int len) // @parm Lunghezza del testo da sostituire (default 0)
{
if (_cur_line != l)
read_line(l);
@ -445,8 +494,12 @@ int TTextfile::replace(long l, const char* txt, int pos, int len)
return -1;
}
const char *TTextfile::line_formatted(long j)
// @mfunc Ritorna la stringa di caratteri con la formattazione
//
// @rdesc La stringa ritornata ha la formattazione (ovvere tutti i @codes, in modo che anche
// la printer la possa utilizzare)
const char *TTextfile::line_formatted(
long j) //parm Numero della riga da ritornare
{
if (_cur_line != j)
read_line (j);
@ -479,19 +532,44 @@ long TTextfile::get_attribute (int pos)
return stl;
}
int TTextfile::get_style (int pos)
// @mfunc Ritorna lo stile del piece
//
// @rdesc Ritorna un numero (vedi <t style>) indicante lo stile
int TTextfile::get_style (
int pos) // @parm Posizione del carattere di cui ritornare lo stile (default -1)
// @comm Se viene passato a <p pos> valore -1 ritorna lo stile di tutta la piece, altrimente
// solamente quello del carattere selezionato.
{
const long x = get_attribute(pos) & ~tabbed;
return (int) (x & 0x0000ffff);
}
char TTextfile::get_background (int pos)
// @mfunc Ritorna il colore di background del piece
//
// @rdesc Ritorna il codice del colore, NULL se il carattere non esiste
char TTextfile::get_background (
int pos) // @parm Posizione del carattere di cui conoscere il colore di background (default -1)
// @comm Se <p pos> e' minore di 0 ritorna il colore dell'intero piece, altrimenti solamente
// quello del carattere selezionato.
//
// @xref <mf TTextfile::get_foreground>
{
long x = get_attribute (pos);
return (char) (x >> 24);
}
char TTextfile::get_foreground (int pos)
// @mfunc Ritorna il colore di foreground del piece
//
// @rdesc Ritorna il codice del colore, NULL se il carattere non esiste
char TTextfile::get_foreground (
int pos) // @parm Posizione del carattere di cui conoscere il colore di background (default -1)
// @comm Se <p pos> e' minore di 0 ritorna il colore dell'intero piece, altrimenti solamente
// quello del carattere selezionato.
//
// @xref <mf TTextfile::get_bakcground>
{
long x = get_attribute (pos);
return (char) ((x >> 16) & 0x000000ff);
@ -506,7 +584,12 @@ const char* TTextfile::piece()
return strcpy(TEXT_TMP, l);
}
const char *TTextfile::word_at (long x, long y)
// @mfunc Ritorna la parola alla posizione indicata
//
// @rdesc Stringa indicante la parola cercate
const char *TTextfile::word_at (
long x, // @parm Numero della parola da ritornare
long y) // @parm Numero della linea su cui cercare la parole
{
CHECK (_isopen, "Attempt operation on closed file");
TString s (line (y));
@ -533,7 +616,14 @@ const char *TTextfile::word_at (long x, long y)
return TEXT_TMP;
}
bool TTextfile::append (const char *l)
// @mfunc Aggiunge una riga al text (con i formati del caso)
//
// @rdesc Ritorna il risultato dell'operazione:
//
// @flag TRUE | Se la riga e' stat aggiuntac correttamente
// @flag FALSE | Se non e' riuscot ad aggiungere la riga
bool TTextfile::append (
const char *l) // @parm Riga da aggiungere
{
CHECK (_isopen, "Attempt operation on closed file");
@ -611,7 +701,16 @@ void TTextfile::print ()
// print
}
bool TTextfile::write (const char *path, TPoint * from, TPoint * to)
// @mfunc Scrive il testo (non formattato) su file
//
// @rdesc Rtirna il risultato dell'operazione di scrittura
//
// @flag TRUE | Se e' riuscito a scrivere il testo
// @flag FALSE | Se ha avuto qualche problema nella gestione del file in cui scrivere
bool TTextfile::write (
const char *path, // @parm Nome del file in cui scrivere il testo
TPoint * from, // @parm Punto da cui iniziare a scrivere il testo
TPoint * to) // @parm Punto a cui terminare di scrivere il testo
{
bool ok = FALSE;
FILE *fp;

View File

@ -1,4 +1,3 @@
/* actually -*-c++-*- */
#ifndef __TEXTFILE_H
#define __TEXTFILE_H
@ -19,137 +18,181 @@
#include <relation.h>
#endif
enum direction {up, down, updown};
enum style {normal = XVT_FS_NONE, bold = XVT_FS_BOLD, italic = XVT_FS_ITALIC,
underlined = XVT_FS_UNDERLINE, tabbed = XVT_FS_SCALE };
// @doc EXTERNAL
// @enum direction | Direzioni da seguire nella lettura del file di testo
enum direction {
up, // @emem Direzione verso l'alto
down, // @emem Direzione verso il basso
updown}; // @emem Entrambe le direzioni
// @enum style | Stile del carattere da utilizzare per il disegno del testo
enum style {
normal = XVT_FS_NONE, // @emem Stile carattere normale
bold = XVT_FS_BOLD, // @emem Stile carattere in grassetto
italic = XVT_FS_ITALIC, // @emem Stile carattere in corsivo
underlined = XVT_FS_UNDERLINE, // @emem Stile carattere sottolineato
tabbed = XVT_FS_SCALE }; // @emem Stile carattere scalato
// @class TTextfile | Classe per la definizione delle procedure di stampa di un testo
//
// @base public | TObject
class TTextfile: public TObject
// @author(:INTERNAL) Villa
// @access Private Member
{
// @ccost DEFAULT_PAGESIZE | 128 | Dimensione di default della pagina
enum {DEFAULT_PAGESIZE = 128};
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
// @cmember Pagina di testo correntemente in memoria
TArray _page;
// @cmember Un bit per ogni riga, TRUE se ci si e' fatto replace
TBit_array _dirty_lines;
// @cmember Inizio della pagina in coordinate testo
long _page_start;
// @cmember Fine della pagina in coordinate testo
long _page_end;
// @cmember Numero di righe di <p _page>
long _page_size;
// @cmember Numero totale delle linee di testo
long _lines;
// @cmember Numero della linea corrente
long _cur_line;
// @cmember Nome del file di testo (puo' essere temporaneo)
TFilename _filename;
// @cmember Nome del file indice (sempre temporaneo)
TFilename _indname;
// @cmember Puntatore al file indice
FILE* _index;
// @cmember Puntatore al file di testo
FILE* _instr;
// @cmember Direzione ottimale di lettura del file (vedi <t direction>)
direction _direction;
int _item; // Piece corrente
TToken_string _line; // Testo riga corrente
long _styles[256]; // Stile e colore carattere
bool _tabbed_piece; // uso dei tab con @t
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
// @cmember Piece corrente
int _item;
// @cmember Testo della riga corrente
TToken_string _line;
// @cmember Codifica delllo stile e del colore del carattere
long _styles[256];
// @cmember Indica se la piece e' <e style.tabbed>
bool _tabbed_piece;
// for merging with database fields
TRelation* _rel; // gestisce sostituzione di campi al posto di tag nel testo
// @cmember Punti ipertestuali come passati da utente (<c TViswin>)
TArray _hotspots;
// @cmember Rappresentazione interna punti ipertestuali
TArray _spots;
// @cmember Indice se e' stato modificato
bool _dirty;
// @cmember Indica se i file sono aperti
bool _isopen;
// @cmember Indica se si tratta di un file temporaneo
bool _istemp;
// @cmember Indica se e' permessao dare una <mf TTextfile::append>
bool _accept;
// @cmember Indica se si sta modificando con <mf TTextfile::add> e si puo' fare <mf TTextfile::replace>
bool _interactive;
void _read_page(long line); // riempi pagina contenente line, ottimizzando start/end
bool _in_page(long l) // la riga l e' nella pagina corrente
// @cmember Gestisce la sostituzione di campi al posto di tag nel testo
TRelation* _rel;
// @cmember Riempe la pagina contenente <p line>, ottimizzando start ed end
void _read_page(long line);
// @cmember Ritorna TRUE se la roga <p l> e' nella pagina corrente
bool _in_page(long l)
{ return l >= _page_start && l < _page_end; }
void _save_changes(); // salva i replace fatti sul file (anche temporaneo)
// @cmember Salva i replace fatti sul file (anche temporaneo)
void _save_changes();
// void _parse_style(long j);
style _trans_style(char c); // traduci il tag dello stile in stile XVT
// @cmember Traduce il tag dello stile passato in <p c> (tag) con uno di <t style> (stile XVT)
style _trans_style(char c);
// @access Public Member
public:
// @cmember Ritorna il numero totale delle linee di testo
long lines()
{ return _lines; }
// @cmember Ritorna se sono state effettuate delle modifiche
bool changed()
{ return _dirty; }
long lines() { return _lines; }
bool changed() { return _dirty; }
// line() ritorna la stringa di caratteri senza formattazione
// ed eventualmente con i campi sostituiti se la relazione
// non e' NULL; parte da row e column, per howmuch caratteri utili
// default tutta la riga
// @cmember Ritorna la stringa di caratteri senza formattazione
const char* line(long row, long column = 0, int howmuch = -1);
// line_formatted() la ritorna, come e' logico attendersi, con
// la formattazione (ovvero tutti i @eccetera, che anche la printer capisce)
// @cmember Ritorna la stringa di caratteri con la formattazione
const char* line_formatted(long row);
// appende una riga al text (con i formati del caso)
bool append(const char* l);
// @cmember Aggiunge una riga al text (con i formati del caso)
bool append(const char* l);
// @cmember Chiude tutti i files per poter copiare o eseguire operazioni. Dopo aver chiamato
// questa funzione non si puo' piu' fare nulla.
void close();
// @cmember Stampa su carta
void print();
// @cmember Chiude l'aggiunta di nuove linee
void freeze()
{ _accept = FALSE; }
// @cmember Ritorna se e' possibile aggiungere delle nuove righe (TRUE se non vengono accettate)
bool frozen()
{ return !_accept; }
// chide tutti i files per poter copiare o eseguire operazioni
// dopo close() non si puo' piu' fare nulla
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; 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?
void read_line(long j, long b = 0, bool pg = TRUE);
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);
long get_attribute(int pos = -1);
// ritorna la parola alla posizione indicata
// @cmember Legge il testo formattato
void read_line(long j, long b = 0, bool pg = TRUE);
// @cmember Ritorna il pezzo di linea successivo con stile e colore
const char* piece();
// @cmember Ritorna lo stile del piece (vedi <t style>)
int get_style(int pos = -1);
// @cmember Ritorna il colore di background del piece
char get_background(int pos = -1);
// @cmember Ritorna il colore di foreground del piece
char get_foreground(int pos = -1);
// @cmember Ritorna gli attributi alla posizione <p pos>
long get_attribute(int pos = -1);
// @cmember Ritorna la parola alla posizione indicata
const char* word_at(long x, long y);
// TBI ritorna il pezzo di testo da x a y
// allochera' un altro TText che deve essere disfatto dall'utente
TTextfile* section(TPoint& from, TPoint& to) { return this; }
const char* name() { return (const char*)_filename; }
void interactive(bool on = TRUE) { _interactive = on; }
// @cmember Ritorna il pezzo di testo indicato (da <p form> a <p to>), allochera' un altro
// TText che deve essere disfatto dall'utente.
TTextfile* section(TPoint& from, TPoint& to)
{ return this; }
// @cmember Ritorna il nome del file su cui si sta lavorando
const char* name()
{ return (const char*)_filename; }
// @cmember Permette di settare il valore di <p _iteractive> (vedi sopra)
void interactive(bool on = TRUE)
{ _interactive = on; }
// scrive il testo (non formattato) su file, da punto a punto
// (tutto per default)
bool write(const char* path, TPoint* from = NULL, TPoint* to = NULL);
// disfa tutto e svuota il file
void destroy();
// @cmember Scrive il testo (non formattato) su file
bool write(const char* path, TPoint* from = NULL, TPoint* to = NULL);
// @cmember Disfa tutto e svuota il file
void destroy();
// search and replace (una riga per volta, rispetta i formati)
// txt = text to search; pos = int to put the char position in;
// from = where to start; down = FALSE == up
long search (const char* txt, int& pos, long from = 0,
bool down = TRUE, bool casesens = FALSE);
// replace txt=txt in line=line at pos=pos for len=len
int replace(long line, const char* txt, int pos = 0, int len = -1);
// @cmember Cerca una stringa di testo all'interno di una riga
long search (const char* txt, int& pos, long from = 0, bool down = TRUE, bool casesens = FALSE);
// @cmember Sostituisce un testo all'interno di una riga
int replace(long line, const char* txt, int pos = 0, int len = -1);
// hypertext cazzuls
// le si dice il colore che devono avere i punti selezionabili;
// ritorna l'array in cui vengono messi gli hotspots relativi alla
// pagina in memoria (come TToken_string con x|y|text)
// @cmember Permette di settare gli hot_spot
void set_hotspots(char fg, char bg = 'w');
TArray& hotspots() { return _spots; }
// @cmember Ritorna l'array di hotspots
TArray& hotspots()
{ return _spots; }
// associa una relazione che viene usata (nello stato corrente) per
// risolvere eventuali campi per merge (marcati nel testo come
// <@file->fieldname@[format]@[len]@[just]>
void set_relation(TRelation* r) { _rel = r; }
// @cmember Associa una relazione che viene usata (nello stato corrente) per
// risolvere eventuali campi per merge (marcati nel testo come
// <lt>@file-<gt>fieldname@[format]@[len]@[just]<gt>
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);
// @cmember Costruttore
TTextfile(const char* file = NULL, int pagesize = DEFAULT_PAGESIZE, direction preferred = updown, bool interactive = TRUE);
// @cmember DIstruttore
virtual ~TTextfile();
};

View File

@ -13,6 +13,8 @@
#include <bagn005.h>
// @doc EXTERNAL
const char* const PRINT_FONT = XVT_FFN_FIXED;
const int PRINT_HEIGHT = 10;
@ -289,8 +291,11 @@ void TViswin::display_link (long y, long x1, long x2, const char *d)
}
}
void TViswin::erase_link (long y, long x1, long x2)
// @mfunc Cancella il link
void TViswin::erase_link (
long y, // @parm Altezza del link da disegnare
long x1, // @parm Prima coordinata x del link da cancellare
long x2) // @parm Seconda coordinata x del link da cancellare
{
if (_link_displayed)
{
@ -312,14 +317,30 @@ void TViswin::erase_link (long y, long x1, long x2)
}
}
void TViswin::paint_link (long y, long x1, long x2)
// @mfunc Disegna il link
void TViswin::paint_link (
long y, // @parm Altezza del link da disegnare
long x1, // @parm Prima coordinata x del link da disegnare
long x2) // @parm Seconda coordinata x del link da disegnare
{
if (adjust_box (x1, x2, y))
invert_bar ((int)(x1 + (long)X_OFFSET), (int)(y + (long)Y_OFFSET),
(int)(x2 + (long)X_OFFSET), (int)(y + (long)Y_OFFSET+1l));
}
bool TViswin::adjust_box (long &x1, long &x2, long y)
// @mfunc Modifica le dimensione di un box
//
// @rdesc Ritorna se sono state modificate le dimensioni del box:
//
// @flag TRUE | Sono state riassegante le coordinate a <p x1> e <p x2>
// @flag FALSE | Non sono state riassegnate le misure del box poiche' <p y> e' nel testo
bool TViswin::adjust_box (
long &x1, // @parm Prima coordinata da riassegnare
long &x2, // @parm Seconda coordinata da riassegnare
long y) // @parm Valore della riga che deve essere nel testo
// @comm Sistema <p x1> e <p x2> in modo che il minore sia il primo, e controlla che <p y> sia
// nel testo (box e' su una sola riga, usata solo per i link)
{
if (y < origin ().y || y > origin ().y + _textrows)
return FALSE;
@ -330,7 +351,18 @@ bool TViswin::adjust_box (long &x1, long &x2, long y)
return TRUE;
}
bool TViswin::check_link (TPoint * p)
// @mfunc Controlla se la posizione cursore <p where> cade su un link ipertestuale e si
// comporta di conseguenza
//
// @rdesc Ritorna se la posizione cade sul link
//
// @flag TRUE | Se ha constatato la corrispondenza
// @flag FALSE | Se non ha constatato la corrispondenza
bool TViswin::check_link (
TPoint * p) // @parm Posizione del cursore (default NULL)
// @comm Se <p p> e' NULL indica la posizione corrente del cursore
{
static char descr[128], pdescr[128];
static int old_id = -1, plinkID = -1;
@ -437,7 +469,14 @@ bool TViswin::in_text (const TPoint & p) const
}
bool TViswin::need_paint_sel (bool smart)
// @mfunc Indica se occorre ridisegnare la selezione
//
// @rdesc Ritorna se e' necessario ridipingere la selezione
bool TViswin::need_paint_sel (
bool smart) // @parm Indica se ridisegnarla in ogni caso
//
// @flag TRUE | Indica il ridisegno solamente se e' necessario
// @flag FALSE | Indica il ridisegno in ogni caso
{
TPoint p1, p2;
adjust_selection (p1, p2);
@ -464,7 +503,12 @@ void TViswin::display_selection ()
_sel_displayed = TRUE;
}
void TViswin::adjust_selection (TPoint & p1, TPoint & p2)
// @mfunc Riposizona inizio e fine della selezione
void TViswin::adjust_selection (
TPoint & p1, // @parm Primo punto per il riposizionamento della selezione
TPoint & p2) // @parm Secondo punto per il riposizionamento della selezione
// @comm Viene asseganto a <p p1> e <p p2> le coordinate di inizio e fine selezione
{
if (_sel_start.y < _sel_end.y)
{
@ -511,7 +555,16 @@ void TViswin::shift_screen (scroll dir)
_scrolling = FALSE;
}
WINDOW TViswin::add_button (short id, const char *caption)
// @mfunc Aggiunge un bottone alla finestra
//
// @rdesc Ritorna l'handle del bottone aggiunto
WINDOW TViswin::add_button (
short id, // @parm Identificatore del bottone da aggiungere
const char *caption) // @parm Testo del bottone da aggiungere
// @comm Questa funzione aggiunge bottoni nella finestra oltre a quelli standard delle finestre
// di visualizazioni anteprima di stampa. Il limite dei bottoni da aggiungere e' dato
// dal <p MAXBUT>.
{
const int BUT_HEIGHT =
#if XVT_OS == XVT_OS_WIN
@ -623,7 +676,10 @@ void TViswin::paint_screen ()
// j = riga totale, row = riga a video
void TViswin::paint_background (long j, int row)
// @mfunc Permette di stampare i colori di bakcground
void TViswin::paint_background (
long j, // @parm Numero della riga di cui stamparne il bakcground
int row) // @parm Numero della riga a video sulla quale vine stampato il backgropund
{
if (_bg->items() == 0)
return;
@ -835,7 +891,13 @@ void TViswin::paint_row (long j)
autoscroll (TRUE);
}
void TViswin::paint_column (long j, bool end)
// @mfunc Disegna una colonna
void TViswin::paint_column (
long j, // @parm Colonna da disegnare
bool end) // @parm Indica se si tratta dell'ultima colonna:
//
// @flag TRUE | E' l'ultima colonna ed implica uno scroll orizzonatle avvenuto
// @flag FALSE | Non e' l'ultima colonna
{
paint_header ();
set_opaque_text (FALSE);
@ -938,7 +1000,12 @@ void TViswin::erase_point ()
_point_displayed = FALSE;
}
void TViswin::paint_point (bool erase)
// @mfunc Disegna il cursore in xor nello stile del momento
void TViswin::paint_point (
bool erase) // @parm Indica di cancellare il cursore precedente (default FALSE):
//
// @flag TRUE | Cancella il cursore precedente
// @flag FALSE | Mantiene il cursore precedente
{
autoscroll (FALSE);
static bool wasbar;
@ -1015,7 +1082,9 @@ void TViswin::paint_selection ()
}
}
void TViswin::paint_waitbar (bool xor)
// @mfunc Disegna la barra di attesa
void TViswin::paint_waitbar (
bool xor) // @parm Utilizzato in UNIX. (default TRUE)
{
#if XVT_OS == XVT_OS_WIN
HIDDEN int pic = 0;
@ -2132,7 +2201,13 @@ void TViswin::goto_top()
goto_pos(0l,0l);;
}
void TViswin::goto_pos(long r, long c, bool moveorigin)
// @mfunc Sposta la visualizzazione di stampa alla posizione indicata
void TViswin::goto_pos(
long r, // @parm Riga a cui spostare la visualizzazione di stampa
long c, // @parm Colonna a cui spostare la visualizzazione di stampa
bool moveorigin) // @parm Indica se occorre spostare l'origine (default TRUE)
// @xref <mf TViswin::goto_top> e <mf TViswin::goto_end>
{
if (r >= _txt.lines() || c >= 256)
return;
@ -2156,12 +2231,32 @@ void TViswin::refresh()
force_update();
}
long TViswin::search(const char* txt, int& pos, long from, bool down, bool cs)
// @mfunc Funzione di ricerca non interattiva
//
// @rdesc Ritorna la riga in cui e' stata trovato il testo (-1 se non e' stato trovato)
long TViswin::search(
const char* txt, // @parm Testo da cercare
int& pos, // @parm Intero in cui posizionare la posizione del carattere
long from, // @parm Posizione all'interno della riga da cui iniziare la ricerca (default 0)
bool down, // @parm Indica se la ricerca va effettuata all'indietro:
//
// @flag TRUE | Ricerca dalla posizione indicata all'inizio della riga (default)
// @flag FALSE | Ricerca dalla posizione indicata alla fine della riga
bool cs) // @parm Indica se ricerca il testo con criterio case sensitive (default FALSE)
{
return _txt.search(txt,pos,from,down, cs);
}
int TViswin::replace(long l, const char* txt, int pos, int len)
// @mfunc Funzione di sostituzione di un testo all'interno di una riga non interattiva
//
// @rdesc Ritorna la posizione in cui e' stato sostituito il testo. Ritorna -1 se non e' stata
// fatto nessuna operazione di sostituzione.
int TViswin::replace(
long l, // @parm Numero della riga nella quale sostituire il testo
const char* txt, // @parm Testo da inserire nella riga
int pos, // @parm Posizione nella quale inserire il testo (default 0)
int len) // @parm Lunghezza del testo da sostituire (default -1)
{
if (l == -1l) return -1;
int ret = _txt.replace(l,txt,pos,len);
@ -2231,7 +2326,12 @@ void TViswin::show_rulers (bool on)
refresh();
}
void TViswin::show_buttons(bool on)
// @mfunc Indica se mostrare o no i bottoni della finestra di anteprima
void TViswin::show_buttons(
bool on) // @parm Indica l'operazione da svolgere:
//
// @flag TRUE | Mostra i bottoni della finestra (default)
// @flag FALSE | Nasconde i bottoni della finestra
{
_showbuts = on;
autoscroll (FALSE);

View File

@ -1,4 +1,3 @@
/* This is really -*-c++-*- */
#ifndef __VISWIN_H
#define __VISWIN_H
@ -16,214 +15,328 @@
class TBrowsefile_field;
class TViswin : public TScroll_window
{
friend class TBrowsefile_field; // yes, perche' puo' anche essere un controllo di una mask
// @doc EXTERNAL
// @class TViswin | Classe per la gestione della finestra video di anteprima di stampa
//
// @base public | TScroll_window
class TViswin : public TScroll_window
// @author(:INTERNAL) Villa
// @access Private Member
{
// @cfriend TBrowsefile_field
friend class TBrowsefile_field;
// @ccost MAXBUT | 4 | Numero massimo di bottoni disponibili nella pagina
enum { MAXBUT = 4,
// @ccost MAXLEN | 256 | Lunghezza massima del modulo di stampa
MAXLEN = 256,
// @ccost BUFFERSIZE | 256 | Dimensione del buffer di stampa
BUFFERSIZE = 256,
// @ccost MAXPIC | 4 | Numero massimo di immagini gestibili nell'anteprima
MAXPIC=4};
enum { MAXBUT = 4, MAXLEN = 256, BUFFERSIZE = 256, MAXPIC=4};
enum scroll { none, up, down, left, right };
TFilename _filename; // name of visfile
bool _islink; // "link" button present
bool _isedit; // "edit" button present
bool _isprint; // "print" button present
bool _iscross; // crossbars being drawn
bool _selecting; // selection in progress
bool _isselection; // selection active
bool _isbar; // X-bar drawn instead of cursor at point
bool _scrolling; // scrolling in progress
bool _need_update; // full update required
bool _istimer; // timer successivo attivo?
bool _isopen; // new lines may arrive
bool _selflag;
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?
bool _wasneeded; // flag for smart painting
WINDOW _button[MAXBUT]; // button array
int _curbut; // button which currently has focus
int _buttons; // button count
// @cmember Nome del file di visualizzazione
TFilename _filename;
// @cmember Indica la presenza del bottone Collega
bool _islink;
// @cmember Indica la presenza del bottone Edit
bool _isedit;
// @cmember Indica la presenza del bottone Stampa
bool _isprint;
// @cmember Indice se effettuare il disgno della crossbar
bool _iscross;
// @cmember India se e' in corso la selezione
bool _selecting;
// @cmember Indica se la selezione e' attiva
bool _isselection;
// @cmember Indica se disegnare la X-bar al posto del cursore a punto
bool _isbar;
// @cmember Indica se in corso lo scrolling
bool _scrolling;
// @cmember Indica se e' necessario un update completo
bool _need_update;
// @cmember Indica se il timer successivo e' attivo
bool _istimer;
// @cmember Indica se possono arrivare nuove linee
bool _isopen;
// @cmember Indica se sono stati selezionati flag
bool _selflag;
// @cmember Indica se e' evidenziata la selezione
bool _sel_displayed;
// @cmember Indica se e' visualizzato il link
bool _link_displayed;
// @cmember Indica se' e' visualizzata l'incrocio della crossbar
bool _cross_displayed;
// @cmember Indica se e' visualizzato il cursore a carattere
bool _point_displayed;
// @cmember Timer per evitare autorepeat di tasti
long _timer;
// òcmember Timer di attesa prima della chiusura del file
long _wtimer;
// @cmember Indica il tipo di scroll richiesto (vedi <t scroll>)
scroll _need_scroll;
// @cmember Flag per il disegno intelligente
bool _wasneeded;
// @cmember Array di bottoni attivi nella finestra
WINDOW _button[MAXBUT];
// @cmember Bottone che ha il focus
int _curbut;
// @cmember Contatore di bottoni
int _buttons;
WINDOW _link_button; // ID bottone "Collega"
WINDOW _print_button; // ID bottone "Stampa"
// @cmember Bottone Collega
WINDOW _link_button;
// @cmember Bottone Stampa
WINDOW _print_button;
long _textrows; // righe di testo
long _textcolumns; // indovina indovinello
// @cmember Numero di righe di testo
long _textrows;
// @cmember Numero di colonne di testo
long _textcolumns;
TTextfile _txt; // text being displayed
long _firstline; // 1rst text line being displayed
long _lastline; // last text line being displayed
// @cmember Testo che deve essere visualizzato
TTextfile _txt;
// @cmember Prima linea di testo che deve essere visualizzata
long _firstline;
// @cmember Ultima linea di testo che deve essere visualizzata
long _lastline;
// @cmember Strina di testo da cercare
TString _txt_to_find;
// @cmember Posizione dell'ultima ricerca
TPoint _last_found;
// @cmember Direzione della ricerca (TRUE verso il basso FALSE verso l'alto)
bool _down_dir;
// @cmember Indica se si deve fare una ricerca case sensitive
bool _case_sensitive;
// @cmember Lunghezza della pagina
int _formlen;
// 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
// @cmember Posizione corrente del punto
TPoint _point;
// @cmember Posizione corrente dell'incrocio della crossbar
PNT _cross;
// @cmember Inizio della selezione (colonna, line del FILE)
TPoint _sel_start;
// @cmember Fine della selezione (colonna, line del FILE)
TPoint _sel_end;
int _formlen; // length of a page
TPoint _point; // current point position
PNT _cross; // current crossbar point
TPoint _sel_start; // start of selection (column, line of FILE)
TPoint _sel_end; // end of selection (ibidem)
TArray* _links; // admitted links
TArray* _hotspots; // hotspots
TArray* _bookmarks; // bookmarks
// @cmember Array di link ammessi
TArray* _links;
// @cmember Array di hotspots
TArray* _hotspots;
// @cmember Array di segnalibri
TArray* _bookmarks;
// @cmember Indica se occorre ridisegnare la selezione
bool need_paint_sel(bool smart = TRUE);
TArray _modules; // Scrolling module icons
TArray _images; // pictures properly resized
// @cmember Array di icone del modulo scorrevole durante la stampa
TArray _modules;
// @cmember Array di immagini propriamente ridimensionate
TArray _images;
// @cmember Indica se e' attivato il link multiplo se si' vengono passati all'handler tutti i
// link presenti sulla stessa riga anziche' solo il selezionato
bool _multiple;
// @cmember Testo del link
TString80 _linktxt;
// @cmember Identificatore del link
int _linkID;
// @cmember Indica tutti i link della riga nel caso di link multiplo
TToken_string _multiple_link;
// 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
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
// @cmember Array di colori di background
TArray* _bg;
// @cmember Indica se la stampa e' stata interrotta
bool _frozen;
// @cmember Finestra in primo piano (se FALSE e un campo di una maschera)
bool _toplevel;
// @cmember Indica se mostrare il righello
bool _rulers;
// @cmember Indica se visualizzare i bottoni
bool _showbuts;
// @cmember Indica se si sta attivando un link
bool _inside_linkexec;
// òcmember Indica se e' presente il menu' specifico della calsse
bool _menu_present;
// @cmember Viene istanziato soltanto se e' usata come controllo
TBrowsefile_field* _brwfld;
// @access Protected Member
protected:
virtual bool on_key (KEY);
// @cmember !!!???!!!
virtual bool on_key (KEY);
// @cmember !!!???!!!
virtual void open();
int tabx(int x) const; // Convert charx to pixels
int taby(int y) const; // Convert chary to pixels
// @cmember Converte i caratteri in x in pixel
int tabx(int x) const;
// @cmember Converte i caratteri in y in pixel
int taby(int y) const;
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
// @cmember Sposta lo schermo nella direzione <p dir> di 1
void shift_screen(scroll dir);
// @cmember Disegna lo schermo sulla porzione corrente di testo
void paint_screen();
// @cmember Disegna il cursore a crossbar in XOR
void draw_crossbars();
// 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;
// @cmember Disegna l'header del video (righello)
void paint_header();
// @cmember Disegna il cursore in xor nello stile del momento
void paint_point(bool erase = FALSE);
// @cmember Disegna la riga <p r>-esima (in coordinate testo)
void paint_row(long r);
// @cmember Disegna una colonna
void paint_column(long r, bool end);
// @cmember Disegna in xor la selezione corrente a meno che non sia gia' disegnata
void paint_selection();
// @cmember Controlla l'immagine di 'busy'; xor serve solo per UNIX, dove si
// disegna una barra che viene cancellata alla prossima paint.
void paint_waitbar(bool xor = TRUE);
// @cmember Permette di stampare il bakcground di riga <p row> e colonna <p col>
void paint_background(long, int);
// @cmember Chiama l'editor selezionato nel file PRASSI.INI. Ritorna il risultato della
// chiamata (TRUE se e' riuscito a chiamarlo)
bool call_editor();
// @cmember Ritorna se in punto <p p> e' nel testo mostrato
bool in_text(const TPoint& p) const;
// @cmember Aggiunge un bottone alla finestra
WINDOW add_button(short id, const char* caption);
void repos_buttons();
// 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();
// 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);
// mostra in xor sto cazzo di link ipertesticolare (usata da paint/erase link)
void display_link(long, long, long, const char*);
// 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();
// @cmember Riposiziona i bottoni centrandoli a seconda di quanti sono presenti
void repos_buttons();
// @cmember Assicura che la selezione rimanga nei limiti fisici del testo
void adjust_selection(TPoint& p1, TPoint& p2);
// @cmember Interfaccia per paint_selection: mostra se non c'e'
void display_selection();
// @cmember Interfaccia per paint_selection: cancella se c'e'
void erase_selection();
// @cmember Interfaccia per paint_point (se cross): mostra se non c'e'
void display_crossbar();
// @cmember Interfaccia per paint_point (se cross): cancella se c'e'
void erase_crossbar();
// @cmember Interfaccia per paint_point (se point): mostra se non c'e'
void display_point();
// @cmember Interfaccia per paint_point (se point): cancella se c'e'
void erase_point();
protected:
// @cmember Controlla se la posizione cursore <p where> cade su un
// link ipertestuale e si comporta di conseguenza
bool check_link(TPoint* where = NULL);
// @cmember Modifica le dimensione di un box
bool adjust_box(long& x1, long& x2, long y);
// @cmember Mostra il link ipertestuale se non c'e'
void paint_link(long y, long x1, long x2);
// @cmember Cancella il link ipertestuale se c'e'
void erase_link(long y, long x1, long x2);
// @cmember Mostra in xor il link ipertestuale (utilizzata da <mf TViswin::paint_link> e da
// <mf TViswin::erase_link>
void display_link(long y, long x1, long x2, const char* d);
// @cmember Usata internamente per bloccare l'aggiunta di nuove righe
void freeze()
{ _frozen = TRUE; }
// @cmember Chiama l'handler del link se si preme collega o si batte spazio su un link
void exec_link();
// @cmember Controlla la generazione menu indice se ci sono segnalibri
void build_index_menu();
// @cmember Viene chiamata quando si tenta di fare uno scroll impossibile da <p x> o <p y>:
// emette un suono e non effettuata lo scroll
void scroll_error(long x, long y);
// 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
// @cmember !!!???!!!
virtual void update();
virtual void handler(WINDOW win, EVENT* ep);
// @cmember !!!???!!!
virtual void handler(WINDOW win, EVENT* ep);
// @cmember !!!???!!!
void check_menu_item(MENU_TAG item, bool on = TRUE);
// @cmember !!!???!!!
void enable_menu_item(MENU_TAG item, bool on = TRUE);
// @access Public Member
public:
// gestione "collegamenti": vengono passati il testo completo,
// il punto di inizio selezione e quello di fine selezione; se
// 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; }
// terminazione by user (ESC durante stampa)
// @cmember Permette di gestire i collegamenti ipertestuali. Occorre passare il testo completo
// <p txt>, il punto di inizio selezione <p start> e quello di fine selezione <p end>;
// se non c'e' selezione non viene chiamata affatto (il bottone non fa nulla)
// Se serve, si faccia <mf TWindow::stop_run> qui dentro.
virtual void process_link(TTextfile& txt, TPoint start, TPoint end)
{ }
// @cmember Termina la stampa su video e crea il menu indice se c'e'
void close_print();
// @cmember Interrompe la stampa
bool frozen()
{ return _frozen; }
// @cmember Interrompe la stampa su video (ESC durante la stampa)
void abort_print();
long lines() { return _txt.lines(); }
TTextfile& text() { return _txt; }
// @cmember Ritorna il numero di righe del testo da stampare
long lines()
{ return _txt.lines(); }
// @cmember Ritorna il testo da stampare
TTextfile& text()
{ return _txt; }
// bound to keys and menu actions
// @cmember Sposta la visualizzazione di stampa alle chiavi (chiama <mf TViswin::goto_pos>)
void goto_end();
// @cmember Sposta la visualizzazione di stampa alle azioni del menu' (chiama
// <mf TViswin::goto_pos>)
void goto_top();
// @cmember Sposta la visualizzazione di stampa alla posizione indicata
void goto_pos(long r, long c, bool moveorigin = TRUE);
// @cmember Opera un ridisegno della pgina di anteprima a video
void refresh();
// @cmember Indica se mostrare o no il righello
void show_rulers (bool on = TRUE);
// @cmember Indica se mostrare o no i bottoni della finestra di anteprima
void show_buttons(bool on = TRUE);
// usata da chi la usa (es. printer) per stampare nella finestra
// @cmember Stampa nella finestra la riga <p l>-esima
void add_line(const char* l);
// 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);
// @cmember Funzione di ricerca non interattiva
long search (const char* txt, int& pos, long from = 0, bool down = TRUE, bool casesens = FALSE);
// @cmember Funzione di sostituzione di un testo all'interno di una riga non interattiva
int replace(long line, const char* txt, int pos = 0, int len = -1);
// interactive search (con maschera, bound to F7/F8)
// @cmember Funzione di ricerca interattiva
void find();
void find_next();
TViswin (const char* fname = NULL,
const char* title = NULL,
bool editbutton = TRUE,
bool printbutton = TRUE,
bool linkbutton = TRUE,
int x = -1,
int y = -1,
int height = 0,
int width = 0,
bool rulers = TRUE,
WINDOW parent = NULL_WIN,
TBrowsefile_field* = NULL);
// @cmember Funzione di ricerca prossimo elemento interattiva
void find_next();
// @cmember void | TViswin | const char* fname=NULL, const char* title=NULL,
// bool editbutton=TRUE, int width=0, bool rulers=TRUE,
// WINDOW parent=NULL_WIN, TBrowsefile_field*=NULL | Costruttore
TViswin(const char* fname=NULL, const char* title=NULL, bool editbutton=TRUE,
bool printbutton=TRUE, bool linkbutton=TRUE, int x=-1, int y=-1, int height=0,
int width=0, bool rulers=TRUE, WINDOW parent=NULL_WIN, TBrowsefile_field* =NULL);
// @cmember Distruttore
virtual ~TViswin ();
};
#endif
// @enum scroll | Direzioni da utilizzare nello scroll
//
// @emem none | Nessuno scroll
// @emem up | Scroll verso l'alto
// @emem down | Scroll verso il basso
// @emem left | Scroll verso sinistra
// @emem right | Scroll verso destra
//
// @comm Questa struttura viene usata esclusivamente all'interno della classe <c TViswin>

View File

@ -255,17 +255,29 @@ void TWindow_manager::unreg(const TWindow* m)
}
}
// @func Chiude tutte le finestre aperte
void close_all_dialogs()
{
WinManager.destroy();
}
// @func Indica se possono essere chiuse le finestre aperte
//
// @rdesc Ritorna il risultato della ricerca:
//
// @flag TRUE | Se le finestre aperte possono essere chiuse
// @flag FALSE | Se le finestre aperte non possono essere chiuse
bool can_close()
{
return WinManager.can_close();
}
// @func Ritorna l'handle della finestra corrente
//
// @rdesc Restituisce l'handle della finestra corrente.
WINDOW cur_win()
// @comm Se non esiste una finestra corrente allora ritorna NULL_WIN
{
const TWindow* w = WinManager.cur_win();
return w ? w->win() : NULL_WIN;

View File

@ -11,12 +11,12 @@
class TString_array;
// @doc EXTERNAL
void close_all_dialogs();
bool can_close();
WINDOW cur_win();
// doc EXTERNAL
//@class TPoint | Struttura per la definizione di un punto sullo schermo
struct TPoint
{
@ -176,7 +176,7 @@ protected:
void set_modal(bool m)
{ _modal = m; }
// @parm Ritorna l'handler della finestra padre
// @cmember Ritorna l'handler della finestra padre
WINDOW parent() const;
// @cmember Fa' l'update della finstra
@ -195,7 +195,7 @@ protected:
public:
// @cmember Costruttore
TWindow();
// @cemmerb Distruttore
// @cmember Distruttore
virtual ~TWindow();
// @cmember Gestisce l'handeler della finestra
@ -274,7 +274,7 @@ public:
// @cmember Riempie la finestra con il colore <p color>
void clear(COLOR color);
// @cmembr Setta il draw mode
// @cmember Setta il draw mode
void set_mode(DRAW_MODE mode);
// @cmember Setta il colore della finestra e dello sfondo
@ -336,12 +336,12 @@ public:
};
// @class TTemp_window | Classe per la definizione di finestre con scrollbar
// @class TScroll_window | Classe per la definizione di finestre con scrollbar
//
// @public base | TWindow
// @base public | TWindow
class TScroll_window : public TWindow
{
// @uthor:(INTERNAL) Guido
// @author:(INTERNAL) Guido
// @access Private Member