rkumar-rbcurse 0.1.0

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 (52) hide show
  1. data/CHANGELOG +1577 -0
  2. data/README.txt +310 -0
  3. data/examples/qdfilechooser.rb +68 -0
  4. data/examples/rfe.rb +853 -0
  5. data/examples/rfe_renderer.rb +69 -0
  6. data/examples/test1.rb +242 -0
  7. data/examples/test2.rb +498 -0
  8. data/examples/testcombo.rb +95 -0
  9. data/examples/testkeypress.rb +61 -0
  10. data/examples/testmenu.rb +105 -0
  11. data/examples/testtable.rb +266 -0
  12. data/examples/testtabp.rb +106 -0
  13. data/examples/testtodo.rb +532 -0
  14. data/examples/viewtodo.rb +512 -0
  15. data/lib/rbcurse.rb +7 -0
  16. data/lib/rbcurse/action.rb +31 -0
  17. data/lib/rbcurse/applicationheader.rb +57 -0
  18. data/lib/rbcurse/celleditor.rb +120 -0
  19. data/lib/rbcurse/checkboxcellrenderer.rb +69 -0
  20. data/lib/rbcurse/colormap.rb +133 -0
  21. data/lib/rbcurse/comboboxcellrenderer.rb +45 -0
  22. data/lib/rbcurse/defaultlistselectionmodel.rb +49 -0
  23. data/lib/rbcurse/keylabelprinter.rb +143 -0
  24. data/lib/rbcurse/listcellrenderer.rb +99 -0
  25. data/lib/rbcurse/listkeys.rb +33 -0
  26. data/lib/rbcurse/listscrollable.rb +216 -0
  27. data/lib/rbcurse/listselectable.rb +67 -0
  28. data/lib/rbcurse/mapper.rb +108 -0
  29. data/lib/rbcurse/orderedhash.rb +77 -0
  30. data/lib/rbcurse/rcombo.rb +243 -0
  31. data/lib/rbcurse/rdialogs.rb +183 -0
  32. data/lib/rbcurse/rform.rb +845 -0
  33. data/lib/rbcurse/rinputdataevent.rb +36 -0
  34. data/lib/rbcurse/rlistbox.rb +804 -0
  35. data/lib/rbcurse/rmenu.rb +666 -0
  36. data/lib/rbcurse/rmessagebox.rb +325 -0
  37. data/lib/rbcurse/rpopupmenu.rb +754 -0
  38. data/lib/rbcurse/rtabbedpane.rb +259 -0
  39. data/lib/rbcurse/rtable.rb +1296 -0
  40. data/lib/rbcurse/rtextarea.rb +673 -0
  41. data/lib/rbcurse/rtextview.rb +335 -0
  42. data/lib/rbcurse/rwidget.rb +1731 -0
  43. data/lib/rbcurse/scrollable.rb +301 -0
  44. data/lib/rbcurse/selectable.rb +94 -0
  45. data/lib/rbcurse/table/tablecellrenderer.rb +85 -0
  46. data/lib/rbcurse/table/tabledatecellrenderer.rb +102 -0
  47. data/lib/ver/keyboard.rb +150 -0
  48. data/lib/ver/keyboard2.rb +170 -0
  49. data/lib/ver/ncurses.rb +102 -0
  50. data/lib/ver/window.rb +369 -0
  51. data/test/test_rbcurse.rb +0 -0
  52. metadata +117 -0
@@ -0,0 +1,69 @@
1
+ module RubyCurses
2
+
3
+ ##
4
+ # This is a basic list cell renderer that will render the to_s value of anything.
5
+ # Using alignment one can use for numbers too.
6
+ # However, for booleans it will print true and false. If editing, you may want checkboxes
7
+ class RfeRenderer < ListCellRenderer
8
+ def initialize text="", config={}, &block
9
+ super
10
+ @orig_bgcolor = @bgcolor
11
+ @orig_color = @color
12
+ @orig_attr = @attr
13
+ end
14
+ ##
15
+ ##
16
+ #
17
+ def repaint graphic, r=@row,c=@col, row_index=-1, value=@text, focussed=false, selected=false
18
+
19
+ @bgcolor = @orig_bgcolor
20
+ @color = @orig_color
21
+ @row_attr = @orig_attr
22
+ value = @parent.entries[row_index]
23
+ if value[0,1]=="/"
24
+ path = value.dup
25
+ else
26
+ path = @parent.cur_dir()+"/"+value
27
+ end
28
+ stat = File.stat(path)
29
+ if File.directory? path
30
+ @row_attr = Ncurses::A_BOLD
31
+ #@color = 'yellow'
32
+ end
33
+ value = format_string(value, path, stat)
34
+ super
35
+
36
+ end
37
+ GIGA_SIZE = 1073741824.0
38
+ MEGA_SIZE = 1048576.0
39
+ KILO_SIZE = 1024.0
40
+
41
+ # Return the file size with a readable style.
42
+ def readable_file_size(size, precision)
43
+ case
44
+ #when size == 1 : "1 B"
45
+ when size < KILO_SIZE : "%d B" % size
46
+ when size < MEGA_SIZE : "%.#{precision}f K" % (size / KILO_SIZE)
47
+ when size < GIGA_SIZE : "%.#{precision}f M" % (size / MEGA_SIZE)
48
+ else "%.#{precision}f G" % (size / GIGA_SIZE)
49
+ end
50
+ end
51
+ def date_format t
52
+ t.strftime "%Y/%m/%d"
53
+ end
54
+ def format_string fn, path,stat
55
+ max_len = 30
56
+ f = fn.dup
57
+ if File.directory? path
58
+ #"%-*s\t(dir)" % [max_len,f]
59
+ #f = "/"+f # disallows search on keypress
60
+ f = "/"+f
61
+ end
62
+ if f.size > max_len
63
+ f = f[0..max_len-1]
64
+ end
65
+ "%-*s %10s %s" % [max_len,f, readable_file_size(stat.size,1), date_format(stat.mtime)]
66
+ end
67
+ # ADD HERE
68
+ end
69
+ end
data/examples/test1.rb ADDED
@@ -0,0 +1,242 @@
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
+ #$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
9
+ require 'rubygems'
10
+ require 'ncurses'
11
+ require 'logger'
12
+ #require 'lib/rbcurse/mapper'
13
+ #require 'lib/rbcurse/keylabelprinter'
14
+ require 'rbcurse'
15
+ require 'rbcurse/rmessagebox'
16
+
17
+ if $0 == __FILE__
18
+ # Initialize curses
19
+ begin
20
+ # XXX update with new color and kb
21
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
22
+ $log = Logger.new("view.log")
23
+ $log.level = Logger::DEBUG
24
+
25
+ # @window = VER::Window.root_window
26
+
27
+
28
+ catch(:close) do
29
+ choice = ARGV[0] && ARGV[0].to_i || 3
30
+ $log.debug "START MESSAGE BOX TEST #{ARGV[0]}. choice==#{choice} ---------"
31
+ # need to pass a form, not window.
32
+ case choice
33
+ when 1:
34
+ @mb = RubyCurses::MessageBox.new do
35
+ title "Enter your name"
36
+ message "Enter your name"
37
+ type :list
38
+ button_type :ok_cancel
39
+ list %w[john tim lee wong rahul edward why chad andy]
40
+ list_selection_mode 'multiple'
41
+ default_values %w[ lee why ]
42
+
43
+ default_button 0
44
+ end
45
+ when 2:
46
+ @mb = RubyCurses::MessageBox.new do
47
+ title "Color selector"
48
+ message "Select a color"
49
+ type :custom
50
+ button_type :custom
51
+ buttons %w[&red &green &blue &yellow]
52
+ underlines [0,0,0,0]
53
+ default_button 0
54
+ end
55
+ when 3
56
+ config = {}
57
+ config["input_config"] = {}
58
+ config["input_config"]["chars_allowed"]=/[^xzq]/
59
+ config["input_config"]["valid_regex"]=/[A-Z][a-z]*/
60
+ @mb = RubyCurses::MessageBox.new nil, config do
61
+ title "Enter your name"
62
+ #message "Enter your first name. You are not permitted to enter x z or q and must enter a capital first"
63
+ message "Enter your first name. "
64
+ type :input
65
+ button_type :ok_cancel
66
+ default_value "Rahul"
67
+ end
68
+ when 4:
69
+ @form = RubyCurses::Form.new nil
70
+ field_list = []
71
+ titlelabel = RubyCurses::Label.new @form, {'text' => 'User', 'row'=>3, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white', 'mnemonic'=>'U'}
72
+ field_list << titlelabel
73
+ field = RubyCurses::Field.new @form do
74
+ name "url"
75
+ row 3
76
+ col 10
77
+ display_length 30
78
+ # set_buffer "http://"
79
+ set_label titlelabel
80
+ end
81
+ checkbutton = RubyCurses::CheckBox.new @form do
82
+ # variable $results
83
+ #value = true
84
+ onvalue "Selected cb "
85
+ offvalue "UNselected cb"
86
+ color 'black'
87
+ bgcolor 'white'
88
+ text "No &frames"
89
+ row 4
90
+ col 4
91
+ end
92
+ field_list << field
93
+ field_list << checkbutton
94
+ checkbutton = RubyCurses::CheckBox.new @form do
95
+ # variable $results
96
+ value true
97
+ color 'black'
98
+ bgcolor 'white'
99
+ text "Use &HTTP/1.0"
100
+ row 5
101
+ col 4
102
+ end
103
+ field_list << checkbutton
104
+ checkbutton = RubyCurses::CheckBox.new @form do
105
+ # variable $results
106
+ color 'black'
107
+ bgcolor 'white'
108
+ text "Use &passive FTP"
109
+ row 6
110
+ col 4
111
+ end
112
+ field_list << checkbutton
113
+ titlelabel = RubyCurses::Label.new @form, {'text' => 'Language', 'row'=>8, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white'}
114
+ field_list << titlelabel
115
+ $radio = RubyCurses::Variable.new
116
+ #$radio.update_command(colorlabel) {|tv, label| label.color tv.value}
117
+ radio1 = RubyCurses::RadioButton.new @form do
118
+ variable $radio
119
+ text "rub&y"
120
+ value "ruby"
121
+ color "red"
122
+ bgcolor 'white'
123
+ row 9
124
+ col 4
125
+ end
126
+ radio2 = RubyCurses::RadioButton.new @form do
127
+ variable $radio
128
+ text "python"
129
+ value "py&thon"
130
+ color "blue"
131
+ bgcolor 'white'
132
+ row 10
133
+ col 4
134
+ end
135
+ field_list << radio1
136
+ field_list << radio2
137
+ field.bind(:ENTER) do |f|
138
+ listconfig = {'bgcolor' => 'blue', 'color' => 'white'}
139
+ url_list= RubyCurses::ListDataModel.new(%w[john tim lee wong rahul edward _why chad andy])
140
+ pl = RubyCurses::PopupList.new do
141
+ # title "Enter URL "
142
+ row 4
143
+ col 10
144
+ width 30
145
+ #list url_list
146
+ list_data_model url_list
147
+ list_selection_mode 'single'
148
+ relative_to f
149
+ list_config listconfig
150
+ #default_values %w[ lee _why ]
151
+ bind :PRESS do |index|
152
+ field.set_buffer url_list[index]
153
+ end
154
+ end
155
+ end
156
+ @mb = RubyCurses::MessageBox.new @form do
157
+ #title "Color selector"
158
+ title "HTTP Configuration"
159
+ # message "Enter your name"
160
+ # type :custom
161
+ # buttons %w[red green blue yellow]
162
+ # underlines [0,0,0,0]
163
+ # type :input
164
+ # default_value "rahul"
165
+ #type :field_list
166
+ #field_list field_list
167
+ button_type :ok
168
+ default_button 0
169
+ end
170
+ when 5:
171
+ @form = RubyCurses::Form.new nil
172
+ label = RubyCurses::Label.new @form, {'text' => 'File', 'row'=>3, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white', 'mnemonic'=>'F'}
173
+ field = RubyCurses::Field.new @form do
174
+ name "file"
175
+ row 3
176
+ col 10
177
+ display_length 40
178
+ set_label label
179
+ end
180
+ flist = Dir.glob("*.*")
181
+ listb = RubyCurses::Listbox.new @form do
182
+ name "mylist"
183
+ row 5
184
+ col 10
185
+ width 40
186
+ height 10
187
+ list flist
188
+ title "File list"
189
+ title_attrib 'bold'
190
+ end
191
+ #listb.list.bind(:ENTER_ROW) { field.set_buffer listb.selected_item }
192
+ field.bind(:CHANGE) do |f|
193
+ flist = Dir.glob(f.getvalue+"*")
194
+ l = listb.list
195
+ l.remove_all
196
+ l.insert 0, *flist
197
+ end
198
+ @mb = RubyCurses::MessageBox.new @form do
199
+ title "Sample File Selector"
200
+ type :override
201
+ height 20
202
+ width 60
203
+ top 5
204
+ left 20
205
+ default_button 0
206
+ button_type :ok_cancel
207
+
208
+ end
209
+ $log.debug "MBOX :selected #{listb.selected_item}"
210
+ end
211
+
212
+ $log.debug "MBOX :selected button index #{@mb.selected_index} "
213
+ $log.debug "MBOX :input val #{@mb.input_value} "
214
+ # $log.debug "row : #{@form.row} "
215
+ # $log.debug "col : #{@form.col} "
216
+ # $log.debug "Config : #{@form.config.inspect} "
217
+ # @form.configure "row", 23
218
+ # @form.configure "col", 83
219
+ # $log.debug "row : #{@form.row} "
220
+ # x = @form.row
221
+ # @form.depth 21
222
+ # @form.depth = 22
223
+ # @form.depth 24
224
+ # @form.depth = 25
225
+ # $log.debug "col : #{@form.col} "
226
+ # $log.debug "config : #{@form.config.inspect} "
227
+ # $log.debug "row : #{@form.configure('row')} "
228
+ #$log.debug "mrgods : #{@form.public_methods.sort.inspect}"
229
+ #while((ch = @window.getchar()) != ?q )
230
+ # @window.wrefresh
231
+ #end
232
+ end
233
+ rescue => ex
234
+ ensure
235
+ @window.destroy unless @window.nil?
236
+ VER::stop_ncurses
237
+ p ex if ex
238
+ p(ex.backtrace.join("\n")) if ex
239
+ $log.debug( ex) if ex
240
+ $log.debug(ex.backtrace.join("\n")) if ex
241
+ end
242
+ end
data/examples/test2.rb ADDED
@@ -0,0 +1,498 @@
1
+ #$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
2
+ # this program tests out various widgets.
3
+ require 'rubygems'
4
+ require 'ncurses'
5
+ require 'logger'
6
+ require 'rbcurse'
7
+ require 'rbcurse/rwidget'
8
+ #require 'rbcurse/rform'
9
+ require 'rbcurse/rtextarea'
10
+ require 'rbcurse/rtextview'
11
+ require 'rbcurse/rmenu'
12
+ require 'rbcurse/rcombo'
13
+ require 'rbcurse/listcellrenderer'
14
+ require 'rbcurse/checkboxcellrenderer'
15
+ require 'rbcurse/comboboxcellrenderer'
16
+ require 'rbcurse/celleditor'
17
+ require 'qdfilechooser'
18
+ require 'rbcurse/rlistbox'
19
+ require 'rbcurse/rmessagebox'
20
+ if $0 == __FILE__
21
+ include RubyCurses
22
+
23
+ begin
24
+ # Initialize curses
25
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
26
+ $log = Logger.new("view.log")
27
+ $log.level = Logger::DEBUG
28
+
29
+ @window = VER::Window.root_window
30
+ # Initialize few color pairs
31
+ # Create the window to be associated with the form
32
+ # Un post form and free the memory
33
+
34
+ catch(:close) do
35
+ colors = Ncurses.COLORS
36
+ $log.debug "START #{colors} colors ---------"
37
+ @form = Form.new @window
38
+ @form.window.printstring 0, 25, "Demo of Ruby Curses Widgets", $normalcolor, 'reverse'
39
+ r = 1; fc = 12;
40
+ mnemonics = %w[ n l r p]
41
+ %w[ name line regex password].each_with_index do |w,i|
42
+ field = Field.new @form do
43
+ name w
44
+ row r
45
+ col fc
46
+ display_length 30
47
+ #set_buffer "abcd "
48
+ set_label Label.new @form, {'text' => w, 'color'=>'cyan','mnemonic'=> mnemonics[i]}
49
+ end
50
+ r += 1
51
+ end
52
+
53
+ $message = Variable.new
54
+ $message.value = "Message Comes Here"
55
+ message_label = RubyCurses::Label.new @form, {'text_variable' => $message, "name"=>"message_label","row" => 27, "col" => 1, "display_length" => 60, "height" => 2, 'color' => 'cyan'}
56
+
57
+ $results = Variable.new
58
+ $results.value = "A variable"
59
+ var = RubyCurses::Label.new @form, {'text_variable' => $results, "row" => r, "col" => fc}
60
+ r += 1
61
+ mylist = []
62
+ 0.upto(100) { |v| mylist << "#{v} scrollable data" }
63
+ $listdata = Variable.new mylist
64
+ listb = Listbox.new @form do
65
+ name "mylist"
66
+ row r
67
+ col 1
68
+ width 40
69
+ height 10
70
+ # list mylist
71
+ list_variable $listdata
72
+ #selection_mode :SINGLE
73
+ show_selector true
74
+ row_selected_symbol "[X] "
75
+ row_unselected_symbol "[ ] "
76
+ title "A long list"
77
+ title_attrib 'reverse'
78
+ cell_editing_allowed true
79
+ end
80
+ #listb.insert 55, "hello ruby", "so long python", "farewell java", "RIP .Net"
81
+ #$listdata.value.insert 55, "hello ruby", "so long python", "farewell java", "RIP .Net"
82
+ listb.list_data_model.insert 55, "hello ruby", "so long python", "farewell java", "RIP .Net", "hi lisp", "hi perl6"
83
+ texta = TextArea.new @form do
84
+ name "mytext"
85
+ row 1
86
+ col 52
87
+ width 40
88
+ height 14
89
+ title "Editable box"
90
+ title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
91
+ print_footer true
92
+ bind(:CHANGE){|e| $message.value = e.to_s+" CP:"+e.source.curpos.to_s }
93
+ end
94
+ 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."
95
+ texta << "Let me not defer it or neglect it, for I shall not pass this way again."
96
+ texta << " "
97
+ texta << " F1 to exit. or click cancel button"
98
+ texta << " Or alt-c"
99
+
100
+ alist = [true, false, true, false, true, false, true, false, true]
101
+ cblist = Variable.new alist
102
+ listcb = Listbox.new @form do
103
+ name "cblist"
104
+ row 1
105
+ col 96
106
+ width 8
107
+ height 10
108
+ # list mylist
109
+ list_variable cblist
110
+ #selection_mode :SINGLE
111
+ title "Checklist"
112
+ title_attrib 'reverse'
113
+ cell_renderer RubyCurses::CheckBoxCellRenderer.new nil, {"parent" => self, "display_length"=> @width-2}
114
+ cell_editing_allowed true
115
+ cell_editor RubyCurses::CellEditor.new(RubyCurses::CheckBox.new nil, {"focusable"=>false, "visible"=>false})
116
+ end
117
+ colist = ["Todo", "WIP", "Fin", "Cancel", "Postp"]
118
+ colistdata = ["Todo", "Todo", "WIP","WIP", "Postp", "Cancel","Cancel", "Postp"]
119
+ colistv = Variable.new colistdata
120
+ listcb = Listbox.new @form do
121
+ name "colist"
122
+ row 16
123
+ col 96
124
+ width 12
125
+ height 10
126
+ # list mylist
127
+ list_variable colistv
128
+ #selection_mode :SINGLE
129
+ title "Status"
130
+ title_attrib 'bold'
131
+ cell_editing_allowed true
132
+ cell_renderer RubyCurses::ComboBoxCellRenderer.new nil, {"parent" => self, "display_length"=> width()-2}
133
+ cell_editor RubyCurses::CellEditor.new(RubyCurses::ComboBox.new nil, {"focusable"=>false, "visible"=>false, "list"=>colist, "display_length"=>width()-2})
134
+ end
135
+ #listcb.cell_editor.component.form = @form
136
+
137
+ @textview = TextView.new @form do
138
+ name "myView"
139
+ row 16
140
+ col 52
141
+ width 40
142
+ height 10
143
+ title "README.txt"
144
+ title_attrib 'bold'
145
+ print_footer true
146
+ footer_attrib 'bold'
147
+ end
148
+ content = File.open("../README.txt","r").readlines
149
+ @textview.set_content content #, :WRAP_WORD
150
+ @textview.top_row 21
151
+
152
+ # just for demo, lets scroll the text view as we scroll this.
153
+ listb.bind(:ENTER_ROW, @textview) { |alist, tview| tview.top_row alist.current_index }
154
+
155
+ # just for demo, lets scroll the text view to the line you enter
156
+ @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) }
157
+ @form.by_name["regex"].bind(:LEAVE, @textview) { |fld, tv| tv.top_row(tv.find_first_match(fld.getvalue)) }
158
+ @form.by_name["regex"].bind(:CHANGED) { |fld|
159
+ $message.value = "REGEX CHANGED!!! #{fld.getvalue} " }
160
+ row = 17
161
+ col = 2
162
+ align = ComboBox.new @form do
163
+ name "combo"
164
+ row row
165
+ col fc
166
+ display_length 10
167
+ editable false
168
+ list %w[left right center]
169
+ set_label Label.new @form, {'text' => "Align", 'color'=>'cyan','col'=>1, "mnemonic"=>"I"}
170
+ list_config 'color' => 'yellow', 'bgcolor'=>'red', 'height' => 4
171
+ end
172
+
173
+ list = ListDataModel.new( %w[spotty tiger panther jaguar leopard ocelot lion])
174
+ list.bind(:LIST_DATA_EVENT) { |lde| $message.value = lde.to_s; $log.debug " STA: #{$message.value} #{lde}" }
175
+ list.bind(:ENTER_ROW) { |obj| $message.value = "ENTER_ROW :#{obj.current_index} : #{obj.selected_item} "; $log.debug " ENTER_ROW: #{$message.value} , #{obj}" }
176
+
177
+ row += 1
178
+ combo1 = ComboBox.new @form do
179
+ name "combo1"
180
+ row row
181
+ col fc
182
+ display_length 10
183
+ editable true
184
+ list_data_model list
185
+ set_label Label.new @form, {'text' => "Edit Combo",'color'=>'cyan','col'=>1}
186
+ list_config 'color' => 'white', 'bgcolor'=>'blue', 'max_visible_items' => 6, 'height' => 7
187
+ end
188
+ row += 1
189
+ checkbutton = CheckBox.new @form do
190
+ variable $results
191
+ #value = true
192
+ onvalue "Selected bold "
193
+ offvalue "UNselected bold"
194
+ text "Bold attribute "
195
+ display_length 18 # helps when right aligning
196
+ row row
197
+ col col
198
+ mnemonic 'B'
199
+ end
200
+ row += 1
201
+ @cb_rev = Variable.new false # related to checkbox reverse
202
+ cbb = @cb_rev
203
+ checkbutton1 = CheckBox.new @form do
204
+ variable cbb # $cb_rev
205
+ #value = true
206
+ onvalue "Selected reverse "
207
+ offvalue "UNselected reverse"
208
+ text "Reverse attribute "
209
+ display_length 18
210
+ row row
211
+ col col
212
+ mnemonic 'R'
213
+ end
214
+ row += 1
215
+ togglebutton = ToggleButton.new @form do
216
+ value true
217
+ onvalue " Toggle Down "
218
+ offvalue " Untoggle "
219
+ row row
220
+ col col
221
+ mnemonic 'T'
222
+ #underline 0
223
+ end
224
+ # a special case required since another form (combo popup also modifies)
225
+ $message.update_command() { message_label.repaint }
226
+
227
+ @form.by_name["line"].display_length = 3
228
+ @form.by_name["line"].maxlen = 3
229
+ @form.by_name["line"].set_buffer "24"
230
+ @form.by_name["name"].set_buffer "Not focusable"
231
+ @form.by_name["name"].set_focusable(false)
232
+ @form.by_name["line"].chars_allowed = /\d/
233
+ #@form.by_name["regex"].type(:ALPHA)
234
+ @form.by_name["regex"].valid_regex(/^[A-Z][a-z]*/)
235
+ @form.by_name["regex"].set_buffer "SYNOP"
236
+ @form.by_name["regex"].display_length = 10
237
+ @form.by_name["regex"].maxlen = 20
238
+ #@form.by_name["regex"].bgcolor 'cyan'
239
+ @form.by_name["password"].set_buffer ""
240
+ @form.by_name["password"].show '*'
241
+ @form.by_name["password"].color 'red'
242
+ #@form.by_name["password"].bgcolor 'blue'
243
+ @form.by_name["password"].values(%w[scotty tiger secret pass qwerty])
244
+ @form.by_name["password"].null_allowed true
245
+
246
+ # a form level event, whenever any widget is focussed
247
+ @form.bind(:ENTER) { |f| f.label && f.label.bgcolor = 'red' if f.respond_to? :label}
248
+ @form.bind(:LEAVE) { |f| f.label && f.label.bgcolor = 'black' if f.respond_to? :label}
249
+
250
+ row += 1
251
+ colorlabel = Label.new @form, {'text' => "Select a color:", "row" => row, "col" => col, "color"=>"cyan", "mnemonic" => 'S'}
252
+ $radio = Variable.new
253
+ $radio.update_command(colorlabel) {|tv, label| label.color tv.value; }
254
+ $radio.update_command() {|tv| message_label.color tv.value; align.bgcolor tv.value; combo1.bgcolor tv.value}
255
+
256
+ # whenever updated set colorlabel and messagelabel to bold
257
+ $results.update_command(colorlabel,checkbutton) {|tv, label, cb| attrs = cb.value ? 'bold' : nil; label.attr(attrs); message_label.attr(attrs)}
258
+
259
+ align.bind(:ENTER_ROW) {|fld| message_label.justify fld.getvalue}
260
+ align.bind(:ENTER_ROW) {|fld|
261
+ if fld.getvalue == 'right'
262
+ checkbutton1.align_right true
263
+ checkbutton.align_right true
264
+ else
265
+ checkbutton1.align_right false
266
+ checkbutton.align_right false
267
+ end
268
+ }
269
+
270
+ # whenever updated set colorlabel and messagelabel to reverse
271
+ @cb_rev.update_command(colorlabel,checkbutton1) {|tv, label, cb| attrs = cb.value ? 'reverse' : nil; label.attr(attrs); message_label.attr(attrs)}
272
+ row += 1
273
+ radio1 = RadioButton.new @form do
274
+ variable $radio
275
+ text "red"
276
+ value "red"
277
+ color "red"
278
+ display_length 18 # helps when right aligning
279
+ row row
280
+ col col
281
+ end
282
+ radio11 = RadioButton.new @form do
283
+ variable $radio
284
+ text "c&yan"
285
+ value "cyan"
286
+ color "cyan"
287
+ display_length 18 # helps when right aligning
288
+ row row
289
+ col col+24
290
+ end
291
+ row += 1
292
+ radio2 = RadioButton.new @form do
293
+ variable $radio
294
+ text "&green"
295
+ value "green"
296
+ color "green"
297
+ display_length 18 # helps when right aligning
298
+ row row
299
+ col col
300
+ end
301
+ radio22 = RadioButton.new @form do
302
+ variable $radio
303
+ text "magenta"
304
+ value "magenta"
305
+ color "magenta"
306
+ display_length 18 # helps when right aligning
307
+ row row
308
+ col col+24
309
+ end
310
+ colorlabel.label_for radio1
311
+ align.bind(:ENTER_ROW) {|fld|
312
+ if fld.getvalue == 'right'
313
+ radio1.align_right true
314
+ radio2.align_right true
315
+ radio11.align_right true
316
+ radio22.align_right true
317
+ else
318
+ radio1.align_right false
319
+ radio2.align_right false
320
+ radio11.align_right false
321
+ radio22.align_right false
322
+ end
323
+ }
324
+
325
+ @mb = RubyCurses::MenuBar.new
326
+ filemenu = RubyCurses::Menu.new "File"
327
+ filemenu.add(item = RubyCurses::MenuItem.new("Open",'O'))
328
+ item.command(@form) {|it, form| $message.value = "Open called on menu bar";
329
+ fchooser = QDFileChooser.new
330
+ option = fchooser.show_open_dialog
331
+ $message.value = "File Selection #{option}, #{fchooser.get_selected_file}"
332
+ if option == :OK
333
+ filesel = fchooser.get_selected_file
334
+ if !filesel.nil?
335
+ texta.remove_all
336
+ content = File.open(filesel,"r").readlines
337
+ content.each do |line|
338
+ texta << line
339
+ end
340
+ end
341
+ end
342
+ }
343
+
344
+ filemenu.insert_separator 1
345
+ filemenu.add(RubyCurses::MenuItem.new "New",'N')
346
+ filemenu.add(item = RubyCurses::MenuItem.new("Save",'S'))
347
+ item.command() do |it|
348
+ filename = get_string("Please enter file to save in", 20, "t.t")
349
+ $message.value = "file: #{filename}"
350
+ filename ||= "tmpzzzz.tmp"
351
+ str = texta.to_s
352
+ File.open(filename, 'w') {|f| f.write(str) }
353
+ $message.value = " written #{str.length} bytes to file: #{filename}"
354
+ end
355
+ filemenu.add(item = RubyCurses::MenuItem.new("Test",'T'))
356
+ item.command(@form, texta) do |it, form, testa|
357
+ $message.value = "Testing textarea"
358
+ str = "Hello there good friends and fellow rubyists. Here is a textarea that I am testing out with"
359
+ str << " some long data, to see how it acts, how the wrapping takes place. Sit back and enjoy the "
360
+ str << " bugs as they crop up."
361
+ testa.goto_start
362
+ #testa.cursor_bol
363
+ testa.handle_key ?\C-a # bol
364
+ str.each_char {|c| testa.putch(c)}
365
+ testa.repaint
366
+ testa.handle_key KEY_DOWN # down
367
+ testa.handle_key KEY_DOWN # down
368
+ testa.handle_key KEY_DOWN # down
369
+ testa.handle_key ?\C-a # bol
370
+ #testa.cursor_bol
371
+ str.each_char {|c| testa.putch(c)}
372
+ $message.value = "Wrapping textarea"
373
+ testa.repaint
374
+ throw(:menubarclose)
375
+ end
376
+ filemenu.add(item = RubyCurses::MenuItem.new("Wrap",'W'))
377
+ item.command(@form, texta) do |it, form, testa|
378
+ #testa.goto_start
379
+ testa.handle_key ?\C-a # bol
380
+ testa.wrap_para
381
+ testa.repaint
382
+ throw(:menubarclose)
383
+ end
384
+ filemenu.add(item = RubyCurses::MenuItem.new("Exit",'X'))
385
+ item.command() {
386
+ #throw(:menubarclose);
387
+ throw(:close)
388
+ }
389
+ item = RubyCurses::CheckBoxMenuItem.new "Reverse"
390
+ # item.onvalue="On"
391
+ # item.offvalue="Off"
392
+ #item.checkbox.text "Labelcb"
393
+ #item.text="Labelcb"
394
+ # in next line, an explicit repaint is required since label is on another form.
395
+ item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' : nil; label.attr(att); label.repaint}
396
+
397
+ row += 2
398
+ ok_button = Button.new @form do
399
+ text "OK"
400
+ name "OK"
401
+ row row
402
+ col col
403
+ mnemonic 'O'
404
+ end
405
+ ok_button.command { |form|
406
+ alert("About to dump data into log file!")
407
+ form.dump_data; $message.value = "Dumped data to log file"
408
+ listb.list.insert 0, "hello ruby", "so long python", "farewell java", "RIP .Net"
409
+ }
410
+
411
+ # using ampersand to set mnemonic
412
+ cancel_button = Button.new @form do
413
+ #variable $results
414
+ text "&Cancel"
415
+ row row
416
+ col col + 10
417
+ #surround_chars ['{ ',' }'] ## change the surround chars
418
+ end
419
+ cancel_button.command { |form|
420
+ if confirm("Do your really want to quit?")== :YES
421
+ throw(:close);
422
+ else
423
+ $message.value = "Quit aborted"
424
+ end
425
+ }
426
+
427
+
428
+ filemenu.add(item)
429
+ @mb.add(filemenu)
430
+ editmenu = RubyCurses::Menu.new "Edit"
431
+ item = RubyCurses::MenuItem.new "Cut"
432
+ editmenu.add(item)
433
+ item.accelerator = "Ctrl-X"
434
+ item=RubyCurses::MenuItem.new "Copy"
435
+ editmenu.add(item)
436
+ item.accelerator = "Ctrl-C"
437
+ item=RubyCurses::MenuItem.new "Paste"
438
+ editmenu.add(item)
439
+ item.accelerator = "Ctrl-V"
440
+ @mb.add(editmenu)
441
+ @mb.add(menu=RubyCurses::Menu.new("Others"))
442
+ #item=RubyCurses::MenuItem.new "Save","S"
443
+ item = RubyCurses::MenuItem.new "Options"
444
+ item.command() do |it|
445
+ require 'testtabp'
446
+ tp = TestTabbedPane.new
447
+ tp.run
448
+ $message.value=$config_hash.inspect
449
+ $log.debug " returning with #{$config_hash}: #{$config_hash.inspect}"
450
+ end
451
+ menu.add(item)
452
+ item = RubyCurses::MenuItem.new "Config"
453
+ menu.add(item)
454
+ item = RubyCurses::MenuItem.new "Tables"
455
+ menu.add(item)
456
+ savemenu = RubyCurses::Menu.new "EditM"
457
+ item = RubyCurses::MenuItem.new "CutM"
458
+ savemenu.add(item)
459
+ item = RubyCurses::MenuItem.new "DeleteM"
460
+ savemenu.add(item)
461
+ item = RubyCurses::MenuItem.new "PasteM"
462
+ savemenu.add(item)
463
+ menu.add(savemenu)
464
+
465
+ savemenu2 = RubyCurses::Menu.new "EditM2"
466
+ item = RubyCurses::MenuItem.new "CutM2"
467
+ savemenu2.add(item)
468
+ item = RubyCurses::MenuItem.new "DeleteM2"
469
+ savemenu2.add(item)
470
+ item = RubyCurses::MenuItem.new "PasteM2"
471
+ savemenu2.add(item)
472
+ savemenu.add(savemenu2)
473
+ # 2008-12-20 13:06 no longer hardcoding toggle key of menu_bar.
474
+ @mb.toggle_key = KEY_F2
475
+ @form.set_menu_bar @mb
476
+ #@cell = CellRenderer.new "Hello", {"col" => 1, "row"=>29, "justify"=>:right, "display_length" => 30}
477
+ # END
478
+ @form.repaint
479
+ @window.wrefresh
480
+ Ncurses::Panel.update_panels
481
+ while((ch = @window.getchar()) != KEY_F1 )
482
+ #@cell.repaint @form.window, 29,1, "ok #{ch} pressed!"
483
+ #@cell.repaint @form.window, 29,45, "#{ch} pressed!"
484
+ @form.handle_key(ch)
485
+ #@form.repaint
486
+ @window.wrefresh
487
+ end
488
+ end
489
+ rescue => ex
490
+ ensure
491
+ @window.destroy if !@window.nil?
492
+ VER::stop_ncurses
493
+ p ex if ex
494
+ p(ex.backtrace.join("\n")) if ex
495
+ $log.debug( ex) if ex
496
+ $log.debug(ex.backtrace.join("\n")) if ex
497
+ end
498
+ end