]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/gui.c
Arreglo memory leak (god bless valgrind! :)
[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 Estadisticas");
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                                                 ver_estadisticas( art_get_lst()->fp );
425                                                 box(menu_win, 0, 0);
426                                                 post_menu(menu);
427                                         }
428                                         if (strcmp(item_name(cur), opciones[1]) == 0) {
429                                                 unpost_menu(menu);
430                                                 ver_estadisticas( fact_get_lst()->fp );
431                                                 box(menu_win, 0, 0);
432                                                 post_menu(menu);
433                                         }
434                                         if (strcmp(item_name(cur), opciones[2]) == 0) {
435                                                 unpost_menu(menu);
436                                                 ver_estadisticas( fact_get_lst()->fp_texto );
437                                                 box(menu_win, 0, 0);
438                                                 post_menu(menu);
439                                         }
440                                 }
441                                 pos_menu_cursor(menu);
442                         }
443                 }
444                 wrefresh(menu_win);
445         }       
446         curs_set(1);
447         
448         unpost_menu(menu);
449         delwin(menu_win);
450         free_item(items[0]);
451         free_item(items[1]);
452         free_item(items[2]);
453         free_item(items[3]);
454         free_menu(menu);
455         free(items);
456 }
457
458 int main_menu()
459 {
460         WINDOW *menu_win;
461         MENU *menu;
462         ITEM **items;
463         int c, salir, opcion;
464         char *opciones[] = {
465                                         "Articulos",
466                                         "Facturas",
467                                         "Ver Registros",
468                                         "Ver Facturas",
469                                         "Ver Notas",
470                                         "Estadisticas",
471                                         "Mantenimiento",
472                                         "Salir"
473         };
474
475         items = (ITEM **)calloc(9, sizeof(ITEM *));
476
477         items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
478         items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
479         items[2] = new_item(opciones[2], "Ver registros/bloques de archivo Articulos.");
480         items[3] = new_item(opciones[3], "Ver registros/bloques de archivo Facturas.");
481         items[4] = new_item(opciones[4], "Ver registros/bloques de archivo Notas.");
482         items[5] = new_item(opciones[5], "Ver estadisticas de ocupacion de archivos.");
483         items[6] = new_item(opciones[6], "Tareas de mantenimiento de los archivos.");
484         items[7] = new_item(opciones[7], "Salir del sistema.");
485         items[8] = NULL;
486
487         menu = new_menu((ITEM **)items);
488         menu_win = newwin(14, COLS-2, 3, 1);
489         keypad(menu_win, TRUE);
490         set_menu_mark(menu, " > ");
491         set_menu_win(menu, menu_win);
492         set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
493
494         box(menu_win, 0, 0);
495         mvwaddch(menu_win, 2, 0, ACS_LTEE);
496         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
497         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
498         wattron(menu_win, COLOR_PAIR(COLOR_RED));
499         mvwaddstr(menu_win, 1, 1, "Menu Principal");
500         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
501         post_menu(menu);
502         wrefresh(menu_win);
503
504         curs_set(0);
505         opcion = -1;
506         salir = 0;
507         while((!salir) && (c = getch())) {
508                 switch(c) {
509                         case KEY_DOWN:
510                                 menu_driver(menu, REQ_DOWN_ITEM);
511                                 break;
512                         case KEY_UP:
513                                 menu_driver(menu, REQ_UP_ITEM);
514                         break;
515                         case 13:
516                         case 10: 
517                         {
518                                 ITEM *cur;
519                                 int i;
520
521                                 cur = current_item(menu);
522                                 for(i=0; i<7; ++i) {
523                                         if (strcmp(item_name(cur), opciones[i]) == 0)
524                                                 opcion = i;
525                                 }
526                                 pos_menu_cursor(menu);
527                                 salir = 1;
528                         }
529                 }
530                 wrefresh(menu_win);
531         }       
532         curs_set(1);
533         
534         unpost_menu(menu);
535         werase(menu_win);
536         wrefresh(menu_win);
537         delwin(menu_win);
538         free_item(items[0]);
539         free_item(items[1]);
540         free_item(items[2]);
541         free_item(items[3]);
542         free_item(items[4]);
543         free_item(items[5]);
544         free_item(items[6]);
545         free_menu(menu);
546         free(items);
547
548         return opcion;
549 }
550
551
552 static void finish(int sig)
553 {
554         endwin();
555
556         /* do your non-curses wrapup here */
557         exit(0);
558 }
559
560 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
561 {
562         va_list ap;
563         char txt[255];
564         int mw, mh;
565         WINDOW *dialog;
566         va_start(ap, format);
567         vsprintf(txt, format, ap);
568         va_end(ap);
569
570         mw = strlen(txt)+2;
571         mh = 3;
572         dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
573         box(dialog, 0 ,0);
574         mvwaddstr(dialog, 1, 1, txt);
575         wrefresh(dialog);
576         curs_set(0);
577         return dialog;
578 }
579
580 void msg_box_free(WINDOW *padre, WINDOW *win)
581 {
582         werase(win);
583         wrefresh(win);
584         delwin(win);
585         curs_set(1);
586         wrefresh(padre);
587 }
588
589 void menu_mantenimiento()
590 {
591         WINDOW *menu_win, *dlg;
592         MENU *menu;
593         ITEM **items;
594         int c, salir, nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro;
595         char *opciones[] = {
596                                         "Compactar Articulos",
597                                         "Compactar Facturas",
598                                         "Compactar Notas",
599                                         "Cambiar tipo Archivo Articulos",
600                                         "Cambiar tipo Archivo Facturas",
601                                         "Cambiar tipo Archivo Notas",
602                                         "Volver"
603         };
604
605         items = (ITEM **)calloc(8, sizeof(ITEM *));
606
607         items[0] = new_item(opciones[0], "Elimina espacio no utilizado.");
608         items[1] = new_item(opciones[1], "Elimina espacio no utilizado.");
609         items[2] = new_item(opciones[2], "Elimina espacio no utilizado.");
610         items[3] = new_item(opciones[3], "Permite cambiar el tipo del archivo.");
611         items[4] = new_item(opciones[4], "Permite cambiar el tipo del archivo.");
612         items[5] = new_item(opciones[5], "Permite cambiar el tipo del archivo.");
613         items[6] = new_item(opciones[6], "Volver al menu anterior.");
614         items[7] = NULL;
615
616         menu = new_menu((ITEM **)items);
617         menu_win = newwin(12, COLS-2, 3, 1);
618         keypad(menu_win, TRUE);
619         set_menu_mark(menu, " > ");
620         set_menu_win(menu, menu_win);
621         set_menu_sub(menu, derwin(menu_win, 8, COLS-4, 3, 1));
622
623         box(menu_win, 0, 0);
624         mvwaddch(menu_win, 2, 0, ACS_LTEE);
625         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
626         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
627         wattron(menu_win, COLOR_PAIR(COLOR_RED));
628         mvwaddstr(menu_win, 1, 1, "Menu Mantenimiento");
629         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
630         post_menu(menu);
631         wrefresh(menu_win);
632
633         curs_set(0);
634         salir = 0;
635         while((!salir) && (c = getch()) != KEY_F(3)) {
636                 switch(c) {
637                         case KEY_DOWN:
638                                 menu_driver(menu, REQ_DOWN_ITEM);
639                                 break;
640                         case KEY_UP:
641                                 menu_driver(menu, REQ_UP_ITEM);
642                         break;
643                         case 13:
644                         case 10: 
645                         {
646                                 ITEM *cur;
647
648                                 cur = current_item(menu);
649                                 if (strcmp(item_name(cur), opciones[6]) == 0) {
650                                         salir = 1;
651                                 } else {
652                                         if (strcmp(item_name(cur), opciones[0]) == 0) {
653                                                 art_get_lst()->fp->compactar(art_get_lst()->fp);
654                                         }
655                                         if (strcmp(item_name(cur), opciones[1]) == 0) {
656                                                 fact_get_lst()->fp->compactar(fact_get_lst()->fp);
657                                         }
658                                         if (strcmp(item_name(cur), opciones[2]) == 0) {
659                                                 fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
660                                         }
661                                         if (strcmp(item_name(cur), opciones[3]) == 0) {
662                                                 unpost_menu(menu);
663                                                 nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
664                                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
665                                                 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
666                                                 art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
667                                                 msg_box_free(stdscr, dlg);
668                                                 box(menu_win, 0, 0);
669                                                 post_menu(menu);
670                                         }
671                                         if (strcmp(item_name(cur), opciones[4]) == 0) {
672                                                 unpost_menu(menu);
673                                                 nuevo_tam_registro = 0;
674                                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
675                                                 box(menu_win, 0, 0);
676                                                 post_menu(menu);
677                                         }
678                                         if (strcmp(item_name(cur), opciones[5]) == 0) {
679                                                 unpost_menu(menu);
680                                                 nuevo_tam_registro = -2;
681                                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
682                                                 box(menu_win, 0, 0);
683                                                 post_menu(menu);
684                                         }
685                                 }
686                         }
687                 }
688                 wrefresh(menu_win);
689         }       
690         curs_set(1);
691         
692         unpost_menu(menu);
693         delwin(menu_win);
694         free_item(items[0]);
695         free_item(items[1]);
696         free_item(items[2]);
697         free_item(items[3]);
698         free_menu(menu);
699
700         free(items);
701 }
702
703 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
704 {
705         WINDOW *win;
706         t_Form *form;
707         char *s;
708         int n, is_ok;
709
710         win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
711         box(win, 0, 0);
712
713         form = form_crear(win);
714         form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3");
715         form_ejecutar(form, 1,1);
716
717         s = form_obtener_valor_char(form, "Tipo de archivo");
718         if (strcmp(s, "T1") == 0) n = T1;
719         if (strcmp(s, "T2") == 0) n = T2;
720         if (strcmp(s, "T3") == 0) n = T3;
721
722         form_destruir(form);
723
724         werase(win);
725         box(win, 0, 0);
726         wrefresh(win);
727
728         (*tipo) = n;
729         switch (n) {
730                 case T1:
731                         form = form_crear(win);
732                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
733                         is_ok = 0;
734                         do {
735                                 form_set_valor(form, "Tamaño de bloque", "");
736                                 form_ejecutar(form, 1,1);
737                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
738                         } while (!is_ok);
739                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
740                         form_destruir(form);
741                 break;
742                 case T2:
743                         break;
744                 case T3:
745                         if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
746                                 mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
747                                 mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
748                         }
749                         form = form_crear(win);
750                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
751                         if ((*tam_reg) != -1)
752                                 form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
753                         is_ok = 0;
754                         do {
755                                 form_set_valor(form, "Tamaño de bloque", "");
756                                 if ((*tam_reg) != -1)
757                                         form_set_valor(form, "Tamaño de registro", "");
758                                 form_ejecutar(form, 1,1);
759                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
760                                 if ((*tam_reg) != -1) {
761                                         if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
762                                 }
763                         } while (!is_ok);
764                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
765                         if ((*tam_reg) != -1)
766                                 (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");
767                         form_destruir(form);
768         }
769         werase(win);
770         wrefresh(win);
771         delwin(win);
772 }
773
774 void ver_estadisticas(EMUFS *fp)
775 {
776         WINDOW *win;
777         EMUFS_Estadisticas stats;
778         char s[40];
779         int i=3;
780
781         stats = fp->leer_estadisticas(fp);
782
783         win = newwin(LINES-4, COLS-2, 2, 1);
784         
785         mvwaddstr(win, 1, 1, "Tipo de Archivo : ");
786         switch (fp->tipo) {
787                 case T1:
788                         waddstr(win, "Registro long. variable con bloque parametrizado");
789                 break;
790                 case T2:
791                         waddstr(win, "Registro long. variable sin bloques");
792                 break;
793                 case T3:
794                         waddstr(win, "Registro long. fija con bloque parametrizado");
795         }
796
797         mvwaddstr(win, i++, 1, "Cant. Registros : ");
798         sprintf(s, "%lu", stats.tam_archivo);
799         waddstr(win, s);
800
801         mvwaddstr(win, i++, 1, "Tamaño de Archivo (bytes) : ");
802         sprintf(s, "%lu", stats.tam_archivo_bytes);
803         waddstr(win, s);
804
805         mvwaddstr(win, i++, 1, "Tamaño de Info de Control (bytes) : ");
806         sprintf(s, "%lu", stats.info_control);
807         waddstr(win, s);
808
809         mvwaddstr(win, i++, 1, "Media de espacio libre : ");
810         sprintf(s, "%lu", stats.media_fs);
811         waddstr(win, s);
812
813         mvwaddstr(win, i++, 1, "Espacio Libre : ");
814         sprintf(s, "%lu", stats.total_fs);
815         waddstr(win, s);
816
817         mvwaddstr(win, i++, 1, "Maximo de Espacio libre : ");
818         sprintf(s, "%lu", stats.max_fs);
819         waddstr(win, s);
820
821         mvwaddstr(win, i++, 1, "Minimo de Espacio libre : ");
822         sprintf(s, "%lu", stats.min_fs);
823         waddstr(win, s);
824
825         mvwaddstr(win, i++, 1, "Cantidad de bloques : ");
826         sprintf(s, "%lu", stats.cant_bloques);
827         waddstr(win, s);
828
829         werase(win);
830         wrefresh(win);
831         delwin(win);
832 }
833