]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs_gui/form.c
* Ver registros completo!!. Ya se puede :
[z.facultad/75.06/emufs.git] / emufs_gui / form.c
index a97e3ba93159506f2e2190f448ba42f0c93e28ef..9e5cb57d9130f3dd0120941a62aa10d50a53b253 100644 (file)
@@ -38,16 +38,21 @@ static int form_radio(WINDOW *win, int x, int y, t_Widget *w);
 t_Form *form_crear(WINDOW *win)
 {
        t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
+       if (tmp == NULL) {
+               return NULL;
+       }
        tmp->primero = tmp->ultimo = NULL;
        tmp->win = win;
 
-       /* TODO : El error se debe verificar afuera? */
        return tmp;
 }
 
 int form_destruir(t_Form *f)
 {
-       t_Widget *tmp = f->primero;
+       t_Widget *tmp;
+       if (f == NULL) return 0;
+
+       tmp = f->primero;
 
        while (tmp) {
                f->primero = f->primero->sig;
@@ -62,6 +67,8 @@ void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned i
 {
        t_Widget *tmp = NULL;
 
+       if (f == NULL) return;
+
        /* Creo el nuevo widget segun el tipo */
        switch (tipo) {
                case INPUT:
@@ -73,6 +80,7 @@ void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned i
 
        /* Si se creo wl widget, lo agrego al formulario al final */
        if (tmp) {
+               tmp->modificable = 1;
                if (f->primero == NULL) {
                        f->primero = f->ultimo = tmp;
                } else {
@@ -87,7 +95,8 @@ void form_ejecutar(t_Form *f, int x, int y)
        int offset = 0, my_y, salida;
        t_Widget *tmp = f->primero;
        my_y = y-1;
-       /* Pongo las etiquetas de los campos, y me fijo el mayor offset */
+       
+       /* Calculo cual es la etiqueta más larga de FORM */
        while (tmp) {
                my_y++;
                if (strlen(tmp->nombre) > offset)
@@ -100,11 +109,13 @@ void form_ejecutar(t_Form *f, int x, int y)
 
        tmp = f->primero;
        my_y = y-1;
+       /* Agrego el etiqueta y el valor actual para cada elemento */
        while (tmp) {
                ++my_y;
                mvwaddstr(f->win, my_y, x, tmp->nombre);
                waddch(f->win, ':');
                waddch(f->win, ' ');
+               /* TODO : VER QUE SI ES UNA OPCION ES DISTINTO!! */
                mvwaddstr(f->win, my_y, x+offset, tmp->valor);
                tmp = tmp->sig;
        }
@@ -112,10 +123,12 @@ void form_ejecutar(t_Form *f, int x, int y)
 
        tmp = f->primero;
        my_y = y-1;
+       /* Ejecuto el formulario */
        while (tmp) {
                ++my_y;
                wmove(f->win, my_y, x+offset);
-               salida = tmp->ejecutar(f->win, x+offset, my_y, tmp);
+               if (tmp->modificable)
+                       salida = tmp->ejecutar(f->win, x+offset, my_y, tmp);
                wrefresh(f->win);
                tmp = tmp->sig;
        }
@@ -156,14 +169,25 @@ t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max
 {
        t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
 
+       if (tmp == NULL) return NULL;
+
        tmp->tipo = tipo;
        tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
+       if (tmp->nombre == NULL) {
+               free(tmp);
+               return NULL;
+       }
        strcpy(tmp->nombre, nombre);
 
        tmp->max = max;
        tmp->valor = (char *)malloc(sizeof(char)*(max+1));
+       if (tmp->valor == NULL) {
+               free(tmp->nombre);
+               free(tmp);
+               return NULL;
+       }
        tmp->valor[0] = '\0';
-       strncpy(tmp->valor, defecto, max);
+       strcpy(tmp->valor, defecto);
 
        tmp->sig = NULL;
 
@@ -176,13 +200,26 @@ t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max
 {
        int ini, fin, actual;
        t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
+       if (tmp == NULL) {
+               return NULL;
+       }
 
        tmp->tipo = tipo;
        tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
+       if (tmp->nombre == NULL) {
+               free(tmp);
+               return NULL;
+       }
        strcpy(tmp->nombre, nombre);
 
        tmp->max = max;
        tmp->opciones = (char **)malloc(sizeof(char*)*(max));
+       if (tmp->opciones == NULL) {
+               free(tmp->nombre);
+               free(tmp);
+               return NULL;
+       }
+
        /* Parseo VALOR separado por comas */
        actual = ini = 0;
        fin = ini+1;
@@ -212,6 +249,8 @@ t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max
 void widget_free(t_Widget *w)
 {
        int i;
+       if (w == NULL) return ;
+
        free(w->nombre);
        switch (w->tipo) {
                case INPUT:
@@ -237,7 +276,8 @@ int form_input(WINDOW *win, int x, int y, t_Widget *w)
        }
 
        wrefresh(win);
-       while ((c=getch()) != 13) {
+       c = getch();
+       while ((c != KEY_ENTER) && (c != 13)) {
                /* Verifico si se apreto basckspace */
                if (c == KEY_BACKSPACE) {
                        if (current > 0) {
@@ -248,19 +288,23 @@ int form_input(WINDOW *win, int x, int y, t_Widget *w)
                        /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
                        wmove(win, y, x+current);
                        wrefresh(win);
+                       c = getch();
                        continue;
                }
                /* Si no entra mas, ignoro toda entrada */
-               if (current >= w->max) continue;
-
+               if (current >= w->max) {
+                       c = getch();
+                       continue;
+               }
+               
                wmove(win, y, x+current);
                waddch(win, c);
                w->valor[current++] = c;
                wrefresh(win);
+               c = getch();
        }
        /* Cierro el string con el \0 */
-       w->valor[current+1] = '\0';
-
+       w->valor[current] = '\0';
        /* Retorno la tecla con la que se salio. */
        /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */
        return c;
@@ -314,3 +358,16 @@ int form_radio(WINDOW *win, int x, int y, t_Widget *w)
        return 0;
 }
 
+void form_es_modificable(t_Form *f, const char *widget, int b)
+{
+       /* Busco el widget */
+       t_Widget *tmp = f->primero;
+       while (tmp) {
+               if (strcmp(widget, tmp->nombre) == 0) {
+                       tmp->modificable = b;
+                       break;
+               }
+               tmp = tmp->sig;
+       }
+}
+