diff --git a/include/maskfld.cpp b/include/maskfld.cpp index 31d94cbd0..c391da032 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -109,15 +109,6 @@ TMask_field::~TMask_field() if (_field) delete _field; } - -// Certified 100% -bool TMask_field::is_edit() const -{ - const word c = class_id(); - return c == CLASS_EDIT_FIELD || c == CLASS_REAL_FIELD || c == CLASS_DATE_FIELD; -} - - // Certified 100% const char* TMask_field::class_name() const { return "Field"; } diff --git a/include/maskfld.h b/include/maskfld.h index b1d6503f8..e995cbe2e 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -271,8 +271,8 @@ public: void set_handler(CONTROL_HANDLER handler) { _handler = handler; } - // @cmember Ritorna TRUE se il campo e' editabile - bool is_edit() const; + // @cmember Ritorna TRUE se il campo e' di tipo edit + virtual bool is_edit() const { return FALSE; } // @cmember Permette di spedire il check bool to_check(KEY k, bool checkrun = FALSE) const; @@ -403,6 +403,8 @@ protected: virtual void parse_head(TScanner& scanner); // @cmember Legge un item del controllo dal file
virtual bool parse_item(TScanner& scanner);
+
+ virtual bool is_edit() const { return TRUE; }
// @cmember Crea il controllo
virtual void create(WINDOW parent);
diff --git a/include/msksheet.cpp b/include/msksheet.cpp
index a633d813e..39e394149 100755
--- a/include/msksheet.cpp
+++ b/include/msksheet.cpp
@@ -90,8 +90,11 @@ class TSpreadsheet : public TWindow
// @access Protected Member
protected:
//@cmember Gestisce gli eventi delle celle (chiamata dal
TMask_field* col2field(int pos) const;
@@ -674,6 +677,21 @@ HIDDEN void XVT_CALLCONV1 xiev_handler(XI_OBJ *itf, XI_EVENT *xiev)
TSpreadsheet* es = (TSpreadsheet*)xi_get_app_data(itf);
CHECK(es, "NULL Edit sheet in xi event");
es->list_handler(xiev);
+}
+
+bool TSpreadsheet::off_cell_handler(XI_OBJ *cell)
+{
+ bool ok = TRUE;
+ if (_edit_field != NULL)
+ {
+ const char* nuo = _edit_field->picture_data(xi_get_text(cell, NULL, -1), TRUE);
+ _edit_field->set(nuo); // Set new mask value
+ _edit_field->set_dirty(); // Get it dirty!
+ if (_edit_field->on_key(_edit_field->is_edit() ? K_TAB : K_SPACE) == FALSE) // Test it
+ ok = *nuo != '\0';
+ mask2str(_cur_rec); // Update sheet row
+ }
+ return ok;
}
// Certified 75%
@@ -770,26 +788,37 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
break;
case XIE_SELECT:
if (xiev->v.xi_obj->type == XIT_ROW)
- {
+ {
_check_enabled = FALSE;
+ if (_edit_field != NULL && _cell_dirty)
+ {
+ XI_OBJ cell;
+ XI_MAKE_CELL(&cell, _list, _cur_row, _cur_col);
+ off_cell_handler(&cell);
+ }
+
const int oldrec = _cur_rec;
set_pos(xiev->v.select.xi_obj->v.row, xiev->v.select.column);
if (oldrec != _cur_rec)
+ {
_row_dirty = FALSE;
-
- str2mask(_cur_rec);
- update(_cur_rec); // Forces update delayed by str2mask
+ str2mask(_cur_rec);
+ update(_cur_rec); // Forces update delayed by str2mask
+ }
if (_mask.id2pos(FIRST_FIELD-1) != -1)
{
- TMask_field* button = &_mask.field(FIRST_FIELD-1);
- button->on_hit();
- if (_mask.dirty())
- {
- notify_change();
- mask2str(_cur_rec);
- }
+ TMask_field& button = _mask.field(FIRST_FIELD-1);
+ if (button.active())
+ {
+ button.on_hit();
+ if (_mask.dirty())
+ {
+ notify_change();
+ mask2str(_cur_rec);
+ }
+ }
}
_check_enabled = TRUE;
}
@@ -901,21 +930,11 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
}
break;
case XIE_OFF_CELL:
- if (_edit_field && _check_enabled)
+ if (_edit_field && _check_enabled && _cell_dirty)
{
_check_enabled = FALSE;
- if (_cell_dirty)
- {
- TMask_field* c = _edit_field; // Save field, it could turn out to be NULL on error
- const char* nuo = c->picture_data(xi_get_text(xiev->v.xi_obj, NULL, -1), TRUE);
- c->set(nuo); // Set new mask value
- c->set_dirty(); // Get it dirty!
- if (c->on_key(c->is_edit() ? K_TAB : K_SPACE) == FALSE) // Test it
- xiev->refused = *nuo != '\0';
-
- if (!xiev->refused)
- mask2str(_cur_rec); // Update sheet row
- }
+ XI_OBJ* cell = xiev->v.xi_obj;
+ xiev->refused = !off_cell_handler(cell);
_check_enabled = TRUE;
}
break;