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:
		
							parent
							
								
									e391a546da
								
							
						
					
					
						commit
						422eea88c1
					
				@ -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))
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -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),
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user