530 lines
21 KiB
C++
Executable File

#ifndef __MASK_H
#define __MASK_H
#ifndef __MASKFLD_H
#include <maskfld.h>
#endif
#ifndef __STACK_H
#include <stack.h>
#endif
// Numero massimo di righe logiche per maschere
#define MAX_MASK_ROWS 23
class TSheet_field;
class TTree_field;
class TCurrency;
class TButton_tool;
// @doc EXTERNAL
// @type MASK_HANDLER | Prototipo funzione per gestire i tasti speciali all'interno di una maschera.
typedef bool (*MASK_HANDLER)(TMask& mask, KEY key);
// @doc EXTERNAL
// @enum Modalita' di utilizzo della maschera corrente
enum TMaskmode {
NO_MODE, // @emem Nessun modo
MODE_QUERY, // @emem Modalita' di richiesta chiave
MODE_QUERYINS, // @emem Modalita' di richiesta chiave e inserimento dati
MODE_INS , // @emem Modalita' di inserimento dati
MODE_MOD // @emem Modalita' di modifca dati
};
//////////////////////////////////////////////////////////
// TMask scanner
///////////////////////////////////////////////////////////
class TMask_scanner : public TScanner
{
TStack _pages;
public:
void push_win(WINDOW w);
WINDOW peek_win() const;
RCT peek_rct() const;
WINDOW pop_win();
TMask_scanner(const TFilename& n);
};
// @doc EXTERNAL
// @class TMask | Classe per la gestione delle maschere video
//
// @base public | TWindow
class TMask : public TWindow
{
// @author:(INTERNAL) Guido
// @access Protected Member
protected:
// @ccost:(INTERNAL) MAX_PAGES | 16 | Massimo numero di pagine nella maschera
enum { MAX_PAGES = 16 };
// @cmember Gestisce gli eventi della finestra
virtual long handler(WINDOW win, EVENT* ep);
// @access:(INTERNAL) Private Member
private:
// @cmember:(INTERNAL) Windows delle pagine
WINDOW _toolwin, _notebook, _single, _toolbar;
WINDOW _pagewin[MAX_PAGES];
// @cmember:(INTERNAL) Numero della maschera all'interno del file sorgente
int _mask_num;
// @cmember:(INTERNAL) Numero di pagine della maschera
int _pages;
// @cmember:(INTERNAL) Pagina corrente
int _page;
// @cmember:(INTERNAL) Controlla le pagine abilitate
TBit_array _enabled;
// @cmember:(INTERNAL) Modalita' di utilizzo della maschera
int _mode;
// @cmember:(INTERNAL) Numero di campi della maschera
TArray _field;
// @cmember:(INTERNAL) Primo controllo che deve ricevere il focus
int _first_focus;
// @cmember:(INTERNAL) Numero del controllo con il focus
int _focus;
// @cmember:(INTERNAL) Puntatore allo sheet che contiene la maschera (puo' essere NULL)
TSheet_field* _sheet;
// @cmember:(INTERNAL) Handler per gestire i tasti speciali nelle maschere
MASK_HANDLER _handler;
// @cmember:(INTERNAL) Nome del file sorgente contenente la maschera
TFilename _source_file;
// @cmember:(INTERNAL) Nome del file di salvataggio in cui sono scaricati i valori della maschera
TFilename _workfile;
// @cmember:(INTERNAL) Ultimo offset letto nel file di salvataggio
long _lastpos;
// @cmember:(INTERNAL) Array per convertire da id a posizione
TPointer_array _position;
// @cmember:(INTERNAL) Controlla se la maschera deve fare i controlli iniziali di validita' dei campi
bool _should_check;
int _error_severity;
TString _error_message;
short _msg_field;
KEY _msg_key;
// @cmember:(INTERNAL) identificatore del campo da testare per l'autopremimento
short _test_fld;
// @cmember:(INTERNAL) posizione del campo che per ultimo ha testato l'autopremimento
int _last_test;
// @access Protected Member
protected:
TArray& fields_array() { return _field; }
// @cmember Legge i controlli relativi ad un campo
void load_checks() const;
// @cmember Inizializza la maschera (Chiamata quando la maschera parte)
virtual void start_run();
// @cmember Aggiunge una toolbar alla maschera (top or bottom only)
void insert_bar(WINDOW bar);
WINDOW create_book(bool single);
WINDOW create_bar(int height); // if height < 0 then BottomBar else TopBar
// @cmember Aggiunge una pagina alla maschera
void insert_page(WINDOW page, int pos);
WINDOW create_page(const char* title, int pos); // -1 <= pos < MAX_PAGES
// @cmember Inizializza la maschera
void init_mask();
// @cmember Legge la pagina da file
void read_page(TMask_scanner& scanner, bool toolbar);
// @cmember Aggiunge alla maschera tutti i bottoni per la navigazione tra le pagine
void set_tab_buttons(TToken_string& tabs);
// @cmember Ritorna il numero del primo campo attivo della pagina con finestra <p w>
int find_first_active(WINDOW w) const;
// @cmember Ritorna il numero della finestra padre del campo <p f>
int find_parent_page(const TMask_field& f) const;
// @cmember Esegue i check del campo corrente
bool check_current_field() const;
// @cmember Mostra la prossima/precedente pagina
virtual void next_page(int p);
// @cmember Cambia arbitrariamente il nome del file (uso molto raro)
void set_source_file(const char* name) { _source_file = name; }
WINDOW notebook() const { return _notebook; }
// @access Public Member
public:
// @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk)
TMask(const char* filename, int num = 0, int max = MAX_PAGES);
// @cmember Costruttore (crea una maschera vuota con i parametri dati)
TMask(const char* title, int pages, int cols, int rows, int xpos = -1, int ypos = -1, WINDOW parent = NULL_WIN);
// @cmember Costruttore (crea una maschera vuota per leggerla con read_mask)
TMask();
// @cmember Distruttore
virtual ~TMask();
// @cmember Imposta i bit di read_only
void set_locking(TBit_array & read_only, TToken_string & fields, bool on);
// @cmember Legge la maschera da file
void read_mask(const char* name, int num, int max);
// @cmember Legge il campo da file
virtual TMask_field* parse_field(TScanner& scanner);
// @cmember Legge il bottone della toolbar da file
virtual TMask_field* parse_tool(TScanner& scanner);
// Aggiunge un campo all'array _field
void add_field(TMask_field* f);
// @cmember Ritorna l'identificatore della classe maschera
virtual word class_id() const;
// @cmember Ritorna true se la maschera deriva dalla classe <p c>
virtual bool is_kind_of(word c) const;
// @cmember Ritorna il numero della pagina corrente
int curr_page() const { return _page; }
// @cmember Ritorna la finestra della pagina <p> (Usare con attenzione)
WINDOW page_win(int p) const;
// @cmember Ritorna la finestra della pagina corrente
WINDOW curr_win() const;
// @cmember Ritorna il nome del file contentente la maschera
const TFilename& source_file() const { return _source_file; }
// @cmember Ritorna il numero della maschera nel file (> 0 se spreadsheet)
int number() const { return _mask_num; }
// @cmember Aggiunge alla maschera tutti i bottoni Pag.n
void set_default_tab_buttons();
// @cmember Aggiunge runtime un campo testo alla maschera
TMask_field& add_static (short id, int page, const char* prompt, int x, int y, const char* flags = "");
// @cmember Aggiunge runtime un campo stringa alla maschera
TEdit_field& add_string (short id, int page, const char* prompt, int x, int y, int dim, const char* flags = "", int width = 0);
// @cmember Aggiunge runtime un campo numerico alla maschera
TReal_field& add_number (short id, int page, const char* prompt, int x, int y, int dim, const char* flags = "", int ndec = 0);
// @cmember Aggiunge runtime un campo importo alla maschera
TCurrency_field& add_currency (short id, int page, const char* prompt, int x, int y, int dim, const char* flags = "", short driver = 0);
// @cmember Aggiunge runtime un campo data alla maschera
TDate_field& add_date (short id, int page, const char* prompt, int x, int y, const char* flags = "");
// @cmember Aggiunge runtime un campo bottone alla maschera
TButton_field& add_button (short id, int page, const char* prompt, int x, int y, int dx = 9, int dy = 1, const char* flags = "", short bmpup = 0, short bmpdn = 0);
// @cmember Aggiunge runtime un campo boolean alla maschera
TBoolean_field& add_boolean (short id, int page, const char* prompt, int x, int y, const char* flags = "");
TCheckbutton_field& add_checkbutton (short id, int page, const char* prompt, int x, int y, int dx = 9, int dy = 1, const char* flags = "", short bmpup = 0, short bmpdn = 0);
// @cmember Aggiunge runtime un campo radio button alla maschera
TRadio_field& add_radio(short id, int page, const char* prompt, int x, int y, int dx, const char* codes, const char* items, const char* flags = "");
// @cmember Aggiunge runtime un campo memo alla maschera
TMemo_field& add_memo (short id, int page, const char* prompt, int x, int y, int dx = 78, int dy = 4, const char* flags = "");
// @cmember Aggiunge runtime un campo zoom alla maschera
TZoom_field& add_zoom (short id, int page, const char* prompt, int x, int y, int dim, const char* flags = "", int width = 0);
// @cmember Aggiunge runtime un campo lista alla maschera
TList_field& add_list (short id, int page, const char* prompt, int x, int y, int dim, const char* flags = "", const char* codes = NULL, const char* items = NULL);
// @cmember Aggiunge runtime un campo albero
TTree_field& add_tree (short id, int page, int x, int y, int dx, int dy, const char* flags = "");
// @cmember Aggiunge runtime un group box alla maschera
TGroup_field& add_groupbox (short id, int page, const char* prompt, int x, int y, int dx = 78, int dy = 3, const char* flags = "");
// @cmember Aggiunge runtime un bottone alla toolbar
TButton_tool& add_button_tool(short id, const char* prompt, short bmpup);
// @cmember Ritorna il numero di campi della maschera
int fields() const
{ return _field.items(); }
// @cmember Ritorna il numero di sheet della maschera
int sheets() const;
// @cmember Setta la modalita' di utilizzo della maschera
void set_mode(int m)
{ _mode = m; }
// @cmember Ritorna la modalita' corrente di utilizzo della maschera
int mode() const
{ return _mode; }
// @cmember Setta la chiave da testare per l'autopremimento
void set_test_field(short id)
{ if (_test_fld < 0) _test_fld = id; }
void set_focus_field(short id);
virtual void notify_focus_field(short id);
// @cmember Controlla i campi di una maschera (true se tutti validi)
bool check_fields();
// @cmember Esegue il check e i messaggi sul campo <p fld_id> della maschera
virtual void check_field( short fld_id );
// @cmember Forza la chiusura della maschera
virtual bool stop_run(KEY key);
// @cmember Controlla se la maschera puo' essere chiusa (true se puo' esserlo)
virtual bool can_be_closed() const;
// @cmember Permette di aprire una maschera
virtual void open();
// @cmember Permette di chiudere una maschera
virtual void close();
// @cmember Permette di attivare/disattivare tutta la pagina
virtual void activate(bool on = true);
virtual void set_focus();
// @cmember Converte un identificatore di campo nella sua posizione
int id2pos(short id) const;
// @cmember Cerca la posizione di un campo per nome
int field2pos(const char* fieldname) const;
// @cmember Ritorna il campo i-esimo della maschera
TMask_field& fld(int i) const
{ return (TMask_field&)_field[i]; }
// @cmember Ritorna il campo contraddistinto dall'identificatore passato
TMask_field& field(short id) const;
// @cmember Ritorna il campo corrispondente ad id se c'e'
TMask_field* find_by_id(short id) const;
// @cmember Ritorna il campo corrispondente al FIELD fieldname
TMask_field* find_by_fieldname(const char* fieldname) const;
// @cmember Ritorna il campo di edit contraddistinto dall'identificatore passato
TEdit_field& efield(short id) const;
// @cmember Ritorna il campo listbox contraddistinto dall'identificatore passato
TList_field& lfield(short id) const;
// @cmember Ritorna il campo sheet contraddistinto dall'identificatore passato
TSheet_field& sfield(short id) const;
// @cmember Ritorna il campo tree contraddistinto dall'identificatore passato
TTree_field& tfield(short id) const;
// @cmember Setta il campo con una stringa
virtual void set(short fld_id, const char* str, byte hit=0x0);
// @cmember Setta il campo con un reale
void set(short fld_id, const real& num, byte hit=0x0);
// @cmember Setta il campo con una data
void set(short fld_id, const TDate& day, byte hit=0x0);
// @cmember Setta il campo con un valore
void set(short fld_id, long num, byte hit=0x0);
// @cmember Setta il campo con un currency
void set(short fld_id, const TCurrency& num, byte hit=0x0);
// @cmember Setta una tutti i campi che hanno come FIELD <p fld_id>
void set(const char* fld_id, const char* str, byte hit=0x0);
// @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di stringa
virtual const TString& get(short fld_id) const;
// @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di long
long get_long(short fld_id) const;
// @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di int
// (chiama <mf TMask::get_long>)
int get_int(short fld_id) const
{ return (int)get_long(fld_id); }
// @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di bool
bool get_bool(short fld_id) const;
// @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di real
real get_real(short fld_id) const;
// @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di data
TDate get_date(short fld_id) const;
// @cmember Ritorna il contenuto del campo <p fld_id> sotto forma di currency
TCurrency& get_currency(short fld_id, TCurrency& curr) const;
// @cmember Ritorna il contenuto del primo campo attivo campo che ha come FIELD <p fld_id>
const TString& get(const char * fld_id) const;
// @cmember Indica quale campo deve ricevere per primo il focus nella maschera
int first_focus(short id, bool dirty = true);
// @cmember Ritorna il numero del controllo che possiede il focus
TOperable_field& focus_field() const;
// @cmember Disabilita la lettura dei check della maschera
void disable_starting_check()
{ _should_check = false;}
// @cmember Evita che venga chiamata la TWindow
virtual void on_button(short);
// @cmember Assegna una azione al tasto non standard
virtual bool on_key(KEY key);
// @cmember Aggiorna i campi con i valori salvati una volta che non ci sono processi attivi
virtual void on_idle();
// @cmember Aggiorna in tutti campi della maschera, che fanno riferimento ad una ditta,
// con il riferimento alla ditta attuale
virtual void on_firm_change();
// @cmember Abilita/disabilita un campo
virtual void enable(short fld_id, bool on = true);
// @cmember Disabilita un campo (chiama <mf TMask::enable>)
void disable(short fld_id)
{ enable(fld_id, false); }
// @cmember Riporta il cmpo allo stato di abilitazione iniziale
void enable_default(short fld_id = 0);
// @cmember Forza la visualizzazione della pagina p
void show_page(int p);
// @cmember Abilita/disabilita una pagina e tutte le successive
void enable_page(byte p, bool on = true);
// @cmember Disabilita una pagina e tutte le successive (chiama <mf TMask::enable_page>)
void disable_page(byte p)
{ enable_page(p, false); }
// @cmember Controlla se una pagina e' disabilitata (true se disabilitata)
bool page_enabled(byte p) const;
// @cmember Ritorna il numero di chiavi utilizzate nei campi della maschera
word num_keys() const;
// @cmember Abilita/disabilita i campi di una chiave sulla maschera
void enable_key(word key, bool on = true);
// @cmember Disabilita i campi di una chiave sulla maschera (chiama <mf TMask::enable_key>)
void disable_key(word key)
{ enable_key(key, false); }
// @cmember Ritorna il l'identificatore di un campo della chiave <p key>
TEditable_field* get_key_field(word key, bool first) const;
// @cmember Controlla se la chiave <p key> ha un valore significativo
// (true se il valore e' valido)
bool key_valid(word key) const;
// @cmember Permette di mostrare/nascondere un campo (chiama <mf TMask_field::show>)
virtual void show(short fld_id = -1, bool on = true);
// @cmember Permette di nascondere un campo (chiama <mf TMask::show>)
void hide(short fld_id = 0)
{ show(fld_id, false); }
// @cmember Rimette lo stato di default del campo
void show_default(short fld_id = 0);
// @cmember Azzera il campo
void reset(short fld_id = 0);
// @cmember Azzera il campo
void reset(const char* fld_id) { set(fld_id, ""); }
// @cmember Legge, dalla relazione <p TRelation>, i valori del campo con specifica FIELD
virtual void autoload(const TRelation& r);
// @cmember Scrive, dalla relazione <p TRelation>, i valori del campo con specifica FIELD
virtual void autosave(TRelation& r) const;
// @cmember Permette di mandare un tasto ad un campo
void send_key(KEY key, short id, TMask_field* from = NULL);
// @cmember Permette di mandare un handler ad un controllo
virtual void set_handler(short fld_id, CONTROL_HANDLER handler);
// @cmember Permette di mandare un handler ad una maschera
void set_handler(MASK_HANDLER handler);
// @cmember Permette di settare il nome del file di salvataggio
void set_workfile(const char* workfile)
{ _workfile = workfile; _lastpos = 0L;}
// @cmember Salva i valori dei campi della maschera sul file di salvataggio
bool save(bool append = false) const;
// @cmember Legge i valori dei campi della maschera da file di salvataggio
bool load(bool reset = false);
// @cmember Copia i valori dei campi dalla maschera <p m>
void copy_values(const TMask &m);
// @cmember Crea il nome del file dei profili in <p f>
bool make_profile_name(TFilename& f) const;
// @cmember Salva il profilo <p num>
int save_profile(int num = 0, const char* desc = NULL) const;
// @cmember Carica il profilo <p num>
int load_profile(int num = 0, bool reset = true);
// @cmember Elimina il profilo <p num>
bool kill_profile(int num);
// @cmember Carica il defaults dei campi
virtual void load_defaults();
// @cmember Ritorna il primo campo dirty
short dirty() const;
// @cmember Setta lo sheet di cui la maschera gestisce le righe
void set_sheet(TSheet_field* s) { _sheet = s; }
// @cmember Ritorna lo sheet che gestisce la maschera
TSheet_field* get_sheet() const
{ return _sheet; }
// @cmember Ritorna se la maschera e' contenuta in uno sheet (true se contenuta)
bool is_sheetmask() const
{ return _sheet != NULL; }
// @cmember Ritorna true se la maschera non ha modalita' di utilizzo (vedi <t TMaskmode>)
bool no_mode() const
{ return _mode == NO_MODE; }
// @cmember Ritorna true se la maschera e' in modalita' di richiesta (vedi <t TMaskmode>)
bool query_mode() const
{ return _mode == MODE_QUERY || _mode == MODE_QUERYINS; }
// @cmember Ritorna true se la maschera e' in modalita' di modifica (vedi <t TMaskmode>)
bool edit_mode() const
{ return _mode == MODE_MOD; }
// @cmember Ritorna true se la maschera e' in modalita' di inserimento (vedi <t TMaskmode>)
bool insert_mode() const
{ return _mode == MODE_QUERYINS || _mode == MODE_INS; }
// @cmember Ritorna il titolo della maschera
virtual const char* get_caption(TString& str) const;
// @cmember Setta il titolo della maschera
virtual void set_caption(const char* c);
// @cmember Mostra un messaggio d'errore appena possibile
void post_error_message(const char* msg, int severity);
// @cmember Viene eseguita se il campo viene modificato
virtual bool on_dirty(TMask_field& c);
// @cmember Ritorna la pagina identificata da <p w>
int win2page(WINDOW p) const ;
// @cmember Ritorna la finestra della toolbar
WINDOW toolwin() const
{ return _toolwin; }
WINDOW toolbar() const
{ return _toolbar; }
};
// @doc EXTERNAL
// @class TTimed_box | Classe per la gestione dei box di richiesta temporizzati
//
// @base public | TMask
class TTimed_box: public TMask
{
long _timer_delay;
long _timer_id;
short _button_id;
protected:
virtual long handler(WINDOW win, EVENT* ep);
virtual void start_run();
public:
TTimed_box(const char * header,const char * message,int seconds,short button_id,int x,int y);
~TTimed_box();
};
// @doc EXTERNAL
// @class TTimed_breakbox | Classe per la gestione dei box di richiesta interruzione
//
// @base public | TTimed_box
class TTimed_breakbox: public TTimed_box
{
public:
TTimed_breakbox(const char * message,int seconds,int x=40,int y=10);
~TTimed_breakbox();
};
class TYesnoallnone_box: public TMask
{
public:
TYesnoallnone_box(const char * message, int default_key = K_YES);
~TYesnoallnone_box();
};
#define FOR_EACH_MASK_FIELD(__m, __i, __f) \
TMask_field* __f = NULL; \
for (int __i = 0; __i < (__m).fields() && (__f=&(__m).fld(__i))!=NULL; __i++)
#define FOR_EACH_MASK_SHEET(__m, __i, __s) \
TSheet_field* __s = NULL; \
for (int __i = 0; __i < (__m).fields() && (__s=(TSheet_field*)&(__m).fld(__i))!= NULL; __i++) if ((__m).fld(__i).is_sheet())
#endif // __MASK_H