Patch level : 2.1 nopatch

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/trunk@12125 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2004-05-28 10:52:33 +00:00
parent 94f7fc2db2
commit 0af9c76914
8 changed files with 145 additions and 26 deletions

View File

@ -550,6 +550,7 @@ void TSection_properties_mask::vedo_non_vedo()
show(F_GROUP_BY, type == 'H' && level > 1);
show(F_KEEP_WITH_NEXT, level > 1 && type == 'H');
show(F_HIDE_IF_NEEDED, level == 0 && type != 'B');
show(F_REPEAT, level > 1 && type == 'H');
enable(DLG_DELREC, level > 1);
}
@ -592,12 +593,12 @@ void TSection_properties_mask::set_section(const TReport_section& rs)
set(F_CONDITION, rs.condition());
set(F_GROUP_BY, rs.grouped_by());
set(F_HIDE_IF_NEEDED, rs.hidden_if_needed() ? "X" : "");
set(F_HIDDEN, rs.hidden() ? "X" : "");
set(F_HIDE_IF_NEEDED, rs.hidden_if_needed());
set(F_HIDDEN, rs.hidden());
set(F_PAGE_BREAK, rs.page_break());
set(F_KEEP_WITH_NEXT, rs.keep_with_next());
set(F_DISABLED, rs.deactivated() ? "X" : "");
set(F_REPEAT, rs.repeat_on_page());
set(F_DISABLED, rs.deactivated());
set_font_info(rs.font());
set(F_PRESCRIPT, rs.prescript());
@ -623,6 +624,7 @@ void TSection_properties_mask::get_section(TReport_section& rs) const
rs.hide_if_needed(get_bool(F_HIDE_IF_NEEDED));
rs.force_page_break(get_bool(F_PAGE_BREAK));
rs.keep_with_next(get_bool(F_KEEP_WITH_NEXT));
rs.set_repeat_on_page(get_bool(F_REPEAT));
TReport_font f;
if (get_font_info(f))

View File

@ -44,6 +44,7 @@
#define F_PAGE_BREAK 163
#define F_KEEP_WITH_NEXT 164
#define F_CONDITION 165
#define F_REPEAT 166
#define F_SQL 201
#define F_IMPORT_QRY 202

View File

@ -68,6 +68,14 @@ BEGIN
FLAGS "H"
END
BOOLEAN F_REPEAT
BEGIN
// Visibile per testate di livello > 1
PROMPT 1 6 "Ripeti sezione ad inizio pagina"
FLAGS "H"
END
MEMO F_CONDITION 48 3
BEGIN
// Visibile sezioni con livello > 0

View File

@ -343,6 +343,7 @@ public:
void clear_selection();
void select(const TRectangle& rct);
void offset_selection(const TPoint& p);
void resize_selection(const TPoint& p);
void set_report(TReport* rep) { _report = rep; }
@ -419,6 +420,21 @@ void TReport_window::offset_selection(const TPoint& p)
}
}
void TReport_window::resize_selection(const TPoint& p)
{
TReport_section& rs = curr_section();
FOR_EACH_ARRAY_ITEM(rs, i, o)
{
TReport_field& f = *(TReport_field*)o;
if (f.selected())
{
TPoint s = f.get_rect().size(); s += p;
if (s.x > 0 && s.y > 0)
f.set_size(s.x, s.y);
}
}
}
void TReport_window::select(const TRectangle& rct)
{
clear_selection();
@ -443,7 +459,7 @@ void TReport_window::draw_dragster()
void TReport_window::snap_drag(PNT& pnt) const
{
const int kx = _dpi.h / cpi();
const int ky = _dpi.v / lpi();
const int ky = _dpi.v / (lpi()*2);
pnt.h = (pnt.h / kx) * kx;
pnt.v = (pnt.v / ky) * ky;
}
@ -461,21 +477,37 @@ bool TReport_window::on_key(KEY k)
switch (k)
{
case K_LEFT:
offset_selection(TPoint(-50, 0));
offset_selection(TPoint(-100, 0));
force_update();
return true;
case K_LEFT+K_SHIFT:
resize_selection(TPoint(-100, 0));
force_update();
return true;
case K_RIGHT:
offset_selection(TPoint(+50, 0));
offset_selection(TPoint(+100, 0));
force_update();
return true;
case K_RIGHT+K_SHIFT:
resize_selection(TPoint(+100, 0));
force_update();
return true;
case K_DOWN:
offset_selection(TPoint(0, +50));
force_update();
return true;
case K_DOWN+K_SHIFT:
resize_selection(TPoint(0, +100));
force_update();
return true;
case K_UP:
offset_selection(TPoint(0, -50));
force_update();
return true;
case K_UP+K_SHIFT:
resize_selection(TPoint(0, -100));
force_update();
return true;
case K_DEL:
dispatch_e_menu(win(), POPUP_CUT);
return true;
@ -860,10 +892,13 @@ void TReport_window::draw_field(const TReport_field& rf)
advanced_draw_rect(*this, r, rf.border(), rf.fore_color(), rf.back_color());
break;
case 'T':
advanced_draw_rect(*this, r, rf.border(), rf.fore_color(), rf.back_color());
xvt_dwin_set_font(win(), rf.font().get_xvt_font(*this));
set_color(rf.fore_color(), rf.back_color());
advanced_draw_text(*this, rf.picture(), r, rf.horizontal_alignment(), rf.vertical_alignment());
{
advanced_draw_rect(*this, r, rf.border(), rf.fore_color(), rf.back_color());
xvt_dwin_set_font(win(), rf.font().get_xvt_font(*this));
set_color(rf.fore_color(), rf.back_color());
TString str = rf.picture();
advanced_draw_paragraph(*this, str, r, rf.horizontal_alignment(), rf.vertical_alignment());
}
break;
default :
if (rf.dynamic_height())
@ -896,7 +931,7 @@ void TReport_window::draw_field(const TReport_field& rf)
str << rf.id();
else
str = rf.field();
advanced_draw_text(*this, str, r, rf.horizontal_alignment(), rf.vertical_alignment());
advanced_draw_paragraph(*this, str, r, rf.horizontal_alignment(), rf.vertical_alignment());
break;
}

View File

@ -370,6 +370,52 @@ void advanced_draw_text(TWindow& win, const char* text, const RCT& r,
xvt_dwin_draw_text(win.win(), x, y, text, -1);
}
void advanced_draw_paragraph(TWindow& win, TString& para, const RCT& rct,
char halign, char valign)
{
const bool acapo = para.find('\n') >= 0;
const bool parag = para.find(char(0xB6)) >= 0;
if (acapo || parag) // Devo scrivere piu' righe?
{
int leading, ascent, descent;
xvt_dwin_get_font_metrics(win.win(), &leading, &ascent, &descent);
const int kx = xvt_dwin_get_text_width(win.win(), "ABCDEFGH", 8) / 8;
const int ky = leading + ascent + descent;
const int rct_height = rct.bottom - rct.top;
const unsigned columns = (rct.right - rct.left) / kx;
int rows = rct_height / ky;
if (parag)
para.replace(char('0xB6'), '\n');
TParagraph_string str(para, columns);
if (str.items() < rows)
rows = str.items();
int ybase = rct.top;
switch (valign)
{
case 'C': ybase += (rct_height - rows*ky) / 2; break;
case 'B': ybase += rct_height - rows*ky; break;
default : break;
}
for (int row = 0; row < rows; row++)
{
RCT rctline = rct;
rctline.top = ybase + ky*row;
rctline.bottom = rctline.top + ky;
const char* line = str.get();
if (halign == 'J' && (row == rows-1 || strlen(line) < columns/2))
halign = 'L';
advanced_draw_text(win, line, rctline, halign, 'T');
}
}
else
advanced_draw_text(win, para, rct, halign, valign);
}
static void set_num_attr(TXmlItem& item, const char* attr, long num, short def = 0)
{
if (num != def)
@ -630,6 +676,7 @@ void TReport_section::save(TXmlItem& root) const
item.SetAttr("hidden_if_needed", hidden_if_needed());
item.SetAttr("pagebreak", _page_break);
item.SetAttr("keep_with_next", keep_with_next());
item.SetAttr("repeat", repeat_on_page());
if (condition().not_empty())
item.AddChild("condition") << condition();
if (grouped_by().not_empty())
@ -655,6 +702,7 @@ void TReport_section::load(const TXmlItem& sec)
force_page_break(sec.GetBoolAttr("pagebreak"));
keep_with_next(sec.GetBoolAttr("keep_with_next"));
hide_if_needed(sec.GetBoolAttr("hidden_if_needed"));
set_repeat_on_page(sec.GetBoolAttr("repeat"));
show(!sec.GetBoolAttr("hidden"));
activate(!sec.GetBoolAttr("deactivated"));
@ -702,7 +750,8 @@ void TReport_section::load(const TXmlItem& sec)
TReport_section::TReport_section(TReport& r, char t, int l)
: _report(r), _type(t), _level(l), _font(NULL),
_size(0,0), _pos(0,0), _page_break(false), _hidden_if_needed(false),
_size(0,0), _pos(0,0),
_page_break(false), _hidden_if_needed(false), _repeat(false),
_hidden(false), _deactivated(false)
{ }

View File

@ -147,7 +147,7 @@ class TReport_section : public TArray
TPoint _pos; // Posizione assoluta in centesimi, default (0,0)
TPoint _size; // Dimensioni in centesimi, default (0,0)
TString _condition, _groupby;
bool _page_break, _hidden_if_needed, _keep_with_next;
bool _page_break, _hidden_if_needed, _keep_with_next, _repeat;
bool _hidden, _deactivated;
TReport_script _prescript, _postscript;
@ -178,9 +178,10 @@ public:
bool compute_rect(TRectangle& rct) const;
const TPoint& pos() const { return _pos; }
void set_pos(const TPoint& p) { _pos = p; }
bool page_break() const { return _page_break; }
void force_page_break(bool pb) { _page_break = pb; }
void set_repeat_on_page(bool r) { _repeat = r; }
bool repeat_on_page() const { return _repeat; }
const TString& condition() const { return _condition; }
void set_condition(const char* str) { _condition = str; }
@ -356,7 +357,6 @@ public:
// virtual void draw_rect(TWindow& win) const;
// virtual void draw_text(TWindow& win, const char* text, TReport_draw_mode mode) const;
// virtual void draw(TWindow& win, TReport_draw_mode mode) const;
virtual bool print_tools(TBook& book) const;
@ -495,5 +495,7 @@ bool advanced_set_draw_tools(TWindow& win, int border, COLOR fore, COLOR back);
void advanced_draw_rect(TWindow& win, const RCT& r, int border, COLOR fore, COLOR back);
void advanced_draw_text(TWindow& win, const char* text, const RCT& r,
char halign, char valign);
void advanced_draw_paragraph(TWindow& win, TString& text, const RCT& r,
char halign, char valign);
#endif

View File

@ -117,7 +117,7 @@ void TPrint_preview_window::popup_menu(EVENT* ep)
menu[5].tag = POPUP_ZOOMIN; menu[5].text = (char*)TR("Zoom +"); menu[5].enabled = _zoom < 300;
menu[6].tag = POPUP_ZOOMOUT; menu[6].text = (char*)TR("Zoom -"); menu[6].enabled = _zoom > 50;
menu[7].tag = -1; menu[7].separator = true;
menu[8].tag = POPUP_GRID; menu[8].text = (char*)TR("Griglia"); menu[8].enabled = true;
menu[8].tag = POPUP_GRID; menu[8].text = (char*)TR("Griglia"); menu[8].enabled = false;
menu[8].checkable = true; menu[8].checked = false;
const PNT& p = ep->v.mouse.where;
@ -667,7 +667,7 @@ bool TBook::print_page(TWindow& win, size_t page)
break;
stringona << str;
}
advanced_draw_text(win, stringona, rct, _horizontal_alignment, _vertical_alignment);
advanced_draw_paragraph(win, stringona, rct, _horizontal_alignment, _vertical_alignment);
continue;
}
if (str.starts_with("<text_align"))
@ -792,7 +792,7 @@ bool TBook::preview()
{
TPreview_mask msk(this);
const KEY k = msk.run();
if (k == ' ')
if (k != K_QUIT)
print();
return true;
}
@ -841,7 +841,6 @@ TPoint TReport_book::log2dev(const TPoint& ptlog) const
TPoint ptdev;
ptdev.x = (ptlog.x * _phr) / (100 * _report->cpi());
ptdev.y = (ptlog.y * _pvr) / (100 * _report->lpi());
return ptdev;
}
@ -849,7 +848,6 @@ void TReport_book::define_frame(const TRectangle& r)
{
TPoint ptlog = r; ptlog += _delta;
TPoint szlog = r.size();
const TRectangle rect(log2dev(ptlog), log2dev(szlog));
TBook::define_frame(rect);
}
@ -942,6 +940,24 @@ void TReport_book::create_links(const TReport_section& rs)
*/
}
void TReport_book::reprint_group_headers()
{
const int max_group = _report->find_max_level('H');
for (int level = max_group; level >= 2; level--)
{
TReport_section& rs = _report->section('H', level);
if (rs.repeat_on_page())
{
const long height = rs.compute_size().y; // Compute size after the initilization script!
if (height > 0)
{
rs.print(*this);
_delta.y += height;
}
}
}
}
long TReport_book::print_section(TReport_section& rs)
{
if (_print_aborted)
@ -975,6 +991,8 @@ long TReport_book::print_section(TReport_section& rs)
{
close_page();
open_page();
if (rs.type() == 'B')
reprint_group_headers();
}
if (_page_is_open)
rs.print(*this);
@ -1049,7 +1067,7 @@ bool TReport_book::add(TReport& rep)
{
if (max_group >= 2) // Gestione raggruppamenti
{
int changed = 0;
int first_changed = 0;
TVariant var;
for (int g = 2; g <= max_group; g++)
{
@ -1058,9 +1076,12 @@ bool TReport_book::add(TReport& rep)
const TString& grp = var.as_string();
newgroup.add(grp, g);
if (newgroup.row(g) != oldgroup.row(g) || rex->current_row() == 0)
changed = g;
{
if (first_changed == 0)
first_changed = g;
}
}
if (changed)
if (first_changed)
{
oldgroup = newgroup;
@ -1070,10 +1091,10 @@ bool TReport_book::add(TReport& rep)
if (rex->current_row() > 0)
{
for (int g = 2; g <= changed; g++)
for (int g = max_group; g >= first_changed ; g--)
_delta.y += print_section('F', g);
}
for (int g = changed; g >= 2 ; g--)
for (int g = first_changed; g <= max_group; g++)
_delta.y += print_section('H', g);
}
}

View File

@ -79,6 +79,7 @@ protected:
virtual void define_frame(const TRectangle& r);
bool init(TReport& rep);
void reprint_group_headers();
long print_section(TReport_section& rs);
long print_section(char type, int level);
void create_links(const TReport_section& rs);