Aggiunti tasti per aprire le maschere dello sheet

git-svn-id: svn://10.65.10.50/trunk@4053 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1997-01-10 16:02:13 +00:00
parent b7a5ad9f90
commit 18b4252763
2 changed files with 165 additions and 43 deletions

View File

@ -171,6 +171,8 @@ public:
{ return _str.add(s); } { return _str.add(s); }
// @cmember Inserisce un record in una posizione stabilita // @cmember Inserisce un record in una posizione stabilita
int insert(int rec); int insert(int rec);
// @cmember Inserisce un record (da prgramma) in una posizione stabilita
int _insert(int rec, bool update_sheet = TRUE);
// @cmember Elimina il record <p rec> // @cmember Elimina il record <p rec>
bool destroy(int rec = -1, bool update_sheet = TRUE); bool destroy(int rec = -1, bool update_sheet = TRUE);
// @cmember Ritorna l'array di tutte le stringhe delle righe // @cmember Ritorna l'array di tutte le stringhe delle righe
@ -688,34 +690,64 @@ int TSpreadsheet::insert(
return -1; return -1;
if (rec < 0 && items() > 0 && !owner().append() ) if (rec < 0 && items() > 0 && !owner().append() )
rec = _cur_rec + 1; {
XI_OBJ* itf = get_interface();
XI_OBJ* focus = xi_get_focus(itf);
if (focus && focus->type == XIT_CELL)
rec = _cur_rec + 1;
else
rec = 0;
}
ininsert = TRUE; ininsert = TRUE;
int r = _str.insert(new TToken_string(80), rec); int r = rec < 0 ? items() : rec;
const bool ok = notify(r, K_INS); const bool ok = notify(r, K_INS);
if (ok) if (ok)
{ {
r = _str.insert(new TToken_string(80), rec);
_property.insert(NULL, r); _property.insert(NULL, r);
owner().post_insert(r);
xi_insert_row(_obj, INT_MAX);
// Notifica che l'inserimento h terminato // Notifica che l'inserimento h terminato
notify(r, K_CTRL + K_INS); notify(r, K_CTRL + K_INS);
owner().post_insert(r);
xi_insert_row(_obj, INT_MAX);
xi_cell_request(_obj); xi_cell_request(_obj);
} }
else else
{
_str.destroy(r);
r = -1; r = -1;
}
ininsert = FALSE; ininsert = FALSE;
return r; return r;
} }
// @doc INTERNAL // @doc INTERNAL
// @mfunc Inserisce un record (da programma) in una posizione stabilita
//
// @rdesc Ritorna la posizione nella quale e' stato inserito il record. Se non riesce ad inserirlo
// ritorna -1.
int TSpreadsheet::_insert(
int rec, // @parm Numero del record da inserire nello spreadsheet
bool update_sheet) // @parm Aggiornamento visuale dell sheet
// @comm Non e' possibile inserire un nuovo record nel caso nello spreadsheet vi siano
// almeno 999 righe oppure se lo spreadsheet non e' attivo.
{
if (items() >= 999)
return -1;
int r = _str.insert(new TToken_string(80), rec);
_property.insert(NULL, r);
owner().post_insert(r);
xi_insert_row(_obj, INT_MAX);
if (update_sheet)
xi_cell_request(_obj);
return r;
}
// @doc INTERNAL
// @mfunc Elimina una riga // @mfunc Elimina una riga
// //
// @rdesc Ritorna il risultato dell'operazione: // @rdesc Ritorna il risultato dell'operazione:
@ -1029,43 +1061,38 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
refused = TRUE; refused = TRUE;
break; break;
case XIE_DBL_CELL: case XIE_DBL_CELL:
{
_check_enabled = FALSE;
const int oldrec = _cur_rec;
if ( xiev->v.xi_obj != NULL )
{ {
set_pos(xiev->v.xi_obj->v.cell.row, xiev->v.xi_obj->v.cell.column); _check_enabled = FALSE;
}
const int oldrec = _cur_rec;
if (oldrec != _cur_rec || !_row_dirty) if ( xiev->v.xi_obj != NULL )
{ set_pos(xiev->v.xi_obj->v.cell.row, xiev->v.xi_obj->v.cell.column);
_row_dirty = FALSE;
notify_change(); if (oldrec != _cur_rec || !_row_dirty)
_cell_dirty = FALSE; {
} _row_dirty = FALSE;
const KEY k = edit(_cur_rec); notify_change();
if (k == K_ENTER) _cell_dirty = FALSE;
{ }
// update_rec(_cur_rec); const KEY k = edit(_cur_rec);
_row_dirty = TRUE; if (k == K_ENTER)
} else _row_dirty = TRUE;
else
if (k == K_DEL) if (k == K_DEL)
{ {
_row_dirty = _cell_dirty = FALSE; _row_dirty = _cell_dirty = FALSE;
if (_cur_rec >= items()) if (_cur_rec >= items())
{ {
_row_dirty = _cell_dirty = FALSE; _row_dirty = _cell_dirty = FALSE;
_cur_rec = items()-1; _cur_rec = items()-1;
_cur_row = 0; _cur_col = 1; _cur_row = 0; _cur_col = 1;
} }
if (_cur_rec >= 0 && _cur_rec < items()) if (_cur_rec >= 0 && _cur_rec < items())
set_focus_cell(_cur_row, _cur_col); set_focus_cell(_cur_row, _cur_col);
} }
_check_enabled = TRUE;
_check_enabled = TRUE; }
}
break; break;
case XIE_ON_LIST: case XIE_ON_LIST:
owner().mask().notify_focus_field(owner().dlg()); owner().mask().notify_focus_field(owner().dlg());
@ -1264,6 +1291,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
if (owner().mask().id2pos(DLG_DELREC) && notify(_cur_rec, K_DEL)) if (owner().mask().id2pos(DLG_DELREC) && notify(_cur_rec, K_DEL))
{ {
int rec = _cur_rec; int rec = _cur_rec;
_row_dirty = FALSE;
destroy(rec); destroy(rec);
if (rec < items()) if (rec < items())
str2mask(rec); str2mask(rec);
@ -1276,11 +1304,65 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
refused = TRUE; refused = TRUE;
} }
break; break;
case K_CTRL + '+': case K_CTRL + '+':
owner().mask().notify_focus_field(owner().dlg()); owner().mask().notify_focus_field(owner().dlg());
insert(-1); insert(-1);
refused = TRUE; refused = TRUE;
break; break;
case K_CTRL + 'A':
{
_check_enabled = FALSE;
if (_cell_dirty)
off_cell_handler();
const KEY k = edit(_cur_rec);
if (k == K_ENTER)
_row_dirty = TRUE;
else
if (k == K_DEL)
{
_row_dirty = _cell_dirty = FALSE;
if (_cur_rec >= items())
{
_row_dirty = _cell_dirty = FALSE;
_cur_rec = items()-1;
_cur_row = 0; _cur_col = 1;
}
if (_cur_rec >= 0 && _cur_rec < items())
set_focus_cell(_cur_row, _cur_col);
}
_check_enabled = TRUE;
refused = TRUE;
}
break;
case K_CTRL + 'B':
{
_check_enabled = FALSE;
if (_cell_dirty)
off_cell_handler();
const int button_pos = sheet_mask().id2pos(FIRST_FIELD-1);
if (button_pos >= 0)
{
TMask & sm = owner().sheet_mask();
TMask_field& button = sm.fld(button_pos);
if (button.active())
{
str2mask(_cur_rec);
button.on_hit();
if (sm.dirty())
{
notify_change();
mask2str(_cur_rec);
}
}
}
_check_enabled = TRUE;
owner().highlight();
refused = TRUE;
}
break;
case K_CTRL+K_PREV: case K_CTRL+K_PREV:
xi_scroll(_obj, XI_SCROLL_PGUP); xi_scroll(_obj, XI_SCROLL_PGUP);
break; break;
@ -1379,6 +1461,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
refused = TRUE; refused = TRUE;
} }
break; break;
case K_CTRL + 'A':
case K_CTRL + 'B':
case K_CTRL + '-': case K_CTRL + '-':
case K_CTRL + '+': case K_CTRL + '+':
case K_CTRL+K_PREV: case K_CTRL+K_PREV:
@ -1995,6 +2079,12 @@ void TSheet_field::destroy(int r, bool update_sheet)
((TSpreadsheet*)_ctl)->destroy(r, update_sheet); ((TSpreadsheet*)_ctl)->destroy(r, update_sheet);
} }
// Certified 100%
int TSheet_field::insert(int r, bool update_sheet)
{
return ((TSpreadsheet*)_ctl)->_insert(r, update_sheet);
}
void TSheet_field::parse_head(TScanner& scanner) void TSheet_field::parse_head(TScanner& scanner)
{ {
_ctl_data._width = scanner.integer(); _ctl_data._width = scanner.integer();
@ -2447,4 +2537,31 @@ void TSheet_field::save_columns_order()
s.save_columns_order(); s.save_columns_order();
} }
void TSheet_field::check_row(int n)
{
TSpreadsheet* s = (TSpreadsheet*)_ctl;
const int current = s->_cur_rec;
s->_cur_rec = n;
TMask& m = sheet_mask();
CHECK(!m.is_running(), "Can't use check_row while sheet mask is running");
TToken_string & r = row(n);
const int max = m.fields();
TMaskmode mask_mode = (TMaskmode) m.mode();
m.set_mode(MODE_INS);
for (int i = max - 1; i >= 0; i--)
{
TMask_field & f = m.fld(i);
if (f.has_check())
f.set_dirty();
}
row2mask(n, r);
mask2row(n, r);
m.set_mode(mask_mode);
s->_cur_rec = current;
}

View File

@ -97,6 +97,8 @@ public:
// @cmember Elimina una riga // @cmember Elimina una riga
void destroy(int r = -1, bool update_sheet = TRUE); void destroy(int r = -1, bool update_sheet = TRUE);
// @cmember Inserisce una riga
int insert(int r = -1, bool update_sheet = TRUE);
// @cmember Forza l'aggiornamento dei dati della riga sullo schermo // @cmember Forza l'aggiornamento dei dati della riga sullo schermo
void force_update(int r = -1); void force_update(int r = -1);
@ -155,6 +157,9 @@ public:
// @cmember Funzione eseguita dopo ogni insert // @cmember Funzione eseguita dopo ogni insert
virtual void post_insert(int) { } virtual void post_insert(int) { }
// @cmember Esegue Tutti i check iniziali sulla riga <p n>
void check_row(int n);
// @cmember Costruttore // @cmember Costruttore
TSheet_field(TMask* m); TSheet_field(TMask* m);
// @cmember Distruttore // @cmember Distruttore