Corretta gestione annullamento di una riga degli sheet
git-svn-id: svn://10.65.10.50/trunk@960 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
a33eb771fb
commit
b4703266c9
@ -128,8 +128,8 @@ void TBanner::handler(WINDOW win, EVENT* ep)
|
|||||||
x = (r.right-r.left-w)>>1, y = r.bottom - CHARY;
|
x = (r.right-r.left-w)>>1, y = r.bottom - CHARY;
|
||||||
win_draw_text(win, x, y, t, -1);
|
win_draw_text(win, x, y, t, -1);
|
||||||
|
|
||||||
r.left += 4; r.right -= 4;
|
r.left += 5; r.right -= 4;
|
||||||
r.top += 4; r.bottom -= 4;
|
r.top += 5; r.bottom -= 4;
|
||||||
set_pen(COLOR_WHITE); win_draw_rect(win, &r);
|
set_pen(COLOR_WHITE); win_draw_rect(win, &r);
|
||||||
offset_rect(&r, -1, -1);
|
offset_rect(&r, -1, -1);
|
||||||
set_pen(COLOR_BLACK); win_draw_rect(win, &r);
|
set_pen(COLOR_BLACK); win_draw_rect(win, &r);
|
||||||
|
@ -43,7 +43,8 @@ class TSpreadsheet : public TWindow
|
|||||||
TMask_field* _edit_field; // Current edit field
|
TMask_field* _edit_field; // Current edit field
|
||||||
int _cur_row, _cur_rec, _cur_col; // Current cell
|
int _cur_row, _cur_rec, _cur_col; // Current cell
|
||||||
bool _row_dirty; // Current row changed
|
bool _row_dirty; // Current row changed
|
||||||
bool _check_enabled; // Perform OFF_ROW checks
|
bool _check_enabled; // Perform OFF_ROW and OFF_CELL checks
|
||||||
|
bool _update; // It's safe to update the display
|
||||||
|
|
||||||
TString16 _button;
|
TString16 _button;
|
||||||
|
|
||||||
@ -59,8 +60,8 @@ protected:
|
|||||||
TMask_field* field(short id) const;
|
TMask_field* field(short id) const;
|
||||||
|
|
||||||
int rec2row(int rec);
|
int rec2row(int rec);
|
||||||
int row2rec(int row);
|
int row2rec(int& row);
|
||||||
int set_pos(int row, int col) { _cur_col = col; return _cur_rec = row2rec(_cur_row = row); }
|
int set_pos(int row, int col) { _cur_col = col; _cur_row = row; return _cur_rec = row2rec(_cur_row); }
|
||||||
|
|
||||||
bool notify(int row, KEY k);
|
bool notify(int row, KEY k);
|
||||||
void notify_change();
|
void notify_change();
|
||||||
@ -127,7 +128,7 @@ TSpreadsheet::TSpreadsheet(short x, short y, short dx, short dy,
|
|||||||
TSheet_field* o)
|
TSheet_field* o)
|
||||||
: _mask(maskname, maskno), _notify(NULL), _edit_field(NULL),
|
: _mask(maskname, maskno), _notify(NULL), _edit_field(NULL),
|
||||||
_owner(o), _cur_row(0), _cur_col(0), _active(TRUE),
|
_owner(o), _cur_row(0), _cur_col(0), _active(TRUE),
|
||||||
_row_dirty(FALSE), _check_enabled(TRUE), _firstfocus(TRUE)
|
_row_dirty(FALSE), _check_enabled(TRUE), _firstfocus(TRUE), _update(TRUE)
|
||||||
{
|
{
|
||||||
const int NUMBER_WIDTH = 3;
|
const int NUMBER_WIDTH = 3;
|
||||||
const int MAX_COL = 32;
|
const int MAX_COL = 32;
|
||||||
@ -291,22 +292,30 @@ TSpreadsheet::~TSpreadsheet()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Converts a row number in the correspondig record number
|
// Converts a row number in the correspondig record number
|
||||||
int TSpreadsheet::row2rec(int row)
|
int TSpreadsheet::row2rec(int& row)
|
||||||
{
|
{
|
||||||
int rows;
|
int rows;
|
||||||
const long* rec = xi_get_list_info(_list, &rows);
|
const long* rec = xi_get_list_info(_list, &rows);
|
||||||
|
|
||||||
if (row < 0 || row >= rows)
|
int r = -1;
|
||||||
|
if (row < 0)
|
||||||
{
|
{
|
||||||
#ifdef DBG
|
row = 0;
|
||||||
error_box("Line %d is not visible: the last one is %d", row, rows);
|
r = (int)rec[row]-1;
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if (row >= rows)
|
||||||
|
{
|
||||||
|
row = rows-1;
|
||||||
|
r = (int)rec[row]+1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
r = (int)rec[row];
|
||||||
|
|
||||||
return (int)rec[row];
|
CHECKD(r >= 0 && r <= items(), "Sheet line out of range: ", row);
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -375,7 +384,7 @@ void TSpreadsheet::set_focus_cell(int riga, int colonna)
|
|||||||
if (colonna < _columns)
|
if (colonna < _columns)
|
||||||
{
|
{
|
||||||
XI_OBJ cell;
|
XI_OBJ cell;
|
||||||
XI_MAKE_CELL(&cell, _list, r, colonna);
|
XI_MAKE_CELL(&cell, _list, riga, colonna);
|
||||||
xi_set_focus(&cell);
|
xi_set_focus(&cell);
|
||||||
|
|
||||||
if (_edit_field == NULL)
|
if (_edit_field == NULL)
|
||||||
@ -432,6 +441,8 @@ bool TSpreadsheet::destroy(int rec)
|
|||||||
|
|
||||||
|
|
||||||
void TSpreadsheet::update(int row)
|
void TSpreadsheet::update(int row)
|
||||||
|
{
|
||||||
|
if (_update)
|
||||||
{
|
{
|
||||||
if (row < 0)
|
if (row < 0)
|
||||||
{
|
{
|
||||||
@ -441,6 +452,7 @@ void TSpreadsheet::update(int row)
|
|||||||
else
|
else
|
||||||
update_rec(row);
|
update_rec(row);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void TSpreadsheet::notify_change()
|
void TSpreadsheet::notify_change()
|
||||||
@ -538,7 +550,7 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
}
|
}
|
||||||
if (field(cid)->has_query())
|
if (field(cid)->has_query())
|
||||||
{
|
{
|
||||||
xiev->v.cell_request.button =
|
xiev->v.cell_request.button = TRUE;
|
||||||
xiev->v.cell_request.button_on_focus = TRUE;
|
xiev->v.cell_request.button_on_focus = TRUE;
|
||||||
}
|
}
|
||||||
if (cell_disabled(rec, col))
|
if (cell_disabled(rec, col))
|
||||||
@ -547,10 +559,12 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
}
|
}
|
||||||
} else src = format("%d", rec+1);
|
} else src = format("%d", rec+1);
|
||||||
|
|
||||||
const int len = xiev->v.cell_request.len;
|
|
||||||
char* dst = xiev->v.cell_request.s;
|
char* dst = xiev->v.cell_request.s;
|
||||||
if (src)
|
if (src && *src)
|
||||||
|
{
|
||||||
|
const int len = xiev->v.cell_request.len;
|
||||||
strncpy(dst, src, len);
|
strncpy(dst, src, len);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
*dst = '\0';
|
*dst = '\0';
|
||||||
}
|
}
|
||||||
@ -610,7 +624,9 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
{
|
{
|
||||||
update_rec(_cur_rec);
|
update_rec(_cur_rec);
|
||||||
_row_dirty = TRUE;
|
_row_dirty = TRUE;
|
||||||
}
|
} else
|
||||||
|
if (k == K_DEL)
|
||||||
|
_row_dirty = _cell_dirty = FALSE;
|
||||||
|
|
||||||
if (!cell_disabled(_cur_rec, _cur_col-1))
|
if (!cell_disabled(_cur_rec, _cur_col-1))
|
||||||
set_focus_cell(_cur_row, _cur_col);
|
set_focus_cell(_cur_row, _cur_col);
|
||||||
@ -652,8 +668,10 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
bool ok = sheet_mask().check_fields();
|
bool ok = sheet_mask().check_fields();
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
|
_update = FALSE;
|
||||||
mask2str(_cur_rec);
|
mask2str(_cur_rec);
|
||||||
ok = notify(_cur_rec, K_ENTER); // Notify edit
|
ok = notify(_cur_rec, K_ENTER); // Notify edit
|
||||||
|
_update = TRUE;
|
||||||
}
|
}
|
||||||
if (!ok)
|
if (!ok)
|
||||||
xiev->refused = TRUE;
|
xiev->refused = TRUE;
|
||||||
@ -965,17 +983,18 @@ TMask& TSpreadsheet::mask() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Ritorna il campo con l'identificatore dato della maschera dello sheet
|
||||||
TMask_field* TSpreadsheet::field(short id) const
|
TMask_field* TSpreadsheet::field(short id) const
|
||||||
{
|
{
|
||||||
const int pos = _mask.id2pos(id);
|
const int pos = _mask.id2pos(id);
|
||||||
if (pos < 0) return NULL;
|
return pos < 0 ? NULL : &_mask.fld(pos);
|
||||||
return &_mask.fld(pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TSpreadsheet::mask2str(int riga)
|
// Ricopia i campi della maschera nel record dato ed aggiorna il display
|
||||||
|
void TSpreadsheet::mask2str(int rec)
|
||||||
{
|
{
|
||||||
TToken_string& r = row(riga);
|
TToken_string& r = row(rec);
|
||||||
r.cut(0);
|
r.cut(0);
|
||||||
for (short id = FIRST_FIELD; ; id++)
|
for (short id = FIRST_FIELD; ; id++)
|
||||||
{
|
{
|
||||||
@ -1000,7 +1019,7 @@ void TSpreadsheet::mask2str(int riga)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#if XVT_OS == XVT_OS_WIN
|
||||||
update_rec(riga);
|
update(rec);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1235,7 +1254,7 @@ void TSheet_field::create(WINDOW parent)
|
|||||||
|
|
||||||
|
|
||||||
// Certified 100%
|
// Certified 100%
|
||||||
TArray& TSheet_field::rows_array() const
|
TString_array& TSheet_field::rows_array() const
|
||||||
{
|
{
|
||||||
return _sheet->rows_array();
|
return _sheet->rows_array();
|
||||||
}
|
}
|
||||||
@ -1268,6 +1287,7 @@ TToken_string& TSheet_field::row(int n)
|
|||||||
void TSheet_field::force_update(int r)
|
void TSheet_field::force_update(int r)
|
||||||
{
|
{
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#if XVT_OS == XVT_OS_WIN
|
||||||
|
if (_sheet->_check_enabled)
|
||||||
_sheet->update(r);
|
_sheet->update(r);
|
||||||
#else
|
#else
|
||||||
_sheet->open();
|
_sheet->open();
|
||||||
|
@ -30,7 +30,7 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
TToken_string& row(int n); // Get/Create a new row
|
TToken_string& row(int n); // Get/Create a new row
|
||||||
TArray& rows_array() const; // Get all rows
|
TString_array& rows_array() const; // Get all rows
|
||||||
int first_empty() const; // First empty row
|
int first_empty() const; // First empty row
|
||||||
int items() const; // Number of rows
|
int items() const; // Number of rows
|
||||||
int selected() const; // Number of current row
|
int selected() const; // Number of current row
|
||||||
|
Loading…
x
Reference in New Issue
Block a user