#!/usr/bin/ruby # Copyright (c) 2004 by Simon Kaczor # Simple example of a form in action, based on the NCURSES Programming HOWTO: # http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ # # All standard field types are created in the form. # Additionnally a custom field is created to illustrate # custom field validation using Ruby Proc objects, as shown in the example. # # The original example contained the following copyright: # Copyright (c) 2001 by Pradeep Padala. This document may be distributed # under the terms set forth in the LDP license at linuxdoc.org/COPYRIGHT.html. require 'ncursesw' include Ncurses include Ncurses::Form def print_in_middle(win, starty, startx, width, string, color) if(win == nil) win = stdscr; end x = Array.new y = Array.new Ncurses.getyx(win, y, x); if(startx != 0) x[0] = startx; end if(starty != 0) y[0] = starty; end if(width == 0) width = 80; end length = string.length; temp = (width - length)/ 2; x[0] = startx + temp.floor; win.attron(color); win.mvprintw(y[0], x[0], "%s", string); win.attroff(color); Ncurses.refresh(); end fields = Array.new states = {"MI" => "Michigan", "VA" => "Virginia", "VE" => "Vermont"} fieldcheck = proc { |afield| val = afield.field_buffer(0) val.strip! if (states[val] != nil) afield.set_field_buffer(0,states[val]) return true else return false end } charcheck = proc { |ch| if (('A'..'Z').include?(ch)) return true else return false end } # Initialize curses begin stdscr = Ncurses.initscr(); Ncurses.start_color(); Ncurses.cbreak(); Ncurses.noecho(); Ncurses.keypad(stdscr, true); # Initialize few color pairs Ncurses.init_pair(1, COLOR_RED, COLOR_BLACK); Ncurses.init_pair(2, COLOR_BLACK, COLOR_WHITE); Ncurses.init_pair(3, COLOR_BLACK, COLOR_BLUE); stdscr.bkgd(Ncurses.COLOR_PAIR(2)); # Initialize the fields (1..9).each { |i| field = FIELD.new(1, 10, i*2, 1, 0, 0) field.set_field_back(A_UNDERLINE) fields.push(field) } customtype = FIELDTYPE.new(fieldcheck, charcheck); fields[1].set_field_type(TYPE_ALNUM, 0); fields[2].set_field_type(TYPE_ALPHA, 0); fields[3].set_field_type(TYPE_INTEGER, 0, 0, 1000); fields[4].set_field_type(TYPE_NUMERIC, 2, 0, 1000); fields[5].set_field_type(TYPE_ENUM, ["one","two","three"], false, false); fields[6].set_field_type(TYPE_REGEXP, "^ *[0-9]* *$"); fields[7].set_field_type(TYPE_IPV4); fields[8].set_field_type(customtype); # Create the form and post it my_form = FORM.new(fields); my_form.user_object = "My identifier" # Calculate the area required for the form rows = Array.new() cols = Array.new() my_form.scale_form(rows, cols); # Create the window to be associated with the form my_form_win = WINDOW.new(rows[0] + 3, cols[0] + 14, 1, 1); my_form_win.bkgd(Ncurses.COLOR_PAIR(3)); my_form_win.keypad(TRUE); # Set main window and sub window my_form.set_form_win(my_form_win); my_form.set_form_sub(my_form_win.derwin(rows[0], cols[0], 2, 12)); # Print a border around the main window and print a title */ my_form_win.box(0, 0); print_in_middle(my_form_win, 1, 0, cols[0] + 14, "My Form", Ncurses.COLOR_PAIR(1)); my_form.post_form(); # Print field types my_form_win.mvaddstr(4, 2, "No Type") my_form_win.mvaddstr(6, 2, "Alphanum") my_form_win.mvaddstr(8, 2, "Alpha") my_form_win.mvaddstr(10, 2, "Integer") my_form_win.mvaddstr(12, 2, "Numeric") my_form_win.mvaddstr(14, 2, "Enum") my_form_win.mvaddstr(16, 2, "Regexp") my_form_win.mvaddstr(18, 2, "IP") my_form_win.mvaddstr(20, 2, "Custom") my_form_win.wrefresh(); stdscr.mvprintw(Ncurses.LINES - 2, 28, "Use UP, DOWN arrow keys to switch between fields"); stdscr.mvprintw(Ncurses.LINES - 1, 28, "Press F1 to quit"); stdscr.refresh(); # Loop through to get user requests while((ch = my_form_win.getch()) != KEY_F1) case ch when KEY_DOWN # Go to next field */ my_form.form_driver(REQ_VALIDATION); my_form.form_driver(REQ_NEXT_FIELD); # Go to the end of the present buffer # Leaves nicely at the last character my_form.form_driver(REQ_END_LINE); when KEY_UP # Go to previous field my_form.form_driver(REQ_VALIDATION); my_form.form_driver(REQ_PREV_FIELD); my_form.form_driver(REQ_END_LINE); when KEY_LEFT # Go to previous field my_form.form_driver(REQ_PREV_CHAR); when KEY_RIGHT # Go to previous field my_form.form_driver(REQ_NEXT_CHAR); when KEY_BACKSPACE my_form.form_driver(REQ_DEL_PREV); else # If this is a normal character, it gets Printed my_form.form_driver(ch); end end # Un post form and free the memory my_form.unpost_form(); my_form.free_form(); fields.each {|f| f.free_field()} ensure Ncurses.endwin(); end