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