Skip to content
rkumar edited this page Sep 13, 2010 · 1 revision

This page can be outdated. Check github for latest.


$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
require 'rubygems'
require 'ncurses'
require 'logger'
require 'lib/ver/ncurses'
require 'lib/ver/window'
require 'lib/rbcurse/rwidget'
require 'lib/rbcurse/rform'
require 'lib/rbcurse/rcombo'
if $0 == __FILE__
  include RubyCurses

  begin
  # Initialize curses
    VER::start_ncurses  # this is initializing colors via ColorMap.setup
    $log = Logger.new("view.log")
    $log.level = Logger::DEBUG

    @window = VER::Window.root_window


    catch(:close) do

      @form = Form.new @window
      r = 1; c = 22;
      mnemonics = %w[ n l r p]
      %w[ name line regex password].each_with_index do |w,i|
        field = Field.new @form do
          name   w 
          row  r 
          col  c 
          display_length  30
          set_buffer "abcd " 
          set_label Label.new @form, {'text' => w, 'mnemonic'=> mnemonics[i]}
        end
        r += 1
      end
      $results = Variable.new
      $results.value = "A variable"
      var = RubyCurses::Label.new @form, {'text_variable' => $results, "row" => r, "col" => 22}
        r += 1
        mylist = []
        0.upto(100) { |v| mylist << "#{v} scrollable data" }
        $listdata = Variable.new mylist
        listb = Listbox.new @form do
          name   "mylist" 
          row  r 
          col  1 
          width 40
          height 10
#         list mylist
          list_variable $listdata
          title "A long list"
          title_attrib 'reverse'
        end
        #listb.insert 55, "hello ruby", "so long python", "farewell java", "RIP .Net"
        $listdata.value.insert 55, "hello ruby", "so long python", "farewell java", "RIP .Net"
        texta = TextArea.new @form do
          name   "mytext" 
          row  1 
          col  52 
          width 40
          height 15
          title "Editable box"
          title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
        end
        texta << "I expect to pass through this world but once." << "Any good therefore that I can do, or any kindness or abilities that I can show to any fellow creature, let me do it now. "
        texta << "Let me not defer it or neglect it, for I shall not pass this way again."
        #texta << "hello there" << "we are testing deletes in this application"
        #texta << "HELLO there" << "WE ARE testing deletes in this application"
        texta << " "
        texta << " F1 to exit. or click second button"

        @textview = TextView.new @form do
          name   "myView" 
          row  16 
          col  52 
          width 40
          height 7
          title "README.txt"
          title_attrib 'bold'
        end
        content = File.open("README.txt","r").readlines
        @textview.set_content content
        @textview.top_row 21

        # just for demo, lets scroll the text view as we scroll this.
        listb.bind(:ENTER_ROW, @textview) { |arow, tview| tview.top_row arow }

        # just for demo, lets scroll the text view to the line you enter
        @form.by_name["line"].bind(:LEAVE, @textview) { |fld, tv| raise(FieldValidationException, "#{fld.getvalue.to_i} Outside range 1,200") if fld.getvalue.to_i >200; tv.top_row(fld.getvalue.to_i) }
        @form.by_name["regex"].bind(:LEAVE, @textview) { |fld, tv| tv.top_row(tv.find_first_match(fld.getvalue)) }

      checkbutton = CheckBox.new @form do
        text_variable $results
        #value = true
        onvalue "Selected cb   "
        offvalue "UNselected cb"
        text "A checkbox BOLD ME"
        row 17
        col 22
        underline 11 
      end

      togglebutton = ToggleButton.new @form do
        value  true
        onvalue  "Toggle Down  "
        offvalue "Toggle Up    "
        row 18
        col 22
        underline 0
      end

      combo = ComboBox.new @form do
        name "combo"
        row 19
        col 22
        display_length 10
        editable false
        list %w[scotty tiger secret pass torvalds qwerty quail toiletry]
        set_label Label.new @form, {'text' => "Combo"}
        list_config 'color' => 'yellow', 'bgcolor'=>'red', 'max_visible_items' => 6
      end

      combo1 = ComboBox.new @form do
        name "combo1"
        row 20
        col 22
        display_length 10
        editable true
        list %w[scotty tiger secret pass torvalds qwerty quail toiletry]
        set_label Label.new @form, {'text' => "Edit Combo"}
        list_config 'color' => 'white', 'bgcolor'=>'blue', 'max_visible_items' => 5
      end

      @form.by_name["line"].display_length = 3
      @form.by_name["line"].maxlen = 3
      @form.by_name["line"].set_buffer  "24"
      @form.by_name["name"].set_buffer  "Not focusable"
      @form.by_name["name"].set_focusable(false)
      @form.by_name["line"].chars_allowed = /\d/
      #@form.by_name["regex"].type(:ALPHA)
      @form.by_name["regex"].valid_regex(/^[A-Z][a-z]*/)
      @form.by_name["regex"].set_buffer  "SYNOP"
      @form.by_name["regex"].display_length = 10
      @form.by_name["regex"].maxlen = 20
      @form.by_name["regex"].bgcolor 'cyan'
      @form.by_name["password"].set_buffer ""
      @form.by_name["password"].show '*'
      @form.by_name["password"].color 'red'
      @form.by_name["password"].bgcolor 'blue'
      @form.by_name["password"].values(%w[scotty tiger secret pass qwerty])
      @form.bind(:ENTER) { |f|   f.label.bgcolor = $promptcolor if f.instance_of? RubyCurses::Field}
      @form.bind(:LEAVE) { |f|  f.label.bgcolor = $datacolor  if f.instance_of? RubyCurses::Field}

      colorlabel = Label.new @form, {'text' => "Select a color:", "row" => 21, "col" => 22, "color"=>"cyan", "mnemonic" => 'S'}
      $radio = Variable.new
      $radio.update_command(colorlabel) {|tv, label|  label.color tv.value}
      $results.update_command(colorlabel,checkbutton) {|tv, label, cb| attrs =  cb.value ? 'bold' : nil; label.attrs(attrs)}
      radio1 = RadioButton.new @form do
        text_variable $radio
        text "red"
        value "red"
        color "red"
        row 22
        col 22
      end
      radio2 = RadioButton.new @form do
        text_variable $radio
        text  "green"
        value  "green"
        color "green"
        row 23
        col 22
        underline 0  
      end

      colorlabel.label_for radio1

      @mb = RubyCurses::MenuBar.new
      filemenu = RubyCurses::Menu.new "File"
      filemenu.add(item = RubyCurses::MenuItem.new("Open",'O'))
      item.command(@form) {|it, form|  form.printstr(@window, 23,45, "Open CALLED"); }

      filemenu.insert_separator 1
      filemenu.add(RubyCurses::MenuItem.new "New",'N')
      filemenu.add(RubyCurses::MenuItem.new "Save",'S')
      filemenu.add(item = RubyCurses::MenuItem.new("Exit",'X'))
      item.command() {throw(:close)}
      item = RubyCurses::CheckBoxMenuItem.new "CheckMe"
#     item.onvalue="On"
#     item.offvalue="Off"
     #item.checkbox.text "Labelcb"
     #item.text="Labelcb"
      # in next line, an explicit repaint is required since label is on another form.
      item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' : nil; label.attrs(att); label.repaint}

      ok_button = Button.new @form do
        text "OK"
        name "OK"
        row 25
        col 22
        underline 0
      end
      ok_button.command { |form| form.dump_data;form.window.printstring(25,45, "Dumped data to log",1) 
        $listdata.value.insert 0, "hello ruby", "so long python", "farewell java", "RIP .Net"
      }

      cancel_button = Button.new @form do
        #text_variable $results
        text "Cancel"
        row 25
        col 28
        underline 1
        surround_chars ['{','}']
      end
      cancel_button.command { |form| form.window.printstring(23,45, "Cancel CALLED",1); throw(:close); }
      filemenu.add(item)
      @mb.add(filemenu)
      editmenu = RubyCurses::Menu.new "Edit"
      item = RubyCurses::MenuItem.new "Cut"
      editmenu.add(item)
      item.accelerator = "Ctrl-X"
      item=RubyCurses::MenuItem.new "Copy"
      editmenu.add(item)
      item.accelerator = "Ctrl-C"
      item=RubyCurses::MenuItem.new "Paste"
      editmenu.add(item)
      item.accelerator = "Ctrl-V"
      @mb.add(editmenu)
      @mb.add(menu=RubyCurses::Menu.new("Others"))
      #item=RubyCurses::MenuItem.new "Save","S"
      item = RubyCurses::MenuItem.new "Options"
      menu.add(item)
      item = RubyCurses::MenuItem.new "Config"
      menu.add(item)
      item = RubyCurses::MenuItem.new "Tables"
      menu.add(item)
      savemenu = RubyCurses::Menu.new "EditM"
      item = RubyCurses::MenuItem.new "CutM"
      savemenu.add(item)
      item = RubyCurses::MenuItem.new "DeleteM"
      savemenu.add(item)
      item = RubyCurses::MenuItem.new "PasteM"
      savemenu.add(item)
      menu.add(savemenu)
      # 2008-12-20 13:06 no longer hardcoding toggle key of menu_bar.
      @mb.toggle_key = KEY_F2
      @form.set_menu_bar  @mb
      # END
      @form.repaint
      @window.wrefresh
      Ncurses::Panel.update_panels
      while((ch = @window.getchar()) != KEY_F1 )
        @form.handle_key(ch)
        #@form.repaint
        @window.wrefresh
      end
    end
  rescue => ex
  ensure
      @window.destroy if [email protected]?
    VER::stop_ncurses
    p ex if ex
    p(ex.backtrace.join("\n")) if ex
    $log.debug( ex) if ex
    $log.debug(ex.backtrace.join("\n")) if ex
  end
end

Clone this wiki locally