#include #include #include "777200.h" #include "777200a.h" class TCU_editor : public TAutomask { TTrasferimentoCU* _recset; int _quality; TBit_array _dirty_row; bool _dirty_file; TString _txt; protected: void save_page(); bool save_page_if_dirty(); void load(); void save_file(); bool find_text(); public: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); TCU_editor(const TFilename& fn, int quality); ~TCU_editor() { delete _recset; } }; void TCU_editor::load() { TSheet_field& sheet = sfield(F_PATH); sheet.hide(); sheet.destroy(); const unsigned int cols = _recset->columns(); TString8 name, last; for (unsigned int c = 0; c < cols; c++) { const TRecordset_column_info& ci = _recset->column_info(c); if (ci._type == _nullfld) continue; const TVariant& var = _recset->get(c); if (ci._name.len() == 8 && isdigit(ci._name[2])) name = ci._name; else name.format("%d", int(c+1)); if (name == last) { TToken_string& prev = sheet.row(sheet.items()-1); TString tmp; tmp << prev.get(2) << var.as_string().mid(1); prev.add(tmp, 2); continue; } last = name; TToken_string row; row = name; switch (ci._type) { case _charfld: case _alfafld: row.add(" "); row.add(var.as_string()); break; case _datefld: row.add("D"); row.add(var.as_date().string()); break; case _realfld: row.add("V"); row.add(var.as_string()); break; case _boolfld: row.add("B"); row.add(var.as_bool() ? "1" : "0"); break; default : row.add("N"); row.add(var.as_string()); break; } row.add(ci._name, 3); const int nr = sheet.rows_array().add(row); if (c == 0 || name.len() == 8) sheet.disable_row(nr); } sheet.force_update(); sheet.show(); _dirty_row.reset(); const TFilename n = _recset->query_text(); TString80 msg; msg.format(FR("%s Record n. %ld"), n.name(), _recset->current_row()+1); xvtil_statbar_set(msg); } void TCU_editor::save_page() { TSheet_field& sheet = sfield(F_PATH); TString8 code; FOR_EACH_SHEET_ROW(sheet, r, row) if (_dirty_row[r]) { code = row->get(0); const bool positional = real::is_natural(code); if (positional) { TVariant var = row->get(2); _recset->set_field(atoi(code), var); } } _dirty_row.reset(); } void TCU_editor::save_file() { const TFilename fn = _recset->query_text(); save_page(); if (_recset->save(fn)) _dirty_file = false; else cantwrite_box(fn); } bool TCU_editor::save_page_if_dirty() { bool go = true; if (_dirty_row.first_one() >= 0) { const KEY k = yesnocancel_box(TR("Alcuni campi risultano modificati:\nSi desidera aggiornarli prima di proseguire?")); go = k != K_ESC; if (k == K_YES) save_page(); } return go; } bool TCU_editor::find_text() { _txt.trim(); _txt.upper(); const int txtlen = _txt.len(); if (txtlen <= 0) return false; const TRecnotype cur_pos = _recset->current_row(); TRecnotype best = cur_pos; double score = (txtlen-1.1)/txtlen; TString str; while (score < 1.0) { if (!_recset->move_next()) if (!_recset->move_first()) break; if (_recset->current_row() == cur_pos) break; const unsigned int cols = _recset->columns(); for (unsigned int i = 1; i < cols; i++) { const TVariant& var = _recset->get(i); if (var.type() == _alfafld) { str = var.as_string(); str.trim(); const int slen = str.len(); if (slen >= txtlen-1) { str.upper(); if (str.find(_txt) >= 0) { best = _recset->current_row(); score = 1.0; break; } else { if (score > 0.75) // Provo a cercare la sottostringa pił simile { for (int i = str.find(_txt[0]); i >= 0; i = str.find(_txt[0], i+1)) { const double k = xvt_str_fuzzy_compare(str.mid(i, txtlen), _txt); if (k > score) { best = _recset->current_row(); score = k; } } } } } } } } _recset->move_to(best); return best != cur_pos; } bool TCU_editor::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case DLG_FIRSTREC: if (e == fe_button && save_page_if_dirty() && _recset->move_first()) load(); return false; case DLG_PREVREC : if (e == fe_button && save_page_if_dirty() && _recset->move_prev()) load(); return false; case DLG_NEXTREC : if (e == fe_button && save_page_if_dirty() && _recset->move_next()) load(); return false; case DLG_LASTREC : if (e == fe_button && save_page_if_dirty() && _recset->move_last()) load(); return false; case DLG_PREVIEW : { const TFilename fn = _recset->query_text(); if (fn.exist()) print_cu(fn, _quality); } return false; case DLG_SAVEREC: if (e == fe_button && _dirty_file) { save_file(); o.enable(_dirty_file); } break; case DLG_FINDREC: if (e == fe_button) { ::xvt_dm_post_string_prompt(TR("Inserire il codice da ricercare"), _txt.get_buffer(81), 80); if (_txt.full() && save_page_if_dirty()) { if (find_text()) load(); else warning_box("Nessuna corrispondenza"); } return false; } break; case F_PATH: switch (e) { case fe_init : if (jolly <= 0) load(); break; case fe_close : if (_dirty_file) { const KEY k = yesnocancel_box(TR("Alcuni record risultano modificati:\nSi desidera salvare il file?")); if (k == K_ESC) return false; if (k == K_YES) save_file(); } break; case se_notify_modify: if (o.shown()) { _dirty_row.set(jolly); enable(DLG_SAVEREC, _dirty_file = true); } break; case se_query_modify : return ((TSheet_field&)o).row_enabled(jolly); case se_query_del : return false; default: break; } break; default: break; } return true; } TCU_editor::TCU_editor(const TFilename& fn, int quality) : TAutomask("777200b"), _quality(quality) { _recset = new TTrasferimentoCU(fn, 'r'); _recset->move_first(); enable(DLG_SAVEREC, _dirty_file = false); } void edit_cu(const TFilename& datafile, int quality) { if (datafile.exist()) { TCU_editor m(datafile, quality); m.run(); xvtil_statbar_set(NULL); } else cantread_box(datafile); }