Modifica 95/24. Gestione dei profili di stampa con font name e size

selezionalbili dall'utente.


git-svn-id: svn://10.65.10.50/trunk@1761 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1995-08-31 15:16:13 +00:00
parent 87f3d41343
commit 7ce6f8d18d
3 changed files with 284 additions and 62 deletions

@ -1,5 +1,10 @@
#include <ctype.h>
#include <stdlib.h>
#include <stdlib.h>
#if XVT_OS == XVT_OS_WIN
#define STRICT
#include <windows.h>
#endif
#include <applicat.h>
#include <form.h>
@ -1073,7 +1078,7 @@ class TForm_number : public TForm_string
protected: // TForm_string
virtual const char* class_name() const { return "NUMERO"; }
virtual bool parse_head(TScanner& scanner);
virtual bool update();
virtual bool update();
virtual int height() const { return 0; }
protected:
@ -1433,10 +1438,51 @@ public:
// TPrint_section
///////////////////////////////////////////////////////////
HIDDEN bool font_handler(TMask_field& f, KEY key)
{
if (key == K_SPACE)
{
main_app().begin_wait();
const char* family = f.get();
const int MAXSIZES = 16;
long sizes[MAXSIZES];
BOOLEAN scalable;
const int num_sizes = (int)xvt_fmap_get_family_sizes(printer().get_printrcd(),
(char*)family, sizes, &scalable, MAXSIZES);
TToken_string pn1(80), pn2(80);
if (scalable)
{
for (int i = 4; i <= 32; i++)
{
pn1.add(i);
pn2.add(i);
}
}
else
{
if (num_sizes > 0)
{
for (int i = 0; i < num_sizes; i++)
pn1.add(sizes[i]);
}
else pn1.add(printer().get_char_size());
pn2 = pn1;
}
TList_field& lst = (TList_field&)f.mask().field(F_SIZE);
lst.replace_items(pn1, pn2);
lst.set(format("%d",printer().get_char_size()));
main_app().end_wait();
}
return TRUE;
}
TMask* TPrint_section::_msk = NULL;
TPrint_section::TPrint_section(TForm* f, char st, pagetype pt, bool sub)
: _height(0), _x(0), _y(0), _form(f), _sec_type(st), _page_type(pt), _dirty(FALSE),
: _height(0), _form(f), _sec_type(st), _page_type(pt), _dirty(FALSE),
_subsection(sub), _repeat_count(0)
{}
@ -1453,8 +1499,6 @@ const TPrint_section& TPrint_section::copy(const TPrint_section& ps)
{
_item = ps._item;
_height = ps._height;
_x = ps._x;
_y = ps._y;
return ps;
}
@ -1471,8 +1515,8 @@ TPrintrow& TPrint_section::row(int num)
void TPrint_section::offset(int& x, int& y) const
{
if (x >= 0) x += _x;
if (y >= 0) y += _y + (_height * _repeat_count);
if (x >= 0) x += form().offset_x();
if (y >= 0) y += form().offset_y() + (_height * _repeat_count);
}
@ -1501,12 +1545,10 @@ TForm_item* TPrint_section::parse_item(TScanner& scanner)
return parse_item(scanner.key());
}
bool TPrint_section::parse(TScanner& scanner)
{
_height = scanner.integer();
_x = scanner.integer();
_y = scanner.integer();
_height = scanner.integer();
scanner.integer();scanner.integer(); // Eat offset X and Y of Print_section if present
while (scanner.popkey() != "EN")
{
@ -1546,21 +1588,8 @@ bool TPrint_section::update()
bool TPrint_section::read_from(const TRectype& prof)
{
CHECK(prof.num() == LF_RFORM, "Il record deve essere del file LF_RFORM");
int i;
bool changed = FALSE;
i = prof.get_int("X");
if (_x != i)
{
_x = i;
changed = TRUE;
}
i = prof.get_int("Y");
if (_y != i)
{
_y = i;
changed = TRUE;
}
const word h = (word)prof.get_int("HGT");
if (_height != h)
{
@ -1574,11 +1603,35 @@ void TPrint_section::print_on(TRectype& prof)
{
CHECK(prof.num() == LF_RFORM, "Il record deve essere del file LF_RFORM");
prof.put("ID", 0);
prof.put("X", _x);
prof.put("Y", _x);
prof.put("X", 0);
prof.put("Y", 0);
prof.put("HGT", _height);
}
typedef struct {
char name_1[80]; // Fontname old
char name_2[80]; // Fontname new
int size_1; // size (height) of old font
int size_2; // size (height) of new font
double ratio; // ratio (width_old_font/width_new_font)
} s_data;
BOOLEAN XVT_CALLCONV1 wpr (long data)
{
s_data* st =(s_data*)data;
WINDOW prwin = xvt_print_create_win(printer().get_printrcd(),"");
long width_old,width_new;
TString spc(100);
spc.fill('m');
xvt_set_font(prwin,st->name_1, XVT_FS_NONE, st->size_1);
width_old = xvt_dwin_get_text_width(prwin,(char*)(const char*)spc, 100);
xvt_set_font(prwin,st->name_2, XVT_FS_NONE, st->size_2);
width_new = xvt_dwin_get_text_width(prwin,(char*)(const char*)spc, 100);
st->ratio = (double)width_old / (double)width_new;
xvt_vobj_destroy(prwin);
return FALSE;
}
bool TPrint_section::edit(const char* title)
{
@ -1588,11 +1641,32 @@ bool TPrint_section::edit(const char* title)
{
TMask m("ba2100s");
m.set_caption(title);
m.set(F_HEIGHT, _height);
m.set(F_X, _x);
m.set(F_Y, _y);
m.set(F_X, form().offset_x());
m.set(F_Y, form().offset_y());
{
const int MAX_FAMILIES = 128;
char* family[MAX_FAMILIES];
const int num_families = (int)xvt_fmap_get_families(printer().get_printrcd(), family, MAX_FAMILIES);
bool font_found = FALSE;
TToken_string pn1(256), pn2(256);
for (int i = 0; i < num_families; i++)
{
pn1.add(family[i]);
pn2.add(family[i]);
if (!font_found)
if (form().fontname() == family[i]) font_found = TRUE;
xvt_mem_free(family[i]);
}
TList_field& lst = (TList_field&)m.field(F_FONT);
lst.replace_items(pn1, pn2);
if (!font_found) warning_box("Il font %s non esiste per la stampante di default.",(const char*) form().fontname());
lst.set(form().fontname());
}
printer().set_char_size(form().fontsize());
m.set_handler(F_FONT,font_handler);
if (m.run() == K_ESC)
return FALSE;
@ -1600,9 +1674,64 @@ bool TPrint_section::edit(const char* title)
if (dirty)
{
_height = m.get_int(F_HEIGHT);
_x = m.get_int(F_X);
_y = m.get_int(F_Y);
if (_height != (word)m.get_int(F_HEIGHT) )
{
_height = m.get_int(F_HEIGHT);
_dirty=TRUE;
}
if (m.get_int(F_X) != form().offset_x() || m.get_int(F_Y) != form().offset_y())
{
form().offset_x() = m.get_int(F_X);
form().offset_y() = m.get_int(F_Y);
form().set_dirty();
_dirty = TRUE;
}
TString80 name(m.get(F_FONT));
int size = m.get_int(F_SIZE);
if (name != form().fontname() || size != form().fontsize())
{
if (!form().dirty()) form().set_dirty();
_dirty = TRUE;
s_data prm;
prm.size_1=form().fontsize();
strcpy(prm.name_1,form().fontname());
prm.size_2=size;
strcpy(prm.name_2,name);
prm.ratio = 1.0;
// Next 3 lines may be changed
xvt_print_open();
xvt_print_start_thread (wpr, (long)&prm);
xvt_print_close();
form().fontname() = name;
form().fontsize() = size;
const char sechar[4] = { 'B', 'F', 'G', 'H' };
for (int sn = 0; sn < 4 ; sn++)
{
const char sc = sechar[sn];
for (pagetype pt = odd_page; pt <= last_page; pt = pagetype(pt+1))
{
TPrint_section* sec = form().exist(sc, pt);
if (sec != NULL)
{
sec->set_dirty();
for (word i = 0; i < sec->fields() ; i++)
{
TForm_item& fi = sec->field(i);
if (fi.x() > 0 && (prm.ratio != 1.0))
{
real x_pos;
x_pos = fi.x() * prm.ratio;
x_pos.round();
fi.x() = (short)x_pos.integer();
fi.set_dirty();
}
}
}
}
}
}
}
}
@ -1706,7 +1835,7 @@ void TPrint_section::print_on(ostream& out) const
default:
out << "ODD"; break;
}
out << ' ' << _height << ' ' << _x << ' ' << _y << endl << endl;
out << ' ' << _height << endl << endl;
for(word i = 0; i < fields(); i++)
out << field(i);
}
@ -1929,6 +2058,39 @@ void TForm::print_description(ostream& out) const
out << "END\n" << endl;
}
bool TForm::parse_general(TScanner &scanner)
{
bool ok = scanner.popkey() == "GE";
if (ok)
{
while (scanner.pop() != "END")
{
if (scanner.popkey() == "OF") // Offsets
{
_x = scanner.integer();
_y = scanner.integer();
}
else scanner.push();
if (scanner.popkey() == "FO") // Font name
_fontname = scanner.string();
else scanner.push();
if (scanner.popkey() == "SI") // Font size
_fontsize = scanner.integer();
else scanner.push();
}
} else scanner.push();
return (ok);
}
void TForm::print_general(ostream& out) const
{
out << "GENERAL\nBEGIN\n";
out << " OFFSET " << _x << " " << _y << "\n";
out << " FONT " << "\"" << _fontname << "\"\n";
out << " SIZE " << _fontsize << "\n" ;
out << "END\n" << endl;
}
TPrint_section* TForm::exist(char s, pagetype t, bool create)
{
@ -2083,6 +2245,8 @@ bool TForm::print(long from, long to)
pr.setheaderhandler(header_handler);
pr.setfooterhandler(footer_handler);
pr.formlen(height());
pr.set_char_size(_fontsize); // Set font name and size
pr.set_fontname(_fontname); // according to current form
const bool was_open = pr.isopen();
_lastpage = FALSE; // non e' l'ultima pagina
@ -2167,7 +2331,9 @@ void TForm::print_on(ostream& out) const
{
out << *relation() << "\nEND" << endl;
print_description(out);
}
}
print_general(out);
print_section(out, 'G');
print_section(out, 'H');
@ -2201,32 +2367,48 @@ word TForm::height()
bool TForm::read_profile()
{
TLocalisamfile prof(LF_RFORM);
{
TLocalisamfile prof(LF_FORM);
TLocalisamfile rprof(LF_RFORM);
prof.zero();
prof.put("TIPOPROF", _name);
prof.put("CODPROF", _code);
const TRectype filter(prof.curr());
for (int err = prof.read(_isgteq); err == NOERR && prof.curr() == filter; err = prof.next())
{
const TString& s = prof.get("SEZ");
const char sec = s[0];
const pagetype pt = char2page(s[1]);
const short id = prof.get_int("ID");
prof.put("TIPOPROF",_name);
prof.put("CODPROF",_code);
if (prof.read(_isequal) == NOERR)
{
bool complete = FALSE;
rprof.zero();
rprof.put("TIPOPROF", _name);
rprof.put("CODPROF", _code);
const TRectype filter(rprof.curr());
if (id == 0)
{
TPrint_section& se = section(sec, pt);
se.read_from(prof.curr());
for (int err = rprof.read(_isgteq); err == NOERR && rprof.curr() == filter; err = rprof.next())
{
const TString& s = rprof.get("SEZ");
const char sec = s[0];
const pagetype pt = char2page(s[1]);
const short id = rprof.get_int("ID");
if (!complete) complete=TRUE;
if (id == 0)
{
TPrint_section& se = section(sec, pt);
se.read_from(rprof.curr());
}
else
{
TForm_item& item = find_field(sec, pt, id);
item.read_from(rprof.curr());
}
}
else
{
TForm_item& item = find_field(sec, pt, id);
item.read_from(prof.curr());
if (complete) // Get general data from header of form only if it's complete.
{ // Complete means that there's at least a row
_x = prof.get_int("OFFX");
_y = prof.get_int("OFFY");
_fontname = prof.get("FONTNAME");
_fontsize = prof.get_int("FONTSIZE");
}
}
}
return TRUE;
}
@ -2234,6 +2416,23 @@ bool TForm::write_profile()
{
const char sechar[4] = { 'B', 'F', 'G', 'H' };
TLocalisamfile form(LF_FORM);
form.zero();
form.put("TIPOPROF",_name);
form.put("CODPROF",_code);
if (form.read(_isequal,_lock) == NOERR)
{
if (_dirty)
{
form.put("OFFY",_y);
form.put("OFFX",_x);
form.put("FONTNAME",_fontname);
form.put("FONTSIZE",_fontsize);
form.rewrite();
_dirty=FALSE;
}
}
TLocalisamfile rform(LF_RFORM);
TRectype& cur = rform.curr();
@ -2273,7 +2472,7 @@ bool TForm::write_profile()
}
}
}
form.reread(_unlock);
if (err != NOERR)
return error_box("Errore di salvataggio profilo: %d", err);
@ -2282,7 +2481,8 @@ bool TForm::write_profile()
TForm::TForm(const char* name, long code, int lev, const char* desc)
: _name(name), _code(code), _relation(NULL), _cursor(NULL), _rel_desc(NULL),
_isnew(FALSE), _editlevel(lev), _desc(desc)
_isnew(FALSE), _editlevel(lev), _desc(desc), _fontname("Courier New"),
_fontsize(12), _x(0), _y(0), _dirty(FALSE)
{
main_app().begin_wait();
@ -2301,6 +2501,10 @@ TForm::TForm(const char* name, long code, int lev, const char* desc)
forms.put("TIPOPROF", _name);
forms.put("CODPROF", _code);
forms.put("DESC", _desc);
forms.put("OFFY",_y);
forms.put("OFFX",_x);
forms.put("FONTNAME",_fontname);
forms.put("FONTSIZE",_fontsize);
forms.write();
}
else _desc = forms.get("DESC");
@ -2320,6 +2524,8 @@ TForm::TForm(const char* name, long code, int lev, const char* desc)
parse_description(scanner); // Parse description
}
else scanner.push();
if (ok) parse_general(scanner); // Parse general
while (ok)
{

@ -35,7 +35,6 @@ class TPrint_section : public TArray
static TMask* _msk;
word _height; // Altezza della sezione
int _x, _y; // Offset di stampa
bool _dirty; // Flag di modifica parametri
TForm* _form; // Form cui appartiene alla sezione
@ -62,8 +61,6 @@ public:
word fields() const { return _item.items(); }
word height() const { return _height; }
int offset_x() const { return _x; }
int offset_y() const { return _y; }
void offset(int& x, int& y) const;
void set_repeat_count(int x) { _repeat_count = x; }
@ -93,9 +90,14 @@ public:
class TForm : public TObject
{
friend class TForm_editor;
friend class TPrint_section;
TString16 _name; // Profile name
long _code; // Profile code
TString80 _fontname; // Font name
int _fontsize; // Font size
int _x, _y; // Offset validi per tutte le sezioni
bool _dirty; // Flag per ragistrare i parametri(font ed offset)
TRelation* _relation; // Can be NULL
TCursor* _cursor; // Can be NULL
@ -132,6 +134,9 @@ protected:
bool parse_description(TScanner&);
void print_description(ostream& out) const;
bool parse_general(TScanner&);
void print_general(ostream& out) const;
bool read_profile();
bool write_profile();
@ -159,7 +164,13 @@ public:
virtual bool validate(TForm_item& fld, TToken_string& val);
TForm_item& find_field(char sec, pagetype pag, short id) const;
int& offset_x() { return _x; }
int& offset_y() { return _y; }
TString80& fontname() { return _fontname; }
int& fontsize() { return _fontsize; }
bool dirty() const { return _dirty; }
void set_dirty(bool d = TRUE) { _dirty = d; }
// if code == NULL it's a base form
// otherwise it's integrated by a file definition
TForm(const char* form, long code = 0L, int editlevel = 0, const char* desc = "");
@ -219,6 +230,8 @@ public:
short id() const { return _id; }
virtual int width() const { return _width; }
virtual int height() const { return _height; }
virtual short& x() { return _x; }
virtual short& y() { return _y; }
virtual bool parse(TScanner&);
virtual bool update();

@ -314,6 +314,9 @@ public:
int get_char_size() const { return _ch_size; }
char* fontname() const { return (char*)(const char*)_fontname; }
void set_char_size(int size) { _ch_size = size; }
void set_fontname(const char *name) { _fontname = name; }
void read_configuration(const char* parag = NULL);
// bookmarks