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