rbhex-core 1.0.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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/CHANGELOG +2000 -0
  4. data/LICENSE +56 -0
  5. data/README.md +44 -0
  6. data/examples/abasiclist.rb +179 -0
  7. data/examples/alpmenu.rb +50 -0
  8. data/examples/app.sample +19 -0
  9. data/examples/atree.rb +100 -0
  10. data/examples/bline.rb +136 -0
  11. data/examples/common/file.rb +45 -0
  12. data/examples/data/README.markdown +9 -0
  13. data/examples/data/brew.txt +38 -0
  14. data/examples/data/color.2 +37 -0
  15. data/examples/data/gemlist.txt +60 -0
  16. data/examples/data/lotr.txt +12 -0
  17. data/examples/data/ports.txt +136 -0
  18. data/examples/data/table.txt +37 -0
  19. data/examples/data/tasks.csv +88 -0
  20. data/examples/data/tasks.txt +27 -0
  21. data/examples/data/todo.txt +10 -0
  22. data/examples/data/todo.txt.bak +10 -0
  23. data/examples/data/todocsv.csv +28 -0
  24. data/examples/data/unix1.txt +21 -0
  25. data/examples/data/unix2.txt +11 -0
  26. data/examples/dbdemo.rb +502 -0
  27. data/examples/dirtree.rb +94 -0
  28. data/examples/newtabbedwindow.rb +100 -0
  29. data/examples/newtesttabp.rb +92 -0
  30. data/examples/tabular.rb +146 -0
  31. data/examples/tasks.rb +178 -0
  32. data/examples/term2.rb +84 -0
  33. data/examples/testbuttons.rb +296 -0
  34. data/examples/testcombo.rb +102 -0
  35. data/examples/testfields.rb +195 -0
  36. data/examples/testkeypress.rb +72 -0
  37. data/examples/testlistbox.rb +170 -0
  38. data/examples/testmessagebox.rb +140 -0
  39. data/examples/testprogress.rb +116 -0
  40. data/examples/testree.rb +106 -0
  41. data/examples/testwsshortcuts.rb +66 -0
  42. data/examples/testwsshortcuts2.rb +128 -0
  43. data/lib/rbhex.rb +6 -0
  44. data/lib/rbhex/core/docs/index.txt +73 -0
  45. data/lib/rbhex/core/include/action.rb +80 -0
  46. data/lib/rbhex/core/include/actionmanager.rb +49 -0
  47. data/lib/rbhex/core/include/appmethods.rb +214 -0
  48. data/lib/rbhex/core/include/bordertitle.rb +48 -0
  49. data/lib/rbhex/core/include/chunk.rb +203 -0
  50. data/lib/rbhex/core/include/io.rb +553 -0
  51. data/lib/rbhex/core/include/listbindings.rb +74 -0
  52. data/lib/rbhex/core/include/listcellrenderer.rb +140 -0
  53. data/lib/rbhex/core/include/listeditable.rb +317 -0
  54. data/lib/rbhex/core/include/listscrollable.rb +663 -0
  55. data/lib/rbhex/core/include/listselectable.rb +271 -0
  56. data/lib/rbhex/core/include/multibuffer.rb +83 -0
  57. data/lib/rbhex/core/include/orderedhash.rb +77 -0
  58. data/lib/rbhex/core/include/ractionevent.rb +73 -0
  59. data/lib/rbhex/core/include/rchangeevent.rb +27 -0
  60. data/lib/rbhex/core/include/rhistory.rb +95 -0
  61. data/lib/rbhex/core/include/rinputdataevent.rb +47 -0
  62. data/lib/rbhex/core/include/vieditable.rb +172 -0
  63. data/lib/rbhex/core/include/widgetmenu.rb +66 -0
  64. data/lib/rbhex/core/system/colormap.rb +165 -0
  65. data/lib/rbhex/core/system/keyboard.rb +150 -0
  66. data/lib/rbhex/core/system/keydefs.rb +30 -0
  67. data/lib/rbhex/core/system/ncurses.rb +236 -0
  68. data/lib/rbhex/core/system/panel.rb +162 -0
  69. data/lib/rbhex/core/system/window.rb +913 -0
  70. data/lib/rbhex/core/util/ansiparser.rb +119 -0
  71. data/lib/rbhex/core/util/app.rb +1228 -0
  72. data/lib/rbhex/core/util/basestack.rb +410 -0
  73. data/lib/rbhex/core/util/bottomline.rb +1859 -0
  74. data/lib/rbhex/core/util/colorparser.rb +77 -0
  75. data/lib/rbhex/core/util/focusmanager.rb +31 -0
  76. data/lib/rbhex/core/util/padreader.rb +192 -0
  77. data/lib/rbhex/core/util/rcommandwindow.rb +604 -0
  78. data/lib/rbhex/core/util/rdialogs.rb +574 -0
  79. data/lib/rbhex/core/util/viewer.rb +149 -0
  80. data/lib/rbhex/core/util/widgetshortcuts.rb +506 -0
  81. data/lib/rbhex/core/version.rb +5 -0
  82. data/lib/rbhex/core/widgets/applicationheader.rb +103 -0
  83. data/lib/rbhex/core/widgets/box.rb +58 -0
  84. data/lib/rbhex/core/widgets/divider.rb +310 -0
  85. data/lib/rbhex/core/widgets/keylabelprinter.rb +194 -0
  86. data/lib/rbhex/core/widgets/rcombo.rb +253 -0
  87. data/lib/rbhex/core/widgets/rcontainer.rb +415 -0
  88. data/lib/rbhex/core/widgets/rlink.rb +30 -0
  89. data/lib/rbhex/core/widgets/rlist.rb +696 -0
  90. data/lib/rbhex/core/widgets/rmenu.rb +958 -0
  91. data/lib/rbhex/core/widgets/rmenulink.rb +22 -0
  92. data/lib/rbhex/core/widgets/rmessagebox.rb +387 -0
  93. data/lib/rbhex/core/widgets/rprogress.rb +118 -0
  94. data/lib/rbhex/core/widgets/rtabbedpane.rb +634 -0
  95. data/lib/rbhex/core/widgets/rtabbedwindow.rb +70 -0
  96. data/lib/rbhex/core/widgets/rtextarea.rb +960 -0
  97. data/lib/rbhex/core/widgets/rtextview.rb +739 -0
  98. data/lib/rbhex/core/widgets/rtree.rb +768 -0
  99. data/lib/rbhex/core/widgets/rwidget.rb +3277 -0
  100. data/lib/rbhex/core/widgets/scrollbar.rb +143 -0
  101. data/lib/rbhex/core/widgets/statusline.rb +113 -0
  102. data/lib/rbhex/core/widgets/tabular.rb +264 -0
  103. data/lib/rbhex/core/widgets/tabularwidget.rb +1142 -0
  104. data/lib/rbhex/core/widgets/textpad.rb +995 -0
  105. data/lib/rbhex/core/widgets/tree/treecellrenderer.rb +150 -0
  106. data/lib/rbhex/core/widgets/tree/treemodel.rb +428 -0
  107. data/rbhex-core.gemspec +32 -0
  108. metadata +172 -0
@@ -0,0 +1,195 @@
1
+ require 'logger'
2
+ require 'rbhex'
3
+ require 'rbhex/core/include/appmethods.rb'
4
+ def help_text
5
+ <<-eos
6
+ FIELD HELP
7
+
8
+ This is some help text for Fields
9
+
10
+ Name is non-focusable
11
+ Line takes numbers from 1 to 200
12
+ Regex takes only alpha
13
+ Password takes only scotty or tiger or pass or qwerty, and maybe left blank
14
+
15
+ Use Alt (meta) with the highlighted character to jump to that field.
16
+ Alt-m goes to line, Alt-p to password.
17
+
18
+ Notice how the field label becomes red when focused (as in Pine/Alpine). This uses
19
+ the event :ENTER and :LEAVE
20
+
21
+
22
+
23
+ F10 - Exit application (also C-q)
24
+ Alt-! - Drop to shell
25
+ C-x c - Drop to shell
26
+ C-x l - list of files
27
+ C-x p - process list
28
+ C-x d - disk usage list
29
+ C-x s - Git status
30
+ C-x w - Git whatchanged
31
+ Alt-x - Command mode (<tab> to see commands and select)
32
+
33
+ F3 - View log
34
+ F4 - prompt for unix command and display in viewer
35
+ F5 - Drop to shell
36
+
37
+
38
+ -----------------------------------------------------------------------
39
+ eos
40
+ end
41
+ if $0 == __FILE__
42
+
43
+ include RubyCurses
44
+ include RubyCurses::Utils
45
+
46
+ begin
47
+ # Initialize curses
48
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
49
+ path = File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")
50
+ file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
51
+ $log = Logger.new(path)
52
+ $log.level = Logger::DEBUG
53
+
54
+ @lookfeel = :classic # :dialog # or :classic
55
+
56
+ @window = VER::Window.root_window
57
+ # Initialize few color pairs
58
+ # Create the window to be associated with the form
59
+ # Un post form and free the memory
60
+
61
+ catch(:close) do
62
+ colors = Ncurses.COLORS
63
+ $log.debug "START #{colors} colors testfield.rb --------- #{@window} "
64
+ @form = Form.new @window
65
+ title = (" "*30) + "Demo of Field (F10 quits, F1 help) " + Rbhex::Core::VERSION
66
+ Label.new @form, {:text => title, :row => 1, :col => 0, :color => :green, :bgcolor => :black}
67
+ r = 3; fc = 12;
68
+ mnemonics = %w[ n l r p]
69
+ %w[ name line regex password].each_with_index do |w,i|
70
+ field = Field.new @form do
71
+ name w
72
+ row r
73
+ col fc
74
+ display_length 30
75
+ #set_buffer "abcd "
76
+ set_label Label.new @form, {:text => w, :color=> :cyan, :mnemonic => mnemonics[i]}
77
+ end
78
+ r += 1
79
+ end
80
+
81
+ f = @form.by_name["line"]
82
+ f.display_length(3).set_buffer(24).valid_range(1..200).
83
+ maxlen(3).
84
+ type(:integer)
85
+
86
+ @form.by_name["name"].set_buffer( "Not focusable").
87
+ set_focusable(false)
88
+
89
+ @form.by_name["regex"].valid_regex(/^[A-Z][a-z]*/).
90
+ set_buffer( "SYNOP").
91
+ display_length(10).
92
+ maxlen = 20
93
+
94
+ @form.by_name["password"].set_buffer("").
95
+ show('*').
96
+ color(:red).
97
+ values(%w[scotty tiger secret pass qwerty]).
98
+ null_allowed true
99
+
100
+ r += 3
101
+ l1 = Label.new @form, :name => "profile", :attr => 'bold', :text => "Profile", :row => r, :col => fc
102
+ r += 1
103
+ f1 = Field.new @form, :name => "name1", :maxlen => 20, :display_length => 20, :bgcolor => :white,
104
+ :color => :black, :text => "abc", :label => ' Name: ', :row => r, :col => fc
105
+ r += 1
106
+ f2 = Field.new @form, :name => "email", :display_length => 20, :bgcolor => :white,
107
+ :color => :blue, :text => "me@google.com", :label => ' Email: ', :row => r, :col => fc
108
+ r += 3
109
+ f3 = Field.new @form
110
+ f3.name("mobile").display_length(20).bgcolor(:white).color(:black).
111
+ text("").label(' Mobile: ').
112
+ row(r).col(fc).
113
+ type(:integer)
114
+ r += 2
115
+
116
+ Field.new(@form).
117
+ name("landline").display_length(20).bgcolor(:white).color(:black).
118
+ text("").label('Landline: ').
119
+ row(r).col(fc).
120
+ type(:integer)
121
+ # a form level event, whenever any widget is focussed, make the label red
122
+ @form.bind(:ENTER) { |f| f.label && f.label.bgcolor = :red if (f.respond_to? :label and f.label.respond_to?(:bgcolor))}
123
+ @form.bind(:LEAVE) { |f| f.label && f.label.bgcolor = 'black' if (f.respond_to? :label and f.label.respond_to?(:bgcolor))}
124
+
125
+ @form.bind_key(FFI::NCurses::KEY_F3,'view log') {
126
+ require 'rbhex/core/util/viewer'
127
+ RubyCurses::Viewer.view(path || "rbc13.log", :close_key => KEY_ENTER, :title => "<Enter> to close")
128
+ }
129
+ @form.bind_key(FFI::NCurses::KEY_F4, 'system command') { shell_output }
130
+ @form.bind_key(FFI::NCurses::KEY_F5, 'shell') { suspend }
131
+ @form.bind_key([?\C-x,?c], 'shell') { suspend }
132
+ @form.bind_key(?\M-!, 'shell') { suspend }
133
+ @form.bind_key([?\C-x,?l], 'ls -al') { run_command "ls -al" }
134
+ @form.bind_key([?\C-x,?p], 'ps -l') { run_command "ps -l" }
135
+ @form.bind_key([?\C-x,?d], 'df -h') { run_command "df -h" }
136
+ #@form.bind_key([?\C-x,?d], 'git diff') { run_command "git diff --name-status" }
137
+ @form.bind_key([?\C-x, ?s], 'git st') { run_command "git status" }
138
+ @form.bind_key([?\C-x,?w], 'git whatchanged') { run_command "git whatchanged" }
139
+
140
+ @form.help_manager.help_text = help_text
141
+ #@form.bind_key(FFI::NCurses::KEY_F1, 'help') { display_app_help help_text() }
142
+ @form.bind_key(FFI::NCurses::KEY_F1, 'help') { display_app_help }
143
+ @form.repaint
144
+ @window.wrefresh
145
+ Ncurses::Panel.update_panels
146
+
147
+ # the main loop
148
+
149
+ while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
150
+ break if ch == ?\C-q.getbyte(0)
151
+ begin
152
+ @form.handle_key(ch)
153
+
154
+ rescue FieldValidationException => fve
155
+ alert fve.to_s
156
+
157
+ f = @form.get_current_field
158
+ # lets restore the value
159
+ if f.respond_to? :restore_original_value
160
+ f.restore_original_value
161
+ @form.repaint
162
+ end
163
+ $error_message.value = ""
164
+ rescue => err
165
+ $log.error( err) if err
166
+ $log.error(err.backtrace.join("\n")) if err
167
+ textdialog err
168
+ $error_message.value = ""
169
+ end
170
+
171
+ # this should be avoided, we should not muffle the exception and set a variable
172
+ # However, we have been doing that
173
+ if $error_message.get_value != ""
174
+ if @lookfeel == :dialog
175
+ alert($error_message, {:bgcolor => :red, 'color' => 'yellow'}) if $error_message.get_value != ""
176
+ else
177
+ print_error_message $error_message, {:bgcolor => :red, :color => :yellow}
178
+ end
179
+ $error_message.value = ""
180
+ end
181
+
182
+ @window.wrefresh
183
+ end # while loop
184
+ end # catch
185
+ rescue => ex
186
+ ensure
187
+ $log.debug " -==== EXCEPTION =====-"
188
+ $log.debug( ex) if ex
189
+ $log.debug(ex.backtrace.join("\n")) if ex
190
+ @window.destroy if !@window.nil?
191
+ VER::stop_ncurses
192
+ puts ex if ex
193
+ puts(ex.backtrace.join("\n")) if ex
194
+ end
195
+ end
@@ -0,0 +1,72 @@
1
+ # demo to test keypresses
2
+ # press any key and see the value that ncurses or our routines catch.
3
+ # Press alt and control combinations and Function keys
4
+ # Ideally each key should return only one value. Sometimes, some TERM setting
5
+ # or terminal emulator may not give correct values or may give different values
6
+ # from what we are expecting.
7
+ # Exit using 'q'.
8
+ require 'logger'
9
+ require 'rbhex'
10
+ require 'rbhex/core/widgets/rtextview'
11
+ if $0 == __FILE__
12
+ include RubyCurses
13
+ include RubyCurses::Utils
14
+
15
+ begin
16
+ # Initialize curses
17
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
18
+ $log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
19
+
20
+ $log.level = Logger::DEBUG
21
+
22
+ @window = VER::Window.root_window
23
+
24
+ catch(:close) do
25
+ colors = Ncurses.COLORS
26
+ $log.debug "START #{colors} colors ---------"
27
+ @form = Form.new @window
28
+ r = 1; c = 30;
29
+
30
+ # please use a hash to pass these values, avoid this old style
31
+ # i want to move away from it as it comlpicates code
32
+ texta = TextView.new @form do
33
+ name "mytext"
34
+ row r
35
+ col c
36
+ width 60
37
+ height 15
38
+ #editable false
39
+ focusable false
40
+ title "[ Keypresses ]"
41
+ #title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
42
+ title_attrib (Ncurses::A_BOLD)
43
+ end
44
+ help = "q to quit. Check keys. F1..10, C-a..z, Alt a-zA-Z0-9, C-left,rt, Sh-F5..10 .: #{$0}"
45
+ help1 = "Press in quick succession: 1) M-[, w and (2) M-[, M-w. (3) M-Sh-O, w."
46
+ RubyCurses::Label.new @form, {'text' => help, "row" => 21, "col" => 2, "color" => "yellow"}
47
+ RubyCurses::Label.new @form, {'text' => help1, "row" => 22, "col" => 2, "color" => "green"}
48
+
49
+ @form.repaint
50
+ @window.wrefresh
51
+ Ncurses::Panel.update_panels
52
+ while((ch = @window.getchar()) != 0 )
53
+ str = keycode_tos ch
54
+ $log.debug "#{ch} got (#{str})"
55
+ texta << "#{ch} got (#{str})"
56
+ texta.goto_end
57
+ texta.repaint
58
+ @form.repaint
59
+ @window.wrefresh
60
+ break if ch == ?\q.getbyte(0)
61
+ end
62
+ end
63
+ rescue => ex
64
+ ensure
65
+ @window.destroy if !@window.nil?
66
+ VER::stop_ncurses
67
+ p ex if ex
68
+ p(ex.backtrace.join("\n")) if ex
69
+ $log.debug( ex) if ex
70
+ $log.debug(ex.backtrace.join("\n")) if ex
71
+ end
72
+ end
@@ -0,0 +1,170 @@
1
+ # NOTE: If the listbox is empty, that could mean that you have not generated
2
+ # ri documentation for this version of ruby. You can do so by doing:
3
+ # rvm docs generate-ri
4
+ # or
5
+ # rvm docs generate
6
+ # (This assumes you are using rvm)
7
+ #
8
+ # WARNING : IF THIS PROGRAM HANGS check the ri command
9
+ # Maybe your version of ri has different options and is going interactive.
10
+ # ruby 1.9.3's ri requires a -l option or else if becomes interactive.
11
+ # this program tests out a listbox
12
+ # This is written in the old style where we start and end ncurses and initiate a
13
+ # getch loop. It gives more control.
14
+ # The new style is to use App which does the ncurses setup and teardown, as well
15
+ # as manages keys. It also takes care of logger and includes major stuff.
16
+ require 'logger'
17
+ require 'rbhex'
18
+ require 'rbhex/core/widgets/rlist'
19
+ require 'rbhex/core/widgets/rtextview'
20
+ require 'rbhex/core/include/vieditable'
21
+ #require 'rbhex/experimental/widgets/undomanager'
22
+ class RubyCurses::List
23
+ # vieditable includes listeditable which
24
+ # does bring in some functions which can crash program like x and X TODO
25
+ # also, f overrides list f mapping. TODO
26
+ include ViEditable
27
+ end
28
+ def my_help_text
29
+ <<-eos
30
+
31
+ =========================================================================
32
+ Basic Usage
33
+
34
+ Press <ENTER> on a class name on the first list, to view ri information
35
+ for it on the right.
36
+
37
+ Tab to right area, and press <ENTER> on a method name, to see its details
38
+ Press / <slash> in any box to search. e.g /String will take you to the
39
+ first occurrence of String. <n> will take you to next.
40
+
41
+ To go quickly to first class starting with 'S', type <f> followed by <S>.
42
+ Then press <n> to go to next match.
43
+
44
+ =========================================================================
45
+ Vim Edit Keys
46
+
47
+ The list on left has some extra vim keys enabled such as :
48
+ yy - yank/copy current line/s
49
+ P, p - paste after or before
50
+ dd - delete current line
51
+ o - insert a line after this one
52
+ C - change content of current line
53
+ These are not of use here, but are demonstrative of list capabilities.
54
+
55
+ =========================================================================
56
+ Buffers
57
+
58
+ Ordinary a textview contains only one buffer. However, the one on the right
59
+ is extended for multiple buffers. Pressing ENTER on the left on several
60
+ rows opens multiple buffers on the right. Use M-n (Alt-N) and M-p to navigate.
61
+ ALternatively, : maps to a menu, so :n and :p may also be used.
62
+ <BACKSPACE> will also go to previous buffer, like a browser.
63
+
64
+ =========================================================================
65
+ Press <M-n> for next help screen, or try :n
66
+
67
+ eos
68
+ end
69
+ if $0 == __FILE__
70
+ include RubyCurses
71
+
72
+ begin
73
+ # Initialize curses
74
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
75
+ $log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
76
+ $log.level = Logger::DEBUG
77
+
78
+ @window = VER::Window.root_window
79
+ $catch_alt_digits = true; # emacs like alt-1..9 numeric arguments
80
+ install_help_text my_help_text
81
+ # Initialize few color pairs
82
+ # Create the window to be associated with the form
83
+ # Un post form and free the memory
84
+
85
+ catch(:close) do
86
+ @form = Form.new @window
87
+ @form.bind_key(KEY_F1, 'help'){ display_app_help }
88
+
89
+ # this is the old style of printing something directly on the window.
90
+ # The new style is to use a header
91
+ @form.window.printstring 0, 30, "Demo of Listbox - some vim keys", $normalcolor, BOLD
92
+ r = 1; fc = 1;
93
+
94
+ # this is the old style of using a label at the screen bottom, you can use the status_line
95
+
96
+ v = "F10 quits. F1 Help. Try j k gg G o O C dd f<char> w yy p P / . Press ENTER on Class or Method"
97
+ var = RubyCurses::Label.new @form, {'text' => v, "row" => FFI::NCurses.LINES-2,
98
+ "col" => fc, "display_length" => 100}
99
+
100
+ h = FFI::NCurses.LINES-3
101
+ file = "./data/ports.txt"
102
+ #mylist = File.open(file,'r').readlines
103
+ mylist = `ri -l `.split("\n")
104
+ w = 25
105
+ #0.upto(100) { |v| mylist << "#{v} scrollable data" }
106
+ #
107
+ listb = List.new @form, :name => "mylist" ,
108
+ :row => r ,
109
+ :col => 1 ,
110
+ :width => w,
111
+ :height => h,
112
+ :list => mylist,
113
+ :selection_mode => :SINGLE,
114
+ :show_selector => true,
115
+ #row_selected_symbol "[X] "
116
+ #row_unselected_symbol "[ ] "
117
+ :title => " Ruby Classes "
118
+ #title_attrib 'reverse'
119
+ listb.one_key_selection = false # this allows us to map keys to methods
120
+ listb.vieditable_init_listbox
121
+ include Io
122
+ listb.bind_key(?r, 'get file'){ get_file("Get a file:") }
123
+ listb.bind(:PRESS) {
124
+ w = @form.by_name["tv"];
125
+ lines = `ri -f bs #{listb.text}`.split("\n")
126
+ #w.set_content(lines, :ansi)
127
+ w.add_content(lines, :content_type => :ansi, :title => listb.text)
128
+ w.buffer_last
129
+ #w.title = listb.text
130
+ }
131
+
132
+ tv = RubyCurses::TextView.new @form, :row => r, :col => w+1, :height => h, :width => FFI::NCurses.COLS-w-1,
133
+ :name => "tv", :title => "Press Enter on method"
134
+ tv.set_content ["Press Enter on list to view ri information in this area.",
135
+ "Press ENTER on method name to see details"]
136
+ require 'rbhex/core/include/multibuffer'
137
+ tv.extend(RubyCurses::MultiBuffers)
138
+
139
+ # pressing ENTER on a method name will popup details for that method
140
+ tv.bind(:PRESS) { |ev|
141
+ w = ev.word_under_cursor.strip
142
+ # check that user did not hit enter on empty area
143
+ if w != ""
144
+ _text = `ri -f bs #{tv.title}.#{w} 2>&1`
145
+ _text = _text.split("\n")
146
+ if _text && _text.size != 0
147
+ view(_text, :content_type => :ansi)
148
+ end
149
+ end
150
+ }
151
+
152
+
153
+ @form.repaint
154
+ @window.wrefresh
155
+ Ncurses::Panel.update_panels
156
+ while((ch = @window.getchar()) != KEY_F10 )
157
+ @form.handle_key(ch)
158
+ @window.wrefresh
159
+ end
160
+ end
161
+ rescue => ex
162
+ $log.debug( ex) if ex
163
+ $log.debug(ex.backtrace.join("\n")) if ex
164
+ ensure
165
+ @window.destroy if !@window.nil?
166
+ VER::stop_ncurses
167
+ p ex if ex
168
+ p(ex.backtrace.join("\n")) if ex
169
+ end
170
+ end
@@ -0,0 +1,140 @@
1
+ # To test out the new messagebox
2
+ # The old messagebox provided a lot of convenience methods that were complicated
3
+ # and confusing. This one is simpler.
4
+ # The examples here are based on the old test1.rb that will not work now
5
+ # since the interface has been changed and simplified
6
+ #
7
+ require 'logger'
8
+ require 'rbhex'
9
+ require 'rbhex/core/widgets/rmessagebox'
10
+ #require 'rbhex/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
+ require 'rbhex/core/widgets/rlist'
30
+ nn = "mylist"
31
+ l = List.new nil, :row => 2, :col => 5, :list => %w[john tim lee wong rahul edward why chad andy],
32
+ :selection_mode => :multiple, :height => 10, :width => 20 , :selected_color => :green, :selected_bgcolor => :white, :selected_indices => [2,6], :name => nn
33
+ #default_values %w[ lee why ]
34
+ @mb = MessageBox.new :width => 30, :height => 18 do
35
+ title "Select a name"
36
+ button_type :ok_cancel
37
+ item Label.new :row => 1, :col => 1, :text => "Enter your name:"
38
+ item l
39
+
40
+ #default_button 0 # TODO
41
+ end
42
+ @mb.run
43
+ $log.debug "XXX: #{l.selected_indices} "
44
+ n = @mb.widget(nn)
45
+ $log.debug "XXXX: #{n.selected_indices}, #{n.name} "
46
+ when 2
47
+ @mb = RubyCurses::MessageBox.new do
48
+ title "Color selector"
49
+ message "Select a color"
50
+ #item Label.new :text => "Select a color", :row => 1 , :col => 2
51
+
52
+ r = 3
53
+ c = 2
54
+ %w[&red &green &blue &yellow].each_with_index { |b, i|
55
+ bu = Button.new :name => b, :text => b, :row => r, :col => c
56
+ bu.command { throw(:close, i) }
57
+ item bu
58
+ #bu.default_button(true) if i == 0
59
+ #r += 1
60
+ c += b.length + 5
61
+ }
62
+ end
63
+ index = @mb.run
64
+ $log.debug "XXX: messagebox 2 ret #{index} "
65
+ when 3
66
+ @mb = RubyCurses::MessageBox.new do
67
+ title "Enter your name"
68
+ #message "Enter your first name. You are not permitted to enter x z or q and must enter a capital first"
69
+ message "Enter your first name. Initcaps "
70
+ add Field.new :chars_allowed => /[^0-9xyz]/, :valid_regex => /^[A-Z][a-z]*/, :default => "Matz", :bgcolor => :cyan
71
+ button_type :ok_cancel
72
+ end
73
+ @mb.run
74
+ $log.debug "XXX: got #{@mb.widget(1).text} "
75
+ when 4
76
+ mb = MessageBox.new :title => "HTTP Configuration" , :width => 50 do
77
+ add Field.new :label => 'User', :name => "user", :display_length => 30, :bgcolor => :cyan
78
+ add CheckBox.new :text => "No &frames", :onvalue => "Selected", :offvalue => "UNselected"
79
+ add CheckBox.new :text => "Use &HTTP/1.0", :value => true
80
+ add CheckBox.new :text => "Use &passive FTP"
81
+ add Label.new :text => " Language ", :attr => REVERSE
82
+ $radio = RubyCurses::Variable.new
83
+ add RadioButton.new :text => "py&thon", :value => "python", :color => :blue, :variable => $radio
84
+ add RadioButton.new :text => "rub&y", :color => :red, :variable => $radio
85
+ button_type :ok
86
+ end
87
+ field = mb.widget("user")
88
+ field.bind(:ENTER) do |f|
89
+ listconfig = {'bgcolor' => 'blue', 'color' => 'white'}
90
+ users= %w[john tim lee wong rahul edward _why chad andy]
91
+ index = popuplist(users, :relative_to => field, :col => field.col + 6, :width => field.display_length)
92
+ field.set_buffer users[index] if index
93
+ end
94
+ mb.run
95
+
96
+ when 5
97
+ require 'rbhex/core/widgets/rlist'
98
+ label = Label.new 'text' => 'File', 'mnemonic'=>'F', :row => 3, :col => 5
99
+ field = Field.new :name => "file", :row => 3 , :col => 10, :width => 40, :set_label => label
100
+ #flist = Dir.glob(File.join( File.expand_path("~/"), "*"))
101
+ flist = Dir.glob("*")
102
+ listb = List.new :name => "mylist", :row => 4, :col => 3, :width => 50, :height => 10,
103
+ :list => flist, :title => "File List", :selected_bgcolor => :white, :selected_color => :blue,
104
+ :selection_mode => :single, :border_attrib => REVERSE
105
+ #listb.bind(:ENTER_ROW) { field.set_buffer listb.selected_item }
106
+ # if you find that cursor goes into listbox while typing, then
107
+ # i've put set_form_row in listbox list_data_changed
108
+ field.bind(:CHANGE) do |f|
109
+ flist = Dir.glob("*"+f.getvalue+"*")
110
+ #l.insert( 0, *flist) if flist
111
+ listb.list flist
112
+ end
113
+ mb = RubyCurses::MessageBox.new :height => 20, :width => 60 do
114
+ title "Sample File Selector"
115
+ add label
116
+ add field
117
+ add listb
118
+ #height 20
119
+ #width 60
120
+ #top 5
121
+ #left 20
122
+ #default_button 0
123
+ button_type :ok_cancel
124
+
125
+ end
126
+ mb.run
127
+ $log.debug "MBOX :selected #{listb.selected_item}"
128
+ end
129
+
130
+ end
131
+ rescue => ex
132
+ ensure
133
+ @window.destroy unless @window.nil?
134
+ VER::stop_ncurses
135
+ p ex if ex
136
+ p(ex.backtrace.join("\n")) if ex
137
+ $log.debug( ex) if ex
138
+ $log.debug(ex.backtrace.join("\n")) if ex
139
+ end
140
+ end