rbcurse-core 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,147 +7,148 @@
7
7
  # @toprow : set to 0 for starters, top row to be displayed
8
8
  # @pcol (used for horiz scrolling, starts at 0)
9
9
  #
10
- module ListScrollable
11
- attr_reader :search_found_ix, :find_offset, :find_offset1
12
- attr_accessor :show_caret # 2010-01-23 23:06 our own fake insertion point
13
- def previous_row num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
14
- #return :UNHANDLED if @current_index == 0 # EVIL
15
- return :NO_PREVIOUS_ROW if @current_index == 0
16
- @oldrow = @current_index
17
- # NOTE that putting a multiplier inside, prevents an event from being triggered for each row's
18
- # on leave and on enter
19
- num.times {
20
- @current_index -= 1 if @current_index > 0
21
- }
22
- bounds_check
23
- $multiplier = 0
24
- end
25
- alias :up :previous_row
26
- def next_row num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
27
- rc = row_count
28
- # returning unhandled was clever .. when user hits down arrow on last row the focus goes to
29
- # next field. however, in long lists when user scrolls the sudden jumping to next is very annoying.
30
- # In combos, if focus was on last row, the combo closed which is not accceptable.
31
- #return :UNHANDLED if @current_index == rc-1 # EVIL !!!
32
- return :NO_NEXT_ROW if @current_index == rc-1 # changed 2011-10-5 so process can do something
33
- @oldrow = @current_index
34
- @current_index += 1*num if @current_index < rc
35
- bounds_check
36
- $multiplier = 0
37
- end
38
- alias :down :next_row
39
- def goto_bottom
40
- @oldrow = @current_index
41
- rc = row_count
42
- @current_index = rc -1
43
- bounds_check
44
- end
45
- alias :goto_end :goto_bottom
46
- def goto_top
47
- @oldrow = @current_index
48
- @current_index = 0
49
- bounds_check
50
- end
51
- alias :goto_start :goto_top
52
- def scroll_backward
53
- @oldrow = @current_index
54
- h = scrollatrow()
55
- m = $multiplier == 0? 1 : $multiplier
56
- @current_index -= h * m
57
- bounds_check
58
- $multiplier = 0
59
- end
60
- def scroll_forward
61
- @oldrow = @current_index
62
- h = scrollatrow()
63
- rc = row_count
64
- m = $multiplier == 0? 1 : $multiplier
65
- # more rows than box
66
- if h * m < rc
67
- # next 2 lines were preventing widget_scrolled from being set to true,
68
- # so i've modified it slightly as per scroll_down 2011-11-1
69
- #@toprow += h+1 #if @current_index+h < rc
70
- #@current_index = @toprow
71
- @current_index += h+1
72
- else
73
- # fewer rows than box
10
+ module RubyCurses
11
+ module ListScrollable
12
+ attr_reader :search_found_ix, :find_offset, :find_offset1
13
+ attr_accessor :show_caret # 2010-01-23 23:06 our own fake insertion point
14
+ def previous_row num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
15
+ #return :UNHANDLED if @current_index == 0 # EVIL
16
+ return :NO_PREVIOUS_ROW if @current_index == 0
17
+ @oldrow = @current_index
18
+ # NOTE that putting a multiplier inside, prevents an event from being triggered for each row's
19
+ # on leave and on enter
20
+ num.times {
21
+ @current_index -= 1 if @current_index > 0
22
+ }
23
+ bounds_check
24
+ $multiplier = 0
25
+ end
26
+ alias :up :previous_row
27
+ def next_row num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
28
+ rc = row_count
29
+ # returning unhandled was clever .. when user hits down arrow on last row the focus goes to
30
+ # next field. however, in long lists when user scrolls the sudden jumping to next is very annoying.
31
+ # In combos, if focus was on last row, the combo closed which is not accceptable.
32
+ #return :UNHANDLED if @current_index == rc-1 # EVIL !!!
33
+ return :NO_NEXT_ROW if @current_index == rc-1 # changed 2011-10-5 so process can do something
34
+ @oldrow = @current_index
35
+ @current_index += 1*num if @current_index < rc
36
+ bounds_check
37
+ $multiplier = 0
38
+ end
39
+ alias :down :next_row
40
+ def goto_bottom
41
+ @oldrow = @current_index
42
+ rc = row_count
74
43
  @current_index = rc -1
44
+ bounds_check
45
+ end
46
+ alias :goto_end :goto_bottom
47
+ def goto_top
48
+ @oldrow = @current_index
49
+ @current_index = 0
50
+ bounds_check
51
+ end
52
+ alias :goto_start :goto_top
53
+ def scroll_backward
54
+ @oldrow = @current_index
55
+ h = scrollatrow()
56
+ m = $multiplier == 0? 1 : $multiplier
57
+ @current_index -= h * m
58
+ bounds_check
59
+ $multiplier = 0
60
+ end
61
+ def scroll_forward
62
+ @oldrow = @current_index
63
+ h = scrollatrow()
64
+ rc = row_count
65
+ m = $multiplier == 0? 1 : $multiplier
66
+ # more rows than box
67
+ if h * m < rc
68
+ # next 2 lines were preventing widget_scrolled from being set to true,
69
+ # so i've modified it slightly as per scroll_down 2011-11-1
70
+ #@toprow += h+1 #if @current_index+h < rc
71
+ #@current_index = @toprow
72
+ @current_index += h+1
73
+ else
74
+ # fewer rows than box
75
+ @current_index = rc -1
76
+ end
77
+ #@current_index += h+1 #if @current_index+h < rc
78
+ bounds_check
75
79
  end
76
- #@current_index += h+1 #if @current_index+h < rc
77
- bounds_check
78
- end
79
80
 
80
- ##
81
- # please set oldrow before calling this. Store current_index as oldrow before changing. NOTE
82
- def bounds_check
83
- h = scrollatrow()
84
- rc = row_count
85
- @old_toprow = @toprow
81
+ ##
82
+ # please set oldrow before calling this. Store current_index as oldrow before changing. NOTE
83
+ def bounds_check
84
+ h = scrollatrow()
85
+ rc = row_count
86
+ @old_toprow = @toprow
86
87
 
87
- @_header_adjustment ||= 0
88
- @current_index = 0 if @current_index < 0 # not lt 0
89
- @current_index = rc-1 if @current_index >= rc && rc>0 # not gt rowcount
90
- @toprow = rc-h-1 if rc > h && @toprow > rc - h - 1 # toprow shows full page if possible
91
- # curr has gone below table, move toprow forward
92
- if @current_index - @toprow > h
93
- @toprow = @current_index - h
94
- elsif @current_index < @toprow
95
- # curr has gone above table, move toprow up
96
- # sometimes current row gets hidden below header line
97
- @toprow = @current_index - (@_header_adjustment ||0)
98
- # prev line can make top row -1, however, if we are going back, lets
99
- # put it at start of page, so first or second row is not hidden
100
- @toprow = 0 if @toprow < h
101
- end
102
-
103
- @row_changed = false
104
- if @oldrow != @current_index
105
- on_leave_row @oldrow if respond_to? :on_leave_row # to be defined by widget that has included this
106
- on_enter_row @current_index if respond_to? :on_enter_row # to be defined by widget that has included this
107
- set_form_row
108
- @row_changed = true
109
- end
110
- #set_form_row # 2011-10-13
88
+ @_header_adjustment ||= 0
89
+ @current_index = 0 if @current_index < 0 # not lt 0
90
+ @current_index = rc-1 if @current_index >= rc && rc>0 # not gt rowcount
91
+ @toprow = rc-h-1 if rc > h && @toprow > rc - h - 1 # toprow shows full page if possible
92
+ # curr has gone below table, move toprow forward
93
+ if @current_index - @toprow > h
94
+ @toprow = @current_index - h
95
+ elsif @current_index < @toprow
96
+ # curr has gone above table, move toprow up
97
+ # sometimes current row gets hidden below header line
98
+ @toprow = @current_index - (@_header_adjustment ||0)
99
+ # prev line can make top row -1, however, if we are going back, lets
100
+ # put it at start of page, so first or second row is not hidden
101
+ @toprow = 0 if @toprow < h
102
+ end
111
103
 
112
- if @old_toprow != @toprow # only if scrolling has happened should we repaint
113
- @repaint_required = true #if @old_toprow != @toprow # only if scrolling has happened should we repaint
114
- @widget_scrolled = true
115
- end
116
- end
117
- # the cursor should be appropriately positioned
118
- def set_form_row
119
- r,c = rowcol
120
- @rows_panned ||= 0
121
-
122
- win_row = 0 # 2010-02-07 21:44 now ext offset added by widget
104
+ @row_changed = false
105
+ if @oldrow != @current_index
106
+ on_leave_row @oldrow if respond_to? :on_leave_row # to be defined by widget that has included this
107
+ on_enter_row @current_index if respond_to? :on_enter_row # to be defined by widget that has included this
108
+ set_form_row
109
+ @row_changed = true
110
+ end
111
+ #set_form_row # 2011-10-13
123
112
 
124
- # when the toprow is set externally then cursor can be mispositioned since
125
- # bounds_check has not been called
126
- if @current_index < @toprow
127
- # cursor is outside table
128
- @current_index = @toprow # ??? only if toprow 2010-10-19 12:56
113
+ if @old_toprow != @toprow # only if scrolling has happened should we repaint
114
+ @repaint_required = true #if @old_toprow != @toprow # only if scrolling has happened should we repaint
115
+ @widget_scrolled = true
116
+ end
129
117
  end
118
+ # the cursor should be appropriately positioned
119
+ def set_form_row
120
+ r,c = rowcol
121
+ @rows_panned ||= 0
130
122
 
131
- row = win_row + r + (@current_index-@toprow) + @rows_panned
132
- #$log.debug " #{@name} set_form_row #{row} = ci #{@current_index} + r #{r} + winrow: #{win_row} - tr:#{@toprow} #{@toprow} + rowsp #{@rows_panned} "
133
- # row should not be < r or greater than r+height TODO FIXME
123
+ win_row = 0 # 2010-02-07 21:44 now ext offset added by widget
124
+
125
+ # when the toprow is set externally then cursor can be mispositioned since
126
+ # bounds_check has not been called
127
+ if @current_index < @toprow
128
+ # cursor is outside table
129
+ @current_index = @toprow # ??? only if toprow 2010-10-19 12:56
130
+ end
131
+
132
+ row = win_row + r + (@current_index-@toprow) + @rows_panned
133
+ #$log.debug " #{@name} set_form_row #{row} = ci #{@current_index} + r #{r} + winrow: #{win_row} - tr:#{@toprow} #{@toprow} + rowsp #{@rows_panned} "
134
+ # row should not be < r or greater than r+height TODO FIXME
134
135
 
135
-
136
-
137
- setrowcol row, nil
138
- #show_caret_func
139
- end
140
- ## In many situations like placing a textarea or textview inside a splitpane
141
- ##+ or scrollpane there have been issues getting the cursor at the right point,
142
- ##+ since there are multiple buffers. Finally in tabbedpanes, i am pretty
143
- ##+ lost getting the correct position, and i feel we should set the cursor
144
- ##+ internally once and for all. So here's an attempt
145
136
 
146
- # paint the cursor ourselves on the widget, rather than rely on getting to the top window with
147
- # the correct coordinates. I do need to erase cursor too. Can be dicey, but is worth the attempt.
148
- # This works perfectly, except for when placed in a Tabbedpane since that prints the form with a row offset
149
- #+ of 2 and the widget does not know of the offset. cursor gets it correct since the form has an add_row.
150
- def show_caret_func
137
+
138
+ setrowcol row, nil
139
+ #show_caret_func
140
+ end
141
+ ## In many situations like placing a textarea or textview inside a splitpane
142
+ ##+ or scrollpane there have been issues getting the cursor at the right point,
143
+ ##+ since there are multiple buffers. Finally in tabbedpanes, i am pretty
144
+ ##+ lost getting the correct position, and i feel we should set the cursor
145
+ ##+ internally once and for all. So here's an attempt
146
+
147
+ # paint the cursor ourselves on the widget, rather than rely on getting to the top window with
148
+ # the correct coordinates. I do need to erase cursor too. Can be dicey, but is worth the attempt.
149
+ # This works perfectly, except for when placed in a Tabbedpane since that prints the form with a row offset
150
+ #+ of 2 and the widget does not know of the offset. cursor gets it correct since the form has an add_row.
151
+ def show_caret_func
151
152
  return unless @show_caret
152
153
  # trying highlighting cursor 2010-01-23 19:07 TABBEDPANE TRYING
153
154
  # TODO take into account rows_panned etc ? I don't think so.
@@ -164,107 +165,107 @@ module ListScrollable
164
165
 
165
166
  $log.debug " #{@name} printing CARET at #{yy},#{xx}: fwt:- #{@win_top} r:#{@row} tr:-#{@toprow}+ci:#{@current_index},+r #{r} "
166
167
  if !@oldcursorrow.nil?
167
- @graphic.mvchgat(y=@oldcursorrow, x=@oldcursorcol, 1, Ncurses::A_NORMAL, $datacolor, NIL)
168
+ @graphic.mvchgat(y=@oldcursorrow, x=@oldcursorcol, 1, Ncurses::A_NORMAL, $datacolor, NIL)
168
169
  end
169
170
  @oldcursorrow = yy
170
171
  @oldcursorcol = xx
171
172
  @graphic.mvchgat(y=yy, x=xx, 1, Ncurses::A_NORMAL, $reversecolor, nil)
172
173
  @buffer_modified = true
173
- end
174
- def scroll_right
175
- $log.debug " inside scroll_right "
176
- hscrollcols = $multiplier > 0 ? $multiplier : @width/2
177
- #hscrollcols = $multiplier > 0 ? $multiplier : 1 # for testing out
178
- $log.debug " scroll_right mult:#{$multiplier} , hscrollcols #{hscrollcols}, pcol #{@pcol} w: #{@width} ll:#{@longest_line} "
179
- #blen = @buffer.rstrip.length
180
- blen = @longest_line
181
- if @pcol + @width < blen
182
- @pcol += hscrollcols if @pcol + @width < blen
183
- else
184
- # due to some change somewhere, sometimes width = longest which is not true
185
- hscrollcols = $multiplier > 0 ? $multiplier : 1
186
- @pcol += hscrollcols
187
- end
188
- @repaint_required = true
189
- end
190
- def scroll_left
191
- hscrollcols = $multiplier > 0 ? $multiplier : @width/2
192
- @pcol -= hscrollcols if @pcol > 0
193
- @pcol = 0 if @pcol < 0
194
- @repaint_required = true
195
- end
196
- ## returns cursor to last row (if moving columns in same row, won't work)
197
- # Useful after a large move such as 12j, 20 C-n etc, Mapped to '' in textview
198
- def goto_last_position
199
- return unless @oldrow
200
- @current_index = @oldrow
201
- bounds_check
202
- end
203
- # not that saving content_rows is buggy since we add rows.
204
- ##
205
- # caution, this now uses winrow not prow
206
- ## for user to know which row is being focussed on
207
- def focussed_index
208
- @current_index # 2009-01-07 14:35
209
- end
210
- # only to be used in single selection cases as focussed item FIXME.
211
- # best not to use, as can be implementation dep, use current_index
212
- def selected_item
213
- get_content()[focussed_index()]
214
- end
215
- #alias :current_index :focussed_index
216
- alias :selected_index :focussed_index
217
-
218
- # finds the next match for the char pressed
219
- # returning the index
220
- # If we are only checking first char, then why chomp ?
221
- # Please note that this is used now by tree, and list can have non-strings, so use to_s
222
- def next_match char
223
- data = get_content
224
- row = focussed_index + 1
225
- row.upto(data.length-1) do |ix|
226
- #val = data[ix].chomp rescue return # 2010-01-05 15:28 crashed on trueclass
227
- val = data[ix].to_s rescue return # 2010-01-05 15:28 crashed on trueclass
228
- #if val[0,1] == char #and val != currval
229
- if val[0,1].casecmp(char) == 0 #AND VAL != CURRval
230
- return ix
174
+ end
175
+ def scroll_right
176
+ $log.debug " inside scroll_right "
177
+ hscrollcols = $multiplier > 0 ? $multiplier : @width/2
178
+ #hscrollcols = $multiplier > 0 ? $multiplier : 1 # for testing out
179
+ $log.debug " scroll_right mult:#{$multiplier} , hscrollcols #{hscrollcols}, pcol #{@pcol} w: #{@width} ll:#{@longest_line} "
180
+ #blen = @buffer.rstrip.length
181
+ blen = @longest_line
182
+ if @pcol + @width < blen
183
+ @pcol += hscrollcols if @pcol + @width < blen
184
+ else
185
+ # due to some change somewhere, sometimes width = longest which is not true
186
+ hscrollcols = $multiplier > 0 ? $multiplier : 1
187
+ @pcol += hscrollcols
231
188
  end
189
+ @repaint_required = true
190
+ end
191
+ def scroll_left
192
+ hscrollcols = $multiplier > 0 ? $multiplier : @width/2
193
+ @pcol -= hscrollcols if @pcol > 0
194
+ @pcol = 0 if @pcol < 0
195
+ @repaint_required = true
196
+ end
197
+ ## returns cursor to last row (if moving columns in same row, won't work)
198
+ # Useful after a large move such as 12j, 20 C-n etc, Mapped to '' in textview
199
+ def goto_last_position
200
+ return unless @oldrow
201
+ @current_index = @oldrow
202
+ bounds_check
232
203
  end
233
- row = focussed_index - 1
234
- 0.upto(row) do |ix|
235
- #val = data[ix].chomp
236
- val = data[ix].to_s
237
- #if val[0,1] == char #and val != currval
238
- if val[0,1].casecmp(char) == 0 #and val != currval
239
- return ix
204
+ # not that saving content_rows is buggy since we add rows.
205
+ ##
206
+ # caution, this now uses winrow not prow
207
+ ## for user to know which row is being focussed on
208
+ def focussed_index
209
+ @current_index # 2009-01-07 14:35
210
+ end
211
+ # only to be used in single selection cases as focussed item FIXME.
212
+ # best not to use, as can be implementation dep, use current_index
213
+ def selected_item
214
+ get_content()[focussed_index()]
215
+ end
216
+ #alias :current_index :focussed_index
217
+ alias :selected_index :focussed_index
218
+
219
+ # finds the next match for the char pressed
220
+ # returning the index
221
+ # If we are only checking first char, then why chomp ?
222
+ # Please note that this is used now by tree, and list can have non-strings, so use to_s
223
+ def next_match char
224
+ data = get_content
225
+ row = focussed_index + 1
226
+ row.upto(data.length-1) do |ix|
227
+ #val = data[ix].chomp rescue return # 2010-01-05 15:28 crashed on trueclass
228
+ val = data[ix].to_s rescue return # 2010-01-05 15:28 crashed on trueclass
229
+ #if val[0,1] == char #and val != currval
230
+ if val[0,1].casecmp(char) == 0 #AND VAL != CURRval
231
+ return ix
232
+ end
240
233
  end
234
+ row = focussed_index - 1
235
+ 0.upto(row) do |ix|
236
+ #val = data[ix].chomp
237
+ val = data[ix].to_s
238
+ #if val[0,1] == char #and val != currval
239
+ if val[0,1].casecmp(char) == 0 #and val != currval
240
+ return ix
241
+ end
242
+ end
243
+ return -1
244
+ end
245
+ ## 2008-12-18 18:03
246
+ # sets the selection to the next row starting with char
247
+ def set_selection_for_char char
248
+ @oldrow = @current_index
249
+ @last_regex = "^#{char}"
250
+ ix = next_match char
251
+ @current_index = ix if ix && ix != -1
252
+ @search_found_ix = @current_index
253
+ bounds_check
254
+ return ix
241
255
  end
242
- return -1
243
- end
244
- ## 2008-12-18 18:03
245
- # sets the selection to the next row starting with char
246
- def set_selection_for_char char
247
- @oldrow = @current_index
248
- @last_regex = "^#{char}"
249
- ix = next_match char
250
- @current_index = ix if ix && ix != -1
251
- @search_found_ix = @current_index
252
- bounds_check
253
- return ix
254
- end
255
256
 
256
- ##
257
- # ensures that the given row is focussed
258
- # new version of older one that was not perfect.
259
- # 2009-01-17 13:25
260
- def set_focus_on arow
261
- @oldrow = @current_index
262
- # the next line fixed cursor positioning, but when wraparound then it messed up
263
- # matching line would get hidden
264
- @current_index = arow
265
- bounds_check if @oldrow != @current_index
266
- end
267
- ##
257
+ ##
258
+ # ensures that the given row is focussed
259
+ # new version of older one that was not perfect.
260
+ # 2009-01-17 13:25
261
+ def set_focus_on arow
262
+ @oldrow = @current_index
263
+ # the next line fixed cursor positioning, but when wraparound then it messed up
264
+ # matching line would get hidden
265
+ @current_index = arow
266
+ bounds_check if @oldrow != @current_index
267
+ end
268
+ ##
268
269
  def install_keys
269
270
  =begin
270
271
  @KEY_ASK_FIND_FORWARD ||= ?\M-f.getbyte(0)
@@ -385,30 +386,30 @@ module ListScrollable
385
386
  alert("No previous search. Search first.")
386
387
  return
387
388
  end
388
- ix = _find_next
389
- regex = @last_regex
390
- if ix.nil?
391
- alert("No more matching data for: #{regex}")
392
- else
393
- set_focus_on(ix)
394
- set_form_col @find_offset1
389
+ ix = _find_next
390
+ regex = @last_regex
391
+ if ix.nil?
392
+ alert("No more matching data for: #{regex}")
393
+ else
394
+ set_focus_on(ix)
395
+ set_form_col @find_offset1
395
396
  @cell_editor.component.curpos = (@find_offset||0) if @cell_editing_allowed
396
- end
397
+ end
397
398
  end
398
399
  def find_prev
399
400
  unless @last_regex
400
401
  alert("No previous search. Search first.")
401
402
  return
402
403
  end
403
- ix = _find_prev
404
- regex = @last_regex
405
- if ix.nil?
406
- alert("No previous matching data for: #{regex}")
407
- else
408
- set_focus_on(ix)
409
- set_form_col @find_offset
410
- @cell_editor.component.curpos = (@find_offset||0) if @cell_editing_allowed
411
- end
404
+ ix = _find_prev
405
+ regex = @last_regex
406
+ if ix.nil?
407
+ alert("No previous matching data for: #{regex}")
408
+ else
409
+ set_focus_on(ix)
410
+ set_form_col @find_offset
411
+ @cell_editor.component.curpos = (@find_offset||0) if @cell_editing_allowed
412
+ end
412
413
  end
413
414
  ##
414
415
  # find backwards
@@ -419,22 +420,22 @@ module ListScrollable
419
420
  warn "No previous search" and return if regex.nil?
420
421
  #$log.debug " _find_prev #{@search_found_ix} : #{@current_index}"
421
422
  if start != 0
422
- start -= 1 unless start == 0
423
- @last_regex = regex
424
- @search_start_ix = start
425
- regex = Regexp.new(regex, Regexp::IGNORECASE) if @search_case
426
- start.downto(0) do |ix|
427
- row = @list[ix].to_s
428
- m=row.match(regex)
429
- if !m.nil?
430
- @find_offset = m.offset(0)[0]
431
- @find_offset1 = m.offset(0)[1]
432
- ix += (@_header_adjustment || 0)
433
- @search_found_ix = ix
434
- return ix
423
+ start -= 1 unless start == 0
424
+ @last_regex = regex
425
+ @search_start_ix = start
426
+ regex = Regexp.new(regex, Regexp::IGNORECASE) if @search_case
427
+ start.downto(0) do |ix|
428
+ row = @list[ix].to_s
429
+ m=row.match(regex)
430
+ if !m.nil?
431
+ @find_offset = m.offset(0)[0]
432
+ @find_offset1 = m.offset(0)[1]
433
+ ix += (@_header_adjustment || 0)
434
+ @search_found_ix = ix
435
+ return ix
436
+ end
435
437
  end
436
438
  end
437
- end
438
439
  fend = start-1
439
440
  start = @list.size-1
440
441
  if @search_wrap
@@ -642,6 +643,7 @@ module ListScrollable
642
643
  ix = @current_index
643
644
  return if is_row_selected ix
644
645
  r = _convert_index_to_printable_row() unless r
646
+ return unless r # row is not longer visible 2013-04-10 - 16:37
645
647
  attrib = @focussed_attrib || 'bold'
646
648
 
647
649
  when :UNFOCUSSED
@@ -660,6 +662,7 @@ module ListScrollable
660
662
  att = get_attrib(attrib) #if @focussed_attrib
661
663
  @graphic.mvchgat(y=r, x=c, @width-@internal_width, att , acolor , nil)
662
664
  end
663
-
664
665
 
666
+
667
+ end
665
668
  end