From 4a4ff4a48f9a337c9a7c26d652940760e1d20aa7 Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 31 May 1996 15:27:42 +0000 Subject: [PATCH] Corretta formattazione git-svn-id: svn://10.65.10.50/trunk@2948 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/controls.h | 660 +++++----- include/maskfld.h | 2690 ++++++++++++++++++------------------- include/msksheet.cpp | 41 +- include/progind.cpp | 520 ++++---- include/strings.cpp | 2996 +++++++++++++++++++++--------------------- include/strings.h | 1162 ++++++++-------- 6 files changed, 4043 insertions(+), 4026 deletions(-) diff --git a/include/controls.h b/include/controls.h index 71c42f2d3..1a04d3581 100755 --- a/include/controls.h +++ b/include/controls.h @@ -1,330 +1,330 @@ -#ifndef __CONTROLS_H -#define __CONTROLS_H - -#ifndef __STRINGS_H -#include -#endif - -class TWindow; // __WINDOW_H -class TMask_field; // __MASKFLD_H - -#ifndef INCL_XI -#define XI_INTERNAL -#include -#endif - -void init_controls(); -void free_controls(); -XVT_FNTID xvt_default_font(bool bold = FALSE); - -WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, - const char* caption, TWindow* mask, bool tags); - -void attach_interface(WINDOW win, COLOR back = COLOR_WHITE); -short get_focus_id(WINDOW win); - -/////////////////////////////////////////////////////////// -// Custom control -/////////////////////////////////////////////////////////// - -// @doc INTERNAL - -// @class TControl | Classe per la creazione di controlli -class TControl : public TObject -// @author:(INTERNAL) Guido - -// @access:(INTERNAL) Private Member -{ - -// @access Protected Member -protected: - // @cmember:(INTERNAL) Puntatore al controllo creato - XI_OBJ* _obj; - - // @cmember:(INTERNAL) Puntatore al TMask_field eventualmente associato - TMask_field* _fld; - - // @cmember Ricava l'interfaccia da una finestra - XI_OBJ* get_interface(WINDOW win = NULL_WIN) const; - - // @cmember Cerca un controllo operabile (in avanti o all'indietro) - TControl& find_operable_ctl(bool forward) const; - - // @cmember Setta l'identificatore del prossimo controllo per il tasto TAB - void set_tab_cid(short id); - - void coord2rct(WINDOW win, short left, short top, short width, short height, RCT& rct) const; - unsigned long flags2attr(const char* flags) const; - void update_tab_cid(); - const char* parse_caption(const char* cap, bool& bold, COLOR& color) const; - - void change_attrib(unsigned long attr, bool on, XI_OBJ* obj = NULL); - - bool notify_key(KEY k); - -// @access Public Member -public: - TControl(); - virtual ~TControl(); - - static KEY xiev_to_key(const XI_EVENT* xiev); - - virtual bool event_handler(XI_OBJ* itf, XI_EVENT* ep); - - bool is_edit_key(KEY k) const; - - // @cmember Ritorna l'identificatore assegnato al controllo - short id() const { return _obj->cid; } - WINDOW parent() const; - - XI_OBJ_TYPE type() const { return _obj->type; } - - // @cmember Ritorna il prompt del controllo - const char* caption() const; - // @cmember Setta il prompt del controllo - virtual void set_caption(const char* c); - - // @cmember Abilita/disabilita il controllo - virtual void enable(bool on = TRUE); - void disable() { enable(FALSE); } - - // @cmember Mostra/nasconde il controllo - virtual void show(bool on = TRUE); - void hide() { show(FALSE); } - - void autoselect(bool on); - - // @cmember Forza il focus al controllo - virtual void set_focus() const; - - RCT& get_rect(RCT& r) const; - virtual void set_rect(const RCT& r); - - bool on_key(KEY k); -}; - - -class TText_control : public TControl -{ -public: // TControl - virtual void set_caption(const char* text); - -public: - TText_control(WINDOW win, short cid, - short left, short top, short width, short height, - const char* flags, const char* text); - virtual ~TText_control() {} -}; - - -class TGroupbox_control : public TText_control -{ - XI_OBJ* _rct; // Rettangolo del gruppo - -public: // TControl - virtual void show(bool on); - -public: - TGroupbox_control(WINDOW win, short cid, - short left, short top, short width, short height, - const char* flags, const char* text); - virtual ~TGroupbox_control() {} -}; - -class TField_control : public TControl -{ -protected: - bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); - - void create(WINDOW win, short cid, - short left, short top, - short width, short height, short maxlen, - const char* flags, const char* text, bool button); - - TField_control() {} - -public: - // @cmember Mostra o nasconde il bottone associato - void show_button(bool on); - - // @cmember Forza il focus al controllo - virtual void set_focus() const; - - TField_control(WINDOW win, short cid, - short left, short top, - short width, short maxlen, - const char* flags, const char* text); - virtual ~TField_control() {} -}; - -class TMultiline_control : public TField_control -{ -public: - TMultiline_control(WINDOW win, short cid, - short left, short top, - short width, short height, short maxlen, - const char* flags, const char* text); - virtual ~TMultiline_control() {} -}; - - - -class TButton_control : public TControl -{ -protected: - void create(WINDOW win, short cid, - short left, short top, short width, short height, - const char* flags, const char* text, - WIN_TYPE wc, XI_OBJ* container); - - virtual bool event_handler(XI_OBJ* itf, XI_EVENT* ep); - -public: - virtual void set_rect(const RCT& r); - - bool checked() const; - void check(bool on = TRUE); - void uncheck() { check(FALSE); } - bool toggle(); - - XI_BTN_TYPE button_type() const; - XI_OBJ* container() const; - - TButton_control() {} - virtual ~TButton_control() {} -}; - -class TPushbutton_control : public TButton_control -{ - short _bmp_up, _bmp_dn; - -protected: - virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); - -public: - virtual void update(); - - void set_bmp(short up, short dn); - - TPushbutton_control(WINDOW win, short cid, - short left, short top, short width, short height, - const char* flags, const char* text, - short bmp_up = 0, short _bmp_dn = 0); - virtual ~TPushbutton_control() {} -}; - -class TRadiobutton_control : public TButton_control -{ -protected: // TControl - virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); - virtual void set_focus() const; - -protected: - TRadiobutton_control() { } // To be derived - -public: - // @cmember Abilita/disabilita il controllo - virtual void enable(bool on = TRUE); - // @cmember Mostra/nasconde il controllo - virtual void show(bool on = TRUE); - - byte get_checked() const; - void check_button(byte b); - - void show_button(byte b, bool on = TRUE); - void hide_button(byte b) { show_button(b, FALSE); } - - TRadiobutton_control(WINDOW win, short cid, - short left, short top, short width, short height, - const char* flags, const char* text); - virtual ~TRadiobutton_control() {} -}; - -class TTagbutton_control : public TRadiobutton_control -{ -protected: // TControl - virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); - -public: - TTagbutton_control(WINDOW win, short cid, - short left, short top, short width, short height, - const char* flags, const char* text, int tag); - virtual ~TTagbutton_control() {} -}; - - -class TCheckbox_control : public TButton_control -{ -public: - TCheckbox_control(WINDOW win, short cid, - short left, short top, short width, - const char* flags, const char* text); - virtual ~TCheckbox_control() {} -}; - -class TDropDownList : public TObject -{ - XI_OBJ* _obj; - XI_OBJ* _xi_lst; - - TToken_string _codes; - TToken_string _values; - - int _selected; - int _width; - bool _open; - bool _displayed; - bool _in_cell; - - static void ddl_str_eh (XI_OBJ* itf, XI_EVENT* xiev); - -public: - const int selected() const { return _selected; } - void open(); - void close(); - bool is_open() const { return _open; } - bool displayed() const { return _displayed; } - - const char* item(int i) { return _values.get(i); } - int items() const { return _values.items(); } - long row2rec(int) const; - int rec2row(long rec) const; - void set_values(const char* c, const char* v); - - bool select(int i, bool force = FALSE); - bool select_by_initial(char c); - bool select_by_ofs(int n); - - TDropDownList(XI_OBJ* o, const char* codes, const char* values, int wid); - virtual ~TDropDownList() {} -}; - -class TListbox_control : public TField_control -{ - friend class TDropDownList; - TDropDownList* _ddl; - -private: - void drop_down(); - -protected: // TTField_control - virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); - -public: - void set_values(const char* c, const char* v); - int items() const { return _ddl->items(); } - bool select(int i) { return _ddl->select(i); } - bool select_by_initial(char c) { return _ddl->select_by_initial(c); } - bool select_by_ofs(int i) { return _ddl->select_by_ofs(i); } - int selected() const { return _ddl->selected(); } - - TListbox_control(WINDOW win, short cid, - short left, short top, short width, - const char* flags, const char* text, - const char* codes, const char* values); - virtual ~TListbox_control(); -}; - - - -#endif +#ifndef __CONTROLS_H +#define __CONTROLS_H + +#ifndef __STRINGS_H +#include +#endif + +class TWindow; // __WINDOW_H +class TMask_field; // __MASKFLD_H + +#ifndef INCL_XI +#define XI_INTERNAL +#include +#endif + +void init_controls(); +void free_controls(); +XVT_FNTID xvt_default_font(bool bold = FALSE); + +WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, + const char* caption, TWindow* mask, bool tags); + +void attach_interface(WINDOW win, COLOR back = COLOR_WHITE); +short get_focus_id(WINDOW win); + +/////////////////////////////////////////////////////////// +// Custom control +/////////////////////////////////////////////////////////// + +// @doc INTERNAL + +// @class TControl | Classe per la creazione di controlli +class TControl : public TObject +// @author:(INTERNAL) Guido + +// @access:(INTERNAL) Private Member +{ + +// @access Protected Member +protected: + // @cmember:(INTERNAL) Puntatore al controllo creato + XI_OBJ* _obj; + + // @cmember:(INTERNAL) Puntatore al TMask_field eventualmente associato + TMask_field* _fld; + + // @cmember Ricava l'interfaccia da una finestra + XI_OBJ* get_interface(WINDOW win = NULL_WIN) const; + + // @cmember Cerca un controllo operabile (in avanti o all'indietro) + TControl& find_operable_ctl(bool forward) const; + + // @cmember Setta l'identificatore del prossimo controllo per il tasto TAB + void set_tab_cid(short id); + + void coord2rct(WINDOW win, short left, short top, short width, short height, RCT& rct) const; + unsigned long flags2attr(const char* flags) const; + void update_tab_cid(); + const char* parse_caption(const char* cap, bool& bold, COLOR& color) const; + + void change_attrib(unsigned long attr, bool on, XI_OBJ* obj = NULL); + + bool notify_key(KEY k); + +// @access Public Member +public: + TControl(); + virtual ~TControl(); + + static KEY xiev_to_key(const XI_EVENT* xiev); + + virtual bool event_handler(XI_OBJ* itf, XI_EVENT* ep); + + bool is_edit_key(KEY k) const; + + // @cmember Ritorna l'identificatore assegnato al controllo + short id() const { return _obj->cid; } + WINDOW parent() const; + + XI_OBJ_TYPE type() const { return _obj->type; } + + // @cmember Ritorna il prompt del controllo + const char* caption() const; + // @cmember Setta il prompt del controllo + virtual void set_caption(const char* c); + + // @cmember Abilita/disabilita il controllo + virtual void enable(bool on = TRUE); + void disable() { enable(FALSE); } + + // @cmember Mostra/nasconde il controllo + virtual void show(bool on = TRUE); + void hide() { show(FALSE); } + + void autoselect(bool on); + + // @cmember Forza il focus al controllo + virtual void set_focus() const; + + RCT& get_rect(RCT& r) const; + virtual void set_rect(const RCT& r); + + bool on_key(KEY k); +}; + + +class TText_control : public TControl +{ +public: // TControl + virtual void set_caption(const char* text); + +public: + TText_control(WINDOW win, short cid, + short left, short top, short width, short height, + const char* flags, const char* text); + virtual ~TText_control() {} +}; + + +class TGroupbox_control : public TText_control +{ + XI_OBJ* _rct; // Rettangolo del gruppo + +public: // TControl + virtual void show(bool on); + +public: + TGroupbox_control(WINDOW win, short cid, + short left, short top, short width, short height, + const char* flags, const char* text); + virtual ~TGroupbox_control() {} +}; + +class TField_control : public TControl +{ +protected: + bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); + + void create(WINDOW win, short cid, + short left, short top, + short width, short height, short maxlen, + const char* flags, const char* text, bool button); + + TField_control() {} + +public: + // @cmember Mostra o nasconde il bottone associato + void show_button(bool on); + + // @cmember Forza il focus al controllo + virtual void set_focus() const; + + TField_control(WINDOW win, short cid, + short left, short top, + short width, short maxlen, + const char* flags, const char* text); + virtual ~TField_control() {} +}; + +class TMultiline_control : public TField_control +{ +public: + TMultiline_control(WINDOW win, short cid, + short left, short top, + short width, short height, short maxlen, + const char* flags, const char* text); + virtual ~TMultiline_control() {} +}; + + + +class TButton_control : public TControl +{ +protected: + void create(WINDOW win, short cid, + short left, short top, short width, short height, + const char* flags, const char* text, + WIN_TYPE wc, XI_OBJ* container); + + virtual bool event_handler(XI_OBJ* itf, XI_EVENT* ep); + +public: + virtual void set_rect(const RCT& r); + + bool checked() const; + void check(bool on = TRUE); + void uncheck() { check(FALSE); } + bool toggle(); + + XI_BTN_TYPE button_type() const; + XI_OBJ* container() const; + + TButton_control() {} + virtual ~TButton_control() {} +}; + +class TPushbutton_control : public TButton_control +{ + short _bmp_up, _bmp_dn; + +protected: + virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); + +public: + virtual void update(); + + void set_bmp(short up, short dn); + + TPushbutton_control(WINDOW win, short cid, + short left, short top, short width, short height, + const char* flags, const char* text, + short bmp_up = 0, short _bmp_dn = 0); + virtual ~TPushbutton_control() {} +}; + +class TRadiobutton_control : public TButton_control +{ +protected: // TControl + virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); + virtual void set_focus() const; + +protected: + TRadiobutton_control() { } // To be derived + +public: + // @cmember Abilita/disabilita il controllo + virtual void enable(bool on = TRUE); + // @cmember Mostra/nasconde il controllo + virtual void show(bool on = TRUE); + + byte get_checked() const; + void check_button(byte b); + + void show_button(byte b, bool on = TRUE); + void hide_button(byte b) { show_button(b, FALSE); } + + TRadiobutton_control(WINDOW win, short cid, + short left, short top, short width, short height, + const char* flags, const char* text); + virtual ~TRadiobutton_control() {} +}; + +class TTagbutton_control : public TRadiobutton_control +{ +protected: // TControl + virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); + +public: + TTagbutton_control(WINDOW win, short cid, + short left, short top, short width, short height, + const char* flags, const char* text, int tag); + virtual ~TTagbutton_control() {} +}; + + +class TCheckbox_control : public TButton_control +{ +public: + TCheckbox_control(WINDOW win, short cid, + short left, short top, short width, + const char* flags, const char* text); + virtual ~TCheckbox_control() {} +}; + +class TDropDownList : public TObject +{ + XI_OBJ* _obj; + XI_OBJ* _xi_lst; + + TToken_string _codes; + TToken_string _values; + + int _selected; + int _width; + bool _open; + bool _displayed; + bool _in_cell; + + static void ddl_str_eh (XI_OBJ* itf, XI_EVENT* xiev); + +public: + const int selected() const { return _selected; } + void open(); + void close(); + bool is_open() const { return _open; } + bool displayed() const { return _displayed; } + + const char* item(int i) { return _values.get(i); } + int items() const { return _values.items(); } + long row2rec(int) const; + int rec2row(long rec) const; + void set_values(const char* c, const char* v); + + bool select(int i, bool force = FALSE); + bool select_by_initial(char c); + bool select_by_ofs(int n); + + TDropDownList(XI_OBJ* o, const char* codes, const char* values, int wid); + virtual ~TDropDownList() {} +}; + +class TListbox_control : public TField_control +{ + friend class TDropDownList; + TDropDownList* _ddl; + +private: + void drop_down(); + +protected: // TTField_control + virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); + +public: + void set_values(const char* c, const char* v); + int items() const { return _ddl->items(); } + bool select(int i) { return _ddl->select(i); } + bool select_by_initial(char c) { return _ddl->select_by_initial(c); } + bool select_by_ofs(int i) { return _ddl->select_by_ofs(i); } + int selected() const { return _ddl->selected(); } + + TListbox_control(WINDOW win, short cid, + short left, short top, short width, + const char* flags, const char* text, + const char* codes, const char* values); + virtual ~TListbox_control(); +}; + + + +#endif diff --git a/include/maskfld.h b/include/maskfld.h index 4ddbd9c00..7fd66879a 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -1,1345 +1,1345 @@ -#ifndef __MASKFLD_H -#define __MASKFLD_H - -#ifndef __DATE_H -#include -#endif - -#ifndef __REAL_H -#include -#endif - -#ifndef __SCANNER_H -#include -#endif - -class TControl; // __CONTROL_H -class TText_control; -class TPushbutton_control; - -class TRelation; // __RELATION_H -class TCursor; -class TFieldref; - -class TArray_sheet; // __SHEET_H - -class TMask_field; // Convenience - - -// @doc EXTERNAL - -// @enum Tipo di check da eseguire su un controllo -enum CheckType { - CHECK_NONE, // @emem Nessun controllo - CHECK_NORMAL, // @emem Controllo normale (non e' un campo obbligatorio) - CHECK_REQUIRED, // @emem Controlla se il campo non e' vuoto e fa un check normale - CHECK_SEARCH // @emem Controlla se il campo c'e' ma non da' nessuna segnalazione se e' errato -}; - -// @doc EXTERNAL - -// @enum Momento di richiesta del check -enum CheckTime { - RUNNING_CHECK, // @emem Check chiamato mentra la maschera sta andando - STARTING_CHECK, // @emem Check chiamato al caricamento della maschera - FINAL_CHECK }; // @emem Check chiamato quando la maschera si sta fermando - -// @type CONTROL_HANDLER | Prototipo funzione per gestire i tasti speciali all'interno di un controllo -typedef bool (*CONTROL_HANDLER)(TMask_field& field, KEY key); - -// @doc EXTERNAL - -// @class TMask_field | Classe per la definizione delle operazioni sui campi di -// una maschera -// -// @base public | TObject -class TMask_field : public TObject -// @author:(INTERNAL)Guido -{ - // @cfriend TMask - friend class TMask; - -// @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Maschera all'interno del quale e' contenuto il campo - TMask* _mask; - - // @cmember:(INTERNAL) Gruppi cui appartiene il campo - TBit_array* _groups; - - // @access Protected Member -protected: - // @cmember Controllo vero e proprio - TControl* _ctl; - - // @cmember - // @comm Struttura usata solo durante la creazione di un controllo - struct TControl_data - { - short _dlg; // Identifier - short _x, _y; // Position - short _width; // Width - short _height; // Height - word _size; // Buffer size - short _decimals; // Precision - TString _prompt; // Prompt - TString _flags; // Flags - short _bmp_up; // Bitmap up - short _bmp_dn; // Bitmap down - TToken_string _park; // Work string - void reset(); - }; - static TControl_data _ctl_data; - - // @cmember | _flags | | Flag indicante lo stato del campo - struct TField_Flags - { - bool automagic : 1; - bool button : 1; - bool dirty : 2; // Modified during run ? - bool enabled : 1; // Is editable - bool enable_default : 1; - bool firm : 1; // Is the current firm ? - bool focusdirty : 1; // Modified during focus ? - bool ghost : 1; - bool password : 1; - bool persistent : 1; - bool rightjust : 1; - bool roman : 1; // Is a Roman number ? - bool shown : 1; // Is visible - bool show_default : 1; - byte trim : 2; // Trim the string - bool uppercase : 1; - bool exchange : 1; // Value exchange - bool zerofilled : 1; - bool pipeallowed : 1; - - TField_Flags(); - char update(const char*); - } _flags; - - // @cmember Costruisce il campo da file - void construct(TScanner& scanner, WINDOW parent); - // @cmember Costruisce il campo con i suoi parametri - void construct(short id, const char* prompt, int x, int y, int len, WINDOW parent, const char* flags = "", int width = 0); - - // @cmember Legge la testata del controllo dal file .msk

- virtual void parse_head(TScanner& scanner); - // @cmember Legge una riga di definizione del controllo dal file .msk

- virtual bool parse_item(TScanner& scanner); - - // @cmember Crea il controllo (chiama ) - virtual void create(WINDOW parent) pure; - - // @cmember Setta il focus sul campo - virtual void highlight() const; - - // @cmember Manda al campo

un tasto (chiama ) - void send_key(KEY k, short to); - - // @access Public Member -public: // TObject - virtual bool is_kind_of(word cid) const; - -public: - // @cmember Converte una stringa in un identificatore di controllo - short atodlg(const char* s) const; - - // @cmember Ritorna la finestra padre - virtual WINDOW parent() const; - - RCT& get_rect(RCT& r) const; - void set_rect(const RCT& r); - - // @cmember Ritorna l'identificatore del controllo - virtual short dlg() const; - - // @cmember Controlla se si tratta di un controllo corretto - virtual bool ok() const; - - // @cmember Ritorna TRUE se il campo e' stato modificato - bool dirty() const - { return _flags.dirty; } - // @cmember Ritorna TRUE se il campo e' stato modificato dall'ultima volta che ha ricevuto il focus - bool focusdirty() const - { return _flags.focusdirty; } - // @cmember Setta lo stato di focusdirty del campo - void set_focusdirty(bool d = TRUE) - { _flags.focusdirty = d; } - // @cmember Setta lo stato di dirty del campo - void set_dirty(bool d = TRUE); - - // @cmember abilita il trim degli spazi - void set_trim(bool t) - { _flags.trim = t ? 3 : 0; } - - // @cmember Setta la giustificazione a destra del campo - void set_justify(bool r) - { _flags.rightjust = r; } - - // @cmember Verifica la giustificazione a destra del campo - bool right_justified() const - { return _flags.rightjust; } - - // @cmember Ritorna TRUE se il campo e' in maiuscolo - bool uppercase() const - { return _flags.uppercase; } - - // @cmember Verifica la allowance of the pipe - bool pipe_allowed() const - { return _flags.pipeallowed; } - - // @cmember Allowa la pippa - void allow_pipe(bool r = TRUE) - { _flags.pipeallowed = r; } - - // @cmember Ritorna il nome della classe - virtual const char* class_name() const; - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - - // @cmember Ritorna TRUE se il campo e' un numero romano - bool roman() const - { return _flags.roman; } - // @cmember Ritorna TRUE se il campo e' automagic - bool automagic() const - { return _flags.automagic; } - // @cmember Ritorna TRUE se ha un bottone di campo - bool has_button() const - { return _flags.button; } - // @cmember Ritorna TRUE se si tratta di campo fantasma - bool ghost() const - { return _flags.ghost; } - // @cmember Ritorna TRUE se si tratta di campo in valuta - bool exchangeable() const - { return _flags.exchange; } - - // @cmember Controlla se il campo appartiene ad un achiave di ricerca - virtual bool in_key(byte) const - { return FALSE; } - // @cmember Controlla se il campo ha un check - virtual bool has_check() const - { return FALSE;} - // @cmember Controlla se il campo ha una richiesta - virtual bool has_query_button() const - { return FALSE;} - // @cmember Ritorna il campo corrispondente su record - virtual const TFieldref* field() const - { return NULL; } - - // @cmember Ritorna il tipo di checktype del campo - virtual void check_type(CheckType); - - // @cmember Ritorna lo stato di checktype del campo - virtual CheckType check_type() const - { return CHECK_NONE; } - // @cmember Ritorna TRUE se il checktype del campo e

- bool required() const - { return check_type() == CHECK_REQUIRED; } - - // @cmember Controlla la validita' del campo - virtual bool check(CheckTime = RUNNING_CHECK) - { return TRUE;} - - // @cmember Azzera il contenuto del campo - virtual void reset(); - - // @cmember Abilita/disabilita il campo (lo rende scrivibile) - virtual void enable(bool on = TRUE); - - // @cmember Abilita/disabilita il campo (chiama ) - void disable() - { enable(FALSE); } - // @cmember Controlla se un campo e' abilitato - virtual bool enabled() const - { return _flags.enabled; } - // @cmember Rimette lo stato di dis/abilitazione del campo a seconda di come era settato sul file - void enable_default(); - // @cmember Controlla se il campo e abilitato di default - bool enabled_default() const - { return _flags.enable_default; } - - // @cmember Permette di rendere visibile/invisibile un campo - virtual void show(bool on = TRUE); - // @cmember Permette di rendere invisibile un campo (chiama ) - void hide() - { show(FALSE); } - // @cmember Ritorna TRUE se il campo e' visibile - bool shown() const - { return _flags.shown; } - // @cmember Ritorna TRUE se il campo e' nascosto - bool hidden() const - { return !shown(); } - - // @cmember Rimette lo stato di in/visibilta' del campo a seconda di come era - // settato sul file - void show_default(); - - // @cmember Ritorna TRUE se il campo e' sia visibile che abilitato - bool active() const; - - // @cmember Setta l'handler del controllo - virtual void set_handler(CONTROL_HANDLER); - - // @cmember Ritorna TRUE se il campo e' di tipo operable - virtual bool is_operable() const { return FALSE; } - // @cmember Ritorna TRUE se il campo e' di tipo editable - virtual bool is_editable() const { return FALSE; } - // @cmember Ritorna TRUE se il campo e' di tipo edit - virtual bool is_edit() const { return FALSE; } - - // @cmember Permette di spedire il check - bool to_check(KEY k, bool checkrun = FALSE) const; - - // @cmember Gestisce la chiamata all'handler del campo - virtual bool on_hit(); - - // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) - virtual bool on_key(KEY key); - - // @cmember Setta il contenuto del campo inserendo la stringa

- virtual void set(const char* s); - - // @cmember Setta il contenuto del campo inserendo in numero

- void set(long n); - - // @cmember Ritorna il contenuto del campo - virtual const TString& get() const; - - virtual bool empty() const { return FALSE; } - - // @cmember Ritorna la dimensione del buffer associato al campo - virtual word size() const { return 0; } - - // @cmember Ritorna il prompt del campo - virtual const char* prompt() const; - // @cmember Setta il prompt del campo - virtual void set_prompt(const char* p); - - // @cmember Controlla se il campo appartiene al gurppo

(TRUE se appartiene) - bool in_group(byte group) const - { return _groups ? (*_groups)[group] : FALSE; } - // @cmember Assegna il campo al grupo

- void set_group(byte group); - - // @cmember Setta il focus al campo - virtual void set_focus() const; - - // @cmember Crea una message-box relativo al campo (chiama ) - bool message_box(const char* fmt, ...) const; - // @cmember Crea una warning-box relativo al campo (chiama ) - bool warning_box(const char* fmt, ...) const; - // @cmember Crea una error-box relativo al campo (chiama ) - bool error_box(const char* fmt, ...) const; - // @cmember Crea una yesno-box relativo al campo (chiama ) - bool yesno_box(const char* fmt, ...) const; - // @cmember Crea una yesnocancel-box relativo al campo (chiama ) - KEY yesnocancel_box(const char* fmt, ...) const; - - // @cmember Ritorna un reference alla maschera di appartenenza del campo - TMask& mask() const - { return *_mask; } - // @cmember Costruttore - TMask_field(TMask* mask); - // @cmember Distruttore - virtual ~TMask_field(); -}; - -// @doc EXTERNAL - -// @struct TField_Flags | Flag indicante il settaggio del campo -// @comm ATTENZIONE: Questa struttura e' definita ed utilizzata unicamente nella classe -// -// @field bool | automagic: 1 | Indica se il campo e' automagic -// @field bool | dirty: 2 | Indica se il campo e' stato modificato -// @field bool | enabled: 1 | Indica se il campo e' editabile -// @field bool | enable_default: 1 | Indica se il campo e' abilitato di default -// @field bool | firm: 1 | Indica se il campo appartiene alla ditta corrente -// @field bool | focusdirty: 1 | Indica se il campo e' stato modificat mentre aveva il focus -// @field bool | ghost: 1 | Indica se il campo e' ghost -// @field bool | password: 1 | Indica che e' un campo password (no si vede quello che scrivi) -// @field bool | persistent: 1 | Indica se il valore del campo deve rimanere anche quando viene ricaricata la maschera -// @field bool | rightjust: 1 | Indica se il campo e' allineato a destra -// @field bool | roman: 1 | Indica se il campo contiene un numero romano -// @field bool | shown: 1 | Indica se il campo e' visibile -// @field bool | show_default: 1 | Indica se il campo e' visibile di default -// @field bool | trim: 1 | Indica se bisogna fare il trim della stringa (vedi ) -// @field bool | uppercase: 1 | Indica se il campo e' maiuscolo -// @field bool | exchange: 1 | Indica se si tratta di un cambio valuta -// @field bool | zerofilled: 1 | Indica se il campo e' zerofilled -// @field bool | pipeallowed: 1 | Indica se il campo e' pipeallowed -// @field void | TField_Flags() | Costruttore -// @field char | update(const char*) | Aggiorna i bit della struttura secondo i valori letti da file - -// @doc EXTERNAL - - -class TText_field : public TMask_field -{ -protected: - virtual void create(WINDOW parent); - -public: // TObject - word class_id() const; - bool is_kind_of(word cid) const; - -public: - TText_field(TMask* m) : TMask_field(m) {} - virtual ~TText_field() {} -}; - -// @doc EXTERNAL - -// @class TGroup_field | Classe per la gestione del disegno dei group box -// -// @base public | TMask_field -class TGroup_field : public TMask_field -// @author:(INTERNAL) Guido -{ - // @access Protected Member -protected: - // @cmember Legge un item del controllo dal file

- virtual void parse_head(TScanner& scanner); - // @cmember Crea il controllo - virtual void create(WINDOW parent); - - // @access Public Member -public: - // @cmember Costruttore - TGroup_field(TMask* mask); - virtual ~TGroup_field() {} -}; - - - -class TOperable_field : public TMask_field -{ - // @cmember Comandi da eseguire in caso di modifica del campo - TString_array* _message; - - // @cmember Handler del controllo - CONTROL_HANDLER _handler; - -protected: // TMask_field - bool handler(KEY k); - - virtual bool parse_item(TScanner& scanner); - virtual bool is_operable() const { return TRUE; } - virtual bool on_hit(); - - TToken_string* message(int m, bool crea = FALSE); - - // @cmember Setta il focus sul campo - virtual void highlight() const; - -public: - virtual bool is_kind_of(word cid) const; - - // @cmember Esegue processo in background - virtual void on_idle() {} - - // @cmember Esegue il messaggio

-esimo sul campo - bool do_message(int n); - - // @cmember Controlla se il campo ha un messaggio - virtual bool has_message() const - { return _message != NULL; } - - // @cmember Setta l'handler del controllo - virtual void set_handler(CONTROL_HANDLER handler) - { _handler = handler; } - - // @cmember Setta il focus al campo - virtual void set_focus() const; - - // @cmember Gestisce il tasto

- virtual bool on_key(KEY k); - - // @cmember Abilita/disabilita il campo (lo rende scrivibile) (vedi ) - virtual void enable(bool on = TRUE); - - // @cmember Setta il valore del cambio nel campo - virtual void exchange(bool, const real&) { } - - TOperable_field(TMask* m); - virtual ~TOperable_field(); -}; - -// @doc EXTERNAL - -// @class TButton_field | Classe per la gestione dei campi bottone -// -// @base public | TMask_field -class TButton_field : public TOperable_field - -// @author:(INTERNAL) Guido -{ - // @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Valore della combinazione di tasti che sostituisce il bottone - KEY _virtual_key; - // @cmember:(INTERNAL) Tasto generato quando viene premuto il bottone che si sta gestendo - KEY _exit_key; - - // @access Protected Member -protected: - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - - // @cmember Ritorna TRUE se il controllo deriva dalla classe cid - virtual bool is_kind_of(word cid) const; - - // @cmember Crea il controllo - virtual void create(WINDOW parent); - - // @cmember Legge un item del controllo dal file

- void parse_head(TScanner& scanner); - // @cmember Legge un item del controllo dal file

- bool parse_item(TScanner& scanner); - - // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) - virtual bool on_key(KEY key); - -public: - // @cmember Ritorna il valore della combinazione di tasti che sostiutiscono il bottone - KEY virtual_key() const - { return _virtual_key; } - // @cmember Ritorna il valore del tasto di uscita - KEY exit_key() const - { return _exit_key; } - - void set_hot_key(KEY k) { _virtual_key = _exit_key = k; } - void set_bmp(short up, short dn); - - // @cmember Costruttore - TButton_field(TMask* mask); - virtual ~TButton_field() {} -}; - -class TEditable_field : public TOperable_field -{ - // @cmember Campo su file - TFieldref* _field; - - // @cmember:(INTERNAL) Prompt del campo - TText_control* _prompt; - - // @cmember:(INTERNAL) Chiave al quale appartiene il campo - TBit_array* _keys; - - // @cmember Messaggi da mandare in caso di errore sul campo - TString* _warning; - - // @cmember:(INTERNAL) Stringa definibile dall'utilizzatore della classe da utilizzare a piacimento - TToken_string* _userdata; - - struct TValidation_data - { - // @cmember Identificatore della funzione di validazione - int _func; - // @cmember Parametri da passara alla funzione di validazione - TArray _parms; - }; - TValidation_data* _validate; - -protected: // TMask_field - virtual bool parse_item(TScanner& scanner); - -protected: - // @cmember Valore corrente del campo - TString _str; - - word create_prompt(WINDOW parent, word width, word heigth); - - virtual const char* reformat(const char* data) const; - virtual TString& get_window_data() pure; - virtual void set_window_data(const char* data) pure; - - int validate_func() const { return _validate ? _validate->_func : -1; } - -public: // TMask_field - // @cmember Ritorna il prompt del campo - virtual const char* prompt() const; - -public: - bool test_key_complete(bool normal = TRUE) const; - // @cmember Controlla se il campo appartiene alla chiave

(TRUE se appartiene) - bool in_key(byte key) const - { return _keys ? (*_keys)[key] : FALSE; } - // @cmember Setta il campo alla chiave

- void set_key(byte key); - // @cmember Rimuove il campo dalla chiave

- void reset_key(byte key); - // @cmember Ritorna l'ultima chiave di appartenenza del campo - word last_key() const; - // @cmember Ritorna l'ultima chiave di appartenenza del campo - word first_key() const; - // @cmember Verifica che il campo abbia almeno una chiave in con il campo

- bool has_a_common_key(const TMask_field & f) const; - - // @cmember Ritorna il nome del campo corrsipondente sul file - virtual const TFieldref* field() const - { return _field; } - // @cmember Setta il nome del campo corrsipondente sul file - void set_field(const TString& fr); - - // @cmember Legge dalla relazione il valore del campo - bool autoload(const TRelation& r); - - // @cmember Scrive sulla relazione il valore del campo - virtual bool autosave(TRelation& r) const; - - // @cmember Chiama l' eventuale funzione di validazione - bool validate(KEY k); - - bool has_warning() const { return _warning != NULL; } - void set_warning(const char* w); - const char* get_warning() const; - - virtual void show(bool on); - - virtual void set_prompt(const char* p); - - // @cmember Setta il contenuto del campo inserendo la stringa

- virtual void set(const char* s); - - // @cmember Ritorna il contenuto del campo - virtual const TString& get() const; - - // @cmember Trasforma una stringa su file una rappresentabile a video - virtual const char* raw2win(const char* r) const; - - // @cmember Trasforma una stringa a video in un valore su file - virtual const char* win2raw(const char* w) const; - - // @cmember Ritorna TRUE se il campo e' di tipo editable - virtual bool is_editable() const { return TRUE; } - - TEditable_field(TMask* m); - virtual ~TEditable_field(); -}; - - -// @doc EXTERNAL - -// @class TBoolean_field | Classe per la gestione dei campi boolean (check box) -// -// @base public | TEditable_field -class TBoolean_field : public TEditable_field - -// @author:(INTERNAL) Guido -{ - // @access Protected Member -protected: // TMask_field - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - - // @cmember Crea il controllo - virtual void create(WINDOW parent); - - // @cmember Legge un item del controllo dal file

- virtual bool parse_item(TScanner& scanner); - -protected: // TOperable - // @cmember Gestisce la chiamata all'handler del campo - virtual bool on_hit(); - // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) - virtual bool on_key(KEY key); - -protected: // TEditable - // @cmember Riaggiusta una stringa in formato RAW - virtual const char* reformat(const char* raw) const; - virtual TString& get_window_data(); - virtual void set_window_data(const char* data); - virtual void set_prompt(const char* p); - - // @access Public Members -public: - // @cmember Costruttore - TBoolean_field(TMask* mask); - - // @cmember Distruttore - virtual ~TBoolean_field() {} -}; - - -/////////////////////////////////////////////////////////// -// TBrowse_button -/////////////////////////////////////////////////////////// - -class TEdit_field; - -class TBrowse_button : public TObject -{ - TEdit_field* _fld; - -protected: - // @cmember Ritorna il primo valore di

- TEdit_field& field() const - { return *_fld; } - - // @cmember Ritorna il campo

-esimo - TEditable_field& field(short id) const; - -public: - // @cmember Controlla la sintassi della input del campo e ne setta i membri - virtual void parse_input(TScanner& scanner) pure; - - // @cmember Controlla la sintassi della output del campo e ne setta i membri - virtual void parse_output(TScanner& scanner) pure; - - virtual KEY run() pure; - - // @cmember Controlla la validita' del campo - virtual bool check(CheckTime = RUNNING_CHECK) pure; - - virtual bool is_browse() const { return FALSE; } - - TBrowse_button(TEdit_field* f); - virtual ~TBrowse_button(); -}; - - -/////////////////////////////////////////////////////////// -// TBrowse -/////////////////////////////////////////////////////////// - -// @class TList_sheet | Classe per la gestione dei list sheet -class TList_sheet : public TBrowse_button -// @author:(INTERNAL) Guido -{ - // @access:(INTERNAL) Private Memeber - - // @cmember:(INTERNAL) Numero di riga corrente dello sheet - int _row; - - // @cmember:(INTERNAL) Titolo dello sheet - TString _caption; - - // @cmember:(INTERNAL) Testate delle colonne dello sheet - TToken_string _head; - - // @cmember:(INTERNAL) Righe dello sheet - TString_array _data; - - // @cmember:(INTERNAL) Campi di input sulla maschera - TToken_string _inp_id; - - // @cmember:(INTERNAL) Campi di output sulla maschera - TToken_string _out_id; - - // @access Protected Member -protected: - // @cmember Ritorna il numero di riga selezionata - int do_input(); - // @cmember Scrive l'output della ricerca sulla maschera - void do_output(CheckTime = RUNNING_CHECK); - - // @cmember Controlla la sintassi della input del campo e ne setta i membri - void parse_input(TScanner& scanner); - // @cmember Controlla la sintassi della output del campo e ne setta i membri - void parse_output(TScanner& scanner); - - // @access Public Memeber -public: - // @cmember Legge dal file gli item dello sheet - void parse_item(TScanner& scanner); - - // @cmember Controlla la validita' del campo - virtual bool check(CheckTime = RUNNING_CHECK); - - // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca - virtual KEY run(); - - TString_array& rows_array() { return _data; } - - // @cmember Costruttore - TList_sheet(TEdit_field* f, const char* caption, const char* head); - // @cmember Distruttore - virtual ~TList_sheet(); -}; - -// @doc INTERNAL - -// @class TBrowse | Classe per la definizione dei campi con ricerca -class TBrowse : public TBrowse_button -// @author:(INTERNAL) Guido -{ - // @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Relazione della ricerca - TRelation* _relation; - // @cmember:(INTERNAL) Cursore sulla relazione - TCursor* _cursor; - // @cmember:(INTERNAL) Comando da eseguire alla pressione del tasto Gestione - TString _insert; - // @cmember:(INTERNAL) Filtro sul cursore - TString _filter; - // @cmember:(INTERNAL) Record selezionato - long _rec; - // @cmember:(INTERNAL) Indica se e' presente un campo secondario nella ricerca - bool _secondary; - // @cmember:(INTERNAL) Indica se sul campo e' gia' stao effettuato il check - bool _checked; - - // @cmember:(INTERNAL) Testata della maschera di ricerca - TToken_string _head; - // @cmember:(INTERNAL) Item della maschera di ricerca - TToken_string _items; - // @cmember:(INTERNAL) Campi di input sulla maschera - TToken_string _inp_id; - // @cmember:(INTERNAL) Campi di input sul file - TToken_string _inp_fn; - // @cmember:(INTERNAL) Campi di output sulla maschera - TToken_string _out_id; - // @cmember:(INTERNAL) Campi di output sul file - TToken_string _out_fn; - - // @access Protected Member -protected: - // @cmember Azzera i campi di output sulla maschera - void do_clear(); - // @cmember Chiama la maschera di gestione della ricerca - bool do_link(bool insert); - - // @cmember Crea lista identificatori di ricerca - TToken_string& create_siblings(TToken_string& siblings); - - // @access Public Member -public: - // @cmember Ritorna il numero di inputs senza contare quelli che funzionano - // solo da filtro - int input_fields(); - - // @cmember Ritorna la lista completa degli identificatori dei campi di input - const char* get_input_fields() const; - - // @cmember Ritorna la lista completa dei nomi dei campi di input - const char* get_input_field_names() const; - - // @cmember Ritorna la lista completa dei campi di output - const char* get_output_fields() const; - - // @cmember Ritorna il numero di campi non vuoti e non filtrati - int do_input(bool filter = FALSE); - - // @cmember Scrive l'output della ricerca sulla maschera - void do_output(CheckTime = RUNNING_CHECK); - - // @cmember Costruttore - TBrowse(TEdit_field* f, TRelation* r, int key = 1, const char* filter = ""); - // @cmember Costruttore - TBrowse(TEdit_field* f, TCursor* c); - // @cmember Distruttore - ~TBrowse(); - - // @cmember Controlla la sintassi della join del campo e ne setta i membri - void parse_join(TScanner& scanner); - // @cmember Controlla la sintassi della input del campo e ne setta i membri - void parse_input(TScanner& scanner); - // @cmember Controlla la sintassi della display del campo e ne setta i membri - void parse_display(TScanner& scanner); - // @cmember Controlla la sintassi della output del campo e ne setta i membri - void parse_output(TScanner& scanner); - // @cmember Controlla la sintassi della insert del campo e ne setta i membri - void parse_insert(TScanner& scanner); - // @cmember Controlla la sintassi della copy del campo e ne setta i membri - bool parse_copy(const TString& what, const TBrowse& b); - - // @cmember Permette di settare il comando alla pressione del tasto Gestione - void set_insert(const char* s) - { _insert = s;} - // @cmember Ritorna il valore di

- const TString& get_insert() const - { return _insert;} - // @cmember Ritorna il valore di

- const TString& get_filter() const - { return _filter;} - - // @cmember Controlla la validita' del campo - bool check(CheckTime = RUNNING_CHECK); - // @cmember Controlla se il campo puo' essere vuoto - bool empty_check(); - // @cmember Ritorna il valore di

- const TToken_string& head() const - { return _head;} - // @cmember Ritorna il valore di

- const TToken_string& items() const - { return _items;} - // @cmember Ritorna il valore di

- TCursor* cursor() const - { return _cursor;} - // @cmember Ritorna il valore di

- bool checked() const - { return _checked;} - // @cmember Ritorna il valore di

- bool secondary() const - { return _secondary;} - - virtual bool is_browse() const { return TRUE; } - - // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca - virtual KEY run(); -}; - - -// @doc EXTERNAL - -// @class TEdit_field | Classe per la definizione dei campi editabili -// -// @base public | TEditable_field -class TEdit_field : public TEditable_field -{ - // @access Protected Member -protected: - // @cmember Formato che deve avere il campo - TString _picture; - - // @cmember Dimensione del buffer del campo - word _size; - - // @cmember Accettabilita' di valori nulli - CheckType _check; - // @cmember Controllo da effettuare anche in - bool _forced; - // @cmember Controllo abilitato - bool _check_enabled; - - // @cmember Oggetto che contiene la ricerca e il controllo del campo - TBrowse_button* _browse; - - // @cmember Ritorna la browse - const TBrowse* parse_browse(TScanner& scanner) const; - - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - // @cmember Legge la testata del controllo dal file

- virtual void parse_head(TScanner& scanner); - // @cmember Legge un item del controllo dal file

- virtual bool parse_item(TScanner& scanner); - - // @cmember Crea il controllo - virtual void create(WINDOW parent); - - // @cmember Ritorna

formattato secondo i flags settati del campo - virtual const char* reformat(const char* data) const; - - // @cmember Scrive il valore del campo direttamente sulla finestra del controllo - virtual void set_window_data(const char* data); - - // @cmember Mostra un messaggio di errore di default per il campo - bool default_error_box() const; - - // @access Public Member -public: - // @cmember Gestisce la chiamata all'handler del campo - virtual bool on_hit(); - // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) - virtual bool on_key(KEY key); - // @cmember Controlla se il campo ha un check - virtual bool has_check() const; - // @cmember Controlla se il campo ha una ricerca - virtual bool has_query_button() const - { return _browse != NULL;} - - // @cmember Ritorna TRUE se il campo e' di tipo edit - virtual bool is_edit() const { return TRUE; } - - // @cmember Legge il valore del campo direttamente dalla finestra del controllo - virtual TString& get_window_data(); - - // @cmember Converte da campo a video - virtual const char* raw2win(const char* r) const; - - // @cmember Converte da video a campo - virtual const char* win2raw(const char* w) const; - - // @cmember Ritorna TRUE se il campo e' vuoto - virtual bool empty() const { return _str.empty(); } - - // @cmember Ritorna la dimensione del buffer associato al campo - virtual word size() const { return _size; } - - // @cmember Ritorna il tipo di check assegnato al campo (vedi ) - virtual CheckType check_type() const - { return _check; } - - // @cmember Setta il tipo di check da assegnare al campo (vedi ) - void check_type(CheckType c) - { _check = c; } - - // @cmember Controlla se un campo e' forced - bool forced() const - { return _forced;} - - // @cmember Esegue il controllo - virtual bool check(CheckTime = RUNNING_CHECK); - // @cmember Ritorna l'oggetto _browse - - // @cmember Ritorna l'oggetto _browse - TBrowse* browse() const - { return (_browse && _browse->is_browse()) ? (TBrowse*)_browse : NULL; } - - // @cmember Ritorna l'oggetto _sheet - TList_sheet* sheet() const - { return (_browse && !_browse->is_browse()) ? (TList_sheet*)_browse : NULL;} - - // @cmember Permette di abilitare/disabilitare il campo - virtual void enable(bool on = TRUE); - - // @cmember Permette di abilitare/disabilitare il check del campo - void enable_check(bool on = TRUE) ; - - // @cmember Attiva o no la selezione automatica del testo - void autoselect(bool on); - - // @cmember Controlla se un campo ha abilitato o disabilitato il check (TRUE se abilitato) - bool check_enabled() const - { return _check_enabled;} - - // @cmember Ritorna la picture del campo - const char* picture() const - { return _picture; } - - // @cmember Costruttore - TEdit_field(TMask* mask); - // @cmember Distruttore - virtual ~TEdit_field(); -}; - -// @doc EXTERNAL - -// @class TReal_field | Classe per la gestione dei campi di numeri reali -// -// @base public | TEdit_field -class TReal_field : public TEdit_field -// @author:(INTERNAL) Guido -{ - // @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Numero di decimeali del campo - int _decimals; - - // @access Protected Member -protected: // TMask_field - // @cmember Ritorna l'identificatore della calsse - virtual word class_id() const; - - virtual bool is_kind_of(word cid) const; - - // @cmember Crea il controllo - virtual void create(WINDOW parent); - - // @cmember Legge un item del controllo dal file .msk

- virtual void parse_head(TScanner& scanner); - // @cmember Legge una riga di definizione del controllo dal file .msk

- virtual bool parse_item(TScanner& scanner); - -protected: // TEditable_field - virtual const char* reformat(const char* data) const; - - virtual const char* win2raw(const char* data) const; - - virtual const char* raw2win(const char* data) const; - - // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) - virtual bool on_key(KEY key); - -protected: - // @cmember Setta il valore del cambio nel campo - virtual void exchange(bool show_value, const real& n); - - // @access Public Member -public: - // @cmember Setta la precisione (numero di decimali) del reale e la sua picture - void set_decimals(int d); - // @cmember Ritorna la precisione del reale (numero di decimali) - int decimals() const - { return _decimals; } - - // @cmember Costruttore - TReal_field(TMask* mask); - // @cmember Distruttore - virtual ~TReal_field() { } -}; - -// @doc EXTERNAL - -// @class TDate_field | Classe per la gestione dei campi data -// -// @base public | TEdit_field -class TDate_field : public TEdit_field - -// @author:(INTERNAL) Guido -{ - // @access Protected Member -protected: // TMask_field - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - // @cmember Crea il controllo - virtual void create(WINDOW parent); - -protected: // TOperable_field - // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) - virtual bool on_key(KEY key); - -protected: // TEditable_field - // @cmember Converte una eventuale data ANSI in formato gg-mm-aaaa - const char* reformat(const char* str) const; - - // @cmember Converte l'input dell'utente in una data - virtual const char* win2raw(const char* data) const; - - // @cmember Formatta una data normale o ANSI in gg-mm-aaaa - virtual const char* raw2win(const char* data) const; - - // @cmember Scrive sulla relazione il valore del campo gestendo formato ANSI - virtual bool autosave(TRelation& r) const; - - // @access Public Member -public: - // @cmember Legge un item del controllo dal file

- virtual void parse_head(TScanner& scanner); - - virtual bool is_kind_of(word cid) const; - - // @cmember Costruttore - TDate_field(TMask* mask); - - // @cmember Distruttore - virtual ~TDate_field() { } -}; - - -// @doc EXTERNAL - -// @class TList_field | Classe per la gestione dei campi lista (list box) -// -// @base public | TEditable_field -class TList_field : public TEditable_field -// @author:(INTERNAL) Guido -{ - word _size; - // @access Private Member - // @cmember Crea una lista con i mesi - void add_list(); - - // @cmember seleziona all'offset dato dal corrente - bool select_by_ofs(int n); - - // @access Protected Member -protected: - // @cmember Lista delle voci - TToken_string _values; - // @cmember Lista dei codice delle voci - TToken_string _codes; - - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - - // @cmember Legge il valore del campo direttamente dalla finestra del controllo - virtual TString& get_window_data(); - - virtual void set_window_data(const char* data); - - // @cmember Crea il controllo - virtual void create(WINDOW parent); - - // @cmember Setta la voce corrente - virtual void current(int n); - // @cmember Ritorna la voce corrente - virtual int current() const; - - // @cmember Trasforma la voce nel corrispondente valore - int str2curr(const char* data); - // @cmember Gestisce la chiamata all'handler del campo - virtual bool on_hit(); - // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) - virtual bool on_key(KEY key); - - // @cmember Legge dal file gli item dello sheet - virtual void read_item(TScanner& scanner); - - // @cmember Legge la testata del controllo dal file

- virtual void parse_head(TScanner& scanner); - - // @cmember Legge un item del controllo dal file

- virtual bool parse_item(TScanner& scanner); - - // @access Public Member -public: - - // @cmember Ritorna la dimensione del buffer associato al campo - virtual word size() const { return _size; } - - // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca - virtual bool has_query_button() const - { return TRUE; } - - // @cmember Conversione da formato visuale a valore - virtual const char* win2raw(const char* data) const; - - // @cmember Conversione da valore a formato visuale - virtual const char* raw2win(const char* data) const; - - // @cmember Scrive il valore del campo direttamente dalla finestra del controllo - virtual void set(const char* data); - - // @cmember Ritorna la tokenstring dei codici ammessi - const char* get_codes() const { return _codes; } - - // @cmember Ritorna la tokenstring dei valori ammessi - const char* get_values() const { return _values; } - - // @cmember Sostituisce alle voci correnti quelle passate come parametri - virtual void replace_items(const char* codes, const char* values); - - // @cmember Aggiunge una voce - virtual void add_item(const char* code_value); - - // @cmember Elimina la voce con codice

- virtual void delete_item(const char* code); - - // @cmember Ritorna il numero di voci presenti - int items() const; - - // @cmember Tipo - virtual bool is_kind_of(word cid) const; - - // @cmember Seleziona sulla base dell'iniziale - bool select_by_initial(char c); - - // @cmember Seleziona il prossimo se possibile (no wrap) - bool select_next() { return select_by_ofs(1); } - - // @cmember Seleziona il precedente se possibile (no wrap) - bool select_prev() { return select_by_ofs(-1); } - - // @cmember Azzera il contenuto del campo - virtual void reset(); - - // @cmember Costruttore - TList_field(TMask* mask); - virtual ~TList_field() {} -}; - -// @doc EXTERNAL - -// @class TRadio_field | Classe per la gestione dei campi lista (list box) -// -// @base public | TList_field -class TRadio_field : public TList_field -// @author:(INTERNAL) Guido -{ - // @access Protected Member -protected: - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - // @cmember Crea il controllo - virtual void create(WINDOW parent); - // @cmember Permette di abilitare/disabilitare il radio button (vedi ) - - // @cmember Setta la voce corrente - virtual void current(int n); - // @cmember Ritorna la voce corrente - virtual int current() const; - - // @access Public Member -public: - // @cmember Costruttore - TRadio_field(TMask* mask); - // @cmember Distruttore - virtual ~TRadio_field(); -}; - - -// @doc EXTERNAL - -// @class TMemo_field | Classe per la gestione dei campi memo -// -// @base public | TMask_field -class TMemo_field : public TEdit_field -// @author:(INTERNAL) Guido -{ - // @access:(INTERNAL) Private Member - - // @access Protected Member -protected: // TObject - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const - { return CLASS_MEMO_FIELD; } - // @cmember Ritorna il nome della classe - virtual const char* class_name() const - { return "MEMO"; } - -protected: // TMask_field - // @cmember Crea il controllo - virtual void create(WINDOW parent); - // @cmember Legge un item del controllo dal file

- virtual void parse_head(TScanner& scanner); - -protected: // TEditable_field - // Gestisce solo l'acquisto e la perdita del focus - virtual bool on_key(KEY k); - // @cmember Non fa' nulla - virtual const char* reformat(const char* data) const; - // @cmember Trasforma i '\n' in '\r' - virtual const char* raw2win(const char* data) const; - // @cmember Trasforma i '\r' in '\n' - virtual const char* win2raw(const char* data) const; - - // @access Public Member -public: - // @cmember Costruttore - TMemo_field(TMask* mask); - // @cmember Distruttore - virtual ~TMemo_field(); -}; - -// @doc EXTERNAL - -// @class TZoom_field | Come ma zooma per l'editing dei campi memo -// -// @base public | TEdit_field -class TZoom_field : public TEdit_field -// @author:(INTERNAL) Guido -{ - // @access Protected Member -protected: - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const - { return CLASS_ZOOM_FIELD; }; - // @cmember Ritorna il nome della classe - virtual const char* class_name() const - { return "ZOOM"; } - -protected: - // @cmember Crea il controllo - virtual void create(WINDOW parent); - - // @cmember Gestisce tasti inviati al controllo - virtual bool on_key(KEY key); - -protected: - // @cmember Non fa nulla - virtual const char* reformat(const char* data) const; - - // @cmember Trasforma

in una riga sola - virtual const char* raw2win(const char* data) const; - - // @cmember Trasforma la riga

nell'intero memo - virtual const char* win2raw(const char* data) const; - - // @access Public Member -public: - const char* get_first_line() const; - - // @cmember Costruttore - TZoom_field(TMask* mask); - // @cmember Distruttore - virtual ~TZoom_field(); -}; - -#endif // __MASKFLD_H - - +#ifndef __MASKFLD_H +#define __MASKFLD_H + +#ifndef __DATE_H +#include +#endif + +#ifndef __REAL_H +#include +#endif + +#ifndef __SCANNER_H +#include +#endif + +class TControl; // __CONTROL_H +class TText_control; +class TPushbutton_control; + +class TRelation; // __RELATION_H +class TCursor; +class TFieldref; + +class TArray_sheet; // __SHEET_H + +class TMask_field; // Convenience + + +// @doc EXTERNAL + +// @enum Tipo di check da eseguire su un controllo +enum CheckType { + CHECK_NONE, // @emem Nessun controllo + CHECK_NORMAL, // @emem Controllo normale (non e' un campo obbligatorio) + CHECK_REQUIRED, // @emem Controlla se il campo non e' vuoto e fa un check normale + CHECK_SEARCH // @emem Controlla se il campo c'e' ma non da' nessuna segnalazione se e' errato +}; + +// @doc EXTERNAL + +// @enum Momento di richiesta del check +enum CheckTime { + RUNNING_CHECK, // @emem Check chiamato mentra la maschera sta andando + STARTING_CHECK, // @emem Check chiamato al caricamento della maschera + FINAL_CHECK }; // @emem Check chiamato quando la maschera si sta fermando + +// @type CONTROL_HANDLER | Prototipo funzione per gestire i tasti speciali all'interno di un controllo +typedef bool (*CONTROL_HANDLER)(TMask_field& field, KEY key); + +// @doc EXTERNAL + +// @class TMask_field | Classe per la definizione delle operazioni sui campi di +// una maschera +// +// @base public | TObject +class TMask_field : public TObject +// @author:(INTERNAL)Guido +{ + // @cfriend TMask + friend class TMask; + +// @access:(INTERNAL) Private Member + + // @cmember:(INTERNAL) Maschera all'interno del quale e' contenuto il campo + TMask* _mask; + + // @cmember:(INTERNAL) Gruppi cui appartiene il campo + TBit_array* _groups; + + // @access Protected Member +protected: + // @cmember Controllo vero e proprio + TControl* _ctl; + + // @cmember + // @comm Struttura usata solo durante la creazione di un controllo + struct TControl_data + { + short _dlg; // Identifier + short _x, _y; // Position + short _width; // Width + short _height; // Height + word _size; // Buffer size + short _decimals; // Precision + TString _prompt; // Prompt + TString _flags; // Flags + short _bmp_up; // Bitmap up + short _bmp_dn; // Bitmap down + TToken_string _park; // Work string + void reset(); + }; + static TControl_data _ctl_data; + + // @cmember | _flags | | Flag indicante lo stato del campo + struct TField_Flags + { + bool automagic : 1; + bool button : 1; + bool dirty : 2; // Modified during run ? + bool enabled : 1; // Is editable + bool enable_default : 1; + bool firm : 1; // Is the current firm ? + bool focusdirty : 1; // Modified during focus ? + bool ghost : 1; + bool password : 1; + bool persistent : 1; + bool rightjust : 1; + bool roman : 1; // Is a Roman number ? + bool shown : 1; // Is visible + bool show_default : 1; + byte trim : 2; // Trim the string + bool uppercase : 1; + bool exchange : 1; // Value exchange + bool zerofilled : 1; + bool pipeallowed : 1; + + TField_Flags(); + char update(const char*); + } _flags; + + // @cmember Costruisce il campo da file + void construct(TScanner& scanner, WINDOW parent); + // @cmember Costruisce il campo con i suoi parametri + void construct(short id, const char* prompt, int x, int y, int len, WINDOW parent, const char* flags = "", int width = 0); + + // @cmember Legge la testata del controllo dal file .msk

+ virtual void parse_head(TScanner& scanner); + // @cmember Legge una riga di definizione del controllo dal file .msk

+ virtual bool parse_item(TScanner& scanner); + + // @cmember Crea il controllo (chiama ) + virtual void create(WINDOW parent) pure; + + // @cmember Setta il focus sul campo + virtual void highlight() const; + + // @cmember Manda al campo

un tasto (chiama ) + void send_key(KEY k, short to); + + // @access Public Member +public: // TObject + virtual bool is_kind_of(word cid) const; + +public: + // @cmember Converte una stringa in un identificatore di controllo + short atodlg(const char* s) const; + + // @cmember Ritorna la finestra padre + virtual WINDOW parent() const; + + RCT& get_rect(RCT& r) const; + void set_rect(const RCT& r); + + // @cmember Ritorna l'identificatore del controllo + virtual short dlg() const; + + // @cmember Controlla se si tratta di un controllo corretto + virtual bool ok() const; + + // @cmember Ritorna TRUE se il campo e' stato modificato + bool dirty() const + { return _flags.dirty; } + // @cmember Ritorna TRUE se il campo e' stato modificato dall'ultima volta che ha ricevuto il focus + bool focusdirty() const + { return _flags.focusdirty; } + // @cmember Setta lo stato di focusdirty del campo + void set_focusdirty(bool d = TRUE) + { _flags.focusdirty = d; } + // @cmember Setta lo stato di dirty del campo + void set_dirty(bool d = TRUE); + + // @cmember abilita il trim degli spazi + void set_trim(bool t) + { _flags.trim = t ? 3 : 0; } + + // @cmember Setta la giustificazione a destra del campo + void set_justify(bool r) + { _flags.rightjust = r; } + + // @cmember Verifica la giustificazione a destra del campo + bool right_justified() const + { return _flags.rightjust; } + + // @cmember Ritorna TRUE se il campo e' in maiuscolo + bool uppercase() const + { return _flags.uppercase; } + + // @cmember Verifica la allowance of the pipe + bool pipe_allowed() const + { return _flags.pipeallowed; } + + // @cmember Allowa la pippa + void allow_pipe(bool r = TRUE) + { _flags.pipeallowed = r; } + + // @cmember Ritorna il nome della classe + virtual const char* class_name() const; + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + + // @cmember Ritorna TRUE se il campo e' un numero romano + bool roman() const + { return _flags.roman; } + // @cmember Ritorna TRUE se il campo e' automagic + bool automagic() const + { return _flags.automagic; } + // @cmember Ritorna TRUE se ha un bottone di campo + bool has_button() const + { return _flags.button; } + // @cmember Ritorna TRUE se si tratta di campo fantasma + bool ghost() const + { return _flags.ghost; } + // @cmember Ritorna TRUE se si tratta di campo in valuta + bool exchangeable() const + { return _flags.exchange; } + + // @cmember Controlla se il campo appartiene ad un achiave di ricerca + virtual bool in_key(byte) const + { return FALSE; } + // @cmember Controlla se il campo ha un check + virtual bool has_check() const + { return FALSE;} + // @cmember Controlla se il campo ha una richiesta + virtual bool has_query_button() const + { return FALSE;} + // @cmember Ritorna il campo corrispondente su record + virtual const TFieldref* field() const + { return NULL; } + + // @cmember Ritorna il tipo di checktype del campo + virtual void check_type(CheckType); + + // @cmember Ritorna lo stato di checktype del campo + virtual CheckType check_type() const + { return CHECK_NONE; } + // @cmember Ritorna TRUE se il checktype del campo e

+ bool required() const + { return check_type() == CHECK_REQUIRED; } + + // @cmember Controlla la validita' del campo + virtual bool check(CheckTime = RUNNING_CHECK) + { return TRUE;} + + // @cmember Azzera il contenuto del campo + virtual void reset(); + + // @cmember Abilita/disabilita il campo (lo rende scrivibile) + virtual void enable(bool on = TRUE); + + // @cmember Abilita/disabilita il campo (chiama ) + void disable() + { enable(FALSE); } + // @cmember Controlla se un campo e' abilitato + virtual bool enabled() const + { return _flags.enabled; } + // @cmember Rimette lo stato di dis/abilitazione del campo a seconda di come era settato sul file + void enable_default(); + // @cmember Controlla se il campo e abilitato di default + bool enabled_default() const + { return _flags.enable_default; } + + // @cmember Permette di rendere visibile/invisibile un campo + virtual void show(bool on = TRUE); + // @cmember Permette di rendere invisibile un campo (chiama ) + void hide() + { show(FALSE); } + // @cmember Ritorna TRUE se il campo e' visibile + bool shown() const + { return _flags.shown; } + // @cmember Ritorna TRUE se il campo e' nascosto + bool hidden() const + { return !shown(); } + + // @cmember Rimette lo stato di in/visibilta' del campo a seconda di come era + // settato sul file + void show_default(); + + // @cmember Ritorna TRUE se il campo e' sia visibile che abilitato + bool active() const; + + // @cmember Setta l'handler del controllo + virtual void set_handler(CONTROL_HANDLER); + + // @cmember Ritorna TRUE se il campo e' di tipo operable + virtual bool is_operable() const { return FALSE; } + // @cmember Ritorna TRUE se il campo e' di tipo editable + virtual bool is_editable() const { return FALSE; } + // @cmember Ritorna TRUE se il campo e' di tipo edit + virtual bool is_edit() const { return FALSE; } + + // @cmember Permette di spedire il check + bool to_check(KEY k, bool checkrun = FALSE) const; + + // @cmember Gestisce la chiamata all'handler del campo + virtual bool on_hit(); + + // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) + virtual bool on_key(KEY key); + + // @cmember Setta il contenuto del campo inserendo la stringa

+ virtual void set(const char* s); + + // @cmember Setta il contenuto del campo inserendo in numero

+ void set(long n); + + // @cmember Ritorna il contenuto del campo + virtual const TString& get() const; + + virtual bool empty() const { return FALSE; } + + // @cmember Ritorna la dimensione del buffer associato al campo + virtual word size() const { return 0; } + + // @cmember Ritorna il prompt del campo + virtual const char* prompt() const; + // @cmember Setta il prompt del campo + virtual void set_prompt(const char* p); + + // @cmember Controlla se il campo appartiene al gurppo

(TRUE se appartiene) + bool in_group(byte group) const + { return _groups ? (*_groups)[group] : FALSE; } + // @cmember Assegna il campo al grupo

+ void set_group(byte group); + + // @cmember Setta il focus al campo + virtual void set_focus() const; + + // @cmember Crea una message-box relativo al campo (chiama ) + bool message_box(const char* fmt, ...) const; + // @cmember Crea una warning-box relativo al campo (chiama ) + bool warning_box(const char* fmt, ...) const; + // @cmember Crea una error-box relativo al campo (chiama ) + bool error_box(const char* fmt, ...) const; + // @cmember Crea una yesno-box relativo al campo (chiama ) + bool yesno_box(const char* fmt, ...) const; + // @cmember Crea una yesnocancel-box relativo al campo (chiama ) + KEY yesnocancel_box(const char* fmt, ...) const; + + // @cmember Ritorna un reference alla maschera di appartenenza del campo + TMask& mask() const + { return *_mask; } + // @cmember Costruttore + TMask_field(TMask* mask); + // @cmember Distruttore + virtual ~TMask_field(); +}; + +// @doc EXTERNAL + +// @struct TField_Flags | Flag indicante il settaggio del campo +// @comm ATTENZIONE: Questa struttura e' definita ed utilizzata unicamente nella classe +// +// @field bool | automagic: 1 | Indica se il campo e' automagic +// @field bool | dirty: 2 | Indica se il campo e' stato modificato +// @field bool | enabled: 1 | Indica se il campo e' editabile +// @field bool | enable_default: 1 | Indica se il campo e' abilitato di default +// @field bool | firm: 1 | Indica se il campo appartiene alla ditta corrente +// @field bool | focusdirty: 1 | Indica se il campo e' stato modificat mentre aveva il focus +// @field bool | ghost: 1 | Indica se il campo e' ghost +// @field bool | password: 1 | Indica che e' un campo password (no si vede quello che scrivi) +// @field bool | persistent: 1 | Indica se il valore del campo deve rimanere anche quando viene ricaricata la maschera +// @field bool | rightjust: 1 | Indica se il campo e' allineato a destra +// @field bool | roman: 1 | Indica se il campo contiene un numero romano +// @field bool | shown: 1 | Indica se il campo e' visibile +// @field bool | show_default: 1 | Indica se il campo e' visibile di default +// @field bool | trim: 1 | Indica se bisogna fare il trim della stringa (vedi ) +// @field bool | uppercase: 1 | Indica se il campo e' maiuscolo +// @field bool | exchange: 1 | Indica se si tratta di un cambio valuta +// @field bool | zerofilled: 1 | Indica se il campo e' zerofilled +// @field bool | pipeallowed: 1 | Indica se il campo e' pipeallowed +// @field void | TField_Flags() | Costruttore +// @field char | update(const char*) | Aggiorna i bit della struttura secondo i valori letti da file + +// @doc EXTERNAL + + +class TText_field : public TMask_field +{ +protected: + virtual void create(WINDOW parent); + +public: // TObject + word class_id() const; + bool is_kind_of(word cid) const; + +public: + TText_field(TMask* m) : TMask_field(m) {} + virtual ~TText_field() {} +}; + +// @doc EXTERNAL + +// @class TGroup_field | Classe per la gestione del disegno dei group box +// +// @base public | TMask_field +class TGroup_field : public TMask_field +// @author:(INTERNAL) Guido +{ + // @access Protected Member +protected: + // @cmember Legge un item del controllo dal file

+ virtual void parse_head(TScanner& scanner); + // @cmember Crea il controllo + virtual void create(WINDOW parent); + + // @access Public Member +public: + // @cmember Costruttore + TGroup_field(TMask* mask); + virtual ~TGroup_field() {} +}; + + + +class TOperable_field : public TMask_field +{ + // @cmember Comandi da eseguire in caso di modifica del campo + TString_array* _message; + + // @cmember Handler del controllo + CONTROL_HANDLER _handler; + +protected: // TMask_field + bool handler(KEY k); + + virtual bool parse_item(TScanner& scanner); + virtual bool is_operable() const { return TRUE; } + virtual bool on_hit(); + + TToken_string* message(int m, bool crea = FALSE); + + // @cmember Setta il focus sul campo + virtual void highlight() const; + +public: + virtual bool is_kind_of(word cid) const; + + // @cmember Esegue processo in background + virtual void on_idle() {} + + // @cmember Esegue il messaggio

-esimo sul campo + bool do_message(int n); + + // @cmember Controlla se il campo ha un messaggio + virtual bool has_message() const + { return _message != NULL; } + + // @cmember Setta l'handler del controllo + virtual void set_handler(CONTROL_HANDLER handler) + { _handler = handler; } + + // @cmember Setta il focus al campo + virtual void set_focus() const; + + // @cmember Gestisce il tasto

+ virtual bool on_key(KEY k); + + // @cmember Abilita/disabilita il campo (lo rende scrivibile) (vedi ) + virtual void enable(bool on = TRUE); + + // @cmember Setta il valore del cambio nel campo + virtual void exchange(bool, const real&) { } + + TOperable_field(TMask* m); + virtual ~TOperable_field(); +}; + +// @doc EXTERNAL + +// @class TButton_field | Classe per la gestione dei campi bottone +// +// @base public | TMask_field +class TButton_field : public TOperable_field + +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private Member + + // @cmember:(INTERNAL) Valore della combinazione di tasti che sostituisce il bottone + KEY _virtual_key; + // @cmember:(INTERNAL) Tasto generato quando viene premuto il bottone che si sta gestendo + KEY _exit_key; + + // @access Protected Member +protected: + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + + // @cmember Ritorna TRUE se il controllo deriva dalla classe cid + virtual bool is_kind_of(word cid) const; + + // @cmember Crea il controllo + virtual void create(WINDOW parent); + + // @cmember Legge un item del controllo dal file

+ void parse_head(TScanner& scanner); + // @cmember Legge un item del controllo dal file

+ bool parse_item(TScanner& scanner); + + // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) + virtual bool on_key(KEY key); + +public: + // @cmember Ritorna il valore della combinazione di tasti che sostiutiscono il bottone + KEY virtual_key() const + { return _virtual_key; } + // @cmember Ritorna il valore del tasto di uscita + KEY exit_key() const + { return _exit_key; } + + void set_hot_key(KEY k) { _virtual_key = _exit_key = k; } + void set_bmp(short up, short dn); + + // @cmember Costruttore + TButton_field(TMask* mask); + virtual ~TButton_field() {} +}; + +class TEditable_field : public TOperable_field +{ + // @cmember Campo su file + TFieldref* _field; + + // @cmember:(INTERNAL) Prompt del campo + TText_control* _prompt; + + // @cmember:(INTERNAL) Chiave al quale appartiene il campo + TBit_array* _keys; + + // @cmember Messaggi da mandare in caso di errore sul campo + TString* _warning; + + // @cmember:(INTERNAL) Stringa definibile dall'utilizzatore della classe da utilizzare a piacimento + TToken_string* _userdata; + + struct TValidation_data + { + // @cmember Identificatore della funzione di validazione + int _func; + // @cmember Parametri da passara alla funzione di validazione + TArray _parms; + }; + TValidation_data* _validate; + +protected: // TMask_field + virtual bool parse_item(TScanner& scanner); + +protected: + // @cmember Valore corrente del campo + TString _str; + + word create_prompt(WINDOW parent, word width, word heigth); + + virtual const char* reformat(const char* data) const; + virtual TString& get_window_data() pure; + virtual void set_window_data(const char* data) pure; + + int validate_func() const { return _validate ? _validate->_func : -1; } + +public: // TMask_field + // @cmember Ritorna il prompt del campo + virtual const char* prompt() const; + +public: + bool test_key_complete(bool normal = TRUE) const; + // @cmember Controlla se il campo appartiene alla chiave

(TRUE se appartiene) + bool in_key(byte key) const + { return _keys ? (*_keys)[key] : FALSE; } + // @cmember Setta il campo alla chiave

+ void set_key(byte key); + // @cmember Rimuove il campo dalla chiave

+ void reset_key(byte key); + // @cmember Ritorna l'ultima chiave di appartenenza del campo + word last_key() const; + // @cmember Ritorna l'ultima chiave di appartenenza del campo + word first_key() const; + // @cmember Verifica che il campo abbia almeno una chiave in con il campo

+ bool has_a_common_key(const TMask_field & f) const; + + // @cmember Ritorna il nome del campo corrsipondente sul file + virtual const TFieldref* field() const + { return _field; } + // @cmember Setta il nome del campo corrsipondente sul file + void set_field(const TString& fr); + + // @cmember Legge dalla relazione il valore del campo + bool autoload(const TRelation& r); + + // @cmember Scrive sulla relazione il valore del campo + virtual bool autosave(TRelation& r) const; + + // @cmember Chiama l' eventuale funzione di validazione + bool validate(KEY k); + + bool has_warning() const { return _warning != NULL; } + void set_warning(const char* w); + const char* get_warning() const; + + virtual void show(bool on); + + virtual void set_prompt(const char* p); + + // @cmember Setta il contenuto del campo inserendo la stringa

+ virtual void set(const char* s); + + // @cmember Ritorna il contenuto del campo + virtual const TString& get() const; + + // @cmember Trasforma una stringa su file una rappresentabile a video + virtual const char* raw2win(const char* r) const; + + // @cmember Trasforma una stringa a video in un valore su file + virtual const char* win2raw(const char* w) const; + + // @cmember Ritorna TRUE se il campo e' di tipo editable + virtual bool is_editable() const { return TRUE; } + + TEditable_field(TMask* m); + virtual ~TEditable_field(); +}; + + +// @doc EXTERNAL + +// @class TBoolean_field | Classe per la gestione dei campi boolean (check box) +// +// @base public | TEditable_field +class TBoolean_field : public TEditable_field + +// @author:(INTERNAL) Guido +{ + // @access Protected Member +protected: // TMask_field + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + + // @cmember Crea il controllo + virtual void create(WINDOW parent); + + // @cmember Legge un item del controllo dal file

+ virtual bool parse_item(TScanner& scanner); + +protected: // TOperable + // @cmember Gestisce la chiamata all'handler del campo + virtual bool on_hit(); + // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) + virtual bool on_key(KEY key); + +protected: // TEditable + // @cmember Riaggiusta una stringa in formato RAW + virtual const char* reformat(const char* raw) const; + virtual TString& get_window_data(); + virtual void set_window_data(const char* data); + virtual void set_prompt(const char* p); + + // @access Public Members +public: + // @cmember Costruttore + TBoolean_field(TMask* mask); + + // @cmember Distruttore + virtual ~TBoolean_field() {} +}; + + +/////////////////////////////////////////////////////////// +// TBrowse_button +/////////////////////////////////////////////////////////// + +class TEdit_field; + +class TBrowse_button : public TObject +{ + TEdit_field* _fld; + +protected: + // @cmember Ritorna il primo valore di

+ TEdit_field& field() const + { return *_fld; } + + // @cmember Ritorna il campo

-esimo + TEditable_field& field(short id) const; + +public: + // @cmember Controlla la sintassi della input del campo e ne setta i membri + virtual void parse_input(TScanner& scanner) pure; + + // @cmember Controlla la sintassi della output del campo e ne setta i membri + virtual void parse_output(TScanner& scanner) pure; + + virtual KEY run() pure; + + // @cmember Controlla la validita' del campo + virtual bool check(CheckTime = RUNNING_CHECK) pure; + + virtual bool is_browse() const { return FALSE; } + + TBrowse_button(TEdit_field* f); + virtual ~TBrowse_button(); +}; + + +/////////////////////////////////////////////////////////// +// TBrowse +/////////////////////////////////////////////////////////// + +// @class TList_sheet | Classe per la gestione dei list sheet +class TList_sheet : public TBrowse_button +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private Memeber + + // @cmember:(INTERNAL) Numero di riga corrente dello sheet + int _row; + + // @cmember:(INTERNAL) Titolo dello sheet + TString _caption; + + // @cmember:(INTERNAL) Testate delle colonne dello sheet + TToken_string _head; + + // @cmember:(INTERNAL) Righe dello sheet + TString_array _data; + + // @cmember:(INTERNAL) Campi di input sulla maschera + TToken_string _inp_id; + + // @cmember:(INTERNAL) Campi di output sulla maschera + TToken_string _out_id; + + // @access Protected Member +protected: + // @cmember Ritorna il numero di riga selezionata + int do_input(); + // @cmember Scrive l'output della ricerca sulla maschera + void do_output(CheckTime = RUNNING_CHECK); + + // @cmember Controlla la sintassi della input del campo e ne setta i membri + void parse_input(TScanner& scanner); + // @cmember Controlla la sintassi della output del campo e ne setta i membri + void parse_output(TScanner& scanner); + + // @access Public Memeber +public: + // @cmember Legge dal file gli item dello sheet + void parse_item(TScanner& scanner); + + // @cmember Controlla la validita' del campo + virtual bool check(CheckTime = RUNNING_CHECK); + + // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca + virtual KEY run(); + + TString_array& rows_array() { return _data; } + + // @cmember Costruttore + TList_sheet(TEdit_field* f, const char* caption, const char* head); + // @cmember Distruttore + virtual ~TList_sheet(); +}; + +// @doc INTERNAL + +// @class TBrowse | Classe per la definizione dei campi con ricerca +class TBrowse : public TBrowse_button +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private Member + + // @cmember:(INTERNAL) Relazione della ricerca + TRelation* _relation; + // @cmember:(INTERNAL) Cursore sulla relazione + TCursor* _cursor; + // @cmember:(INTERNAL) Comando da eseguire alla pressione del tasto Gestione + TString _insert; + // @cmember:(INTERNAL) Filtro sul cursore + TString _filter; + // @cmember:(INTERNAL) Record selezionato + long _rec; + // @cmember:(INTERNAL) Indica se e' presente un campo secondario nella ricerca + bool _secondary; + // @cmember:(INTERNAL) Indica se sul campo e' gia' stao effettuato il check + bool _checked; + + // @cmember:(INTERNAL) Testata della maschera di ricerca + TToken_string _head; + // @cmember:(INTERNAL) Item della maschera di ricerca + TToken_string _items; + // @cmember:(INTERNAL) Campi di input sulla maschera + TToken_string _inp_id; + // @cmember:(INTERNAL) Campi di input sul file + TToken_string _inp_fn; + // @cmember:(INTERNAL) Campi di output sulla maschera + TToken_string _out_id; + // @cmember:(INTERNAL) Campi di output sul file + TToken_string _out_fn; + + // @access Protected Member +protected: + // @cmember Azzera i campi di output sulla maschera + void do_clear(); + // @cmember Chiama la maschera di gestione della ricerca + bool do_link(bool insert); + + // @cmember Crea lista identificatori di ricerca + TToken_string& create_siblings(TToken_string& siblings); + + // @access Public Member +public: + // @cmember Ritorna il numero di inputs senza contare quelli che funzionano + // solo da filtro + int input_fields(); + + // @cmember Ritorna la lista completa degli identificatori dei campi di input + const char* get_input_fields() const; + + // @cmember Ritorna la lista completa dei nomi dei campi di input + const char* get_input_field_names() const; + + // @cmember Ritorna la lista completa dei campi di output + const char* get_output_fields() const; + + // @cmember Ritorna il numero di campi non vuoti e non filtrati + int do_input(bool filter = FALSE); + + // @cmember Scrive l'output della ricerca sulla maschera + void do_output(CheckTime = RUNNING_CHECK); + + // @cmember Costruttore + TBrowse(TEdit_field* f, TRelation* r, int key = 1, const char* filter = ""); + // @cmember Costruttore + TBrowse(TEdit_field* f, TCursor* c); + // @cmember Distruttore + ~TBrowse(); + + // @cmember Controlla la sintassi della join del campo e ne setta i membri + void parse_join(TScanner& scanner); + // @cmember Controlla la sintassi della input del campo e ne setta i membri + void parse_input(TScanner& scanner); + // @cmember Controlla la sintassi della display del campo e ne setta i membri + void parse_display(TScanner& scanner); + // @cmember Controlla la sintassi della output del campo e ne setta i membri + void parse_output(TScanner& scanner); + // @cmember Controlla la sintassi della insert del campo e ne setta i membri + void parse_insert(TScanner& scanner); + // @cmember Controlla la sintassi della copy del campo e ne setta i membri + bool parse_copy(const TString& what, const TBrowse& b); + + // @cmember Permette di settare il comando alla pressione del tasto Gestione + void set_insert(const char* s) + { _insert = s;} + // @cmember Ritorna il valore di

+ const TString& get_insert() const + { return _insert;} + // @cmember Ritorna il valore di

+ const TString& get_filter() const + { return _filter;} + + // @cmember Controlla la validita' del campo + bool check(CheckTime = RUNNING_CHECK); + // @cmember Controlla se il campo puo' essere vuoto + bool empty_check(); + // @cmember Ritorna il valore di

+ const TToken_string& head() const + { return _head;} + // @cmember Ritorna il valore di

+ const TToken_string& items() const + { return _items;} + // @cmember Ritorna il valore di

+ TCursor* cursor() const + { return _cursor;} + // @cmember Ritorna il valore di

+ bool checked() const + { return _checked;} + // @cmember Ritorna il valore di

+ bool secondary() const + { return _secondary;} + + virtual bool is_browse() const { return TRUE; } + + // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca + virtual KEY run(); +}; + + +// @doc EXTERNAL + +// @class TEdit_field | Classe per la definizione dei campi editabili +// +// @base public | TEditable_field +class TEdit_field : public TEditable_field +{ + // @access Protected Member +protected: + // @cmember Formato che deve avere il campo + TString _picture; + + // @cmember Dimensione del buffer del campo + word _size; + + // @cmember Accettabilita' di valori nulli + CheckType _check; + // @cmember Controllo da effettuare anche in + bool _forced; + // @cmember Controllo abilitato + bool _check_enabled; + + // @cmember Oggetto che contiene la ricerca e il controllo del campo + TBrowse_button* _browse; + + // @cmember Ritorna la browse + const TBrowse* parse_browse(TScanner& scanner) const; + + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + // @cmember Legge la testata del controllo dal file

+ virtual void parse_head(TScanner& scanner); + // @cmember Legge un item del controllo dal file

+ virtual bool parse_item(TScanner& scanner); + + // @cmember Crea il controllo + virtual void create(WINDOW parent); + + // @cmember Ritorna

formattato secondo i flags settati del campo + virtual const char* reformat(const char* data) const; + + // @cmember Scrive il valore del campo direttamente sulla finestra del controllo + virtual void set_window_data(const char* data); + + // @cmember Mostra un messaggio di errore di default per il campo + bool default_error_box() const; + + // @access Public Member +public: + // @cmember Gestisce la chiamata all'handler del campo + virtual bool on_hit(); + // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) + virtual bool on_key(KEY key); + // @cmember Controlla se il campo ha un check + virtual bool has_check() const; + // @cmember Controlla se il campo ha una ricerca + virtual bool has_query_button() const + { return _browse != NULL;} + + // @cmember Ritorna TRUE se il campo e' di tipo edit + virtual bool is_edit() const { return TRUE; } + + // @cmember Legge il valore del campo direttamente dalla finestra del controllo + virtual TString& get_window_data(); + + // @cmember Converte da campo a video + virtual const char* raw2win(const char* r) const; + + // @cmember Converte da video a campo + virtual const char* win2raw(const char* w) const; + + // @cmember Ritorna TRUE se il campo e' vuoto + virtual bool empty() const { return _str.empty(); } + + // @cmember Ritorna la dimensione del buffer associato al campo + virtual word size() const { return _size; } + + // @cmember Ritorna il tipo di check assegnato al campo (vedi ) + virtual CheckType check_type() const + { return _check; } + + // @cmember Setta il tipo di check da assegnare al campo (vedi ) + void check_type(CheckType c) + { _check = c; } + + // @cmember Controlla se un campo e' forced + bool forced() const + { return _forced;} + + // @cmember Esegue il controllo + virtual bool check(CheckTime = RUNNING_CHECK); + // @cmember Ritorna l'oggetto _browse + + // @cmember Ritorna l'oggetto _browse + TBrowse* browse() const + { return (_browse && _browse->is_browse()) ? (TBrowse*)_browse : NULL; } + + // @cmember Ritorna l'oggetto _sheet + TList_sheet* sheet() const + { return (_browse && !_browse->is_browse()) ? (TList_sheet*)_browse : NULL;} + + // @cmember Permette di abilitare/disabilitare il campo + virtual void enable(bool on = TRUE); + + // @cmember Permette di abilitare/disabilitare il check del campo + void enable_check(bool on = TRUE) ; + + // @cmember Attiva o no la selezione automatica del testo + void autoselect(bool on); + + // @cmember Controlla se un campo ha abilitato o disabilitato il check (TRUE se abilitato) + bool check_enabled() const + { return _check_enabled;} + + // @cmember Ritorna la picture del campo + const char* picture() const + { return _picture; } + + // @cmember Costruttore + TEdit_field(TMask* mask); + // @cmember Distruttore + virtual ~TEdit_field(); +}; + +// @doc EXTERNAL + +// @class TReal_field | Classe per la gestione dei campi di numeri reali +// +// @base public | TEdit_field +class TReal_field : public TEdit_field +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private Member + + // @cmember:(INTERNAL) Numero di decimeali del campo + int _decimals; + + // @access Protected Member +protected: // TMask_field + // @cmember Ritorna l'identificatore della calsse + virtual word class_id() const; + + virtual bool is_kind_of(word cid) const; + + // @cmember Crea il controllo + virtual void create(WINDOW parent); + + // @cmember Legge un item del controllo dal file .msk

+ virtual void parse_head(TScanner& scanner); + // @cmember Legge una riga di definizione del controllo dal file .msk

+ virtual bool parse_item(TScanner& scanner); + +protected: // TEditable_field + virtual const char* reformat(const char* data) const; + + virtual const char* win2raw(const char* data) const; + + virtual const char* raw2win(const char* data) const; + + // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) + virtual bool on_key(KEY key); + +protected: + // @cmember Setta il valore del cambio nel campo + virtual void exchange(bool show_value, const real& n); + + // @access Public Member +public: + // @cmember Setta la precisione (numero di decimali) del reale e la sua picture + void set_decimals(int d); + // @cmember Ritorna la precisione del reale (numero di decimali) + int decimals() const + { return _decimals; } + + // @cmember Costruttore + TReal_field(TMask* mask); + // @cmember Distruttore + virtual ~TReal_field() { } +}; + +// @doc EXTERNAL + +// @class TDate_field | Classe per la gestione dei campi data +// +// @base public | TEdit_field +class TDate_field : public TEdit_field + +// @author:(INTERNAL) Guido +{ + // @access Protected Member +protected: // TMask_field + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + // @cmember Crea il controllo + virtual void create(WINDOW parent); + +protected: // TOperable_field + // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) + virtual bool on_key(KEY key); + +protected: // TEditable_field + // @cmember Converte una eventuale data ANSI in formato gg-mm-aaaa + const char* reformat(const char* str) const; + + // @cmember Converte l'input dell'utente in una data + virtual const char* win2raw(const char* data) const; + + // @cmember Formatta una data normale o ANSI in gg-mm-aaaa + virtual const char* raw2win(const char* data) const; + + // @cmember Scrive sulla relazione il valore del campo gestendo formato ANSI + virtual bool autosave(TRelation& r) const; + + // @access Public Member +public: + // @cmember Legge un item del controllo dal file

+ virtual void parse_head(TScanner& scanner); + + virtual bool is_kind_of(word cid) const; + + // @cmember Costruttore + TDate_field(TMask* mask); + + // @cmember Distruttore + virtual ~TDate_field() { } +}; + + +// @doc EXTERNAL + +// @class TList_field | Classe per la gestione dei campi lista (list box) +// +// @base public | TEditable_field +class TList_field : public TEditable_field +// @author:(INTERNAL) Guido +{ + word _size; + // @access Private Member + // @cmember Crea una lista con i mesi + void add_list(); + + // @cmember seleziona all'offset dato dal corrente + bool select_by_ofs(int n); + + // @access Protected Member +protected: + // @cmember Lista delle voci + TToken_string _values; + // @cmember Lista dei codice delle voci + TToken_string _codes; + + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + + // @cmember Legge il valore del campo direttamente dalla finestra del controllo + virtual TString& get_window_data(); + + virtual void set_window_data(const char* data); + + // @cmember Crea il controllo + virtual void create(WINDOW parent); + + // @cmember Setta la voce corrente + virtual void current(int n); + // @cmember Ritorna la voce corrente + virtual int current() const; + + // @cmember Trasforma la voce nel corrispondente valore + int str2curr(const char* data); + // @cmember Gestisce la chiamata all'handler del campo + virtual bool on_hit(); + // @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo) + virtual bool on_key(KEY key); + + // @cmember Legge dal file gli item dello sheet + virtual void read_item(TScanner& scanner); + + // @cmember Legge la testata del controllo dal file

+ virtual void parse_head(TScanner& scanner); + + // @cmember Legge un item del controllo dal file

+ virtual bool parse_item(TScanner& scanner); + + // @access Public Member +public: + + // @cmember Ritorna la dimensione del buffer associato al campo + virtual word size() const { return _size; } + + // @cmember Esegue la ricerca. Torna il tasto che ha terminato la ricerca + virtual bool has_query_button() const + { return TRUE; } + + // @cmember Conversione da formato visuale a valore + virtual const char* win2raw(const char* data) const; + + // @cmember Conversione da valore a formato visuale + virtual const char* raw2win(const char* data) const; + + // @cmember Scrive il valore del campo direttamente dalla finestra del controllo + virtual void set(const char* data); + + // @cmember Ritorna la tokenstring dei codici ammessi + const char* get_codes() const { return _codes; } + + // @cmember Ritorna la tokenstring dei valori ammessi + const char* get_values() const { return _values; } + + // @cmember Sostituisce alle voci correnti quelle passate come parametri + virtual void replace_items(const char* codes, const char* values); + + // @cmember Aggiunge una voce + virtual void add_item(const char* code_value); + + // @cmember Elimina la voce con codice

+ virtual void delete_item(const char* code); + + // @cmember Ritorna il numero di voci presenti + int items() const; + + // @cmember Tipo + virtual bool is_kind_of(word cid) const; + + // @cmember Seleziona sulla base dell'iniziale + bool select_by_initial(char c); + + // @cmember Seleziona il prossimo se possibile (no wrap) + bool select_next() { return select_by_ofs(1); } + + // @cmember Seleziona il precedente se possibile (no wrap) + bool select_prev() { return select_by_ofs(-1); } + + // @cmember Azzera il contenuto del campo + virtual void reset(); + + // @cmember Costruttore + TList_field(TMask* mask); + virtual ~TList_field() {} +}; + +// @doc EXTERNAL + +// @class TRadio_field | Classe per la gestione dei campi lista (list box) +// +// @base public | TList_field +class TRadio_field : public TList_field +// @author:(INTERNAL) Guido +{ + // @access Protected Member +protected: + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + // @cmember Crea il controllo + virtual void create(WINDOW parent); + // @cmember Permette di abilitare/disabilitare il radio button (vedi ) + + // @cmember Setta la voce corrente + virtual void current(int n); + // @cmember Ritorna la voce corrente + virtual int current() const; + + // @access Public Member +public: + // @cmember Costruttore + TRadio_field(TMask* mask); + // @cmember Distruttore + virtual ~TRadio_field(); +}; + + +// @doc EXTERNAL + +// @class TMemo_field | Classe per la gestione dei campi memo +// +// @base public | TMask_field +class TMemo_field : public TEdit_field +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private Member + + // @access Protected Member +protected: // TObject + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const + { return CLASS_MEMO_FIELD; } + // @cmember Ritorna il nome della classe + virtual const char* class_name() const + { return "MEMO"; } + +protected: // TMask_field + // @cmember Crea il controllo + virtual void create(WINDOW parent); + // @cmember Legge un item del controllo dal file

+ virtual void parse_head(TScanner& scanner); + +protected: // TEditable_field + // Gestisce solo l'acquisto e la perdita del focus + virtual bool on_key(KEY k); + // @cmember Non fa' nulla + virtual const char* reformat(const char* data) const; + // @cmember Trasforma i '\n' in '\r' + virtual const char* raw2win(const char* data) const; + // @cmember Trasforma i '\r' in '\n' + virtual const char* win2raw(const char* data) const; + + // @access Public Member +public: + // @cmember Costruttore + TMemo_field(TMask* mask); + // @cmember Distruttore + virtual ~TMemo_field(); +}; + +// @doc EXTERNAL + +// @class TZoom_field | Come ma zooma per l'editing dei campi memo +// +// @base public | TEdit_field +class TZoom_field : public TEdit_field +// @author:(INTERNAL) Guido +{ + // @access Protected Member +protected: + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const + { return CLASS_ZOOM_FIELD; }; + // @cmember Ritorna il nome della classe + virtual const char* class_name() const + { return "ZOOM"; } + +protected: + // @cmember Crea il controllo + virtual void create(WINDOW parent); + + // @cmember Gestisce tasti inviati al controllo + virtual bool on_key(KEY key); + +protected: + // @cmember Non fa nulla + virtual const char* reformat(const char* data) const; + + // @cmember Trasforma

in una riga sola + virtual const char* raw2win(const char* data) const; + + // @cmember Trasforma la riga

nell'intero memo + virtual const char* win2raw(const char* data) const; + + // @access Public Member +public: + const char* get_first_line() const; + + // @cmember Costruttore + TZoom_field(TMask* mask); + // @cmember Distruttore + virtual ~TZoom_field(); +}; + +#endif // __MASKFLD_H + + diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 686e9a54b..0c7cdb869 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -236,7 +236,7 @@ TSpreadsheet::TSpreadsheet( : _mask(maskname, maskno), _notify(NULL), _cur_row(0), _cur_col(1), _cur_rec(0), _edit_field(NULL), _active(TRUE), - _row_dirty(FALSE), _check_enabled(TRUE), + _row_dirty(FALSE), _cell_dirty(FALSE), _check_enabled(TRUE), _needs_update(-1) { const int NUMBER_WIDTH = 3; @@ -828,7 +828,11 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) break; case XIE_BUTTON: if (xiev->v.xi_obj->type == XIT_CELL) - dispatch_e_char(parent(), K_F9); + { + const bool ok = (bool)xi_move_focus(xiev->v.xi_obj); + if (ok) + dispatch_e_char(parent(), K_F9); + } else if (xiev->v.xi_obj->type == XIT_LIST) { @@ -1020,7 +1024,6 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) case K_F9: if (_edit_field != NULL) { - /* Guy! */ notify_change(); copy_cell2field(); } @@ -1033,7 +1036,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) notify_change(); bool ok = TRUE; - if (_edit_field->is_kind_of(CLASS_LIST_FIELD) && k == K_F9) // list + if (k == K_F9 && _edit_field->is_kind_of(CLASS_LIST_FIELD)) // list { XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col); // droppa giu' @@ -1098,22 +1101,28 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) { refused = TRUE; beep(); - } - else if (_edit_field->is_kind_of(CLASS_LIST_FIELD)) + } else + if (_edit_field->is_kind_of(CLASS_LIST_FIELD)) { TList_field& lst = ((TList_field&)*_edit_field); + bool changed = FALSE; switch (k) { case K_RIGHT: - lst.select_next(); + changed = lst.select_next(); break; case K_LEFT: - lst.select_prev(); + changed = lst.select_prev(); break; default: if (k >= ' ' && k <= 'z') - lst.select_by_initial(k); + changed = lst.select_by_initial(k); break; + } + if (changed) + { + XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col); + xi_set_text(&cell, (char*)(const char*)lst.get()); } refused = TRUE; } @@ -1805,9 +1814,17 @@ void TSheet_field::select(int r, bool scrollto) bool TSheet_field::on_key(KEY k) { - if (k == K_TAB && !focusdirty() && items() > 0) - { - select(0); + if (k == K_TAB) + { + if (focusdirty()) + { + TSpreadsheet* s = (TSpreadsheet*)_ctl; + if (!s->off_cell_handler()) + return FALSE; + } + else + if (items() > 0) + select(0); } if (k == K_ROWEDIT && items() > 0) diff --git a/include/progind.cpp b/include/progind.cpp index 809a51a1c..de331ed0a 100755 --- a/include/progind.cpp +++ b/include/progind.cpp @@ -1,260 +1,260 @@ -#include -#include -#include -#include - -const char* const TITLE_TEXT = "Attesa"; - -word TIndwin::measure_text(TToken_string& s, word& maxlen) const -{ - word lines = 0; - for(const char* t = s.get(0); t; t = s.get()) - { - const word l = strlen(t); - if (l > maxlen) maxlen = l; - lines++; - } - return lines; -} - -// Certified 70% -TIndwin::TIndwin(long max, const char* txt, bool cancel, bool bar, int div) - : _text(NULL), _cancel(NULL), _bar(0), - _status(0L), _max(max), _flags(0x0) -{ - if (_max <= 0) _max = 1; - - TToken_string testo(txt, '\n'); - word maxlen = div; - const word lines = measure_text(testo, maxlen); - - int ver = lines+2; - - int hor = maxlen+2; if (hor > 78) hor = 78; - - if (bar) - { - _bar = ver * CHARY; - ver += 2; - } - ver += cancel ? 2 : 0; - - set_win(create_interface(TASK_WIN, -1, -1, hor, ver, TITLE_TEXT, this, FALSE)); - - _text = new TMultiline_control(win(), DLG_NULL, 1, 1, hor-2, lines, 512, "CD", ""); - - testo.replace('\n', '\r'); - _text->set_caption(testo); - - if (cancel) - { - _cancel = new TPushbutton_control(win(), DLG_CANCEL, -11, -1, 10, 2, "", "Annulla", BMP_CANCEL); - } - open_modal(); - do_events(); -} - -// @doc EXTERNAL - -// @mfunc Setta il testo della finestra -void TIndwin::set_text( - const char* t) // @parm Testo della finestra - - // @comm Si puo' chiamare questa funzione per cambiare il testo, ma - // le dimensioni della finestra sono calcolate sul primo testo - // passato, quindi occorre dimensionare correttamente il primo passato - // (es. inserire degli spazi) se se ne prevede uno piu' lungo. -{ - _text->set_caption(t); -} - -TIndwin::~TIndwin() -{ - close_modal(); - - if (_text) delete _text; - if (_cancel) delete _cancel; -} - -bool TIndwin::can_be_closed() const -{ - const bool ok = (_flags & IND_FINISHED) || (_flags & IND_CANCELLED); - if (!ok) error_box("Attendere la fine dell'operazione prima di chiudere l'applicazione"); - return ok; -} - -KEY TIndwin::check_stop() -{ - KEY k = 0; - if ((_flags & IND_FINISHED) || (_flags & IND_CANCELLED)) - { - k = (_flags & IND_FINISHED) ? K_ENTER : K_ESC; - stop_run(k); - } - return k; -} - -void TIndwin::update_bar() -{ - if (_status >= _max) - { - _status = _max; - _flags |= IND_FINISHED; - } - - // Percentuale raggiunta finora - const double prc = (double)_status/_max; - - WINDOW w = win(); - RCT r; xvt_vobj_get_client_rect(w, &r); - - // Rettangolo contenente l'intera barra - r.left = CHARX; r.right -= CHARX; - r.top = (int)_bar; - r.bottom = r.top + 2*CHARY; - - RCT b = r; - // Rettangolo in rilievo - b.right = b.left + int((r.right-r.left)*prc); - xi_draw_3d_rect(w, &b, FALSE, 2, 0, 0, 0); - // Rettangolo scavato - b.left = b.right; b.right = r.right; - xi_draw_3d_rect(w, &b, TRUE, 2, 0, 0, 0); - - char n[8]; sprintf(n, "%d%%", int(100*prc)); - xvt_dwin_draw_text(w, r.left+r.right/2-CHARX, (r.bottom+r.top+CHARY)/2-3, n, -1); - - check_stop(); -} - -void TIndwin::update() -{ - if (_bar) update_bar(); -} - -bool TIndwin::on_key(KEY k) -{ - if (k == K_ESC && _cancel) - { - _flags |= IND_CANCELLED; - check_stop(); - } - return TRUE; -} - -void TIndwin::on_button(short id) -{ - if (id == DLG_CANCEL) - on_key(K_ESC); -} - - -// TProgind -------------------------------------------------------------- - -TProgind::TProgind(long max, const char* txt, bool cancel, bool bar, int div) - : TIndwin(max, txt, cancel, bar, div) -{} - -// TTimerind ------------------------------------------------------------ - -long TTimerind::_timer_id = 0L; - -void TTimerind::handler(WINDOW w, EVENT* e) -{ - switch(e->type) - { - case E_CREATE: - case E_UPDATE: - if (_status == 0L) - _timer_id = xvt_timer_create(w, _interval); - break; - case E_TIMER: - if (e->v.timer.id == _timer_id) - { - _status += _interval; - force_update(); - xvt_timer_create(w, _interval); - } - break; - default: - break; - } - TIndwin::handler(w,e); -} - -TTimerind::TTimerind(long msec, const char* txt, - bool cancel, bool bar, int div, int i) : - TIndwin(msec, txt, cancel, bar, div) -{ - _interval = i; - _timer_id = 0L; -} - -TTimerind::~TTimerind() -{ xvt_timer_destroy(_timer_id); } - -// C-style binding -// uses static pointer for single instance of TIndwin - -static TIndwin* __indwin__p = NULL; - -void progind_create(long m, char* t, bool b, bool c, int n) -{ - CHECK(__indwin__p == NULL, "Cannot have more than one progress indicator"); - __indwin__p = new TProgind(m,t,b,c,n); -} - -void progind_set_status(long l) -{ - ((TProgind*)__indwin__p)->setstatus(l); -} - -void progind_cancel() -{ - __indwin__p->cancel(); -} - -bool progind_iscancelled() -{ - return __indwin__p->iscancelled(); -} - -bool progind_isfinished() -{ - return __indwin__p->isfinished(); -} - -void progind_destroy() -{ - delete __indwin__p; - __indwin__p = NULL; -} - -void timerind_create(long l, char* title, bool bar, bool cancel, - int divisions, int interval) -{ - CHECK(__indwin__p == NULL, "Cannot have more than one progress indicator"); - __indwin__p = new TTimerind(l,title,bar,cancel,divisions,interval); -} - -void timerind_cancel() -{ - __indwin__p->cancel(); -} - -bool timerind_iscancelled() -{ - return __indwin__p->iscancelled(); -} - -bool timerind_isfinished() -{ - return __indwin__p->isfinished(); -} - -void timerind_destroy() -{ - delete __indwin__p; - __indwin__p = NULL; -} - +#include +#include +#include +#include + +const char* const TITLE_TEXT = "Attesa"; + +word TIndwin::measure_text(TToken_string& s, word& maxlen) const +{ + word lines = 0; + for(const char* t = s.get(0); t; t = s.get()) + { + const word l = strlen(t); + if (l > maxlen) maxlen = l; + lines++; + } + return lines; +} + +// Certified 70% +TIndwin::TIndwin(long max, const char* txt, bool cancel, bool bar, int div) + : _text(NULL), _cancel(NULL), _bar(0), + _status(0L), _max(max), _flags(0x0) +{ + if (_max <= 0) _max = 1; + + TToken_string testo(txt, '\n'); + word maxlen = div; + const word lines = measure_text(testo, maxlen); + + int ver = lines+2; + + int hor = maxlen+2; if (hor > 78) hor = 78; + + if (bar) + { + _bar = ver * CHARY; + ver += 2; + } + ver += cancel ? 2 : 0; + + set_win(create_interface(TASK_WIN, -1, -1, hor, ver, TITLE_TEXT, this, FALSE)); + + _text = new TMultiline_control(win(), DLG_NULL, 1, 1, hor-2, lines, 512, "CD", ""); + + testo.replace('\n', '\r'); + _text->set_caption(testo); + + if (cancel) + { + _cancel = new TPushbutton_control(win(), DLG_CANCEL, -11, -1, 10, 2, "", "Annulla", BMP_CANCEL); + } + open_modal(); + do_events(); +} + +// @doc EXTERNAL + +// @mfunc Setta il testo della finestra +void TIndwin::set_text( + const char* t) // @parm Testo della finestra + + // @comm Si puo' chiamare questa funzione per cambiare il testo, ma + // le dimensioni della finestra sono calcolate sul primo testo + // passato, quindi occorre dimensionare correttamente il primo passato + // (es. inserire degli spazi) se se ne prevede uno piu' lungo. +{ + _text->set_caption(t); +} + +TIndwin::~TIndwin() +{ + close_modal(); + + if (_text) delete _text; + if (_cancel) delete _cancel; +} + +bool TIndwin::can_be_closed() const +{ + const bool ok = (_flags & IND_FINISHED) || (_flags & IND_CANCELLED); + if (!ok) error_box("Attendere la fine dell'operazione prima di chiudere l'applicazione"); + return ok; +} + +KEY TIndwin::check_stop() +{ + KEY k = 0; + if ((_flags & IND_FINISHED) || (_flags & IND_CANCELLED)) + { + k = (_flags & IND_FINISHED) ? K_ENTER : K_ESC; + stop_run(k); + } + return k; +} + +void TIndwin::update_bar() +{ + if (_status >= _max) + { + _status = _max; + _flags |= IND_FINISHED; + } + + // Percentuale raggiunta finora + const double prc = (double)_status/_max; + + WINDOW w = win(); + RCT r; xvt_vobj_get_client_rect(w, &r); + + // Rettangolo contenente l'intera barra + r.left = CHARX; r.right -= CHARX; + r.top = (int)_bar; + r.bottom = r.top + 2*CHARY; + + RCT b = r; + // Rettangolo in rilievo + b.right = b.left + int((r.right-r.left)*prc); + xi_draw_3d_rect(w, &b, FALSE, 2, 0, 0, 0); + // Rettangolo scavato + b.left = b.right; b.right = r.right; + xi_draw_3d_rect(w, &b, TRUE, 2, 0, 0, 0); + + char n[8]; sprintf(n, "%d%%", int(100*prc)); + xvt_dwin_draw_text(w, r.left+r.right/2-CHARX, (r.bottom+r.top+CHARY)/2-3, n, -1); + + check_stop(); +} + +void TIndwin::update() +{ + if (_bar) update_bar(); +} + +bool TIndwin::on_key(KEY k) +{ + if (k == K_ESC && _cancel) + { + _flags |= IND_CANCELLED; + check_stop(); + } + return TRUE; +} + +void TIndwin::on_button(short id) +{ + if (id == DLG_CANCEL) + on_key(K_ESC); +} + + +// TProgind -------------------------------------------------------------- + +TProgind::TProgind(long max, const char* txt, bool cancel, bool bar, int div) + : TIndwin(max, txt, cancel, bar, div) +{} + +// TTimerind ------------------------------------------------------------ + +long TTimerind::_timer_id = 0L; + +void TTimerind::handler(WINDOW w, EVENT* e) +{ + switch(e->type) + { + case E_CREATE: + case E_UPDATE: + if (_status == 0L) + _timer_id = xvt_timer_create(w, _interval); + break; + case E_TIMER: + if (e->v.timer.id == _timer_id) + { + _status += _interval; + force_update(); + xvt_timer_create(w, _interval); + } + break; + default: + break; + } + TIndwin::handler(w,e); +} + +TTimerind::TTimerind(long msec, const char* txt, + bool cancel, bool bar, int div, int i) : + TIndwin(msec, txt, cancel, bar, div) +{ + _interval = i; + _timer_id = 0L; +} + +TTimerind::~TTimerind() +{ xvt_timer_destroy(_timer_id); } + +// C-style binding +// uses static pointer for single instance of TIndwin + +static TIndwin* __indwin__p = NULL; + +void progind_create(long m, char* t, bool b, bool c, int n) +{ + CHECK(__indwin__p == NULL, "Cannot have more than one progress indicator"); + __indwin__p = new TProgind(m,t,b,c,n); +} + +void progind_set_status(long l) +{ + ((TProgind*)__indwin__p)->setstatus(l); +} + +void progind_cancel() +{ + __indwin__p->cancel(); +} + +bool progind_iscancelled() +{ + return __indwin__p->iscancelled(); +} + +bool progind_isfinished() +{ + return __indwin__p->isfinished(); +} + +void progind_destroy() +{ + delete __indwin__p; + __indwin__p = NULL; +} + +void timerind_create(long l, char* title, bool bar, bool cancel, + int divisions, int interval) +{ + CHECK(__indwin__p == NULL, "Cannot have more than one progress indicator"); + __indwin__p = new TTimerind(l,title,bar,cancel,divisions,interval); +} + +void timerind_cancel() +{ + __indwin__p->cancel(); +} + +bool timerind_iscancelled() +{ + return __indwin__p->iscancelled(); +} + +bool timerind_isfinished() +{ + return __indwin__p->isfinished(); +} + +void timerind_destroy() +{ + delete __indwin__p; + __indwin__p = NULL; +} + diff --git a/include/strings.cpp b/include/strings.cpp index 30386e569..e6dbd942c 100755 --- a/include/strings.cpp +++ b/include/strings.cpp @@ -1,1498 +1,1498 @@ -#include -#include -#include -#include -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT -#include -#else -#include -#endif - -#include -#include -#include - -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT -#include -#else -#include -#include -#include -#endif - -class TString512 : public TFixed_string -{ - char _str512[513]; - -public: - TString512(const char* s = "") : TFixed_string(_str512, 513) { set(s); } - TString512(const TString& s) : TFixed_string(_str512, 513) { set(s); } - const TString& operator =(const char* s); - const TString& operator =(const TString& s) { return operator =((const char*)s); } - void strncpy(const char* s, int n); -}; - -const TString& TString512::operator =(const char* s) -{ -#ifdef FOXPRO - if (_size == 0) - { - _str = _str512; - _size = 512; - } -#endif - return set(s); -} - -void TString512::strncpy(const char* s, int n) -{ -#ifdef FOXPRO - if (_size == 0) - { - _str = _str512; - _size = 512; - } -#endif - TFixed_string::strncpy(s, n); -} - - -HIDDEN TString512 spark; - -inline bool is_space(char c) -{ return c >= '\t' && c <= ' '; } - -// Certified 99% -// @doc EXTERNAL -// -// @mfunc Rialloca la stringa -void TString::resize( - int size, // @parm Nuova dimensione della stringa - bool cpy) // @parm Se TRUE mantiene il contenuto della stringa e alloca - // nuovo spazio - - // @comm Non funzione con le stringhe static e per valori negativi di

-{ - char* s = new char[size+1]; - if (cpy && _str) strcpy(s, _str); - else *s = '\0'; - - if (_str) - delete _str; - - _str = s; - _size = size; -} - -// Certified 99% (uses resize) -// @doc EXTERNAL -// -// @mfunc Inizializza con la stringa puntata da char* di lunghezza size -// (usa ) -TString& TString::set( - const char* s) // @parm Stringa da inizializzare - - // @rdesc Ritorna l'indirizzo della stringa inizializzata -{ - if (s == NULL) s = ""; - const int sz = *s ? strlen(s) : 7; - if (sz > size()) resize(sz, FALSE); - strcpy(_str, s); - - return *this; -} -// @doc EXTERNAL - -// @mfunc Espande la stringa per altri caratteri -int TString::make_room( - int s) // @parm Numero di caratteri di cui si cuole aspandere la stringa - - // @comm La stringa viene espansa di un numero di caratteri doppio (per sicurezza) di - // quello passato per parametro - // - // @rdesc Ritorna il numero di caratteri della stringa prima della chiamata -{ - const int lun = len(); - const int spare = size() - lun; - if (spare < s) - resize(size() + 2*s, TRUE); - return lun; -} - -TString::TString(const char* s) : _str(NULL), _size(0) -{ set(s); } - -TString::TString(const TString& s) : _str(NULL), _size(0) -{ set(s); } - -TString::TString(int size) : _str(NULL), _size(0) -{ resize(size, FALSE); } - -TString::TString() : _str(NULL), _size(0) -{ resize(7, FALSE); } - -TString::~TString() -{ - if (_str) - delete _str; -} - -TString& TString::operator <<(const char* s) -{ - if (s && *s) - { - const int pos = make_room(strlen(s)); - strcpy(&_str[pos], s); - } - return *this; -} - -TString& TString::operator <<(char c) -{ - int pos = make_room(1); - _str[pos++] = c; - _str[pos] = '\0'; - return *this; -} - - -TString& TString::operator <<(int n) -{ - char s[16]; - sprintf(s, "%d", n); - return operator <<(s); -} - - -TString& TString::operator <<(long n) -{ - char s[16]; - sprintf(s, "%ld", n); - return operator <<(s); -} - -TString& TString::operator <<(double n) -{ - char s[32]; - sprintf(s, "%lf", n); - return operator <<(s); -} - -// Appends an object to the string -// Certified 50% -// The object should be completely storable in spark -TString& TString::operator <<(const TObject& obj) -{ - ostrstream out((char*)(const char*)spark, spark.size()); - obj.print_on(out); - out << ends; - return operator <<(spark); -} - - -TString& TString::operator <<(const TString& str) -{ return operator <<(str._str); } - - -// @doc EXTERNAL - -// @mfunc Elimina tutti i caratteri contenuti in

-TString& TString::strip( - const char* k) // @parm Stringa da controllarne l'esitenza nell'oggetto - -{ - int j = 0; - for (int i = 0; _str[i]; i++) - { - char c = _str[i]; - if (strchr(k, c) == NULL) _str[j++] = c; - } - return cut(j); -} - - -bool TString::blank() const -{ - for (int i = 0; _str[i]; i++) - if (!is_space(_str[i])) - return FALSE; - return TRUE; -} - -TString& TString::strip_spaces() -{ - char instring = '\0'; - int j = 0; - for (int i = 0; _str[i]; i++) - { - char c = _str[i]; - if (is_space(c) && !instring) continue; - if (c == '"' || c == '\'') - { - if (instring == c) instring = '\0'; - else - if (instring == '\0') instring = c; - } - _str[j++] = c; - } - _str[j] = '\0'; - return *this; -} - -TString& TString::strip_d_spaces() -{ - int j = 0; - bool spc = FALSE; - for (int i = 0; _str[i]; i++) - { - char c = _str[i]; - if (is_space(c)) - if (spc) - continue; - else - spc = TRUE; - else - if (spc) spc = FALSE; - _str[j++] = c; - } - _str[j] = '\0'; - return *this; -} - -// Certified 100% -const char* TString::class_name() const -{ return "String"; } - -// Certified 100% -word TString::class_id() const -{ return CLASS_STRING; } - -// @doc EXTERNAL - -// @mfunc Duplica una stringa -TObject* TString::dup() const - -// @comm Alloca nuovo spazio per duplicare la stringa -// -// @rdesc Ritorna il puntatore alla stringa duplicata -{ - TString* s = new TString(size()); - s->set(_str); - return s; -} - - -void TString::read_from(istream& in) -{ - in >> __tmp_string; - set(__tmp_string); -} - - -// Certified 100% -void TString::print_on(ostream& out) const -{ out << _str; } - - -// Certified 100% -// @doc EXTERNAL - -// @mfunc Ritorna la posizione del carattere o della stringa nell'oggetto TString -// -// @rdesc Ritorna i seguneti parametri: -// -// @flag = 0 | Posizione dell'elemento nella stringa -// @flag -1 | L'elemento non e' stato trovato -int TString::find( - char c, // @parm Carattere da cercare - int from) const // @parm Posizione da cui iniziare la ricerca - // @parm const char* | s | Stringa da cercare - - // @syntax find(char c, int from); - // @syntax find(const char* s, int from); - // - // @comm Cerca nella stringa, dalla posizione indicata, l'elemento passato. - // Nel caso

sia maggiore della lunghezza della stringa manda - // un messaggio di errore -{ - CHECKD(from <= len(), "Trying to find past end of string", from); - const char* p = strchr(_str + from, c); - return p ? int(p - _str) : -1; -} - - -#if XVT_OS == XVT_OS_SCOUNIX -HIDDEN char* strstr(const char* string1, const char* string2) -{ - const int len = strlen(string2); - while (*string1) - { - if (strncmp(string1, string2, len) == 0) return (char*) string1; - string1++; - } - return NULL; -} -#endif - - -// Certified 100% -int TString::find(const char* s, int from) const -{ - CHECKD(from <= len(), "Trying to find past end of string", from); - const char* p = strstr(_str + from, s); - return p ? int(p - _str) : -1; -} - -int TString::replace(char find_char, char replace_char) -{ - const int l = len(); - int n = 0; - for (int i = 0; i < l; i++) - if (_str[i] == find_char) - { - _str[i] = replace_char; - n++; - } - return n; -} - - -// Certified 99% -// @doc EXTERNAL - -// @mfunc Ritorna l'oggetto TString composto dai

caratteri da sinistra -const TString& TString::left( - int count) const // @parm Indica fino quale carattere restituire la stringa - - // @rdesc Ritorna l'indirizzo della stringa contenente i

caratteri da sinistra -{ - spark.strncpy(_str, count); - return spark; -} - -// Certified 99% -// @doc EXTERNAL - -// @mfunc Ritorna l'oggetto TString composto dai

caratteri da destra -const TString& TString::right( - int count) const // @parm Indica da quale carattere restituire la stringa - - // @rdesc Ritorna l'indirizzo della stringa contenente i

caratteri da destra -{ - int from = len()-count; - if (from < 0) from = 0; - spark = _str + from; - return spark; -} - - -// Certified 100% -// @doc EXTERNAL - -// @mfunc Ritorna l'oggetto TString composto dai

caratteri a partire -// da

-const TString& TString::mid( - int from, // @parm Posizione dalla quale partire per l'estrazione - int count) const // @parm Numero di caratteri da estrarre - - // @rdesc Ritorna l'indirizzo della stringa contenente i

cartteri da

-{ - const int l = len(); - -#ifdef DBG - if (from < 0) - { - yesnofatal_box("Ivalid MID parameter: from = %d", from); - from = 0; - } -#endif - - if (from > l) from = l; - if (count < 0) count = l-from; - - spark.strncpy(&_str[from], count); - return spark; -} - - -// Certified 100% -// @doc EXTERNAL - -// @mfunc Ritorna la stringa da

a

(escluso) -const TString& TString::sub( - int from, // @parm Posizione dalla quale estrarre la stringa - int to) const // @parm Posizione fin alla quale estrarre la stringa - - // @rdesc Ritorna l'indirizzo della stringa da i

a

-{ - const int count = to-from; - return mid(from, count); -} - -// Certified 100% -TString& TString::cut(int n) -{ - CHECKD(n >= 0, "Invalid TString::cut position ", n); - if (n <= _size) - _str[n] = '\0'; -#ifdef DBG - else - yesnofatal_box("Hai tagliato a %d la stringa '%s' lunga %d(%d)", - n, _str, len(), size()); -#endif - return *this; -} - -// @doc EXTERNAL - -// @mfunc Elimina gli spazi da sinistra o i primi n caratteri (da sinistra). -TString& TString::ltrim( - int count) // @parm Indica il numero di caratteri da eliminare. - // Se uguale a 0 elimina tutti gli spazi da sinistra - - // @comm Controlla se

e' 0. Se non lo Š ritorna l'indirizzo della - // stringa a partire dal

-esimo carattere; altrimenti controlla - // se i primi caratteri sono spazi e li elimina fino a che non trova - // un carattere diverso da ' ' - // - // @xref -{ - const char* s; - - if (count > 0) - { - if (count >= len()) return cut(0); - s = &_str[count]; - } - else for (s = _str; *s && is_space(*s); s++); - - if (s != _str) strcpy(_str, s); - return *this; -} - -// @doc EXTERNAL - -// @mfunc Elimina gli spazi da destra o i primi n caratteri (da destra). -TString& TString::rtrim( - int count) // @parm Indica il numero di caratteri da eliminare. - // Se uguale a 0 elimina tutti gli spazi da destra - - // @comm Controlla se

e' 0. Se non lo Š pone il fine stringa alla - // posizione

; altrimenti controlla se gli ultimi caratteri - // sono spazi e li elimina fino a che non trova un carattere diverso da ' ' - // - // @xref -{ - if (count > 0) - { - int i = len() - count; - if (i < 0) i = 0; - cut(i); - } - else - { - char* good = _str-1; - for (char* s = _str; *s; s++) - if (!is_space(*s)) good = s; - *(good+1) = '\0'; - } - return *this; -} - -TString& TString::trim() -{ - char* last = _str; - - // Salta spazi iniziali - for (const char* s = _str; *s && is_space(*s); s++); - - // Copia stringa - if (s > _str) - { - for(char* c = _str; *s; s++) - { - *c++ = *s; - if (!is_space(*s)) last = c; - } - // Elimina spazi finali - *last = '\0'; - } - else rtrim(); - - return *this; -} - -// Certified 50% -// @doc EXTERNAL - -// @mfunc Compara due stringhe (o i primi

caratteri) -// -// @rdesc Ritrna i seguenti valori: -// -// @flag 0 | Se le stringhe sono uguali -// @flag 0 | Se le stringhe sono diverse -int TString::compare( - const char* s, // @parm Stringa da comparare - int max, // @parm Numero di caratteri da conforntare (default tutta la stringa) - bool ignorecase) const // @parm Ignorare la differenza maiuscolo/minuscolo (default FALSE) -{ - int res; - if (ignorecase) - { - if (max < 0) - res = stricmp(_str, s); - else - { - for (int i = 0; i < max; i++) - { - res = toupper(_str[i]) - toupper(s[i]); - if (res) break; - } - } - } - else - res = max < 0 ? strcmp(_str, s) : strncmp(_str, s, max); - - return res; -} - -// Certified 100% -// @doc EXTERNAL - -// @mfunc Riempe la stringa con n caratteri c -// -// @rdesc Ritorna l'indirizzo dell stringa -TString& TString::fill( - char c, // @parm Caratteri con cui riempire la stringa - int n) // @parm Numero di caratteri da inserire nella stringa - // (default per tutta la lungehzza) - - // @comm Se il paramatro

e' maggiore della dimensione della stringa, la - // stessa viene ridimensionata (chaimata alla ). - // Nel caso non venga passato il parametro

la stringa viene - // riempita col carattere

per tutta la lunghezza. - -{ - if (n < 0) n = size(); else - if (n > size()) resize(n, FALSE); - memset(_str, c, n); - _str[n] = '\0'; - return *this; -} - -// Certified 100% -// @doc EXTERNAL - -// @mfunc Giustifica l'oggetto stringa a destra -TString& TString::right_just( - int n, // @parm Numero di colonne alla quali allineare (defualt larghezza della stringa) - char c) // @parm Carattere di riempimento (default ' ') - - // @comm Nel caso venga passato un carattere in

, questo viene inserito - // nel resto della stringa (a sinistra della stringa stessa) - // - // @xref -{ - if (n < 0) n = size(); - trim(); - spark = _str; - fill(c, n); - overwrite(spark, n-spark.len()); - - return *this; -} - -// Certified 100% -// @doc EXTERNAL - -// @mfunc Centra l'oggetto stringa -TString& TString::center_just( - int n, // @parm Numero di colonne alla quali allineare (defualt larghezza della stringa) - char c) // @parm Carattere di riempimento (default ' ') - - // @comm Nel caso venga passato un carattere in

, questo viene inserito - // nel resto della stringa (a destra e a sinistra della stringa stessa) - // - // @xref -{ - if (n < 0) n = size(); - trim(); - spark = _str; - fill(c, n); - const int p = (n-spark.len()) >> 1; - overwrite(spark, p); - - return *this; -} - -// Certified 100% -// @doc EXTERNAL - -// @mfunc Giustifica l'oggetto stringa a sinistra -TString& TString::left_just( - int n, // @parm Numero di colonne alla quali allineare (defualt larghezza della stringa) - char c) // @parm Carattere di riempimento (default ' ') - - // @comm Nel caso venga passato un carattere in

, questo viene inserito - // nel resto della stringa (a destra della stringa stessa) - // - // @xref -{ - if (n < 0) n = size(); - trim(); - spark = _str; - fill(c, n); - overwrite(spark, 0); - - return *this; -} - -// @doc EXTERNAL - -// @mfunc Formatta una stringa usando il formato dato da

-TString& TString::picture( - const char* pic, // @parm Formato della stringa - const char* s) // @parm Stringa da formattare -{ - if (pic == NULL || *pic == '\0') - return set(s); - - set(pic); - - int l = strlen(s)-1; // Prossimo carattere da sostituire a # o @ - - for (int i = len()-1; i >= 0; i--) - { - const char k = pic[i]; - if (k == '#') _str[i] = (l >= 0) ? s[l--] : ' '; - else if (k == '@') _str[i] = (l >= 0) ? s[l--] : '0'; - else if (k == '^') { _str[i] = ' '; l--; } - } - - return *this; -} - -// Certified 90% (spark size limited) -// @doc EXTERNAL - -// @mfunc Manda un output formattato alla stringa oggetto -TString& TString::format( - const char* fmt, // @parm Stringa da formattare - ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

- - // @comm Funziona come la funzione "sprintf" standard del C e ritorna la - // stringa formattata con i parametri passati. -{ - va_list pars; - va_start(pars, fmt); - const int tot = vsprintf((char*)(const char*)spark, fmt, pars); - va_end(pars); - - CHECK(tot >= 0 && tot < spark.size(), "Ue'! Quanto scrivi?"); - if (tot > size()) resize(tot, FALSE); - strcpy(_str, spark); - - return *this; -} - -// Certified 100% -TString& TString::upper() -{ - for (char* s = _str; *s; s++) *s = toupper(*s); - return *this; -} - -// Certified 100% -TString& TString::lower() -{ - for (char* s = _str; *s; s++) *s = tolower(*s); - return *this; -} - -// Certified 50% -// @doc EXTERNAL - -// @mfunc Permette di ttrovare il plurale di una stringa -TString& TString::add_plural( - long num, // @parm Numero di elementi per sapere la desineneza - const char* name) // @parm Stringa da modificare - - // @comm A seconda del numero passato in

permette di stabilire la - // corretta sintassi della stringa

da scrivere nei messaggi - // dati all'utente. Nel caso

sia 0 allora ritorna "nessuno". -{ - const TFixed_string n(name); - const char last = n[n.len()-1]; - - if (num < 1) - { - *this << "nessun"; - if (toupper(last) == 'A' || toupper(n[0]) == 'Z' || - toupper(n[0]) == 'S' && strchr("aeiouAEIOU", n[1]) == NULL) - *this << tolower(last); - *this << ' ' << name; - } - else - { - *this << num << ' ' << name; - if (num > 1) - _str[len()-1] = (last == 'a') ? 'e' : 'i'; - } - - return *this; -} - -// Certified 90% -// @doc EXTERNAL - -// @mfunc Sovrascrive la stringa

dalla posizione

-TString& TString::overwrite( - const char* s, // @parm Stringa da inserire - int pos) // @parm Posizione dalla quale iniziare a sovrascrivere - - // @comm Sovrascrive dalla posizione

fino alla lunghezza di

l'oggetto - // stringa. Nel caso la dimensione sia maggiore l'oggetto viene riallocato - // dinamicamente - // - // @xref -{ - const int l = len(); - if (pos < 0) pos = l; - const int max = pos+strlen(s); - if (max > size()) resize(max, TRUE); // resize needed? - - const bool over = max > l; // beyond end of string? - for (int i = l; i < pos; i++) _str[i] = ' '; // space padding - for (; *s; s++) _str[pos++] = *s; // write - if (over) _str[pos] = '\0'; // end of string - - return *this; -} - - -// Certified 90% -// @doc EXTERNAL - -// @mfunc Inserisce la stringa s dalla posizione pos -TString& TString::insert( - const char* s, // @parm Stringa da inserire - int pos) // @parm Posizione dalla quale iniziare a inserire - - // @comm Inserisce dalla posizione

la stringa

nell'oggetto - // stringa. Nel caso la dimensione sia maggiore l'oggetto viene riallocato - // dinamicamente - // - // @xref -{ - if (s && *s) - { - const int l = strlen(s); - make_room(l); - mid(pos); // Scrivi in spark la stringa da pos in poi - overwrite(s, pos); // Aggiungi s - strcpy(&_str[pos+l], spark); // Aggiungi spark - } - return *this; -} - -// Certified 90% -word TString::hash() const -{ -/* -// Villa's megasmart hash function - word h = 0x0000; - for (int i = 0; _str[i]; i++) - h ^= (i & 0x1) ? (_str[i] << 8) : _str[i]; -*/ - // Peter Weinberger's (PJW) generic hashing - word h = 0; - for (const char* s = _str; *s; s++) - { - h = (h << 2) + *s; - const word i = h & 0xC000; - if (i) h = (h ^ (i >> 12)) & 0x3FFF; - } - return h; -} - -/////////////////////////////////////////////////////////// -// TFixed_string -/////////////////////////////////////////////////////////// - -// Certified 100% -TFixed_string::TFixed_string(const char* str, int size) -: TString((char*)str, (size <= 0) ? strlen(str) : size-1) -{ - CHECK(str, "NULL buffer for fixed string"); - if (size > 0 && memchr(str, '\0', size) == NULL) - cut(0); -} - - -// Certified 100% -TFixed_string::~TFixed_string() -{ _str = NULL; } // Impedisce la deallocazione - - -// Certified 100% -void TFixed_string::resize(int size, bool) -{ -#ifdef DBG - fatal_box("Impossibile ridimensionare una stringa fissa da %d a %d caratteri:\n'%s'", - _size, size, _str); -#endif -} - - -// Certified 99% (s != NULL) -void TFixed_string::strncpy(const char* s, int n) -{ - CHECKD(n <= _size, "Fixed string can't be strncpyed: lenght ", n); - for (int i = 0; *s && i < n; i++) _str[i] = *s++; - _str[i] = '\0'; -} - -// Certified 99% -// @doc EXTERNAL - -// @mfunc Manda un output formattato alla stringa oggetto -TString& TFixed_string::format( - const char* fmt, // @parm Formato della stringa - ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

- - // @comm Funziona come la funzione "sprintf" standard del C e ritorna la - // stringa formattata con i parametri passati. - // E' piu' efficiente di poiche' non usa spark -{ - va_list pars; - va_start(pars, fmt); - const int tot = vsprintf(_str, fmt, pars); - va_end(pars); - CHECK(tot >= 0 && tot < size(), "Ue'! Quanto scrivi con 'sta format?"); - return *this; -} - - - -/////////////////////////////////////////////////////////// -// Filename -/////////////////////////////////////////////////////////// - -const char SLASH = -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT -'\\'; -#else -'/'; -#endif - -// Certified 90% -const char* TFilename::ext() const -{ - const char* d = strrchr(name(), '.'); - if (d && is_not_slash(*(++d))) return d; - return ""; -} - -// Certified 90% -void TFilename::ext(const char* e) -{ - char* d = strrchr(name(), '.'); - if (d && is_not_slash(*(d+1))) *d = '\0'; - - if (*e && *e != '.') *this << "."; - *this << e; -} - - -// Certified 90% -const char* TFilename::name() const -{ - for (int i = strlen(_str)-1; i >= 0; i--) - if (_str[i] == '/' || _str[i] == '\\' || _str[i] == ':') - break; - - return &_str[i+1]; -} - -// Certified 90% -const char* TFilename::path() const -{ - for (int i = strlen(_str)-1; i >= 0; i--) - if (_str[i] == '/' || _str[i] == '\\' || _str[i] == ':') - break; - - spark.strncpy(_str, i+1); - return spark; -} - - -TFilename& TFilename::add(const char* n) -{ - if (not_empty() && is_not_slash(_str[len()-1])) - *this << SLASH; - *this << n; - return *this; -} - - -// @doc EXTERNAL - -// @mfunc Controlla il formato del nome del file -// -// @rdesc Ritorna i seguenti valori -// -// @flag TRUE | Se il nome del file e' sintatticamente corretto -// @flag FALSE | Se il nome del file non e' sintatticamente corretto -bool TFilename::ok() const - -// @comm Controlla tutti i casi per cui un nome di file puo' non essere valido. -// Nel caso si lavori in Windows controlla anche che il nome del -// disco sia corretto. -{ - 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_WIN || XVT_OS == XVT_OS_NT - 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() -{ - static TFilename _tempdir; - const bool create = _tempdir.empty() || user().compare(_tempdir.right(user().len()), -1, TRUE); - - if (create) - { - const char* dirpref = getenv("TEMP"); - if (dirpref == NULL || *dirpref == '\0') dirpref = getenv("TMP"); - if (dirpref == NULL || *dirpref == '\0') -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT - dirpref = "\\tmp"; -#else - dirpref = "/tmp"; -#endif - _tempdir = dirpref; - - const int last = len()-1; - if (!is_not_slash(_str[last])) - _tempdir.cut(last); - - bool ok = TRUE; - - _tempdir.lower(); - if (!fexist(_tempdir)) - ok = make_dir(_tempdir); - - if (ok) - { - TString16 theuser(user()); - - if (theuser.empty()) - theuser = "prassi"; - theuser.lower(); - if (theuser.not_empty() && _tempdir.find(theuser) != _tempdir.len() - theuser.len()) - _tempdir << SLASH << theuser; - _tempdir.lower(); - if (!fexist(_tempdir)) - ok = make_dir(_tempdir); - } - - if (!ok) - fatal_box("Impossibile creare la directory '%s' per i file temporanei", (const char*)_tempdir); - - _tempdir.insert("TMP=", 0); - putenv(_tempdir); - } - - set(_tempdir.mid(4)); - return *this; -} - -// Certified 50% -// @doc EXTERNAL - -// @mfunc Genera il nome di un file temporaneo -const TFilename& TFilename::temp( - const char* prefix) // @parm Eventuale prefisso da assegnare al file temporaneo - - // @comm Nel generare il nome del file controlla se esistone dei caratteri jolly - // e li elimina. -{ - tempdir(); - - if (prefix && *prefix) - { - set(prefix); // Copia prefisso e ... - strip("$#*?."); // ... toglie caratteri jolly - - const TFixed_string f(prefix); -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT - if (f.find("$$") != -1) - { - char pid[8]; - sprintf(pid, "%d", getpid()); - pid[3] = '\0'; - *this << pid; - } -#else - if (f.find("$$") != -1) *this << getpid(); - if (f.find("##") != -1) *this << getuid(); -#endif - } - else cut(0); - - char* t = tempnam(NULL, (char*)_str); - - CHECK(t != NULL, "Can't execute tempnam"); - set(t); - free(t); - -#ifdef DBG - if (fexist(_str)) - fatal_box("Il file '%s' esiste gia'", _str); -#endif - - return *this; -} - - -/////////////////////////////////////////////////////////// -// Token string -/////////////////////////////////////////////////////////// - -// Certified 100% -TToken_string::TToken_string(const char* s, char separator) -: TString(s), _separator(separator) -{ - CHECK(_separator, "NULL TToken_string separator"); - restart(); -} - -// Certified 100% -TToken_string::TToken_string(int n, char separator) -: TString(n), _separator(separator), _last(-1) -{ - CHECK(_separator, "NULL TToken_string separator"); -} - -// Certified 100% -TToken_string::TToken_string(const TToken_string& s) -: TString(s), _separator(s._separator), _last(s._last) -{ - CHECK(_separator, "NULL TToken_string separator"); -} - -void TToken_string::separator(char s) -{ - CHECK(s, "NULL TToken_string separator"); - _separator = s; -} - - -// Certified 100% -TObject* TToken_string::dup() const -{ - return new TToken_string(_str, _separator); -} - -// Certified 90% -const char* TToken_string::get() -{ - CHECK(_separator, "Corrupted TToken_string: NULL separator"); - - if (_last < 0) return NULL; - - const int start = _last; - - if (_str[start] == '\0') - { - _last = -1; - return NULL; - } - else - if (_str[start] == _separator) - { - _last = start+1; - } - else - { - const int k = find(_separator, start); - _last = (k >= 0) ? k+1 : -1; - return sub(start, k); - } - return ""; -} - -// Certified 50% -// @doc EXTERNAL - -// @mfunc Ritorna un Token -// -// @rdesc Ritorne la stringa identificata dal Token passato come parametro

-const char* TToken_string::get( - int n) // @parm Token da ritornare (-1 = prossimo, -2 = ultimo, n = n-simo) - - // @syntax const char* get(int n); - // @syntax const char* get(); - // - // @comm Se non viene passato il parametro

ritorna il prossimo Token - // (come se

== -1) - // - // @xref -{ - CHECK(_separator, "Corrupted TToken_string: NULL separator"); - - if (n < 0) - { - if (n == -2) - { - const char* sep = strrchr(_str, _separator); - _last = -1; - return sep ? sep+1 : _str; - } - else return get(); - } - int sep = 0; - for (const char* s = _str; sep < n && *s; s++) - if (*s == _separator) sep++; - - if (sep >= n) - { - char* p = strchr(s, _separator); - if (p == NULL) - { - spark = s; - _last = -1; - } - else - { - *p = '\0'; - spark = s; - *p = _separator; - _last = (int)((const char*)p - _str) + 1; - } - } - else - { - _last = -1; - return NULL; - } - - return spark; -} - - -// Certified 99% -// @doc EXTERNAL - -// @mfunc Ritorna un carattere -// -// @rdesc Ritorna il primo carattere del Token richiesto -char TToken_string::get_char( - int n) // @parm Token da ritornare - - // @comm Chiama la con tutti i relativi significati per - // il parametro

-{ - const char* const car = get(n); - return car ? *car : '\0'; -} - -// Certified 99% -int TToken_string::get_int(int n) -{ - const char* const num = get(n); - return num ? atoi(num) : 0; -} - - -// Certified 99% -long TToken_string::get_long(int n) -{ - const char* const num = get(n); - return num ? atol(num) : 0L; -} - - -// Certified 70% -bool TToken_string::set_item(const char* v, int n) -{ - CHECK(_separator, "Corrupted TToken_string: NULL separator"); - - int sep = 0; - for (int i = 0; sep < n && _str[i]; i++) - if (_str[i] == _separator) sep++; - - if (sep < n) // Aggiunge items mancanti prima della posizione n - { - for (;sep < n; sep++) - *this << _separator; - *this << v; - return FALSE; - } - - int e = find(_separator, i); - if (e < 0) e = len(); - - spark = &_str[e]; // Salva items seguenti - cut(i); // Considera solo items precedenti - *this << v << spark; // Aggiunge item desiderato e seguenti - return TRUE; -} - - -// Certified 80% -int TToken_string::get_pos(const char* s) -{ - const char* item; - - restart(); - for (int i = 0; (item = get()) != NULL; i++) - if (strcmp(item, s) == 0) return i; - - return -1; -} - -// Certified 80% -int TToken_string::get_pos(long n) -{ - char s[16]; sprintf(s, "%ld", n); - return get_pos(s); -} - - - -// Certified 90% -bool TToken_string::empty_items() const -{ - for (const char* c = _str; *c; c++) - if (!is_space(*c) && *c != _separator) return FALSE; - return TRUE; -} - - -// Certified 80% -int TToken_string::items() const -{ - int t = 0; - if (not_empty()) - { - t++; - for (const char* s = _str; *s; s++) - if (*s == _separator) t++; - } - return t; -} - -// Certified 99% -// @doc EXTERNAL - -// @mfunc Aggiunge un elemento alla token string -void TToken_string::add( - const char* s, // @parm Stringa da aggiungere - int pos) // @parm Posizione nella quale aggiungere l'elemento - // (default aggiunge come ultimo elemento) - // @parm char | c | Caratter da aggiungere - // @parm long | n | Long da aggiungere - // @parm int | n | Intero da aggiungere - - // @syntax void add(const char* s, int n = -1); - // @syntax void add(char c, int pos = -1); - // @syntax void add(long n, int pos = -1); - // @syntax void add(int n, int pos = -1); - // - // @comm Permette, a seconda del parametro passato, di aggiungere alla Token - // string un nuovo elemnto gi… completo del carattere di separazione -{ - if (s == NULL || *s == '\0') s = " "; - if (pos < 0) - { - if (not_empty()) *this << _separator; - *this << s; - } - else - set_item(s, pos); - if (_last < 0) _last = 0; -} - -// Certified 0% -void TToken_string::add(char c, int pos) -{ - const char s[2] = { c, '\0' }; - add(s, pos); -} - -// Adds an integer value to the token string -// Certified 100% -void TToken_string::add(long n, int pos) -{ - char s[16]; - sprintf(s, "%ld", n); - add(s, pos); -} - -void TToken_string::add(int n, int pos) -{ - char s[16]; - sprintf(s, "%d", n); - add(s, pos); -} - -// Certified 50% -void TToken_string::destroy(int n) -{ - if (_last == -2) return ; - - if (n < 0) - { - char* s = strrchr(_str, _separator); - if (s != NULL) *s = '\0'; - } - else - { - int sep = 0; - for (char* s = _str; sep < n && *s; s++) - if (*s == _separator) sep++; - - if (sep >= n) - { - const char* p = strchr(s, _separator); - *s = '\0'; - if (p != NULL) strcat(s, p+1); - } - } - restart(); -} - -/////////////////////////////////////////////////////////// -// Paragraph string -/////////////////////////////////////////////////////////// - -TParagraph_string::TParagraph_string(const char* s, int width) -: TToken_string(s, '|'), _width(width) -{ tokenize(); } - -const TString& TParagraph_string::operator =(const char* s) -{ - TToken_string::operator=(s); - tokenize(); - return *this; -} - -void TParagraph_string::tokenize() -{ - int last_space = 0; - int chars_in_row = 0; - const int l = len(); - TString stmp; - for (int start = 0; start < l; start++) - { - switch (_str[start]) - { - case '\n': _str[start]='|'; last_space = 0;chars_in_row=0; break; - case ' ' : last_space = start; chars_in_row++; break; - default : chars_in_row++; break; - } - stmp<<_str[start]; - if (chars_in_row == _width && chars_in_row != l) - { - if (last_space!=0) stmp[last_space] = '|'; - else stmp<<"|"; - last_space = 0; chars_in_row = 0; - } - } - TToken_string::operator=(stmp); -} - -/////////////////////////////////////////////////////////// -// TString_array -/////////////////////////////////////////////////////////// - -int TString_array::add(const char* s, int n) -{ - if (objptr(n) == NULL) - n = TArray::add(new TToken_string(s), n); - else row(n) = s; - return n; -} - -int TString_array::add(const TToken_string& s, int n) -{ - if (objptr(n) == NULL) - n = TArray::add(s); - else - row(n) = s; - return n; -} - -// @doc EXTERNAL - -// @mfunc Cerca una stringa nell'array -// -// @rdesc Ritorna la posizione nell'array in cui si trova la stringa (-1 se non -// e' stata trovata) -int TString_array::find( - const char* s, // @parm Stringa da cercare - int from) const // @parm Posizione dalla quale cercare la stringa -{ - int found = -1; - for (int i = from; i < items(); i++) - if (row(i).compare(s, -1, TRUE) == 0) - { - found = i; - break; - } - return found; -} - -HIDDEN int ascending_string(const TObject** o1, const TObject** o2) -{ - const TString* s1 = (const TString*)*o1; - const TString* s2 = (const TString*)*o2; - return strcmp(*s1, *s2); -} - -HIDDEN int descending_string(const TObject** o1, const TObject** o2) -{ - return -ascending_string(o1, o2); -} - -void TString_array::sort(bool ascending) -{ - TArray::sort(ascending ? ascending_string : descending_string); -} - +#include +#include +#include +#include +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT +#include +#else +#include +#endif + +#include +#include +#include + +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT +#include +#else +#include +#include +#include +#endif + +class TString512 : public TFixed_string +{ + char _str512[513]; + +public: + TString512(const char* s = "") : TFixed_string(_str512, 513) { set(s); } + TString512(const TString& s) : TFixed_string(_str512, 513) { set(s); } + const TString& operator =(const char* s); + const TString& operator =(const TString& s) { return operator =((const char*)s); } + void strncpy(const char* s, int n); +}; + +const TString& TString512::operator =(const char* s) +{ +#ifdef FOXPRO + if (_size == 0) + { + _str = _str512; + _size = 512; + } +#endif + return set(s); +} + +void TString512::strncpy(const char* s, int n) +{ +#ifdef FOXPRO + if (_size == 0) + { + _str = _str512; + _size = 512; + } +#endif + TFixed_string::strncpy(s, n); +} + + +HIDDEN TString512 spark; + +inline bool is_space(char c) +{ return c >= '\t' && c <= ' '; } + +// Certified 99% +// @doc EXTERNAL +// +// @mfunc Rialloca la stringa +void TString::resize( + int size, // @parm Nuova dimensione della stringa + bool cpy) // @parm Se TRUE mantiene il contenuto della stringa e alloca + // nuovo spazio + + // @comm Non funzione con le stringhe static e per valori negativi di

+{ + char* s = new char[size+1]; + if (cpy && _str) strcpy(s, _str); + else *s = '\0'; + + if (_str) + delete _str; + + _str = s; + _size = size; +} + +// Certified 99% (uses resize) +// @doc EXTERNAL +// +// @mfunc Inizializza con la stringa puntata da char* di lunghezza size +// (usa ) +TString& TString::set( + const char* s) // @parm Stringa da inizializzare + + // @rdesc Ritorna l'indirizzo della stringa inizializzata +{ + if (s == NULL) s = ""; + const int sz = *s ? strlen(s) : 7; + if (sz > size()) resize(sz, FALSE); + strcpy(_str, s); + + return *this; +} +// @doc EXTERNAL + +// @mfunc Espande la stringa per altri caratteri +int TString::make_room( + int s) // @parm Numero di caratteri di cui si cuole aspandere la stringa + + // @comm La stringa viene espansa di un numero di caratteri doppio (per sicurezza) di + // quello passato per parametro + // + // @rdesc Ritorna il numero di caratteri della stringa prima della chiamata +{ + const int lun = len(); + const int spare = size() - lun; + if (spare < s) + resize(size() + 2*s, TRUE); + return lun; +} + +TString::TString(const char* s) : _str(NULL), _size(0) +{ set(s); } + +TString::TString(const TString& s) : _str(NULL), _size(0) +{ set(s); } + +TString::TString(int size) : _str(NULL), _size(0) +{ resize(size, FALSE); } + +TString::TString() : _str(NULL), _size(0) +{ resize(7, FALSE); } + +TString::~TString() +{ + if (_str) + delete _str; +} + +TString& TString::operator <<(const char* s) +{ + if (s && *s) + { + const int pos = make_room(strlen(s)); + strcpy(&_str[pos], s); + } + return *this; +} + +TString& TString::operator <<(char c) +{ + int pos = make_room(1); + _str[pos++] = c; + _str[pos] = '\0'; + return *this; +} + + +TString& TString::operator <<(int n) +{ + char s[16]; + sprintf(s, "%d", n); + return operator <<(s); +} + + +TString& TString::operator <<(long n) +{ + char s[16]; + sprintf(s, "%ld", n); + return operator <<(s); +} + +TString& TString::operator <<(double n) +{ + char s[32]; + sprintf(s, "%lf", n); + return operator <<(s); +} + +// Appends an object to the string +// Certified 50% +// The object should be completely storable in spark +TString& TString::operator <<(const TObject& obj) +{ + ostrstream out((char*)(const char*)spark, spark.size()); + obj.print_on(out); + out << ends; + return operator <<(spark); +} + + +TString& TString::operator <<(const TString& str) +{ return operator <<(str._str); } + + +// @doc EXTERNAL + +// @mfunc Elimina tutti i caratteri contenuti in

+TString& TString::strip( + const char* k) // @parm Stringa da controllarne l'esitenza nell'oggetto + +{ + int j = 0; + for (int i = 0; _str[i]; i++) + { + char c = _str[i]; + if (strchr(k, c) == NULL) _str[j++] = c; + } + return cut(j); +} + + +bool TString::blank() const +{ + for (int i = 0; _str[i]; i++) + if (!is_space(_str[i])) + return FALSE; + return TRUE; +} + +TString& TString::strip_spaces() +{ + char instring = '\0'; + int j = 0; + for (int i = 0; _str[i]; i++) + { + char c = _str[i]; + if (is_space(c) && !instring) continue; + if (c == '"' || c == '\'') + { + if (instring == c) instring = '\0'; + else + if (instring == '\0') instring = c; + } + _str[j++] = c; + } + _str[j] = '\0'; + return *this; +} + +TString& TString::strip_d_spaces() +{ + int j = 0; + bool spc = FALSE; + for (int i = 0; _str[i]; i++) + { + char c = _str[i]; + if (is_space(c)) + if (spc) + continue; + else + spc = TRUE; + else + if (spc) spc = FALSE; + _str[j++] = c; + } + _str[j] = '\0'; + return *this; +} + +// Certified 100% +const char* TString::class_name() const +{ return "String"; } + +// Certified 100% +word TString::class_id() const +{ return CLASS_STRING; } + +// @doc EXTERNAL + +// @mfunc Duplica una stringa +TObject* TString::dup() const + +// @comm Alloca nuovo spazio per duplicare la stringa +// +// @rdesc Ritorna il puntatore alla stringa duplicata +{ + TString* s = new TString(size()); + s->set(_str); + return s; +} + + +void TString::read_from(istream& in) +{ + in >> __tmp_string; + set(__tmp_string); +} + + +// Certified 100% +void TString::print_on(ostream& out) const +{ out << _str; } + + +// Certified 100% +// @doc EXTERNAL + +// @mfunc Ritorna la posizione del carattere o della stringa nell'oggetto TString +// +// @rdesc Ritorna i seguneti parametri: +// +// @flag = 0 | Posizione dell'elemento nella stringa +// @flag -1 | L'elemento non e' stato trovato +int TString::find( + char c, // @parm Carattere da cercare + int from) const // @parm Posizione da cui iniziare la ricerca + // @parm const char* | s | Stringa da cercare + + // @syntax find(char c, int from); + // @syntax find(const char* s, int from); + // + // @comm Cerca nella stringa, dalla posizione indicata, l'elemento passato. + // Nel caso

sia maggiore della lunghezza della stringa manda + // un messaggio di errore +{ + CHECKD(from <= len(), "Trying to find past end of string", from); + const char* p = strchr(_str + from, c); + return p ? int(p - _str) : -1; +} + + +#if XVT_OS == XVT_OS_SCOUNIX +HIDDEN char* strstr(const char* string1, const char* string2) +{ + const int len = strlen(string2); + while (*string1) + { + if (strncmp(string1, string2, len) == 0) return (char*) string1; + string1++; + } + return NULL; +} +#endif + + +// Certified 100% +int TString::find(const char* s, int from) const +{ + CHECKD(from <= len(), "Trying to find past end of string", from); + const char* p = strstr(_str + from, s); + return p ? int(p - _str) : -1; +} + +int TString::replace(char find_char, char replace_char) +{ + const int l = len(); + int n = 0; + for (int i = 0; i < l; i++) + if (_str[i] == find_char) + { + _str[i] = replace_char; + n++; + } + return n; +} + + +// Certified 99% +// @doc EXTERNAL + +// @mfunc Ritorna l'oggetto TString composto dai

caratteri da sinistra +const TString& TString::left( + int count) const // @parm Indica fino quale carattere restituire la stringa + + // @rdesc Ritorna l'indirizzo della stringa contenente i

caratteri da sinistra +{ + spark.strncpy(_str, count); + return spark; +} + +// Certified 99% +// @doc EXTERNAL + +// @mfunc Ritorna l'oggetto TString composto dai

caratteri da destra +const TString& TString::right( + int count) const // @parm Indica da quale carattere restituire la stringa + + // @rdesc Ritorna l'indirizzo della stringa contenente i

caratteri da destra +{ + int from = len()-count; + if (from < 0) from = 0; + spark = _str + from; + return spark; +} + + +// Certified 100% +// @doc EXTERNAL + +// @mfunc Ritorna l'oggetto TString composto dai

caratteri a partire +// da

+const TString& TString::mid( + int from, // @parm Posizione dalla quale partire per l'estrazione + int count) const // @parm Numero di caratteri da estrarre + + // @rdesc Ritorna l'indirizzo della stringa contenente i

cartteri da

+{ + const int l = len(); + +#ifdef DBG + if (from < 0) + { + yesnofatal_box("Ivalid MID parameter: from = %d", from); + from = 0; + } +#endif + + if (from > l) from = l; + if (count < 0) count = l-from; + + spark.strncpy(&_str[from], count); + return spark; +} + + +// Certified 100% +// @doc EXTERNAL + +// @mfunc Ritorna la stringa da

a

(escluso) +const TString& TString::sub( + int from, // @parm Posizione dalla quale estrarre la stringa + int to) const // @parm Posizione fin alla quale estrarre la stringa + + // @rdesc Ritorna l'indirizzo della stringa da i

a

+{ + const int count = to-from; + return mid(from, count); +} + +// Certified 100% +TString& TString::cut(int n) +{ + CHECKD(n >= 0, "Invalid TString::cut position ", n); + if (n <= _size) + _str[n] = '\0'; +#ifdef DBG + else + yesnofatal_box("Hai tagliato a %d la stringa '%s' lunga %d(%d)", + n, _str, len(), size()); +#endif + return *this; +} + +// @doc EXTERNAL + +// @mfunc Elimina gli spazi da sinistra o i primi n caratteri (da sinistra). +TString& TString::ltrim( + int count) // @parm Indica il numero di caratteri da eliminare. + // Se uguale a 0 elimina tutti gli spazi da sinistra + + // @comm Controlla se

e' 0. Se non lo Š ritorna l'indirizzo della + // stringa a partire dal

-esimo carattere; altrimenti controlla + // se i primi caratteri sono spazi e li elimina fino a che non trova + // un carattere diverso da ' ' + // + // @xref +{ + const char* s; + + if (count > 0) + { + if (count >= len()) return cut(0); + s = &_str[count]; + } + else for (s = _str; *s && is_space(*s); s++); + + if (s != _str) strcpy(_str, s); + return *this; +} + +// @doc EXTERNAL + +// @mfunc Elimina gli spazi da destra o i primi n caratteri (da destra). +TString& TString::rtrim( + int count) // @parm Indica il numero di caratteri da eliminare. + // Se uguale a 0 elimina tutti gli spazi da destra + + // @comm Controlla se

e' 0. Se non lo Š pone il fine stringa alla + // posizione

; altrimenti controlla se gli ultimi caratteri + // sono spazi e li elimina fino a che non trova un carattere diverso da ' ' + // + // @xref +{ + if (count > 0) + { + int i = len() - count; + if (i < 0) i = 0; + cut(i); + } + else + { + char* good = _str-1; + for (char* s = _str; *s; s++) + if (!is_space(*s)) good = s; + *(good+1) = '\0'; + } + return *this; +} + +TString& TString::trim() +{ + char* last = _str; + + // Salta spazi iniziali + for (const char* s = _str; *s && is_space(*s); s++); + + // Copia stringa + if (s > _str) + { + for(char* c = _str; *s; s++) + { + *c++ = *s; + if (!is_space(*s)) last = c; + } + // Elimina spazi finali + *last = '\0'; + } + else rtrim(); + + return *this; +} + +// Certified 50% +// @doc EXTERNAL + +// @mfunc Compara due stringhe (o i primi

caratteri) +// +// @rdesc Ritrna i seguenti valori: +// +// @flag 0 | Se le stringhe sono uguali +// @flag 0 | Se le stringhe sono diverse +int TString::compare( + const char* s, // @parm Stringa da comparare + int max, // @parm Numero di caratteri da conforntare (default tutta la stringa) + bool ignorecase) const // @parm Ignorare la differenza maiuscolo/minuscolo (default FALSE) +{ + int res; + if (ignorecase) + { + if (max < 0) + res = stricmp(_str, s); + else + { + for (int i = 0; i < max; i++) + { + res = toupper(_str[i]) - toupper(s[i]); + if (res) break; + } + } + } + else + res = max < 0 ? strcmp(_str, s) : strncmp(_str, s, max); + + return res; +} + +// Certified 100% +// @doc EXTERNAL + +// @mfunc Riempe la stringa con n caratteri c +// +// @rdesc Ritorna l'indirizzo dell stringa +TString& TString::fill( + char c, // @parm Caratteri con cui riempire la stringa + int n) // @parm Numero di caratteri da inserire nella stringa + // (default per tutta la lungehzza) + + // @comm Se il paramatro

e' maggiore della dimensione della stringa, la + // stessa viene ridimensionata (chaimata alla ). + // Nel caso non venga passato il parametro

la stringa viene + // riempita col carattere

per tutta la lunghezza. + +{ + if (n < 0) n = size(); else + if (n > size()) resize(n, FALSE); + memset(_str, c, n); + _str[n] = '\0'; + return *this; +} + +// Certified 100% +// @doc EXTERNAL + +// @mfunc Giustifica l'oggetto stringa a destra +TString& TString::right_just( + int n, // @parm Numero di colonne alla quali allineare (defualt larghezza della stringa) + char c) // @parm Carattere di riempimento (default ' ') + + // @comm Nel caso venga passato un carattere in

, questo viene inserito + // nel resto della stringa (a sinistra della stringa stessa) + // + // @xref +{ + if (n < 0) n = size(); + trim(); + spark = _str; + fill(c, n); + overwrite(spark, n-spark.len()); + + return *this; +} + +// Certified 100% +// @doc EXTERNAL + +// @mfunc Centra l'oggetto stringa +TString& TString::center_just( + int n, // @parm Numero di colonne alla quali allineare (defualt larghezza della stringa) + char c) // @parm Carattere di riempimento (default ' ') + + // @comm Nel caso venga passato un carattere in

, questo viene inserito + // nel resto della stringa (a destra e a sinistra della stringa stessa) + // + // @xref +{ + if (n < 0) n = size(); + trim(); + spark = _str; + fill(c, n); + const int p = (n-spark.len()) >> 1; + overwrite(spark, p); + + return *this; +} + +// Certified 100% +// @doc EXTERNAL + +// @mfunc Giustifica l'oggetto stringa a sinistra +TString& TString::left_just( + int n, // @parm Numero di colonne alla quali allineare (defualt larghezza della stringa) + char c) // @parm Carattere di riempimento (default ' ') + + // @comm Nel caso venga passato un carattere in

, questo viene inserito + // nel resto della stringa (a destra della stringa stessa) + // + // @xref +{ + if (n < 0) n = size(); + trim(); + spark = _str; + fill(c, n); + overwrite(spark, 0); + + return *this; +} + +// @doc EXTERNAL + +// @mfunc Formatta una stringa usando il formato dato da

+TString& TString::picture( + const char* pic, // @parm Formato della stringa + const char* s) // @parm Stringa da formattare +{ + if (pic == NULL || *pic == '\0') + return set(s); + + set(pic); + + int l = strlen(s)-1; // Prossimo carattere da sostituire a # o @ + + for (int i = len()-1; i >= 0; i--) + { + const char k = pic[i]; + if (k == '#') _str[i] = (l >= 0) ? s[l--] : ' '; + else if (k == '@') _str[i] = (l >= 0) ? s[l--] : '0'; + else if (k == '^') { _str[i] = ' '; l--; } + } + + return *this; +} + +// Certified 90% (spark size limited) +// @doc EXTERNAL + +// @mfunc Manda un output formattato alla stringa oggetto +TString& TString::format( + const char* fmt, // @parm Stringa da formattare + ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

+ + // @comm Funziona come la funzione "sprintf" standard del C e ritorna la + // stringa formattata con i parametri passati. +{ + va_list pars; + va_start(pars, fmt); + const int tot = vsprintf((char*)(const char*)spark, fmt, pars); + va_end(pars); + + CHECK(tot >= 0 && tot < spark.size(), "Ue'! Quanto scrivi?"); + if (tot > size()) resize(tot, FALSE); + strcpy(_str, spark); + + return *this; +} + +// Certified 100% +TString& TString::upper() +{ + for (char* s = _str; *s; s++) *s = toupper(*s); + return *this; +} + +// Certified 100% +TString& TString::lower() +{ + for (char* s = _str; *s; s++) *s = tolower(*s); + return *this; +} + +// Certified 50% +// @doc EXTERNAL + +// @mfunc Permette di ttrovare il plurale di una stringa +TString& TString::add_plural( + long num, // @parm Numero di elementi per sapere la desineneza + const char* name) // @parm Stringa da modificare + + // @comm A seconda del numero passato in

permette di stabilire la + // corretta sintassi della stringa

da scrivere nei messaggi + // dati all'utente. Nel caso

sia 0 allora ritorna "nessuno". +{ + const TFixed_string n(name); + const char last = n[n.len()-1]; + + if (num < 1) + { + *this << "nessun"; + if (toupper(last) == 'A' || toupper(n[0]) == 'Z' || + toupper(n[0]) == 'S' && strchr("aeiouAEIOU", n[1]) == NULL) + *this << tolower(last); + *this << ' ' << name; + } + else + { + *this << num << ' ' << name; + if (num > 1) + _str[len()-1] = (last == 'a') ? 'e' : 'i'; + } + + return *this; +} + +// Certified 90% +// @doc EXTERNAL + +// @mfunc Sovrascrive la stringa

dalla posizione

+TString& TString::overwrite( + const char* s, // @parm Stringa da inserire + int pos) // @parm Posizione dalla quale iniziare a sovrascrivere + + // @comm Sovrascrive dalla posizione

fino alla lunghezza di

l'oggetto + // stringa. Nel caso la dimensione sia maggiore l'oggetto viene riallocato + // dinamicamente + // + // @xref +{ + const int l = len(); + if (pos < 0) pos = l; + const int max = pos+strlen(s); + if (max > size()) resize(max, TRUE); // resize needed? + + const bool over = max > l; // beyond end of string? + for (int i = l; i < pos; i++) _str[i] = ' '; // space padding + for (; *s; s++) _str[pos++] = *s; // write + if (over) _str[pos] = '\0'; // end of string + + return *this; +} + + +// Certified 90% +// @doc EXTERNAL + +// @mfunc Inserisce la stringa s dalla posizione pos +TString& TString::insert( + const char* s, // @parm Stringa da inserire + int pos) // @parm Posizione dalla quale iniziare a inserire + + // @comm Inserisce dalla posizione

la stringa

nell'oggetto + // stringa. Nel caso la dimensione sia maggiore l'oggetto viene riallocato + // dinamicamente + // + // @xref +{ + if (s && *s) + { + const int l = strlen(s); + make_room(l); + mid(pos); // Scrivi in spark la stringa da pos in poi + overwrite(s, pos); // Aggiungi s + strcpy(&_str[pos+l], spark); // Aggiungi spark + } + return *this; +} + +// Certified 90% +word TString::hash() const +{ +/* +// Villa's megasmart hash function + word h = 0x0000; + for (int i = 0; _str[i]; i++) + h ^= (i & 0x1) ? (_str[i] << 8) : _str[i]; +*/ + // Peter Weinberger's (PJW) generic hashing + word h = 0; + for (const char* s = _str; *s; s++) + { + h = (h << 2) + *s; + const word i = h & 0xC000; + if (i) h = (h ^ (i >> 12)) & 0x3FFF; + } + return h; +} + +/////////////////////////////////////////////////////////// +// TFixed_string +/////////////////////////////////////////////////////////// + +// Certified 100% +TFixed_string::TFixed_string(const char* str, int size) +: TString((char*)str, (size <= 0) ? strlen(str) : size-1) +{ + CHECK(str, "NULL buffer for fixed string"); + if (size > 0 && memchr(str, '\0', size) == NULL) + cut(0); +} + + +// Certified 100% +TFixed_string::~TFixed_string() +{ _str = NULL; } // Impedisce la deallocazione + + +// Certified 100% +void TFixed_string::resize(int size, bool) +{ +#ifdef DBG + fatal_box("Impossibile ridimensionare una stringa fissa da %d a %d caratteri:\n'%s'", + _size, size, _str); +#endif +} + + +// Certified 99% (s != NULL) +void TFixed_string::strncpy(const char* s, int n) +{ + CHECKD(n <= _size, "Fixed string can't be strncpyed: lenght ", n); + for (int i = 0; *s && i < n; i++) _str[i] = *s++; + _str[i] = '\0'; +} + +// Certified 99% +// @doc EXTERNAL + +// @mfunc Manda un output formattato alla stringa oggetto +TString& TFixed_string::format( + const char* fmt, // @parm Formato della stringa + ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

+ + // @comm Funziona come la funzione "sprintf" standard del C e ritorna la + // stringa formattata con i parametri passati. + // E' piu' efficiente di poiche' non usa spark +{ + va_list pars; + va_start(pars, fmt); + const int tot = vsprintf(_str, fmt, pars); + va_end(pars); + CHECK(tot >= 0 && tot < size(), "Ue'! Quanto scrivi con 'sta format?"); + return *this; +} + + + +/////////////////////////////////////////////////////////// +// Filename +/////////////////////////////////////////////////////////// + +const char SLASH = +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT +'\\'; +#else +'/'; +#endif + +// Certified 90% +const char* TFilename::ext() const +{ + const char* d = strrchr(name(), '.'); + if (d && is_not_slash(*(++d))) return d; + return ""; +} + +// Certified 90% +void TFilename::ext(const char* e) +{ + char* d = strrchr(name(), '.'); + if (d && is_not_slash(*(d+1))) *d = '\0'; + + if (*e && *e != '.') *this << "."; + *this << e; +} + + +// Certified 90% +const char* TFilename::name() const +{ + for (int i = strlen(_str)-1; i >= 0; i--) + if (_str[i] == '/' || _str[i] == '\\' || _str[i] == ':') + break; + + return &_str[i+1]; +} + +// Certified 90% +const char* TFilename::path() const +{ + for (int i = strlen(_str)-1; i >= 0; i--) + if (_str[i] == '/' || _str[i] == '\\' || _str[i] == ':') + break; + + spark.strncpy(_str, i+1); + return spark; +} + + +TFilename& TFilename::add(const char* n) +{ + if (not_empty() && is_not_slash(_str[len()-1])) + *this << SLASH; + *this << n; + return *this; +} + + +// @doc EXTERNAL + +// @mfunc Controlla il formato del nome del file +// +// @rdesc Ritorna i seguenti valori +// +// @flag TRUE | Se il nome del file e' sintatticamente corretto +// @flag FALSE | Se il nome del file non e' sintatticamente corretto +bool TFilename::ok() const + +// @comm Controlla tutti i casi per cui un nome di file puo' non essere valido. +// Nel caso si lavori in Windows controlla anche che il nome del +// disco sia corretto. +{ + 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_WIN || XVT_OS == XVT_OS_NT + 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() +{ + static TFilename _tempdir; + const bool create = _tempdir.empty() || user().compare(_tempdir.right(user().len()), -1, TRUE); + + if (create) + { + const char* dirpref = getenv("TEMP"); + if (dirpref == NULL || *dirpref == '\0') dirpref = getenv("TMP"); + if (dirpref == NULL || *dirpref == '\0') +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT + dirpref = "\\tmp"; +#else + dirpref = "/tmp"; +#endif + _tempdir = dirpref; + + const int last = len()-1; + if (!is_not_slash(_str[last])) + _tempdir.cut(last); + + bool ok = TRUE; + + _tempdir.lower(); + if (!fexist(_tempdir)) + ok = make_dir(_tempdir); + + if (ok) + { + TString16 theuser(user()); + + if (theuser.empty()) + theuser = "prassi"; + theuser.lower(); + if (theuser.not_empty() && _tempdir.find(theuser) != _tempdir.len() - theuser.len()) + _tempdir << SLASH << theuser; + _tempdir.lower(); + if (!fexist(_tempdir)) + ok = make_dir(_tempdir); + } + + if (!ok) + fatal_box("Impossibile creare la directory '%s' per i file temporanei", (const char*)_tempdir); + + _tempdir.insert("TMP=", 0); + putenv(_tempdir); + } + + set(_tempdir.mid(4)); + return *this; +} + +// Certified 50% +// @doc EXTERNAL + +// @mfunc Genera il nome di un file temporaneo +const TFilename& TFilename::temp( + const char* prefix) // @parm Eventuale prefisso da assegnare al file temporaneo + + // @comm Nel generare il nome del file controlla se esistone dei caratteri jolly + // e li elimina. +{ + tempdir(); + + if (prefix && *prefix) + { + set(prefix); // Copia prefisso e ... + strip("$#*?."); // ... toglie caratteri jolly + + const TFixed_string f(prefix); +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT + if (f.find("$$") != -1) + { + char pid[8]; + sprintf(pid, "%d", getpid()); + pid[3] = '\0'; + *this << pid; + } +#else + if (f.find("$$") != -1) *this << getpid(); + if (f.find("##") != -1) *this << getuid(); +#endif + } + else cut(0); + + char* t = tempnam(NULL, (char*)_str); + + CHECK(t != NULL, "Can't execute tempnam"); + set(t); + free(t); + +#ifdef DBG + if (fexist(_str)) + fatal_box("Il file '%s' esiste gia'", _str); +#endif + + return *this; +} + + +/////////////////////////////////////////////////////////// +// Token string +/////////////////////////////////////////////////////////// + +// Certified 100% +TToken_string::TToken_string(const char* s, char separator) +: TString(s), _separator(separator) +{ + CHECK(_separator, "NULL TToken_string separator"); + restart(); +} + +// Certified 100% +TToken_string::TToken_string(int n, char separator) +: TString(n), _separator(separator), _last(-1) +{ + CHECK(_separator, "NULL TToken_string separator"); +} + +// Certified 100% +TToken_string::TToken_string(const TToken_string& s) +: TString(s), _separator(s._separator), _last(s._last) +{ + CHECK(_separator, "NULL TToken_string separator"); +} + +void TToken_string::separator(char s) +{ + CHECK(s, "NULL TToken_string separator"); + _separator = s; +} + + +// Certified 100% +TObject* TToken_string::dup() const +{ + return new TToken_string(_str, _separator); +} + +// Certified 90% +const char* TToken_string::get() +{ + CHECK(_separator, "Corrupted TToken_string: NULL separator"); + + if (_last < 0) return NULL; + + const int start = _last; + + if (_str[start] == '\0') + { + _last = -1; + return NULL; + } + else + if (_str[start] == _separator) + { + _last = start+1; + } + else + { + const int k = find(_separator, start); + _last = (k >= 0) ? k+1 : -1; + return sub(start, k); + } + return ""; +} + +// Certified 50% +// @doc EXTERNAL + +// @mfunc Ritorna un Token +// +// @rdesc Ritorne la stringa identificata dal Token passato come parametro

+const char* TToken_string::get( + int n) // @parm Token da ritornare (-1 = prossimo, -2 = ultimo, n = n-simo) + + // @syntax const char* get(int n); + // @syntax const char* get(); + // + // @comm Se non viene passato il parametro

ritorna il prossimo Token + // (come se

== -1) + // + // @xref +{ + CHECK(_separator, "Corrupted TToken_string: NULL separator"); + + if (n < 0) + { + if (n == -2) + { + const char* sep = strrchr(_str, _separator); + _last = -1; + return sep ? sep+1 : _str; + } + else return get(); + } + int sep = 0; + for (const char* s = _str; sep < n && *s; s++) + if (*s == _separator) sep++; + + if (sep >= n) + { + char* p = strchr(s, _separator); + if (p == NULL) + { + spark = s; + _last = -1; + } + else + { + *p = '\0'; + spark = s; + *p = _separator; + _last = (int)((const char*)p - _str) + 1; + } + } + else + { + _last = -1; + return NULL; + } + + return spark; +} + + +// Certified 99% +// @doc EXTERNAL + +// @mfunc Ritorna un carattere +// +// @rdesc Ritorna il primo carattere del Token richiesto +char TToken_string::get_char( + int n) // @parm Token da ritornare + + // @comm Chiama la con tutti i relativi significati per + // il parametro

+{ + const char* const car = get(n); + return car ? *car : '\0'; +} + +// Certified 99% +int TToken_string::get_int(int n) +{ + const char* const num = get(n); + return num ? atoi(num) : 0; +} + + +// Certified 99% +long TToken_string::get_long(int n) +{ + const char* const num = get(n); + return num ? atol(num) : 0L; +} + + +// Certified 70% +bool TToken_string::set_item(const char* v, int n) +{ + CHECK(_separator, "Corrupted TToken_string: NULL separator"); + + int sep = 0; + for (int i = 0; sep < n && _str[i]; i++) + if (_str[i] == _separator) sep++; + + if (sep < n) // Aggiunge items mancanti prima della posizione n + { + for (;sep < n; sep++) + *this << _separator; + *this << v; + return FALSE; + } + + int e = find(_separator, i); + if (e < 0) e = len(); + + spark = &_str[e]; // Salva items seguenti + cut(i); // Considera solo items precedenti + *this << v << spark; // Aggiunge item desiderato e seguenti + return TRUE; +} + + +// Certified 80% +int TToken_string::get_pos(const char* s) +{ + const char* item; + + restart(); + for (int i = 0; (item = get()) != NULL; i++) + if (strcmp(item, s) == 0) return i; + + return -1; +} + +// Certified 80% +int TToken_string::get_pos(long n) +{ + char s[16]; sprintf(s, "%ld", n); + return get_pos(s); +} + + + +// Certified 90% +bool TToken_string::empty_items() const +{ + for (const char* c = _str; *c; c++) + if (!is_space(*c) && *c != _separator) return FALSE; + return TRUE; +} + + +// Certified 80% +int TToken_string::items() const +{ + int t = 0; + if (not_empty()) + { + t++; + for (const char* s = _str; *s; s++) + if (*s == _separator) t++; + } + return t; +} + +// Certified 99% +// @doc EXTERNAL + +// @mfunc Aggiunge un elemento alla token string +void TToken_string::add( + const char* s, // @parm Stringa da aggiungere + int pos) // @parm Posizione nella quale aggiungere l'elemento + // (default aggiunge come ultimo elemento) + // @parm char | c | Caratter da aggiungere + // @parm long | n | Long da aggiungere + // @parm int | n | Intero da aggiungere + + // @syntax void add(const char* s, int n = -1); + // @syntax void add(char c, int pos = -1); + // @syntax void add(long n, int pos = -1); + // @syntax void add(int n, int pos = -1); + // + // @comm Permette, a seconda del parametro passato, di aggiungere alla Token + // string un nuovo elemnto gi… completo del carattere di separazione +{ + if (s == NULL || *s == '\0') s = " "; + if (pos < 0) + { + if (not_empty()) *this << _separator; + *this << s; + } + else + set_item(s, pos); + if (_last < 0) _last = 0; +} + +// Certified 0% +void TToken_string::add(char c, int pos) +{ + const char s[2] = { c, '\0' }; + add(s, pos); +} + +// Adds an integer value to the token string +// Certified 100% +void TToken_string::add(long n, int pos) +{ + char s[16]; + sprintf(s, "%ld", n); + add(s, pos); +} + +void TToken_string::add(int n, int pos) +{ + char s[16]; + sprintf(s, "%d", n); + add(s, pos); +} + +// Certified 50% +void TToken_string::destroy(int n) +{ + if (_last == -2) return ; + + if (n < 0) + { + char* s = strrchr(_str, _separator); + if (s != NULL) *s = '\0'; + } + else + { + int sep = 0; + for (char* s = _str; sep < n && *s; s++) + if (*s == _separator) sep++; + + if (sep >= n) + { + const char* p = strchr(s, _separator); + *s = '\0'; + if (p != NULL) strcat(s, p+1); + } + } + restart(); +} + +/////////////////////////////////////////////////////////// +// Paragraph string +/////////////////////////////////////////////////////////// + +TParagraph_string::TParagraph_string(const char* s, int width) +: TToken_string(s, '|'), _width(width) +{ tokenize(); } + +const TString& TParagraph_string::operator =(const char* s) +{ + TToken_string::operator=(s); + tokenize(); + return *this; +} + +void TParagraph_string::tokenize() +{ + int last_space = 0; + int chars_in_row = 0; + const int l = len(); + TString stmp; + for (int start = 0; start < l; start++) + { + switch (_str[start]) + { + case '\n': _str[start]='|'; last_space = 0;chars_in_row=0; break; + case ' ' : last_space = start; chars_in_row++; break; + default : chars_in_row++; break; + } + stmp<<_str[start]; + if (chars_in_row == _width && chars_in_row != l) + { + if (last_space!=0) stmp[last_space] = '|'; + else stmp<<"|"; + last_space = 0; chars_in_row = 0; + } + } + TToken_string::operator=(stmp); +} + +/////////////////////////////////////////////////////////// +// TString_array +/////////////////////////////////////////////////////////// + +int TString_array::add(const char* s, int n) +{ + if (objptr(n) == NULL) + n = TArray::add(new TToken_string(s), n); + else row(n) = s; + return n; +} + +int TString_array::add(const TToken_string& s, int n) +{ + if (objptr(n) == NULL) + n = TArray::add(s); + else + row(n) = s; + return n; +} + +// @doc EXTERNAL + +// @mfunc Cerca una stringa nell'array +// +// @rdesc Ritorna la posizione nell'array in cui si trova la stringa (-1 se non +// e' stata trovata) +int TString_array::find( + const char* s, // @parm Stringa da cercare + int from) const // @parm Posizione dalla quale cercare la stringa +{ + int found = -1; + for (int i = from; i < items(); i++) + if (row(i).compare(s, -1, TRUE) == 0) + { + found = i; + break; + } + return found; +} + +HIDDEN int ascending_string(const TObject** o1, const TObject** o2) +{ + const TString* s1 = (const TString*)*o1; + const TString* s2 = (const TString*)*o2; + return strcmp(*s1, *s2); +} + +HIDDEN int descending_string(const TObject** o1, const TObject** o2) +{ + return -ascending_string(o1, o2); +} + +void TString_array::sort(bool ascending) +{ + TArray::sort(ascending ? ascending_string : descending_string); +} + diff --git a/include/strings.h b/include/strings.h index 19d79dab6..5aeadfae6 100755 --- a/include/strings.h +++ b/include/strings.h @@ -1,581 +1,581 @@ -#ifndef __STRINGS_H -#define __STRINGS_H - -#ifndef __STRING_H -#include -#endif - -#ifndef __ARRAY_H -#include -#endif - -#ifndef __REGEXP_H -#include -#endif - - -// @doc EXTERNAL - -// @class Classe per la definizione della stringhe -// -// @base public | TObject -class TString : public TObject -// @author:(INTERNAL) Guido -{ - // @access Protected Member -protected: - // @cmember Puntatore alla stringa - char* _str; - // @cmember Lunghezza della stringa - int _size; - - // @cmember Espande la stringa per altri caratteri - int make_room(int size); - // @cmember Inizializza con la stringa puntata da char* di lunghezza size - TString& set(const char*); - - // @cmember Costruttore per consentire la derivazione delle TFixed_string - TString(char* str, int size) : _str(str), _size(size) - {} - - // @access Public member -public: - // @cmember Rialloca la stringa - virtual void resize(int size, bool cpy); - - // @cmember Costruttore - TString(); - // @cmember Costruttore di default per una stringa data - TString(int size); - // @cmember Costruttore a partire da una stringa s - TString(const char* s); - // @cmember Costruttore da un oggetto TString s - TString(const TString& s); - // @cmember Distruttore - virtual ~TString(); - - // @cmember Ritorna il nome della classe - virtual const char* class_name() const; - // @cmember Ritorna l'identificatore della classe - virtual word class_id() const; - // @cmember Controlla se si tratta di una stringa valida (diversa da NULL) - virtual bool ok() const - { return _str != NULL; } - // @cmember Duplica una stringa - virtual TObject* dup() const; - // @cmember Stampa una stringa - virtual void print_on(ostream& out) const; - // @cmember Legge una stringa - virtual void read_from(istream& in); - // @cmember Ritorna il valore hash della stringa - virtual word hash() const; - - // @cmember const char * | operator const char*() | | Trasforna una stringa - // in puntatore a carattere - operator const char*() const - { return (const char*)_str; } - // @cmember Ritorna un riferimento al carattere i-esimo della stringa - char& operator[](int i) - { - CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); - return _str[i]; - } - // @cmember Ritorna il carattere i-esimo della stringa - char operator[](int i) const - { - CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); - return _str[i]; - } - - // @cmember Ritorna la dimensione allocata della stringa - int size() const - { return _size; } - // @cmember Ritorna la lunghezza della stringa (numero di caratteri) - int len() const - { return strlen(_str); } - // @cmember Controlla se la stringa e' vuota (TRUE se non contiene caratteri) - bool empty() const - { return *_str == '\0'; } - // @cmember Controlla se la stringa non e' vuota (TRUE se contiene caratteri) - bool not_empty() const - { return *_str != '\0'; } - // @cmember Controlla se la stringa e' vuota o contiene solo whitespace (TRUE se vuota) - bool blank() const; - - // @cmember Ritorna la posizione del carattere char nell'oggetto TString - int find(char, int from = 0) const; - // @cmember Ritorna la posizione della stringa s nell'oggetto TString - int find(const char* s, int from = 0) const; - // @cmember Sostituisce le occorrenze di

col carattere

- int replace(char find_char, char replace_char); - - // @cmember Ritorna l'oggetto TString composto dai count caratteri da sinistra - const TString& left(int count) const; - // @cmember Ritorna l'oggetto TString composto dai count caratteri a partire da from - const TString& mid(int from, int count = -1) const; - // @cmember Ritorna la stringa da from a to (escluso) - const TString& sub(int from, int to = -1) const; - // @cmember Ritorna l'oggetto TString composto dai count caratteri da destra - const TString& right(int count) const; - - // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da sinistra - TString sleft(int count) const - { return ((TString)left(count)); } - // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri a partire da from - TString smid(int from, int count = -1) const - { return ((TString)mid(from, count)); } - // @cmember Ritorna un oggetto TString temporaneo composto dai caratteri da from a to (escluso) - TString ssub(int from, int to = -1) const - { return ((TString)sub(from, to)); } - // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da destra - TString sright(int count) const - { return ((TString)right(count)); } - - // @cmember Riempe la stringa con n caratteri c - TString& fill(char c, int n = -1); - // @cmember Riempe la stringa con n caratteri spazio (chiama ) - TString& spaces(int n = -1) - { return fill(' ', n); } - // @cmember Sovrascrive la stringa s dalla posizione pos - TString& overwrite(const char* s, int pos = 0); - // @cmember Inserisce la stringa s dalla posizione pos - TString& insert(const char* s, int pos = 0); - - // @cmember Elimina tutti i caratteri contenuti in k - TString& strip(const char* k); - // @cmember Elimina tutti gli spazi non contenuti tra apici singoli o doppi - TString& strip_spaces(); - // @cmember Elimina tutti gli spazi doppi - TString& strip_d_spaces(); - // @cmember Elimina gli spazi da sinistra o i primi n caratteri (da sinistra). - TString& ltrim(int n = 0); - // @cmember Elimina gli spazi da destra o i primi n caratteri (da destra). - TString& rtrim(int n = 0); - // @cmember Composizione di e per eliminare - // gli spazi iniziali e finali - TString& trim(); - - // @cmember Giustifica l'oggetto stringa a destra - TString& right_just(int n = -1, char c = ' '); - // @cmember Centra l'oggetto stringa - TString& center_just(int n = -1, char c = ' '); - // @cmember Giustifica l'oggetto stringa a sinistra - TString& left_just(int n = -1, char c = ' '); - - // @cmember Formatta una stringa usando il formato dato da pic - TString& picture(const char* pic, const char* s); - -#ifndef __WATCOMC__ - virtual -#endif - // @cmember Manda un output formattato alla stringa oggetto - TString& format(const char* fmt, ...); - - - // @cmember Tronca la stringa alla posizione n-esima. - TString& cut(int n); - - // @cmember Converte la stringa in maiuscolo - TString& upper(); - // @cmember Converte la stringa in minuscolo - TString& lower(); - // @cmember Permette di ttrovare il plurale di una stringa - TString& add_plural(long num, const char * name); - - // @cmember Assegna la stringa passata con indirizzo - const TString& operator =(const TString& s) - { return set(s._str); } - // @cmember Assegna la stringa passata - const TString& operator =(const char* s) - { return set(s); } - - // @cmember Concatena una stringa all'oggetto stringa - TString& operator <<(const char*); - // @cmember Concatena un carattere all'oggetto stringa - TString& operator <<(char); - // @cmember Concatena un intero all'oggetto stringa - TString& operator <<(int); - // @cmember Concatena un long all'oggetto stringa - TString& operator <<(long); - // @cmember Concatena un double all'oggetto stringa - TString& operator <<(double); - // @cmember Concatena un oggetto all'oggetto stringa - TString& operator <<(const TObject& obj); - // @cmember Concatena una stringa all'oggetto stringa (usato per aumentare l'efficienza) - TString& operator <<(const TString& str); - - - // @cmember Controlla se due stringhe sono uguali - bool operator ==(const char* s) const - { return strcmp(_str, s) == 0; } - // @cmember Controlla se due stringhe sono uguali - bool operator ==(char* s) const - { return strcmp(_str, s) == 0; } - // @cmember Controlla se due stringe sono uguali - bool operator ==(const TString& s) const - { return strcmp(_str, s._str) == 0; } - // @cmember Controlla se due stringhe sono diverse - bool operator !=(const char* s) const - { return strcmp(_str, s) != 0; } - // @cmember Controlla se due stringhe sono diverse - bool operator !=(char* s) const - { return strcmp(_str, s) != 0; } - // @cmember Controlla se due stringhe sono diverse - bool operator !=(const TString& s) const - { return strcmp(_str, s._str) != 0; } - // @cmember Controlla se una stringa e' minore di un'altra - bool operator <(const char* s) const - { return strcmp(_str, s) < 0; } - // @cmember Controlla se una stringa e' maggiore di un'altra - bool operator >(const char* s) const - { return strcmp(_str, s) > 0; } - // @cmember Controlla se una stringa e' maggiore o uguale ad un'altra - bool operator >=(const char* s) const - { return strcmp(_str, s) >= 0; } - // @cmember Controlla se una stringa e' minore o uguale ad un'altra - bool operator <=(const char* s) const - { return strcmp(_str, s) <= 0; } - // @cmember Controlla se una stringa e' minore di un'altra - bool operator <(const TString & s) const - { return strcmp(_str, s._str) < 0; } - // @cmember Controlla se una stringa e' maggiore di un'altra - bool operator >(const TString & s) const - { return strcmp(_str, s._str) > 0; } - // @cmember Controlla se una stringa e' maggiore o uguale ad un'altra - bool operator >=(const TString & s) const - { return strcmp(_str, s._str) >= 0; } - // @cmember Controlla se una stringa e' minore o uguale ad un'altra - bool operator <=(const TString & s) const - { return strcmp(_str, s._str) <= 0; } - // @cmember Confronta usando le regular expression - bool match(const char* pat) const - { return ::match(pat, _str); } - // @cmember Compara due stringhe (o i primi max caratteri) - int compare(const char* s, int max = -1, bool ignorecase = FALSE) const; -}; - -// @doc EXTERNAL - -// @class TFixed_string | Classe per la definizione di stringhe di lunghezza -// fissa e non rilocabili dinamicamente -// -// @base public | TString -class TFixed_string : public TString -// @author:(INTERNAL) Guido -{ - - // @access Protected Member -protected: - // @cmember Causa un erroe fatale - virtual void resize(int size, bool cpy); - - // @access Public Member -public: - // @cmember Costruttore - TFixed_string(const char* str, int size = -1); - // @cmember Distruttore - virtual ~TFixed_string(); - -#ifndef __WATCOMC__ - virtual -#endif - // @cmember Manda un output formattato alla stringa oggetto - TString& format(const char* fmt, ...); - - // @cmember Assegna la stringa passata con indirizzo - const TString& operator =(const TString& s) - { return set((const char*)s); } - // @cmember Assegna la stringa passata - const TString& operator =(const char* str) - { return set(str); } - // @cmember Copia n caratteri nella stringa oggetto - void strncpy(const char* s, int n); -}; - -// @doc EXTERNAL - -// @class TString16 | Definisce le stringhe di 16 caratteri -// -// @base public | TFixed_string -class TString16 : public TFixed_string -// @author:(INTERNAL) Guido -{ - // @access:(INTERNAL) Private member - - // @cmember:(INTERNAL) Stringa di 16 caratteri - char _str16[17]; - - // @access Public Member -public: - // @cmember Costruttore - TString16(const char* s = "") : TFixed_string(_str16, 17) - { set(s); } - // @cmember Costruttore - TString16(const TString& s) : TFixed_string(_str16, 17) - { set(s); } - // @cmember Assegna una stringa - const TString& operator =(const TString& s) - { return set((const char*)s); } - // @cmember Assegna una stringa - const TString& operator =(const char* s) - { return set(s); } - - // @comm Sono definite anche le classi e per le - // stringhe rispettivamente di 80 e 256 caratteri. I class member sono - // gli stessi, la differenza e' solo nel numero di caratteri della stringa. -}; - -// @doc EXTERNAL - -// @class TString80 | Definisce le stringhe di 80 caratteri -// -// @base public | TFixed_string -// -// @author:(INTERNAL) Guido -// -// @comm Questa classe e' identica alla per quanto riguarda i public member e quindi -// si rimanda a tale classe per ulteriori spiegazioni. -class TString80 : public TFixed_string -{ - char _str80[81]; - -public: - TString80(const char* s = "") : TFixed_string(_str80, 81) { set(s); } - TString80(const TString& s) : TFixed_string(_str80, 81) { set(s); } - const TString& operator =(const char* s) { return set(s); } - const TString& operator =(const TString& s) { return set((const char*)s); } -}; - -// @doc EXTERNAL - -// @class TString256 | Definisce le stringhe di 256 caratteri -// -// @base public | TFixed_string -// -// @author:(INTERNAL) Guido -// -// @comm Questa classe e' identica alla per quanto riguarda i public member e quindi -// si rimanda a tale classe per ulteriori spiegazioni. -class TString256 : public TFixed_string -{ - char _str256[257]; - -public: - TString256(const char* s = "") : TFixed_string(_str256, 257) { set(s); } - TString256(const TString& s) : TFixed_string(_str256, 257) { set(s); } - const TString& operator =(const char* s) { return set(s); } - const TString& operator =(const TString& s) { return set((const char*)s); } -}; - -// @doc EXTERNAL - -// @class TFilename | Classe per la gestione dei nome dei file -// -// @base public | TString80 -class TFilename : public TString80 -// @author:(INTERNAL) Guido - -{ - - // @comm Nel caso di utilizzo di Windows 95 occorre cambiare le classe base in - - // @access Public Member -public: - // @cmember Costruttore - TFilename(const char* n = "") : TString80(n) - {} - // @cmember Costruttore - TFilename(const TString& n) : TString80((const char*)n) - {} - // @cmember Costruttore - TFilename(const TFilename& n) : TString80((const char*)n) - {} - - // @cmember Assegnazione tra TFile e stringa - const TString& operator =(const char* s) - { return set(s); } - // @cmember Assegnazione tra TFile ed indirizzo della stringa - const TString& operator =(const TString& s) - { return set((const char*)s); } - - // @cmember Controlla il formato del nome del file - virtual bool ok() const; - - // @cmember Ritorna l'estensione del file - const char* ext() const; - // @cmember Imposta come estensione la stringa puntata da char* - void ext(const char*); - - // @cmember Concatena un nome di file ad una directory - TFilename& add(const char* n); - - // @cmember Ritorna il nome del file - const char* name() const; - // @cmember Ritorna il nome del direttorio - const char* path() const; - // @cmember Genera il nome di un file temporaneo - const TFilename& temp(const char* prefix = NULL); - // @cmember Genera il nome della directory temporanea - const TFilename& tempdir(); -}; - - -// @doc EXTERNAL - -// @class TToken_string | Contiene una stringa formata da piu' stringhe -// separate da un carattere (di solito il pipe) -// -// @base public | TString -class TToken_string : public TString -// @author:(INTERNAL) Guido -{ - - // @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Carattere separatore - char _separator; - // @cmember:(INTERNAL) Puntatore all'ultimo - int _last; - - // @access Protected Member -protected: - // @cmember Crea un duplicato della token string - virtual TObject* dup() const; - // @cmember Inserisce l'n-esima stringa - bool set_item(const char* v, int n); - - // @access Public Member -public: - // @cmember Costruttore - TToken_string(const char* = "", char separator = '|'); - // @cmember Costruttore - TToken_string(int n, char separator = '|'); - // @cmember Costruttore - TToken_string(const TToken_string& s); - - // @cmember Setta il carattere separatore a s - void separator(char s); - - // @cmember Rimette all'inizio il puntatore - void restart() - { _last = empty() ? -1 : 0; } - // @cmember Assegna una stringa - const TString& operator =(const char* s) - { set(s);restart();return *this; } - // @cmember Assegna una stringa - const TString& operator =(const TString& s) - { set(s);restart();return *this; } - - // @cmember Aggiunge una stringa - void add(const char* s, int n = -1); - // @cmember Aggiunge un carattere - void add(char c, int pos = -1); - // @cmember Aggiunge un long - void add(long n, int pos = -1); - // @cmember Aggiunge un intero - void add(int n, int pos = -1); - // @cmember Toglie la stringa di posizione pos - void destroy(int pos); - // @cmember Ritorna il prossimo token - const char* get(); - // @cmember Ritorna un token - const char* get(int n); - // @cmember Ritorna un carattere (chiama ) - char get_char(int n = -1); - // @cmember Ritorna un intero (chiama ) - int get_int(int n = -1); - // @cmember Ritorna un intero esteso (chiama ) - long get_long(int n = -1); - // @cmember Ritorna la posizione dell'item s - int get_pos(const char* s); - // @cmember Ritorna la posizione dell'item s - int get_pos(long s); - // @cmember Ritorna il numero di token presenti - int items() const; - // @cmember Controlla se tutti i token sono nulli - bool empty_items() const; -}; - -/////////////////////////////////////////////////////////// -// DES Paragraph -/////////////////////////////////////////////////////////// - -// @doc EXTERNAL - -// @class TParagraph_string | Classe che serve per spezzare le stringhe in paragrafi -// lunghi al massimo la lunghezza fissata -// -// @base public | TToken_string -class TParagraph_string : public TToken_string -// @author:(INTERNAL) Guido -{ - // @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Lunghezza massima del paragrafo - int _width; - - // @access Protected Member -protected: - // @cmember Spezza la stringa in paragrafi di lunghezza massima fissata - void tokenize(); - - // @access Public Member -public: - // @cmember Costruttore - TParagraph_string(const char* s, int width); - // @cmember Assegna una stringa - const TString& operator =(const char* s); - // @cmember Assegna un oggetto stringa - const TString& operator =(const TString & s) - { return operator=((const char *) s);} - // @cmember Permette di assegnare la lunghezza massima del paragrafo - void set_width(int width) - { _width = width; } -}; - -/////////////////////////////////////////////////////////// -// DES TString_array -/////////////////////////////////////////////////////////// - -// @doc EXTERNAL - -// @class TString_array | Array di stringhe -// -// @base public | TArray -class TString_array : public TArray -// @author:(INTERNAL) Guido -{ - - // @access Public Member -public: - // @cmember Ritorna la stringa n dell'array (se non c'e' ritorna errore) - TToken_string& row(int n) - { return (TToken_string&)operator[](n); } - // @cmember Ritorna la stringa n dell'array (se non c'e' ritorna errore) - const TToken_string& row(int n) const - { return (TToken_string&)operator[](n); } - // @cmember Restituisce il puntatore alla stringa n dell'array (NULL se non esiste) - TToken_string* rowptr(int n) - { return (TToken_string*)objptr(n); } - - // @cmember Aggiunge una Token string all'array (chiama ) - int add(TToken_string* s, int n = -1) - { return TArray::add(s, n); } - // @cmember Aggiunge un oggetto stringa all'array (chiama ) - int add(const TToken_string& s, int n = -1); - // @cmember Aggiunge una stringa all'array (chiama ) - int add(const char* s, int n = -1); - // @cmember Cerca una stringa nell'array - int find(const char* s, int from = 0) const; - // @cmember Ordina alfabeticamente l'array - void sort(bool ascendig = TRUE); - - // @cmember Costruttore - TString_array(int size = 8) : TArray(size) - {} - // @cmember Distruttore - virtual ~TString_array() - {} -}; - -#endif +#ifndef __STRINGS_H +#define __STRINGS_H + +#ifndef __STRING_H +#include +#endif + +#ifndef __ARRAY_H +#include +#endif + +#ifndef __REGEXP_H +#include +#endif + + +// @doc EXTERNAL + +// @class Classe per la definizione della stringhe +// +// @base public | TObject +class TString : public TObject +// @author:(INTERNAL) Guido +{ + // @access Protected Member +protected: + // @cmember Puntatore alla stringa + char* _str; + // @cmember Lunghezza della stringa + int _size; + + // @cmember Espande la stringa per altri caratteri + int make_room(int size); + // @cmember Inizializza con la stringa puntata da char* di lunghezza size + TString& set(const char*); + + // @cmember Costruttore per consentire la derivazione delle TFixed_string + TString(char* str, int size) : _str(str), _size(size) + {} + + // @access Public member +public: + // @cmember Rialloca la stringa + virtual void resize(int size, bool cpy); + + // @cmember Costruttore + TString(); + // @cmember Costruttore di default per una stringa data + TString(int size); + // @cmember Costruttore a partire da una stringa s + TString(const char* s); + // @cmember Costruttore da un oggetto TString s + TString(const TString& s); + // @cmember Distruttore + virtual ~TString(); + + // @cmember Ritorna il nome della classe + virtual const char* class_name() const; + // @cmember Ritorna l'identificatore della classe + virtual word class_id() const; + // @cmember Controlla se si tratta di una stringa valida (diversa da NULL) + virtual bool ok() const + { return _str != NULL; } + // @cmember Duplica una stringa + virtual TObject* dup() const; + // @cmember Stampa una stringa + virtual void print_on(ostream& out) const; + // @cmember Legge una stringa + virtual void read_from(istream& in); + // @cmember Ritorna il valore hash della stringa + virtual word hash() const; + + // @cmember const char * | operator const char*() | | Trasforna una stringa + // in puntatore a carattere + operator const char*() const + { return (const char*)_str; } + // @cmember Ritorna un riferimento al carattere i-esimo della stringa + char& operator[](int i) + { + CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); + return _str[i]; + } + // @cmember Ritorna il carattere i-esimo della stringa + char operator[](int i) const + { + CHECKD(i >= 0 && i <= _size, "Bad string subscript: ", i); + return _str[i]; + } + + // @cmember Ritorna la dimensione allocata della stringa + int size() const + { return _size; } + // @cmember Ritorna la lunghezza della stringa (numero di caratteri) + int len() const + { return strlen(_str); } + // @cmember Controlla se la stringa e' vuota (TRUE se non contiene caratteri) + bool empty() const + { return *_str == '\0'; } + // @cmember Controlla se la stringa non e' vuota (TRUE se contiene caratteri) + bool not_empty() const + { return *_str != '\0'; } + // @cmember Controlla se la stringa e' vuota o contiene solo whitespace (TRUE se vuota) + bool blank() const; + + // @cmember Ritorna la posizione del carattere char nell'oggetto TString + int find(char, int from = 0) const; + // @cmember Ritorna la posizione della stringa s nell'oggetto TString + int find(const char* s, int from = 0) const; + // @cmember Sostituisce le occorrenze di

col carattere

+ int replace(char find_char, char replace_char); + + // @cmember Ritorna l'oggetto TString composto dai count caratteri da sinistra + const TString& left(int count) const; + // @cmember Ritorna l'oggetto TString composto dai count caratteri a partire da from + const TString& mid(int from, int count = -1) const; + // @cmember Ritorna la stringa da from a to (escluso) + const TString& sub(int from, int to = -1) const; + // @cmember Ritorna l'oggetto TString composto dai count caratteri da destra + const TString& right(int count) const; + + // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da sinistra + TString sleft(int count) const + { return ((TString)left(count)); } + // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri a partire da from + TString smid(int from, int count = -1) const + { return ((TString)mid(from, count)); } + // @cmember Ritorna un oggetto TString temporaneo composto dai caratteri da from a to (escluso) + TString ssub(int from, int to = -1) const + { return ((TString)sub(from, to)); } + // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da destra + TString sright(int count) const + { return ((TString)right(count)); } + + // @cmember Riempe la stringa con n caratteri c + TString& fill(char c, int n = -1); + // @cmember Riempe la stringa con n caratteri spazio (chiama ) + TString& spaces(int n = -1) + { return fill(' ', n); } + // @cmember Sovrascrive la stringa s dalla posizione pos + TString& overwrite(const char* s, int pos = 0); + // @cmember Inserisce la stringa s dalla posizione pos + TString& insert(const char* s, int pos = 0); + + // @cmember Elimina tutti i caratteri contenuti in k + TString& strip(const char* k); + // @cmember Elimina tutti gli spazi non contenuti tra apici singoli o doppi + TString& strip_spaces(); + // @cmember Elimina tutti gli spazi doppi + TString& strip_d_spaces(); + // @cmember Elimina gli spazi da sinistra o i primi n caratteri (da sinistra). + TString& ltrim(int n = 0); + // @cmember Elimina gli spazi da destra o i primi n caratteri (da destra). + TString& rtrim(int n = 0); + // @cmember Composizione di e per eliminare + // gli spazi iniziali e finali + TString& trim(); + + // @cmember Giustifica l'oggetto stringa a destra + TString& right_just(int n = -1, char c = ' '); + // @cmember Centra l'oggetto stringa + TString& center_just(int n = -1, char c = ' '); + // @cmember Giustifica l'oggetto stringa a sinistra + TString& left_just(int n = -1, char c = ' '); + + // @cmember Formatta una stringa usando il formato dato da pic + TString& picture(const char* pic, const char* s); + +#ifndef __WATCOMC__ + virtual +#endif + // @cmember Manda un output formattato alla stringa oggetto + TString& format(const char* fmt, ...); + + + // @cmember Tronca la stringa alla posizione n-esima. + TString& cut(int n); + + // @cmember Converte la stringa in maiuscolo + TString& upper(); + // @cmember Converte la stringa in minuscolo + TString& lower(); + // @cmember Permette di ttrovare il plurale di una stringa + TString& add_plural(long num, const char * name); + + // @cmember Assegna la stringa passata con indirizzo + const TString& operator =(const TString& s) + { return set(s._str); } + // @cmember Assegna la stringa passata + const TString& operator =(const char* s) + { return set(s); } + + // @cmember Concatena una stringa all'oggetto stringa + TString& operator <<(const char*); + // @cmember Concatena un carattere all'oggetto stringa + TString& operator <<(char); + // @cmember Concatena un intero all'oggetto stringa + TString& operator <<(int); + // @cmember Concatena un long all'oggetto stringa + TString& operator <<(long); + // @cmember Concatena un double all'oggetto stringa + TString& operator <<(double); + // @cmember Concatena un oggetto all'oggetto stringa + TString& operator <<(const TObject& obj); + // @cmember Concatena una stringa all'oggetto stringa (usato per aumentare l'efficienza) + TString& operator <<(const TString& str); + + + // @cmember Controlla se due stringhe sono uguali + bool operator ==(const char* s) const + { return strcmp(_str, s) == 0; } + // @cmember Controlla se due stringhe sono uguali + bool operator ==(char* s) const + { return strcmp(_str, s) == 0; } + // @cmember Controlla se due stringe sono uguali + bool operator ==(const TString& s) const + { return strcmp(_str, s._str) == 0; } + // @cmember Controlla se due stringhe sono diverse + bool operator !=(const char* s) const + { return strcmp(_str, s) != 0; } + // @cmember Controlla se due stringhe sono diverse + bool operator !=(char* s) const + { return strcmp(_str, s) != 0; } + // @cmember Controlla se due stringhe sono diverse + bool operator !=(const TString& s) const + { return strcmp(_str, s._str) != 0; } + // @cmember Controlla se una stringa e' minore di un'altra + bool operator <(const char* s) const + { return strcmp(_str, s) < 0; } + // @cmember Controlla se una stringa e' maggiore di un'altra + bool operator >(const char* s) const + { return strcmp(_str, s) > 0; } + // @cmember Controlla se una stringa e' maggiore o uguale ad un'altra + bool operator >=(const char* s) const + { return strcmp(_str, s) >= 0; } + // @cmember Controlla se una stringa e' minore o uguale ad un'altra + bool operator <=(const char* s) const + { return strcmp(_str, s) <= 0; } + // @cmember Controlla se una stringa e' minore di un'altra + bool operator <(const TString & s) const + { return strcmp(_str, s._str) < 0; } + // @cmember Controlla se una stringa e' maggiore di un'altra + bool operator >(const TString & s) const + { return strcmp(_str, s._str) > 0; } + // @cmember Controlla se una stringa e' maggiore o uguale ad un'altra + bool operator >=(const TString & s) const + { return strcmp(_str, s._str) >= 0; } + // @cmember Controlla se una stringa e' minore o uguale ad un'altra + bool operator <=(const TString & s) const + { return strcmp(_str, s._str) <= 0; } + // @cmember Confronta usando le regular expression + bool match(const char* pat) const + { return ::match(pat, _str); } + // @cmember Compara due stringhe (o i primi max caratteri) + int compare(const char* s, int max = -1, bool ignorecase = FALSE) const; +}; + +// @doc EXTERNAL + +// @class TFixed_string | Classe per la definizione di stringhe di lunghezza +// fissa e non rilocabili dinamicamente +// +// @base public | TString +class TFixed_string : public TString +// @author:(INTERNAL) Guido +{ + + // @access Protected Member +protected: + // @cmember Causa un erroe fatale + virtual void resize(int size, bool cpy); + + // @access Public Member +public: + // @cmember Costruttore + TFixed_string(const char* str, int size = -1); + // @cmember Distruttore + virtual ~TFixed_string(); + +#ifndef __WATCOMC__ + virtual +#endif + // @cmember Manda un output formattato alla stringa oggetto + TString& format(const char* fmt, ...); + + // @cmember Assegna la stringa passata con indirizzo + const TString& operator =(const TString& s) + { return set((const char*)s); } + // @cmember Assegna la stringa passata + const TString& operator =(const char* str) + { return set(str); } + // @cmember Copia n caratteri nella stringa oggetto + void strncpy(const char* s, int n); +}; + +// @doc EXTERNAL + +// @class TString16 | Definisce le stringhe di 16 caratteri +// +// @base public | TFixed_string +class TString16 : public TFixed_string +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private member + + // @cmember:(INTERNAL) Stringa di 16 caratteri + char _str16[17]; + + // @access Public Member +public: + // @cmember Costruttore + TString16(const char* s = "") : TFixed_string(_str16, 17) + { set(s); } + // @cmember Costruttore + TString16(const TString& s) : TFixed_string(_str16, 17) + { set(s); } + // @cmember Assegna una stringa + const TString& operator =(const TString& s) + { return set((const char*)s); } + // @cmember Assegna una stringa + const TString& operator =(const char* s) + { return set(s); } + + // @comm Sono definite anche le classi e per le + // stringhe rispettivamente di 80 e 256 caratteri. I class member sono + // gli stessi, la differenza e' solo nel numero di caratteri della stringa. +}; + +// @doc EXTERNAL + +// @class TString80 | Definisce le stringhe di 80 caratteri +// +// @base public | TFixed_string +// +// @author:(INTERNAL) Guido +// +// @comm Questa classe e' identica alla per quanto riguarda i public member e quindi +// si rimanda a tale classe per ulteriori spiegazioni. +class TString80 : public TFixed_string +{ + char _str80[81]; + +public: + TString80(const char* s = "") : TFixed_string(_str80, 81) { set(s); } + TString80(const TString& s) : TFixed_string(_str80, 81) { set(s); } + const TString& operator =(const char* s) { return set(s); } + const TString& operator =(const TString& s) { return set((const char*)s); } +}; + +// @doc EXTERNAL + +// @class TString256 | Definisce le stringhe di 256 caratteri +// +// @base public | TFixed_string +// +// @author:(INTERNAL) Guido +// +// @comm Questa classe e' identica alla per quanto riguarda i public member e quindi +// si rimanda a tale classe per ulteriori spiegazioni. +class TString256 : public TFixed_string +{ + char _str256[257]; + +public: + TString256(const char* s = "") : TFixed_string(_str256, 257) { set(s); } + TString256(const TString& s) : TFixed_string(_str256, 257) { set(s); } + const TString& operator =(const char* s) { return set(s); } + const TString& operator =(const TString& s) { return set((const char*)s); } +}; + +// @doc EXTERNAL + +// @class TFilename | Classe per la gestione dei nome dei file +// +// @base public | TString80 +class TFilename : public TString80 +// @author:(INTERNAL) Guido + +{ + + // @comm Nel caso di utilizzo di Windows 95 occorre cambiare le classe base in + + // @access Public Member +public: + // @cmember Costruttore + TFilename(const char* n = "") : TString80(n) + {} + // @cmember Costruttore + TFilename(const TString& n) : TString80((const char*)n) + {} + // @cmember Costruttore + TFilename(const TFilename& n) : TString80((const char*)n) + {} + + // @cmember Assegnazione tra TFile e stringa + const TString& operator =(const char* s) + { return set(s); } + // @cmember Assegnazione tra TFile ed indirizzo della stringa + const TString& operator =(const TString& s) + { return set((const char*)s); } + + // @cmember Controlla il formato del nome del file + virtual bool ok() const; + + // @cmember Ritorna l'estensione del file + const char* ext() const; + // @cmember Imposta come estensione la stringa puntata da char* + void ext(const char*); + + // @cmember Concatena un nome di file ad una directory + TFilename& add(const char* n); + + // @cmember Ritorna il nome del file + const char* name() const; + // @cmember Ritorna il nome del direttorio + const char* path() const; + // @cmember Genera il nome di un file temporaneo + const TFilename& temp(const char* prefix = NULL); + // @cmember Genera il nome della directory temporanea + const TFilename& tempdir(); +}; + + +// @doc EXTERNAL + +// @class TToken_string | Contiene una stringa formata da piu' stringhe +// separate da un carattere (di solito il pipe) +// +// @base public | TString +class TToken_string : public TString +// @author:(INTERNAL) Guido +{ + + // @access:(INTERNAL) Private Member + + // @cmember:(INTERNAL) Carattere separatore + char _separator; + // @cmember:(INTERNAL) Puntatore all'ultimo + int _last; + + // @access Protected Member +protected: + // @cmember Crea un duplicato della token string + virtual TObject* dup() const; + // @cmember Inserisce l'n-esima stringa + bool set_item(const char* v, int n); + + // @access Public Member +public: + // @cmember Costruttore + TToken_string(const char* = "", char separator = '|'); + // @cmember Costruttore + TToken_string(int n, char separator = '|'); + // @cmember Costruttore + TToken_string(const TToken_string& s); + + // @cmember Setta il carattere separatore a s + void separator(char s); + + // @cmember Rimette all'inizio il puntatore + void restart() + { _last = empty() ? -1 : 0; } + // @cmember Assegna una stringa + const TString& operator =(const char* s) + { set(s);restart();return *this; } + // @cmember Assegna una stringa + const TString& operator =(const TString& s) + { set(s);restart();return *this; } + + // @cmember Aggiunge una stringa + void add(const char* s, int n = -1); + // @cmember Aggiunge un carattere + void add(char c, int pos = -1); + // @cmember Aggiunge un long + void add(long n, int pos = -1); + // @cmember Aggiunge un intero + void add(int n, int pos = -1); + // @cmember Toglie la stringa di posizione pos + void destroy(int pos); + // @cmember Ritorna il prossimo token + const char* get(); + // @cmember Ritorna un token + const char* get(int n); + // @cmember Ritorna un carattere (chiama ) + char get_char(int n = -1); + // @cmember Ritorna un intero (chiama ) + int get_int(int n = -1); + // @cmember Ritorna un intero esteso (chiama ) + long get_long(int n = -1); + // @cmember Ritorna la posizione dell'item s + int get_pos(const char* s); + // @cmember Ritorna la posizione dell'item s + int get_pos(long s); + // @cmember Ritorna il numero di token presenti + int items() const; + // @cmember Controlla se tutti i token sono nulli + bool empty_items() const; +}; + +/////////////////////////////////////////////////////////// +// DES Paragraph +/////////////////////////////////////////////////////////// + +// @doc EXTERNAL + +// @class TParagraph_string | Classe che serve per spezzare le stringhe in paragrafi +// lunghi al massimo la lunghezza fissata +// +// @base public | TToken_string +class TParagraph_string : public TToken_string +// @author:(INTERNAL) Guido +{ + // @access:(INTERNAL) Private Member + + // @cmember:(INTERNAL) Lunghezza massima del paragrafo + int _width; + + // @access Protected Member +protected: + // @cmember Spezza la stringa in paragrafi di lunghezza massima fissata + void tokenize(); + + // @access Public Member +public: + // @cmember Costruttore + TParagraph_string(const char* s, int width); + // @cmember Assegna una stringa + const TString& operator =(const char* s); + // @cmember Assegna un oggetto stringa + const TString& operator =(const TString & s) + { return operator=((const char *) s);} + // @cmember Permette di assegnare la lunghezza massima del paragrafo + void set_width(int width) + { _width = width; } +}; + +/////////////////////////////////////////////////////////// +// DES TString_array +/////////////////////////////////////////////////////////// + +// @doc EXTERNAL + +// @class TString_array | Array di stringhe +// +// @base public | TArray +class TString_array : public TArray +// @author:(INTERNAL) Guido +{ + + // @access Public Member +public: + // @cmember Ritorna la stringa n dell'array (se non c'e' ritorna errore) + TToken_string& row(int n) + { return (TToken_string&)operator[](n); } + // @cmember Ritorna la stringa n dell'array (se non c'e' ritorna errore) + const TToken_string& row(int n) const + { return (TToken_string&)operator[](n); } + // @cmember Restituisce il puntatore alla stringa n dell'array (NULL se non esiste) + TToken_string* rowptr(int n) + { return (TToken_string*)objptr(n); } + + // @cmember Aggiunge una Token string all'array (chiama ) + int add(TToken_string* s, int n = -1) + { return TArray::add(s, n); } + // @cmember Aggiunge un oggetto stringa all'array (chiama ) + int add(const TToken_string& s, int n = -1); + // @cmember Aggiunge una stringa all'array (chiama ) + int add(const char* s, int n = -1); + // @cmember Cerca una stringa nell'array + int find(const char* s, int from = 0) const; + // @cmember Ordina alfabeticamente l'array + void sort(bool ascendig = TRUE); + + // @cmember Costruttore + TString_array(int size = 8) : TArray(size) + {} + // @cmember Distruttore + virtual ~TString_array() + {} +}; + +#endif