+
+#include "form.h"
+
+static void widget_free(t_Widget *);
+static t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max);
+static int form_input(WINDOW *win, int x, int y, t_Widget *w);
+
+t_Form *form_crear(WINDOW *win)
+{
+ t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
+ 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;
+
+ while (tmp) {
+ f->primero = f->primero->sig;
+ widget_free(tmp);
+ tmp = f->primero;
+ }
+ free(f);
+ return 1;
+}
+
+void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max)
+{
+ t_Widget *tmp = widget_create(tipo, nombre, max);
+
+ if (f->primero == NULL) {
+ f->primero = f->ultimo = tmp;
+ } else {
+ f->ultimo->sig = tmp;
+ f->ultimo = tmp;
+ }
+}
+
+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 */
+ while (tmp) {
+ my_y++;
+ mvwaddstr(f->win, my_y, x, tmp->nombre);
+ waddch(f->win, ':');
+ if (strlen(tmp->nombre) > offset)
+ offset = strlen(tmp->nombre);
+
+ tmp = tmp->sig;
+ }
+ /* Agrego el : */
+ ++offset;
+ x += offset;
+
+ tmp = f->primero;
+ my_y = y-1;
+ while (tmp) {
+ ++my_y;
+ wmove(f->win, my_y, x);
+ salida = form_input(f->win, x, my_y, tmp);
+ tmp = tmp->sig;
+ }
+ mvwaddstr(f->win, 0, 0, "SALI");
+}
+
+char *form_obtener_valor(t_Form *f, const char *widget)
+{
+ /* Busco el widget */
+ t_Widget *tmp = f->primero;
+ while (tmp) {
+ if (strcmp(widget, tmp->nombre) == 0) {
+ return tmp->valor;
+ }
+ tmp = tmp->sig;
+ }
+ /* No hay nada. TODO : Retornar NULL? */
+ return "";
+}
+
+
+t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max)
+{
+ t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
+
+ tmp->tipo = tipo;
+ tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
+ strcpy(tmp->nombre, nombre);
+
+ tmp->max = max;
+ tmp->valor = (char *)malloc(sizeof(char)*(max+1));
+ tmp->valor[0] = '\0';
+
+ tmp->sig = NULL;
+
+ return tmp;
+}
+
+void widget_free(t_Widget *w)
+{
+ free(w->nombre);
+ free(w->valor);
+ free(w);
+}
+
+int form_input(WINDOW *win, int x, int y, t_Widget *w)
+{
+ char *tmp = w->valor;
+ int current = 0, c;
+ mvwaddstr(win, y, x, w->valor);
+
+ while ((*tmp) != '\0') {
+ tmp++;
+ current++;
+ }
+
+ while ((c=getch()) != 13) {
+ /* Verifico si se apreto basckspace */
+ if (c == KEY_BACKSPACE) {
+ if (current > 0) {
+ w->valor[current--] = '\0';
+ }
+ wmove(win, y, x+current);
+ waddch(win, ' ');
+ /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
+ wmove(win, y, x+current);
+ continue;
+ }
+ /* Si no entra mas, ignoro toda entrada */
+ if (current >= w->max) continue;
+
+ wmove(win, y, x+current);
+ waddch(win, c);
+ w->valor[current++] = c;
+ }
+ /* Cierro el string con el \0 */
+ w->valor[current+1] = '\0';
+
+ /* Retorno la tecla con la que se salio. */
+ /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */
+ return c;
+}