Patch level : 2.1 98

Files correlati     : librerie report
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/trunk@12272 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2004-07-29 12:49:43 +00:00
parent e391a546da
commit 422eea88c1
5 changed files with 76 additions and 13 deletions

View File

@ -568,7 +568,6 @@ bool select_custom_file(TFilename& path, const char* ext)
TString str;
FOR_EACH_ARRAY_ROW(files, i, row)
{
TXmlItem item;
if (item.Load(*row))
{

View File

@ -463,6 +463,16 @@ TReport_field* TReport_section::find_field(int id)
return NULL;
}
// Determina se e' possibile manntenere la sezione nella stessa pagina della successiva
bool TReport_section::keep_with_next() const
{ return _keep_with_next && type() == 'H' && level() > 1; }
// Determina se e' possibile spezzare la sezione su due pagine
bool TReport_section::can_be_broken() const
{
return _can_break && type() == 'B' && level() > 0;
}
TPoint TReport_section::compute_size() const
{
if (hidden())
@ -580,6 +590,16 @@ void TReport_section::print(TBook& book) const
}
}
void TReport_section::print_clipped(TBook& book, long top, long bottom) const
{
if (shown() && active())
{
book.set_clip(top, bottom);
print(book);
book.set_clip(0, -1);
}
}
bool TReport_section::execute_postscript()
{
bool ok = true;
@ -624,7 +644,8 @@ void TReport_section::save(TXmlItem& root) const
item.SetAttr("hidden", _hidden);
item.SetAttr("deactivated", _deactivated);
item.SetAttr("hidden_if_needed", hidden_if_needed());
item.SetAttr("pagebreak", _page_break);
item.SetAttr("page_break", _page_break);
item.SetAttr("can_break", can_be_broken());
item.SetAttr("keep_with_next", keep_with_next());
item.SetAttr("repeat", repeat_on_page());
if (condition().not_empty())
@ -656,7 +677,8 @@ void TReport_section::load(const TXmlItem& sec)
set_back_color(get_col_attr(sec, "bg_color", COLOR_WHITE));
set_fore_color(get_col_attr(sec, "fg_color", COLOR_BLACK));
force_page_break(sec.GetBoolAttr("pagebreak"));
force_page_break(sec.GetBoolAttr("page_break"));
can_break(sec.GetBoolAttr("can_break"));
keep_with_next(sec.GetBoolAttr("keep_with_next"));
hide_if_needed(sec.GetBoolAttr("hidden_if_needed"));
set_repeat_on_page(sec.GetBoolAttr("repeat"));
@ -708,7 +730,8 @@ void TReport_section::load(const TXmlItem& sec)
TReport_section::TReport_section(TReport& r, char t, int l)
: _report(r), _type(t), _level(l), _pos(0,0),
_size(0,0), _page_break(false), _hidden_if_needed(false), _keep_with_next(false),
_size(0,0), _page_break(false), _hidden_if_needed(false),
_can_break(false), _keep_with_next(false),
_repeat(false), _hidden(false), _deactivated(false),
_font(NULL), _print_font(NULL),
_bgcolor(COLOR_WHITE), _fgcolor(COLOR_BLACK), _pattern(PAT_HOLLOW),
@ -1612,7 +1635,8 @@ 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), _radius(0), _pattern(PAT_HOLLOW),
_fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE), _pattern(PAT_HOLLOW),
_radius(0), _shade_offset(0),
_border(0), _halign('L'), _valign('T'),_dynamic_height(false),
_font(NULL), _print_font(NULL),
_hidden(false), _deactivated(false), _hide_zeroes(false), _selected(false),

View File

@ -148,7 +148,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, _repeat;
bool _page_break, _hidden_if_needed, _can_break, _keep_with_next, _repeat;
bool _hidden, _deactivated;
COLOR _fgcolor, _bgcolor;
int _border, _radius;
@ -208,7 +208,9 @@ public:
bool hidden_if_needed() const { return _hidden_if_needed; }
void hide_if_needed(bool h) { _hidden_if_needed = h; }
bool keep_with_next() const { return _keep_with_next; }
bool can_be_broken() const;
void can_break(bool k) { _can_break = k; }
bool keep_with_next() const;
void keep_with_next(bool k) { _keep_with_next = k; }
bool hidden() const { return _hidden; }
bool shown() const { return !hidden(); }
@ -236,6 +238,7 @@ public:
bool execute_prescript();
bool execute_postscript();
void print(TBook& book) const;
void print_clipped(TBook& book, long top, long bottom) const;
void save(TXmlItem& report) const;
void load(const TXmlItem& sec);

View File

@ -731,7 +731,7 @@ bool TBook::open_page()
_font.create("", 12, XVT_FA_ALL);
_horizontal_alignment = 'L';
_vertical_alignment = 'T';
_rect.reset();
_rect.set(-1,-1,0,0);
_print_aborted = false;
_page_is_open = true;
@ -776,6 +776,18 @@ void TBook::define_frame(const TRectangle& rect)
}
}
void TBook::set_clip(long top, long bottom)
{
if (bottom >= top)
{
const TRectangle rect(0, top, logical_page_width(), bottom-top);
define_frame(rect);
*_out << "<clip>" << endl;
}
else
*_out << "</clip>" << endl;
}
void TBook::draw_text(const TRectangle& r, const char* txt)
{
const TFixed_string str(txt);
@ -1010,6 +1022,14 @@ bool TBook::print_page(TWindow& win, size_t page)
win.set_brush(col, pat);
continue;
}
if (str.starts_with("<clip"))
{
xvt_dwin_set_clip(win.win(), &rct);
} else
if (str.starts_with("</clip"))
{
xvt_dwin_set_clip(win.win(), NULL);
} else
if (str == "<ellipse/>")
{
xvt_dwin_draw_oval(win.win(), &rct);
@ -1032,7 +1052,7 @@ bool TBook::print_page(TWindow& win, size_t page)
if (win.win() == 883)
xvt_dwin_set_font(win.win(), font.get_xvt_font(win));
else
xvt_dwin_set_font(win.win(), font.get_preview_font(win, page_res()));
xvt_dwin_set_font(win.win(), font.get_preview_font(win, page_res()));
continue;
}
if (str.starts_with("<image "))
@ -1545,12 +1565,21 @@ long TReport_book::print_section(TReport_section& rs)
if (height > 0) // Has some visible fields
{
bool page_break = _page_break_allowed && rs.page_break();
long reprint_from = 0;
if (!page_break)
{
long h = height;
if (rs.keep_with_next())
h += rs.report().section('B', 1).compute_size().y;
page_break = (_delta.y + h > _logical_foot_pos);
const long space_left = _logical_foot_pos - _delta.y;
page_break = h > space_left;
// Controllo se la sezione puo' essere stampata su due pagine
if (page_break && space_left >= 100 && rs.can_be_broken() )
{
reprint_from = space_left / 100 * 100;
rs.print_clipped(*this, 0, reprint_from);
}
}
if (page_break && rs.level() > 0) // Avoid recursion
{
@ -1560,7 +1589,15 @@ long TReport_book::print_section(TReport_section& rs)
reprint_group_headers();
}
if (_page_is_open)
rs.print(*this);
{
if (reprint_from > 0)
{
_delta.y -= reprint_from;
rs.print_clipped(*this, reprint_from, height);
}
else
rs.print(*this);
}
if (rs.level() > 0) // Ho stampato qualcosa che non sia lo sfondo!
_page_break_allowed = true;

View File

@ -48,6 +48,7 @@ public:
virtual void draw_text(const TRectangle& rect, const char* text);
virtual void draw_link(const TRectangle& rect, const char* text, const char* link);
virtual void draw_book_pages(const TRectangle& r);
virtual void set_clip(long top, long bottom);
TPoint page_size() const;
TPoint page_res() const;
@ -70,7 +71,6 @@ public:
virtual ~TBook();
};
class TReport_book : public TBook
{
TReport* _report;