static int offset_in_field(FORM * form) { FIELD *field = current_field(form); int currow, curcol; form_getyx(form, currow, curcol); return curcol + currow * field->dcols; }
int edit_field(FORM * form, int *result) { int ch = wgetch(form_win(form)); int status; FIELD *before; unsigned n; char lengths[80]; int length; char *buffer; int before_row; int before_col; int before_off = offset_in_field(form); form_getyx(form, before_row, before_col); before = current_field(form); set_field_back(before, A_NORMAL); if (ch <= KEY_MAX) { set_field_back(before, A_REVERSE); } else if (ch <= MAX_FORM_COMMAND) { inactive_field(before); } *result = ch; for (n = 0; n < SIZEOF(commands); ++n) { if (commands[n].code == ch) { *result = commands[n].result; break; } } status = form_driver(form, *result); if (status == E_OK) { bool modified = TRUE; length = 0; if ((buffer = field_buffer(before, 1)) != 0) length = atoi(buffer); if (length < before_off) length = before_off; switch (*result) { case REQ_CLR_EOF: length = before_off; break; case REQ_CLR_EOL: if (before_row + 1 == before->rows) length = before_off; break; case REQ_CLR_FIELD: length = 0; break; case REQ_DEL_CHAR: if (length > before_off) --length; break; case REQ_DEL_PREV: if (length > 0) { if (before_col > 0) { --length; } else if (before_row > 0) { length -= before->cols + before_col; } } break; case REQ_NEW_LINE: length += before->cols; break; #if 0 /* FIXME: finish these */ case REQ_DEL_LINE: /* delete line */ case REQ_DEL_WORD: /* delete word at cursor */ case REQ_INS_CHAR: /* insert blank char at cursor */ case REQ_INS_LINE: /* insert blank line at cursor */ case REQ_INS_MODE: /* begin insert mode */ case REQ_OVL_MODE: /* begin overlay mode */ #endif /* ignore all of the motion commands */ case REQ_SCR_BCHAR: /* FALLTHRU */ case REQ_SCR_BHPAGE: /* FALLTHRU */ case REQ_SCR_BLINE: /* FALLTHRU */ case REQ_SCR_BPAGE: /* FALLTHRU */ case REQ_SCR_FCHAR: /* FALLTHRU */ case REQ_SCR_FHPAGE: /* FALLTHRU */ case REQ_SCR_FLINE: /* FALLTHRU */ case REQ_SCR_FPAGE: /* FALLTHRU */ case REQ_SCR_HBHALF: /* FALLTHRU */ case REQ_SCR_HBLINE: /* FALLTHRU */ case REQ_SCR_HFHALF: /* FALLTHRU */ case REQ_SCR_HFLINE: /* FALLTHRU */ case REQ_BEG_FIELD: /* FALLTHRU */ case REQ_BEG_LINE: /* FALLTHRU */ case REQ_DOWN_CHAR: /* FALLTHRU */ case REQ_DOWN_FIELD: /* FALLTHRU */ case REQ_END_FIELD: /* FALLTHRU */ case REQ_END_LINE: /* FALLTHRU */ case REQ_FIRST_FIELD: /* FALLTHRU */ case REQ_FIRST_PAGE: /* FALLTHRU */ case REQ_LAST_FIELD: /* FALLTHRU */ case REQ_LAST_PAGE: /* FALLTHRU */ case REQ_LEFT_CHAR: /* FALLTHRU */ case REQ_LEFT_FIELD: /* FALLTHRU */ case REQ_NEXT_CHAR: /* FALLTHRU */ case REQ_NEXT_CHOICE: /* FALLTHRU */ case REQ_NEXT_FIELD: /* FALLTHRU */ case REQ_NEXT_LINE: /* FALLTHRU */ case REQ_NEXT_PAGE: /* FALLTHRU */ case REQ_NEXT_WORD: /* FALLTHRU */ case REQ_PREV_CHAR: /* FALLTHRU */ case REQ_PREV_CHOICE: /* FALLTHRU */ case REQ_PREV_FIELD: /* FALLTHRU */ case REQ_PREV_LINE: /* FALLTHRU */ case REQ_PREV_PAGE: /* FALLTHRU */ case REQ_PREV_WORD: /* FALLTHRU */ case REQ_RIGHT_CHAR: /* FALLTHRU */ case REQ_RIGHT_FIELD: /* FALLTHRU */ case REQ_SFIRST_FIELD: /* FALLTHRU */ case REQ_SLAST_FIELD: /* FALLTHRU */ case REQ_SNEXT_FIELD: /* FALLTHRU */ case REQ_SPREV_FIELD: /* FALLTHRU */ case REQ_UP_CHAR: /* FALLTHRU */ case REQ_UP_FIELD: /* FALLTHRU */ case REQ_VALIDATION: /* FALLTHRU */ modified = FALSE; break; default: modified = FALSE; if (ch >= MIN_FORM_COMMAND) { beep(); } else if (isprint(ch)) { modified = TRUE; } break; } /* * If we do not force a re-validation, then field_buffer 0 will * be lagging by one character. */ if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result < MIN_FORM_COMMAND) ++length; sprintf(lengths, "%d", length); set_field_buffer(before, 1, lengths); } if (current_field(form) != before) inactive_field(before); return status; }
static void show_current_field(WINDOW *win, FORM * form) { FIELD *field; FIELDTYPE *type; char *buffer; int nbuf; int field_rows, field_cols, field_max; int currow, curcol; if (has_colors()) { wbkgd(win, (chtype) COLOR_PAIR(1)); } werase(win); form_getyx(form, currow, curcol); wprintw(win, "Cursor: %d,%d", currow, curcol); if (data_ahead(form)) waddstr(win, " ahead"); if (data_behind(form)) waddstr(win, " behind"); waddch(win, '\n'); if ((field = current_field(form)) != 0) { wprintw(win, "Page %d%s, Field %d/%d%s:", form_page(form), new_page(field) ? "*" : "", field_index(field), field_count(form), field_arg(field) ? "(arg)" : ""); if ((type = field_type(field)) != 0) { if (type == TYPE_ALNUM) waddstr(win, "ALNUM"); else if (type == TYPE_ALPHA) waddstr(win, "ALPHA"); else if (type == TYPE_ENUM) waddstr(win, "ENUM"); else if (type == TYPE_INTEGER) waddstr(win, "INTEGER"); #ifdef NCURSES_VERSION else if (type == TYPE_IPV4) waddstr(win, "IPV4"); #endif else if (type == TYPE_NUMERIC) waddstr(win, "NUMERIC"); else if (type == TYPE_REGEXP) waddstr(win, "REGEXP"); else waddstr(win, "other"); } if ((unsigned) field_opts(field) & O_EDIT) waddstr(win, " editable"); else waddstr(win, " readonly"); if (field_status(field)) waddstr(win, " modified"); if (dynamic_field_info(field, &field_rows, &field_cols, &field_max) != ERR) { wprintw(win, " size %dx%d (max %d)", field_rows, field_cols, field_max); } waddch(win, ' '); (void) wattrset(win, (int) field_fore(field)); waddstr(win, "fore"); wattroff(win, (int) field_fore(field)); waddch(win, '/'); (void) wattrset(win, (int) field_back(field)); waddstr(win, "back"); wattroff(win, (int) field_back(field)); wprintw(win, ", pad '%c'", field_pad(field)); waddstr(win, "\n"); for (nbuf = 0; nbuf <= 2; ++nbuf) { if ((buffer = field_buffer(field, nbuf)) != 0) { wprintw(win, "buffer %d:", nbuf); (void) wattrset(win, A_REVERSE); waddstr(win, buffer); wattroff(win, A_REVERSE); waddstr(win, "\n"); } } } wrefresh(win); }