770a2714f9
Resa protected la TForm::change_number_format(). git-svn-id: svn://10.65.10.50/trunk@2492 c028cbd2-c16b-5b4b-a496-9718f37d4682
432 lines
15 KiB
C++
Executable File
432 lines
15 KiB
C++
Executable File
#ifndef __FORM_H
|
|
#define __FORM_H
|
|
|
|
#ifndef __SCANNER_H
|
|
#include <scanner.h>
|
|
#endif
|
|
|
|
#ifndef __PRINTER_H
|
|
class TPrinter;
|
|
class TPrintrow;
|
|
#endif
|
|
|
|
#ifndef __MASK_H
|
|
class TMask;
|
|
#endif
|
|
|
|
#ifndef __ISAM_H
|
|
class TRectype;
|
|
#endif
|
|
|
|
#ifndef __RELATION_H
|
|
class TRelation;
|
|
class TRelation_description;
|
|
class TCursor;
|
|
#endif
|
|
|
|
#ifndef __ASSOC_H
|
|
#include <assoc.h>
|
|
#endif
|
|
|
|
enum pagetype { odd_page, even_page, first_page, last_page };
|
|
enum bkg_mode { none, testo, graphics } ;
|
|
pagetype char2page(char); // prototipo della funzione che converte dalla notazione carattere al corrispondente enum pagetype
|
|
|
|
class TForm;
|
|
class TMask_field;
|
|
class TSheet_field;
|
|
class TForm_item;
|
|
class TPrint_section;
|
|
|
|
const int MAXCOLUMNS = 32;
|
|
|
|
class TForm : public TObject
|
|
{
|
|
friend class TForm_editor;
|
|
friend class TForm_EC_editor;
|
|
friend class TPrint_section;
|
|
|
|
bkg_mode _background_mode;
|
|
|
|
TString _name; // Profile name
|
|
TString _code; // Profile code
|
|
TString _fontname; // Font name
|
|
int _fontsize; // Font size
|
|
int _x, _y; // Offset validi per tutte le sezioni
|
|
char _char_to_pos; // Carattere utilizzato per il posizionamento dei moduli
|
|
int _ipx, _ipy; // Coordinate del posizionamento iniziale
|
|
int _fpx; // Coordinata del posizionamento finale (la riga e' la stessa)
|
|
bool _dirty; // Flag per ragistrare i parametri(font ed offset)
|
|
|
|
TRelation* _relation; // Can be NULL
|
|
TCursor* _cursor; // Can be NULL
|
|
TRelation_description* _rel_desc; // Can be NULL
|
|
|
|
TArray _head; // Headers
|
|
TArray _body; // Bodies
|
|
TArray _foot; // Footers
|
|
TArray _back; // Graphic backgrounds
|
|
|
|
bool _lastpage; // I am about to print the last page?
|
|
|
|
bool _isnew; // new form
|
|
bool _isbase; // base form (.frm file)
|
|
bool _arrange; // if TRUE perform arranging every time
|
|
int _editlevel; // Edit permission
|
|
TString _desc; // form description
|
|
char _fink[11]; // finkatur characters
|
|
|
|
|
|
static void header_handler(TPrinter& p);
|
|
static void footer_handler(TPrinter& p);
|
|
|
|
const char* get_fincatura() { return _fink; }
|
|
void set_fincatura(const char* s);
|
|
|
|
// come sotto ma per printsection, all'uopo di chiamarle
|
|
// con ricorsiva insistenza
|
|
|
|
protected:
|
|
bool ps_change_date_format(TPrint_section& s, const char* f);
|
|
bool ps_change_number_format(TPrint_section& s, int w, int dec, const char* p);
|
|
TPrint_section* exist(char s, pagetype t, bool create = FALSE); // Can be NULL
|
|
void init(); // inizializza il form
|
|
void read(const char* form, const char* code = "", int editlevel = 0, const char* desc = ""); // carica il form dal file specificato
|
|
|
|
// H = Header, B = Body, F = Footer, R = Relation
|
|
TPrint_section& section(char s, pagetype pos); // La crea se non esiste
|
|
TPrint_section& section(char s, word page = 3); // La crea se non esiste (3 e' una pagina dispari qualsiasi)
|
|
|
|
word height(word page = 1); // Height of a page (the first by default)
|
|
|
|
void print_section(ostream& out, char s) const;
|
|
virtual void print_on(ostream& out) const;
|
|
|
|
bool parse_use(TScanner&);
|
|
bool parse_join(TScanner&);
|
|
|
|
bool parse_description(TScanner&);
|
|
void print_description(ostream& out) const;
|
|
|
|
bool parse_general(TScanner&);
|
|
void print_general(ostream& out) const;
|
|
virtual void extended_parse_general(TScanner&) {} // Used to parse non-standard items in general section
|
|
// Queste due funzioni vengono chiamate per controlli non standard nell'edit della sezione
|
|
virtual void pre_edit_checks(TMask&m, TPrint_section* sec) {}
|
|
virtual bool post_edit_checks(TMask& m, TPrint_section* sec) {return FALSE;}
|
|
|
|
bool read_profile();
|
|
bool write_profile();
|
|
|
|
word page(const TPrinter& p) const;
|
|
void arrange_form();
|
|
|
|
virtual long records() const;
|
|
virtual word set_background(word p, bool u);
|
|
virtual word set_header(word p, bool u);
|
|
virtual word set_body(word p, bool u);
|
|
virtual word set_footer(word p, bool u);
|
|
|
|
public:
|
|
|
|
// genera automaticamente la sezione grafica con colonne fincate
|
|
// parametri: posizione pagina, prima e ultima Y per le righe
|
|
// verticali, array di posizioni riga con 0 per finire
|
|
// ritorna FALSE se non c'e' il body per quella pagina
|
|
bool genera_fincatura(pagetype p, int y1, int y2, const int* rows);
|
|
|
|
// Genera le righe di intestazione colonna alla riga indicata, vale per COLUMNWISE
|
|
// I form_items di intestazione vengono aggiunti alla sezione header di tipo p con ID -1
|
|
bool genera_intestazioni(pagetype p, short y);
|
|
bool print(long from = 0L, long to = -1L);
|
|
|
|
TArray& body() { return _body; }
|
|
TArray& head() { return _head; }
|
|
TArray& foot() { return _foot; }
|
|
TArray& back() { return _back; }
|
|
|
|
const TString& name() const { return _name; }
|
|
const TString& code() const { return _code; }
|
|
|
|
virtual const char* section_mask() { return "ba2100s"; }
|
|
bool edit_level() const { return _editlevel; }
|
|
void set_edit_level(int n) { _editlevel = n; }
|
|
void set_description(const char* s) { _desc = s; }
|
|
|
|
virtual TRelation* relation() const { return _relation; }
|
|
virtual TCursor* cursor() const { return _cursor; }
|
|
TRelation_description& rel_desc() const;
|
|
virtual bool validate(TForm_item& fld, TToken_string& val);
|
|
|
|
TForm_item& find_field(char sec, pagetype pag, short id) const;
|
|
int& offset_x() { return _x; }
|
|
int& offset_y() { return _y; }
|
|
TString& fontname() { return _fontname; }
|
|
int& fontsize() { return _fontsize; }
|
|
char& char_to_pos(){ return _char_to_pos; }
|
|
int& ipx() { return _ipx; }
|
|
int& ipy() { return _ipy; }
|
|
int& fpx() { return _fpx; }
|
|
bool dirty() const { return _dirty; }
|
|
void set_dirty(bool d = TRUE) { _dirty = d; }
|
|
void set_arrange(bool arng = TRUE) { _arrange = arng ; }
|
|
|
|
// cambia il formato di tutte le date nel form
|
|
void change_date_format(const char* f);
|
|
// cambia il formato di tutti i numeri nel form
|
|
virtual void change_number_format(int w, int dec, const char* p);
|
|
// Rilegge la sezione specificata
|
|
bool reread(char sec, pagetype p, bool force=FALSE);
|
|
// editor interface
|
|
TForm_editor& editor() const;
|
|
|
|
// Notifica l'inizio di stampa dell'ultima pagina
|
|
void set_last_page(bool lp) { _lastpage = lp; }
|
|
|
|
// Setta il modo di sfondo (fincatura)
|
|
void set_mode(bkg_mode b);
|
|
bkg_mode mode() { return _background_mode;}
|
|
// if code == NULL it's a base form
|
|
// otherwise it's integrated by a file definition
|
|
TForm();
|
|
TForm(const char* form, const char * code = "", int editlevel = 0, const char* desc = "");
|
|
virtual ~TForm();
|
|
};
|
|
|
|
struct TForm_flags : public TObject
|
|
{
|
|
bool automagic : 1;
|
|
bool enabled : 1;
|
|
bool shown : 1;
|
|
bool dirty : 1;
|
|
bool finkl : 1;
|
|
bool finkr : 1;
|
|
bool memo : 1;
|
|
|
|
protected:
|
|
void print_on(ostream& out) const;
|
|
|
|
public:
|
|
TForm_flags();
|
|
|
|
void set_shown(bool b) { shown = b; }
|
|
void set_finkl(bool b) { finkl = b; }
|
|
void set_finkr(bool b) { finkr = b; }
|
|
void set_memo (bool b) { memo = b; }
|
|
void print_on(TMask& m);
|
|
void read_from(const TMask& m);
|
|
|
|
bool update(const char* s);
|
|
};
|
|
|
|
class TPrint_section : public TArray
|
|
{
|
|
static TMask* _msk;
|
|
|
|
word _height; // Altezza della sezione
|
|
word _ofspc; // Offset prima colonna
|
|
word _ofsvr; // Offset verticale intestazione colonna
|
|
word _nfld; // number of columns if columnwise
|
|
bool _dirty; // Flag di modifica parametri
|
|
bool _columnwise; // Columnwise field specification
|
|
bool _temp; // temporanea (da non salvare)
|
|
|
|
TForm* _form; // Form cui appartiene alla sezione
|
|
char _sec_type; // H, B, F, G
|
|
pagetype _page_type; // Tipo della pagina
|
|
bool _subsection; // e' una sottosezione
|
|
|
|
TArray _item; // Lista dei campi da stampare
|
|
int _repeat_count; // n. ripetizioni eseguite
|
|
|
|
int _tab[MAXCOLUMNS]; // columns offset if columnwise
|
|
|
|
const TPrint_section& copy(const TPrint_section& ps);
|
|
|
|
protected:
|
|
|
|
virtual void print_on(ostream& out) const;
|
|
virtual TForm_item* parse_item(const TString& key);
|
|
TForm_item* parse_item(TScanner& scanner);
|
|
|
|
// handlers for section editing
|
|
static bool detail_field_handler(TMask_field&, KEY);
|
|
static bool special_field_handler(TMask_field&, KEY);
|
|
static bool detail_field_notify (TSheet_field&, int, KEY);
|
|
|
|
public:
|
|
|
|
TPrintrow& row(int num);
|
|
TForm& form() const { return *_form; }
|
|
|
|
TArray& field_array() { return _item; }
|
|
TForm_item& field(int n) const { return (TForm_item&)_item[n]; }
|
|
TForm_item& find_field(short id) const;
|
|
void destroy_field(int n, bool c = TRUE) { _item.destroy(n, c); }
|
|
void destroy_fields() { _item.destroy(); }
|
|
void change_field(int n, TForm_item* f);
|
|
void insert_field(int n, TForm_item* f);
|
|
void add_field(TForm_item* f);
|
|
|
|
virtual bool& temp() { return _temp; };
|
|
virtual bool temp() const { return _temp; };
|
|
|
|
word fields() const { return _item.items(); }
|
|
// returns 0 if not columnwise; means n. of printable fields
|
|
word columns() { tab(0); return _nfld; }
|
|
word height() const { return _height; }
|
|
word ofspc() const { return _ofspc; }
|
|
word ofsvr() const { return _ofsvr; }
|
|
void offset(int& x, int& y);
|
|
void set_repeat_count(int x) { _repeat_count = x; }
|
|
|
|
virtual bool ok() const { return height() > 0 || fields() > 0; }
|
|
|
|
void reset();
|
|
virtual bool update();
|
|
bool parse(TScanner& scanner);
|
|
|
|
bool read_from(const TRectype& rec);
|
|
void print_on(TRectype& rec);
|
|
|
|
bool edit(const char* title);
|
|
char section_type() const { return _sec_type; }
|
|
pagetype page_type() const { return _page_type; }
|
|
|
|
bool dirty() const { return _dirty; }
|
|
void set_dirty(bool d = TRUE) { _dirty = d; }
|
|
bool columnwise() const { return _columnwise; }
|
|
// ritorna l'offset della colonna corrispondente se columnwise
|
|
int tab(int col);
|
|
void reset_tabs();
|
|
|
|
const TPrint_section& operator=(const TPrint_section& ps) { return copy(ps); }
|
|
TPrint_section(TForm* parent, char st, pagetype pt, bool subsection = FALSE);
|
|
TPrint_section(const TPrint_section& ps) { copy(ps); }
|
|
virtual ~TPrint_section();
|
|
};
|
|
|
|
class TForm_item : public TObject
|
|
{
|
|
friend class TPrint_section;
|
|
TPrint_section* _section;
|
|
TForm_flags _flag;
|
|
TBit_array _group;
|
|
TAssoc_array _special;
|
|
bool _temp;
|
|
|
|
protected:
|
|
|
|
short _id, _x, _y, _width, _height, _effective_height, _ofs;
|
|
TString _prompt;
|
|
TString _desc, _col_head;
|
|
TString_array _message;
|
|
|
|
virtual void print_on(ostream& out) const;
|
|
virtual void print_body(ostream& out) const;
|
|
|
|
virtual bool parse_head(TScanner&);
|
|
virtual bool parse_item(TScanner&);
|
|
|
|
TToken_string& message(int m = 0);
|
|
void send_message(const TString& cmd, TForm_item& dest) const;
|
|
bool do_message(int m = 0);
|
|
|
|
void string_at(int x, int y, const char* s);
|
|
|
|
const char* get_special_item(const char* s, int n) const;
|
|
|
|
public:
|
|
|
|
short id() const { return _id; }
|
|
virtual short& id() { return _id; };
|
|
virtual int width() const { return _width; }
|
|
virtual short& width() { return _width; }
|
|
virtual int height() const { return _height; }
|
|
virtual short& height() { return _height; }
|
|
virtual short& ofs() { return _ofs; }
|
|
virtual int effective_height() const { return _effective_height; }
|
|
|
|
virtual bool& temp() { return _temp; };
|
|
virtual bool temp() const { return _temp; };
|
|
bool has_memo() const { return _flag.memo; }
|
|
|
|
// virtual short& x() { return _x; };
|
|
virtual void set_x(short x) {_x=x;}
|
|
virtual short x();
|
|
virtual short& y() { return _y; }
|
|
virtual short y() const { return _y; }
|
|
virtual short get_column() { CHECK(_section->columnwise(),"La sezione non e' COLUMNWISE"); return _x; }
|
|
virtual void set_column(short c) { CHECK(_section->columnwise(),"La sezione non e' COLUMNWISE"); _x = c;}
|
|
virtual const int fields() { return 0;}
|
|
|
|
bool shown() const { return _flag.shown; }
|
|
bool hidden() const { return !_flag.shown; }
|
|
bool enabled() const { return _flag.enabled; }
|
|
bool disabled() const { return !_flag.enabled; }
|
|
bool automagic() const { return _flag.automagic; }
|
|
bool finkl() const { return _flag.finkl; }
|
|
bool finkr() const { return _flag.finkr; }
|
|
bool memo() const { return _flag.memo; }
|
|
|
|
virtual bool parse(TScanner&);
|
|
virtual bool update();
|
|
|
|
virtual void print_on(TMask& m);
|
|
virtual void print_on(TRectype& rform);
|
|
virtual void print_on_sheet_row(TToken_string& t) const;
|
|
|
|
virtual void read_from(const TMask& m);
|
|
virtual bool read_from(const TRectype& rform);
|
|
virtual void read_from(TToken_string& s);
|
|
|
|
virtual bool edit(TMask& m);
|
|
|
|
virtual const char* get() const { return _prompt; }
|
|
virtual bool set(const char* s) { _prompt = s; return TRUE; }
|
|
|
|
// example() ritorna un esempio del formato corrente
|
|
virtual const char* example() const { return ""; }
|
|
|
|
const TString& col_head() const {CHECK(_section->columnwise(),"La sezione non e' COLUMNWISE"); return _col_head;}
|
|
void set_col_head(const char* s) {CHECK(_section->columnwise(),"La sezione non e' COLUMNWISE"); _col_head = s;}
|
|
const TString& prompt() const { return _prompt; }
|
|
void set_prompt(const char* s) { _prompt = s; }
|
|
|
|
virtual TToken_string& memo_info(); // Da' CHECK
|
|
virtual const TString& picture() const; // Da' CHECK
|
|
virtual void set_picture(const char*); // Da' CHECK
|
|
|
|
TPrint_section& section() const { return *_section; }
|
|
TForm& form() const { return _section->form(); }
|
|
TForm_item& find_field(const TString& id) const;
|
|
|
|
void set_dirty(bool d = TRUE) { _flag.dirty = d; }
|
|
bool dirty() const { return _flag.dirty; }
|
|
|
|
bool in_group(byte g) const { return g == 0 || _group[g]; }
|
|
const TString& key() const { return _desc; }
|
|
virtual void print_on(TToken_string& row) const;
|
|
|
|
virtual void show(bool on = TRUE) { _flag.shown = on; }
|
|
void hide() { show(FALSE); }
|
|
virtual void enable(bool on = TRUE);
|
|
void disable() { enable(FALSE); }
|
|
|
|
// variabili personalizzate low-level
|
|
int special_items() const { return _special.items(); }
|
|
TAssoc_array& specials() const { return (TAssoc_array&)_special; }
|
|
|
|
// high-level
|
|
int get_special_names(TString_array& r);
|
|
const char* get_special_value(const char* s) const { return get_special_item(s, 1); }
|
|
const char* get_special_type (const char* s) const { return get_special_item(s, 0); }
|
|
const char* get_special_desc (const char* s) const { return get_special_item(s, 2); }
|
|
|
|
TForm_item(TPrint_section* section);
|
|
virtual ~TForm_item() {}
|
|
};
|
|
|
|
|
|
#endif
|