diff --git a/include/applicat.cpp b/include/applicat.cpp index 34649945f..1ce40ffe6 100755 --- a/include/applicat.cpp +++ b/include/applicat.cpp @@ -123,7 +123,7 @@ long TApplication::task_eh(WINDOW win, EVENT *ep) // Setta il vero menu principale se diverso dal default const int meno = _application->argc() > 1 ? atoi(_application->argv(1)+1) : 0; ignore_xvt_errors(TRUE); - MENU_ITEM* menu = xvt_res_get_menu(MENU_BAR(meno)); + MENU_ITEM* menu = xvt_res_get_menu(MENU_BAR_ID(meno)); ignore_xvt_errors(FALSE); if (menu) { @@ -240,7 +240,7 @@ long TApplication::handler(WINDOW win, EVENT* ep) } else { - if (ep->v.cmd.tag >= BAR_ITEM(1)) + if (ep->v.cmd.tag >= BAR_ITEM_ID(1)) { if(!menu(ep->v.cmd.tag)) stop_run(); @@ -817,13 +817,13 @@ bool TApplication::get_next_mail(TToken_string& to, TToken_string& cc, TToken_st bool TSkeleton_application::create() { - dispatch_e_menu(BAR_ITEM(1)); + dispatch_e_menu(BAR_ITEM_ID(1)); return TApplication::create(); } bool TSkeleton_application::menu(MENU_TAG tag) { - if (tag == BAR_ITEM(1)) + if (tag == BAR_ITEM_ID(1)) main_loop(); return FALSE; } \ No newline at end of file diff --git a/include/bagn006.uml b/include/bagn006.uml index 4d8eac778..4b389a008 100755 --- a/include/bagn006.uml +++ b/include/bagn006.uml @@ -1,7 +1,7 @@ #include //maschera dei collegamenti ad oggetti esterni -TOOLBAR "" 0 -3 0 3 +TOOLBAR "" 0 0 0 2 BUTTON DLG_OK 10 2 BEGIN @@ -10,7 +10,7 @@ END BUTTON F_NEWREC 10 2 BEGIN - PROMPT -25 -1 "" + PROMPT -25 -1 "~Nuovo" PICTURE BMP_NEWREC END @@ -22,7 +22,7 @@ END BUTTON F_PRINT 10 2 BEGIN - PROMPT -45 -1 "" + PROMPT -45 -1 "Stampa" PICTURE BMP_PRINT END @@ -34,13 +34,13 @@ END ENDPAGE -PAGE "Oggetti esterni" -1, -1, 76, 16 +PAGE "Oggetti esterni" 0 2 0 0 -SPREADSHEET F_SHEET 0 -3 +SPREADSHEET F_SHEET 78 BEGIN PROMPT 1 4 "Lista" ITEM "File@35" - ITEM "Nome@15" + ITEM "Nome@20" ITEM "Collegamento" END @@ -48,7 +48,7 @@ ENDPAGE ENDMASK -PAGE "Oggetto esterno" -1, -1, 76, 6 +PAGE "Oggetto esterno" -1 -1 60 4 STRING S_FILE 256 50 BEGIN @@ -67,6 +67,10 @@ BEGIN PROMPT 1 3 "Collegamento esterno" END +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + BUTTON DLG_OK 10 2 BEGIN PROMPT -16 -1 "" @@ -74,7 +78,7 @@ END BUTTON F_NEWREC 10 2 BEGIN - PROMPT -26 -1 "" + PROMPT -26 -1 "~Nuovo" PICTURE BMP_NEWREC END @@ -93,7 +97,7 @@ END BUTTON F_PRINT 10 2 BEGIN - PROMPT -56 -1 "" + PROMPT -56 -1 "Stampa" PICTURE BMP_PRINT END diff --git a/include/bagn008.uml b/include/bagn008.uml index d9f86fafd..7bc5a33b1 100755 --- a/include/bagn008.uml +++ b/include/bagn008.uml @@ -1,3 +1,12 @@ +PAGE "Anteprima" 0 0 0 0 + +PREVIEW DLG_USER +BEGIN + PROMPT 0 0 "" +END + +ENDPAGE + TOOLBAR "Toolbar" 0 0 0 2 BUTTON DLG_PRINT 10 2 @@ -52,14 +61,5 @@ END ENDPAGE -PAGE "Anteprima" 0 0 0 0 - -PREVIEW DLG_USER -BEGIN - PROMPT 0 0 "" -END - -ENDPAGE - ENDMASK diff --git a/include/confapp.cpp b/include/confapp.cpp index 356536e39..8b9b4ec5e 100755 --- a/include/confapp.cpp +++ b/include/confapp.cpp @@ -7,7 +7,7 @@ bool TConfig_application::create() { TApplication::create(); - _last_choice = BAR_ITEM(1); + _last_choice = BAR_ITEM_ID(1); // process args TString arg(16); @@ -41,12 +41,12 @@ bool TConfig_application::destroy() bool TConfig_application::menu(MENU_TAG m) { // funziona da se' fino a 20 voci della menubar - if (m >= BAR_ITEM(1) && m <= BAR_ITEM(20)) + if (m >= BAR_ITEM_ID(1) && m <= BAR_ITEM_ID(20)) { _last_choice = m; - do_config((m - BAR_ITEM(0))/100); + do_config((m - BAR_ITEM_ID(0))/100); } - return xvtil_test_menu_tag(BAR_ITEM(2)); + return xvtil_test_menu_tag(BAR_ITEM_ID(2)); } bool TConfig_application::user_create() diff --git a/include/controls.cpp b/include/controls.cpp index a25632db8..18493d32a 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -16,6 +16,7 @@ extern "C" #include #include #include +#include #include @@ -46,60 +47,12 @@ bool TOOL_TEXT = true; bool EASY_RIDER = true; bool ENTER_AS_TAB = false; -HIDDEN bool _button_blocked = false; +HIDDEN bool _ddl_shown = false; HIDDEN int _last_mouse_button = 0; HIDDEN int X_FU_MULTIPLE = 0; HIDDEN int Y_FU_MULTIPLE = 0; HIDDEN const int ITF_CID = 30000; -/////////////////////////////////////////////////////////// -// TDropDownList -/////////////////////////////////////////////////////////// - -class TDropDownList : public TObject -{ - XI_OBJ* _obj; // Owner cell or field - XI_OBJ* _xi_lst; - - TToken_string _codes; - TToken_string _values; - - int _selected; - bool _open; - -protected: - static void ddl_str_eh (XI_OBJ* itf, XI_EVENT* xiev); - void update_selection(XI_EVENT* xiev) const; - int calc_min_width(); - - void create(); - void destroy(); - - long row2rec(int) const; - int rec2row(long rec) const; - -public: - const int selected() const { return _selected; } - void open(); - void close(); - bool is_open() const { return _open; } - - const char* item(long i) { const char* s = _values.get(int(i)); return s ? s : ""; } - int items() const { return _values.items(); } - void set_values(const char* c, const char* v); - - bool select(int i, bool force = false); - bool select_by_initial(char c); - bool select_by_ofs(int n); - - void on_mouse_down(const PNT& pt); - - TDropDownList(XI_OBJ* o, const TToken_string& codes, const TToken_string& values); - virtual ~TDropDownList(); -}; - -HIDDEN TDropDownList* _cur_ddl = NULL; - short low_get_focus_id(WINDOW win) { XI_OBJ * itf = xi_get_itf((XinWindow)win); @@ -175,10 +128,7 @@ int TPicture_array::add_icon(int id) TImage* i = (TImage*)_enabled.objptr(rid); if (i == NULL) { - TConfig ini("res/resource.ini", "Icons"); - TString8 strid; strid << id; - TFilename n; n << "res/" << ini.get(strid); - TImage* i = new TImage(n); + TImage* i = new TImage(id, true); // id is an icon identifier! _enabled.add(i, rid); TImage* d = new TImage(*i); d->fade_to_gray(true); @@ -606,7 +556,7 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, CHECK(win, "Can't create an XVT window for an interface"); xvtil_set_font(win, NULL, 0, 0); - XI_OBJ_DEF* def = xi_create_itf_def(ITF_CID, xi_event_handler, (XinRect *) &r, (char*)caption, (long)msk); + XI_OBJ_DEF* def = xi_create_itf_def(ITF_CID, xi_event_handler, (XI_RCT*) &r, (char*)caption, (long)msk); CHECK(def, "Can't define an interface"); def->v.itf->automatic_back_color = false; @@ -652,7 +602,7 @@ void attach_interface(WINDOW win, COLOR back) char caption[80]; xvt_vobj_get_title(win, caption, 80); TWindow* parent = (TWindow*)xvt_vobj_get_data(win); - XI_OBJ_DEF* def = xi_create_itf_def(ITF_CID, xi_event_handler, (XinRect *) &rc, caption, (long)parent); + XI_OBJ_DEF* def = xi_create_itf_def(ITF_CID, xi_event_handler, (XI_RCT*)&rc, caption, (long)parent); CHECK(def, "Can't define an interface"); def->v.itf->automatic_back_color = false; @@ -714,8 +664,6 @@ HIDDEN void xi_event_handler(XI_OBJ* itf, XI_EVENT* xiev) { case E_MOUSE_DOWN: _last_mouse_button = xiev->v.xvte.v.mouse.button; - if (_cur_ddl != NULL) - _cur_ddl->on_mouse_down(xiev->v.xvte.v.mouse.where); break; case E_CHAR: { @@ -756,9 +704,6 @@ HIDDEN void xi_event_handler(XI_OBJ* itf, XI_EVENT* xiev) break; } break; - case E_MOUSE_UP: - _button_blocked = false; - // fall down default: w->handler(win, &xiev->v.xvte); break; @@ -1026,13 +971,13 @@ int TControl::type() const RCT& TControl::get_rect(RCT& r) const { - xi_get_rect(_obj, (XinRect *) &r); + xi_get_rect(_obj, (XI_RCT*) &r); return r; } void TControl::set_rect(const RCT& r) { - xi_set_rect(_obj, (XinRect*)&r, false); + xi_set_rect(_obj, (XI_RCT*)&r, false); if ( _obj->type == XIT_BTN ) { @@ -1269,7 +1214,7 @@ TText_control::TText_control(WINDOW win, short cid, } const unsigned long attrib = flags2attr(flags); - XI_OBJ_DEF* def = xi_add_text_def(NULL, cid, (XinRect *) &rct, attrib, (char*)(const char*)t); + XI_OBJ_DEF* def = xi_add_text_def(NULL, cid, (XI_RCT*) &rct, attrib, (char*)(const char*)t); CHECKS(def, "Can't create the definition of TText_control:", text); def->v.text->fore_color = color; if (bold || big) @@ -1450,7 +1395,7 @@ void TField_control::create(WINDOW win, short cid, if (_obj->v.field->button) { // Aggiusta il rettangolo del bottone in modo da allinearlo al testo - XinRect& br = (XinRect&)_obj->v.field->btn_rct; + XI_RCT& br = (XI_RCT&)_obj->v.field->btn_rct; const int offset = stx->rct.right - br.left - 1; br.left += offset; br.right += offset; @@ -1571,7 +1516,7 @@ void TButton_control::create(WINDOW win, short cid, RCT rct; coord2rct(win, left, top, width, height, rct); const unsigned long attrib = flags2attr(flags); - XI_OBJ_DEF* def = xi_add_button_def(NULL, cid, (XinRect*)&rct, attrib, (char*)t, cid); + XI_OBJ_DEF* def = xi_add_button_def(NULL, cid, (XI_RCT*)&rct, attrib, (char*)t, cid); CHECKD(def, "Can't create the interface of TButton_control ", cid); def->v.btn->fore_color = color; def->app_data = (long)this; @@ -1619,7 +1564,8 @@ void TButton_control::create(WINDOW win, short cid, if (height == 1) { XI_RCT& r = _obj->v.btn->rct; - r.bottom+=2; + r.top -= 2; + r.bottom++; } break; case WC_CHECKBOX: @@ -1825,8 +1771,8 @@ void TPushbutton_control::update() if (attrib & XI_ATR_VISIBLE) { WINDOW win = parent(); - XI_RCT rct = _obj->v.btn->rct; - rct.left += 5; rct.top += 5; rct.right -= 5; rct.bottom -= 5; + XI_RCT rct; xi_get_rect(_obj, &rct); // = _obj->v.btn->rct; + xi_inflate_rect(&rct, -3); xi_set_clip((XinWindow)win, &rct); // Cancello il testo sottostante @@ -1839,14 +1785,10 @@ void TPushbutton_control::update() if (bmp > 0) { const TImage& i = attrib & XI_ATR_ENABLED ? _picture->image(bmp) : _picture->disabled_image(bmp); - int x = (rct.right + rct.left - i.width()) / 2; - int y = (rct.bottom + rct.top - i.height()) / 2; + RCT& dst = xvtil_align_rect(i.rect(), (RCT&)rct, 'C', 'C', '-'); if (_obj->v.btn->down) - { - x += 2; - y += 2; - } - i.draw(win, x, y); + xvt_rect_offset(&dst, 2, 2); + i.draw(win, dst); } xi_set_clip((XinWindow)win, NULL); } @@ -1949,7 +1891,7 @@ TRadiobutton_control::TRadiobutton_control(WINDOW win, short cid, rct.left -= XI_FU_MULTIPLE / 4; rct.right += XI_FU_MULTIPLE / 4; } - XI_OBJ_DEF* def = xi_add_container_def(NULL, cid, (XinRect *) &rct, orient, cid); + XI_OBJ_DEF* def = xi_add_container_def(NULL, cid, (XI_RCT*) &rct, orient, cid); def->app_data = (long)this; const unsigned long attrib = flags2attr(flags); @@ -2143,414 +2085,101 @@ void TTagbutton_control::set_caption(const char* text) // TListbox_control /////////////////////////////////////////////////////////// -long TDropDownList::row2rec(int row) const +const char* xvtil_get_cell_selection(XI_OBJ* field_or_cell, int sel, const char* cod, const char* val) { - int rows; - const long* handle = xi_get_list_info(_xi_lst, &rows); - - if (row < 0) row = 0; - else - if (row >= rows) - row = rows-1; - const long r = handle[row]; - CHECKD(r >= 0 && r < items(), "Sheet line out of range: ", row); - - return r; -} - -int TDropDownList::rec2row(long rec) const -{ - int rows; - const long* handle = xi_get_list_info(_xi_lst, &rows); - - int r = int(rec - handle[0]); - if (r < 0 || r >= rows) - r = -1; - - 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) -{ - TDropDownList* ddl = (TDropDownList*)xi_get_app_data(itf); - if (!ddl->is_open()) - return; - - switch(xiev->type) - { - case XIE_GET_FIRST: - if (ddl->items() > 0) - { - // GUY - // xiev->v.rec_request.data_rec = ddl->items() * xiev->v.rec_request.percent/100; - // ddl->update_selection(xiev); - long n = ddl->items() * (long)xiev->v.rec_request.percent / 100L; - if (n < 0L) n = 0L; - xiev->v.rec_request.data_rec = n; - } - else - xiev->refused = true; - break; - case XIE_GET_LAST: - xiev->v.rec_request.data_rec = ddl->items() - 1; - // GUY ddl->update_selection(xiev); - break; - case XIE_GET_PREV: - case XIE_GET_NEXT: - { - const long n = xiev->v.rec_request.spec_rec + (xiev->type == XIE_GET_NEXT ? +1 : -1) ; - if (n >= 0 && n < ddl->items()) - xiev->v.rec_request.data_rec = n; - else - xiev->refused = true; - } - break; - case XIE_CELL_REQUEST: - { - const long rec = xiev->v.cell_request.rec; - if (rec >= 0 && rec < ddl->items()) - { - const char* row = ddl->item(xiev->v.cell_request.rec); - const int len = xiev->v.cell_request.len; - strncpy(xiev->v.cell_request.s, (char*)row, len); - xiev->v.cell_request.s[len - 1] = '\0'; - } - } - break; - case XIE_GET_PERCENT: - { - const long rec = xiev->v.get_percent.record; - long n = ddl->items(); if (n <= 0) n = 1; - xiev->v.get_percent.percent = int(rec * 100L / n); - } - break; - case XIE_DBL_CELL: - ddl->select((int)(ddl->row2rec(xiev->v.xi_obj->v.cell.row))); - ddl->close(); - break; - case XIE_SELECT: - if (xiev->v.xi_obj->type == XIT_ROW) - { - const int rec = ddl->row2rec(xiev->v.xi_obj->v.row); - ddl->select(rec); - if (itf->v.itf->mouse_is_down) - ddl->close(); - } - break; - case XIE_XVT_EVENT: - switch (xiev->v.xvte.type) - { - case 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(char(k)); - } - } - break; - case E_MOUSE_DBL: - ddl->close(); - break; - default: - break; - } - default: - break; - } -} - -void TDropDownList::close() -{ - if (_open) + if (sel < 0) + sel = 0; + TToken_string values(val); + if (field_or_cell->type != XIT_FIELD) { - _open = false; - if (_xi_lst != NULL) - xvt_vobj_set_visible((WINDOW)xi_get_window(_xi_lst->itf), false); - _cur_ddl = NULL; - } -} + RCT ownrct; xi_get_rect(field_or_cell, (XI_RCT*)&ownrct); + const int max_width = (ownrct.right-ownrct.left) - 20; // Larghezza cella stimata senza bottone -void TDropDownList::destroy() -{ - close(); - if (_xi_lst != NULL) - { - xvt_vobj_destroy((WINDOW)xi_get_window(_xi_lst->itf)); - _xi_lst = NULL; - } -} - -bool TDropDownList::select(int i, bool force) -{ - if (force || i != _selected) - { - _selected = i; - - if (_obj->type == XIT_FIELD) - { - if (_open) xi_set_text(_obj, ""); // Altrimenti a volte ridisegna male! - 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 (force && _open) - xi_scroll_rec(_xi_lst, i, FOCUS_COLOR, XI_ATR_ENABLED | XI_ATR_SELECTED, 0); - - return true; - } - - return false; -} - -bool TDropDownList::select_by_initial(char c) -{ - 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; - } - - bool ok = false; - if (i != selected()) - { - if (is_open()) - { - const int oldsel = selected(); - - // Scrolla alla selezione corrente - xi_scroll_rec(_xi_lst, i, FOCUS_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) -{ - i += _selected; - if (i >= 0 && i < _values.items()) - return select(i); - return false; -} - -void TDropDownList::set_values(const char* c, const char* v) -{ - const int old_items = _codes.items(); - - _codes = c; - _values = v; - - const int new_items = _codes.items(); - if (new_items != old_items && _xi_lst != NULL) - destroy(); -} - -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+2) * XI_FU_MULTIPLE; -} - -void TDropDownList::create() -{ - if (_xi_lst != NULL) - return; - - XI_OBJ_DEF* itfdef = xi_create_itf_def(ITF_CID+1, (XI_EVENT_HANDLER)ddl_str_eh, NULL, "", - (long)this); - itfdef->v.itf->automatic_back_color = true; - - const int hei = items() <= 1 ? 2*XI_FU_MULTIPLE + 1 : (min(8,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, - FOCUS_COLOR, FOCUS_BACK_COLOR, - DISABLED_COLOR, DISABLED_BACK_COLOR, - FOCUS_COLOR, 0); - XI_LIST_DEF* ld = lstdef->v.list; - ld->active_back_color = FOCUS_BACK_COLOR; - ld->scroll_bar = items() > 8; - ld->no_heading = true; - ld->no_horz_lines = true; - ld->no_vert_lines = true; - ld->resize_with_window = true; - ld->single_select = true; -#ifdef LINUX - ld->scroll_on_thumb_track = true; -#endif - - // compute size in pixel of field (with button enclosed) - XI_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; - len -= 2; // Don't ask me why - } - else - len -= 6; // Don't ask me why - - // 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) + WINDOW parent = (WINDOW)xi_get_window(field_or_cell); + const char* txt = values.get(sel); + int text_width = xvt_dwin_get_text_width(parent, txt, -1); + if (text_width <= max_width) { - len = m; - r.right = r.left + m * _obj->itf->v.itf->fu_width / XI_FU_MULTIPLE; - } - } - - xi_add_column_def(lstdef, _obj->cid+2000, - XI_ATR_VISIBLE|XI_ATR_ENABLED|XI_ATR_READONLY|XI_ATR_SELECTABLE, - 0, len, 80, ""); - - XI_RCT l; xi_get_def_rect(lstdef, &l); - PNT p; p.h = r.left; - WINDOW pwin = (WINDOW)xi_get_window(_obj->itf); - RCT w; xvt_vobj_get_client_rect(pwin, &w); - // place rectangle - if (r.bottom + l.bottom - l.top <= w.bottom) - p.v = r.bottom; - else - { - p.v = r.top - l.bottom - l.top; - if (p.v < w.top) p.v = w.top; - } - RCT wr; - wr.left = p.h; wr.top = p.v; -// xi_get_def_rect(lstdef, (XinRect *) &l); - wr.right = r.right; - wr.bottom = wr.top + l.bottom - l.top; - const int delta_x = _obj->itf->v.itf->delta_x; - const int delta_y = _obj->itf->v.itf->delta_y; - wr.left -= delta_x; - wr.right -= delta_x; - wr.top -= delta_y; - wr.bottom -= delta_y; - - WINDOW win = xvt_win_create(W_PLAIN, &wr, "", 0, pwin, WSF_NO_MENUBAR, EM_ALL, - (EVENT_HANDLER)xi_event, 0L); - itfdef->v.itf->win = (XinWindow)win; - itfdef->v.itf->rctp = (XinRect *) ≀ - XI_OBJ* itfobj = xi_create(NULL, itfdef); - CHECK(itfobj, "Can't create listbox"); - - xi_dequeue(); - xi_tree_free(itfdef); - - _xi_lst = xi_get_obj(itfobj, _obj->cid+1000); - CHECK(_xi_lst, "Can't create listbox"); -} - -void TDropDownList::open() -{ - if (!_open) - { - if (_xi_lst != NULL) - xvt_vobj_set_visible((WINDOW)xi_get_window(_xi_lst->itf), true); - else - create(); - - _open = true; - xi_cell_request(_xi_lst); - - WINDOW win = (WINDOW)xi_get_window(_xi_lst->itf); - xvt_scr_set_focus_vobj(win); - xvt_vobj_raise(win); - - select(_selected, true); - - xi_dequeue(); - _cur_ddl = this; - } -} - -void TDropDownList::on_mouse_down(const PNT& pt) -{ - if (_open) - { - RCT rct; xi_get_rect(_obj, (XinRect*)&rct); - if (xvt_rect_has_point(&rct, pt)) - return; // E' nel campo di testo proprietario della lista - - xvt_vobj_get_outer_rect((WINDOW)xi_get_window(_xi_lst->itf), &rct); - if (!xvt_rect_has_point(&rct, pt)) // Fuori dalla lista - close(); - } -} - -TDropDownList::TDropDownList(XI_OBJ* o, const TToken_string& codes, const TToken_string& values) - : _obj(o), _xi_lst(NULL), _codes(codes), _values(values), _selected(0), _open(false) -{ - if (o->type == XIT_CELL) - { - const char* val = xi_get_text(o, NULL, -1); - _selected = _codes.get_pos(val); - if (_selected < 0) - _selected = 0; + int maxlen = strlen(txt); + FOR_EACH_TOKEN(values, tok) + { + const int len = strlen(tok); + if (len > maxlen) + { + maxlen = len; + text_width = xvt_dwin_get_text_width(parent, tok, -1); + } + } + } + if (text_width > max_width) + { + TToken_string codes(cod); + return codes.get(sel); + } } + + return values.get(sel); } -TDropDownList::~TDropDownList() +int xvtil_drop_down_list(XI_OBJ* field_or_cell, const char* codes, const char* values) { - destroy(); -} + if (_ddl_shown) + return -1; + _ddl_shown = true; + TToken_string val(values); + int sel = -1; + if (!val.empty_items()) + { + const int TAGDDL = 1000; // Tag della prima voce della lista + TString current; // Carico l'eventuale testo corrente + xi_get_text(field_or_cell, current.get_buffer(), current.size()); -int xvtil_drop_down_list(XI_OBJ* field_or_cell, const TToken_string& codes, const TToken_string& values) -{ - TDropDownList ddl(field_or_cell, codes, values); - ddl.open(); - while (ddl.is_open()) - do_events(); - return ddl.selected(); + const int maxi = val.items()+1; // Alloco sempre un item in piu' che fa da fine lista + MENU_ITEM* menu = new MENU_ITEM[maxi]; + memset(menu, 0, sizeof(MENU_ITEM)*maxi); + + int items = 0; + FOR_EACH_TOKEN(val, tok) + { + MENU_ITEM& mi = menu[items]; + mi.text = xvt_str_duplicate(tok); + mi.tag = TAGDDL+items; + mi.enabled = true; + if (sel < 0 && current == tok) + sel = items; + items++; + } + + if (items > 0) + { + WINDOW parent = (WINDOW)xi_get_window(field_or_cell); + + XVT_COLOR_COMPONENT xcc[8]; memset(&xcc, 0, sizeof(xcc)); + xcc[0].type = XVT_COLOR_BACKGROUND; xcc[0].color = NORMAL_BACK_COLOR; + xcc[1].type = XVT_COLOR_FOREGROUND; xcc[1].color = NORMAL_COLOR; + xcc[2].type = XVT_COLOR_HIGHLIGHT; xcc[2].color = FOCUS_COLOR; + xcc[3].type = XVT_COLOR_SELECT; xcc[3].color = FOCUS_BACK_COLOR; + xvt_dwin_set_font(parent, xvtil_default_font()); // Prepara il font da copiare nel popup + + RCT ownrct; xi_get_rect(field_or_cell, (XI_RCT*)&ownrct); + const MENU_TAG tag = xvt_list_popup(parent, &ownrct, menu, xcc, sel >= 0 ? TAGDDL+sel : -1); + if (tag >= TAGDDL) + { + sel = tag-TAGDDL; + const char* txt = xvtil_get_cell_selection(field_or_cell, sel, codes, values); + xi_set_text(field_or_cell, (char*)txt); + } + } + + // Free menu data + for (int i = items-1; i >= 0; i--) + xvt_mem_free(menu[i].text); + delete menu; + } + _ddl_shown = false; + + return sel; } /////////////////////////////////////////////////////////// @@ -2564,12 +2193,14 @@ bool TListbox_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev) { case XIE_DBL_FIELD: case XIE_BUTTON: - if (!_button_blocked && !read_only()) + if (!_ddl_shown && !read_only()) { - if (_ddl->is_open()) - _ddl->close(); - else - _ddl->open(); + const int sel = xvtil_drop_down_list(_obj, _codes, _values); + if (sel >= 0) + { + select(sel); + notify_key(K_SPACE); + } } break; case XIE_CHAR_FIELD: @@ -2579,16 +2210,23 @@ bool TListbox_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev) if (!read_only()) { if (k >= ' ' && k <= 'z') - _ddl->select_by_initial(char(k)); + select_by_initial(char(k)); else if (k == K_F9) - _ddl->open(); + { + const int sel = xvtil_drop_down_list(_obj, _codes, _values); + if (sel >= 0) + { + select(sel); + notify_key(K_SPACE); + } + } else if (k == K_RIGHT) // poor man's substitute for down arrow - _ddl->select_by_ofs(1); + select_by_ofs(1); else if (k == K_LEFT) // poor man's substitute for up arrow - _ddl->select_by_ofs(-1); + select_by_ofs(-1); else if (k == K_F2 || k == K_F11 || k == K_F12) notify_key(k); @@ -2612,49 +2250,78 @@ bool TListbox_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev) void TListbox_control::set_values(const char* cod, const char* val) { - _ddl->set_values(cod, val); + _codes = cod; + _values = val; if (selected() >= items()) - _ddl->select(0, true); - else - _ddl->select(selected(), true); + select(0); } int TListbox_control::items() const { - return _ddl->items(); + return _codes.items(); } bool TListbox_control::select(int i) { - return _ddl->select(i); + const bool ok = i >= 0 && i < items(); + if (ok) + { + if (_current != i) + { + _current = i; + xi_set_text(_obj, ""); // Senno' a volte disegna male + xi_set_text(_obj, (char*)_values.get(i)); + } + } + return ok; } bool TListbox_control::select_by_initial(char c) { - return _ddl->select_by_initial(c); + int i = _current; + const int tot = items(); + for (i = (i+1)%tot; i != _current; i = (i+1)%tot) + { + if (toupper(_values.get_char(i)) == toupper(c)) + break; + } + const bool changed = i != _current; + if (changed) + { + select(i); + notify_key(K_SPACE); + } + return changed; } bool TListbox_control::select_by_ofs(int i) { - return _ddl->select_by_ofs(i); + const int last = items()-1; + i += _current; + if (i < 0) + i = last; else + if (i > last) + i = last; + const bool changed = i != _current; + if (changed) + { + select(i); + notify_key(K_SPACE); + } + return changed; } int TListbox_control::selected() const -{ - return _ddl->selected(); -} +{ return _current; } TListbox_control::TListbox_control(WINDOW win, short cid, short left, short top, short width, const char* flags, const char* text, const char* codes, const char* values) + : _codes(codes), _values(values), _current(-1) { create(win, cid, left, top, width , 1, width, flags, text, true); - _ddl = new TDropDownList(_obj, codes, values); - _ddl->select(0, true); } TListbox_control::~TListbox_control() -{ - delete _ddl; _ddl = NULL; -} +{ } diff --git a/include/controls.h b/include/controls.h index 8cfa87f79..cf291717c 100755 --- a/include/controls.h +++ b/include/controls.h @@ -216,7 +216,7 @@ public: class TPushbutton_control : public TButton_control { - short _bmp_up, _bmp_dn; + int _bmp_up, _bmp_dn; protected: virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); @@ -309,14 +309,10 @@ public: virtual ~TCheckbutton_control() {} }; -class TDropDownList; - class TListbox_control : public TField_control { - TDropDownList* _ddl; - -private: - void drop_down(); + TToken_string _codes, _values; + int _current; protected: // TTField_control virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev); @@ -336,6 +332,7 @@ public: virtual ~TListbox_control(); }; -int xvtil_drop_down_list(XI_OBJ* field_or_cell, const TToken_string& codes, const TToken_string& values); +int xvtil_drop_down_list(XI_OBJ* field_or_cell, const char* codes, const char* values); +const char* xvtil_get_cell_selection(XI_OBJ* field_or_cell, int sel, const char* cod, const char* val); #endif \ No newline at end of file diff --git a/include/dongle.cpp b/include/dongle.cpp index fde0552e9..327b52a6e 100755 --- a/include/dongle.cpp +++ b/include/dongle.cpp @@ -1058,6 +1058,17 @@ const TString& TDongle::module_code2desc(word mod) const return EMPTY_STRING; } +const TString& TDongle::module_name2desc(const char* mod) const +{ + const word cod = module_name2code(mod); + if (cod == 0) + { + if (xvt_str_compare_ignoring_case(mod, "sy") == 0) + return get_tmp_string() = TR("Sistema"); + } + return module_code2desc(cod); +} + bool TDongle::shown(word code) const { bool yes = code < ENDAUT; diff --git a/include/dongle.h b/include/dongle.h index 32e3f09ff..5d60c6176 100755 --- a/include/dongle.h +++ b/include/dongle.h @@ -94,6 +94,8 @@ public: word module_name2code(const char* module) const; // Converte un nome di due lettere in numero const TString& module_code2name(word module) const; // ... e viceversa const TString& module_code2desc(word module) const; // Descrizione estesa del modulo + const TString& module_name2desc(const char* mod) const; // Converte un nome di due lettere in descrizione + bool shown(word module) const; // Stabilisce se un modulo e' visibile in installazione bool hidden(word module) const { return !shown(module); } // Modulo invisibile diff --git a/include/elabar.h b/include/elabar.h index db360ef3e..9666e1e13 100755 --- a/include/elabar.h +++ b/include/elabar.h @@ -4,23 +4,5 @@ BEGIN PICTURE BMP_ELABORA END -BUTTON DLG_INFO 2 2 -BEGIN - PROMPT 2 1 "Info" - MESSAGE EXIT,K_F2 - PICTURE BMP_INFO -END +#include -BUTTON DLG_HELP 2 2 -BEGIN - PROMPT 3 1 "Help" - MESSAGE EXIT,K_F1 - PICTURE BMP_HELP -END - -BUTTON DLG_QUIT 2 2 -BEGIN - PROMPT 5 1 "Fine" - MESSAGE EXIT,K_QUIT - PICTURE BMP_QUIT -END \ No newline at end of file diff --git a/include/golem.cpp b/include/golem.cpp index def2508e4..c1afe9888 100755 --- a/include/golem.cpp +++ b/include/golem.cpp @@ -261,7 +261,7 @@ TGolem_mask::TGolem_mask() sm.set_handler(F_LINK, link_handler); sm.set_handler(F_PRINT, link_handler); - TConfig ini(CONFIG_USER, "Link"); + TConfig ini(CONFIG_GUI, "Link"); TString_array list; ini.list_variables(list); @@ -277,7 +277,7 @@ TGolem_mask::TGolem_mask() // Aggiungi la posta se attiva #ifdef WIN32 // verificare - if (GetProfileInt("Mail", "MAPI", 0)) + if (::GetProfileInt("Mail", "MAPI", 0)) { const int items = list.items(); const int mmf_pos = (items >= MAX_ITEMS) ? MAX_ITEMS-1 : -1; @@ -291,12 +291,10 @@ TGolem_mask::TGolem_mask() FOR_EACH_ARRAY_ROW(list, r, row) { TString16 ext = *row; - unsigned int icon; + unsigned int icon = 0; if (ext == "mailto") - { icon = mail2icon(); - } else { ext.insert(".", 0); @@ -306,7 +304,8 @@ TGolem_mask::TGolem_mask() { const int x = (i < ITEMS_PER_ROW ? i*5 : (i-ITEMS_PER_ROW)*5) + 1; const int y = i < ITEMS_PER_ROW ? 0 : 2; - TButton_field& btn = add_button(301+i, 0, ext, x, y, 3, 2); + TButton_field& btn = add_button(301+i, 0, "", x, y, 3, 2); + btn.set_prompt(ext); btn.set_handler(ole_handler); btn.set_central_icon(icon); i++; @@ -364,7 +363,7 @@ void TGolem_field::create(WINDOW parent) _ctl = new TPushbutton_control(parent, _ctl_data._dlg, _ctl_data._x, _ctl_data._y, _ctl_data._width+2, _ctl_data._height, - _ctl_data._flags, _ctl_data._prompt, + _ctl_data._flags, "", // No prompt -> icons olny! _ctl_data._bmp_up, _ctl_data._bmp_dn); } diff --git a/include/image.cpp b/include/image.cpp index 52b0db8b3..0e1be491b 100755 --- a/include/image.cpp +++ b/include/image.cpp @@ -1,5 +1,6 @@ #include #include +#include /////////////////////////////////////////////////////////// // TImage @@ -78,13 +79,13 @@ XVT_IMAGE TImage::load( } // Certified 100% -XVT_IMAGE TImage::load(short id) +XVT_IMAGE TImage::load(int id) { return set(xvt_res_get_image(id)); } // Certified 100% -XVT_IMAGE TImage::load_icon(short id) +XVT_IMAGE TImage::load_icon(int id) { return set(xvt_res_get_icon(id)); } @@ -97,7 +98,7 @@ TImage::TImage(const char* n) : _image(NULL) } // Certified 100% -TImage::TImage(short id, bool is_icon) : _image(NULL) +TImage::TImage(int id, bool is_icon) : _image(NULL) { if (id > 0) { @@ -164,7 +165,7 @@ void TImage::draw(WINDOW w) const // @mfunc Permette di gestire il disegno dell'immagine sullo schermo void TImage::draw( - WINDOW w, // @parm Immagine da disegnare + WINDOW win, // @parm Immagine da disegnare int x, // @parm Coordinata x in cui disegnare l'immagine int y) const // @parm Coordinata y in cui disegnare l'immagine // @parm RCT& | _src | Rettangolo contenente l'immagine da disegnare @@ -181,19 +182,26 @@ void TImage::draw( { RCT dst = _src; xvt_rect_offset(&dst, x, y); - xvt_dwin_draw_image(w, _image, &dst, (RCT*)&_src); + xvt_dwin_draw_image(win, _image, &dst, (RCT*)&_src); } // Certified 100% -void TImage::draw(WINDOW w, const RCT& dst) const +void TImage::draw(WINDOW win, const RCT& dst) const { - xvt_dwin_draw_image(w, _image, (RCT*)&dst, (RCT*)&_src); + xvt_dwin_draw_image(win, _image, &dst, &_src); } // Certified 100% -void TImage::draw(WINDOW w, const RCT& dst, const RCT& src) const +void TImage::draw(WINDOW win, const RCT& dst, const RCT& src) const { - xvt_dwin_draw_image(w, _image, &dst, &src); + xvt_dwin_draw_image(win, _image, &dst, &_src); +} + +// Certified 99% +void TImage::draw(WINDOW win, const RCT& dst, char halign, char valign, char grow) const +{ + const RCT& rct = xvtil_align_rect(_src, dst, halign, valign, grow); + draw(win, rct); } // Certified 100% @@ -213,6 +221,8 @@ COLOR TImage::get_pixel(int x, int y) const return xvt_image_get_pixel(_image, x, y); } +/* OBSOLETA + // Certified 99% // @doc EXTERNAL @@ -256,6 +266,7 @@ void TImage::convert_to_default_colors() } } } +*/ // @mfunc Setta i colori dell'immagine in modo da renderla trasparente void TImage::convert_transparent_color(COLOR transparent) @@ -269,16 +280,9 @@ void TImage::convert_transparent_color(COLOR transparent) if (same_color(trans, transparent)) return; // Nothing to do +/* if (xvt_image_get_format(_image) == XVT_IMAGE_CL8) { -/* - for (int index = xvt_image_get_ncolors(_image)-1; index >=0; index--) - if (same_color(trans, xvt_image_get_clut(_image, index))) - { - xvt_image_set_clut(_image, index, transparent); - // break; don't break: replace all colors equal to upper left in the palette - } -*/ int i = -1; while (true) { @@ -302,6 +306,8 @@ void TImage::convert_transparent_color(COLOR transparent) set_pixel(x, y, transparent); } } +*/ + xvt_image_replace_color(_image, trans, transparent); // New "native" method } inline COLOR btncolor2btngray(COLOR color, bool use_btn) diff --git a/include/image.h b/include/image.h index 094764075..0099e6851 100755 --- a/include/image.h +++ b/include/image.h @@ -46,6 +46,7 @@ public: void draw(WINDOW w, int x, int y) const; // @cmember Disegna/modifica l'immagine sullo schermo void draw(WINDOW w, const RCT& dst) const; + void draw(WINDOW win, const RCT& dst, char halign, char valign, char grow) const; // @cmember Disegna l'immagine sulla finestra void draw(WINDOW w, const RCT& dst, const RCT& src) const; // @cmember Setta un pixel @@ -58,9 +59,9 @@ public: // @cmember Legge l'immagine dal file XVT_IMAGE load(const char* n); // @cmember Legge l'immagine dal file di risorse - XVT_IMAGE load(short id); + XVT_IMAGE load(int id); // @cmember Legge l'immagine dal file di risorse - XVT_IMAGE load_icon(short id); + XVT_IMAGE load_icon(int id); // @cmember Controlla che l'immagine sia un oggetto valido (diverso da NULL) virtual bool ok() const @@ -77,8 +78,8 @@ public: { return _src; } // @cmember Setta i colori dell'immagine in modo da renderla trasparente - // usando i colori di default (di Morpurgo) - void convert_to_default_colors(); + // usando i colori di default (dell'obsoleto Morpurgo) + // void convert_to_default_colors(); // @cmember Setta i colori dell'immagine in modo da renderla trasparente // usando l'angolo in alto a sinistra dell'imagine stessa @@ -98,14 +99,13 @@ public: // @cmember Costruttore. Viene passato il nome del file TImage(const char* n); // @cmember Costruttore. Viene passato l'identificatore dell'immagine sul file di risorsa - TImage(short id, bool is_icon = false); - // @cmember Costruttore. Viene passata l'immagine e le sue diemsioni + TImage(int id, bool is_icon = false); + // @cmember Costruttore. Viene passata l'immagine e le sue dimensioni TImage(const TImage& i, short width = -1, short height = -1); - // @cmember Costruttore. Viene passata l'immagine e le sue diemsioni - TImage(short width, short height, XVT_IMAGE_FORMAT fmt = XVT_IMAGE_CL8); + // @cmember Costruttore. Viene passata l'immagine e le sue dimensioni + TImage(short width, short height, XVT_IMAGE_FORMAT fmt); // @cmember Distruttore virtual ~TImage(); }; - #endif diff --git a/include/isam.cpp b/include/isam.cpp index 50605e64e..219ccc787 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -4078,7 +4078,7 @@ TRecfield::TRecfield(TRectype& rec, const char* name, int from, int to) _p += from; if (to >= 0) { - CHECK(from <= to && to <= rd.Fd[nf].Len, "Invalid Range"); + CHECKS(from <= to && to <= rd.Fd[nf].Len, "Invalid Range on field ", _name); _len = to - from + 1; } else diff --git a/include/maskfld.cpp b/include/maskfld.cpp index 9968969dc..695c2fbf1 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -506,6 +506,11 @@ const TString& TMask_field::get() const return EMPTY_STRING; } +long TMask_field::get_long() const +{ + return atol(get()); +} + void TMask_field::set_default(const char*) { NFCHECK("Only loadables can have a default"); @@ -4761,18 +4766,15 @@ const char* TList_field::win2raw(const char* data) const TToken_string& codes = ((TList_field*)this)->_codes; TToken_string& value = ((TList_field*)this)->_values; - _ctl_data._park = data; // data puo' venire da una TToken_string::get - int pos = 0; + TString80 str = data; // data puo' venire da una TToken_string::get + int pos = value.get_pos(str); + if (pos < 0) // Ci riprovo coi codici + pos = codes.get_pos(str); - 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()) + if (pos < 0 && (str.blank() || str == "0")) { - _ctl_data._park = codes.get(0); // Uso codes come riferimento per blank - if (_ctl_data._park.blank()) + str = codes.get(0); // Uso codes come riferimento per blank + if (str.blank() || str == "0") pos = 0; } @@ -4786,15 +4788,15 @@ const char* TList_field::raw2win(const char* data) const TToken_string& codes = ((TList_field*)this)->_codes; TToken_string& value = ((TList_field*)this)->_values; - _ctl_data._park = data; // data puo' venire da una TToken_string::get - int pos = codes.get_pos(_ctl_data._park); - if (pos < 0 && _ctl_data._park.blank()) + TString80 str = data; // data puo' venire da una TToken_string::get + int pos = codes.get_pos(str); + if (pos < 0 && (str.blank() || str == "0")) { - _ctl_data._park = codes.get(0); - if (_ctl_data._park.blank()) + str = codes.get(0); + if (str.blank() || str == "0") pos = 0; } - CHECKS(pos >= 0, "Unknown listbox code:", (const char*)_ctl_data._park); + CHECKS(pos >= 0, "Unknown listbox code:", data); return value.get(pos); } diff --git a/include/maskfld.h b/include/maskfld.h index 74d32a48a..d2b674409 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -346,6 +346,7 @@ public: // @cmember Ritorna il contenuto del campo virtual const TString& get() const; + virtual long get_long() const; // @cmember Ritorna il default del campo virtual const TString& get_default() const; diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 5faed3430..548fc6dd8 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -978,7 +978,7 @@ void TSpreadsheet::notify_change() xvtil_statbar_refresh(); set_dirty(); } - _row_dirty = _cell_dirty = TRUE; // Era tra le graffe + _row_dirty = _cell_dirty = true; // Era tra le graffe } const char* TSpreadsheet::copy_cell2field(XI_OBJ* cell) @@ -998,9 +998,7 @@ const char* TSpreadsheet::copy_cell2field(XI_OBJ* cell) { if (_edit_field->class_id() == CLASS_ZOOM_FIELD) _edit_field->set(row(_cur_rec).get(cid2index(_edit_field->dlg()))); - const char* val = _edit_field->is_kind_of(CLASS_LIST_FIELD) ? txt : - (const char*)((TEditable_field*)_edit_field)->win2raw(txt); - + const char* val = (const char*)((TEditable_field*)_edit_field)->win2raw(txt); _edit_field->set(val); _edit_field->set_dirty(); // Get it dirty! } @@ -1009,14 +1007,14 @@ const char* TSpreadsheet::copy_cell2field(XI_OBJ* cell) bool TSpreadsheet::off_cell_handler(XI_OBJ *cell) { - bool ok = TRUE; + bool ok = true; if (_edit_field != NULL) { const char* nuo = copy_cell2field(cell); if (_edit_field->on_key(_edit_field->is_edit() ? K_TAB : K_SPACE) == FALSE) // Test it ok = *nuo == '\0'; // Se e' vuoto lascia stare else - _cell_dirty = FALSE; + _cell_dirty = false; if (_row_dirty) { owner().mask().notify_focus_field(id()); // A volte si diverte a perdere il focus @@ -1112,7 +1110,13 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) switch (e->class_id()) { case CLASS_LIST_FIELD: - break; // Leave code as is + { + const TList_field& lst = *(TList_field*)f; + TToken_string codes = lst.get_codes(); + TToken_string values = lst.get_values(); + src = xvtil_get_cell_selection(obj[num], codes.get_pos(src), codes, values); + } + break; case CLASS_BOOLEAN_FIELD: if (*src <= ' ') xiev->v.cell_request.icon_rid = ICO_CHECK_OFF; @@ -1544,14 +1548,15 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) notify_change(); bool ok = TRUE; - if (k == K_F9 && _edit_field->is_kind_of(CLASS_LIST_FIELD)) // list + if (k == K_F9 && _edit_field->is_kind_of(CLASS_LIST_FIELD)) // list or radio { XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col); const TList_field& lst = (const TList_field&)(*_edit_field); - TToken_string codes = lst.get_codes(); - TToken_string values = lst.get_values(); - xvtil_drop_down_list(&cell, codes, values); - copy_cell2field(); + const int sel = xvtil_drop_down_list(&cell, lst.get_codes(), lst.get_values()); + if (sel >= 0) + { + const char* val = copy_cell2field(); + } } else // edit_field { @@ -1688,6 +1693,26 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) if (k > K_CTRL) { refused = TRUE; + } 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) + { + case K_RIGHT: changed = lst.select_next(); break; + case K_LEFT : changed = lst.select_prev(); break; + default : changed = (k >= ' ' && k <= 'z') && lst.select_by_initial(char(k)); break; + } + if (changed) + { + XI_OBJ cell; XI_MAKE_CELL(&cell, _obj, _cur_row, _cur_col); + xi_set_text(&cell, (char*)lst.raw2win(lst.get())); + _cell_dirty = TRUE; + } + refused = TRUE; } else if (is_edit_key(k)) { @@ -1702,36 +1727,9 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) refused = true; 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) - { - case K_RIGHT: - changed = lst.select_next(); - break; - case K_LEFT: - changed = lst.select_prev(); - break; - default: - if (k >= ' ' && k <= 'z') - changed = lst.select_by_initial(char(k)); - break; - } - if (changed) - { - 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; - } - break; - } + } + break; + } } break; case XIE_XVT_EVENT: @@ -3261,7 +3259,6 @@ TRectype* TSheet_field::putkey(const TRelation& r) { if (_sheetfile) { - // ******* // costruisce la chiave per il record array _sheetfile->zero(); _file_k_ids.restart(); diff --git a/include/printapp.cpp b/include/printapp.cpp index 0f194289d..2ed2156d7 100755 --- a/include/printapp.cpp +++ b/include/printapp.cpp @@ -1539,14 +1539,14 @@ bool TPrint_application::print_one ( bool TPrint_application::menu(MENU_TAG m) { // funziona da se' fino a 20 voci della menubar - if (m >= BAR_ITEM (1) && m <= BAR_ITEM (20)) + if (m >= BAR_ITEM_ID(1) && m <= BAR_ITEM_ID(20)) { _last_choice = m; - do_print((m - BAR_ITEM (0)) / 100); + do_print((m - BAR_ITEM_ID(0)) / 100); } // Se non esistono altre voci di menu termina l'applicazione - return xvtil_test_menu_tag (BAR_ITEM (2)); + return xvtil_test_menu_tag (BAR_ITEM_ID(2)); } bool TPrint_application::create() @@ -1592,12 +1592,12 @@ void TPrint_application::disable_print_menu() void TPrint_application::enable_setprint_menu() { - enable_menu_item(BAR_ITEM (1), TRUE); + enable_menu_item(BAR_ITEM_ID(1), TRUE); } void TPrint_application::disable_setprint_menu() { - enable_menu_item (BAR_ITEM (1), FALSE); + enable_menu_item (BAR_ITEM_ID(1), FALSE); } TPrint_application::TPrint_application ():TApplication (), _rows (100), @@ -1621,7 +1621,7 @@ TPrint_application::TPrint_application ():TApplication (), _rows (100), _magic_currency = FALSE; _print_zero = FALSE; - _last_choice = BAR_ITEM (1); + _last_choice = BAR_ITEM_ID(1); } void TPrint_application::reset_files() diff --git a/include/printer.cpp b/include/printer.cpp index e8109fd3e..7bf749d1a 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -124,6 +124,7 @@ bool TPrinter_setup_mask::on_field_event(TOperable_field& o, TField_event e, lon if (_skip_events) return true; + bool ok = true; switch (o.dlg()) { case MSK_PRINTERS: @@ -147,15 +148,24 @@ bool TPrinter_setup_mask::on_field_event(TOperable_field& o, TField_event e, lon case MSK_FONT: if (e == fe_modify) { - TWait_cursor hourglass; const TString& family = o.get(); if (_font != family) { + TWait_cursor hourglass; _font = family; fill_size_list(); } } break; + case MSK_SIZE: + if (e == fe_modify || e == fe_close) + { + const int fs = atoi(o.get()); + const int ls = 72 / get_int(MSK_LINES); + if (fs < ls/2 || fs > 4*ls/3) + ok = yesno_box(TR("La dimensione del carattere non e' adeguata all'interlinea\nSi desidera continuare ugualmente?")); + } + break; case DLG_SETPRINT: if (e == fe_button) { @@ -190,7 +200,7 @@ bool TPrinter_setup_mask::on_field_event(TOperable_field& o, TField_event e, lon default: break; } - return true; + return ok; } TPrinter_setup_mask::TPrinter_setup_mask() diff --git a/include/reprint.cpp b/include/reprint.cpp index b1ca4c8b2..125e1fe4c 100755 --- a/include/reprint.cpp +++ b/include/reprint.cpp @@ -307,6 +307,8 @@ void TPrint_preview_window::update_scroll_range() RCT rct; xvt_vobj_get_client_rect(win(), &rct); pnt.h -= rct.right; if (pnt.h < 0) pnt.h = 0; pnt.v -= rct.bottom; if (pnt.v < 0) pnt.v = 0; + + set_thumb_size(rct.right, rct.bottom); } update_thumb(0, 0); @@ -394,7 +396,7 @@ void TPrint_preview_window::page_select() { TMask m(TR("Ricerca"), 1, 28, 4); - m.add_number(101, 0, TR("Pagina "), 1, 1, 4, "U").check_type(CHECK_REQUIRED); + m.add_number(101, 0, PR("Pagina "), 1, 1, 4, "U").check_type(CHECK_REQUIRED); m.add_button(DLG_OK, 0, "", -12, -1, 10, 2); m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2); if (m.run()) @@ -657,8 +659,8 @@ void TPreview_mask::handler(WINDOW win, EVENT* ep) // Riflessione eventi di scroll if (ep->type == E_HSCROLL || ep->type == E_VSCROLL) ::dispatch_event(_pvf->win().win(), *ep, false); - - TAutomask::handler(win, ep); + else + TAutomask::handler(win, ep); } bool TPreview_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) diff --git a/include/sheet.cpp b/include/sheet.cpp index ab38107e7..60d160843 100755 --- a/include/sheet.cpp +++ b/include/sheet.cpp @@ -1342,7 +1342,21 @@ bool TSheet::export_handler(TMask_field& f, KEY k) if (k == K_SPACE) { TSheet& s = (TSheet&)f.mask(); - TString cap; s.get_caption(cap); + TString cap; s.get_caption(cap); + for (char* buf = cap.get_buffer(); *buf; buf++) + { + switch (*buf) + { + case '?': + case '(': + case ')': + case '/': + case '\\': + case '*': *buf = ' '; break; + default : break; + } + } + cap.strip_spaces(); if (cap.blank()) cap = "export"; TFilename name; diff --git a/include/spotlite.cpp b/include/spotlite.cpp index 18ef482e3..56cd9219f 100755 --- a/include/spotlite.cpp +++ b/include/spotlite.cpp @@ -88,9 +88,12 @@ bool spotlite_send_mail(const TFilename& pdf) { TToken_string to(15, ';'), cc(15, ';'), ccn(15, ';'), attach(pdf, ';'); TString subj, text; - bool ui = true; bool ok = main_app().get_next_mail(to, cc, ccn, subj, text, attach, ui); + if (subj.blank()) + subj.cut(0) << TR("Invio di ") << pdf.name(); + if (!ui && to.empty_items() && cc.empty_items() && ccn.empty_items()) + ui = true; ok = xvt_mail_send(to, cc, ccn, subj, text, attach, ui) != 0; return ok; } diff --git a/include/urldefid.h b/include/urldefid.h index dab8200da..1d4f9ba6d 100755 --- a/include/urldefid.h +++ b/include/urldefid.h @@ -8,11 +8,11 @@ /* @M Identificatori (tag) per i menu e le voci dei menu ad uso di URL */ -#define TASK_MENUBAR 10000 +#define TASK_MENUBAR 10000 -#define MENU_BAR(i) (10001+i) -#define BAR_ITEM(i) (5000+100*i) -#define MENU_ITEM(i) (30000+i) +#define MENU_BAR_ID(i) (10001+i) +#define BAR_ITEM_ID(i) (5000+100*i) +#define MENU_ITEM_ID(i) (30000+i) #define VISWIN_BAR (7000) #define BROWSE_BAR (8000) diff --git a/include/utility.cpp b/include/utility.cpp index 3268ff8d3..8f6888db9 100755 --- a/include/utility.cpp +++ b/include/utility.cpp @@ -593,7 +593,8 @@ bool is_power_station() if (ps < 0) { ps = FALSE; - if (dongle().number() == 0 && dongle().hardware() != _dongle_network) + const TDongle& d = dongle(); + if (d.number() == 0 && d.hardware() != _dongle_network) { const char* const ranger[] = { "ANTARES", "ARCHIMEDE", "BATMOBILE", "KIRK", "MOBILE", "PICARD", "SPOCK", "SULU", "UHURA", NULL }; diff --git a/include/window.cpp b/include/window.cpp index bd3c400d8..9c2297a8e 100755 --- a/include/window.cpp +++ b/include/window.cpp @@ -1076,6 +1076,15 @@ void TScroll_window::set_scroll_max(long maxx, long maxy) } } +void TScroll_window::set_thumb_size(long px, long py) +{ + if (_has_hscroll && px >= 0) + xvt_sbar_set_proportion(win(), HSCROLL, int(px)); + if (_has_vscroll && py >= 0) + xvt_sbar_set_proportion(win(), VSCROLL, int(py >> _shift)); +} + + // @doc EXTERNAL // @mfunc Aggiorna la scrollbar diff --git a/include/window.h b/include/window.h index 742c0df60..86873d70b 100755 --- a/include/window.h +++ b/include/window.h @@ -368,6 +368,8 @@ public: // @cmember Setta punto di massimo scroll void set_scroll_max(long maxx, long maxy); + // @cmember Setta le dimensioni del thumb della scroll bar + void set_thumb_size(long px, long py); // @cmember Aggiorna la scrollbar void update_thumb(long x = -1, long y = -1); diff --git a/include/xvtility.cpp b/include/xvtility.cpp index d733a12d8..9c850d510 100755 --- a/include/xvtility.cpp +++ b/include/xvtility.cpp @@ -169,6 +169,55 @@ RCT& resize_rect( return r; } +RCT& xvtil_align_rect(const RCT& inner, const RCT& outer, char halign, char valign, char grow) +{ + static RCT r; + + const int ow = xvt_rect_get_width(&outer); + const int oh = xvt_rect_get_height(&outer); + int iw = xvt_rect_get_width(&inner); + int ih = xvt_rect_get_height(&inner); + int ix = 0, iy = 0; + if (iw > ow || ih > oh) + { + if (grow == '-' || grow == '*') + { + const double rx = double(ow)/iw; + const double ry = double(oh)/ih; + const double r = rx < ry ? rx : ry; + ih = int(ih*r); + iw = int(iw*r); + } + } else + if (iw < ow && ih < oh) + { + if (grow == '+' || grow == '*') + { + const double rx = double(ow)/iw; + const double ry = double(oh)/ih; + if (rx < ry) + ih = int(ih*rx); + else + iw = int(iw*ry); + } + } + switch (halign) + { + case 'R': ix = outer.right-iw; break; + case 'C': ix = (outer.left + outer.right - iw) / 2; break; + default : break; + } + switch (valign) + { + case 'B': iy = outer.bottom-ih; break; + case 'C': iy = (outer.top + outer.bottom - ih) / 2; break; + default : break; + } + xvt_rect_set(&r, ix, iy, ix+iw, iy+ih); + return r; +} + + // @doc EXTERNAL // @func Emette un suono di default @@ -497,11 +546,14 @@ WINDOW xvtil_create_window( flags, EM_ALL, eh, app_data); + CHECK(win, "Can't create a window: XVT error"); + + if (x == 0 && y == 0 && dx == 0 && dy == 0) + xvt_vobj_maximize(win); // Molto piu' preciso di resize_rect(0,0,0,0,parent) // Utile per migliorare il calcolo delle dimensioni dei caratteri xvt_dwin_set_font(win, xvtil_default_font()); - CHECK(win, "Can't create a window: XVT error"); return win; } diff --git a/include/xvtility.h b/include/xvtility.h index 822fecf91..7d431e38c 100755 --- a/include/xvtility.h +++ b/include/xvtility.h @@ -19,6 +19,9 @@ const long E_ADDLINE = 488L; RCT& resize_rect(short x, short y, short dx, short dy, WIN_TYPE wt, WINDOW parent); +// align='L|T','C','R|B' grow= '+','=','-' +RCT& xvtil_align_rect(const RCT& inner, const RCT& outer, char halign, char valign, char grow); + WINDOW xvtil_create_window ( WIN_TYPE wt,