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,574 @@
1
+ =begin
2
+ * Name: dialogs so user can do basic stuff in one line.
3
+ * Description:
4
+ * Author: rkumar
5
+
6
+ --------
7
+ * Date: 2008-12-30 12:22
8
+ * 2011-10-1 : moving print_error and print_status methods here as alternatives
9
+ to alert and confirm. Anyone who has included those will get these.
10
+ And this file is included in the base file.
11
+
12
+ Shucks, this file has no module. It's bare !
13
+ * License:
14
+ Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
15
+
16
+ # CHANGES:
17
+ # -- moving to the new Messagebox 2011-11-19 v 1.5.0
18
+ TODO:
19
+ Add select_one (message, values, default)
20
+ =end
21
+ require 'rbhex/core/widgets/rwidget'
22
+ #require 'rbhex/deprecated/widgets/rmessagebox'
23
+ require 'rbhex/core/widgets/rmessagebox'
24
+
25
+ # -- moving to the new Messagebox 2011-11-19 v 1.5.0
26
+ # Alert user with a one line message
27
+ #
28
+ def alert text, config={}
29
+
30
+ if text.is_a? RubyCurses::Variable
31
+ text = text.get_value
32
+ end
33
+ _title = config[:title] || "Alert"
34
+ tp = MessageBox.new config do
35
+ title _title
36
+ button_type :ok
37
+ message text
38
+ #text mess
39
+ end
40
+ tp.run
41
+ end
42
+
43
+ # Alert user with a block of text. This will popup a textview in which the user can scroll
44
+ # Use this if you are not sure of the size of the text, such as printing a stack trace,
45
+ # exception
46
+ # 2011-12-25 just pass in an exceptino object and we do the rest
47
+ def textdialog mess, config={}
48
+ if mess.is_a? Exception
49
+ mess = [mess.to_s, *mess.backtrace]
50
+ config[:title] ||= "Exception"
51
+ end
52
+ config[:title] ||= "Alert"
53
+ tp = MessageBox.new config do
54
+ button_type :ok
55
+ text mess
56
+ end
57
+ tp.run
58
+ end
59
+ #
60
+ # This uses the new messagebox 2011-11-19 v 1.5.0
61
+ # NOTE: The earlier get_string had only an OK button, this seems to have a CANCEL
62
+ # @param [String] a label such as "Enter name:"
63
+ # @return [String] value entered by user, nil if cancel pressed
64
+ # @yield [Field] field created by messagebox
65
+ def get_string label, config={} # yield Field
66
+ config[:title] ||= "Entry"
67
+ label_config = config[:label_config] || {}
68
+ label_config[:row] ||= 2
69
+ label_config[:col] ||= 2
70
+ label_config[:text] = label
71
+
72
+ field_config = config[:field_config] || {}
73
+ field_config[:row] ||= 3
74
+ field_config[:col] ||= 2
75
+ field_config[:attr] = :reverse
76
+ field_config[:maxlen] ||= config[:maxlen]
77
+ field_config[:display_length] ||= config[:display_length]
78
+ field_config[:default] ||= config[:default]
79
+ field_config[:default] = field_config[:default].chomp if field_config[:default]
80
+ field_config[:name] = :name
81
+ #field_config[:display_length] ||= 50 # i want it to extend since i don't know the actual width
82
+ #field_config[:width] ||= 50 # i want it to extend since i don't know the actual width
83
+ field_config[:width] ||= (field_config[:display_length] || 50)
84
+
85
+ defwid = config[:default].nil? ? 30 : config[:default].size + 13
86
+ w = [label.size + 8, defwid, field_config[:width]+13 ].max
87
+ config[:width] ||= w
88
+ ## added history 2013-03-06 - 14:25 : we could keep history based on prompt
89
+ $get_string_history ||= []
90
+ #$log.debug "XXX: FIELD SIZE #{w} "
91
+ #$log.debug "XXX: FIELD CONFIG #{field_config} "
92
+ tp = MessageBox.new config do
93
+ button_type :ok_cancel
94
+ default_button 0
95
+ item Label.new nil, label_config
96
+ fld = Field.new nil, field_config
97
+ item fld
98
+ ## added field history 2013-03-06 - 14:24
99
+ require 'rbhex/core/include/rhistory'
100
+ fld.extend(FieldHistory)
101
+ # We need to manually set history each time, since the field is recreated
102
+ # with the messagebox. Otherwise, field can on its own handle history
103
+ fld.history($get_string_history)
104
+ end
105
+ # added yield to override settings
106
+ yield tp.form.by_name[:name] if block_given?
107
+ index = tp.run
108
+ if index == 0 # OK
109
+ ## added field history 2013-03-06 - 14:24
110
+ t = tp.form.by_name[:name].text
111
+ $get_string_history << t if t && !$get_string_history.include?(t)
112
+ return t
113
+ else # CANCEL
114
+ # Should i use nil or blank. I am currently opting for nil, as this may imply to caller
115
+ # that user does not wish to override whatever value is being prompted for.
116
+ return nil
117
+ end
118
+ end
119
+ # new version using new messagebox
120
+ # @param [String] question
121
+ # @return [Boolean] true or false
122
+ # @yield [Label]
123
+ #
124
+ def confirm text, config={}, &block
125
+ title = config['title'] || "Confirm"
126
+ config[:default_button] ||= 0
127
+
128
+ mb = RubyCurses::MessageBox.new config do
129
+ title title
130
+ message text, &block
131
+ button_type :yes_no
132
+ end
133
+ index = mb.run
134
+ return index == 0
135
+ end
136
+ ##
137
+ # pops up a modal box with a message and an OK button.
138
+ # No return value.
139
+ # Usage:
140
+ # alert("You did not enter anything!")
141
+ # alert("You did not enter anything!", "title"=>"Wake Up")
142
+ # alert("You did not enter anything!", {"title"=>"Wake Up", "bgcolor"=>"blue", "color"=>"white"})
143
+ # block currently ignored. don't know what to do, can't pass it to MB since alread sending in a block
144
+ #
145
+
146
+ # ------------------------ We've Moved here from window class ---------------- #
147
+ # #
148
+ # Moving some methods from window. They no longer require having a window. #
149
+ # #
150
+ # ---------------------------------------------------------------------------- #
151
+ #
152
+ #
153
+
154
+ # new version with a window created on 2011-10-1 12:37 AM
155
+ # Now can be separate from window class, needing nothing, just a util class
156
+ # prints a status message and pauses for a char
157
+ # @param [String] text to print
158
+ # @param [Hash] config: :color :bgcolor :color_pair
159
+ # :wait (numbr of seconds to wait for a key press and then close) if not givn
160
+ # will keep waiting for keypress (the default)
161
+ def print_status_message text, aconfig={}, &block
162
+ _print_message :status, text, aconfig, &block
163
+ end
164
+ alias :rb_puts print_status_message
165
+
166
+ # new version with a window created on 2011-10-1 12:30 AM
167
+ # Now can be separate from window class, needing nothing, just a util class
168
+ # @param [String] text to print
169
+ # @param [Hash] config: :color :bgcolor :color_pair
170
+ # :wait (numbr of seconds to wait for a key press and then close) if not givn
171
+ # will keep waiting for keypress (the default)
172
+ def print_error_message text, aconfig={}, &block
173
+ _print_message :error, text, aconfig, &block
174
+ end
175
+ private
176
+ def _create_footer_window h = 2 , w = Ncurses.COLS, t = Ncurses.LINES-2, l = 0 #:nodoc:
177
+ ewin = VER::Window.new(h, w , t, l)
178
+ end
179
+ # @param [:symbol] :error or :status kind of message
180
+ #private
181
+ def _print_message type, text, aconfig={}, &block #:nodoc:
182
+ case text
183
+ when RubyCurses::Variable # added 2011-09-20 incase variable passed
184
+ text = text.get_value
185
+ when Exception
186
+ text = text.to_s
187
+ end
188
+ # NOTE we are polluting global namespace
189
+ # fixed on 2011-12-6 . to test
190
+ #aconfig.each_pair { |k,v| instance_variable_set("@#{k}",v) }
191
+ color = aconfig[:color]
192
+ bgcolor = aconfig[:bgcolor]
193
+ ewin = _create_footer_window #*@layout
194
+ r = 0; c = 1;
195
+ case type
196
+ when :error
197
+ color ||= 'red'
198
+ bgcolor ||= 'black'
199
+ else
200
+ color ||= :white
201
+ bgcolor ||= :black
202
+ end
203
+ color_pair = get_color($promptcolor, color, bgcolor)
204
+ color_pair = aconfig[:color_pair] || color_pair
205
+ ewin.bkgd(Ncurses.COLOR_PAIR(color_pair));
206
+ ewin.printstring r, c, text, color_pair
207
+ ewin.printstring(r+1, c, "Press a key ", color_pair) unless aconfig[:wait]
208
+ ewin.wrefresh
209
+ if aconfig[:wait]
210
+ #try this out, if user wants a wait, then it will wait for 5 seconds, or if a key is pressed sooner
211
+ value = aconfig[:wait]
212
+ if value.is_a? Fixnum
213
+ value = value * 10
214
+ else
215
+ value = 50
216
+ end
217
+ Ncurses::halfdelay(tenths = value)
218
+ ewin.getch
219
+ Ncurses::halfdelay(tenths = 10)
220
+ else
221
+ ewin.getchar
222
+ end
223
+ ewin.destroy
224
+ end
225
+ #
226
+ # Alternative to confirm dialog, if you want this look and feel, at last 2 lines of screen
227
+ # @param [String] text to prompt
228
+ # @return [true, false] 'y' is true, all else if false
229
+ public
230
+ def rb_confirm text, aconfig={}, &block
231
+ # backward compatibility with agree()
232
+ if aconfig == true || aconfig == false
233
+ default = aconfig
234
+ aconfig = {}
235
+ else
236
+ default = aconfig[:default]
237
+ end
238
+ case text
239
+ when RubyCurses::Variable # added 2011-09-20 incase variable passed
240
+ text = text.get_value
241
+ when Exception
242
+ text = text.to_s
243
+ end
244
+ ewin = _create_footer_window
245
+ r = 0; c = 1;
246
+ #aconfig.each_pair { |k,v| instance_variable_set("@#{k}",v) }
247
+ # changed on 2011-12-6
248
+ color = aconfig[:color]
249
+ bgcolor = aconfig[:bgcolor]
250
+ color ||= :white
251
+ bgcolor ||= :black
252
+ color_pair = get_color($promptcolor, color, bgcolor)
253
+ ewin.bkgd(Ncurses.COLOR_PAIR(color_pair));
254
+ ewin.printstring r, c, text, color_pair
255
+ ewin.printstring r+1, c, "[y/n]", color_pair
256
+ ewin.wrefresh
257
+ #retval = :NO # consistent with confirm # CHANGE TO TRUE FALSE NOW
258
+ retval = false
259
+ begin
260
+ ch = ewin.getchar
261
+ retval = (ch == 'y'.ord || ch == 'Y'.ord )
262
+ # if caller passed a default value and user pressed ENTER return that
263
+ # can be true or false so don't change this to "if default". 2011-12-8
264
+ if !default.nil?
265
+ if ch == 13 || ch == KEY_ENTER
266
+ retval = default
267
+ end
268
+ end
269
+ #retval = :YES if ch.chr == 'y'
270
+ ensure
271
+ ewin.destroy
272
+ end
273
+ retval
274
+ end
275
+ alias :confirm_window :rb_confirm
276
+ # class created to display multiple messages without asking for user to hit a key
277
+ # returns a window to which one can keep calling printstring with 0 or 1 as row.
278
+ # destroy when finished.
279
+ # Also, one can pause if one wants, or linger.
280
+ # This is meant to be a replacement for the message_immediate and message_raw
281
+ # I was trying out in App.rb. 2011-10-1 1:27 AM
282
+ # Testing from test2.rb
283
+ # TODO: add option of putting progress_bar
284
+ class StatusWindow
285
+ attr_reader :h, :w, :top, :left # height, width, top row, left col of window
286
+ attr_reader :win
287
+ attr_accessor :color_pair
288
+ def initialize config={}, &block
289
+ @color_pair = config[:color_pair]
290
+ @row_offset = config[:row_offset] || 0
291
+ @col_offset = config[:col_offset] || 0
292
+ create_window *config[:layout]
293
+ end
294
+ def create_window h = 2 , w = Ncurses.COLS-0, t = Ncurses.LINES-2, l = 0
295
+ return @win if @win
296
+ @win = VER::Window.new(h, w , t, l)
297
+ @h = h ; @w = w; @top = t ; @left = l
298
+ @color_pair ||= get_color($promptcolor, 'white','black')
299
+ @win.bkgd(Ncurses.COLOR_PAIR(@color_pair));
300
+ @win
301
+ end
302
+ # creates a color pair based on given bg and fg colors as strings
303
+ #def set_colors bgcolor, fgcolor='white'
304
+ #@color_pair = get_color($datacolor, 'white','black')
305
+ #end
306
+ # prints a string on given row (0 or 1)
307
+ def printstring r, c, text, color_pair=@color_pair
308
+ create_window unless @win
309
+ show unless @visible
310
+ r = @h-1 if r > @h-1
311
+ #@win.printstring r, c, ' '*@w, @color_pair
312
+ # FIXME this padding overwrites the border and the offset means next line wiped
313
+ # However, now it may now totally clear a long line.
314
+ @win.printstring r+@row_offset, c+@col_offset, "%-*s" % [@w-(@col_offset*2)-c, text], color_pair
315
+ @win.wrefresh
316
+ end
317
+ # print given strings from first first column onwards
318
+ def print *textarray
319
+ create_window unless @win
320
+ show unless @visible
321
+ c = 1
322
+ textarray.each_with_index { |s, i|
323
+ @win.printstring i+@row_offset, c+@col_offset, "%-*s" % [@w-(@col_offset*2)-c, s], @color_pair
324
+ }
325
+ @win.wrefresh
326
+ end
327
+ def pause; @win.getchar; end
328
+ # pauses with the message, but doesn't ask the user to press a key.
329
+ # If he does, the key should be used by underlying window.
330
+ # Do not call destroy if you call linger, it does the destroy.
331
+ def linger caller_window=nil
332
+ begin
333
+ if caller_window
334
+ ch = @win.getchar
335
+ caller_window.ungetch(ch) # will this be available to underlying window XXX i think not !!
336
+ else
337
+ sleep 1
338
+ end
339
+ ensure
340
+ destroy
341
+ end
342
+ end
343
+ # caller must destroy after he's finished printing messages, unless
344
+ # user calls linger
345
+ def destroy; @win.destroy if @win; @win = nil; end
346
+ def hide
347
+ @win.hide
348
+ @visible = false
349
+ end
350
+ def show
351
+ @win.show unless @visible
352
+ @visible = true
353
+ end
354
+ end
355
+ # returns instance of a status_window for sending multiple
356
+ # statuses during some process
357
+ def status_window aconfig={}, &block
358
+ return StatusWindow.new aconfig
359
+ end
360
+ # this is a popup dialog box on which statuses can be printed as a process is taking place.
361
+ # I am reusing StatusWindow and so there's an issue since I've put a box, so in clearing
362
+ # the line, I might overwrite the box
363
+ def progress_dialog aconfig={}, &block
364
+ aconfig[:layout] = [10,60,10,20]
365
+ window = status_window aconfig
366
+ height = 10; width = 60
367
+ window.win.print_border_mb 1,2, height, width, $normalcolor, FFI::NCurses::A_REVERSE
368
+ return window
369
+ end
370
+ #
371
+ # Display a popup and return the seliected index from list
372
+ # Config includes row and col and title of window
373
+ # You may also pass bgcolor and color
374
+ # Returns index of selected row on pressing ENTER or space
375
+ # In case of multiple selection, returns array of selected indices only on ENTER
376
+ # Returns nil if C-q pressed
377
+ # @since 1.4.1 2011-11-1
378
+ def popuplist list, config={}, &block
379
+ raise ArgumentError, "Nil list received by popuplist" unless list
380
+ require 'rbhex/core/widgets/rlist'
381
+
382
+ max_visible_items = config[:max_visible_items]
383
+ row = config[:row] || 5
384
+ col = config[:col] || 5
385
+ relative_to = config[:relative_to]
386
+ if relative_to
387
+ layout = relative_to.form.window.layout
388
+ row += layout[:top]
389
+ col += layout[:left]
390
+ end
391
+ config.delete :relative_to
392
+ width = config[:width] || longest_in_list(list)+2 # borders take 2
393
+ if config[:title]
394
+ width = config[:title].size + 2 if width < config[:title].size
395
+ end
396
+ height = config[:height]
397
+ height ||= [max_visible_items || 10+2, list.length+2].min
398
+ #layout(1+height, width+4, row, col)
399
+ layout = { :height => 0+height, :width => 0+width, :top => row, :left => col }
400
+ window = VER::Window.new(layout)
401
+ form = RubyCurses::Form.new window
402
+
403
+ listconfig = config[:listconfig] || {}
404
+ listconfig[:list] = list
405
+ listconfig[:width] = width
406
+ listconfig[:height] = height
407
+ listconfig[:selection_mode] ||= :single
408
+ listconfig.merge!(config)
409
+ listconfig.delete(:row);
410
+ listconfig.delete(:col);
411
+ # trying to pass populists block to listbox
412
+ lb = RubyCurses::List.new form, listconfig, &block
413
+ #
414
+ # added next line so caller can configure listbox with
415
+ # events such as ENTER_ROW, LEAVE_ROW or LIST_SELECTION_EVENT or PRESS
416
+ # 2011-11-11
417
+ #yield lb if block_given? # No it won't work since this returns
418
+ window.bkgd(Ncurses.COLOR_PAIR($reversecolor));
419
+ window.wrefresh
420
+ Ncurses::Panel.update_panels
421
+ form.repaint
422
+ window.wrefresh
423
+ begin
424
+ while((ch = window.getchar()) != 999 )
425
+ case ch
426
+ when -1
427
+ next
428
+ when ?\C-q.getbyte(0)
429
+ break
430
+ else
431
+ lb.handle_key ch
432
+ form.repaint
433
+ if ch == 13 || ch == 10
434
+ return lb.current_index if lb.selection_mode != :multiple
435
+
436
+ x = lb.selected_indices
437
+ return x if x
438
+ x = lb.current_index unless x
439
+ return [x]
440
+ # if multiple selection, then return list of selected_indices and don't catch 32
441
+ elsif ch == 32 # if single selection
442
+ return lb.current_index if lb.selection_mode != :multiple
443
+ end
444
+ #yield ch if block_given?
445
+ end
446
+ end
447
+ ensure
448
+ window.destroy
449
+ end
450
+ return nil
451
+ end
452
+ # returns length of longest
453
+ def longest_in_list list #:nodoc:
454
+ raise ArgumentError, "rdialog.rb: longest_in_list recvd nil list" unless list
455
+ longest = list.inject(0) do |memo,word|
456
+ memo >= word.length ? memo : word.length
457
+ end
458
+ longest
459
+ end
460
+ # would like to deprecate this and use
461
+ # @form.help_manager.help_text = text
462
+ def install_help_text text
463
+ @_help_text = text
464
+ if @form
465
+ hm = @form.help_manager
466
+ hm.help_text = text
467
+ end
468
+ end
469
+ # this routine prints help_text for an application
470
+ # If help_text has been set using install_help_text
471
+ # it will be displayed. Else, general help will be
472
+ # displayed. Even when custom help is displayed,
473
+ # user may use <next> to see general help.
474
+ #
475
+ # earlier in app.rb
476
+ def display_app_help form=@form
477
+ if form
478
+ hm = form.help_manager
479
+ if !hm.help_text
480
+ arr = nil
481
+ # these 2 only made sense from app.rb and should be removed, too implicit
482
+ if respond_to? :help_text
483
+ arr = help_text
484
+ elsif @_help_text
485
+ arr = @_help_text
486
+ end
487
+ hm.help_text(arr) if arr
488
+ end
489
+ form.help_manager.display_help
490
+ else
491
+ raise "Form needed by display_app_help. Use form.help_manager instead"
492
+ end
493
+ end
494
+ def ORIGdisplay_app_help
495
+ filename = File.dirname(__FILE__) + "/../docs/index.txt"
496
+ # defarr contains default help
497
+ if File.exists?(filename)
498
+ defarr = File.open(filename,'r').readlines
499
+ else
500
+ arr = []
501
+ arr << " NO HELP SPECIFIED FOR APP "
502
+ arr << " "
503
+ arr << " --- General help --- "
504
+ arr << " F10 - exit application "
505
+ arr << " Alt-x - select commands "
506
+ arr << " : (or M-:) - select commands "
507
+ arr << " ? (or M-?) - current widget key bindings "
508
+ arr << " "
509
+ defarr = arr
510
+ end
511
+ defhelp = true
512
+ if respond_to? :help_text
513
+ arr = help_text()
514
+ defhelp = false
515
+ elsif @_help_text
516
+ arr = @_help_text
517
+ defhelp = false
518
+ else
519
+ arr = defarr
520
+ end
521
+ case arr
522
+ when String
523
+ arr = arr.split("\n")
524
+ when Array
525
+ end
526
+ #w = arr.max_by(&:length).length
527
+ h = FFI::NCurses.LINES - 4
528
+ w = FFI::NCurses.COLS - 10
529
+
530
+ require 'rbhex/core/util/viewer'
531
+ RubyCurses::Viewer.view(arr, :layout => [2, 4, h, w],:close_key => KEY_F10, :title => "[ Help ]", :print_footer => true) do |t|
532
+ # you may configure textview further here.
533
+ #t.suppress_borders true
534
+ #t.color = :black
535
+ #t.bgcolor = :white
536
+ # or
537
+ #t.attr = :reverse
538
+
539
+ # help was provided, so default help is provided in second buffer
540
+ unless defhelp
541
+ t.add_content defarr, :title => ' General Help '
542
+ end
543
+ end
544
+ end
545
+ #
546
+ =begin
547
+ http://www.kammerl.de/ascii/AsciiSignature.php
548
+ ___
549
+ |__ \
550
+ ) |
551
+ / /
552
+ |_|
553
+ (_)
554
+
555
+ _
556
+ | |
557
+ | |
558
+ | |
559
+ |_|
560
+ (_)
561
+
562
+
563
+ _____ _ _____
564
+ | __ \ | | / ____|
565
+ | |__) | _| |__ _ _ | | _ _ _ __ ___ ___ ___
566
+ | _ / | | | '_ \| | | | | | | | | | '__/ __|/ _ \/ __|
567
+ | | \ \ |_| | |_) | |_| | | |___| |_| | | \__ \ __/\__ \
568
+ |_| \_\__,_|_.__/ \__, | \_____\__,_|_| |___/\___||___/
569
+ __/ |
570
+ |___/
571
+
572
+ =end
573
+
574
+