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