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:
guy 2004-04-14 14:21:12 +00:00
parent 72e6b39e20
commit e957ff5b78
9 changed files with 358 additions and 66 deletions

View File

@ -292,6 +292,7 @@ class TQuery_mask : public TAutomask
TFilename _curr_query;// Nome completo della query in editazione
bool _is_dirty; // Maschera cambiata dall'ultimo caricamento
bool _sql_dirty; // Query modificata manualmente
protected:
virtual void handler(WINDOW win, EVENT* ep);
@ -350,8 +351,10 @@ bool TQuery_mask::add_file_to_tree()
TTable_mask msk;
const TRelation_node* father = curr_node();
TString fatherid;
if (father != NULL)
{
_tree.curr_id(fatherid);
msk.set(F_FATHER, father->name());
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));
msk.mask2node(*son);
if (fatherid.not_empty())
_tree.goto_node(fatherid);
_tree.add_son(son);
_tree.expand_all();
tfield(F_TABLES).win().force_update();
@ -380,6 +385,8 @@ bool TQuery_mask::edit_file_in_tree()
if (son == NULL)
return false;
TString sonid; _tree.curr_id(sonid);
const TRelation_node* father = NULL;
if (_tree.goto_father())
father = (const TRelation_node*)_tree.curr_node();
@ -417,6 +424,17 @@ bool TQuery_mask::edit_file_in_tree()
case K_DEL:
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.goto_root();
}
@ -670,6 +688,9 @@ void TQuery_mask::sheet2sql()
sql << ";";
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)
@ -937,6 +958,7 @@ void TQuery_mask::global_reset()
tf.win().force_update();
}
reset();
_is_dirty = _sql_dirty = false;
}
// Caica l'intera query
@ -974,7 +996,9 @@ bool TQuery_mask::load_query()
{
TString str; sql->GetEnclosedText(str);
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
}
@ -1046,8 +1070,14 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
case F_GENSQL:
if (e == fe_button)
{
sheet2sql();
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;
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)
{
enable(-2, !o.empty());
_is_dirty = e == fe_modify;
if (e == fe_modify)
{
_is_dirty = true;
_sql_dirty = !o.empty();
}
}
break;
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();
global_reset();
next_page(1000);
}
break;
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);
save_query();
next_page(1000);
}
break;
case DLG_DELREC:
if (e == fe_button && jolly == 0) // Elimina della Toolbar
{
delete_query();
next_page(1000);
return false; // Do not exit!
}
break;

View File

@ -74,6 +74,19 @@ void TVariant::set(const long 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
{
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
{
if (*column_name == '#' && variables().items() > 0)
return get_var(column_name);
if (*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++)
{
@ -546,7 +567,7 @@ bool ask_variable(const char* name, TVariant& var)
return ok;
}
bool TRecordset::ask_variables(bool all) const
bool TRecordset::ask_variables(bool all)
{
const bool ok = variables().items() > 0;
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)
{
TVariant var = get_var(*name);
if (var.is_null() || all) // Mi serve assolutamente un valore!
if (var.is_null() || all)
{
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;
}
@ -993,7 +1018,7 @@ TSQLite::~TSQLite()
void TSQL_recordset::reset()
{
_firstrow = _items = 0;
_items = 0;
_pagesize = 512;
_page.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
{
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();
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;
if (n < 0 || n >= items())
{
_page.destroy(); // Forza rilettura la prossiva volta
return false;
}
if (n < _firstrow || n >= _firstrow+_page.items())
{

View File

@ -37,6 +37,7 @@ public:
TFieldtypes type() const { return _type; }
bool is_null() const { return _type == _nullfld; }
bool is_zero() const;
void set_null();
void set(const char* str);
@ -112,7 +113,7 @@ public: // Absolutely needed methods
virtual const TString_array& variables() const { return _varnames; }
virtual const TVariant& get_var(const char* name) const;
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 TVariant& get(const char* column_name) const;

View File

@ -210,7 +210,7 @@ void TReport_field_mask::vedo_non_vedo()
const char type = get(F_TYPE)[0];
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_VALIGN, is_text);
show(F_TEXT, is_text);
@ -762,6 +762,7 @@ void TReport_mask::add_field()
void TReport_mask::edit_field(TReport_field& rf)
{
TReport_section& rs = rf.section();
TReport_field_mask m;
m.set_field(rf);
const KEY key = m.run();
@ -772,7 +773,6 @@ void TReport_mask::edit_field(TReport_field& rf)
break;
case K_DEL:
{
TReport_section& rs = rf.section();
for (int i = rs.last(); i >= 0; i--) if (rs.objptr(i) == &rf)
{
rs.destroy(i, true);
@ -785,7 +785,7 @@ void TReport_mask::edit_field(TReport_field& rf)
if (key != K_ESC)
{
_is_dirty = true;
rf.section().sort();
rs.sort();
update_report();
}
}

View File

@ -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,
char halign, char valign)
{
@ -297,7 +329,10 @@ void advanced_draw_text(TWindow& win, const char* text, const RCT& r,
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)
@ -433,17 +468,24 @@ TPoint TReport_section::compute_size() const
return TPoint(0,0);
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);
if (rf.shown())
for (int i = 0; i < items(); i++)
{
const TRectangle& r = rf.get_rect();
if (r.right() > s.x)
s.x = r.right();
if (r.bottom() > s.y)
s.y = r.bottom();
const TReport_field& rf = field(i);
if (rf.shown())
{
const TRectangle& r = rf.get_rect();
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;
}
@ -875,7 +917,26 @@ bool TReport_field::load_field()
{
const TFieldtypes ft = var_type();
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
_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
{
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());
xvt_dwin_set_font(win.win(), font().get_xvt_font(win));
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
@ -1008,7 +1159,10 @@ void TReport_field::draw(TWindow& win, TReport_draw_mode rdm) const
draw_text(win, _field);
}
else
draw_text(win, _var.as_string());
{
const TString& str = formatted_text();
draw_text(win, str);
}
break;
}
@ -1199,7 +1353,7 @@ int TReport::find_max_level(char type) const
TAssoc_array& ass = (TAssoc_array&)_sections;
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)
lev = l;
}
@ -1305,7 +1459,7 @@ bool TReport::evaluate(const char* expr, TVariant& var, TFieldtypes force_type)
if (e.numvar() == 1)
{
const char* name = e.varname(0);
if (*name == '#' && strcmp(name, expr) == 0)
if (strcmp(name, expr) == 0)
{
const TFixed_string usr(name);
if (get_usr_val(usr, var))

View File

@ -229,6 +229,7 @@ protected:
virtual int compare(const TSortable& s) const;
void copy(const TReport_field& rf);
TFieldtypes var_type() const;
const TString& formatted_text() const;
public:
virtual TObject* dup() const { return new TReport_field(*this); }

View File

@ -57,6 +57,7 @@ void TPrint_preview_window::update()
#define POPUP_LAST 20887
#define POPUP_ZOOMIN 20888
#define POPUP_ZOOMOUT 20889
#define POPUP_GRID 20890
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[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[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;
xvt_menu_popup(menu, win(), p, XVT_POPUP_CENTER, 0);
@ -115,6 +119,7 @@ void TPrint_preview_window::handler(WINDOW win, EVENT* ep)
break;
case POPUP_ZOOMIN : if (_zoom < 300) { _zoom += 25; } break;
case POPUP_ZOOMOUT: if (_zoom > 75) { _zoom -= 25; } break;
case POPUP_GRID : _printer->toggle_preview_grid(); break;
default:processed = false; break;
}
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_END:
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;
};
return ok;
@ -205,6 +212,8 @@ bool TPreview_mask::on_key(KEY k)
case K_RIGHT:
case K_END :
case K_LEND :
case 'G' :
case 'g' :
dispatch_e_char(_printer->win(), k);
return true;
default:
@ -339,16 +348,27 @@ bool TPage_printer::main_loop()
TPrinter& p = printer();
_rcd = p.get_printrcd();
if (!xvt_print_is_valid(_rcd))
return TRUE; // aborted
return false; // aborted
WINDOW prwin = xvt_print_create_win(_rcd, (char*)(const char*)form_name());
if (prwin == NULL_WIN)
return TRUE; // aborted
return false; // aborted
set_win(prwin);
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;
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++)
{
_page = 0;
@ -438,11 +458,11 @@ bool TPage_printer::do_preview()
TPrinter& p = printer();
_rcd = p.get_printrcd();
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);
if (_ph <= 0)
return error_box("Risoluzione stampante NULLA");
if (_pw <= 0 || _ph <= 0)
return error_box(TR("Dimensioni pagina NULLE"));
_preview_mask = new TPreview_mask(this);
TPrint_preview_field& pf = (TPrint_preview_field&)_preview_mask->field(DLG_USER);
@ -478,7 +498,8 @@ TPoint TPage_printer::page_res() const
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!!!
}
@ -526,6 +547,32 @@ long TReport_printer::print_section(char type, int level)
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()
{
const bool ok = TPage_printer::open_page();
@ -536,17 +583,7 @@ bool TReport_printer::open_page()
_page_break_allowed = false;
if (ok && preview_mode()) // Clear page needed
{
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);
}
}
draw_preview_page();
print_section('B', 0);
if (_page == 1)
@ -612,9 +649,14 @@ bool TReport_printer::print_loop()
const TPoint siz = page_size();
const TPoint res = page_res();
const double pollici_pagina = (double)siz.y / (double)res.y;
const double righe_pagina = pollici_pagina * _report.lpi();
const double pollici_pagina_y = (double)siz.y / (double)res.y;
const double righe_pagina = pollici_pagina_y * _report.lpi();
_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;
_logical_foot_pos = _logical_page_height - logical_footer_height;
@ -628,6 +670,7 @@ bool TReport_printer::print_loop()
oldgroup.add(EMPTY_STRING, g);
}
const int max_body = _report.find_max_level('B');
int last_body_height = 0;
_is_last_page = false;
open_page();
@ -655,6 +698,11 @@ bool TReport_printer::print_loop()
if (changed)
{
oldgroup = newgroup;
if (_delta.x > 0) // Devo tornare a capo!
_delta.y += last_body_height;
_delta.x = 0;
if (rex.current_row() > 0)
{
for (int g = 2; g <= changed; g++)
@ -666,7 +714,30 @@ bool TReport_printer::print_loop()
}
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)
{

View File

@ -12,7 +12,7 @@ class TPage_printer : public TWindow
protected:
word _copies, _pagefrom, _pageto, _page, _lastprinted;
bool _page_is_open;
bool _page_is_open, _draw_grid;
TMask* _preview_mask; // owned object
TWindow* _preview_window; // referenced object
@ -51,6 +51,9 @@ public:
bool print_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();
virtual ~TPage_printer();
};
@ -59,7 +62,7 @@ class TReport_printer : public TPage_printer
{
TReport& _report;
TPoint _delta;
long _logical_page_height;
long _logical_page_height, _logical_page_width;
long _logical_foot_pos;
bool _is_last_page, _page_break_allowed;
@ -71,6 +74,7 @@ protected:
virtual PNT log2dev(long x, long y) const;
virtual bool print_loop();
virtual void draw_preview_page();
virtual bool open_page();
virtual bool close_page();
long print_section(TReport_section& rs);

View File

@ -63,11 +63,11 @@ bool TVariant_stack::push(const real& n)
// TAVM_op
///////////////////////////////////////////////////////////
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_drop, avm_dup, avm_else,
avm_fetch, avm_if, avm_push, avm_rot, avm_store,
avm_sub, avm_swap, avm_then, avm_usrword };
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_drop, avm_dup, avm_else,
avm_fetch, avm_if, avm_push, avm_rot, avm_store,
avm_sub, avm_swap, avm_then, avm_usrword };
class TAVM_op : public TObject
{
@ -222,7 +222,7 @@ bool TAVM::compile(istream& instr, TBytecode& bytecode)
TAVM_op& ifop = (TAVM_op&)bytecode[i];
if (ifop.op() == avm_if && ifop.var().is_null())
{
ifop.var() = bytecode.items() - i;
ifop.var() = bytecode.items();
break;
}
}
@ -242,7 +242,7 @@ bool TAVM::compile(istream& instr, TBytecode& bytecode)
TAVM_op& ifop = (TAVM_op&)bytecode[i];
if ((ifop.op() == avm_if || ifop.op() == avm_else) && ifop.var().is_null())
{
ifop.var() = bytecode.last() - i;
ifop.var() = bytecode.items();
break;
}
}
@ -291,7 +291,6 @@ bool TAVM::execute(const TBytecode& bc, ostream& outstr)
for (int ip = 0; ip < bc.items(); ip++)
{
const TAVM_op& op = *(const TAVM_op*)bc.objptr(ip);
bool jumped_elsewhere = false;
switch(op.op())
{
case avm_add :
@ -334,8 +333,7 @@ bool TAVM::execute(const TBytecode& bc, ostream& outstr)
case avm_drop: _stack.drop(); break;
case avm_dup: _stack.push(_stack.peek()); break;
case avm_else:
ip += op.var().as_int();
jumped_elsewhere = true;
ip = op.var().as_int();
break;
case avm_fetch:
{
@ -352,10 +350,7 @@ bool TAVM::execute(const TBytecode& bc, ostream& outstr)
break;
case avm_if:
if (!_stack.pop().as_bool())
{
ip += op.var().as_int();
jumped_elsewhere = true;
}
ip = op.var().as_int();
break;
case avm_push: _stack.push(op.var()); 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
{
if (name == "#DATE")
if (name == "#TODAY")
{
const TDate oggi(TODAY);
var.set(oggi);