diff --git a/lv/lv0400.cpp b/lv/lv0400.cpp index 8d7d4f479..fb4000f64 100755 --- a/lv/lv0400.cpp +++ b/lv/lv0400.cpp @@ -1,8 +1,10 @@ #include +#include #include #include #include #include +#include #include "../cg/cglib01.h" @@ -48,6 +50,30 @@ long lv_new_contract(long cliente, int indsped) return codcont; } +class TColor_rule_contract : public TExpression +{ + COLOR _back, _fore, _def_back, _def_fore; + TString _desc, _key; + +public: + const TString& description() const { return _desc; } + const TString& key() const { return _key; } + void default_colors(COLOR& back, COLOR& fore) const { back = _def_back; fore = _def_fore; } + void colors(COLOR& back, COLOR& fore) const { back = _back; fore = _fore; } + void set_colors(COLOR back, COLOR fore) { _back = back; _fore = fore; } + + TColor_rule_contract(const char* desc, const char* expr, TTypeexp type, COLOR back, COLOR fore); +}; + +TColor_rule_contract::TColor_rule_contract(const char* desc, const char* expr, TTypeexp type, COLOR back, COLOR fore) + : TExpression(expr, type), _back(back), _fore(fore), _def_back(back), _def_fore(fore) +{ + _desc = dictionary_translate(desc); + _key = desc; _key.trim(); _key.strip_double_spaces(); + _key.replace(' ', '_'); +} + + ////////////////////////////// //// TCONTRATTI_MSK //// ////////////////////////////// @@ -58,6 +84,7 @@ class TContratti_msk: public TAutomask long _post_contr; TString80 _artrig; int _riga; + TArray _color_rules; protected: void azzera_conguaglio(); @@ -65,9 +92,15 @@ protected: virtual void on_idle(); virtual bool on_field_event(TOperable_field& o,TField_event e,long jolly); + TArray& color_rules() { return _color_rules; } + public: int get_riga(); bool set_riga(const int val); + + void sel_color(); + void highlight(); + void highlight_row(int row = -1, COLOR back = COLOR_INVALID, COLOR fore = COLOR_INVALID, bool dirty = true, bool update = true); TContratti_msk(); }; @@ -84,6 +117,97 @@ void TContratti_msk::azzera_conguaglio() sheet.force_update(); } +void TContratti_msk::highlight_row(int row, COLOR back, COLOR fore, bool dirty, bool update) +{ + TSheet_field& sf = sfield(F_RIGHE); + + if (row < 0) + row = sf.selected(); + + FOR_EACH_ARRAY_ITEM_BACK(color_rules(), rule, o) + { + TColor_rule& expr = *(TColor_rule*)o; + bool on = false; + + // SET VARS + + const int vars = expr.numvar(); + TString name; + for (int i = 0; i < vars; i++) + { + name = expr.varname(i); + if (name.starts_with("DIRTY")) + expr.setvar(i, dirty ? UNO : ZERO); + else + if (name.starts_with("TODAY")) + expr.setvar(i, TDate(TODAY).string()); + else + if (name.starts_with("#")) + { + const short id = atoi(name.mid(1)); + if (id > 0) + { + TToken_string& sheet_row = sf.row(row); + expr.setvar(i, sheet_row.get(sf.cid2index(id))); + } + else + expr.setvar(i, get(-id)); + } + else + if (name.starts_with("48.") || name.starts_with("ANAMAG.")) + { + TToken_string & row = sf.row(sf.selected()); + const TRectype & art = cache().get(LF_ANAMAG, row.get(sf.cid2index(S_CODART))); + const TString& fldname = name.after('.'); + + expr.setvar(i, art.get(fldname)); + } + } + if (expr.as_bool()) + { + expr.colors(back, fore); + break; + } + } + + sf.set_back_and_fore_color(back, fore, row); + if (update) + sf.force_update(row); +} + +void TContratti_msk::highlight() +{ + TSheet_field& sf = sfield(F_RIGHE); + FOR_EACH_SHEET_ROW(sf, i, r) + highlight_row(i, COLOR_INVALID, COLOR_INVALID, false, false); + sf.force_update(); +} +void TContratti_msk::sel_color() +{ + TFilename mask(source_file()); + + TSelect_color_mask sel(mask.name_only(), "0"); + + FOR_EACH_ARRAY_ITEM(color_rules(), i, o) + { + const TColor_rule& col = *(const TColor_rule*)o; + COLOR a, b; col.colors(a, b); + COLOR c, d; col.default_colors(c, d); + sel.add_color(col.key(), col.description(), a, b, c, d); + } + + if (sel.run() != K_ESC) + { + FOR_EACH_ARRAY_ITEM(color_rules(), i, o) + { + TColor_rule& col = *(TColor_rule*)o; + COLOR back, fore; sel.get_color(col.key(), back, fore); + col.set_colors(back, fore); + } + highlight(); + } +} + //ON_ART_SELECT: metodo che riempie i campi delle dotazioni e del consegnato sullo sheet e sulla maschera //e riporta i dati dello sheet nel dettaglio sulla maschera (sotto lo sheet) bool TContratti_msk::on_art_select(TField_event e) @@ -270,6 +394,8 @@ bool TContratti_msk::on_field_event(TOperable_field& o,TField_event e,long jolly f.set_dirty(false); } } + if (e == se_enter || e == se_notify_modify || e == se_query_add || e == se_notify_add) + highlight_row(); //questo pezzo serve per gestire enable e disable dei campi in modo corretto //senza massage in maschera, sia sullo sheet che sul dettaglio @@ -751,6 +877,29 @@ TContratti_msk::TContratti_msk():TAutomask("lv0400a"), _post_contr(0) { if (!ini_get_bool(CONFIG_DITTA, "lv", "Useindsp")) field(F_INDSPED).hide(); + TFilename ininame(source_file()); + + ininame.ext("ini"); + + TConfig prof(ininame.name(), "Colors"); + COLOR back; + COLOR fore; + + prof.write_protect(true); + for (int i = 0; ; i++) + { + const TString& name = prof.get("RuleName", NULL, i); + if (name.full()) + { + const TString& expr = prof.get("Rule", NULL, i); + const TTypeexp type = prof.get_char("RuleType", NULL, i, 'N') == 'S' ? _strexpr : _numexpr ; + back = prof.get_color("BgCol", NULL, i, NORMAL_BACK_COLOR); + fore = prof.get_color("FgCol", NULL, i, NORMAL_COLOR); + color_rules().add(new TColor_rule(name, expr, type, back, fore)); + } + else + break; + } } ////////////////////////////// @@ -787,6 +936,7 @@ protected: virtual void init_modify_mode(TMask& m); bool elimina_planning(const long& codcont, const long& codcf) const; bool kill_planning (TISAM_recordset& selrighe) const; + bool menu(MENU_TAG mt); }; //SAVE_ROWS: questo metodo salva effettivamente le righe vislualizzate sullo sheet sul file @@ -1034,7 +1184,7 @@ int TContratti_app::read(TMask& m) //se non gli ho passato nessun codart, allora dico che voglio dare il focus alla prima riga dello sheet //aktrimenti dico che volgio dare il focus alla riga dello sheet che contiene l'articolo che gli ho passato - if (_codart.empty()) + if (_codart.blank()) _msk->set_riga(0); else if (codart == _codart) @@ -1199,6 +1349,7 @@ void TContratti_app::init_modify_mode(TMask& m) } } } + ((TContratti_msk &)m).highlight(); } //INIT_INSERT_MODE: ridefinizione del metodo init_insert_mode() standard @@ -1249,9 +1400,23 @@ bool TContratti_app::kill_planning (TISAM_recordset& selrighe) const return true; } +bool TContratti_app::menu(MENU_TAG mt) +{ + bool ok = true; + if (mt == MENU_ITEM_ID(1)) + { + if (_msk != NULL) + _msk->sel_color(); + } + else + ok = TRelation_application::menu(mt); + return ok; +} + + int lv0400(int argc, char* argv[]) { TContratti_app app; app.run (argc,argv,TR("Gestione contratti")); return 0; -} \ No newline at end of file +} diff --git a/lv/lv0400a.ini b/lv/lv0400a.ini new file mode 100755 index 000000000..2f05101f9 --- /dev/null +++ b/lv/lv0400a.ini @@ -0,0 +1,9 @@ +[Colors] +RuleName(0) = Dotazione scaduta +Rule(0) = (#115!="")&&(ANSI(#115)