controls.cpp Corretta dimensione dei listbox collegati alle celle

controls.h     Aggiunta la funzione per calcolare la larghezza minima
msksheet.cpp   Corretta gestione listbox


git-svn-id: svn://10.65.10.50/trunk@3310 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1996-08-01 12:21:37 +00:00
parent 0446be8679
commit 0b5ea3bfd9
3 changed files with 41 additions and 17 deletions

View File

@ -1851,22 +1851,20 @@ bool TDropDownList::select(int i, bool force)
bool TDropDownList::select_by_initial(char c) bool TDropDownList::select_by_initial(char c)
{ {
int next = _selected < _values.items() - 1 ? _selected + 1 : 0; const int tot = _values.items();
int first = -1; int i = _selected;
for (int i = 0; i < _values.items(); i++) c = toupper(c);
if (toupper(*(_values.get(i))) == toupper(c)) while(TRUE)
{ {
first = i; i++;
if (i >= tot)
i = 0;
if (i == _selected)
break;
const char p = toupper(*(_values.get(i)));
if (p == c)
break; break;
} }
if (first == -1)
return FALSE;
for (i = next; i < _values.items(); i++)
if (toupper(*(_values.get(i))) == toupper(c))
break;
if (i == _values.items() && first >= 0)
i = first;
bool ok = FALSE; bool ok = FALSE;
if (i != selected()) if (i != selected())
@ -1914,6 +1912,18 @@ void TDropDownList::set_values(const char* c, const char* v)
_values = v; _values = v;
} }
int TDropDownList::calc_min_width()
{
int len = 1;
for (const char* v = _values.get(0); v; v = _values.get())
{
const int l = strlen(v);
if (l > len) len = l;
}
return len * XI_FU_MULTIPLE;
}
void TDropDownList::open() void TDropDownList::open()
{ {
if (_open) return; if (_open) return;
@ -1951,6 +1961,16 @@ void TDropDownList::open()
// Larghezza in form units dell'edit field // Larghezza in form units dell'edit field
len = len * XI_FU_MULTIPLE / _obj->itf->v.itf->fu_width - 2; len = len * XI_FU_MULTIPLE / _obj->itf->v.itf->fu_width - 2;
if (_obj->type == XIT_CELL)
{
const int m = calc_min_width();
if (len < m)
{
len = m;
r.right = r.left + m * _obj->itf->v.itf->fu_width / XI_FU_MULTIPLE;
}
}
XI_OBJ_DEF* coldef = xi_add_column_def(lstdef, _obj->cid+2000, XI_OBJ_DEF* coldef = xi_add_column_def(lstdef, _obj->cid+2000,
XI_ATR_VISIBLE|XI_ATR_ENABLED|XI_ATR_READONLY|XI_ATR_SELECTABLE, XI_ATR_VISIBLE|XI_ATR_ENABLED|XI_ATR_READONLY|XI_ATR_SELECTABLE,
0, len, 80, ""); 0, len, 80, "");

View File

@ -282,6 +282,7 @@ class TDropDownList : public TObject
protected: protected:
static void ddl_str_eh (XI_OBJ* itf, XI_EVENT* xiev); static void ddl_str_eh (XI_OBJ* itf, XI_EVENT* xiev);
void update_selection(XI_EVENT* xiev) const; void update_selection(XI_EVENT* xiev) const;
int calc_min_width();
public: public:
const int selected() const { return _selected; } const int selected() const { return _selected; }

View File

@ -709,7 +709,7 @@ void TSpreadsheet::notify_change()
_edit_field = cell2field(NULL); // Ricalcola correttamente il campo corrente _edit_field = cell2field(NULL); // Ricalcola correttamente il campo corrente
notify(_cur_rec, K_SPACE); notify(_cur_rec, K_SPACE);
_row_dirty = TRUE; _row_dirty = _cell_dirty = TRUE;
set_dirty(); set_dirty();
} }
} }
@ -1154,6 +1154,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
} else } else
if (_edit_field->is_kind_of(CLASS_LIST_FIELD)) if (_edit_field->is_kind_of(CLASS_LIST_FIELD))
{ {
notify_change(); // Aggiorna valore corrente listbox
TList_field& lst = ((TList_field&)*_edit_field); TList_field& lst = ((TList_field&)*_edit_field);
bool changed = FALSE; bool changed = FALSE;
switch (k) switch (k)
@ -1173,6 +1175,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
{ {
XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col); XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col);
xi_set_text(&cell, (char*)(const char*)lst.get()); xi_set_text(&cell, (char*)(const char*)lst.get());
_cell_dirty = TRUE;
} }
refused = TRUE; refused = TRUE;
} }