From c872f8ceb5f531b5fee8645231e589b7e3664c04 Mon Sep 17 00:00:00 2001 From: villa Date: Fri, 22 Dec 1995 12:01:15 +0000 Subject: [PATCH] Linee e box in modo testo git-svn-id: svn://10.65.10.50/trunk@2334 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ba/baformed.cpp | 47 +++++----- include/form.cpp | 19 ++-- include/form.h | 19 +--- include/printer.cpp | 216 +++++++++++++++++++++++++++++++++++++++---- include/printer.h | 38 +++++++- include/printwin.cpp | 22 +++-- include/viswin.cpp | 28 ++++-- 7 files changed, 309 insertions(+), 80 deletions(-) diff --git a/ba/baformed.cpp b/ba/baformed.cpp index 8807eeffb..6a31ccb91 100755 --- a/ba/baformed.cpp +++ b/ba/baformed.cpp @@ -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; @@ -276,7 +277,7 @@ bool TForm_editor::menu(MENU_TAG tag) } void TForm_editor::print() -{ +{ _form->print(); } diff --git a/include/form.cpp b/include/form.cpp index 8261382a6..731047669 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -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 @@ -2725,8 +2725,9 @@ void TForm::print_general(ostream& out) const out << " CARATTERE \"" << _char_to_pos << "\"\n" ; 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(); diff --git a/include/form.h b/include/form.h index 42fdf7dfa..d474aaa8d 100755 --- a/include/form.h +++ b/include/form.h @@ -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; diff --git a/include/printer.cpp b/include/printer.cpp index 4abc830e0..7786fbe6a 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -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++; @@ -202,7 +376,7 @@ void TPrinter::parse_background(const char* bg_desc, TArray& background) } pix.add (tt); } - + // now build row descriptions // colors are listed in printapp: @@ -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 +#endif + if (_isgraphics) + _finker = NULL; + else _finker = new TPrint_intersector(_fink, _formlen); } TToken_string& TPrinter::getprinternames () @@ -1977,7 +2156,10 @@ bool TFile_printer::set () return ok; } - -// -// TFile printer fine -// + +const char* TPrinter::background_chars(int l) const +{ + return _finker == NULL ? "" : _finker->get_chars(l); +} + + diff --git a/include/printer.h b/include/printer.h index d3aa47e2e..629fd6765 100755 --- a/include/printer.h +++ b/include/printer.h @@ -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,7 +590,9 @@ 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 { return _ch_size; } @@ -722,4 +757,5 @@ TPrinter& printer(); // @func Distrugge la stampante corrente void printer_destroy(); + #endif // __PRINTER_H diff --git a/include/printwin.cpp b/include/printwin.cpp index 5eeaccadd..ef54eec7d 100755 --- a/include/printwin.cpp +++ b/include/printwin.cpp @@ -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'; @@ -48,7 +45,18 @@ 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); } } diff --git a/include/viswin.cpp b/include/viswin.cpp index dcd46ed53..02da225f0 100755 --- a/include/viswin.cpp +++ b/include/viswin.cpp @@ -676,19 +676,27 @@ 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'; @@ -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