#ifndef __RELAPP_H #define __RELAPP_H #ifndef __APPLICAT_H #include #endif #ifndef __CONFIG_H #include #endif #ifndef __RELATION_H #include #endif #ifndef __MASK_H #include #endif #define TRANSACTION_RUN "RUN" // Run application (eventually sets firm) #define TRANSACTION_INSERT "INSERT" // Create a new record and fill it #define TRANSACTION_MODIFY "MODIFY" // Load and modify an existing record #define TRANSACTION_DELETE "DELETE" // Delete an existing record #define TRANSACTION_LINK "LINK" // Load an existing record and interactively edit it #define TM_INTERACTIVE 'I' #define TM_AUTOMATIC 'A' // @doc EXTERNAL // @class TRelation_application | Classe per la gestione di una applicazione di manutenzione di uno // o piu' archivi utilizzando una relazione // // @base public | TApplication class TRelation_application : public TSkeleton_application // @author:(INTERNAL) Guido // @access:(INTERNAL) Private Member { // @cmember:(INTERNAL) Maschera corrente dell'applicazione TMask* _mask; // @cmember:(INTERNAL) Primo record TRecnotype _first; // @cmember:(INTERNAL) Ultimo record TRecnotype _last; // @cmember:(INTERNAL) Campo da utilizzare col bottone Ricerca int _search_id; // @cmember:(INTERNAL) Nome del programma chiamante TString _autoins_caller; // @cmember:(INTERNAL) Numero del record nuovo/editato long _recins; // @cmember:(INTERNAL) Indica se e' stato chiamato col messaggio di link byte _lnflag; // @cmember:(INTERNAL) Contiene il codice del campo e il valore fisso TToken_string _fixed; // @cmember:(INTERNAL) Messaggio da passare all'utente per indicare che e' stata fatta la rinumerazione TString _renum_message; // @cmember:(INTERNAL) Nomi dei file .ini con la transazione da eseguire TString_array _trans_ini; // @cmember:(INTERNAL) Numero di file .ini di transazioni int _ntransactions; // @cmember:(INTERNAL) Indice del file .ini di _ini con la transazione da eseguire int _trans_counter; // @cmember:(INTERNAL) Azione della transazione corrente TString _curr_transaction; // @cmember:(INTERNAL) Modalità di esecuzione della transazione corrente (Automatica o interattiva) char _curr_trans_mode; // @cmember:(INTERNAL) Transazione ricevuta da ..... TString _curr_trans_from; // @cmember:(INTERNAL) Flag di cancellazione automatica veloce int _autodelete; // @cmember:(INTERNAL) Flag di navigazione tramite toolbar bool _navigating; private: // @cmember:(INTERNAL) Carica la transazione corrente (protocollo via .ini) bool load_transaction() ; // @cmember:(INTERNAL) Setta i campi fissati da bool filter(); // @cmember:(INTERNAL) Controlla se una chiave e' completa ed esiste su file bool test_key(word k, bool err); // @cmember:(INTERNAL) Abilita la ricerca sulla maschera void enable_query(); // @cmember:(INTERNAL) Setta i limiti void set_limits(byte what = 0x3); // @cmember:(INTERNAL) Abilita i vari bottoni di ricerca della toolbar void set_toolbar(); // @Setta i filtri di lettura void set_key_filter(); // @cmember:(INTERNAL) Posiziona l'applicazione in modo richiesta/inserimento (chiama ) void query_insert_mode() { query_mode(TRUE); } // @cmember:(INTERNAL) Entra in modo inserimento void insert_mode(); // @cmember:(INTERNAL) Cancella il record corrente bool relation_remove(); // @cmember:(INTERNAL) Ritorna il campo di ricerca della maschera TEdit_field& get_search_field() const; // @cmember:(INTERNAL) Permette di autonumerare un record bool autonum(TMask* m, bool rec); // @cmember:(INTERNAL) Controlla se il ha un filtro virtual bool has_filtered_cursor() const { return filtered(); } virtual TCursor& get_filtered_cursor() const; // @cmember:(INTERNAL) Sistema il bottone ricerca se necessario void set_find_button(); // @access Protected Member protected: // TApplication // @cmember Effettua i controlli all'inizio dell'applicazione virtual bool create(); // @cmember Effettua i controlli alla fine dell'applicazione virtual bool destroy(); // @cmember Controlla se e' possibile modificare la ditta corrente durante l'esecuzione dell'applicazione virtual bool firm_change_enabled() const; // @access Protected Member protected: // @cmember Ritorna il descrittore del file principale della relazione TLocalisamfile& file() const { return get_relation()->lfile(); } // @cmember Ritorna il primo record TRecnotype first() const { return _first;} // @cmember Ritorna l'ultimo record TRecnotype last() const { return _last;} // @cmember Ritorna il nome del programma chiamante const TString& autoins_caller() const { return _autoins_caller;} // @cmember:(INTERNAL) Seleziona il nuovo modo e ritorna il vecchio int set_mode(int mode); // @cmember Ciclo principale virtual void main_loop(); // @cmember Inizializzazione dei dati dell'utente virtual bool user_create() pure; // @cmember Distruzione dei dati dell'utente virtual bool user_destroy() pure; // @cmember Fissa i campi non modificabili void set_fixed(); // @cmember Attiva la maschera di ricerca bool search_mode(); // @cmember Attiva la maschera di eliminazione int delete_mode(); // @cmember Entra in modo di ricerca void query_mode(bool pre_ins = FALSE); // @cmember Entra in modo modifica bool modify_mode(); // @cmember Legge i campi chiave della maschera e setta il cursore relativo void setkey(); // @cmember Indica se la futura ritornera' una maschera diversa // dalla corrente. // La richiesta della maschera da utilizzare per ogni fase di lavoro // (ricerca, inserimento, modifica) avviene sempre in due tempi: e // . Cio' serve per gestire correttamente le applicazioni // con maschere multiple. virtual bool changing_mask(int mode) pure; // @cmember Richiede la maschera da usare virtual TMask* get_mask(int mode) pure; // @cmember:(INTERNAL) Salva i contenuti della maschera su file bool save(bool check_dirty); // @cmember Ritorna la relazione da modificare virtual TRelation* get_relation() const pure; // @cmember Legge dalla relazione i valori nella maschera

virtual int read(TMask& m); // @cmember Scrive sulla relazione i valori dalla maschera

virtual int write(const TMask& m); // @cmember Riscrive sulla relazione i valori dalla maschera

virtual int rewrite(const TMask& m); // @cmember Cancella il record corrente virtual bool remove(); // @cmember Richiede una stringa nella forma CAMPO1VALORE1CAMPO2VALORE2... // CAMPOnVALOREn contenente le coppie NUMERO_CAMPO_MASCHERA - VALORE_DA_ASSEGNARE // che descrivono il prossimo codice libero da utilizzare per la autonumerazione. // Nel caso di banale numerazione progressiva potrebbe essere implementata come // return format("%d%s", F_NUM, get_relation()-items()); virtual const char* get_next_key() { return ""; } virtual bool get_next_key(TToken_string& key) { return FALSE; } // @cmember Richiede se il record corrente e' protetto (non cancellabile) virtual bool protected_record(TRectype&) { return FALSE; } // @cmember Richiede se il record corrente e' protetto (non cancellabile) virtual bool protected_record(TRelation &); // @cmember Inizializza la maschera per il modo ricerca virtual void init_query_mode(TMask&) { } // @cmember Inizializza la maschera per il modo ricerca ed inserimento (chiama ) virtual void init_query_insert_mode(TMask& m) { init_query_mode(m); } // @cmember Inizializza la maschera per il modo inserimento virtual void init_insert_mode(TMask&) { } // @cmember Inizializza la maschera per il modo modifica virtual void init_modify_mode(TMask&) { } // @cmember Indica se abilitare/disabilitare la scrittura sul file // principale (vedi ) virtual void write_enable(bool on = TRUE) { get_relation()->write_enable(0, on); } // @cmember Indica se disabilitare la scrittura sul file principale (vedi ) void write_disable() { write_enable(FALSE); } // @cmember Salva il record corrente e si predispone per un nuovo inserimento virtual bool save_and_new() const; // @cmember Impone il campo da utilizzare col bottone Ricerca void set_search_field(short id) { _search_id = id;} byte autodeleting() const { return _autodelete; } bool navigating() const { return _navigating; } bool parse_command_line(); void ini2query_mask(); void ini2insert_mask(); void edit_mask2ini(); virtual void ini2sheet(TConfig& ini, TSheet_field &sheet); virtual void sheet2ini(TSheet_field &sheet,TConfig& ini); virtual void ini2mask(TConfig& ini, TMask& m, bool query); virtual void mask2ini(const TMask& m, TConfig& ini); virtual bool mask2mail(const TMask& m); // @access Public Member public: // @cmember Ricalcola l'attivazione dei bottoni di navigazione void update_navigation_bar(); // @cmember Ritorna la maschera corrente TMask& curr_mask() const { return *_mask; } // @cmember Ritorna se sono stati posti dei filtri sul file corrente bool filtered() const { return _fixed.not_empty(); } // @cmember Cerca un record corrispondente alla chiave

(0 prima chiave completa) bool find(word key = 0); // @cmember Costruisce il membro void set_link(TMask & m, const char * keyexpr); // @cmember Ritorna TRUE se e' stato chiamato col messaggio di link bool lnflag() const { return _lnflag != 0;} // qui virtual word class_id() const { return CLASS_RELATION_APPLICATION; } // @cmember Ritorna TRUE se e' una transazione bool is_transaction() const { return _curr_transaction.not_empty(); } // @cmember Costruttore TRelation_application(); // @cmember Distruttore virtual ~TRelation_application(); }; #endif