diff --git a/ba/ba8300.cpp b/ba/ba8300.cpp index f3de3c634..9033e891c 100755 --- a/ba/ba8300.cpp +++ b/ba/ba8300.cpp @@ -100,6 +100,24 @@ bool TReport_base_mask::on_field_event(TOperable_field& o, TField_event e, long { switch (o.dlg()) { + case F_FGCOLOR: + if (e == fe_button) + { + _fgcolor = xvt_dm_post_choose_color(win(), _fgcolor); + force_update(); + } + break; + case F_BGCOLOR: + if (e == fe_button) + { + _bgcolor = xvt_dm_post_choose_color(win(), _bgcolor); + force_update(); + } + break; + case F_PATTERN: + if (e == fe_modify) + force_update(); + break; case F_FONT_SELECT: if (e == fe_button) { @@ -240,6 +258,8 @@ void TReport_field_mask::vedo_non_vedo() show(F_DYNAMIC_HEIGHT, type == 'S'); show(F_FGCOLOR, type != 'I'); show(F_BGCOLOR, type != 'L'); + show(F_PATTERN, type != 'L' && type != 'I'); + show(F_RADIUS, type != 'L' && type != 'I'); show(F_FONT_SELECT, is_text); show(F_SOURCE, (is_text || type == 'I') && type != 'T'); show(F_SOURCE2, is_text && type != 'T'); @@ -260,7 +280,14 @@ bool TReport_field_mask::on_field_event(TOperable_field& o, TField_event e, long { case F_TYPE: if (e == fe_init || e == fe_modify) + { vedo_non_vedo(); + if (e == fe_modify) + { + if (strchr("ELR", o.get()[0]) != NULL && get_int(F_BORDER) == 0) + set(F_BORDER, 2); // Propongo un bordo visibile per le linee + } + } break; case F_X: case F_Y: @@ -272,20 +299,6 @@ bool TReport_field_mask::on_field_event(TOperable_field& o, TField_event e, long set_num(o.dlg(), num); // Reformat } break; - case F_FGCOLOR: - if (e == fe_button) - { - _fgcolor = xvt_dm_post_choose_color(win(), _fgcolor); - force_update(); - } - break; - case F_BGCOLOR: - if (e == fe_button) - { - _bgcolor = xvt_dm_post_choose_color(win(), _bgcolor); - force_update(); - } - break; case F_LIST: if (e == fe_close) { @@ -364,6 +377,8 @@ void TReport_field_mask::set_field(const TReport_field& rf) str[0] = rf.vertical_alignment(); set(F_VALIGN, str); set(F_BORDER, rf.border()); + set(F_PATTERN, rf.pattern()); + set_num(F_RADIUS, rf.radius()); _fgcolor = rf.fore_color(); _bgcolor = rf.back_color(); set(F_TEXT, rf.picture()); @@ -389,14 +404,16 @@ void TReport_field_mask::get_field(TReport_field& rf) const rf.set_size(get_num(F_DX), get_num(F_DY)); rf.show(!get_bool(F_HIDDEN)); rf.activate(!get_bool(F_DISABLED)); - rf.hide_zeroes(get_bool(F_HIDE_ZEROES)); + rf.hide_zeroes(field(F_HIDE_ZEROES).active() && get_bool(F_HIDE_ZEROES)); rf.set_dynamic_height(get_bool(F_DYNAMIC_HEIGHT)); rf.set_groups(get(F_GROUPS)); rf.set_codval(get(F_CODVAL)); rf.set_link(get(F_LINK)); rf.set_horizontal_alignment(get(F_HALIGN)[0]); rf.set_vertical_alignment(get(F_VALIGN)[0]); + rf.set_pattern((PAT_STYLE)get_int(F_PATTERN)); rf.set_border(get_int(F_BORDER)); + rf.set_radius(get_num(F_RADIUS)); rf.set_fore_color(_fgcolor); rf.set_back_color(_bgcolor); if (strchr("VP", rf.type()) != NULL) @@ -519,6 +536,7 @@ TReport_sheet::TReport_sheet(TReport_section& sec) class TSection_properties_mask : public TReport_base_mask { protected: + virtual void update(); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void set_num(short id, long num); short get_num(short id) const; @@ -531,6 +549,25 @@ public: TSection_properties_mask(TReport_section& rs); }; +void TSection_properties_mask::update() +{ + for (int i = 0; i < 2; i++) + { + TMask_field& fld = field(i == 0 ? F_FGCOLOR : F_BGCOLOR); + if (fld.active() && fld.parent() == win()) + { + RCT rctfld; fld.get_rect(rctfld); + const int x = rctfld.right / CHARX + 1; + const int y = rctfld.top / ROWY + 1; + RCT& rct = resize_rect(x, y, -3, 1, W_PLAIN, win()); + rct.top = rctfld.top; rct.bottom = rctfld.bottom; + xi_draw_3d_rect((XinWindow)win(), (XinRect*)&rct, TRUE, 2, MASK_LIGHT_COLOR, + i == 0 ? _fgcolor : _bgcolor, MASK_DARK_COLOR); + } + } + TReport_base_mask::update(); +} + void TSection_properties_mask::set_num(short id, long num) { set(id, num2str(num)); @@ -601,7 +638,13 @@ void TSection_properties_mask::set_section(const TReport_section& rs) set(F_REPEAT, rs.repeat_on_page()); set(F_DISABLED, rs.deactivated()); + set(F_BORDER, rs.border()); + set(F_PATTERN, rs.pattern()); + set_num(F_RADIUS, rs.radius()); + _fgcolor = rs.fore_color(); + _bgcolor = rs.back_color(); set_font_info(rs.font()); + set(F_PRESCRIPT, rs.prescript()); set(F_POSTSCRIPT, rs.postscript()); @@ -627,6 +670,11 @@ void TSection_properties_mask::get_section(TReport_section& rs) const rs.keep_with_next(get_bool(F_KEEP_WITH_NEXT)); rs.set_repeat_on_page(get_bool(F_REPEAT)); + rs.set_pattern((PAT_STYLE)get_int(F_PATTERN)); + rs.set_border(get_int(F_BORDER)); + rs.set_radius(get_num(F_RADIUS)); + rs.set_fore_color(_fgcolor); + rs.set_back_color(_bgcolor); TReport_font f; if (get_font_info(f)) rs.set_font(f); @@ -1098,6 +1146,7 @@ void TReport_mask::section_properties() { case K_ENTER: m.get_section(rs); + _tree.goto_node(rs.type(), rs.level()); _is_dirty = true; break; case K_DEL: @@ -1107,7 +1156,6 @@ void TReport_mask::section_properties() const int l = rs.level(); rs.report().kill_section(t, l); _tree.goto_node(t, l-1); - tfield(F_SECTIONS).select_current(); _is_dirty = true; } break; diff --git a/ba/ba8300.h b/ba/ba8300.h index 621eb326f..03becc480 100755 --- a/ba/ba8300.h +++ b/ba/ba8300.h @@ -40,6 +40,8 @@ #define F_SOURCE2 145 #define F_HIDE_DOTS 146 #define F_DYNAMIC_HEIGHT 147 +#define F_RADIUS 148 +#define F_PATTERN 149 #define F_LEVEL 160 #define F_GROUP_BY 161 diff --git a/ba/ba8300a.uml b/ba/ba8300a.uml index 72537e16d..63646404c 100755 --- a/ba/ba8300a.uml +++ b/ba/ba8300a.uml @@ -73,15 +73,14 @@ END TEXT F_REPORT_TITLE BEGIN - PROMPT 41 6 "Corpo di livello 0" + PROMPT 41 7 "Corpo di livello 0" END REPORT F_REPORT -3 -3 BEGIN - PROMPT 21 7 "" + PROMPT 21 8 "" END - BUTTON F_FLD_ADD 10 2 BEGIN PROMPT -16 -1 "Campo +" diff --git a/ba/ba8300b.uml b/ba/ba8300b.uml index 7118a55b8..a515deb16 100755 --- a/ba/ba8300b.uml +++ b/ba/ba8300b.uml @@ -5,13 +5,13 @@ PAGE "Campo" -1 -1 72 17 LIST F_TYPE 1 16 BEGIN PROMPT 1 0 "Tipo " - ITEM "T|Testo" + ITEM "T|Testo fisso" ITEM "S|Stringa" ITEM "N|Numero" ITEM "V|Valuta" ITEM "P|Prezzo" ITEM "D|Data" - ITEM "A|Array" + ITEM "A|Array (Lista)" ITEM "I|Immagine" ITEM "L|Linea" ITEM "R|Rettangolo" @@ -157,20 +157,52 @@ BEGIN PROMPT 2 5 "Colore ~Sfondo" END -BUTTON F_FONT_SELECT 14 2 -BEGIN - PROMPT 2 7 "~Font" -END - LIST F_BORDER 1 12 BEGIN - PROMPT 2 10 "Bordo " + PROMPT 2 7 "Bordo " ITEM "0|Nessuno" + MESSAGE HIDE,F_RADIUS ITEM "1|Sottile" + MESSAGE SHOW,F_RADIUS ITEM "2|Normale" + MESSAGE SHOW,F_RADIUS ITEM "3|Spesso" + MESSAGE SHOW,F_RADIUS END +NUMBER F_RADIUS 3 +BEGIN + PROMPT 32 7 "Raggio smussatura " + FLAGS "U" +END + +LIST F_PATTERN 1 18 +BEGIN + PROMPT 2 8 "Stile " + ITEM "2|Pieno" + MESSAGE SHOW,F_BGCOLOR + ITEM "1|Trasparente" + MESSAGE HIDE,F_BGCOLOR + ITEM "3|Linee orizzontali" + MESSAGE SHOW,F_BGCOLOR + ITEM "4|Linee verticali" + MESSAGE SHOW,F_BGCOLOR + ITEM "5|Diagonali \" + MESSAGE SHOW,F_BGCOLOR + ITEM "6|Diagonali /" + MESSAGE SHOW,F_BGCOLOR + ITEM "7|Griglia" + MESSAGE SHOW,F_BGCOLOR + ITEM "8|Griglia diagonale" + MESSAGE SHOW,F_BGCOLOR +END + +BUTTON F_FONT_SELECT 14 2 +BEGIN + PROMPT 2 10 "~Font" +END + + BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -13 -1 "" diff --git a/ba/ba8300c.uml b/ba/ba8300c.uml index 07f17a817..b6e673d70 100755 --- a/ba/ba8300c.uml +++ b/ba/ba8300c.uml @@ -91,11 +91,6 @@ BEGIN CHECKTYPE REQUIRED END -BUTTON F_FONT_SELECT 10 2 -BEGIN - PROMPT -13 -3 "~Font" -END - BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" @@ -113,6 +108,75 @@ END ENDPAGE +PAGE "Aspetto" -1 -1 72 16 + +LIST F_BORDER 1 12 +BEGIN + PROMPT 2 1 "Bordo " + ITEM "0|Nessuno" + MESSAGE HIDE,F_RADIUS + ITEM "1|Sottile" + MESSAGE SHOW,F_RADIUS + ITEM "2|Normale" + MESSAGE SHOW,F_RADIUS + ITEM "3|Spesso" + MESSAGE SHOW,F_RADIUS +END + +NUMBER F_RADIUS 3 +BEGIN + PROMPT 26 1 "Raggio smussatura " + FLAGS "U" +END + +BUTTON F_FGCOLOR 14 1 +BEGIN + PROMPT 2 2 "Colore ~Bordo" +END + +LIST F_PATTERN 1 18 +BEGIN + PROMPT 2 4 "Sfondo " + ITEM "1|Trasparente" + MESSAGE HIDE,F_BGCOLOR + ITEM "2|Pieno" + MESSAGE SHOW,F_BGCOLOR + ITEM "3|Linee orizzontali" + MESSAGE SHOW,F_BGCOLOR + ITEM "4|Linee verticali" + MESSAGE SHOW,F_BGCOLOR + ITEM "5|Diagonali \" + MESSAGE SHOW,F_BGCOLOR + ITEM "6|Diagonali /" + MESSAGE SHOW,F_BGCOLOR + ITEM "7|Griglia" + MESSAGE SHOW,F_BGCOLOR + ITEM "8|Griglia diagonale" + MESSAGE SHOW,F_BGCOLOR +END + +BUTTON F_BGCOLOR 14 1 +BEGIN + PROMPT 2 5 "Colore ~Sfondo" +END + +BUTTON F_FONT_SELECT 14 2 +BEGIN + PROMPT 2 10 "~Font" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + PAGE "Avanzate" -1 -1 50 16 MEMO F_PRESCRIPT 48 7 diff --git a/ba/ba8300m.uml b/ba/ba8300m.uml deleted file mode 100755 index f67f218bd..000000000 --- a/ba/ba8300m.uml +++ /dev/null @@ -1,49 +0,0 @@ -PAGE "Monitor" -1 -1 50 20 - -LIST 101 24 -3 -BEGIN - PROMPT 0 0 "" -END - -STACK 102 -3 10 -BEGIN - PROMPT 27 0 "" -END - -STACK 103 -3 -3 -BEGIN - PROMPT 27 11 "" -END - -BUTTON DLG_NEXTREC 9 2 -BEGIN - PROMPT -14 -1 "" - PICTURE 124 - MESSAGE EXIT,K_F11 -END - -BUTTON DLG_LASTREC 9 2 -BEGIN - PROMPT -24 -1 "" - PICTURE 1671 - MESSAGE EXIT,K_F10 -END - -BUTTON DLG_ELABORA 9 2 -BEGIN - PROMPT -34 -1 "" - PICTURE BMP_LASTREC - MESSAGE EXIT,K_F5 -END - -BUTTON DLG_QUIT 9 2 -BEGIN - PROMPT -44 -1 "" - MESSAGE EXIT,K_QUIT -END - - -ENDPAGE - -ENDMASK - diff --git a/ba/ba8301.cpp b/ba/ba8301.cpp index 2324e592d..f789fdbe7 100755 --- a/ba/ba8301.cpp +++ b/ba/ba8301.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "ba8300.h" #include "ba8301.h" @@ -321,9 +322,10 @@ class TReport_window : public TField_window PNT _pt_click, _pt_drag_offset; RCT _rct_drag; - TArray _clipboard; TReport_image_cache _images; + static TArray _clipboard; + protected: virtual void handler(WINDOW win, EVENT* ep); virtual void update(); @@ -341,6 +343,7 @@ protected: void popup_cut(); void popup_copy(); void popup_paste(); + bool do_zoom(int k, bool reflect); int cpi() const; int lpi() const; @@ -365,6 +368,8 @@ public: virtual ~TReport_window() { } }; +TArray TReport_window::_clipboard; + void TReport_window::set_report_section(TReport_section& rs) { _report = &rs.report(); @@ -372,7 +377,6 @@ void TReport_window::set_report_section(TReport_section& rs) _level = rs.level(); } - bool TReport_window::pick(const TPoint& ptlog) const { TReport_section& rs = curr_section(); @@ -683,6 +687,29 @@ bool TReport_window::test_corner(const RCT& rct, const PNT& pt, PNT& opposite) c return test == 2; } +bool TReport_window::do_zoom(int k, bool reflect) +{ + const int n = _dpi.v+k; + const bool ok = n >= 48 && n < 300; + if (ok) + { + _dpi.h = _dpi.v = n; + + curr_section().unmap_font(); + force_update(); + + if (reflect) + { + const short buddy = owner().dlg() == F_REPORT ? F_REPORTH : F_REPORT; + TWindowed_field& fld = (TWindowed_field&)owner().mask().field(buddy); + TReport_window& win = (TReport_window&)fld.win(); + win.do_zoom(k, false); + } + } + + return ok; +} + void TReport_window::handler(WINDOW win, EVENT* ep) { switch (ep->type) @@ -840,20 +867,10 @@ void TReport_window::handler(WINDOW win, EVENT* ep) popup_paste(); break; case POPUP_ZOOMIN: - if (_dpi.v < 300) - { - _dpi.h = _dpi.v = _dpi.v + 24; - curr_section().unmap_font(); - force_update(); - } + do_zoom(+24, true); break; case POPUP_ZOOMOUT: - if (_dpi.v > 48) - { - _dpi.h = _dpi.v = _dpi.v - 24; - curr_section().unmap_font(); - force_update(); - } + do_zoom(-24, true); break; case POPUP_PROPERTIES: { @@ -872,6 +889,19 @@ void TReport_window::handler(WINDOW win, EVENT* ep) break; } break; + case E_HSCROLL: + { // Riflette l'evento E_HSCROLL sull'altra finestra di anteprima spacciandolo per E_USER + const short buddy = owner().dlg() == F_REPORT ? F_REPORTH : F_REPORT; + TWindowed_field& fld = (TWindowed_field&)owner().mask().field(buddy); + ep->type = E_USER; + dispatch_event(fld.win().win(), *ep, false); + ep->type = E_HSCROLL; + } + break; + case E_USER: + // Mi e' arrivato un E_HSCROLL camuffato E_USER dall'altra finestra di anteprima + ep->type = E_HSCROLL; + break; default: break; } @@ -900,34 +930,57 @@ TPoint TReport_window::dev2log(const PNT& pt) const void TReport_window::draw_grid() { + const int k = 100; + clear(COLOR_WHITE); - const int max = 196; - const int k = 100; - for (int i = 1; i < max; i++) - { - set_pen(i%10 ? MAKE_COLOR(232,232,255) : MAKE_COLOR(255,192,255)); - line(0, i*k, max*k, i*k); - line(i*k, 0, i*k, max*k); - } - const TReport_section& rs = curr_section(); + int x = rs.width(); int y = rs.height(); - + if (x <= 0) x = 196*k; if (y <= 0) // Sezione ad altezza variabile { for (int i = 0; i < rs.items(); i++) { const TReport_field& rf = rs.field(i); - const int fy = rf.get_rect().bottom(); + const TRectangle& rct = rf.get_rect(); + const int fy = rct.bottom(); if (fy > y) y = fy; } - const int mod = y % 100; - if (mod != 0) y += 100-mod; + const int mod = y % k; + if (mod != 0) y += k-mod; } - if (y > 0) // Disegna barra di fine sezione + + if (rs.type() == 'B' && rs.level() == 0) + x = y = 196*k; + + // Disegna l'eventuale sfondo di sezione + const bool draw_back = y > 0 && (rs.border() > 0 + || (rs.pattern() >= PAT_SOLID && rs.back_color() != COLOR_WHITE)); + if (draw_back) { - const PNT p = log2dev(0, y); + const PNT p = log2dev(x, y);; + RCT rct; xvt_rect_set(&rct, 0, 0, p.h, p.v); + int rad = 0; + if (rs.radius() > 0) + { + const PNT p0 = log2dev(0,0); + const PNT pr = log2dev(rs.radius(),rs.radius()); + rad = min(pr.h-p0.h, pr.v-p0.v); + } + advanced_draw_rect(*this, rct, rs.pattern(), rs.border(), rs.fore_color(), rs.back_color(), rad); + } + + for (int i = x/k; i > 0; i--) + { + set_pen(i%10 ? MAKE_COLOR(232,232,255) : MAKE_COLOR(255,192,255)); + line(0, i*k, x, i*k); + line(i*k, 0, i*k, y <= 0 ? x : y); + } + + if (y > 0) // Disegna barra di fine sezione + { + const PNT p = log2dev(x, y); RCT rct; xvt_vobj_get_client_rect(win(), &rct); if (p.v < rct.bottom) { @@ -937,7 +990,6 @@ void TReport_window::draw_grid() xvt_dwin_draw_rect(win(), &rct); } } - } void TReport_window::draw_broken_paper(const TReport_field& rf) @@ -967,6 +1019,12 @@ void TReport_window::draw_broken_paper(const TReport_field& rf) void TReport_window::draw_field(const TReport_field& rf) { RCT r; TWindow::log2dev(rf.get_rect(), r); + int rad = 0; + if (rf.radius() > 0) + { + const int width = r.right - r.left; + rad = rf.radius() * width / rf.get_rect().width(); + } PAT_STYLE back_pattern = PAT_HOLLOW; const int k = (rf.hidden() ? 1 : 0) + (rf.deactivated() ? 2 : 0); @@ -981,7 +1039,7 @@ void TReport_window::draw_field(const TReport_field& rf) switch (rf.type()) { case 'E': - if (advanced_set_draw_tools(*this, rf.border(), rf.fore_color(), rf.back_color())) + if (advanced_set_draw_tools(*this, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color())) xvt_dwin_draw_oval(win(), &r); back_pattern = PAT_HOLLOW; break; @@ -993,11 +1051,11 @@ void TReport_window::draw_field(const TReport_field& rf) const TImage* img = _images.image(name); if (img != NULL && img->ok()) img->draw(win(), r); - advanced_draw_rect(*this, r, rf.border(), rf.fore_color(), COLOR_WHITE); + advanced_draw_rect(*this, r, PAT_HOLLOW, rf.border(), rf.fore_color(), COLOR_WHITE, 0); } break; case 'L': - if (advanced_set_draw_tools(*this, rf.border(), rf.fore_color(), COLOR_WHITE)) + if (advanced_set_draw_tools(*this, PAT_SOLID, rf.border(), rf.fore_color(), COLOR_WHITE)) { const PNT f = { r.top, r.left }; xvt_dwin_draw_set_pos(win(), f); @@ -1007,11 +1065,11 @@ void TReport_window::draw_field(const TReport_field& rf) back_pattern = PAT_HOLLOW; break; case 'R': - advanced_draw_rect(*this, r, rf.border(), rf.fore_color(), rf.back_color()); + advanced_draw_rect(*this, r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rad); break; case 'T': { - advanced_draw_rect(*this, r, rf.border(), rf.fore_color(), rf.back_color()); + advanced_draw_rect(*this, r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rad); xvt_dwin_set_font(win(), rf.font().get_xvt_font(*this)); set_color(rf.fore_color(), rf.back_color()); TString str = rf.picture(); @@ -1024,9 +1082,9 @@ void TReport_window::draw_field(const TReport_field& rf) else { if (rf.border() <= 0) // Rendi piu' visibile il bordo dei campi che non ce l'hanno - advanced_draw_rect(*this, r, 1, COLOR_LTGRAY, COLOR_WHITE); + advanced_draw_rect(*this, r, PAT_HOLLOW, 1, COLOR_LTGRAY, COLOR_WHITE, 0); else - advanced_draw_rect(*this, r, rf.border(), rf.fore_color(), rf.back_color()); + advanced_draw_rect(*this, r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rad); } if (rf.link().not_empty()) @@ -1061,7 +1119,7 @@ void TReport_window::draw_field(const TReport_field& rf) } if (rf.selected()) { - advanced_set_draw_tools(*this, 0, COLOR_WHITE, COLOR_GRAY); + advanced_set_draw_tools(*this, PAT_SOLID, 0, COLOR_WHITE, COLOR_GRAY); const int k = 5; RCT s = r; s.right = s.left+k; s.bottom = s.top+k; xvt_dwin_draw_rect(win(), &s); diff --git a/ba/batbitl.uml b/ba/batbitl.uml index da7642ae7..886314bd5 100755 --- a/ba/batbitl.uml +++ b/ba/batbitl.uml @@ -9,7 +9,7 @@ PAGE "Libri sociali" -1 -1 78 9 NUMBER FLD_TABITL_CODTAB 2 BEGIN PROMPT 2 1 "Codice " - FIELD %ITL->CODTAB + FIELD CODTAB HELP "Codice del libro sociale" USE %ITL CHECKTYPE REQUIRED @@ -25,7 +25,7 @@ END STRING FLD_TABITL_S0 50 BEGIN PROMPT 2 3 "Descrizione " - FIELD %ITL->S0 + FIELD S0 HELP "Nome del libro sociale" USE %ITL KEY 2 CHECKTYPE REQUIRED