diff --git a/include/array.cpp b/include/array.cpp index 213985635..ca85a2062 100755 --- a/include/array.cpp +++ b/include/array.cpp @@ -672,13 +672,15 @@ TBit_array::~TBit_array() // Certified 100% void TBit_array::set() { - if (_bit) memset(_bit, 0xFF, _size); + if (_bit) + memset(_bit, 0xFF, _size); } // Certified 100% void TBit_array::reset() { - if (_bit) memset(_bit, 0x0, _size); + if (_bit) + memset(_bit, 0x0, _size); } // Certified 99% diff --git a/include/controls.cpp b/include/controls.cpp index 49cd18c87..e90656751 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -1971,18 +1971,26 @@ void TDropDownList::ddl_str_eh(XI_OBJ* itf, XI_EVENT* xiev) } break; case XIE_XVT_EVENT: - if (xiev->v.xvte.type == E_CHAR) + switch (xiev->v.xvte.type) { - const KEY k = xiev->v.xvte.v.chr.ch; - if (k == K_ENTER || k == K_ESC) - ddl->close(); - else + case E_CHAR: { - if (k >= ' ' && k <= 'z') - ddl->select_by_initial(char(k)); - } + 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; } - break; default: break; } @@ -2235,8 +2243,13 @@ bool TListbox_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev) { case XIE_DBL_FIELD: case XIE_BUTTON: - if (!_ddl->is_open() && !_button_blocked) - _ddl->open(); + if (!_button_blocked) + { + if (_ddl->is_open()) + _ddl->close(); + else + _ddl->open(); + } break; case XIE_CHAR_FIELD: { @@ -2269,6 +2282,11 @@ 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)) close(); diff --git a/include/form.cpp b/include/form.cpp index 16bf6fd92..d94c3b453 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -2425,7 +2425,7 @@ void TPrint_section::reset() // Aggiorna tutti i campi bool TPrint_section::update() { - bool ok = TRUE; + bool ok = true; reset(); for (word i = 0; i < fields(); i++) @@ -2433,7 +2433,8 @@ bool TPrint_section::update() if (!field(i).is_section()) { const bool esito = field(i).update(); - if (!esito) ok = FALSE; + if (!esito) + ok = false; } } @@ -2445,7 +2446,6 @@ bool TPrint_section::update() return ok; } - TForm_item* TPrint_section::exist_field(short id) const { TForm_item* f = find_field_everywhere(id,this); diff --git a/include/isamrpc.cpp b/include/isamrpc.cpp index 103de1d2b..72a7031b6 100755 --- a/include/isamrpc.cpp +++ b/include/isamrpc.cpp @@ -1,6 +1,5 @@ -#include #include - +#include #include #include @@ -18,6 +17,7 @@ bool rpc_Start() bool ok = TRUE; if (_client == NULL) { + srand(clock()); _client = new TSocketClient; if (!_client->IsOk()) { @@ -216,7 +216,6 @@ unsigned rpc_DongleYear() static unsigned int CreatePassword(TString& pass) { const int BASE = 19; - srand(clock()); unsigned int num = 0; do { @@ -235,7 +234,7 @@ static unsigned int CreatePassword(TString& pass) num /= BASE; pass.insert(str); } - } while (pass.len() < 6); + } while (pass.len() < 5); return num; } diff --git a/include/printer.cpp b/include/printer.cpp index e2da209bc..a5fa8448d 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -46,7 +46,7 @@ void TPrinter_setup_mask::set_print_rcd(PRINT_RCD* pcd, int size) { _pcd = pcd; _pcd_size = size; - _pdev = ((const char*)pcd)+4; + xvt_print_get_name(pcd, _pdev.get_buffer(), _pdev.size()); } PRINT_RCD* TPrinter_setup_mask::get_print_rcd(int& size) const @@ -148,9 +148,9 @@ bool TPrinter_setup_mask::on_field_event(TOperable_field& o, TField_event e, lon if (xvt_dm_post_page_setup(_pcd)) { // see if user has changed printer - // determine index of currently selected printer - // ACTHUNG! Deep hacking of XVT internals! NON PORTABLE! - const char* name = (const char *)(_pcd) + 4; + // determine name of currently selected printer + TString name; + xvt_print_get_name(_pcd, name.get_buffer(), name.size()); set(MSK_PRINTERS, name, 0x1); } } @@ -1104,18 +1104,15 @@ void TPrinter::set_printrcd() { _print_rcd = xvt_print_create_by_name(&_print_rcd_size, _prname); ok = xvt_print_is_valid(_print_rcd) != 0; - if (!ok) - error_box(FR("Errore di inizializzazione della stampante %s"), (const char*)_prname); } if (!ok) { _print_rcd = xvt_print_create(&_print_rcd_size); + xvt_print_get_name(_print_rcd, _prname.get_buffer(), _prname.size()); ok = xvt_print_is_valid(_print_rcd) != 0; - if (ok) - _prname = ((const char*)_print_rcd)+4; - else - error_box(TR("Errore di inizializzazione della stampante corrente")); } + if (!ok) + error_box(FR("Errore di inizializzazione della stampante %s"), (const char*)_prname); } PRINT_RCD* TPrinter::get_printrcd(int *size) @@ -1294,7 +1291,7 @@ void TPrinter::read_configuration( if (xvt_print_is_valid(_print_rcd)) { init_formlen(); - _prname = (const char*)_print_rcd + 4; // Deep hacking + xvt_print_get_name(_print_rcd, _prname.get_buffer(), _prname.size()); } else { diff --git a/include/progind.cpp b/include/progind.cpp index 76c2a8f6e..70ef63485 100755 --- a/include/progind.cpp +++ b/include/progind.cpp @@ -22,13 +22,10 @@ word TIndwin::measure_text(TToken_string& s, word& maxlen) const } // Certified 70% -TIndwin::TIndwin(long max, const char* txt, bool cancel, bool bar, int div) +TIndwin::TIndwin(long tot, const char* txt, bool cancel, bool bar, int div) : _text(NULL), _cancel(NULL), _bar(0), - _status(0L), _max(max), _flags(0x0) + _status(0L), _max(tot), _flags(0x0) { - if (_max <= 0) - _max = 1; - TToken_string testo(txt, '\n'); word maxlen = div; const word lines = measure_text(testo, maxlen); @@ -57,7 +54,7 @@ TIndwin::TIndwin(long max, const char* txt, bool cancel, bool bar, int div) do_events(); _indwin_count++; - _start_time = clock(); + setmax(tot); } // @doc EXTERNAL @@ -86,6 +83,12 @@ void TIndwin::set_text( } } +void TIndwin::setmax(long m) +{ + _max = m <= 0 ? 1 : m; + _start_time = clock(); +} + TIndwin::~TIndwin() { if (is_open()) diff --git a/include/progind.h b/include/progind.h index eb39535e2..7a6ac3b43 100755 --- a/include/progind.h +++ b/include/progind.h @@ -90,6 +90,9 @@ public: // @cmember Setta il testo della finestra void set_text(const char* t); + // @cmember Setta il valore massimo della barra d'attesa + void setmax(long m); + // @cmember Costruttore TIndwin(long max, const char* txt, bool cancel = TRUE, bool bar = TRUE, int div = 60); // @cmember Distruttore @@ -106,9 +109,6 @@ class TProgind : public TIndwin { // @access Public Member public: - // @cmember Setta il valore massimo della barra d'attesa - void setmax(long m) - { _max = m; } // @cmember Setta lo stato della barra d'attesa bool setstatus(long l); // @cmember Aggiorna la barra d'attesa aggiungendo l'incremento fatto dell'applicazione diff --git a/include/relapp.cpp b/include/relapp.cpp index 59e174f27..bb685dcbf 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -1030,8 +1030,19 @@ bool TRelation_application::save(bool check_dirty) if (annulla) { + TMask_field& ff = _mask->focus_field(); + if (ff.focusdirty() && ff.is_edit()) // I need simulate tab on the current field! + { + if (!ff.on_key(K_TAB)) + { + _mask->first_focus(-ff.dlg()); + was_dirty = TRUE; + return FALSE; + } + } if (!_mask->check_fields()) // Exit with ESC didn't check values { + // check_fields sets the focus on the blocking field _mask->first_focus(-_mask->focus_field().dlg()); was_dirty = TRUE; return FALSE;