Patch level : 12.0

Files correlati     : 

Aggiunta TVariable_automask

git-svn-id: svn://10.65.10.50/branches/R_10_00@23463 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
bonazzi 2016-12-20 16:34:29 +00:00
parent 380ea39b1e
commit f1c9bb7e4c
2 changed files with 441 additions and 234 deletions

View File

@ -1,183 +1,363 @@
#include <automask.h> #include <automask.h>
bool TAutomask::error_box(const char* fmt, ...) bool TAutomask::error_box(const char* fmt, ...)
{ {
TString message(1024); TString message(1024);
char* msg = message.get_buffer(); char* msg = message.get_buffer();
va_list argptr; va_list argptr;
va_start(argptr, fmt); va_start(argptr, fmt);
vsnprintf_s(msg, message.size(), _TRUNCATE, fmt, argptr); vsnprintf_s(msg, message.size(), _TRUNCATE, fmt, argptr);
va_end(argptr); va_end(argptr);
if (is_sheetmask() && !is_running()) if (is_sheetmask() && !is_running())
get_sheet()->error_box(msg); get_sheet()->error_box(msg);
else else
post_error_message(msg, 3); post_error_message(msg, 3);
return false; return false;
} }
TField_event TAutomask::key2event(TMask_field& f, KEY key) const TField_event TAutomask::key2event(TMask_field& f, KEY key) const
{ {
const TMask& wm = f.mask(); const TMask& wm = f.mask();
TField_event fe = fe_null; TField_event fe = fe_null;
switch (key) switch (key)
{ {
case K_TAB: case K_TAB:
if (f.is_edit()) if (f.is_edit())
{ {
if (wm.get_sheet()) if (wm.get_sheet())
{ {
if (wm.is_running()) if (wm.is_running())
{ {
if (f.focusdirty()) if (f.focusdirty())
fe = fe_modify; fe = fe_modify;
} }
else else
{ {
fe = f.focusdirty() ? fe_modify : fe_init; fe = f.focusdirty() ? fe_modify : fe_init;
} }
} }
else else
{ {
if (wm.is_running()) if (wm.is_running())
{ {
if (f.focusdirty()) if (f.focusdirty())
fe = fe_modify; fe = fe_modify;
} }
else else
fe = fe_init; fe = fe_init;
} }
} }
break; break;
case K_SPACE: case K_SPACE:
if (f.is_edit()) if (f.is_edit())
{ {
if (wm.is_running()) if (wm.is_running())
fe = fe_edit; fe = fe_edit;
} }
else else
{ {
if (f.is_kind_of(CLASS_BUTTON_FIELD) || f.is_kind_of(CLASS_BUTTON_TOOL)) if (f.is_kind_of(CLASS_BUTTON_FIELD) || f.is_kind_of(CLASS_BUTTON_TOOL))
fe = fe_button; else fe = fe_button; else
if (f.is_kind_of(CLASS_TREE_FIELD)) if (f.is_kind_of(CLASS_TREE_FIELD))
fe = wm.is_running() ? fe_modify : fe_init; fe = wm.is_running() ? fe_modify : fe_init;
else else
fe = f.focusdirty() ? fe_modify : fe_init; fe = f.focusdirty() ? fe_modify : fe_init;
} }
break; break;
case K_CTRL+K_SPACE: case K_CTRL+K_SPACE:
if (f.is_kind_of(CLASS_TREE_FIELD)) if (f.is_kind_of(CLASS_TREE_FIELD))
fe = fe_button; fe = fe_button;
break; break;
case K_ENTER: case K_ENTER:
fe = fe_close; fe = fe_close;
break; break;
case K_F8: case K_F8:
fe = fe_magic; fe = fe_magic;
break; break;
case K_F9: case K_F9:
if (f.is_edit()) if (f.is_edit())
fe = fe_button; fe = fe_button;
break; break;
case K_F11: case K_F11:
fe = fe_info; fe = fe_info;
break; break;
default: default:
fe = fe_null; fe = fe_null;
break; break;
} }
return fe; return fe;
} }
bool TAutomask::universal_handler(TMask_field& f, KEY key) bool TAutomask::universal_handler(TMask_field& f, KEY key)
{ {
TOperable_field& of = (TOperable_field&)f; TOperable_field& of = (TOperable_field&)f;
TAutomask& am = (TAutomask&)of.mask(); TAutomask& am = (TAutomask&)of.mask();
const TField_event fe = am.key2event(of, key); const TField_event fe = am.key2event(of, key);
return fe == fe_null ? true : am.on_field_event(of, fe, 0); return fe == fe_null ? true : am.on_field_event(of, fe, 0);
} }
bool TAutomask::insheet_universal_handler(TMask_field& f, KEY key) bool TAutomask::insheet_universal_handler(TMask_field& f, KEY key)
{ {
TMask& m = f.mask(); TMask& m = f.mask();
TSheet_field& s = *m.get_sheet(); TSheet_field& s = *m.get_sheet();
TAutomask& am = (TAutomask&)s.mask(); TAutomask& am = (TAutomask&)s.mask();
TOperable_field& of = (TOperable_field&)f; TOperable_field& of = (TOperable_field&)f;
TField_event fe = am.key2event(of, key); TField_event fe = am.key2event(of, key);
return fe == fe_null ? true : am.on_field_event(of, fe, m.number()); return fe == fe_null ? true : am.on_field_event(of, fe, m.number());
} }
bool TAutomask::universal_notifier(TSheet_field& s, int row, KEY key) bool TAutomask::universal_notifier(TSheet_field& s, int row, KEY key)
{ {
TField_event fe = fe_null; TField_event fe = fe_null;
switch (key) switch (key)
{ {
case K_INS: case K_INS:
fe = se_query_add; fe = se_query_add;
break; break;
case K_CTRL+K_INS: case K_CTRL+K_INS:
fe = se_notify_add; fe = se_notify_add;
break; break;
case K_DEL: case K_DEL:
fe = se_query_del; fe = se_query_del;
break; break;
case K_CTRL+K_DEL: case K_CTRL+K_DEL:
fe = se_notify_del; fe = se_notify_del;
break; break;
case K_TAB: case K_TAB:
fe = se_enter; fe = se_enter;
break; break;
case K_CTRL+K_TAB: case K_CTRL+K_TAB:
fe = se_leave; fe = se_leave;
break; break;
case K_SPACE: case K_SPACE:
fe = se_query_modify; fe = se_query_modify;
break; break;
case K_ENTER: case K_ENTER:
fe = se_notify_modify; fe = se_notify_modify;
break; break;
default: default:
break; break;
} }
TAutomask& wm = (TAutomask&)s.mask(); TAutomask& wm = (TAutomask&)s.mask();
return fe == fe_null ? true : wm.on_field_event(s, fe, row); return fe == fe_null ? true : wm.on_field_event(s, fe, row);
} }
void TAutomask::set_handlers() void TAutomask::set_handlers()
{ {
for (int i = fields()-1; i >= 0; i--) for (int i = fields()-1; i >= 0; i--)
{ {
TMask_field& f = fld(i); TMask_field& f = fld(i);
if (f.is_operable()) if (f.is_operable())
{ {
f.set_handler(universal_handler); f.set_handler(universal_handler);
if (f.is_sheet()) if (f.is_sheet())
{ {
((TSheet_field&)f).set_notify(universal_notifier); ((TSheet_field&)f).set_notify(universal_notifier);
TMask& m = ((TSheet_field&)f).sheet_mask(); TMask& m = ((TSheet_field&)f).sheet_mask();
for (int j = m.fields()-1; j >= 0; j--) for (int j = m.fields()-1; j >= 0; j--)
{ {
TMask_field& g = m.fld(j); TMask_field& g = m.fld(j);
if (g.is_operable()) if (g.is_operable())
g.set_handler(insheet_universal_handler); g.set_handler(insheet_universal_handler);
} }
} }
} }
} }
} }
TAutomask::TAutomask(const char* name, int num) TAutomask::TAutomask(const char* name, int num)
: TMask(name, num) : TMask(name, num)
{ {
set_handlers(); set_handlers();
} }
TAutomask::TAutomask(const char* title, int pages, int cols, int rows, int xpos, int ypos) TAutomask::TAutomask(const char* title, int pages, int cols, int rows, int xpos, int ypos)
: TMask(title, pages, cols, rows, xpos, ypos) : TMask(title, pages, cols, rows, xpos, ypos)
{ {
} }
bool TVariable_automask::error_box(const char* fmt, ...)
{
TString message(1024);
char* msg = message.get_buffer();
va_list argptr;
va_start(argptr, fmt);
vsnprintf_s(msg, message.size(), _TRUNCATE, fmt, argptr);
va_end(argptr);
if (is_sheetmask() && !is_running())
get_sheet()->error_box(msg);
else
post_error_message(msg, 3);
return false;
}
TField_event TVariable_automask::key2event(TMask_field& f, KEY key) const
{
const TMask& wm = f.mask();
TField_event fe = fe_null;
switch (key)
{
case K_TAB:
if (f.is_edit())
{
if (wm.get_sheet())
{
if (wm.is_running())
{
if (f.focusdirty())
fe = fe_modify;
}
else
{
fe = f.focusdirty() ? fe_modify : fe_init;
}
}
else
{
if (wm.is_running())
{
if (f.focusdirty())
fe = fe_modify;
}
else
fe = fe_init;
}
}
break;
case K_SPACE:
if (f.is_edit())
{
if (wm.is_running())
fe = fe_edit;
}
else
{
if (f.is_kind_of(CLASS_BUTTON_FIELD) || f.is_kind_of(CLASS_BUTTON_TOOL))
fe = fe_button; else
if (f.is_kind_of(CLASS_TREE_FIELD))
fe = wm.is_running() ? fe_modify : fe_init;
else
fe = f.focusdirty() ? fe_modify : fe_init;
}
break;
case K_CTRL+K_SPACE:
if (f.is_kind_of(CLASS_TREE_FIELD))
fe = fe_button;
break;
case K_ENTER:
fe = fe_close;
break;
case K_F8:
fe = fe_magic;
break;
case K_F9:
if (f.is_edit())
fe = fe_button;
break;
case K_F11:
fe = fe_info;
break;
default:
fe = fe_null;
break;
}
return fe;
}
bool TVariable_automask::universal_handler(TMask_field& f, KEY key)
{
TOperable_field& of = (TOperable_field&)f;
TVariable_automask& am = (TVariable_automask&)of.mask();
const TField_event fe = am.key2event(of, key);
return fe == fe_null ? true : am.on_field_event(of, fe, 0);
}
bool TVariable_automask::insheet_universal_handler(TMask_field& f, KEY key)
{
TMask& m = f.mask();
TSheet_field& s = *m.get_sheet();
TVariable_automask& am = (TVariable_automask&)s.mask();
TOperable_field& of = (TOperable_field&)f;
TField_event fe = am.key2event(of, key);
return fe == fe_null ? true : am.on_field_event(of, fe, m.number());
}
bool TVariable_automask::universal_notifier(TSheet_field& s, int row, KEY key)
{
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_leave;
break;
case K_SPACE:
fe = se_query_modify;
break;
case K_ENTER:
fe = se_notify_modify;
break;
default:
break;
}
TVariable_automask& wm = (TVariable_automask&)s.mask();
return fe == fe_null ? true : wm.on_field_event(s, fe, row);
}
void TVariable_automask::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);
TMask& m = ((TSheet_field&)f).sheet_mask();
for (int j = m.fields()-1; j >= 0; j--)
{
TMask_field& g = m.fld(j);
if (g.is_operable())
g.set_handler(insheet_universal_handler);
}
}
}
}
}
TVariable_automask::TVariable_automask(const char* name, int num)
: TVariable_mask(name, num)
{
set_handlers();
}

View File

@ -1,51 +1,78 @@
#ifndef __AUTOMASK_H #ifndef __AUTOMASK_H
#define __AUTOMASK_H #define __AUTOMASK_H
#ifndef __DEFMASK_H #ifndef __DEFMASK_H
#include <defmask.h> #include <defmask.h>
#endif #endif
#ifndef __MSKSHEET_H #ifndef __MSKSHEET_H
#include <msksheet.h> #include <msksheet.h>
#endif #endif
enum TField_event { fe_null = 0, #ifndef __VARMASK_H
fe_init, fe_modify, fe_button, fe_close, #include <varmask.h>
fe_magic, fe_info, fe_edit, #endif
se_enter = 10, se_leave,
se_query_modify, se_notify_modify,
se_query_add, se_notify_add, enum TField_event { fe_null = 0,
se_query_del, se_notify_del }; fe_init, fe_modify, fe_button, fe_close,
fe_magic, fe_info, fe_edit,
class TAutomask : public TMask se_enter = 10, se_leave,
{ se_query_modify, se_notify_modify,
private: se_query_add, se_notify_add,
static bool universal_handler(TMask_field& f, KEY k); se_query_del, se_notify_del };
static bool insheet_universal_handler(TMask_field& f, KEY k);
static bool universal_notifier(TSheet_field& f, int row, KEY k); class TAutomask : public TMask
{
protected: private:
void set_handlers(); static bool universal_handler(TMask_field& f, KEY k);
TField_event key2event(TMask_field& f, KEY key) const; static bool insheet_universal_handler(TMask_field& f, KEY k);
static bool universal_notifier(TSheet_field& f, int row, KEY k);
public:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly) pure; protected:
bool error_box(const char* fmt, ...); // No more f.error_box void set_handlers();
void set_universal_handler(const short id) { set_handler(id, universal_handler);} TField_event key2event(TMask_field& f, KEY key) const;
void set_insheet_universal_handler(const short sid, const short id) { sfield(sid).sheet_mask().set_handler(id, insheet_universal_handler);}
public:
TAutomask() { } virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly) pure;
TAutomask(const char* name, int num = 0); bool error_box(const char* fmt, ...); // No more f.error_box
TAutomask(const char* title, int pages, int cols, int rows, int xpos = -1, int ypos = -1); void set_universal_handler(const short id) { set_handler(id, universal_handler);}
virtual ~TAutomask() { } void set_insheet_universal_handler(const short sid, const short id) { sfield(sid).sheet_mask().set_handler(id, insheet_universal_handler);}
};
TAutomask() { }
class TSimpleAutomask : public TAutomask TAutomask(const char* name, int num = 0);
{ TAutomask(const char* title, int pages, int cols, int rows, int xpos = -1, int ypos = -1);
public: virtual ~TAutomask() { }
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly) {return true;} };
TSimpleAutomask() { }
virtual ~TSimpleAutomask() { } class TVariable_automask : public TVariable_mask
}; {
private:
#endif static bool universal_handler(TMask_field& f, KEY k);
static bool insheet_universal_handler(TMask_field& f, KEY k);
static bool universal_notifier(TSheet_field& f, int row, KEY k);
protected:
void set_handlers();
TField_event key2event(TMask_field& f, KEY key) const;
public:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly) pure;
bool error_box(const char* fmt, ...); // No more f.error_box
void set_universal_handler(const short id) { set_handler(id, universal_handler);}
void set_insheet_universal_handler(const short sid, const short id) { sfield(sid).sheet_mask().set_handler(id, insheet_universal_handler);}
TVariable_automask() { }
TVariable_automask(const char* name, int num = 0);
virtual ~TVariable_automask() { }
};
class TSimpleAutomask : public TAutomask
{
public:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly) {return true;}
TSimpleAutomask() { }
virtual ~TSimpleAutomask() { }
};
#endif