// EDITOR DE TEXTO VERSION 1 (uno) -------SOLO UN AVANCE----------
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
void IniVideo( void );
void Exit( void );
void IniTexto( void );
void Ciclo( void );
void Pantalla( void );
#define DIM 200 // 200 RENGLONES DE 200 LETRAS CADA UNO
#define RENG 20 // 20 RENGLONES DE ALTO
#define COLS 80 // 80 LETRAS POR RENGLON
#define ENTER 10
#define BACKSPACE 263
#define TAB 9
WINDOW *win;
int Ren = 0, Col = 0; // POSICION INICIAL DEL CURSOR EN LA VENTANA
int VR_Arr=0, VR_Aba=RENG, VC_Izq=0, VC_Der=COLS; // AREA VISIBLE DEL TEXTO EN LA VENTANA
int RTexto=0, CTexto=0; // POSICION DEL CURSOR EN LA MATRIZ DEL TEXTO
char Texto[DIM][DIM];
void IniTexto( void ) { int x; for(x=0; x<DIM; x++) Texto[x][0]='\0'; } // SE VACIA LA MATRIZ DEL TEXTO
void IniVideo( void ) { win=initscr(); clear(); refresh(); cbreak(); keypad(win, TRUE); }
void Exit( void ) { refresh( ); endwin( ); exit(1); }
int main () // (#, FONT, BACKGROUND)
{ IniTexto( ); IniVideo( ); start_color( ); init_pair(1, COLOR_BLUE, COLOR_YELLOW); init_pair(2, COLOR_BLUE, COLOR_YELLOW); Ciclo( ); }
void Pantalla ( void )
{
int r=0,c=0, vr, vc; // r,c PARA LA PANTALLA, vr, vc PARA LA PARTE VISIBLE DEL TEXTO EN LA VENTANA
clear( );
for(vr=VR_Arr; vr<VR_Aba; vr++)
{
c=0;
for(vc=VC_Izq; vc<VC_Der; vc++) { move(r, c); printw("%c", Texto[vr][vc]); c++; }
r++;
}
}
void Ciclo(void)
{
int Tecla = 0, Cont=0;
move(10, 10); printw("Desplace el cursor con las teclas de flechita");
move(12, 10); printw("Presione <F5> para terminar");
move(14, 10); printw("De un teclazo para iniciar. . . ."); getch();
bkgd(COLOR_PAIR( 2 )); attron(COLOR_PAIR( 1 )); clear( );
for(;;)
{
move(Ren, Col);
Tecla = getch();
switch ( Tecla )
{ // ABAJO
case 258:
if ( Ren==RENG && VR_Aba<DIM ) { VR_Arr++; VR_Aba++; RTexto++; Pantalla(); } // HAY SCROLL HACIA ARRIBA
else if ( Ren==RENG && VR_Aba==DIM-1 ) { } // SE QUEDA COMO ESTA -no hay scroll-
else { Ren++; RTexto++; } // ESTA EN MEDIO -no hay scroll-
break;
// ARRIBA
case 259:
if ( Ren==0 && VR_Arr>0 ) { VR_Arr--; VR_Aba--; RTexto--; Pantalla(); } // HAY SCROLL HACIA ABAJO
else if ( !Ren && !VR_Arr ) { } // SE QUEDA COMO ESTA -no hay scroll-
else { Ren--; RTexto--; } // ESTA EN MEDIO -no hay scroll-
break;
// IZQUIERDA
case 260:
if ( Col==0 && VC_Izq>0 ) { VC_Izq--; VC_Der--; CTexto--; Pantalla(); } // HAY SCROLL HACIA LA DERECHA
else if ( Col==0 && VC_Der==0 ) { } // SE QUEDA COMO ESTA -no hay scroll-
else { Col--; CTexto--; } // ESTA EN MEDIO -no hay scroll-
break;
// DERECHA
case 261:
if (Col==COLS && VC_Der<DIM ) { VC_Izq++; VC_Der++; CTexto++; Pantalla(); } // HAY SCROLL HACIA LA IZQUIERDA
else if ( Col==COLS && VC_Der==DIM-1 ) {} // SE QUEDA COMO ESTA -no hay scroll-
else { Col++; CTexto++; } // ESTA EN MEDIO -no hay scroll-
break;
case 269: clear(); move(10, 10); printw("FIN DE LA EJECUCION...."); getch(); Exit(); // TECLA <F5>
default: // ES EL RANGO DE CARACTERES IMPRIMIBLES
if (Tecla >= 32 && Tecla <= 126 || Tecla == ENTER || Tecla == BACKSPACE || Tecla == TAB)
{
switch ( Tecla )
{
case TAB:
for(Cont=0; Cont < 8; Cont++) { Texto[RTexto][CTexto] = ' '; Col++; CTexto++; }
break;
case ENTER:
if ( Ren==RENG && VR_Aba<DIM ) { VR_Arr++; VR_Aba++; RTexto++; Pantalla(); }
else if ( Ren==RENG && VR_Aba==DIM-1 ) { }
else { Col=0; Ren++; RTexto++; CTexto=0; }
break;
case BACKSPACE: Col--; move(Ren, Col); printw(" "); break;
default:
Texto[RTexto][CTexto] = Tecla;
Col++; CTexto++;
}
}
}
refresh();
}
Exit();
}