void cases_menu(const char *curr_path) { const char *screen_title = "Cases"; const size_t n_fields = 7; const size_t starty = 4; const size_t startx = 25; FIELD *field[n_fields]; FORM *my_form; int width[] = { MAX_CANUM, MAX_CINUM, MAX_PHYADD, MAX_POSADD, MAX_STATUS, MAX_DELDATE }; initscr(); curs_set(1); cbreak(); clear(); noecho(); keypad(stdscr, TRUE); for (size_t i = 0; i < n_fields - 1; ++i) { field[i] = new_field(1, width[i], starty + i * 2, startx, 0, 0); } field[n_fields - 1] = NULL; set_field_back(field[0], A_UNDERLINE); field_opts_off(field[0], O_AUTOSKIP); field_opts_on(field[0], O_BLANK); set_field_back(field[1], A_UNDERLINE); field_opts_off(field[1], O_AUTOSKIP); set_field_back(field[2], A_UNDERLINE); field_opts_off(field[2], O_AUTOSKIP); set_field_back(field[3], A_UNDERLINE); field_opts_off(field[3], O_AUTOSKIP); set_field_back(field[4], A_UNDERLINE); field_opts_off(field[4], O_AUTOSKIP); set_field_back(field[5], A_UNDERLINE); field_opts_off(field[5], O_AUTOSKIP); my_form = new_form(field); post_form(my_form); refresh(); mvprintw(0, 0, menu_path(curr_path, screen_title)); mvprintw(4, 10, "Case Num: "); mvprintw(6, 10, "Civil Num: "); mvprintw(8, 10, "Physical Add: "); mvprintw(10, 10, "Postal Add: "); mvprintw(12, 10, "Status: "); mvprintw(14, 10, "Delivery Date: "); mvprintw(16, 10, "(F1) = Options | (F2) = Update | (F3) = Delete | (F4) = Exit"); move(4, 25); refresh(); int ch; do { ch = getch(); switch(ch) { case KEY_UP: form_driver(my_form, REQ_PREV_FIELD); form_driver(my_form, REQ_END_LINE); break; case KEY_LEFT: form_driver(my_form, REQ_LEFT_CHAR); break; case KEY_RIGHT: form_driver(my_form, REQ_RIGHT_CHAR); break; case ENTER: form_driver( my_form, REQ_NEXT_FIELD ); form_driver( my_form, REQ_END_LINE ); if (field_status(field[0])) { size_t count = 0; char case_num[MAX_CANUM]; clear_line( 20, 10 ); strcpy( case_num, compress_str(field_buffer(field[0], 0) ) ); if ( query_select_count_from_case_for(case_num, &count) ) { mvprintw( 20, 10, db_get_error_msg() ); move( 4, 25 ); } else { if ( count ) { //call routine to fill in fields Case_t record; if ( query_select_all_from_case_for(case_num, &record) ) { mvprintw( 20, 10, db_get_error_msg() ); move( 4, 25 ); } else { char status_buff[4]; set_field_buffer( field[1], 0, record.civil ); set_field_buffer( field[2], 0, record.physical_add ); set_field_buffer( field[3], 0, record.postal_add ); snprintf( status_buff, 4, "%d", record.status ); set_field_buffer( field[4], 0, status_buff ); set_field_buffer( field[5], 0, record.delivery_date ); } } else { clear_fields( field, 1, 5 ); mvprintw( 20, 10, "[!] Case %s does not exist.", case_num ); move( 6, 25 ); set_current_field( my_form, field[0] ); } } set_field_status( field[0], 0 ); } break; case KEY_BACKSPACE: form_driver(my_form, REQ_PREV_CHAR); form_driver(my_form, REQ_DEL_CHAR); break; case ESC: { FIELD * curr_field = current_field( my_form ); int row, col; get_cursor_pos( curr_field, &row, &col ); clear_lines( 20, 40 ); move( row, col ); set_current_field( my_form, curr_field ); } break; case KEY_F(1): if ( current_field( my_form ) == field[4] ) { clear_lines( 20, 30 ); if ( query_select_all_codes_from_case_status() ) { mvprintw( 20, 10, db_get_error_msg() ); } else { const Code_t const * code_ptr; size_t count = 0; mvprintw( 20, 5, "Status Options:" ); while ( ( code_ptr = get_code_from_result() ) != NULL ) { mvprintw( 21 + count, 10, "[%d] %s", code_ptr->code, code_ptr->desc ); count++; } free_code_result(); move( 12, 25 ); set_current_field( my_form, field[4] ); } } break; case KEY_F(2): { size_t count = 0; char case_num[MAX_CANUM]; clear_lines( 20, 30 ); strncpy( case_num, compress_str(field_buffer(field[0], 0) ), MAX_CANUM ); if ( query_select_count_from_case_for( case_num, &count ) ) { mvprintw( 20, 10, db_get_error_msg() ); } else { Case_t record; strncpy( record.number, compress_str(field_buffer(field[0], 0)), MAX_CANUM ); strncpy( record.civil, compress_str(field_buffer(field[1], 0)), MAX_CINUM ); strncpy( record.physical_add, field_buffer(field[2], 0), MAX_PHYADD ); strncpy( record.postal_add, field_buffer(field[3], 0), MAX_POSADD ); record.status = atoi( compress_str(field_buffer(field[4], 0)) ); strncpy( record.delivery_date, compress_str(field_buffer(field[5], 0)), MAX_DELDATE ); if ( count ) { // update existing record if ( query_update_case( &record ) == 0 ) { mvprintw( 20, 10, "[!] Case has been updated." ); } else { mvprintw( 20, 10, db_get_error_msg() ); } } else { // create new record if ( query_create_new_case( &record ) == 0 ) { mvprintw (20, 10, "[!] Case has been created successfully." ); } else { mvprintw( 20, 10, db_get_error_msg() ); } } } move(4, 25); set_current_field( my_form, field[0] ); } break; case KEY_F(3): { size_t count = 0; char case_num[MAX_CANUM]; clear_lines(20, 30); strncpy(case_num, compress_str(field_buffer(field[0], 0) ), MAX_CANUM); if ( strlen(case_num) ) { if ( query_select_count_from_case_for(case_num, &count) ) { mvprintw( 20, 10, db_get_error_msg() ); } else { if (count) { mvprintw(20, 10, "[?] Delete case '%s' ? [Y/n]", case_num); int ch = toupper(getch()); if (ch == 'Y') { if ( query_delete_case(case_num) ) { mvprintw( 20, 10, db_get_error_msg() ); } else { clear_fields(field, 0, 5); mvprintw(20, 10, "[!] Case '%s' has been deleted."); } } } else { mvprintw(20, 10, "[!] Case '%s' does not exist.", case_num); } } } else { mvprintw(20, 10, "[!] Must enter a valid Case Number to be deleted."); } } move(4, 25); set_current_field(my_form, field[0]); break; case DEL: form_driver(my_form, REQ_DEL_CHAR); break; default: { FIELD * curr_fld = current_field( my_form ); if ( ch == '\'' ) break; if ( curr_fld == field[4] ) { if ( !isdigit( ch ) ) break; } } form_driver(my_form, ch); break; } } while( ch != KEY_F(4) ); unpost_form(my_form); free_form(my_form); for (size_t i = 0; i < n_fields -1; ++i) { free_field(field[i]); } endwin(); return; }
void viewNewPlayer(FootBallGame::TeamNumber teamNumber) { const char *itemName; const ITEM *currentItem; const int window_nlines = 10, window_ncols = 90; char *choices[] = { "Add", "Cancel", }; for (;;) { // Create new window. WINDOW *window = newwin(window_nlines, window_ncols, headerWindow_begin_y + headerWindow_nlines + 1, 0); // Set new window options. keypad(window, TRUE); // Create the form fields FIELD *field[6]; for (unsigned i = 0; i < ARRAY_SIZE(field)-1; i++) field[i] = new_field(1, 26, i+2, 23, 0, 0); field[ARRAY_SIZE(field)-1] = NULL; // Set feild options for (unsigned i = 0; i < ARRAY_SIZE(field)-1; i++) { set_field_back(field[i], A_UNDERLINE); field_opts_off(field[i], O_AUTOSKIP); } // Set the field types set_field_type(field[0], TYPE_REGEXP, "^[A-Za-z ]*$"); set_field_type(field[1], TYPE_INTEGER, 0, 1, 999); set_field_type(field[2], TYPE_REGEXP, "^[A-Za-z ]*$"); set_field_type(field[3], TYPE_NUMERIC, 2, 1.00, 1500.00); set_field_type(field[4], TYPE_NUMERIC, 2, 1.00, 300.00); // Create the form FORM *form = new_form(field); set_form_win(form, window); set_form_sub(form, derwin(window, 10, 90, 0, 0)); // Setup the menu items int nChoices = ARRAY_SIZE(choices)+1; ITEM **items = new ITEM* [nChoices]; for (int i = 0; i < nChoices-1; i++) items[i] = new_item(choices[i], NULL); items[nChoices-1] = NULL; // Create the menu MENU *menu = new_menu(items); // Menu options set_menu_format(menu, 1, 2); set_menu_mark(menu, NULL); // Attach the menu to the window set_menu_win(menu, window); set_menu_sub(menu, derwin(window, 1, 20, 8, 17)); // Make window and menu visible; post_form(form); post_menu(menu); mvwprintw(window, 0, 10, "Player Properties: "); mvwprintw(window, 2, 10, "Name: "); mvwprintw(window, 3, 10, "Number: "); mvwprintw(window, 4, 10, "Position: "); mvwprintw(window, 5, 10, "weight (kg): "); mvwprintw(window, 6, 10, "height (cm): "); wrefresh(window); refresh(); // Start user interaction loop. int c; // The restart variable is used to tell the function to rebuild the // menu by starting at the top of the for(;;) loop above. bool restart = false; while (!restart && (c = wgetch(window))) { mvprintw(LINES-1, 0, " "); refresh(); switch(c) { case KEY_DOWN: case 0x09: // Go to next field form_driver(form, REQ_NEXT_FIELD); // GO to the end of the presend buffer // Leaves nicely at the last character form_driver(form, REQ_END_LINE); break; case KEY_UP: // Go to previous field form_driver(form, REQ_PREV_FIELD); form_driver(form, REQ_END_LINE); break; case 0x7F: form_driver(form, REQ_DEL_PREV); break; case KEY_LEFT: menu_driver(menu, REQ_LEFT_ITEM); break; case KEY_RIGHT: menu_driver(menu, REQ_RIGHT_ITEM); break; case 10: // When the user hits enter determine the currently selected // item and do nessary actions. currentItem = current_item(menu); itemName = item_name(currentItem); // Cancel if (strncmp(itemName, choices[1], strlen(choices[1])) == 0) { // Delete allocated data unpost_form(form); unpost_menu(menu); free_form(form); free_menu(menu); for (unsigned i = 0; i < ARRAY_SIZE(field)-1; i++) free_field(field[i]); for (int i = 0; i < nChoices; i++) free_item(items[i]); delete [] items; delwin(window); return; } else if (strncmp(itemName, choices[0], strlen(choices[0])) == 0) { form_driver(form, REQ_VALIDATION); bool invalid = false; for (unsigned i = 0; i < ARRAY_SIZE(field)-1; i++) if (field_status(field[i])==false) invalid = true;; if (invalid == false) { FootBallPlayer *player = new FootBallPlayer; player->setName(field_buffer(field[0], 0)); player->setNumber(atoi(field_buffer(field[1], 0))); player->setPosition(field_buffer(field[2], 0)); player->setWeight(strtof(field_buffer(field[3], 0), NULL)); player->setHeight(strtof(field_buffer(field[4], 0), NULL)); FootBallTeam *team = game.getFootBallTeam(teamNumber); if (team == NULL) { team = new FootBallTeam; game.setFootBallTeam(teamNumber, team); } team->addFootBallPlayer(player); // Delete allocated data unpost_form(form); unpost_menu(menu); free_form(form); free_menu(menu); for (unsigned i = 0; i < ARRAY_SIZE(field)-1; i++) free_field(field[i]); for (int i = 0; i < nChoices; i++) free_item(items[i]); delete [] items; delwin(window); return; } else { mvprintw(LINES-1, 0, "Fill out the form correctly!!"); refresh(); } } break; default: // If this is a normal character, it gets // printed form_driver(form, c); break; } } } }
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); }