home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 26
/
CD_ASCQ_26_1295.iso
/
vrac
/
viewer15.zip
/
HELVB.FON
/
fnt
next >
Wrap
Text File
|
1993-11-23
|
17KB
|
637 lines
b, short a1, short b1, char *ti ) {
// Setto i dati e modalita'
x = a; y = b;
x1 = a1; y1 = b1;
sfondo = sf;
// Verifico il titolo
if( ti ) strcpy( titolo, ti );
else *titolo = '\0'; // Annullo il titolo
Draw(); // Disegno la finestra
};
// Disegno la finestra ed il contenuto
void Wind::Draw() {
size_t len;
// Disegna il primo contorno
_setcolor( 8 );
_rectangle( _GBORDER, x, y, x1, y1 );
// Disegno linee di riempimento
_setcolor( 7 );
_rectangle( _GBORDER, x + 1, y + 1, x1 - 1, y1 - 1 );
_rectangle( _GBORDER, x + 2, y + 2, x1 - 2, y1 - 2 );
// Verifico la lunghezza del titolo, nel caso che sia > 0
// il titolo c'e' occorre disegnare lo spazio per esso
if( ( len = strlen( titolo ) ) > 0 ) {
short spess = 4 + TXT_HGT + 4;
// Disegno spazio per il titolo della finestra
_rectangle( _GFILLINTERIOR, x + 1, y + 1, x1 - 1, y + spess );
// Disegno il secondo contorno
_setcolor( 8 );
_rectangle( _GBORDER, x + 3, y + spess + 1, x1 - 3, y1 - 3 );
// Disegno l'interno della finestra con il colore di sfondo prescelto
_setcolor( sfondo );
_rectangle( _GFILLINTERIOR, x + 4, y + spess + 2, x1 - 4, y1 - 4 );
// Stampo a video anche il titolo
_moveto( ( x + 3 ) + ( ( ( x1 - 3 ) - ( x + 3 ) ) / 2 ) -
( TXT_WDT * len ) / 2, ( y + 1 ) + ( ( ( y + spess ) - ( y + 1 ) ) / 2 ) -
( TXT_HGT / 2 ) );
_setcolor( 0 );
_outgtext( titolo );
}
else {
// Disegno il secondo contorno
_setcolor( 8 );
_rectangle( _GBORDER, x + 3, y + 3, x1 - 3, y1 - 3 );
// Disegno l'interno della finestra con il colore di sfondo prescelto
_setcolor( sfondo );
_rectangle( _GFILLINTERIOR, x + 4, y + 4, x1 - 4, y1 - 4 );
}
};
// Distruttore della finestra
Wind::~Wind() {
// Ricopro la zona con il colore nero
_setcolor( col_Viewer );
_rectangle( _GFILLINTERIOR, x, y, x1, y1 );
};
// Implementazione metodi per la gestione dell'apertura di un file
// tramite Dialog_Box
// La funzione crea la finestra e setta il tipo di dati da prelevare
WinOpen::WinOpen( short a, short b, char *ntp, char *title ) {
// Setta il numero di file prelevati
max_files = win_files = 0;
// Setta il numero di direttori prelevati
max_drive = win_drive = 0;
// Setto le coordinate d'ingombro delle finestre
x = a; y = b;
// Setto anche i tipi di files da prelevare
strcpy( type, ntp );
// Disegno l'ingombro delle finestre
finestra = new Wind( col_WOpen, x, y - 15, x + 400, y + 200, title );
// Setta tipo di scrittura
_registerfonts( "oem08.fon" );
_setfont( "t'oem08'h5w5b" );
// Scrivo il nome del file
_setcolor( 0 );
_moveto( x + 10, y + 10 );
_outgtext( "NAME:" );
_rectangle( _GBORDER, x + 55, y + 7, x + 400 - 20, y + 19 );
// Finestra con la lista dei files e dei direttori
_setcolor( 0 );
_moveto( x + 10, y + 30 );
_outgtext( "Files" );
_rectangle( _GBORDER, x + 10, y + 40, x + 218, y + 150 );
// Finestra con la lista dei drive disponibili
_setcolor( 0 );
_moveto( x + 240, y + 30 );
_outgtext( "Drives" );
_rectangle( _GBORDER, x + 240, y + 40, x + 350, y + 150 );
// Disegno la barra per il caricamento dei files
_moveto( x + 15, y + 160 ); _outgtext( "0%" );
_moveto( x + 353, y + 160 ); _outgtext( "100%" );
_setcolor( 1 );
_rectangle( _GFILLINTERIOR, x + 31, y + 160, x + 351, y + 170 );
};
// Distruttore della classe wopen
WinOpen::~WinOpen() {
// Elimino la finestra generata
delete finestra;
};
// La funzione legge tutti i files dal direttorio corrente
// e li depone nella lista, che poi viene utilizzata per la selezione
void WinOpen::LoadList() {
struct find_t c_file;
unsigned rtes, j, drives, odrv, ndrv, k;
char names[ 128 ];
// Compongo il percorso per la ricerca dei direttori
strcpy( names, work_dir ); strcat( names, "\\" );
strcat( names, "*." );
// Dapprima prelevo tutti i nomi dei direttori
for( _dos_findfirst( names, _A_SUBDIR, &c_file ), j = rtes = 0;
rtes == 0;
rtes = _dos_findnext( &c_file ) ) {
// Controllo se il direttorio e' '.' non lo inserisco
if( strcmp( c_file.name, "." ) ) {
// Solo se il file e' di tipo sottodirettorio lo inserisco
if( c_file.attrib == _A_SUBDIR ) {
// Memorizzo il nome ed il tipo
strcpy( lista[ j ].name, c_file.name );
lista[ j++ ].attrib = _A_SUBDIR;
}
}
}
// Compongo il percorso per la ricerca dei files
strcpy( names, work_dir ); strcat( names, "\\" );
strcat( names, type );
// Dapprima prelevo tutti i nomi dei files
for( _dos_findfirst( names, _A_ARCH, &c_file ), rtes = 0;
rtes == 0;
rtes = _dos_findnext( &c_file ) ) {
// Controllo se e' stato prelevato un archivio
if( c_file.attrib == _A_ARCH ) {
// Memorizzo il nome ed il tipo
strcpy( lista[ j ].name, c_file.name );
lista[ j++ ].attrib = _A_NORMAL;
}
}
// Setto il numero massimo di files selezionati
max_files = j;
// Setto il numero massimo di files visibili in finestra
win_files = ( max_files < 10 ) ? max_files : 10;
// Prelevo il drive di default
_dos_getdrive( &odrv );
// Stampo anche il numero massimo di drive disponibili
for( j = k = 0; j < 27; j++ ) {
// Eseguo il settaggio di tutti i drive disponibili
_dos_setdrive( j, &drives );
// Controllo se e' stato settato
_dos_getdrive( &ndrv );
// Se il drive e' stato settato lo memorizzo nel vettore dei drives
if( ndrv == j ) _drives[ k++ ] = 'A' + ndrv - 1;
}
// Quindi setto il numero massimo di drives disponibili
max_drive = k;
win_drive = ( max_drive < 10 ) ? max_drive : 10;
// Ripristino drives originale
_dos_setdrive( odrv, &drives );
};
// La funzione data una struttura di tipo file analizza il tipo di
// dato in esso contenuto, file o directory e quindi restituisce
// un buffer con il nome corretto, nel caso sia un direttorio
char *WinOpen::CorrectName( file fl ) {
size_t j;
static char pname[ 64 ];
// Copio il nome nel buffer secondario
strcpy( pname, fl.name );
// Controllo il tipo di dato
if( fl.attrib == _A_SUBDIR ) {
// Inserisco gli spazi nel nome
for( j = strlen( pname ); j < 15; j++ ) pname[ j ] = ' ';
pname[ j ] = '\0'; // Inserisco il null
// Quindi copio la proprieta'
strcat( pname, "<DIR>" );
}
// Ritorno la variabile contenente il nome
return pname;
};
// La funzione permette di selezionare il file
void WinOpen::SelectFiles() {
short x1, y1;
char fname[ 128 ];
// Il valore di fval e' sempre compreso fra 1 e 10
x1 = x + 18;
y1 = y + 48 + 10 * ( fval - 1 );
// Quindi disegno la nuova selezione
_setcolor( 0 );
_rectangle( _GFILLINTERIOR, x1 - 2, y1 - 2, x1 + 180, y1 + 8 );
// Disegno anche il testo
_setcolor( 15 );
_moveto( x1, y1 );
// Scrivo il file evidenziato
_outgtext( CorrectName( lista[ firstf + fval - 2 ] ) );
// Pulisco il rettangolo con il nome
_setcolor( 15 );
_rectangle( _GFILLINTERIOR, x + 56, y + 8, x + 379, y + 18 );
// Sposto il cursore e setto il colore
_moveto( x + 60, y + 10 ); _setcolor( 0 );
// Compongo parte del nome
strcpy( fname, work_dir ); strcat( fname, "\\" );
strcat( fname, lista[ firstf + fval - 2 ].name );
// Quindi scrivo anche il nome del direttorio se e' tale
if( lista[ firstf + fval - 2 ].attrib == _A_SUBDIR ) {
// Accodo lo slash che indica che e'' un direttorio
strcat( fname, "\\" );
}
// Alla fine stampo il risultato
_outgtext( fname );
};
// La funzione permette di selezionare il drive
void WinOpen::SelectDrive() {
short x1, y1;
char driv[ 3 ];
// Il valore di dval e' sempre compreso fra 1 e 10
x1 = x + 251;
y1 = y + 48 + 10 * ( dval - 1 );
// Quindi disegno la nuova selezione
_setcolor( 0 );
_rectangle( _GFILLINTERIOR, x1 - 2, y1 - 2, x1 + 80, y1 + 8 );
// Disegno anche il testo
_setcolor( 15 );
_moveto( x1, y1 );
// Compongo il nome del drive
driv[ 0 ] = _drives[ firstd + dval - 2 ];
driv[ 1 ] = ':';
driv[ 2 ] = '\0';
// Scrivo il file evidenziato
_outgtext( driv );
};
// La funzione stampa la lista dei files a cominciare
// dal valore specificato
void WinOpen::PrintFiles() {
size_t k;
short nnum, y1;
struct xycoord poly[ 3 ];
// Prima di tutto eseguo la cancellazione del contenuto della finestra
_setcolor( 15 );
_rectangle( _GFILLINTERIOR, x + 12, y + 42, x + 216, y + 148 );
// Setto il colore per la stampa dei nomi dei files
_setcolor( 0 ); nnum = ( ( firstf + 9 ) < max_files ) ? ( firstf + 9 ) : max_files;
// Stampo anche la ScrollBar
_rectangle( _GBORDER, x + 200, y + 45, x + 210, y + 145 );
// Controllo se e' il primo files
if( ( firstf - 1 ) > 0 ) {
// Setto le coordinate per fare il triangolino
poly[ 0 ].xcoord = x + 209;
poly[ 0 ].ycoord = y + 54;
poly[ 1 ].xcoord = x + 201;
poly[ 1 ].ycoord = y + 54;
poly[ 2 ].xcoord = x + 205;
poly[ 2 ].ycoord = y + 45;
// Disegno il poligono
_polygon( _GFILLINTERIOR, 3, poly );
}
// Stampo anche il triangolino in basso
if( nnum < max_files ) {
// Setto i vertici del nuovo triangolino
poly[ 0 ].xcoord = x + 201;
poly[ 0 ].ycoord = y + 136;
poly[ 1 ].xcoord = x + 209;
poly[ 1 ].ycoord = y + 136;
poly[ 2 ].xcoord = x + 205;
poly[ 2 ].ycoord = y + 145;
// Disegno il poligono
_polygon( _GFILLINTERIOR, 3, poly );
}
// Stampo la lista dei files
for( k = firstf - 1, y1 = y + 48; k < nnum; k++, y1 += 10 ) {
// Sposto il cursore
_moveto( x + 18, y1 );
// Scrivo il nome
_outgtext( CorrectName( lista[ k ] ) );
}
};
// La funzione stampa la lista dei drives a cominciare
// dal valore specificato
void WinOpen::PrintDrive() {
char driv[ 3 ];
size_t k;
short nnum, y1;
struct xycoord poly[ 3 ];
// Prima di tutto eseguo la cancellazione del contenuto della finestra
_setcolor( 15 );
_rectangle( _GFILLINTERIOR, x + 245, y + 42, x + 345, y + 148 );
// Setto il colore per la stampa dei nomi dei files
_setcolor( 0 ); nnum = ( ( firstd + 9 ) < max_drive ) ? ( firstd + 9 ) : max_drive;
// Stampo anche la ScrollBar
_rectangle( _GBORDER, x + 334, y + 45, x + 344, y + 145 );
// Controllo se e' il primo files
if( ( firstd - 1 ) > 0 ) {
// Setto le coordinate per fare il triangolino
poly[ 0 ].xcoord = x + 343;
poly[ 0 ].ycoord = y + 54;
poly[ 1 ].xcoord = x + 335;
poly[ 1 ].ycoord = y + 54;
poly[ 2 ].xcoord = x + 339;
poly[ 2 ].ycoord = y + 45;
// Disegno il poligono
_polygon( _GFILLINTERIOR, 3, poly );
}
// Stampo anche il triangolino in basso
if( nnum < max_drive ) {
// Setto i vertici del nuovo triangolino
poly[ 0 ].xcoord = x + 335;
poly[ 0 ].ycoord = y + 136;
poly[ 1 ].xcoord = x + 343;
poly[ 1 ].ycoord = y + 136;
poly[ 2 ].xcoord = x + 339;
poly[ 2 ].ycoord = y + 145;
// Disegno il poligono
_polygon( _GFILLINTERIOR, 3, poly );
}
// Stampo la lista dei files
for( k = firstd - 1, y1 = y + 48; k < nnum; k++, y1 += 10 ) {
// Sposto il cursore
_moveto( x + 251, y1 );
// Creazione del drive attivo
driv[ 0 ] = _drives[ k ]; driv[ 1 ] = ':'; driv[ 2 ] = '\0';
// Scrivo il nome
_outgtext( driv );
}
};
// La funzione data la stringa di lavoro inserisce il null eliminando
// un ramo di direttorio
void WinOpen::CTree() {
size_t j;
// Inserisce un null al posto dell'ultimo slash, eliminando un direttorio
for( j = strlen( work_dir ) - 1; j > 0; j-- )
if( work_dir[ j ] == '\\' ) { work_dir[ j ] = '\0'; break; }
};
// Disegno della percentuale nella finestra di open files
void WinOpen::bars( size_t flen, size_t act ) {
short cx1, cy1, cx2, cy2;
float inc;
cx1 = x + 31; // Ingombro
cy1 = y + 160; // della Barra del %
cx2 = x + 351;
cy2 = y + 170;
inc = ( float( cx2 - cx1 ) / flen ) * act;
// Setta il colore blue
_setcolor( 4 );
_rectangle( _GFILLINTERIOR, cx1, cy1, cx1 + (short)inc, cy2 );
};
// La funzione Seleziona il file dato il tipo
void WinOpen::Validate() {
short dato;
int ch;
char uscita = FALSE;
char mode = FALSE, right = FALSE;
char directory[ 4 ];
// Resetto la stringa contenente il nome del file
output.reset();
// Attenzione prima prelevo il direttorio di lavoro
getcwd( work_dir, 63 );
// Carico la lista dei files
LoadList();
// Stampo la lista dei files e la selezione del primo
firstf = firstd = fval = dval = 1;
PrintFiles(); SelectFiles();
PrintDrive(); SelectDrive();
// Attivo il rettangolo di selezione per la modalita' di lavoro sui files
_setcolor( 0 );
_rectangle( _GBORDER, x + 8, y + 38, x + 220, y + 152 );
// Eseguo la lettura di un carattere alla volta
for( ;; ) {
// Se il tasto e' stato premuto eseguo l'azione
while( !kbhit() ) {}
// Verifico il tasto
switch( ch = getch() ) {
case 0 : mode = TRUE; break;
case 27 : uscita = TRUE; break;
case 80 : // Tasto down
// Controllo se mode e' vero
if( mode ) {
// Controllo se sto manipolando i drive o i files
if( right ) {
// Controllo il valore rispetto al numero massimo di drive
if( dval < win_drive ) {
// Ristampo la lista dei drive
dval++; PrintDrive(); SelectDrive();
}
else // Controllo quanti drive ci sono in lista
// Increemento il numero di item dal quale stampare
if( ( firstd + 9 ) < max_drive ) {
// Stampo la lista dei drive
firstd++; PrintDrive(); SelectDrive();
}
}
else {
// Controllo il valore
if( fval < win_files ) {
// Ristampo la lista dei files
fval++; PrintFiles(); SelectFiles();
}
else // Controllo quanti files ci sono in lista
// Incremento il numero di item dal quale stampare
if( ( firstf + 9 ) < max_files ) {
// Stampo la lista dei files
firstf++; PrintFiles(); SelectFiles();
}
}
// Resetto il tasto speciale
mode = FALSE;
}
break;
case 72 : // Tasto up
// Controllo se mode e' vero
if( mode ) {
// Controllo se sto lavorando con la modalita' files
if( right ) {
// Se fval e' valido seleziono il nome del drive
if( dval > 1 ) {
// Stampo la lista dei drive
dval--; PrintDrive(); SelectDrive();
}
else { // Controllo il valore di firstd
if( firstd > 1 ) {
// Stampo il valore della lista dei drive
firstd--; PrintDrive(); SelectDrive();
}
}
}
else {
// Se fval e' valido seleziono il nome del file
if( fval > 1 ) {
// Stampo la lista di files
fval--;
PrintFiles();
SelectFiles();
}
else { // Controllo il valore di firstf
if( firstf > 1 ) {
// Stampo il valore della lista dei files
firstf--;
PrintFiles();
SelectFiles();
}
}
}
// Resetto il tasto speciale
mode = FALSE;
}
break;
case 77 : // Pressione del tasto destro spostamento nella selezione dei drive
// Controllo se stavo gia' lavorando sui drive
if( !right ) {
// Disattivo il rettangolo di selezione dei file
_setcolor( col_WOpen );
_rectangle( _GBORDER, x + 8, y + 38, x + 220, y + 152 );
// Attivo il rettangolo di selezione dei drive
_setcolor( 0 );
_rectangle( _GBORDER, x + 238, y + 38, x + 352, y + 152 );
}
// Setto a true la modalita' di lavoro nei drives
right = TRUE;
break;
case 75 : // Pressione del tasto sinistro spostamento nella selezione dei files