#include bool TAutomask::error_box(const char* fmt, ...) { TString message(1024); char* msg = message.get_buffer(); va_list argptr; va_start(argptr, fmt); int len = vsprintf(msg, fmt, argptr); CHECKD(len <= message.size(), "Error message too long: ", len); va_end(argptr); if (is_sheetmask() && !is_running()) { xvt_statbar_set(msg); beep(); } else { post_error_message(msg, 3); } return FALSE; } bool TAutomask::universal_handler(TMask_field& f, KEY key) { TAutomask& wm = (TAutomask&)f.mask(); TOperable_field& of = (TOperable_field&)f; TField_event fe = fe_null; long jolly = key; switch (key) { case K_TAB: if (wm.is_running() || wm.get_sheet() != NULL) { if (f.focusdirty() && f.is_edit()) fe = fe_modify; } else fe = fe_init; break; case K_SPACE: if (!f.is_edit()) { if (wm.is_running()) { if (f.is_kind_of(CLASS_BUTTON_FIELD)) fe = fe_button; else fe = fe_modify; } else fe = fe_init; } break; case K_ENTER: fe = fe_close; break; case K_F9: if (f.is_edit()) fe = fe_button; break; default: fe = fe_null; break; } return fe == fe_null ? TRUE : wm.on_field_event(of, fe, jolly); } bool TAutomask::universal_notifier(TSheet_field& s, int row, KEY key) { TAutomask& wm = (TAutomask&)s.mask(); TField_event fe = fe_null; switch (key) { case K_INS: fe = se_query_add; break; case K_CTRL+K_INS: fe = se_notify_add; break; case K_DEL: fe = se_query_del; break; case K_CTRL+K_DEL: fe = se_notify_del; break; case K_TAB: fe = se_enter; break; case K_CTRL+K_TAB: fe = se_query_modify; break; case K_ENTER: fe = se_notify_modify; break; default: break; } return fe == fe_null ? TRUE : wm.on_field_event(s, fe, row); } void TAutomask::set_handlers() { for (int i = fields()-1; i >= 0; i--) { TMask_field& f = fld(i); if (f.is_operable()) { f.set_handler(universal_handler); if (f.is_sheet()) ((TSheet_field&)f).set_notify(universal_notifier); } } } TAutomask::TAutomask(const char* name, int num) : TMask(name, num) { set_handlers(); }