Patch level : 2.1 nopatch
Files correlati : ba8.exe Ricompilazione Demo : [ ] Commento : Salvataggio dello stato dell'arte im materia di report git-svn-id: svn://10.65.10.50/trunk@11932 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
f0efcb3946
commit
6011c75885
@ -236,6 +236,7 @@ END
|
||||
MEMO 106 58 8
|
||||
BEGIN
|
||||
PROMPT 1 3 "Condizione "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
|
339
ba/ba8201.cpp
339
ba/ba8201.cpp
@ -13,7 +13,224 @@
|
||||
|
||||
#include "ba8201.h"
|
||||
|
||||
const TString& TRecordset::get(const char* column_name) const
|
||||
///////////////////////////////////////////////////////////
|
||||
// TVariant
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
static const TVariant NULL_VARIANT;
|
||||
|
||||
void TVariant::set_null()
|
||||
{
|
||||
if (_ptr != NULL)
|
||||
{
|
||||
if (_type != _nullfld && _type != _longfld)
|
||||
delete _ptr;
|
||||
_ptr = NULL;
|
||||
}
|
||||
_type = _nullfld;
|
||||
}
|
||||
|
||||
void TVariant::set(const char* str)
|
||||
{
|
||||
if (_type == _alfafld)
|
||||
*((TString*)_ptr) = str;
|
||||
else
|
||||
{
|
||||
set_null();
|
||||
_type = _alfafld;
|
||||
_ptr = new TString(str);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
TDate TVariant::as_date() const
|
||||
{
|
||||
if (_type == _datefld)
|
||||
return *(TDate*)_ptr;
|
||||
|
||||
const TDate d(as_int());
|
||||
return d;
|
||||
}
|
||||
|
||||
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("XY", as_string()[0]) != NULL;
|
||||
else
|
||||
ok = as_int() != 0;
|
||||
return ok;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TRecordset
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
const TVariant& TRecordset::get(const char* column_name) const
|
||||
{
|
||||
for (unsigned int i = 0; i < columns(); i++)
|
||||
{
|
||||
@ -21,7 +238,7 @@ const TString& TRecordset::get(const char* column_name) const
|
||||
if (info._name == column_name)
|
||||
return get(i);
|
||||
}
|
||||
return EMPTY_STRING;
|
||||
return NULL_VARIANT;
|
||||
}
|
||||
|
||||
const TString& TRecordset::query_text() const
|
||||
@ -49,7 +266,7 @@ const TToken_string& TRecordset::sheet_head() const
|
||||
maxlen = len;
|
||||
}
|
||||
head << '@' << max(ci._width, maxlen);
|
||||
if (ci._numeric)
|
||||
if (ci._type == _longfld || ci._type == _realfld)
|
||||
head << 'R';
|
||||
}
|
||||
return head;
|
||||
@ -92,10 +309,10 @@ bool TRecordset::save_as_html(const char* path)
|
||||
{
|
||||
const TRecordset_column_info& ci = column_info(c);
|
||||
out << " <td";
|
||||
if (ci._numeric)
|
||||
if (ci._type == _longfld || ci._type == _realfld)
|
||||
out << " align=\"right\"";
|
||||
out << ">";
|
||||
val = get(c);
|
||||
get(c).as_string(val);
|
||||
if (!val.blank())
|
||||
{
|
||||
val.rtrim();
|
||||
@ -136,7 +353,7 @@ bool TRecordset::save_as_silk(const char* path)
|
||||
for (unsigned int c = 0; c < columns(); c++)
|
||||
{
|
||||
out << "C;Y" << (n+2) << ";X" << (c+1) << ";K\"";
|
||||
val = get(c);
|
||||
get(c).as_string(val);
|
||||
if (!val.blank())
|
||||
{
|
||||
val.rtrim();
|
||||
@ -164,7 +381,7 @@ bool TRecordset::save_as_text(const char* path)
|
||||
{
|
||||
if (c > 0)
|
||||
out << '\t';
|
||||
val = get(c);
|
||||
get(c).as_string(val);
|
||||
if (!val.blank())
|
||||
{
|
||||
val.rtrim();
|
||||
@ -207,7 +424,7 @@ bool TRecordset::save_as_campo(const char* path)
|
||||
{
|
||||
if (c > 0)
|
||||
out << '|';
|
||||
val = get(c);
|
||||
get(c).as_string(val);
|
||||
if (!val.blank())
|
||||
{
|
||||
val.rtrim();
|
||||
@ -320,7 +537,7 @@ protected:
|
||||
void logicnum2name(int logicnum, TString& name) const;
|
||||
int name2logicnum(const TString& name) const;
|
||||
|
||||
TString& get_sql_value(const TRectype& curr, const RecFieldDes& fd, TString& tmp) const;
|
||||
TVariant& get_sql_value(const TRectype& curr, const RecFieldDes& fd, TVariant& tmp) const;
|
||||
|
||||
void build_curr_path(TFilename& name) const;
|
||||
void test_path();
|
||||
@ -478,38 +695,19 @@ int TSQLite::name2logicnum(const TString& name) const
|
||||
return atoi(*cod);
|
||||
}
|
||||
|
||||
TString& TSQLite::get_sql_value(const TRectype& curr, const RecFieldDes& fd, TString& tmp) const
|
||||
TVariant& TSQLite::get_sql_value(const TRectype& curr, const RecFieldDes& fd, TVariant& tmp) const
|
||||
{
|
||||
tmp = curr.get(fd.Name);
|
||||
switch (fd.TypeF)
|
||||
{
|
||||
case _intfld:
|
||||
case _longfld:
|
||||
case _realfld:
|
||||
case _wordfld:
|
||||
if (real::is_null(tmp))
|
||||
tmp.cut(0);
|
||||
break;
|
||||
case _intzerofld:
|
||||
case _longzerofld:
|
||||
break;
|
||||
case _datefld:
|
||||
tmp = TDate(tmp).string(ANSI);
|
||||
break;
|
||||
case _boolfld:
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
if (tmp.find('\'') >= 0)
|
||||
{
|
||||
for (int i = 0; tmp[i]; i++)
|
||||
{
|
||||
if (tmp[i] == '\'')
|
||||
tmp.insert("'", i++);
|
||||
}
|
||||
}
|
||||
*/
|
||||
break;
|
||||
case _realfld : tmp.set(curr.get_real(fd.Name)); break;
|
||||
case _intfld :
|
||||
case _longfld :
|
||||
case _wordfld :
|
||||
case _intzerofld :
|
||||
case _longzerofld: tmp.set(curr.get_long(fd.Name)); break;
|
||||
case _datefld : tmp.set(curr.get_date(fd.Name)); break;
|
||||
case _boolfld : tmp.set(curr.get_bool(fd.Name)); break;
|
||||
default : tmp.set(curr.get(fd.Name)); break;
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
@ -533,14 +731,17 @@ bool TSQLite::exists(const char* table)
|
||||
bool TSQLite::esporta(const TRectype& rec, ostream& sql) const
|
||||
{
|
||||
const RecDes& rd = *rec.rec_des();
|
||||
TString tmp;
|
||||
TVariant tmp;
|
||||
for (int i = 0; i < rd.NFields; i++)
|
||||
{
|
||||
if (i > 0) sql << '\t';
|
||||
if (rd.Fd[i].TypeF == _memofld)
|
||||
sql << "\\N";
|
||||
else
|
||||
sql << get_sql_value(rec, rd.Fd[i], tmp);
|
||||
{
|
||||
get_sql_value(rec, rd.Fd[i], tmp);
|
||||
sql << tmp.as_string();
|
||||
}
|
||||
}
|
||||
sql << '\n';
|
||||
return true;
|
||||
@ -677,6 +878,25 @@ TSQLite::~TSQLite()
|
||||
// TSQL_recordset
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
static bool is_numeric(const char* str)
|
||||
{
|
||||
if (str == NULL || *str == '\0' || *str == '0')
|
||||
return false; // Se comincia per zero va preservato!
|
||||
if (*str == '-')
|
||||
{
|
||||
str++;
|
||||
if (*str <= ' ')
|
||||
return false;
|
||||
}
|
||||
while (*str)
|
||||
{
|
||||
if (strchr("0123456789.", *str) == NULL)
|
||||
return false;
|
||||
str++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void TSQL_recordset::reset()
|
||||
{
|
||||
_firstrow = _items = 0;
|
||||
@ -694,7 +914,7 @@ int TSQL_recordset::on_get_items(int argc, char** values, char** columns)
|
||||
TRecordset_column_info* info = new TRecordset_column_info;
|
||||
info->_name = columns[i];
|
||||
info->_width = 1;
|
||||
info->_numeric = true;
|
||||
info->_type = _realfld;
|
||||
_column.add(info);
|
||||
}
|
||||
}
|
||||
@ -706,8 +926,8 @@ int TSQL_recordset::on_get_items(int argc, char** values, char** columns)
|
||||
const int len = strlen(values[i]);
|
||||
if (len > info._width)
|
||||
info._width = len;
|
||||
if (isalpha(*values[i]))
|
||||
info._numeric = false;
|
||||
if (info._type != _alfafld && isalpha(*values[i]))
|
||||
info._type = _alfafld;
|
||||
}
|
||||
}
|
||||
|
||||
@ -744,9 +964,16 @@ const TRecordset_column_info& TSQL_recordset::column_info(unsigned int c) const
|
||||
static int query_get_rows(void* jolly, int argc, char** values, char** columns)
|
||||
{
|
||||
TArray& arr = *(TArray*)jolly;
|
||||
TString_array* a = new TString_array;
|
||||
for (int i = 0; i < argc; i++)
|
||||
a->add(values[i], i);
|
||||
TArray* a = new TArray;
|
||||
for (int c = 0; c < argc; c++)
|
||||
{
|
||||
TVariant* var = new TVariant;
|
||||
if (is_numeric(values[c]))
|
||||
var->set(real(values[c]));
|
||||
else
|
||||
var->set(values[c]);
|
||||
a->add(var, c);
|
||||
}
|
||||
arr.add(a);
|
||||
return SQLITE_OK;
|
||||
}
|
||||
@ -779,24 +1006,24 @@ bool TSQL_recordset::move_to(TRecnotype n)
|
||||
return true;
|
||||
}
|
||||
|
||||
const TString_array* TSQL_recordset::row(TRecnotype n)
|
||||
const TArray* TSQL_recordset::row(TRecnotype n)
|
||||
{
|
||||
const TString_array* a = NULL;
|
||||
const TArray* a = NULL;
|
||||
if (move_to(n))
|
||||
a = (const TString_array*)_page.objptr(n-_firstrow);
|
||||
a = (const TArray*)_page.objptr(n-_firstrow);
|
||||
return a;
|
||||
}
|
||||
|
||||
const TString& TSQL_recordset::get(unsigned int c) const
|
||||
const TVariant& TSQL_recordset::get(unsigned int c) const
|
||||
{
|
||||
const TString_array* a = (const TString_array*)_page.objptr(_current_row-_firstrow);
|
||||
const TArray* a = (const TArray*)_page.objptr(_current_row-_firstrow);
|
||||
if (a != NULL)
|
||||
{
|
||||
const TString* s = (const TString*)a->objptr(c);
|
||||
const TVariant* s = (const TVariant*)a->objptr(c);
|
||||
if (s != NULL)
|
||||
return *s;
|
||||
}
|
||||
return EMPTY_STRING;
|
||||
return NULL_VARIANT;
|
||||
}
|
||||
|
||||
void TSQL_recordset::set(const char* sql)
|
||||
@ -822,8 +1049,12 @@ void TRecordset_sheet::get_row(long r, TToken_string& row)
|
||||
row.cut(0);
|
||||
if (_query.move_to(r))
|
||||
{
|
||||
TString str;
|
||||
for (unsigned int c = 0; c < _query.columns(); c++)
|
||||
row.add(_query.get(c));
|
||||
{
|
||||
_query.get(c).as_string(str);
|
||||
row.add(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
69
ba/ba8201.h
69
ba/ba8201.h
@ -1,5 +1,5 @@
|
||||
#ifndef _RECORDSET_H
|
||||
#define _RECORDSET_H
|
||||
#ifndef __RECORDSET_H
|
||||
#define __RECORDSET_H
|
||||
|
||||
#ifndef __RECTYPES_H
|
||||
#include <rectypes.h>
|
||||
@ -13,9 +13,64 @@ struct TRecordset_column_info : public TObject
|
||||
{
|
||||
TString _name;
|
||||
int _width;
|
||||
bool _numeric;
|
||||
TFieldtypes _type;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TVariant
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TVariant : public TSortable
|
||||
{
|
||||
TFieldtypes _type;
|
||||
void* _ptr;
|
||||
|
||||
protected:
|
||||
virtual int compare(const TSortable& s) const;
|
||||
virtual TObject* dup() const { return new TVariant(*this); }
|
||||
void copy(const TVariant& var);
|
||||
|
||||
public:
|
||||
TFieldtypes type() const { return _type; }
|
||||
|
||||
bool is_null() const { return _type == _nullfld; }
|
||||
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;
|
||||
|
||||
void convert_to(TFieldtypes ft);
|
||||
|
||||
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
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -44,10 +99,10 @@ public: // Absolutely needed methods
|
||||
|
||||
virtual unsigned int columns() const pure;
|
||||
virtual const TRecordset_column_info& column_info(unsigned int column) const pure;
|
||||
virtual const TString& get(unsigned int column) const pure;
|
||||
virtual const TVariant& get(unsigned int column) const pure;
|
||||
|
||||
virtual const TString& query_text() const;
|
||||
virtual const TString& get(const char* column_name) const;
|
||||
virtual const TVariant& get(const char* column_name) const;
|
||||
virtual const TToken_string& sheet_head() const;
|
||||
|
||||
virtual bool save_as(const char* path, TRecordsetExportFormat fmt = fmt_unknown);
|
||||
@ -74,7 +129,7 @@ public: // TRecordset
|
||||
virtual TRecnotype current_row() const { return _current_row; }
|
||||
virtual unsigned int columns() const;
|
||||
virtual const TRecordset_column_info& column_info(unsigned int c) const;
|
||||
virtual const TString& get(unsigned int column) const;
|
||||
virtual const TVariant& get(unsigned int column) const;
|
||||
const TString& query_text() const { return _sql; }
|
||||
|
||||
public:
|
||||
@ -82,7 +137,7 @@ public:
|
||||
|
||||
// Internal use only
|
||||
virtual int on_get_items(int argc, char** values, char** columns);
|
||||
const TString_array* row(TRecnotype n);
|
||||
const TArray* row(TRecnotype n);
|
||||
|
||||
TSQL_recordset(const char* sql);
|
||||
virtual ~TSQL_recordset() { }
|
||||
|
115
ba/ba8300.cpp
115
ba/ba8300.cpp
@ -1,4 +1,4 @@
|
||||
#include <xi.h>
|
||||
#include <xinclude.h>
|
||||
|
||||
#include <applicat.h>
|
||||
#include <automask.h>
|
||||
@ -11,6 +11,7 @@
|
||||
#include "ba8201.h"
|
||||
#include "ba8300.h"
|
||||
#include "ba8301.h"
|
||||
#include "ba8303.h"
|
||||
#include <bagn003.h>
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -72,10 +73,13 @@ public:
|
||||
void TFont_button_mask::update()
|
||||
{
|
||||
const TMask_field& fld = field(F_FONT_SELECT);
|
||||
if (fld.active())
|
||||
if (fld.active() && win() == win(0))
|
||||
{
|
||||
RCT rct; fld.get_rect(rct);
|
||||
xvt_rect_offset(&rct, rct.right-rct.left + 4*CHARX, 0);
|
||||
RCT rctfld; fld.get_rect(rctfld);
|
||||
const int x = rctfld.right / CHARX + 1;
|
||||
const int y = rctfld.top / ROWY + 1;
|
||||
RCT& rct = resize_rect(x, y, -3, 2, W_PLAIN, win());
|
||||
rct.top = rctfld.top; rct.bottom = rctfld.bottom;
|
||||
xi_draw_3d_rect((XinWindow)win(), (XinRect*)&rct, TRUE, 2, MASK_LIGHT_COLOR,
|
||||
_bgcolor, MASK_DARK_COLOR);
|
||||
|
||||
@ -145,7 +149,7 @@ bool TFont_button_mask::get_font_info(TReport_font& font) const
|
||||
|
||||
TFont_button_mask::TFont_button_mask(const char* name)
|
||||
: TAutomask(name), _font_changed(false),
|
||||
_halign('L'), _valign('B'),
|
||||
_halign('C'), _valign('C'),
|
||||
_fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE)
|
||||
{
|
||||
}
|
||||
@ -183,18 +187,24 @@ long TReport_field_mask::get_num(short id) const
|
||||
|
||||
void TReport_field_mask::update()
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
if (win() == win(0))
|
||||
{
|
||||
TMask_field& fld = field(i == 0 ? F_FGCOLOR : F_BGCOLOR);
|
||||
if (fld.active())
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
RCT rct; fld.get_rect(rct);
|
||||
xvt_rect_offset(&rct, rct.right-rct.left + 4*CHARX, 0);
|
||||
xi_draw_3d_rect((XinWindow)win(), (XinRect*)&rct, TRUE, 2, MASK_LIGHT_COLOR,
|
||||
i == 0 ? _fgcolor : _bgcolor, MASK_DARK_COLOR);
|
||||
TMask_field& fld = field(i == 0 ? F_FGCOLOR : F_BGCOLOR);
|
||||
if (fld.active())
|
||||
{
|
||||
RCT rctfld; fld.get_rect(rctfld);
|
||||
const int x = rctfld.right / CHARX + 1;
|
||||
const int y = rctfld.top / ROWY + 1;
|
||||
RCT& rct = resize_rect(x, y, -3, 1, W_PLAIN, win());
|
||||
rct.top = rctfld.top; rct.bottom = rctfld.bottom;
|
||||
xi_draw_3d_rect((XinWindow)win(), (XinRect*)&rct, TRUE, 2, MASK_LIGHT_COLOR,
|
||||
i == 0 ? _fgcolor : _bgcolor, MASK_DARK_COLOR);
|
||||
}
|
||||
}
|
||||
TFont_button_mask::update();
|
||||
}
|
||||
TFont_button_mask::update();
|
||||
}
|
||||
|
||||
bool TReport_field_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
@ -237,10 +247,13 @@ void TReport_field_mask::set_field(const TReport_field& rf)
|
||||
set(F_TYPE, str);
|
||||
|
||||
const TRectangle& r = rf.get_rect();
|
||||
set(F_ID, rf.id());
|
||||
set_num(F_X, r.left());
|
||||
set_num(F_Y, r.top());
|
||||
set_num(F_DX, r.width());
|
||||
set_num(F_DY, r.height());
|
||||
set(F_HIDDEN, rf.hidden() ? "X" : "");
|
||||
set(F_DISABLED, rf.deactivated() ? "X" : "");
|
||||
str[0] = rf.horizontal_alignment();
|
||||
set(F_HALIGN, str);
|
||||
str[0] = rf.vertical_alignment();
|
||||
@ -251,13 +264,18 @@ void TReport_field_mask::set_field(const TReport_field& rf)
|
||||
set(F_TEXT, rf.picture());
|
||||
set(F_SOURCE, rf.field());
|
||||
set_font_info(rf.font());
|
||||
set(F_PRESCRIPT, rf.prescript());
|
||||
set(F_POSTSCRIPT, rf.postscript());
|
||||
}
|
||||
|
||||
void TReport_field_mask::get_field(TReport_field& rf) const
|
||||
{
|
||||
rf.set_type(get(F_TYPE)[0]);
|
||||
rf.set_id(get_int(F_ID));
|
||||
rf.set_pos(get_num(F_X), get_num(F_Y));
|
||||
rf.set_size(get_num(F_DX), get_num(F_DY));
|
||||
rf.show(!get_bool(F_HIDDEN));
|
||||
rf.activate(!get_bool(F_DISABLED));
|
||||
rf.set_horizontal_alignment(get(F_HALIGN)[0]);
|
||||
rf.set_vertical_alignment(get(F_VALIGN)[0]);
|
||||
rf.set_border(get_int(F_BORDER));
|
||||
@ -268,6 +286,8 @@ void TReport_field_mask::get_field(TReport_field& rf) const
|
||||
TReport_font f;
|
||||
if (get_font_info(f))
|
||||
rf.set_font(f);
|
||||
rf.set_prescript(get(F_PRESCRIPT));
|
||||
rf.set_postscript(get(F_POSTSCRIPT));
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -295,12 +315,15 @@ void TReport_sheet::get_row(long r, TToken_string& row)
|
||||
row.cut(0);
|
||||
row.add(checked(r) ? "X" : " ");
|
||||
row.add(rf.type_name());
|
||||
row.add(rf.id());
|
||||
row.add(num2str(rect.top()));
|
||||
row.add(num2str(rect.left()));
|
||||
row.add(num2str(rect.width()));
|
||||
row.add(num2str(rect.height()));
|
||||
row.add(rf.picture());
|
||||
row.add(rf.field());
|
||||
if (rf.field().not_empty())
|
||||
row.add(rf.field());
|
||||
else
|
||||
row.add(rf.picture());
|
||||
}
|
||||
|
||||
int TReport_sheet::selection(int& first, int& last) const
|
||||
@ -350,7 +373,7 @@ KEY TReport_sheet::run()
|
||||
}
|
||||
|
||||
TReport_sheet::TReport_sheet(TReport_section& sec)
|
||||
: TSheet(-1, -1, -2, -4, "Campi", "@1|Tipo@10|Riga@R|Col.@R|Larg.@R|Alt.@R|Testo@30|Campo@30", 0xE),
|
||||
: TSheet(-1, -1, -2, -4, "Campi", "@1|Tipo@10|ID@4R|Riga@R|Col.@R|Larg.@R|Alt.@R|Testo@50", 0xE),
|
||||
_section(sec)
|
||||
{
|
||||
}
|
||||
@ -389,7 +412,7 @@ void TSection_properties_mask::vedo_non_vedo()
|
||||
{
|
||||
const char type = get(F_TYPE)[0];
|
||||
const int level = get_int(F_LEVEL);
|
||||
show(F_GROUP_BY, level > 1 && type != 'B');
|
||||
show(F_GROUP_BY, type == 'H' && level > 1);
|
||||
show(F_HIDE_IF_NEEDED, level == 0 && type != 'B');
|
||||
enable(DLG_DELREC, level > 1);
|
||||
}
|
||||
@ -428,8 +451,13 @@ void TSection_properties_mask::set_section(const TReport_section& rs)
|
||||
|
||||
set(F_GROUP_BY, rs.grouped_by());
|
||||
set(F_HIDE_IF_NEEDED, rs.hidden_if_needed() ? "X" : "");
|
||||
set(F_HIDDEN, rs.hidden() ? "X" : "");
|
||||
set(F_DISABLED, rs.deactivated() ? "X" : "");
|
||||
|
||||
set_font_info(rs.font());
|
||||
set(F_PRESCRIPT, rs.prescript());
|
||||
set(F_POSTSCRIPT, rs.postscript());
|
||||
|
||||
vedo_non_vedo();
|
||||
}
|
||||
|
||||
@ -437,12 +465,18 @@ void TSection_properties_mask::get_section(TReport_section& rs) const
|
||||
{
|
||||
rs.set_width(get_num(F_DX));
|
||||
rs.set_height(get_num(F_DY));
|
||||
rs.show(!get_bool(F_HIDDEN));
|
||||
rs.activate(!get_bool(F_DISABLED));
|
||||
|
||||
rs.group_by(get(F_GROUP_BY));
|
||||
rs.hide_if_needed(get_bool(F_HIDE_IF_NEEDED));
|
||||
|
||||
TReport_font f;
|
||||
if (get_font_info(f))
|
||||
rs.set_font(f);
|
||||
|
||||
rs.set_prescript(get(F_PRESCRIPT));
|
||||
rs.set_postscript(get(F_POSTSCRIPT));
|
||||
}
|
||||
|
||||
TSection_properties_mask::TSection_properties_mask()
|
||||
@ -508,6 +542,7 @@ protected:
|
||||
void add_field();
|
||||
void edit_field(TReport_field& rf);
|
||||
void fields_properties();
|
||||
void add_section();
|
||||
void section_properties();
|
||||
void report_properties();
|
||||
|
||||
@ -768,6 +803,36 @@ void TReport_mask::fields_properties()
|
||||
}
|
||||
}
|
||||
|
||||
void TReport_mask::add_section()
|
||||
{
|
||||
TMask m(TR("Nuova sezione"), 1, 32, 5);
|
||||
m.add_radio(101, 0, "", 1, 0, 22, "H|B", TR("Raggruppamento|Corpo alternativo"), "");
|
||||
m.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
|
||||
m.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
|
||||
if (m.run() == K_ENTER)
|
||||
{
|
||||
const char type = m.get(101)[0];
|
||||
int level = 0;
|
||||
if (type == 'H')
|
||||
{
|
||||
const int hl = _report.find_max_level('H');
|
||||
const int fl = _report.find_max_level('F');
|
||||
level = max(hl, fl) + 1;
|
||||
}
|
||||
else
|
||||
level = _report.find_max_level('B')+1;
|
||||
|
||||
if (level > 1 && level <= 9)
|
||||
{
|
||||
_tree.goto_node(type, level);
|
||||
tfield(F_SECTIONS).select_current();
|
||||
section_properties();
|
||||
}
|
||||
else
|
||||
error_box(TR("Livello non ammesso: %d"), level);
|
||||
}
|
||||
}
|
||||
|
||||
void TReport_mask::section_properties()
|
||||
{
|
||||
TReport_section& rs = curr_section();
|
||||
@ -780,8 +845,14 @@ void TReport_mask::section_properties()
|
||||
_is_dirty = true;
|
||||
break;
|
||||
case K_DEL:
|
||||
rs.report().kill_section(rs.type(), rs.level());
|
||||
_is_dirty = true;
|
||||
{
|
||||
const char t = rs.type();
|
||||
const int l = rs.level();
|
||||
rs.report().kill_section(t, l);
|
||||
_tree.goto_node(t, l-1);
|
||||
tfield(F_SECTIONS).select_current();
|
||||
_is_dirty = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -828,7 +899,7 @@ bool TReport_mask::on_field_event(TOperable_field& o, TField_event e, long jolly
|
||||
enable(-1, ok);
|
||||
}
|
||||
break;
|
||||
case F_TYPE:
|
||||
case F_FLD_ADD:
|
||||
if (e == fe_button && o.active())
|
||||
add_field();
|
||||
break;
|
||||
@ -836,6 +907,10 @@ bool TReport_mask::on_field_event(TOperable_field& o, TField_event e, long jolly
|
||||
if (e == fe_button && o.active())
|
||||
fields_properties();
|
||||
break;
|
||||
case F_SEC_ADD:
|
||||
if (e == fe_button && o.active())
|
||||
add_section();
|
||||
break;
|
||||
case F_SEC_PROPERTIES:
|
||||
if (e == fe_button && o.active())
|
||||
section_properties();
|
||||
|
16
ba/ba8300.h
16
ba/ba8300.h
@ -3,10 +3,14 @@
|
||||
|
||||
#define F_SECTIONS 103
|
||||
#define F_REPORT 104
|
||||
#define F_TYPE 105
|
||||
#define F_FLD_ADD 105
|
||||
#define F_FLD_PROPERTIES 106
|
||||
#define F_SEC_PROPERTIES 107
|
||||
#define F_REP_PROPERTIES 108
|
||||
#define F_SEC_ADD 107
|
||||
#define F_SEC_PROPERTIES 108
|
||||
#define F_REP_PROPERTIES 109
|
||||
|
||||
#define F_TYPE 109
|
||||
#define F_ID 110
|
||||
#define F_X 111
|
||||
#define F_Y 112
|
||||
#define F_DX 113
|
||||
@ -19,9 +23,15 @@
|
||||
#define F_FGCOLOR 120
|
||||
#define F_BGCOLOR 121
|
||||
#define F_FONT_SELECT 122
|
||||
#define F_HIDDEN 123
|
||||
#define F_DISABLED 124
|
||||
#define F_PRESCRIPT 125
|
||||
#define F_POSTSCRIPT 126
|
||||
|
||||
#define F_LEVEL 130
|
||||
#define F_GROUP_BY 131
|
||||
#define F_HIDE_IF_NEEDED 132
|
||||
#define F_PAGE_BREAK 133
|
||||
|
||||
#define F_SQL 201
|
||||
#define F_IMPORT_QRY 202
|
||||
|
@ -43,14 +43,9 @@ ENDPAGE
|
||||
|
||||
PAGE "@bReport" -1 -1 78 23
|
||||
|
||||
GROUPBOX DLG_NULL 78 3
|
||||
BEGIN
|
||||
PROMPT 1 0 "Report"
|
||||
END
|
||||
|
||||
STRING F_CODICE 16
|
||||
BEGIN
|
||||
PROMPT 2 1 "Codice "
|
||||
PROMPT 1 0 "Report "
|
||||
FLAGS "B"
|
||||
WARNING "E' necessario specificare il codice"
|
||||
CHECKTYPE REQUIRED
|
||||
@ -58,22 +53,22 @@ END
|
||||
|
||||
STRING F_DESCR 50 46
|
||||
BEGIN
|
||||
PROMPT 30 1 ""
|
||||
PROMPT 30 0 ""
|
||||
END
|
||||
|
||||
TREE F_SECTIONS 30 12
|
||||
BEGIN
|
||||
PROMPT 0 3 ""
|
||||
PROMPT 0 1 ""
|
||||
END
|
||||
|
||||
REPORT F_REPORT -3 -3
|
||||
BEGIN
|
||||
PROMPT 21 3 ""
|
||||
PROMPT 21 1 ""
|
||||
END
|
||||
|
||||
BUTTON F_TYPE 10 2
|
||||
BUTTON F_FLD_ADD 10 2
|
||||
BEGIN
|
||||
PROMPT -16 -1 "Campo"
|
||||
PROMPT -16 -1 "Campo +"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
@ -83,25 +78,21 @@ BEGIN
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
BUTTON F_SEC_ADD 10 2
|
||||
BEGIN
|
||||
PROMPT -36 -1 "Sezione +"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
BUTTON F_SEC_PROPERTIES 10 2
|
||||
BEGIN
|
||||
PROMPT -36 -1 "Sezione"
|
||||
PROMPT -46 -1 "Sezione"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
BUTTON F_REP_PROPERTIES 10 2
|
||||
BEGIN
|
||||
PROMPT -46 -1 "Generali"
|
||||
END
|
||||
|
||||
NUMBER F_Y 3
|
||||
BEGIN
|
||||
PROMPT 58 -1 "Riga "
|
||||
END
|
||||
|
||||
NUMBER F_X 3
|
||||
BEGIN
|
||||
PROMPT 68 -1 "Colonna "
|
||||
PROMPT -66 -1 "Report"
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
114
ba/ba8300b.uml
114
ba/ba8300b.uml
@ -1,10 +1,10 @@
|
||||
#include "ba8300.h"
|
||||
|
||||
PAGE "Campo" -1 -1 60 15
|
||||
PAGE "Campo" -1 -1 72 17
|
||||
|
||||
RADIOBUTTON F_TYPE 1 16
|
||||
LIST F_TYPE 1 16
|
||||
BEGIN
|
||||
PROMPT 1 0 "@bTipo"
|
||||
PROMPT 2 1 "Tipo "
|
||||
ITEM "T|Testo"
|
||||
MESSAGE SHOW,1@|HIDE,F_SOURCE
|
||||
ITEM "S|Stringa"
|
||||
@ -23,38 +23,60 @@ BEGIN
|
||||
MESSAGE HIDE,1@|SHOW,F_SOURCE
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 40 11
|
||||
GROUPBOX DLG_NULL 70 5
|
||||
BEGIN
|
||||
PROMPT 18 0 "@bParametri"
|
||||
PROMPT 1 0 "@bParametri generali"
|
||||
END
|
||||
|
||||
NUMBER F_ID 4
|
||||
BEGIN
|
||||
PROMPT 30 1 "Identificatore "
|
||||
FLAGS "U"
|
||||
END
|
||||
|
||||
STRING F_Y 6
|
||||
BEGIN
|
||||
PROMPT 20 1 "Riga "
|
||||
PROMPT 2 2 "Riga "
|
||||
FLAGS "R"
|
||||
END
|
||||
|
||||
STRING F_X 6
|
||||
BEGIN
|
||||
PROMPT 40 1 "Colonna "
|
||||
PROMPT 21 2 "Colonna "
|
||||
FLAGS "R"
|
||||
END
|
||||
|
||||
STRING F_DX 6
|
||||
BEGIN
|
||||
PROMPT 20 2 "Larghezza "
|
||||
PROMPT 2 3 "Larghezza "
|
||||
FLAGS "R"
|
||||
END
|
||||
|
||||
STRING F_DY 6
|
||||
BEGIN
|
||||
PROMPT 40 2 "Altezza "
|
||||
PROMPT 21 3 "Altezza "
|
||||
FLAGS "R"
|
||||
END
|
||||
|
||||
BOOLEAN F_HIDDEN
|
||||
BEGIN
|
||||
PROMPT 41 2 "Nascosto"
|
||||
END
|
||||
|
||||
BOOLEAN F_DISABLED
|
||||
BEGIN
|
||||
PROMPT 41 3 "Disattivato"
|
||||
END
|
||||
|
||||
|
||||
GROUPBOX DLG_NULL 70 8
|
||||
BEGIN
|
||||
PROMPT 1 5 "@bParametri aspetto"
|
||||
END
|
||||
|
||||
LIST F_HALIGN 1 12
|
||||
BEGIN
|
||||
PROMPT 20 3 "Allineamento orizz. "
|
||||
PROMPT 2 6 "Allineamento orizzontale "
|
||||
ITEM "L|Sinistra"
|
||||
ITEM "R|Destra"
|
||||
ITEM "C|Centrato"
|
||||
@ -64,46 +86,46 @@ END
|
||||
|
||||
LIST F_VALIGN 1 12
|
||||
BEGIN
|
||||
PROMPT 20 4 "Allineamento vert. "
|
||||
ITEM "B|Basso"
|
||||
ITEM "C|Centrato"
|
||||
PROMPT 44 6 "verticale "
|
||||
ITEM "T|Alto"
|
||||
ITEM "C|Centrato"
|
||||
ITEM "B|Basso"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
BUTTON F_FGCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 2 7 "Colore ~Testo"
|
||||
END
|
||||
|
||||
BUTTON F_BGCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 2 8 "Colore ~Sfondo"
|
||||
END
|
||||
|
||||
BUTTON F_FONT_SELECT 14 2
|
||||
BEGIN
|
||||
PROMPT 2 9 "~Font"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
LIST F_BORDER 1 12
|
||||
BEGIN
|
||||
PROMPT 20 5 "Bordo "
|
||||
PROMPT 2 11 "Bordo "
|
||||
ITEM "0|Nessuno"
|
||||
ITEM "1|Normale"
|
||||
ITEM "3|Spesso"
|
||||
END
|
||||
|
||||
BUTTON F_FGCOLOR 14 1
|
||||
ZOOM F_TEXT 58
|
||||
BEGIN
|
||||
PROMPT 20 6 "Colore ~Testo"
|
||||
END
|
||||
|
||||
BUTTON F_BGCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 20 7 "Colore ~Sfondo"
|
||||
END
|
||||
|
||||
BUTTON F_FONT_SELECT 14 2
|
||||
BEGIN
|
||||
PROMPT 20 8 "~Font"
|
||||
PROMPT 1 13 "Testo "
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING F_TEXT 196 50
|
||||
ZOOM F_SOURCE 58
|
||||
BEGIN
|
||||
PROMPT 1 12 "Formato "
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING F_SOURCE 80 50
|
||||
BEGIN
|
||||
PROMPT 1 13 "Dato "
|
||||
PROMPT 1 14 "Sorgente "
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
@ -124,5 +146,29 @@ END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Avanzate" -1 -1 72 16
|
||||
|
||||
MEMO F_PRESCRIPT 70 7
|
||||
BEGIN
|
||||
PROMPT 1 0 "Script iniziale"
|
||||
END
|
||||
|
||||
MEMO F_POSTSCRIPT 70 7
|
||||
BEGIN
|
||||
PROMPT 1 7 "Script finale"
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDMASK
|
||||
|
||||
ENDMASK
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "ba8300.h"
|
||||
|
||||
PAGE "Sezione" -1 -1 60 13
|
||||
PAGE "Sezione" -1 -1 50 16
|
||||
|
||||
LISTBOX F_TYPE 1 8
|
||||
BEGIN
|
||||
@ -19,37 +19,52 @@ END
|
||||
|
||||
STRING F_DX 6
|
||||
BEGIN
|
||||
PROMPT 1 2 "Larghezza "
|
||||
PROMPT 1 3 "Larghezza "
|
||||
FLAGS "R"
|
||||
END
|
||||
|
||||
STRING F_DY 6
|
||||
BEGIN
|
||||
PROMPT 21 2 "Altezza "
|
||||
PROMPT 21 3 "Altezza "
|
||||
FLAGS "R"
|
||||
END
|
||||
|
||||
STRING F_GROUP_BY 80 50
|
||||
BOOLEAN F_HIDDEN
|
||||
BEGIN
|
||||
// Visibile per sezioni con livello > 1
|
||||
PROMPT 1 3 "Raggruppamento "
|
||||
FLAGS "H"
|
||||
CHECKTYPE REQUIRED
|
||||
PROMPT 1 4 "Nascosta"
|
||||
END
|
||||
|
||||
BOOLEAN F_DISABLED
|
||||
BEGIN
|
||||
PROMPT 21 4 "Disattivata"
|
||||
END
|
||||
|
||||
BOOLEAN F_PAGE_BREAK
|
||||
BEGIN
|
||||
PROMPT 1 5 "Forza salto pagina"
|
||||
END
|
||||
|
||||
BOOLEAN F_HIDE_IF_NEEDED
|
||||
BEGIN
|
||||
// Visibile per testa e coda di pagina
|
||||
PROMPT 1 3 "Nascondi sezione sulla prima/ultima pagina"
|
||||
PROMPT 1 6 "Nascondi sezione sulla prima/ultima pagina"
|
||||
FLAGS "H"
|
||||
END
|
||||
|
||||
MEMO F_GROUP_BY 48 3
|
||||
BEGIN
|
||||
// Visibile per sezioni con livello > 1
|
||||
PROMPT 1 6 "Raggruppamento "
|
||||
FLAGS "H"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
BUTTON F_FONT_SELECT 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -3 "~Font"
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
@ -59,12 +74,35 @@ BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Avanzate" -1 -1 50 16
|
||||
|
||||
MEMO F_PRESCRIPT 48 7
|
||||
BEGIN
|
||||
PROMPT 1 0 "Script iniziale"
|
||||
END
|
||||
|
||||
MEMO F_POSTSCRIPT 48 7
|
||||
BEGIN
|
||||
PROMPT 1 7 "Script finale"
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
|
||||
ENDMASK
|
||||
|
||||
|
200
ba/ba8301.cpp
200
ba/ba8301.cpp
@ -1,4 +1,5 @@
|
||||
#include <xi.h>
|
||||
#include <xinclude.h>
|
||||
#include <statbar.h>
|
||||
|
||||
#include <diction.h>
|
||||
#include <image.h>
|
||||
@ -13,19 +14,43 @@
|
||||
|
||||
bool TReport_tree::get_description(TString& str) const
|
||||
{
|
||||
str.cut(0);
|
||||
switch (_curr[0])
|
||||
const char type = _curr[0];
|
||||
const int level = atoi(_curr.mid(1));
|
||||
str = " ";
|
||||
if (level <= 0)
|
||||
{
|
||||
case 'H': str << " " << TR("Testa"); break;
|
||||
case 'B': str << " " << TR("Corpo"); break;
|
||||
case 'F': str << " " << TR("Coda"); break;
|
||||
case 'P': str << TR("Pagina"); break; // Virtual section
|
||||
case 'R': str << TR("Report"); break; // Virtual section
|
||||
case 'S': str << TR("Speciali"); break; // Virtual section
|
||||
default : break;
|
||||
switch (type)
|
||||
{
|
||||
case 'H': str << TR("Testa"); break;
|
||||
case 'B': str << TR("Sfondo"); break;
|
||||
case 'F': str << TR("Coda"); break;
|
||||
case 'P': str = TR("Pagina"); break; // Virtual section
|
||||
case 'R': str = TR("Report"); break; // Virtual section
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
if (_curr[1] > '0')
|
||||
str << ' ' << _curr[1];
|
||||
else
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case 'H': str << TR("Testa"); break;
|
||||
case 'B': str << TR("Corpo"); break;
|
||||
case 'F': str << TR("Coda"); break;
|
||||
default : break;
|
||||
}
|
||||
str << ' ';
|
||||
if (type == 'H' || type == 'F')
|
||||
{
|
||||
if (level <= 1)
|
||||
str << TR("Report");
|
||||
else
|
||||
str << TR("Gruppo") << ' ' << (level-1);
|
||||
}
|
||||
else
|
||||
str << level;
|
||||
}
|
||||
if (type != 'R' && type != 'P')
|
||||
str << " (" << _curr << ')';
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -66,14 +91,7 @@ bool TReport_tree::goto_firstson()
|
||||
nlevel = 0;
|
||||
break;
|
||||
case 'R':
|
||||
nlevel = _report.find_max_level('H');
|
||||
break;
|
||||
case 'S':
|
||||
if (_report.find_section('B',2) != NULL)
|
||||
{
|
||||
ntype = 'B';
|
||||
nlevel = 2;
|
||||
}
|
||||
nlevel = 1;
|
||||
break;
|
||||
default : break;
|
||||
}
|
||||
@ -93,7 +111,6 @@ bool TReport_tree::goto_rbrother()
|
||||
case 'H': ntype = 'B'; break;
|
||||
case 'B': ntype = 'F'; break;
|
||||
case 'P': ntype = 'R'; break;
|
||||
case 'R': ntype = 'S'; break;
|
||||
default : break;
|
||||
}
|
||||
nlevel = level;
|
||||
@ -103,10 +120,10 @@ bool TReport_tree::goto_rbrother()
|
||||
switch (type)
|
||||
{
|
||||
case 'H':
|
||||
if (level > 1)
|
||||
if (level < _report.find_max_level('H'))
|
||||
{
|
||||
ntype = type;
|
||||
nlevel = level-1;
|
||||
ntype = 'H';
|
||||
nlevel = level+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -115,14 +132,22 @@ bool TReport_tree::goto_rbrother()
|
||||
}
|
||||
break;
|
||||
case 'B':
|
||||
ntype = 'F';
|
||||
nlevel = 1;
|
||||
break;
|
||||
case 'F':
|
||||
if (level < _report.find_max_level('F'))
|
||||
if (level < _report.find_max_level('B'))
|
||||
{
|
||||
ntype = 'B';
|
||||
nlevel = level+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ntype = 'F';
|
||||
nlevel = level+1;
|
||||
nlevel = _report.find_max_level('F');
|
||||
}
|
||||
break;
|
||||
case 'F':
|
||||
if (level > 1)
|
||||
{
|
||||
ntype = 'F';
|
||||
nlevel = level-1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -146,9 +171,6 @@ bool TReport_tree::has_son() const
|
||||
case 'R':
|
||||
yes = true;
|
||||
break;
|
||||
case 'S':
|
||||
yes = _report.find_section('B', 2) != NULL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -179,16 +201,7 @@ bool TReport_tree::goto_father()
|
||||
bool yes = has_father();
|
||||
if (yes)
|
||||
{
|
||||
char ntype = ' ';
|
||||
if (_curr[1] == '0')
|
||||
ntype = 'P';
|
||||
else
|
||||
{
|
||||
if (_curr[0] == 'B' && _curr[1] > '1')
|
||||
ntype = 'S';
|
||||
else
|
||||
ntype = 'R';
|
||||
}
|
||||
const char ntype = _curr[1] == '0' ? 'P' : 'R';
|
||||
yes = goto_node(ntype, 0);
|
||||
}
|
||||
return yes;
|
||||
@ -216,7 +229,6 @@ bool TReport_tree::goto_lbrother()
|
||||
case 'B': ntype = 'H'; break;
|
||||
case 'F': ntype = 'B'; break;
|
||||
case 'R': ntype = 'P'; break;
|
||||
case 'S': ntype = 'R'; break;
|
||||
default : break;
|
||||
}
|
||||
nlevel = level;
|
||||
@ -226,26 +238,34 @@ bool TReport_tree::goto_lbrother()
|
||||
switch (type)
|
||||
{
|
||||
case 'F':
|
||||
if (level > 1)
|
||||
if (level < _report.find_max_level('F'))
|
||||
{
|
||||
ntype = type;
|
||||
nlevel = level-1;
|
||||
ntype = 'F';
|
||||
nlevel = level+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ntype = 'B';
|
||||
nlevel = 1;
|
||||
nlevel = _report.find_max_level('B');
|
||||
}
|
||||
break;
|
||||
case 'B':
|
||||
ntype = 'H';
|
||||
nlevel = 1;
|
||||
break;
|
||||
case 'H':
|
||||
if (level < _report.find_max_level('H'))
|
||||
if (level > 1)
|
||||
{
|
||||
ntype = 'B';
|
||||
nlevel = level-1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ntype = 'H';
|
||||
nlevel = level+1;
|
||||
nlevel = 1;
|
||||
}
|
||||
break;
|
||||
case 'H':
|
||||
if (level > 1)
|
||||
{
|
||||
ntype = 'H';
|
||||
nlevel = level-1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -298,10 +318,7 @@ protected:
|
||||
virtual bool on_key(KEY k);
|
||||
|
||||
protected:
|
||||
void draw_square(int x, int y, int s);
|
||||
void draw_field(const TReport_field& f);
|
||||
void draw_grid();
|
||||
void draw_fields();
|
||||
void snap_drag(PNT& pnt) const;
|
||||
void draw_dragster();
|
||||
|
||||
@ -339,53 +356,6 @@ TReport_section& TReport_window::curr_section() const
|
||||
return tree.curr_section();
|
||||
}
|
||||
|
||||
void TReport_window::draw_square(int x, int y, int s)
|
||||
{
|
||||
RCT rct; rct.left = x; rct.top = y; rct.right = x+s; rct.bottom = y+s;
|
||||
xvt_dwin_draw_rect(win(), &rct);
|
||||
}
|
||||
|
||||
void TReport_window::draw_field(const TReport_field& f)
|
||||
{
|
||||
RCT r; TWindow::log2dev(f.get_rect(), r);
|
||||
|
||||
switch (f.type())
|
||||
{
|
||||
case 'D':
|
||||
case 'N':
|
||||
case 'S':
|
||||
case 'T':
|
||||
if (f.border() <= 0)
|
||||
{
|
||||
set_pen(COLOR_LTGRAY);
|
||||
set_brush(f.back_color(), PAT_NONE);
|
||||
xvt_dwin_draw_rect(win(), &r);
|
||||
}
|
||||
f.draw(*this, rdm_edit);
|
||||
break;
|
||||
default: f.draw(*this, rdm_edit); break;
|
||||
}
|
||||
|
||||
if (f.selected())
|
||||
{
|
||||
set_pen(COLOR_BLACK);
|
||||
set_brush(COLOR_BLACK);
|
||||
const int s = 5;
|
||||
draw_square(r.left, r.top, s);
|
||||
draw_square(r.right-s, r.bottom-s, s);
|
||||
}
|
||||
}
|
||||
|
||||
void TReport_window::draw_fields()
|
||||
{
|
||||
TReport_section& rs = curr_section();
|
||||
FOR_EACH_ARRAY_ITEM(rs, i, o)
|
||||
{
|
||||
const TReport_field& f = *(const TReport_field*)o;
|
||||
draw_field(f);
|
||||
}
|
||||
}
|
||||
|
||||
bool TReport_window::pick(const TPoint& ptlog) const
|
||||
{
|
||||
TReport_section& rs = curr_section();
|
||||
@ -507,10 +477,11 @@ bool TReport_window::on_key(KEY k)
|
||||
#define POPUP_DUP 20886
|
||||
#define POPUP_CLEAR 20887
|
||||
#define POPUP_PROPERTIES 20888
|
||||
#define POPUP_NEWFIELD 20889
|
||||
|
||||
void TReport_window::popup_menu(EVENT* ep)
|
||||
{
|
||||
MENU_ITEM menu[8];
|
||||
MENU_ITEM menu[16]; // Stiamo larghi
|
||||
memset(menu, 0, sizeof(menu));
|
||||
|
||||
TRectangle rct;
|
||||
@ -524,6 +495,7 @@ void TReport_window::popup_menu(EVENT* ep)
|
||||
menu[4].tag = POPUP_CLEAR; menu[4].text = "Cancella"; menu[4].enabled = sel;
|
||||
menu[5].tag = -1; menu[5].separator = true;
|
||||
menu[6].tag = POPUP_PROPERTIES; menu[6].text = "Proprieta'"; menu[6].enabled = true;
|
||||
menu[7].tag = POPUP_NEWFIELD; menu[7].text = "Nuovo"; menu[7].enabled = true;
|
||||
|
||||
const PNT& p = ep->v.mouse.where;
|
||||
_pt_drag_start = dev2log(p);
|
||||
@ -626,8 +598,13 @@ void TReport_window::handler(WINDOW win, EVENT* ep)
|
||||
{
|
||||
TMask& m = owner().mask();
|
||||
const TPoint p = dev2log(ep->v.mouse.where);
|
||||
m.set(F_X, p.x/100);
|
||||
m.set(F_Y, p.y/100);
|
||||
|
||||
if (true) // Needs an option?
|
||||
{
|
||||
TString16 str; str.format("r:%3d c:%3d", p.y/100, p.x/100);
|
||||
statbar_set_title(TASK_WIN, str);
|
||||
}
|
||||
|
||||
if (_dragging != 0)
|
||||
{
|
||||
draw_dragster();
|
||||
@ -717,6 +694,9 @@ void TReport_window::handler(WINDOW win, EVENT* ep)
|
||||
owner().mask().send_key(K_SPACE, F_SEC_PROPERTIES);
|
||||
}
|
||||
break;
|
||||
case POPUP_NEWFIELD:
|
||||
owner().mask().send_key(K_SPACE, F_FLD_ADD);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -729,8 +709,8 @@ void TReport_window::handler(WINDOW win, EVENT* ep)
|
||||
|
||||
PNT TReport_window::log2dev(long x, long y) const
|
||||
{
|
||||
x -= origin().x*100;
|
||||
y -= origin().y*100;
|
||||
x -= origin().x * 100L;
|
||||
y -= origin().y * 100L;
|
||||
PNT p;
|
||||
p.h = short((x * _dpi.h) / (cpi() * 100L));
|
||||
p.v = short((y * _dpi.v) / (lpi() * 100L));
|
||||
@ -765,7 +745,7 @@ void TReport_window::draw_grid()
|
||||
void TReport_window::update()
|
||||
{
|
||||
draw_grid();
|
||||
draw_fields();
|
||||
curr_section().draw(*this, rdm_edit);
|
||||
}
|
||||
|
||||
int TReport_window::cpi() const
|
||||
|
894
ba/ba8302.cpp
894
ba/ba8302.cpp
File diff suppressed because it is too large
Load Diff
172
ba/ba8302.h
172
ba/ba8302.h
@ -13,6 +13,14 @@
|
||||
#include <xml.h>
|
||||
#endif
|
||||
|
||||
#ifndef __RECORDSET_H
|
||||
#include "ba8201.h"
|
||||
#endif
|
||||
|
||||
#ifndef __ALEX_H
|
||||
#include "ba8304.h"
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_font
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -58,6 +66,28 @@ class TReport_field;
|
||||
|
||||
enum TReport_draw_mode { rdm_edit, rdm_print, rdm_print_preview };
|
||||
|
||||
class TReport_script : public TObject
|
||||
{
|
||||
TBytecode* _bc; // Chesire's cat class
|
||||
TString _src;
|
||||
|
||||
protected:
|
||||
void destroy();
|
||||
|
||||
public:
|
||||
virtual bool ok() const { return !_src.blank(); }
|
||||
void set(const char* source);
|
||||
const TString& get() const { return _src; }
|
||||
|
||||
bool execute(TReport& report, TString& output);
|
||||
bool execute(TReport_field& rf);
|
||||
|
||||
void save(TXmlItem& root, const char* tag) const;
|
||||
bool load(const TXmlItem& root, const char* tag);
|
||||
TReport_script();
|
||||
virtual ~TReport_script();
|
||||
};
|
||||
|
||||
class TReport_section : public TArray
|
||||
{
|
||||
TReport& _report;
|
||||
@ -66,7 +96,8 @@ class TReport_section : public TArray
|
||||
int _level; // 0,1,2,...
|
||||
TPoint _size; // In centesimi
|
||||
TString _groupby;
|
||||
bool _hidden_if_needed;
|
||||
bool _page_break, _hidden_if_needed, _hidden, _deactivated;
|
||||
TReport_script _prescript, _postscript;
|
||||
|
||||
TReport_font* _font;
|
||||
|
||||
@ -78,6 +109,7 @@ public:
|
||||
virtual int add(TObject& obj);
|
||||
TReport_field& field(int i) { return *(TReport_field*)objptr(i); }
|
||||
const TReport_field& field(int i) const { return *(TReport_field*)objptr(i); }
|
||||
TReport_field* field(const TString& code);
|
||||
TReport& report() { return _report; }
|
||||
|
||||
char type() const { return _type; }
|
||||
@ -91,19 +123,39 @@ public:
|
||||
TPoint compute_size() const;
|
||||
bool compute_rect(TRectangle& rct) const;
|
||||
|
||||
bool page_break() const { return _page_break; }
|
||||
void force_page_break(bool pb) { _page_break = pb; }
|
||||
|
||||
const TString& grouped_by() const { return _groupby; }
|
||||
void group_by(const char* gb) { _groupby = gb; }
|
||||
|
||||
bool hidden_if_needed() const { return _hidden_if_needed; }
|
||||
void hide_if_needed(bool h) { _hidden_if_needed = h; }
|
||||
bool hidden() const { return _hidden; }
|
||||
bool shown() const { return !hidden(); }
|
||||
void show(bool on) { _hidden = !on; }
|
||||
void hide() { show(false); }
|
||||
bool deactivated() const { return _deactivated; }
|
||||
bool active() const { return !deactivated(); }
|
||||
void activate(bool on) { _deactivated = !on; }
|
||||
void deactivate() { activate(false); }
|
||||
|
||||
const TString& prescript() const { return _prescript.get(); }
|
||||
void set_prescript(const char* src) { _prescript.set(src); }
|
||||
const TString& postscript() const { return _postscript.get(); }
|
||||
void set_postscript(const char* src) { _postscript.set(src); }
|
||||
|
||||
bool has_font() const { return _font != NULL; }
|
||||
const TReport_font& font() const;
|
||||
void set_font(const TReport_font& f);
|
||||
|
||||
void compute_values();
|
||||
bool execute_prescript();
|
||||
bool execute_postscript();
|
||||
void draw(TWindow& win, TReport_draw_mode mode) const;
|
||||
|
||||
void save(TXmlItem& report) const;
|
||||
void load(const TXmlItem& sec);
|
||||
|
||||
TReport_section(TReport& r, char t, int l);
|
||||
virtual ~TReport_section();
|
||||
};
|
||||
@ -111,19 +163,22 @@ public:
|
||||
class TReport_field : public TObject
|
||||
{
|
||||
TReport_section* _section;
|
||||
int _id;
|
||||
char _type; // Text, String, Numeric, Date, Line, Rectangle, Image
|
||||
TRectangle _rct; // In centesimi
|
||||
COLOR _fgcolor, _bgcolor;
|
||||
short _border;
|
||||
char _halign, _valign;
|
||||
TString _picture, _field;
|
||||
TString _value;
|
||||
TVariant _var;
|
||||
TReport_script _prescript, _postscript;
|
||||
|
||||
TReport_font* _font;
|
||||
bool _selected;
|
||||
bool _hidden, _deactivated, _selected;
|
||||
|
||||
protected:
|
||||
void copy(const TReport_field& rf);
|
||||
TFieldtypes var_type() const;
|
||||
|
||||
public:
|
||||
virtual TObject* dup() const { return new TReport_field(*this); }
|
||||
@ -132,9 +187,6 @@ public:
|
||||
TReport_section& section() { return *_section; }
|
||||
void set_section(TReport_section* sec) { _section = sec; }
|
||||
|
||||
char type() const { return _type; }
|
||||
const char* type_name() const;
|
||||
|
||||
bool has_font() const { return _font != NULL; }
|
||||
const TReport_font& font() const;
|
||||
void set_font(const TReport_font& f);
|
||||
@ -144,8 +196,18 @@ public:
|
||||
|
||||
const TString& field() const { return _field; }
|
||||
void set_field(const char* str) { _field = str; }
|
||||
bool compute_value();
|
||||
|
||||
const TVariant& get() const { return _var; }
|
||||
void set(const char* str);
|
||||
void set(const TVariant& var);
|
||||
|
||||
bool execute_prescript();
|
||||
bool execute_postscript();
|
||||
|
||||
int id() const { return _id; }
|
||||
void set_id(int id) { _id = id; }
|
||||
char type() const { return _type; }
|
||||
const char* type_name() const;
|
||||
void set_type(char t) { _type = t; }
|
||||
void set_pos(long x, long y);
|
||||
void set_row(long y) { _rct.y = y; }
|
||||
@ -154,6 +216,15 @@ public:
|
||||
void set_width(long dx) { _rct.set_width(dx); }
|
||||
void set_height(long dy) { _rct.set_height(dy); }
|
||||
const TRectangle& get_rect() const { return _rct; }
|
||||
|
||||
bool hidden() const { return _hidden; }
|
||||
bool shown() const { return !hidden(); }
|
||||
void show(bool on) { _hidden = !on; }
|
||||
void hide() { show(false); }
|
||||
bool deactivated() const { return _deactivated; }
|
||||
bool active() const { return !deactivated(); }
|
||||
void activate(bool on) { _deactivated = !on; }
|
||||
void deactivate() { activate(false); }
|
||||
|
||||
void set_fore_color(COLOR c) { _fgcolor = c; }
|
||||
COLOR fore_color() const { return _fgcolor; }
|
||||
@ -165,6 +236,11 @@ public:
|
||||
char horizontal_alignment() const { return _halign; }
|
||||
void set_vertical_alignment(char a) { _valign = a; }
|
||||
char vertical_alignment() const { return _valign; }
|
||||
|
||||
const TString& prescript() const { return _prescript.get(); }
|
||||
void set_prescript(const char* src) { _prescript.set(src); }
|
||||
const TString& postscript() const { return _postscript.get(); }
|
||||
void set_postscript(const char* src) { _postscript.set(src); }
|
||||
|
||||
void select(bool ok = true) { _selected = ok; }
|
||||
bool selected() const { return _selected; }
|
||||
@ -182,9 +258,7 @@ public:
|
||||
virtual ~TReport_field();
|
||||
};
|
||||
|
||||
class TRecordset;
|
||||
|
||||
class TReport : public TObject
|
||||
class TReport : public TAlex_virtual_machine
|
||||
{
|
||||
TAssoc_array _sections;
|
||||
TFilename _path;
|
||||
@ -192,8 +266,17 @@ class TReport : public TObject
|
||||
TReport_font _font;
|
||||
int _lpi; // Lines per inch
|
||||
TRecordset* _recordset;
|
||||
TAssoc_array _expressions;
|
||||
|
||||
TString16 _curr_page;
|
||||
TReport_field* _curr_field;
|
||||
|
||||
protected:
|
||||
virtual unsigned int compile_usr_word(const TString& name) const;
|
||||
virtual bool execute_usr_word(unsigned int opcode, TVariant_stack& stack);
|
||||
virtual bool get_usr_val(const TString& name, TVariant& var) const;
|
||||
virtual bool set_usr_val(const TString& name, const TVariant& var);
|
||||
|
||||
void build_section_key(char type, int level, TString& key) const;
|
||||
short get_num_attr(const TXmlItem& item, const char* attr, short def = 0) const;
|
||||
COLOR get_col_attr(const TXmlItem& item, const char* attr, COLOR defcol = COLOR_BLACK) const;
|
||||
@ -216,6 +299,8 @@ public:
|
||||
bool set_recordset(const TString& sql);
|
||||
bool set_recordset(TRecordset* sql);
|
||||
TRecordset* recordset() const { return _recordset; }
|
||||
bool evaluate_atom(const char* atom, TVariant& var);
|
||||
bool evaluate(const char* expr, TVariant& var, TFieldtypes force_type);
|
||||
|
||||
void set_description(const char* d) { _description = d; }
|
||||
const TString& description() const { return _description; }
|
||||
@ -223,67 +308,20 @@ public:
|
||||
const TFilename& filename() const { return _path; }
|
||||
bool save(const char* fname) const;
|
||||
bool load(const char* fname);
|
||||
|
||||
|
||||
// Used by TReport_printer
|
||||
void set_curr_page(const char* str) { _curr_page = str; } // string 1-A
|
||||
const TString& curr_page() const { return _curr_page; }
|
||||
void set_curr_field(TReport_field* fld) { _curr_field = fld; }
|
||||
TReport_field* curr_field() const { return _curr_field; }
|
||||
|
||||
TReport_field* field(const TString& code);
|
||||
|
||||
void destroy();
|
||||
TReport();
|
||||
virtual ~TReport();
|
||||
};
|
||||
|
||||
class TPage_printer : public TWindow
|
||||
{
|
||||
protected:
|
||||
PRINT_RCD* _rcd;
|
||||
long _pw, _ph, _phr, _pvr; // Printer width, height, horizontal and vertical resolution
|
||||
word _copies, _pagefrom, _pageto, _page;
|
||||
bool _page_is_open;
|
||||
|
||||
virtual word pages() const { return 0; }
|
||||
virtual bool print_loop() pure;
|
||||
|
||||
protected:
|
||||
virtual const char* form_name() const;
|
||||
virtual const char* font_name() const;
|
||||
virtual int font_size() const;
|
||||
virtual bool ask_pages();
|
||||
|
||||
virtual bool open_page();
|
||||
virtual bool close_page();
|
||||
bool page_in_range() const;
|
||||
|
||||
public:
|
||||
bool main_loop(); // Internal use only
|
||||
virtual bool print(); // Use this
|
||||
TPage_printer();
|
||||
virtual ~TPage_printer();
|
||||
};
|
||||
|
||||
class TReport_printer : public TPage_printer
|
||||
{
|
||||
TReport& _report;
|
||||
TPoint _delta;
|
||||
double _kx, _ky;
|
||||
long _logical_page_height;
|
||||
long _logical_foot_pos;
|
||||
bool _is_last_page;
|
||||
|
||||
protected:
|
||||
virtual const char* form_name() const;
|
||||
virtual const char* font_name() const;
|
||||
virtual int font_size() const;
|
||||
|
||||
virtual PNT log2dev(long x, long y) const;
|
||||
virtual TPoint dev2log(const PNT& p) const;
|
||||
virtual bool print_loop();
|
||||
|
||||
virtual bool open_page();
|
||||
virtual bool close_page();
|
||||
long print_section(TReport_section& rs);
|
||||
long print_section(char type, int level);
|
||||
|
||||
public:
|
||||
TReport_printer(TReport& r) : _report(r) { }
|
||||
};
|
||||
|
||||
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);
|
||||
|
307
ba/ba8303.cpp
Executable file
307
ba/ba8303.cpp
Executable file
@ -0,0 +1,307 @@
|
||||
#include <mask.h>
|
||||
#include <printer.h>
|
||||
|
||||
#include <bagn003.h>
|
||||
#include "ba8201.h"
|
||||
#include "ba8303.h"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TPage_printer
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
const char* TPage_printer::form_name() const
|
||||
{
|
||||
return printer().get_form_name();
|
||||
}
|
||||
|
||||
const char* TPage_printer::font_name() const
|
||||
{
|
||||
return printer().fontname();
|
||||
}
|
||||
|
||||
int TPage_printer::font_size() const
|
||||
{
|
||||
return printer().get_char_size();
|
||||
}
|
||||
|
||||
bool TPage_printer::ask_pages()
|
||||
{
|
||||
if (_pageto <= 0)
|
||||
_pageto = pages();
|
||||
|
||||
TPrinter& p = printer();
|
||||
TMask msk("bagn003");
|
||||
msk.set(F_PRINTER, p.printername());
|
||||
msk.set(F_FORM, form_name());
|
||||
msk.set(F_FONT, font_name());
|
||||
msk.set(F_SIZE, font_size());
|
||||
msk.set(F_ISGRAPHICS, p.isgraphics() ? "X" : "");
|
||||
msk.set(F_FROMPAGE, _pagefrom);
|
||||
msk.set(F_TOPAGE, _pageto);
|
||||
msk.set(F_COPIES, _copies);
|
||||
const bool ok = msk.run() == K_ENTER;
|
||||
if (ok)
|
||||
{
|
||||
_copies = msk.get_int(F_COPIES);
|
||||
_pagefrom = msk.get_int(F_FROMPAGE);
|
||||
_pageto = msk.get_int(F_TOPAGE);
|
||||
if (_pageto < _pagefrom)
|
||||
_pageto = 0;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TPage_printer::main_loop()
|
||||
{
|
||||
TPrinter& p = printer();
|
||||
_rcd = p.get_printrcd();
|
||||
if (!xvt_print_is_valid(_rcd))
|
||||
return TRUE; // aborted
|
||||
|
||||
WINDOW prwin = xvt_print_create_win(_rcd, (char*)(const char*)form_name());
|
||||
if (prwin == NULL_WIN)
|
||||
return TRUE; // aborted
|
||||
set_win(prwin);
|
||||
|
||||
xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, _rcd, &_ph, &_pw, &_pvr, &_phr);
|
||||
|
||||
bool ok = true;
|
||||
for (word c = 0; c < _copies && ok; c++)
|
||||
{
|
||||
_page = 0;
|
||||
ok = print_loop();
|
||||
}
|
||||
|
||||
xvt_vobj_destroy(prwin);
|
||||
set_win(NULL_WIN);
|
||||
|
||||
return !ok;
|
||||
}
|
||||
|
||||
bool TPage_printer::page_in_range() const
|
||||
{
|
||||
if (_page < _pagefrom)
|
||||
return false;
|
||||
return _pageto < _pagefrom || _page <= _pageto;
|
||||
}
|
||||
|
||||
bool TPage_printer::open_page()
|
||||
{
|
||||
_page++;
|
||||
if (page_in_range())
|
||||
_page_is_open = xvt_print_open_page(_rcd) != 0;
|
||||
else
|
||||
_page_is_open = false;
|
||||
|
||||
return _page_is_open;
|
||||
}
|
||||
|
||||
bool TPage_printer::close_page()
|
||||
{
|
||||
const bool was_open = _page_is_open;
|
||||
if (was_open)
|
||||
{
|
||||
xvt_print_close_page(_rcd);
|
||||
_page_is_open = false;
|
||||
}
|
||||
return was_open;
|
||||
}
|
||||
|
||||
static BOOLEAN main_loop_callback(long jolly)
|
||||
{
|
||||
TPage_printer* pp = (TPage_printer*)jolly;
|
||||
return pp->main_loop();
|
||||
}
|
||||
|
||||
bool TPage_printer::print()
|
||||
{
|
||||
bool ok = ask_pages();
|
||||
if (ok)
|
||||
ok = xvt_print_start_thread(main_loop_callback, long(this)) == FALSE;
|
||||
return ok;
|
||||
}
|
||||
|
||||
TPage_printer::TPage_printer() : _pagefrom(1), _pageto(0), _copies(1)
|
||||
{ }
|
||||
|
||||
TPage_printer::~TPage_printer()
|
||||
{ }
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_printer
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
const char* TReport_printer::form_name() const
|
||||
{
|
||||
return _report.filename();
|
||||
}
|
||||
|
||||
const char* TReport_printer::font_name() const
|
||||
{
|
||||
return _report.font().name();
|
||||
}
|
||||
|
||||
int TReport_printer::font_size() const
|
||||
{
|
||||
return _report.font().size();
|
||||
}
|
||||
|
||||
PNT TReport_printer::log2dev(long lx, long ly) const
|
||||
{
|
||||
const double cx = (double)_phr / (double)_report.cpi();
|
||||
const double cy = (double)_pvr / (double)_report.lpi();
|
||||
|
||||
const short x = short((lx + _delta.x) * cx / 100.0);
|
||||
const short y = short((ly + _delta.y) * cy / 100.0);
|
||||
const PNT pnt = { y, x };
|
||||
return pnt;
|
||||
}
|
||||
|
||||
TPoint TReport_printer::dev2log(const PNT& pnt) const
|
||||
{
|
||||
CHECK(0, "dev2log: Pure virtual funtion call");
|
||||
const TPoint p;
|
||||
return p;
|
||||
}
|
||||
|
||||
long TReport_printer::print_section(char type, int level)
|
||||
{
|
||||
long h = 0;
|
||||
TReport_section* rs = _report.find_section(type, level);
|
||||
if (rs != NULL)
|
||||
h = print_section(*rs);
|
||||
return h;
|
||||
}
|
||||
|
||||
bool TReport_printer::open_page()
|
||||
{
|
||||
const bool ok = TPage_printer::open_page();
|
||||
|
||||
TString8 str; str << _page;
|
||||
_report.set_curr_page(str);
|
||||
|
||||
_delta.x = _delta.y = 0;
|
||||
_page_break_allowed = false;
|
||||
print_section('B', 0);
|
||||
if (_page == 1)
|
||||
_delta.y += print_section('H', 1);
|
||||
|
||||
TReport_section* page_head = _report.find_section('H', 0);
|
||||
if (page_head != NULL && (_page > 1 || !page_head->hidden_if_needed()))
|
||||
_delta.y += print_section(*page_head);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TReport_printer::close_page()
|
||||
{
|
||||
if (_page_is_open)
|
||||
{
|
||||
TReport_section* page_foot = _report.find_section('F', 0);
|
||||
if (page_foot != NULL && (!_is_last_page || !page_foot->hidden_if_needed()))
|
||||
{
|
||||
_delta.x = 0;
|
||||
_delta.y = _logical_foot_pos;
|
||||
print_section(*page_foot);
|
||||
}
|
||||
}
|
||||
return TPage_printer::close_page();
|
||||
}
|
||||
|
||||
long TReport_printer::print_section(TReport_section& rs)
|
||||
{
|
||||
rs.execute_prescript();
|
||||
const long height = rs.compute_size().y; // Compute size after the initilization script!
|
||||
|
||||
if (height > 0) // Has some visible fields
|
||||
{
|
||||
bool page_break = _page_break_allowed && rs.page_break();
|
||||
if (!page_break)
|
||||
page_break = (_delta.y + height > _logical_foot_pos);
|
||||
if (page_break && rs.level() > 0) // Avoid recursion
|
||||
{
|
||||
close_page();
|
||||
open_page();
|
||||
}
|
||||
if (_page_is_open)
|
||||
rs.draw(*this, rdm_print);
|
||||
|
||||
if (rs.level() > 0) // Ho stampa qualcosa che non sia lo sfondo!
|
||||
_page_break_allowed = true;
|
||||
}
|
||||
|
||||
rs.execute_postscript();
|
||||
|
||||
return height;
|
||||
}
|
||||
|
||||
bool TReport_printer::print_loop()
|
||||
{
|
||||
if (_report.recordset() == NULL)
|
||||
return false;
|
||||
TRecordset& rex = *_report.recordset();
|
||||
if (rex.items() <= 0)
|
||||
return false;
|
||||
|
||||
_kx = double(_phr) / double(_report.cpi()*100.0);
|
||||
_ky = double(_pvr) / double(_report.lpi()*100.0);
|
||||
|
||||
const double pollici_pagina = (double)_ph / (double)_pvr;
|
||||
const double righe_pagina = pollici_pagina * _report.lpi();
|
||||
_logical_page_height = long(righe_pagina*100.0);
|
||||
const long logical_footer_height = _report.section('F',0).compute_size().y;
|
||||
_logical_foot_pos = _logical_page_height - logical_footer_height;
|
||||
|
||||
TString_array oldgroup, newgroup;
|
||||
const int max_group = _report.find_max_level('H');
|
||||
if (max_group >= 2)
|
||||
{
|
||||
for (int g = 2; g <= max_group; g++)
|
||||
oldgroup.add(EMPTY_STRING, g);
|
||||
}
|
||||
const int max_body = _report.find_max_level('B');
|
||||
|
||||
_is_last_page = false;
|
||||
open_page();
|
||||
for (bool ok = rex.move_to(0); ok; ok = rex.move_next())
|
||||
{
|
||||
if (_pageto >= _pagefrom && _page > _pageto) // out of range
|
||||
break;
|
||||
|
||||
if (max_group >= 2) // Gestione raggruppamenti
|
||||
{
|
||||
int changed = 0;
|
||||
TVariant var;
|
||||
for (int g = 2; g <= max_group; g++)
|
||||
{
|
||||
const TString& expr = _report.section('H', g).grouped_by();
|
||||
_report.evaluate(expr, var, _alfafld);
|
||||
newgroup.add(var.as_string(), g);
|
||||
if (newgroup.row(g) != oldgroup.row(g))
|
||||
changed = g;
|
||||
}
|
||||
if (changed)
|
||||
{
|
||||
oldgroup = newgroup;
|
||||
if (rex.current_row() > 0)
|
||||
{
|
||||
for (int g = 2; g <= changed; g++)
|
||||
_delta.y += print_section('F', g);
|
||||
}
|
||||
for (int g = changed; g >= 2 ; g--)
|
||||
_delta.y += print_section('H', g);
|
||||
}
|
||||
}
|
||||
|
||||
for (int b = 1; b <= max_body; b++)
|
||||
_delta.y += print_section('B', b);
|
||||
}
|
||||
if (rex.eof())
|
||||
print_section('F', 1);
|
||||
_is_last_page = true;
|
||||
close_page();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
67
ba/ba8303.h
Executable file
67
ba/ba8303.h
Executable file
@ -0,0 +1,67 @@
|
||||
#ifndef __REPRINT_H
|
||||
#define __REPRINT_H
|
||||
|
||||
#ifndef __REPORT_H
|
||||
#include "ba8302.h"
|
||||
#endif
|
||||
|
||||
class TPage_printer : public TWindow
|
||||
{
|
||||
protected:
|
||||
PRINT_RCD* _rcd;
|
||||
long _pw, _ph, _phr, _pvr; // Printer width, height, horizontal and vertical resolution
|
||||
word _copies, _pagefrom, _pageto, _page;
|
||||
bool _page_is_open;
|
||||
|
||||
virtual word pages() const { return 0; }
|
||||
virtual bool print_loop() pure;
|
||||
|
||||
protected:
|
||||
virtual const char* form_name() const;
|
||||
virtual const char* font_name() const;
|
||||
virtual int font_size() const;
|
||||
virtual bool ask_pages();
|
||||
|
||||
virtual bool open_page();
|
||||
virtual bool close_page();
|
||||
bool page_in_range() const;
|
||||
|
||||
public:
|
||||
bool main_loop(); // Internal use only
|
||||
virtual bool print(); // Use this
|
||||
TPage_printer();
|
||||
virtual ~TPage_printer();
|
||||
};
|
||||
|
||||
class TReport_printer : public TPage_printer
|
||||
{
|
||||
TReport& _report;
|
||||
TPoint _delta;
|
||||
double _kx, _ky;
|
||||
long _logical_page_height;
|
||||
long _logical_foot_pos;
|
||||
bool _is_last_page, _page_break_allowed;
|
||||
|
||||
protected:
|
||||
virtual const char* form_name() const;
|
||||
virtual const char* font_name() const;
|
||||
virtual int font_size() const;
|
||||
|
||||
virtual PNT log2dev(long x, long y) const;
|
||||
virtual TPoint dev2log(const PNT& p) const;
|
||||
virtual bool print_loop();
|
||||
|
||||
virtual bool open_page();
|
||||
virtual bool close_page();
|
||||
long print_section(TReport_section& rs);
|
||||
long print_section(char type, int level);
|
||||
|
||||
public:
|
||||
TReport_printer(TReport& r) : _report(r) { }
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
#endif
|
308
ba/ba8304.cpp
Executable file
308
ba/ba8304.cpp
Executable file
@ -0,0 +1,308 @@
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <date.h>
|
||||
#include <real.h>
|
||||
#include <stack.h>
|
||||
|
||||
#include "ba8304.h"
|
||||
|
||||
TVariant& TVariant_stack::peek(int depth)
|
||||
{
|
||||
const int sp = _sp-depth-1;
|
||||
return sp >= 0 ? (TVariant&)_var[sp] : NULL_VARIANT;
|
||||
}
|
||||
|
||||
TVariant& TVariant_stack::pop()
|
||||
{
|
||||
TVariant& var = peek();
|
||||
if (_sp > 0)
|
||||
_sp--;
|
||||
return var;
|
||||
}
|
||||
|
||||
void TVariant_stack::push(const TVariant& var)
|
||||
{
|
||||
if (_var.objptr(_sp) == NULL)
|
||||
_var.add(var, _sp);
|
||||
else
|
||||
(TVariant&)_var[_sp] = var;
|
||||
_sp++;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAVM_op
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
enum AVM_opcode { avm_nop, avm_add, avm_dot, avm_dup, avm_push, avm_sub,
|
||||
avm_usrget, avm_usrset, avm_usrword };
|
||||
|
||||
class TAVM_op : public TObject
|
||||
{
|
||||
AVM_opcode _op;
|
||||
TVariant _var;
|
||||
|
||||
public:
|
||||
const TVariant& var() const { return _var; }
|
||||
TVariant& var() { return _var; }
|
||||
AVM_opcode op() const { return _op; }
|
||||
|
||||
TAVM_op(AVM_opcode o, const TString& str);
|
||||
TAVM_op(AVM_opcode o, const real& num);
|
||||
TAVM_op(AVM_opcode o, const long num);
|
||||
TAVM_op(AVM_opcode o);
|
||||
};
|
||||
|
||||
TAVM_op::TAVM_op(AVM_opcode o, const TString& str)
|
||||
: _op(o), _var(str)
|
||||
{ }
|
||||
|
||||
TAVM_op::TAVM_op(AVM_opcode o, const real& num)
|
||||
: _op(o), _var(num)
|
||||
{ }
|
||||
|
||||
TAVM_op::TAVM_op(AVM_opcode o, const long num)
|
||||
: _op(o), _var(num)
|
||||
{ }
|
||||
|
||||
TAVM_op::TAVM_op(AVM_opcode o)
|
||||
: _op(o)
|
||||
{ }
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAVM
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TAVM
|
||||
{
|
||||
TAlex_virtual_machine* _vm;
|
||||
TString _last_error;
|
||||
TVariant_stack _stack;
|
||||
|
||||
protected:
|
||||
bool get_token(istream& instr, TString& str) const;
|
||||
AVM_opcode token2opcode(const TString& str) const;
|
||||
void log_error(const char* str);
|
||||
|
||||
public:
|
||||
const TString& get_last_error() const { return _last_error; }
|
||||
|
||||
bool compile(istream& instr, TBytecode& bc);
|
||||
bool execute(const TBytecode& bc, ostream& outstr);
|
||||
|
||||
TAVM(TAlex_virtual_machine* vm) : _vm(vm) { }
|
||||
};
|
||||
|
||||
void TAVM::log_error(const char* str)
|
||||
{
|
||||
_last_error = str;
|
||||
error_box(str);
|
||||
}
|
||||
|
||||
bool TAVM::get_token(istream& instr, TString& str) const
|
||||
{
|
||||
str.cut(0);
|
||||
instr.eatwhite();
|
||||
if (instr.eof())
|
||||
return false;
|
||||
char c;
|
||||
instr.get(c);
|
||||
str << c;
|
||||
char* buf = str.get_buffer()+1;
|
||||
const int bufsize = str.size()-1;
|
||||
if (c == '"')
|
||||
{
|
||||
instr.getline(buf, bufsize, '"');
|
||||
str << '"';
|
||||
}
|
||||
else
|
||||
instr.getline(buf, bufsize, ' ');
|
||||
|
||||
return *str > ' ';
|
||||
}
|
||||
|
||||
AVM_opcode TAVM::token2opcode(const TString& str) const
|
||||
{
|
||||
const char* AVM_TOKENS[4] = {
|
||||
"+", "-", ".",
|
||||
NULL
|
||||
};
|
||||
|
||||
AVM_opcode AVM_OPCODES[4] = {
|
||||
avm_add, avm_sub, avm_dot,
|
||||
avm_nop
|
||||
};
|
||||
|
||||
for (int i = 0; AVM_TOKENS[i] != NULL; i++)
|
||||
{
|
||||
if (str == AVM_TOKENS[i])
|
||||
return AVM_OPCODES[i];
|
||||
}
|
||||
return avm_nop;
|
||||
}
|
||||
|
||||
bool TAVM::compile(istream& instr, TBytecode& bytecode)
|
||||
{
|
||||
TString str(256);
|
||||
bytecode.destroy();
|
||||
bytecode.set_language("Alex");
|
||||
while (get_token(instr, str))
|
||||
{
|
||||
TAVM_op* op = NULL;
|
||||
if (str[0] == '"')
|
||||
{
|
||||
str.rtrim(1); str.ltrim(1);
|
||||
op = new TAVM_op(avm_push, str);
|
||||
} else
|
||||
if (str[0] == '@') // Address of field?
|
||||
{
|
||||
str.ltrim(1);
|
||||
op = new TAVM_op(avm_push, str);
|
||||
} else
|
||||
if (isdigit(str[0]))
|
||||
{
|
||||
const real r(str);
|
||||
op = new TAVM_op(avm_push, r);
|
||||
} else
|
||||
if (str[0] == '#')
|
||||
{
|
||||
op = new TAVM_op(avm_usrget, str);
|
||||
}
|
||||
else
|
||||
{
|
||||
const AVM_opcode oc = token2opcode(str);
|
||||
if (oc != avm_nop)
|
||||
op = new TAVM_op(oc);
|
||||
else
|
||||
{
|
||||
const unsigned int oc = _vm->compile_usr_word(str);
|
||||
if (oc > 0)
|
||||
op = new TAVM_op(avm_usrword, oc);
|
||||
}
|
||||
}
|
||||
if (op != NULL)
|
||||
bytecode.add(op);
|
||||
else
|
||||
{
|
||||
_last_error.cut(0) << "Unknown WORD: " << str;
|
||||
log_error(_last_error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TAVM::execute(const TBytecode& bc, ostream& outstr)
|
||||
{
|
||||
int ip = 0;
|
||||
while (ip < bc.items())
|
||||
{
|
||||
const TAVM_op& op = *(const TAVM_op*)bc.objptr(ip);
|
||||
bool jumped_elsewhere = false;
|
||||
switch(op.op())
|
||||
{
|
||||
case avm_add :
|
||||
{
|
||||
const TVariant& v1 = _stack.pop();
|
||||
TVariant& v0 = (TVariant&)_stack.peek();
|
||||
v0.add(v1);
|
||||
}
|
||||
break;
|
||||
case avm_dot: outstr << _stack.pop().as_string(); break;
|
||||
case avm_dup: _stack.push(_stack.peek()); break;
|
||||
case avm_push: _stack.push(op.var()); break;
|
||||
case avm_sub :
|
||||
{
|
||||
const TVariant& v1 = _stack.pop();
|
||||
TVariant& v0 = (TVariant&)_stack.peek();
|
||||
v0.sub(v1);
|
||||
}
|
||||
break;
|
||||
case avm_usrget:
|
||||
{
|
||||
const TString& name = op.var().as_string();
|
||||
TVariant var; _vm->get_usr_val(name, var);
|
||||
_stack.push(var);
|
||||
}
|
||||
break;
|
||||
case avm_usrword: _vm->execute_usr_word(op.var().as_int(), _stack); break;
|
||||
default:
|
||||
_last_error << "Bad op code: " << op.op() << '\n';
|
||||
log_error(_last_error);
|
||||
return false;
|
||||
}
|
||||
if (!jumped_elsewhere)
|
||||
ip++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAlex_virtual_machine
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
const TString& TAlex_virtual_machine::get_last_error() const
|
||||
{
|
||||
if (_avm != NULL)
|
||||
return _avm->get_last_error();
|
||||
return EMPTY_STRING;
|
||||
}
|
||||
|
||||
bool TAlex_virtual_machine::compile(istream& instr, TBytecode& bc)
|
||||
{
|
||||
if (_avm == NULL)
|
||||
_avm = new TAVM(this);
|
||||
return _avm->compile(instr, bc);
|
||||
}
|
||||
|
||||
bool TAlex_virtual_machine::execute(const TBytecode& bc, ostream& outstr)
|
||||
{
|
||||
if (_avm == NULL)
|
||||
_avm = new TAVM(this);
|
||||
return _avm->execute(bc, outstr);
|
||||
}
|
||||
|
||||
bool TAlex_virtual_machine::compile(const char* cmd, TBytecode& bc)
|
||||
{
|
||||
istrstream instr((char*)cmd, strlen(cmd));
|
||||
return compile(instr, bc);
|
||||
}
|
||||
|
||||
bool TAlex_virtual_machine::execute(const TBytecode& bc, TString& outs)
|
||||
{
|
||||
char* buf = outs.get_buffer();
|
||||
memset(buf, 0, outs.size());
|
||||
ostrstream outstr(buf, outs.size());
|
||||
return execute(bc, outstr);
|
||||
}
|
||||
|
||||
bool TAlex_virtual_machine::get_usr_val(const TString& name, TVariant& var) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TAlex_virtual_machine::set_usr_val(const TString& name, const TVariant& var)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned int TAlex_virtual_machine::compile_usr_word(const TString& name) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool TAlex_virtual_machine::execute_usr_word(unsigned int opcode, TVariant_stack& stack)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
TAlex_virtual_machine::TAlex_virtual_machine() : _avm(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
TAlex_virtual_machine::~TAlex_virtual_machine()
|
||||
{
|
||||
if (_avm != NULL)
|
||||
delete _avm;
|
||||
}
|
||||
|
61
ba/ba8304.h
Executable file
61
ba/ba8304.h
Executable file
@ -0,0 +1,61 @@
|
||||
#ifndef __ALEX_H
|
||||
#define __ALEX_H
|
||||
|
||||
#ifndef __RECORDSET_H
|
||||
#include "ba8201.h"
|
||||
#endif
|
||||
|
||||
class TVariant_stack : public TObject
|
||||
{
|
||||
TArray _var;
|
||||
int _sp;
|
||||
|
||||
public:
|
||||
int items() const { return _sp; }
|
||||
void push(const TVariant& var);
|
||||
TVariant& pop();
|
||||
TVariant& peek(int depth = 0);
|
||||
TVariant_stack() : _sp(0) { }
|
||||
};
|
||||
|
||||
// Generic bytecode for any language
|
||||
|
||||
class TBytecode : public TArray
|
||||
{
|
||||
TString16 _language;
|
||||
TString _name;
|
||||
|
||||
public:
|
||||
void set_language(const char* lang) { _language = lang; }
|
||||
const TString& language() const { return _language; }
|
||||
|
||||
const set_name(const char* name) { _name = name; }
|
||||
const TString& name() const { return _name; }
|
||||
};
|
||||
|
||||
// ALEX = Another Language EXtension
|
||||
|
||||
class TAVM;
|
||||
|
||||
class TAlex_virtual_machine : public TObject
|
||||
{
|
||||
TAVM* _avm; // Chesire's cat class
|
||||
|
||||
public:
|
||||
virtual unsigned int compile_usr_word(const TString& name) const;
|
||||
virtual bool execute_usr_word(unsigned int opcode, TVariant_stack& stack);
|
||||
virtual bool get_usr_val(const TString& name, TVariant& var) const;
|
||||
virtual bool set_usr_val(const TString& name, const TVariant& var);
|
||||
|
||||
const TString& get_last_error() const;
|
||||
bool compile(istream& instr, TBytecode& bc);
|
||||
bool compile(const char* cmd, TBytecode& bc);
|
||||
bool execute(const TBytecode& bc, ostream& outstr);
|
||||
bool execute(const TBytecode& bc, TString& outstr);
|
||||
|
||||
TAlex_virtual_machine();
|
||||
virtual ~TAlex_virtual_machine();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user