+WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
+{
+ va_list ap;
+ char txt[255];
+ int mw, mh;
+ WINDOW *dialog;
+ va_start(ap, format);
+ vsprintf(txt, format, ap);
+ va_end(ap);
+
+ mw = strlen(txt)+2;
+ mh = 3;
+ dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
+ box(dialog, 0 ,0);
+ mvwaddstr(dialog, 1, 1, txt);
+ wrefresh(dialog);
+ curs_set(0);
+ return dialog;
+}
+
+void msg_box_free(WINDOW *padre, WINDOW *win)
+{
+ werase(win);
+ wrefresh(win);
+ delwin(win);
+ curs_set(1);
+ wrefresh(padre);
+}
+
+void menu_mantenimiento()
+{
+ MENU(mi_menu) {
+ MENU_OPCION("Compactar Articulos","Elimina espacio no utilizado."),
+ MENU_OPCION("Compactar Facturas","Elimina espacio no utilizado."),
+ MENU_OPCION("Compactar Notas","Elimina espacio no utilizado."),
+ MENU_OPCION("Cambiar tipo Archivo Articulos","Permite cambiar el tipo del archivo."),
+ MENU_OPCION("Cambiar tipo Archivo Facturas","Permite cambiar el tipo del archivo."),
+ MENU_OPCION("Cambiar tipo Archivo Notas","Permite cambiar el tipo del archivo."),
+ MENU_OPCION("Volver", "Volver al menu anterior.")
+ };
+
+ int opt;
+ int nuevo_tam_registro, nuevo_tam_bloque;
+ int nuevo_tipo;
+ WINDOW *dlg;
+
+ while ((opt = menu_ejecutar(mi_menu, 7, "Menu Mantenimiento")) != 6) {
+ switch (opt) {
+ case 0:
+ art_get_lst()->fp->compactar(art_get_lst()->fp);
+ break;
+ case 1:
+ fact_get_lst()->fp->compactar(fact_get_lst()->fp);
+ break;
+ case 2:
+ fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
+ break;
+ case 3:
+ nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
+ preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
+ dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
+ art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
+ msg_box_free(stdscr, dlg);
+ break;
+ case 4:
+ nuevo_tam_registro = 0;
+ preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
+ break;
+ case 5:
+ nuevo_tam_registro = -2;
+ preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
+ }
+ }
+}
+
+void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
+{
+ WINDOW *win;
+ t_Form *form;
+ char *s;
+ int n, is_ok;
+
+ win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
+ box(win, 0, 0);
+
+ form = form_crear(win);
+ form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3");
+ form_ejecutar(form, 1,1);
+
+ s = form_obtener_valor_char(form, "Tipo de archivo");
+ if (strcmp(s, "T1") == 0) n = T1;
+ if (strcmp(s, "T2") == 0) n = T2;
+ if (strcmp(s, "T3") == 0) n = T3;
+
+ form_destruir(form);
+
+ werase(win);
+ box(win, 0, 0);
+ wrefresh(win);
+
+ (*tipo) = n;
+ switch (n) {
+ case T1:
+ form = form_crear(win);
+ form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
+ is_ok = 0;
+ do {
+ form_set_valor(form, "Tamaño de bloque", "");
+ form_ejecutar(form, 1,1);
+ if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
+ } while (!is_ok);
+ (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
+ form_destruir(form);
+ break;
+ case T2:
+ break;
+ case T3:
+ if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
+ mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
+ mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
+ }
+ form = form_crear(win);
+ form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
+ if ((*tam_reg) != -1)
+ form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
+ is_ok = 0;
+ do {
+ form_set_valor(form, "Tamaño de bloque", "");
+ if ((*tam_reg) != -1)
+ form_set_valor(form, "Tamaño de registro", "");
+ form_ejecutar(form, 1,1);
+ if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
+ if ((*tam_reg) != -1) {
+ if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
+ }
+ } while (!is_ok);
+ (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
+ if ((*tam_reg) != -1)
+ (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");
+ form_destruir(form);
+ }
+ werase(win);
+ wrefresh(win);
+ delwin(win);
+}
+
+void ver_estadisticas(EMUFS *fp)
+{
+ WINDOW *win;
+ EMUFS_Estadisticas stats;
+ char s[40];
+ int i=3;
+
+ stats = fp->leer_estadisticas(fp);
+
+ win = newwin(LINES-4, COLS-2, 2, 1);
+ curs_set(0);
+
+ wattron(win, COLOR_PAIR(COLOR_YELLOW));
+ wattron(win, A_BOLD);
+ mvwaddstr(win, 1, 1, "Tipo de Archivo : ");
+ wattroff(win, A_BOLD);
+ wattroff(win, COLOR_PAIR(COLOR_YELLOW));
+ switch (fp->tipo) {
+ case T1:
+ waddstr(win, "Registro long. variable con bloque parametrizado");
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Tamaño de bloque : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", fp->tam_bloque);
+ waddstr(win, s);
+ break;
+ case T2:
+ waddstr(win, "Registro long. variable sin bloques");
+ break;
+ case T3:
+ waddstr(win, "Registro long. fija con bloque parametrizado");
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Tamaño de bloque : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", fp->tam_bloque);
+ waddstr(win, s);
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Tamaño de registro : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", fp->tam_reg);
+ waddstr(win, s);
+ }
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Cant. Registros : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu", stats.tam_archivo);
+ waddstr(win, s);
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Tamaño de Archivo : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", stats.tam_archivo_bytes);
+ waddstr(win, s);
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Tamaño de Info de Control : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", stats.info_control);
+ waddstr(win, s);
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Media de espacio libre : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes/bloque", stats.media_fs);
+ waddstr(win, s);
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Espacio Libre : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", stats.total_fs);
+ waddstr(win, s);
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Maximo de Espacio libre : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", stats.max_fs);
+ waddstr(win, s);
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Minimo de Espacio libre : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu bytes", stats.min_fs);
+ waddstr(win, s);
+
+ wattron(win, A_BOLD);
+ mvwaddstr(win, i++, 1, "Cantidad de bloques : ");
+ wattroff(win, A_BOLD);
+ sprintf(s, "%lu", stats.cant_bloques);
+ waddstr(win, s);
+
+ wattron(win, A_BLINK);
+ mvwaddstr(win, i+2, 1, "Presione una tecla para continuar.");
+ wattroff(win, A_BLINK);
+
+ wrefresh(win);
+
+ getch();
+ werase(win);
+ wrefresh(win);
+ delwin(win);
+}
+