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