diff --git a/include/about.cpp b/include/about.cpp index e0a26bb10..c19b1f324 100755 --- a/include/about.cpp +++ b/include/about.cpp @@ -423,7 +423,9 @@ TInfo_mask::TInfo_mask() : TProperty_sheet(TR("Informazioni")) add_prop(TR("Libreria PDF"), printer); add_prop(TR("Libreria SQL"), strsql); #ifdef _MSC_VER - add_prop(TR("Libreria C++"), format("%d %d.%d", _MSC_VER/100, _MSC_VER%100/10, _MSC_VER%10)); + const int cver = _MSC_VER / 100 - 6; + const int csub = _MSC_VER % 100; + add_prop(TR("Libreria C++"), format("Microsoft Visual Studio %d.%d", cver, csub)); #endif set_read_only(); diff --git a/include/report.cpp b/include/report.cpp index ce00a0da3..f4b03032c 100755 --- a/include/report.cpp +++ b/include/report.cpp @@ -608,13 +608,19 @@ bool TReport_section::execute_prescript(const TBook& book) bool TReport_section::print_tools(TBook& book) const { - const bool has_pen = border() > 0; - const bool has_brush = pattern() >= PAT_SOLID && back_color() != COLOR_WHITE; + const bool has_pen = border() > 0 && fore_color() != COLOR_INVALID; + const bool has_brush = pattern() >= PAT_SOLID && back_color() != COLOR_WHITE || pattern() == PAT_SPECIAL; const bool visible = has_pen || has_brush; if (visible) { book.set_pen(fore_color(), border()-1); - book.set_brush(back_color(), pattern()); + if (pattern() == PAT_SPECIAL) + { + book.set_text_color(fore_color(), back_color()); // Il background serve come base dello shading + book.set_brush(shade_color(), pattern(), shade_angle()); + } + else + book.set_brush(back_color(), pattern()); } return visible; } @@ -623,15 +629,13 @@ void TReport_section::print(TBook& book) const { if (shown() && active()) { + TReport_rct rct; compute_rect(rct); + if (_size.x <= 0) + rct.set_width(book.logical_page_width()); + if (type() == 'B' && level() <= 0) + rct.set_height(book.logical_page_height()); if (print_tools(book)) { - TReport_rct rct; - compute_rect(rct); - if (_size.x <= 0) - rct.set_width(book.logical_page_width()); - if (type() == 'B' && level() <= 0) - rct.set_height(book.logical_page_height()); - if (radius() > 0) book.draw_round_rectangle(rct, radius()); else @@ -695,9 +699,18 @@ void TReport_section::save(TXmlItem& root) const if (radius() > 0) item.SetAttr("radius", radius()); } - if (pattern() != PAT_HOLLOW) - item.SetAttr("pattern", pattern()); - + switch (pattern()) + { + case PAT_HOLLOW: + break; + case PAT_SPECIAL: + item.SetAttr("sh_angle", shade_angle()); + set_col_attr(item, "sh_color", shade_color(), COLOR_GRAY); + // DO NOT break! + default : + item.SetAttr("pattern", pattern()); + break; + } item.SetAttr("hidden", _hidden); item.SetAttr("deactivated", _deactivated); item.SetAttr("hidden_if_needed", hidden_if_needed()); @@ -753,6 +766,11 @@ void TReport_section::load(const TXmlItem& sec) set_radius(sec.GetIntAttr("radius")); set_back_color(get_col_attr(sec, "bg_color", COLOR_WHITE)); set_fore_color(get_col_attr(sec, "fg_color", COLOR_BLACK)); + if (pattern() == PAT_SPECIAL) + { + set_shade_color(get_col_attr(sec, "sh_color", COLOR_GRAY)); + set_shade_angle(sec.GetIntAttr("sh_angle")); + } force_page_break(sec.GetBoolAttr("page_break")); can_break(sec.GetBoolAttr("can_break")); @@ -882,8 +900,8 @@ TReport_section::TReport_section(TReport& r, char t, int l) _can_break(false), _keep_with_next(false), _repeat(false), _hidden(false), _deactivated(false), _font(NULL), _print_font(NULL), _recordset(NULL), - _bgcolor(COLOR_WHITE), _fgcolor(COLOR_BLACK), _pattern(PAT_HOLLOW), - _border(0), _radius(0) + _bgcolor(COLOR_WHITE), _fgcolor(COLOR_BLACK), _shcolor(COLOR_GRAY), _pattern(PAT_HOLLOW), + _border(0), _radius(0), _shade_angle(0) { } TReport_section::~TReport_section() @@ -1216,9 +1234,10 @@ void TReport_field::copy(const TReport_field& rf) _type = rf.type(); _rct = rf._rct; set_dynamic_height(rf.dynamic_height()); - _fgcolor = rf._fgcolor; _bgcolor = rf._bgcolor; - _border = rf._border; _radius = rf._radius; - _pattern = rf._pattern; _shade_offset = rf._shade_offset; + _fgcolor = rf._fgcolor; _bgcolor = rf._bgcolor; + _txcolor = rf._txcolor; _shcolor = rf._shcolor; + _border = rf._border; _radius = rf._radius; _shade_angle = rf._shade_angle; + _pattern = rf._pattern; _shadow_offset = rf._shadow_offset; _halign = rf._halign; _valign = rf._valign; _picture = rf._picture; _field = rf._field; _hidden = rf.hidden(); @@ -1465,7 +1484,13 @@ bool TReport_field::print_tools(TBook& book) const if (visible) { book.set_pen(fore_color(), border()-1); - book.set_brush(back_color(), pattern()); + if (pattern() == PAT_SPECIAL) + { + book.set_text_color(text_color(), back_color()); + book.set_brush(shade_color(), pattern(), shade_angle()); + } + else + book.set_brush(back_color(), pattern()); } return visible; } @@ -1494,13 +1519,14 @@ const TReport_rct& TReport_field::compute_draw_rect(const TBook& book) const TReport_rct& TReport_field::print_rect(const TReport_rct& rect, TBook& book) const { - if (pattern() == PAT_SOLID && shade_offset() != 0) + const int off = shadow_offset(); + if (off != 0 && pattern() == PAT_SOLID) // Devo stampare l'ombra? { - book.set_pen(COLOR_GRAY, 0); const COLOR color = blend_colors(section().back_color(), COLOR_BLACK, 0.5); + book.set_pen(color, 0); book.set_brush(color, PAT_SOLID); TReport_rct rct = rect; - rct += TReport_size(shade_offset(), shade_offset() * section().report().print_lpi() / print_font().cpi()); + rct += TReport_size(off, off * section().report().print_lpi() / print_font().cpi()); if (radius() > 0) book.draw_round_rectangle(rct, radius()); else @@ -1514,6 +1540,7 @@ const TReport_rct& TReport_field::print_rect(const TReport_rct& rect, TBook& boo else book.draw_rectangle(rect); } + return rect; } @@ -1567,7 +1594,7 @@ void TReport_field::print(TBook& book) const { book.set_font(print_font()); book.set_text_align(horizontal_alignment(), vertical_alignment()); - book.set_text_color(fore_color(), back_color()); + book.set_text_color(text_color(), back_color()); const TReport_rct& pr = print_rect(book); TString8 sec_code; section().code(sec_code); book.draw_text(pr, str, sec_code); @@ -1637,7 +1664,7 @@ void TReport_field::print(TBook& book) const { book.set_font(print_font()); book.set_text_align(horizontal_alignment(), vertical_alignment()); - book.set_text_color(fore_color(), back_color()); + book.set_text_color(text_color(), back_color()); TString8 sec_code; section().code(sec_code); if (dynamic_height() || _rct.height() > 100) // Multiriga? @@ -1712,6 +1739,8 @@ void TReport_field::save(TXmlItem& root) const fld.SetAttr("hide_zero", zeroes_hidden()); set_col_attr(fld, "bg_color", back_color(), COLOR_WHITE); set_col_attr(fld, "fg_color", fore_color(), COLOR_BLACK); + set_col_attr(fld, "txt_color", text_color(), fore_color()); + if (has_font()) _font->save(fld); if (in_group(0)) @@ -1736,10 +1765,20 @@ void TReport_field::save(TXmlItem& root) const if (radius() > 0) fld.SetAttr("radius", radius()); } - if (pattern() != PAT_SOLID) - fld.SetAttr("pattern", pattern()); - else - fld.SetAttr("shade_offset", shade_offset()); + + switch (pattern()) + { + case PAT_HOLLOW: + break; + case PAT_SPECIAL: + fld.SetAttr("sh_angle", shade_angle()); + set_col_attr(fld, "sh_color", shade_color(), COLOR_GRAY); + // DO NOT break! + default : + fld.SetAttr("pattern", pattern()); + break; + } + fld.SetAttr("text", picture()); fld.SetAttr("codval", codval()); fld.SetAttr("link", link()); @@ -1783,9 +1822,15 @@ bool TReport_field::load(const TXmlItem& fld) set_border(fld.GetIntAttr("border")); set_pattern((PAT_STYLE)fld.GetIntAttr("pattern", PAT_SOLID)); set_radius(fld.GetIntAttr("radius")); - set_shade_offset(fld.GetIntAttr("shade_offset")); + set_shadow_offset(fld.GetIntAttr("shade_offset")); set_back_color(get_col_attr(fld, "bg_color", COLOR_WHITE)); set_fore_color(get_col_attr(fld, "fg_color", COLOR_BLACK)); + set_text_color(get_col_attr(fld, "txt_color", fore_color())); + if (pattern() == PAT_SPECIAL) + { + set_shade_color(get_col_attr(fld, "sh_color", COLOR_GRAY)); + set_shade_angle(fld.GetIntAttr("sh_angle")); + } set_horizontal_alignment(get_chr_attr(fld, "align", 'L')); set_vertical_alignment(get_chr_attr(fld, "valign", 'T')); set_picture(fld.GetAttr("text")); @@ -1876,9 +1921,10 @@ int TReport_field::compare(const TSortable& s) const TReport_field::TReport_field(TReport_section* sec) : _section(sec), _id(0), _type('T'), _rct(0,0,1000,100), - _fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE), _pattern(PAT_HOLLOW), - _radius(0), _shade_offset(0), - _border(0), _halign('L'), _valign('T'),_dynamic_height(false), + _txcolor(COLOR_BLACK), _fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE), + _shcolor(COLOR_GRAY), _pattern(PAT_HOLLOW), + _radius(0), _shadow_offset(0), _shade_angle(0), + _border(0), _halign('L'), _valign('T'), _dynamic_height(false), _font(NULL), _print_font(NULL), _hidden(false), _deactivated(false), _hide_zeroes(false), _selected(false), _draw_hidden(false), _draw_deactivated(false) @@ -2787,7 +2833,6 @@ KEY TReport::run_form(TMask& m) return key; } - KEY TReport::run_form(const TString& maskname) { TFilename fname = maskname; fname.ext("msk"); diff --git a/include/report.h b/include/report.h index 1e2543675..6562977b4 100755 --- a/include/report.h +++ b/include/report.h @@ -220,8 +220,8 @@ class TReport_section : public TArray TString _condition, _groupby; bool _page_break, _hidden_if_needed, _can_break, _keep_with_next, _repeat; bool _hidden, _deactivated; - COLOR _fgcolor, _bgcolor; - int _border, _radius; + COLOR _fgcolor, _bgcolor, _shcolor; + int _border, _radius, _shade_angle; PAT_STYLE _pattern; TReport_script _prescript, _postscript; @@ -260,12 +260,17 @@ public: COLOR fore_color() const { return _fgcolor; } void set_back_color(COLOR c) { _bgcolor = c; } COLOR back_color() const { return _bgcolor; } + void set_shade_color(COLOR c) { _shcolor = c; } + COLOR shade_color() const { return _shcolor; } + void set_border(int b) { _border = b; } short border() const { return _border; } void set_pattern(PAT_STYLE p) { _pattern = p; } PAT_STYLE pattern() const { return _pattern; } void set_radius(int r) { _radius = r; } - short radius() const { return _radius; } + int radius() const { return _radius; } + void set_shade_angle(int a) { _shade_angle = a; } + int shade_angle() const { return _shade_angle; } bool page_break() const { return _page_break; } void force_page_break(bool pb) { _page_break = pb; } @@ -334,8 +339,8 @@ class TReport_field : public TSortable int _id; char _type; // Text, String, Numeric, Price, Valuta, Date, Boolean, Line, Rectangle, Image TReport_rct _rct; // In centesimi - COLOR _fgcolor, _bgcolor; - int _border, _radius, _shade_offset; + COLOR _fgcolor, _bgcolor, _txcolor, _shcolor; // Foreground (pen), background (brush), text, shadow + int _border, _radius, _shadow_offset, _shade_angle; PAT_STYLE _pattern; char _halign, _valign; bool _dynamic_height; @@ -440,7 +445,6 @@ public: const TString& groups() const; bool in_group(int group) const; - void set_codval(const char* cod) { _codval = cod; } const TString& codval() const { return _codval; } void set_link(const char* l) { _link = l; } @@ -450,6 +454,10 @@ public: COLOR fore_color() const { return _fgcolor; } void set_back_color(COLOR c) { _bgcolor = c; } COLOR back_color() const { return _bgcolor; } + void set_text_color(COLOR c) { _txcolor = c; } + COLOR text_color() const { return _txcolor; } + void set_shade_color(COLOR c) { _shcolor = c; } + COLOR shade_color() const { return _shcolor; } COLOR link_color() const; void set_border(int b) { _border = b; } @@ -458,8 +466,10 @@ public: PAT_STYLE pattern() const { return _pattern; } void set_radius(int r) { _radius = r; } short radius() const { return _radius; } - void set_shade_offset(int s) { _shade_offset = s; } - short shade_offset() const { return _shade_offset; } + void set_shadow_offset(int s) { _shadow_offset = s; } + int shadow_offset() const { return _shadow_offset; } + void set_shade_angle(int a) { _shade_angle = a; } + int shade_angle() const { return _shade_angle; } void set_horizontal_alignment(char a) { _halign = a; } char horizontal_alignment() const { return _halign; } diff --git a/include/reprint.cpp b/include/reprint.cpp index 13057b9ec..496022c04 100755 --- a/include/reprint.cpp +++ b/include/reprint.cpp @@ -1074,13 +1074,17 @@ void TBook::set_pen(COLOR color, int width, PEN_STYLE style) } } -void TBook::set_brush(COLOR color, PAT_STYLE pattern) +void TBook::set_brush(COLOR color, PAT_STYLE pattern, int shade_angle) { - if (_tools.brush.color != color || _tools.brush.pat != pattern) + if (_tools.brush.color != color || _tools.brush.pat != pattern || shade_angle != _shade_angle) { _tools.brush.color = color; _tools.brush.pat = pattern; - *_out << "" << endl; + _shade_angle = shade_angle; + *_out << "" << endl; } } @@ -1242,6 +1246,7 @@ bool TBook::print_page(TWindow& win, size_t page) WINDOW w = win.win(); const bool preview = w != PRINTER_WIN; + int shade_angle = 0; RCT visible; if (preview) { @@ -1351,13 +1356,14 @@ bool TBook::print_page(TWindow& win, size_t page) } if (str.starts_with(" + // const COLOR col = str.get_long(1); const PAT_STYLE pat = (PAT_STYLE)str.get_long(); if (pat <= PAT_HOLLOW) win.hide_brush(); else win.set_brush(col, pat); + shade_angle = (pat == PAT_SPECIAL) ? str.get_int() : 0; continue; } if (str.starts_with("") { - xvt_dwin_draw_rect(w, &rct); + DRAW_CTOOLS ct; xvt_dwin_get_draw_ctools(w, &ct); + if (ct.brush.pat == PAT_SPECIAL) + { + if (shade_angle >= 0) + xvt_dwin_draw_gradient_linear(w, &rct, ct.back_color, ct.brush.color, shade_angle); + else + xvt_dwin_draw_gradient_circular(w, &rct, ct.back_color, ct.brush.color, NULL); + if (ct.pen.style != PAT_HOLLOW) + { + win.hide_brush(); + xvt_dwin_draw_rect(w, &rct); + } + } + else + xvt_dwin_draw_rect(w, &rct); continue; } if (str.starts_with(" _page_size.y) // width > height -> landscape - { - ph = _page_size.y; pw = _page_size.x; - xvt_app_escape (XVT_ESC_SET_PRINTER_INFO, _rcd, &ph, &pw, NULL, NULL); - } } else _rcd = printer().get_printrcd(); @@ -1852,13 +1865,19 @@ bool TBook::init() if (!xvt_print_is_valid(_rcd)) return error_box(TR("Stampante non valida")); + long ph, pw, pvr, phr; xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, _rcd, &ph, &pw, &pvr, &phr); - if (pw <= 0 || ph <= 0) return error_box(TR("Dimensioni pagina NULLE")); if (pvr <= 0 || phr <= 0) return error_box(TR("Risoluzione stampante NULLA")); + if (_page_size.x > 0 && (_page_size.x > _page_size.y) != (pw > ph)) // Orientamento incongruente + { + xvt_app_escape (XVT_ESC_SET_PRINTER_INFO, _rcd, &pw, &ph, NULL, NULL); // Scambio dimensioni + xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, _rcd, &ph, &pw, &pvr, &phr); // Rileggo dimensioni e risoluzione + } + _page_size.y = ph * BOOKDPI / pvr; _page_size.x = pw * BOOKDPI / phr; @@ -2121,9 +2140,7 @@ bool TBook::print(size_t pagefrom, size_t pageto, word copies) if (p.printtype() == acrobatprinter) { - TFilename f; - f.tempdir(); f.add("tmp.pdf"); - f.fremove(); + TFilename f; f.temp(NULL, "pdf"); _pdf_file = f; ok = xvt_print_start_thread(main_loop_callback, (long)this) != 0; if (ok && fsize(f) > 0) @@ -2143,7 +2160,10 @@ bool TBook::export_pdf(TFilename& filename, bool signature) bool ok = (pages() > 0) && main_app().has_module(RSAUT); // Controllo paranoico dei permessi if (ok) { - filename.fremove(); // Evita problemi di aggiornamento del pdf: deve sempre rigeneralo! + // Evita problemi di aggiornamento del pdf: deve sempre rigeneralo! + if (filename.exist() && !filename.fremove()) + return error_box(FR("Impossibile riscrivere %s"), (const char*)filename); + _pdf_file = filename; _pagefrom = 1; _pageto = 0; @@ -2236,8 +2256,8 @@ bool TBook::preview() TPreview_mask msk(this); - //gestino anteprima di stampa;se si ha l'anteprima,una volta lanciata la maschera di stampa, si torna.. - //..all'anteprima e non alla maschera del programma (decisivo per stampe con elaborazione lunga) + // gestione anteprima di stampa;se si ha l'anteprima,una volta lanciata la maschera di stampa, si torna + // all'anteprima e non alla maschera del programma (decisivo per stampe con elaborazione lunga) bool go_on = true; while (go_on) { @@ -2337,7 +2357,6 @@ void TPrintind::update_bar() } TPrintind::TPrintind(long n, const char* msg) : TProgind(n, msg, true, true) - { if (ADVANCED_GRAPHICS) { @@ -2701,7 +2720,6 @@ void TReport_book::add_doc(const TString& name) TBook::add_doc(name); } - bool TReport_book::add(TReport& rep, bool progind) { if (!init(rep)) diff --git a/include/reprint.h b/include/reprint.h index dbb995ddc..0b73d7049 100755 --- a/include/reprint.h +++ b/include/reprint.h @@ -21,6 +21,8 @@ class TBook : public TObject TReport_font _font; TRectangle _rect; char _horizontal_alignment, _vertical_alignment; + int _shade_angle; + TReport_image_cache _images; size_t _pagefrom, _pageto; @@ -58,7 +60,7 @@ public: virtual const TFilename & file() const { return _file;} virtual void set_pen(COLOR color, int width = 0, PEN_STYLE style = P_SOLID); - virtual void set_brush(COLOR color, PAT_STYLE pattern = PAT_SOLID); + virtual void set_brush(COLOR color, PAT_STYLE pattern = PAT_SOLID, int shade_angle = 0); virtual void set_font(const TReport_font& font); virtual void set_text_color(COLOR fore, COLOR back = COLOR_WHITE, bool opaque = false); virtual void set_text_align(char halign ='L', char valign = 'T'); diff --git a/include/reputils.cpp b/include/reputils.cpp index 8535b0e33..97b272d53 100755 --- a/include/reputils.cpp +++ b/include/reputils.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -101,6 +102,8 @@ TAS400_report::TAS400_report(TRecordset& asr) void TLog_report::set_title(const char* title) { _title = title; + if (_title.blank()) + _title = main_app().title(); } bool TLog_report::get_usr_val(const TString& name, TVariant& var) const diff --git a/include/reputils.h b/include/reputils.h index 7bd7dd3c1..0532a0567 100755 --- a/include/reputils.h +++ b/include/reputils.h @@ -47,7 +47,7 @@ public: void set_title(const char* title); void kill_duplicates(bool k = true) {_kill_duplicates = k;} const TString& title() const { return _title; } - TLog_report(const char* title, const char* name = "bagn010a"); + TLog_report(const char* title = "", const char* name = "bagn010a"); }; #endif diff --git a/include/validate.cpp b/include/validate.cpp index ece500b4e..213f658aa 100755 --- a/include/validate.cpp +++ b/include/validate.cpp @@ -321,17 +321,17 @@ bool cf_check ( HIDDEN bool _cf_val(TMask_field& f, KEY key) { if (f.mask().query_mode()) - return TRUE; + return true; const TString& cf = f.get(); - bool ok = TRUE; + bool ok = true; - if (cf.empty()) return TRUE; + if (cf.empty()) return true; if (cf.len() == 11 && isdigit(cf[0])) { const TString& stato = f.mask().get(atoi(get_val_param(0))); if (stato.full() && stato != "IT") - return TRUE; + return true; ok = pi_check (stato, cf); } else @@ -341,7 +341,7 @@ HIDDEN bool _cf_val(TMask_field& f, KEY key) if(f.dirty()) { ok = f.yesno_box(TR("Codice fiscale errato: lo accetto ugualmente?")); - if (ok) f.set_dirty(FALSE); + if (ok) f.set_dirty(false); } else ok = true; // Era gia' errato al caricamento quindi lo accetto @@ -483,7 +483,9 @@ HIDDEN bool _xt_cf_val(TMask_field& f, KEY key) const int mn = wm.find(cf[8]) + 1; if (mn > 0) { - const TDate d(gn, mn, 1900 + atoi(cf.mid(6, 2))); + int anno = atoi(cf.mid(6, 2)); + anno += anno < 5 ? 2000 : 1900; + const TDate d(gn, mn, anno); fld_dat.set(d.string()); } }