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