rbcurse 1.3.0 → 1.4.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 (70) hide show
  1. data/CHANGELOG +33 -0
  2. data/README.markdown +7 -1
  3. data/TODO2.txt +21 -15
  4. data/VERSION +1 -1
  5. data/examples/abasiclist.rb +2 -2
  6. data/examples/alpmenu.rb +1 -1
  7. data/examples/app.rb +0 -1
  8. data/examples/appdirtree.rb +4 -2
  9. data/examples/appemail.rb +7 -3
  10. data/examples/appemaillb.rb +1 -1
  11. data/examples/appgcompose.rb +2 -2
  12. data/examples/appgmail.rb +1 -1
  13. data/examples/appmethods.rb +20 -2
  14. data/examples/atree.rb +9 -1
  15. data/examples/dbdemo.rb +460 -0
  16. data/examples/dirtree.rb +1 -1
  17. data/examples/menu1.rb +37 -5
  18. data/examples/multispl.rb +1 -1
  19. data/examples/rfe.rb +9 -2
  20. data/examples/splitp.rb +1 -1
  21. data/examples/sqlc.rb +6 -10
  22. data/examples/sqlm.rb +2 -20
  23. data/examples/sqlt.rb +408 -0
  24. data/examples/term2.rb +1 -1
  25. data/examples/test2.rb +169 -97
  26. data/examples/testapp.rb +1 -1
  27. data/examples/testapp2.rb +1 -1
  28. data/examples/testkeypress.rb +4 -2
  29. data/examples/testtable.rb +6 -0
  30. data/examples/testtpane.rb +35 -23
  31. data/examples/testvimsplit.rb +3 -2
  32. data/lib/rbcurse.rb +1 -1
  33. data/lib/rbcurse/action.rb +8 -0
  34. data/lib/rbcurse/app.rb +39 -23
  35. data/lib/rbcurse/extras/bottomline.rb +101 -13
  36. data/lib/rbcurse/extras/directorylist.rb +14 -5
  37. data/lib/rbcurse/extras/divider.rb +1 -1
  38. data/lib/rbcurse/extras/listselectable.rb +42 -8
  39. data/lib/rbcurse/extras/masterdetail.rb +2 -2
  40. data/lib/rbcurse/extras/scrollbar.rb +11 -2
  41. data/lib/rbcurse/extras/statusline.rb +56 -0
  42. data/lib/rbcurse/extras/stdscrwindow.rb +11 -0
  43. data/lib/rbcurse/extras/tabular.rb +2 -1
  44. data/lib/rbcurse/extras/tabularwidget.rb +60 -17
  45. data/lib/rbcurse/extras/viewer.rb +16 -4
  46. data/lib/rbcurse/keylabelprinter.rb +34 -4
  47. data/lib/rbcurse/listeditable.rb +5 -1
  48. data/lib/rbcurse/listkeys.rb +1 -1
  49. data/lib/rbcurse/listscrollable.rb +15 -8
  50. data/lib/rbcurse/rbasiclistbox.rb +44 -23
  51. data/lib/rbcurse/rcommandwindow.rb +8 -14
  52. data/lib/rbcurse/rdialogs.rb +187 -2
  53. data/lib/rbcurse/rlistbox.rb +38 -19
  54. data/lib/rbcurse/rmenu.rb +313 -93
  55. data/lib/rbcurse/rmessagebox.rb +3 -2
  56. data/lib/rbcurse/rmulticontainer.rb +5 -3
  57. data/lib/rbcurse/rmultisplit.rb +2 -11
  58. data/lib/rbcurse/rmultitextview.rb +4 -5
  59. data/lib/rbcurse/rtabbedpane.rb +223 -69
  60. data/lib/rbcurse/rtable.rb +6 -10
  61. data/lib/rbcurse/rtextarea.rb +57 -36
  62. data/lib/rbcurse/rtextview.rb +12 -15
  63. data/lib/rbcurse/rtree.rb +79 -22
  64. data/lib/rbcurse/rvimsplit.rb +16 -25
  65. data/lib/rbcurse/rwidget.rb +376 -523
  66. data/lib/rbcurse/tree/treecellrenderer.rb +24 -11
  67. data/lib/rbcurse/tree/treemodel.rb +1 -1
  68. data/lib/ver/window.rb +130 -66
  69. metadata +5 -3
  70. data/examples/term.rb +0 -48
@@ -53,7 +53,6 @@ module RubyCurses
53
53
  print_footer pf
54
54
  footer_attrib fa
55
55
  end
56
- textview.set_content content #, :WRAP_WORD
57
56
 
58
57
  t = textview
59
58
  t.bind_key('<'){ f = t.form.window; c = f.left - 1; f.hide; f.mvwin(f.top, c); f.show;
@@ -69,25 +68,30 @@ module RubyCurses
69
68
  f.reset_layout([f.height, f.width, c, f.left]); f.show;
70
69
  }
71
70
  # yielding textview so you may further configure or bind keys or events
71
+ begin
72
+ textview.set_content content #, :WRAP_WORD
72
73
  yield textview if block_given? # tentative
73
74
  v_form.repaint
74
75
  v_window.wrefresh
75
76
  Ncurses::Panel.update_panels
76
- begin
77
+ # allow closing using q and Ctrl-q in addition to any key specified
78
+ # user should not need to specify key, since that becomes inconsistent across usages
77
79
  while((ch = v_window.getchar()) != ?\C-q.getbyte(0) )
78
- break if ch == config[:close_key]
80
+ break if ch == config[:close_key] || ch == ?q.ord
79
81
  # if you've asked for RETURN then i also check for 10 and 13
80
82
  break if (ch == 10 || ch == 13) && config[:close_key] == KEY_RETURN
81
83
  v_form.handle_key ch
82
84
  v_form.repaint
83
85
  end
86
+ rescue => err
87
+ alert err.to_s
84
88
  ensure
85
89
  v_window.destroy if !v_window.nil?
86
90
  end
87
91
  end
88
92
  private
89
93
  def self._get_contents fp
90
- return nil unless File.readable? fp
94
+ return "File #{fp} not readable" unless File.readable? fp
91
95
  return Dir.new(fp).entries if File.directory? fp
92
96
  case File.extname(fp)
93
97
  when '.tgz','.gz'
@@ -96,6 +100,14 @@ module RubyCurses
96
100
  when '.zip'
97
101
  cmd = "unzip -l #{fp}"
98
102
  content = %x[#{cmd}]
103
+ when '.jar', '.gem'
104
+ cmd = "tar -tvf #{fp}"
105
+ content = %x[#{cmd}]
106
+ when '.png', '.out','.jpg', '.gif','.pdf'
107
+ content = "File #{fp} not displayable"
108
+ when '.sqlite'
109
+ cmd = "sqlite3 #{fp} 'select name from sqlite_master;'"
110
+ content = %x[#{cmd}]
99
111
  else
100
112
  content = File.open(fp,"r").readlines
101
113
  end
@@ -2,12 +2,37 @@ require 'rbcurse/rwidget'
2
2
  #include Ncurses # FFI 2011-09-8
3
3
  include RubyCurses
4
4
  module RubyCurses
5
+ #
6
+ # This paints labels for various keys at the bottom of the screen, in 2 rows.
7
+ # This is based on alpines last 2 rows. Modes are supported so that the
8
+ # labels change as you enter a widget.
9
+ # For an example, see dbdemo.rb or rfe.rb
10
+ # NOTE: applications using 'App' use a shortcut "dock" to create this.
11
+ #
12
+ # The most minimal keylabel to print one label in first row, and none in second is:
13
+ # [["F1", "Help"], nil]
14
+ # To print 2 labels, one over the other:
15
+ # [["F1", "Help"], ["F10", "Quit"]]
16
+ #
5
17
  class KeyLabelPrinter < Widget
6
18
  attr_reader :key_labels
19
+ # the current mode (labels are based on mode, changing the mode, changes the labels
20
+ # displayed)
7
21
  dsl_property :mode
22
+ # set the color of the labels, overriding the defaults
23
+ dsl_accessor :footer_color_pair
24
+ # set the color of the mnemonic, overriding the defaults
25
+ dsl_accessor :footer_mnemonic_color_pair
8
26
 
9
27
  def initialize form, key_labels, config={}, &block
10
28
 
29
+ case key_labels
30
+ when Hash
31
+ raise "KeyLabelPrinter: KeyLabels cannot be a hash, Array of key labels required. Perhaps you did not pass labels"
32
+ when Array
33
+ else
34
+ raise "KeyLabelPrinter: Array of key labels required. Perhaps you did not pass labels"
35
+ end
11
36
  super form, config, &block
12
37
  @mode ||= :normal
13
38
  #@key_labels = key_labels
@@ -16,14 +41,14 @@ module RubyCurses
16
41
  @editable = false
17
42
  @focusable = false
18
43
  @cols ||= Ncurses.COLS-1
19
- @row ||= Ncurses.LINES-3
44
+ @row ||= Ncurses.LINES-2
20
45
  @col ||= 0
21
46
  @repaint_required = true
22
47
  @footer_color_pair ||= $bottomcolor
23
48
  @footer_mnemonic_color_pair ||= $reversecolor #2
24
49
  end
25
50
  def key_labels mode=@mode
26
- @key_hash[mode]
51
+ @key_hash[mode]
27
52
  end
28
53
  # returns the keys as printed. these may or may not help
29
54
  # in validation depedign on what you passed as zeroth index
@@ -46,16 +71,21 @@ module RubyCurses
46
71
  def repaint
47
72
  return unless @repaint_required
48
73
  r,c = rowcol
49
- print_key_labels(arr = key_labels(), mode=@mode)
74
+ arr = key_labels()
75
+ print_key_labels(arr, mode=@mode)
50
76
  @repaint_required = false
51
77
  end
78
+ # ?? does not use mode, i think key_labels is unused. a hash is now used 2011-10-11 XXX FIXME
79
+ # WARNING, i have not tested this after changing it.
52
80
  def append_key_label key, label, mode=@mode
53
- @key_labels << [key, label] if !@key_labels.include? [key, label]
81
+ #@key_labels << [key, label] if !@key_labels.include? [key, label]
82
+ @key_hash[mode] << [key, label] if !@key_hash[mode].include? [key, label]
54
83
  @repaint_required = true
55
84
  end
56
85
  def print_key_labels(arr = key_labels(), mode=@mode)
57
86
  #return if !@show_key_labels # XXX
58
87
  @win ||= @form.window
88
+ $log.debug "XXX: PKL #{arr.length}, #{arr}"
59
89
  @padding = @cols / (arr.length/2)
60
90
  posx = 0
61
91
  even = []
@@ -142,9 +142,11 @@ module ListEditable
142
142
  # user requested this kill to be appened to last kill, so it can be yanked as one
143
143
  #$kill_ring.last << list
144
144
  last = $kill_ring.pop
145
+ $log.debug "YANK: addto : last= #{last} , list= #{list} "
145
146
  case list
146
147
  when Array
147
- list.insert 0, last
148
+ #list.insert 0, last
149
+ list.insert 0, *last # 2011-10-10 changed as it was wrong in textarea
148
150
  $kill_ring << list
149
151
  when String
150
152
  $kill_ring << [last, list]
@@ -154,6 +156,7 @@ module ListEditable
154
156
  end
155
157
  $kill_ring_pointer = $kill_ring.size
156
158
  $append_next_kill = false
159
+ $log.debug "YANK: kill_ring: #{$kill_ring} "
157
160
  end
158
161
 
159
162
  # pastes recent (last) entry of kill_ring.
@@ -163,6 +166,7 @@ module ListEditable
163
166
  return -1 if !@editable
164
167
  return if $kill_ring.empty?
165
168
  row = $kill_ring.last
169
+ $log.debug "YANK: row #{row} "
166
170
  index = where
167
171
  case row
168
172
  when Array
@@ -4,7 +4,7 @@ module RubyCurses
4
4
  # That was possible earlier, but now that i am binding the key at construction time
5
5
  # any changes to the vars after construction won't have an effect.
6
6
  def install_list_keys
7
- # @KEY_ROW_SELECTOR ||= ?\C-x.getbyte(0) # need to changed from C-x since used for actions # changed 2011 dts
7
+ #@KEY_ROW_SELECTOR ||= ?\C-x.getbyte(0) # need to changed from C-x since used for actions # changed 2011 dts
8
8
  @KEY_ROW_SELECTOR ||= 0 # need to changed from C-x since used for actions
9
9
  @KEY_BLOCK_SELECTOR ||= ?\M-x.getbyte(0) # need to change since M-x used for commands
10
10
  @KEY_GOTO_TOP ||= ?\M-0.getbyte(0)
@@ -12,7 +12,7 @@ module ListScrollable
12
12
  attr_accessor :show_caret # 2010-01-23 23:06 our own fake insertion point
13
13
  def previous_row num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
14
14
  #return :UNHANDLED if @current_index == 0 # EVIL
15
- return false if @current_index == 0
15
+ return :NO_PREVIOUS_ROW if @current_index == 0
16
16
  @oldrow = @current_index
17
17
  # NOTE that putting a multiplier inside, prevents an event from being triggered for each row's
18
18
  # on leave and on enter
@@ -29,7 +29,7 @@ module ListScrollable
29
29
  # next field. however, in long lists when user scrolls the sudden jumping to next is very annoying.
30
30
  # In combos, if focus was on last row, the combo closed which is not accceptable.
31
31
  #return :UNHANDLED if @current_index == rc-1 # EVIL !!!
32
- return false if @current_index == rc-1
32
+ return :NO_NEXT_ROW if @current_index == rc-1 # changed 2011-10-5 so process can do something
33
33
  @oldrow = @current_index
34
34
  @current_index += 1*num if @current_index < rc
35
35
  bounds_check
@@ -160,7 +160,7 @@ module ListScrollable
160
160
  def scroll_right
161
161
  $log.debug " inside scroll_right "
162
162
  hscrollcols = $multiplier > 0 ? $multiplier : @width/2
163
- $log.debug " scroll_right mult:#{$multiplier} , hscrollcols #{hscrollcols}, w: #{@width} ll:#{@longest_line} "
163
+ $log.debug " scroll_right mult:#{$multiplier} , hscrollcols #{hscrollcols}, pcol #{@pcol} w: #{@width} ll:#{@longest_line} "
164
164
  #blen = @buffer.rstrip.length
165
165
  blen = @longest_line
166
166
  @pcol += hscrollcols if @pcol + @width < blen
@@ -292,7 +292,11 @@ module ListScrollable
292
292
  @search_start_ix = start
293
293
  regex = Regexp.new(regex, Regexp::IGNORECASE) if @search_case
294
294
  start.upto(fend) do |ix|
295
- row = @list[ix].to_s
295
+ row1 = @list[ix].to_s
296
+
297
+ # 2011-09-29 crashing on a character F3 in log file
298
+ row = row1.encode("ASCII-8BIT", :invalid => :replace, :undef => :replace, :replace => "?")
299
+
296
300
  m=row.match(regex)
297
301
  if !m.nil?
298
302
  @find_offset = m.offset(0)[0]
@@ -473,13 +477,16 @@ module ListScrollable
473
477
  end
474
478
  # returns only the visible portion of string taking into account display length
475
479
  # and horizontal scrolling. MODIFIES STRING
480
+ # NOTE truncate does not take into account left_margin that some widgets might use
476
481
  def truncate content #:nodoc:
477
- maxlen = @maxlen || @width-2
482
+ #maxlen = @maxlen || @width-2
483
+ _maxlen = @maxlen || @width-@internal_width
484
+ _maxlen = @width-@internal_width if _maxlen > @width-@internal_width
478
485
  if !content.nil?
479
- if content.length > maxlen # only show maxlen
486
+ if content.length > _maxlen # only show maxlen
480
487
  @longest_line = content.length if content.length > @longest_line
481
- #content = content[@pcol..@pcol+maxlen-1]
482
- content.replace content[@pcol..@pcol+maxlen-1]
488
+ #content = content[@pcol..@pcol+_maxlen-1]
489
+ content.replace content[@pcol..@pcol+_maxlen-1]
483
490
  else
484
491
  # can this be avoided if pcol is 0 XXX
485
492
  content.replace content[@pcol..-1] if @pcol > 0
@@ -16,7 +16,6 @@ require 'rbcurse/listcellrenderer'
16
16
  require 'forwardable'
17
17
 
18
18
 
19
- #include Ncurses # FFI 2011-09-8
20
19
  module RubyCurses
21
20
  extend self
22
21
  ##
@@ -34,9 +33,9 @@ module RubyCurses
34
33
  class BasicListbox < Widget
35
34
 
36
35
  require 'rbcurse/listscrollable'
37
- #require 'rbcurse/listselectable'
38
- #require 'rbcurse/defaultlistselectionmodel'
36
+ require 'rbcurse/extras/listselectable' # added 2011-10-8
39
37
  include ListScrollable
38
+ include NewListSelectable # added 2011-10-8
40
39
  extend Forwardable
41
40
  dsl_accessor :height
42
41
  dsl_accessor :title
@@ -94,8 +93,6 @@ module RubyCurses
94
93
  @_events.push(*[:ENTER_ROW, :LEAVE_ROW, :LIST_SELECTION_EVENT, :PRESS])
95
94
  @selection_mode ||= :multiple # default is multiple, anything else given becomes single
96
95
  @win = @graphic # 2010-01-04 12:36 BUFFERED replace form.window with graphic
97
- # moving down to repaint so that scrollpane can set should_buffered
98
- # added 2010-02-17 23:05 RFED16 so we don't need a form.
99
96
  @win_left = 0
100
97
  @win_top = 0
101
98
 
@@ -140,6 +137,7 @@ module RubyCurses
140
137
  bind_key(32){ toggle_row_selection() }
141
138
  bind_key(10){ fire_action_event }
142
139
  bind_key(13){ fire_action_event }
140
+ list_bindings
143
141
  @keys_mapped = true
144
142
 
145
143
  end
@@ -185,12 +183,16 @@ module RubyCurses
185
183
  else
186
184
  raise ArgumentError, "Listbox list(): do not know how to handle #{alist.class} "
187
185
  end
188
- # added on 2009-01-13 23:19 since updates are not automatic now
189
- #create_default_list_selection_model
190
- #@list_selection_model.selection_mode = @tmp_selection_mode if @tmp_selection_mode
186
+ clear_selection
187
+
191
188
  @repaint_required = true
192
189
  @list
193
190
  end
191
+ # conv method to insert data, trying to keep names same across along with Tabular, TextView,
192
+ # TextArea and listbox. Don;t use this till i am certain.
193
+ def data=(val)
194
+ list(val)
195
+ end
194
196
  # get element at
195
197
  # @param [Fixnum] index for element
196
198
  # @return [Object] element
@@ -375,6 +377,7 @@ module RubyCurses
375
377
  Ncurses.beep
376
378
  return :UNHANDLED
377
379
  end
380
+ super # forgot this 2011-10-9 that's why events not firign
378
381
  on_enter_row @current_index
379
382
  set_form_row # added 2009-01-11 23:41
380
383
  true
@@ -404,7 +407,6 @@ module RubyCurses
404
407
  # processing. also, it pans the data horizontally giving the renderer
405
408
  # a section of it.
406
409
  def repaint #:nodoc:
407
- #safe_create_buffer # 2010-01-04 12:36 BUFFERED moved here 2010-01-05 18:07
408
410
  return unless @repaint_required
409
411
  # not sure where to put this, once for all or repeat 2010-02-17 23:07 RFED16
410
412
  my_win = @form ? @form.window : @target_window
@@ -467,8 +469,6 @@ module RubyCurses
467
469
  end # rc == 0
468
470
  #@table_changed = false
469
471
  @repaint_required = false
470
- #@buffer_modified = true # required by form to call buffer_to_screen BUFFERED
471
- #buffer_to_window # RFED16 2010-02-17 23:16
472
472
  end
473
473
  # the idea here is to allow users who subclass Listbox to easily override parts of the cumbersome repaint
474
474
  # method. This assumes your List has some data, but you print a lot more. Now you don't need to
@@ -484,7 +484,7 @@ module RubyCurses
484
484
  value.to_s if value
485
485
  end
486
486
  end
487
- # takes a block, this way anyone extending this class can just pass a block to do his job
487
+ # takes a block, this way anyone extending this klass can just pass a block to do his job
488
488
  # This modifies the string
489
489
  def sanitize content #:nodoc:
490
490
  if content.is_a? String
@@ -531,8 +531,6 @@ module RubyCurses
531
531
  def set_form_col col1=0 #:nodoc:
532
532
  @cols_panned ||= 0
533
533
  # editable listboxes will involve changing cursor and the form issue
534
- ## added win_col on 2010-01-04 23:28 for embedded forms BUFFERED TRYING OUT
535
- #win_col=@form.window.left
536
534
  win_col = 0
537
535
  col2 = win_col + @col + @col_offset + col1 + @cols_panned + @left_margin
538
536
  $log.debug " set_form_col in rlistbox #{@col}+ left_margin #{@left_margin} ( #{col2} ) "
@@ -543,17 +541,25 @@ module RubyCurses
543
541
 
544
542
  # change selection of current row on pressing space bar
545
543
  # If mode is multiple, then other selections are cleared and this is added
546
- def toggle_row_selection crow=@current_index
544
+ # NOTE: 2011-10-8 allow multiple select on spacebar. Using C-Space was quite unfriendly
545
+ # although it will still work
546
+ def OLDtoggle_row_selection crow=@current_index
547
547
  @repaint_required = true
548
+ row = crow
548
549
  case @selection_mode
549
550
  when :multiple
550
- clear_selection
551
- @selected_indices[0] = crow #@current_index
551
+ add_to_selection
552
+ #clear_selection
553
+ #@selected_indices[0] = crow #@current_index
552
554
  else
553
555
  if @selected_index == crow #@current_index
554
556
  @selected_index = nil
557
+ lse = ListSelectionEvent.new(crow, crow, self, :DELETE)
558
+ fire_handler :LIST_SELECTION_EVENT, lse
555
559
  else
556
560
  @selected_index = crow #@current_index
561
+ lse = ListSelectionEvent.new(crow, crow, self, :INSERT)
562
+ fire_handler :LIST_SELECTION_EVENT, lse
557
563
  end
558
564
  end
559
565
  end
@@ -562,24 +568,29 @@ module RubyCurses
562
568
  # add an item to selection, if selection mode is multiple
563
569
  # if item already selected, it is deselected, else selected
564
570
  # typically bound to Ctrl-Space
565
- def add_to_selection
571
+ def OLDadd_to_selection
572
+ crow = @current_index
566
573
  case @selection_mode
567
574
  when :multiple
568
575
  if @selected_indices.include? @current_index
569
576
  @selected_indices.delete @current_index
577
+ lse = ListSelectionEvent.new(crow, crow, self, :DELETE)
578
+ fire_handler :LIST_SELECTION_EVENT, lse
570
579
  else
571
580
  @selected_indices << @current_index
581
+ lse = ListSelectionEvent.new(crow, crow, self, :INSERT)
582
+ fire_handler :LIST_SELECTION_EVENT, lse
572
583
  end
573
584
  else
574
585
  end
575
586
  @repaint_required = true
576
587
  end
577
588
  # clears selected indices
578
- def clear_selection
589
+ def OLDclear_selection
579
590
  @selected_indices = []
580
591
  @repaint_required = true
581
592
  end
582
- def is_row_selected crow=@current_index
593
+ def OLDis_row_selected crow=@current_index
583
594
  case @selection_mode
584
595
  when :multiple
585
596
  @selected_indices.include? crow
@@ -602,6 +613,19 @@ module RubyCurses
602
613
  @current_index = row
603
614
  @repaint_required = true # fire list_select XXX
604
615
  end
616
+ # Returns selected indices
617
+ # Indices are often required since the renderer may modify the values displayed
618
+ #
619
+ def get_selected_indices; @selected_indices; end
620
+
621
+ # Returns selected values
622
+ #
623
+ def get_selected_values
624
+ selected = []
625
+ @selected_indices.each { |i| selected << @list[i] }
626
+ return selected
627
+ end
628
+ alias :selected_values :get_selected_values
605
629
 
606
630
 
607
631
 
@@ -648,9 +672,6 @@ module RubyCurses
648
672
  @attrs[:focussed] = $row_focussed_attr
649
673
 
650
674
  end
651
- def getvalue
652
- @text
653
- end
654
675
  ##
655
676
  # sets @color_pair and @attr
656
677
  def select_colors focussed, selected
@@ -26,7 +26,6 @@ module RubyCurses
26
26
  dsl_accessor :height, :width, :top, :left # 2009-01-06 00:05 after removing meth missing
27
27
 
28
28
  def initialize form=nil, aconfig={}, &block
29
- #@form = form
30
29
  @config = aconfig
31
30
  @config.each_pair { |k,v| instance_variable_set("@#{k}",v) }
32
31
  instance_eval &block if block_given?
@@ -44,15 +43,6 @@ module RubyCurses
44
43
  @bottomline.name = "rcommandwindow's bl"
45
44
  extend Forwardable
46
45
  def_delegators :@bottomline, :ask, :say, :agree, :choose #, :display_text_interactive
47
- #if @form.nil?
48
- #@form = RubyCurses::Form.new @window
49
- #else
50
- #@form.window = @window
51
- #end
52
- #acolor = get_color $reversecolor
53
- #color = get_color $datacolor
54
- #@window.printstring 0,0,"hello there", $normalcolor, 'normal'
55
- #@window.bkgd(Ncurses.COLOR_PAIR(acolor));
56
46
  if @box == :border
57
47
  @window.box 0,0
58
48
  elsif @box
@@ -66,9 +56,7 @@ module RubyCurses
66
56
  @window.wrefresh
67
57
  @panel = @window.panel
68
58
  Ncurses::Panel.update_panels
69
- #@form.repaint
70
59
  @window.wrefresh
71
- #handle_keys
72
60
  @row_offset = 0
73
61
  if @box
74
62
  @row_offset = 1
@@ -127,7 +115,6 @@ module RubyCurses
127
115
  when 0
128
116
  @start = 0
129
117
  end
130
- #@form.repaint
131
118
  Ncurses::Panel.update_panels();
132
119
  Ncurses.doupdate();
133
120
  @window.wrefresh
@@ -166,7 +153,7 @@ module RubyCurses
166
153
  # do not go more than 3 columns and do not print more than window TODO FIXME
167
154
  def display_menu list, options={}
168
155
  indexing = options[:indexing]
169
- max_cols = 3
156
+ max_cols = 3 # maximum no of columns, we will reduce based on data size
170
157
  l_succ = "`"
171
158
  act_height = @height
172
159
  if @box
@@ -194,6 +181,13 @@ module RubyCurses
194
181
  h = act_height
195
182
  cols = (lh*1.0 / h).ceil
196
183
  cols = max_cols if cols > max_cols
184
+ # sometimes elements are large like directory paths, so check size
185
+ datasize = list.first.length
186
+ if datasize > @width/3 # keep safety margin since checking only first row
187
+ cols = 1
188
+ elsif datasize > @width/2
189
+ cols = [2,cols].min
190
+ end
197
191
  adv = (@width/cols).to_i
198
192
  colct = 0
199
193
  col = 1