]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/emufs_view.c
un poco mas de B+
[z.facultad/75.06/emufs.git] / emufs_gui / emufs_view.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 "gui.h"
10 #include "menu.h"
11 #include "form.h"
12 #include "articulos.h"
13 #include "facturas.h"
14 #include "emufs.h"
15 #include "viewer.h"
16 #include "tree_viewer.h"
17
18 #define CTRLD 4
19
20 static void finish(int sig);
21
22 int main_menu();
23 void menu_articulos();
24 void menu_facturas();
25 void menu_mantenimiento();
26 void menu_estadisticas();
27 void menu_ver_registros();
28 void menu_ver_bloques();
29 void menu_ver_indices();
30 void preguntar_nuevo_tipo(const char *title, int *tipo, int *tam_bloque, int *tam_reg);
31
32 void ver_estadisticas(EMUFS *fp);
33
34 typedef enum {
35                 PARAM_OK, /* Parametros estan ok */
36                 NO_ART_FILE,  /* No se especifico nombre de archivo Articulos */
37                 NO_FACT_FILE, /* No se especifico nombre de archivo Facturas */
38                 SHOW_HELP,    /* Mostrar ayuda encontrado */
39                 TIPO_NO_DEFINIDO, /* No se definio tipo de archivo */
40                 TIPO_INVALIDO,    /* El valor de tipo de archivo no es valido */
41                 BLOQUE_NO_DEFINIDO, /* No se especifico tamaño de bloque */
42                 NULL_BLOCK_FOUND    /* Tamaño de bloque <= 0!!! */
43 } t_Param;
44
45 void print_help(char *s)
46 {
47         printf("EMUFS - 2v0\n");
48         printf("Modo de uso :%s [<emufs.xml>|-h] \n", s);
49         printf("\temufs.xml es el archivo XML que cumple con emufs.dtd con la configuracion a usar.\n");
50         printf("\t-h Muestra este msg de ayuda.\n");
51 }
52
53 int leer_tipo_arbol(char *s) {
54         if (strcmp(s, "B") == 0) return 0;
55         if (strcmp(s, "BA") == 0) return 1;
56
57         /* Por defecto es un B */
58         return 0;
59 }
60
61 void leer_param_ind_art(t_Parametros *param, xmlNode *padre)
62 {
63         xmlNode *node;
64         char *tmp, *nombre;
65         node = padre->children;
66         while (node) {
67                 if (node->type == XML_ELEMENT_NODE) {
68                         if (strcmp(node->name, "indice")==0) {
69                                 PERR("  LEO INDICE");
70                                 nombre = xml_get_prop(node, "nombre");
71
72                                 if (strcmp(nombre, "codigo")==0) {
73                                         tmp = xml_get_prop(node, "tipo");
74                                         param->ind_art[0].tipo_arbol = leer_tipo_arbol(tmp);
75                                         free(tmp);
76                                         tmp = xml_get_prop(node, "bloque");
77                                         param->ind_art[0].tam_bloque = atoi(tmp);
78                                         free(tmp);
79                                 } else if (strcmp(nombre, "desc")==0) {
80                                         tmp = xml_get_prop(node, "tipo");
81                                         param->ind_art[1].tipo_arbol = leer_tipo_arbol(tmp);
82                                         free(tmp);
83                                         tmp = xml_get_prop(node, "bloque");
84                                         param->ind_art[1].tam_bloque = atoi(tmp);
85                                         free(tmp);
86                                 } else if (strcmp(nombre, "presentacion")==0) {
87                                         tmp = xml_get_prop(node, "tipo");
88                                         param->ind_art[2].tipo_arbol = leer_tipo_arbol(tmp);
89                                         free(tmp);
90                                         tmp = xml_get_prop(node, "bloque");
91                                         param->ind_art[2].tam_bloque = atoi(tmp);
92                                         free(tmp);
93                                 }
94                                 PERR("  LISTO");
95                                 free(nombre);
96                         }
97                 }
98                 node = node->next;
99         }
100 }
101
102 void leer_param_ind_fact(t_Parametros *param, xmlNode *padre)
103 {
104         xmlNode *node;
105         char *tmp, *nombre;
106         node = padre->children;
107         while (node) {
108                 if (node->type == XML_ELEMENT_NODE) {
109                         if (strcmp(node->name, "indice")==0) {
110                                 PERR("  LEO INDICE");
111                                 nombre = xml_get_prop(node, "nombre");
112
113                                 if (strcmp(nombre, "numero")==0) {
114                                         tmp = xml_get_prop(node, "tipo");
115                                         param->ind_fac[0].tipo_arbol = leer_tipo_arbol(tmp);
116                                         free(tmp);
117                                         tmp = xml_get_prop(node, "bloque");
118                                         param->ind_fac[0].tam_bloque = atoi(tmp);
119                                         free(tmp);
120                                 } else if (strcmp(nombre, "emision")==0) {
121                                         tmp = xml_get_prop(node, "tipo");
122                                         param->ind_fac[1].tipo_arbol = leer_tipo_arbol(tmp);
123                                         free(tmp);
124                                         tmp = xml_get_prop(node, "bloque");
125                                         param->ind_fac[1].tam_bloque = atoi(tmp);
126                                         free(tmp);
127                                 } else if (strcmp(nombre, "vto")==0) {
128                                         tmp = xml_get_prop(node, "tipo");
129                                         param->ind_fac[2].tipo_arbol = leer_tipo_arbol(tmp);
130                                         free(tmp);
131                                         tmp = xml_get_prop(node, "bloque");
132                                         param->ind_fac[2].tam_bloque = atoi(tmp);
133                                         free(tmp);
134                                 } else if (strcmp(nombre, "cheque")==0) {
135                                         tmp = xml_get_prop(node, "tipo");
136                                         param->ind_fac[3].tipo_arbol = leer_tipo_arbol(tmp);
137                                         free(tmp);
138                                         tmp = xml_get_prop(node, "bloque");
139                                         param->ind_fac[3].tam_bloque = atoi(tmp);
140                                         free(tmp);
141                                 } else if (strcmp(nombre, "ctacte")==0) {
142                                         tmp = xml_get_prop(node, "tipo");
143                                         param->ind_fac[4].tipo_arbol = leer_tipo_arbol(tmp);
144                                         free(tmp);
145                                         tmp = xml_get_prop(node, "bloque");
146                                         param->ind_fac[4].tam_bloque = atoi(tmp);
147                                         free(tmp);
148                                 }
149                                 PERR("  LISTO");
150                                 free(nombre);
151                         }
152                 }
153                 node = node->next;
154         }
155 }
156
157 void leer_param_art(t_Parametros *param, xmlNode *padre)
158 {
159         xmlNode *node;
160         char *tmp;
161         node = padre->children;
162         while (node) {
163                 if (node->type == XML_ELEMENT_NODE) {
164                         if (strcmp(node->name, "fuente")==0) {
165                                 strcpy(param->xml_art, XML_GET_CONTENT(node->children));
166                         } else if (strcmp(node->name, "datos")==0) {
167                                 tmp = xml_get_prop(node, "tipo");
168                                 param->tipo_arch_art = atoi(tmp)-1;
169                                 free(tmp);
170                                 tmp = xml_get_prop(node, "bloque");
171                                 param->tam_bloque_art = atoi(tmp);
172                                 free(tmp);
173                         } else if (strcmp(node->name, "indices")==0) {
174                                 PERR("LEO INDICES")
175                                 leer_param_ind_art(param, node);
176                                 PERR("LISTO");
177                         }
178                 }
179                 node = node->next;
180         }
181 }
182
183 void leer_param_fac(t_Parametros *param, xmlNode *padre)
184 {
185         xmlNode *nodo;
186         char *tmp;
187         nodo = padre->children;
188         while (nodo) {
189                 if (nodo->type == XML_ELEMENT_NODE) {
190                         if (strcmp(nodo->name, "fuente")==0) {
191                                 strcpy(param->xml_fact, XML_GET_CONTENT(nodo->children));
192                         } else if (strcmp(nodo->name, "datos")==0) {
193                                 tmp = xml_get_prop(nodo, "tipo");
194                                 param->tipo_arch_fact = atoi(tmp)-1;
195                                 free(tmp);
196                                 tmp = xml_get_prop(nodo, "bloque");
197                                 param->tam_bloque_fact = atoi(tmp);
198                                 free(tmp);
199                         } else if (strcmp(nodo->name, "datos_notas")==0) {
200                                 tmp = xml_get_prop(nodo, "tipo");
201                                 param->tipo_arch_nota = atoi(tmp)-1;
202                                 free(tmp);
203                                 tmp = xml_get_prop(nodo, "bloque");
204                                 param->tam_bloque_nota = atoi(tmp);
205                                 free(tmp);
206                         } else if (strcmp(nodo->name, "indices")==0) {
207                                 PERR("LEO INDICES")
208                                 leer_param_ind_fact(param, nodo);
209                                 PERR("LISTO");
210                         }
211                 }
212                 nodo = nodo->next;
213         }
214 }
215
216 void param_xml(char *s, t_Parametros *param)
217 {
218         xmlDocPtr document;
219         xmlNode *node, *inicio;
220
221         document = xmlReadFile(s, NULL,0);
222         if (document == NULL) {
223                 return;
224         }
225         inicio = NULL;
226         node = xmlDocGetRootElement(document);
227         /* Busco el TAG principal "EMUFS" */
228         while (node) {
229                 if (node->type == XML_ELEMENT_NODE) {
230                         PERR(node->name);
231                         if (strcmp(node->name, "emufs") == 0) {
232                                 inicio = node->children;
233                                 break;
234                         }
235                 }
236                 node = node->next;
237         }
238         if (inicio == NULL) {
239                         PERR("NO ENCONTRE TAG PRINCIPAL");
240                         xmlFreeDoc(document);
241                         xmlCleanupParser();
242                         return;
243         }
244
245         node = inicio;
246         while (node) {
247                 if (node->type == XML_ELEMENT_NODE) {
248                         if (strcmp(node->name, "articulos")==0) {
249                                 leer_param_art(param, node);
250                         } else if (strcmp(node->name, "facturas")==0) {
251                                 leer_param_fac(param, node);
252                         }
253                 }
254                 node = node->next;
255         }
256 }
257
258 static t_Parametros parametros;
259
260 int main(int argc, char *argv[])
261 {
262         WINDOW *dialog;
263
264         if (argc > 2) {
265                 print_help(argv[0]);
266                 exit(0);
267         }
268
269         if (argc == 2) {
270                 if (strcmp(argv[1], "-h")==0) {
271                         print_help(argv[0]);
272                         exit(0);
273                 }
274                 param_xml(argv[1], &parametros);
275
276                 /* Valido que los tamaños de los bloques sean multiplos de 512 */
277                 if ((parametros.tam_bloque_art%512) != 0) {
278                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
279                         exit(1);
280                 }
281                 if ((parametros.tam_bloque_fact%512) != 0) {
282                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
283                         exit(1);
284                 }
285                 if ((parametros.ind_art[0].tam_bloque%512) != 0) {
286                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
287                         exit(1);
288                 }
289                 if ((parametros.ind_art[1].tam_bloque%512) != 0) {
290                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
291                         exit(1);
292                 }
293                 if ((parametros.ind_art[2].tam_bloque%512) != 0) {
294                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
295                         exit(1);
296                 }
297                 if ((parametros.ind_fac[0].tam_bloque%512) != 0) {
298                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
299                         exit(1);
300                 }
301                 if ((parametros.ind_fac[1].tam_bloque%512) != 0) {
302                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
303                         exit(1);
304                 }
305                 if ((parametros.ind_fac[2].tam_bloque%512) != 0) {
306                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
307                         exit(1);
308                 }
309                 if ((parametros.ind_fac[3].tam_bloque%512) != 0) {
310                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
311                         exit(1);
312                 }
313                 if ((parametros.ind_fac[4].tam_bloque%512) != 0) {
314                         PERR("Los tamaños de bloque deben ser multiplos de 512!!");
315                         exit(1);
316                 }
317         }
318
319 #ifdef DEBUG
320         printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). ");
321         printf("Esto puede causar que ante un error alguna función trate de emitir un mensaje por pantalla ");
322         printf("haciendo que el aspecto visual se vea desvirtuado.\n\n");
323         printf("Todos los mensajes de error se envian por stderr, por lo que es conveniente que vuelva a ejecutar ");
324         printf("el programa de la siguiente manera :\n");
325         printf("\t#> %s <parametros> 2> error.log\n\n", argv[0]);
326         printf("De esta forma el SO se encargaga de redirigir stderr al archivo error.log y evitar algun problema en ");
327         printf("visualizacion de la aplicacion.\n");
328         printf("Para continuar **bajo su propio riesgo** presione una tecla. Puede cancelar la ejecucion en este punto con CTRL+C\n");
329         fgetc(stdin);
330 #endif
331
332         /* Inicio Curses */
333         signal(SIGINT, finish);
334         initscr();
335         keypad(stdscr, TRUE);
336         nonl();
337         cbreak();
338         noecho();
339         /* Si se soporta color, los inicializo */
340         if (has_colors()) {
341                 start_color();
342                 /* Simple color assignment, often all we need. */
343                 init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); /* COLOR_PAIR(1) */
344                 init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
345                 init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
346                 init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
347                 init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
348                 init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
349                 init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
350                 init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
351         }
352         
353         /* Verifico un tamaño minimo de consola */
354         if ((LINES < 25) || (COLS < 80)) {
355                 endwin();
356                 printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
357                 return 1;
358         }
359
360         /* Ventana, caracter para linea vertical, caracter para linea horizontal*/
361         box(stdscr, ACS_VLINE, ACS_HLINE);
362         /* Ventana, Y, X, Texto */
363         mvwaddstr(stdscr, 1, 1, "EMUFS");       
364         attron(COLOR_PAIR(2));
365         mvwaddstr(stdscr, LINES-2, 1, "EMUFS (c) The EMUFS Team - Bajo Licencia GNU/GPL");      
366         attroff(COLOR_PAIR(2));
367         wrefresh(stdscr);
368
369         if (argc == 2) {
370                 dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ...");
371                 art_cargar(&parametros);
372                 fact_cargar(&parametros);
373         } else {
374                 dialog = msg_box(stdscr, COLS, LINES, "Recuperando archivos ...");
375                 art_cargar(NULL);
376                 fact_cargar(NULL);
377         }
378
379         msg_box_free(stdscr, dialog);
380
381         main_menu();
382
383         endwin();
384
385         art_liberar(NULL);
386         fact_liberar(NULL);
387
388         return 0;
389 }
390
391 void menu_facturas()
392 {
393         MENU(mi_menu) {
394                 MENU_OPCION("Alta", "Crear una nueva factura."),
395                 MENU_OPCION("Baja", "Elimina una factura existente."),
396                 MENU_OPCION("Modificacion", "Modifica una factura existente."),
397                 MENU_OPCION("Consultas", "Consulta varias de articulo."),
398                 MENU_OPCION("Recorrer", "Recorrer el archivo por alguno de sus indices."),
399                 MENU_OPCION("Volver", "Volver al menu anterior.")
400         };
401         int opt;
402                 
403         while ((opt = menu_ejecutar(mi_menu, 6, "Menu Facturas")) != 5) {
404                 switch (opt) {
405                         case 0:
406                                 fact_agregar(NULL);
407                         break;
408                         case 1:
409                                 fact_eliminar(NULL);
410                         break;
411                         case 2:
412                                 fact_modificar(NULL);
413                         break;
414                         case 3:
415                                 fact_consultas(NULL);
416                         break;
417                         case 4:
418                                 fact_recorrer();
419                 }
420         }
421 }
422
423 void menu_articulos()
424 {
425         MENU(mi_menu) {
426                 MENU_OPCION("Alta", "Crear un nuevo articulo."),
427                 MENU_OPCION("Baja", "Elimina un articulo existente."),
428                 MENU_OPCION("Modificacion", "Modifica un articulo existente."),
429                 MENU_OPCION("Consultas", "Consulta varias de articulo."),
430                 MENU_OPCION("Recorrer", "Recorrer el archivo por alguno de sus indices."),
431                 MENU_OPCION("Ver ventas", "Ver venta de articulos entre 2 fechas."),
432                 MENU_OPCION("Volver", "Volver al menu anterior.")
433         };
434         int opt;
435                 
436         while ((opt = menu_ejecutar(mi_menu, 7, "Menu Articulos")) != 6) {
437                 switch (opt) {
438                         case 0:
439                                 art_agregar(NULL);
440                         break;
441                         case 1:
442                                 art_eliminar(NULL);
443                         break;
444                         case 2:
445                                 art_modificar(NULL);
446                         break;
447                         case 3:
448                                 art_consultas(NULL);
449                         break;
450                         case 4:
451                                 art_recorrer();
452                         break;
453                         case 5:
454                                 art_ver_ventas();
455                 }
456         }
457
458 }
459
460 void menu_estadisticas()
461 {
462         MENU(mi_menu) {
463                 MENU_OPCION("Articulos", "Ver datos del archivo de Articulos."),
464                 MENU_OPCION("Facturas", "Ver datos del archivo de Facturas."),
465                 MENU_OPCION("Notas", "Ver datos del archivo de Notas."),
466                 MENU_OPCION("Volver", "Ir al menu anterior.")
467         };
468         int opt;
469
470         while ((opt = menu_ejecutar(mi_menu, 4, "Menu Estadisticas")) != 3) {
471                 switch (opt) {
472                         case 0:
473                                 ver_estadisticas( art_get_lst()->fp );
474                         break;
475                         case 1:
476                                 ver_estadisticas( fact_get_lst()->fp );
477                         break;
478                         case 2:
479                                 ver_estadisticas( fact_get_lst()->fp_texto );
480                 }
481         }
482 }
483
484 void menu_ver_registros()
485 {
486         MENU(mi_menu) {
487                 MENU_OPCION("Articulos", "Ver registros del archivo de Articulos."),
488                 MENU_OPCION("Facturas", "Ver registros del archivo de Facturas."),
489                 MENU_OPCION("Notas", "Ver registros del archivo de Notas."),
490                 MENU_OPCION("Volver", "Ir al menu anterior.")
491         };
492         int opt;
493         WINDOW *dialog;
494
495         while ((opt = menu_ejecutar(mi_menu, 4, "Menu Ver Registros")) != 3) {
496                 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
497                 ver_registros(dialog, COLS-2, LINES-4, opt);
498                 werase(dialog);
499                 wrefresh(dialog);
500                 delwin(dialog);
501                 refresh();
502         }
503 }
504
505 void menu_ver_bloques()
506 {
507         MENU(mi_menu) {
508                 MENU_OPCION("Articulos", "Ver bloques del archivo de Articulos."),
509                 MENU_OPCION("Facturas", "Ver bloques del archivo de Facturas."),
510                 MENU_OPCION("Notas", "Ver bloques del archivo de Notas."),
511                 MENU_OPCION("Volver", "Ir al menu anterior.")
512         };
513         int opt;
514         WINDOW *dialog;
515
516         while ((opt = menu_ejecutar(mi_menu, 4, "Menu Ver Bloques")) != 3) {
517                 switch (opt) {
518                         case 0:
519                                 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
520                                 ver_bloques(dialog, COLS-2, LINES-4, 0);
521                                 werase(dialog);
522                                 wrefresh(dialog);
523                                 delwin(dialog);
524                                 refresh();
525                         break;
526                         case 1:
527                                 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
528                                 ver_bloques(dialog, COLS-2, LINES-4, 1);
529                                 werase(dialog);
530                                 wrefresh(dialog);
531                                 delwin(dialog);
532                                 refresh();
533                         break; 
534                 case 2: 
535                                 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
536                                 ver_bloques(dialog, COLS-2, LINES-4, 2);
537                                 werase(dialog);
538                                 wrefresh(dialog);
539                                 delwin(dialog);
540                                 refresh();
541                 }
542         }
543 }
544
545 void ver_indice(int arch, char *indice)
546 {
547         INDICE *idx;
548         int w, h;
549         WINDOW *win;
550         switch (arch) {
551                 case 0:
552                         idx = emufs_buscar_indice_por_nombre(art_get_lst()->fp, indice);
553                 break;
554                 case 1:
555                         idx = emufs_buscar_indice_por_nombre(fact_get_lst()->fp, indice);
556         }
557         h = LINES-4;
558         w = COLS-2;
559         win = newwin(h, w, 2, 1);
560
561         if ((idx != NULL) && (idx->tipo != IND_B_PLUS)) {
562                 emufs_indice_b_ver(idx, win, w, h, 0);
563         } else {
564                 if (idx != NULL) {
565                         WINDOW *dlg;
566                         dlg = msg_box(win, w, h, "El tipo de arbol B+ no esta soportado en el visor");
567                         getch();
568                         msg_box_free(win, dlg);
569                 }
570         }
571         delwin(win);
572 }
573
574 void menu_ver_indices()
575 {
576         int arch[8] = {0, 0, 0, 1, 1, 1, 1, 1};
577         char *nombres[8] = {"codigo", "desc", "presentacion",
578                         "numero", "emision", "vto", "cheque", "ctacte"};
579         MENU(mi_menu) {
580                 MENU_OPCION("Articulos->codigo",""),
581                 MENU_OPCION("Articulos->desc",""),
582                 MENU_OPCION("Articulos->presentacion",""),
583                 MENU_OPCION("Facturas->numero",""),
584                 MENU_OPCION("Facturas->emision",""),
585                 MENU_OPCION("Facturas->vto",""),
586                 MENU_OPCION("Facturas->cheque", ""),
587                 MENU_OPCION("Facturas->ctacte", ""),
588                 MENU_OPCION("Volver", "Volver al menu anterior.")
589         };
590         int c;
591
592         while ((c=menu_ejecutar(mi_menu, 9, "Menu Principal"))!=8) {
593                 ver_indice(arch[c], nombres[c]);
594         }
595 }
596
597 int main_menu()
598 {
599         int c;
600         MENU(mi_menu) {
601                 MENU_OPCION("Articulos","Alta,baja,consulta y modificacion de articulos."),
602                 MENU_OPCION("Facturas","Alta,baja,consulta y modificacion de facturas."),
603                 MENU_OPCION("Ver Registros","Ver registros (en su contexto) de los archivos ."),
604                 MENU_OPCION("Ver Bloques","Ver bloques (en su contexto) de los archivos."),
605                 MENU_OPCION("Estadisticas","Ver estadisticas de ocupacion de archivos."),
606                 MENU_OPCION("Mantenimiento","Tareas de mantenimiento de los archivos."),
607                 MENU_OPCION("Ver Indices", "Permite ver y recorrer los indices"),
608                 MENU_OPCION("Salir", "Salir del sistema.")
609         };
610
611         while ((c=menu_ejecutar(mi_menu, 8, "Menu Principal"))!=7) {
612                 switch (c) {
613                         case 0:
614                                 menu_articulos();
615                         break;
616                         case 1:
617                                 menu_facturas();
618                         break;
619                         case 2:
620                                 menu_ver_registros();
621                         break;
622                         case 3:
623                                 menu_ver_bloques();
624                         break;
625                         case 4:
626                                 menu_estadisticas();
627                         break;
628                         case 5:
629                                 menu_mantenimiento();
630                         break;
631                         case 6:
632                                 menu_ver_indices();
633                 }
634         }
635
636         return 0;
637 }
638
639
640 static void finish(int sig)
641 {
642         endwin();
643
644         /* do your non-curses wrapup here */
645         exit(0);
646 }
647
648 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
649 {
650         va_list ap;
651         char txt[255];
652         int mw, mh;
653         WINDOW *dialog;
654         va_start(ap, format);
655         vsprintf(txt, format, ap);
656         va_end(ap);
657
658         mw = strlen(txt)+2;
659         mh = 3;
660         dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
661         box(dialog, 0 ,0);
662         mvwaddstr(dialog, 1, 1, txt);
663         wrefresh(dialog);
664         curs_set(0);
665         return dialog;
666 }
667
668 void msg_box_free(WINDOW *padre, WINDOW *win)
669 {
670         werase(win);
671         wrefresh(win);
672         delwin(win);
673         curs_set(1);
674         wrefresh(padre);
675 }
676
677 void menu_mantenimiento()
678 {
679         MENU(mi_menu) {
680                 MENU_OPCION("Compactar Articulos","Elimina espacio no utilizado."),
681                 MENU_OPCION("Compactar Facturas","Elimina espacio no utilizado."),
682                 MENU_OPCION("Compactar Notas","Elimina espacio no utilizado."),
683                 MENU_OPCION("Cambiar tipo Archivo Articulos","Permite cambiar el tipo del archivo."),
684                 MENU_OPCION("Cambiar tipo Archivo Facturas","Permite cambiar el tipo del archivo."),
685                 MENU_OPCION("Exportar Articulos", "Genera un archivo XML con los articulos."),
686                 MENU_OPCION("Expostar Facturas", "Genera un archivo XML con las facturas."),
687                 MENU_OPCION("Volver", "Volver al menu anterior.")
688         };
689
690         int opt;
691         int nuevo_tam_registro, nuevo_tam_bloque, nuevo_tipo;
692         int nuevo_tam_registro1, nuevo_tam_bloque1, nuevo_tipo1;
693         WINDOW *dlg;
694         char *s;
695
696         while ((opt = menu_ejecutar(mi_menu, 8, "Menu Mantenimiento")) != 7) {
697                 switch (opt) {
698                         case 0:
699                                 dlg = msg_box(stdscr, COLS, LINES, "Compactando archivo.... Aguarde");
700                                 art_get_lst()->fp->compactar(art_get_lst()->fp);
701                                 msg_box_free(stdscr, dlg);
702                         break;
703                         case 1:
704                                 dlg = msg_box(stdscr, COLS, LINES, "Compactando archivo.... Aguarde");
705                                 fact_get_lst()->fp->compactar(fact_get_lst()->fp);
706                                 msg_box_free(stdscr, dlg);
707                         break;
708                         case 2:
709                                 dlg = msg_box(stdscr, COLS, LINES, "Compactando archivo.... Aguarde");
710                                 fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
711                                 msg_box_free(stdscr, dlg);
712                         break;
713                         case 3:
714                                 nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
715                                 preguntar_nuevo_tipo("Parametros para  Articulos", &nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
716                                 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
717                                 parametros.tipo_arch_art = nuevo_tipo;
718                                 parametros.tam_bloque_art = nuevo_tam_bloque;
719                                 art_reformatear(&parametros);
720                                 msg_box_free(stdscr, dlg);
721                         break;
722                         case 4:
723                                 nuevo_tam_registro = 0;
724                                 preguntar_nuevo_tipo("Parametros para Facturas", &nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
725                                 preguntar_nuevo_tipo("Parametros para Notas", &nuevo_tipo1, &nuevo_tam_bloque1, &nuevo_tam_registro1);
726                                 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
727                                 fact_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro, nuevo_tipo1, nuevo_tam_bloque1, nuevo_tam_registro1);
728                                 msg_box_free(stdscr, dlg);
729                         break;
730                         case 5:
731                                 s = preguntar_file();
732                                 if (s) {
733                                         dlg = msg_box(stdscr, COLS, LINES, "Exportando .... Aguarde");
734                                         PERR("Exportando");
735                                         art_exportar_xml(s);
736                                         msg_box_free(stdscr, dlg);
737                                         free(s);
738                                 }
739                                 break;
740                         case 6:
741                                 s = preguntar_file();
742                                 if (s) {
743                                         dlg = msg_box(stdscr, COLS, LINES, "Exportando .... Aguarde");
744                                         PERR("Exportando");
745                                         fact_exportar_xml(s);
746                                         msg_box_free(stdscr, dlg);
747                                         free(s);
748                                 }
749                 }
750         }
751 }
752
753 void preguntar_nuevo_tipo(const char *title, int *tipo, int *tam_bloque, int *tam_reg)
754 {
755         WINDOW *win;
756         t_Form *form;
757         char *s;
758         int n, is_ok;
759
760         win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
761         box(win, 0, 0);
762
763         mvwaddstr(win, 0, 1, title);
764         form = form_crear(win);
765         form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3,T4,T5");
766         form_ejecutar(form, 1,1);
767
768         s = form_obtener_valor_char(form, "Tipo de archivo");
769         if (strcmp(s, "T1") == 0) n = T1;
770         if (strcmp(s, "T2") == 0) n = T2;
771         if (strcmp(s, "T3") == 0) n = T3;
772         if (strcmp(s, "T4") == 0) n = T4;
773         if (strcmp(s, "T5") == 0) n = T5;
774
775         form_destruir(form);
776
777         werase(win);
778         box(win, 0, 0);
779         wrefresh(win);
780
781         (*tipo) = n;
782         switch (n) {
783                 case T1:
784                         form = form_crear(win);
785                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
786                         is_ok = 0;
787                         do {
788                                 form_set_valor(form, "Tamaño de bloque", "");
789                                 form_ejecutar(form, 1,1);
790                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
791                         } while (!is_ok);
792                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
793                         form_destruir(form);
794                 break;
795                 case T2:
796                         break;
797                 case T3:
798                         if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
799                                 mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
800                                 mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
801                         }
802                         form = form_crear(win);
803                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
804                         if ((*tam_reg) != -1)
805                                 form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
806                         is_ok = 0;
807                         do {
808                                 form_set_valor(form, "Tamaño de bloque", "");
809                                 if ((*tam_reg) != -1)
810                                         form_set_valor(form, "Tamaño de registro", "");
811                                 form_ejecutar(form, 1,1);
812                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
813                                 if ((*tam_reg) != -1) {
814                                         if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
815                                 }
816                         } while (!is_ok);
817                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
818                         if ((*tam_reg) != -1)
819                                 (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");
820                         form_destruir(form);
821                         break;
822                 case T4:
823                 case T5:
824                         form = form_crear(win);
825                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
826                         is_ok = 0;
827                         do {
828                                 form_set_valor(form, "Tamaño de bloque", "");
829                                 form_ejecutar(form, 1,1);
830                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
831                         } while (!is_ok);
832                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
833                         form_destruir(form);
834         }
835         werase(win);
836         wrefresh(win);
837         delwin(win);
838 }
839
840 void ver_estadisticas(EMUFS *fp)
841 {
842         WINDOW *win;
843         EMUFS_Estadisticas stats;
844         char s[40];
845         int i=3;
846
847         stats = fp->leer_estadisticas(fp);
848
849         win = newwin(LINES-4, COLS-2, 2, 1);
850         curs_set(0);
851
852         wattron(win, COLOR_PAIR(COLOR_YELLOW));
853         wattron(win, A_BOLD);
854         mvwaddstr(win, 1, 1, "Tipo de Archivo : ");
855         wattroff(win, A_BOLD);
856         wattroff(win, COLOR_PAIR(COLOR_YELLOW));
857         switch (fp->tipo) {
858                 case T1:
859                         waddstr(win, "Registro long. variable con bloque parametrizado");
860                         wattron(win, A_BOLD);
861                         mvwaddstr(win, i++, 1, "Tamaño de bloque : ");
862                         wattroff(win, A_BOLD);
863                         sprintf(s, "%lu bytes", fp->tam_bloque);
864                         waddstr(win, s);
865                 break;
866                 case T2:
867                         waddstr(win, "Registro long. variable sin bloques");
868                 break;
869                 case T3:
870                         waddstr(win, "Registro long. fija con bloque parametrizado");
871                         wattron(win, A_BOLD);
872                         mvwaddstr(win, i++, 1, "Tamaño de bloque : ");
873                         wattroff(win, A_BOLD);
874                         sprintf(s, "%lu bytes", fp->tam_bloque);
875                         waddstr(win, s);
876                         wattron(win, A_BOLD);
877                         mvwaddstr(win, i++, 1, "Tamaño de registro : ");
878                         wattroff(win, A_BOLD);
879                         sprintf(s, "%lu bytes", fp->tam_reg);
880                         waddstr(win, s);
881         }
882
883
884         wattron(win, A_BOLD);
885         mvwaddstr(win, i++, 1, "Tamaño ocupado por datos / Tamaño archivo : ");
886         wattroff(win, A_BOLD);
887         sprintf(s, "%lu/%lu bytes (%.2f %%)", 
888                         stats.tam_archivo - stats.tam_info_control_dat - stats.total_fs,stats.tam_archivo,
889                         (stats.tam_archivo-stats.tam_info_control_dat-stats.total_fs)*100.0f/(float)stats.tam_archivo);
890         waddstr(win, s);
891         
892         wattron(win, A_BOLD);
893         mvwaddstr(win, i++, 1, "Tamaño info de control(1) / Tamaño archivo : ");
894         wattroff(win, A_BOLD);
895         sprintf(s, "%lu/%lu bytes (%.2f %%)", stats.tam_info_control_dat+stats.tam_archivos_aux, stats.tam_archivo, (stats.tam_info_control_dat+stats.tam_archivos_aux)*100.0f/(float)stats.tam_archivo);
896         waddstr(win, s);
897
898         wattron(win, A_BOLD);
899         mvwaddstr(win, i++, 1, "Espacio Libre / Tamaño archivo : ");
900         wattroff(win, A_BOLD);
901         sprintf(s, "%lu/%lu bytes (%.2f %%)", stats.total_fs, stats.tam_archivo, stats.total_fs*100.0f/(float)stats.tam_archivo);
902         waddstr(win, s);
903         
904         wattron(win, A_BOLD);
905         mvwaddstr(win, i++, 1, "Media de espacio libre : ");
906         wattroff(win, A_BOLD);
907         sprintf(s, "%lu bytes/bloque", stats.media_fs);
908         waddstr(win, s);
909
910         wattron(win, A_BOLD);
911         mvwaddstr(win, i++, 1, "Maximo de Espacio libre : ");
912         wattroff(win, A_BOLD);
913         sprintf(s, "%lu bytes", stats.max_fs);
914         waddstr(win, s);
915
916         wattron(win, A_BOLD);
917         mvwaddstr(win, i++, 1, "Minimo de Espacio libre : ");
918         wattroff(win, A_BOLD);
919         sprintf(s, "%lu bytes", stats.min_fs);
920         waddstr(win, s);
921
922         wattron(win, A_BOLD);
923         mvwaddstr(win, i++, 1, "Tamaño de Archivo de datos : ");
924         wattroff(win, A_BOLD);
925         sprintf(s, "%lu bytes", stats.tam_archivo);
926         waddstr(win, s);
927         
928         wattron(win, A_BOLD);
929         mvwaddstr(win, i++, 1, "Tamaño de Archivos auxiliares : ");
930         wattroff(win, A_BOLD);
931         sprintf(s, "%lu bytes", stats.tam_archivos_aux);
932         waddstr(win, s);
933         
934         wattron(win, A_BOLD);
935         mvwaddstr(win, i++, 1, "Información de control en el .dat : ");
936         wattroff(win, A_BOLD);
937         sprintf(s, "%lu bytes", stats.tam_info_control_dat);
938         waddstr(win, s);
939         
940         if ((fp->tipo == T1) || (fp->tipo == T3)) {
941                 wattron(win, A_BOLD);
942                 mvwaddstr(win, i++, 1, "Cantidad de bloques : ");
943                 wattroff(win, A_BOLD);
944                 sprintf(s, "%lu", stats.cant_bloques);
945                 waddstr(win, s);
946         }
947         
948         wattron(win, A_BOLD);
949         mvwaddstr(win, i++, 1, "Cant. Registros : ");
950         wattroff(win, A_BOLD);
951         sprintf(s, "%lu", stats.cant_registros);
952         waddstr(win, s);
953         
954         wattron(win, A_BOLD);
955         mvwaddstr(win, i++, 1, "(1) Info control del .dat + los archivos auxiliares!.");
956         wattroff(win, A_BOLD);
957         
958         wattron(win, A_BLINK);
959         mvwaddstr(win, i+2, 1, "Presione una tecla para continuar.");
960         wattroff(win, A_BLINK);
961
962         wrefresh(win);
963
964         getch();
965         werase(win);
966         wrefresh(win);
967         delwin(win);
968 }
969
970 char *preguntar_file()
971 {
972         WINDOW *win;
973         t_Form *form;
974         char *s, *t;
975
976         win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
977         box(win, 0, 0);
978
979         form = form_crear(win);
980         form_agregar_widget(form, INPUT, "Nombre de archivo", 30, "");
981         form_ejecutar(form, 1,1);
982
983         s = form_obtener_valor_char(form, "Nombre de archivo");
984
985         if (strlen(s) == 0) {
986                 form_destruir(form);
987                 return NULL;
988         }
989         t = (char *)malloc(sizeof(char*)*(strlen(s)+1));
990         strcpy(t, s);
991         form_destruir(form);
992         return t;
993 }
994