#ifndef __MASK_H #define __MASK_H #ifndef __MASKFLD_H #include #endif 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 }; // @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 void 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(TScanner& 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

int find_first_active(WINDOW w) const; // @cmember Ritorna il numero della finestra padre del campo

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

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

(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

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

void set(const char * fld_id, const char * str, byte hit=0x0); // @cmember Ritorna il contenuto del campo

sotto forma di stringa virtual const TString& get(short fld_id) const; // @cmember Ritorna il contenuto del campo

sotto forma di long long get_long(short fld_id) const; // @cmember Ritorna il contenuto del campo

sotto forma di int // (chiama ) int get_int(short fld_id) const { return (int)get_long(fld_id); } // @cmember Ritorna il contenuto del campo

sotto forma di bool bool get_bool(short fld_id) const; // @cmember Ritorna il contenuto del campo

sotto forma di real real get_real(short fld_id) const; // @cmember Ritorna il contenuto del campo

sotto forma di data TDate get_date(short fld_id) const; // @cmember Ritorna il contenuto del campo

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

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); // @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 ) 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 ) 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 ) void disable_key(word key) { enable_key(key, false); } // @cmember Ritorna il l'identificatore di un campo della chiave

TEditable_field* get_key_field(word key, bool first) const; // @cmember Controlla se la chiave

ha un valore significativo // (TRUE se il valore e' valido) bool key_valid(word key) const; // @cmember Permette di mostrare/nascondere un campo (chiama ) virtual void show(short fld_id = -1, bool on = TRUE); // @cmember Permette di nascondere un campo (chiama ) 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

, i valori del campo con specifica FIELD void autoload(const TRelation& r); // @cmember Scrive, dalla relazione

, i valori del campo con specifica FIELD 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

void copy_values(const TMask &m); // @cmember Crea il nome del file dei profili in

bool make_profile_name(TFilename& f) const; // @cmember Salva il profilo

int save_profile(int num = 0, const char* desc = NULL) const; // @cmember Carica il profilo

int load_profile(int num = 0, bool reset = TRUE); // @cmember Elimina il profilo

bool kill_profile(int num); // @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 ) bool no_mode() const { return _mode == NO_MODE; } // @cmember Ritorna TRUE se la maschera e' in modalita' di richiesta (vedi ) bool query_mode() const { return _mode == MODE_QUERY || _mode == MODE_QUERYINS; } // @cmember Ritorna TRUE se la maschera e' in modalita' di modifica (vedi ) bool edit_mode() const { return _mode == MODE_MOD; } // @cmember Ritorna TRUE se la maschera e' in modalita' di inserimento (vedi ) 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

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 void 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