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