EDITOR_PROY.c



// 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();
}