From 85a2d7afecefb47d374e1cbc6f54090103e2d4c8 Mon Sep 17 00:00:00 2001 From: guy Date: Mon, 8 Jul 1996 07:24:36 +0000 Subject: [PATCH] form.cpp Aggiunti const a funzioni virtuali che una volta l'avevano controls.cpp Corretto lo scrolling e le dimensioni dei listbox window.cpp Corretti colori trasparenti git-svn-id: svn://10.65.10.50/trunk@3143 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/controls.cpp | 190 ++++++++++++++++++++++++++----------------- include/controls.h | 9 +- include/form.cpp | 10 +-- include/window.cpp | 12 +-- 4 files changed, 132 insertions(+), 89 deletions(-) diff --git a/include/controls.cpp b/include/controls.cpp index 2a886c404..ee9f2db3d 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -22,6 +22,8 @@ typedef struct _stx_data #endif +HIDDEN bool _button_blocked = FALSE; + short get_focus_id(WINDOW win) { XI_OBJ * itf = xi_get_itf(win); @@ -416,12 +418,18 @@ HIDDEN void xi_event_handler(XI_OBJ* itf, XI_EVENT* xiev) ctl = (TControl*)xi_get_app_data(xiev->v.xi_obj->parent); break; case a_xvt: - if (xiev->v.xvte.type == E_CHAR) + switch (xiev->v.xvte.type) { - XI_OBJ* fo = xi_get_focus(itf); - if (fo != NULL && fo->type == XIT_CELL) - ctl = (TControl*)xi_get_app_data(fo->parent); - } + case E_CHAR: + { + XI_OBJ* fo = xi_get_focus(itf); + if (fo != NULL && fo->type == XIT_CELL) + ctl = (TControl*)xi_get_app_data(fo->parent); + } + break; + default: + break; + } break; case a_xvt_post: if (notify_xvt) @@ -429,6 +437,9 @@ HIDDEN void xi_event_handler(XI_OBJ* itf, XI_EVENT* xiev) TWindow* w = (TWindow*)xi_get_app_data(itf); CHECK(w, "Can't send XVT event to a null window"); w->handler(w->win(), &xiev->v.xvte); + + if (xiev->v.xvte.type == E_MOUSE_UP) + _button_blocked = FALSE; } else notify_xvt = TRUE; @@ -1020,9 +1031,12 @@ void TField_control::create(WINDOW win, short cid, CHECKD(_obj, "Can't create field ", cid); STX_DATA* stx = (STX_DATA*)_obj->v.field->stx; CHECKD(stx, "NULL stx for field ", cid); - const int offset = _obj->v.field->btn_rct.left - stx->rct.right + 1; - _obj->v.field->btn_rct.left -= offset ; - _obj->v.field->btn_rct.right -= offset; + + // Aggiusta il rettangolo del bottone in modo da allinearlo al testo + RCT& br = _obj->v.field->btn_rct; + const int offset = stx->rct.right - br.left - 1; + br.left += offset; + br.right += offset; update_tab_cid(); @@ -1563,6 +1577,13 @@ int TDropDownList::rec2row(long rec) const return r; } +void TDropDownList::update_selection(XI_EVENT* xiev) const +{ + if (xiev->v.rec_request.data_rec == selected()) + xiev->v.rec_request.attrib |= XI_ATR_SELECTED; + else + xiev->v.rec_request.attrib &= ~XI_ATR_SELECTED; +} void TDropDownList::ddl_str_eh(XI_OBJ* itf, XI_EVENT* xiev) { @@ -1584,46 +1605,69 @@ void TDropDownList::ddl_str_eh(XI_OBJ* itf, XI_EVENT* xiev) if (ddl->items() == 0) xiev->refused = TRUE; else + { xiev->v.rec_request.data_rec = ddl->items() * xiev->v.rec_request.percent/100; + ddl->update_selection(xiev); + } break; case XIE_GET_LAST: xiev->v.rec_request.data_rec = ddl->items() - 1; + ddl->update_selection(xiev); break; case XIE_GET_NEXT: if (xiev->v.rec_request.spec_rec >= ddl->items()-1) xiev->refused = TRUE; else + { xiev->v.rec_request.data_rec = xiev->v.rec_request.spec_rec + 1; + ddl->update_selection(xiev); + } break; case XIE_GET_PREV: if (xiev->v.rec_request.spec_rec == 0) xiev->refused = TRUE; else + { xiev->v.rec_request.data_rec = xiev->v.rec_request.spec_rec - 1; + ddl->update_selection(xiev); + } break; case XIE_GET_PERCENT: if (ddl->items() > 1) - xiev->v.get_percent.percent = (int)((xiev->v.get_percent.record * 100l)/((long)ddl->items()-1l)); + xiev->v.get_percent.percent = int((xiev->v.get_percent.record * 100L)/(ddl->items()-1)); break; case XIE_DBL_CELL: ddl->select((int)(ddl->row2rec(xiev->v.xi_obj->v.cell.row))); ddl->close(); - break; - case XIE_ON_ROW: - if (ddl->displayed()) - ddl->select((int)(ddl->row2rec(xiev->v.xi_obj->v.row))); + break; + case XIE_ON_ROW: + /* Guy: Per ora ignora sto evento, prova con XIE_SELECT */ + break; + case XIE_SELECT: + if (xiev->v.xi_obj->type == XIT_ROW) + { + const long rec = ddl->row2rec(xiev->v.xi_obj->v.row); + ddl->select((int)rec); + } break; case XIE_XVT_EVENT: - if ((xiev->v.xvte.type == E_FOCUS && xiev->v.xvte.v.active == FALSE) || xiev->v.xvte.type == E_MOUSE_UP) - ddl->close(); + if ((xiev->v.xvte.type == E_FOCUS && xiev->v.xvte.v.active == FALSE) || + xiev->v.xvte.type == E_MOUSE_UP) + { + ddl->close(); + if (xiev->v.xvte.type == E_FOCUS) + _button_blocked = TRUE; + } else if (xiev->v.xvte.type == E_CHAR) { const KEY k = xiev->v.xvte.v.chr.ch; if (k == K_ENTER || k == K_ESC) ddl->close(); else + { if (k >= ' ' && k <= 'z') ddl->select_by_initial(k); + } } break; case XIE_CHAR_CELL: // TBI: questa e' copiata da edit @@ -1658,19 +1702,9 @@ bool TDropDownList::select(int i, bool force) else xi_set_text(_obj, (char*)_codes.get(i)); - if (is_open()) - { - int r = rec2row(i); - if (r < 0) - { - xi_scroll_rec(_xi_lst, i, FOCUS_COLOR, XI_ATR_ENABLED, 0); - r = rec2row(i); - } - CHECKD(r >= 0, "Can't select listbox item ", r); - XI_OBJ cell; XI_MAKE_CELL(&cell, _xi_lst, r, 0); - xi_set_focus(&cell); - } - + if (force && is_open()) + xi_scroll_rec(_xi_lst, i, NORMAL_COLOR, XI_ATR_ENABLED | XI_ATR_SELECTED, 0); + return TRUE; } @@ -1695,8 +1729,31 @@ bool TDropDownList::select_by_initial(char c) break; if (i == _values.items() && first >= 0) i = first; + + bool ok = FALSE; + if (i != selected()) + { + if (is_open()) + { + const int oldsel = selected(); - return select(i); + // Scrolla alla selezione corrente + xi_scroll_rec(_xi_lst, i, NORMAL_COLOR, XI_ATR_SELECTED | XI_ATR_ENABLED, 0); + + const int r = rec2row(oldsel); + if (r >= 0) + { + XI_OBJ riga; XI_MAKE_ROW(&riga, _xi_lst, r); + long attr = xi_get_attrib(&riga); + attr &= ~XI_ATR_SELECTED; + xi_set_attrib(&riga, attr); + xi_dequeue(); + } + + } + ok = select(i); + } + return ok; } bool TDropDownList::select_by_ofs(int i) @@ -1707,9 +1764,9 @@ bool TDropDownList::select_by_ofs(int i) return FALSE; } -TDropDownList::TDropDownList(XI_OBJ* o, const char* codes, const char* values, int width) +TDropDownList::TDropDownList(XI_OBJ* o, const char* codes, const char* values) : _obj(o), _codes(codes), _values(values), - _open(FALSE), _xi_lst(NULL), _width(width), + _open(FALSE), _xi_lst(NULL), _displayed(FALSE), _selected(0) {} @@ -1722,53 +1779,42 @@ void TDropDownList::set_values(const char* c, const char* v) void TDropDownList::open() { if (_open) return; - + XI_OBJ_DEF* itfdef = xi_create_itf_def(ITF_CID, (XI_EVENT_HANDLER)ddl_str_eh, NULL, "", (long)this); - // qui si vedra' se e cosa modificare itfdef->v.itf->automatic_back_color = TRUE; - // compute size of field with button - - RCT r; xi_get_rect(_obj, &r); - - XI_RCT xr = r; - xi_pu_to_fu(_obj->itf, (PNT*)&xr, 2); - - if (_width == 0) // usually in spreadsheet cells - _width = (xr.right - xr.left)/XI_FU_MULTIPLE; - - if ((xr.right - xr.left) < (_width * XI_FU_MULTIPLE)) - { - xr.right = xr.left + (_width * XI_FU_MULTIPLE); - r = xr; - xi_fu_to_pu(_obj->itf, (PNT*)&r, 2); - } - - int hei = items() <= 1 ? 2*XI_FU_MULTIPLE + 1 : (min(6,items()) * XI_FU_MULTIPLE) + 1; + + const int hei = items() <= 1 ? 2*XI_FU_MULTIPLE + 1 : (min(6,items()) * XI_FU_MULTIPLE) + 1; XI_OBJ_DEF* lstdef = xi_add_list_def(itfdef, _obj->cid+1000, 0, 0, hei, - XI_ATR_ENABLED|XI_ATR_VISIBLE, NORMAL_COLOR, NORMAL_BACK_COLOR, - DISABLED_COLOR, DISABLED_BACK_COLOR, FOCUS_COLOR, 0); + XI_ATR_ENABLED|XI_ATR_VISIBLE, + NORMAL_COLOR, NORMAL_BACK_COLOR, + DISABLED_COLOR, DISABLED_BACK_COLOR, + FOCUS_COLOR, 0); lstdef->v.list->active_back_color = FOCUS_BACK_COLOR; lstdef->v.list->scroll_bar = items() > 6; lstdef->v.list->no_heading = TRUE; lstdef->v.list->no_horz_lines = TRUE; - lstdef->v.list->no_vert_lines = TRUE; +// lstdef->v.list->no_vert_lines = TRUE; lstdef->v.list->resize_with_window = TRUE; - -/* - int len; - if (_in_cell) - len = items() <= 6 ? r.right - r.left - 2 : (_width-1) * XI_FU_MULTIPLE; - else - len = items() <= 6 ? _obj->v.field->rct.right - _obj->v.field->rct.left - 2 : - (_width-1) * XI_FU_MULTIPLE; -*/ - int len = xr.right - xr.left - 2; - if (items() > 6) len = (_width-1) * XI_FU_MULTIPLE; + lstdef->v.list->single_select = TRUE; + + // compute size in pixel of field (with button enclosed) + RCT r; xi_get_rect(_obj, &r); + + // Larghezza in pixel dell'edit field + int len = r.right - r.left; + if (lstdef->v.list->scroll_bar) + { + // Larghezza in pixel del bottone + const int bw = int(_obj->itf->v.itf->fu_height * XI_FU_MULTIPLE / _obj->itf->v.itf->fu_width); + len -= bw; + } + // Larghezza in form units dell'edit field + len = len * XI_FU_MULTIPLE / _obj->itf->v.itf->fu_width - 2; XI_OBJ_DEF* coldef = xi_add_column_def(lstdef, _obj->cid+2000, - XI_ATR_VISIBLE|XI_ATR_ENABLED|XI_ATR_READONLY, + XI_ATR_VISIBLE|XI_ATR_ENABLED|XI_ATR_READONLY|XI_ATR_SELECTABLE, 0, len, 80, ""); RCT l; xi_get_def_rect(lstdef, &l); @@ -1814,13 +1860,6 @@ void TDropDownList::open() xvt_vobj_raise(win); _displayed = TRUE; -/* - xi_scroll_rec(_xi_lst, _selected, NORMAL_COLOR, XI_ATR_ENABLED, 0); - const int row = rec2row(_selected); - XI_OBJ cell; - XI_MAKE_CELL(&cell, _xi_lst, row, 0); - xi_set_focus(&cell); -*/ select(_selected, TRUE); xi_dequeue(); @@ -1835,7 +1874,8 @@ bool TListbox_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev) { case XIE_DBL_FIELD: case XIE_BUTTON: - _ddl->open(); + if (!_ddl->is_open() && !_button_blocked) + _ddl->open(); break; case XIE_CHAR_FIELD: { @@ -1876,7 +1916,7 @@ TListbox_control::TListbox_control(WINDOW win, short cid, const char* codes, const char* values) { create(win, cid, left, top, width , 1, width, flags, text, TRUE); - _ddl = new TDropDownList(_obj, codes, values, width); + _ddl = new TDropDownList(_obj, codes, values); _ddl->select(0, TRUE); } diff --git a/include/controls.h b/include/controls.h index c36b9b9ea..cb0f0d456 100755 --- a/include/controls.h +++ b/include/controls.h @@ -273,13 +273,14 @@ class TDropDownList : public TObject TToken_string _values; int _selected; - int _width; bool _open; bool _displayed; bool _in_cell; - + +protected: static void ddl_str_eh (XI_OBJ* itf, XI_EVENT* xiev); - + void update_selection(XI_EVENT* xiev) const; + public: const int selected() const { return _selected; } void open(); @@ -297,7 +298,7 @@ public: bool select_by_initial(char c); bool select_by_ofs(int n); - TDropDownList(XI_OBJ* o, const char* codes, const char* values, int wid); + TDropDownList(XI_OBJ* o, const char* codes, const char* values); virtual ~TDropDownList() {} }; diff --git a/include/form.cpp b/include/form.cpp index 78b4e41d8..79fc78d68 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -1634,7 +1634,7 @@ protected: virtual bool set(const char*); bool set(const TDate& d); virtual bool parse_item(TScanner& scanner); - virtual void print_body(ostream& out); + virtual void print_body(ostream& out) const; virtual void print_on(TMask& m); virtual void read_from(const TMask& m); @@ -1673,7 +1673,7 @@ bool TForm_date::read() return ok; } -void TForm_date::print_body(ostream& out) +void TForm_date::print_body(ostream& out) const { TForm_string::print_body(out); out << " FORMAT \"" << _format << "\"\n"; @@ -1781,7 +1781,7 @@ protected: virtual bool parse_item(TScanner& scanner); virtual void print_on(TMask& m); virtual void read_from(const TMask& m); - virtual void print_body(ostream& out); + virtual void print_body(ostream& out) const; virtual bool update(); public: @@ -1856,7 +1856,7 @@ void TForm_list::read_from(const TMask& m) } } -void TForm_list::print_body(ostream& out) +void TForm_list::print_body(ostream& out) const { TForm_string::print_body(out); @@ -2373,7 +2373,7 @@ void TPrint_section::repos_fields(const char* name, int size) { if (!ps.form().dirty()) ps.form().set_dirty(); ps.set_dirty(); - if (yesno_box("E' stato cambiato il font o la dimensione del carattere.\nDevo aggiornare le coordinate dei campi?")) + if (yesno_box("E' stato cambiato il font o la dimensione del carattere.\nSi desidera aggiornare le coordinate dei campi?")) { s_data prm; prm.size_1=ps.form().fontsize(); diff --git a/include/window.cpp b/include/window.cpp index ad8beb832..01be47970 100755 --- a/include/window.cpp +++ b/include/window.cpp @@ -494,14 +494,16 @@ void TImage::convert_transparent_color() // @comm Legge nell'immagine i pixel uguali a quello in alto a sinistra e li setta // uguali allo sfondo delle maschere { - const COLOR trans = xvt_image_get_pixel(_image, 0, 0); - if (trans != MASK_BACK_COLOR && xvt_image_get_format(_image) == XVT_IMAGE_CL8) + const COLOR trans = xvt_image_get_pixel(_image, 0, 0) & 0x00FFFFFF; + if (trans != (MASK_BACK_COLOR & 0x00FFFFFF) && + xvt_image_get_format(_image) == XVT_IMAGE_CL8) { for (int index = 0; index < 256; index++) - if (xvt_image_get_clut(_image, index) == trans) + if (trans == (xvt_image_get_clut(_image, index) & 0x00FFFFFF)) + { + xvt_image_set_clut(_image, index, MASK_BACK_COLOR); break; - if (index < 256) - xvt_image_set_clut(_image, index, MASK_BACK_COLOR); + } } }