]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/gui.c
ec90147567c7c9294ea0fce2de298ae85e9808ee
[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                 fact_cargar(argv[1]);
138         } else
139                 art_cargar(NULL, -1, -1);
140
141         msg_box_free(stdscr, dialog);
142
143         /* CICLO PRINCIPAL DE LA APLICACION */
144         while ((c = main_menu()) != -1) {
145                 switch (c) {
146                         case 0:
147                                 menu_articulos();
148                         break;
149                 //      case 1:
150                         case 2:
151                                 dialog = derwin(stdscr, LINES-4, COLS-2, 2, 1);
152                                 ver_registros(dialog, COLS-2, LINES-4);
153                                 werase(dialog);
154                                 wrefresh(dialog);
155                                 delwin(dialog);
156                                 refresh();
157                         break;
158                 //      case 3:
159                         case 6:
160                                 fin = 1;
161                         break;
162                 }
163                 if (fin == 1) break;
164         }
165
166         endwin();
167
168         art_liberar(NULL);
169         fact_liberar(NULL);
170
171         return 0;
172 }
173
174 void menu_articulos()
175 {
176         WINDOW *menu_win;
177         MENU *menu;
178         ITEM **items;
179         int c, salir;
180         char *opciones[] = {
181                                         "Alta",
182                                         "Baja",
183                                         "Modificacion",
184                                         "Volver"
185         };
186
187         items = (ITEM **)calloc(5, sizeof(ITEM *));
188
189         items[0] = new_item(opciones[0], "Crear un nuevo articulo.");
190         set_item_userptr(items[0], art_agregar);
191         items[1] = new_item(opciones[1], "Eliminar un articulo existente.");
192         set_item_userptr(items[1], art_eliminar);
193         items[2] = new_item(opciones[2], "Modificar un articulo existente.");
194         set_item_userptr(items[2], art_modificar);
195         items[3] = new_item(opciones[3], "Volver al menu anterior.");
196         items[4] = NULL;
197
198         menu = new_menu((ITEM **)items);
199         menu_win = newwin(8, COLS-2, 3, 1);
200         keypad(menu_win, TRUE);
201         set_menu_mark(menu, " > ");
202         set_menu_win(menu, menu_win);
203         set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
204
205         box(menu_win, 0, 0);
206         mvwaddch(menu_win, 2, 0, ACS_LTEE);
207         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
208         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
209         wattron(menu_win, COLOR_PAIR(COLOR_RED));
210         mvwaddstr(menu_win, 1, 1, "Menu Articulos");
211         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
212         post_menu(menu);
213         wrefresh(menu_win);
214
215         curs_set(0);
216         salir = 0;
217         while((!salir) && (c = getch()) != KEY_F(3)) {
218                 switch(c) {
219                         case KEY_DOWN:
220                                 menu_driver(menu, REQ_DOWN_ITEM);
221                                 break;
222                         case KEY_UP:
223                                 menu_driver(menu, REQ_UP_ITEM);
224                         break;
225                         case 13:
226                         case 10: {
227                                 ITEM *cur;
228                                 void (*p)(char *);
229
230                                 cur = current_item(menu);
231                                 if (strcmp(item_name(cur), opciones[3]) == 0) {
232                                         salir = 1;
233                                 } else {
234                                         p = item_userptr(cur);
235                                         unpost_menu(menu);
236                                         refresh();
237                                         p(NULL); /* Paso NULL para que ejecute la accion por defecto */
238                                         post_menu(menu);
239                                         box(menu_win,0,0);
240                                         mvwaddch(menu_win, 2, 0, ACS_LTEE);
241                                         mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
242                                         mvwaddch(menu_win, 2, 67, ACS_RTEE);
243                                         wrefresh(menu_win);
244                                 }
245                                 pos_menu_cursor(menu);
246                         }
247                 }
248                 wrefresh(menu_win);
249         }       
250         curs_set(1);
251         
252         unpost_menu(menu);
253         delwin(menu_win);
254         free_item(items[0]);
255         free_item(items[1]);
256         free_item(items[2]);
257         free_item(items[3]);
258         free_menu(menu);
259 }
260
261 int main_menu()
262 {
263         WINDOW *menu_win;
264         MENU *menu;
265         ITEM **items;
266         int c, salir, opcion;
267         char *opciones[] = {
268                                         "Articulos",
269                                         "Facturas",
270                                         "Ver Registros",
271                                         "Ver Bloques",
272                                         "Estadisticas",
273                                         "Mantenimiento",
274                                         "Salir"
275         };
276
277         items = (ITEM **)calloc(8, sizeof(ITEM *));
278
279         items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
280         items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
281         items[2] = new_item(opciones[2], "Ver registros de un archivo.");
282         items[3] = new_item(opciones[3], "Ver bloques de un archivo.");
283         items[4] = new_item(opciones[4], "Ver estadisticas de ocupacion de archivos.");
284         items[5] = new_item(opciones[5], "Tareas de mantenimiento de los archivos.");
285         items[6] = new_item(opciones[6], "Salir del sistema.");
286         items[7] = NULL;
287
288         menu = new_menu((ITEM **)items);
289         menu_win = newwin(14, COLS-2, 3, 1);
290         keypad(menu_win, TRUE);
291         set_menu_mark(menu, " > ");
292         set_menu_win(menu, menu_win);
293         set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
294
295         box(menu_win, 0, 0);
296         mvwaddch(menu_win, 2, 0, ACS_LTEE);
297         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
298         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
299         wattron(menu_win, COLOR_PAIR(COLOR_RED));
300         mvwaddstr(menu_win, 1, 1, "Menu Principal");
301         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
302         post_menu(menu);
303         wrefresh(menu_win);
304
305         curs_set(0);
306         opcion = -1;
307         salir = 0;
308         while((!salir) && (c = getch())) {
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                         {
319                                 ITEM *cur;
320                                 int i;
321
322                                 cur = current_item(menu);
323                                 for(i=0; i<7; ++i) {
324                                         if (strcmp(item_name(cur), opciones[i]) == 0)
325                                                 opcion = i;
326                                 }
327                                 pos_menu_cursor(menu);
328                                 salir = 1;
329                         }
330                 }
331                 wrefresh(menu_win);
332         }       
333         curs_set(1);
334         
335         unpost_menu(menu);
336         werase(menu_win);
337         wrefresh(menu_win);
338         delwin(menu_win);
339         free_item(items[0]);
340         free_item(items[1]);
341         free_item(items[2]);
342         free_item(items[3]);
343         free_item(items[4]);
344         free_item(items[5]);
345         free_item(items[6]);
346         free_menu(menu);
347
348         return opcion;
349 }
350
351
352 static void finish(int sig)
353 {
354         endwin();
355
356         /* do your non-curses wrapup here */
357         exit(0);
358 }
359
360 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
361 {
362         va_list ap;
363         char txt[255];
364         int mw, mh;
365         WINDOW *dialog;
366         va_start(ap, format);
367         vsprintf(txt, format, ap);
368         va_end(ap);
369
370         mw = strlen(txt)+2;
371         mh = 3;
372         dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
373         box(dialog, 0 ,0);
374         mvwaddstr(dialog, 1, 1, txt);
375         wrefresh(dialog);
376         curs_set(0);
377         return dialog;
378 }
379
380 void msg_box_free(WINDOW *padre, WINDOW *win)
381 {
382         werase(win);
383         wrefresh(win);
384         delwin(win);
385         curs_set(1);
386         wrefresh(padre);
387 }
388