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;
{
t_Widget *tmp = NULL;
+ if (f == NULL) return;
+
/* Creo el nuevo widget segun el tipo */
switch (tipo) {
case INPUT:
/* 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 {
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)
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;
}
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;
}
{
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;
{
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;
void widget_free(t_Widget *w)
{
int i;
+ if (w == NULL) return ;
+
free(w->nombre);
switch (w->tipo) {
case INPUT:
}
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) {
/* 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;
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;
+ }
+}
+