Patch level : 2.1 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento : Ristrutturzione delle calssi TVariant e TAlex in modo da renderle completamente indipendenti dalle stampe e dai recordset git-svn-id: svn://10.65.10.50/trunk@12181 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									f72c70c29b
								
							
						
					
					
						commit
						dcd927717e
					
				
							
								
								
									
										116
									
								
								include/alex.cpp
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								include/alex.cpp
									
									
									
									
									
								
							@ -1,85 +1,17 @@
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include <alex.h>
 | 
			
		||||
#include <automask.h>
 | 
			
		||||
#include <colors.h>
 | 
			
		||||
#include <defmask.h>
 | 
			
		||||
#include <dongle.h>
 | 
			
		||||
#include <prefix.h>
 | 
			
		||||
#include <recarray.h>
 | 
			
		||||
#include <reprint.h>
 | 
			
		||||
#include <statbar.h>
 | 
			
		||||
#include <urldefid.h>
 | 
			
		||||
#include <utility.h>
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant_stack::peek(int depth)
 | 
			
		||||
{
 | 
			
		||||
  const int sp = _sp-depth-1;
 | 
			
		||||
  return sp >= 0 ? (TVariant&)_var[sp] : (TVariant &)NULL_VARIANT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant_stack::drop()
 | 
			
		||||
{
 | 
			
		||||
  if (_sp > 0)
 | 
			
		||||
  {
 | 
			
		||||
    _sp--;
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant_stack::pop()
 | 
			
		||||
{
 | 
			
		||||
  TVariant& var = peek(0);
 | 
			
		||||
  drop();
 | 
			
		||||
  return var;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::roll(int depth)
 | 
			
		||||
{
 | 
			
		||||
  const int sp = _sp-depth-1;
 | 
			
		||||
  if (sp >= 0)
 | 
			
		||||
  {
 | 
			
		||||
    TObject* var = _var.remove(sp, true);
 | 
			
		||||
    _var.insert(var, _sp-1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  if (_var.objptr(_sp) == NULL)
 | 
			
		||||
    _var.add(var, _sp);
 | 
			
		||||
  else
 | 
			
		||||
    (TVariant&)_var[_sp] = var;
 | 
			
		||||
  _sp++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(long n)
 | 
			
		||||
{
 | 
			
		||||
  const TVariant var(n);
 | 
			
		||||
  push(var);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(const real& n)
 | 
			
		||||
{
 | 
			
		||||
  const TVariant var(n);
 | 
			
		||||
  push(var);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(const char* str)
 | 
			
		||||
{
 | 
			
		||||
  const TVariant var(str);
 | 
			
		||||
  push(var);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::reset()
 | 
			
		||||
{
 | 
			
		||||
  _sp = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant_stack::overflow() const
 | 
			
		||||
{
 | 
			
		||||
  return _sp > 2048;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TAVM_op
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
@ -391,15 +323,17 @@ TField_window* TAVM_stack_field::create_window(int x, int y, int dx, int dy, WIN
 | 
			
		||||
 | 
			
		||||
class TAVM_monitor : public TAutomask
 | 
			
		||||
{
 | 
			
		||||
  TAVM_list_window *_lw;
 | 
			
		||||
  TAVM_stack_window *_sw, *_rw;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  TMask_field* parse_field(TScanner& scanner);
 | 
			
		||||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
			
		||||
  virtual bool on_key(KEY k);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TAVM_list_window& monitor() { return (TAVM_list_window&)((TAVM_list_field&)field(101)).win(); }
 | 
			
		||||
  TAVM_stack_window& stacker() { return (TAVM_stack_window&)((TAVM_list_field&)field(102)).win(); }
 | 
			
		||||
  TAVM_stack_window& rstacker() { return (TAVM_stack_window&)((TAVM_list_field&)field(103)).win(); }
 | 
			
		||||
  TAVM_list_window& monitor() const { return *_lw; }
 | 
			
		||||
  TAVM_stack_window& stacker() const { return *_sw; }
 | 
			
		||||
  TAVM_stack_window& rstacker() const { return *_rw; }
 | 
			
		||||
  TAVM_monitor();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -421,18 +355,25 @@ bool TAVM_monitor::on_key(KEY k)
 | 
			
		||||
  return TAutomask::on_key(k);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TMask_field* TAVM_monitor::parse_field(TScanner& scanner)
 | 
			
		||||
TAVM_monitor::TAVM_monitor() : TAutomask("Monitor", 1, 50, 20)
 | 
			
		||||
{
 | 
			
		||||
  if (scanner.token().starts_with("LI"))
 | 
			
		||||
    return new TAVM_list_field(this);
 | 
			
		||||
  if (scanner.token().starts_with("ST"))
 | 
			
		||||
    return new TAVM_stack_field(this);
 | 
			
		||||
  return TAutomask::parse_field(scanner);
 | 
			
		||||
}
 | 
			
		||||
  TWindowed_field* wf = new TAVM_list_field(this);
 | 
			
		||||
  wf->create(101, 0, 0, 24, -3); add_field(wf);
 | 
			
		||||
  _lw = (TAVM_list_window*)&wf->win();
 | 
			
		||||
 | 
			
		||||
  TWindowed_field* sf = new TAVM_stack_field(this);
 | 
			
		||||
  sf->create(102, 27, 0, -3, 10); add_field(sf);
 | 
			
		||||
  _sw = (TAVM_stack_window*)&sf->win();
 | 
			
		||||
 | 
			
		||||
  TWindowed_field* rf = new TAVM_stack_field(this);
 | 
			
		||||
  rf->create(103, 27, 11, -3, -3); add_field(rf);
 | 
			
		||||
  _rw = (TAVM_stack_window*)&rf->win();
 | 
			
		||||
 | 
			
		||||
  add_button(DLG_NEXTREC, 0, "", -14, -1, 10, 2, "", 124).set_exit_key(K_F11);
 | 
			
		||||
  add_button(DLG_LASTREC, 0, "", -24, -1, 10, 2, "", 1671).set_exit_key(K_F10);
 | 
			
		||||
  add_button(DLG_ELABORA, 0, "", -34, -1, 10, 2, "", BMP_LASTREC).set_exit_key(K_F5);
 | 
			
		||||
  add_button(DLG_QUIT,    0, "", -44, -1, 10, 2).set_exit_key(K_QUIT);
 | 
			
		||||
 | 
			
		||||
TAVM_monitor::TAVM_monitor()
 | 
			
		||||
{
 | 
			
		||||
  read_mask("ba8300m", 0, -1); 
 | 
			
		||||
  set_handlers();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1040,6 +981,7 @@ bool TAVM::execute(const TBytecode& cmdline)
 | 
			
		||||
{
 | 
			
		||||
  const TBytecode* old_bc = _bc;
 | 
			
		||||
  const int old_ip = _ip;
 | 
			
		||||
  bool aborted = false;
 | 
			
		||||
  
 | 
			
		||||
  _stack.reset();
 | 
			
		||||
  _rstack.reset();
 | 
			
		||||
@ -1100,7 +1042,7 @@ bool TAVM::execute(const TBytecode& cmdline)
 | 
			
		||||
          op.set_auto_break(true);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      case K_QUIT: abort_printing();
 | 
			
		||||
      case K_QUIT: aborted = true;
 | 
			
		||||
      case K_F5  : _mon.close_modal(); break;
 | 
			
		||||
      default: break;
 | 
			
		||||
      }  
 | 
			
		||||
@ -1118,7 +1060,7 @@ bool TAVM::execute(const TBytecode& cmdline)
 | 
			
		||||
  _bc = old_bc;
 | 
			
		||||
  _ip = old_ip;
 | 
			
		||||
  
 | 
			
		||||
  return true;
 | 
			
		||||
  return !aborted;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TAVM::do_restart(bool cold)
 | 
			
		||||
 | 
			
		||||
@ -1,32 +1,10 @@
 | 
			
		||||
#ifndef __ALEX_H
 | 
			
		||||
#define __ALEX_H
 | 
			
		||||
 | 
			
		||||
#ifndef __RECORDSET_H
 | 
			
		||||
#include <recset.h>
 | 
			
		||||
#ifndef __VARIANT_H
 | 
			
		||||
#include <variant.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class TVariant_stack : public TObject
 | 
			
		||||
{
 | 
			
		||||
  TArray _var;
 | 
			
		||||
  int _sp;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  int items() const { return _sp; }
 | 
			
		||||
  bool drop();
 | 
			
		||||
  TVariant& pop();
 | 
			
		||||
  TVariant& peek(int depth = 0);
 | 
			
		||||
  void roll(int depth);
 | 
			
		||||
 | 
			
		||||
  void push(const TVariant& var);
 | 
			
		||||
  void push(long n);
 | 
			
		||||
  void push(const real& n);
 | 
			
		||||
  void push(const char* str);
 | 
			
		||||
  void reset();
 | 
			
		||||
  bool overflow() const;
 | 
			
		||||
 | 
			
		||||
  TVariant_stack() : _sp(0) { }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Generic bytecode for any language
 | 
			
		||||
 | 
			
		||||
class TBytecode : public TArray
 | 
			
		||||
 | 
			
		||||
@ -169,3 +169,8 @@ TAutomask::TAutomask(const char* name, int num)
 | 
			
		||||
{
 | 
			
		||||
  set_handlers();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TAutomask::TAutomask(const char* title, int pages, int cols, int rows, int xpos, int ypos)
 | 
			
		||||
         : TMask(title, pages, cols, rows, xpos, ypos)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -28,6 +28,7 @@ public:
 | 
			
		||||
 | 
			
		||||
  TAutomask() { }
 | 
			
		||||
  TAutomask(const char* name, int num = 0);
 | 
			
		||||
  TAutomask(const char* title, int pages, int cols, int rows, int xpos = -1, int ypos = -1);
 | 
			
		||||
  virtual ~TAutomask() { }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,11 @@
 | 
			
		||||
#include <checks.h>
 | 
			
		||||
#include <keys.h>
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
#define buildmsg() char msg[256];va_list argptr;va_start(argptr,fmt);_vsnprintf(msg,sizeof(msg),fmt,argptr);va_end(argptr)
 | 
			
		||||
#else
 | 
			
		||||
#define buildmsg() char msg[256];va_list argptr;va_start(argptr,fmt);vsprintf(msg,fmt,argptr);va_end(argptr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// @doc EXTERNAL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4954,12 +4954,17 @@ TField_window* TWindowed_field::create_window(int x, int y, int dx, int dy, WIND
 | 
			
		||||
  return new TField_window(x, y, dx, dy, parent, this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TWindowed_field::create(short id, int x, int y, int dx, int dy, WINDOW parent)
 | 
			
		||||
{
 | 
			
		||||
  if (parent == NULL_WIN)
 | 
			
		||||
    parent = mask().win();
 | 
			
		||||
  _dlg = id;
 | 
			
		||||
  _win = create_window(x, y, dx, dy, parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TWindowed_field::create(WINDOW parent)
 | 
			
		||||
{        
 | 
			
		||||
  _dlg = _ctl_data._dlg;
 | 
			
		||||
  _win = create_window(_ctl_data._x, _ctl_data._y, 
 | 
			
		||||
                       _ctl_data._width, _ctl_data._height, 
 | 
			
		||||
                       parent);
 | 
			
		||||
  create(_ctl_data._dlg, _ctl_data._x, _ctl_data._y, _ctl_data._width, _ctl_data._height, parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TWindowed_field::~TWindowed_field() 
 | 
			
		||||
 | 
			
		||||
@ -1578,7 +1578,6 @@ protected:  // TMask_field
 | 
			
		||||
protected:
 | 
			
		||||
  virtual TField_window* create_window(int x, int y, int dx, int dy, 
 | 
			
		||||
                                       WINDOW parent) pure;
 | 
			
		||||
 | 
			
		||||
public:     // TMask_field
 | 
			
		||||
  virtual short dlg() const;
 | 
			
		||||
  virtual WINDOW parent() const { return win().parent(); }
 | 
			
		||||
@ -1591,6 +1590,8 @@ public:
 | 
			
		||||
  TField_window& win() const { CHECK(_win, "NULL Window in field"); return *_win; }
 | 
			
		||||
 | 
			
		||||
  TWindowed_field(TMask* m) : TOperable_field(m), _dlg(0), _win(NULL) { }
 | 
			
		||||
  void create(short id, int x, int y, int dx, int dy, WINDOW parent = NULL_WIN);
 | 
			
		||||
 | 
			
		||||
  virtual ~TWindowed_field();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,252 +10,6 @@
 | 
			
		||||
 | 
			
		||||
#include <statbar.h>
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TVariant
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
const TVariant NULL_VARIANT;
 | 
			
		||||
 | 
			
		||||
void TVariant::set_null()
 | 
			
		||||
{
 | 
			
		||||
  if (_ptr != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    if (_type != _nullfld && _type != _longfld)
 | 
			
		||||
      delete (char *) _ptr;
 | 
			
		||||
    _ptr = NULL;
 | 
			
		||||
  }
 | 
			
		||||
  _type = _nullfld;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const char* str)
 | 
			
		||||
{
 | 
			
		||||
  if (str != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    if (_type == _alfafld)
 | 
			
		||||
      *((TString*)_ptr) = str;
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      set_null();
 | 
			
		||||
      _type = _alfafld;
 | 
			
		||||
      _ptr = new TString(str);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    set_null();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const real& r)
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _realfld)
 | 
			
		||||
    *((real*)_ptr) = r;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    set_null();
 | 
			
		||||
    _type = _realfld;
 | 
			
		||||
    _ptr = new real(r);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const TDate& d)
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _datefld)
 | 
			
		||||
    *((TDate*)_ptr) = d;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    set_null();
 | 
			
		||||
    _type = _datefld;
 | 
			
		||||
    _ptr = new TDate(d);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const long n)
 | 
			
		||||
{
 | 
			
		||||
  if (_type != _longfld)
 | 
			
		||||
    set_null();
 | 
			
		||||
  _type = _longfld;
 | 
			
		||||
  _ptr = (void*)n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::is_zero() const
 | 
			
		||||
{
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: return !as_date().ok();
 | 
			
		||||
  case _longfld: return _ptr == NULL;
 | 
			
		||||
  case _realfld: return as_real().is_zero();
 | 
			
		||||
  case _alfafld: return real::is_null(as_string());
 | 
			
		||||
  default: break;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::is_empty() const
 | 
			
		||||
{
 | 
			
		||||
 if (_type == _alfafld)
 | 
			
		||||
   return as_string().empty();
 | 
			
		||||
 return is_zero();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TDate TVariant::as_date() const
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _datefld)
 | 
			
		||||
    return *(TDate*)_ptr;
 | 
			
		||||
  if (_type == _intfld || _type == _realfld)
 | 
			
		||||
    return TDate(as_int());
 | 
			
		||||
  return TDate(as_string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long TVariant::as_int() const
 | 
			
		||||
{
 | 
			
		||||
  long n = 0;
 | 
			
		||||
  switch(_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: n = as_date().date2ansi(); break;
 | 
			
		||||
  case _longfld: n = (long)_ptr; break;
 | 
			
		||||
  case _realfld: n = as_real().integer(); break;
 | 
			
		||||
  case _alfafld: n = atoi(as_string()); break;
 | 
			
		||||
  default : break;
 | 
			
		||||
  }
 | 
			
		||||
  return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::as_bool() const
 | 
			
		||||
{
 | 
			
		||||
  bool ok = false;
 | 
			
		||||
  if (_type == _alfafld)
 | 
			
		||||
    ok = strchr("1XY", as_string()[0]) != NULL;
 | 
			
		||||
  else
 | 
			
		||||
    ok = as_int() != 0;
 | 
			
		||||
  return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
COLOR TVariant::as_color() const
 | 
			
		||||
{
 | 
			
		||||
  const unsigned long rgb = as_int();
 | 
			
		||||
  unsigned char r = XVT_COLOR_GET_RED(rgb);
 | 
			
		||||
  unsigned char g = XVT_COLOR_GET_GREEN(rgb);
 | 
			
		||||
  unsigned char b = XVT_COLOR_GET_BLUE(rgb);
 | 
			
		||||
  return MAKE_COLOR(r, g, b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
real TVariant::as_real() const
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _realfld)
 | 
			
		||||
    return *(real*)_ptr;
 | 
			
		||||
  switch(_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _alfafld: return real(as_string()); break;
 | 
			
		||||
  case _longfld: return real(as_int()); break;
 | 
			
		||||
  default : break;
 | 
			
		||||
  }
 | 
			
		||||
  return ZERO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::as_string(TString& tmp) const
 | 
			
		||||
{
 | 
			
		||||
  tmp.cut(0);
 | 
			
		||||
  switch(_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _alfafld: tmp = *(TString*)_ptr; break;
 | 
			
		||||
  case _datefld: tmp = as_date().string(); break;
 | 
			
		||||
  case _longfld: tmp << as_int(); break;
 | 
			
		||||
  case _realfld: tmp = as_real().string(); break;
 | 
			
		||||
  default: break;
 | 
			
		||||
  }
 | 
			
		||||
  return !is_null();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const TString& TVariant::as_string() const
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _alfafld)
 | 
			
		||||
    return *(TString*)_ptr;
 | 
			
		||||
  TString& tmp = get_tmp_string();
 | 
			
		||||
  as_string(tmp);
 | 
			
		||||
  return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::convert_to(TFieldtypes ft)
 | 
			
		||||
{
 | 
			
		||||
  if (_type != ft)
 | 
			
		||||
  {
 | 
			
		||||
    switch (ft)
 | 
			
		||||
    {
 | 
			
		||||
    case _alfafld: set(as_string()); break;
 | 
			
		||||
    case _datefld: set(as_date()); break;
 | 
			
		||||
    case _longfld: set(as_int()); break;
 | 
			
		||||
    case _realfld: set(as_real()); break;
 | 
			
		||||
    default      : set_null(); break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::copy(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  switch (var._type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: set(var.as_date()); break;
 | 
			
		||||
  case _longfld: set(var.as_int()); break;
 | 
			
		||||
  case _realfld: set(var.as_real()); break;
 | 
			
		||||
  case _alfafld: set(var.as_string()); break;
 | 
			
		||||
  default : set_null(); break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TVariant::compare(const TSortable& s) const
 | 
			
		||||
{
 | 
			
		||||
  const TVariant& var = (const TVariant&)s;
 | 
			
		||||
  int cmp = 0;
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: cmp = as_date() - var.as_date(); break;
 | 
			
		||||
  case _longfld: cmp = as_int() - var.as_int(); break;
 | 
			
		||||
  case _realfld: 
 | 
			
		||||
    {
 | 
			
		||||
      const real n = as_real() - var.as_real();
 | 
			
		||||
      cmp = n.sign(); 
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  case _alfafld: cmp = as_string().compare(var.as_string()); break;
 | 
			
		||||
  default : cmp = var.is_null() ? 0 : -1;
 | 
			
		||||
  }
 | 
			
		||||
  return cmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant::add(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: set(as_date() + var.as_int()); break;
 | 
			
		||||
  case _longfld: set(as_int() + var.as_int()); break;
 | 
			
		||||
  case _alfafld: *(TString*)_ptr << var.as_string(); break;
 | 
			
		||||
  case _realfld: *(real*)_ptr += var.as_real(); break;
 | 
			
		||||
  default: copy(var); break;
 | 
			
		||||
  }
 | 
			
		||||
  return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant::sub(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: set(as_date() - var.as_int()); break;
 | 
			
		||||
  case _longfld:
 | 
			
		||||
    if (var.type() == _longfld)
 | 
			
		||||
    {
 | 
			
		||||
      set(as_int() - var.as_int());
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    // Fall down
 | 
			
		||||
  default:
 | 
			
		||||
    {
 | 
			
		||||
      real n = as_real();
 | 
			
		||||
      n -= var.as_real();
 | 
			
		||||
      set(n);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TTable name converter
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,10 @@
 | 
			
		||||
#include <sheet.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __VARIANT_H
 | 
			
		||||
#include <variant.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct TRecordset_column_info : public TObject
 | 
			
		||||
{
 | 
			
		||||
  TString _name;   // Table.Column
 | 
			
		||||
@ -16,64 +20,6 @@ struct TRecordset_column_info : public TObject
 | 
			
		||||
  TFieldtypes _type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TVariant
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
class TVariant : public TSortable
 | 
			
		||||
{
 | 
			
		||||
  TFieldtypes _type;
 | 
			
		||||
  void* _ptr;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  virtual TObject* dup() const { return new TVariant(*this); }
 | 
			
		||||
  void copy(const TVariant& var);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TFieldtypes type() const { return _type; } // Internal use only
 | 
			
		||||
  bool is_string() const { return _type == _alfafld; }
 | 
			
		||||
  bool is_empty() const;
 | 
			
		||||
  bool is_null() const { return _type == _nullfld; }
 | 
			
		||||
  bool is_zero() const;
 | 
			
		||||
  void set_null();
 | 
			
		||||
  
 | 
			
		||||
  void set(const char* str);
 | 
			
		||||
  void set(const real& r);
 | 
			
		||||
  void set(const long n);
 | 
			
		||||
  void set(const TDate& d);
 | 
			
		||||
 | 
			
		||||
  TVariant& operator=(const TVariant& var) { copy(var); return *this; }
 | 
			
		||||
  TVariant& operator=(const char* str) { set(str); return *this; }
 | 
			
		||||
  TVariant& operator=(const real& r) { set(r); return *this; }
 | 
			
		||||
  TVariant& operator=(const long n) { set(n); return *this; }
 | 
			
		||||
  TVariant& operator=(const TDate& d) { set(d); return *this; }
 | 
			
		||||
 | 
			
		||||
  const TString& as_string() const;
 | 
			
		||||
  bool as_string(TString& str) const;
 | 
			
		||||
  real as_real() const;
 | 
			
		||||
  long as_int() const;
 | 
			
		||||
  TDate as_date() const;
 | 
			
		||||
  bool as_bool() const;
 | 
			
		||||
  COLOR as_color() const;
 | 
			
		||||
 | 
			
		||||
  void convert_to(TFieldtypes ft);
 | 
			
		||||
 | 
			
		||||
  virtual int compare(const TSortable& s) const;
 | 
			
		||||
  TVariant& add(const TVariant& var);
 | 
			
		||||
  TVariant& sub(const TVariant& var);
 | 
			
		||||
 | 
			
		||||
  TVariant() : _type(_nullfld), _ptr(NULL) { }
 | 
			
		||||
  TVariant(const char* str) : _type(_alfafld), _ptr(new TString(str)) { }
 | 
			
		||||
  TVariant(const real& num) : _type(_realfld), _ptr(new real(num)) { };
 | 
			
		||||
  TVariant(const TDate& d) : _type(_datefld), _ptr(new TDate(d)) { };
 | 
			
		||||
  TVariant(long num) : _type(_longfld), _ptr((void*)num) { };
 | 
			
		||||
  TVariant(bool ok) : _type(_longfld), _ptr((void*)ok) { };
 | 
			
		||||
  TVariant(const TVariant& var) : _type(_nullfld), _ptr(NULL) { copy(var); }
 | 
			
		||||
  virtual ~TVariant() { set_null(); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const TVariant NULL_VARIANT;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TRecordset
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
@ -274,146 +274,6 @@ TReport_image_cache::TReport_image_cache() : TCache(7)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// Utility
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
bool advanced_set_draw_tools(TWindow& win, int border, COLOR fore, COLOR back)
 | 
			
		||||
{
 | 
			
		||||
  const bool has_pen = border > 0;
 | 
			
		||||
  const bool has_brush = (back & 0xFFFFFF) != (COLOR_WHITE & 0xFFFFFF);
 | 
			
		||||
  const bool visible = has_pen || has_brush;
 | 
			
		||||
  if (visible)
 | 
			
		||||
  {
 | 
			
		||||
    if (has_pen)
 | 
			
		||||
      win.set_pen(fore, border, PAT_SOLID);
 | 
			
		||||
    else
 | 
			
		||||
      win.hide_pen();
 | 
			
		||||
    if (has_brush)
 | 
			
		||||
      win.set_brush(back, PAT_SOLID);
 | 
			
		||||
    else
 | 
			
		||||
      win.hide_brush();
 | 
			
		||||
  }
 | 
			
		||||
  return visible;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void advanced_draw_rect(TWindow& win, const RCT& r, int border, COLOR fore, COLOR back)
 | 
			
		||||
{
 | 
			
		||||
  if (advanced_set_draw_tools(win, border, fore, back))
 | 
			
		||||
    xvt_dwin_draw_rect(win.win(), (RCT*)&r);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void advanced_draw_justified_text(TWindow& win, const char* text, short x, short y, short dx)
 | 
			
		||||
{
 | 
			
		||||
  TString txt(text); txt.rtrim();
 | 
			
		||||
  int spaces = 0;
 | 
			
		||||
  for (int s = 0; txt[s]; s++)
 | 
			
		||||
    if (isspace(txt[s])) spaces++;
 | 
			
		||||
  const int tw = xvt_dwin_get_text_width(win.win(), txt, -1);
 | 
			
		||||
  if (tw < dx && spaces > 0)
 | 
			
		||||
  {
 | 
			
		||||
    txt << ' '; // Aggiunge spazio finale
 | 
			
		||||
    const double kspc = double(dx - tw) / spaces;
 | 
			
		||||
    int start = 0;
 | 
			
		||||
    double kx = x;
 | 
			
		||||
    for (int i = 0; txt[i]; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (isspace(txt[i]))
 | 
			
		||||
      {
 | 
			
		||||
        const bool last_word = txt[i+1] == '\0';
 | 
			
		||||
        const TString& parola = txt.sub(start, i + (last_word ? 0 : 1));
 | 
			
		||||
        const int lw = xvt_dwin_get_text_width(win.win(), parola, -1);
 | 
			
		||||
        if (last_word) // ultima parola
 | 
			
		||||
          kx = x+dx-lw;
 | 
			
		||||
        xvt_dwin_draw_text(win.win(), int(kx+0.5), y, parola, -1);
 | 
			
		||||
        kx += lw + kspc;
 | 
			
		||||
        start = i+1;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    xvt_dwin_draw_text(win.win(), x, y, text, -1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void advanced_draw_text(TWindow& win, const char* text, const RCT& r, 
 | 
			
		||||
                        char halign, char valign)
 | 
			
		||||
{
 | 
			
		||||
  const short dx = r.right-r.left;
 | 
			
		||||
  const short dy = r.bottom-r.top;
 | 
			
		||||
  short x = r.left;
 | 
			
		||||
  short y = r.bottom;
 | 
			
		||||
  
 | 
			
		||||
  if (halign != 'L')
 | 
			
		||||
  {
 | 
			
		||||
    const int tw = xvt_dwin_get_text_width(win.win(), text, -1);
 | 
			
		||||
    switch (halign)
 | 
			
		||||
    {
 | 
			
		||||
    case 'C': x += (dx - tw)/2; break;
 | 
			
		||||
    case 'R': x = r.right-tw; break;
 | 
			
		||||
    default : break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Text Height
 | 
			
		||||
  int leading, ascent, descent;
 | 
			
		||||
  xvt_dwin_get_font_metrics(win.win(), &leading, &ascent, &descent);
 | 
			
		||||
  switch (valign)
 | 
			
		||||
  {
 | 
			
		||||
  case 'C': y -= (dy - ascent)/2; break;
 | 
			
		||||
  case 'T': y = r.top + leading + ascent; break;
 | 
			
		||||
  default : y -= descent; break;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if (halign == 'J')
 | 
			
		||||
    advanced_draw_justified_text(win, text, x, y, dx);
 | 
			
		||||
  else
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
  int leading, ascent, descent;
 | 
			
		||||
  xvt_dwin_get_font_metrics(win.win(), &leading, &ascent, &descent);
 | 
			
		||||
  const int ky = leading + ascent + descent;
 | 
			
		||||
 | 
			
		||||
  const int rct_height = rct.bottom - rct.top;
 | 
			
		||||
  int rows = (rct_height+ky/2) / ky;
 | 
			
		||||
 | 
			
		||||
  if (acapo || rows > 1) // Devo scrivere piu' righe?
 | 
			
		||||
  {
 | 
			
		||||
    const int kx = xvt_dwin_get_text_width(win.win(), "ABCDEFGH", 8) / 8; 
 | 
			
		||||
    const unsigned columns = (rct.right - rct.left) / kx;
 | 
			
		||||
 | 
			
		||||
    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)
 | 
			
		||||
@ -569,6 +429,14 @@ TPoint TReport_section::compute_size() const
 | 
			
		||||
    return TPoint(0,0);
 | 
			
		||||
 | 
			
		||||
  TPoint s = _size;
 | 
			
		||||
 | 
			
		||||
  // Lo sfondo occupa sempre tutta la pagina
 | 
			
		||||
  if (type() == 'B' && level() == 0)
 | 
			
		||||
  {
 | 
			
		||||
    s.x = s.y = 19600;
 | 
			
		||||
    return s;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (_size.x <= 0 || _size.y <= 0)  // Calcolo automatico necessario
 | 
			
		||||
  {
 | 
			
		||||
    for (int i = 0; i < items(); i++)
 | 
			
		||||
@ -588,6 +456,7 @@ TPoint TReport_section::compute_size() const
 | 
			
		||||
    if ((s.y % 100) != 0) // Arrotonda alla riga successiva
 | 
			
		||||
      s.y = (s.y / 100 + 1) * 100;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -622,18 +491,45 @@ bool TReport_section::execute_prescript()
 | 
			
		||||
      report().set_curr_field(NULL);
 | 
			
		||||
    ok = _prescript.execute(report());
 | 
			
		||||
  }
 | 
			
		||||
  for (int i = 0; i < items(); i++)
 | 
			
		||||
  for (int i = 0; ok && i < items(); i++)
 | 
			
		||||
  {
 | 
			
		||||
    TReport_field& f = field(i);
 | 
			
		||||
    f.execute_prescript();
 | 
			
		||||
    ok = f.execute_prescript();
 | 
			
		||||
  }
 | 
			
		||||
  return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 visible = has_pen || has_brush;
 | 
			
		||||
  if (visible)
 | 
			
		||||
  {
 | 
			
		||||
    book.set_pen(fore_color(), border()-1);
 | 
			
		||||
    book.set_brush(back_color(), pattern());
 | 
			
		||||
  }
 | 
			
		||||
  return visible;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TReport_section::print(TBook& book) const
 | 
			
		||||
{
 | 
			
		||||
  if (shown() && active())
 | 
			
		||||
  {
 | 
			
		||||
    if (print_tools(book))
 | 
			
		||||
    {
 | 
			
		||||
      TRectangle 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
 | 
			
		||||
        book.draw_rectangle(rct);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < items(); i++)
 | 
			
		||||
    {
 | 
			
		||||
      const TReport_field& f = field(i);
 | 
			
		||||
@ -671,6 +567,18 @@ void TReport_section::save(TXmlItem& root) const
 | 
			
		||||
  set_num_attr(item, "y", pos().y);
 | 
			
		||||
  set_num_attr(item, "width", width());
 | 
			
		||||
  set_num_attr(item, "height", height());
 | 
			
		||||
 | 
			
		||||
  set_col_attr(item, "bg_color", back_color(), COLOR_WHITE);
 | 
			
		||||
  set_col_attr(item, "fg_color", fore_color(), COLOR_BLACK);
 | 
			
		||||
  if (border() > 0)
 | 
			
		||||
  {
 | 
			
		||||
    item.SetAttr("border", border());
 | 
			
		||||
    if (radius() > 0)
 | 
			
		||||
      item.SetAttr("radius", radius());
 | 
			
		||||
  }
 | 
			
		||||
  if (pattern() != PAT_HOLLOW)
 | 
			
		||||
    item.SetAttr("pattern", pattern());
 | 
			
		||||
 | 
			
		||||
  item.SetAttr("hidden", _hidden);
 | 
			
		||||
  item.SetAttr("deactivated", _deactivated);
 | 
			
		||||
  item.SetAttr("hidden_if_needed", hidden_if_needed());
 | 
			
		||||
@ -699,6 +607,13 @@ void TReport_section::load(const TXmlItem& sec)
 | 
			
		||||
  _pos.y = get_num_attr(sec, "y");
 | 
			
		||||
  set_width(get_num_attr(sec, "width"));
 | 
			
		||||
  set_height(get_num_attr(sec, "height"));
 | 
			
		||||
 | 
			
		||||
  set_border(sec.GetIntAttr("border"));
 | 
			
		||||
  set_pattern((PAT_STYLE)sec.GetIntAttr("pattern", PAT_HOLLOW));
 | 
			
		||||
  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));
 | 
			
		||||
 | 
			
		||||
  force_page_break(sec.GetBoolAttr("pagebreak"));
 | 
			
		||||
  keep_with_next(sec.GetBoolAttr("keep_with_next"));
 | 
			
		||||
  hide_if_needed(sec.GetBoolAttr("hidden_if_needed"));
 | 
			
		||||
@ -751,7 +666,9 @@ 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),
 | 
			
		||||
                 _repeat(false), _hidden(false), _deactivated(false), _font(NULL)
 | 
			
		||||
                 _repeat(false), _hidden(false), _deactivated(false), _font(NULL),
 | 
			
		||||
                 _bgcolor(COLOR_WHITE), _fgcolor(COLOR_BLACK), _pattern(PAT_HOLLOW), 
 | 
			
		||||
                 _border(0), _radius(0)
 | 
			
		||||
 | 
			
		||||
                 
 | 
			
		||||
 | 
			
		||||
@ -949,10 +866,23 @@ TReport_script::~TReport_script()
 | 
			
		||||
 | 
			
		||||
struct TReport_array_item : public TObject
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
  virtual TObject* dup() const;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TString _code, _value;
 | 
			
		||||
  TReport_script _script;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TObject* TReport_array_item::dup() const
 | 
			
		||||
{
 | 
			
		||||
  TReport_array_item* i = new TReport_array_item;
 | 
			
		||||
  i->_code = _code;
 | 
			
		||||
  i->_value = _value;
 | 
			
		||||
  i->_script = _script;
 | 
			
		||||
  return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TReport_field
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
@ -1067,18 +997,19 @@ void TReport_field::copy(const TReport_field& rf)
 | 
			
		||||
  _rct = rf._rct;
 | 
			
		||||
  set_dynamic_height(rf.dynamic_height());
 | 
			
		||||
  _fgcolor = rf._fgcolor; _bgcolor = rf._bgcolor;
 | 
			
		||||
  _border = rf._border;
 | 
			
		||||
  _border = rf._border; _radius = rf._radius; _pattern = rf._pattern;
 | 
			
		||||
  _halign = rf._halign; _valign = rf._valign;
 | 
			
		||||
  _picture = rf._picture; _field = rf._field;
 | 
			
		||||
  _hidden = rf.hidden();
 | 
			
		||||
  _deactivated = rf.deactivated();
 | 
			
		||||
  _hide_zeroes = rf._hide_zeroes;
 | 
			
		||||
  _selected = false;
 | 
			
		||||
  _field = rf._field; _alt_field = rf._alt_field;
 | 
			
		||||
  _prescript = rf._prescript;
 | 
			
		||||
  _postscript = rf._postscript;
 | 
			
		||||
  _list = rf._list;
 | 
			
		||||
  
 | 
			
		||||
  set_font(rf.font());
 | 
			
		||||
  _selected = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* TReport_field::type_name() const
 | 
			
		||||
@ -1226,9 +1157,14 @@ TReport_array_item* TReport_field::get_array_item() const
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TReport_field::zeroes_hidden() const 
 | 
			
		||||
{ 
 | 
			
		||||
  return _hide_zeroes && strchr("DNVP", _type) != NULL; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const TString& TReport_field::formatted_text() const
 | 
			
		||||
{
 | 
			
		||||
  if (_hide_zeroes && _var.is_zero())
 | 
			
		||||
  if (zeroes_hidden() && _var.is_zero())
 | 
			
		||||
    return EMPTY_STRING;
 | 
			
		||||
 | 
			
		||||
  switch (type())
 | 
			
		||||
@ -1306,12 +1242,12 @@ const TString& TReport_field::formatted_text() const
 | 
			
		||||
bool TReport_field::print_tools(TBook& book) const
 | 
			
		||||
{
 | 
			
		||||
  const bool has_pen = border() > 0;
 | 
			
		||||
  const bool has_brush = (back_color() & 0xFFFFFF) != (COLOR_WHITE & 0xFFFFFF);
 | 
			
		||||
  const bool has_brush = pattern() >= PAT_SOLID;
 | 
			
		||||
  const bool visible = has_pen || has_brush;
 | 
			
		||||
  if (visible)
 | 
			
		||||
  {
 | 
			
		||||
    book.set_pen(fore_color(), border()-1);
 | 
			
		||||
    book.set_brush(back_color(), has_brush ? PAT_SOLID : PAT_HOLLOW);
 | 
			
		||||
    book.set_brush(back_color(), pattern());
 | 
			
		||||
  }
 | 
			
		||||
  return visible;
 | 
			
		||||
}
 | 
			
		||||
@ -1319,7 +1255,12 @@ bool TReport_field::print_tools(TBook& book) const
 | 
			
		||||
void TReport_field::print_rect(TBook& book) const
 | 
			
		||||
{
 | 
			
		||||
  if (print_tools(book))
 | 
			
		||||
  {
 | 
			
		||||
    if (radius() > 0)
 | 
			
		||||
      book.draw_round_rectangle(get_draw_rect(), radius());
 | 
			
		||||
    else
 | 
			
		||||
      book.draw_rectangle(get_draw_rect());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TReport_field::print(TBook& book) const
 | 
			
		||||
@ -1428,7 +1369,7 @@ void TReport_field::save(TXmlItem& root) const
 | 
			
		||||
  fld.SetAttr("dynamic_height", dynamic_height());
 | 
			
		||||
  fld.SetAttr("hidden", _hidden);
 | 
			
		||||
  fld.SetAttr("deactivated", _deactivated);
 | 
			
		||||
  fld.SetAttr("hide_zero", _hide_zeroes);
 | 
			
		||||
  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);
 | 
			
		||||
  if (has_font())
 | 
			
		||||
@ -1449,7 +1390,14 @@ void TReport_field::save(TXmlItem& root) const
 | 
			
		||||
  case 'C': fld.SetAttr("valign", "center"); break;
 | 
			
		||||
  default : break;
 | 
			
		||||
  };
 | 
			
		||||
  if (border() > 0)
 | 
			
		||||
  {
 | 
			
		||||
    fld.SetAttr("border", border());
 | 
			
		||||
    if (radius() > 0)
 | 
			
		||||
      fld.SetAttr("radius", radius());
 | 
			
		||||
  }
 | 
			
		||||
  if (pattern() != PAT_SOLID)
 | 
			
		||||
    fld.SetAttr("pattern", pattern());
 | 
			
		||||
  fld.SetAttr("text", picture());
 | 
			
		||||
  fld.SetAttr("codval", codval());
 | 
			
		||||
  fld.SetAttr("link", link());
 | 
			
		||||
@ -1491,6 +1439,8 @@ bool TReport_field::load(const TXmlItem& fld)
 | 
			
		||||
  activate(!fld.GetBoolAttr("deactivated"));
 | 
			
		||||
  hide_zeroes(fld.GetBoolAttr("hide_zero"));
 | 
			
		||||
  set_border(fld.GetIntAttr("border"));
 | 
			
		||||
  set_pattern((PAT_STYLE)fld.GetIntAttr("pattern", PAT_SOLID));
 | 
			
		||||
  set_radius(fld.GetIntAttr("radius"));
 | 
			
		||||
  set_back_color(get_col_attr(fld, "bg_color", COLOR_WHITE));
 | 
			
		||||
  set_fore_color(get_col_attr(fld, "fg_color", COLOR_BLACK));
 | 
			
		||||
  set_horizontal_alignment(get_chr_attr(fld, "align", 'L'));
 | 
			
		||||
@ -1578,7 +1528,7 @@ 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),
 | 
			
		||||
               _fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE), _radius(0), _pattern(PAT_SOLID),
 | 
			
		||||
               _border(0), _halign('L'), _valign('T'),_dynamic_height(false), _font(NULL),
 | 
			
		||||
               _hidden(false), _deactivated(false), _hide_zeroes(false), _selected(false)             
 | 
			
		||||
{ }
 | 
			
		||||
@ -1721,7 +1671,7 @@ int TReport::parse_field(const char* code, char& type, int& level, int& id) cons
 | 
			
		||||
  return strchr(code, '@') != NULL ? 4 : 3;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TReport_field* TReport::field(const TString& code)
 | 
			
		||||
TReport_field* TReport::field(const char* code)
 | 
			
		||||
{
 | 
			
		||||
  char type = ' ';
 | 
			
		||||
  int level = -1, id = 0;
 | 
			
		||||
@ -1984,26 +1934,25 @@ bool TReport::get_report_field(const TString& name, TVariant& var) const
 | 
			
		||||
    else
 | 
			
		||||
      str++;
 | 
			
		||||
  }
 | 
			
		||||
  const TFixed_string n(str); 
 | 
			
		||||
  
 | 
			
		||||
  if (n == "PAGE")
 | 
			
		||||
  TReport_field* fld = ((TReport*)this)->field(str);
 | 
			
		||||
  if (fld != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    var = fld->get();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (xvt_str_compare_ignoring_case(str, "PAGE") == 0)
 | 
			
		||||
  {
 | 
			
		||||
    var = _rep_page;
 | 
			
		||||
    return true;
 | 
			
		||||
  } else
 | 
			
		||||
  if (n == "BOOK.PAGE")
 | 
			
		||||
  if (xvt_str_compare_ignoring_case(str, "BOOKPAGE") == 0)
 | 
			
		||||
  {
 | 
			
		||||
    var = _book_page;
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  TReport_field* fld = ((TReport*)this)->field(n);
 | 
			
		||||
  if (fld != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    var = fld->get();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return found;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -149,6 +149,9 @@ class TReport_section : public TArray
 | 
			
		||||
  TString _condition, _groupby;
 | 
			
		||||
  bool _page_break, _hidden_if_needed, _keep_with_next, _repeat;
 | 
			
		||||
  bool _hidden, _deactivated;
 | 
			
		||||
  COLOR _fgcolor, _bgcolor;
 | 
			
		||||
  int _border, _radius;
 | 
			
		||||
  PAT_STYLE _pattern;
 | 
			
		||||
  TReport_script _prescript, _postscript;
 | 
			
		||||
 | 
			
		||||
  TReport_font* _font;
 | 
			
		||||
@ -156,6 +159,7 @@ class TReport_section : public TArray
 | 
			
		||||
protected:
 | 
			
		||||
  virtual const char* class_name() const { return "ReportSection"; }
 | 
			
		||||
  TReport_section* father_section() const;
 | 
			
		||||
  bool print_tools(TBook& book) const;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  virtual int add(TObject* obj);
 | 
			
		||||
@ -178,6 +182,18 @@ public:
 | 
			
		||||
  bool compute_rect(TRectangle& rct) const;
 | 
			
		||||
  const TPoint& pos() const { return _pos; }
 | 
			
		||||
  void set_pos(const TPoint& p) { _pos = p; }
 | 
			
		||||
 | 
			
		||||
  void set_fore_color(COLOR c) { _fgcolor = c; }
 | 
			
		||||
  COLOR fore_color() const { return _fgcolor; }
 | 
			
		||||
  void set_back_color(COLOR c) { _bgcolor = c; }
 | 
			
		||||
  COLOR back_color() const { return _bgcolor; }
 | 
			
		||||
  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; }
 | 
			
		||||
  
 | 
			
		||||
  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; }
 | 
			
		||||
@ -233,7 +249,8 @@ class TReport_field : public TSortable
 | 
			
		||||
  char _type;   // Text, String, Numeric, Price, Valuta, Date, Line, Rectangle, Image
 | 
			
		||||
  TRectangle _rct; // In centesimi
 | 
			
		||||
  COLOR _fgcolor, _bgcolor;
 | 
			
		||||
  short _border;
 | 
			
		||||
  int _border, _radius;
 | 
			
		||||
  PAT_STYLE _pattern;
 | 
			
		||||
  char _halign, _valign;
 | 
			
		||||
  bool _dynamic_height;
 | 
			
		||||
  TBit_array _groups;
 | 
			
		||||
@ -314,7 +331,7 @@ public:
 | 
			
		||||
  bool active() const { return !deactivated(); }
 | 
			
		||||
  void activate(bool on) { _deactivated = !on; }
 | 
			
		||||
  void deactivate() { activate(false); }
 | 
			
		||||
  bool zeroes_hidden() const { return _hide_zeroes; }
 | 
			
		||||
  bool zeroes_hidden() const;
 | 
			
		||||
  void hide_zeroes(bool hz) { _hide_zeroes = hz; }
 | 
			
		||||
 | 
			
		||||
  bool draw_hidden() const { return _draw_hidden; }
 | 
			
		||||
@ -339,8 +356,14 @@ public:
 | 
			
		||||
  void set_back_color(COLOR c) { _bgcolor = c; }
 | 
			
		||||
  COLOR back_color() const { return _bgcolor; }
 | 
			
		||||
  COLOR link_color() const;
 | 
			
		||||
  void set_border(short b) { _border = b; }
 | 
			
		||||
  
 | 
			
		||||
  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; }
 | 
			
		||||
 | 
			
		||||
  void set_horizontal_alignment(char a) { _halign = a; }
 | 
			
		||||
  char horizontal_alignment() const { return _halign; }
 | 
			
		||||
  void set_vertical_alignment(char a) { _valign = a; }
 | 
			
		||||
@ -355,10 +378,6 @@ public:
 | 
			
		||||
  bool selected() const { return _selected; }
 | 
			
		||||
  void offset(const TPoint& pt);
 | 
			
		||||
 | 
			
		||||
//  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;
 | 
			
		||||
  virtual void print_rect(TBook& book) const;
 | 
			
		||||
  virtual void print(TBook& book) const;
 | 
			
		||||
@ -484,18 +503,11 @@ public:
 | 
			
		||||
  TReport_field* curr_field() const { return _curr_field; }
 | 
			
		||||
 | 
			
		||||
  int parse_field(const char* code, char& type, int& level, int& id) const;
 | 
			
		||||
  TReport_field* field(const TString& code);
 | 
			
		||||
  TReport_field* field(const char* code);
 | 
			
		||||
 
 | 
			
		||||
  void destroy();
 | 
			
		||||
  TReport();
 | 
			
		||||
  virtual ~TReport();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,151 @@
 | 
			
		||||
 | 
			
		||||
static bool _print_aborted = false;
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// Utility
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
bool advanced_set_draw_tools(TWindow& win, PAT_STYLE pat, int border, COLOR fore, COLOR back)
 | 
			
		||||
{
 | 
			
		||||
  const bool has_pen = border > 0;
 | 
			
		||||
  const bool has_brush = pat > PAT_HOLLOW && back != COLOR_WHITE;
 | 
			
		||||
  const bool visible = has_pen || has_brush;
 | 
			
		||||
  if (visible)
 | 
			
		||||
  {
 | 
			
		||||
    if (has_pen)
 | 
			
		||||
      win.set_pen(fore, border, PAT_SOLID);
 | 
			
		||||
    else
 | 
			
		||||
      win.hide_pen();
 | 
			
		||||
    if (has_brush)
 | 
			
		||||
      win.set_brush(back, pat);
 | 
			
		||||
    else
 | 
			
		||||
      win.hide_brush();
 | 
			
		||||
  }
 | 
			
		||||
  return visible;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void advanced_draw_rect(TWindow& win, const RCT& r, PAT_STYLE pat, int border, COLOR fore, COLOR back, int radius)
 | 
			
		||||
{
 | 
			
		||||
  if (advanced_set_draw_tools(win, pat, border, fore, back))
 | 
			
		||||
  {
 | 
			
		||||
    if (radius > 0)
 | 
			
		||||
      xvt_dwin_draw_roundrect(win.win(), &r, radius, radius);
 | 
			
		||||
    else
 | 
			
		||||
      xvt_dwin_draw_rect(win.win(), (RCT*)&r);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void advanced_draw_justified_text(TWindow& win, const char* text, short x, short y, short dx)
 | 
			
		||||
{
 | 
			
		||||
  TString txt(text); txt.rtrim();
 | 
			
		||||
  int spaces = 0;
 | 
			
		||||
  for (int s = 0; txt[s]; s++)
 | 
			
		||||
    if (isspace(txt[s])) spaces++;
 | 
			
		||||
  const int tw = xvt_dwin_get_text_width(win.win(), txt, -1);
 | 
			
		||||
  if (tw < dx && spaces > 0)
 | 
			
		||||
  {
 | 
			
		||||
    txt << ' '; // Aggiunge spazio finale
 | 
			
		||||
    const double kspc = double(dx - tw) / spaces;
 | 
			
		||||
    int start = 0;
 | 
			
		||||
    double kx = x;
 | 
			
		||||
    for (int i = 0; txt[i]; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (isspace(txt[i]))
 | 
			
		||||
      {
 | 
			
		||||
        const bool last_word = txt[i+1] == '\0';
 | 
			
		||||
        const TString& parola = txt.sub(start, i + (last_word ? 0 : 1));
 | 
			
		||||
        const int lw = xvt_dwin_get_text_width(win.win(), parola, -1);
 | 
			
		||||
        if (last_word) // ultima parola
 | 
			
		||||
          kx = x+dx-lw;
 | 
			
		||||
        xvt_dwin_draw_text(win.win(), int(kx+0.5), y, parola, -1);
 | 
			
		||||
        kx += lw + kspc;
 | 
			
		||||
        start = i+1;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    xvt_dwin_draw_text(win.win(), x, y, text, -1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void advanced_draw_text(TWindow& win, const char* text, const RCT& r, 
 | 
			
		||||
                        char halign, char valign)
 | 
			
		||||
{
 | 
			
		||||
  const short dx = r.right-r.left;
 | 
			
		||||
  const short dy = r.bottom-r.top;
 | 
			
		||||
  short x = r.left;
 | 
			
		||||
  short y = r.bottom;
 | 
			
		||||
  
 | 
			
		||||
  if (halign != 'L')
 | 
			
		||||
  {
 | 
			
		||||
    const int tw = xvt_dwin_get_text_width(win.win(), text, -1);
 | 
			
		||||
    switch (halign)
 | 
			
		||||
    {
 | 
			
		||||
    case 'C': x += (dx - tw)/2; break;
 | 
			
		||||
    case 'R': x = r.right-tw; break;
 | 
			
		||||
    default : break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Text Height
 | 
			
		||||
  int leading, ascent, descent;
 | 
			
		||||
  xvt_dwin_get_font_metrics(win.win(), &leading, &ascent, &descent);
 | 
			
		||||
  switch (valign)
 | 
			
		||||
  {
 | 
			
		||||
  case 'C': y -= (dy - ascent)/2; break;
 | 
			
		||||
  case 'T': y = r.top + leading + ascent; break;
 | 
			
		||||
  default : y -= descent; break;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if (halign == 'J')
 | 
			
		||||
    advanced_draw_justified_text(win, text, x, y, dx);
 | 
			
		||||
  else
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
  int leading, ascent, descent;
 | 
			
		||||
  xvt_dwin_get_font_metrics(win.win(), &leading, &ascent, &descent);
 | 
			
		||||
  const int ky = leading + ascent + descent;
 | 
			
		||||
 | 
			
		||||
  const int rct_height = rct.bottom - rct.top;
 | 
			
		||||
  int rows = (rct_height+ky/2) / ky;
 | 
			
		||||
 | 
			
		||||
  if (acapo || rows > 1) // Devo scrivere piu' righe?
 | 
			
		||||
  {
 | 
			
		||||
    const int kx = xvt_dwin_get_text_width(win.win(), "ABCDEFGH", 8) / 8; 
 | 
			
		||||
    const unsigned columns = (rct.right - rct.left) / kx;
 | 
			
		||||
 | 
			
		||||
    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); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TReport_link
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
@ -146,7 +291,7 @@ void TPrint_preview_window::update()
 | 
			
		||||
  if (pag.v < rct.bottom) rct.bottom = pag.v;
 | 
			
		||||
  hide_pen();
 | 
			
		||||
  set_brush(COLOR_WHITE);
 | 
			
		||||
  xvt_dwin_draw_rect(win(), &rct);
 | 
			
		||||
  xvt_dwin_draw_rect(win(), &rct); // Disegna foglio bianco
 | 
			
		||||
 | 
			
		||||
  if (_grid)
 | 
			
		||||
  {
 | 
			
		||||
@ -243,9 +388,9 @@ void TPrint_preview_window::handler(WINDOW win, EVENT* ep)
 | 
			
		||||
  {
 | 
			
		||||
  case E_MOUSE_MOVE:
 | 
			
		||||
    if (find_link(ep->v.mouse.where) != NULL)
 | 
			
		||||
      xvt_win_set_cursor(win, CURSOR_CROSS);
 | 
			
		||||
      xvt_win_set_cursor(win, 8004);          // Ditino
 | 
			
		||||
    else
 | 
			
		||||
      xvt_win_set_cursor(win, CURSOR_ARROW);
 | 
			
		||||
      xvt_win_set_cursor(win, CURSOR_ARROW);  // Freccia
 | 
			
		||||
    break;
 | 
			
		||||
  case E_MOUSE_DOWN:
 | 
			
		||||
    if (ep->v.mouse.button == 0)
 | 
			
		||||
@ -279,8 +424,8 @@ void TPrint_preview_window::handler(WINDOW win, EVENT* ep)
 | 
			
		||||
        processed = _page < _book->pages(); 
 | 
			
		||||
        if (processed) _page = _book->pages(); 
 | 
			
		||||
        break;
 | 
			
		||||
      case POPUP_ZOOMIN : if (_zoom < 300) { _zoom += 25; update_scroll_range(); } break;
 | 
			
		||||
      case POPUP_ZOOMOUT: if (_zoom >  50) { _zoom -= 25; update_scroll_range(); } break;
 | 
			
		||||
      case POPUP_ZOOMIN : if (_zoom < 300) { _zoom += 10; update_scroll_range(); } break;
 | 
			
		||||
      case POPUP_ZOOMOUT: if (_zoom >  50) { _zoom -= 10; update_scroll_range(); } break;
 | 
			
		||||
      case POPUP_GRID   : _grid = !_grid; break;
 | 
			
		||||
      default:processed = false; break;
 | 
			
		||||
      }
 | 
			
		||||
@ -680,6 +825,12 @@ void TBook::draw_rectangle(const TRectangle& r)
 | 
			
		||||
  *_out << "<rectangle/>" << endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBook::draw_round_rectangle(const TRectangle& r, int radius)
 | 
			
		||||
{
 | 
			
		||||
  define_frame(r);
 | 
			
		||||
  *_out << "<rounded_rectangle radius=" << radius << " />" << endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TBook::draw_ellipse(const TRectangle& r)
 | 
			
		||||
{
 | 
			
		||||
  define_frame(r);
 | 
			
		||||
@ -808,18 +959,19 @@ bool TBook::print_page(TWindow& win, size_t page)
 | 
			
		||||
 | 
			
		||||
          if (!stringona.blank() && rct.right > rct.left) // Possono esserci campi chiave nascosti
 | 
			
		||||
          {
 | 
			
		||||
            WINDOW w = win.win();
 | 
			
		||||
            DRAW_CTOOLS dct;
 | 
			
		||||
            xvt_dwin_get_draw_ctools(win.win(), &dct);
 | 
			
		||||
            xvt_dwin_get_draw_ctools(w, &dct);
 | 
			
		||||
 | 
			
		||||
            XVT_FNTID oldfont = xvt_dwin_get_font(win.win());
 | 
			
		||||
            XVT_FNTID oldfont = xvt_dwin_get_font(w);
 | 
			
		||||
            XVT_FNTID newfont = xvt_font_create();
 | 
			
		||||
            xvt_font_copy(newfont, oldfont, XVT_FA_ALL);
 | 
			
		||||
            xvt_font_set_style(newfont, xvt_font_get_style(oldfont) | XVT_FS_UNDERLINE);
 | 
			
		||||
            xvt_dwin_set_font(win.win(), newfont);
 | 
			
		||||
            xvt_dwin_set_font(w, newfont);
 | 
			
		||||
            win.set_color(COLOR_BLUE, dct.back_color);
 | 
			
		||||
            advanced_draw_text(win, stringona, rct, _horizontal_alignment, _vertical_alignment);
 | 
			
		||||
            win.set_color(dct.fore_color, dct.back_color);
 | 
			
		||||
            xvt_dwin_set_font(win.win(), oldfont);         
 | 
			
		||||
            xvt_dwin_set_font(w, oldfont);         
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
@ -830,7 +982,7 @@ bool TBook::print_page(TWindow& win, size_t page)
 | 
			
		||||
      COLOR col = COLOR_BLACK; 
 | 
			
		||||
      PAT_STYLE pat = PAT_SOLID;
 | 
			
		||||
      sscanf(str, "<brush color=%u pattern=%u />", &col, &pat);
 | 
			
		||||
      if (pat == PAT_HOLLOW)
 | 
			
		||||
      if (pat <= PAT_HOLLOW || col == COLOR_WHITE)
 | 
			
		||||
        win.hide_brush();
 | 
			
		||||
      else
 | 
			
		||||
        win.set_brush(col, pat);
 | 
			
		||||
@ -897,6 +1049,14 @@ bool TBook::print_page(TWindow& win, size_t page)
 | 
			
		||||
      xvt_dwin_draw_rect(win.win(), &rct);
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    if (str.starts_with("<rounded_rectangle"))
 | 
			
		||||
    {
 | 
			
		||||
      const int radius = get_xml_int(str, "radius", 0);
 | 
			
		||||
      const TRectangle rr(0,0,radius,radius);
 | 
			
		||||
      RCT re; win.log2dev(rr, re);
 | 
			
		||||
      xvt_dwin_draw_roundrect(win.win(), &rct, re.right-re.left, re.bottom-re.top);
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
    if (str == "<text>")
 | 
			
		||||
    {
 | 
			
		||||
      TString stringona;
 | 
			
		||||
@ -1323,7 +1483,12 @@ long TReport_book::print_section(TReport_section& rs)
 | 
			
		||||
      return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  rs.execute_prescript();
 | 
			
		||||
  if (!rs.execute_prescript())
 | 
			
		||||
  {
 | 
			
		||||
    _print_aborted = true;
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const long height = rs.compute_size().y; // Compute size after the initilization script!
 | 
			
		||||
 | 
			
		||||
  if (height > 0) // Has some visible fields
 | 
			
		||||
@ -1350,7 +1515,8 @@ long TReport_book::print_section(TReport_section& rs)
 | 
			
		||||
      _page_break_allowed = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  rs.execute_postscript();
 | 
			
		||||
  if (!rs.execute_postscript())
 | 
			
		||||
    _print_aborted = true;
 | 
			
		||||
 | 
			
		||||
  return height;
 | 
			
		||||
}
 | 
			
		||||
@ -1588,11 +1754,3 @@ TReport_book::TReport_book(const char* name)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// Remote control interface
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void abort_printing()
 | 
			
		||||
{ _print_aborted = true; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -41,6 +41,7 @@ public:
 | 
			
		||||
  void set_text_color(COLOR fore, COLOR back = COLOR_WHITE, bool opaque = false);
 | 
			
		||||
  void set_text_align(char halign ='L', char valign = 'T');
 | 
			
		||||
  void draw_rectangle(const TRectangle& rect);
 | 
			
		||||
  void draw_round_rectangle(const TRectangle& rect, int radius);
 | 
			
		||||
  void draw_ellipse(const TRectangle& rect);
 | 
			
		||||
  void draw_line(const TRectangle& rect);
 | 
			
		||||
  void draw_image(const TRectangle& rect, const char* filename);
 | 
			
		||||
@ -53,6 +54,8 @@ public:
 | 
			
		||||
  size_t pages() const { return _pages; }
 | 
			
		||||
  virtual int lpi() const { return 6; }
 | 
			
		||||
  virtual int cpi() const { return 10; }
 | 
			
		||||
  virtual int logical_page_width() const { return page_size().x * cpi() / page_res().x * 100; }
 | 
			
		||||
  virtual int logical_page_height() const { return page_size().y * lpi() / page_res().y * 100; }
 | 
			
		||||
  
 | 
			
		||||
  virtual bool print_page(TWindow& win, size_t page);
 | 
			
		||||
  virtual bool on_link(const TReport_link&) { return false; }
 | 
			
		||||
@ -94,11 +97,18 @@ public:
 | 
			
		||||
  
 | 
			
		||||
  virtual int lpi() const;
 | 
			
		||||
  virtual int cpi() const;
 | 
			
		||||
  virtual int logical_page_width() const { return _logical_page_width; }
 | 
			
		||||
  virtual int logical_page_height() const { return _logical_page_height; }
 | 
			
		||||
  virtual bool print(size_t pagefrom = 0, size_t pageto = 0, size_t copies = 0);
 | 
			
		||||
 | 
			
		||||
  TReport_book(const char* name = NULL);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void abort_printing();
 | 
			
		||||
bool advanced_set_draw_tools(TWindow& win, PAT_STYLE pat, int border, COLOR fore, COLOR back);
 | 
			
		||||
void advanced_draw_rect(TWindow& win, const RCT& r, PAT_STYLE pat, int border, COLOR fore, COLOR back, int radius);
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										323
									
								
								include/variant.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										323
									
								
								include/variant.cpp
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,323 @@
 | 
			
		||||
#include <xvt.h>
 | 
			
		||||
#include <variant.h>
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TVariant
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
const TVariant NULL_VARIANT;
 | 
			
		||||
 | 
			
		||||
void TVariant::set_null()
 | 
			
		||||
{
 | 
			
		||||
  if (_ptr != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    if (_type != _nullfld && _type != _longfld)
 | 
			
		||||
      delete (char *) _ptr;
 | 
			
		||||
    _ptr = NULL;
 | 
			
		||||
  }
 | 
			
		||||
  _type = _nullfld;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const char* str)
 | 
			
		||||
{
 | 
			
		||||
  if (str != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    if (_type == _alfafld)
 | 
			
		||||
      *((TString*)_ptr) = str;
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      set_null();
 | 
			
		||||
      _type = _alfafld;
 | 
			
		||||
      _ptr = new TString(str);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    set_null();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const real& r)
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _realfld)
 | 
			
		||||
    *((real*)_ptr) = r;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    set_null();
 | 
			
		||||
    _type = _realfld;
 | 
			
		||||
    _ptr = new real(r);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const TDate& d)
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _datefld)
 | 
			
		||||
    *((TDate*)_ptr) = d;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    set_null();
 | 
			
		||||
    _type = _datefld;
 | 
			
		||||
    _ptr = new TDate(d);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::set(const long n)
 | 
			
		||||
{
 | 
			
		||||
  if (_type != _longfld)
 | 
			
		||||
    set_null();
 | 
			
		||||
  _type = _longfld;
 | 
			
		||||
  _ptr = (void*)n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::is_zero() const
 | 
			
		||||
{
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: return !as_date().ok();
 | 
			
		||||
  case _longfld: return _ptr == NULL;
 | 
			
		||||
  case _realfld: return as_real().is_zero();
 | 
			
		||||
  case _alfafld: return real::is_null(as_string());
 | 
			
		||||
  default: break;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::is_empty() const
 | 
			
		||||
{
 | 
			
		||||
 if (_type == _alfafld)
 | 
			
		||||
   return as_string().empty();
 | 
			
		||||
 return is_zero();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TDate TVariant::as_date() const
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _datefld)
 | 
			
		||||
    return *(TDate*)_ptr;
 | 
			
		||||
  if (_type == _intfld || _type == _realfld)
 | 
			
		||||
    return TDate(as_int());
 | 
			
		||||
  return TDate(as_string());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long TVariant::as_int() const
 | 
			
		||||
{
 | 
			
		||||
  long n = 0;
 | 
			
		||||
  switch(_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: n = as_date().date2ansi(); break;
 | 
			
		||||
  case _longfld: n = (long)_ptr; break;
 | 
			
		||||
  case _realfld: n = as_real().integer(); break;
 | 
			
		||||
  case _alfafld: n = atoi(as_string()); break;
 | 
			
		||||
  default : break;
 | 
			
		||||
  }
 | 
			
		||||
  return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::as_bool() const
 | 
			
		||||
{
 | 
			
		||||
  bool ok = false;
 | 
			
		||||
  if (_type == _alfafld)
 | 
			
		||||
    ok = strchr("1XY", as_string()[0]) != NULL;
 | 
			
		||||
  else
 | 
			
		||||
    ok = as_int() != 0;
 | 
			
		||||
  return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
COLOR TVariant::as_color() const
 | 
			
		||||
{
 | 
			
		||||
  const unsigned long rgb = as_int();
 | 
			
		||||
  unsigned char r = XVT_COLOR_GET_RED(rgb);
 | 
			
		||||
  unsigned char g = XVT_COLOR_GET_GREEN(rgb);
 | 
			
		||||
  unsigned char b = XVT_COLOR_GET_BLUE(rgb);
 | 
			
		||||
  return MAKE_COLOR(r, g, b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
real TVariant::as_real() const
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _realfld)
 | 
			
		||||
    return *(real*)_ptr;
 | 
			
		||||
  switch(_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _alfafld: return real(as_string()); break;
 | 
			
		||||
  case _longfld: return real(as_int()); break;
 | 
			
		||||
  default : break;
 | 
			
		||||
  }
 | 
			
		||||
  return ZERO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant::as_string(TString& tmp) const
 | 
			
		||||
{
 | 
			
		||||
  tmp.cut(0);
 | 
			
		||||
  switch(_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _alfafld: tmp = *(TString*)_ptr; break;
 | 
			
		||||
  case _datefld: tmp = as_date().string(); break;
 | 
			
		||||
  case _longfld: tmp << as_int(); break;
 | 
			
		||||
  case _realfld: tmp = as_real().string(); break;
 | 
			
		||||
  default: break;
 | 
			
		||||
  }
 | 
			
		||||
  return !is_null();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const TString& TVariant::as_string() const
 | 
			
		||||
{
 | 
			
		||||
  if (_type == _alfafld)
 | 
			
		||||
    return *(TString*)_ptr;
 | 
			
		||||
  TString& tmp = get_tmp_string();
 | 
			
		||||
  as_string(tmp);
 | 
			
		||||
  return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::convert_to(TFieldtypes ft)
 | 
			
		||||
{
 | 
			
		||||
  if (_type != ft)
 | 
			
		||||
  {
 | 
			
		||||
    switch (ft)
 | 
			
		||||
    {
 | 
			
		||||
    case _alfafld: set(as_string()); break;
 | 
			
		||||
    case _datefld: set(as_date()); break;
 | 
			
		||||
    case _longfld: set(as_int()); break;
 | 
			
		||||
    case _realfld: set(as_real()); break;
 | 
			
		||||
    default      : set_null(); break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant::copy(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  switch (var._type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: set(var.as_date()); break;
 | 
			
		||||
  case _longfld: set(var.as_int()); break;
 | 
			
		||||
  case _realfld: set(var.as_real()); break;
 | 
			
		||||
  case _alfafld: set(var.as_string()); break;
 | 
			
		||||
  default : set_null(); break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TVariant::compare(const TSortable& s) const
 | 
			
		||||
{
 | 
			
		||||
  const TVariant& var = (const TVariant&)s;
 | 
			
		||||
  int cmp = 0;
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: cmp = as_date() - var.as_date(); break;
 | 
			
		||||
  case _longfld: cmp = as_int() - var.as_int(); break;
 | 
			
		||||
  case _realfld: 
 | 
			
		||||
    {
 | 
			
		||||
      const real n = as_real() - var.as_real();
 | 
			
		||||
      cmp = n.sign(); 
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  case _alfafld: cmp = as_string().compare(var.as_string()); break;
 | 
			
		||||
  default : cmp = var.is_null() ? 0 : -1;
 | 
			
		||||
  }
 | 
			
		||||
  return cmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant::add(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: set(as_date() + var.as_int()); break;
 | 
			
		||||
  case _longfld: set(as_int() + var.as_int()); break;
 | 
			
		||||
  case _alfafld: *(TString*)_ptr << var.as_string(); break;
 | 
			
		||||
  case _realfld: *(real*)_ptr += var.as_real(); break;
 | 
			
		||||
  default: copy(var); break;
 | 
			
		||||
  }
 | 
			
		||||
  return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant::sub(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  switch (_type)
 | 
			
		||||
  {
 | 
			
		||||
  case _datefld: set(as_date() - var.as_int()); break;
 | 
			
		||||
  case _longfld:
 | 
			
		||||
    if (var.type() == _longfld)
 | 
			
		||||
    {
 | 
			
		||||
      set(as_int() - var.as_int());
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    // Fall down
 | 
			
		||||
  default:
 | 
			
		||||
    {
 | 
			
		||||
      real n = as_real();
 | 
			
		||||
      n -= var.as_real();
 | 
			
		||||
      set(n);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  return *this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TVariant_stack
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant_stack::peek(int depth)
 | 
			
		||||
{
 | 
			
		||||
  const int sp = _sp-depth-1;
 | 
			
		||||
  return sp >= 0 ? (TVariant&)_var[sp] : (TVariant &)NULL_VARIANT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant_stack::drop()
 | 
			
		||||
{
 | 
			
		||||
  if (_sp > 0)
 | 
			
		||||
  {
 | 
			
		||||
    _sp--;
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TVariant& TVariant_stack::pop()
 | 
			
		||||
{
 | 
			
		||||
  TVariant& var = peek(0);
 | 
			
		||||
  drop();
 | 
			
		||||
  return var;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::roll(int depth)
 | 
			
		||||
{
 | 
			
		||||
  const int sp = _sp-depth-1;
 | 
			
		||||
  if (sp >= 0)
 | 
			
		||||
  {
 | 
			
		||||
    TObject* var = _var.remove(sp, true);
 | 
			
		||||
    _var.insert(var, _sp-1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(const TVariant& var)
 | 
			
		||||
{
 | 
			
		||||
  if (_var.objptr(_sp) == NULL)
 | 
			
		||||
    _var.add(var, _sp);
 | 
			
		||||
  else
 | 
			
		||||
    (TVariant&)_var[_sp] = var;
 | 
			
		||||
  _sp++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(long n)
 | 
			
		||||
{
 | 
			
		||||
  const TVariant var(n);
 | 
			
		||||
  push(var);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(const real& n)
 | 
			
		||||
{
 | 
			
		||||
  const TVariant var(n);
 | 
			
		||||
  push(var);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::push(const char* str)
 | 
			
		||||
{
 | 
			
		||||
  const TVariant var(str);
 | 
			
		||||
  push(var);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TVariant_stack::reset()
 | 
			
		||||
{
 | 
			
		||||
  _sp = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TVariant_stack::overflow() const
 | 
			
		||||
{
 | 
			
		||||
  return _sp > 2048;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										98
									
								
								include/variant.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										98
									
								
								include/variant.h
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,98 @@
 | 
			
		||||
#ifndef __VARIANT_H
 | 
			
		||||
#define __VARIANT_H
 | 
			
		||||
 | 
			
		||||
#ifndef __DATE_H
 | 
			
		||||
#include <date.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __REAL_H
 | 
			
		||||
#include <real.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __RECTYPES_H
 | 
			
		||||
#include <rectypes.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TVariant
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
class TVariant : public TSortable
 | 
			
		||||
{
 | 
			
		||||
  TFieldtypes _type;
 | 
			
		||||
  void* _ptr;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  virtual TObject* dup() const { return new TVariant(*this); }
 | 
			
		||||
  void copy(const TVariant& var);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TFieldtypes type() const { return _type; } // Internal use only
 | 
			
		||||
  bool is_string() const { return _type == _alfafld; }
 | 
			
		||||
  bool is_empty() const;
 | 
			
		||||
  bool is_null() const { return _type == _nullfld; }
 | 
			
		||||
  bool is_zero() const;
 | 
			
		||||
  void set_null();
 | 
			
		||||
  
 | 
			
		||||
  void set(const char* str);
 | 
			
		||||
  void set(const real& r);
 | 
			
		||||
  void set(const long n);
 | 
			
		||||
  void set(const TDate& d);
 | 
			
		||||
 | 
			
		||||
  TVariant& operator=(const TVariant& var) { copy(var); return *this; }
 | 
			
		||||
  TVariant& operator=(const char* str) { set(str); return *this; }
 | 
			
		||||
  TVariant& operator=(const real& r) { set(r); return *this; }
 | 
			
		||||
  TVariant& operator=(const long n) { set(n); return *this; }
 | 
			
		||||
  TVariant& operator=(const TDate& d) { set(d); return *this; }
 | 
			
		||||
 | 
			
		||||
  const TString& as_string() const;
 | 
			
		||||
  bool as_string(TString& str) const;
 | 
			
		||||
  real as_real() const;
 | 
			
		||||
  long as_int() const;
 | 
			
		||||
  TDate as_date() const;
 | 
			
		||||
  bool as_bool() const;
 | 
			
		||||
  unsigned long as_color() const;
 | 
			
		||||
 | 
			
		||||
  void convert_to(TFieldtypes ft);
 | 
			
		||||
 | 
			
		||||
  virtual int compare(const TSortable& s) const;
 | 
			
		||||
  TVariant& add(const TVariant& var);
 | 
			
		||||
  TVariant& sub(const TVariant& var);
 | 
			
		||||
 | 
			
		||||
  TVariant() : _type(_nullfld), _ptr(NULL) { }
 | 
			
		||||
  TVariant(const char* str) : _type(_alfafld), _ptr(new TString(str)) { }
 | 
			
		||||
  TVariant(const real& num) : _type(_realfld), _ptr(new real(num)) { };
 | 
			
		||||
  TVariant(const TDate& d) : _type(_datefld), _ptr(new TDate(d)) { };
 | 
			
		||||
  TVariant(long num) : _type(_longfld), _ptr((void*)num) { };
 | 
			
		||||
  TVariant(bool ok) : _type(_longfld), _ptr((void*)ok) { };
 | 
			
		||||
  TVariant(const TVariant& var) : _type(_nullfld), _ptr(NULL) { copy(var); }
 | 
			
		||||
  virtual ~TVariant() { set_null(); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const TVariant NULL_VARIANT;
 | 
			
		||||
 | 
			
		||||
class TVariant_stack : public TObject
 | 
			
		||||
{
 | 
			
		||||
  TArray _var;
 | 
			
		||||
  int _sp;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  int items() const { return _sp; }
 | 
			
		||||
  bool drop();
 | 
			
		||||
  TVariant& pop();
 | 
			
		||||
  TVariant& peek(int depth = 0);
 | 
			
		||||
  void roll(int depth);
 | 
			
		||||
 | 
			
		||||
  void push(const TVariant& var);
 | 
			
		||||
  void push(long n);
 | 
			
		||||
  void push(const real& n);
 | 
			
		||||
  void push(const char* str);
 | 
			
		||||
  void reset();
 | 
			
		||||
  bool overflow() const;
 | 
			
		||||
 | 
			
		||||
  TVariant_stack() : _sp(0) { }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user