guy d1852229ad Patch level :
Files correlati     : agalib
Ricompilazione Demo : [ ]
Commento            :
Implementato di meccanismo generico di blocco degli inserimenti,
attivabile nelle singole applicazioni (cg2 e ve0)


git-svn-id: svn://10.65.10.50/branches/R_10_00@22420 c028cbd2-c16b-5b4b-a496-9718f37d4682
2011-09-22 15:24:04 +00:00

211 lines
7.4 KiB
C++
Executable File

#ifndef __TEXTFILE_H
#define __TEXTFILE_H
#ifndef __ARRAY_H
#include <array.h>
#endif
#ifndef __STRINGS_H
#include <strings.h>
#endif
#ifndef __RELATION_H
class TRelation;
#endif
#ifndef __WINDOW_H
struct TPoint;
#endif
// @doc INTERNAL
// @enum direction | Direzioni da seguire nella lettura del file di testo
enum direction {
up, // @emem Direzione verso l'alto
down, // @emem Direzione verso il basso
updown}; // @emem Entrambe le direzioni
// @doc INTERNAL
// @enum style | Stile del carattere da utilizzare per il disegno del testo
enum style {
normal, // @emem Stile carattere normale
bold, // @emem Stile carattere in grassetto
italic, // @emem Stile carattere in corsivo
underlined, // @emem Stile carattere sottolineato
tabbed // @emem Stile di comodo per tabulazioni
};
// @doc EXTERNAL
// @class TTextfile | Classe per la definizione delle procedure di stampa di un testo
//
// @base public | TObject
class TTextfile: public TObject
// @author:(INTERNAL) Villa
// @access:(INTERNAL) Private Member
{
// @ccost:(INTERNAL) DEFAULT_PAGESIZE | 128 | Dimensione di default della pagina
enum {DEFAULT_PAGESIZE = 128};
// @cmember:(INTERNAL) Pagina di testo correntemente in memoria
TArray _page;
// @cmember:(INTERNAL) Un bit per ogni riga, TRUE se ci si e' fatto replace
TBit_array _dirty_lines;
// @cmember:(INTERNAL) Inizio della pagina in coordinate testo
long _page_start;
// @cmember:(INTERNAL) Fine della pagina in coordinate testo
long _page_end;
// @cmember:(INTERNAL) Numero di righe di <p _page>
word _page_size;
// @cmember:(INTERNAL) Numero totale delle linee di testo
long _lines;
// @cmember:(INTERNAL) Numero della linea corrente
long _cur_line;
// @cmember:(INTERNAL) Nome del file di testo (puo' essere temporaneo)
TFilename _filename;
// @cmember:(INTERNAL) Nome del file indice (sempre temporaneo)
TFilename _indname;
// @cmember:(INTERNAL) Puntatore al file indice
FILE* _index;
// @cmember:(INTERNAL) Puntatore al file di testo
FILE* _instr;
// @cmember:(INTERNAL) Direzione ottimale di lettura del file (vedi <t direction>)
direction _direction;
// @cmember:(INTERNAL) Piece corrente
int _item;
// @cmember:(INTERNAL) Testo della riga corrente
TToken_string _line;
// @cmember:(INTERNAL) Codifica delllo stile e del colore del carattere
long _styles[256];
// @cmember:(INTERNAL) Indica se la piece e' <e style.tabbed>
bool _tabbed_piece;
// @cmember:(INTERNAL) Punti ipertestuali come passati da utente (<c TViswin>)
TArray _hotspots;
// @cmember:(INTERNAL) Rappresentazione interna punti ipertestuali
TArray _spots;
// @cmember:(INTERNAL) Indice se e' stato modificato
bool _dirty;
// @cmember:(INTERNAL) Indica se i file sono aperti
bool _isopen;
// @cmember:(INTERNAL) Indica se si tratta di un file temporaneo
bool _istemp;
// @cmember:(INTERNAL) Indica se e' permesso dare una <mf TTextfile::append>
bool _accept;
// @cmember:(INTERNAL) Indica se si sta modificando con <mf TTextfile::add> e si puo' fare <mf TTextfile::replace>
bool _interactive;
// @cmember:(INTERNAL) Gestisce la sostituzione di campi al posto di tag nel testo
TRelation* _rel;
// @cmember:(INTERNAL) Riempe la pagina contenente <p line>, ottimizzando start ed end
void _read_page(long line);
// @cmember:(INTERNAL) Ritorna TRUE se la roga <p l> e' nella pagina corrente
bool _in_page(long l)
{ return l >= _page_start && l < _page_end; }
// @cmember:(INTERNAL) Salva i replace fatti sul file (anche temporaneo)
void _save_changes();
// void _parse_style(long j);
// @cmember:(INTERNAL) Traduce il tag dello stile passato in <p c> (tag) con uno di <t style> (stile XVT)
style _trans_style(char c);
// @access Public Member
public:
// @cmember Ritorna il numero totale delle linee di testo
long lines() const
{ return _lines; }
// @cmember Ritorna se sono state effettuate delle modifiche
bool changed() const
{ return _dirty; }
// @cmember Ritorna il numero di righe per pagina
word page_size() const { return _page_size; }
// @cmember Ritorna la stringa di caratteri senza formattazione
const char* line(long row, long column = 0, int howmuch = -1);
// @cmember Ritorna la stringa di caratteri con la formattazione
const char* line_formatted(long row);
// @cmember Aggiunge una riga al text (con i formati del caso)
bool append(const char* l);
// @cmember Chiude tutti i files per poter copiare o eseguire operazioni. Dopo aver chiamato
// questa funzione non si puo' piu' fare nulla.
void close();
// @cmember Stampa su carta
void print();
// @cmember Chiude l'aggiunta di nuove linee
void freeze()
{ _accept = false; }
// @cmember Ritorna se e' possibile aggiungere delle nuove righe (TRUE se non vengono accettate)
bool frozen()
{ return !_accept; }
// @cmember Legge il testo formattato
void read_line(long j, long b = 0, bool pg = TRUE);
// @cmember Ritorna il pezzo di linea successivo con stile e colore
const char* piece();
// @cmember Ritorna lo stile del piece (vedi <t style>)
int get_style(int pos = -1);
// @cmember Ritorna il colore di background del piece
char get_background(int pos = -1);
// @cmember Ritorna il colore di foreground del piece
char get_foreground(int pos = -1);
// @cmember Ritorna gli attributi alla posizione <p pos>
long get_attribute(int pos = -1);
// @cmember Ritorna la parola alla posizione indicata
const char* word_at(long x, long y);
// @cmember Ritorna il pezzo di testo indicato (da <p form> a <p to>), allochera' un altro
// TText che deve essere disfatto dall'utente.
TTextfile* section(TPoint&, TPoint&)
{ return this; }
// @cmember Ritorna il nome del file su cui si sta lavorando
const char* name()
{ return (const char*)_filename; }
// @cmember Permette di settare il valore di <p _iteractive> (vedi sopra)
void interactive(bool on = TRUE)
{ _interactive = on; }
// @cmember Scrive il testo (non formattato) su file
bool write(const char* path, TPoint* from = NULL, TPoint* to = NULL);
// @cmember Scrive il testo (non formattato) su TString_array
void write(TString_array& a, TPoint* from = NULL, TPoint* to = NULL);
// @cmember Scrive il testo (non formattato) su file xls (tab separated text)
bool write_xls(const TFilename& xls);
// @cmember Disfa tutto e svuota il file
void destroy();
// @cmember Cerca una stringa di testo all'interno di una riga
long search (const char* txt, int& pos, long from = 0, bool down = TRUE, bool casesens = FALSE, bool regexp = FALSE);
// @cmember Sostituisce un testo all'interno di una riga
int replace(long line, const char* txt, int pos = 0, int len = -1);
// @cmember Permette di settare gli hot_spot
void set_hotspots(char fg, char bg = 'w');
// @cmember Ritorna l'array di hotspots
TArray& hotspots()
{ return _spots; }
// @cmember Associa una relazione che viene usata (nello stato corrente) per
// risolvere eventuali campi per merge (marcati nel testo come
// <lt>@file-<gt>fieldname@[format]@[len]@[just]<gt>
void set_relation(TRelation* r)
{ _rel = r; }
// @cmember Costruttore
TTextfile(const char* file = NULL, int pagesize = DEFAULT_PAGESIZE, direction preferred = updown, bool interactive = TRUE);
// @cmember Distruttore
virtual ~TTextfile();
};
#endif