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,68 @@
1
+ PROGRAM STATUS
2
+ ==============
3
+ /// vim:ts=4:sw=4:tw=80:ai:formatoptions=tcqnl:
4
+
5
+ I need to maintain the status of various test programs, what all is working and
6
+ particularly what is not, after testing. That way after making changes if
7
+ something is not working, i know whether it was a newly introduced issue or an
8
+ existing issue that was not closed.
9
+
10
+
11
+ testsplit3_1.rb ERROR
12
+ 2010-02-08 20:47
13
+ ERROR
14
+ M-w works on left split to jump. C-a C-e etc working fine.
15
+
16
+ [ ] TAB no longer working to go to right split. Tab puts me in the top left corner
17
+ of current split.
18
+
19
+ ------------
20
+ testsplit3.rb
21
+ 2010-02-08 20:49
22
+ OK
23
+
24
+ M-w working.
25
+ Tab working to get to right side.
26
+
27
+ ------------
28
+ testsplit3a.rb ERROR
29
+ 2010-02-08 20:53
30
+ ERROR
31
+
32
+ Display. Left top split shows NOTES instead of README. After cursor movement,
33
+ it shows README.
34
+ Middle separator not showing.
35
+ Cursor off by -2, -1 in top left.
36
+ TAB does not go to right split.
37
+ M-w brings bottom tab to top!
38
+ ------------
39
+
40
+ testsplitta.rb
41
+ 2010-02-08 21:00
42
+ OKAY
43
+
44
+ M-w
45
+ Ca Ce
46
+ M- M+ M=
47
+ Cursor pos
48
+
49
+ ------------
50
+ testsplittv.rb
51
+ 2010-02-08 21:37
52
+ OKAY
53
+
54
+ M-w
55
+ Ca Ce
56
+ + - =
57
+ curpos
58
+
59
+ ------------
60
+ testsplittvv.rb
61
+ 2010-02-08 21:39
62
+ OKAY
63
+
64
+ M-w
65
+ Ca Ce
66
+ + = -
67
+ Cn Tab Cn
68
+ ------------
@@ -0,0 +1,24 @@
1
+ require 'rbcurse/core/util/app'
2
+
3
+ if $0 == __FILE__
4
+ # NOTE try using the readonly tabular or tabular widget instead, see term2.rb
5
+ App.new do
6
+ @window.printstring 1, 30, "Demo of Table - rbcurse", $normalcolor, 'reverse'
7
+ @window.printstring 2, 30, "Hit F1 to quit", $datacolor, 'normal'
8
+ data = [["Roger Federer",16,"SWI"],
9
+ ["Pete Sampras",14, "USA"],
10
+ ["Roy Emerson", 12, "AUS"],
11
+ ["Bjorn Borg", 11, "SWE"],
12
+ ["Rod Laver", 11, "AUS"],
13
+ ["Bill Tilden", 10, "USA"]]
14
+ colnames = %w[ Player Wins Nation ]
15
+ stack :margin_top => 3, :margin => 10 do
16
+ # we leave out :width so it gets calculated by column_widths
17
+ t = table :height => 10, :columns => colnames, :data => data, :column_widths => [15,5,10], :extended_keys => true
18
+ # :estimate_widths => true
19
+ # other options are :column_widths => [12,4,12]
20
+ # :size_to_fit => true
21
+
22
+ end
23
+ end
24
+ end
data/examples/term2.rb ADDED
@@ -0,0 +1,84 @@
1
+ require 'rbcurse/core/util/app'
2
+ require 'rbcurse/core/widgets/tabular'
3
+ require 'rbcurse/core/widgets/scrollbar'
4
+
5
+ App.new do
6
+ header = app_header "rbcurse #{Rbcurse::VERSION}", :text_center => "Tabular Demo", :text_right =>"New Improved!", :color => :black, :bgcolor => :white, :attr => :bold
7
+ message "Press F10 to escape from here"
8
+
9
+ stack :margin_top => 2, :margin => 5, :width => 30 do
10
+ t = Tabular.new(['a', 'b'], [1, 2], [3, 4])
11
+ listbox :list => t.render
12
+ t = Tabular.new ['a', 'b']
13
+ t << [1, 2]
14
+ t << [3, 4]
15
+ t << [4, 6]
16
+ #list_box :list => t.to_s.split("\n")
17
+ listbox :list => t.render
18
+ end # stack
19
+ r = `/bin/df -gh` # stock BSD df
20
+ #r = `df -gh` # I've installed brew, the df (maybe coreutils gives an error due to g option"
21
+
22
+ raise "df -gh not returning anything. correct command here. Try removing g option" if r == ""
23
+ # on my system there are extra spaces so i need to remove them, or else
24
+ # there'll be a mismatch between headers and columns
25
+ r.gsub!("Mounted on", "Mounted_on")
26
+ r.gsub!("map ", "map_")
27
+ res = r.split("\n")
28
+ heads = res.shift.split
29
+ t = Tabular.new do |t|
30
+ t.headings = heads
31
+ #t.headings = 'First Name', 'Last Name', 'Email'
32
+ #t << %w( TJ Holowaychuk tj@vision-media.ca )
33
+ #t << %w( TJ Holowaychuk tj@vision-media.ca 1 2 3 )
34
+ #t << %w( Bob Someone bob@vision-media.ca )
35
+ #t << %w( Joe Whatever bob@vision-media.ca )
36
+
37
+ #res.each { |e| t << e.split.flatten }
38
+ res.each { |e| t.add_row e.split }
39
+ end
40
+
41
+ t = t.render
42
+ wid = t[0].length + 2
43
+ stack :margin_top => 2, :margin => 35, :width => wid do
44
+ listbox :list => t, :title => '[df -gh]'
45
+
46
+ r = `ls -l`
47
+ res = r.split("\n")
48
+
49
+ t = Tabular.new do
50
+ # self.headings = 'Perm', 'Gr', 'User', 'U', 'Size', 'Mon', 'Date', 'Time', 'File' # changed 2011 dts
51
+ self.headings = 'User', 'Size', 'Mon', 'Date', 'Time', 'File'
52
+ res.each { |e|
53
+ cols = e.split
54
+ next if cols.count < 6
55
+ cols = cols[3..-1]
56
+ cols = cols[0..5] if cols.count > 6
57
+ #cols[1] = cols[1].to_i
58
+ add_row cols
59
+ }
60
+ column_width 1, 6
61
+ align_column 1, :right
62
+ #self.headings = 'First Name', 'Last Name', 'Email'
63
+ #add_row ['Roald', 'Amundsen', 'ra@explorers.org']
64
+ #add_row ['Francis', 'Drake', 'joe@ducks.com']
65
+ #add_row ['Hsuan', 'Tsang', 'tsang@asia.org']
66
+ #add_separator
67
+ #add_row ['Ernest', 'Shackleton', 'jack@radio-schakc.org']
68
+ #add_row ['Fa', 'Hsien', 'fa@sheen.net']
69
+ #add_row ['Vasco', 'Da Gama', 'bob@vasco.org']
70
+ #add_row ['David', 'Livingstone', 'jack@trolls.com']
71
+ ##add_row ['Total', { :value => '3', :colspan => 2, :alignment => :right }]
72
+ #align_column 1, :center
73
+ #self.numbering = true
74
+ end
75
+ #lb = list_box :list => t.render2
76
+ lb = textview :set_content => t.render, :height => 15, :title => '[ls -l]'
77
+ lb.bind(:PRESS){|tae|
78
+ alert "Pressed list on line #{tae.current_index} #{tae.word_under_cursor(nil, nil, "|")} "
79
+ }
80
+ Scrollbar.new @form, :parent => lb
81
+ #make a textview that is vienabled by default.
82
+ end
83
+
84
+ end # app
data/examples/test1.rb ADDED
@@ -0,0 +1,239 @@
1
+ # this is a test program, tests out messageboxes. type F1 to exit
2
+ # 2008-12-17 22:13 tried out the listdatamodel
3
+ # Certain terminals are not displaying background colors correctly.
4
+ # TERM=screen does but does not show UNDERLINES.
5
+ # TERM=xterm-color does but does not trap F1, f2 etc
6
+ # TERM=xterm does not but other things are fine.
7
+ #
8
+ require 'logger'
9
+ require 'rbcurse'
10
+ require 'rbcurse/deprecated/widgets/rmessagebox'
11
+
12
+ if $0 == __FILE__
13
+ # Initialize curses
14
+ begin
15
+ # XXX update with new color and kb
16
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
17
+ $log = Logger.new((File.join(ENV['LOGDIR'] || "./" ,"rbc13.log")))
18
+ $log.level = Logger::DEBUG
19
+
20
+ # @window = VER::Window.root_window
21
+
22
+
23
+ catch(:close) do
24
+ choice = ARGV[0] && ARGV[0].to_i || 3
25
+ $log.debug "START MESSAGE BOX TEST #{ARGV[0]}. choice==#{choice} ---------"
26
+ # need to pass a form, not window.
27
+ case choice
28
+ when 1
29
+ @mb = RubyCurses::MessageBox.new do
30
+ title "Enter your name"
31
+ message "Enter your name"
32
+ type :list
33
+ button_type :ok_cancel
34
+ list %w[john tim lee wong rahul edward why chad andy]
35
+ list_selection_mode :multiple
36
+ default_values %w[ lee why ]
37
+
38
+ default_button 0
39
+ end
40
+ when 2
41
+ @mb = RubyCurses::MessageBox.new do
42
+ title "Color selector"
43
+ message "Select a color"
44
+ type :custom
45
+ button_type :custom
46
+ buttons %w[&red &green &blue &yellow]
47
+ underlines [0,0,0,0]
48
+ default_button 0
49
+ end
50
+ when 3
51
+ config = {}
52
+ config["input_config"] = {}
53
+ config["input_config"]["chars_allowed"]=/[^xzq]/
54
+ config["input_config"]["valid_regex"]=/[A-Z][a-z]*/
55
+ @mb = RubyCurses::MessageBox.new nil, config do
56
+ title "Enter your name"
57
+ #message "Enter your first name. You are not permitted to enter x z or q and must enter a capital first"
58
+ message "Enter your first name. "
59
+ type :input
60
+ button_type :ok_cancel
61
+ default_value "Rahul"
62
+ end
63
+ when 4
64
+ @form = RubyCurses::Form.new nil
65
+ field_list = []
66
+ titlelabel = RubyCurses::Label.new @form, {'text' => 'User', 'row'=>3, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white', 'mnemonic'=>'U'}
67
+ field_list << titlelabel
68
+ field = RubyCurses::Field.new @form do
69
+ name "url"
70
+ row 3
71
+ col 10
72
+ display_length 30
73
+ # set_buffer "http://"
74
+ set_label titlelabel
75
+ end
76
+ checkbutton = RubyCurses::CheckBox.new @form do
77
+ # variable $results
78
+ #value = true
79
+ onvalue "Selected cb "
80
+ offvalue "UNselected cb"
81
+ color 'black'
82
+ bgcolor 'white'
83
+ text "No &frames"
84
+ row 4
85
+ col 4
86
+ end
87
+ field_list << field
88
+ field_list << checkbutton
89
+ checkbutton = RubyCurses::CheckBox.new @form do
90
+ # variable $results
91
+ value true
92
+ color 'black'
93
+ bgcolor 'white'
94
+ text "Use &HTTP/1.0"
95
+ row 5
96
+ col 4
97
+ end
98
+ field_list << checkbutton
99
+ checkbutton = RubyCurses::CheckBox.new @form do
100
+ # variable $results
101
+ color 'black'
102
+ bgcolor 'white'
103
+ text "Use &passive FTP"
104
+ row 6
105
+ col 4
106
+ end
107
+ field_list << checkbutton
108
+ titlelabel = RubyCurses::Label.new @form, {'text' => 'Language', 'row'=>8, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white'}
109
+ field_list << titlelabel
110
+ $radio = RubyCurses::Variable.new
111
+ #$radio.update_command(colorlabel) {|tv, label| label.color tv.value}
112
+ radio1 = RubyCurses::RadioButton.new @form do
113
+ variable $radio
114
+ text "rub&y"
115
+ value "ruby"
116
+ color "red"
117
+ bgcolor 'white'
118
+ row 9
119
+ col 4
120
+ end
121
+ radio2 = RubyCurses::RadioButton.new @form do
122
+ variable $radio
123
+ text "python"
124
+ value "py&thon"
125
+ color "blue"
126
+ bgcolor 'white'
127
+ row 10
128
+ col 4
129
+ end
130
+ field_list << radio1
131
+ field_list << radio2
132
+ field.bind(:ENTER) do |f|
133
+ listconfig = {'bgcolor' => 'blue', 'color' => 'white'}
134
+ url_list= RubyCurses::ListDataModel.new(%w[john tim lee wong rahul edward _why chad andy])
135
+ pl = RubyCurses::PopupList.new do
136
+ # title "Enter URL "
137
+ row 4
138
+ col 10
139
+ width 30
140
+ #list url_list
141
+ list_data_model url_list
142
+ list_selection_mode 'single'
143
+ relative_to f
144
+ list_config listconfig
145
+ #default_values %w[ lee _why ]
146
+ bind :PRESS do |index|
147
+ field.set_buffer url_list[index]
148
+ end
149
+ end
150
+ end
151
+ @mb = RubyCurses::MessageBox.new @form do
152
+ #title "Color selector"
153
+ title "HTTP Configuration"
154
+ # message "Enter your name"
155
+ # type :custom
156
+ # buttons %w[red green blue yellow]
157
+ # underlines [0,0,0,0]
158
+ # type :input
159
+ # default_value "rahul"
160
+ #type :field_list
161
+ #field_list field_list
162
+ button_type :ok
163
+ default_button 0
164
+ end
165
+ when 5
166
+ @form = RubyCurses::Form.new nil
167
+ label = RubyCurses::Label.new @form, {'text' => 'File', 'row'=>3, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white', 'mnemonic'=>'F'}
168
+ field = RubyCurses::Field.new @form do
169
+ name "file"
170
+ row 3
171
+ col 10
172
+ display_length 40
173
+ set_label label
174
+ end
175
+ flist = Dir.glob("*.*")
176
+ listb = RubyCurses::Listbox.new @form do
177
+ name "mylist"
178
+ row 5
179
+ col 10
180
+ width 40
181
+ height 10
182
+ list flist
183
+ title "File list"
184
+ title_attrib 'bold'
185
+ end
186
+ #listb.list.bind(:ENTER_ROW) { field.set_buffer listb.selected_item }
187
+ # if you find that cursor goes into listbox while typing, then
188
+ # i've put set_form_row in listbox list_data_changed
189
+ field.bind(:CHANGE) do |f|
190
+ flist = Dir.glob(f.getvalue+"*")
191
+ l = listb.list
192
+ l.remove_all
193
+ l.insert( 0, *flist) if flist
194
+ end
195
+ @mb = RubyCurses::MessageBox.new @form do
196
+ title "Sample File Selector"
197
+ type :override
198
+ height 20
199
+ width 60
200
+ top 5
201
+ left 20
202
+ default_button 0
203
+ button_type :ok_cancel
204
+
205
+ end
206
+ $log.debug "MBOX :selected #{listb.selected_item}"
207
+ end
208
+
209
+ $log.debug "MBOX :selected button index #{@mb.selected_index} "
210
+ $log.debug "MBOX :input val #{@mb.input_value} "
211
+ # $log.debug "row : #{@form.row} "
212
+ # $log.debug "col : #{@form.col} "
213
+ # $log.debug "Config : #{@form.config.inspect} "
214
+ # @form.configure "row", 23
215
+ # @form.configure "col", 83
216
+ # $log.debug "row : #{@form.row} "
217
+ # x = @form.row
218
+ # @form.depth 21
219
+ # @form.depth = 22
220
+ # @form.depth 24
221
+ # @form.depth = 25
222
+ # $log.debug "col : #{@form.col} "
223
+ # $log.debug "config : #{@form.config.inspect} "
224
+ # $log.debug "row : #{@form.configure('row')} "
225
+ #$log.debug "mrgods : #{@form.public_methods.sort.inspect}"
226
+ #while((ch = @window.getchar()) != ?q )
227
+ # @window.wrefresh
228
+ #end
229
+ end
230
+ rescue => ex
231
+ ensure
232
+ @window.destroy unless @window.nil?
233
+ VER::stop_ncurses
234
+ p ex if ex
235
+ p(ex.backtrace.join("\n")) if ex
236
+ $log.debug( ex) if ex
237
+ $log.debug(ex.backtrace.join("\n")) if ex
238
+ end
239
+ end
data/examples/test2.rb ADDED
@@ -0,0 +1,674 @@
1
+ # This program tests out various widgets.
2
+ # This is the old style of creating an application in which the user
3
+ # has to start and stop ncurses. No shortcuts for widget constructors are available.
4
+ #
5
+ # The newer easier way is to use 'App' which manages the environment, and provides shortcuts
6
+ # for all widgets. See app*.rb, alpmenu.rb, dbdemo.rb etc for samples.
7
+ #
8
+ # In case, you are running this in a directory that does not allow writing, set LOGDIR to
9
+ # your home directory, or temp directory so a log file can be generated.
10
+ #
11
+ require 'logger'
12
+ require 'rbcurse'
13
+ require 'rbcurse/core/widgets/rtextarea'
14
+ require 'rbcurse/core/widgets/rtextview'
15
+ require 'rbcurse/core/widgets/rmenu'
16
+ require 'rbcurse/core/widgets/rcombo'
17
+ require 'rbcurse/extras/widgets/rcomboedit'
18
+ require 'rbcurse/core/include/listcellrenderer'
19
+ require 'rbcurse/extras/include/checkboxcellrenderer'
20
+ require 'rbcurse/extras/include/comboboxcellrenderer'
21
+ require 'rbcurse/extras/include/celleditor'
22
+ require 'rbcurse/extras/widgets/rlistbox'
23
+ require 'rbcurse/core/widgets/rlist'
24
+ #require 'rbcurse/deprecated/widgets/rmessagebox'
25
+ require 'rbcurse/core/widgets/rtree'
26
+ require 'rbcurse/core/include/appmethods.rb'
27
+ require 'rbcurse/core/widgets/scrollbar'
28
+ def help_text
29
+ <<-eos
30
+ TEST2 HELP 1.5.0
31
+
32
+ This is some help text for test2.
33
+
34
+ Alt-C/F10 - Exit application
35
+ Alt-! - Drop to shell
36
+ C-x c - Drop to shell
37
+ C-x l - list of files
38
+ C-x p - process list
39
+ C-x d - disk usage list
40
+ C-x s - Git status
41
+ C-x d - Git diff
42
+ C-x w - Git whatchanged
43
+ Alt-x - Command mode (<tab> to see commands and select)
44
+
45
+ Some commands for using bottom of screen as vim and emacs do.
46
+ To add
47
+
48
+ -----------------------------------------------------------------------
49
+ eos
50
+ end
51
+ if $0 == __FILE__
52
+
53
+ include RubyCurses
54
+ include RubyCurses::Utils
55
+
56
+ begin
57
+ # Initialize curses
58
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
59
+ path = File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")
60
+ file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
61
+ $log = Logger.new(path)
62
+ $log.level = Logger::DEBUG
63
+
64
+ @lookfeel = :classic # :dialog # or :classic
65
+
66
+ @window = VER::Window.root_window
67
+ # Initialize few color pairs
68
+ # Create the window to be associated with the form
69
+ # Un post form and free the memory
70
+
71
+ catch(:close) do
72
+ colors = Ncurses.COLORS
73
+ $log.debug "START #{colors} colors test2.rb --------- #{@window} "
74
+ @form = Form.new @window
75
+ title = (" "*30) + "Demo of some Ruby Curses Widgets - rbcurse " + Rbcurse::VERSION
76
+ Label.new @form, {'text' => title, :row => 0, :col => 0, :color => 'green', :bgcolor => 'black'}
77
+ r = 1; fc = 12;
78
+ mnemonics = %w[ n l r p]
79
+ %w[ name line regex password].each_with_index do |w,i|
80
+ field = Field.new @form do
81
+ name w
82
+ row r
83
+ col fc
84
+ display_length 30
85
+ #set_buffer "abcd "
86
+ set_label Label.new @form, {'text' => w, 'color'=>'cyan','mnemonic'=> mnemonics[i]}
87
+ end
88
+ r += 1
89
+ end
90
+
91
+ $message = Variable.new
92
+ $message.value = "Message Comes Here"
93
+ message_label = RubyCurses::Label.new @form, {'text_variable' => $message,
94
+ "name"=>"message_label","row" => Ncurses.LINES-1, "col" => 1, "display_length" => 60,
95
+ "height" => 2, 'color' => 'cyan'}
96
+
97
+ $results = Variable.new
98
+ $results.value = "A variable"
99
+ var = RubyCurses::Label.new @form, {'text_variable' => $results, "row" => r, "col" => fc}
100
+ r += 1
101
+ mylist = File.open("data/tasks.txt",'r').readlines
102
+ #0.upto(100) { |v| mylist << "#{v} scrollable data" }
103
+ listb = List.new @form do
104
+ name "mylist"
105
+ row r
106
+ col 1
107
+ width 40
108
+ height 11
109
+ list mylist
110
+ #selection_mode :SINGLE
111
+ show_selector true
112
+ #row_selected_symbol "*"
113
+ #row_unselected_symbol " "
114
+ selected_bgcolor :white
115
+ selected_color :blue
116
+ title "Todo List"
117
+ end
118
+ Scrollbar.new @form, :parent => listb # 2011-10-1 added
119
+ #listb.list_data_model.insert -1, "rake build", "rake release", "bump version", "fix bugs"
120
+ col2 = 42
121
+ texta = TextArea.new @form do
122
+ name "mytext"
123
+ row 1
124
+ col col2
125
+ width 50
126
+ height 14
127
+ title "Editable box"
128
+ #title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
129
+ print_footer true
130
+ bind(:CHANGE){|e| $message.value = e.to_s+" CP:"+e.source.curpos.to_s }
131
+ end
132
+ lines = File.open("data/unix1.txt",'r').readlines
133
+ lines.each { |e| texta << e }
134
+ #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."
135
+ #texta << "Let me not defer it or neglect it, for I shall not pass this way again."
136
+ #texta << " "
137
+ #texta << " F10 to exit. or click cancel button"
138
+ #texta << " Or alt-c"
139
+
140
+ col3 = 92
141
+ treemodel = nil
142
+ atree = Tree.new @form, :title => "Tree", :row =>1, :col=>col3, :height => 14, :width => 15 do
143
+ treemodel = root "ruby language" do
144
+ branch "mri" do
145
+ leaf "1.9.1"
146
+ leaf "1.9.2"
147
+ leaf "1.9.3"
148
+ end
149
+ branch "jruby" do
150
+ leaf "1.5"
151
+ leaf "a really long leaf"
152
+
153
+ end
154
+ branch "ree" do
155
+ leaf "1.8"
156
+ leaf "1.9"
157
+ leaf "2.0"
158
+ end
159
+ end
160
+ end
161
+ root = treemodel.root
162
+ atree.set_expanded_state root, true
163
+ #listcb.cell_editor.component.form = @form
164
+
165
+ w1 = Ncurses.COLS-col2-1
166
+ @textview = TextView.new @form do
167
+ name "myView"
168
+ row 15
169
+ col col2
170
+ width w1
171
+ height 11
172
+ title "README.mark"
173
+ #title_attrib 'bold'
174
+ print_footer true
175
+ footer_attrib 'bold'
176
+ end
177
+ content = File.open("../README.markdown","r").readlines
178
+ @textview.set_content content #, :WRAP_WORD
179
+ #@textview.top_row 21
180
+
181
+ # just for demo, lets scroll the text view as we scroll this.
182
+ listb.bind(:ENTER_ROW, @textview) { |alist, tview| tview.top_row alist.current_index
183
+ pb = @form.by_name["pbar"]
184
+ pb.visible true
185
+ len = alist.current_index
186
+ pb.fraction(len/100.0)
187
+ i = ((len/100.0)*100).to_i
188
+ i = 100 if i > 100
189
+ pb.text = "completed:#{i}"
190
+ }
191
+ listb.bind(:LEAVE) {
192
+ pb = @form.by_name["pbar"]
193
+ pb.visible false
194
+ r = pb.row
195
+ c = pb.col
196
+ @window.wmove(r,c); @window.wclrtoeol
197
+ #@window.wrefresh
198
+ }
199
+
200
+ # just for demo, lets scroll the text view to the line you enter
201
+ @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) }
202
+ @form.by_name["regex"].bind(:LEAVE, @textview) { |fld, tv| tv.top_row(tv.find_first_match(fld.getvalue)) }
203
+ @form.by_name["regex"].bind(:CHANGED) { |fld|
204
+ $message.value = "REGEX CHANGED!!! #{fld.getvalue} " }
205
+ row = 17
206
+ col = 2
207
+ align = ComboBox.new @form do
208
+ name "combo"
209
+ row row
210
+ col fc
211
+ display_length 10
212
+ editable false
213
+ list %w[left right center]
214
+ set_label Label.new @form, {'text' => "Align", 'color'=>'cyan','col'=>1, "mnemonic"=>"I"}
215
+ list_config :color => :yellow, :bgcolor=>:blue
216
+ end
217
+
218
+ list = ListDataModel.new( %w[white yellow cyan magenta red blue black])
219
+ list.bind(:LIST_DATA_EVENT) { |lde| $message.value = lde.to_s; $log.debug " STA: #{$message.value} #{lde}"; }
220
+ list.bind(:ENTER_ROW) { |obj| $message.value = "ENTER_ROW :#{obj.current_index} : #{obj.selected_item} "; $log.debug " ENTER_ROW: #{$message.value} , #{obj}"; @form.widgets.each { |e| next unless e.is_a? Widget; e.color = obj.selected_item }; @mb.color = obj.selected_item }
221
+
222
+ row += 1
223
+ combo1 = ComboBoxEdit.new @form do
224
+ name "combo1"
225
+ row row
226
+ col fc
227
+ display_length 10
228
+ editable true
229
+ list_data_model list
230
+ set_label Label.new @form, {'text' => "Edit Combo",'color'=>'cyan','col'=>1}
231
+ list_config 'color' => 'white', 'bgcolor'=>'blue', 'max_visible_items' => 6, 'height' => 7
232
+ end
233
+ row += 1
234
+ checkbutton = CheckBox.new @form do
235
+ variable $results
236
+ #value = true
237
+ onvalue "Selected bold "
238
+ offvalue "UNselected bold"
239
+ text "Bold attribute "
240
+ display_length 18 # helps when right aligning
241
+ row row
242
+ col col
243
+ mnemonic 'B'
244
+ end
245
+ row += 1
246
+ @cb_rev = Variable.new false # related to checkbox reverse
247
+ cbb = @cb_rev
248
+ checkbutton1 = CheckBox.new @form do
249
+ variable cbb # $cb_rev
250
+ #value = true
251
+ onvalue "Selected reverse "
252
+ offvalue "UNselected reverse"
253
+ text "Reverse attribute "
254
+ display_length 18
255
+ row row
256
+ col col
257
+ mnemonic 'R'
258
+ end
259
+ row += 1
260
+ togglebutton = ToggleButton.new @form do
261
+ value true
262
+ onvalue " Toggle Down "
263
+ offvalue " Untoggle "
264
+ row row
265
+ col col
266
+ mnemonic 'T'
267
+ #underline 0
268
+ end
269
+ # a special case required since another form (combo popup also modifies)
270
+ $message.update_command() { message_label.repaint }
271
+
272
+ f = @form.by_name["line"]
273
+ f.display_length(3).set_buffer(24).valid_range(1..200).
274
+ maxlen(3).
275
+ type(:integer)
276
+
277
+ @form.by_name["name"].set_buffer( "Not focusable").
278
+ set_focusable(false)
279
+
280
+ @form.by_name["regex"].valid_regex(/^[A-Z][a-z]*/).
281
+ set_buffer( "SYNOP").
282
+ display_length(10).
283
+ maxlen = 20
284
+
285
+ @form.by_name["password"].set_buffer("").
286
+ show('*').
287
+ color('red').
288
+ values(%w[scotty tiger secret pass qwerty]).
289
+ null_allowed true
290
+
291
+ # a form level event, whenever any widget is focussed, make the label red
292
+ @form.bind(:ENTER) { |f| f.label && f.label.bgcolor = 'red' if f.respond_to? :label}
293
+ @form.bind(:LEAVE) { |f| f.label && f.label.bgcolor = 'black' if f.respond_to? :label}
294
+
295
+ row += 1
296
+ colorlabel = Label.new @form, {'text' => "Select a color:", "row" => row, "col" => col,
297
+ "color"=>"cyan", "mnemonic" => 'S'}
298
+ $radio = Variable.new
299
+ $radio.update_command(colorlabel) {|tv, label| label.color tv.value; }
300
+ $radio.update_command() {|tv| message_label.color tv.value; align.bgcolor tv.value;
301
+ combo1.bgcolor tv.value}
302
+ $radio.update_command() {|tv| @form.widgets.each { |e| next unless e.is_a? Widget;
303
+ e.bgcolor tv.value }; @mb.bgcolor = tv.value }
304
+
305
+ # whenever updated set colorlabel and messagelabel to bold
306
+ $results.update_command(colorlabel,checkbutton) {|tv, label, cb|
307
+ attrs = cb.value ? 'bold' : 'normal'; label.attr(attrs); message_label.attr(attrs)}
308
+
309
+ align.bind(:ENTER_ROW) {|fld| message_label.justify fld.getvalue}
310
+
311
+ align.bind(:ENTER_ROW) {|fld|
312
+ if fld.getvalue == 'right'
313
+ checkbutton1.align_right true
314
+ checkbutton.align_right true
315
+ else
316
+ checkbutton1.align_right false
317
+ checkbutton.align_right false
318
+ end
319
+ }
320
+
321
+ # whenever updated set colorlabel and messagelabel to reverse
322
+ #@cb_rev.update_command(colorlabel,checkbutton1) {|tv, label, cb| attrs = cb.value ? 'reverse' : nil; label.attr(attrs); message_label.attr(attrs)}
323
+ # changing nil to normal since PROP CHAN handler will not fire if nil being set.
324
+ @cb_rev.update_command(colorlabel,checkbutton1) {|tv, label, cb|
325
+ attrs = cb.value ? 'reverse' : 'normal'; label.attr(attrs); message_label.attr(attrs)}
326
+
327
+ row += 1
328
+ dlen = 10
329
+ radio1 = RadioButton.new @form do
330
+ variable $radio
331
+ text "red"
332
+ value "red"
333
+ color "red"
334
+ display_length dlen # helps when right aligning
335
+ row row
336
+ col col
337
+ end
338
+ radio11 = RadioButton.new @form do
339
+ variable $radio
340
+ text "c&yan"
341
+ value "cyan"
342
+ color "cyan"
343
+ display_length dlen # helps when right aligning
344
+ row row
345
+ col col+24
346
+ end
347
+
348
+ row += 1
349
+ radio2 = RadioButton.new @form do
350
+ variable $radio
351
+ text "&green"
352
+ value "green"
353
+ color "green"
354
+ display_length dlen # helps when right aligning
355
+ row row
356
+ col col
357
+ end
358
+ radio22 = RadioButton.new @form do
359
+ variable $radio
360
+ text "magenta"
361
+ value "magenta"
362
+ color "magenta"
363
+ display_length dlen # helps when right aligning
364
+ row row
365
+ col col+24
366
+ end
367
+ colorlabel.label_for radio1
368
+ align.bind(:ENTER_ROW) {|fld|
369
+ if fld.getvalue == 'right'
370
+ radio1.align_right true
371
+ radio2.align_right true
372
+ radio11.align_right true
373
+ radio22.align_right true
374
+ else
375
+ radio1.align_right false
376
+ radio2.align_right false
377
+ radio11.align_right false
378
+ radio22.align_right false
379
+ end
380
+ }
381
+
382
+ # instead of using frozen, I will use a PropertyVeto
383
+ # to disallow changes to color itself
384
+ veto = lambda { |e, name|
385
+ if e.property_name == 'color'
386
+ if e.newvalue != name
387
+ raise PropertyVetoException.new("Cannot change this at all!", e)
388
+ end
389
+ elsif e.property_name == 'bgcolor'
390
+ raise PropertyVetoException.new("Cannot change this!", e)
391
+ end
392
+ }
393
+ [radio1, radio2, radio11, radio22].each { |r|
394
+ r.bind(:PROPERTY_CHANGE) do |e| veto.call(e, r.text) end
395
+ }
396
+
397
+ #
398
+ # define the menu
399
+ #
400
+ @mb = RubyCurses::MenuBar.new
401
+ filemenu = RubyCurses::Menu.new "File"
402
+ filemenu.add(item = RubyCurses::MenuItem.new("Open",'O'))
403
+ item.command(@form) {|it, form| $message.value = "Open called on menu bar";
404
+ require './qdfilechooser'
405
+ fchooser = QDFileChooser.new
406
+ option = fchooser.show_open_dialog
407
+ $message.value = "File Selection #{option}, #{fchooser.get_selected_file}"
408
+ if option == :OK
409
+ filesel = fchooser.get_selected_file
410
+ if !filesel.nil?
411
+ texta.remove_all
412
+ content = File.open(filesel,"r").readlines
413
+ content.each do |line|
414
+ texta << line
415
+ end
416
+ else
417
+ alert "File name #{filesel} nil. Pls check code. "
418
+ end
419
+ end
420
+ }
421
+
422
+ filemenu.insert_separator 1
423
+ filemenu.add(RubyCurses::MenuItem.new "New",'N')
424
+ filemenu.add(item = RubyCurses::MenuItem.new("Save",'S'))
425
+ item.command() do |it|
426
+ filename = get_string("Please enter file to save in", 20, "t.t")
427
+ $message.value = "file: #{filename}"
428
+ filename ||= "tmpzzzz.tmp"
429
+ str = texta.to_s
430
+ File.open(filename, 'w') {|f| f.write(str) }
431
+ $message.value = " written #{str.length} bytes to file: #{filename}"
432
+ end
433
+ filemenu.add(item = RubyCurses::MenuItem.new("Test",'T'))
434
+ item.command(@form, texta) do |it, form, testa|
435
+ $message.value = "Testing textarea"
436
+ str = File.open("data/lotr.txt",'r').readlines.join
437
+ #str = "Hello there good friends and fellow rubyists. Here is a textarea that I am testing out with"
438
+ #str << " some long data, to see how it acts, how the wrapping takes place. Sit back and enjoy the "
439
+ #str << " bugs as they crop up."
440
+ testa.goto_start
441
+ #testa.cursor_bol
442
+ testa.handle_key ?\C-a.getbyte(0)
443
+ str.each_char {|c| testa.putch(c)}
444
+ testa.repaint
445
+ 3.times { testa.handle_key KEY_DOWN }
446
+ testa.handle_key ?\C-a.getbyte(0)
447
+
448
+ str.each_char {|c| testa.putch(c)}
449
+ $message.value = "Wrapping textarea"
450
+ testa.repaint
451
+ throw(:menubarclose)
452
+ end
453
+ filemenu.add(item = RubyCurses::MenuItem.new("Wrap",'W'))
454
+ item.command(@form, texta) do |it, form, testa|
455
+ #testa.goto_start
456
+ testa.handle_key ?\C-a.getbyte(0)
457
+ testa.wrap_para
458
+ testa.repaint
459
+ throw(:menubarclose)
460
+ end
461
+ filemenu.add(item = RubyCurses::MenuItem.new("Exit",'X'))
462
+ item.command() {
463
+ #throw(:menubarclose);
464
+ throw(:close)
465
+ }
466
+ item = RubyCurses::CheckBoxMenuItem.new "Reverse"
467
+ # item.onvalue="On"
468
+ # item.offvalue="Off"
469
+ #item.checkbox.text "Labelcb"
470
+ #item.text="Labelcb"
471
+ # in next line, an explicit repaint is required since label is on another form.
472
+ item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' : 'normal'; label.attr(att); label.repaint}
473
+ @status_line = status_line :row => Ncurses.LINES-2
474
+ @status_line.command {
475
+ "F1 Help | F2 Menu | F3 View | F4 Shell | F5 Sh | %20s" % [$message.value]
476
+ }
477
+ row += 1 #2
478
+ ok_button = Button.new @form do
479
+ text "OK"
480
+ name "OK"
481
+ row row
482
+ col col
483
+ #attr 'reverse'
484
+ #highlight_background "white"
485
+ #highlight_foreground "blue"
486
+ mnemonic 'O'
487
+ end
488
+ ok_button.command() { |eve|
489
+ alert("Hope you enjoyed this demo ", {'title' => "Hello", :bgcolor => :blue, :color => :white})
490
+ sw = case @lookfeel
491
+ when :dialog
492
+ progress_dialog :color_pair => $reversecolor, :row_offset => 4, :col_offset => 5
493
+ else
494
+ status_window # at footer last 2 rows
495
+ end
496
+
497
+ sw.print "I am adding some stuff to list", "And testing out StatusWindow"
498
+ sleep 1.0
499
+ listb.list.insert 0, "hello ruby", "so long python", "farewell java", "RIP .Net"
500
+ sw.printstring 1,1, "And some more now ..."
501
+ sleep 0.5
502
+ listb.list.insert 0, "get milk", "make beds", "clean shark pond","sell summer house"
503
+ sleep 0.5
504
+ sw.print "This was a test of Window", "we are almost done now ..."
505
+ clock = %w[ | / - \ ]
506
+ listb.list.each_with_index { |e, index| sw.print e, clock[index%4]; sleep 0.1 }
507
+ sw.linger #@window
508
+ }
509
+
510
+ # using ampersand to set mnemonic
511
+ cancel_button = Button.new @form do
512
+ #variable $results
513
+ text "&Cancel"
514
+ row row
515
+ col col + 10
516
+ #attr 'reverse'
517
+ #highlight_background "white"
518
+ #highlight_foreground "blue"
519
+ #surround_chars ['{ ',' }'] ## change the surround chars
520
+ end
521
+ cancel_button.command { |aeve|
522
+ if @lookfeel == :dialog
523
+ ret = confirm("Do your really want to quit?")
524
+ else
525
+ ret = confirm_window("Do your really want to quit?")
526
+ end
527
+ if ret == :YES
528
+ throw(:close);
529
+ else
530
+ $message.value = "Quit aborted"
531
+ end
532
+ }
533
+ #col += 22
534
+ col += 15
535
+ require 'rbcurse/core/widgets/rprogress'
536
+ pbar = Progress.new @form, {:width => 20, :row => Ncurses.LINES-1, :col => Ncurses.COLS-20 ,
537
+ :bgcolor => 'white', :color => 'red', :name => "pbar"}
538
+ #len = 1
539
+ #pbar.fraction(len/100.0)
540
+ pbar.visible false
541
+
542
+
543
+ filemenu.add(item)
544
+ @mb.add(filemenu)
545
+ editmenu = RubyCurses::Menu.new "Edit"
546
+ item = RubyCurses::MenuItem.new "Cut"
547
+ editmenu.add(item)
548
+ item.accelerator = "Ctrl-X"
549
+ item=RubyCurses::MenuItem.new "Copy"
550
+ editmenu.add(item)
551
+ item.accelerator = "Ctrl-C"
552
+ item=RubyCurses::MenuItem.new "Paste"
553
+ editmenu.add(item)
554
+ item.accelerator = "Ctrl-V"
555
+ @mb.add(editmenu)
556
+ @mb.add(menu=RubyCurses::Menu.new("Others"))
557
+ #item=RubyCurses::MenuItem.new "Save","S"
558
+ item = RubyCurses::MenuItem.new "Options ..."
559
+ item.command() do |it|
560
+ require './testtabp'
561
+ tp = TestTabbedPane.new
562
+ tp.run
563
+ $message.value=$config_hash.inspect
564
+ $log.debug " returning with #{$config_hash}: #{$config_hash.inspect}"
565
+ end
566
+ menu.add(item)
567
+ item = RubyCurses::MenuItem.new "Options2 ..."
568
+ item.command() do |it|
569
+ require './newtabbedwindow'
570
+ tp = SetupTabbedPane.new
571
+ tp.run
572
+ $message.value=$config_hash.inspect
573
+ $log.debug " returning with #{$config_hash}: #{$config_hash.inspect}"
574
+ end
575
+ menu.add(item)
576
+ item = RubyCurses::MenuItem.new "Shell Command..."
577
+ item.command { shell_output }
578
+ menu.add(item)
579
+ savemenu = RubyCurses::Menu.new "Shell"
580
+ item = RubyCurses::MenuItem.new "Processes"
581
+ item.command { run_command "ps -l" }
582
+ savemenu.add(item)
583
+ item = RubyCurses::MenuItem.new "Files"
584
+ item.command { run_command "ls -l" }
585
+ savemenu.add(item)
586
+ item = RubyCurses::MenuItem.new "Disk"
587
+ item.command { run_command "df -h" }
588
+ savemenu.add(item)
589
+ menu.add(savemenu)
590
+
591
+ savemenu2 = RubyCurses::Menu.new "Git"
592
+ item = RubyCurses::MenuItem.new "Status"
593
+ item.command { run_command "git status" }
594
+ savemenu2.add(item)
595
+ item = RubyCurses::MenuItem.new "Diff"
596
+ item.command { run_command "git diff" }
597
+ savemenu2.add(item)
598
+ item = RubyCurses::MenuItem.new "Name"
599
+ item.command { run_command "git diff --name-status" }
600
+ savemenu2.add(item)
601
+ savemenu.add(savemenu2)
602
+
603
+ @mb.toggle_key = FFI::NCurses::KEY_F2
604
+ @form.set_menu_bar @mb
605
+
606
+ # END
607
+ @form.bind_key(FFI::NCurses::KEY_F3) {
608
+ require 'rbcurse/core/util/viewer'
609
+ RubyCurses::Viewer.view(path || "rbc13.log", :close_key => KEY_ENTER, :title => "<Enter> to close")
610
+ }
611
+ @form.bind_key(FFI::NCurses::KEY_F4) { shell_output }
612
+ @form.bind_key(FFI::NCurses::KEY_F5) { suspend }
613
+ @form.bind_key([?\C-x,?c]) { suspend }
614
+ @form.bind_key(?\M-!) { suspend }
615
+ @form.bind_key([?\C-x,?l]) { run_command "ls -al" }
616
+ @form.bind_key([?\C-x,?p]) { run_command "ps -l" }
617
+ @form.bind_key([?\C-x,?d]) { run_command "df -h" }
618
+ @form.bind_key([?\C-x,?d]) { run_command "git diff --name-status" }
619
+ @form.bind_key([?\C-x, ?s]) { run_command "git status" }
620
+ @form.bind_key([?\C-x,?w]) { run_command "git whatchanged" }
621
+ @form.bind_key(FFI::NCurses::KEY_F1) { display_app_help help_text() }
622
+ @form.repaint
623
+ @window.wrefresh
624
+ Ncurses::Panel.update_panels
625
+
626
+ # the main loop
627
+
628
+ while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
629
+ break if ch == ?\C-q.getbyte(0)
630
+ begin
631
+ @form.handle_key(ch)
632
+
633
+ rescue FieldValidationException => fve
634
+ alert fve.to_s
635
+
636
+ f = @form.get_current_field
637
+ # lets restore the value
638
+ if f.respond_to? :restore_original_value
639
+ f.restore_original_value
640
+ @form.repaint
641
+ end
642
+ $error_message.value = ""
643
+ rescue => err
644
+ $log.error( err) if err
645
+ $log.error(err.backtrace.join("\n")) if err
646
+ alert "Got an exception in test2: #{err} "
647
+ $error_message.value = ""
648
+ end
649
+
650
+ # this should be avoided, we should not muffle the exception and set a variable
651
+ # However, we have been doing that
652
+ if $error_message.get_value != ""
653
+ if @lookfeel == :dialog
654
+ alert($error_message, {:bgcolor => :red, 'color' => 'yellow'}) if $error_message.get_value != ""
655
+ else
656
+ print_error_message $error_message, {:bgcolor => :red, :color => :yellow}
657
+ end
658
+ $error_message.value = ""
659
+ end
660
+
661
+ @window.wrefresh
662
+ end # while loop
663
+ end # catch
664
+ rescue => ex
665
+ ensure
666
+ $log.debug " -==== EXCEPTION =====-"
667
+ $log.debug( ex) if ex
668
+ $log.debug(ex.backtrace.join("\n")) if ex
669
+ @window.destroy if !@window.nil?
670
+ VER::stop_ncurses
671
+ puts ex if ex
672
+ puts(ex.backtrace.join("\n")) if ex
673
+ end
674
+ end