From 0a2e2fd9091900b89445030b7fe5b2373f684cac Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 2 Dec 1994 13:30:45 +0000 Subject: [PATCH] Corretti problemi di triplo click e aggiunda validazione dei nomi dei file git-svn-id: svn://10.65.10.50/trunk@722 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/bagn001a.uml | 260 ++++++++++---------- include/controls.cpp | 2 +- include/defmask.h | 182 +++++++------- include/mailbox.cpp | 15 +- include/mask.cpp | 9 +- include/mask.h | 389 +++++++++++++++-------------- include/maskfld.cpp | 29 ++- include/msksheet.cpp | 59 ++--- include/printer.cpp | 37 +-- include/real.cpp | 10 +- include/real.h | 322 ++++++++++++------------ include/relapp.cpp | 38 ++- include/relapp.h | 226 ++++++++--------- include/relation.cpp | 23 +- include/sheet.cpp | 34 ++- include/strings.cpp | 42 ++++ include/strings.h | 574 ++++++++++++++++++++++--------------------- include/validate.cpp | 18 +- include/viswin.cpp | 19 +- include/xvtility.cpp | 9 +- 20 files changed, 1182 insertions(+), 1115 deletions(-) diff --git a/include/bagn001a.uml b/include/bagn001a.uml index 683dc2d37..7784fa349 100755 --- a/include/bagn001a.uml +++ b/include/bagn001a.uml @@ -1,128 +1,132 @@ -#include - -PAGE "IMPOSTAZIONE STAMPANTE" -1 -1 76 13 - -RADIOBUTTON MSK_1_TYPE 70 -BEGIN - PROMPT 1 1 "Stampa su..." - HELP "Selezionare il tipo dove direzionare la stampa" - ITEM "0|Stampante" - MESSAGE HIDE,MSK_1_FILENAME|RESET,MSK_1_FILENAME|SHOW,MSK_1_PRINTERS - MESSAGE ENABLE,MSK_1_PRINTERS - MESSAGE ENABLE,MSK_1_CODES - MESSAGE ENABLE,MSK_1_SIZE - MESSAGE ENABLE,MSK_1_LINES - MESSAGE ENABLE,DLG_SETPRINT - ITEM "2|Visualizzazione" - MESSAGE HIDE,MSK_1_FILENAME|RESET,MSK_1_FILENAME - MESSAGE SHOW,MSK_1_PRINTERS|DISABLE,MSK_1_PRINTERS - MESSAGE DISABLE,MSK_1_CODES - MESSAGE DISABLE,MSK_1_SIZE - MESSAGE DISABLE,MSK_1_LINES - MESSAGE DISABLE,DLG_SETPRINT - ITEM "1|File su disco" - MESSAGE SHOW,MSK_1_FILENAME|HIDE,MSK_1_PRINTERS - MESSAGE ENABLE,MSK_1_CODES - MESSAGE DISABLE,MSK_1_SIZE - MESSAGE DISABLE,MSK_1_LINES - MESSAGE DISABLE,DLG_SETPRINT - FLAGS "Z" -END - -LIST MSK_1_PRINTERS 50 -BEGIN - /* viene riempito a run-time con nomi letti da config */ - PROMPT 4 5 "Stampante " - HELP "Selezionare il tipo di stampante desiderata" -END - -STRING MSK_1_FILENAME 52 -BEGIN - PROMPT 4 5 "Nome file " - HELP "Nome del file su cui direzionare la stampa" -END - -LIST MSK_1_CODES 40 -BEGIN - PROMPT 4 6 "Tipo stampa " - /* pure */ - HELP "Modalita' nelle quale si desidera la stampa" -END - -LIST MSK_1_SIZE 3 -BEGIN - PROMPT 31 6 "Carattere " - ITEM "7|7" - ITEM "8|8" - ITEM "10|10" - ITEM "12|12" - ITEM "15|15" - ITEM "17|17" - HELP "Dimensioni del carattere di stampa" -END - -LIST MSK_1_LINES 3 -BEGIN - PROMPT 52 6 "Linee/Inch " - ITEM "4|4" - ITEM "5|5" - ITEM "6|6" - ITEM "7|7" - ITEM "8|8" - ITEM "9|9" - ITEM "10|10" - HELP "Numero di linee per pollice" -END - -LIST MSK_1_FONT 10 -BEGIN - PROMPT 4 6 "Font " - HELP "Font di stampa su video o stampante" - ITEM "1|Courier" - FLAGS "D" -END - -NUMBER MSK_1_NPAGES 3 0 -BEGIN - PROMPT 54 8 "N.o copie " - HELP "Numero di copie da fare" -END - -BOOLEAN MSK_1_ISGRAPHICS -BEGIN - PROMPT 4 8 "Stampa elementi grafici" - HELP "Indicare se stampare elementi grafici (linee, box, logo) quando la stampante lo consente" -END - - -GROUPBOX DLG_NULL 74 4 -BEGIN - PROMPT 1 9 "" -END - -BUTTON DLG_SETPRINT 9 2 -BEGIN - PROMPT -14 -2 "~Imposta" - HELP "Chiama l'Impostazione Stampante di Windows" - MESSAGE EXIT,DLG_SETPRINT -END - -BUTTON DLG_SAVEREC 9 2 -BEGIN - PROMPT -24 -2 "~Registra" - MESSAGE EXIT,K_INS -END - -BUTTON DLG_OK 9 2 -BEGIN - PROMPT -34 -2 "" -END - -BUTTON DLG_CANCEL 9 2 -BEGIN - PROMPT -44 -2 "" -END - -ENDPAGE - -ENDMASK +#include + +PAGE "IMPOSTAZIONE STAMPANTE" -1 -1 76 13 + +RADIOBUTTON MSK_1_TYPE 1 70 +BEGIN + PROMPT 1 1 "Stampa su..." + HELP "Selezionare il tipo dove direzionare la stampa" + ITEM "0|Stampante" + MESSAGE HIDE,MSK_1_FILENAME + MESSAGE SHOW,MSK_1_PRINTERS|ENABLE,MSK_1_PRINTERS + MESSAGE ENABLE,MSK_1_CODES + MESSAGE ENABLE,MSK_1_SIZE + MESSAGE ENABLE,MSK_1_LINES + MESSAGE ENABLE,DLG_SETPRINT + ITEM "2|Visualizzazione" + MESSAGE HIDE,MSK_1_FILENAME + MESSAGE SHOW,MSK_1_PRINTERS|DISABLE,MSK_1_PRINTERS + MESSAGE DISABLE,MSK_1_CODES + MESSAGE DISABLE,MSK_1_SIZE + MESSAGE DISABLE,MSK_1_LINES + MESSAGE DISABLE,DLG_SETPRINT + ITEM "1|File su disco" + MESSAGE SHOW,MSK_1_FILENAME + MESSAGE HIDE,MSK_1_PRINTERS + MESSAGE ENABLE,MSK_1_CODES + MESSAGE DISABLE,MSK_1_SIZE + MESSAGE DISABLE,MSK_1_LINES + MESSAGE DISABLE,DLG_SETPRINT + FLAGS "Z" +END + +LIST MSK_1_PRINTERS 50 +BEGIN + /* viene riempito a run-time con nomi letti da config */ + PROMPT 4 5 "Stampante " + HELP "Selezionare il tipo di stampante desiderata" +END + +STRING MSK_1_FILENAME 52 +BEGIN + PROMPT 4 5 "Nome file " + CHECKTYPE REQUIRED + VALIDATE FILENAME_FUNC + FLAGS "A" + HELP "Nome del file in cui memorizzare la stampa" + WARNING "E' necessario specificare un nome di file" +END + +LIST MSK_1_CODES 40 +BEGIN + PROMPT 4 6 "Tipo stampa " + HELP "Modalita' nelle quale si desidera la stampa" +END + +LIST MSK_1_SIZE 3 +BEGIN + PROMPT 31 6 "Carattere " + ITEM "7|7" + ITEM "8|8" + ITEM "10|10" + ITEM "12|12" + ITEM "15|15" + ITEM "17|17" + HELP "Dimensioni del carattere di stampa" +END + +LIST MSK_1_LINES 3 +BEGIN + PROMPT 52 6 "Linee/Inch " + ITEM "4|4" + ITEM "5|5" + ITEM "6|6" + ITEM "7|7" + ITEM "8|8" + ITEM "9|9" + ITEM "10|10" + HELP "Numero di linee per pollice" +END + +LIST MSK_1_FONT 10 +BEGIN + PROMPT 4 6 "Font " + HELP "Font di stampa su video o stampante" + ITEM "1|Courier" + FLAGS "D" +END + +NUMBER MSK_1_NPAGES 3 0 +BEGIN + PROMPT 54 8 "N.o copie " + HELP "Numero di copie da fare" +END + +BOOLEAN MSK_1_ISGRAPHICS +BEGIN + PROMPT 4 8 "Stampa elementi grafici" + HELP "Indicare se stampare elementi grafici (linee, box, logo) quando la stampante lo consente" +END + + +GROUPBOX DLG_NULL 74 4 +BEGIN + PROMPT 1 9 "" +END + +BUTTON DLG_SETPRINT 9 2 +BEGIN + PROMPT -14 -2 "~Imposta" + HELP "Chiama l'Impostazione Stampante di Windows" + MESSAGE EXIT,DLG_SETPRINT +END + +BUTTON DLG_SAVEREC 9 2 +BEGIN + PROMPT -24 -2 "~Registra" + MESSAGE EXIT,K_INS +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -34 -2 "" +END + +BUTTON DLG_CANCEL 9 2 +BEGIN + PROMPT -44 -2 "" +END + +ENDPAGE + +ENDMASK diff --git a/include/controls.cpp b/include/controls.cpp index f53196c75..dde7854e2 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -598,7 +598,7 @@ TPush_button::TPush_button(short left, short top, short right, short bottom, _accel *= CHARX; _dx = (width - win_get_text_width(win(), (char*)caption(), -1)) >> 1; - _dy = byte((height-CHARY)/2 + BASEY); + _dy = byte((height-CHARY)/2 + BASEY - DEPTH); } } diff --git a/include/defmask.h b/include/defmask.h index 125a0c186..6733dec27 100755 --- a/include/defmask.h +++ b/include/defmask.h @@ -1,90 +1,92 @@ -#ifndef __DEFMASK_H -#define __DEFMASK_H - -/* @M - Identificativi predefiniti dei controlli di XVT - */ -#define DLG_NULL -1 -#define DLG_OK 1 /* TAG del bottone */ -#define DLG_CANCEL 2 /* TAG del bottone */ -#define DLG_PGDN 5 /* TAG del bottone */ -#define DLG_PGUP 6 /* TAG del bottone */ -#define DLG_PAGE 7 /* TAG del bottone */ -#define DLG_PAGETAGS 8 /* TAG del bottone */ -#define DLG_QUIT 9 /* TAG del bottone */ -#define DLG_F9 10 /* TAG del bottone */ -#define DLG_FIRSTREC 11 /* TAG del bottone */ -#define DLG_PREVREC 12 /* TAG del bottone */ -#define DLG_STOPREC 13 /* TAG del bottone */ -#define DLG_NEXTREC 14 /* TAG del bottone */ -#define DLG_LASTREC 15 /* TAG del bottone */ -#define DLG_NEWREC 16 /* TAG del bottone */ -#define DLG_DELREC 17 /* TAG del bottone */ -#define DLG_SAVEREC 18 /* TAG del bottone */ -#define DLG_FINDREC 19 /* TAG del bottone */ -#define DLG_BAR 20 /* TAG del bottone == */ -#define DLG_SELECT 21 /* TAG del bottone */ -#define DLG_EDIT 22 /* TAG del bottone Edit */ -#define DLG_LINK 23 /* TAG del bottone Collega (applicazione) */ -#define DLG_PRINT 24 /* TAG del bottone Stampa */ -#define DLG_SETPRINT 25 /* TAG del bottone Imposta Stampa */ -#define DLG_USER 100 /* TAG del primo controllo definito dall'utente */ - -/* @M - Funzioni di libreria per i validate delle maschere - Nome descrizione Parametri - NUM_EXPR espressione numerica espressione - STR_EXPR espressione stringa espressione - NOT_EMPTY_FUNC campo non vuoto - FIXLEN_FUNC lunghezza fissa lunghezza - EMPTYCOPY_FUNC data id del campo da cui copiarsi se vuoto - DATE_CMP_FUNC compara due date operatore,id.campo con l'altra - data - PI_FUNC controllo part.IVA ???? - XTPI_FUNC controllo esteso - part.IVA ???? - XTZPI_FUNC controllo esteso - part.IVA anche vuota ???? - CF_FUNC controllo cod.fisc. ???? - XTCF_FUNC controllo esteso - cod.fisc. ???? - XTZCF_FUNC controllo esteso - cod.fisc.anche vuoto ???? - MTCHECK_FUNC mese corretto per - ditta mensile o - trimestrale - REQIF_FUNC richiesto se immesso un campo della lista - n.ro di campi lista di campi... - ONEREQ_FUNC almeno uno non vuoto - n.ro campi lista di campi - CHECK_FIELD esegue il check su di un altro campo - campo - */ - -#define EXPR_FUNC 0 2 -#define EMPTYCOPY_FUNC 1 1 -#define PI_FUNC 2 1 -#define CF_FUNC 3 1 -#define NOT_EMPTY_FUNC 4 0 -#define DATE_CMP_FUNC 5 2 -#define XTPI_FUNC 6 3 -#define XTCF_FUNC 7 4 -#define XTZPI_FUNC 8 3 -#define XTZCF_FUNC 9 4 -#define FIXLEN_FUNC 10 1 -#define MTCHECK_FUNC 11 0 -#define REQIF_FUNC 12 -#define AUTOEXIT_FUNC 13 -#define NUMCALC_FUNC 14 -#define STRCALC_FUNC 15 -#define ONEREQ_FUNC 16 -#define CHECK_FIELD 17 1 - -#define VALEXPR VALIDATE EXPR_FUNC -#define NUM_EXPR VALEXPR 0 -#define STR_EXPR VALEXPR 1 -#define NUM_CALC VALIDATE NUMCALC_FUNC 1 -#define STR_CALC VALIDATE STRCALC_FUNC 1 -#define THIS_FIELD 0 -/* @END */ -#endif // __DEFMASK_H +#ifndef __DEFMASK_H +#define __DEFMASK_H + +/* @M + Identificativi predefiniti dei controlli di XVT + */ +#define DLG_NULL -1 +#define DLG_OK 1 /* TAG del bottone */ +#define DLG_CANCEL 2 /* TAG del bottone */ +#define DLG_PGDN 5 /* TAG del bottone */ +#define DLG_PGUP 6 /* TAG del bottone */ +#define DLG_PAGE 7 /* TAG del bottone */ +#define DLG_PAGETAGS 8 /* TAG del bottone */ +#define DLG_QUIT 9 /* TAG del bottone */ +#define DLG_F9 10 /* TAG del bottone */ +#define DLG_FIRSTREC 11 /* TAG del bottone */ +#define DLG_PREVREC 12 /* TAG del bottone */ +#define DLG_STOPREC 13 /* TAG del bottone */ +#define DLG_NEXTREC 14 /* TAG del bottone */ +#define DLG_LASTREC 15 /* TAG del bottone */ +#define DLG_NEWREC 16 /* TAG del bottone */ +#define DLG_DELREC 17 /* TAG del bottone */ +#define DLG_SAVEREC 18 /* TAG del bottone */ +#define DLG_FINDREC 19 /* TAG del bottone */ +#define DLG_BAR 20 /* TAG del bottone == */ +#define DLG_SELECT 21 /* TAG del bottone */ +#define DLG_EDIT 22 /* TAG del bottone Edit */ +#define DLG_LINK 23 /* TAG del bottone Collega (applicazione) */ +#define DLG_PRINT 24 /* TAG del bottone Stampa */ +#define DLG_SETPRINT 25 /* TAG del bottone Imposta Stampa */ +#define DLG_USER 100 /* TAG del primo controllo definito dall'utente */ + +/* @M + Funzioni di libreria per i validate delle maschere + Nome descrizione Parametri + NUM_EXPR espressione numerica espressione + STR_EXPR espressione stringa espressione + NOT_EMPTY_FUNC campo non vuoto + FIXLEN_FUNC lunghezza fissa lunghezza + EMPTYCOPY_FUNC data id del campo da cui copiarsi se vuoto + DATE_CMP_FUNC compara due date operatore,id.campo con l'altra + data + PI_FUNC controllo part.IVA ???? + XTPI_FUNC controllo esteso + part.IVA ???? + XTZPI_FUNC controllo esteso + part.IVA anche vuota ???? + CF_FUNC controllo cod.fisc. ???? + XTCF_FUNC controllo esteso + cod.fisc. ???? + XTZCF_FUNC controllo esteso + cod.fisc.anche vuoto ???? + MTCHECK_FUNC mese corretto per + ditta mensile o + trimestrale + REQIF_FUNC richiesto se immesso un campo della lista + n.ro di campi lista di campi... + ONEREQ_FUNC almeno uno non vuoto + n.ro campi lista di campi + CHECK_FIELD esegue il check su di un altro campo + campo + FILENAME_FUNC controlla se la stringa e' un nome di file + */ + +#define EXPR_FUNC 0 2 +#define EMPTYCOPY_FUNC 1 1 +#define PI_FUNC 2 1 +#define CF_FUNC 3 1 +#define NOT_EMPTY_FUNC 4 0 +#define DATE_CMP_FUNC 5 2 +#define XTPI_FUNC 6 3 +#define XTCF_FUNC 7 4 +#define XTZPI_FUNC 8 3 +#define XTZCF_FUNC 9 4 +#define FIXLEN_FUNC 10 1 +#define MTCHECK_FUNC 11 0 +#define REQIF_FUNC 12 +#define AUTOEXIT_FUNC 13 +#define NUMCALC_FUNC 14 +#define STRCALC_FUNC 15 +#define ONEREQ_FUNC 16 +#define CHECK_FIELD 17 1 +#define FILENAME_FUNC 18 + +#define VALEXPR VALIDATE EXPR_FUNC +#define NUM_EXPR VALEXPR 0 +#define STR_EXPR VALEXPR 1 +#define NUM_CALC VALIDATE NUMCALC_FUNC 1 +#define STR_CALC VALIDATE STRCALC_FUNC 1 +#define THIS_FIELD 0 +/* @END */ +#endif // __DEFMASK_H diff --git a/include/mailbox.cpp b/include/mailbox.cpp index 8289803e0..6b7305b72 100755 --- a/include/mailbox.cpp +++ b/include/mailbox.cpp @@ -1,4 +1,4 @@ -// $Id: mailbox.cpp,v 1.7 1994-11-10 14:16:39 alex Exp $ +// $Id: mailbox.cpp,v 1.8 1994-12-02 13:30:03 guy Exp $ #include #include @@ -16,12 +16,13 @@ #define DEF_MSGS_CAPACITY 50 #define MAX_TXT_LEN 200 -TMessage::TMessage(const char* to, const char* sub, const char* text, - const char* from) +TMessage::TMessage(const char* to, const char* sub, + const char* text, const char* from) { - _to = to; _subject = sub; + _to = cmd2name(to); + _subject = sub; _text = text; - _from = (from == NULL || *from == '\0' ? main_app().name() : from); + _from = (from == NULL || *from == '\0') ? main_app().name() : from; _flags = 0x00; _number = -1; } @@ -146,9 +147,7 @@ void TMailbox::send(TMessage& m) ofstream fto(to_path, ios::app); CHECK(fto.good(),"send: trouble opening mailbox file"); - fto << m.from() << '\n' - << m.subject() << '\n' - << m.body() << '\n'; + fto << m.from() << '\n' << m.subject() << '\n' << m.body() << '\n'; fto.close(); } diff --git a/include/mask.cpp b/include/mask.cpp index 9608f0fd8..6c6ee1a93 100755 --- a/include/mask.cpp +++ b/include/mask.cpp @@ -110,7 +110,7 @@ void TMask::control_handler(EVENT* ep) } void TMask::handler(WINDOW win, EVENT* ep) -{ +{ switch (ep->type) { case E_UPDATE: @@ -151,7 +151,7 @@ void TMask::handler(WINDOW win, EVENT* ep) w = f->win(); if (test_focus_change(w)) f->on_key(K_F9); // Attiva ricerca sul campo associato al bottone - } + } break; default: control_handler(ep); @@ -955,10 +955,11 @@ void TMask::reset(short fld_id) for (int f = 0; f < fields(); f++) { TMask_field& c = fld(f); + c._flags.dirty = FALSE; c.reset(); - c.set_dirty(FALSE); } - } else field(fld_id).reset(); + } + else field(fld_id).reset(); } diff --git a/include/mask.h b/include/mask.h index a3be95324..e045826bc 100755 --- a/include/mask.h +++ b/include/mask.h @@ -1,195 +1,194 @@ -#ifndef __MASK_H -#define __MASK_H - -#ifndef __WINDOW_H -#include -#endif - -#ifndef __MASKFLD_H -#include -#endif - -#ifndef __REAL_H -#include -#endif - - -// @T -typedef bool (*MASK_HANDLER)(TMask& mask, KEY key); -enum TMaskmode { NO_MODE, MODE_INS , MODE_MOD , MODE_DEL , - MODE_VIS , MODE_QUERY, MODE_QUERYINS, - MODE_SEARCH }; -// @END - -// @C -// Classe TMask : public TWindow -// @END - -class TMask : public TWindow -{ - // @DPRIV - enum { MAX_PAGES = 12 }; // Massimo numero di pagine nella maschera - WINDOW _pagewin[MAX_PAGES+1]; // Windows of the pages - WINDOW _pagepag[MAX_PAGES]; // Windows of pgup/pgdn - WINDOW _pagetag[MAX_PAGES]; // Windows of pagetags - - int _pages; // Number of pages of the mask - int _page; // Current page - - TBit_array _enabled; // Are pages enabled - int _mode; // Mode of the mask - TArray _field; // Fields in the mask - - int _first_focus; // First control to have focus - int _focus; // Control with focus - int _sheets; // Number of sheets - - MASK_HANDLER _handler; // User defined key handler - - TFilename _source_file; // Source file of the mask - TFilename _workfile; // Name of savefile - long _lastpos; // last read offset on savefile - - real _exchange; // Current value exhange - bool _sheetmask; // Mask owned by a sheet - -protected: - // Ritorna la finestra della pagina corrente (Usare con attenzione) - WINDOW win() const { return _page == -1 ? NULL_WIN : _pagewin[_page]; } - WINDOW toolwin() const { return _pagewin[MAX_PAGES]; } - - int find_field_win(WINDOW win) const; // number of field with window win - - void set_mask_fields() const; // update screen - - void load_checks() const; // load checks related fields - virtual void start_run(); // called when the mask starts to run - virtual TMask_field* parse_field(TScanner& scanner); - - void init_mask(); - WINDOW read_page(TScanner& scanner, bool toolbar = FALSE); - void read_mask(const char* name, int num, int max); - void add_buttons(); - - int find_parent_page(const TMask_field&) const; - int find_first_field(WINDOW w, int dir) const; - int find_active_field(int first, int dir) const; - bool check_current_page(); // Check all the fields on the current page - void next_page(int p); // Show next/previous page - int curr_page() const { return _page; } // Current page number - - bool test_focus_change(WINDOW w = NULL_WIN); - void control_handler(EVENT* ep); - void handler(WINDOW win, EVENT* ep); - -public: - // @FPUB - // crea leggendo descrizione da file .msk - TMask(const char* name, int num = 0, int max = MAX_PAGES); - - // crea mask vuota con parametri dati - TMask(const char* title, int pages, int cols, int rows, int xpos = -1, - int ypos = -1); - - virtual ~TMask(); - - const TFilename& source_file() const { return _source_file; } - - // aggiunta campi a runtime - void add_static (short id, int page, const char* prompt, int x, int y, - const char* flags = ""); - void add_string (short id, int page, const char* prompt, int x, int y, - int dim, const char* flags = "", int width = 0); - void add_number (short id, int page, const char* prompt, int x, int y, - int dim, const char* flags = "", int ndec = 0); - void add_date (short id, int page, const char* prompt, int x, int y, - const char* flags = ""); - void add_button (short id, int page, const char* prompt, int x, int y, - int dx = 9, int dy = 1, const char* flags = ""); - - void add_radio(short id, int page, const char* prompt, int x, int y, - int dx, const char* codes, const char* items, const char* flags = ""); - - int fields() const { return _field.items(); } - int sheets() const { return _sheets; } - - void set_mode(int m) { _mode = m; } - int mode() const { return _mode; } - - void set_exchange(bool show_value, const real& nuo); - const real& exchange() const { return _exchange; } - - bool check_fields(); - void get_mask_fields(); // read screen contents - virtual bool stop_run(KEY key); // called to close the mask - virtual bool can_be_closed() const; - - virtual void open(); - virtual void close(); - virtual void enable(bool on) const; - - int id2pos(short id) const; - TMask_field& fld(int i) const { return (TMask_field&)_field[i]; } // Ritorna il campo i-esimo della maschera - TMask_field& field(short id) const; // field with given id - TEdit_field& efield(short id) const; // edit-field with given id - - void set(short fld_id, const char* str, bool hit=FALSE); - void set(short fld_id, long num, bool hit=FALSE); - const TString& get(short fld_id) const; - long get_long(short fld_id) const; - int get_int(short fld_id) const { return (int)get_long(fld_id); } - bool get_bool(short fld_id) const; - - int first_focus(short id); - void set_focus(); - void move_focus_field(int num); - void set_focus_win(WINDOW win, bool force); - int focus_field() const { return _focus;} - - virtual bool on_key(KEY key); - void on_firm_change(); - - void enable(short fld_id, bool on = TRUE); // Abilita un campo - void disable(short fld_id) { enable(fld_id, FALSE); } - void enable_default(short fld_id = -1); - - void enable_page(byte p, bool on = TRUE); - void disable_page(byte p) { enable_page(p, FALSE); } - bool page_enabled(byte p) const; - - byte num_keys() const; - void enable_key(byte key, bool on = TRUE); - void disable_key(byte key) { enable_key(key, FALSE); } - short get_key_field(byte key, bool first) const; - bool key_valid(int key) const; - - void show(short fld_id = -1, bool on = TRUE); - void hide(short fld_id = -1) { show(fld_id, FALSE); } - void show_default(short fld_id = -1); - - void reset(short fld_id = -1); - void undo(short fld_id = -1); - - void autoload(const TRelation* = NULL); - void autosave(TRelation* = NULL) const; - - void send_key(KEY key, short id, TMask_field* from = NULL); - void set_handler(short fld_id, CONTROL_HANDLER handler); - void set_handler(MASK_HANDLER handler); - void set_workfile(const char* workfile) { _workfile = workfile; _lastpos = 0L;} - bool save(bool append = FALSE) const; - bool load(bool reset = FALSE); - - short dirty() const; // Ritorna il primo campo dirty - bool is_sheetmask() const { return _sheetmask; } - - bool no_mode() const { return _mode == NO_MODE; } - bool query_mode() const { return _mode == MODE_QUERY || _mode == MODE_QUERYINS; } - bool edit_mode() const { return _mode == MODE_MOD; } - bool insert_mode() const { return _mode == MODE_QUERYINS || _mode == MODE_INS; } - - virtual const char* get_caption() const; - virtual void set_caption(const char* c); -}; - -#endif // __MASK_H +#ifndef __MASK_H +#define __MASK_H + +#ifndef __WINDOW_H +#include +#endif + +#ifndef __MASKFLD_H +#include +#endif + +#ifndef __REAL_H +#include +#endif + + +// @T +typedef bool (*MASK_HANDLER)(TMask& mask, KEY key); +enum TMaskmode { NO_MODE, MODE_INS , MODE_MOD , + MODE_VIS , MODE_QUERY, MODE_QUERYINS }; +// @END + +// @C +// Classe TMask : public TWindow +// @END + +class TMask : public TWindow +{ + // @DPRIV + enum { MAX_PAGES = 12 }; // Massimo numero di pagine nella maschera + WINDOW _pagewin[MAX_PAGES+1]; // Windows of the pages + WINDOW _pagepag[MAX_PAGES]; // Windows of pgup/pgdn + WINDOW _pagetag[MAX_PAGES]; // Windows of pagetags + + int _pages; // Number of pages of the mask + int _page; // Current page + + TBit_array _enabled; // Are pages enabled + int _mode; // Mode of the mask + TArray _field; // Fields in the mask + + int _first_focus; // First control to have focus + int _focus; // Control with focus + int _sheets; // Number of sheets + + MASK_HANDLER _handler; // User defined key handler + + TFilename _source_file; // Source file of the mask + TFilename _workfile; // Name of savefile + long _lastpos; // last read offset on savefile + + real _exchange; // Current value exhange + bool _sheetmask; // Mask owned by a sheet + +protected: + // Ritorna la finestra della pagina corrente (Usare con attenzione) + WINDOW win() const { return _page == -1 ? NULL_WIN : _pagewin[_page]; } + WINDOW toolwin() const { return _pagewin[MAX_PAGES]; } + + int find_field_win(WINDOW win) const; // number of field with window win + + void set_mask_fields() const; // update screen + + void load_checks() const; // load checks related fields + virtual void start_run(); // called when the mask starts to run + virtual TMask_field* parse_field(TScanner& scanner); + + void init_mask(); + WINDOW read_page(TScanner& scanner, bool toolbar = FALSE); + void read_mask(const char* name, int num, int max); + void add_buttons(); + + int find_parent_page(const TMask_field&) const; + int find_first_field(WINDOW w, int dir) const; + int find_active_field(int first, int dir) const; + bool check_current_page(); // Check all the fields on the current page + void next_page(int p); // Show next/previous page + int curr_page() const { return _page; } // Current page number + + bool test_focus_change(WINDOW w = NULL_WIN); + void control_handler(EVENT* ep); + void handler(WINDOW win, EVENT* ep); + +public: + // @FPUB + // crea leggendo descrizione da file .msk + TMask(const char* name, int num = 0, int max = MAX_PAGES); + + // crea mask vuota con parametri dati + TMask(const char* title, int pages, int cols, int rows, int xpos = -1, + int ypos = -1); + + virtual ~TMask(); + + const TFilename& source_file() const { return _source_file; } + + // aggiunta campi a runtime + void add_static (short id, int page, const char* prompt, int x, int y, + const char* flags = ""); + void add_string (short id, int page, const char* prompt, int x, int y, + int dim, const char* flags = "", int width = 0); + void add_number (short id, int page, const char* prompt, int x, int y, + int dim, const char* flags = "", int ndec = 0); + void add_date (short id, int page, const char* prompt, int x, int y, + const char* flags = ""); + void add_button (short id, int page, const char* prompt, int x, int y, + int dx = 9, int dy = 1, const char* flags = ""); + + void add_radio(short id, int page, const char* prompt, int x, int y, + int dx, const char* codes, const char* items, const char* flags = ""); + + int fields() const { return _field.items(); } + int sheets() const { return _sheets; } + + void set_mode(int m) { _mode = m; } + int mode() const { return _mode; } + + void set_exchange(bool show_value, const real& nuo); + const real& exchange() const { return _exchange; } + + bool check_fields(); + void get_mask_fields(); // read screen contents + virtual bool stop_run(KEY key); // called to close the mask + virtual bool can_be_closed() const; + + virtual void open(); + virtual void close(); + virtual void enable(bool on) const; + + int id2pos(short id) const; + TMask_field& fld(int i) const { return (TMask_field&)_field[i]; } // Ritorna il campo i-esimo della maschera + TMask_field& field(short id) const; // field with given id + TEdit_field& efield(short id) const; // edit-field with given id + + void set(short fld_id, const char* str, bool hit=FALSE); + void set(short fld_id, long num, bool hit=FALSE); + const TString& get(short fld_id) const; + long get_long(short fld_id) const; + int get_int(short fld_id) const { return (int)get_long(fld_id); } + bool get_bool(short fld_id) const; + + int first_focus(short id); + void set_focus(); + void move_focus_field(int num); + void set_focus_win(WINDOW win, bool force); + int focus_field() const { return _focus;} + + virtual bool on_key(KEY key); + void on_firm_change(); + + void enable(short fld_id, bool on = TRUE); // Abilita un campo + void disable(short fld_id) { enable(fld_id, FALSE); } + void enable_default(short fld_id = -1); + + void enable_page(byte p, bool on = TRUE); + void disable_page(byte p) { enable_page(p, FALSE); } + bool page_enabled(byte p) const; + + byte num_keys() const; + void enable_key(byte key, bool on = TRUE); + void disable_key(byte key) { enable_key(key, FALSE); } + short get_key_field(byte key, bool first) const; + bool key_valid(int key) const; + + void show(short fld_id = -1, bool on = TRUE); + void hide(short fld_id = -1) { show(fld_id, FALSE); } + void show_default(short fld_id = -1); + + void reset(short fld_id = -1); + void undo(short fld_id = -1); + + void autoload(const TRelation* = NULL); + void autosave(TRelation* = NULL) const; + + void send_key(KEY key, short id, TMask_field* from = NULL); + void set_handler(short fld_id, CONTROL_HANDLER handler); + void set_handler(MASK_HANDLER handler); + void set_workfile(const char* workfile) { _workfile = workfile; _lastpos = 0L;} + bool save(bool append = FALSE) const; + bool load(bool reset = FALSE); + + short dirty() const; // Ritorna il primo campo dirty + bool is_sheetmask() const { return _sheetmask; } + + bool no_mode() const { return _mode == NO_MODE; } + bool query_mode() const { return _mode == MODE_QUERY || _mode == MODE_QUERYINS; } + bool edit_mode() const { return _mode == MODE_MOD; } + bool insert_mode() const { return _mode == MODE_QUERYINS || _mode == MODE_INS; } + + virtual const char* get_caption() const; + virtual void set_caption(const char* c); +}; + +#endif // __MASK_H diff --git a/include/maskfld.cpp b/include/maskfld.cpp index a3aa1cd06..3f7db136b 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -1,4 +1,4 @@ -// $Id: maskfld.cpp,v 1.56 1994-12-02 13:07:39 alex Exp $ +// $Id: maskfld.cpp,v 1.57 1994-12-02 13:30:09 guy Exp $ #include #include @@ -1348,7 +1348,7 @@ bool TBrowse::do_insert() #endif TMailbox mail; - TMessage msg(cmd2name(app), MSG_AI, ""); + TMessage msg(app, MSG_AI, ""); mail.send(msg); TExternal_app a(app); @@ -1497,10 +1497,13 @@ switch (k) default: if (k >= K_CTRL) { + const TMask& m = _fld->mask(); const short id = siblings.get_int((k - K_CTRL) << 1); - TEdit_field& ef = (TEdit_field&)_fld->mask().field(id); + TEdit_field& ef = m.efield(id); ef.set_focus(); - ef.send_key(k = K_F9, 0); + k = K_F9; + if (m.is_running()) + ef.send_key(k, 0); } break; } @@ -1552,10 +1555,7 @@ bool TBrowse::check(CheckTime t) bool TBrowse::empty_check() { - const TMaskmode mode = (TMaskmode)field().mask().mode(); - const bool no_check = mode == MODE_SEARCH || field().mask().query_mode(); - - if ( no_check || _fld->check_type() == CHECK_NONE || + if ( field().mask().query_mode() || _fld->check_type() == CHECK_NONE || _fld->check_type() == CHECK_NORMAL) return TRUE; else @@ -1870,7 +1870,7 @@ void TEdit_field::create(WINDOW parent) flags |= CTL_FLAG_INVISIBLE; } _buttonwin = xvt_create_control(WC_PUSHBUTTON, _x+_width+delta, _y, - 2, 1, "*", parent, flags, PTR_LONG(this), DLG_F9); + 2, 1, "*", parent, flags, PTR_LONG(this), DLG_F9); } } @@ -2059,13 +2059,16 @@ bool TEdit_field::on_key(KEY key) break; case K_F9: if (check_enabled()) - { + { + enable_check(FALSE); if (dirty()) set(get()); KEY k = K_ESC; if (_browse) k = _browse->run(); - else if (_sheet) k = _sheet->run(); - else beep(); - if (mask().is_running() && k != K_F9) set_focus(); + else + if (_sheet) k = _sheet->run(); + else beep(); + if (k != K_F9) set_focus(); + enable_check(TRUE); if (k == K_ENTER) { set_dirty(); diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 458de2f88..28be7558c 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -480,21 +480,7 @@ break; case XIE_BUTTON: if (xiev->v.xi_obj->type == XIT_CELL) { - if (_edit_field) - { - const char* val = xi_get_text(xiev->v.xi_obj, NULL, -1); - _edit_field->set(val); // Update current cell - _check_enabled = FALSE; // Disable checks - if (!_row_dirty) notify(_cur_row, K_SPACE); - if (_edit_field->on_key(K_F9)) // Show search sheet - { - mask2str(_cur_row); // Update row - _row_dirty = TRUE; - } - set_front_window(win()); // It seems necessary to make xi_set_focus work properly - xi_set_focus(xiev->v.xi_obj); // Restore focus to cell - _check_enabled = TRUE; // Enable checks - } + dispatch_e_char(win(), K_F9); } else if (xiev->v.xi_obj->type == XIT_LIST) insert(-1); @@ -655,32 +641,40 @@ break; case K_F8: case K_F9: case K_F11: - { - _check_enabled = FALSE; // Disable checks - if (!_row_dirty) notify(_cur_row, K_SPACE); - if (_edit_field->on_key(k)) + if (_check_enabled) { - mask2str(_cur_row); - _row_dirty = TRUE; - } - set_focus_cell(_cur_row, _cur_col); - _check_enabled = TRUE; // Enable checks - } + _check_enabled = FALSE; // Disable checks + if (!_row_dirty) notify(_cur_row, K_SPACE); + if (_edit_field->on_key(k)) + { + mask2str(_cur_row); + _row_dirty = TRUE; + } + else + if (k == K_F9) + { + _edit_field = &_mask.fld(_mask.focus_field()); + const short foca = _edit_field->dlg(); + const int col = (foca - FIRST_FIELD) % 100 +1; + if (col > 0 && col != _cur_col) + { + _cur_col = col; + dispatch_e_char(win(), K_F9); + } + } + set_focus_cell(_cur_row, _cur_col); + _check_enabled = TRUE; // Enable checks + } break; case K_PREV: case K_NEXT: - { - const bool ok = (bool)xi_move_focus(_itf); - if (ok) dispatch_e_char(parent(), k); - } + if (xi_move_focus(_itf)) + dispatch_e_char(parent(), k); break; case K_ESC: - { xi_set_focus(_itf); dispatch_e_char(parent(), K_ESC); - } break; - case K_CTRL+K_PREV: xi_scroll(_list, XI_SCROLL_PGUP); break; @@ -1087,6 +1081,7 @@ TSheet_field::~TSheet_field() void TSheet_field::reset() { _sheet->destroy(); + _sheet->mask().reset(); } // Certified 100% diff --git a/include/printer.cpp b/include/printer.cpp index e1564b693..9a689297a 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -1,6 +1,4 @@ #include -#include -#include #if XVT_OS==XVT_OS_SCOUNIX #include @@ -10,18 +8,20 @@ #include #endif +#include +#include + #define STYLE_NUM 4 +#include +#include +#include #include +#include #include #include -#include -#include -#include -#include #include -#include struct PrDesc { @@ -1157,6 +1157,16 @@ void TPrinter::set() TMask mask ("bagn001a"); TToken_string pn1 (50), pn2 (100); int i; + + if (_printerfile.empty()) + { + _printerfile.tempdir(); +#if XVT_OS == XVT_OS_SCOUNIX + _printerfile << '/'; +#else + _printerfile << '\\'; +#endif + } TFilename defile("printer.def"); #if XVT_OS == XVT_OS_SCOUNIX @@ -1164,6 +1174,8 @@ void TPrinter::set() #endif mask.set_workfile(defile); + mask.set(MSK_1_FILENAME, _printerfile); + mask.set(MSK_1_NPAGES, _ncopies); #if XVT_OS != XVT_OS_WIN @@ -1196,12 +1208,9 @@ void TPrinter::set() mask.set (MSK_1_TYPE, "2"); else mask.set (MSK_1_TYPE, "0"); - + mask.set(MSK_1_PRINTERS, format("%d", _curprn)); mask.set(MSK_1_CODES, format("%d", _curcode)); - mask.set(MSK_1_FILENAME, _printerfile); - mask.set(MSK_1_NPAGES, _ncopies); - KEY k; if ((k = mask.run()) == K_ESC) @@ -1236,7 +1245,6 @@ void TPrinter::set() } break; case 1: // file - _printertype = fileprinter; _printerfile = mask.get (MSK_1_FILENAME); _curcode = atoi (mask.get (MSK_1_CODES)); @@ -1267,8 +1275,6 @@ void TPrinter::set() mask.set(MSK_1_SIZE, _ch_size); mask.set(MSK_1_LINES, _lines_per_inch); - mask.set(MSK_1_NPAGES, _ncopies); - if (_printertype == fileprinter) mask.set (MSK_1_TYPE, "1"); else if (_printertype == screenvis) @@ -1502,9 +1508,6 @@ genera_dischetti () { int r; - warning_box ("Questa procedura richiede %2d dischetti", - _volume); - for (int i = 0; i < _tmp_files.items (); i++) { // Avvisa l'utente di inserire un dischetto diff --git a/include/real.cpp b/include/real.cpp index 08929e86a..ba6d914d7 100755 --- a/include/real.cpp +++ b/include/real.cpp @@ -112,15 +112,13 @@ real & real::operator += (const real & b) real & real::operator += (double a) { - __tmp_real = *this; - adddfd (ptr (), __tmp_real.ptr (), a); + adddfd (ptr (), ptr (), a); return *this; } real & real::operator -= (const real & b) { - __tmp_real = *this; - dsub (ptr (), __tmp_real.ptr (), b.ptr ()); + dsub (ptr (), ptr (), b.ptr ()); return *this; } @@ -235,7 +233,7 @@ char *real ::literals () const TFixed_string risultato (__string, 80); risultato.cut (0); - TString16 centinaia; + TString80 centinaia; for (int migliaia = 0;; migliaia++) { @@ -436,7 +434,7 @@ real & real ::ceil (int prec) dint (&integer, ptr ()); // Extract the integer part if (disgt (ptr (), &integer)) // If positive ... - addid (ptr (), &integer, 1); // add 1 + addid (ptr (), &integer, 1); // ... add 1 else dcpy(ptr(), &integer); // If negative diff --git a/include/real.h b/include/real.h index 374433b88..6304edfe6 100755 --- a/include/real.h +++ b/include/real.h @@ -1,163 +1,159 @@ -#ifndef __REAL_H -#define __REAL_H - -#ifndef GMDOTH -#include -#include -#endif - -#ifndef __IOSTREAM_H -#include -#endif - -#ifndef __STDTYPES_H -#include -#endif - -#ifndef __OBJECT_H -#include -#endif - -#ifndef __ARRAY_H -#include -#endif -// @C -class real : public TObject -{ - // @DPRIV - DEC _dec; - // @END - -protected: - virtual TObject* dup() const; - char* literals() const; - char* points(int decimals = 0) const; - -public: - - static char* eng2ita(char* s); - static char* ita2eng(const char* s); - static bool is_real(const char* n); - - // @FPUB - DEC* ptr() const { return (DEC*)&_dec; } - char* string(int len = 0, int dec = UNDEFINED, char pad = ' ') const; - char* stringa(int len = 0, int dec = UNDEFINED, char pad = ' ') const; - char* string(const char* picture) const; - - int precision() ; - bool is_zero() const; - int sign() const; - long integer() const; // operator int is too dangerous - - real& round(int prec = 0) ; - real& trunc(int prec = 0) ; - real& ceil(int prec = 0); - real& operator =(double a); - real& operator =(const real& b); - real& operator +=(const real& b); - real& operator +=(double a); - real& operator -=(const real& b); - real& operator *=(const real& b); - real& operator /=(const real& b); - bool operator !() const { return is_zero(); } - real operator -() const; - - real(); - real(const real& b); - real(double a); - real(const char* s); - virtual ~real() {} -}; - -/////////////////////////////////////////////////////////// -// Math operators -/////////////////////////////////////////////////////////// - -ostream& operator <<(ostream& out, const real& a) ; -istream& operator >>(istream& in, real& a) ; - -real operator +(const real& a, const real& b) ; -real operator +(double a, const real& b) ; -real operator +(const real& a, double b) ; -real operator -(const real& a, const real& b) ; -real operator -(double a, const real& b) ; -real operator -(const real& a, double b) ; -real operator *(const real& a, const real& b) ; -real operator *(double a, const real& b) ; -real operator *(const real& a, double b) ; -real operator /(const real& a, const real& b) ; -real operator /(double a, const real& b) ; -real operator /(const real& a, double b) ; - -bool operator <(const real& a, const real& b) ; -bool operator <(double a, const real& b) ; -bool operator >(const real& a, const real& b) ; -bool operator >(double a, const real& b) ; -bool operator <=(const real& a, const real& b) ; -bool operator <=(double a, const real& b) ; -bool operator >=(const real& a, const real& b) ; -bool operator >=(double a, const real& b) ; -bool operator ==(const real& a, const real& b) ; -bool operator ==(double a, const real& b) ; -bool operator !=(const real& a, const real& b) ; -bool operator !=(double a, const real& b) ; - -inline bool operator <(const real& a, double b) { return operator >(b, a); } -inline bool operator >(const real& a, double b) { return operator <(b, a); } -inline bool operator <=(const real& a, double b) { return operator >=(b, a); } -inline bool operator >=(const real& a, double b) { return operator <=(b, a); } -inline bool operator ==(const real& a, double b) { return operator ==(b, a); } -inline bool operator !=(const real& a, double b) { return operator !=(b, a); } - -real operator %(const real& a, const long b) ; -void swap(real& a, real& b) ; -real fnc_min(const real& a, const real& b) ; -real fnc_max(const real& a, const real& b) ; -real sqrt(const real& a) ; -real sqr(const real& a) ; -real exp10(const real& a) ; -real pow(const real& a, const real& b) ; -real exp(const real& a) ; -real log10(const real& a) ; -real log(const real& a) ; -real sin(const real& a) ; -real cos(const real& a) ; -real tan(const real& a) ; -real abs(const real& a) ; -extern const real ZERO; - -class TDistrib : public TObject -{ - real _tot; - real _prog; - bool _ready; - TArray _slices; - int _current; - int _decs; - -public: - - void add(real slice); - real get(); - - // se zap e' vero scancella tutte le percentuali immesse - // altrimenti cambia solo il totale - void init(const real& r, bool zap = FALSE); - void operator =(const real& r) { init(r); } - const real& last_slice() const - { - CHECK(_current,"TDistrib: slices not set"); - return (const real&)_slices[_current-1]; - } - - TDistrib(const real& r, int round = UNDEFINED) : - _prog(0.0), _tot(r), _ready(FALSE), - _current(0), _decs(round), _slices(4) - {} - virtual ~TDistrib() {} -}; - - - -#endif // __REAL_H +#ifndef __REAL_H +#define __REAL_H + +#ifndef GMDOTH +#include +#include +#endif + +#ifndef __IOSTREAM_H +#include +#endif + +#ifndef __STDTYPES_H +#include +#endif + +#ifndef __ARRAY_H +#include +#endif +// @C +class real : public TObject +{ + // @DPRIV + DEC _dec; + // @END + +protected: + virtual TObject* dup() const; + char* literals() const; + char* points(int decimals = 0) const; + +public: + + static char* eng2ita(char* s); + static char* ita2eng(const char* s); + static bool is_real(const char* n); + + // @FPUB + DEC* ptr() const { return (DEC*)&_dec; } + char* string(int len = 0, int dec = UNDEFINED, char pad = ' ') const; + char* stringa(int len = 0, int dec = UNDEFINED, char pad = ' ') const; + char* string(const char* picture) const; + + int precision() ; + bool is_zero() const; + int sign() const; + long integer() const; // operator int is too dangerous + + real& round(int prec = 0) ; + real& trunc(int prec = 0) ; + real& ceil(int prec = 0); + real& operator =(double a); + real& operator =(const real& b); + real& operator +=(const real& b); + real& operator +=(double a); + real& operator -=(const real& b); + real& operator *=(const real& b); + real& operator /=(const real& b); + bool operator !() const { return is_zero(); } + real operator -() const; + + real(); + real(const real& b); + real(double a); + real(const char* s); + virtual ~real() {} +}; + +/////////////////////////////////////////////////////////// +// Math operators +/////////////////////////////////////////////////////////// + +ostream& operator <<(ostream& out, const real& a) ; +istream& operator >>(istream& in, real& a) ; + +real operator +(const real& a, const real& b) ; +real operator +(double a, const real& b) ; +real operator +(const real& a, double b) ; +real operator -(const real& a, const real& b) ; +real operator -(double a, const real& b) ; +real operator -(const real& a, double b) ; +real operator *(const real& a, const real& b) ; +real operator *(double a, const real& b) ; +real operator *(const real& a, double b) ; +real operator /(const real& a, const real& b) ; +real operator /(double a, const real& b) ; +real operator /(const real& a, double b) ; + +bool operator <(const real& a, const real& b) ; +bool operator <(double a, const real& b) ; +bool operator >(const real& a, const real& b) ; +bool operator >(double a, const real& b) ; +bool operator <=(const real& a, const real& b) ; +bool operator <=(double a, const real& b) ; +bool operator >=(const real& a, const real& b) ; +bool operator >=(double a, const real& b) ; +bool operator ==(const real& a, const real& b) ; +bool operator ==(double a, const real& b) ; +bool operator !=(const real& a, const real& b) ; +bool operator !=(double a, const real& b) ; + +inline bool operator <(const real& a, double b) { return operator >(b, a); } +inline bool operator >(const real& a, double b) { return operator <(b, a); } +inline bool operator <=(const real& a, double b) { return operator >=(b, a); } +inline bool operator >=(const real& a, double b) { return operator <=(b, a); } +inline bool operator ==(const real& a, double b) { return operator ==(b, a); } +inline bool operator !=(const real& a, double b) { return operator !=(b, a); } + +real operator %(const real& a, const long b) ; +void swap(real& a, real& b) ; +real fnc_min(const real& a, const real& b) ; +real fnc_max(const real& a, const real& b) ; +real sqrt(const real& a) ; +real sqr(const real& a) ; +real exp10(const real& a) ; +real pow(const real& a, const real& b) ; +real exp(const real& a) ; +real log10(const real& a) ; +real log(const real& a) ; +real sin(const real& a) ; +real cos(const real& a) ; +real tan(const real& a) ; +real abs(const real& a) ; +extern const real ZERO; + +class TDistrib : public TObject +{ + real _tot; + real _prog; + bool _ready; + TArray _slices; + int _current; + int _decs; + +public: + + void add(real slice); + real get(); + + // se zap e' vero scancella tutte le percentuali immesse + // altrimenti cambia solo il totale + void init(const real& r, bool zap = FALSE); + void operator =(const real& r) { init(r); } + const real& last_slice() const + { + CHECK(_current,"TDistrib: slices not set"); + return (const real&)_slices[_current-1]; + } + + TDistrib(const real& r, int round = UNDEFINED) : + _prog(0.0), _tot(r), _ready(FALSE), + _current(0), _decs(round), _slices(4) + {} + virtual ~TDistrib() {} +}; + + + +#endif // __REAL_H diff --git a/include/relapp.cpp b/include/relapp.cpp index 9087a91df..7efb3a310 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -1,4 +1,4 @@ -// $Id: relapp.cpp,v 1.35 1994-11-30 09:04:01 guy Exp $ +// $Id: relapp.cpp,v 1.36 1994-12-02 13:30:27 guy Exp $ #include #include #include @@ -644,10 +644,11 @@ bool TRelation_application::save(bool check_dirty) get_relation()->restore_status(); err = rewrite(*_mask); } - + switch(err) { case NOERR: + _recins = get_relation()->lfile().recno(); break; case _isreinsert: warning_box("Esiste gia' un documento con la stessa chiave"); @@ -717,9 +718,9 @@ bool TRelation_application::remove() bool TRelation_application::main_loop() -{ - long recins = -1; - +{ + _recins = -1; + query_mode(); _mask->open_modal(); @@ -753,13 +754,8 @@ bool TRelation_application::main_loop() k = K_QUIT; break; case K_QUIT: - if (save(TRUE)) - { - if (_mask->edit_mode() && - (_autoins_caller.not_empty() || _lnflag)) - recins = file().recno(); - } - else k = K_ENTER; + if (!save(TRUE)) + k = K_ENTER; break; case K_ENTER: if (find(0)) modify_mode(); @@ -768,9 +764,8 @@ bool TRelation_application::main_loop() case K_SAVE: if (save(FALSE)) { - if (_autoins_caller.not_empty() || _lnflag) + if (_autoins_caller.not_empty()) { - recins = file().recno(); k = K_QUIT; } else @@ -835,9 +830,9 @@ bool TRelation_application::main_loop() _mask->set_mode(NO_MODE); - if (recins > 0 && _autoins_caller.not_empty()) + if (autoins_caller().not_empty() && _recins >= 0) { - TMessage msg(_autoins_caller, _lnflag ? MSG_LN : MSG_AI, format("%ld", recins)); + TMessage msg(autoins_caller(), _lnflag ? MSG_LN : MSG_AI, format("%ld", _recins)); msg.send(); } @@ -901,16 +896,15 @@ bool TRelation_application::filter() _lnflag = TRUE; const char* v = body.get(); - - const int max = _mask->fields(); - for (int i = 0; i < max && v != NULL; i++) + TString80 s; + for (int i = 0; v != NULL && i < _mask->fields(); i++) { TMask_field& f = _mask->fld(i); if (f.active() && f.dlg() > 0 && f.in_key(key)) - { - const TString s(v); - _fixed.add(format("%d=%s", f.dlg(), (const char*) s)); + { + s = v; + _fixed.add(format("%d=%s", f.dlg(), (const char*)s)); v = body.get(); } } diff --git a/include/relapp.h b/include/relapp.h index 31a8122da..b85d0c5bf 100755 --- a/include/relapp.h +++ b/include/relapp.h @@ -1,112 +1,114 @@ -#ifndef __RELAPP_H -#define __RELAPP_H - -#ifndef __APPLICAT_H -#include -#endif - -#ifndef __RELATION_H -#include -#endif - -#ifndef __MASK_H -#include -#endif - -class TKey_array; - -class TRelation_application : public TApplication -{ - TMask * _mask; - TKey_array* _maskeys; - TRecnotype _first, _last; - int _search_id; - - TString _autoins_caller; - bool _lnflag; - TToken_string _fixed; - - virtual bool create(); - virtual bool destroy(); - - bool filter(); - bool test_key(byte k, bool err); - bool save(bool check_dirty); - void enable_query(); - void set_toolbar(bool all); - - int set_mode(int mode); // Seleziona il nuovo modo e ritorna il vecchio - void set_limits(byte what = 0x3); - void query_insert_mode() { query_mode(TRUE); } - void insert_mode(); // Entra in modo inserimento - virtual bool main_loop(); // Ciclo principale - bool relation_remove(); // Cancella il record corrente - TMask_field* get_search_field() const; - - bool autonum(TMask* m, bool rec); - bool has_filtered_cursor() const { return filtered() || force_cursor_usage();} - -protected: - TLocalisamfile& file() const { return get_relation()->lfile(); } // File principale della relazione - TRecnotype first() const { return _first;} - TRecnotype last() const { return _first;} - TMask& curr_mask() const { return *_mask; } - const TString& autoins_caller() const { return _autoins_caller;} - virtual bool menu(MENU_TAG m); - - virtual bool user_create() pure; // Inizializzazione dati utente - virtual bool user_destroy() pure; // Distruzione dati utente - - void set_fixed(); // Fissa i campi non modificabili - bool search_mode(); // Attiva la maschera di ricerca - void query_mode(bool pre_ins = FALSE); // Entra in modo ricerca - bool modify_mode(); // Entra in modo modifica - void setkey(); - bool lnflag() const { return _lnflag;} - // La richiesta della maschera da utilizzare per ogni fase di lavoro (ricerca, inserimento, - // modifica avviene sempre in due tempi: changing_mask e get_mask. Cio' serve per gestire - // Correttamente le applicazioni con mashere multiple. La prima funzione serve a sapere se - // la futura get_mask ritornera' una maschera diversa dalla corrente. - virtual bool changing_mask(int mode) pure; - virtual TMask* get_mask(int mode) pure; // Richiede la maschera da usare - - virtual TRelation* get_relation() const pure; // Relazione da modificare - virtual int read(TMask& m); // Legge dalla relazione i valori nella maschera - virtual int write(const TMask& m); // Scrive sulla relazione i valori dalla maschera - virtual int rewrite(const TMask& m); // Riscrive sulla relazione i valori dalla maschera - virtual bool remove(); // Cancella il record corrente - - // Richiede una stringa nella forma CAMPO1|VALORE1|CAMPO2|VALORE2|...|CAMPOn|VALOREn - // 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 ""; } - - // Richiede se il record corrente e' protetto (non cancellabile) - virtual bool protected_record(TRectype&) { return FALSE; } - - virtual void init_query_mode(TMask&) { } // Inizializza la maschera per il modo ricerca - virtual void init_query_insert_mode(TMask& m) { init_query_mode(m); } - virtual void init_insert_mode(TMask&) { } // Inizializza la maschera per il modo inserimento - virtual void init_modify_mode(TMask&) { } // Inizializza la maschera per il modo modifica - - virtual bool force_cursor_usage() const { return FALSE;} - virtual void write_enable(const bool on = TRUE) { get_relation()->write_enable(-1, on); } - void write_disable() { write_enable(FALSE); } - - virtual bool save_and_new() const; - - void set_search_field(short id) { _search_id = id;} // Impone il campo da utilizzare col bottone Ricerca - -public: - TRelation_application(); - virtual ~TRelation_application(); - bool filtered() const { return _fixed.not_empty(); } - bool find(byte key = 0); - void set_link(TMask & m, const char * keyexpr); -}; - -#endif - - +#ifndef __RELAPP_H +#define __RELAPP_H + +#ifndef __APPLICAT_H +#include +#endif + +#ifndef __RELATION_H +#include +#endif + +#ifndef __MASK_H +#include +#endif + +class TKey_array; + +class TRelation_application : public TApplication +{ + TMask * _mask; + TKey_array* _maskeys; + TRecnotype _first, _last; + int _search_id; + + TString16 _autoins_caller; + long _recins; + + bool _lnflag; + TToken_string _fixed; + + virtual bool create(); + virtual bool destroy(); + + bool filter(); + bool test_key(byte k, bool err); + bool save(bool check_dirty); + void enable_query(); + void set_toolbar(bool all); + + int set_mode(int mode); // Seleziona il nuovo modo e ritorna il vecchio + void set_limits(byte what = 0x3); + void query_insert_mode() { query_mode(TRUE); } + void insert_mode(); // Entra in modo inserimento + virtual bool main_loop(); // Ciclo principale + bool relation_remove(); // Cancella il record corrente + TMask_field* get_search_field() const; + + bool autonum(TMask* m, bool rec); + bool has_filtered_cursor() const { return filtered() || force_cursor_usage();} + +protected: + TLocalisamfile& file() const { return get_relation()->lfile(); } // File principale della relazione + TRecnotype first() const { return _first;} + TRecnotype last() const { return _first;} + TMask& curr_mask() const { return *_mask; } + const TString& autoins_caller() const { return _autoins_caller;} + virtual bool menu(MENU_TAG m); + + virtual bool user_create() pure; // Inizializzazione dati utente + virtual bool user_destroy() pure; // Distruzione dati utente + + void set_fixed(); // Fissa i campi non modificabili + bool search_mode(); // Attiva la maschera di ricerca + void query_mode(bool pre_ins = FALSE); // Entra in modo ricerca + bool modify_mode(); // Entra in modo modifica + void setkey(); + bool lnflag() const { return _lnflag;} + // La richiesta della maschera da utilizzare per ogni fase di lavoro (ricerca, inserimento, + // modifica avviene sempre in due tempi: changing_mask e get_mask. Cio' serve per gestire + // Correttamente le applicazioni con mashere multiple. La prima funzione serve a sapere se + // la futura get_mask ritornera' una maschera diversa dalla corrente. + virtual bool changing_mask(int mode) pure; + virtual TMask* get_mask(int mode) pure; // Richiede la maschera da usare + + virtual TRelation* get_relation() const pure; // Relazione da modificare + virtual int read(TMask& m); // Legge dalla relazione i valori nella maschera + virtual int write(const TMask& m); // Scrive sulla relazione i valori dalla maschera + virtual int rewrite(const TMask& m); // Riscrive sulla relazione i valori dalla maschera + virtual bool remove(); // Cancella il record corrente + + // Richiede una stringa nella forma CAMPO1|VALORE1|CAMPO2|VALORE2|...|CAMPOn|VALOREn + // 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 ""; } + + // Richiede se il record corrente e' protetto (non cancellabile) + virtual bool protected_record(TRectype&) { return FALSE; } + + virtual void init_query_mode(TMask&) { } // Inizializza la maschera per il modo ricerca + virtual void init_query_insert_mode(TMask& m) { init_query_mode(m); } + virtual void init_insert_mode(TMask&) { } // Inizializza la maschera per il modo inserimento + virtual void init_modify_mode(TMask&) { } // Inizializza la maschera per il modo modifica + + virtual bool force_cursor_usage() const { return FALSE;} + virtual void write_enable(const bool on = TRUE) { get_relation()->write_enable(-1, on); } + void write_disable() { write_enable(FALSE); } + + virtual bool save_and_new() const; + + void set_search_field(short id) { _search_id = id;} // Impone il campo da utilizzare col bottone Ricerca + +public: + TRelation_application(); + virtual ~TRelation_application(); + bool filtered() const { return _fixed.not_empty(); } + bool find(byte key = 0); + void set_link(TMask & m, const char * keyexpr); +}; + +#endif + + diff --git a/include/relation.cpp b/include/relation.cpp index dbae6a645..a1bfdc459 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -1,4 +1,4 @@ -// $Id: relation.cpp,v 1.24 1994-11-18 17:01:26 guy Exp $ +// $Id: relation.cpp,v 1.25 1994-12-02 13:30:30 guy Exp $ // relation.cpp // fv 12/8/93 // relation class for isam files @@ -98,13 +98,13 @@ TRelationdef::TRelationdef(const TRelation* rel, int idx_file, byte key, s = r.left(eq); // Parte a sinistra dell' = #ifdef DBG - TString80 n(s); - const int p = n.find('['); - if (p > 0) n.cut(p); + const char* n = s; + const int p = s.find('['); + if (p > 0) n = s.left(p); if (rel->file(_num).curr().exist(n) == FALSE) { - error_box("'%s' non e' un campo del file %d", - (const char*)n, rel->file(_num).num()); + yesnofatal_box("Errore di JOIN: '%s' non e' un campo del file %d", + n, rel->file(_num).num()); continue; } #endif @@ -115,9 +115,10 @@ TRelationdef::TRelationdef(const TRelation* rel, int idx_file, byte key, eq++; } - const TString80 xx(s); - _fields.add(new TFieldref(xx,0)); - + // const TString80 xx(s); + // _fields.add(new TFieldref(xx,0)); + _fields.add(new TFieldref(s,0)); + _exprs.add(new TExpression(r.mid(eq+1), _strexpr)); } } @@ -1103,10 +1104,10 @@ int name2log(const char* name) if (name && *name) { - if (isdigit(*name)) + if (isdigit(*name) || *name == '-') { log = atoi(name); - if (strchr(name, '@')) log = -log; + if (strchr(name, '@')) log = -log; } else { diff --git a/include/sheet.cpp b/include/sheet.cpp index 238334a72..0c2af2c74 100755 --- a/include/sheet.cpp +++ b/include/sheet.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -35,7 +34,12 @@ TSheet::TSheet(short x, short y, short dx, short dy, _checkable = _size[0] = 1; else _size[_columns] = l > 0 ? l : item.len(); - } else _size[_columns] = item.len(); + } + else + { + _size[_columns] = item.len(); + _type[_columns] = '\0'; + } item.trim(); new_head.add(item); @@ -309,15 +313,27 @@ bool TSheet::on_key(KEY key) if (_checkable && _check_enabled && items() > 0) { - bool ok = TRUE; + bool force = FALSE; switch(key) { - case K_SPACE: _checked.not(selected()); break; - case K_F2 : uncheck(-1); break; - case K_F3 : check(-1); break; - default : ok = FALSE; break; - } - if (ok) force_update(); + case K_SPACE: + _checked.not(selected()); + set_opaque_text(TRUE); + update_row(selected()); + set_opaque_text(FALSE); + break; + case K_F2: + uncheck(-1); + force = TRUE; + break; + case K_F3: + check(-1); + force = TRUE; + break; + default: + break; + } + if (force) force_update(); } return TScroll_window::on_key(key); } diff --git a/include/strings.cpp b/include/strings.cpp index 6ff1e2bc7..8f620be6e 100755 --- a/include/strings.cpp +++ b/include/strings.cpp @@ -585,6 +585,48 @@ const char* TFilename::path() const return spark; } +bool TFilename::ok() const +{ + const int l = len(); + + int len = 0; // lunghezza ultima sottostringa + bool ext = FALSE; // trovata estensione + + for (int c = 0; c < l; c++) + { + switch(_str[c]) + { +#if XVT_OS != XVT_OS_SCOUNIX + case ':': + if (c != 1 || !isalpha(_str[0])) return FALSE; // Nome disco errato + len = 0; + break; + case '\\': +#endif + case '/': + if (ext) return FALSE; // Slash dopo estensione + if (len > 8) return FALSE; // Nome troppo lungo + if (!isalnum(_str[++c])) return FALSE; + len = 1; + break; + case '.': + if (len == 0 || ext) return FALSE; // Nome nullo o Doppia estensione + ext = TRUE; + len = 0; + c++; + default: + if (isalnum(_str[c])) len++; + else return FALSE; + break; + } + } + + if (ext && len > 3) + return FALSE; + + return len > 0 && len < 9; +} + // Certified 70% const TFilename& TFilename::tempdir() { diff --git a/include/strings.h b/include/strings.h index c0bc7c3f7..00f9e638e 100755 --- a/include/strings.h +++ b/include/strings.h @@ -1,285 +1,289 @@ -#ifndef __STRINGS_H -#define __STRINGS_H - -#ifndef __STRING_H -#include -#endif - -#ifndef __OBJECT_H -#include -#endif - -// @C -// Classe TString : public TObject -// @END - -class TString : public TObject -{ -protected: - // @DPROT - char* _str; // Puntatore alla stringa - int _size; // Lunghezza - // @END - - // @FPROT - int make_room(int size); // Cerca spazio per altri size caratteri - TString& set(const char*); // Inizializza con la stringa puntata da char* di lunghezza size - - TString(char* str, int size) : _str(str), _size(size) {} - -public: - // @FPUB - virtual void resize(int size, bool cpy); // Ri/alloca la stringa - - TString(); - TString(int size); // Default constructor for a string of given size - TString(const char* s); // Costruttore a partire da una stringa s - TString(const TString& s); // Costruttore da un oggetto TString s - virtual ~TString(); // Deallocates the string - - /////////////////////////////////////////////////////////// - // @DES Methods derived from TObject - /////////////////////////////////////////////////////////// - - // @FPUB - virtual const char* class_name() const; // Ritorna il nome della classe - virtual word class_id() const; // Ritorna l'identificatore della classe - virtual bool ok() const { return _str != NULL; } - virtual TObject* dup() const; - virtual void print_on(ostream& out) const; - virtual void read_from(istream& in); - virtual word hash() const; // Return hash value - - /////////////////////////////////////////////////////////// - // @DES Query methods - /////////////////////////////////////////////////////////// - - // @FPUB - operator const char*() const { return (const char*)_str; } // *(TString) -> _str - char& operator[](int i) // TString[i] -> _str[i] - { - CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); - return _str[i]; - } - char operator[](int i) const // TString[i] -> _str[i] - { - CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); - return _str[i]; - } - - int size() const { return _size; } - int len() const { return strlen(_str); } - bool empty() const { return *_str == '\0'; } - bool not_empty() const { return *_str != '\0'; } - - int find(char, int from = 0) const; // Ritorna la posizione del carattere char nell'oggetto TString - int find(const char* s, int from = 0) const; // Ritorna la posizione della stringa s nell'oggetto TString - - const TString& left(int count) const; // Ritorna l'oggetto TString composto dai count caratteri da sinistra - const TString& mid(int from, int count = -1) const; // Ritorna l'oggetto TString composto dai count caratteri a partire da from - const TString& sub(int from, int to = -1) const; // Ritorna la stringa da FROM a TO (escluso) - const TString& right(int count) const; // Ritorna l'oggetto TString composto dai count caratteri da destra - - /////////////////////////////////////////////////////////// - // @DES Modifying methods - /////////////////////////////////////////////////////////// - - // @FPUB - TString& fill(char c, int n = -1); // Riempie con n caratteri c - TString& spaces(int n = -1) { return fill(' ', n); } - TString& overwrite(const char* s, int pos = 0); // Sovrascrive la stringa s dalla posizione pos - TString& insert(const char* s, int pos = 0); // Inserisce la stringa s dalla posizione pos - - TString& strip(const char* k); // Elimina tutti i caratteri contenuti in k - TString& strip_spaces(); // Elimina tutti gli spazi non contenuti tra apici singoli o doppi - TString& ltrim(int n = 0); // Elimina gli spazi da sinistra se n=0 altrimenti elimina i primi n caratteri (da sinistra). - TString& rtrim(int n = 0); // Elimina gli spazi da destra se n=0 altrimenti elimina i primi n caratteri (da destra). - TString& trim(); // ltrim e rtrim - - TString& right_just(int n = -1, char c = ' '); // Giustifica a destra - TString& center_just(int n = -1, char c = ' '); // Centra - TString& left_just(int n = -1, char c = ' '); // Giustifica a sinistra - - TString& picture(const char* pic, const char* s); - virtual TString& format(const char* fmt, ...); - - TString& cut(int n); // Inserisce un '\0' alla posizione n-esima. - - TString& upper(); // Mette la stringa in maiuscolo - TString& lower(); // Mette la stringa in minuscolo - - /////////////////////////////////////////////////////////// - // @DES Standard operators - /////////////////////////////////////////////////////////// - - // @FPUB - const TString& operator =(const TString& s) { return set(s._str); } - const TString& operator =(const char* s) { return set(s); } - - TString& operator <<(const char*); - TString& operator <<(char); - TString& operator <<(int); - TString& operator <<(long); - TString& operator <<(double); - TString& operator <<(const TObject& obj); - TString& operator <<(const TString& str); // For efficiency only - - bool operator ==(const char* s) const { return strcmp(_str, s) == 0; } - bool operator ==(char* s) const { return strcmp(_str, s) == 0; } - bool operator ==(const TString& s) const { return strcmp(_str, s._str) == 0; } - bool operator !=(const char* s) const { return strcmp(_str, s) != 0; } - bool operator !=(char* s) const { return strcmp(_str, s) != 0; } - bool operator !=(const TString& s) const { return strcmp(_str, s._str) != 0; } - bool operator <(const char* s) const { return strcmp(_str, s) < 0; } - bool operator >(const char* s) const { return strcmp(_str, s) > 0; } - bool operator >=(const char* s) const { return strcmp(_str, s) >= 0; } - bool operator <=(const char* s) const { return strcmp(_str, s) <= 0; } - bool match(const char* s) const; - bool compare(const char* s, int max = -1, bool ignorecase = FALSE) const; -}; - -// @C -// Classe TFixed_string : public TString -// @END - -class TFixed_string : public TString -{ -protected: - virtual void resize(int size, bool cpy); // Causa un errore fatale! - -public: - TFixed_string(const char* str, int size = -1); - virtual ~TFixed_string(); - - virtual TString& format(const char* fmt, ...); - - const TString& operator =(const TString& s) { return set((const char*)s); } - const TString& operator=(const char* str) { return set(str); } - void strncpy(const char* s, int n); -}; - -class TString16 : public TFixed_string -{ - char _str16[17]; - -public: - TString16(const char* str = "") : TFixed_string(_str16, 17) { set(str); } - TString16(const TString& s) : TFixed_string(_str16, 17) { set(s); } - const TString& operator =(const TString& s) { return set((const char*)s); } - const TString& operator =(const char* str) { return set(str); } -}; - -class TString80 : public TFixed_string -{ - char _str80[81]; - -public: - TString80(const char* str = "") : TFixed_string(_str80, 81) { set(str); } - TString80(const TString& s) : TFixed_string(_str80, 81) { set(s); } - const TString& operator =(const char* str) { return set(str); } - const TString& operator =(const TString& s) { return set((const char*)s); } -}; - -class TString256 : public TFixed_string -{ - char _str256[257]; - -public: - TString256(const char* str = "") : TFixed_string(_str256, 257) { set(str); } - TString256(const TString& s) : TFixed_string(_str256, 257) { set(s); } - const TString& operator =(const char* str) { return set(str); } - const TString& operator =(const TString& s) { return set((const char*)s); } -}; - - - -// @C -// Classe TFilename : public TString80 (256 su Windows'95) -// @END - -class TFilename : public TString80 -{ -public: - // @FPUB - - TFilename(const char* n = "") : TString80(n) {} - TFilename(const TString& n) : TString80(n) {} - - const TString& operator =(const char* s) { return set(s); } - const TString& operator =(const TString& s) { return set((const char*)s); } - // assegnazione tra TFile e stringa - - const char* ext() const; // Ritorna l'estensione - void ext(const char*); // Imposta come estensione la stringa puntata da char* - - const char* name() const; // Ritorna il nome del file - const char* path() const; // Ritorna il nome del direttorio - const TFilename& temp(const char* prefix = NULL); // Genera il nome di un file temporaneo - const TFilename& tempdir(); // Genera il nome della directory temporanea -}; - -// @C -// Classe TToken_string : public TString -// @END - -class TToken_string : public TString -{ - // @DPRIV - char _separator; // Carattere separatore - int _last; // Puntatore all'ultimo - -protected: - // @FPROT - - virtual TObject* dup() const; // Crea un duplicato della token string - bool set_item(const char* v, int n); - -public: - // @FPUB - TToken_string(const char* = "", char separator = '|'); - TToken_string(int n, char separator = '|'); - TToken_string(const TToken_string& s); - - void separator(char s) { _separator = s; } // Setta il separatore a s - - void restart() { _last = empty() ? -1 : 0; } // Rimette all'inizio il puntatore - const TString& operator =(const char* s) { set(s);restart();return *this; } - const TString& operator =(const TString& s) { set(s);restart();return *this; } - - void add(const char* s, int n = -1); // Aggiunge una stringa - void add(char c, int pos = -1); // Aggiunge un char - void add(long n, int pos = -1); // Aggiunge un intero - void add(int n, int pos = -1); // Aggiunge un intero - void destroy(int pos); // Toglie la stringa pos - const char* get(); // Ritorna il prossimo token - const char* get(int n); // Ritorna un token (-1 = prossimo; -2 = ultimo; n = ennesimo) - char get_char(int n = -1); // Ritorna un carattere - int get_int(int n = -1); // Ritorna un intero - long get_long(int n = -1); // Ritorna un intero esteso - int get_pos(const char* s); // Ritorna la posizione dell'item s - int items() const; // Ritorna il numero di token presenti - bool empty_items() const; // Controlla se tutti i token sono nulli -}; - -/////////////////////////////////////////////////////////// -// @DES Paragraph -/////////////////////////////////////////////////////////// - -class TParagraph_string : public TToken_string -{ - int _width; - bool _fixed; - -protected: - void tokenize(); - -public: - TParagraph_string(const char* s, int width); - const TString& operator =(const char* s); - void set_width(int width) { _width = width; } -}; - -#endif - - - +#ifndef __STRINGS_H +#define __STRINGS_H + +#ifndef __STRING_H +#include +#endif + +#ifndef __OBJECT_H +#include +#endif + +// @C +// Classe TString : public TObject +// @END + +class TString : public TObject +{ +protected: + // @DPROT + char* _str; // Puntatore alla stringa + int _size; // Lunghezza + // @END + + // @FPROT + int make_room(int size); // Cerca spazio per altri size caratteri + TString& set(const char*); // Inizializza con la stringa puntata da char* di lunghezza size + + TString(char* str, int size) : _str(str), _size(size) {} + +public: + // @FPUB + virtual void resize(int size, bool cpy); // Ri/alloca la stringa + + TString(); + TString(int size); // Default constructor for a string of given size + TString(const char* s); // Costruttore a partire da una stringa s + TString(const TString& s); // Costruttore da un oggetto TString s + virtual ~TString(); // Deallocates the string + + /////////////////////////////////////////////////////////// + // @DES Methods derived from TObject + /////////////////////////////////////////////////////////// + + // @FPUB + virtual const char* class_name() const; // Ritorna il nome della classe + virtual word class_id() const; // Ritorna l'identificatore della classe + virtual bool ok() const { return _str != NULL; } + virtual TObject* dup() const; + virtual void print_on(ostream& out) const; + virtual void read_from(istream& in); + virtual word hash() const; // Return hash value + + /////////////////////////////////////////////////////////// + // @DES Query methods + /////////////////////////////////////////////////////////// + + // @FPUB + operator const char*() const { return (const char*)_str; } // *(TString) -> _str + char& operator[](int i) // TString[i] -> _str[i] + { + CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); + return _str[i]; + } + char operator[](int i) const // TString[i] -> _str[i] + { + CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); + return _str[i]; + } + + int size() const { return _size; } + int len() const { return strlen(_str); } + bool empty() const { return *_str == '\0'; } + bool not_empty() const { return *_str != '\0'; } + + int find(char, int from = 0) const; // Ritorna la posizione del carattere char nell'oggetto TString + int find(const char* s, int from = 0) const; // Ritorna la posizione della stringa s nell'oggetto TString + + const TString& left(int count) const; // Ritorna l'oggetto TString composto dai count caratteri da sinistra + const TString& mid(int from, int count = -1) const; // Ritorna l'oggetto TString composto dai count caratteri a partire da from + const TString& sub(int from, int to = -1) const; // Ritorna la stringa da FROM a TO (escluso) + const TString& right(int count) const; // Ritorna l'oggetto TString composto dai count caratteri da destra + +/////////////////////////////////////////////////////////// +// @DES Modifying methods +/////////////////////////////////////////////////////////// + +// @FPUB + + TString& fill(char c, int n = -1); // Riempie con n caratteri c + TString& spaces(int n = -1) { return fill(' ', n); } + TString& overwrite(const char* s, int pos = 0); // Sovrascrive la stringa s dalla posizione pos + TString& insert(const char* s, int pos = 0); // Inserisce la stringa s dalla posizione pos + + TString& strip(const char* k); // Elimina tutti i caratteri contenuti in k + TString& strip_spaces(); // Elimina tutti gli spazi non contenuti tra apici singoli o doppi + TString& ltrim(int n = 0); // Elimina gli spazi da sinistra se n=0 altrimenti elimina i primi n caratteri (da sinistra). + TString& rtrim(int n = 0); // Elimina gli spazi da destra se n=0 altrimenti elimina i primi n caratteri (da destra). + TString& trim(); // ltrim e rtrim + + TString& right_just(int n = -1, char c = ' '); // Giustifica a destra + TString& center_just(int n = -1, char c = ' '); // Centra + TString& left_just(int n = -1, char c = ' '); // Giustifica a sinistra + + TString& picture(const char* pic, const char* s); + virtual TString& format(const char* fmt, ...); + + TString& cut(int n); // Inserisce un '\0' alla posizione n-esima. + + TString& upper(); // Mette la stringa in maiuscolo + TString& lower(); // Mette la stringa in minuscolo + +/////////////////////////////////////////////////////////// +// @DES Standard operators +/////////////////////////////////////////////////////////// + +// @FPUB + + const TString& operator =(const TString& s) { return set(s._str); } + const TString& operator =(const char* s) { return set(s); } + + TString& operator <<(const char*); + TString& operator <<(char); + TString& operator <<(int); + TString& operator <<(long); + TString& operator <<(double); + TString& operator <<(const TObject& obj); + TString& operator <<(const TString& str); // For efficiency only + + bool operator ==(const char* s) const { return strcmp(_str, s) == 0; } + bool operator ==(char* s) const { return strcmp(_str, s) == 0; } + bool operator ==(const TString& s) const { return strcmp(_str, s._str) == 0; } + bool operator !=(const char* s) const { return strcmp(_str, s) != 0; } + bool operator !=(char* s) const { return strcmp(_str, s) != 0; } + bool operator !=(const TString& s) const { return strcmp(_str, s._str) != 0; } + bool operator <(const char* s) const { return strcmp(_str, s) < 0; } + bool operator >(const char* s) const { return strcmp(_str, s) > 0; } + bool operator >=(const char* s) const { return strcmp(_str, s) >= 0; } + bool operator <=(const char* s) const { return strcmp(_str, s) <= 0; } + bool match(const char* s) const; + bool compare(const char* s, int max = -1, bool ignorecase = FALSE) const; +}; + +// @C +// Classe TFixed_string : public TString +// @END + +class TFixed_string : public TString +{ +protected: + virtual void resize(int size, bool cpy); // Causa un errore fatale! + +public: + TFixed_string(const char* str, int size = -1); + virtual ~TFixed_string(); + + virtual TString& format(const char* fmt, ...); + + const TString& operator =(const TString& s) { return set((const char*)s); } + const TString& operator=(const char* str) { return set(str); } + void strncpy(const char* s, int n); +}; + +class TString16 : public TFixed_string +{ + char _str16[17]; + +public: + TString16(const char* str = "") : TFixed_string(_str16, 17) { set(str); } + TString16(const TString& s) : TFixed_string(_str16, 17) { set(s); } + const TString& operator =(const TString& s) { return set((const char*)s); } + const TString& operator =(const char* str) { return set(str); } +}; + +class TString80 : public TFixed_string +{ + char _str80[81]; + +public: + TString80(const char* str = "") : TFixed_string(_str80, 81) { set(str); } + TString80(const TString& s) : TFixed_string(_str80, 81) { set(s); } + const TString& operator =(const char* str) { return set(str); } + const TString& operator =(const TString& s) { return set((const char*)s); } +}; + +class TString256 : public TFixed_string +{ + char _str256[257]; + +public: + TString256(const char* str = "") : TFixed_string(_str256, 257) { set(str); } + TString256(const TString& s) : TFixed_string(_str256, 257) { set(s); } + const TString& operator =(const char* str) { return set(str); } + const TString& operator =(const TString& s) { return set((const char*)s); } +}; + + + +// @C +// Classe TFilename : public TString80 (256 su Windows'95) +// @END + +class TFilename : public TString80 +{ +public: + // @FPUB + + TFilename(const char* n = "") : TString80(n) {} + TFilename(const TString& n) : TString80(n) {} + + // assegnazione tra TFile e stringa + const TString& operator =(const char* s) { return set(s); } + const TString& operator =(const TString& s) { return set((const char*)s); } + + virtual bool ok() const; // Controlla il formato del nome del file + + const char* ext() const; // Ritorna l'estensione + void ext(const char*); // Imposta come estensione la stringa puntata da char* + + const char* name() const; // Ritorna il nome del file + const char* path() const; // Ritorna il nome del direttorio + const TFilename& temp(const char* prefix = NULL); // Genera il nome di un file temporaneo + const TFilename& tempdir(); // Genera il nome della directory temporanea +}; + +// @C +// Classe TToken_string : public TString +// @END + +class TToken_string : public TString +{ + // @DPRIV + char _separator; // Carattere separatore + int _last; // Puntatore all'ultimo + +protected: + // @FPROT + + virtual TObject* dup() const; // Crea un duplicato della token string + bool set_item(const char* v, int n); + +public: + // @FPUB + TToken_string(const char* = "", char separator = '|'); + TToken_string(int n, char separator = '|'); + TToken_string(const TToken_string& s); + + void separator(char s) { _separator = s; } // Setta il separatore a s + + void restart() { _last = empty() ? -1 : 0; } // Rimette all'inizio il puntatore + const TString& operator =(const char* s) { set(s);restart();return *this; } + const TString& operator =(const TString& s) { set(s);restart();return *this; } + + void add(const char* s, int n = -1); // Aggiunge una stringa + void add(char c, int pos = -1); // Aggiunge un char + void add(long n, int pos = -1); // Aggiunge un intero + void add(int n, int pos = -1); // Aggiunge un intero + void destroy(int pos); // Toglie la stringa pos + const char* get(); // Ritorna il prossimo token + const char* get(int n); // Ritorna un token (-1 = prossimo; -2 = ultimo; n = ennesimo) + char get_char(int n = -1); // Ritorna un carattere + int get_int(int n = -1); // Ritorna un intero + long get_long(int n = -1); // Ritorna un intero esteso + int get_pos(const char* s); // Ritorna la posizione dell'item s + int items() const; // Ritorna il numero di token presenti + bool empty_items() const; // Controlla se tutti i token sono nulli +}; + +/////////////////////////////////////////////////////////// +// @DES Paragraph +/////////////////////////////////////////////////////////// + +class TParagraph_string : public TToken_string +{ + int _width; + bool _fixed; + +protected: + void tokenize(); + +public: + TParagraph_string(const char* s, int width); + const TString& operator =(const char* s); + void set_width(int width) { _width = width; } +}; + +#endif + + + diff --git a/include/validate.cpp b/include/validate.cpp index 3e7537989..ad9d88523 100755 --- a/include/validate.cpp +++ b/include/validate.cpp @@ -436,7 +436,7 @@ HIDDEN bool _fixlen_val(TEdit_field& f, KEY) } -HIDDEN bool _mtcheck_val(TEdit_field& f, KEY) +HIDDEN bool _mtcheck_val(TEdit_field& f, KEY) { const int month = atoi(f.get()); if (month < 1 || month > 13) return FALSE; @@ -549,12 +549,11 @@ HIDDEN bool _onereq_val(TEdit_field& f, KEY k) const TMask& m = f.mask(); if (m.mode() == MODE_QUERY) return TRUE; const int nparms = get_val_param_num(); - TString s; for (int i = 0; i < nparms ; i++) { - s = m.get(atoi(get_val_param(i))); - if (s.not_empty()) return TRUE; + const char* s = m.get(atoi(get_val_param(i))); + if (*s) return TRUE; } return FALSE; } @@ -572,7 +571,13 @@ HIDDEN bool _chkfld_val(TEdit_field& f, KEY k) return TRUE; } -#define MAX_FUNC 18 +HIDDEN bool _filename_val(TEdit_field& f, KEY) +{ + const TFilename fn(f.get()); + return fn.ok(); +} + +#define MAX_FUNC 19 HIDDEN VAL_FUNC _global_val_func[MAX_FUNC] = { @@ -593,7 +598,8 @@ HIDDEN VAL_FUNC _global_val_func[MAX_FUNC] = _numcalc_val, _strcalc_val, _onereq_val, - _chkfld_val + _chkfld_val, + _filename_val }; bool validate(int fn, TEdit_field& f, KEY k, const TArray& parms) diff --git a/include/viswin.cpp b/include/viswin.cpp index 9a6cede9d..de5aa5a71 100755 --- a/include/viswin.cpp +++ b/include/viswin.cpp @@ -8,8 +8,6 @@ #include #include #include -#include -#include #ifndef __PRINTER_H typedef void (*LINKHANDLER) (int, const char *); @@ -1784,24 +1782,26 @@ default: bool TViswin::call_editor () { TConfig cnf (CONFIG_GENERAL, "Link"); - TString editor (cnf.get ("txt")); + const TFilename editor (cnf.get ("txt")); bool ok = FALSE; if (!editor.empty ()) { - TString newfilename; - - static FILE_SPEC fs; - get_default_dir(&fs.dir); + TFilename newfilename; newfilename.tempdir(); + FILE_SPEC fs; + str_to_dir((char*)(const char*)newfilename, &fs.dir); strcpy (fs.type, "txt"); + strcpy (fs.name, ""); + save_dir (); if (save_file_dlg (&fs, "Salva il file con il nome:") == FL_OK) { restore_dir (); char path[256]; dir_to_str (&fs.dir, path, sizeof (path)); - newfilename << path << '/' << fs.name; + newfilename = path; + newfilename << '/' << fs.name; TPoint p1, p2; if (_isselection) @@ -1819,8 +1819,7 @@ bool TViswin::call_editor () ok = TRUE; } } - else - restore_dir (); + restore_dir (); } else warning_box ("Nessun editor specificato nei parametri studio"); diff --git a/include/xvtility.cpp b/include/xvtility.cpp index 87f61704a..67c02bfa5 100755 --- a/include/xvtility.cpp +++ b/include/xvtility.cpp @@ -342,7 +342,7 @@ void beep() class TEvent_manager { - enum { MAX = 16 }; + enum { MAX = 2 }; WINDOW _w[MAX]; EVENT _e[MAX]; int _begin, _end; @@ -360,8 +360,11 @@ void TEvent_manager::push(WINDOW w, const EVENT& e) CHECK(w, "You shouldn't send events to NULL_WIN!"); _w[_end] = w; _e[_end] = e; - _end = (++_end) % MAX; - CHECKD(_end != _begin, "Too many events queued: max. ", MAX); + const int next = (_end+1) % MAX; + if (next == _begin) + error_box("Hey %s, clicca piu' piano!", (const char*)main_app().user()); + else + _end = next; } void TEvent_manager::pop()