Patch level : 12.0 no-patch
Files correlati : Aggiunta gestione righe originali prima della modifica. Funzioni // @cmember Ritorna una riga originale dello spreadsheet TToken_string& original_row(int n); // @cmember Ritorna un array con tutte le righe originali dello spreadsheet TString_array& original_rows_array() const; // @cmember Salva l'array di tutte le righe nell'array delle righe originali dello spreadsheet void update_original_rows(int row = -1) const; // @cmember Salva l'array delle righe originali dello spreadsheet void zero_original_rows() const; // @cmember Chiama la notify dello Spreadsheet sulla riga r del tasto k void notify(int r, KEY k); Aggiunte funzione di gestione dei campi delle righe di un sheet Funzioni virtual int set_row_cell_currency(TToken_string& row, short id, const real& n); virtual int set_row_cell_currency(short id, const real& n, int nrow = -1); virtual const char * get_str_row_cell(TToken_string & row, short id); virtual char get_char_row_cell(TToken_string & row, short id); virtual long get_long_row_cell(TToken_string & row, short id); virtual int get_int_row_cell(TToken_string & row, short id); virtual real get_real_row_cell(TToken_string & row, short id); virtual TDate get_date_row_cell(TToken_string & row, short id); virtual bool get_bool_row_cell(TToken_string & row, short id);
This commit is contained in:
parent
5ed7790ea1
commit
f5fe0b26d0
@ -190,8 +190,10 @@ class TSpreadsheet : public TControl
|
||||
enum { MAX_COL=96 };
|
||||
static int ROW_NUMBER_WIDTH;
|
||||
|
||||
// @cmember:(INTERNAL) Array di TToken_strings contenenti le righe
|
||||
TString_array _str;
|
||||
// @cmember:(INTERNAL) Array di TToken_strings contenenti le righe
|
||||
TString_array _str;
|
||||
// @cmember:(INTERNAL) Array di TToken_strings contenenti le righe originali
|
||||
TString_array _original_str;
|
||||
// @cmember:(INTERNAL) Array di TToken_strings contenenti le righe copiate
|
||||
TString_array _copied_rows;
|
||||
// @cmember:(INTERNAL) Array delle colonne disattivate (solo visualizzazione)
|
||||
@ -328,19 +330,27 @@ public:
|
||||
// @cmember Ritorna l' abilitazione della colonna <p col>
|
||||
bool column_enabled(int col) const { return !column_disabled(col); }
|
||||
|
||||
// @cmember Ritorna il contenuto della riga <p n>-esima
|
||||
TToken_string& row(int n) { return _str.row(n); }
|
||||
// @cmember Ritorna il contenuto della riga <p n>-esima
|
||||
TToken_string& row(int n) { return _str.row(n); }
|
||||
// @cmember Ritorna il contenuto della riga original <p n>-esima
|
||||
TToken_string& original_row(int n) { return _original_str.row(n); }
|
||||
// @cmember Aggiunge una riga allo spreadsheet passata come puntatore
|
||||
int add(const TToken_string& s) { return _str.add(s); }
|
||||
// @cmember Aggiunge una riga allo spreadsheet (vedi <mf TArray::add>)
|
||||
int add(TToken_string* s) { return _str.add(s); }
|
||||
int add(TToken_string* s) { _original_str.add(""); return _str.add(s); }
|
||||
// @cmember Inserisce un record in una posizione stabilita
|
||||
int insert(int rec, bool update_sheet, bool call_notify);
|
||||
// @cmember Elimina il record <p rec>
|
||||
bool destroy(int rec = -1, bool update_sheet = true);
|
||||
// @cmember Ritorna l'array di tutte le stringhe delle righe
|
||||
TString_array& rows_array() { return _str; }
|
||||
|
||||
// @cmember Ritorna l'array di tutte le stringhe delle righe
|
||||
TString_array& rows_array() { return _str; }
|
||||
// @cmember Ritorna l'array di tutte le stringhe delle righe originali
|
||||
TString_array& original_rows_array() { return _original_str; }
|
||||
// @cmember Salva l'array di tutte le stringhe nell'array delle righe originali
|
||||
void update_original_rows(int r = -1);
|
||||
// @cmember Azzera l'array delle righe originali
|
||||
void zero_original_rows() { original_rows_array().destroy(); }
|
||||
|
||||
// @cmember Trova una colonna abilitata a partire da colonna
|
||||
int find_enabled_column(int rec, int colonna, int direction) const;
|
||||
// @cmember Trova un record abilitato a partire da rec
|
||||
@ -842,6 +852,19 @@ void TSpreadsheet::update_rec(int rec)
|
||||
_needs_update = -1;
|
||||
}
|
||||
|
||||
void TSpreadsheet::update_original_rows(int r)
|
||||
{
|
||||
if (r < 0)
|
||||
_original_str = _str;
|
||||
else
|
||||
{
|
||||
TToken_string & original_row = _original_str.row(r);
|
||||
TToken_string & row = _str.row(r);
|
||||
|
||||
original_row = row;
|
||||
}
|
||||
}
|
||||
|
||||
// Cerca una colonna abilitata a partire da colonna
|
||||
// La prima cella utilizzabile ha indice 1
|
||||
// rec e' un numero di record assoluto
|
||||
@ -954,8 +977,10 @@ int TSpreadsheet::insert(
|
||||
if (ok)
|
||||
{
|
||||
TToken_string* toktok = new TToken_string(80, owner().separator());
|
||||
r = _str.insert(toktok, rec);
|
||||
|
||||
TToken_string* original_toktok = new TToken_string(80, owner().separator());
|
||||
|
||||
r = _str.insert(toktok, rec);
|
||||
_original_str.insert(original_toktok, rec);
|
||||
_properties.insert(NULL, r, true); // Crea lo spazio necessario per le proprieta'
|
||||
|
||||
// Notifica che l'inserimento e' terminato
|
||||
@ -1004,14 +1029,16 @@ bool TSpreadsheet::destroy(
|
||||
|
||||
if (rec < 0)
|
||||
{
|
||||
_str.destroy();
|
||||
_str.destroy();
|
||||
_original_str.destroy();
|
||||
_properties.destroy();
|
||||
set_dirty(_row_dirty = false);
|
||||
}
|
||||
else
|
||||
{
|
||||
_properties.destroy(rec, true); // Destroy line info
|
||||
ok = _str.destroy(rec, true); // Destroy line
|
||||
_original_str.destroy(rec, true); // Destroy line
|
||||
ok = _str.destroy(rec, true); // Destroy line
|
||||
}
|
||||
|
||||
if (ok && mask().is_running() && update_sheet)
|
||||
@ -2614,11 +2641,17 @@ void TSpreadsheet::str2mask(int riga)
|
||||
bool TSpreadsheet::notify(int rec, KEY k)
|
||||
{
|
||||
const bool ok = _notify ? _notify(owner(), rec, k) : true;
|
||||
if (k == K_ENTER)
|
||||
|
||||
if (k == K_SPACE && ok)
|
||||
update_original_rows(rec);
|
||||
if (k == K_ENTER)
|
||||
{
|
||||
const bool cell_dirty = _cell_dirty; // preservato lo stato di cell_dirty
|
||||
|
||||
set_dirty(ok ? 1 : 3);
|
||||
_cell_dirty = cell_dirty;
|
||||
if (ok)
|
||||
update_original_rows(rec);
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
@ -3055,7 +3088,26 @@ void TSheet_field::create(WINDOW parent)
|
||||
// Certified 100%
|
||||
TString_array& TSheet_field::rows_array() const
|
||||
{
|
||||
return ((TSpreadsheet*)_ctl)->rows_array();
|
||||
return ((TSpreadsheet*)_ctl)->rows_array();
|
||||
}
|
||||
|
||||
|
||||
// Certified 100%
|
||||
TString_array& TSheet_field::original_rows_array() const
|
||||
{
|
||||
return ((TSpreadsheet*)_ctl)->original_rows_array();
|
||||
}
|
||||
|
||||
// Certified 100%
|
||||
void TSheet_field::update_original_rows(int row) const
|
||||
{
|
||||
((TSpreadsheet*)_ctl)->update_original_rows(row);
|
||||
}
|
||||
|
||||
// Certified 100%
|
||||
void TSheet_field::zero_original_rows() const
|
||||
{
|
||||
((TSpreadsheet*)_ctl)->zero_original_rows();
|
||||
}
|
||||
|
||||
const char* TSheet_field::cell(int r, int c) const
|
||||
@ -3069,6 +3121,35 @@ const char* TSheet_field::cell(int r, int c) const
|
||||
return v ? v : " ";
|
||||
}
|
||||
|
||||
int TSheet_field::set_row_cell_currency(TToken_string& row, short id, const real& n)
|
||||
{
|
||||
const TMask& m = sheet_mask();
|
||||
const TCurrency_field& cf = (const TCurrency_field&)m.field(id);
|
||||
TOperable_field* vf = cf.driver(0);
|
||||
|
||||
if (vf != nullptr && !vf->empty()) // E' un importo in valuta?
|
||||
{
|
||||
const TString& codval = vf->get();
|
||||
|
||||
if (is_true_value(codval)) // La valuta e' diversa dall'euro?
|
||||
{
|
||||
if (n.is_zero())
|
||||
set_row_cell(row, id, "");
|
||||
else
|
||||
{
|
||||
const TCurrency cur(n, codval);
|
||||
set_row_cell(row, id, cur.get_num().string());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (n.is_zero())
|
||||
set_row_cell(row, id, "");
|
||||
else
|
||||
set_row_cell(row, id, n.string(-1, 2));
|
||||
return false;
|
||||
}
|
||||
|
||||
int TSheet_field::set_row_cell(short id, const char * value, int nrow)
|
||||
{
|
||||
if (nrow < 0)
|
||||
@ -3146,6 +3227,17 @@ int TSheet_field::set_row_cell(short id, const bool value, int nrow)
|
||||
return nrow;
|
||||
}
|
||||
|
||||
int TSheet_field::set_row_cell_currency(short id, const real& value, int nrow)
|
||||
{
|
||||
if (nrow < 0)
|
||||
nrow = first_empty();
|
||||
set_row_cell_currency(row(nrow), id, value);
|
||||
#ifdef DBG
|
||||
const TToken_string & r = row(nrow);
|
||||
#endif
|
||||
return nrow;
|
||||
}
|
||||
|
||||
// Certified 100%
|
||||
// Ritorna l'indice della prima riga vuota dello sheet
|
||||
int TSheet_field::first_empty() const
|
||||
@ -3159,28 +3251,45 @@ int TSheet_field::first_empty() const
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @mfunc Ritorna nuova riga dello spreadshhet
|
||||
//
|
||||
// @rdesc Ritorna la stringa letta
|
||||
TToken_string& TSheet_field::row(
|
||||
int n) // @parm Numero della riga da leggere/creare
|
||||
int n) // @parm Numero della riga da leggere/creare
|
||||
|
||||
// @comm Se il parametro <p n> e maggiore del numero massimo di righe presenti
|
||||
// o minore di 0 viene aggiunta una riga vuota in fondo allo spreadsheet
|
||||
// (viene chiamata la <mf TSpreadsheet::add>)
|
||||
{
|
||||
TSpreadsheet* s = (TSpreadsheet*)_ctl;
|
||||
const int max = (int)s->items();
|
||||
if (n < 0 || n >= max)
|
||||
{
|
||||
if (n < 0) n = first_empty();
|
||||
if (n >= max)
|
||||
n = (int)s->add(new TToken_string(80, _separator));
|
||||
}
|
||||
return s->row(n);
|
||||
// @comm Se il parametro <p n> e maggiore del numero massimo di righe presenti
|
||||
// o minore di 0 viene aggiunta una riga vuota in fondo allo spreadsheet
|
||||
// (viene chiamata la <mf TSpreadsheet::add>)
|
||||
{
|
||||
TSpreadsheet* s = (TSpreadsheet*)_ctl;
|
||||
const int max = (int)s->items();
|
||||
if (n < 0 || n >= max)
|
||||
{
|
||||
if (n < 0) n = first_empty();
|
||||
if (n >= max)
|
||||
n = (int)s->add(new TToken_string(80, _separator));
|
||||
}
|
||||
return s->row(n);
|
||||
}
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @mfunc Ritorna nuova riga dello spreadshhet
|
||||
//
|
||||
// @rdesc Ritorna la stringa letta
|
||||
TToken_string& TSheet_field::original_row(
|
||||
int n) // @parm Numero della riga da leggere/creare
|
||||
|
||||
// @comm Se il parametro <p n> e maggiore del numero massimo di righe presenti
|
||||
// o minore di 0 viene aggiunta una riga vuota in fondo allo spreadsheet
|
||||
// (viene chiamata la <mf TSpreadsheet::add>)
|
||||
{
|
||||
TSpreadsheet* s = (TSpreadsheet*)_ctl;
|
||||
const int max = (int)s->items();
|
||||
|
||||
return (n < 0 || n >= max) ? (TToken_string&) empty_string() : s->original_row(n);
|
||||
}
|
||||
|
||||
// @doc EXTERNAL
|
||||
@ -3217,7 +3326,14 @@ void TSheet_field::set_notify(SPREADSHEET_NOTIFY n)
|
||||
s->set_notify(n);
|
||||
}
|
||||
|
||||
// Certified 50%
|
||||
|
||||
void TSheet_field::notify(int r, KEY k)
|
||||
{
|
||||
TSpreadsheet* s = (TSpreadsheet*)_ctl;
|
||||
|
||||
s->notify(r, k);
|
||||
}
|
||||
|
||||
void TSheet_field::highlight() const
|
||||
{
|
||||
// TEditable_field::highlight();
|
||||
|
@ -146,8 +146,16 @@ public:
|
||||
|
||||
// @cmember Ritorna una riga dello spreadsheet
|
||||
TToken_string& row(int n);
|
||||
// @cmember Ritorna una riga originale dello spreadsheet
|
||||
TToken_string& original_row(int n);
|
||||
// @cmember Ritorna un array con tutte le righe dello spreadsheet
|
||||
TString_array& rows_array() const;
|
||||
// @cmember Ritorna un array con tutte le righe originali dello spreadsheet
|
||||
TString_array& original_rows_array() const;
|
||||
// @cmember Salva l'array di tutte le righe nell'array delle righe originali dello spreadsheet
|
||||
void update_original_rows(int row = -1) const;
|
||||
// @cmember Salva l'array delle righe originali dello spreadsheet
|
||||
void zero_original_rows() const;
|
||||
// @cmember Ritorna l'elemento <p c>-esimo della riga <p r>
|
||||
const char* cell(int r, int c) const;
|
||||
|
||||
@ -158,6 +166,7 @@ public:
|
||||
virtual void set_row_cell(TToken_string & row, short id, const real& value) { row.add(value, cid2index(id)); }
|
||||
virtual void set_row_cell(TToken_string & row, short id, const TDate& value) { row.add(value, cid2index(id)); }
|
||||
virtual void set_row_cell(TToken_string & row, short id, const bool value) { row.add(value ? "X" : "", cid2index(id)); }
|
||||
virtual int set_row_cell_currency(TToken_string& row, short id, const real& n);
|
||||
|
||||
virtual int set_row_cell(short id, const char * value, int nrow = -1);
|
||||
virtual int set_row_cell(short id, char value, int nrow = -1);
|
||||
@ -166,6 +175,15 @@ public:
|
||||
virtual int set_row_cell(short id, const real& value, int nrow = -1);
|
||||
virtual int set_row_cell(short id, const TDate& value, int nrow = -1);
|
||||
virtual int set_row_cell(short id, const bool value, int nrow = -1);
|
||||
virtual int set_row_cell_currency(short id, const real& n, int nrow = -1);
|
||||
|
||||
virtual const char * get_str_row_cell(TToken_string & row, short id) { return row.get(cid2index(id)); }
|
||||
virtual char get_char_row_cell(TToken_string & row, short id) { return row.get_char(cid2index(id)); }
|
||||
virtual long get_long_row_cell(TToken_string & row, short id) { return row.get_long(cid2index(id)); }
|
||||
virtual int get_int_row_cell(TToken_string & row, short id) { return row.get_int(cid2index(id)); }
|
||||
virtual real get_real_row_cell(TToken_string & row, short id) { return real(row.get(cid2index(id))); }
|
||||
virtual TDate get_date_row_cell(TToken_string & row, short id) { return TDate(row.get(cid2index(id))); }
|
||||
virtual bool get_bool_row_cell(TToken_string & row, short id) { const TString s = get_str_row_cell(row, id); return s == "X"; }
|
||||
|
||||
virtual const char * get_str_row_cell(int nrow, short id) { return row(nrow).get(cid2index(id)); }
|
||||
virtual char get_char_row_cell(int nrow, short id) { return row(nrow).get_char(cid2index(id)); }
|
||||
@ -216,6 +234,8 @@ public:
|
||||
virtual KEY run_editmask(int n);
|
||||
// @cmember Setta il membro <p _notify> della classe <c TSpreadsheet>
|
||||
void set_notify(SPREADSHEET_NOTIFY n);
|
||||
// @cmember Chiama la notify dello Spreadsheet sulla riga r del tasto k
|
||||
void notify(int r, KEY k);
|
||||
|
||||
// @cmember Trasforma l'identificatore di un campo <p cid> in un numero di colonna logica
|
||||
int cid2index(short cid) const;
|
||||
|
Loading…
x
Reference in New Issue
Block a user