Corrette maschere e lisbox

git-svn-id: svn://10.65.10.50/trunk@2908 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1996-05-24 16:35:53 +00:00
parent 2a4d1ba45f
commit c711835274
5 changed files with 75 additions and 58 deletions

View File

@ -215,8 +215,6 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy,
if (parent == NULL_WIN)
parent = TASK_WIN;
const bool normal = dx != 0; // Non e' a tutto schermo
short left = x * CHARX;
short top = y * ROWY;
short width = dx * CHARX;
@ -243,7 +241,7 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy,
}
RCT r; xvt_rect_set(&r, left, top, left+width, top+height);
const WIN_TYPE wt = normal ? W_DOC : W_PLAIN;
const WIN_TYPE wt = (dx == 0) ? W_PLAIN : W_DOC;
long wsf = WSF_INVISIBLE | WSF_NO_MENUBAR;
WINDOW win = xvt_win_create(wt, &r, (char*)caption, NULL, parent, wsf,
@ -280,13 +278,12 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy,
xi_set_pref(XI_PREF_VERT_PIXEL_SPACING, spacing);
}
if (normal)
if (dx > 0)
{
xi_pu_to_fu(itf, (PNT*)&r, 2);
r.right = r.left + (dx+1) * XI_FU_MULTIPLE;
r.bottom = r.top + (dy+1) * Y_FU_MULTIPLE;
xi_fu_to_pu(itf, (PNT*)&r, 2);
xvt_vobj_translate_points(win, xvt_vobj_get_parent(win), (PNT*)&r, 2);
xvt_vobj_move(win, &r);
}
@ -459,7 +456,7 @@ void TControl::set_tab_cid(short cid)
case XIT_BTN:
_obj->v.btn->tab_cid = cid; break;
case XIT_CONTAINER:
_obj->v.container->tab_cid = cid > 1000 ? (cid % 1000) : (1000 + cid);
_obj->v.container->tab_cid = _obj->cid;
if (_obj->nbr_children > 0)
_obj->children[_obj->nbr_children-1]->v.btn->tab_cid = cid;
break;
@ -486,7 +483,7 @@ TControl& TControl::find_operable_ctl(bool forward) const
for (int c = first; c != last && obj == NULL; c += delta)
{
const XI_OBJ_TYPE t = child[c]->type;
if (t == XIT_FORM || t == XIT_LIST || t == XIT_CONTAINER)
if (t == XIT_FORM || t == XIT_BTN || t == XIT_LIST || t == XIT_CONTAINER)
obj = child[c];
}
TControl* ctl = obj == NULL ? (TControl*)this : (TControl*)xi_get_app_data(obj);
@ -1520,13 +1517,15 @@ void TDropDownList::select(int i, bool force)
if (force || i != _selected)
{
_selected = i;
xi_set_text(_obj, (char*)_values.get(i));
if (!_in_cell)
if (_obj->type == XIT_FIELD)
{
xi_set_text(_obj, (char*)_values.get(i));
TListbox_control* listbox = (TListbox_control *)xi_get_app_data(_obj);
listbox->notify_key(K_SPACE);
}
else
xi_set_text(_obj, (char*)_codes.get(i));
if (is_open())
{
@ -1571,9 +1570,9 @@ void TDropDownList::select_by_ofs(int i)
select(i);
}
TDropDownList::TDropDownList(XI_OBJ* o, const char* values, int width, bool cell)
TDropDownList::TDropDownList(XI_OBJ* o, const char* codes, const char* values, int width)
: _obj(o), _values(values), _open(FALSE), _xi_lst(NULL), _width(width),
_displayed(FALSE), _in_cell(cell), _selected(0)
_displayed(FALSE), _selected(0)
{}
void TDropDownList::open()
@ -1718,11 +1717,10 @@ bool TListbox_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev)
return ok;
}
void TListbox_control::set_values(const char* val)
{
_values = val;
_ddl->set_values(val);
if (selected() >= _values.items())
void TListbox_control::set_values(const char* cod, const char* val)
{
_ddl->set_values(cod, val);
if (selected() >= items())
_ddl->select(0, TRUE);
else
_ddl->select(selected(), TRUE);
@ -1730,11 +1728,11 @@ void TListbox_control::set_values(const char* val)
TListbox_control::TListbox_control(WINDOW win, short cid,
short left, short top, short width,
const char* flags, const char* text, const char* values)
: TField_control(), _values(values)
const char* flags, const char* text,
const char* codes, const char* values)
{
create(win, cid, left, top, width , 1, width, flags, text, TRUE);
_ddl = new TDropDownList(_obj, _values, width);
_ddl = new TDropDownList(_obj, codes, values, width);
_ddl->select(0, TRUE);
}

View File

@ -265,10 +265,12 @@ public:
class TDropDownList : public TObject
{
XI_OBJ* _obj;
XI_OBJ* _xi_lst;
XI_OBJ* _xi_lst;
TToken_string _codes;
TToken_string _values;
int _selected;
int _width;
bool _open;
@ -291,9 +293,12 @@ public:
long row2rec(int) const;
int rec2row(long rec) const;
void select(int i, bool force = FALSE);
void set_values(const char* v) { _values = v; _selected = 0; }
void set_values(const char* c, const char* v) { _codes = c; _values = v; }
TDropDownList(XI_OBJ* o, const char* values, int wid, bool cell = FALSE);
TToken_string& codes() { return _codes; }
TToken_string& values() { return _values; }
TDropDownList(XI_OBJ* o, const char* codes, const char* values, int wid);
virtual ~TDropDownList() {}
};
@ -301,7 +306,6 @@ class TListbox_control : public TField_control
{
friend class TDropDownList;
TDropDownList* _ddl;
TToken_string _values;
private:
void drop_down();
@ -310,8 +314,8 @@ protected: // TTField_control
virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev);
public:
void set_values(const char* c);
int items() const { return _values.items(); }
void set_values(const char* c, const char* v);
int items() const { return _ddl->items(); }
void select(int i) { _ddl->select(i); }
void select_by_initial(char c) { _ddl->select_by_initial(c); }
void select_by_ofs(int i) { _ddl->select_by_ofs(i); }
@ -319,7 +323,8 @@ public:
TListbox_control(WINDOW win, short cid,
short left, short top, short width,
const char* flags, const char* text, const char* values);
const char* flags, const char* text,
const char* codes, const char* values);
virtual ~TListbox_control();
};

View File

@ -3448,7 +3448,7 @@ void TList_field::add_item(
{
_codes.add(item);
_values.add(t.get());
((TListbox_control*)_ctl)->set_values(_values);
((TListbox_control*)_ctl)->set_values(_codes, _values);
}
}
@ -3462,7 +3462,7 @@ void TList_field::delete_item(const char* s)
{
_codes.destroy(pos);
_values.destroy(pos);
((TListbox_control*)_ctl)->set_values(_values);
((TListbox_control*)_ctl)->set_values(_codes, _values);
if (pos == current())
{
@ -3498,7 +3498,7 @@ void TList_field::add_list()
}
}
}
((TListbox_control*)_ctl)->set_values(_values);
((TListbox_control*)_ctl)->set_values(_codes, _values);
if (roman() && automagic())
{
@ -3517,7 +3517,13 @@ const char* TList_field::win2raw(const char* data) const
TToken_string& value = ((TList_field*)this)->_values;
_ctl_data._park = data; // data puo' venire da una TToken_string::get
int pos = value.get_pos(_ctl_data._park);
int pos = 0;
if (_ctl_data._park.len() > 2) // E' veramente una descrizione
pos = value.get_pos(_ctl_data._park);
else // Oppure e' un codice
pos = codes.get_pos(_ctl_data._park);
if (pos < 0 && _ctl_data._park.blank())
{
_ctl_data._park = codes.get(0); // Uso codes come riferimento per blank
@ -3587,7 +3593,8 @@ void TList_field::create(WINDOW parent)
_ctl = new TListbox_control(parent, _ctl_data._dlg,
_ctl_data._x, _ctl_data._y,
_ctl_data._width,
_ctl_data._flags, _ctl_data._prompt, _values);
_ctl_data._flags, _ctl_data._prompt,
_codes, _values);
add_list();
}

View File

@ -1176,7 +1176,10 @@ public:
// @cmember Scrive il valore del campo direttamente dalla finestra del controllo
virtual void set(const char* data);
// @cmember Ritorna la tokenstring dei codici ammessi
const char* get_codes() const { return _values; }
// @cmember Ritorna la tokenstring dei valori ammessi
const char* get_values() const { return _values; }

View File

@ -265,8 +265,8 @@ TSpreadsheet::TSpreadsheet(
TString testa(h);
const int at = testa.find('@');
const int m = f->size(); // Memory width
int v = m; // Video width
int m = f->size(); // Memory width
int v = m; // Video width
if (at >= 0)
{
const TString& wi = testa.mid(at+1);
@ -278,6 +278,9 @@ TSpreadsheet::TSpreadsheet(
}
testa.cut(at);
v = max(at, v+(f->has_query_button() ? 1 : 0));
if (v < m && f->is_kind_of(CLASS_LIST_FIELD))
m = 2;
}
else
{
@ -766,6 +769,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
case XIE_CELL_REQUEST:
{
const int rec = (int)xiev->v.cell_request.rec;
const int maxlen = xiev->v.cell_request.len;
const char* src = NULL;
int nm;
XI_OBJ** obj = xi_get_member_list(xiev->v.cell_request.list, &nm);
@ -783,7 +788,12 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
const TEditable_field* e = (const TEditable_field*)f;
src = row(rec).get(col); // Set value for cell
if (src && *src)
src = e->raw2win(src); // Get formatted string
{
if (maxlen <= 3 && e->is_kind_of(CLASS_LIST_FIELD))
/* src = src */; // Leave code as is
else
src = e->raw2win(src); // Get formatted string
}
if (cell_disabled(rec, col))
xiev->v.cell_request.back_color = DISABLED_BACK_COLOR;
@ -804,9 +814,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
char* dst = xiev->v.cell_request.s;
if (src && *src)
{
const int len = xiev->v.cell_request.len;
strncpy(dst, src, len);
dst[len-1] = '\0';
strncpy(dst, src, maxlen);
dst[maxlen-1] = '\0';
}
else
*dst = '\0';
@ -1032,7 +1041,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col);
// droppa giu'
TList_field& lst = (TList_field&)(*_edit_field);
TDropDownList ddl(&cell, lst.get_values(), lst.size(), TRUE);
TDropDownList ddl(&cell, lst.get_codes(), lst.get_values(), lst.size());
ddl.open();
while (ddl.is_open())
do_events();
@ -1093,27 +1102,22 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
refused = TRUE;
beep();
}
else if(_edit_field->is_kind_of(CLASS_LIST_FIELD))
else if (_edit_field->is_kind_of(CLASS_LIST_FIELD))
{
XI_OBJ cell;
XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col);
TList_field& lst = ((TList_field&)*_edit_field);
if (k >= ' ' && k <= 'z')
{
lst.select_by_initial(k);
xi_set_text(&cell, (char*)lst.raw2win(lst.get()));
}
else if (k == K_RIGHT)
{
switch (k)
{
case K_RIGHT:
lst.select_next();
xi_set_text(&cell, (char*)lst.raw2win(lst.get()));
}
else if (k == K_LEFT)
{
break;
case K_LEFT:
lst.select_prev();
xi_set_text(&cell, (char*)lst.raw2win(lst.get()));
}
break;
default:
if (k >= ' ' && k <= 'z')
lst.select_by_initial(k);
break;
}
refused = TRUE;
}
break;