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