]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/gui.c
6044b1643b3bdd642320c6222ee24946ce0e2dd6
[z.facultad/75.06/emufs.git] / emufs_gui / gui.c
1
2
3 #include <stdlib.h>
4 #include <curses.h>
5 #include <menu.h>
6 #include <signal.h>
7 #include <string.h>
8 #include <stdarg.h>
9
10 #include "menu.h"
11 #include "form.h"
12 #include "articulos.h"
13 #include "facturas.h"
14 #include "emufs.h"
15 #include "registros.h"
16
17 #define CTRLD 4
18
19 static void finish(int sig);
20
21 int main_menu();
22 void menu_articulos();
23 void menu_facturas();
24 void menu_mantenimiento();
25 void menu_estadisticas();
26 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg);
27
28 void ver_estadisticas(EMUFS *fp);
29
30 /* cuadro de msg. w y h son de la ventana padre */
31 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...);
32 void msg_box_free(WINDOW *padre, WINDOW *win);
33
34 typedef enum {PARAM_OK, SHOW_HELP, TIPO_NO_DEFINIDO, TIPO_INVALIDO, BLOQUE_NO_DEFINIDO} t_Param;
35
36 /* Verifica Argumentos */
37 t_Param param_ok(int argc, char *argv[])
38 {
39         int n,i;
40         for(i=1; i<argc; i++) {
41                 if ((strcmp(argv[i], "-h")==0) || (strcmp(argv[i], "--help")==0)) return SHOW_HELP;
42
43                 if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) {
44                         /* Luego del archivo XML debe seguir el tipo */
45                         if ((i+1)<argc) {
46                                 n = atoi(argv[i+1]);
47                                 if ((n < 1) || (n > 3)) return TIPO_INVALIDO;
48                                 if (((n == 1) || (n == 3)) && ((i+2)>=argc))
49                                         return BLOQUE_NO_DEFINIDO;
50                         } else {
51                                 /* Ops, no hay mas parametros */
52                                 return TIPO_NO_DEFINIDO;
53                         }
54                 }
55         }
56
57         return PARAM_OK;
58 }
59
60 void print_help(char *s)
61 {
62         printf("EMUFS - 1v0\n");
63         printf("Modo de uso : %s [<archivo articulos XML> tipo=[1|2|3]]\n", s);
64         printf("\nSi especifica un archivo XML desde donde cargar los articulos debera tambien especificar el tipo");
65         printf(" de archivo a crear, siendo 1, 2, 3\n");
66 }
67
68 int main(int argc, char *argv[])
69 {
70         int c, fin=0;
71         WINDOW *dialog;
72
73         switch (param_ok(argc, argv)) {
74                 case SHOW_HELP:
75                         print_help(argv[0]);
76                         return 0;
77                 case TIPO_NO_DEFINIDO:
78                         printf("Falta parámetro requerido.\nLuego del nombre del archivo debe especificar el tipo de archivo\n");
79                         return 1;
80                 case BLOQUE_NO_DEFINIDO:
81                         printf("Falta parámetro requerido.\nLuego del tipo de archivo debe especificar el tamaño del bloque a utilizar\n");
82                         return 1;
83                 case TIPO_INVALIDO:
84                         printf("Tipo de archivo no valido. Los valores posibles para el tipo de archivo son:\n");
85                         printf("\t1 - Archivo de bloque parametrizado y registro de long. variable.\n");
86                         printf("\t2 - Archivo de registros variables sin bloques.\n");
87                         printf("\t3 - Archivos de bloque parametrizado y registro de long. parametrizada.\n");
88                         return 2;
89                 case PARAM_OK:
90                         fin = 0;
91         }
92
93 #ifdef DEBUG
94         printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). ");
95         printf("Esto puede causar que ante un error alguna función trate de emitir un mensaje por pantalla ");
96         printf("haciendo que el aspecto visual se vea desvirtuado.\n\n");
97         printf("Todos los mensajes de error se envian por stderr, por lo que es conveniente que vuelva a ejecutar ");
98         printf("el programa de la siguiente manera :\n");
99         printf("\t#> %s <parametros> 2> error.log\n\n", argv[0]);
100         printf("De esta forma el SO se encargaga de redirigir stderr al archivo error.log y evitar algun problema en ");
101         printf("visualizacion de la aplicacion.\n");
102         printf("Para continuar **bajo su propio riesgo** presione una tecla. Puede cancelar la ejecucion en este punto con CTRL+C\n");
103         fgetc(stdin);
104 #endif
105
106         /* Inicio Curses */
107         signal(SIGINT, finish);
108         initscr();
109         keypad(stdscr, TRUE);
110         nonl();
111         cbreak();
112         noecho();
113         /* Si se soporta color, los inicializo */
114         if (has_colors()) {
115                 start_color();
116                 /* Simple color assignment, often all we need. */
117                 init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); /* COLOR_PAIR(1) */
118                 init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
119                 init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
120                 init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
121                 init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
122                 init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
123                 init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
124                 init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
125         }
126         
127         /* Verifico un tamaño minimo de consola */
128         if ((LINES < 25) || (COLS < 80)) {
129                 endwin();
130                 printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
131                 return 1;
132         }
133
134         /* Ventana, caracter para linea vertical, caracter para linea horizontal*/
135         box(stdscr, ACS_VLINE, ACS_HLINE);
136         /* Ventana, Y, X, Texto */
137         mvwaddstr(stdscr, 1, 1, "EMUFS");       
138         attron(COLOR_PAIR(2));
139         mvwaddstr(stdscr, LINES-2, 1, "EMUFS (c) The EMUFS Team - Bajo Licencia GNU/GPL");      
140         attroff(COLOR_PAIR(2));
141         wrefresh(stdscr);
142
143         dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ...");
144         if (argc == 4) {
145                 art_cargar(argv[1], atoi(argv[2]), atoi(argv[3]));
146                 if (!fact_cargar("facturas.xml", 1, 400))
147                         fprintf(stderr, "ERROR CARGANDO FACTURAS\n");
148         } else
149                 art_cargar(NULL, -1, -1);
150
151         msg_box_free(stdscr, dialog);
152
153         /* CICLO PRINCIPAL DE LA APLICACION */
154         while ((c = main_menu()) != -1) {
155                 switch (c) {
156                         case 0:
157                                 menu_articulos();
158                         break;
159                         case 1:
160                                 menu_facturas();
161                         break;
162                         case 2:
163                                 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
164                                 ver_registros(dialog, COLS-2, LINES-4);
165                                 werase(dialog);
166                                 wrefresh(dialog);
167                                 delwin(dialog);
168                                 refresh();
169                         break;
170                         case 5:
171                                 menu_estadisticas();
172                         break;
173                         case 6:
174                                 menu_mantenimiento();
175                         break;
176                         case 7:
177                                 fin = 1;
178                         break;
179                 }
180                 if (fin == 1) break;
181         }
182
183         endwin();
184
185         art_liberar(NULL);
186         fact_liberar(NULL);
187
188         return 0;
189 }
190
191 void menu_facturas()
192 {
193         MENU(mi_menu) {
194                 MENU_OPCION("Alta", "Crear una nueva factura."),
195                 MENU_OPCION("Baja", "Elimina una factura existente."),
196                 MENU_OPCION("Modificacion", "Modifica una factura existente."),
197                 MENU_OPCION("Volver", "Volver al menu anterior.")
198         };
199         int opt;
200                 
201         while ((opt = menu_ejecutar(mi_menu, 4, "Menu Articulos")) != 3) {
202                 switch (opt) {
203                         case 0:
204                                 fact_agregar(NULL);
205                         break;
206                         case 1:
207                                 fact_eliminar(NULL);
208                         break;
209                         case 2:
210                                 fact_modificar(NULL);
211                 }
212         }
213 }
214
215 void menu_articulos()
216 {
217         MENU(mi_menu) {
218                 MENU_OPCION("Alta", "Crear un nuevo articulo."),
219                 MENU_OPCION("Baja", "Elimina un articulo existente."),
220                 MENU_OPCION("Modificacion", "Modifica un articulo existente."),
221                 MENU_OPCION("Volver", "Volver al menu anterior.")
222         };
223         int opt;
224                 
225         while ((opt = menu_ejecutar(mi_menu, 4, "Menu Articulos")) != 3) {
226                 switch (opt) {
227                         case 0:
228                                 art_agregar(NULL);
229                         break;
230                         case 1:
231                                 art_eliminar(NULL);
232                         break;
233                         case 2:
234                                 art_modificar(NULL);
235                 }
236         }
237
238 }
239
240 void menu_estadisticas()
241 {
242         MENU(mi_menu) {
243                 MENU_OPCION("Articulos", "Ver datos del archivo de Articulos."),
244                 MENU_OPCION("Facturas", "Ver datos del archivo de Facturas."),
245                 MENU_OPCION("Notas", "Ver datos del archivo de Notas."),
246                 MENU_OPCION("Volver", "Ir al menu anterior.")
247         };
248         int opt;
249
250         while ((opt = menu_ejecutar(mi_menu, 4, "Menu Estadisticas")) != 3) {
251                 switch (opt) {
252                         case 0:
253                                 ver_estadisticas( art_get_lst()->fp );
254                         break;
255                         case 1:
256                                 ver_estadisticas( fact_get_lst()->fp );
257                         break;
258                         case 2:
259                                 ver_estadisticas( fact_get_lst()->fp_texto );
260                 }
261         }
262 }
263
264 int main_menu()
265 {
266         MENU(mi_menu) {
267                 MENU_OPCION("Articulos","Alta,baja,consulta y modificacion de articulos."),
268                 MENU_OPCION("Facturas","Alta,baja,consulta y modificacion de facturas."),
269                 MENU_OPCION("Ver Registros","Ver registros/bloques de archivo Articulos."),
270                 MENU_OPCION("Ver Facturas","Ver registros/bloques de archivo Facturas."),
271                 MENU_OPCION("Ver Notas","Ver registros/bloques de archivo Notas."),
272                 MENU_OPCION("Estadisticas","Ver estadisticas de ocupacion de archivos."),
273                 MENU_OPCION("Mantenimiento","Tareas de mantenimiento de los archivos."),
274                 MENU_OPCION("Salir", "Salir del sistema.")
275         };
276
277         return menu_ejecutar(mi_menu, 8, "Menu Principal");
278 }
279
280
281 static void finish(int sig)
282 {
283         endwin();
284
285         /* do your non-curses wrapup here */
286         exit(0);
287 }
288
289 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
290 {
291         va_list ap;
292         char txt[255];
293         int mw, mh;
294         WINDOW *dialog;
295         va_start(ap, format);
296         vsprintf(txt, format, ap);
297         va_end(ap);
298
299         mw = strlen(txt)+2;
300         mh = 3;
301         dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
302         box(dialog, 0 ,0);
303         mvwaddstr(dialog, 1, 1, txt);
304         wrefresh(dialog);
305         curs_set(0);
306         return dialog;
307 }
308
309 void msg_box_free(WINDOW *padre, WINDOW *win)
310 {
311         werase(win);
312         wrefresh(win);
313         delwin(win);
314         curs_set(1);
315         wrefresh(padre);
316 }
317
318 void menu_mantenimiento()
319 {
320         MENU(mi_menu) {
321                 MENU_OPCION("Compactar Articulos","Elimina espacio no utilizado."),
322                 MENU_OPCION("Compactar Facturas","Elimina espacio no utilizado."),
323                 MENU_OPCION("Compactar Notas","Elimina espacio no utilizado."),
324                 MENU_OPCION("Cambiar tipo Archivo Articulos","Permite cambiar el tipo del archivo."),
325                 MENU_OPCION("Cambiar tipo Archivo Facturas","Permite cambiar el tipo del archivo."),
326                 MENU_OPCION("Cambiar tipo Archivo Notas","Permite cambiar el tipo del archivo."),
327                 MENU_OPCION("Volver", "Volver al menu anterior.")
328         };
329
330         int opt;
331         int nuevo_tam_registro, nuevo_tam_bloque;
332         int nuevo_tipo;
333         WINDOW *dlg;
334
335         while ((opt = menu_ejecutar(mi_menu, 7, "Menu Mantenimiento")) != 6) {
336                 switch (opt) {
337                         case 0:
338                                 art_get_lst()->fp->compactar(art_get_lst()->fp);
339                         break;
340                         case 1:
341                                 fact_get_lst()->fp->compactar(fact_get_lst()->fp);
342                         break;
343                         case 2:
344                                 fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
345                         break;
346                         case 3:
347                                 nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
348                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
349                                 dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
350                                 art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
351                                 msg_box_free(stdscr, dlg);
352                         break;
353                         case 4:
354                                 nuevo_tam_registro = 0;
355                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
356                         break;
357                         case 5:
358                                 nuevo_tam_registro = -2;
359                                 preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
360                 }
361         }
362 }
363
364 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
365 {
366         WINDOW *win;
367         t_Form *form;
368         char *s;
369         int n, is_ok;
370
371         win = newwin(LINES/2, COLS/2, LINES/4, COLS/4);
372         box(win, 0, 0);
373
374         form = form_crear(win);
375         form_agregar_widget(form, RADIO, "Tipo de archivo", 3, "T1,T2,T3");
376         form_ejecutar(form, 1,1);
377
378         s = form_obtener_valor_char(form, "Tipo de archivo");
379         if (strcmp(s, "T1") == 0) n = T1;
380         if (strcmp(s, "T2") == 0) n = T2;
381         if (strcmp(s, "T3") == 0) n = T3;
382
383         form_destruir(form);
384
385         werase(win);
386         box(win, 0, 0);
387         wrefresh(win);
388
389         (*tipo) = n;
390         switch (n) {
391                 case T1:
392                         form = form_crear(win);
393                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
394                         is_ok = 0;
395                         do {
396                                 form_set_valor(form, "Tamaño de bloque", "");
397                                 form_ejecutar(form, 1,1);
398                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
399                         } while (!is_ok);
400                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
401                         form_destruir(form);
402                 break;
403                 case T2:
404                         break;
405                 case T3:
406                         if (((*tam_reg) != -1) && ((*tam_reg) != -2)) {
407                                 mvwaddstr(win, LINES/2-3, 1, "Nota: El tamaño de registro puede");
408                                 mvwaddstr(win, LINES/2-2, 1, "llegar a ser redondeado por el sistema.");
409                         }
410                         form = form_crear(win);
411                         form_agregar_widget(form, INPUT, "Tamaño de bloque", 8, "");
412                         if ((*tam_reg) != -1)
413                                 form_agregar_widget(form, INPUT, "Tamaño de registro", 8, "");
414                         is_ok = 0;
415                         do {
416                                 form_set_valor(form, "Tamaño de bloque", "");
417                                 if ((*tam_reg) != -1)
418                                         form_set_valor(form, "Tamaño de registro", "");
419                                 form_ejecutar(form, 1,1);
420                                 if (form_obtener_valor_int(form, "Tamaño de bloque") > 0) is_ok = 1;
421                                 if ((*tam_reg) != -1) {
422                                         if (form_obtener_valor_int(form, "Tamaño de registro") > 0) is_ok = 1; else is_ok = 0;
423                                 }
424                         } while (!is_ok);
425                         (*tam_bloque) = form_obtener_valor_int(form, "Tamaño de bloque");
426                         if ((*tam_reg) != -1)
427                                 (*tam_reg) = form_obtener_valor_int(form, "Tamaño de registro");
428                         form_destruir(form);
429         }
430         werase(win);
431         wrefresh(win);
432         delwin(win);
433 }
434
435 void ver_estadisticas(EMUFS *fp)
436 {
437         WINDOW *win;
438         EMUFS_Estadisticas stats;
439         char s[40];
440         int i=3;
441
442         stats = fp->leer_estadisticas(fp);
443
444         win = newwin(LINES-4, COLS-2, 2, 1);
445         
446         mvwaddstr(win, 1, 1, "Tipo de Archivo : ");
447         switch (fp->tipo) {
448                 case T1:
449                         waddstr(win, "Registro long. variable con bloque parametrizado");
450                 break;
451                 case T2:
452                         waddstr(win, "Registro long. variable sin bloques");
453                 break;
454                 case T3:
455                         waddstr(win, "Registro long. fija con bloque parametrizado");
456         }
457
458         mvwaddstr(win, i++, 1, "Cant. Registros : ");
459         sprintf(s, "%lu", stats.tam_archivo);
460         waddstr(win, s);
461
462         mvwaddstr(win, i++, 1, "Tamaño de Archivo (bytes) : ");
463         sprintf(s, "%lu", stats.tam_archivo_bytes);
464         waddstr(win, s);
465
466         mvwaddstr(win, i++, 1, "Tamaño de Info de Control (bytes) : ");
467         sprintf(s, "%lu", stats.info_control);
468         waddstr(win, s);
469
470         mvwaddstr(win, i++, 1, "Media de espacio libre : ");
471         sprintf(s, "%lu", stats.media_fs);
472         waddstr(win, s);
473
474         mvwaddstr(win, i++, 1, "Espacio Libre : ");
475         sprintf(s, "%lu", stats.total_fs);
476         waddstr(win, s);
477
478         mvwaddstr(win, i++, 1, "Maximo de Espacio libre : ");
479         sprintf(s, "%lu", stats.max_fs);
480         waddstr(win, s);
481
482         mvwaddstr(win, i++, 1, "Minimo de Espacio libre : ");
483         sprintf(s, "%lu", stats.min_fs);
484         waddstr(win, s);
485
486         mvwaddstr(win, i++, 1, "Cantidad de bloques : ");
487         sprintf(s, "%lu", stats.cant_bloques);
488         waddstr(win, s);
489
490         werase(win);
491         wrefresh(win);
492         delwin(win);
493 }
494