Patch level : 2.1 nopatch
Files correlati : ba8.exe Ricompilazione Demo : [ ] Commento : Correzioni sulla generazione query e report git-svn-id: svn://10.65.10.50/trunk@11971 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
72e6b39e20
commit
e957ff5b78
@ -292,6 +292,7 @@ class TQuery_mask : public TAutomask
|
|||||||
|
|
||||||
TFilename _curr_query;// Nome completo della query in editazione
|
TFilename _curr_query;// Nome completo della query in editazione
|
||||||
bool _is_dirty; // Maschera cambiata dall'ultimo caricamento
|
bool _is_dirty; // Maschera cambiata dall'ultimo caricamento
|
||||||
|
bool _sql_dirty; // Query modificata manualmente
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void handler(WINDOW win, EVENT* ep);
|
virtual void handler(WINDOW win, EVENT* ep);
|
||||||
@ -350,8 +351,10 @@ bool TQuery_mask::add_file_to_tree()
|
|||||||
TTable_mask msk;
|
TTable_mask msk;
|
||||||
|
|
||||||
const TRelation_node* father = curr_node();
|
const TRelation_node* father = curr_node();
|
||||||
|
TString fatherid;
|
||||||
if (father != NULL)
|
if (father != NULL)
|
||||||
{
|
{
|
||||||
|
_tree.curr_id(fatherid);
|
||||||
msk.set(F_FATHER, father->name());
|
msk.set(F_FATHER, father->name());
|
||||||
msk.set(F_FATHER_ALIAS, father->alias());
|
msk.set(F_FATHER_ALIAS, father->alias());
|
||||||
}
|
}
|
||||||
@ -362,6 +365,8 @@ bool TQuery_mask::add_file_to_tree()
|
|||||||
{
|
{
|
||||||
TRelation_node* son = new TRelation_node(father, msk.son_logicnum(), msk.get(F_SON_ALIAS));
|
TRelation_node* son = new TRelation_node(father, msk.son_logicnum(), msk.get(F_SON_ALIAS));
|
||||||
msk.mask2node(*son);
|
msk.mask2node(*son);
|
||||||
|
if (fatherid.not_empty())
|
||||||
|
_tree.goto_node(fatherid);
|
||||||
_tree.add_son(son);
|
_tree.add_son(son);
|
||||||
_tree.expand_all();
|
_tree.expand_all();
|
||||||
tfield(F_TABLES).win().force_update();
|
tfield(F_TABLES).win().force_update();
|
||||||
@ -380,6 +385,8 @@ bool TQuery_mask::edit_file_in_tree()
|
|||||||
if (son == NULL)
|
if (son == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
TString sonid; _tree.curr_id(sonid);
|
||||||
|
|
||||||
const TRelation_node* father = NULL;
|
const TRelation_node* father = NULL;
|
||||||
if (_tree.goto_father())
|
if (_tree.goto_father())
|
||||||
father = (const TRelation_node*)_tree.curr_node();
|
father = (const TRelation_node*)_tree.curr_node();
|
||||||
@ -417,6 +424,17 @@ bool TQuery_mask::edit_file_in_tree()
|
|||||||
case K_DEL:
|
case K_DEL:
|
||||||
if (curr_node() != NULL)
|
if (curr_node() != NULL)
|
||||||
{
|
{
|
||||||
|
if (yesno_box(TR("Eliminare anche le colonne associate della query?")))
|
||||||
|
{
|
||||||
|
TSheet_field& sheet = sfield(F_SHEET);
|
||||||
|
FOR_EACH_SHEET_ROW_BACK(sheet, r, row)
|
||||||
|
{
|
||||||
|
const TString& id = row->get(0);
|
||||||
|
if (id == son->id())
|
||||||
|
sheet.destroy(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_tree.goto_node(sonid);
|
||||||
_tree.kill_node();
|
_tree.kill_node();
|
||||||
_tree.goto_root();
|
_tree.goto_root();
|
||||||
}
|
}
|
||||||
@ -670,6 +688,9 @@ void TQuery_mask::sheet2sql()
|
|||||||
sql << ";";
|
sql << ";";
|
||||||
|
|
||||||
set(F_SQL, sql, true);
|
set(F_SQL, sql, true);
|
||||||
|
_sql_dirty = false;
|
||||||
|
TEdit_field& fs = efield(F_SQL);
|
||||||
|
fs.set_focusdirty(false); // Evita di scatenare eventi inutili
|
||||||
}
|
}
|
||||||
|
|
||||||
static int select_callback(void* jolly, int argc, char** value, char** field)
|
static int select_callback(void* jolly, int argc, char** value, char** field)
|
||||||
@ -937,6 +958,7 @@ void TQuery_mask::global_reset()
|
|||||||
tf.win().force_update();
|
tf.win().force_update();
|
||||||
}
|
}
|
||||||
reset();
|
reset();
|
||||||
|
_is_dirty = _sql_dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Caica l'intera query
|
// Caica l'intera query
|
||||||
@ -974,7 +996,9 @@ bool TQuery_mask::load_query()
|
|||||||
{
|
{
|
||||||
TString str; sql->GetEnclosedText(str);
|
TString str; sql->GetEnclosedText(str);
|
||||||
set(F_SQL, str, true); // Aggiorna anche stato bottoni di esportazione
|
set(F_SQL, str, true); // Aggiorna anche stato bottoni di esportazione
|
||||||
field(F_SQL).set_dirty(false); // Evita falsi allarmi di registrazione
|
TEdit_field& sf = efield(F_SQL);
|
||||||
|
sf.set_dirty(false); // Evita falsi allarmi di registrazione
|
||||||
|
_sql_dirty = !sf.empty();
|
||||||
}
|
}
|
||||||
_is_dirty = false; // Resetta definitivamente il dirty
|
_is_dirty = false; // Resetta definitivamente il dirty
|
||||||
}
|
}
|
||||||
@ -1046,8 +1070,14 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|||||||
case F_GENSQL:
|
case F_GENSQL:
|
||||||
if (e == fe_button)
|
if (e == fe_button)
|
||||||
{
|
{
|
||||||
sheet2sql();
|
|
||||||
next_page(1001);
|
next_page(1001);
|
||||||
|
bool ok = true;
|
||||||
|
if (_sql_dirty)
|
||||||
|
ok = yesno_box(TR("Attenzione: la query verra' rigenerata\n"
|
||||||
|
"annullando eventuali modifiche manuali.\n"
|
||||||
|
"Si desidera proseguire?"));
|
||||||
|
if (ok)
|
||||||
|
sheet2sql();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case F_EDITQUERY:
|
case F_EDITQUERY:
|
||||||
@ -1058,7 +1088,11 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|||||||
if (e == fe_init || e == fe_modify)
|
if (e == fe_init || e == fe_modify)
|
||||||
{
|
{
|
||||||
enable(-2, !o.empty());
|
enable(-2, !o.empty());
|
||||||
_is_dirty = e == fe_modify;
|
if (e == fe_modify)
|
||||||
|
{
|
||||||
|
_is_dirty = true;
|
||||||
|
_sql_dirty = !o.empty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case F_EXPORT_HTML:
|
case F_EXPORT_HTML:
|
||||||
@ -1093,6 +1127,7 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|||||||
{
|
{
|
||||||
save_if_needed();
|
save_if_needed();
|
||||||
global_reset();
|
global_reset();
|
||||||
|
next_page(1000);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DLG_FINDREC:
|
case DLG_FINDREC:
|
||||||
@ -1103,12 +1138,14 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|||||||
{
|
{
|
||||||
get_qry_path(_curr_query);
|
get_qry_path(_curr_query);
|
||||||
save_query();
|
save_query();
|
||||||
|
next_page(1000);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DLG_DELREC:
|
case DLG_DELREC:
|
||||||
if (e == fe_button && jolly == 0) // Elimina della Toolbar
|
if (e == fe_button && jolly == 0) // Elimina della Toolbar
|
||||||
{
|
{
|
||||||
delete_query();
|
delete_query();
|
||||||
|
next_page(1000);
|
||||||
return false; // Do not exit!
|
return false; // Do not exit!
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -74,6 +74,19 @@ void TVariant::set(const long n)
|
|||||||
_ptr = (void*)n;
|
_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 as_string().blank();
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
TDate TVariant::as_date() const
|
TDate TVariant::as_date() const
|
||||||
{
|
{
|
||||||
if (_type == _datefld)
|
if (_type == _datefld)
|
||||||
@ -487,8 +500,16 @@ bool TRecordset::save_as(const char* path, TRecordsetExportFormat fmt)
|
|||||||
|
|
||||||
const TVariant& TRecordset::get(const char* column_name) const
|
const TVariant& TRecordset::get(const char* column_name) const
|
||||||
{
|
{
|
||||||
if (*column_name == '#' && variables().items() > 0)
|
if (*column_name == '#')
|
||||||
return get_var(column_name);
|
{
|
||||||
|
if (variables().items() > 0)
|
||||||
|
{
|
||||||
|
const TVariant& var = get_var(column_name);
|
||||||
|
if (!var.is_null())
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
column_name++;
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < columns(); i++)
|
for (unsigned int i = 0; i < columns(); i++)
|
||||||
{
|
{
|
||||||
@ -546,7 +567,7 @@ bool ask_variable(const char* name, TVariant& var)
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TRecordset::ask_variables(bool all) const
|
bool TRecordset::ask_variables(bool all)
|
||||||
{
|
{
|
||||||
const bool ok = variables().items() > 0;
|
const bool ok = variables().items() > 0;
|
||||||
if (ok) // Se ci sono variabili faccio le sostituzioni
|
if (ok) // Se ci sono variabili faccio le sostituzioni
|
||||||
@ -554,12 +575,16 @@ bool TRecordset::ask_variables(bool all) const
|
|||||||
FOR_EACH_ARRAY_ROW(_varnames, i, name)
|
FOR_EACH_ARRAY_ROW(_varnames, i, name)
|
||||||
{
|
{
|
||||||
TVariant var = get_var(*name);
|
TVariant var = get_var(*name);
|
||||||
if (var.is_null() || all) // Mi serve assolutamente un valore!
|
if (var.is_null() || all)
|
||||||
{
|
{
|
||||||
ask_variable(*name, var);
|
ask_variable(*name, var);
|
||||||
((TSQL_recordset*)this)->set_var(*name, var);
|
if (var.is_null())
|
||||||
|
var.set(""); // Mi serve assolutamente un valore!
|
||||||
|
|
||||||
|
set_var(*name, var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
move_to(-1);
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
@ -993,7 +1018,7 @@ TSQLite::~TSQLite()
|
|||||||
|
|
||||||
void TSQL_recordset::reset()
|
void TSQL_recordset::reset()
|
||||||
{
|
{
|
||||||
_firstrow = _items = 0;
|
_items = 0;
|
||||||
_pagesize = 512;
|
_pagesize = 512;
|
||||||
_page.destroy();
|
_page.destroy();
|
||||||
_column.destroy();
|
_column.destroy();
|
||||||
@ -1039,7 +1064,8 @@ static int query_get_items(void* jolly, int argc, char** values, char** columns)
|
|||||||
void TSQL_recordset::parsed_sql_text(TString& sql) const
|
void TSQL_recordset::parsed_sql_text(TString& sql) const
|
||||||
{
|
{
|
||||||
sql = _sql;
|
sql = _sql;
|
||||||
if (ask_variables(false)) // Se ci sono variabili faccio le sostituzioni
|
const bool vars = ((TSQL_recordset*)this)->ask_variables(false);
|
||||||
|
if (vars) // Se ci sono variabili faccio le sostituzioni
|
||||||
{
|
{
|
||||||
const TString_array& names = variables();
|
const TString_array& names = variables();
|
||||||
FOR_EACH_ARRAY_ROW(names, i, name) // Scandisco tutte le variabili
|
FOR_EACH_ARRAY_ROW(names, i, name) // Scandisco tutte le variabili
|
||||||
@ -1105,7 +1131,10 @@ bool TSQL_recordset::move_to(TRecnotype n)
|
|||||||
{
|
{
|
||||||
_current_row = n;
|
_current_row = n;
|
||||||
if (n < 0 || n >= items())
|
if (n < 0 || n >= items())
|
||||||
|
{
|
||||||
|
_page.destroy(); // Forza rilettura la prossiva volta
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (n < _firstrow || n >= _firstrow+_page.items())
|
if (n < _firstrow || n >= _firstrow+_page.items())
|
||||||
{
|
{
|
||||||
|
@ -37,6 +37,7 @@ public:
|
|||||||
TFieldtypes type() const { return _type; }
|
TFieldtypes type() const { return _type; }
|
||||||
|
|
||||||
bool is_null() const { return _type == _nullfld; }
|
bool is_null() const { return _type == _nullfld; }
|
||||||
|
bool is_zero() const;
|
||||||
void set_null();
|
void set_null();
|
||||||
|
|
||||||
void set(const char* str);
|
void set(const char* str);
|
||||||
@ -112,7 +113,7 @@ public: // Absolutely needed methods
|
|||||||
virtual const TString_array& variables() const { return _varnames; }
|
virtual const TString_array& variables() const { return _varnames; }
|
||||||
virtual const TVariant& get_var(const char* name) const;
|
virtual const TVariant& get_var(const char* name) const;
|
||||||
virtual bool set_var(const char* name, const TVariant& var, bool create = false);
|
virtual bool set_var(const char* name, const TVariant& var, bool create = false);
|
||||||
bool ask_variables(bool all) const;
|
bool ask_variables(bool all);
|
||||||
|
|
||||||
virtual const TString& query_text() const;
|
virtual const TString& query_text() const;
|
||||||
virtual const TVariant& get(const char* column_name) const;
|
virtual const TVariant& get(const char* column_name) const;
|
||||||
|
@ -210,7 +210,7 @@ void TReport_field_mask::vedo_non_vedo()
|
|||||||
const char type = get(F_TYPE)[0];
|
const char type = get(F_TYPE)[0];
|
||||||
const bool is_text = strchr("DNPSTV", type) != NULL;
|
const bool is_text = strchr("DNPSTV", type) != NULL;
|
||||||
|
|
||||||
show(F_HIDE_ZEROES, strchr("NPV", type) != NULL),
|
show(F_HIDE_ZEROES, strchr("DNPV", type) != NULL),
|
||||||
show(F_HALIGN, is_text);
|
show(F_HALIGN, is_text);
|
||||||
show(F_VALIGN, is_text);
|
show(F_VALIGN, is_text);
|
||||||
show(F_TEXT, is_text);
|
show(F_TEXT, is_text);
|
||||||
@ -762,6 +762,7 @@ void TReport_mask::add_field()
|
|||||||
|
|
||||||
void TReport_mask::edit_field(TReport_field& rf)
|
void TReport_mask::edit_field(TReport_field& rf)
|
||||||
{
|
{
|
||||||
|
TReport_section& rs = rf.section();
|
||||||
TReport_field_mask m;
|
TReport_field_mask m;
|
||||||
m.set_field(rf);
|
m.set_field(rf);
|
||||||
const KEY key = m.run();
|
const KEY key = m.run();
|
||||||
@ -772,7 +773,6 @@ void TReport_mask::edit_field(TReport_field& rf)
|
|||||||
break;
|
break;
|
||||||
case K_DEL:
|
case K_DEL:
|
||||||
{
|
{
|
||||||
TReport_section& rs = rf.section();
|
|
||||||
for (int i = rs.last(); i >= 0; i--) if (rs.objptr(i) == &rf)
|
for (int i = rs.last(); i >= 0; i--) if (rs.objptr(i) == &rf)
|
||||||
{
|
{
|
||||||
rs.destroy(i, true);
|
rs.destroy(i, true);
|
||||||
@ -785,7 +785,7 @@ void TReport_mask::edit_field(TReport_field& rf)
|
|||||||
if (key != K_ESC)
|
if (key != K_ESC)
|
||||||
{
|
{
|
||||||
_is_dirty = true;
|
_is_dirty = true;
|
||||||
rf.section().sort();
|
rs.sort();
|
||||||
update_report();
|
update_report();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
184
ba/ba8302.cpp
184
ba/ba8302.cpp
@ -268,6 +268,38 @@ void advanced_draw_rect(TWindow& win, const RCT& r, int border, COLOR fore, COLO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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,
|
void advanced_draw_text(TWindow& win, const char* text, const RCT& r,
|
||||||
char halign, char valign)
|
char halign, char valign)
|
||||||
{
|
{
|
||||||
@ -297,7 +329,10 @@ void advanced_draw_text(TWindow& win, const char* text, const RCT& r,
|
|||||||
default : y -= descent; break;
|
default : y -= descent; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
xvt_dwin_draw_text(win.win(), x, y, text, -1);
|
if (halign == 'J')
|
||||||
|
advanced_draw_justified_text(win, text, x, y, dx);
|
||||||
|
else
|
||||||
|
xvt_dwin_draw_text(win.win(), x, y, text, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_num_attr(TXmlItem& item, const char* attr, long num, short def = 0)
|
static void set_num_attr(TXmlItem& item, const char* attr, long num, short def = 0)
|
||||||
@ -433,17 +468,24 @@ TPoint TReport_section::compute_size() const
|
|||||||
return TPoint(0,0);
|
return TPoint(0,0);
|
||||||
|
|
||||||
TPoint s = _size;
|
TPoint s = _size;
|
||||||
for (int i = 0; i < items(); i++)
|
if (_size.x <= 0 || _size.y <= 0) // Calcolo automatico necessario
|
||||||
{
|
{
|
||||||
const TReport_field& rf = field(i);
|
for (int i = 0; i < items(); i++)
|
||||||
if (rf.shown())
|
|
||||||
{
|
{
|
||||||
const TRectangle& r = rf.get_rect();
|
const TReport_field& rf = field(i);
|
||||||
if (r.right() > s.x)
|
if (rf.shown())
|
||||||
s.x = r.right();
|
{
|
||||||
if (r.bottom() > s.y)
|
const TRectangle& r = rf.get_rect();
|
||||||
s.y = r.bottom();
|
if (_size.x <= 0 && r.right() > s.x) // Richiesto calcolo larghezza
|
||||||
|
s.x = r.right();
|
||||||
|
if (_size.y <= 0 && r.bottom() > s.y) // Richiesto calcolo altezza
|
||||||
|
s.y = r.bottom();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if ((s.x % 100) != 0) // Arrotonda alla colonna successiva
|
||||||
|
s.x = (s.x / 100 + 1) * 100;
|
||||||
|
if ((s.y % 100) != 0) // Arrotonda alla riga successiva
|
||||||
|
s.y = (s.y / 100 + 1) * 100;
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -875,7 +917,26 @@ bool TReport_field::load_field()
|
|||||||
{
|
{
|
||||||
const TFieldtypes ft = var_type();
|
const TFieldtypes ft = var_type();
|
||||||
if (ft != _nullfld)
|
if (ft != _nullfld)
|
||||||
section().report().evaluate(_field, _var, ft);
|
{
|
||||||
|
if (_field.starts_with("SELECT "))
|
||||||
|
{
|
||||||
|
TSQL_recordset qry(_field);
|
||||||
|
TString str;
|
||||||
|
for (int i = 0; i < qry.items(); i++)
|
||||||
|
{
|
||||||
|
if (i > 0) str << '\n';
|
||||||
|
for (unsigned int j = 0; j < qry.columns(); j++)
|
||||||
|
{
|
||||||
|
if (j > 0) str << ' ';
|
||||||
|
str << qry.get(j).as_string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_var.set(str);
|
||||||
|
_var.convert_to(ft);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
section().report().evaluate(_field, _var, ft);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
_var.set_null();
|
_var.set_null();
|
||||||
}
|
}
|
||||||
@ -903,12 +964,102 @@ void TReport_field::draw_rect(TWindow& win) const
|
|||||||
|
|
||||||
void TReport_field::draw_text(TWindow& win, const char* text) const
|
void TReport_field::draw_text(TWindow& win, const char* text) const
|
||||||
{
|
{
|
||||||
RCT r; win.log2dev(get_rect(), r);
|
const TRectangle& rct = get_rect();
|
||||||
|
RCT r; win.log2dev(rct, r);
|
||||||
advanced_draw_rect(win, r, border(), fore_color(), back_color());
|
advanced_draw_rect(win, r, border(), fore_color(), back_color());
|
||||||
|
|
||||||
xvt_dwin_set_font(win.win(), font().get_xvt_font(win));
|
xvt_dwin_set_font(win.win(), font().get_xvt_font(win));
|
||||||
win.set_color(fore_color(), back_color());
|
win.set_color(fore_color(), back_color());
|
||||||
advanced_draw_text(win, text, r, _halign, _valign);
|
|
||||||
|
if (rct.height() > 100)
|
||||||
|
{
|
||||||
|
const int columns = rct.width() / 100;
|
||||||
|
int rows = rct.height() / 100;
|
||||||
|
TParagraph_string str(text, columns);
|
||||||
|
if (str.items() < rows)
|
||||||
|
rows = str.items();
|
||||||
|
|
||||||
|
int ybase = rct.y;
|
||||||
|
switch (_valign)
|
||||||
|
{
|
||||||
|
case 'C': ybase += (rct.height() - rows*100) / 2; break;
|
||||||
|
case 'B': ybase += rct.height() - rows*100; break;
|
||||||
|
default : break;
|
||||||
|
}
|
||||||
|
char halign = _halign;
|
||||||
|
char valign = 'T';
|
||||||
|
for (int row = 0; row < rows; row++)
|
||||||
|
{
|
||||||
|
TRectangle rctline = rct;
|
||||||
|
rctline.y = ybase+100*row;
|
||||||
|
rctline.set_height(100);
|
||||||
|
win.log2dev(rctline, r);
|
||||||
|
if (halign == 'J' && row == rows-1)
|
||||||
|
halign = 'L';
|
||||||
|
advanced_draw_text(win, str.get(), r, halign, valign);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
advanced_draw_text(win, text, r, _halign, _valign);
|
||||||
|
}
|
||||||
|
|
||||||
|
const TString& TReport_field::formatted_text() const
|
||||||
|
{
|
||||||
|
if (_hide_zeroes && _var.is_zero())
|
||||||
|
return EMPTY_STRING;
|
||||||
|
|
||||||
|
switch (_type)
|
||||||
|
{
|
||||||
|
case 'D':
|
||||||
|
{
|
||||||
|
const TDate d = _var.as_date();
|
||||||
|
TString& tmp = get_tmp_string();
|
||||||
|
if (_picture.not_empty())
|
||||||
|
{
|
||||||
|
if (_picture.find('#') >= 0)
|
||||||
|
{
|
||||||
|
TString8 str; str.format("%02d%02d%04d", d.day(), d.month(), d.year());
|
||||||
|
tmp.picture(_picture, str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tmp << _picture << ' ' << d;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tmp = d.string(_rct.width() >= 1000 ? full : brief);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
{
|
||||||
|
const real n = _var.as_real();
|
||||||
|
TString& tmp = get_tmp_string();
|
||||||
|
if (_picture.not_empty())
|
||||||
|
tmp = n.string(_picture);
|
||||||
|
else
|
||||||
|
tmp = n.stringa();
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
{
|
||||||
|
TString& tmp = get_tmp_string();
|
||||||
|
TPrice cur(_var.as_real());
|
||||||
|
tmp = cur.string(true);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
{
|
||||||
|
TString& tmp = get_tmp_string();
|
||||||
|
TCurrency cur(_var.as_real());
|
||||||
|
tmp = cur.string(true);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return _var.as_string();
|
||||||
|
}
|
||||||
|
return EMPTY_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TReport_field::draw(TWindow& win, TReport_draw_mode rdm) const
|
void TReport_field::draw(TWindow& win, TReport_draw_mode rdm) const
|
||||||
@ -1008,7 +1159,10 @@ void TReport_field::draw(TWindow& win, TReport_draw_mode rdm) const
|
|||||||
draw_text(win, _field);
|
draw_text(win, _field);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
draw_text(win, _var.as_string());
|
{
|
||||||
|
const TString& str = formatted_text();
|
||||||
|
draw_text(win, str);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1199,7 +1353,7 @@ int TReport::find_max_level(char type) const
|
|||||||
TAssoc_array& ass = (TAssoc_array&)_sections;
|
TAssoc_array& ass = (TAssoc_array&)_sections;
|
||||||
FOR_EACH_ASSOC_OBJECT(ass, h, k, o) if (k[0] == type1 || k[0] == type2)
|
FOR_EACH_ASSOC_OBJECT(ass, h, k, o) if (k[0] == type1 || k[0] == type2)
|
||||||
{
|
{
|
||||||
const int l = k[1]-'0';
|
const int l = atoi(k+1);
|
||||||
if (l > lev)
|
if (l > lev)
|
||||||
lev = l;
|
lev = l;
|
||||||
}
|
}
|
||||||
@ -1305,7 +1459,7 @@ bool TReport::evaluate(const char* expr, TVariant& var, TFieldtypes force_type)
|
|||||||
if (e.numvar() == 1)
|
if (e.numvar() == 1)
|
||||||
{
|
{
|
||||||
const char* name = e.varname(0);
|
const char* name = e.varname(0);
|
||||||
if (*name == '#' && strcmp(name, expr) == 0)
|
if (strcmp(name, expr) == 0)
|
||||||
{
|
{
|
||||||
const TFixed_string usr(name);
|
const TFixed_string usr(name);
|
||||||
if (get_usr_val(usr, var))
|
if (get_usr_val(usr, var))
|
||||||
|
@ -229,6 +229,7 @@ protected:
|
|||||||
virtual int compare(const TSortable& s) const;
|
virtual int compare(const TSortable& s) const;
|
||||||
void copy(const TReport_field& rf);
|
void copy(const TReport_field& rf);
|
||||||
TFieldtypes var_type() const;
|
TFieldtypes var_type() const;
|
||||||
|
const TString& formatted_text() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual TObject* dup() const { return new TReport_field(*this); }
|
virtual TObject* dup() const { return new TReport_field(*this); }
|
||||||
|
111
ba/ba8303.cpp
111
ba/ba8303.cpp
@ -57,6 +57,7 @@ void TPrint_preview_window::update()
|
|||||||
#define POPUP_LAST 20887
|
#define POPUP_LAST 20887
|
||||||
#define POPUP_ZOOMIN 20888
|
#define POPUP_ZOOMIN 20888
|
||||||
#define POPUP_ZOOMOUT 20889
|
#define POPUP_ZOOMOUT 20889
|
||||||
|
#define POPUP_GRID 20890
|
||||||
|
|
||||||
void TPrint_preview_window::popup_menu(EVENT* ep)
|
void TPrint_preview_window::popup_menu(EVENT* ep)
|
||||||
{
|
{
|
||||||
@ -69,6 +70,9 @@ void TPrint_preview_window::popup_menu(EVENT* ep)
|
|||||||
menu[4].tag = -1; menu[4].separator = true;
|
menu[4].tag = -1; menu[4].separator = true;
|
||||||
menu[5].tag = POPUP_ZOOMIN; menu[5].text = (char*)TR("Zoom +"); menu[5].enabled = _zoom < 300;
|
menu[5].tag = POPUP_ZOOMIN; menu[5].text = (char*)TR("Zoom +"); menu[5].enabled = _zoom < 300;
|
||||||
menu[6].tag = POPUP_ZOOMOUT; menu[6].text = (char*)TR("Zoom -"); menu[6].enabled = _zoom > 75;
|
menu[6].tag = POPUP_ZOOMOUT; menu[6].text = (char*)TR("Zoom -"); menu[6].enabled = _zoom > 75;
|
||||||
|
menu[7].tag = -1; menu[7].separator = true;
|
||||||
|
menu[8].tag = POPUP_GRID; menu[8].text = (char*)TR("Griglia"); menu[8].enabled = true;
|
||||||
|
menu[8].checkable = true; menu[8].checked = _printer->show_preview_grid();
|
||||||
|
|
||||||
const PNT& p = ep->v.mouse.where;
|
const PNT& p = ep->v.mouse.where;
|
||||||
xvt_menu_popup(menu, win(), p, XVT_POPUP_CENTER, 0);
|
xvt_menu_popup(menu, win(), p, XVT_POPUP_CENTER, 0);
|
||||||
@ -115,6 +119,7 @@ void TPrint_preview_window::handler(WINDOW win, EVENT* ep)
|
|||||||
break;
|
break;
|
||||||
case POPUP_ZOOMIN : if (_zoom < 300) { _zoom += 25; } break;
|
case POPUP_ZOOMIN : if (_zoom < 300) { _zoom += 25; } break;
|
||||||
case POPUP_ZOOMOUT: if (_zoom > 75) { _zoom -= 25; } break;
|
case POPUP_ZOOMOUT: if (_zoom > 75) { _zoom -= 25; } break;
|
||||||
|
case POPUP_GRID : _printer->toggle_preview_grid(); break;
|
||||||
default:processed = false; break;
|
default:processed = false; break;
|
||||||
}
|
}
|
||||||
if (processed)
|
if (processed)
|
||||||
@ -140,6 +145,8 @@ bool TPrint_preview_window::on_key(KEY k)
|
|||||||
case K_RIGHT : dispatch_e_menu(win(), POPUP_NEXT); break;
|
case K_RIGHT : dispatch_e_menu(win(), POPUP_NEXT); break;
|
||||||
case K_END:
|
case K_END:
|
||||||
case K_LEND : dispatch_e_menu(win(), POPUP_LAST); break;
|
case K_LEND : dispatch_e_menu(win(), POPUP_LAST); break;
|
||||||
|
case 'G' :
|
||||||
|
case 'g' : dispatch_e_menu(win(), POPUP_GRID); break;
|
||||||
default : ok = TField_window::on_key(k); break;
|
default : ok = TField_window::on_key(k); break;
|
||||||
};
|
};
|
||||||
return ok;
|
return ok;
|
||||||
@ -205,6 +212,8 @@ bool TPreview_mask::on_key(KEY k)
|
|||||||
case K_RIGHT:
|
case K_RIGHT:
|
||||||
case K_END :
|
case K_END :
|
||||||
case K_LEND :
|
case K_LEND :
|
||||||
|
case 'G' :
|
||||||
|
case 'g' :
|
||||||
dispatch_e_char(_printer->win(), k);
|
dispatch_e_char(_printer->win(), k);
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
@ -339,16 +348,27 @@ bool TPage_printer::main_loop()
|
|||||||
TPrinter& p = printer();
|
TPrinter& p = printer();
|
||||||
_rcd = p.get_printrcd();
|
_rcd = p.get_printrcd();
|
||||||
if (!xvt_print_is_valid(_rcd))
|
if (!xvt_print_is_valid(_rcd))
|
||||||
return TRUE; // aborted
|
return false; // aborted
|
||||||
|
|
||||||
WINDOW prwin = xvt_print_create_win(_rcd, (char*)(const char*)form_name());
|
WINDOW prwin = xvt_print_create_win(_rcd, (char*)(const char*)form_name());
|
||||||
if (prwin == NULL_WIN)
|
if (prwin == NULL_WIN)
|
||||||
return TRUE; // aborted
|
return false; // aborted
|
||||||
set_win(prwin);
|
set_win(prwin);
|
||||||
|
|
||||||
xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, _rcd, &_ph, &_pw, &_pvr, &_phr);
|
xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, _rcd, &_ph, &_pw, &_pvr, &_phr);
|
||||||
|
|
||||||
|
if (_pw <= 0 || _ph <= 0)
|
||||||
|
return error_box(TR("Dimensioni pagina NULLE"));
|
||||||
|
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
|
if (_pvr < 150 || _phr < 150)
|
||||||
|
{
|
||||||
|
ok = yesno_box(TR("Stampante obsoleta o non adeguatamente configurata:\n"
|
||||||
|
"Risoluzione %ldx%ld. Continuare ugualmente?"), _phr, _pvr);
|
||||||
|
if (!ok)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for (word c = 0; c < _copies && ok; c++)
|
for (word c = 0; c < _copies && ok; c++)
|
||||||
{
|
{
|
||||||
_page = 0;
|
_page = 0;
|
||||||
@ -438,11 +458,11 @@ bool TPage_printer::do_preview()
|
|||||||
TPrinter& p = printer();
|
TPrinter& p = printer();
|
||||||
_rcd = p.get_printrcd();
|
_rcd = p.get_printrcd();
|
||||||
if (!xvt_print_is_valid(_rcd))
|
if (!xvt_print_is_valid(_rcd))
|
||||||
return error_box("Stampante non valida");
|
return error_box(TR("Stampante non valida"));
|
||||||
|
|
||||||
xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, _rcd, &_ph, &_pw, &_pvr, &_phr);
|
xvt_app_escape (XVT_ESC_GET_PRINTER_INFO, _rcd, &_ph, &_pw, &_pvr, &_phr);
|
||||||
if (_ph <= 0)
|
if (_pw <= 0 || _ph <= 0)
|
||||||
return error_box("Risoluzione stampante NULLA");
|
return error_box(TR("Dimensioni pagina NULLE"));
|
||||||
|
|
||||||
_preview_mask = new TPreview_mask(this);
|
_preview_mask = new TPreview_mask(this);
|
||||||
TPrint_preview_field& pf = (TPrint_preview_field&)_preview_mask->field(DLG_USER);
|
TPrint_preview_field& pf = (TPrint_preview_field&)_preview_mask->field(DLG_USER);
|
||||||
@ -478,7 +498,8 @@ TPoint TPage_printer::page_res() const
|
|||||||
return pt;
|
return pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
TPage_printer::TPage_printer() : _pagefrom(1), _pageto(0), _copies(1), _preview_mask(NULL)
|
TPage_printer::TPage_printer()
|
||||||
|
: _pagefrom(1), _pageto(0), _copies(1), _preview_mask(NULL), _draw_grid(true)
|
||||||
{
|
{
|
||||||
_pixmap = true; // Fondamentale!!!
|
_pixmap = true; // Fondamentale!!!
|
||||||
}
|
}
|
||||||
@ -526,6 +547,32 @@ long TReport_printer::print_section(char type, int level)
|
|||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TReport_printer::draw_preview_page()
|
||||||
|
{
|
||||||
|
clear(COLOR_WHITE);
|
||||||
|
|
||||||
|
if (_draw_grid)
|
||||||
|
{
|
||||||
|
const int max = 192;
|
||||||
|
const int k = 100;
|
||||||
|
for (int i = 1; i < max; i++)
|
||||||
|
{
|
||||||
|
set_pen((i%10) ? MAKE_COLOR(232,232,232) : COLOR_LTGRAY);
|
||||||
|
line(0, i*k, max*k, i*k);
|
||||||
|
line(i*k, 0, i*k, max*k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const PNT pag = log2dev(_logical_page_width, _logical_page_height);
|
||||||
|
hide_pen();
|
||||||
|
set_brush(COLOR_GRAY);
|
||||||
|
RCT rct;
|
||||||
|
xvt_vobj_get_client_rect(win(), &rct); rct.left = pag.h;
|
||||||
|
xvt_dwin_draw_rect(win(), &rct);
|
||||||
|
xvt_vobj_get_client_rect(win(), &rct); rct.top = pag.v;
|
||||||
|
xvt_dwin_draw_rect(win(), &rct);
|
||||||
|
}
|
||||||
|
|
||||||
bool TReport_printer::open_page()
|
bool TReport_printer::open_page()
|
||||||
{
|
{
|
||||||
const bool ok = TPage_printer::open_page();
|
const bool ok = TPage_printer::open_page();
|
||||||
@ -536,17 +583,7 @@ bool TReport_printer::open_page()
|
|||||||
_page_break_allowed = false;
|
_page_break_allowed = false;
|
||||||
|
|
||||||
if (ok && preview_mode()) // Clear page needed
|
if (ok && preview_mode()) // Clear page needed
|
||||||
{
|
draw_preview_page();
|
||||||
clear(COLOR_WHITE);
|
|
||||||
const int max = 192;
|
|
||||||
const int k = 100;
|
|
||||||
for (int i = 1; i < max; i++)
|
|
||||||
{
|
|
||||||
set_pen((i%10) ? MAKE_COLOR(232,232,232) : COLOR_LTGRAY);
|
|
||||||
line(0, i*k, max*k, i*k);
|
|
||||||
line(i*k, 0, i*k, max*k);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
print_section('B', 0);
|
print_section('B', 0);
|
||||||
if (_page == 1)
|
if (_page == 1)
|
||||||
@ -612,9 +649,14 @@ bool TReport_printer::print_loop()
|
|||||||
|
|
||||||
const TPoint siz = page_size();
|
const TPoint siz = page_size();
|
||||||
const TPoint res = page_res();
|
const TPoint res = page_res();
|
||||||
const double pollici_pagina = (double)siz.y / (double)res.y;
|
const double pollici_pagina_y = (double)siz.y / (double)res.y;
|
||||||
const double righe_pagina = pollici_pagina * _report.lpi();
|
const double righe_pagina = pollici_pagina_y * _report.lpi();
|
||||||
_logical_page_height = long(righe_pagina*100.0);
|
_logical_page_height = long(righe_pagina*100.0);
|
||||||
|
|
||||||
|
const double pollici_pagina_x = (double)siz.x / (double)res.x;
|
||||||
|
const double colonne_pagina = pollici_pagina_x * _report.cpi();
|
||||||
|
_logical_page_width = long(colonne_pagina*100.0);
|
||||||
|
|
||||||
const long logical_footer_height = _report.section('F',0).compute_size().y;
|
const long logical_footer_height = _report.section('F',0).compute_size().y;
|
||||||
_logical_foot_pos = _logical_page_height - logical_footer_height;
|
_logical_foot_pos = _logical_page_height - logical_footer_height;
|
||||||
|
|
||||||
@ -628,6 +670,7 @@ bool TReport_printer::print_loop()
|
|||||||
oldgroup.add(EMPTY_STRING, g);
|
oldgroup.add(EMPTY_STRING, g);
|
||||||
}
|
}
|
||||||
const int max_body = _report.find_max_level('B');
|
const int max_body = _report.find_max_level('B');
|
||||||
|
int last_body_height = 0;
|
||||||
|
|
||||||
_is_last_page = false;
|
_is_last_page = false;
|
||||||
open_page();
|
open_page();
|
||||||
@ -655,6 +698,11 @@ bool TReport_printer::print_loop()
|
|||||||
if (changed)
|
if (changed)
|
||||||
{
|
{
|
||||||
oldgroup = newgroup;
|
oldgroup = newgroup;
|
||||||
|
|
||||||
|
if (_delta.x > 0) // Devo tornare a capo!
|
||||||
|
_delta.y += last_body_height;
|
||||||
|
_delta.x = 0;
|
||||||
|
|
||||||
if (rex.current_row() > 0)
|
if (rex.current_row() > 0)
|
||||||
{
|
{
|
||||||
for (int g = 2; g <= changed; g++)
|
for (int g = 2; g <= changed; g++)
|
||||||
@ -666,7 +714,30 @@ bool TReport_printer::print_loop()
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int b = 1; b <= max_body; b++)
|
for (int b = 1; b <= max_body; b++)
|
||||||
_delta.y += print_section('B', b);
|
{
|
||||||
|
const int dy = print_section('B', b);
|
||||||
|
|
||||||
|
int column_delta = 0;
|
||||||
|
// Cerco di vedere se e' possibile la stampa etichette
|
||||||
|
if (dy > 0)
|
||||||
|
{
|
||||||
|
const int dx = _report.section('B', b).size().x;
|
||||||
|
// Se dx > 0 ho una sezione a dimensione fissa
|
||||||
|
if (dx > 0 && _delta.x+2*dx <= _logical_page_width)
|
||||||
|
{
|
||||||
|
column_delta = dx;
|
||||||
|
last_body_height = dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (column_delta > 0)
|
||||||
|
_delta.x += column_delta;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_delta.x = 0;
|
||||||
|
_delta.y += dy;
|
||||||
|
last_body_height = 0; // Non servirebbe strettamente
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!aborted)
|
if (!aborted)
|
||||||
{
|
{
|
||||||
|
@ -12,7 +12,7 @@ class TPage_printer : public TWindow
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
word _copies, _pagefrom, _pageto, _page, _lastprinted;
|
word _copies, _pagefrom, _pageto, _page, _lastprinted;
|
||||||
bool _page_is_open;
|
bool _page_is_open, _draw_grid;
|
||||||
|
|
||||||
TMask* _preview_mask; // owned object
|
TMask* _preview_mask; // owned object
|
||||||
TWindow* _preview_window; // referenced object
|
TWindow* _preview_window; // referenced object
|
||||||
@ -51,6 +51,9 @@ public:
|
|||||||
bool print_mode() const { return _preview_mask == NULL; }
|
bool print_mode() const { return _preview_mask == NULL; }
|
||||||
bool preview_mode() const { return _preview_mask != NULL; }
|
bool preview_mode() const { return _preview_mask != NULL; }
|
||||||
|
|
||||||
|
void toggle_preview_grid() { _draw_grid = !_draw_grid; }
|
||||||
|
bool show_preview_grid() const { return _draw_grid; }
|
||||||
|
|
||||||
TPage_printer();
|
TPage_printer();
|
||||||
virtual ~TPage_printer();
|
virtual ~TPage_printer();
|
||||||
};
|
};
|
||||||
@ -59,7 +62,7 @@ class TReport_printer : public TPage_printer
|
|||||||
{
|
{
|
||||||
TReport& _report;
|
TReport& _report;
|
||||||
TPoint _delta;
|
TPoint _delta;
|
||||||
long _logical_page_height;
|
long _logical_page_height, _logical_page_width;
|
||||||
long _logical_foot_pos;
|
long _logical_foot_pos;
|
||||||
bool _is_last_page, _page_break_allowed;
|
bool _is_last_page, _page_break_allowed;
|
||||||
|
|
||||||
@ -71,6 +74,7 @@ protected:
|
|||||||
virtual PNT log2dev(long x, long y) const;
|
virtual PNT log2dev(long x, long y) const;
|
||||||
virtual bool print_loop();
|
virtual bool print_loop();
|
||||||
|
|
||||||
|
virtual void draw_preview_page();
|
||||||
virtual bool open_page();
|
virtual bool open_page();
|
||||||
virtual bool close_page();
|
virtual bool close_page();
|
||||||
long print_section(TReport_section& rs);
|
long print_section(TReport_section& rs);
|
||||||
|
@ -63,11 +63,11 @@ bool TVariant_stack::push(const real& n)
|
|||||||
// TAVM_op
|
// TAVM_op
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
enum AVM_opcode { avm_nop, avm_add , avm_div , avm_dot,
|
enum AVM_opcode { avm_nop, avm_add, avm_div, avm_dot,
|
||||||
avm_cmp_eq, avm_cmp_gt, avm_cmp_gteq, avm_cmp_lt, avm_cmp_lteq, avm_cmp_noteq,
|
avm_cmp_eq, avm_cmp_gt, avm_cmp_gteq, avm_cmp_lt, avm_cmp_lteq, avm_cmp_noteq,
|
||||||
avm_drop, avm_dup, avm_else,
|
avm_drop, avm_dup, avm_else,
|
||||||
avm_fetch, avm_if, avm_push, avm_rot, avm_store,
|
avm_fetch, avm_if, avm_push, avm_rot, avm_store,
|
||||||
avm_sub, avm_swap, avm_then, avm_usrword };
|
avm_sub, avm_swap, avm_then, avm_usrword };
|
||||||
|
|
||||||
class TAVM_op : public TObject
|
class TAVM_op : public TObject
|
||||||
{
|
{
|
||||||
@ -222,7 +222,7 @@ bool TAVM::compile(istream& instr, TBytecode& bytecode)
|
|||||||
TAVM_op& ifop = (TAVM_op&)bytecode[i];
|
TAVM_op& ifop = (TAVM_op&)bytecode[i];
|
||||||
if (ifop.op() == avm_if && ifop.var().is_null())
|
if (ifop.op() == avm_if && ifop.var().is_null())
|
||||||
{
|
{
|
||||||
ifop.var() = bytecode.items() - i;
|
ifop.var() = bytecode.items();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -242,7 +242,7 @@ bool TAVM::compile(istream& instr, TBytecode& bytecode)
|
|||||||
TAVM_op& ifop = (TAVM_op&)bytecode[i];
|
TAVM_op& ifop = (TAVM_op&)bytecode[i];
|
||||||
if ((ifop.op() == avm_if || ifop.op() == avm_else) && ifop.var().is_null())
|
if ((ifop.op() == avm_if || ifop.op() == avm_else) && ifop.var().is_null())
|
||||||
{
|
{
|
||||||
ifop.var() = bytecode.last() - i;
|
ifop.var() = bytecode.items();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -291,7 +291,6 @@ bool TAVM::execute(const TBytecode& bc, ostream& outstr)
|
|||||||
for (int ip = 0; ip < bc.items(); ip++)
|
for (int ip = 0; ip < bc.items(); ip++)
|
||||||
{
|
{
|
||||||
const TAVM_op& op = *(const TAVM_op*)bc.objptr(ip);
|
const TAVM_op& op = *(const TAVM_op*)bc.objptr(ip);
|
||||||
bool jumped_elsewhere = false;
|
|
||||||
switch(op.op())
|
switch(op.op())
|
||||||
{
|
{
|
||||||
case avm_add :
|
case avm_add :
|
||||||
@ -334,8 +333,7 @@ bool TAVM::execute(const TBytecode& bc, ostream& outstr)
|
|||||||
case avm_drop: _stack.drop(); break;
|
case avm_drop: _stack.drop(); break;
|
||||||
case avm_dup: _stack.push(_stack.peek()); break;
|
case avm_dup: _stack.push(_stack.peek()); break;
|
||||||
case avm_else:
|
case avm_else:
|
||||||
ip += op.var().as_int();
|
ip = op.var().as_int();
|
||||||
jumped_elsewhere = true;
|
|
||||||
break;
|
break;
|
||||||
case avm_fetch:
|
case avm_fetch:
|
||||||
{
|
{
|
||||||
@ -352,10 +350,7 @@ bool TAVM::execute(const TBytecode& bc, ostream& outstr)
|
|||||||
break;
|
break;
|
||||||
case avm_if:
|
case avm_if:
|
||||||
if (!_stack.pop().as_bool())
|
if (!_stack.pop().as_bool())
|
||||||
{
|
ip = op.var().as_int();
|
||||||
ip += op.var().as_int();
|
|
||||||
jumped_elsewhere = true;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case avm_push: _stack.push(op.var()); break;
|
case avm_push: _stack.push(op.var()); break;
|
||||||
case avm_rot: _stack.roll(2); break;
|
case avm_rot: _stack.roll(2); break;
|
||||||
@ -439,7 +434,7 @@ bool TAlex_virtual_machine::execute(const TBytecode& bc, TString& outs)
|
|||||||
|
|
||||||
bool TAlex_virtual_machine::get_usr_val(const TString& name, TVariant& var) const
|
bool TAlex_virtual_machine::get_usr_val(const TString& name, TVariant& var) const
|
||||||
{
|
{
|
||||||
if (name == "#DATE")
|
if (name == "#TODAY")
|
||||||
{
|
{
|
||||||
const TDate oggi(TODAY);
|
const TDate oggi(TODAY);
|
||||||
var.set(oggi);
|
var.set(oggi);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user