diff --git a/include/controls.cpp b/include/controls.cpp index 5a3714f2c..e6183cc33 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -802,13 +802,12 @@ TText_control::TText_control(WINDOW win, short cid, COLOR color; TString t = parse_caption(text, bold, color); t.rtrim(); - if (width <= 0) - { + if (width <= 0) width = t.len(); - if (bold) - width = 4 * width / 3; - } - XI_RCT rct; coord2rct(win, left, top, width, height, rct); rct.right += XI_FU_MULTIPLE / 2; + + XI_RCT rct; coord2rct(win, left, top, width, height, rct); + rct.right += bold ? (width*XI_FU_MULTIPLE/4) : XI_FU_MULTIPLE/2; + const unsigned long attrib = flags2attr(flags); XI_OBJ_DEF* def = xi_add_text_def(NULL, cid, &rct, attrib, (char*)(const char*)t); CHECKS(def, "Can't create the definition of TText_control:", text); @@ -817,7 +816,11 @@ TText_control::TText_control(WINDOW win, short cid, def->v.text->font_id = xvt_default_font(TRUE); _obj = xi_create(get_interface(win), def); CHECKS(_obj, "Can't create TText_control ", text); - + + // Alza di un pixel il rettangolo per allinearlo meglio agli edit field + RCT& tr = _obj->v.text->rct; + tr.top--; tr.bottom--; + xi_dequeue(); xi_tree_free(def); } @@ -850,12 +853,21 @@ TGroupbox_control::TGroupbox_control(WINDOW win, short cid, def->v.rect->hilight_color = MASK_LIGHT_COLOR; def->v.rect->back_color = MASK_BACK_COLOR; def->v.rect->shadow_color = MASK_DARK_COLOR; - def->v.rect->well = strchr(flags, 'R') ? FALSE : TRUE; + + const bool erre = strchr(flags, 'R') != NULL; + if (erre) + { + def->v.rect->well = TRUE; // Mette in rilievo il rettangolo + change_attrib(XI_ATR_RJUST, FALSE, _obj); // Toglie l'erroneo allineamento a destra del titolo + } _rct = xi_create(get_interface(win), def); CHECKD(_rct, "Can't create Groupbox_control ", cid); + RCT& rt = _obj->v.text->rct; + rt.top--; rt.bottom--; + xi_dequeue(); - xi_tree_free(def); + xi_tree_free(def); } void TGroupbox_control::show(bool on) @@ -1184,7 +1196,7 @@ void TPushbutton_control::update() { PNT p; p.v = y; p.h = px; xvt_dwin_draw_set_pos(w, p); - p.h += i.height(); + p.v += i.height(); xvt_dwin_draw_line(w, p); } } @@ -1235,13 +1247,13 @@ TRadiobutton_control::TRadiobutton_control(WINDOW win, short cid, XI_RCT rct; coord2rct(win, left, top, width, height, rct); // Aggiusta rettangolo in modo da centrare i bottoni - const int extra = (rct.bottom - rct.top - tot * XI_FU_MULTIPLE) / 2; + const int extra = rct.bottom - rct.top - tot * XI_FU_MULTIPLE; if (extra > 0) - { - rct.top += extra; - rct.bottom -= extra; - } - + rct.top += extra / 2; + else + if (extra < 0) + rct.bottom -= extra; + XI_OBJ_DEF* def = xi_add_container_def(NULL, cid, &rct, orient, cid); def->app_data = (long)this; diff --git a/include/mask.cpp b/include/mask.cpp index 0bc03e40c..ca9a229eb 100755 --- a/include/mask.cpp +++ b/include/mask.cpp @@ -99,8 +99,8 @@ void TMask::read_mask( CHECKD(_pages < MAX_PAGES, "Maschera con troppe pagine: ", _pages); WINDOW w = read_page(scanner, FALSE); - char* title = &__tmp_string[512]; - xvt_vobj_get_title(w, title, 80); + TString title(80); + xvt_vobj_get_title(w, (char*)(const char*)title, title.size()); captions.add(title); _pagewin[_pages++] = w; @@ -698,20 +698,20 @@ WINDOW TMask::read_page( } bool orecchie = _pagewin[0] != NULL_WIN || toolwin(); - if (!orecchie && !toolbar) + if (!orecchie && !toolbar) // Controlla se la maschera ha piu' di una pagina { - const streampos pos = scanner.tellg(); - const TString& l = scanner.line(); + const streampos pos = scanner.tellg(); // Memorizza posizione dello scanner + TString l(scanner.line().left(2)); while (l != "EN" && l.not_empty()) { - if (l == "PA") + if (l == "PA") // Ho trovato un'altra pagina! { - orecchie = TRUE; + orecchie = TRUE; // Quindi devo metterci le orecchie break; } - scanner.line(); + l = scanner.line().left(2); } - scanner.seekg(pos); + scanner.seekg(pos); // Ripristin aposizione dello scanner } WINDOW w; @@ -900,13 +900,13 @@ void TMask::set(short fld_id, long n, bool hit) void TMask::set(short fld_id, const real& n, bool hit) { - CHECK(field(fld_id).class_id() == CLASS_REAL_FIELD, "Can't set a real value in a non-number field"); + CHECK(field(fld_id).is_kind_of(CLASS_REAL_FIELD), "Can't set a real value in a non-number field"); set(fld_id, n.string(), hit); } void TMask::set(short fld_id, const TDate& d, bool hit) { - CHECK(field(fld_id).class_id() == CLASS_DATE_FIELD, "Can't set a date in a non-date field"); + CHECK(field(fld_id).is_kind_of(CLASS_DATE_FIELD), "Can't set a date in a non-date field"); set(fld_id, d.string(), hit); } @@ -944,7 +944,8 @@ void TMask::enable( f.enable(on); } } - else field(fld_id).enable(on); + else + field(fld_id).enable(on); } @@ -1101,7 +1102,8 @@ void TMask::show_default( void TMask::autoload(const TRelation& r) { - for (int i = fields()-1; i >= 0; i--) + const int max = fields(); + for (int i = 0; i < max; i++) { TMask_field& f = fld(i); if (f.is_editable()) @@ -1111,8 +1113,9 @@ void TMask::autoload(const TRelation& r) void TMask::autosave(TRelation& r) const -{ - for (int i = fields()-1; i >= 0; i--) +{ + const int max = fields(); + for (int i = 0; i < max; i++) { TMask_field& f = fld(i); if (f.is_editable()) @@ -1609,7 +1612,6 @@ void TMask::copy_values( } } - const char* TMask::get_caption() const { char* title = &__tmp_string[512]; diff --git a/include/maskfld.cpp b/include/maskfld.cpp index c9b9a0560..817688a1b 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -2922,6 +2922,10 @@ TDate_field::TDate_field(TMask* m) : TEdit_field(m) word TDate_field::class_id() const { return CLASS_DATE_FIELD; } +// Certified 100% +bool TDate_field::is_kind_of(word cid) const +{ return cid == CLASS_DATE_FIELD || TEdit_field::is_kind_of(cid); } + void TDate_field::create(WINDOW w) { // Elimina il flag R che si interpreta come salva in formato ANSI @@ -3083,6 +3087,10 @@ TReal_field::TReal_field(TMask* m) : TEdit_field(m) word TReal_field::class_id() const { return CLASS_REAL_FIELD; } +// Certified 100% +bool TReal_field::is_kind_of(word cid) const +{ return cid == CLASS_REAL_FIELD || TEdit_field::is_kind_of(cid); } + void TReal_field::create(WINDOW w) { _ctl_data._flags.strip("AFM"); diff --git a/include/maskfld.h b/include/maskfld.h index b730bbefa..98110dd0a 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -1016,6 +1016,9 @@ class TReal_field : public TEdit_field protected: // TMask_field // @cmember Ritorna l'identificatore della calsse virtual word class_id() const; + + virtual bool is_kind_of(word cid) const; + // @cmember Crea il controllo virtual void create(WINDOW parent); @@ -1088,7 +1091,9 @@ protected: // TEditable_field // @access Public Member public: // @cmember Legge un item del controllo dal file

- void parse_head(TScanner& scanner); + virtual void parse_head(TScanner& scanner); + + virtual bool is_kind_of(word cid) const; // @cmember Costruttore TDate_field(TMask* mask); diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 2309766d6..b41659ebf 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -667,14 +667,14 @@ void TSpreadsheet::update( if (!scroll) { xi_get_visible_rows(_obj, &first, &last); - scroll = items() < handle[first]; + scroll = items() <= handle[first]; } if (scroll) xi_scroll(_obj, XI_SCROLL_FIRST); else -// xi_scroll_rec(_obj, handle[first], NORMAL_COLOR, XI_ATR_ENABLED | XI_ATR_AUTOSELECT, 0); - xi_scroll(_obj, 0); + xi_scroll_rec(_obj, handle[first], NORMAL_COLOR, XI_ATR_ENABLED | XI_ATR_AUTOSELECT, 0); +// xi_scroll(_obj, 0); _needs_update = -1; // Clear pending row update }