campo-sirio/include/viswin.cpp
guy 55a36762ef archives.cpp Tolto include windows.h
checks.cpp      Tolto include windows.h
colors.cpp      Tolto include windows.h
controls.cpp    Aggiunto cambiamento del font runtime dei TText_control
execp.cpp       Tolto include windows.h
form.cpp        Tolto include windows.h
mask.cpp        Corretta formattazione di due righe
maskfld.cpp     Aggiunto messaggio CHECK
msksheet.cpp    Tolto include windows.h
relapp.cpp      Tolto include windows.h
strings.pp      Corretto CHECK della TFixed_string::format()
viswin.cpp      Tolto include windows.h
window.cpp      Tolto include windows.h
xvtility.cpp    Corretto calcolo altezza righe delle maschere


git-svn-id: svn://10.65.10.50/trunk@4085 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-01-17 11:07:43 +00:00

2779 lines
68 KiB
C++
Executable File

#define XVT_INCL_NATIVE
#define STRICT
#include <browfile.h>
#include <colors.h>
#include <config.h>
#include <controls.h>
#include <execp.h>
#include <mailbox.h>
#include <printapp.h>
#include <urldefid.h>
#include <viswin.h>
#include <xvtility.h>
#include <bagn005.h>
const char* const PRINT_FONT = XVT_FFN_FIXED;
const int PRINT_HEIGHT = 10;
#define BUTTONROW_SIZE (_showbuts ? 3 : 0)
#define X_OFFSET (_rulers ? 6 : 1)
#define Y_OFFSET (_rulers ? 1 : 0)
#define TEXTROWS (rows() - Y_OFFSET - BUTTONROW_SIZE)
#define TEXTCOLUMNS (columns() - X_OFFSET)
#define DLG_QUIT_TITLE "Fine"
#define DLG_EDIT_TITLE "~Edit"
#define DLG_LINK_TITLE "Colle~ga"
#define DLG_PRINT_TITLE "~Stampa"
#define BACKGROUND (_toplevel ? MASK_BACK_COLOR : COLOR_GRAY)
#define FOREGROUND (_toplevel ? COLOR_BLACK : COLOR_WHITE)
#define K_CTRL_DOWN (K_CTRL + K_DOWN)
#define K_CTRL_UP (K_CTRL + K_UP)
#define K_SHIFT_UP (K_SHIFT + K_UP)
#define K_SHIFT_DOWN (K_SHIFT + K_DOWN)
#define K_SHIFT_LEFT (K_SHIFT + K_LEFT)
#define K_SHIFT_RIGHT (K_SHIFT + K_RIGHT)
#define K_ALT_RIGHT (K_CTRL + 'K')
#define K_ALT_LEFT (K_CTRL + 'L')
#define CTRL_C (K_CTRL + 'C')
#define CTRL_G (K_CTRL + 'G')
#define CTRL_E (K_CTRL + 'E')
#define CTRL_S (K_CTRL + 'S')
#define CTRL_R (K_CTRL + 'R')
// vista la mania degli 883, eccoti un po' di concerti di Mozart
const long E_ADDLINE_ONSCREEN = 467L;
const long E_ADDLINE = 488L;
HIDDEN bool in_update;
class _BkMenuItem : public TObject
{
public:
TString _txt;
TArray* _arr;
int _id; // per comodita'
_BkMenuItem(const char* t = "")
{ _txt = t; _arr = NULL; }
virtual ~_BkMenuItem()
{ if (_arr != NULL) delete _arr; }
};
class _BkMenuDesc : public TObject
{
public:
TString_array _menu;
int _father_id;
_BkMenuDesc() {}
virtual ~_BkMenuDesc() {}
};
int TViswin::tabx(int x) const
{
HIDDEN long w = 0L;
if (w == 0L)
{
TString256 t; t.spaces(256);
w = xvt_dwin_get_text_width(win(), (char*)(const char*)t, 256);
}
return int((w*x) >> 8);
}
int TViswin::taby(int y) const
{
return y * CHARY;
}
// @doc INTERNAL
// @mfunc Abilita/Disabilita una voce di menu'
void TViswin::check_menu_item(
MENU_TAG item, // @parm Voce del menu' da abilitare
bool on) // @parm Operazione da svolgere sulla voce di menu':
// @flag TRUE | Viene abilitata la voce
// @flag TRUE | Viene disabilitata la voce
{
xvt_menu_set_item_checked(win(), item, on);
xvt_menu_update(win());
}
void TViswin::enable_menu_item(MENU_TAG item, bool on)
{
xvt_menu_set_item_enabled(win(), item, on);
xvt_menu_update(win());
}
HIDDEN _BkMenuItem* find_menu_node(TArray& tree, int id)
{
_BkMenuItem* fnd = NULL;
for (int m = 0; m < tree.items(); m++)
{
_BkMenuItem& bkit = (_BkMenuItem&) tree[m];
if (bkit._id == id)
return &bkit;
else if (bkit._arr != NULL)
{
if ((fnd = find_menu_node(*(bkit._arr), id)) != NULL)
break;
}
}
return fnd;
}
HIDDEN void build_menu_tree(TArray& flat, TArray& tree, int level)
{
// find ID in flat array
_BkMenuDesc* bds = NULL;
for (int i = 0; i < flat.items(); i++)
{
_BkMenuDesc& bdss = (_BkMenuDesc&)flat[i];
if (bdss._father_id == 1000 + level)
{
bds = &bdss;
break;
}
}
if (bds == NULL)
{
bds = new _BkMenuDesc;
bds->_father_id = 1000 + level;
flat.add(bds);
}
for (i = 0; i < tree.items(); i++)
{
_BkMenuItem& bki = (_BkMenuItem&)tree[i];
bds->_menu.add(bki._txt);
if (bki._arr != NULL)
build_menu_tree(flat, *(bki._arr), bki._id);
}
}
void TViswin::build_index_menu()
{
if (_menu_present) return;
// builds bk_menu tree and index menu
TArray bk_tree;
TToken_string tt(128);
// build tree
for (int i = 0; i < _bookmarks->items(); i++)
{
BkDef& bkd = (BkDef&)(*_bookmarks)[i];
tt.format("%d", bkd._id + 1000);
tt.add(bkd._txt);
_BkMenuItem* bkit = new _BkMenuItem((const char*)tt);
bkit->_id = bkd._id;
int father_id = bkd._father_id == -1 ? 0 : bkd._father_id;
if (father_id == 0) // toplevel
bk_tree.add(bkit);
else
{
_BkMenuItem* father = find_menu_node(bk_tree, father_id);
if (father != NULL)
{
if (father->_arr == NULL)
father->_arr = new TArray(4);
father->_arr->add(bkit);
}
}
}
// build menu
if (bk_tree.items() > 0)
{
TString_array top(1); top.add("1000|Indice");
add_menu(top);
}
TArray flat(4);
build_menu_tree(flat, bk_tree, 0);
for (i = 0; i < flat.items(); i++)
{
_BkMenuDesc& bds = (_BkMenuDesc&)flat[i];
if (bds._menu.items() > 0)
add_menu(bds._menu, bds._father_id);
}
_menu_present = TRUE;
}
void TViswin::exec_link()
{
if (_linkID != -1)
{
if (!_toplevel)
{
// link da browsefile_field
MASK_LINKHANDLER pl = _brwfld->_lh;
if (pl != NULL)
pl(_brwfld->mask(), _linkID,
_multiple ? (const char*)_multiple_link : (const char*)_linktxt, TRUE);
}
else
{
LINKHANDLER pl = printer().getlinkhandler();
if (pl)
pl(_linkID, _multiple ? (const char*)_multiple_link :
(const char*)_linktxt);
// dai opzione per rifare la stampa se e' arrivato un messaggio
// dall'applicazione chiamata
// schiaffa indi il tutto in una funzione
TMailbox m;
if (m.next_s(MSG_LN) != NULL)
{
if (yesno_box("Si desidera riaggiornare la stampa?"))
{
((TPrint_application&)main_app()).repeat_print();
((TPrint_application&)main_app()).current_cursor()->freeze(FALSE);
xvt_statbar_refresh ();
stop_run(K_ENTER);
}
}
} // _toplevel
if (_toplevel)
{
set_focus();
_inside_linkexec = TRUE;
check_link();
_need_update = TRUE;
force_update();
do_events();
check_link (&_point);
_inside_linkexec = FALSE;
}
} // linkID != -1
else beep();
}
void TViswin::display_link (long y, long x1, long x2, const char *d)
{
if (!_link_displayed)
{
paint_link (y, x1, x2);
_link_displayed = TRUE;
if (in_update) return;
TString80 dd; dd.strncpy(d, 50);
xvt_statbar_set(dd);
if (_link_button)
{
if (_showbuts) _link_button->enable();
if (_toplevel) enable_menu_item(M_EDIT_CUT, TRUE);
}
if (!_toplevel && !_inside_linkexec)
{
// chiama l'handler per maschere con FALSE come terzo parametro
MASK_LINKHANDLER pl = _brwfld->_lh;
if (pl != NULL)
pl(_brwfld->mask(), _linkID,
_multiple ? (const char*)_multiple_link : (const char*)_linktxt, FALSE);
}
}
}
// @doc INTERNAL
// @mfunc Cancella il link
void TViswin::erase_link (
long y, // @parm Altezza del link da disegnare
long x1, // @parm Prima coordinata x del link da cancellare
long x2) // @parm Seconda coordinata x del link da cancellare
{
if (_link_displayed)
{
paint_link (y, x1, x2);
_link_displayed = FALSE;
if (in_update) return;
if (!in_update)
{
xvt_statbar_set("");
xvt_statbar_refresh();
}
if (_link_button)
{
if (_showbuts) _link_button->disable();
if (_toplevel) enable_menu_item(M_EDIT_CUT, FALSE);
}
}
}
// @doc INTERNAL
// @mfunc Disegna il link
void TViswin::paint_link (
long y, // @parm Altezza del link da disegnare
long x1, // @parm Prima coordinata x del link da disegnare
long x2) // @parm Seconda coordinata x del link da disegnare
{
if (adjust_box (x1, x2, y))
invert_bar ((int)(x1 + (long)X_OFFSET), (int)(y + (long)Y_OFFSET),
(int)(x2 + (long)X_OFFSET), (int)(y + (long)Y_OFFSET+1l));
}
// @doc INTERNAL
// @mfunc Modifica le dimensione di un box
// @rdesc Ritorna se sono state modificate le dimensioni del box:
// @flag TRUE | Sono state riassegnate le coordinate a <p x1> e <p x2>
// @flag FALSE | Non sono state riassegnate le misure del box poiche' <p y> e' nel testo
bool TViswin::adjust_box (
long &x1, // @parm Prima coordinata da riassegnare
long &x2, // @parm Seconda coordinata da riassegnare
long y) // @parm Valore della riga che deve essere nel testo
// @comm Sistema <p x1> e <p x2> in modo che il minore sia il primo, e controlla che <p y> sia
// nel testo (box e' su una sola riga, usata solo per i link)
{
if (y < origin ().y || y > origin ().y + _textrows)
return FALSE;
if (origin ().x > x1)
x1 = origin ().x;
if (origin ().x + _textcolumns < x2)
x2 = origin ().x + _textcolumns;
return TRUE;
}
// @doc INTERNAL
// @mfunc Controlla se la posizione cursore <p where> cade su un link ipertestuale e si
// comporta di conseguenza
// @rdesc Ritorna se la posizione cade sul link
// @flag TRUE | Se ha constatato la corrispondenza
// @flag FALSE | Se non ha constatato la corrispondenza
bool TViswin::check_link (
TPoint * p) // @parm Posizione del cursore (default NULL)
// @comm Se <p p> e' NULL indica la posizione corrente del cursore
{
static char descr[128], pdescr[128];
static int old_id = -1, plinkID = -1;
static long y, x1, x2;
static long py, px1, px2;
if (p == NULL) // erase and go
{
if (old_id != -1)
{
erase_link (y, x1, x2);
old_id = _linkID = plinkID = -1;
py = px1 = px2 = x1 = y = x2 = 0l;
}
return FALSE;
}
// poi se e' il caso lo si risistema
if (p == &_point)
plinkID = -1;
for (int i = 0; i < _hotspots->items (); i++)
{
TToken_string & t = (TToken_string &) (*_hotspots)[i];
t.restart ();
long ty = t.get_long ();
long tx1 = t.get_long ();
long tx2 = t.get_long ();
if (p->y == ty && p->x < tx2 && p->x >= tx1)
{
// ci siamo
int id = (int) t.get_long (4);
if (ty != y || tx1 != x1 || tx2 != x2)
{
if (old_id != -1)
erase_link (y, x1, x2);
TToken_string & ttt = (TToken_string &) (*_links)[id];
ttt.restart ();
strcpy (descr, ttt.get ());
strcat (descr, t.get (3));
_linktxt = t.get(3);
if (_multiple)
{
// get all parts of the same color
const char *cp;
_txt.read_line (ty);
_multiple_link = "";
while (cp = _txt.piece ())
{
if (_txt.get_foreground () == *(ttt.get (1)) &&
_txt.get_background () == *(ttt.get (2)))
_multiple_link.add (cp);
}
}
old_id = _linkID = id;
y = ty;
x1 = tx1;
x2 = tx2;
display_link (y, x1, x2, descr);
}
if (p == &_point)
{
strcpy (pdescr, descr);
plinkID = id;
px1 = x1;
px2 = x2;
py = y;
}
return TRUE;
}
}
// non sono su un bottone: puo' esserci il point
if (old_id != -1 && plinkID == -1)
{
old_id = _linkID = -1;
erase_link (y, x1, x2);
x1 = x2 = y = 0l;
}
// se point e' su un bottone, evidenzia quello
else if (plinkID != -1 && (x1 != px1 || x2 != px2 || y != py))
{
// erase old one
erase_link (y, x1, x2);
old_id = _linkID = plinkID;
x1 = px1;
x2 = px2;
y = py;
strcpy (descr, pdescr);
display_link (y, x1, x2, descr);
return TRUE;
}
return FALSE;
}
bool TViswin::in_text (const TPoint & p) const
{
if (p.x > (X_OFFSET - 1) && p.x < columns() &&
p.y > (Y_OFFSET - 1) && p.y < (rows() - BUTTONROW_SIZE))
return TRUE;
return FALSE;
}
// @doc INTERNAL
// @mfunc Indica se occorre ridisegnare la selezione
//
// @rdesc Ritorna se e' necessario ridipingere la selezione
bool TViswin::need_paint_sel (
bool smart) // @parm Indica se ridisegnarla in ogni caso
//
// @flag TRUE | Indica il ridisegno solamente se e' necessario
// @flag FALSE | Indica il ridisegno in ogni caso
{
TPoint p1, p2;
adjust_selection (p1, p2);
long end = origin ().y + _textrows;
bool r = _isselection;
if (smart)
r = r && (
(origin ().y >= p1.y - 1 && origin ().y <= p2.y + 1) ||
(end >= p1.y - 1 && end <= p2.y + 1));
return r;
}
void TViswin::erase_selection ()
{
if (_sel_displayed)
paint_selection ();
_sel_displayed = FALSE;
if (_toplevel)
enable_menu_item(M_EDIT_COPY, FALSE);
}
void TViswin::display_selection ()
{
if (!_sel_displayed)
paint_selection ();
_sel_displayed = TRUE;
if (_toplevel)
enable_menu_item(M_EDIT_COPY, TRUE);
}
// @doc INTERNAL
// @mfunc Riposizona inizio e fine della selezione
void TViswin::adjust_selection (
TPoint & p1, // @parm Primo punto per il riposizionamento della selezione
TPoint & p2) // @parm Secondo punto per il riposizionamento della selezione
// @comm Viene asseganto a <p p1> e <p p2> le coordinate di inizio e fine selezione
{
if (_sel_start.y < _sel_end.y)
{
p1 = _sel_start;
p2 = _sel_end;
}
else
{
p1 = _sel_end;
p2 = _sel_start;
}
}
void TViswin::shift_screen(scroll dir)
{
RCT r;
if (_scrolling)
return;
_scrolling = TRUE;
// origin() e' gia' stata modificata
switch (dir)
{
case up:
case down:
xvt_rect_set(&r, 0, taby(Y_OFFSET)/*+1*/,
tabx(int(_textcolumns) + X_OFFSET), taby(int(_textrows) + Y_OFFSET));
xvt_dwin_scroll_rect (win(), &r, 0, dir == down ? taby(1) : -taby(1));
paint_row (dir == up ? origin ().y + _textrows - 1 : origin ().y);
break;
case left:
case right:
xvt_rect_set(&r,
tabx(X_OFFSET), 0,
tabx(int(_textcolumns) + X_OFFSET)/* + 2*/,
taby(int(_textrows) + 1)/* - 2*/);
xvt_dwin_scroll_rect (win (), &r, dir == right ? tabx(1) : -tabx(1), 0);
paint_column (dir == left ? origin ().x + _textcolumns - 1 : origin ().x, dir == left);
break;
default:
break;
}
_scrolling = FALSE;
}
// @doc INTERNAL
// @mfunc Aggiunge un bottone alla finestra
//
// @rdesc Ritorna un puntatore al bottone (TControl) aggiunto
TPushbutton_control* TViswin::add_button (
short id, // @parm Identificatore del bottone da aggiungere
const char *caption, // @parm Testo del bottone da aggiungere
short bup, // @parm Identificatore della bitmap normale
short bdn) // @parm Identificatore della bitmap pramuta
// @comm Aggiunge i bottoni nella finestra
{
TPushbutton_control* b = new TPushbutton_control(win(), id, -11, -1, 11, 2, "",
caption, bup, bdn);
// ridimensiona sempre uguale dato che sono tutte bitmap
RCT br; b->get_rect(br);
br.top = br.bottom - taby(2);
b->set_rect(br);
_button.add(b);
return b;
}
void TViswin::repos_buttons ()
{
if (_toplevel)
{
// autoscroll(FALSE);
// set_mode(M_COPY);
// set_brush(BACKGROUND);
// bar(5, rows()-BUTTONROW_SIZE, columns()+1, rows()+1);
// autoscroll(TRUE);
for (int i = 0; i < _modules.items(); i++)
((TImage&)_modules[i]).set_pos(4, 4+int(rows()-BUTTONROW_SIZE)*CHARY);
const int buttons = _button.items();
if (buttons > 0)
{
RCT br; ((TPushbutton_control&)_button[0]).get_rect(br);
const short width = br.right - br.left;
RCT wr; xvt_vobj_get_client_rect(win(), &wr);
int space = ((wr.right - wr.left) - buttons * (br.right-br.left)) / (buttons + 1);
if (space < 0)
space = 0;
int x = space;
const int y = (wr.bottom - wr.top) - (br.bottom - br.top) - XI_FU_MULTIPLE;
for (int b = 0; b < buttons; b++)
{
const PNT p = { y, x };
xvt_rect_set_pos(&br, p);
((TPushbutton_control&)_button[b]).set_rect(br);
x += space + width;
}
}
}
}
void TViswin::open ()
{
set_scroll_max (MAXLEN, _txt.lines () <= _textrows ? _txt.lines () : _txt.lines () - _textrows);
repos_buttons();
TScroll_window::open();
show_buttons(_showbuts);
_need_update = TRUE;
force_update ();
}
// prints the window contents
void TViswin::paint_screen ()
{
bool first = TRUE;
for (long j = 0; j < _textrows; j++)
{
const long rw = origin ().y + j;
if (rw < _txt.lines ())
paint_row (rw);
else if (!_isopen)
{
autoscroll (FALSE);
set_mode (M_COPY);
set_pen (COLOR_BLACK);
PNT b, e;
b.h = tabx(X_OFFSET-1);
b.v = taby((int)(j + (long)Y_OFFSET - origin().y))/* -2 *****/;
e.h = tabx(columns());
e.v = b.v;
xvt_dwin_draw_set_pos(win(), b);
xvt_dwin_draw_line(win(), e);
set_pen (COLOR_LTGRAY);
e.v++;
b.v++;
xvt_dwin_draw_set_pos (win (), b);
xvt_dwin_draw_line (win (), e);
set_brush (COLOR_DKGRAY);
bar (X_OFFSET-1, (int)(j+(long)Y_OFFSET-origin().y),
(int)columns()+1, (int)(rows()-(long)BUTTONROW_SIZE));
autoscroll (TRUE);
break;
}
}
}
// @doc INTERNAL
// @mfunc Permette di stampare il background
void TViswin::paint_background(
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 TString& rwd = (TString &)(*_bg)[rw];
char curcol = 'n';
char curpen = 'n';
char curpat = 'n';
char curwid = '1';
int x1, x2, y1, y2, id;
PNT b, e;
int cnt = 0;
char ch;
bool isbeg = FALSE;
bool isend = FALSE;
while ((ch = rwd[cnt++]) != '\0')
{
switch (ch)
{
case 'v': // verticale intera
x1 = (byte)rwd[cnt++];
if (x1 >= ox && x1 <= mx)
{
x1 += (X_OFFSET-1) - ox;
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);
}
break;
case 'o': // verticale pezzo sopra
x1 = (byte)rwd[cnt++];
if (x1 >= ox && x1 <= mx)
{
x1 += (X_OFFSET -1) - ox;
b.h = e.h = tabx(2*x1+1) / 2;
b.v = taby(row);
e.v = taby(2*row+1)/2;
xvt_dwin_draw_set_pos (win(), b);
xvt_dwin_draw_line (win(), e);
}
break;
case 'u': // verticale pezzo sotto
x1 = (byte)rwd[cnt++];
if (x1 >= ox && x1 <= mx)
{
x1 += (X_OFFSET -1) - ox;
b.h = e.h = tabx(2*x1+1)/2;
b.v = taby(2*row+1)/2;
e.v = taby(row + 1);
xvt_dwin_draw_set_pos(win(), b);
xvt_dwin_draw_line(win(), e);
}
break;
case 'h': // orizzontale intera
// x1 = (byte) rwd[cnt++] + (X_OFFSET -1) - ox;
// x2 = (byte) rwd[cnt++] + (X_OFFSET -1) - ox;
x1 = (byte) rwd[cnt++];
x2 = (byte) rwd[cnt++];
if (x1 <= mx && x2 >= ox)
{
x1 += (X_OFFSET -1) - ox;
if (x1 < X_OFFSET) x1 = X_OFFSET;
x2 += (X_OFFSET -1) - ox;
b.v = e.v = taby(2*row+1) / 2;
b.h = tabx(x1);
e.h = tabx(x2 + 1);
xvt_dwin_draw_set_pos(win(), b);
xvt_dwin_draw_line(win(), e);
}
break;
case 'r': // orizzontale scorciata agli estremi
x1 = (byte) rwd[cnt++];
x2 = (byte) rwd[cnt++];
isbeg = ox <= (x1-1);
isend = mx >= (x2-1);
if (x1 <= mx && x2 >= ox)
{
x1 += (X_OFFSET -1) - ox;
if (x1 < X_OFFSET) x1 = X_OFFSET;
x2 += (X_OFFSET -1) - ox;
b.v = e.v = taby(2*row+1) / 2;
if (isbeg) b.h = tabx(2*x1+1) / 2;
else b.h = tabx(x1);
if (isend) e.h = tabx(2*x2+1) / 2;
else e.h = tabx(x2 +1);
xvt_dwin_draw_set_pos(win(), b);
xvt_dwin_draw_line(win(), e);
}
break;
case 'i':
id = (byte)(rwd[cnt++])-1; // Numero immagine
y1 = (byte)(rwd[cnt++])-1; // Riga sorgente
x1 = (byte)(rwd[cnt++])-1; // Colonna destinazione
x2 = (byte)(rwd[cnt++]); // Larghezza destinazione (in caratteri)
y2 = (byte)(rwd[cnt++]); // Altezza destinazione (in caratteri)
if (id >= 0)
{
const int width = tabx(x2);
TImage* i = (TImage*)_images.objptr(id);
if (i == NULL && y1 == 0)
{
const TString_array& a = printer().image_names();
const TImage src(a.row(id));
if (src.ok())
{
i = new TImage(src, width, y2*CHARY);
_images.add(i, id);
}
}
if (i && i->ok())
{
short delta = tabx(short(origin().x - x1)); // Primo pixel sorgente
if (delta < 0) delta = 0;
if (delta < width)
{
const int scroll = (row == 1) ? 2 : 0;
PNT p; p.h = delta; p.v = taby(y1);
RCT src; xvt_rect_set(&src, p.h, p.v, width, min(p.v+taby(1)+scroll , i->height()));
if (src.top < i->height())
{
short px = short(x1-origin().x);
if (px < 0) px = 0; px += X_OFFSET;
p.h = tabx(px); p.v = taby(row);
RCT dst = src; xvt_rect_set_pos(&dst, p);
i->draw(win(), dst, src);
}
}
}
}
break;
case 'W':
curwid = rwd[cnt++];
set_pen (trans_color (curcol), curwid - '0', trans_brush (curpat),
trans_pen (curpen));
break;
case 'P':
curpen = rwd[cnt++];
set_pen (trans_color (curcol), curwid - '0', trans_brush (curpat),
trans_pen (curpen));
break;
case 'B':
curpat = rwd[cnt++];
set_pen (trans_color (curcol), curwid - '0', trans_brush (curpat),
trans_pen (curpen));
break;
case 'C':
curcol = rwd[cnt++];
set_pen (trans_color (curcol), curwid - '0', trans_brush (curpat),
trans_pen (curpen));
break;
default:
break;
}
}
// restore default pen
set_pen (COLOR_BLACK);
}
void TViswin::paint_row (long j)
{
TPoint p1, p2;
if (need_paint_sel (FALSE))
adjust_selection (p1, p2);
const long y = origin ().y;
const int row = (int) (j + (long)Y_OFFSET - y);
autoscroll(FALSE);
set_font(PRINT_FONT, XVT_FS_NONE, PRINT_HEIGHT);
set_mode(M_COPY);
set_opaque_text(TRUE);
if (_rulers)
{
set_color(FOREGROUND, BACKGROUND);
set_brush(BACKGROUND);
printat(0, row, "%05ld", j + 1);
}
if (_scrolling)
{
hide_pen ();
set_brush (COLOR_WHITE);
RCT r;
r.top = row * CHARY;
r.left = tabx(X_OFFSET -1),
r.bottom = r.top + taby(1)/* + 1*/;
r.right = tabx(255);
xvt_dwin_draw_rect (win (), &r);
}
paint_background(j, row);
set_opaque_text(FALSE);
const char *cp;
int pos = 0;
_txt.read_line (j, origin().x);
while ((cp = _txt.piece ()) != NULL)
{
#if XVT_OS != XVT_OS_SCOUNIX
const int st = _txt.get_style();
const COLOR bg = trans_color (_txt.get_background());
const COLOR fg = trans_color (_txt.get_foreground());
set_font(PRINT_FONT, st, PRINT_HEIGHT);
set_color(fg, bg);
#else
set_color (COLOR_BLACK, COLOR_WHITE);
#endif
printat (X_OFFSET+pos, row, "%s", cp);
pos += strlen (cp);
}
if (_scrolling && (pos < _textcolumns))
{
set_color (COLOR_BLACK, COLOR_WHITE);
TString80 fill; fill.spaces(80);
printat (X_OFFSET+pos, row, fill);
}
if ((j % _formlen) == (_formlen - 1) && _toplevel) // last row
{
PNT b, e;
b.h = tabx(X_OFFSET -1);
b.v = taby(row + Y_OFFSET) - 1;
e.h = tabx(132);
e.v = taby(row + Y_OFFSET) - 1;
set_pen (COLOR_LTGRAY, 2, PAT_SOLID, P_DASH);
xvt_dwin_draw_set_pos (win(), b);
xvt_dwin_draw_line (win(), e);
}
autoscroll (TRUE);
}
// @doc INTERNAL
// @mfunc Disegna una colonna
void TViswin::paint_column (
long j, // @parm Colonna da disegnare
bool end) // @parm Indica se si tratta dell'ultima colonna:
//
// @flag TRUE | E' l'ultima colonna ed implica uno scroll orizzonatle avvenuto
// @flag FALSE | Non e' l'ultima colonna
{
paint_header ();
set_opaque_text (FALSE);
set_mode (M_COPY);
TPoint p1, p2;
if (need_paint_sel (FALSE))
adjust_selection (p1, p2);
set_color (COLOR_BLACK, COLOR_WHITE);
autoscroll (FALSE);
RCT clipper;
xvt_rect_set(&clipper, tabx(X_OFFSET), 0, tabx(X_OFFSET+1), taby(int(_textrows + 1)));
if (end)
xvt_rect_offset(&clipper, tabx(int(_textcolumns-1)), 0);
xvt_dwin_set_clip(win(), &clipper);
const int col = end ? (int) (_textcolumns + X_OFFSET -1) : X_OFFSET;
set_brush(COLOR_WHITE);
bar(col, Y_OFFSET, col+1, int(_textrows + Y_OFFSET));
const long orig_y = origin().y;
const long last = min(_txt.lines() - orig_y, _textrows);
for (long l = 0L; l < last; l++)
{
const long riga_txt = orig_y + l;
const int riga_scr = (int)l+Y_OFFSET;
paint_background (riga_txt, riga_scr);
if ((riga_txt% _formlen) == (_formlen - 1) && _toplevel)
{
PNT b, e;
b.h = tabx(short(col));
b.v = taby(riga_scr+1) -1 ;
e.h = tabx(short(col+1));
e.v = taby(riga_scr+1) -1;
set_pen (COLOR_LTGRAY, 2, PAT_SOLID, P_DASH);
xvt_dwin_draw_set_pos (win(), b);
xvt_dwin_draw_line (win(), e);
}
const char *c = (const char *) _txt.line (riga_txt);
int st = _txt.get_style ((int) j);
set_font (PRINT_FONT, st, PRINT_HEIGHT);
COLOR bg = trans_color (_txt.get_background ((int) j));
COLOR fg = trans_color (_txt.get_foreground ((int) j));
set_color (fg, bg);
printat (col, riga_scr, "%c",
(unsigned int) j < strlen (c) ? c[(int) j] : ' ');
}
xvt_dwin_set_clip(win(), NULL);
autoscroll (TRUE);
}
void TViswin::draw_crossbars ()
// prints reference crossbars
{
if (_cross.v > taby(1) && _cross.v < taby(rows () - BUTTONROW_SIZE) &&
_cross.h > tabx (X_OFFSET - 1) && _cross.h < tabx(columns()) )
{
set_pen (COLOR_BLACK);
set_mode (M_XOR);
PNT b1, e1, b2, e2;
autoscroll (FALSE);
b1.h = _cross.h;
b1.v = taby(Y_OFFSET);
e1.h = _cross.h;
e1.v = taby((rows() - BUTTONROW_SIZE + (_rulers ? 0 : 1)));
b2.h = tabx(X_OFFSET -1);
b2.v = _cross.v;
e2.h = tabx(columns());
e2.v = _cross.v;
xvt_dwin_draw_set_pos (win (), b1);
xvt_dwin_draw_line (win (), e1);
xvt_dwin_draw_set_pos (win (), b2);
xvt_dwin_draw_line (win (), e2);
autoscroll (TRUE);
}
}
void TViswin::display_crossbar ()
{
if (!_cross_displayed)
draw_crossbars ();
_cross_displayed = TRUE;
}
void TViswin::erase_crossbar ()
{
if (_cross_displayed)
draw_crossbars ();
_cross_displayed = FALSE;
}
void TViswin::display_point ()
{
if (!_point_displayed)
paint_point ();
_point_displayed = TRUE;
}
void TViswin::erase_point ()
{
if (_point_displayed)
paint_point ();
_point_displayed = FALSE;
}
// @doc INTERNAL
// @mfunc Disegna il cursore in xor nello stile del momento
void TViswin::paint_point (
bool erase) // @parm Indica di cancellare il cursore precedente (default FALSE):
//
// @flag TRUE | Cancella il cursore precedente
// @flag FALSE | Mantiene il cursore precedente
{
autoscroll (FALSE);
static bool wasbar;
if (_isbar)
{
invert_bar (X_OFFSET, (int)(_point.y - origin().y + (long)Y_OFFSET),
(int)columns(), (int) (_point.y - origin().y + (long)Y_OFFSET + 1l));
invert_bar ((int)(_point.x - origin().x + (long)X_OFFSET), Y_OFFSET,
(int)(_point.x - origin().x + (long)X_OFFSET + 1l),
(int)(rows() - (long)BUTTONROW_SIZE));
}
else
{
invert_bar ((int) (_point.x - origin ().x + (long)X_OFFSET),
(int) (_point.y - origin ().y + (long)Y_OFFSET),
(int) (_point.x - origin ().x + (long)X_OFFSET + 1l),
(int) (_point.y - origin ().y + (long)Y_OFFSET + 1l));
if (_rulers)
{
invert_bar (0, (int) (_point.y - origin ().y + (long)Y_OFFSET), (X_OFFSET -1),
(int) (_point.y - origin ().y + (long)Y_OFFSET + 1l));
invert_bar ((int) (_point.x - origin ().x + (long)X_OFFSET), 0,
(int) (_point.x - origin ().x + (long)X_OFFSET + 1l), 1);
}
}
autoscroll (TRUE);
wasbar = _isbar;
}
// draw screen header
void TViswin::paint_header ()
{
if (!_rulers)
return;
set_mode (M_COPY);
set_opaque_text (TRUE);
set_color (FOREGROUND, BACKGROUND);
set_font (PRINT_FONT, XVT_FS_NONE, PRINT_HEIGHT);
TString16 htmpst;
for (int i = 1; i < 26; i++)
{
htmpst.format ("%d", i);
htmpst.right_just (10, '.');
xvt_dwin_draw_text(win(), tabx(i*10 - 4 - int(origin().x)), BASEY-1,
(char*)(const char*)htmpst, 10);
}
autoscroll (FALSE);
set_color (COLOR_WHITE, BACKGROUND);
printat (0, 0, "P.%3ld ", ((origin().y) / _formlen) + 1l);
autoscroll (TRUE);
}
void TViswin::paint_selection ()
{
TPoint p1, p2;
adjust_selection (p1, p2);
// paint rows
for (long l = p1.y; l <= p2.y; l++)
{
int top, left, right;
top = (int) (l - origin().y + Y_OFFSET);
if (top > 0 && top <= _textrows)
{
left = p1.y == l ? (int)(p1.x-origin().x + (long)X_OFFSET) : X_OFFSET;
right = p2.y == l ? (int)(p2.x-origin().x + (long)X_OFFSET) :
(int)(_textcolumns + (long)X_OFFSET);
autoscroll (FALSE);
invert_bar (left, top, right, top + 1);
autoscroll (TRUE);
}
}
}
// @doc INTERNAL
// @mfunc Disegna la barra di attesa
void TViswin::paint_waitbar (
bool xor) // @parm Utilizzato in UNIX. (default TRUE)
{
HIDDEN int pic = 0;
((TImage&)_modules[pic]).draw(win());
pic = (pic+1) & 0x3;
}
void TViswin::txt_clear(COLOR color)
{
autoscroll(FALSE);
set_brush(color);
set_mode(M_COPY);
bar ((X_OFFSET-1), Y_OFFSET -1, columns()+1, rows()-BUTTONROW_SIZE);
}
void TViswin::update ()
{
if (_scrolling)
return;
in_update = TRUE;
erase_point();
autoscroll(FALSE);
set_mode(M_COPY);
// if (_showbuts)
// {
// set_brush (BACKGROUND);
// bar ((X_OFFSET-1), rows()-BUTTONROW_SIZE, columns()+1, rows() + 1);
// }
if (_need_update)
{
check_link();
if (_isselection)
erase_selection ();
txt_clear(COLOR_WHITE);
// set_mode (M_COPY);
set_brush (BACKGROUND);
// autoscroll (FALSE);
if (_rulers)
{
bar (0, 0, columns() + 1, 1);
bar (0, 0, 5, rows() + 1);
}
// if (_showbuts)
// bar ((X_OFFSET -1), rows()-BUTTONROW_SIZE, columns() + 1, rows() + 1); //**
if (_showbuts && _isopen)
paint_waitbar (FALSE);
else
if (_showbuts) ((TImage&)_modules[4]).draw(win());
autoscroll (TRUE);
paint_header ();
paint_screen ();
if (_isselection)
display_selection ();
}
display_point ();
check_link(&_point);
autoscroll (TRUE);
_need_update = TRUE;
_need_scroll = none;
in_update = FALSE;
}
void TViswin::abort_print ()
{
if (yesno_box ("Interruzione della stampa su video?"))
{
_txt.freeze ();
freeze ();
set_focus ();
close_print();
}
}
void TViswin::scroll_error(long x, long y)
{
beep();
update_thumb(x, y);
POINT p; GetCursorPos(&p);
if (x < 0) p.x -= 16;
if (y < 0) p.y -= 16;
SetCursorPos(p.x, p.y);
}
void TViswin::on_button(short dlg)
{
// if (ep->v.ctl.ci.type == WC_PUSHBUTTON)
switch (dlg)
{
case DLG_QUIT:
if (_isopen) abort_print();
else
{
xvt_statbar_set("");
xvt_statbar_refresh();
stop_run(K_ENTER);
}
break;
case DLG_PRINT:
dispatch_e_menu(win(), M_EDIT_SEL_ALL);
break;
case DLG_EDIT:
check_link();
call_editor();
_need_update = TRUE;
update();
check_link(&_point);
break;
case DLG_LINK:
exec_link();
break;
default:
TWindow::on_button(dlg);
break;
}
}
void TViswin::handler (WINDOW win, EVENT * ep)
{
int kdiff_x, kdiff_y;
PNT newcross;
TPoint p;
static bool ignore = FALSE;
bool tlnk = FALSE;
int kdiff;
long new_origin;
switch (ep->type)
{
case E_USER:
if (ep->v.user.id == E_ADDLINE)
{
set_scroll_max (MAXLEN - 1, _txt.lines () <= _textrows ?
_txt.lines () : _txt.lines () - _textrows);
}
else if (ep->v.user.id == E_ADDLINE_ONSCREEN)
{
set_scroll_max (MAXLEN - 1, _txt.lines () <= _textrows ? _txt.lines () : _txt.lines () - _textrows);
erase_point ();
if (need_paint_sel (FALSE))
erase_selection ();
paint_row (_txt.lines () - 1l);
if (need_paint_sel (FALSE))
display_selection ();
display_point ();
if (_txt.lines () > 1l)
_need_update = FALSE;
else
force_update ();
}
autoscroll (FALSE);
_textrows = TEXTROWS;
_textcolumns = TEXTCOLUMNS;
autoscroll (TRUE);
break;
case E_COMMAND:
if (ep->v.cmd.tag > 1000 && ep->v.cmd.tag < 2000)
{
// bookmark
int index = ep->v.cmd.tag - 1001;
BkDef& bds = (BkDef&)(*_bookmarks)[index];
goto_pos(bds._row, 0l);
}
else switch(ep->v.cmd.tag)
{
case M_EDIT_CLIPBOARD: // interrompi
dispatch_e_char(win, K_ESC);
break;
case M_EDIT_CUT: // collega
dispatch_e_char(win, CTRL_G);
break;
case M_EDIT_PASTE: // esporta
dispatch_e_char(win, CTRL_E);
break;
case M_EDIT_SEL_ALL: // stampa
xvt_statbar_set ("");
xvt_statbar_refresh ();
stop_run(CTRL_S);
break;
case M_SHOW_RULERS: // mostra righelli
show_rulers(!_rulers);
check_menu_item(M_SHOW_RULERS, _rulers);
break;
case M_SHOW_BUTTONS: // mostra bottoni
show_buttons(!_showbuts);
check_menu_item(M_SHOW_BUTTONS, _showbuts);
break;
case M_EDIT_QUIT: // chiudi
xvt_statbar_set ("");
xvt_statbar_refresh ();
stop_run (K_ENTER);
break;
case M_EDIT_COPY: // copia nella clipboard
dispatch_e_char(win, CTRL_C);
break;
case M_EDIT_CLEAR: // annulla selezione
dispatch_e_char(win,K_ENTER);
break;
case M_EDIT_SEARCH: // cerca
find();
break;
case M_EDIT_DELETE: // cerca il prossimo
find_next();
break;
case M_EDIT_UNDO: // ridisegna
refresh();
break;
}
break;
case E_CONTROL:
break;
case E_TIMER:
if (ep->v.timer.id == _timer)
{
xvt_timer_destroy (_timer);
_istimer = FALSE;
}
else if (ep->v.timer.id == _wtimer)
{
if (_showbuts) paint_waitbar ();
xvt_timer_destroy (_wtimer);
if (_isopen)
_wtimer = xvt_timer_create (win, 150l);
}
break;
case E_MOUSE_DBL:
break;
case E_MOUSE_DOWN:
p = ep->v.mouse.where;
xvt_win_trap_pointer (win);
if (ep->v.mouse.button == 0) // left button: text selection
{
if (need_paint_sel (FALSE))
{
erase_selection ();
_isselection = FALSE;
}
if (!in_text (p) || (p.y + origin().y) >= _txt.lines ())
{
ignore = TRUE;
break;
}
erase_point ();
_sel_start = ep->v.mouse.where;
_sel_start.x += (origin ().x - X_OFFSET);
_sel_start.y += (origin ().y - Y_OFFSET);
_sel_end = _sel_start;
_selecting = TRUE;
}
else
{
// show crossbars
_cross = ep->v.mouse.where;
display_crossbar ();
_iscross = TRUE;
}
break;
case E_MOUSE_UP:
xvt_win_release_pointer ();
if (ep->v.mouse.button == 0) // left button: text selection/move
// point
{
p = ep->v.mouse.where;
if (_isopen && (p.x >= 4 && p.x) <= X_OFFSET &&
(p.y >= (int)rows () - BUTTONROW_SIZE && p.y <= (int)rows() - Y_OFFSET))
{
abort_print ();
ignore = TRUE;
}
if (ignore)
{
ignore = FALSE;
_selecting = FALSE;
break;
}
// confirm selection & store
p.x += (origin ().x - X_OFFSET);
p.y += (origin ().y - Y_OFFSET);
if (_sel_start == p)
{
if (_isselection)
{
_isselection = FALSE;
erase_selection ();
}
if (_sel_start == _point && !_selecting)
{
dispatch_e_char (win, K_F5);
}
else
{
TPoint xx;
_point.x = p.x;
_point.y = p.y;
if (_point.y > _txt.lines ())
_point.y = _txt.lines () - 1l;
if (_point.y < 0)
_point.y = 0;
if (_point.x < 0)
_point.x = 0;
if (_point.x > 255)
_point.x = 255;
check_link (&_point);
display_point ();
}
}
else
{
_sel_end.x = p.x;
_sel_end.y = p.y;
if (_sel_end.y >= _txt.lines ())
_sel_end.y = _txt.lines () - 1l;
if (_sel_end.y < 0)
_sel_end.y = 0;
if (_sel_end.x < 0)
_sel_end.x = 0;
if (_sel_end.x > 255)
_sel_end.x = 255;
_point = _sel_end;
_isselection = TRUE;
check_link (&_point);
display_point ();
}
_selecting = FALSE;
}
else
{
erase_crossbar ();
_iscross = FALSE;
}
break;
case E_MOUSE_MOVE:
{
/*
if (!_selecting && !_iscross) // no buttons pressed
{
p = ep->v.mouse.where;
if (in_text (p))
{
p.x += (origin ().x - 6);
p.y += (origin ().y - 1);
check_link (&p);
}
}
*/
if (_selecting || _iscross)
{
p = ep->v.mouse.where;
if (_selecting)
_isselection = TRUE;;
{
_isselection = TRUE;
}
// scroll if necessary
if (p.y >= _textrows + 1l)
{
if (_isselection)
erase_selection ();
if (_iscross)
erase_crossbar ();
dispatch_e_scroll (win, K_DOWN);
if (_isselection)
display_selection ();
if (_iscross)
display_crossbar ();
}
else if (p.y <= 0l)
{
if (_isselection)
erase_selection ();
if (_iscross)
erase_crossbar ();
dispatch_e_scroll (win, K_UP);
if (_isselection)
display_selection ();
if (_iscross)
display_crossbar ();
}
else if (p.x <= (long)(X_OFFSET - 1))
{
if (_isselection)
erase_selection ();
if (_iscross)
erase_crossbar ();
dispatch_e_scroll (win, K_LEFT);
if (_isselection)
display_selection ();
if (_iscross)
display_crossbar ();
}
else if (p.x >= _textcolumns + X_OFFSET)
{
if (_isselection)
erase_selection ();
if (_iscross)
erase_crossbar ();
dispatch_e_scroll (win, K_RIGHT);
if (_isselection)
display_selection ();
if (_iscross)
display_crossbar ();
}
if (_selecting)
{
if (in_text (p))
{
p.x += (origin ().x - X_OFFSET);
p.y += (origin ().y - Y_OFFSET);
_point = p;
if (_point.y >= _txt.lines ())
_point.y = _txt.lines () - 1l;
}
if (_point != _sel_end)
{
erase_selection ();
_sel_end = _point;
display_selection ();
}
}
}
if (_iscross)
{
newcross = ep->v.mouse.where;
if (_cross.h != newcross.h || _cross.v != newcross.v)
{
erase_crossbar ();
_cross = newcross;
display_crossbar ();
}
}
}
break;
case E_SIZE:
if (is_open ())
{
check_link ();
erase_point ();
if (_isselection)
erase_selection ();
autoscroll (FALSE);
_textrows = TEXTROWS;
_textcolumns = TEXTCOLUMNS;
autoscroll (TRUE);
repos_buttons ();
display_point ();
_need_update = TRUE;
force_update ();
do_events ();
check_link (&_point);
}
break;
case E_HSCROLL:
case E_VSCROLL:
{
erase_point ();
tlnk = TRUE;
switch (ep->v.scroll.what)
{
case SC_PAGE_UP:
if (ep->type == E_VSCROLL)
{
if (origin().y > 0)
{
kdiff = (int) (_point.y - origin ().y);
new_origin = origin ().y > _textrows ?
origin().y - _textrows + 1l : 0;
_point.y = new_origin + kdiff;
check_link ();
update_thumb (origin ().x, new_origin);
_need_update = TRUE;
update (); // ORRIIIBILE!
check_link (&_point);
_need_update = FALSE;
}
else scroll_error(-1, 0);
}
else
{
if (origin ().x > 0)
{
kdiff = (int) (_point.x - origin ().x);
new_origin = origin ().x > _textcolumns ?
origin().x - _textcolumns + 1 : 0;
_point.x = new_origin + kdiff;
check_link ();
update_thumb(new_origin, origin().y);
_need_update = TRUE;
update (); // AAAARGH!
check_link (&_point);
_need_update = FALSE;
}
else scroll_error(0, -1);
}
break;
case SC_LINE_UP:
if (ep->type == E_VSCROLL)
{
_need_update = FALSE;
if (origin ().y > 0l)
{
_point.y--;
if (need_paint_sel ())
erase_selection ();
check_link ();
update_thumb (origin().x, origin().y - 1l);
_need_scroll = down;
}
else scroll_error(-1, 0);
}
else
{
_need_update = FALSE;
if (origin ().x > 0l)
{
if (need_paint_sel (FALSE))
erase_selection ();
check_link ();
update_thumb (origin().x - 1l, origin().y);
_point.x--;
_need_scroll = right;
}
else scroll_error(0, -1);
}
break;
case SC_PAGE_DOWN:
if (ep->type == E_VSCROLL)
{
if ((origin().y + _textrows) < _txt.lines())
{
kdiff = (int) (_point.y - origin ().y);
new_origin = (_txt.lines () - origin ().y) >
(_textrows * 2l) ?
origin ().y + _textrows - 1 : _txt.lines () - _textrows;
_point.y = new_origin + kdiff;
check_link ();
update_thumb (origin ().x, new_origin);
_need_update = TRUE;
update (); // AAAARGH!
check_link (&_point);
_need_update = FALSE;
}
else scroll_error(-1, _txt.lines()-_textrows/*-1*/);
}
else
{
if ((origin().x + _textcolumns) < 256)
{
kdiff = (int) (_point.x - origin ().x);
new_origin = (256 - origin ().x) > _textcolumns ?
origin ().x + _textcolumns - 1 : 256 - _textcolumns;
_point.x = new_origin + kdiff;
check_link ();
update_thumb (new_origin, origin().y);
_need_update = TRUE;
update (); // AAAARGH!
check_link (&_point);
_need_update = FALSE;
}
else scroll_error(255-_textcolumns, -1);
}
break;
case SC_LINE_DOWN:
if (ep->type == E_VSCROLL)
{
_need_update = FALSE;
if ((origin().y + _textrows) < _txt.lines ())
{
if (need_paint_sel ())
erase_selection ();
check_link ();
update_thumb (origin ().x, origin ().y + 1l);
_point.y++;
_need_scroll = up;
}
else scroll_error(-1, _txt.lines()-_textrows/*-1*/);
}
else
{
_need_update = FALSE;
if ((origin ().x + _textcolumns) < 256)
{
if (need_paint_sel (FALSE))
erase_selection ();
check_link ();
update_thumb (origin ().x + 1l, origin ().y);
_need_scroll = left;
_point.x++;
}
else scroll_error(255-_textcolumns, -1);
}
break;
case SC_THUMB:
check_link ();
kdiff_x = (int) (_point.x - origin ().x);
kdiff_y = (int) (_point.y - origin ().y);
p.x = ep->type == E_VSCROLL ? origin ().x : ep->v.scroll.pos;
p.y = ep->type == E_HSCROLL ? origin ().y : ep->v.scroll.pos;
if ((p.y + _textrows) >= _txt.lines ())
p.y = _txt.lines () - _textrows -1;
if ((p.x + _textcolumns) >= 255)
p.x = 255 - _textcolumns;
update_thumb (p.x, p.y);
_point.x = ep->type == E_VSCROLL ? origin ().x :
origin ().x + kdiff_x;
_point.y = ep->type == E_HSCROLL ? origin ().y :
origin ().y + kdiff_y;
_need_update = TRUE;
update ();
check_link (&_point);
break;
default:
break;
}
// for failed scrollings
if (!_selecting && _need_scroll == none)
{
check_link (&_point);
display_point ();
}
}
break;
default:
break;
}
if (_need_scroll != none)
{
_need_update = FALSE;
scroll tmp = _need_scroll;
_need_scroll = none;
shift_screen (tmp);
if (!_selecting)
{
check_link (&_point);
display_point ();
}
if (_isselection)
display_selection ();
}
if (ep->type != E_UPDATE || _need_update)
TWindow::handler (win, ep);
else if (ep->type == E_UPDATE)
update ();
}
bool TViswin::on_key (KEY key)
{
EVENT_TYPE type = E_USER;
if (_istimer)
return TRUE;
_timer = xvt_timer_create (win (), 50l);
_istimer = TRUE;
if (key == K_UP || key == K_DOWN || key == K_LEFT || key == K_RIGHT)
if (_selflag)
key += K_SHIFT;
if (_selecting && key != K_SHIFT_UP && key != K_SHIFT_DOWN
&& key != K_SHIFT_LEFT && key != K_SHIFT_RIGHT)
_selecting = FALSE;
switch (key)
{
case K_F7:
find();
break;
case K_F8:
find_next();
break;
case CTRL_E:
if (_isedit)
{
check_link ();
call_editor ();
set_focus ();
_need_update = TRUE;
update ();
check_link (&_point);
}
break;
case CTRL_G:
exec_link();
break;
case CTRL_C:
sel_to_clipboard();
break;
case CTRL_S:
if (_isprint)
stop_run(CTRL_S);
break;
case CTRL_R:
_need_update = TRUE;
check_link ();
force_update ();
do_events ();
check_link (&_point);
break;
case K_ESC:
if (_isopen)
abort_print ();
else
{
xvt_statbar_set ("");
xvt_statbar_refresh ();
stop_run (K_ESC);
}
break;
case K_ENTER:
if (_isselection)
{
erase_selection ();
_isselection = FALSE;
}
if (_toplevel)
exec_link();
break;
case K_TAB:
if (!is_running())
{
_need_update = TRUE;
update();
}
else
{
if (_curbut == (_button.items() - 1))
_curbut = 0;
else
_curbut++;
}
break;
case K_BTAB:
if (_curbut == 0)
_curbut = _button.items() - 1;
else
_curbut--;
break;
case K_SPACE:
case K_CTRL_ENTER:
if (_linkID != -1)
exec_link();
/*
else if (_toplevel)
dispatch_e_char (_button[_curbut], K_SPACE);
*/
break;
case K_LHOME:
_need_update = TRUE;
update_thumb (0, 0);
_point.set (0, 0);
check_link (&_point);
force_update();
break;
case K_LEND:
_need_update = TRUE;
update_thumb (0, _txt.lines () - _textrows);
_point.set (0, _txt.lines () - 1);
check_link (&_point);
force_update();
break;
case K_RIGHT:
case K_LEFT:
case K_WRIGHT:
case K_WLEFT:
case K_ALT_RIGHT:
case K_ALT_LEFT:
case K_SHIFT_RIGHT:
case K_SHIFT_LEFT:
type = E_HSCROLL;
break;
case K_UP:
case K_DOWN:
case K_NEXT:
case K_PREV:
case K_CTRL_UP:
case K_CTRL_DOWN:
case K_SHIFT_UP:
case K_SHIFT_DOWN:
type = E_VSCROLL;
break;
case K_F5:
check_link ();
erase_point ();
_isbar = !_isbar;
_need_update = TRUE;
force_update ();
do_events ();
check_link (&_point);
break;
case K_F6:
_selflag = !_selflag;
break;
default:
break;
}
switch (type)
{
case E_HSCROLL:
case E_VSCROLL:
{
erase_point ();
check_link ();
switch (key)
{
case K_PREV:
dispatch_e_scroll (win(), K_PREV);
break;
case K_NEXT:
dispatch_e_scroll (win(), K_NEXT);
break;
case K_WLEFT:
dispatch_e_scroll (win(), K_BTAB);
break;
case K_WRIGHT:
dispatch_e_scroll (win(), K_TAB);
break;
case K_CTRL_UP:
dispatch_e_scroll (win(), K_UP);
break;
case K_CTRL_DOWN:
dispatch_e_scroll (win(), K_DOWN);
break;
case K_ALT_LEFT:
dispatch_e_scroll (win(), K_LEFT);
break;
case K_ALT_RIGHT:
dispatch_e_scroll (win(), K_RIGHT);
break;
case K_UP:
case K_SHIFT_UP:
_need_update = FALSE;
if (key == K_SHIFT_UP)
{
if (need_paint_sel (FALSE))
erase_selection ();
if (!_selecting)
{
_sel_start = _point;
_selecting = TRUE;
}
}
if (_point.y > 0l)
{
if (_point.y == origin ().y)
{
if (need_paint_sel ())
erase_selection ();
update_thumb (origin ().x, --_point.y);
_need_scroll = down;
}
else
_point.y--;
if (key == K_SHIFT_UP)
{
_sel_end = _point;
_isselection = TRUE;
}
}
else
beep ();
break;
case K_LEFT:
case K_SHIFT_LEFT:
_need_update = FALSE;
if (_point.x > 0l)
{
if (key == K_SHIFT_LEFT)
{
if (need_paint_sel (FALSE))
erase_selection ();
if (!_selecting)
{
_sel_start = _point;
_selecting = TRUE;
}
}
if (_point.x == origin ().x)
{
_need_update = FALSE;
if (need_paint_sel (FALSE))
erase_selection();
update_thumb (--_point.x, origin ().y);
_need_scroll = right;
}
else
_point.x--;
if (key == K_SHIFT_LEFT)
{
_sel_end = _point;
_isselection = TRUE;
}
}
else
beep ();
break;
case K_DOWN:
case K_SHIFT_DOWN:
_need_update = FALSE;
if (_point.y < (_txt.lines() - 1))
{
if (key == K_SHIFT_DOWN)
{
if (need_paint_sel (FALSE))
erase_selection();
if (!_selecting)
{
_sel_start = _point;
_selecting = TRUE;
}
}
if (_point.y == origin().y + _textrows - 1)
{
if (need_paint_sel())
erase_selection();
// check_link();
update_thumb (origin().x, (++_point.y) - _textrows + 1);
_need_scroll = up;
}
else
_point.y++;
if (key == K_SHIFT_DOWN)
{
_sel_end = _point;
_isselection = TRUE;
}
}
else
beep ();
break;
case K_RIGHT:
case K_SHIFT_RIGHT:
_need_update = FALSE;
if (_point.x < 256)
{
if (key == K_SHIFT_RIGHT)
{
if (need_paint_sel (FALSE))
erase_selection ();
if (!_selecting)
{
_sel_start = _point;
_selecting = TRUE;
}
}
if (_point.x == (origin ().x + _textcolumns - 1))
{
if (need_paint_sel (FALSE))
erase_selection ();
// check_link();
update_thumb ((++_point.x) - _textcolumns + 1l, origin ().y);
_need_scroll = left;
}
else
_point.x++;
if (key == K_SHIFT_RIGHT)
{
_sel_end = _point;
_isselection = TRUE;
}
}
else
beep();
break;
default:
break;
}
if (_need_scroll != none)
{
_need_update = FALSE;
scroll tmp = _need_scroll;
_need_scroll = none;
shift_screen (tmp);
}
if (_isselection)
display_selection ();
check_link (&_point);
if (_need_update) force_update();
else update();
}
break;
default:
break;
}
return TWindow::on_key (key);
}
void TViswin::sel_to_clipboard()
{
TPoint p1, p2;
if (!_isselection) return;
adjust_selection (p1, p2);
TString_array txt;
_txt.write(txt, &p1, &p2);
long size = 0l; int eol_len = strlen(EOL_SEQ);
// open clipboard
xvt_cb_open(TRUE);
// allocate clipboard
for (int i = 0; i < txt.items(); i++)
size += txt.row(i).len() + eol_len;
char* p = (char*)xvt_cb_alloc_data(size);
if (p == NULL)
{
error_box("Impossibile allocare una clipboard di %ld bytes", size);
return;
}
// put data
for (i = 0; i < txt.items(); i++)
{
TString& s = txt.row(i);
for (int j = 0; j < s.len(); j++)
*p++ = s[j];
for (j = 0; j < eol_len; j++)
*p++ = EOL_SEQ[j];
}
if (!xvt_cb_put_data(CB_TEXT, NULL, size, (PICTURE)NULL))
error_box("Errore di copiatura del testo nella clipboard");
// free memory
xvt_cb_free_data();
// close clipboard
xvt_cb_close();
}
bool TViswin::call_editor()
{
TConfig cnf (CONFIG_USER, "Link");
const TFilename editor (cnf.get ("txt", NULL, -1, "notepad"));
bool ok = FALSE;
if (!editor.empty ())
{
TFilename newfilename; newfilename.tempdir();
FILE_SPEC fs;
xvt_fsys_convert_str_to_dir((char*)(const char*)newfilename, &fs.dir);
strcpy (fs.type, "txt");
strcpy (fs.name, "");
xvt_fsys_save_dir ();
ok = xvt_dm_post_file_save (&fs, "Salva il file con il nome:") == FL_OK;
xvt_fsys_restore_dir ();
if (ok)
{
char path[256];
xvt_fsys_convert_dir_to_str (&fs.dir, path, sizeof (path));
newfilename = path;
newfilename << '/' << fs.name;
TPoint p1, p2;
if (_isselection)
adjust_selection (p1, p2);
if (_txt.write (newfilename, _isselection ? &p1 : NULL,
_isselection ? &p2 : NULL))
{
newfilename.insert (" ", 0);
newfilename.insert (editor, 0);
TExternal_app edit (newfilename);
if (edit.run(TRUE, FALSE))
beep ();
else
ok = TRUE;
}
}
}
else
warning_box ("Nessun editor specificato nei parametri studio");
return ok;
}
void TViswin::add_line (const char *l)
{
if (_isopen && !_frozen)
{
if (_txt.frozen ()) // error writing files
{
close_print ();
return;
}
_txt.append (l);
EVENT ev;
ev.type = E_USER;
ev.v.user.id = (_txt.lines() - origin().y) <= _textrows ?
E_ADDLINE_ONSCREEN : E_ADDLINE;
xvt_win_dispatch_event (win (), &ev);
do_events ();
}
}
void TViswin::close_print ()
{
_isopen = FALSE;
if (_showbuts) xvt_timer_destroy (_wtimer);
_need_update = TRUE;
if (_toplevel)
{
xvt_menu_set_item_title(win(), M_EDIT_QUIT, "Chiudi\tESC");
enable_menu_item(M_EDIT_CLIPBOARD, FALSE);
_print_button->enable();
enable_menu_item(M_EDIT_SEL_ALL, TRUE);
// build bookmark menu tree
_bookmarks = &(printer().get_bookmarks());
if (_bookmarks->items() > 0)
build_index_menu();
}
const TImage* i = (TImage*)_images.objptr(0);
if (i != NULL) i->set_palette(win());
force_update ();
}
void TViswin::goto_end()
{
goto_pos(0l, _txt.lines () - _textrows);
}
void TViswin::goto_top()
{
goto_pos(0l,0l);;
}
// @doc INTERNAL
// @mfunc Sposta la visualizzazione di stampa alla posizione indicata
void TViswin::goto_pos(
long r, // @parm Riga a cui spostare la visualizzazione di stampa
long c, // @parm Colonna a cui spostare la visualizzazione di stampa
bool moveorigin) // @parm Indica se occorre spostare l'origine (default TRUE)
// @xref <mf TViswin::goto_top> e <mf TViswin::goto_end>
{
if (r >= _txt.lines() || c >= 256)
return;
check_link();
erase_point();
if (_isselection) erase_selection();
_point.x = c;
_point.y = r;
if (!moveorigin)
c = (c > (origin().x + _textcolumns)) ? c - origin().x : 0l;
if (_txt.lines() > _textrows)
update_thumb(c,r);
check_link(&_point);
if (_isselection) display_selection();
display_point();
refresh();
}
void TViswin::refresh()
{
_need_update = TRUE;
force_update();
}
// @doc INTERNAL
// @mfunc Funzione di ricerca non interattiva
//
// @rdesc Ritorna la riga in cui e' stata trovato il testo (-1 se non e' stato trovato)
long TViswin::search(
const char* txt, // @parm Testo da cercare
int& pos, // @parm Intero in cui posizionare la posizione del carattere
long from, // @parm Posizione all'interno della riga da cui iniziare la ricerca (default 0)
bool down, // @parm Indica se la ricerca va effettuata all'indietro:
//
// @flag TRUE | Ricerca dalla posizione indicata all'inizio della riga (default)
// @flag FALSE | Ricerca dalla posizione indicata alla fine della riga
bool cs, // @parm Indica se ricerca il testo con criterio case sensitive (default FALSE)
bool regx) // @parm indica se considerare espressioni regolari (def FALSE)
{
return _txt.search(txt,pos,from,down, cs, regx);
}
// @doc INTERNAL
// @mfunc Funzione di sostituzione di un testo all'interno di una riga non interattiva
//
// @rdesc Ritorna la posizione in cui e' stato sostituito il testo. Ritorna -1 se non e' stata
// fatto nessuna operazione di sostituzione.
int TViswin::replace(
long l, // @parm Numero della riga nella quale sostituire il testo
const char* txt, // @parm Testo da inserire nella riga
int pos, // @parm Posizione nella quale inserire il testo (default 0)
int len) // @parm Lunghezza del testo da sostituire (default -1)
{
if (l == -1l) return -1;
int ret = _txt.replace(l,txt,pos,len);
if (ret != -1)
{
TPoint p; p.x = pos; p.y = l;
}
return ret;
}
void TViswin::find()
{
TMask m("bagn005");
m.set(F_STRING, _txt_to_find);
m.set(F_DIRECT, _down_dir ? "D" : "U");
m.set(F_CASE, _case_sensitive ? "X" : "");
m.set(F_REGEXP, _regexp ? "X" : "");
if (m.run() == K_ENTER)
{
_txt_to_find = m.get(F_STRING);
_down_dir = m.get(F_DIRECT) == "D";
_case_sensitive = m.get_bool(F_CASE);
_regexp = m.get_bool(F_REGEXP);
int x;
long l = search(_txt_to_find, x, _point.y, _down_dir, _case_sensitive,
_regexp);
if (l == -1l)
{
_last_found.y = -1l;
beep();
}
else
{
goto_pos(l, (long)x, FALSE);
_last_found.x = (long)x;
_last_found.y = l;
}
}
if (_toplevel) enable_menu_item(M_EDIT_DELETE, TRUE);
}
void TViswin::find_next()
{
int x;
if (_txt_to_find.empty() || _last_found.y == -1l)
beep();
else
{
long l = search(_txt_to_find, x, _point.y+(_down_dir ? 1l : -1l),
_down_dir, _case_sensitive);
if (l == -1)
beep();
else
goto_pos(l,x,FALSE);
}
}
void TViswin::show_rulers (bool on)
{
_rulers = on;
autoscroll(FALSE);
_textrows = TEXTROWS;
_textcolumns = TEXTCOLUMNS;
autoscroll(TRUE);
refresh();
}
// @doc INTERNAL
// @mfunc Mostra/nasconde i bottoni della finestra di anteprima
void TViswin::show_buttons(
bool on) // @parm Indica l'operazione da svolgere:
//
// @flag TRUE | Mostra i bottoni della finestra (default)
// @flag FALSE | Nasconde i bottoni della finestra
{
_showbuts = on;
autoscroll (FALSE);
_textrows = TEXTROWS;
_textcolumns = TEXTCOLUMNS;
autoscroll(TRUE);
for (int i = 0; i < _button.items(); i++)
((TPushbutton_control&)_button[i]).show(on);
refresh();
}
TViswin::TViswin(const char *fname,
const char *title,
bool editbutton,
bool printbutton,
bool linkbutton,
int x, int y,
int height, int width,
bool rulers, // overridden by config parms
WINDOW parent,
TBrowsefile_field* brwfld):
_filename (fname), _txt (fname, BUFFERSIZE), _islink (linkbutton), _isedit (editbutton),
_isprint (printbutton), _isbar (FALSE), _istimer (FALSE), _iscross (FALSE),
_isselection (FALSE), _sel_displayed (FALSE), _cross_displayed (FALSE),
_link_displayed (FALSE), _point_displayed (FALSE), _selecting (FALSE),
_scrolling (FALSE), _selflag (FALSE), _need_update (TRUE), _need_scroll (none),
_multiple (FALSE), _rulers(rulers), _txt_to_find(64),
_frozen (FALSE), _brwfld(brwfld), _link_button(NULL), _print_button(NULL),
_down_dir(TRUE), _showbuts(FALSE), _case_sensitive(FALSE),
_menu_present(FALSE), _regexp(FALSE)
{
begin_wait();
if (title == NULL)
title = (fname ? fname : "Anteprima di stampa");
_last_found.y = -1;
_isopen = fname == NULL || *fname <= ' ';
if (_isopen)
_filename = _txt.name ();
if (parent == NULL_WIN)
parent = TASK_WIN;
_toplevel = parent == TASK_WIN;
if (_toplevel)
{
// load info from config on buttons and rulers
TConfig cnf(CONFIG_USER, "Visualizzazione");
_showbuts = cnf.get_bool("Bottoni", NULL, -1,TRUE);
// Se rulers vale 3 allora leggi dal config il vero valore
if (_rulers != FALSE && _rulers != TRUE)
_rulers = cnf.get_bool("Righelli", NULL, -1,TRUE);
}
const int larg = 76;
const int alt = 20;
RCT r;
xvt_vobj_get_client_rect (parent, &r);
int maxlarg = width == 0 ? (r.right / CHARX - 6) : width;
int maxalt = height == 0 ? (r.bottom / CHARY - 6) : height;
if (_toplevel && larg > maxlarg)
maxlarg = larg;
if (_toplevel && alt > maxalt)
maxalt = alt;
for (int i = 0; i < 4; i++)
_modules.add(new TImage(BMP_MODULE1 + i), i);
_modules.add(new TImage(BMP_MODULE), i);
long flags = WSF_HSCROLL | WSF_VSCROLL;
if (_toplevel)
{
flags |= WSF_SIZE /* | WSF_CLOSE */;
}
WIN_TYPE rt = _toplevel ? W_DOC : W_PLAIN;
create(x, y, maxlarg, maxalt, title, flags, rt, parent,
_toplevel ? VISWIN_BAR : 0);
attach_interface(win(), BACKGROUND);
set_opaque_text (TRUE);
set_font (PRINT_FONT, XVT_FS_NONE, PRINT_HEIGHT);
if (_toplevel)
{
enable_menu_item(M_EDIT_COPY, FALSE);
enable_menu_item(M_SHOW_RULERS, TRUE);
enable_menu_item(M_SHOW_BUTTONS, TRUE);
check_menu_item(M_SHOW_RULERS, _rulers);
check_menu_item(M_SHOW_BUTTONS, _showbuts);
enable_menu_item(M_EDIT_SEL_ALL, FALSE);
}
if (_txt.lines() > 0l)
set_scroll_max (MAXLEN - 1, _txt.lines () <= _textrows ?
_txt.lines () : _txt.lines () - _textrows);
if (_toplevel)
{
add_button (DLG_QUIT, DLG_QUIT_TITLE, BMP_QUIT, BMP_QUITDN);
if (_isedit)
add_button (DLG_EDIT, DLG_EDIT_TITLE, BMP_EDIT);
if (_islink)
{
_link_button = add_button(DLG_LINK, DLG_LINK_TITLE, BMP_LINK);
_link_button->disable();
}
if (_isprint)
{
_print_button = add_button (DLG_PRINT, DLG_PRINT_TITLE, BMP_PRINT);
_print_button->disable();
enable_menu_item(M_EDIT_SEL_ALL, FALSE);
}
}
_curbut = 0;
if (_isopen && _showbuts)
_wtimer = xvt_timer_create(win(), 150l);
_point.set (0, 0);
autoscroll (FALSE);
_textrows = TEXTROWS;
_textcolumns = TEXTCOLUMNS;
autoscroll (TRUE);
_links = _toplevel ? &(printer().links()) : &(_brwfld->_links);
_multiple = _toplevel ? (printer ().ismultiplelink()) :
(_brwfld->is_multiple_link());
_bg = _toplevel ? &(printer().getbgdesc()) : _brwfld->get_bg_desc();
_formlen = _toplevel ? printer().formlen() : maxalt;
_linkID = -1;
_inside_linkexec = FALSE;
for (i = 0; i < _links->items (); i++)
{
TToken_string & t = (TToken_string &) (*_links)[i];
char f = *(t.get (1));
char b = *(t.get (2));
t.restart();
_txt.set_hotspots(f, b);
}
_hotspots = &(_txt.hotspots());
end_wait();
}
TViswin ::~TViswin ()
{
// avoid deleting child window (already deleted by mask)
if (!_toplevel) set_win(NULL_WIN);
}
///////////////////////////////////////////////////////////
// Campo di visualizzazione sulle maschere
///////////////////////////////////////////////////////////
// Certified 100%
TBrowsefile_field::TBrowsefile_field(TMask* m)
: TOperable_field(m), _viswin(NULL), _m_link(FALSE), _background(36), _lh(NULL)
{}
// Certified 100%
word TBrowsefile_field::class_id() const
{
return CLASS_BROWSEFILE_FIELD;
}
// Certified 100%
TBrowsefile_field::~TBrowsefile_field()
{
delete _viswin;
}
void TBrowsefile_field::parse_head(TScanner& scanner)
{
_ctl_data._width = scanner.integer();
_ctl_data._size = scanner.integer();
}
// Certified 100%
void TBrowsefile_field::create(WINDOW parent)
{
const TMask& m = mask();
_viswin = new TViswin(_ctl_data._prompt, _ctl_data._prompt, FALSE, FALSE, FALSE,
_ctl_data._x, _ctl_data._y, _ctl_data._size, _ctl_data._width,
_flags.rightjust ? TRUE : FALSE, parent, this);
WINDOW win = _viswin->win();
_dlg = _ctl_data._dlg;
_parent = parent;
xvt_vobj_set_enabled(win, enabled());
xvt_vobj_set_visible(win, shown());
}
long TBrowsefile_field::set_text(const char* file, const char* line)
// se line != NULL ritorna il numero dell'ultima riga del file che
// comincia (trimmata) come passato; se non la trova ritorna -1
{
FILE* instr = fopen(file,"r");
if (instr == NULL)
fatal_box("File non trovato: %s", file);
begin_wait();
TString256 tmpp;
long ret = -1l;
long lines = 0l;
while (!feof(instr))
{
if (fgets((char*)(const char*)tmpp, tmpp.size(), instr) == NULL)
break;
char& last = tmpp[tmpp.len()-1];
if (last == '\n') last = '\0';
add_line(tmpp);
if (line != NULL)
{
if (tmpp.find(line) != -1)
ret = lines;
}
lines++;
}
fclose(instr);
_viswin->close_print();
end_wait();
return ret;
}
int TBrowsefile_field::find_link(const char* descr)
{
for (int i = 0; i < _links.items(); i++)
{
TToken_string& tt = (TToken_string&)_links[i];
const TFixed_string d(tt.get(0));
if (d == descr)
return i;
}
return -1;
}
int TBrowsefile_field::enable_link(const char *descr, char fg, char bg)
{
int lnk = find_link(descr);
if (lnk < 0)
{
TToken_string *tt = new TToken_string(30);
char b[2] = { '\0', '\0' };
tt->add(descr);
b[0] = fg;
tt->add(b);
b[0] = bg;
tt->add(b);
lnk = _links.add(tt);
_viswin->_txt.set_hotspots(fg, bg);
}
return lnk;
}
void TBrowsefile_field::disable_link(char fg, char bg)
{
for (int i = 0; i < _links.items (); i++)
{
TToken_string & t = (TToken_string&)_links[i];
const char f = *(t.get(1));
const char b = *(t.get());
if (f == fg && b == bg)
{
_links.remove(i, TRUE);
break;
}
}
}
void TBrowsefile_field::set_background(const char* bg)
{
printer().parse_background(bg,_background);
}
void TBrowsefile_field::add_line(const char* l)
{
_viswin->add_line(l);
}
void TBrowsefile_field::close()
{
_viswin->close_print();
}
void TBrowsefile_field::goto_pos(long r, long c)
{
_viswin->goto_pos(r,c,TRUE);
}
void TBrowsefile_field::goto_top()
{
_viswin->goto_top();
}
void TBrowsefile_field::goto_end()
{
_viswin->goto_end();
}
void TBrowsefile_field::refresh()
{
_viswin->refresh();
}
const char* TBrowsefile_field::get_text(long line, int column, int len)
{
return _viswin->_txt.line(line,(long)column, len);
}
long TBrowsefile_field::lines()
{
return _viswin->_txt.lines();
}