Patch level : 2.1 nopatch
Files correlati : ba8.exe Ricompilazione Demo : [ ] Commento : Anteprima di stampa nuovi report git-svn-id: svn://10.65.10.50/trunk@11933 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
6011c75885
commit
1b1b938a7a
@ -689,7 +689,10 @@ bool TReport_mask::delete_report()
|
||||
void TReport_mask::on_print()
|
||||
{
|
||||
TReport_printer rp(_report);
|
||||
rp.print();
|
||||
if (printer().printtype() == screenvis)
|
||||
rp.preview();
|
||||
else
|
||||
rp.print();
|
||||
}
|
||||
|
||||
TReport_section& TReport_mask::curr_section()
|
||||
@ -1010,6 +1013,9 @@ TReport_mask::TReport_mask() : _tree(_report), _is_dirty(false)
|
||||
|
||||
TReport_drawer& rd = (TReport_drawer&)field(F_REPORT);
|
||||
rd.set_report(&_report);
|
||||
|
||||
if (main_app().argc() >= 2)
|
||||
set(F_REPORT, main_app().argv(2), true);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
@ -732,7 +732,6 @@ void TReport_window::draw_grid()
|
||||
clear(COLOR_WHITE);
|
||||
set_pen(MAKE_COLOR(232,232,232));
|
||||
|
||||
RCT rct; xvt_vobj_get_client_rect(win(), &rct);
|
||||
const int max = 192;
|
||||
const int k = 100;
|
||||
for (int i = 1; i < max; i++)
|
||||
|
170
ba/ba8302.cpp
170
ba/ba8302.cpp
@ -160,7 +160,7 @@ protected:
|
||||
bool is_numeric(const char* str) const;
|
||||
|
||||
public:
|
||||
TReport_expr(TReport& rep, const char* exp, TFieldtypes ft);
|
||||
TReport_expr(TReport& rep, const char* exp);
|
||||
const TVariant& as_variant(TFieldtypes ft);
|
||||
};
|
||||
|
||||
@ -206,9 +206,21 @@ const TVariant& TReport_expr::as_variant(TFieldtypes ft)
|
||||
return _var;
|
||||
}
|
||||
|
||||
TReport_expr::TReport_expr(TReport& rep, const char* exp, TFieldtypes ft)
|
||||
TReport_expr::TReport_expr(TReport& rep, const char* exp)
|
||||
: _report(rep)
|
||||
{ set(exp, ft == _alfafld ? _strexpr : _numexpr); }
|
||||
{
|
||||
set(exp, _strexpr);
|
||||
}
|
||||
|
||||
|
||||
TObject* TExpression_cache::key2obj(const char* key)
|
||||
{
|
||||
return new TReport_expr(*_report, key);
|
||||
}
|
||||
|
||||
TReport_expr& TExpression_cache::operator[](const char* key)
|
||||
{ return *(TReport_expr*)objptr(key); }
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Utility
|
||||
@ -319,19 +331,22 @@ int TReport_section::add(TObject& obj)
|
||||
return TArray::add(obj);
|
||||
}
|
||||
|
||||
TReport_field* TReport_section::field(const TString& code)
|
||||
int TReport_section::find_field_pos(int id)
|
||||
{
|
||||
const int id = atoi(code);
|
||||
if (id > 0)
|
||||
for (int i = items()-1; i >= 0; i--)
|
||||
{
|
||||
for (int i = 0; i < items(); i++)
|
||||
{
|
||||
if (field(i).id() == id)
|
||||
return &field(i);
|
||||
}
|
||||
return NULL;
|
||||
if (field(i).id() == id)
|
||||
break;
|
||||
}
|
||||
return report().field(code);
|
||||
return i;
|
||||
}
|
||||
|
||||
TReport_field* TReport_section::find_field(int id)
|
||||
{
|
||||
const int pos = find_field_pos(id);
|
||||
if (pos >= 0)
|
||||
return &field(pos);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
TPoint TReport_section::compute_size() const
|
||||
@ -921,6 +936,76 @@ TReport_field::~TReport_field()
|
||||
delete _font;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_field_ref
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
struct TReport_field_ref : public TObject
|
||||
{
|
||||
char _sectype;
|
||||
int _seclevel;
|
||||
int _fldid; // -1 = section; 0 = curent field; >0 = normal field
|
||||
int _fldpos; // array position
|
||||
};
|
||||
|
||||
TObject* TField_cache::key2obj(const char* key)
|
||||
{
|
||||
const TFixed_string code(key);
|
||||
|
||||
TReport_field_ref* rf = new TReport_field_ref;
|
||||
rf->_sectype = ' ';
|
||||
rf->_seclevel = rf->_fldid = rf->_fldpos = -1;
|
||||
|
||||
const char* strid = "";
|
||||
const int dot = code.find('.');
|
||||
if (dot == 2)
|
||||
{
|
||||
rf->_sectype = code[0];
|
||||
if (isdigit(code[1]))
|
||||
rf->_seclevel = atoi((const char*)code + 1);
|
||||
strid = (const char*)code+3;
|
||||
}
|
||||
else
|
||||
strid = code;
|
||||
if (*strid > ' ')
|
||||
{
|
||||
rf->_fldid = atoi(strid);
|
||||
TReport_section& sec = _report->section(rf->_sectype, rf->_seclevel);
|
||||
rf->_fldpos = sec.find_field_pos(rf->_fldid);
|
||||
}
|
||||
|
||||
return rf;
|
||||
}
|
||||
|
||||
TReport_field* TField_cache::operator[](const char* key)
|
||||
{
|
||||
TReport_field_ref& ref = *(TReport_field_ref*)objptr(key);
|
||||
|
||||
if (ref._fldid <= 0)
|
||||
return _report->curr_field();
|
||||
|
||||
char typ = ref._sectype;
|
||||
int lev = ref._seclevel;
|
||||
if (typ <= ' ' || lev < 0)
|
||||
{
|
||||
TReport_field* cf = _report->curr_field();
|
||||
if (typ <= ' ') typ = cf->section().type();
|
||||
if (lev < 0) lev = cf->section().level();
|
||||
}
|
||||
TReport_section& sec = _report->section(typ, lev);
|
||||
TReport_field* fld = NULL;
|
||||
if (ref._fldpos >= 0 && ref._fldpos < sec.items())
|
||||
{
|
||||
fld = &sec.field(ref._fldpos);
|
||||
if (fld->id() == ref._fldid)
|
||||
return fld;
|
||||
}
|
||||
ref._fldpos = sec.find_field_pos(ref._fldid);
|
||||
fld = ref._fldpos >= 0 ? &sec.field(ref._fldpos) : NULL;
|
||||
|
||||
return fld;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -994,31 +1079,7 @@ TReport_section& TReport::section(char type, int level)
|
||||
|
||||
TReport_field* TReport::field(const TString& code)
|
||||
{
|
||||
char typ = ' ';
|
||||
int lev = 0;
|
||||
|
||||
TReport_field* cf = curr_field();
|
||||
if (cf != NULL)
|
||||
{
|
||||
typ = cf->section().type();
|
||||
lev = cf->section().level();
|
||||
}
|
||||
|
||||
TString8 strid;
|
||||
const int dot = code.find('.');
|
||||
if (dot == 2)
|
||||
{
|
||||
typ = code[0];
|
||||
if (isdigit(code[1]))
|
||||
lev = atoi((const char*)code + 1);
|
||||
strid = (const char*)code+3;
|
||||
}
|
||||
else
|
||||
strid = code;
|
||||
if (strid.blank() || strid == "THIS")
|
||||
return cf;
|
||||
|
||||
return section(typ, lev).field(strid);
|
||||
return _fields[code];
|
||||
}
|
||||
|
||||
bool TReport::evaluate_atom(const char* atom, TVariant& var)
|
||||
@ -1038,17 +1099,12 @@ bool TReport::evaluate_atom(const char* atom, TVariant& var)
|
||||
|
||||
bool TReport::evaluate(const char* expr, TVariant& var, TFieldtypes force_type)
|
||||
{
|
||||
TReport_expr* e = (TReport_expr*)_expressions.objptr(expr);
|
||||
if (e == NULL)
|
||||
{
|
||||
e = new TReport_expr(*this, expr, force_type);
|
||||
_expressions.add(expr, e);
|
||||
}
|
||||
TReport_expr& e = _expressions[expr];
|
||||
|
||||
// Caso semplice nonche' standard
|
||||
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)
|
||||
{
|
||||
const bool ok = evaluate_atom(name+1, var);
|
||||
@ -1058,16 +1114,16 @@ bool TReport::evaluate(const char* expr, TVariant& var, TFieldtypes force_type)
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < e->numvar(); i++)
|
||||
for (int i = 0; i < e.numvar(); i++)
|
||||
{
|
||||
const char* name = e->varname(i);
|
||||
const char* name = e.varname(i);
|
||||
if (name[0] == '#')
|
||||
{
|
||||
evaluate_atom(name, var);
|
||||
if (var.type() == _alfafld)
|
||||
e->setvar(i, var.as_string());
|
||||
e.setvar(i, var.as_string());
|
||||
else
|
||||
e->setvar(i, var.as_real());
|
||||
e.setvar(i, var.as_real());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1075,17 +1131,17 @@ bool TReport::evaluate(const char* expr, TVariant& var, TFieldtypes force_type)
|
||||
{
|
||||
const TVariant& var = _recordset->get(name);
|
||||
if (var.type() == _realfld || var.type() == _longfld)
|
||||
e->setvar(i, var.as_real());
|
||||
e.setvar(i, var.as_real());
|
||||
else
|
||||
e->setvar(i, var.as_string());
|
||||
e.setvar(i, var.as_string());
|
||||
}
|
||||
else
|
||||
e->setvar(i, name);
|
||||
e.setvar(i, name);
|
||||
}
|
||||
}
|
||||
|
||||
const TFieldtypes ft = force_type != _nullfld ? force_type : var.type();
|
||||
var = e->as_variant(ft);
|
||||
var = e.as_variant(ft);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -1224,7 +1280,11 @@ bool TReport::execute_usr_word(unsigned int opcode, TVariant_stack& stack)
|
||||
}
|
||||
|
||||
TReport::TReport() : _lpi(6), _recordset(NULL), _curr_field(NULL)
|
||||
{ }
|
||||
{
|
||||
// Brutte inizializzazioni, ma inevitabili
|
||||
_expressions.set_report(this);
|
||||
_fields.set_report(this);
|
||||
}
|
||||
|
||||
TReport::~TReport()
|
||||
{
|
||||
|
56
ba/ba8302.h
56
ba/ba8302.h
@ -64,7 +64,42 @@ public:
|
||||
class TReport;
|
||||
class TReport_field;
|
||||
|
||||
enum TReport_draw_mode { rdm_edit, rdm_print, rdm_print_preview };
|
||||
///////////////////////////////////////////////////////////
|
||||
// Cache varie
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TReport_expr;
|
||||
|
||||
class TExpression_cache : public TCache
|
||||
{
|
||||
TReport* _report;
|
||||
|
||||
protected:
|
||||
virtual TObject* key2obj(const char* key);
|
||||
|
||||
public:
|
||||
TReport_expr& operator[](const char* key);
|
||||
|
||||
void set_report(TReport* rep) { _report = rep; }
|
||||
TExpression_cache() : _report(NULL) { }
|
||||
};
|
||||
|
||||
class TField_cache : public TCache
|
||||
{
|
||||
TReport* _report;
|
||||
|
||||
protected:
|
||||
virtual TObject* key2obj(const char* key);
|
||||
|
||||
public:
|
||||
TReport_field* operator[](const char* key);
|
||||
void set_report(TReport* rep) { _report = rep; }
|
||||
TField_cache() : _report(NULL) { }
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_script
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TReport_script : public TObject
|
||||
{
|
||||
@ -88,6 +123,12 @@ public:
|
||||
virtual ~TReport_script();
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_section
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
enum TReport_draw_mode { rdm_edit, rdm_print, rdm_print_preview };
|
||||
|
||||
class TReport_section : public TArray
|
||||
{
|
||||
TReport& _report;
|
||||
@ -109,7 +150,8 @@ 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);
|
||||
int find_field_pos(int id);
|
||||
TReport_field* find_field(int id);
|
||||
TReport& report() { return _report; }
|
||||
|
||||
char type() const { return _type; }
|
||||
@ -266,9 +308,9 @@ class TReport : public TAlex_virtual_machine
|
||||
TReport_font _font;
|
||||
int _lpi; // Lines per inch
|
||||
TRecordset* _recordset;
|
||||
TAssoc_array _expressions;
|
||||
|
||||
TString16 _curr_page;
|
||||
TExpression_cache _expressions;
|
||||
TField_cache _fields;
|
||||
word _curr_page;
|
||||
TReport_field* _curr_field;
|
||||
|
||||
protected:
|
||||
@ -310,8 +352,8 @@ public:
|
||||
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_page(word p) { _curr_page = p; }
|
||||
word curr_page() const { return _curr_page; }
|
||||
void set_curr_field(TReport_field* fld) { _curr_field = fld; }
|
||||
TReport_field* curr_field() const { return _curr_field; }
|
||||
|
||||
|
386
ba/ba8303.cpp
386
ba/ba8303.cpp
@ -1,10 +1,260 @@
|
||||
#include <mask.h>
|
||||
#include <automask.h>
|
||||
#include <defmask.h>
|
||||
#include <diction.h>
|
||||
#include <printer.h>
|
||||
|
||||
#include <bagn003.h>
|
||||
#include "ba8201.h"
|
||||
#include "ba8303.h"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TPrint_preview_window
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TPrint_preview_window : public TField_window
|
||||
{
|
||||
TPage_printer* _printer;
|
||||
word _page, _last;
|
||||
int _zoom;
|
||||
|
||||
protected:
|
||||
void popup_menu(EVENT* ep);
|
||||
virtual void handler(WINDOW win, EVENT* ep);
|
||||
virtual void update();
|
||||
virtual bool on_key(KEY k);
|
||||
|
||||
public:
|
||||
virtual PNT log2dev(long lx, long ly) const;
|
||||
|
||||
void set_printer(TPage_printer* printer) { _printer = printer; }
|
||||
TPrint_preview_window(int x, int y, int dx, int dy, WINDOW parent,
|
||||
TWindowed_field* owner, TPage_printer* printer);
|
||||
};
|
||||
|
||||
PNT TPrint_preview_window::log2dev(long lx, long ly) const
|
||||
{
|
||||
PNT pnt;
|
||||
pnt.h = short(lx * _zoom / 100);
|
||||
pnt.v = short(ly * _zoom / 100);
|
||||
return pnt;
|
||||
}
|
||||
|
||||
void TPrint_preview_window::update()
|
||||
{
|
||||
_printer->print_page(_page);
|
||||
}
|
||||
|
||||
#define POPUP_FIRST 20883
|
||||
#define POPUP_PREV 20884
|
||||
#define POPUP_NEXT 20885
|
||||
#define POPUP_LAST 20886
|
||||
#define POPUP_ZOOMIN 20887
|
||||
#define POPUP_ZOOMOUT 20888
|
||||
|
||||
void TPrint_preview_window::popup_menu(EVENT* ep)
|
||||
{
|
||||
MENU_ITEM menu[16]; // Stiamo larghi
|
||||
memset(menu, 0, sizeof(menu));
|
||||
menu[0].tag = POPUP_FIRST; menu[0].text = (char*)TR("Prima"); menu[0].enabled = true;
|
||||
menu[1].tag = POPUP_PREV; menu[1].text = (char*)TR("Indietro"); menu[1].enabled = _page > 1;
|
||||
menu[2].tag = POPUP_NEXT; menu[2].text = (char*)TR("Avanti"); menu[2].enabled = _last == 0 || _page < _last;
|
||||
menu[3].tag = POPUP_LAST; menu[3].text = (char*)TR("Ultima"); menu[3].enabled = true;
|
||||
menu[4].tag = -1; menu[4].separator = true;
|
||||
menu[5].tag = POPUP_ZOOMIN; menu[5].text = (char*)TR("Zoom +"); menu[5].enabled = _zoom < 200;
|
||||
menu[6].tag = POPUP_ZOOMOUT; menu[6].text = (char*)TR("Zoom -"); menu[6].enabled = _zoom > 75;
|
||||
|
||||
const PNT& p = ep->v.mouse.where;
|
||||
xvt_menu_popup(menu, win(), p, XVT_POPUP_CENTER, 0);
|
||||
}
|
||||
|
||||
void TPrint_preview_window::handler(WINDOW win, EVENT* ep)
|
||||
{
|
||||
switch (ep->type)
|
||||
{
|
||||
case E_MOUSE_DOWN:
|
||||
if (ep->v.mouse.button != 0)
|
||||
popup_menu(ep);
|
||||
break;
|
||||
case E_COMMAND:
|
||||
{
|
||||
bool processed = true;
|
||||
switch(ep->v.cmd.tag)
|
||||
{
|
||||
case POPUP_FIRST : _page = 1; break;
|
||||
case POPUP_PREV : if (_page > 1) _page--; break;
|
||||
case POPUP_NEXT : if (_last == 0 || _page < _last) _page++; break;
|
||||
case POPUP_LAST :
|
||||
if (_last == 0)
|
||||
{
|
||||
_printer->print_page(9999);
|
||||
_last = _printer->last_printed_page();
|
||||
}
|
||||
_page = _last;
|
||||
break;
|
||||
case POPUP_ZOOMIN : if (_zoom < 200) { _zoom += 25; } break;
|
||||
case POPUP_ZOOMOUT: if (_zoom > 75) { _zoom -= 25; } break;
|
||||
default:processed = false; break;
|
||||
}
|
||||
if (processed)
|
||||
force_update();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
TField_window::handler(win, ep);
|
||||
}
|
||||
|
||||
bool TPrint_preview_window::on_key(KEY k)
|
||||
{
|
||||
bool ok = true;
|
||||
switch (k)
|
||||
{
|
||||
case '+' : dispatch_e_menu(win(), POPUP_ZOOMIN); break;
|
||||
case '-' : dispatch_e_menu(win(), POPUP_ZOOMOUT); break;
|
||||
case K_HOME :
|
||||
case K_LHOME : dispatch_e_menu(win(), POPUP_FIRST); break;
|
||||
case K_LEFT : dispatch_e_menu(win(), POPUP_PREV); break;
|
||||
case K_RIGHT : dispatch_e_menu(win(), POPUP_NEXT); break;
|
||||
case K_END:
|
||||
case K_LEND : dispatch_e_menu(win(), POPUP_LAST); break;
|
||||
default : ok = TField_window::on_key(k); break;
|
||||
};
|
||||
return ok;
|
||||
}
|
||||
|
||||
TPrint_preview_window::TPrint_preview_window(int x, int y, int dx, int dy, WINDOW parent,
|
||||
TWindowed_field* owner, TPage_printer* printer)
|
||||
: TField_window(x, y, dx, dy, parent, owner), _printer(printer), _page(1), _last(0), _zoom(100)
|
||||
{
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TPrint_preview_field
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TPrint_preview_field : public TWindowed_field
|
||||
{
|
||||
TPage_printer* _printer;
|
||||
|
||||
protected:
|
||||
virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);
|
||||
|
||||
public:
|
||||
TPrint_preview_field(TMask* m, TPage_printer* printer) : TWindowed_field(m), _printer(printer) { }
|
||||
};
|
||||
|
||||
TField_window* TPrint_preview_field::create_window(int x, int y, int dx, int dy, WINDOW parent)
|
||||
{
|
||||
return new TPrint_preview_window(x, y, dx, dy, parent, this, _printer);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TPreview_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TPreview_mask : public TAutomask
|
||||
{
|
||||
TPage_printer* _printer;
|
||||
|
||||
protected:
|
||||
virtual bool on_key(KEY k);
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
virtual TMask_field* parse_field(TScanner& scanner);
|
||||
|
||||
public:
|
||||
TPreview_mask(TPage_printer* printer);
|
||||
};
|
||||
|
||||
bool TPreview_mask::on_key(KEY k)
|
||||
{
|
||||
switch (k)
|
||||
{
|
||||
case K_HOME :
|
||||
case K_LHOME:
|
||||
case K_LEFT :
|
||||
case K_RIGHT:
|
||||
case K_END :
|
||||
case K_LEND :
|
||||
dispatch_e_char(_printer->win(), k);
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TAutomask::on_key(k);
|
||||
}
|
||||
|
||||
bool TPreview_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
case DLG_FIRSTREC: dispatch_e_menu(_printer->win(), POPUP_FIRST); break;
|
||||
case DLG_PREVREC : dispatch_e_menu(_printer->win(), POPUP_PREV); break;
|
||||
case DLG_NEXTREC : dispatch_e_menu(_printer->win(), POPUP_NEXT); break;
|
||||
case DLG_LASTREC : dispatch_e_menu(_printer->win(), POPUP_LAST); break;
|
||||
default: break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
TMask_field* TPreview_mask::parse_field(TScanner& scanner)
|
||||
{
|
||||
if (scanner.token().starts_with("PR"))
|
||||
return new TPrint_preview_field(this, _printer);
|
||||
return TAutomask::parse_field(scanner);
|
||||
}
|
||||
|
||||
TPreview_mask::TPreview_mask(TPage_printer* printer)
|
||||
: _printer(printer)
|
||||
{
|
||||
read_mask("ba8303", 0, -1);
|
||||
set_handlers();
|
||||
|
||||
int pos = id2pos(DLG_FINDREC);
|
||||
if (pos >= 0 && id2pos(DLG_FIRSTREC) >= 0) //se e' un bottone pentapartito...
|
||||
{
|
||||
TButton_field& f_find = (TButton_field &)fld(pos);
|
||||
RCT rct_base; f_find.get_rect(rct_base);
|
||||
const int bwidth = (rct_base.right - rct_base.left);
|
||||
const int bheight = (rct_base.bottom - rct_base.top);
|
||||
if (bwidth > 3*bheight/2) // Controllo se ho gia' ridimensionato i bottoni in precedenza
|
||||
{
|
||||
int bx = bwidth / 3;
|
||||
int by = bheight / 2;
|
||||
|
||||
RCT r = rct_base; r.left += bx-2; r.right -= bx-2;
|
||||
f_find.set_rect(r); // Ridimensiona il bottone centrale di ricerca
|
||||
|
||||
bx += 5; by += 3; // Aggiusta dimensioni bottoni sussidiari
|
||||
|
||||
pos = id2pos(DLG_FIRSTREC);
|
||||
if (pos >= 0)
|
||||
{
|
||||
r = rct_base; r.top = r.bottom - by; r.right = r.left + bx;
|
||||
fld(pos).set_rect(r);
|
||||
}
|
||||
pos = id2pos(DLG_PREVREC);
|
||||
if (pos >= 0)
|
||||
{
|
||||
r = rct_base; r.bottom = r.top + by; r.right = r.left + bx;
|
||||
fld(pos).set_rect(r);
|
||||
}
|
||||
pos = id2pos(DLG_NEXTREC);
|
||||
if (pos >= 0)
|
||||
{
|
||||
r = rct_base; r.bottom = r.top + by; r.left = r.right - bx;
|
||||
fld(pos).set_rect(r);
|
||||
}
|
||||
pos = id2pos(DLG_LASTREC);
|
||||
if (pos >= 0)
|
||||
{
|
||||
r = rct_base; r.top = r.bottom - by; r.left = r.right - bx;
|
||||
fld(pos).set_rect(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TPage_printer
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -75,7 +325,7 @@ bool TPage_printer::main_loop()
|
||||
xvt_vobj_destroy(prwin);
|
||||
set_win(NULL_WIN);
|
||||
|
||||
return !ok;
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TPage_printer::page_in_range() const
|
||||
@ -85,14 +335,34 @@ bool TPage_printer::page_in_range() const
|
||||
return _pageto < _pagefrom || _page <= _pageto;
|
||||
}
|
||||
|
||||
PNT TPage_printer::log2dev(long lx, long ly) const
|
||||
{
|
||||
if (preview_mode())
|
||||
return _preview_window->log2dev(lx, ly);
|
||||
const PNT p = { short(ly), short(lx) };
|
||||
return p;
|
||||
}
|
||||
|
||||
TPoint TPage_printer::dev2log(const PNT& pnt) const
|
||||
{
|
||||
CHECK(0, "dev2log: Pure virtual funtion call");
|
||||
const TPoint p;
|
||||
return p;
|
||||
}
|
||||
|
||||
bool TPage_printer::open_page()
|
||||
{
|
||||
_page++;
|
||||
if (page_in_range())
|
||||
_page_is_open = xvt_print_open_page(_rcd) != 0;
|
||||
{
|
||||
if (print_mode())
|
||||
_page_is_open = xvt_print_open_page(_rcd) != 0;
|
||||
else
|
||||
_page_is_open = true;
|
||||
}
|
||||
else
|
||||
_page_is_open = false;
|
||||
|
||||
|
||||
return _page_is_open;
|
||||
}
|
||||
|
||||
@ -101,7 +371,9 @@ bool TPage_printer::close_page()
|
||||
const bool was_open = _page_is_open;
|
||||
if (was_open)
|
||||
{
|
||||
xvt_print_close_page(_rcd);
|
||||
if (print_mode())
|
||||
xvt_print_close_page(_rcd);
|
||||
|
||||
_page_is_open = false;
|
||||
}
|
||||
return was_open;
|
||||
@ -121,8 +393,62 @@ bool TPage_printer::print()
|
||||
return ok;
|
||||
}
|
||||
|
||||
TPage_printer::TPage_printer() : _pagefrom(1), _pageto(0), _copies(1)
|
||||
{ }
|
||||
void TPage_printer::print_page(word page)
|
||||
{
|
||||
_pagefrom = _pageto = page;
|
||||
_page = 0;
|
||||
print_loop();
|
||||
}
|
||||
|
||||
bool TPage_printer::preview()
|
||||
{
|
||||
_preview_mask = new TPreview_mask(this);
|
||||
TPrint_preview_field& pf = (TPrint_preview_field&)_preview_mask->field(DLG_USER);
|
||||
_preview_window = &pf.win();
|
||||
|
||||
TPrinter& p = printer();
|
||||
_rcd = p.get_printrcd();
|
||||
if (!xvt_print_is_valid(_rcd))
|
||||
return error_box("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");
|
||||
|
||||
RCT rct; pf.get_rect(rct);
|
||||
const long page_height = rct.bottom - rct.top;
|
||||
const long page_width = rct.right - rct.left;
|
||||
const long page_res = page_height * _pvr / _ph;
|
||||
_ph = page_height;
|
||||
_pw = page_width;
|
||||
_pvr = _phr = page_res;
|
||||
|
||||
set_win(_preview_window->win());
|
||||
_pagefrom = _pageto = _page = 1;
|
||||
_preview_mask->run();
|
||||
set_win(NULL_WIN);
|
||||
|
||||
delete _preview_mask;
|
||||
_preview_mask = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TPoint TPage_printer::page_size() const
|
||||
{
|
||||
return TPoint(_pw, _ph);
|
||||
}
|
||||
|
||||
TPoint TPage_printer::page_res() const
|
||||
{
|
||||
TPoint pt(_phr, _pvr);
|
||||
return pt;
|
||||
}
|
||||
|
||||
TPage_printer::TPage_printer() : _pagefrom(1), _pageto(0), _copies(1), _preview_mask(NULL)
|
||||
{
|
||||
_pixmap = true; // Fondamentale!!!
|
||||
}
|
||||
|
||||
TPage_printer::~TPage_printer()
|
||||
{ }
|
||||
@ -149,20 +475,13 @@ int TReport_printer::font_size() const
|
||||
|
||||
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;
|
||||
const TPoint res = page_res();
|
||||
const double cx = (double)res.x / (double)_report.cpi();
|
||||
const double cy = (double)res.y / (double)_report.lpi();
|
||||
const long x = long((lx + _delta.x) * cx / 100.0);
|
||||
const long y = long((ly + _delta.y) * cy / 100.0);
|
||||
|
||||
return TPage_printer::log2dev(x, y); // Useful for preview mode
|
||||
}
|
||||
|
||||
long TReport_printer::print_section(char type, int level)
|
||||
@ -178,11 +497,24 @@ bool TReport_printer::open_page()
|
||||
{
|
||||
const bool ok = TPage_printer::open_page();
|
||||
|
||||
TString8 str; str << _page;
|
||||
_report.set_curr_page(str);
|
||||
_report.set_curr_page(_page);
|
||||
|
||||
_delta.x = _delta.y = 0;
|
||||
_page_break_allowed = false;
|
||||
|
||||
if (ok && preview_mode()) // Clear page needed
|
||||
{
|
||||
clear(COLOR_WHITE);
|
||||
set_pen(MAKE_COLOR(232,232,232));
|
||||
const int max = 192;
|
||||
const int k = 100;
|
||||
for (int i = 1; i < max; i++)
|
||||
{
|
||||
line(0, i*k, max*k, i*k);
|
||||
line(i*k, 0, i*k, max*k);
|
||||
}
|
||||
}
|
||||
|
||||
print_section('B', 0);
|
||||
if (_page == 1)
|
||||
_delta.y += print_section('H', 1);
|
||||
@ -244,10 +576,9 @@ bool TReport_printer::print_loop()
|
||||
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 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();
|
||||
_logical_page_height = long(righe_pagina*100.0);
|
||||
const long logical_footer_height = _report.section('F',0).compute_size().y;
|
||||
@ -301,6 +632,7 @@ bool TReport_printer::print_loop()
|
||||
print_section('F', 1);
|
||||
_is_last_page = true;
|
||||
close_page();
|
||||
_lastprinted = _page;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
27
ba/ba8303.h
27
ba/ba8303.h
@ -7,16 +7,25 @@
|
||||
|
||||
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;
|
||||
|
||||
protected:
|
||||
word _copies, _pagefrom, _pageto, _page, _lastprinted;
|
||||
bool _page_is_open;
|
||||
|
||||
TMask* _preview_mask; // owned object
|
||||
TWindow* _preview_window; // referenced object
|
||||
|
||||
virtual word pages() const { return 0; }
|
||||
virtual bool print_loop() pure;
|
||||
|
||||
private:
|
||||
virtual TPoint dev2log(const PNT& p) const; // Never use this!
|
||||
|
||||
protected:
|
||||
virtual PNT log2dev(long lx, long ly) const; // Always override this!
|
||||
|
||||
virtual const char* form_name() const;
|
||||
virtual const char* font_name() const;
|
||||
virtual int font_size() const;
|
||||
@ -28,7 +37,17 @@ protected:
|
||||
|
||||
public:
|
||||
bool main_loop(); // Internal use only
|
||||
virtual bool print(); // Use this
|
||||
virtual bool print(); // Use this ...
|
||||
virtual bool preview(); // ... and this
|
||||
virtual void print_page(word page); // Inefficient default implementation
|
||||
|
||||
virtual TPoint page_size() const;
|
||||
virtual TPoint page_res() const;
|
||||
virtual word last_printed_page() { return _lastprinted; }
|
||||
|
||||
bool print_mode() const { return _preview_mask == NULL; }
|
||||
bool preview_mode() const { return _preview_mask != NULL; }
|
||||
|
||||
TPage_printer();
|
||||
virtual ~TPage_printer();
|
||||
};
|
||||
@ -37,7 +56,6 @@ 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;
|
||||
@ -48,7 +66,6 @@ protected:
|
||||
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();
|
||||
|
51
ba/ba8303.uml
Executable file
51
ba/ba8303.uml
Executable file
@ -0,0 +1,51 @@
|
||||
TOOLBAR "Toolbar" 0 -2 0 2
|
||||
|
||||
BUTTON DLG_PREVREC 3
|
||||
BEGIN
|
||||
PROMPT -46 -2 ""
|
||||
PICTURE 122
|
||||
END
|
||||
|
||||
BUTTON DLG_FIRSTREC 3
|
||||
BEGIN
|
||||
PROMPT -46 -1 ""
|
||||
PICTURE 121
|
||||
END
|
||||
|
||||
BUTTON DLG_FINDREC 10 2
|
||||
BEGIN
|
||||
PROMPT -46 -1 ""
|
||||
PICTURE 166
|
||||
END
|
||||
|
||||
BUTTON DLG_NEXTREC 3
|
||||
BEGIN
|
||||
PROMPT -46 -2 ""
|
||||
PICTURE 124
|
||||
END
|
||||
|
||||
BUTTON DLG_LASTREC 3
|
||||
BEGIN
|
||||
PROMPT -46 -1 ""
|
||||
PICTURE 125
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -66 -1 "~Fine"
|
||||
PICTURE BMP_QUIT
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Anteprima" -1 -1 60 13
|
||||
|
||||
PREVIEW DLG_USER -3 -1
|
||||
BEGIN
|
||||
PROMPT 0 0 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
||||
|
Loading…
x
Reference in New Issue
Block a user