Introduzione delle sottosezioni

git-svn-id: svn://10.65.10.50/trunk@4555 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
augusto 1997-06-09 10:37:35 +00:00
parent 5721b0b1d4
commit 7a1bbd6b7f

View File

@ -19,15 +19,21 @@ class TRectype;
#endif
#ifndef __RELATION_H
class TRelation;
#include <relation.h>
/*class TRelation;
class TRelation_description;
class TCursor;
class TSorted_cursor;*/
#endif
#ifndef __ASSOC_H
#include <assoc.h>
#endif
#ifndef __EXPR_H
#include <expr.h>
#endif
// @doc EXTERNAL
// @enum pagetype | Posizione della pagina da stampare
@ -39,6 +45,12 @@ enum pagetype {
// @doc INTERNAL
// @enum bkg_mode | Tipo di background presente nella stampa
enum bkg_mode {
none, // @emem Nessuno sfondo
testo, // @emem Sfondo di tipo testo
graphics } ; // @emem Sfondo grafico
pagetype char2page(char);
class TForm;
@ -46,8 +58,10 @@ class TMask_field;
class TSheet_field;
class TForm_item;
class TPrint_section;
class TForm_subsection ;
const int MAXCOLUMNS = 32;
const int MAXSUBSECTIONS = 9;
// @doc EXTERNAL
@ -68,6 +82,9 @@ class TForm : public TObject
// @access:(INTERNAL) Private Member
// @cmember:(INTERNAL) Tipo di sfondo da applicare alla stampa (vedi <t bkg_mode>)
bkg_mode _background_mode;
// @cmember:(INTERNAL) Nome del profilo di stampa
TString _name;
// @cmember:(INTERNAL) Codice del profilo di stampa
@ -103,6 +120,9 @@ class TForm : public TObject
// @cmember:(INTERNAL) <c TRelation_description> per la gestione della relazione corrente
TRelation_description* _rel_desc;
// @cmember:(INTERNAL) Indica se proseguire il ciclo next_match sul file (sezioni annidate)
TArray _skip_info;
// @cmember:(INTERNAL) Array di headers
TArray _head;
// @cmember:(INTERNAL) Array di bodies
@ -127,7 +147,9 @@ class TForm : public TObject
TString _desc;
// @cmember:(INTERNAL) Array di caratteri di fincatura
TString16 _fink;
// @cmember:(INTERNAL) Numero iniziale di pagina
word _frompage,_topage;
// @cmember:(INTERNAL) Handler di default della testata di stampa
static void header_handler(TPrinter& p);
// @cmember:(INTERNAL) Handler di default del piede di stampa
@ -167,7 +189,15 @@ protected:
// @cmember Legge una use e setta la relazione (ritorna sempre TRUE)
bool parse_use(TScanner&);
// @cmember Legge una join e setta la relazione (ritorna sempre TRUE)
bool parse_join(TScanner&);
bool parse_join(TScanner& scanner);
// @cmember Legge una join e setta la relazione (ritorna sempre TRUE)
bool parse_sortedjoin(TScanner& scanner);
// @cmember Legge una join e setta la relazione (ritorna sempre TRUE)
bool parse_join_param(TScanner& scanner,TRelation * rel, TString16 j, int to );
// @cmember Legge l'espressione di ordinamento e ne ritorna la tokenstring
TToken_string parse_sortexpr(TScanner&);
// @cmember Legge l'espressione di filtro e ne ritorna la tokenstring
TToken_string parse_filter(TScanner&);
// @cmember Legge una <c TRelation_description> e setta la relazione
bool parse_description(TScanner&);
@ -230,6 +260,15 @@ public:
// @cmember Stampa gli items da <p form> a <p to>
bool print(long from = 0L, long to = -1L);
// @cmember Memorizza il risultato dell'ultimo match (val==-1: resetta) su <p file>
void match_result(int file=0, int val=-1);
// @cmember Indica se l'ultimo next_match su <p file> è stato fruttuoso
bool last_match_result(int file=0);
// @cmember Indica se è già stato fatto un next_match su <p file>
bool next_match_done(int file=0);
// @cmember Indica se è già stato fatto un next_match su <p file>
int matches_done(int file=0);
// @cmember Ritorna l'altezza della pagina <p page> la prima di default
word height(word page = 3);
@ -282,6 +321,8 @@ public:
// @cmember Ritorna il campo <p id>-esimo della sezione <p sec>
TForm_item& find_field(char sec, pagetype pag, short id) const;
// @cmember Ritorna la sottosezione <p name> della sezione <p sec>
TForm_item& find_field(char sec, pagetype pag, const char *name) const;
// @cmember Ritorna l'offset x valido per tutte le sezioni
int& offset_x()
{ return _x; }
@ -325,14 +366,22 @@ public:
// @cmember Editor interface (vedi <c TForm_editor>)
TForm_editor& editor() const;
// @cmember Setta lil numero di pagina iniziale
void set_from_page(word p)
{_frompage=p;}
// @cmember Setta lil numero di pagina finale
void set_to_page(word p)
{_topage=p;}
// @cmember Setta l'inizio di stampa dell'ultima pagina
void set_last_page(bool lp)
{ _lastpage = lp; }
// @cmember Setta il modo di fincatura
void set_fink_mode(bool f);
// @cmember Ritorna il modo di fincatura
bool get_fink_mode() ;
// @cmember Setta il modo di sfondo (fincatura)
void set_mode(bkg_mode b);
// @cmember Ritorna il modo di sfondo (fincatura)
bkg_mode mode()
{ return _background_mode;}
// @cmember Costruttore
TForm();
@ -371,6 +420,8 @@ public:
bool finkr : 1;
// @cmember Indica se si tratta di un campo memo
bool memo : 1;
// @cmember Indica se va stampato a inizio di pagina nuova
bool newpage : 1;
// @access Protected Member
protected:
@ -394,6 +445,9 @@ public:
// @cmember Setta il flag di campo memo
void set_memo (bool b)
{ memo = b; }
// @cmember Setta il flag di campo memo
void set_newpage (bool b)
{ newpage = b; }
// @cmember Permette di stampare i flags sulla maschera di editing <p m>
void print_on(TMask& m);
// @cmember Legge i flgs dalla maschera <p m>
@ -439,14 +493,15 @@ class TPrint_section : public TArray
char _sec_type;
// @cmember:(INTERNAL) Posizione della pagina da stampare (vedi <t pagetype>)
pagetype _page_type;
// @cmember:(INTERNAL) Indica se si tratta di una sottosezione
bool _subsection;
// @cmember:(INTERNAL) Puntatore alla sezione soprastante (!= NULL se si è in una sottosezione)
TForm_subsection * _upsection;
// @cmember:(INTERNAL) Array di sottosezioni
TArray _subsections;
// @cmember:(INTERNAL) Lista dei campi da stampare
TArray _item;
// @cmember:(INTERNAL) Numero di ripetizione eseguite
int _repeat_count;
// @cmember:(INTERNAL) Offset delle colonne se COLUMNWISE
int _tab[MAXCOLUMNS];
@ -470,8 +525,12 @@ protected:
static bool special_field_handler(TMask_field&, KEY);
// @cmember Handler dello sheet presente nella maschera di edit della sezione
static bool detail_field_notify (TSheet_field&, int, KEY);
// @cmember Cerca e ritorna l'<p id>-esimo campo nella sezione (funzione ricorsiva usata da find_field)
TForm_item * find_field_everywhere(short id,const TPrint_section *starting) const;
// @cmember Cerca e ritorna la sottosezione <p id> nella sezione
TForm_item * find_field_everywhere(const char *id,const TPrint_section *starting) const;
// @access Public Member
// @access Public Members
public:
// @cmember Ritorna la <c TPrintrow> della riga <p num>
TPrintrow& row(int num);
@ -487,19 +546,37 @@ public:
{ return (TForm_item&)_item[n]; }
// @cmember Cerca e ritorna l'<p id>-esimo campo da stampare
TForm_item& find_field(short id) const;
// @cmember Cerca e ritorna la sottosezione <p id> da stampare
TForm_item& find_field(const char *id) const;
// @cmember Rimuove uno o tutti i campi da stampare (chiama <mf TArray::destroy>)
void destroy_field(int n, bool c = TRUE)
{ _item.destroy(n, c); }
// @cmember Rimuove tutti i campi da stampare (chiama <mf TArray::destroy>)
void destroy_fields()
{ _item.destroy(); }
// @cmember Viene sostiuito il campo di posizione <p n> col campo <p f> (chiama <mf TArray::add>)
// @cmember Viene sostituito il campo di posizione <p n> col campo <p f> (chiama <mf TArray::add>)
void change_field(int n, TForm_item* f);
// @cmember Viene inserito il campo di posizione <p n> col campo <p f> (chiama <mf TArray::insert>)
void insert_field(int n, TForm_item* f);
// @cmember Viene aggiunto i coda alla'array il campo <p f> (chiama <mf TArray::add>)
void add_field(TForm_item* f);
// @cmember Aggiunge una sottosezione
void add_subsection(TForm_subsection * ss) ;
// @cmember Restituisce la sezione numero n
TForm_subsection * subsection(int n) const ;
// @cmember Restituisce il numero di sottosezioni
int subsections() const ;
// @cmember Restituisce il puntatore alla sezione "Padre"
TPrint_section * section_above() const ;
// @cmember Restituisce il puntatore alla sezione "Padre"
TForm_subsection * subsection_above() const ;
// @cmember ricompone le espressioni di FILE GROUP delle sottosezioni contenute
void set_subs_cond(int file,const char *newcond,const char * oldcond);
// @cmember Valuta l'espressione passata risolvendo le variabili
TExpression & eval_expr(TExpression & e, int def_file=0);
// @cmember Ritorna se si tratta di una sezione temporanea
virtual bool& temp()
{ return _temp; };
@ -515,7 +592,9 @@ public:
{ tab(0); return _nfld; }
// @cmember Ritorna l'altezza della sezione
word height() const
{ return _height; }
{ return _height;}
// @cmember Ritorna l'altezza minima delle sottosezioni
word subs_height() const ;
// @cmember Ritorna l'offset della prima colonna
word ofspc() const
{ return _ofspc; }
@ -538,9 +617,15 @@ public:
// @cmember Azzera tutte le righe della sezione di stampa
void reset();
// @cmember Aggiorna tutti i campi e li stampa
// @cmember Aggiorna tutti i campi e li inserisce nel buffer delle righe di stampa
virtual bool update();
// @cmember Legge i campi dal file di testo (vedi <c TScanner>)
// @cmember Aggiorna tutti i campi e li stampa (usata in caso di BODY)
bool update_and_print(bool shown, bool newpage=FALSE);
// @cmember Legge la testata dal file di testo (vedi <c TScanner>)
bool parse_head(TScanner& scanner);
// @cmember Legge i campi della sezione dal file di testo (vedi <c TScanner>)
bool parse_body(TScanner& scanner);
// @cmember Legge la testata e il corpo (chiama parse_head e parse_body)
bool parse(TScanner& scanner);
// @cmember Legge dal record <p rec> altezza e offset prima colonna della sezione
@ -570,12 +655,12 @@ public:
int tab(int col);
// @cmember Annulla (setta a -1) l'offset delle colonne se COLUMNWISE
void reset_tabs();
// @cmember Operatore di assegnamento
// @cmember Operatore di assegnamento
const TPrint_section& operator=(const TPrint_section& ps)
{ return copy(ps); }
// @cmember Costruttore
TPrint_section(TForm* parent, char st, pagetype pt, bool subsection = FALSE);
TPrint_section(TForm* parent, char st, pagetype pt, TForm_subsection *fathersection = NULL);
// @cmember Costruttore
TPrint_section(const TPrint_section& ps)
{ copy(ps); }
@ -600,8 +685,6 @@ class TForm_item : public TObject
// @access:(INTERNAL) Private Member
// @cmember:(INTERNAL) Flag del campo (vedi <c TForm_flags>)
TForm_flags _flag;
// @cmember:(INTERNAL) Gruppi a cui appartiene il campo
TBit_array _group;
// @cmember:(INTERNAL) Special attribuiti al campo (vedi <c TAssoc_array>)
@ -611,6 +694,8 @@ class TForm_item : public TObject
// @access Protected Member
protected:
// @cmember:(INTERNAL) Flag del campo (vedi <c TForm_flags>)
TForm_flags _flag;
// @cmember:(INTERNAL) Sezione da stampare (vedi <c TPrint_section>)
TPrint_section* _section;
// @cmember Identificatore del campo
@ -663,6 +748,10 @@ protected:
// @cmember Copia tutti i membri dell'oggetto base in fi. Viene chiamata dalla <mf TForm_item::dup>
void copy_to_form_item(TForm_item* fi) const;
// @cmember manda il messaggio a tutti i campi appartenenti al gruppo inidcato
// (funzione ricorsiva chiamata da <mf TForm_item::do_message>)
void send_message_to_group(const char * cmd,byte id,const TPrint_section & section, const TPrint_section *starting_section) ;
// @access Public Member
public:
@ -884,5 +973,95 @@ public:
{}
};
class TForm_subsection : public TForm_item
{
TPrint_section _ssec; // sezione di stampa contenente il "corpo" della sottosezione
TString _name;
bool _bigskip; // indicatore di bigskip sui raggruppamenti (salta di gruppo in gruppo)
int _file_id; // ID del file su cui iterare in stampa se previsto
TExpression * _condexpr; // espressione condizionale per la valutazione della sottosezione
// o per individuare il raggruppamento nel file
protected:
virtual void print_on(ostream& out) const;
TForm_subsection * upper_conditional() const ;
public:
virtual TObject* dup() const;
virtual bool parse(TScanner& s);
virtual bool update();
virtual bool edit(TMask& m);
virtual const char* class_name() const { return "SEZIONE"; }
TPrint_section& subsection() { return _ssec; }
// @cmember Ritorna se la sezione è da stampare a inizio di pagina nuova
bool atnewpage() {return _flag.newpage;}
// virtual void show(bool on = TRUE);
// virtual void enable(bool on = TRUE);
void hide() { show(FALSE); }
void disable() { enable(FALSE); }
// @cmember Ritorna il nome della sezione
void name(const char* s) { _name = s; _desc << "Sottosezione " << s; }
const char* name() const { return _name; }
// @cmember Aggiorna e stampa tutti i campi della sezione e delle sezioni contenute
bool set_body(bool showfields=TRUE);
// @cmember restituisce la condizione della sottosezione
const char * condition();
// @cmember restituisce il numero del file associato alla sottosezione
int fileid();
// @cmember imposta la condizione della sottosezione
void setcondition(const char * cond,TTypeexp type=_numexpr);
// @cmember Costruttore
TForm_subsection(TPrint_section* above_section, const char* name = "");
virtual ~TForm_subsection();
};
class TForm_string : public TForm_item
{
TString _str, _picture;
TArray _field;
TToken_string _memo;
protected:
virtual const char* class_name() const { return "STRINGA"; }
virtual void print_body(ostream& out) const;
virtual void print_on(TMask& m);
virtual void read_from(const TMask& m);
virtual bool read_from(const TRectype& rform);
virtual void print_on(TRectype& rform);
virtual void print_on(TToken_string& row);
virtual bool parse_item(TScanner&);
virtual bool read();
virtual bool update();
virtual const char* example() const;
virtual void apply_format(TString & s, const TString & p) const;
virtual TToken_string& memo_info() { return _memo; }
virtual const char* get() const;
bool set(const char*);
TFieldref& field(int i) const { return (TFieldref&)_field[i]; }
public:
virtual TObject* dup() const;
virtual const int fields() { return _field.items();}
virtual const TString& picture() const { return _picture; }
virtual void set_picture(const char* p) { _picture = p; }
virtual void put_paragraph(const char* s);
virtual bool edit(TMask& m);
TForm_string(TPrint_section* section);
virtual ~TForm_string() {}
};
#endif