rbcurse 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. data/Makefile +21 -0
  2. data/Manifest.txt +6 -0
  3. data/README.markdown +6 -4
  4. data/TODO +372 -0
  5. data/TODO2.txt +121 -0
  6. data/VERSION +1 -1
  7. data/examples/README.txt +67 -0
  8. data/examples/abasiclist.rb +33 -0
  9. data/examples/alpmenu.rb +42 -0
  10. data/examples/app.rb +859 -0
  11. data/examples/app.sample +17 -0
  12. data/examples/appdirtree.rb +74 -0
  13. data/examples/appemail.rb +191 -0
  14. data/examples/appemaillb.rb +308 -0
  15. data/examples/appgcompose.rb +315 -0
  16. data/examples/atree.rb +64 -0
  17. data/examples/common/file.rb +40 -0
  18. data/examples/common/rmail.rb +257 -0
  19. data/examples/data.txt +683 -0
  20. data/examples/data/README.markdown +9 -0
  21. data/examples/data/brew.txt +38 -0
  22. data/examples/data/color.2 +37 -0
  23. data/examples/data/gemlist.txt +60 -0
  24. data/examples/data/lotr.txt +12 -0
  25. data/examples/data/ports.txt +136 -0
  26. data/examples/data/tasks.txt +27 -0
  27. data/examples/data/todocsv.csv +28 -0
  28. data/examples/data/unix1.txt +21 -0
  29. data/examples/data/unix2.txt +11 -0
  30. data/examples/dbdemo.rb +495 -0
  31. data/examples/deprecated/appgmail.rb +952 -0
  32. data/examples/deprecated/splitp.rb +56 -0
  33. data/examples/deprecated/testscrolllb.rb +86 -0
  34. data/examples/deprecated/testscrollp.rb +88 -0
  35. data/examples/deprecated/testscrollta.rb +80 -0
  36. data/examples/deprecated/testscrolltable.rb +165 -0
  37. data/examples/deprecated/testsplit.rb +87 -0
  38. data/examples/deprecated/testsplit2.rb +123 -0
  39. data/examples/deprecated/testsplit3.rb +215 -0
  40. data/examples/deprecated/testsplit3_1.rb +244 -0
  41. data/examples/deprecated/testsplit3a.rb +215 -0
  42. data/examples/deprecated/testsplit3b.rb +237 -0
  43. data/examples/deprecated/testsplitta.rb +148 -0
  44. data/examples/deprecated/testsplittv.rb +142 -0
  45. data/examples/deprecated/testsplittvv.rb +144 -0
  46. data/examples/deprecated/testtpane.rb +215 -0
  47. data/examples/deprecated/testtpane2.rb +145 -0
  48. data/examples/deprecated/testtpanetable.rb +203 -0
  49. data/examples/dirtree.rb +88 -0
  50. data/examples/experimental/resultsetdemo.rb +280 -0
  51. data/examples/experimental/testmform.rb +35 -0
  52. data/examples/experimental/testscroller.rb +117 -0
  53. data/examples/experimental/teststackflow.rb +111 -0
  54. data/examples/menu1.rb +112 -0
  55. data/examples/multispl.rb +86 -0
  56. data/examples/newmessagebox.rb +131 -0
  57. data/examples/newtabbedwindow.rb +100 -0
  58. data/examples/newtesttabp.rb +121 -0
  59. data/examples/qdfilechooser.rb +68 -0
  60. data/examples/rfe.rb +1239 -0
  61. data/examples/rfe_renderer.rb +121 -0
  62. data/examples/sqlc.rb +454 -0
  63. data/examples/sqlm.rb +437 -0
  64. data/examples/sqlt.rb +408 -0
  65. data/examples/status.txt +68 -0
  66. data/examples/table1.rb +24 -0
  67. data/examples/term2.rb +84 -0
  68. data/examples/test1.rb +239 -0
  69. data/examples/test2.rb +674 -0
  70. data/examples/testapp.rb +44 -0
  71. data/examples/testapp2.rb +58 -0
  72. data/examples/testchars.rb +137 -0
  73. data/examples/testcombo.rb +91 -0
  74. data/examples/testkeypress.rb +66 -0
  75. data/examples/testlistbox.rb +113 -0
  76. data/examples/testmenu.rb +101 -0
  77. data/examples/testmulticomp.rb +70 -0
  78. data/examples/testmulticontainer.rb +94 -0
  79. data/examples/testmultispl.rb +199 -0
  80. data/examples/testree.rb +106 -0
  81. data/examples/testtable.rb +264 -0
  82. data/examples/testtabp.rb +107 -0
  83. data/examples/testtodo.rb +584 -0
  84. data/examples/testvimsplit.rb +112 -0
  85. data/examples/testwsshortcuts.rb +64 -0
  86. data/examples/testwsshortcuts2.rb +126 -0
  87. data/examples/todo.db +0 -0
  88. data/examples/todo.yml +191 -0
  89. data/examples/viewtodo.rb +574 -0
  90. data/lib/rbcurse/deprecated/README.markdown +12 -0
  91. data/lib/rbcurse/deprecated/rpad.rb +375 -0
  92. data/lib/rbcurse/deprecated/rscrollpane.rb +512 -0
  93. data/lib/rbcurse/deprecated/rsplitpane.rb +894 -0
  94. data/lib/rbcurse/deprecated/rsplitpane2.rb +1009 -0
  95. data/lib/rbcurse/deprecated/rviewport.rb +204 -0
  96. data/lib/rbcurse/deprecated/widgets/mapper.rb +130 -0
  97. data/lib/rbcurse/deprecated/widgets/rmessagebox.rb +348 -0
  98. data/lib/rbcurse/deprecated/widgets/rtabbedpane.rb +1158 -0
  99. data/lib/rbcurse/deprecated/widgets/rtabbedwindow.rb +167 -0
  100. data/lib/rbcurse/deprecated/widgets/scrollable.rb +301 -0
  101. data/lib/rbcurse/deprecated/widgets/stdscrwindow.rb +309 -0
  102. data/lib/ver/keyboard2.rb +170 -0
  103. data/test/test_rbcurse.rb +0 -0
  104. metadata +131 -9
@@ -0,0 +1,101 @@
1
+ require 'logger'
2
+ require 'rbcurse'
3
+ #require 'lib/rbcurse/rform'
4
+ require 'rbcurse/extras/widgets/rpopupmenu'
5
+ if $0 == __FILE__
6
+ include RubyCurses
7
+
8
+ begin
9
+ # Initialize curses
10
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
11
+ $log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
12
+ $log.level = Logger::DEBUG
13
+
14
+ @window = VER::Window.root_window
15
+ # Initialize few color pairs
16
+ # Create the window to be associated with the form
17
+ # Un post form and free the memory
18
+
19
+ catch(:close) do
20
+ colors = Ncurses.COLORS
21
+ $log.debug "START #{colors} colors #{$datacolor} ---------"
22
+ @form = Form.new @window
23
+ @form.window.printstring 0, 25, "Demo of Ruby Curses PopupMenu", $normalcolor, 'reverse'
24
+ r = 1; fc = 12;
25
+ row = 10; col = 10
26
+ colorlabel = Label.new @form, {'text' => "A label:", "row" => row, "col" => col, "color"=>"cyan", "mnemonic" => 'A'}
27
+
28
+ #@mb = RubyCurses::MenuBar.new
29
+ #filemenu = RubyCurses::Menu.new "File"
30
+ filemenu = RubyCurses::PopupMenu.new "File"
31
+ filemenu.add(item = RubyCurses::PMenuItem.new("Open",'O'))
32
+
33
+ filemenu.insert_separator 1
34
+ filemenu.add(RubyCurses::PMenuItem.new "New",'N')
35
+ filemenu.add(item = RubyCurses::PMenuItem.new("Save",'S'))
36
+ filemenu.add(item = RubyCurses::PMenuItem.new("Test",'T'))
37
+ filemenu.add(item = RubyCurses::PMenuItem.new("Wrap Text",'W'))
38
+ filemenu.add(item = RubyCurses::PMenuItem.new("Exit",'X'))
39
+ item.command() {
40
+ #throw(:menubarclose);
41
+ throw(:close)
42
+ }
43
+ item = RubyCurses::PCheckBoxMenuItem.new "Reverse"
44
+ #filemenu.create_window
45
+ # item.onvalue="On"
46
+ # item.offvalue="Off"
47
+ #item.checkbox.text "Labelcb"
48
+ #item.text="Labelcb"
49
+ # in next line, an explicit repaint is required since label is on another form.
50
+ #item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' : nil; label.attr(att); label.repaint}
51
+
52
+
53
+ filemenu.add(item)
54
+ #@mb.add(filemenu)
55
+ editmenu = RubyCurses::PMenu.new "Edit"
56
+ item = RubyCurses::PMenuItem.new "Cut"
57
+ editmenu.add(item)
58
+ item.accelerator = "Ctrl-X"
59
+ item=RubyCurses::PMenuItem.new "Copy"
60
+ editmenu.add(item)
61
+ item.accelerator = "Ctrl-C"
62
+ item=RubyCurses::PMenuItem.new "Paste"
63
+ editmenu.add(item)
64
+ item.accelerator = "Ctrl-V"
65
+ #@mb.add(editmenu)
66
+ #@mb.add(
67
+ menu=RubyCurses::PMenu.new("Others")
68
+ filemenu.add(menu)
69
+ #item=RubyCurses::PMenuItem.new "Save","S"
70
+ item = RubyCurses::PMenuItem.new "Config"
71
+ menu.add(item)
72
+ item = RubyCurses::PMenuItem.new "Tables"
73
+ menu.add(item)
74
+ savemenu = RubyCurses::PMenu.new "EditM"
75
+ item = RubyCurses::PMenuItem.new "CutM"
76
+ savemenu.add(item)
77
+ item = RubyCurses::PMenuItem.new "DeleteM"
78
+ savemenu.add(item)
79
+ item = RubyCurses::PMenuItem.new "PasteM"
80
+ savemenu.add(item)
81
+ menu.add(savemenu)
82
+ # 2008-12-20 13:06 no longer hardcoding toggle key of menu_bar.
83
+ #@mb.toggle_key = KEY_F2
84
+ #@form.set_menu_bar @mb
85
+ #@cell = CellRenderer.new "Hello", {"col" => 1, "row"=>29, "justify"=>:right, "display_length" => 30}
86
+ # END
87
+ @form.repaint
88
+ filemenu.show colorlabel, 0,1
89
+ @window.wrefresh
90
+ Ncurses::Panel.update_panels
91
+ end
92
+ rescue => ex
93
+ ensure
94
+ @window.destroy if !@window.nil?
95
+ VER::stop_ncurses
96
+ p ex if ex
97
+ p(ex.backtrace.join("\n")) if ex
98
+ $log.debug( ex) if ex
99
+ $log.debug(ex.backtrace.join("\n")) if ex
100
+ end
101
+ end
@@ -0,0 +1,70 @@
1
+ require 'logger'
2
+ require 'rbcurse'
3
+ require 'rbcurse/extras/widgets/rmulticontainer'
4
+ require 'rbcurse/core/widgets/rtextarea'
5
+ if $0 == __FILE__
6
+ include RubyCurses
7
+ include RubyCurses::Utils
8
+
9
+ begin
10
+ # Initialize curses
11
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
12
+ $log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
13
+ $log.level = Logger::DEBUG
14
+
15
+ @window = VER::Window.root_window
16
+
17
+ catch(:close) do
18
+ colors = Ncurses.COLORS
19
+ $log.debug "START #{colors} colors --------- testmulticomp"
20
+ @form = Form.new @window
21
+ @ctr = 1
22
+ r = 1; c = 30;
23
+
24
+ mc = MultiContainer.new @form do
25
+ name "multic"
26
+ row r
27
+ col c
28
+ width 60
29
+ height 15
30
+ title "Multiconty"
31
+ end
32
+ ctr = 1
33
+
34
+ @form.bind_key(?\M-a) do
35
+ $log.debug " Inside M-a MULTI "
36
+ texta = TextArea.new do
37
+ name "mytext#{ctr}"
38
+ title "Enter Something-#{ctr}"
39
+ title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
40
+ end
41
+ mc.add texta, "Enter Something #{ctr}"
42
+ texta << "Hello World"
43
+ texta << "Hello World"
44
+ ctr += 1
45
+ end
46
+ @help = "F10 to quit. M-a to open new component. M-: for menu #{$0} "
47
+ RubyCurses::Label.new @form, {'text' => @help, "row" => 21, "col" => 2, "color" => "yellow"}
48
+
49
+ @form.repaint
50
+ @window.wrefresh
51
+ Ncurses::Panel.update_panels
52
+ while((ch = @window.getchar()) != KEY_F10 )
53
+ break if ch == ?\C-q.getbyte(0)
54
+ str = keycode_tos ch
55
+ $log.debug "#{ch} got (#{str})"
56
+ @form.handle_key ch
57
+ @form.repaint
58
+ @window.wrefresh
59
+ end
60
+ end
61
+ rescue => ex
62
+ ensure
63
+ @window.destroy if !@window.nil?
64
+ VER::stop_ncurses
65
+ p ex if ex
66
+ p(ex.backtrace.join("\n")) if ex
67
+ $log.debug( ex) if ex
68
+ $log.debug(ex.backtrace.join("\n")) if ex
69
+ end
70
+ end
@@ -0,0 +1,94 @@
1
+ ##
2
+ # This tests both multicontainer and container
3
+ #
4
+ require 'logger'
5
+ require 'rbcurse'
6
+ require 'rbcurse/extras/widgets/rmulticontainer'
7
+ require 'rbcurse/core/widgets/rcontainer'
8
+ require 'rbcurse/core/widgets/rtextarea'
9
+ if $0 == __FILE__
10
+ include RubyCurses
11
+ include RubyCurses::Utils
12
+
13
+ begin
14
+ # Initialize curses
15
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
16
+ $log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
17
+ $log.level = Logger::DEBUG
18
+
19
+ @window = VER::Window.root_window
20
+
21
+ catch(:close) do
22
+ colors = Ncurses.COLORS
23
+ $log.debug "START #{colors} colors --------- testmulticomp"
24
+ @form = Form.new @window
25
+ @ctr = 1
26
+ r = 1; c = 30;
27
+
28
+ mc = MultiContainer.new @form do
29
+ name "multic"
30
+ row r
31
+ col c
32
+ width 60
33
+ height 15
34
+ title "Multicontainer"
35
+ end
36
+ ctr = 1
37
+
38
+ c1 = Container.new
39
+ mc.add c1, "A form"
40
+ f1 = Field.new nil do
41
+ name "name"
42
+ text "rahul"
43
+ row 1
44
+ col 10
45
+ label " Name: "
46
+ end
47
+ f2 = Field.new nil, :name => "email", :text => "me@somebody.com", :label => "Email: "
48
+ c1.add( f1, f2)
49
+
50
+ c3 = TextArea.new
51
+ mc.add c3, "Edit Me"
52
+ c2 = Container.new
53
+ mc.add c2, "Another form"
54
+ attrib = 'underline'
55
+ f3 = Field.new do
56
+ name "language"
57
+ text "ruby"
58
+ row 1
59
+ col 10
60
+ label "Language: "
61
+ attr attrib
62
+ end
63
+ f4 = Field.new nil, :name => "version", :text => "1.9.2", :row => 2, :col => 10,
64
+ :label => " Version: ", :attr => attrib
65
+ c2.add( f3, f4)
66
+
67
+ @help = "F10 to quit. M-a to open new component. M-: for menu #{$0} "
68
+ RubyCurses::Label.new @form, {:text => @help, :row => last_line(), :col => 2,
69
+ :color => 'yellow', :bgcolor => 'red'}
70
+ f5 = Field.new @form, :name => "version2", :text => "1.9.2", :row => 20, :col => c, :bgcolor => 'blue',
71
+ :label => "Version: ", :label_color_pair => get_color($datacolor, 'green', 'black')
72
+
73
+ @form.repaint
74
+ @window.wrefresh
75
+ Ncurses::Panel.update_panels
76
+ while((ch = @window.getchar()) != KEY_F10 )
77
+ break if ch == ?\C-q.getbyte(0)
78
+ str = keycode_tos ch
79
+ $log.debug "#{ch} got (#{str})"
80
+ @form.handle_key ch
81
+ @form.repaint
82
+ @window.wrefresh
83
+ end
84
+ end
85
+ rescue => ex
86
+ ensure
87
+ @window.destroy if !@window.nil?
88
+ VER::stop_ncurses
89
+ p ex if ex
90
+ p(ex.backtrace.join("\n")) if ex
91
+ $log.debug( ex) if ex
92
+ $log.debug(ex.backtrace.join("\n")) if ex
93
+ end
94
+ end
@@ -0,0 +1,199 @@
1
+ $LOAD_PATH << "/Users/rahul/work/projects/rbcurse/lib"
2
+ require 'rbcurse'
3
+ require 'rbcurse/extras/widgets/rmultisplit'
4
+ require 'rbcurse/extras/widgets/rlistbox'
5
+ require 'fileutils'
6
+
7
+ #
8
+ ## this sample creates a multisplitpane with n objects
9
+ ##+ and move divider around using - + and =.
10
+ # TODO:
11
+ # x Status bar below to reflect full path.
12
+ # - enter to gotonext component too, or at least make visible if not
13
+ # but now cursor is showing around everywhere
14
+ #
15
+ $counter = 0
16
+
17
+ # when displaying a filename, if directory prepend a slash.
18
+ def format list, fullname=nil
19
+ list.collect! {|e|
20
+ if fullname
21
+ f = File.join(fullname, e)
22
+ else
23
+ f = e
24
+ end
25
+ if File.directory? f
26
+ "/" + e
27
+ else
28
+ e
29
+ end
30
+ }
31
+ list
32
+ end
33
+ # @param [Listbox] new list to bind
34
+ # @param [Array] array of lists
35
+ # @param [MultiSplit] msp object to add a new list to
36
+ def bind_list(listb, lists, splitp)
37
+ #listb.bind(:ENTER_ROW, mylist) {|lb,list| row_cmd.call(lb,list) }
38
+ listb.bind(:PRESS) {
39
+ #@status_row.text = "Selected #{tablelist.get_content()[tablelist.current_index]}"
40
+ item = "#{listb.get_content()[listb.current_index]}"
41
+ fullname = File.join(listb.config[:path], item)
42
+ mylist = nil
43
+ if File.directory? fullname
44
+ $log.debug " DIRector is a item #{item} "
45
+ d = Dir.new(fullname)
46
+ mylist = d.entries
47
+ mylist.delete "."
48
+ mylist.delete ".."
49
+ format(mylist, fullname)
50
+ # NOTE that we create component with nil form as container will manage it
51
+ if lists.empty? || lists.last == listb
52
+ $counter += 1
53
+ listc = Listbox.new nil do
54
+ name "LIST#{$counter}"
55
+ list mylist
56
+ title item
57
+ title_attrib 'reverse'
58
+ end
59
+ listc.one_key_selection = false
60
+ listc.bind(:ENTER) {|l| l.title_attrib 'reverse'; }
61
+ listc.bind(:LEAVE) {|l| l.title_attrib 'normal'; }
62
+ # FIXME crashes if file nil
63
+ row_cmd = lambda {|lb, oldlist| list = lb.list(); file = list[lb.current_index]; file ||= "?"; $message.value = File.join(lb.config[:path], file); }
64
+ listc.bind(:ENTER_ROW, mylist) {|lb,list| row_cmd.call(lb,list) }
65
+ splitp.add listc
66
+ lists << listc
67
+ listb.config[:child] = listc
68
+ listc.config[:path] = File.join(listb.config[:path], item)
69
+ bind_list(listc, lists, splitp)
70
+ else
71
+ #l = lists.first
72
+ l = listb.config[:child]
73
+ l.list_data_model.remove_all
74
+ # if empty maybe we should remove it, but its just a demo
75
+ # what happens is, this comes up again when going through another
76
+ # directory. First go down rbcurse/lib/rbcurse/extras
77
+ # then go to examples which has a shallow structure.
78
+ l.list_data_model.insert 0, *mylist unless mylist.empty?
79
+ l.config[:path] = fullname
80
+ l.title = item
81
+ while true
82
+ n = l.config[:child]
83
+ break if n.nil?
84
+ n.list_data_model.remove_all
85
+ # TODO should be removed, so focus does not go to it
86
+ n.title = ""
87
+ l = n
88
+ end
89
+ $log.debug " MYLIST #{mylist} dir #{item} "
90
+ end
91
+ splitp.goto_next_component
92
+ end
93
+ }
94
+ end
95
+ if $0 == __FILE__
96
+ include RubyCurses
97
+ include RubyCurses::Utils
98
+
99
+ begin
100
+ # Initialize curses
101
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
102
+ $log = Logger.new((File.join(ENV['LOGDIR'] || "./" ,"rbc13.log")))
103
+
104
+ $log.level = Logger::DEBUG
105
+
106
+ @window = VER::Window.root_window
107
+
108
+ catch(:close) do
109
+ @form = Form.new @window
110
+ r = 3; c = 7; ht = 18
111
+ #lastrow = ht+r+5 # 26
112
+ lastrow = Ncurses.LINES-1
113
+
114
+
115
+ help = "F1 to quit. #{$0} Press Enter on directory, TAB/BTAB to navigate. C-w+-= "
116
+ RubyCurses::Label.new @form, {:text => help, :row => lastrow, "col" => 2, "color" => "yellow" }
117
+ title = "Demo of Multi-SplitPane (Column Browse pattern)"
118
+ RubyCurses::Label.new @form, {:text => title, :row => 1, :col => c, :color => "white" }
119
+
120
+
121
+ splitp = MultiSplit.new @form do
122
+ name "mypane"
123
+ row r
124
+ col c
125
+ width 70
126
+ height ht
127
+ split_count 3
128
+ unlimited true
129
+ orientation :VERTICAL_SPLIT
130
+ max_visible 3
131
+ end
132
+ splitp.bind(:PROPERTY_CHANGE){|e| $message.value = e.to_s }
133
+
134
+ $message = Variable.new
135
+ $message.value = "Message Comes Here"
136
+ message_label = RubyCurses::Label.new @form, {'text_variable' => $message, "name"=>"message_label","row" => ht+r+2, "col" => 1, "display_length" => 80, "height" => 2, 'color' => 'cyan'}
137
+ $message.update_command() { message_label.repaint } # why ?
138
+ #message_label.row = splitp.row + splitp.height
139
+ #message_label.col = splitp.col
140
+ @form.place_below(message_label)
141
+
142
+
143
+ lists = []
144
+ FileUtils.cd("..")
145
+ mylist = Dir.glob('*')
146
+ mylist.delete_if {|x| x =~ /^\./ || x =~ /^_/ || x =~ /bak$/}
147
+ format(mylist)
148
+ # NOTE that we create component with nil form as container will manage it
149
+ listb = Listbox.new nil do
150
+ name "mainlist"
151
+ list mylist
152
+ title "A short list"
153
+ title_attrib 'reverse'
154
+ end
155
+ listb.config[:path] = Dir.getwd
156
+ listb.one_key_selection = false
157
+ splitp.add listb
158
+ row_cmd = lambda {|lb, list| file = list[lb.current_index]; $message.value = file; # File.stat("#{cur_dir()}/#{file}").inspect
159
+ }
160
+ listb.bind(:ENTER_ROW, mylist) {|lb,list| row_cmd.call(lb,list) }
161
+ listb.bind(:ENTER) {|l| l.title_attrib 'reverse'; }
162
+ listb.bind(:LEAVE) {|l| l.title_attrib 'normal'; }
163
+ bind_list(listb, lists, splitp)
164
+
165
+ # Dummy field just to see navigation from and to container
166
+ fname = "Search"
167
+ r, c = @form.next_position
168
+ c += fname.length + 1
169
+ field = Field.new @form do
170
+ name fname
171
+ row r
172
+ col c
173
+ display_length 30
174
+ bgcolor 'cyan'
175
+ #set_buffer "abcd "
176
+ set_label Label.new @form, {:text => fname, :color=>'white',:bgcolor=>'red', :mnemonic=> 's'}
177
+ end
178
+
179
+ @form.repaint
180
+ @window.wrefresh
181
+ Ncurses::Panel.update_panels
182
+ counter = 0
183
+ while((ch = @window.getchar()) != KEY_F1 )
184
+ str = keycode_tos ch
185
+ @form.handle_key(ch)
186
+ @window.wrefresh
187
+ end
188
+ end
189
+ rescue => ex
190
+ ensure
191
+ @window.destroy if !@window.nil?
192
+ VER::stop_ncurses
193
+ p ex if ex
194
+ puts(ex.backtrace.join("\n")) if ex
195
+ $log.debug( ex) if ex
196
+ $log.debug(ex.backtrace.join("\n")) if ex
197
+ end
198
+ end
199
+