campo-sirio/include/viswin.h

230 lines
9.5 KiB
C
Raw Normal View History

/* This is really -*-c++-*- */
#ifndef __VISWIN_H
#define __VISWIN_H
#ifndef __WINDOW_H
#include <window.h>
#endif
#ifndef __STRINGS_H
#include <strings.h>
#endif
#ifndef __TEXTFILE_H
#include <text.h>
#endif
class TBrowsefile_field;
class TViswin : public TScroll_window
{
friend class TBrowsefile_field; // yes, perche' puo' anche essere un controllo di una mask
enum { MAXBUT = 4, MAXLEN = 256, BUFFERSIZE = 256, MAXPIC=4};
enum scroll { none, up, down, left, right };
TFilename _filename; // name of visfile
bool _islink; // "link" button present
bool _isedit; // "edit" button present
bool _isprint; // "print" button present
bool _iscross; // crossbars being drawn
bool _selecting; // selection in progress
bool _isselection; // selection active
bool _isbar; // X-bar drawn instead of cursor at point
bool _scrolling; // scrolling in progress
bool _need_update; // full update required
bool _istimer; // timer successivo attivo?
bool _isopen; // new lines may arrive
bool _selflag;
bool _sel_displayed; // selezione evidenziata
bool _link_displayed; // link ipertestuale evidenziato
bool _cross_displayed; // visualizzato cursore a croce
bool _point_displayed; // visualizzato cursore a carattere
long _timer; // timer per evitare autorepeat tasti
long _wtimer; // wait timer before close()
scroll _need_scroll; // scrolling required?
bool _wasneeded; // flag for smart painting
WINDOW _button[MAXBUT]; // button array
int _curbut; // button which currently has focus
int _buttons; // button count
WINDOW _link_button; // ID bottone "Collega"
WINDOW _print_button; // ID bottone "Stampa"
long _textrows; // righe di testo
long _textcolumns; // indovina indovinello
TTextfile _txt; // text being displayed
long _firstline; // 1rst text line being displayed
long _lastline; // last text line being displayed
// Ricerca testo
TString _txt_to_find; // text to find
TPoint _last_found; // position of last find
bool _down_dir; // search direction
bool _case_sensitive; // case sensitivity
int _formlen; // length of a page
TPoint _point; // current point position
PNT _cross; // current crossbar point
TPoint _sel_start; // start of selection (column, line of FILE)
TPoint _sel_end; // end of selection (ibidem)
TArray* _links; // admitted links
TArray* _hotspots; // hotspots
TArray* _bookmarks; // bookmarks
bool need_paint_sel(bool smart = TRUE);
TArray _modules; // Scrolling module icons
TArray _images; // pictures properly resized
// link multiplo: se si' vengono passati all'handler tutti i link presenti sulla
// stessa riga anziche' solo il selezionato
bool _multiple; // si/no
TString80 _linktxt; // testo del link
int _linkID; // ID del link specificata
TToken_string _multiple_link; // tutti i link della riga
TArray* _bg; // internal structure to hold parsed background
bool _frozen; // non si tocca piu' nulla (files temp. cancellati), gestito internamente
bool _toplevel; // e' una finestra colle palle (se FALSE e' un campo di una mask)
bool _rulers; // righello mostrato
bool _showbuts; // bottoni mostrati
bool _inside_linkexec; // var di comodo per sapere se si sta attivando un link
bool _menu_present; // c'e' il menu specifico della viswin
// viene istanziato soltanto se e' usata come controllo BROWSEFILE in una mask
TBrowsefile_field* _brwfld;
protected:
virtual bool on_key (KEY);
virtual void open();
int tabx(int x) const; // Convert charx to pixels
int taby(int y) const; // Convert chary to pixels
void shift_screen(scroll); // shift di 1 su, giu', dx, sin a seconda di scroll passato
void paint_screen(); // pittura lo schermo sulla porzione corrente di testo
void draw_crossbars(); // pittura il cursore a crossbar in xor
// pittura header (righello)
void paint_header();
// pittura il cursore (in xor) nello stile del momento, se
// necessario e erase == TRUE cancella quello di prima
void paint_point(bool erase = FALSE);
// pittura la riga r (in coordinate testo)
void paint_row(long r);
// pittura una sola colonna: se end == true e' l'ultima e implica uno scroll orizz. avvenuto
void paint_column(long r, bool end);
// pittura (in xor) la selezione corrente a meno che non sia gia' pitturata
void paint_selection();
// controlla l'immaginetta di 'busy'; xor serve solo per UNIX, dove si
// pittura una barretta che viene cancellata alla prossima paint
void paint_waitbar(bool xor = TRUE);
// pittura il background specificato a riga long e colonna int
void paint_background(long, int);
// chiama l'editor definito nei parametri con il testo corrente
bool call_editor();
// utility per sapere se il punto e' nel testo mostrato
bool in_text(const TPoint& p) const;
WINDOW add_button(short id, const char* caption);
void repos_buttons();
// assicura che la selezione rimanga nei limiti fisici del testo
void adjust_selection(TPoint& p1, TPoint& p2);
// interfaccia furba a paint_selection: display mostra se non c'e', erase cancella se c'e'
void display_selection();
void erase_selection();
// interfaccia furba a paint_point (se cross): display mostra se non c'e', erase cancella se c'e'
void display_crossbar();
void erase_crossbar();
// interfaccia furba a paint_point (se point): display mostra se non c'e', erase cancella se c'e'
void display_point();
void erase_point();
// controlla se la nuova posizione cursore (se NULL e' il curs. corrente) cade su un
// link ipertestuale e si comporta di conseguenza
bool check_link(TPoint* where = NULL);
// sistema x1 e x2 in modo che il minore sia il primo, e controlla che y sia
// nel testo (box e' su una sola riga, usata solo per i link)
bool adjust_box(long& x1, long& x2, long y);
// display mostra il link ipertestuale se non c'e', erase cancella se c'e'
void paint_link(long, long, long);
void erase_link(long, long, long);
// mostra in xor sto cazzo di link ipertesticolare (usata da paint/erase link)
void display_link(long, long, long, const char*);
// usata internamente per bloccare l'aggiunta di nuove righe
void freeze() { _frozen = TRUE; }
// chiama l'handler del link se si preme collega o si batte spazio su un link
void exec_link();
// controlla la generazione del menu indice se ci sono bookmarks
void build_index_menu();
protected:
// chiamata quando si fa uno scroll impossibile da x,y
// fa beep e torna li'
void scroll_error(long x, long y);
// son tutte figlie di mamma application
virtual void update();
virtual void handler(WINDOW win, EVENT* ep);
void check_menu_item(MENU_TAG item, bool on = TRUE);
void enable_menu_item(MENU_TAG item, bool on = TRUE);
public:
// gestione "collegamenti": vengono passati il testo completo,
// il punto di inizio selezione e quello di fine selezione; se
// non c'e' selezione non viene chiamata affatto (il bottone non fa nulla)
// Se serve, si faccia stop_run() qui dentro
virtual void process_link(TTextfile& txt, TPoint start, TPoint end) { }
// termina la stampa su video e crea il menu indice se c'e'
void close_print();
bool frozen() { return _frozen; }
// terminazione by user (ESC durante stampa)
void abort_print();
long lines() { return _txt.lines(); }
TTextfile& text() { return _txt; }
// bound to keys and menu actions
void goto_end();
void goto_top();
void goto_pos(long r, long c, bool moveorigin = TRUE);
void refresh();
void show_rulers (bool on = TRUE);
void show_buttons(bool on = TRUE);
// usata da chi la usa (es. printer) per stampare nella finestra
void add_line(const char* l);
// non-interactive search and replace
long search (const char* txt, int& pos, long from = 0,
bool down = TRUE, bool casesens = FALSE);
int replace(long line, const char* txt, int pos = 0, int len = -1);
// interactive search (con maschera, bound to F7/F8)
void find();
void find_next();
TViswin (const char* fname = NULL,
const char* title = NULL,
bool editbutton = TRUE,
bool printbutton = TRUE,
bool linkbutton = TRUE,
int x = -1,
int y = -1,
int height = 0,
int width = 0,
bool rulers = TRUE,
WINDOW parent = NULL_WIN,
TBrowsefile_field* = NULL);
virtual ~TViswin ();
};
#endif