#include <string.h>
#include <stdarg.h>
+#include "gui.h"
#include "menu.h"
#include "form.h"
#include "articulos.h"
void menu_mantenimiento();
void menu_estadisticas();
void menu_ver_registros();
+void menu_ver_bloques();
void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg);
void ver_estadisticas(EMUFS *fp);
-/* cuadro de msg. w y h son de la ventana padre */
-WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...);
-void msg_box_free(WINDOW *padre, WINDOW *win);
-
typedef enum {
PARAM_OK, /* Parametros estan ok */
NO_ART_FILE, /* No se especifico nombre de archivo Articulos */
menu_ver_registros();
break;
case 3:
+ menu_ver_bloques();
break;
case 4:
menu_estadisticas();
}
}
}
+
+void menu_ver_bloques()
+{
+ MENU(mi_menu) {
+ MENU_OPCION("Articulos", "Ver bloques del archivo de Articulos."),
+ MENU_OPCION("Facturas", "Ver bloques del archivo de Facturas."),
+ MENU_OPCION("Notas", "Ver bloques del archivo de Notas."),
+ MENU_OPCION("Volver", "Ir al menu anterior.")
+ };
+ int opt;
+ WINDOW *dialog;
+
+ while ((opt = menu_ejecutar(mi_menu, 4, "Menu Ver Bloques")) != 3) {
+ switch (opt) {
+ case 0:
+ dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
+ ver_bloques(dialog, COLS-2, LINES-4, 0);
+ werase(dialog);
+ wrefresh(dialog);
+ delwin(dialog);
+ refresh();
+ break;
+ case 1:
+ dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
+ ver_bloques(dialog, COLS-2, LINES-4, 1);
+ werase(dialog);
+ wrefresh(dialog);
+ delwin(dialog);
+ refresh();
+ break;
+ case 2:
+ dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
+ ver_bloques(dialog, COLS-2, LINES-4, 2);
+ werase(dialog);
+ wrefresh(dialog);
+ delwin(dialog);
+ refresh();
+ }
+ }
+}
+
int main_menu()
{
MENU(mi_menu) {
#include "idx.h"
#include "articulos.h"
#include "facturas.h"
+#include "gui.h"
/* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */
static char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
mvwaddstr(padre, h-offset_alto+6, 48, " . = Esp. Libre");
mvwaddstr(padre, h-offset_alto+7, 48, " < > = Separador Bloques");
}
+
+char *juntar_memoria(char *s1, char *s2, char *s3, int size1, int size2, int size3)
+{
+ char *salida;
+ int tam=0;
+ if (s1) tam += size1;
+ if (s2) tam += size2;
+ if (s3) tam += size3;
+ salida = (char *)malloc(tam);
+ if (salida == NULL) {
+ free(s1);
+ free(s2);
+ free(s3);
+ return NULL;
+ }
+
+ if (s1) memcpy(salida, s1, size1);
+ if (s2) memcpy(salida+size2, s2, size2);
+ if (s3) memcpy(salida+size2+size3, s3, size3);
+ if (s1) free(s1);
+ if (s2) free(s2);
+ if (s3) free(s3);
+ return salida;
+}
+
+void ver_bloques(WINDOW *padre, int w, int h, int cual)
+{
+ /* Ventanas donde mostrar las cosas */
+ char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
+ WINDOW *actual[2], *dlg;
+ EMUFS_REG_SIZE size, size_actual, size_siguiete, size_anterior;
+ int scroll, actual_ancho;
+ int max_scroll, c, offset_alto;
+ /* Indices que hay validos en IDX */
+ EMUFS_REG_ID indices_total, indices_actual;
+ char *bloque_actual, *bloque_anterior, *bloque_siguiente;
+ char *data; /* Registros a mostrar en pantalla */
+ EMUFS *fp;
+ int pos_actual, ancho_registro, offset, pos;
+ EMUFS_Estadisticas stats;
+
+ if (cual == 0)
+ fp = emufs_abrir("articulos");
+ else if (cual == 1)
+ fp = emufs_abrir("facturas");
+ else if (cual == 2)
+ fp = emufs_abrir("notas");
+
+ stats = fp->leer_estadisticas(fp);
+
+ wattron(padre, COLOR_PAIR(COLOR_BLUE));
+ mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
+ wattroff(padre, COLOR_PAIR(COLOR_BLUE));
+ switch (fp->tipo) {
+ case T1:
+ waddstr(padre, "Registro variable con bloque parametrizado.");
+ if (cual == 0)
+ procesar = procesar_registro_articulo_tipo1;
+ else
+ procesar = procesar_registro_factura_tipo1;
+ break;
+ case T2:
+ waddstr(padre, "Registro variable sin bloques.");
+ actual[0] = msg_box(padre, w, h, "El tipo de archivo no contiene bloques.");
+ getch();
+ msg_box_free(padre, actual[0]);
+ return;
+ break;
+ case T3:
+ if (cual == 0)
+ procesar = procesar_registro_articulo_tipo3;
+ else
+ procesar = procesar_registro_factura_tipo3;
+ waddstr(padre, "Registro fijo con bloque parametrizado.");
+ }
+
+
+ indices_actual = 0;
+ indices_total = stats.cant_bloques;
+ /* Leo */
+ fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
+ pos_actual = 0;
+ bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
+ pos_actual = 0;
+ bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
+ pos_actual = 0;
+ bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
+ if (!bloque_siguiente) {
+ bloque_siguiente = (char *)malloc(size_siguiete);
+ memset(bloque_siguiente, 0, size_siguiete);
+ }
+ if (!bloque_anterior) {
+ bloque_anterior = (char *)malloc(size_anterior);
+ memset(bloque_anterior, 0, size_anterior);
+ }
+ pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
+ ancho_registro = size_actual;
+ data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
+
+ PERR("HASTA ACA VOY BIEN");
+ offset_alto = 8;
+ max_scroll = (size_actual+size_anterior+size_siguiete) / (w-4) - (h-offset_alto-2);
+ if (max_scroll < 0) max_scroll = 0;
+
+ actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
+ actual_ancho = w-4;
+ actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
+ box(actual[0], 0, 0);
+
+ curs_set(0);
+
+ mostrar_info(padre, h, offset_alto);
+
+ mvwaddnstr(actual[1], 0, 0, data, pos_actual);
+ wattron(actual[1], A_BOLD);
+ waddnstr(actual[1], data+pos_actual, ancho_registro);
+ wattroff(actual[1], A_BOLD);
+ waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
+ wrefresh(actual[1]);
+ wrefresh(actual[0]);
+ wrefresh(padre);
+ scroll = 0;
+ while ((c=getch()) != 13) {
+ switch (c) {
+ case 'b':
+ case 'B':
+ dlg = newwin(4, 50, h/2-2, w/2-25);
+ box(dlg, 0, 0);
+ preguntar_id(dlg, fp);
+ werase(dlg);
+ wrefresh(dlg);
+ delwin(dlg);
+ wrefresh(padre);
+ curs_set(0);
+ break;
+ case 'a': /* Scroll */
+ scroll--;
+ if (scroll < 0) scroll = 0;
+ break;
+ case 'z': /* Scroll */
+ scroll++;
+ if (scroll > max_scroll) scroll = max_scroll;
+ break;
+ case 'l':
+ if (indices_actual < indices_total) {
+ indices_actual++;
+ if (indices_actual >= indices_total) indices_actual = indices_total-1;
+ if (data) free(data);
+ fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
+ bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
+ bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
+ bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
+ pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
+ ancho_registro = size_actual;
+ data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
+ }
+ break;
+ case 'k':
+ if (indices_actual != EMUFS_NOT_FOUND) {
+ indices_actual--;
+ if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
+ if (data) free(data);
+ fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
+ bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
+ bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
+ bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
+ pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
+ ancho_registro = size_actual;
+ data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
+ }
+ }
+ /* Borro las ventanas */
+ werase(actual[1]);
+
+ /* Imprimo los registros */
+ if (data) {
+ offset = scroll*actual_ancho; /* Cantidad de caracteres que tengo que saltar */
+ pos = pos_actual - offset; /* Cantidad de caracteres que hay antes de mi a imprimir */
+ mvwaddnstr(actual[1], 0, 0, data+offset, pos);
+ if (pos > 0)
+ offset += pos;
+ else
+ offset -= pos;
+ wattron(actual[1], A_BOLD);
+ waddnstr(actual[1], data+offset, ancho_registro+((pos<0)?pos:0));
+ wattroff(actual[1], A_BOLD);
+ offset += ancho_registro+((pos<0)?pos:0);
+ waddnstr(actual[1], data+offset, size-offset);
+ }
+
+ wrefresh(actual[1]);
+ wrefresh(padre);
+ }
+ if (data) free(data);
+
+ emufs_destruir(fp);
+ delwin(actual[0]);
+ wrefresh(padre);
+ curs_set(1);
+}
+
void ver_registros(WINDOW *padre, int w, int h, int cual)
{
/* Ventanas donde mostrar las cosas */