]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/gui.c
2262cc3f38e2227b6e211f7b0ebb16e177ff74d1
[z.facultad/75.06/emufs.git] / emufs_gui / gui.c
1
2 #include <stdlib.h>
3 #include <curses.h>
4 #include <menu.h>
5 #include <signal.h>
6 #include <string.h>
7 #include <stdarg.h>
8
9 #include "form.h"
10 #include "articulos.h"
11 #include "facturas.h"
12 #include "emufs.h"
13 #include "registros.h"
14
15 #define CTRLD 4
16
17 static void finish(int sig);
18
19 int main_menu();
20 void menu_articulos();
21 void menu_facturas();
22 void menu_mantenimiento();
23 void menu_estadisticas();
24 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg);
25
26 void ver_estadisticas(EMUFS *fp);
27
28 /* cuadro de msg. w y h son de la ventana padre */
29 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...);
30 void msg_box_free(WINDOW *padre, WINDOW *win);
31
32 typedef enum {PARAM_OK, SHOW_HELP, TIPO_NO_DEFINIDO, TIPO_INVALIDO, BLOQUE_NO_DEFINIDO} t_Param;
33
34 /* Verifica Argumentos */
35 t_Param param_ok(int argc, char *argv[])
36 {
37         int n,i;
38         for(i=1; i<argc; i++) {
39                 if ((strcmp(argv[i], "-h")==0) || (strcmp(argv[i], "--help")==0)) return SHOW_HELP;
40
41                 if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) {
42                         /* Luego del archivo XML debe seguir el tipo */
43                         if ((i+1)<argc) {
44                                 n = atoi(argv[i+1]);
45                                 if ((n < 1) || (n > 3)) return TIPO_INVALIDO;
46                                 if (((n == 1) || (n == 3)) && ((i+2)>=argc))
47                                         return BLOQUE_NO_DEFINIDO;
48                         } else {
49                                 /* Ops, no hay mas parametros */
50                                 return TIPO_NO_DEFINIDO;
51                         }
52                 }
53         }
54
55         return PARAM_OK;
56 }
57
58 void print_help(char *s)
59 {
60         printf("EMUFS - 1v0\n");
61         printf("Modo de uso : %s [<archivo articulos XML> tipo=[1|2|3]]\n", s);
62         printf("\nSi especifica un archivo XML desde donde cargar los articulos debera tambien especificar el tipo");
63         printf(" de archivo a crear, siendo 1, 2, 3\n");
64 }
65
66 int main(int argc, char *argv[])
67 {
68         int c, fin=0;
69         WINDOW *dialog;
70
71         switch (param_ok(argc, argv)) {
72                 case SHOW_HELP:
73                         print_help(argv[0]);
74                         return 0;
75                 case TIPO_NO_DEFINIDO:
76                         printf("Falta parámetro requerido.\nLuego del nombre del archivo debe especificar el tipo de archivo\n");
77                         return 1;
78                 case BLOQUE_NO_DEFINIDO:
79                         printf("Falta parámetro requerido.\nLuego del tipo de archivo debe especificar el tamaño del bloque a utilizar\n");
80                         return 1;
81                 case TIPO_INVALIDO:
82                         printf("Tipo de archivo no valido. Los valores posibles para el tipo de archivo son:\n");
83                         printf("\t1 - Archivo de bloque parametrizado y registro de long. variable.\n");
84                         printf("\t2 - Archivo de registros variables sin bloques.\n");
85                         printf("\t3 - Archivos de bloque parametrizado y registro de long. parametrizada.\n");
86                         return 2;
87                 case PARAM_OK:
88                         fin = 0;
89         }
90
91 #ifdef DEBUG
92         printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). ");
93         printf("Esto puede causar que ante un error alguna función trate de emitir un mensaje por pantalla ");
94         printf("haciendo que el aspecto visual se vea desvirtuado.\n\n");
95         printf("Todos los mensajes de error se envian por stderr, por lo que es conveniente que vuelva a ejecutar ");
96         printf("el programa de la siguiente manera :\n");
97         printf("\t#> %s <parametros> 2> error.log\n\n", argv[0]);
98         printf("De esta forma el SO se encargaga de redirigir stderr al archivo error.log y evitar algun problema en ");
99         printf("visualizacion de la aplicacion.\n");
100         printf("Para continuar **bajo su propio riesgo** presione una tecla. Puede cancelar la ejecucion en este punto con CTRL+C\n");
101         fgetc(stdin);
102 #endif
103
104         /* Inicio Curses */
105         signal(SIGINT, finish);
106         initscr();
107         keypad(stdscr, TRUE);
108         nonl();
109         cbreak();
110         noecho();
111         /* Si se soporta color, los inicializo */
112         if (has_colors()) {
113                 start_color();
114                 /* Simple color assignment, often all we need. */
115                 init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); /* COLOR_PAIR(1) */
116                 init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
117                 init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
118                 init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
119                 init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
120                 init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
121                 init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
122                 init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
123         }
124         
125         /* Verifico un tamaño minimo de consola */
126         if ((LINES < 25) || (COLS < 80)) {
127                 endwin();
128                 printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
129                 return 1;
130         }
131
132         /* Ventana, caracter para linea vertical, caracter para linea horizontal*/
133         box(stdscr, ACS_VLINE, ACS_HLINE);
134         /* Ventana, Y, X, Texto */
135         mvwaddstr(stdscr, 1, 1, "EMUFS");       
136         attron(COLOR_PAIR(2));
137         mvwaddstr(stdscr, LINES-2, 1, "EMUFS (c) The EMUFS Team - Bajo Licencia GNU/GPL");      
138         attroff(COLOR_PAIR(2));
139         wrefresh(stdscr);
140
141         dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ...");
142         if (argc == 4) {
143                 art_cargar(argv[1], atoi(argv[2]), atoi(argv[3]));
144                 if (!fact_cargar("facturas.xml", 1, 400))
145                         fprintf(stderr, "ERROR CARGANDO FACTURAS\n");
146         } else
147                 art_cargar(NULL, -1, -1);
148
149         msg_box_free(stdscr, dialog);
150
151         /* CICLO PRINCIPAL DE LA APLICACION */
152         while ((c = main_menu()) != -1) {
153                 switch (c) {
154                         case 0:
155                                 menu_articulos();
156                         break;
157                         case 1:
158                                 menu_facturas();
159                         break;
160                         case 2:
161                                 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
162                                 ver_registros(dialog, COLS-2, LINES-4);
163                                 werase(dialog);
164                                 wrefresh(dialog);
165                                 delwin(dialog);
166                                 refresh();
167                         break;
168                         case 5:
169                                 menu_estadisticas();
170                         break;
171                         case 6:
172                                 menu_mantenimiento();
173                         break;
174                         case 7:
175                                 fin = 1;
176                         break;
177                 }
178                 if (fin == 1) break;
179         }
180
181         endwin();
182
183         art_liberar(NULL);
184         fact_liberar(NULL);
185
186         return 0;
187 }
188
189 void menu_facturas()
190 {
191         WINDOW *menu_win;
192         MENU *menu;
193         ITEM **items;
194         int c, salir;
195         char *opciones[] = {
196                                         "Alta",
197                                         "Baja",
198                                         "Modificacion",
199                                         "Volver"
200         };
201
202         items = (ITEM **)calloc(5, sizeof(ITEM *));
203
204         items[0] = new_item(opciones[0], "Crear una nueva factura.");
205         set_item_userptr(items[0], fact_agregar);
206         items[1] = new_item(opciones[1], "Eliminar una factura existente.");
207         set_item_userptr(items[1], fact_eliminar);
208         items[2] = new_item(opciones[2], "Modificar una factura existente.");
209         set_item_userptr(items[2], fact_modificar); 
210         items[3] = new_item(opciones[3], "Volver al menu anterior.");
211         items[4] = NULL;
212
213         menu = new_menu((ITEM **)items);
214         menu_win = newwin(8, COLS-2, 3, 1);
215         keypad(menu_win, TRUE);
216         set_menu_mark(menu, " > ");
217         set_menu_win(menu, menu_win);
218         set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
219
220         box(menu_win, 0, 0);
221         mvwaddch(menu_win, 2, 0, ACS_LTEE);
222         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
223         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
224         wattron(menu_win, COLOR_PAIR(COLOR_RED));
225         mvwaddstr(menu_win, 1, 1, "Menu Facturas");
226         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
227         post_menu(menu);
228         wrefresh(menu_win);
229
230         curs_set(0);
231         salir = 0;
232         while((!salir) && (c = getch()) != KEY_F(3)) {
233                 switch(c) {
234                         case KEY_DOWN:
235                                 menu_driver(menu, REQ_DOWN_ITEM);
236                                 break;
237                         case KEY_UP:
238                                 menu_driver(menu, REQ_UP_ITEM);
239                         break;
240                         case 13:
241                         case 10: {
242                                 ITEM *cur;
243                                 void (*p)(char *);
244
245                                 cur = current_item(menu);
246                                 if (strcmp(item_name(cur), opciones[3]) == 0) {
247                                         salir = 1;
248                                 } else {
249                                         p = item_userptr(cur);
250                                         unpost_menu(menu);
251                                         refresh();
252                                         p(NULL); /* Paso NULL para que ejecute la accion por defecto */
253                                         post_menu(menu);
254                                         box(menu_win,0,0);
255                                         mvwaddch(menu_win, 2, 0, ACS_LTEE);
256                                         mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
257                                         mvwaddch(menu_win, 2, 67, ACS_RTEE);
258                                         wrefresh(menu_win);
259                                 }
260                                 pos_menu_cursor(menu);
261                         }
262                 }
263                 wrefresh(menu_win);
264         }       
265         curs_set(1);
266         
267         unpost_menu(menu);
268         delwin(menu_win);
269         free_item(items[0]);
270         free_item(items[1]);
271         free_item(items[2]);
272         free_item(items[3]);
273         free_menu(menu);
274         free(items);
275 }
276
277 void menu_articulos()
278 {
279         WINDOW *menu_win;
280         MENU *menu;
281         ITEM **items;
282         int c, salir;
283         char *opciones[] = {
284                                         "Alta",
285                                         "Baja",
286                                         "Modificacion",
287                                         "Volver"
288         };
289
290         items = (ITEM **)calloc(5, sizeof(ITEM *));
291
292         items[0] = new_item(opciones[0], "Crear un nuevo articulo.");
293         set_item_userptr(items[0], art_agregar);
294         items[1] = new_item(opciones[1], "Eliminar un articulo existente.");
295         set_item_userptr(items[1], art_eliminar);
296         items[2] = new_item(opciones[2], "Modificar un articulo existente.");
297         set_item_userptr(items[2], art_modificar);
298         items[3] = new_item(opciones[3], "Volver al menu anterior.");
299         items[4] = NULL;
300
301         menu = new_menu((ITEM **)items);
302         menu_win = newwin(8, COLS-2, 3, 1);
303         keypad(menu_win, TRUE);
304         set_menu_mark(menu, " > ");
305         set_menu_win(menu, menu_win);
306         set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
307
308         box(menu_win, 0, 0);
309         mvwaddch(menu_win, 2, 0, ACS_LTEE);
310         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
311         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
312         wattron(menu_win, COLOR_PAIR(COLOR_RED));
313         mvwaddstr(menu_win, 1, 1, "Menu Articulos");
314         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
315         post_menu(menu);
316         wrefresh(menu_win);
317
318         curs_set(0);
319         salir = 0;
320         while((!salir) && (c = getch()) != KEY_F(3)) {
321                 switch(c) {
322                         case KEY_DOWN:
323                                 menu_driver(menu, REQ_DOWN_ITEM);
324                                 break;
325                         case KEY_UP:
326                                 menu_driver(menu, REQ_UP_ITEM);
327                         break;
328                         case 13:
329                         case 10: {
330                                 ITEM *cur;
331                                 void (*p)(char *);
332
333                                 cur = current_item(menu);
334                                 if (strcmp(item_name(cur), opciones[3]) == 0) {
335                                         salir = 1;
336                                 } else {
337                                         p = item_userptr(cur);
338                                         unpost_menu(menu);
339                                         refresh();
340                                         p(NULL); /* Paso NULL para que ejecute la accion por defecto */
341                                         post_menu(menu);
342                                         box(menu_win,0,0);
343                                         mvwaddch(menu_win, 2, 0, ACS_LTEE);
344                                         mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
345                                         mvwaddch(menu_win, 2, 67, ACS_RTEE);
346                                         wrefresh(menu_win);
347                                 }
348                                 pos_menu_cursor(menu);
349                         }
350                 }
351                 wrefresh(menu_win);
352         }       
353         curs_set(1);
354         
355         unpost_menu(menu);
356         delwin(menu_win);
357         free_item(items[0]);
358         free_item(items[1]);
359         free_item(items[2]);
360         free_item(items[3]);
361         free_menu(menu);
362         free(items);
363 }
364
365 void menu_estadisticas()
366 {
367         WINDOW *menu_win;
368         MENU *menu;
369         ITEM **items;
370         int c, salir;
371         char *opciones[] = {
372                                         "Articulos",
373                                         "Facturas",
374                                         "Notas",
375                                         "Volver"
376         };
377
378         items = (ITEM **)calloc(5, sizeof(ITEM *));
379
380         items[0] = new_item(opciones[0], "Ver datos del archivo de Articulos.");
381         items[1] = new_item(opciones[1], "Ver datos del archivo de Facturas.");
382         items[2] = new_item(opciones[2], "Ver datos del archivo de Notas.");
383         items[3] = new_item(opciones[3], "Volver al menu anterior.");
384         items[4] = NULL;
385
386         menu = new_menu((ITEM **)items);
387         menu_win = newwin(8, COLS-2, 3, 1);
388         keypad(menu_win, TRUE);
389         set_menu_mark(menu, " > ");
390         set_menu_win(menu, menu_win);
391         set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
392
393         box(menu_win, 0, 0);
394         mvwaddch(menu_win, 2, 0, ACS_LTEE);
395         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
396         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
397         wattron(menu_win, COLOR_PAIR(COLOR_RED));
398         mvwaddstr(menu_win, 1, 1, "Menu Articulos");
399         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
400         post_menu(menu);
401         wrefresh(menu_win);
402
403         curs_set(0);
404         salir = 0;
405         while((!salir) && (c = getch()) != KEY_F(3)) {
406                 switch(c) {
407                         case KEY_DOWN:
408                                 menu_driver(menu, REQ_DOWN_ITEM);
409                                 break;
410                         case KEY_UP:
411                                 menu_driver(menu, REQ_UP_ITEM);
412                         break;
413                         case 13:
414                         case 10:
415                         {
416                                 ITEM *cur;
417
418                                 cur = current_item(menu);
419                                 if (strcmp(item_name(cur), opciones[3]) == 0) {
420                                         salir = 1;
421                                 } else {
422                                         if (strcmp(item_name(cur), opciones[0]) == 0) {
423                                                 unpost_menu(menu);
424                                                 fprintf(stderr, "Muestro\n");
425                                                 ver_estadisticas( art_get_lst()->fp );
426                                                 box(menu_win, 0, 0);
427                                                 post_menu(menu);
428                                         }
429                                         if (strcmp(item_name(cur), opciones[1]) == 0) {
430                                                 unpost_menu(menu);
431                                                 ver_estadisticas( fact_get_lst()->fp );
432                                                 box(menu_win, 0, 0);
433                                                 post_menu(menu);
434                                         }
435                                         if (strcmp(item_name(cur), opciones[2]) == 0) {
436                                                 unpost_menu(menu);
437                                                 ver_estadisticas( fact_get_lst()->fp_texto );
438                                                 box(menu_win, 0, 0);
439                                                 post_menu(menu);
440                                         }
441                                 }
442                                 pos_menu_cursor(menu);
443                         }
444                 }
445                 wrefresh(menu_win);
446         }       
447         curs_set(1);
448         
449         unpost_menu(menu);
450         delwin(menu_win);
451         free_item(items[0]);
452         free_item(items[1]);
453         free_item(items[2]);
454         free_item(items[3]);
455         free_menu(menu);
456         free(items);
457 }
458
459 int main_menu()
460 {
461         WINDOW *menu_win;
462         MENU *menu;
463         ITEM **items;
464         int c, salir, opcion;
465         char *opciones[] = {
466                                         "Articulos",
467                                         "Facturas",
468                                         "Ver Registros",
469                                         "Ver Facturas",
470                                         "Ver Notas",
471                                         "Estadisticas",
472                                         "Mantenimiento",
473                                         "Salir"
474         };
475
476         items = (ITEM **)calloc(9, sizeof(ITEM *));
477
478         items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
479         items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
480         items[2] = new_item(opciones[2], "Ver registros/bloques de archivo Articulos.");
481         items[3] = new_item(opciones[3], "Ver registros/bloques de archivo Facturas.");
482         items[4] = new_item(opciones[4], "Ver registros/bloques de archivo Notas.");
483         items[5] = new_item(opciones[5], "Ver estadisticas de ocupacion de archivos.");
484         items[6] = new_item(opciones[6], "Tareas de mantenimiento de los archivos.");
485         items[7] = new_item(opciones[7], "Salir del sistema.");
486         items[8] = NULL;
487
488         menu = new_menu((ITEM **)items);
489         menu_win = newwin(14, COLS-2, 3, 1);
490         keypad(menu_win, TRUE);
491         set_menu_mark(menu, " > ");
492         set_menu_win(menu, menu_win);
493         set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
494
495         box(menu_win, 0, 0);
496         mvwaddch(menu_win, 2, 0, ACS_LTEE);
497         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
498         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
499         wattron(menu_win, COLOR_PAIR(COLOR_RED));
500         mvwaddstr(menu_win, 1, 1, "Menu Principal");
501         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
502         post_menu(menu);
503         wrefresh(menu_win);
504
505         curs_set(0);
506         opcion = -1;
507         salir = 0;
508         while((!salir) && (c = getch())) {
509                 switch(c) {
510                         case KEY_DOWN:
511                                 menu_driver(menu, REQ_DOWN_ITEM);
512                                 break;
513                         case KEY_UP:
514                                 menu_driver(menu, REQ_UP_ITEM);
515                         break;
516                         case 13:
517                         case 10: 
518                         {
519                                 ITEM *cur;
520                                 int i;
521
522                                 cur = current_item(menu);
523                                 for(i=0; i<7; ++i) {
524                                         if (strcmp(item_name(cur), opciones[i]) == 0)
525                                                 opcion = i;
526                                 }
527                                 pos_menu_cursor(menu);
528                                 salir = 1;
529                         }
530                 }
531                 wrefresh(menu_win);
532         }       
533         curs_set(1);
534         
535         unpost_menu(menu);
536         werase(menu_win);
537         wrefresh(menu_win);
538         delwin(menu_win);
539         free_item(items[0]);
540         free_item(items[1]);
541         free_item(items[2]);
542         free_item(items[3]);
543         free_item(items[4]);
544         free_item(items[5]);
545         free_item(items[6]);
546         free_menu(menu);
547         free(items);
548
549         return opcion;
550 }
551
552
553 static void finish(int sig)
554 {
555         endwin();
556
557         /* do your non-curses wrapup here */
558         exit(0);
559 }
560
561 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
562 {
563         va_list ap;
564         char txt[255];
565         int mw, mh;
566         WINDOW *dialog;
567         va_start(ap, format);
568         vsprintf(txt, format, ap);
569         va_end(ap);
570
571         mw = strlen(txt)+2;
572         mh = 3;
573         dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
574         box(dialog, 0 ,0);
575         mvwaddstr(dialog, 1, 1, txt);
576         wrefresh(dialog);
577         curs_set(0);
578         return dialog;
579 }
580
581 void msg_box_free(WINDOW *padre, WINDOW *win)
582 {
583         werase(win);
584         wrefresh(win);
585         delwin(win);
586         curs_set(1);
587         wrefresh(padre);
588 }
589
590 void menu_mantenimiento()
591 {
592         WINDOW *menu_win, *dlg;
593         MENU *menu;
594         ITEM **items;
595         int c, salir, nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro;
596         char *opciones[] = {
597                                         "Compactar Articulos",
598                                         "Compactar Facturas",
599                                         "Compactar Notas",
600                                         "Cambiar tipo Archivo Articulos",
601                                         "Cambiar tipo Archivo Facturas",
602                                         "Cambiar tipo Archivo Notas",
603                                         "Volver"
604         };
605
606         items = (ITEM **)calloc(8, sizeof(ITEM *));
607
608         items[0] = new_item(opciones[0], "Elimina espacio no utilizado.");
609         items[1] = new_item(opciones[1], "Elimina espacio no utilizado.");
610         items[2] = new_item(opciones[2], "Elimina espacio no utilizado.");
611         items[3] = new_item(opciones[3], "Permite cambiar el tipo del archivo.");
612         items[4] = new_item(opciones[4], "Permite cambiar el tipo del archivo.");
613         items[5] = new_item(opciones[5], "Permite cambiar el tipo del archivo.");
614         items[6] = new_item(opciones[6], "Volver al menu anterior.");
615         items[7] = NULL;
616
617         menu = new_menu((ITEM **)items);
618         menu_win = newwin(12, COLS-2, 3, 1);
619         keypad(menu_win, TRUE);
620         set_menu_mark(menu, " > ");
621         set_menu_win(menu, menu_win);
622         set_menu_sub(menu, derwin(menu_win, 8, COLS-4, 3, 1));
623
624         box(menu_win, 0, 0);
625         mvwaddch(menu_win, 2, 0, ACS_LTEE);
626         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
627         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
628         wattron(menu_win, COLOR_PAIR(COLOR_RED));
629         mvwaddstr(menu_win, 1, 1, "Menu Mantenimiento");
630         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
631         post_menu(menu);
632         wrefresh(menu_win);
633
634         curs_set(0);
635         salir = 0;
636         while((!salir) && (c = getch()) != KEY_F(3)) {
637                 switch(c) {
638                         case KEY_DOWN:
639                                 menu_driver(menu, REQ_DOWN_ITEM);
640                                 break;
641                         case KEY_UP:
642                                 menu_driver(menu, REQ_UP_ITEM);
643                         break;
644                         case 13:
645                         case 10: 
646                         {
647                                 ITEM *cur;
648
649                                 cur = current_item(menu);
650                                 if (strcmp(item_name(cur), opciones[6]) == 0) {
651                                         salir = 1;
652                                 } else {
653                                         if (strcmp(item_name(cur), opciones[0]) == 0) {
654                                                 art_get_lst()->fp->compactar(art_get_lst()->fp);
655                                         }
656                                         if (strcmp(item_name(cur), opciones[1]) == 0) {
657                                                 fact_get_lst()->fp->compactar(fact_get_lst()->fp);
658                                         }
659                                         if (strcmp(item_name(cur), opciones[2]) == 0) {
660                                                 fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
661                                         }
662                                         if (strcmp(item_name(cur), opciones[3]) == 0) {
663                                                 unpost_menu(menu);
664                                                 nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
665                                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
666                                                 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
667                                                 art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
668                                                 msg_box_free(stdscr, dlg);
669                                                 box(menu_win, 0, 0);
670                                                 post_menu(menu);
671                                         }
672                                         if (strcmp(item_name(cur), opciones[4]) == 0) {
673                                                 unpost_menu(menu);
674                                                 nuevo_tam_registro = 0;
675                                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
676                                                 box(menu_win, 0, 0);
677                                                 post_menu(menu);
678                                         }
679                                         if (strcmp(item_name(cur), opciones[5]) == 0) {
680                                                 unpost_menu(menu);
681                                                 nuevo_tam_registro = -2;
682                                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
683                                                 box(menu_win, 0, 0);
684                                                 post_menu(menu);
685                                         }
686                                 }
687                         }
688                 }
689                 wrefresh(menu_win);
690         }       
691         curs_set(1);
692         
693         unpost_menu(menu);
694         delwin(menu_win);
695         free_item(items[0]);
696         free_item(items[1]);
697         free_item(items[2]);
698         free_item(items[3]);
699         free_menu(menu);
700
701         free(items);
702 }
703
704 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
705 {
706         WINDOW *win;
707         t_Form *form;
708         char *s;
709         int n, is_ok;
710
711         win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
712         box(win, 0, 0);
713
714         form = form_crear(win);
715         form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3");
716         form_ejecutar(form, 1,1);
717
718         s = form_obtener_valor_char(form, "Tipo de archivo");
719         if (strcmp(s, "T1") == 0) n = T1;
720         if (strcmp(s, "T2") == 0) n = T2;
721         if (strcmp(s, "T3") == 0) n = T3;
722
723         form_destruir(form);
724
725         werase(win);
726         box(win, 0, 0);
727         wrefresh(win);
728
729         (*tipo) = n;
730         switch (n) {
731                 case T1:
732                         form = form_crear(win);
733                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
734                         is_ok = 0;
735                         do {
736                                 form_set_valor(form, "Tamaño de bloque", "");
737                                 form_ejecutar(form, 1,1);
738                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
739                         } while (!is_ok);
740                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
741                         form_destruir(form);
742                 break;
743                 case T2:
744                         break;
745                 case T3:
746                         if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
747                                 mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
748                                 mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
749                         }
750                         form = form_crear(win);
751                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
752                         if ((*tam_reg) != -1)
753                                 form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
754                         is_ok = 0;
755                         do {
756                                 form_set_valor(form, "Tamaño de bloque", "");
757                                 if ((*tam_reg) != -1)
758                                         form_set_valor(form, "Tamaño de registro", "");
759                                 form_ejecutar(form, 1,1);
760                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
761                                 if ((*tam_reg) != -1) {
762                                         if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
763                                 }
764                         } while (!is_ok);
765                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
766                         if ((*tam_reg) != -1)
767                                 (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");
768                         form_destruir(form);
769         }
770         werase(win);
771         wrefresh(win);
772         delwin(win);
773 }
774
775 void ver_estadisticas(EMUFS *fp)
776 {
777         WINDOW *win;
778         EMUFS_Estadisticas stats;
779         char s[40];
780         int i=3;
781
782         fprintf(stderr, "....! (%p)\n", fp->leer_estadisticas);
783         stats = fp->leer_estadisticas(fp);
784         fprintf(stderr, "Vamos que pasamos!\n");
785
786         win = newwin(LINES-4, COLS-2, 2, 1);
787         
788         mvwaddstr(win, 1, 1, "Tipo de Archivo : ");
789         switch (fp->tipo) {
790                 case T1:
791                         waddstr(win, "Registro long. variable con bloque parametrizado");
792                 break;
793                 case T2:
794                         waddstr(win, "Registro long. variable sin bloques");
795                 break;
796                 case T3:
797                         waddstr(win, "Registro long. fija con bloque parametrizado");
798         }
799
800         mvwaddstr(win, i++, 1, "Cant. Registros : ");
801         sprintf(s, "%lu", stats.tam_archivo);
802         waddstr(win, s);
803
804         mvwaddstr(win, i++, 1, "Tamaño de Archivo (bytes) : ");
805         sprintf(s, "%lu", stats.tam_archivo_bytes);
806         waddstr(win, s);
807
808         mvwaddstr(win, i++, 1, "Tamaño de Info de Control (bytes) : ");
809         sprintf(s, "%lu", stats.info_control);
810         waddstr(win, s);
811
812         mvwaddstr(win, i++, 1, "Media de espacio libre : ");
813         sprintf(s, "%lu", stats.media_fs);
814         waddstr(win, s);
815
816         mvwaddstr(win, i++, 1, "Espacio Libre : ");
817         sprintf(s, "%lu", stats.total_fs);
818         waddstr(win, s);
819
820         mvwaddstr(win, i++, 1, "Maximo de Espacio libre : ");
821         sprintf(s, "%lu", stats.max_fs);
822         waddstr(win, s);
823
824         mvwaddstr(win, i++, 1, "Minimo de Espacio libre : ");
825         sprintf(s, "%lu", stats.min_fs);
826         waddstr(win, s);
827
828         mvwaddstr(win, i++, 1, "Cantidad de bloques : ");
829         sprintf(s, "%lu", stats.cant_bloques);
830         waddstr(win, s);
831
832         werase(win);
833         wrefresh(win);
834         delwin(win);
835 }
836