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

@ -171,6 +171,8 @@ public:
{ return _str.add(s); }
// @cmember Inserisce un record in una posizione stabilita
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>
bool destroy(int rec = -1, bool update_sheet = TRUE);
// @cmember Ritorna l'array di tutte le stringhe delle righe
@ -688,34 +690,64 @@ int TSpreadsheet::insert(
return -1;
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;
int r = _str.insert(new TToken_string(80), rec);
int r = rec < 0 ? items() : rec;
const bool ok = notify(r, K_INS);
if (ok)
{
{
r = _str.insert(new TToken_string(80), rec);
_property.insert(NULL, r);
owner().post_insert(r);
xi_insert_row(_obj, INT_MAX);
// Notifica che l'inserimento h terminato
notify(r, K_CTRL + K_INS);
owner().post_insert(r);
xi_insert_row(_obj, INT_MAX);
xi_cell_request(_obj);
}
else
{
_str.destroy(r);
r = -1;
}
ininsert = FALSE;
return r;
}
// @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
//
// @rdesc Ritorna il risultato dell'operazione:
@ -1029,43 +1061,38 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
refused = TRUE;
break;
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);
}
if (oldrec != _cur_rec || !_row_dirty)
{
_row_dirty = FALSE;
notify_change();
_cell_dirty = FALSE;
}
const KEY k = edit(_cur_rec);
if (k == K_ENTER)
{
// update_rec(_cur_rec);
_row_dirty = TRUE;
} else
_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);
if (oldrec != _cur_rec || !_row_dirty)
{
_row_dirty = FALSE;
notify_change();
_cell_dirty = FALSE;
}
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);
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;
}
_check_enabled = TRUE;
}
break;
case XIE_ON_LIST:
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))
{
int rec = _cur_rec;
_row_dirty = FALSE;
destroy(rec);
if (rec < items())
str2mask(rec);
@ -1276,11 +1304,65 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
refused = TRUE;
}
break;
case K_CTRL + '+':
case K_CTRL + '+':
owner().mask().notify_focus_field(owner().dlg());
insert(-1);
refused = TRUE;
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:
xi_scroll(_obj, XI_SCROLL_PGUP);
break;
@ -1379,6 +1461,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
refused = TRUE;
}
break;
case K_CTRL + 'A':
case K_CTRL + 'B':
case K_CTRL + '-':
case K_CTRL + '+':
case K_CTRL+K_PREV:
@ -1995,6 +2079,12 @@ void TSheet_field::destroy(int r, bool 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)
{
_ctl_data._width = scanner.integer();
@ -2447,4 +2537,31 @@ void TSheet_field::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;
}

@ -97,6 +97,8 @@ public:
// @cmember Elimina una riga
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
void force_update(int r = -1);
@ -155,6 +157,9 @@ public:
// @cmember Funzione eseguita dopo ogni insert
virtual void post_insert(int) { }
// @cmember Esegue Tutti i check iniziali sulla riga <p n>
void check_row(int n);
// @cmember Costruttore
TSheet_field(TMask* m);
// @cmember Distruttore