From 0b5ea3bfd927531656cc632daa5246f42acca8f6 Mon Sep 17 00:00:00 2001 From: guy Date: Thu, 1 Aug 1996 12:21:37 +0000 Subject: [PATCH] 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 --- include/controls.cpp | 50 +++++++++++++++++++++++++++++++------------- include/controls.h | 1 + include/msksheet.cpp | 7 +++++-- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/include/controls.cpp b/include/controls.cpp index 67f67c572..6a593d237 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -1851,23 +1851,21 @@ bool TDropDownList::select(int i, bool force) bool TDropDownList::select_by_initial(char c) { - int next = _selected < _values.items() - 1 ? _selected + 1 : 0; - int first = -1; - for (int i = 0; i < _values.items(); i++) - if (toupper(*(_values.get(i))) == toupper(c)) - { - first = i; + const int tot = _values.items(); + int i = _selected; + c = toupper(c); + while(TRUE) + { + i++; + if (i >= tot) + i = 0; + if (i == _selected) + break; + const char p = toupper(*(_values.get(i))); + if (p == c) 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; if (i != selected()) { @@ -1912,6 +1910,18 @@ void TDropDownList::set_values(const char* c, const char* v) { _codes = c; _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() @@ -1950,6 +1960,16 @@ void TDropDownList::open() } // Larghezza in form units dell'edit field 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_ATR_VISIBLE|XI_ATR_ENABLED|XI_ATR_READONLY|XI_ATR_SELECTABLE, diff --git a/include/controls.h b/include/controls.h index f14616180..26e09ddf3 100755 --- a/include/controls.h +++ b/include/controls.h @@ -282,6 +282,7 @@ class TDropDownList : public TObject protected: static void ddl_str_eh (XI_OBJ* itf, XI_EVENT* xiev); void update_selection(XI_EVENT* xiev) const; + int calc_min_width(); public: const int selected() const { return _selected; } diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 2857a9607..07a8b127c 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -709,7 +709,7 @@ void TSpreadsheet::notify_change() _edit_field = cell2field(NULL); // Ricalcola correttamente il campo corrente notify(_cur_rec, K_SPACE); - _row_dirty = TRUE; + _row_dirty = _cell_dirty = TRUE; set_dirty(); } } @@ -1153,7 +1153,9 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) beep(); } else if (_edit_field->is_kind_of(CLASS_LIST_FIELD)) - { + { + notify_change(); // Aggiorna valore corrente listbox + TList_field& lst = ((TList_field&)*_edit_field); bool changed = FALSE; 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_set_text(&cell, (char*)(const char*)lst.get()); + _cell_dirty = TRUE; } refused = TRUE; }