Linee e box in modo testo

git-svn-id: svn://10.65.10.50/trunk@2334 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
villa 1995-12-22 12:01:15 +00:00
parent f5d1aa190a
commit c872f8ceb5
7 changed files with 309 additions and 80 deletions

View File

@ -9,7 +9,7 @@
class TFink_mask : public TMask
{
TToken_string _chars;
char _chars[11];
enum pos { // posizioni scatoletta
xl = 1,
@ -33,10 +33,11 @@ class TFink_mask : public TMask
public:
TToken_string& get_chars() { return _chars; }
char* get_chars() { return _chars; }
TFink_mask(const char* def) : TMask("ba21fn"), _chars(def,',')
TFink_mask(const char* def) : TMask("ba21fn")
{
strncpy(_chars, def, 11);
set_handler(C_TR, char_handler);
set_handler(C_TL, char_handler);
set_handler(C_TM, char_handler);
@ -90,30 +91,30 @@ void TFink_mask::paint_example()
line.spaces();
if (i == yt)
{
line.fill(_chars.get_char(9));
line[xl-1] = _chars.get_char(0);
line[xm-1] = _chars.get_char(1);
line[xr-1] = _chars.get_char(2);
line.fill(_chars[9]);
line[xl-1] = _chars[0];
line[xm-1] = _chars[1];
line[xr-1] = _chars[2];
}
else if (i == ym)
{
line.fill(_chars.get_char(9));
line[xl-1] = _chars.get_char(6);
line[xm-1] = _chars.get_char(7);
line[xr-1] = _chars.get_char(8);
line.fill(_chars[9]);
line[xl-1] = _chars[6];
line[xm-1] = _chars[7];
line[xr-1] = _chars[8];
}
else if (i == yb)
{
line.fill(_chars.get_char(9));
line[xl-1] = _chars.get_char(3);
line[xm-1] = _chars.get_char(4);
line[xr-1] = _chars.get_char(5);
line.fill(_chars[9]);
line[xl-1] = _chars[3];
line[xm-1] = _chars[4];
line[xr-1] = _chars[5];
}
else
{
line[xl-1] = _chars.get_char(10);
line[xm-1] = _chars.get_char(10);
line[xr-1] = _chars.get_char(10);
line[xl-1] = _chars[10];
line[xm-1] = _chars[10];
line[xr-1] = _chars[10];
}
stringat(ofs, i, line);
}
@ -125,7 +126,7 @@ void TFink_mask::start_run()
for (int i = 101; i <= 111; i++)
{
field(i).allow_pipe(); // allowa la pipa, se no son cazzi
field(i).set(_chars.get(i - 101));
field(i).set(format("%c",_chars[i - 101]));
}
}
@ -134,7 +135,7 @@ bool TFink_mask::stop_run(KEY k)
if (k == K_ENTER)
{
for (int i = 101; i <= 111; i++)
_chars.add(field(i).get(), i-101);
_chars[i-101] = field(i).get()[0];
}
return TMask::stop_run(k);
}
@ -144,8 +145,8 @@ bool TFink_mask::char_handler(TMask_field& f, KEY k)
if (f.focusdirty() && k == K_TAB)
{
TFink_mask& m = (TFink_mask&)f.mask();
TToken_string& ch = m.get_chars();
ch.add(f.get(), f.dlg() - 101);
char* ch = m.get_chars();
ch[f.dlg() - 101] = f.get()[0];
m.paint_example();
}
return TRUE;

View File

@ -2169,7 +2169,7 @@ bool TPrint_section::detail_field_handler(TMask_field& f, KEY k)
for (int jj = 2; jj < des.items(); jj++)
{
CHECK (jj < (des.items() - 1), "AAARGH! LISTA special fatta col CULO!");
CHECK (jj < (des.items() - 1), "AAARGH! 'Sta LISTA special e' fatta col CULO!");
TString t1(des.get(jj++));
TString t2(des.get(jj));
codes.add(t1);
@ -2704,7 +2704,7 @@ bool TForm::parse_general(TScanner &scanner)
else scanner.push();
if (scanner.popkey() == "GR") // Carattere di posizionamento
_fink = scanner.string();
set_fincatura(scanner.string());
else scanner.push();
extended_parse_general(scanner); // Parse non-standard parameters
@ -2726,7 +2726,8 @@ void TForm::print_general(ostream& out) const
out << " INIZIO_POS " << _ipx << " " << _ipy << "\n";
out << " FINE_POS " << _fpx << "\n";
}
out << " GRID \"" << (const char*)_fink << "\"\n";
char fn[12]; strncpy(fn, _fink, 11); fn[11] = '\0';
out << " GRID \"" << (const char*)fn << "\"\n";
out << "END\n" << endl;
}
@ -3403,8 +3404,7 @@ void TForm::init()
_ipy= 0;
_fpx= 0;
_arrange= TRUE;
_fink= "+,+,+,+,+,+,+,+,+,-,|";
_fink.separator(',');
set_fincatura(printer().get_fincatura());
_dirty= FALSE;
_background_mode = printer().isgraphics() ? graphics : text;
}
@ -3479,6 +3479,13 @@ void TForm::read(const char* name, const char* code, int lev, const char* desc)
main_app().end_wait();
}
void TForm::set_fincatura(const char* s)
{
strncpy(_fink,s,sizeof(_fink));
printer().set_fincatura(_fink);
}
TForm::TForm()
{
init();

View File

@ -74,15 +74,15 @@ class TForm : public TObject
bool _arrange; // if TRUE perform arranging every time
int _editlevel; // Edit permission
TString _desc; // form description
TToken_string _fink; // finkatur characters
char _fink[11]; // finkatur characters
TPrint_section* exist(char s, pagetype t, bool create = FALSE); // Can be NULL
static void header_handler(TPrinter& p);
static void footer_handler(TPrinter& p);
TToken_string& get_fincatura() { return _fink; }
void set_fincatura(const char* s) { _fink = s; }
const char* get_fincatura() { return _fink; }
void set_fincatura(const char* s);
// come sotto ma per printsection, all'uopo di chiamarle
// con ricorsiva insistenza
@ -169,19 +169,6 @@ public:
// cambia il formato di tutti i numeri nel form
void change_number_format(int w, int dec, const char* p);
// fincazione
char f_topleft() const { return ((TToken_string&)_fink).get_char(0); }
char f_topmiddle() const { return ((TToken_string&)_fink).get_char(1); }
char f_topright() const { return ((TToken_string&)_fink).get_char(2); }
char f_botleft() const { return ((TToken_string&)_fink).get_char(3); }
char f_botmiddle() const { return ((TToken_string&)_fink).get_char(4); }
char f_botright() const { return ((TToken_string&)_fink).get_char(5); }
char f_centerleft() const { return ((TToken_string&)_fink).get_char(6); }
char f_centermiddle() const { return ((TToken_string&)_fink).get_char(7); }
char f_centerright() const { return ((TToken_string&)_fink).get_char(8); }
char f_horizontal() const { return ((TToken_string&)_fink).get_char(9); }
char f_vertical() const { return ((TToken_string&)_fink).get_char(10); }
// editor interface
TForm_editor& editor() const;

View File

@ -49,6 +49,164 @@ void printer_destroy()
}
}
// ----------------------------------------------------------------------
// TPrint_intersector
// ----------------------------------------------------------------------
// TPrint_intersector: calcola intersezioni tra elementi grafici e
// restituisce, riga per riga, i necessari caratteri di fincatura per
// finculare in modo carattere
// usata da viswin e printwin
class TPrint_intersector : public TString_array
{
const char* _fink;
char check_intersection(int x, int y, char ch);
void h_line(int x1, int y1, int len);
void v_line(int x1, int y1, int len);
// caratteri fincazione: l'ho fatto perche' e' inline
char f_topleft() const { return _fink[0]; }
char f_topmiddle() const { return _fink[1]; }
char f_topright() const { return _fink[2]; }
char f_botleft() const { return _fink[3]; }
char f_botmiddle() const { return _fink[4]; }
char f_botright() const { return _fink[5]; }
char f_centerleft() const { return _fink[6]; }
char f_centermiddle() const { return _fink[7]; }
char f_centerright() const { return _fink[8]; }
char f_horizontal() const { return _fink[9]; }
char f_vertical() const { return _fink[10]; }
public:
// aggiunge un elemento grafico
void add(TGraphic_shape s, int x1, int y1, int x2, int y2);
// aggiunge alla stringa passata i necessari caratteri, leggendo
// dalla pagina interna
const char* get_chars(int line) const;
// sbianca tutto
void clear();
TPrint_intersector(const char* fink, int pagesize) : TString_array(pagesize) , _fink(fink)
{}
virtual ~TPrint_intersector() {}
};
char TPrint_intersector::check_intersection(int x, int y, char ch)
{
char a = ' ', b = ' ', c = ' ', d = ' ';
if (y > 0 && objptr(y-1) != NULL)
b = row(y-1)[x];
if (objptr(y+1) != NULL)
d = row(y+1)[x];
if (x > 0) a = row(y)[x-1];
if (x < row(y).len()-1) c = row(y)[x+1];
if (a == ' ' && b == ' ' && c != ' ' && d != ' ')
ch = f_topleft();
else if (a == ' ' && b != ' ' && c != ' ' && d == ' ')
ch = f_botleft();
else if (a != ' ' && b != ' ' && c == ' ' && d == ' ')
ch = f_botright();
else if (a != ' ' && b == ' ' && c == ' ' && d != ' ')
ch = f_topright();
else if (a != ' ' && b != ' ' && c == ' ' && d != ' ')
ch = f_centerright();
else if (a == ' ' && b != ' ' && c != ' ' && d != ' ')
ch = f_centerleft();
else if (a != ' ' && b != ' ' && c != ' ' && d == ' ')
ch = f_botmiddle();
else if (a != ' ' && b == ' ' && c != ' ' && d != ' ')
ch = f_topmiddle();
else if ((a != ' ' && b != ' ' && c != ' ' && d != ' ') ||
((a != ' ' && b == ' ' && c != ' ' && d == ' ') && ch == f_vertical()) ||
((a == ' ' && b != ' ' && c == ' ' && d != ' ') && ch == f_horizontal()))
ch = f_centermiddle();
return ch;
}
void TPrint_intersector::h_line(int x1, int y1, int len)
{
if (objptr(y1) == NULL)
{
TString* ss = new TString(256);
ss->spaces();
TArray::add(ss, y1);
}
TString& s = row(y1);
for (int i = x1; i < x1+len; i++)
s[i] = f_horizontal();
for (i = x1; i < x1+len; i++)
s[i] = check_intersection(i, y1, f_horizontal());
}
void TPrint_intersector::v_line(int x1, int y1, int len)
{
for (int i = y1; i < y1+len; i++)
{
if (objptr(i) == NULL)
{
TString* ss = new TString(256);
ss->spaces();
TArray::add(ss, i);
}
row(i)[x1] = f_vertical();
}
for (i = y1; i < y1+len; i++)
row(i)[x1] = check_intersection(x1, i, f_vertical());
}
void TPrint_intersector::add(TGraphic_shape s, int x1, int y1, int x2, int y2)
{
// rows/columns start at 0
x1 --; y1 --;
x2 --; y2 --;
switch (s)
{
case line:
if (x1 == x2) // vertical
v_line(x1, y1, y2-y1+1);
else if (y1 == y2) // horizontal
h_line(x1,y1, x2-x1+1);
else error_box("Linee oblique non supportate in modalita' testo");
break;
case box:
h_line(x1, y1, x2-x1+1);
h_line(x1, y2, x2-x1+1);
v_line(x1, y1, y2-y1+1);
v_line(x2, y1, y2-y1+1);
break;
default:
break;
}
}
const char* TPrint_intersector::get_chars(int line) const
{
if (objptr(line) == NULL)
return "";
else
return row(line);
}
void TPrint_intersector::clear()
{
for (int i = 0; i < items(); i++)
{
TString* s = (TString*)objptr(i);
if (s != NULL)
s->spaces();
}
}
///////////////////////////////////////////////////////////
// PrDesc
///////////////////////////////////////////////////////////
@ -122,6 +280,11 @@ void TPrinter::parse_background(const char* bg_desc, TArray& background)
TToken_string tt;
TFilename bmp;
if (!_isgraphics && _finker == NULL)
_finker = new TPrint_intersector(_fink, _formlen);
else if (_finker)
_finker->clear();
while ((ch = bg_desc[cnt++]) != '\0')
{
op = ch;
@ -136,7 +299,6 @@ void TPrinter::parse_background(const char* bg_desc, TArray& background)
continue; // ignore whitespace
break;
case 'i':
tt << op;
cnt++;
for (x1 = 0; bg_desc[cnt] != ','; x1++)
bmp[x1] = bg_desc[cnt++];
@ -148,11 +310,15 @@ void TPrinter::parse_background(const char* bg_desc, TArray& background)
read_int(bg_desc, x2, cnt); if (x2 <= 0) x2 = formwidth();
read_int(bg_desc, y2, cnt); if (y2 <= 0) y2 = formlen();
cnt++;
tt.add(id);
tt.add(x1);
tt.add(y1);
tt.add(x2);
tt.add(y2);
if (_isgraphics)
{
tt << op;
tt.add(id);
tt.add(x1);
tt.add(y1);
tt.add(x2);
tt.add(y2);
}
break;
case 'l': // line
@ -165,11 +331,19 @@ void TPrinter::parse_background(const char* bg_desc, TArray& background)
read_int (bg_desc, x2, cnt);
read_int (bg_desc, y2, cnt);
cnt++; // skip separator
tt << op;
tt.add (x1 - 1);
tt.add (y1 - 1);
tt.add (x2 - 1);
tt.add (y2 - 1);
if (_isgraphics)
{
tt << op;
tt.add (x1 - 1);
tt.add (y1 - 1);
tt.add (x2 - 1);
tt.add (y2 - 1);
}
else
{
TGraphic_shape s = op == 'b' ? box : line;
_finker->add(s, x1, y1, x2, y2);
}
break;
case 't': // text
cnt++;
@ -900,9 +1074,14 @@ TPrinter::TPrinter()
_curprn = pn2.get_pos(p1);
CHECKS(_curprn >= 0, "Can't find printer ", (const char*)p1);
set_fincatura("+++++++++-|");
#else
_isgraphics = FALSE;
#endif
if (_isgraphics)
_finker = NULL;
else _finker = new TPrint_intersector(_fink, _formlen);
}
TToken_string& TPrinter::getprinternames ()
@ -1978,6 +2157,9 @@ bool TFile_printer::set ()
return ok;
}
//
// TFile printer fine
//
const char* TPrinter::background_chars(int l) const
{
return _finker == NULL ? "" : _finker->get_chars(l);
}

View File

@ -37,6 +37,12 @@ enum TPrtype
export = 6 // @emem Esporatzione di stampa
};
enum TGraphic_shape
{
line,
box
};
// @class TPrintrow | Classe per la definizione della stampa di una riga
//
@ -193,6 +199,7 @@ public:
class TPrinter;
class TPrint_intersector;
// @type PRINTSECTIONHANDLER | Funzione definita dall'utente chiamata all'inizio della stampa
// dell'header o del footer
@ -201,6 +208,7 @@ typedef void (*PRINTSECTIONHANDLER)(TPrinter& printer);
typedef void (*LINKHANDLER)(int, const char*);
class TViswin;
// @class TPrinter | Classe per la definzione delle operazioni sulla stampante
@ -318,6 +326,14 @@ class TPrinter : public TObject
// @cmember Header del link ipertestuale
LINKHANDLER _linkhandler;
// @cmember caratteri per fincatura
char _fink[11];
// @cmember fincatore per modo testo
TPrint_intersector* _finker;
// @access Protected Member
protected:
// @cmember Ritorna il carattere di newline
@ -481,6 +497,23 @@ public:
bool ismultiplelink()
{ return _multiple_link; }
const char* get_fincatura() { return _fink; }
void set_fincatura(const char* s) { strncpy(_fink, s, sizeof(_fink)); }
// caratteri fincazione
char f_topleft() const { return _fink[0]; }
char f_topmiddle() const { return _fink[1]; }
char f_topright() const { return _fink[2]; }
char f_botleft() const { return _fink[3]; }
char f_botmiddle() const { return _fink[4]; }
char f_botright() const { return _fink[5]; }
char f_centerleft() const { return _fink[6]; }
char f_centermiddle() const { return _fink[7]; }
char f_centerright() const { return _fink[8]; }
char f_horizontal() const { return _fink[9]; }
char f_vertical() const { return _fink[10]; }
// @cmember Permette di saltare alcune righe dalla posizione corrente
bool skip (int linetoskip);
// @cmember Permette di saltare alla riga indicata
@ -557,6 +590,8 @@ public:
int get_dots_per_line() const { return _dots_per_line; }
// @cmember Ritorna se la stampante e' abilitata a stampare grafica
bool isgraphics() const { return _isgraphics; }
// @cmember ritorna la riga di background se si stampa in modo testo
const char* background_chars(int l) const;
// @cmember Ritorna la dimensione dei caratteri da stampare
int get_char_size() const
@ -722,4 +757,5 @@ TPrinter& printer();
// @func Distrugge la stampante corrente
void printer_destroy();
#endif // __PRINTER_H

View File

@ -35,10 +35,7 @@ HIDDEN int LEN_SPACES(WINDOW win, int x)
void TPrintwin::paint_background(long j)
{
const bool isbackground = _bg->items() > 0 && printer().isgraphics();
if (!isbackground) return;
int rw = (int)(j % _formlen);
TString& rwd = (TString&)(*_bg)[rw];
int cnt = 0; char ch;
char curcol = 'n';
@ -49,6 +46,17 @@ void TPrintwin::paint_background(long j)
unsigned int x1, y1, x2, y2, id;
PNT b, e;
if (!printer().isgraphics())
{
const char* line = printer().background_chars(rw);
set_color (COLOR_BLACK, COLOR_WHITE);
printat (_hofs, (int)j, "%s", line);
return;
}
if (!isbackground) return;
TString& rwd = (TString&)(*_bg)[rw];
while (ch = rwd[cnt++])
{
switch(ch)
@ -193,7 +201,7 @@ void TPrintwin::paint_row(long j)
{
int len = 0;
for (const char * end = beg; *end && (*end != ' ' || *(end+1) != ' '); end++)
len++; // Misura sringa da stampare
len++; // Misura stringa da stampare
xvt_dwin_draw_text(win(), _hofs + LEN_SPACES(win(), pos), y, (char*)beg, len);
pos += len;
beg = end;
@ -205,9 +213,9 @@ void TPrintwin::paint_row(long j)
set_font(printer().fontname(), XVT_FS_NONE, _char_size);
TString s(_txt.line(j));
#if XVT_OS == XVT_OS_WIN
if ((j % _realformlen) == 0 && (j != 0)) // Questa e' la patch per TTY.DRV.
if ((j % _realformlen) == 0 && (j != 0)) // Questo e' il patch per TTY.DRV.
s.insert("\n"); // Quando uscira' un nuovo driver, si dovra' controllare
#endif // se esiste ancora questo piccolo bug.
#endif // se esiste ancora questo piccolo bigol.
xvt_dwin_draw_text(win(), 0, y, (char*)(const char*)s, -1);
}
}

View File

@ -676,20 +676,28 @@ void TViswin::paint_screen ()
// j = riga totale, row = riga a video
// @mfunc Permette di stampare i colori di bakcground
// @mfunc Permette di stampare il background
void TViswin::paint_background (
long j, // @parm Numero della riga di cui stamparne il bakcground
int row) // @parm Numero della riga a video sulla quale vine stampato il backgropund
long j, // @parm Numero della riga di cui stampare il background
int row) // @parm Numero della riga a video sulla quale viene stampato il background
{
const int rw = (int) (j % (long) _formlen);
const int ox = (int)origin().x;
const int mx = ox + columns();
if (!printer().isgraphics())
{
const char* line = printer().background_chars(rw);
set_color (COLOR_BLACK, COLOR_WHITE);
if (line != NULL && (int)strlen(line) > ox)
printat (X_OFFSET, row, "%s", &line[ox]);
return;
}
if (_bg->items() == 0)
return;
const int rw = (int) (j % (long) _formlen);
const TString& rwd = (TString &)(*_bg)[rw];
const int ox = (int)origin().x;
const int mx = ox + columns();
char curcol = 'n';
char curpen = 'n';
char curpat = 'n';
@ -712,8 +720,8 @@ void TViswin::paint_background (
b.h = e.h = tabx(2*x1+1) / 2;
b.v = taby(row);
e.v = taby(row + 1);
xvt_dwin_draw_set_pos (win (), b);
xvt_dwin_draw_line (win (), e);
xvt_dwin_draw_set_pos (win(), b);
xvt_dwin_draw_line (win(), e);
}
break;
case 'o': // verticale pezzo sopra