rbcurse 0.1.3 → 1.1.1

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 (74) hide show
  1. data/CHANGELOG +126 -0
  2. data/Manifest.txt +53 -20
  3. data/README.markdown +423 -0
  4. data/Rakefile +3 -1
  5. data/examples/keytest.rb +177 -0
  6. data/examples/mpad2.rb +156 -0
  7. data/examples/newtesttabp.rb +121 -0
  8. data/examples/rfe.rb +48 -10
  9. data/examples/rfe_renderer.rb +4 -4
  10. data/examples/rvimsplit.rb +376 -0
  11. data/examples/sqlc.rb +97 -106
  12. data/examples/sqlm.rb +446 -0
  13. data/examples/test1.rb +4 -4
  14. data/examples/test2.rb +12 -12
  15. data/examples/testchars.rb +140 -0
  16. data/examples/testkeypress.rb +9 -4
  17. data/examples/testmulticomp.rb +72 -0
  18. data/examples/testscroller.rb +136 -0
  19. data/examples/testscrolllb.rb +86 -0
  20. data/examples/testscrollp.rb +87 -0
  21. data/examples/testscrollta.rb +80 -0
  22. data/examples/testscrolltable.rb +166 -0
  23. data/examples/testsplit.rb +87 -0
  24. data/examples/testsplit2.rb +123 -0
  25. data/examples/testsplit3.rb +215 -0
  26. data/examples/testsplit3_1.rb +244 -0
  27. data/examples/testsplit3a.rb +215 -0
  28. data/examples/testsplit3b.rb +237 -0
  29. data/examples/testsplitta.rb +148 -0
  30. data/examples/testsplittv.rb +142 -0
  31. data/examples/testsplittvv.rb +144 -0
  32. data/examples/testtable.rb +1 -1
  33. data/examples/testtabp.rb +3 -2
  34. data/examples/testtestw.rb +69 -0
  35. data/examples/testtodo.rb +5 -3
  36. data/examples/testtpane.rb +203 -0
  37. data/examples/testtpane2.rb +145 -0
  38. data/examples/testtpanetable.rb +199 -0
  39. data/examples/viewtodo.rb +5 -3
  40. data/lib/rbcurse.rb +1 -1
  41. data/lib/rbcurse/celleditor.rb +2 -2
  42. data/lib/rbcurse/colormap.rb +5 -5
  43. data/lib/rbcurse/defaultlistselectionmodel.rb +3 -3
  44. data/lib/rbcurse/io.rb +663 -0
  45. data/lib/rbcurse/listeditable.rb +306 -0
  46. data/lib/rbcurse/listkeys.rb +15 -15
  47. data/lib/rbcurse/listscrollable.rb +168 -27
  48. data/lib/rbcurse/mapper.rb +35 -13
  49. data/lib/rbcurse/rchangeevent.rb +28 -0
  50. data/lib/rbcurse/rform.rb +845 -0
  51. data/lib/rbcurse/rlistbox.rb +144 -34
  52. data/lib/rbcurse/rmessagebox.rb +10 -5
  53. data/lib/rbcurse/rmulticontainer.rb +325 -0
  54. data/lib/rbcurse/rmultitextview.rb +306 -0
  55. data/lib/rbcurse/rscrollform.rb +369 -0
  56. data/lib/rbcurse/rscrollpane.rb +511 -0
  57. data/lib/rbcurse/rsplitpane.rb +820 -0
  58. data/lib/rbcurse/rtabbedpane.rb +737 -109
  59. data/lib/rbcurse/rtabbedwindow.rb +326 -0
  60. data/lib/rbcurse/rtable.rb +220 -64
  61. data/lib/rbcurse/rtextarea.rb +340 -181
  62. data/lib/rbcurse/rtextview.rb +237 -101
  63. data/lib/rbcurse/rviewport.rb +203 -0
  64. data/lib/rbcurse/rwidget.rb +919 -95
  65. data/lib/rbcurse/scrollable.rb +7 -7
  66. data/lib/rbcurse/selectable.rb +4 -4
  67. data/lib/rbcurse/table/tablecellrenderer.rb +3 -0
  68. data/lib/rbcurse/undomanager.rb +181 -0
  69. data/lib/rbcurse/vieditable.rb +100 -0
  70. data/lib/ver/window.rb +471 -21
  71. metadata +66 -22
  72. data/README.txt +0 -312
  73. data/examples/testd.db +0 -0
  74. data/examples/todocsv.csv +0 -28
@@ -1,11 +1,14 @@
1
1
  =begin
2
2
  * Name: TextArea
3
- * $Id$
4
3
  * Description Editable text area
5
4
  * Author: rkumar (arunachalesha)
6
- TODO
5
+ 2009-12-26 14:43 buffered version of rtextarea.rb. See BUFFERED
6
+ * major change: 2010-02-12 13:34 simplifying the buffer stuff.
7
+ * see FIXME of textview for some common issues to look at.
8
+ * removed many edit functions to listeditable - 2010-03-12 10:16
7
9
 
8
- moved from rform to this file on 2009-01-08 21:57
10
+ Todo:
11
+ * shoud we store path, so a save can be done
9
12
  --------
10
13
  * Date: 2008-11-14 23:43
11
14
  * License:
@@ -18,6 +21,7 @@ require 'logger'
18
21
  require 'rbcurse'
19
22
  require 'rbcurse/listscrollable'
20
23
  require 'rbcurse/rinputdataevent'
24
+ require 'rbcurse/listeditable'
21
25
 
22
26
  include Ncurses
23
27
  include RubyCurses
@@ -29,33 +33,32 @@ module RubyCurses
29
33
  # - respect newlines for incoming data
30
34
  # we need a set_text method, passing nil or blank clears
31
35
  # current way is not really good. remove_all sucks.
32
- #
36
+ # TODO don't set maxlen if nil. compute it as a local in methods. Else splitpane will not
37
+ # work correctly.
33
38
  class TextArea < Widget
34
39
  include ListScrollable
35
- dsl_accessor :height
40
+ include ListEditable
36
41
  dsl_accessor :title
37
42
  dsl_accessor :title_attrib # bold, reverse, normal
43
+ dsl_accessor :footer_attrib # bold, reverse, normal added 2009-12-26 18:25 was this missing or delib
38
44
  dsl_accessor :list # the array of data to be sent by user
39
- dsl_accessor :maxlen # the array of data to be sent by user
45
+ dsl_accessor :maxlen # max display length of a row/line
40
46
  attr_reader :toprow
41
- #attr_reader :prow
42
- #attr_reader :winrow
43
47
  dsl_accessor :auto_scroll # boolean, keeps view at end as data is inserted.
44
48
  dsl_accessor :print_footer
45
49
  dsl_accessor :editable # allow editing
46
- # attr_accessor :modified # boolean, value modified or not 2009-01-08 12:29 REM 2009-01-18 14:46
50
+ dsl_accessor :suppress_borders # added 2010-02-12 12:21 values true or false
51
+ attr_accessor :overwrite_mode # boolean: insert or overwrite, default false.
47
52
 
48
- def initialize form, config={}, &block
53
+ def initialize form = nil, config={}, &block
49
54
  @focusable = true
50
55
  @editable = true
51
- @left_margin = 1
52
56
  @row = 0
53
57
  @col = 0
54
58
  @curpos = 0
55
- # @show_focus = false
56
59
  @list = []
57
60
  super
58
- @row_offset = @col_offset = 1
61
+ @row_offset = @col_offset = 1 # for cursor display on first entry, so not positioned on border
59
62
  @orig_col = @col
60
63
  # this does result in a blank line if we insert after creating. That's required at
61
64
  # present if we wish to only insert
@@ -64,16 +67,33 @@ module RubyCurses
64
67
  end
65
68
  # @scrollatrow = @height-2
66
69
  @content_rows = @list.length
67
- @win = @form.window
70
+ #@win = @form.window
71
+ @win = @graphic # 2009-12-26 14:54 BUFFERED replace form.window with graphic
68
72
  # init_scrollable
69
- print_borders
70
- @maxlen ||= @width-2
73
+ #print_borders
74
+ # 2010-01-10 19:35 compute locally if not set
75
+ #@maxlen ||= @width-2
71
76
  install_keys
72
77
  init_vars
73
78
  end
74
79
  def init_vars
75
80
  @repaint_required = true
81
+ @repaint_footer_required = true # 2010-01-23 22:41
76
82
  @toprow = @current_index = @pcol = 0
83
+ @repaint_all=true
84
+ ## 2010-02-12 12:20 RFED16 taking care if no border requested
85
+ @suppress_borders ||= false
86
+ @row_offset = @col_offset = 0 if @suppress_borders == true
87
+ # added 2010-02-11 15:11 RFED16 so we don't need a form.
88
+ @win_left = 0
89
+ @win_top = 0
90
+ @longest_line = 0
91
+ bind_key(?\M-w, :kill_ring_save)
92
+ bind_key(?\C-y, :yank)
93
+ bind_key(?\M-y, :yank_pop)
94
+ bind_key(?\M-\C-w, :append_next_kill)
95
+ bind_key(?\M-d, :delete_word)
96
+ bind_key(?\M-f, :forward_word)
77
97
  end
78
98
  def rowcol
79
99
  # $log.debug "textarea rowcol : #{@row+@row_offset+@winrow}, #{@col+@col_offset}"
@@ -87,18 +107,16 @@ module RubyCurses
87
107
  end
88
108
  # private
89
109
  def wrap_text(txt, col = @maxlen)
90
- $log.debug "inside wrap text for :#{txt}"
110
+ col ||= @width - 2
111
+ #$log.debug "inside wrap text for :#{txt}"
91
112
  txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/,
92
113
  "\\1\\3\n")
93
114
  end
94
- def remove_all
95
- @list = []
96
- set_modified # added 2009-02-13 22:28 so repaints
97
- end
98
115
  ##
99
116
  # trying to wrap and insert
100
117
  def insert off0, data
101
- if data.length > @maxlen
118
+ _maxlen = @maxlen || @width - 2
119
+ if data.length > _maxlen
102
120
  data = wrap_text data
103
121
  # $log.debug "after wrap text done :#{data}"
104
122
  data = data.split("\n")
@@ -113,13 +131,15 @@ module RubyCurses
113
131
  #$log.debug " AFTER INSERT: #{@list}"
114
132
  end
115
133
  ##
116
- # wraps line sent in if longer than maxlen
134
+ # wraps line sent in if longer than _maxlen
117
135
  # Typically a line is sent in. We wrap and put a hard return at end.
118
136
  def << data
119
- if data.length > @maxlen
120
- $log.debug "wrapped append for #{data}"
137
+ # if width if nil, either set it, or add this to a container that sets it before calling this method
138
+ _maxlen = @maxlen || @width - 2
139
+ if data.length > _maxlen
140
+ #$log.debug "wrapped append for #{data}"
121
141
  data = wrap_text data
122
- $log.debug "after wrap text for :#{data}"
142
+ #$log.debug "after wrap text for :#{data}"
123
143
  data = data.split("\n")
124
144
  # 2009-01-01 22:24 the \n was needed so we would put a space at time of writing.
125
145
  # we need a soft return so a space can be added when pushing down.
@@ -128,12 +148,12 @@ module RubyCurses
128
148
  data.each {|line| @list << line}
129
149
  @list[-1] << "\r" #XXXX
130
150
  else
131
- $log.debug "normal append for #{data}"
151
+ #$log.debug "normal append for #{data}"
132
152
  data << "\r" if data[-1,1] != "\r" #XXXX
133
153
  @list << data
134
154
  end
135
155
  set_modified # added 2009-03-07 18:29
136
- goto_end if @auto_scroll # to test out.
156
+ goto_end if @auto_scroll
137
157
  self
138
158
  end
139
159
  def wrap_para line=@current_index
@@ -143,7 +163,7 @@ module RubyCurses
143
163
  if @list[line].nil? or @list[line]=="" or @list[line]==13 #"\r"
144
164
  break
145
165
  end
146
- $log.debug "lastchar #{@list[line][-1]}, appending: #{@list[line]}]"
166
+ #$log.debug "lastchar #{@list[line][-1]}, appending: #{@list[line]}]"
147
167
  t = @list[line]
148
168
  l << t.strip
149
169
  @list.delete_at line
@@ -151,15 +171,19 @@ module RubyCurses
151
171
  # line += 1
152
172
  end
153
173
  str=l.join(" ")
154
- $log.debug " sending insert : #{str}."
174
+ #$log.debug " sending insert : #{str}."
155
175
  insert line, str
156
176
  end
157
177
  ##
158
178
  # private
159
179
  def print_borders
160
- window = @form.window
180
+ window = @graphic # 2009-12-26 14:54 BUFFERED
161
181
  color = $datacolor
162
- window.print_border @row, @col, @height, @width, color
182
+ #window.print_border @row, @col, @height, @width, color
183
+ ## NOTE: If it bombs in next line, either no form passed
184
+ ##+ or you using this embedded and need to set should_create_buffer true when
185
+ ##+ creating. See examples/testscrollta.rb.
186
+ window.print_border @row, @col, @height-1, @width, color
163
187
  print_title
164
188
  =begin
165
189
  hline = "+%s+" % [ "-"*(width-((1)*2)) ]
@@ -175,26 +199,37 @@ module RubyCurses
175
199
  end
176
200
  # private
177
201
  def print_title
178
- @form.window.printstring( @row, @col+(@width-@title.length)/2, @title, $datacolor, @title_attrib) unless @title.nil?
202
+ @graphic.printstring( @row, @col+(@width-@title.length)/2, @title, $datacolor, @title_attrib) unless @title.nil?
179
203
  end
180
204
  # text_area print footer
181
205
  def print_foot
182
206
  @footer_attrib ||= Ncurses::A_REVERSE
183
207
  footer = "R: #{@current_index+1}, C: #{@curpos}, #{@list.length} lines "
184
- @form.window.printstring( @row + @height, @col+2, footer, $datacolor, @footer_attrib)
208
+ #$log.debug " print_foot calling printstring with #{@row} + #{@height} -1, #{@col}+2"
209
+ # changed 2010-01-02 19:31 BUFFERED we were exceeding 1
210
+ #@graphic.printstring( @row + @height, @col+2, footer, $datacolor, @footer_attrib)
211
+ @graphic.printstring( @row + @height-1, @col+2, footer, $datacolor, @footer_attrib)
212
+ @repaint_footer_required = false
185
213
  end
186
214
  ### FOR scrollable ###
187
215
  def get_content
188
216
  @list
189
217
  end
190
218
  def get_window
191
- @form.window
219
+ @graphic
192
220
  end
193
221
  ### FOR scrollable ###
194
222
  def repaint # textarea
195
- return unless @repaint_required
196
- paint
197
- print_foot if @print_footer
223
+ if @screen_buffer.nil? and @should_create_buffer
224
+ safe_create_buffer
225
+ @screen_buffer.name = "Pad::TXTA_PAD_#{@name}"
226
+ $log.debug " textarea creates pad #{@screen_buffer} #{@name}"
227
+ end
228
+
229
+ #return unless @repaint_required # 2010-02-12 19:08 TRYING - won't let footer print if only col move
230
+ paint if @repaint_required
231
+ print_foot if @print_footer && (@repaint_footer_required || @repaint_required)
232
+ buffer_to_window # 2010-02-12 14:54 RFED16
198
233
  end
199
234
  def getvalue
200
235
  @list
@@ -202,12 +237,20 @@ module RubyCurses
202
237
  # textarea
203
238
 
204
239
  def handle_key ch
240
+ @current_key = ch # I need some funcs to know what key they were mapped to
205
241
  @buffer = @list[@current_index]
206
242
  if @buffer.nil? and @list.length == 0
243
+ ## 2009-10-04 22:39
244
+ # what this newline does is , if we use << to append, data is appended
245
+ # to second line
207
246
  @list << "\n" # changed space to newline so wrapping puts a line.
247
+ @current_index = 0 ; ## added 2009-10-04 21:47
208
248
  @buffer = @list[@current_index]
209
249
  end
210
- return if @buffer.nil?
250
+ ## 2009-10-04 20:48 i think the next line was resulting in a hang if buffer nil
251
+ # in sqlc on pressing Clear.
252
+ # if buffer is nil and user wants to enter something -- added UNHANDLED
253
+ return :UNHANDLED if @buffer.nil?
211
254
  $log.debug "TA: before: curpos #{@curpos} blen: #{@buffer.length}"
212
255
  # on any line if the cursor is ahead of buffer length, ensure its on last position
213
256
  # what if the buffer is somehow gt maxlen ??
@@ -218,13 +261,13 @@ module RubyCurses
218
261
  $log.debug "TA: after : curpos #{@curpos} blen: #{@buffer.length}, w: #{@width} max #{@maxlen}"
219
262
  #pre_key
220
263
  case ch
221
- when ?\C-n
264
+ when ?\C-n.getbyte(0)
222
265
  scroll_forward
223
- when ?\C-p
266
+ when ?\C-p.getbyte(0)
224
267
  scroll_backward
225
- when ?\C-[
268
+ when ?\C-[.getbyte(0)
226
269
  goto_start #cursor_start of buffer
227
- when ?\C-]
270
+ when ?\C-].getbyte(0)
228
271
  goto_end # cursor_end of buffer
229
272
  when KEY_UP
230
273
  #select_prev_row
@@ -240,28 +283,39 @@ module RubyCurses
240
283
  when KEY_BACKSPACE, 127
241
284
  if @editable # checking here means that i can programmatically bypass!!
242
285
  delete_prev_char
243
- #fire_handler :CHANGE, self # 2008-12-22 15:23
244
286
  end
245
- when 330, ?\C-d # delete char
287
+ when 330, ?\C-d.getbyte(0) # delete char
246
288
  if @editable
247
289
  delete_curr_char
248
- #fire_handler :CHANGE, self # 2008-12-22 15:23
249
290
  end
250
- when ?\C-k # delete till eol
291
+ when ?\C-k.getbyte(0) # delete till eol
292
+ # i'ved added curpos == 0 since emacs deletes a line if cursor is at 0
293
+ # Earlier behavior was based on alpine which leaves a blank line
251
294
  if @editable
252
- if @buffer == ""
253
- delete_line
254
- #fire_handler :CHANGE, self # 2008-12-22 15:23
295
+ #if @buffer == ""
296
+ if @buffer.chomp == "" or @curpos == 0
297
+ delete_line
255
298
  else
256
299
  delete_eol
257
- #fire_handler :CHANGE, self # 2008-12-22 15:23
258
300
  end
259
301
  end
260
- when ?\C-u
261
- undo_delete
262
- when ?\C-a
302
+ #when ?\C-u.getbyte(0)
303
+ ## since textareas are editable we use a control key to increase
304
+ ## multiplier. Series is 4 16 64
305
+ #@multiplier = (@multiplier == 0 ? 4 : @multiplier *= 4)
306
+ #return 0
307
+ when ?\C-_.getbyte(0) # changed from C-u so i can use C-u for multipliers
308
+ if @undo_handler
309
+ @undo_handler.undo
310
+ else
311
+ undo_delete
312
+ end
313
+ when ?\C-r.getbyte(0) # redo if UndoHandler installed
314
+ return unless @undo_handler
315
+ @undo_handler.redo
316
+ when ?\C-a.getbyte(0)
263
317
  cursor_bol
264
- when ?\C-e
318
+ when ?\C-e.getbyte(0)
265
319
  cursor_eol
266
320
  #set_form_col @buffer.length
267
321
  #when @KEY_ASK_FIND_FORWARD
@@ -279,18 +333,36 @@ module RubyCurses
279
333
  else
280
334
  #$log.debug(" textarea ch #{ch}")
281
335
  ret = putc ch
282
- return ret if ret == :UNHANDLED
336
+ if ret == :UNHANDLED
337
+ # check for bindings, these cannot override above keys since placed at end
338
+ ret = process_key ch, self
339
+ $log.debug "TA process_key #{ch} got ret #{ret} in #{@name} "
340
+ return :UNHANDLED if ret == :UNHANDLED
341
+ end
283
342
  end
284
- #post_key
285
343
  set_form_row
286
344
  set_form_col # testing 2008-12-26 19:37
345
+ $multiplier = 0 # reset only if key handled
346
+ return 0
287
347
  end
348
+ # this is broken, delete_buffer could be a line or a string or array of lines
288
349
  def undo_delete
289
350
  # added 2008-11-27 12:43 paste delete buffer into insertion point
290
- @buffer.insert @curpos, @delete_buffer unless @delete_buffer.nil?
351
+ return if @delete_buffer.nil?
352
+ $log.warn "undo_delete is broken! perhaps cannot be used . textarea 347 "
353
+ # FIXME - can be an array
354
+ case @delete_buffer
355
+ when Array
356
+ # we need to unroll array, and it could be lines not just a string
357
+ str = @delete_buffer.first
358
+ else
359
+ str = @delete_buffer
360
+ end
361
+ @buffer.insert @curpos, str
291
362
  set_modified
292
363
  fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos+@delete_buffer.length, self, :INSERT, @current_index, @delete_buffer) # 2008-12-24 18:34
293
364
  end
365
+ # FIXME - fire event not correct, not undo'ing correctly, check row and also slash r append
294
366
  def insert_break
295
367
  return -1 unless @editable
296
368
  # insert a blank row and append rest of this line to cursor
@@ -301,18 +373,28 @@ module RubyCurses
301
373
  @list.insert @current_index+1, @delete_buffer
302
374
  @curpos = 0
303
375
  down
304
- @form.col = @orig_col + @col_offset
305
- #addrowcol 1,0
306
- @form.row = @row + 1 #+ @winrow
307
- #fire_handler :CHANGE, self # 2008-12-09 14:56
308
- fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos+@delete_buffer.length, self, :INSERT, @current_index, @delete_buffer) # 2008-12-24 18:34
376
+ col = @orig_col + @col_offset
377
+ setrowcol @row+1, col
378
+ # FIXME maybe this should be insert line since line inserted, not just data, undo will delete it
379
+ fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos+@delete_buffer.length, self, :INSERT_LINE, @current_index, @delete_buffer) # 2008-12-24 18:34
309
380
  end
310
381
  # set cursor on correct column
311
382
  def set_form_col col1=@curpos
312
383
  @curpos = col1
384
+ @cols_panned ||= 0
313
385
  cursor_bounds_check
314
- @form.col = @orig_col + @col_offset + @curpos
315
- $log.debug "sfc: #{@orig_col}, #{@col_offset}. #{@curpos}. "
386
+
387
+ ## added win_col on 2009-12-28 20:21 for embedded forms BUFFERED TRYING OUT
388
+ win_col = 0 # 2010-02-07 23:19 new cursor stuff
389
+ #col = win_col + @orig_col + @col_offset + @curpos
390
+ #col = win_col + @orig_col + @col_offset + @curpos + @cols_panned
391
+ # 2010-01-14 13:31 changed orig_col to col for embedded forms, splitpanes.
392
+ col = win_col + @col + @col_offset + @curpos + @cols_panned
393
+ $log.debug "sfc: wc:#{win_col} col:#{@col}, coff:#{@col_offset}. cp:#{@curpos} colsp:#{@cols_panned} . "
394
+ #@form.setrowcol @form.row, col # added 2009-12-29 18:50 BUFFERED
395
+ $log.debug " TA calling setformrow col nil, #{col} "
396
+ setrowcol nil, col # added 2009-12-29 18:50 BUFFERED
397
+ @repaint_footer_required = true
316
398
  end
317
399
  def cursor_bounds_check
318
400
  max = buffer_len()
@@ -325,84 +407,154 @@ module RubyCurses
325
407
  yield @list[@current_index]
326
408
  @buffer = @list[@current_index]
327
409
  end
328
- def delete_eol
329
- return -1 unless @editable
330
- pos = @curpos-1
331
- @delete_buffer = @buffer[@curpos..-1]
332
- # if pos is 0, pos-1 becomes -1, end of line!
333
- @list[@current_index] = pos == -1 ? "" : @buffer[0..pos]
334
- $log.debug "delete EOL :pos=#{pos}, #{@delete_buffer}: row: #{@list[@current_index]}:"
335
- @buffer = @list[@current_index]
336
- cursor_backward if @curpos > 0 # now cursor back goes up to prev line
337
- #fire_handler :CHANGE, self # 2008-12-09 14:56
338
- fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos+@delete_buffer.length, self, :DELETE, @current_index, @delete_buffer) # 2008-12-24 18:34
339
- set_modified
340
- return @delete_buffer
341
- end
410
+ ##
411
+ # FIXME : if cursor at end of last line then forward takes cursor to start
412
+ # of last line (same line), should stop there.
342
413
  def cursor_forward num=1
343
- $log.debug "next char cp #{@curpos}, #{@buffer.length}. wi: #{@width}"
344
- #if @curpos < @width and @curpos < @maxlen-1 # else it will do out of box
414
+ #$log.debug "next char cp #{@curpos}, #{@buffer.length}. wi: #{@width}"
415
+ #$log.debug "next char cp ll and ci #{@list.length}, #{@current_index}"
416
+ #if @curpos < @width and @curpos < maxlen-1 # else it will do out of box
417
+ return if at_eol? and at_last_line?
418
+ repeatm {
345
419
  if @curpos < buffer_len()
346
420
  @curpos += 1
347
421
  addcol 1
348
422
  else # trying this out 2008-12-26 20:18
349
423
  @curpos = 0
350
- down
424
+ down 1 # if not then multipler will trigger there too
351
425
  end
352
426
  cursor_bounds_check
427
+ }
353
428
  end
429
+ ## added 2009-10-04 22:13
430
+ # returns whether cursor is at end of line
431
+ def at_eol?
432
+ if @curpos+1== @list[@current_index].length
433
+ return true
434
+ end
435
+ return false
436
+ end
437
+ ## added 2009-10-04 22:13
438
+ # returns whether at last line (required so that forward does not go to start)
439
+ def at_last_line?
440
+ return true if @list.length == @current_index + 1
441
+ return false
442
+ end
443
+ # FIXME : these 2 only require the footer to be repainted not everything
444
+ # We should be able to manage that. We need a repaint_footer_required.
445
+ # Setting repaint_required really slows performance when one presses the right arrow key
446
+ # since a repaint is happenign repeatedly for each key.
354
447
  def addcol num
355
- @form.addcol num
448
+ # @repaint_required = true # added 2010-01-15 23:59, so that footer is updated, sucks!
449
+ @repaint_footer_required = true # 2010-01-23 22:41
450
+ my_win = @form || @parent_component.form # 2010-02-12 12:51
451
+ my_win.addcol num
356
452
  end
357
453
  def addrowcol row,col
358
- @form.addrowcol row, col
359
- end
360
- def cursor_backward
361
- if @curpos > 0
362
- @curpos -= 1
363
- addcol -1
364
- else # trying this out 2008-12-26 20:18
365
- ret = up
366
- cursor_eol if ret != -1
454
+ #@repaint_required = true # added 2010-01-15 23:59
455
+ @repaint_footer_required = true # 2010-01-23 22:41
456
+ my_win = @form || @parent_component.form # 2010-02-12 12:51
457
+ my_win.addrowcol row, col
367
458
  end
459
+ ## 2009-10-04 23:01 taken care that you can't go back at start of textarea
460
+ # it was going onto border
461
+ def cursor_backward
462
+ #$log.debug "back char cp ll and ci #{@list.length}, #{@current_index}"
463
+ #$log.debug "back char cb #{@curpos}, #{@buffer.length}. wi: #{@width}"
464
+ return if @curpos == 0 and @current_index == 0 # added 2009-10-04 23:02
465
+ repeatm {
466
+ if @curpos > 0
467
+ @curpos -= 1
468
+ addcol -1
469
+ else # trying this out 2008-12-26 20:18
470
+ ret = up
471
+ cursor_eol if ret != -1
472
+ end
473
+ }
368
474
  end
369
- def delete_line line=@current_index
370
- return -1 unless @editable
371
- $log.debug "called delete line"
372
- @delete_buffer = @list.delete_at line
373
- @buffer = @list[@current_index]
374
- if @buffer.nil?
375
- up
376
- @form.row = @row + 1 #+ @winrow
377
- end
378
- #fire_handler :CHANGE, self # 2008-12-09 14:56
379
- fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos+@delete_buffer.length, self, :DELETE, @current_index, @delete_buffer) # 2008-12-24 18:34
380
- set_modified
381
- end
382
- def delete_curr_char num=1
475
+ # private
476
+ # when backspace pressed in position zero if the previous line is filled we may have to bring
477
+ # down the last word and join, rather than go up
478
+ # FIXME : make logic simple. Append entire line to above line. Then go to maxlen if not a space,
479
+ # reverse to find last space. Lop off all after space and replace this line with that balance.
480
+ # UNDO and REDO has to work in this case too. FIXME bare in mind handlers when doing this
481
+ def join_to_prev_line
383
482
  return -1 unless @editable
384
- num.times do
385
- delete_at
386
- set_modified
387
- end
388
- end
389
- def delete_prev_char num=1
390
- return -1 if !@editable
391
- num.times do
392
- if @curpos <= 0
393
- join_to_prev_line
483
+ return if @current_index == 0
484
+ oldcurpos = @curpos
485
+ oldprow = @current_index
486
+ prev = @list[@current_index-1].chomp
487
+ prevlen = prev.length
488
+ # 2008-12-26 21:37 delete previous line if nothing there. This moves entire buffer up.
489
+ if prevlen == 0
490
+ delete_line @current_index-1
491
+ up
394
492
  return
395
493
  end
396
- @curpos -= 1 if @curpos > 0
397
- delete_at
398
- set_modified
399
- addcol -1
400
- end
494
+ _maxlen = @maxlen || @width - 2
495
+ space_left = _maxlen - prevlen
496
+ # prev line is full exit
497
+ return if space_left == 0
498
+
499
+ # get last space, if none, return
500
+ blank_found = @buffer.rindex(' ', space_left)
501
+ return unless blank_found # no word in the space i can carry up.
502
+ # get string for carrying up
503
+ carry_up = @buffer[0..blank_found]
504
+ result = @list[@current_index-1].chomp! # this has to be undone too.
505
+ @list[@current_index-1] << carry_up
506
+ #$log.debug "carry up: #{carry_up} prevrow:#{@list[@current_index -1]}"
507
+ # remove from curr line
508
+ @list[@current_index].slice!(0..carry_up.length-1)
509
+ $log.debug "carry up: #{carry_up} currrow:#{@list[@current_index]}"
510
+ #@list[@current_index] ||= ""
511
+ up
512
+ addrowcol -1,0
513
+ @curpos = prevlen
514
+ # if result not nil, then we need that to be recorded FIXME
515
+ fire_handler :CHANGE, InputDataEvent.new(oldcurpos,oldcurpos+carry_up.length, self, :DELETE, oldprow, carry_up)
516
+ fire_handler :CHANGE, InputDataEvent.new(prevlen,prevlen+carry_up.length, self, :INSERT, oldprow-1, carry_up)
517
+
518
+ ## BUG. carry full words up, or if no space then bring down last word of prev lien and join with first
519
+ #carry_up = words_in_length @buffer, space_left #@buffer[0..space_left] # XXX
520
+ #if carry_up.nil?
521
+ ## carry down last word
522
+ #prev_wd = remove_last_word @current_index-1
523
+ ## 2010-01-14 18:26 check added else crashing if C-h pressed with no data in line
524
+ #if !prev_wd.nil?
525
+ #@buffer.insert 0, prev_wd
526
+ #@curpos = prev_wd.length
527
+ #$log.debug " carry up nil! prev_wd (#{prev_wd}) len:#{prev_wd.length}"
528
+ #fire_handler :CHANGE, InputDataEvent.new(0,prev_wd.length, self, :INSERT, oldprow, prev_wd) # 2008-12-26 23:07
529
+ #end
530
+ #else
531
+ #$log.debug " carrying up #{carry_up.length} #{carry_up}, space: #{space_left}"
532
+ #@list[@current_index-1]=prev + carry_up
533
+ #space_left2 = @buffer[(carry_up.length+1)..-1]
534
+ #@list[@current_index]=space_left2 #if !space_left2.nil?
535
+ #@list[@current_index] ||= ""
536
+ #up
537
+ #addrowcol -1,0
538
+ #@curpos = prevlen
539
+ #fire_handler :CHANGE, InputDataEvent.new(oldcurpos,carry_up.length, self, :DELETE, oldprow, carry_up) # 2008-12-24 18:34
540
+ #fire_handler :CHANGE, InputDataEvent.new(prevlen,carry_up.length, self, :INSERT, oldprow-1, carry_up) # 2008-12-24 18:34
541
+ #end
542
+ ## FIXME -- can;t have a naked for reference here.
543
+ ##@form.col = @orig_col + @col_offset + @curpos
544
+ col1 = @orig_col + @col_offset + @curpos
545
+ setrowcol nil, col1 # 2010-02-12 13:09 RFED16
546
+
547
+ # $log.debug "carry up: nil" if carry_up.nil?
548
+ # $log.debug "listrow nil " if @list[@current_index].nil?
549
+ # $log.debug "carry up: #{carry_up} prow:#{@list[@current_index]}"
401
550
  end
402
551
  # private
403
552
  # when backspace pressed in position zero if the previous line is filled we may have to bring
404
553
  # down the last word and join, rather than go up
405
- def join_to_prev_line
554
+ # FIXME : make logic simple. Append entire line to above line. Then go to maxlen if not a space,
555
+ # reverse to find last space. Lop off all after space and replace this line with that balance.
556
+ # UNDO and REDO has to work in this case too. FIXME bare in mind handlers when doing this
557
+ def old_join_to_prev_line
406
558
  return -1 unless @editable
407
559
  return if @current_index == 0
408
560
  oldcurpos = @curpos
@@ -415,16 +567,20 @@ module RubyCurses
415
567
  up
416
568
  return
417
569
  end
418
- space_left = @maxlen - prev.length
570
+ _maxlen = @maxlen || @width - 2
571
+ space_left = _maxlen - prev.length
419
572
  # BUG. carry full words up, or if no space then bring down last word of prev lien and join with first
420
573
  carry_up = words_in_length @buffer, space_left #@buffer[0..space_left] # XXX
421
574
  if carry_up.nil?
422
575
  # carry down last word
423
576
  prev_wd = remove_last_word @current_index-1
424
- @buffer.insert 0, prev_wd
425
- @curpos = prev_wd.length
426
- $log.debug " carry up nil! prev_wd (#{prev_wd}) len:#{prev_wd.length}"
427
- fire_handler :CHANGE, InputDataEvent.new(0,prev_wd.length, self, :INSERT, oldprow, prev_wd) # 2008-12-26 23:07
577
+ # 2010-01-14 18:26 check added else crashing if C-h pressed with no data in line
578
+ if !prev_wd.nil?
579
+ @buffer.insert 0, prev_wd
580
+ @curpos = prev_wd.length
581
+ $log.debug " carry up nil! prev_wd (#{prev_wd}) len:#{prev_wd.length}"
582
+ fire_handler :CHANGE, InputDataEvent.new(0,prev_wd.length, self, :INSERT, oldprow, prev_wd) # 2008-12-26 23:07
583
+ end
428
584
  else
429
585
  $log.debug " carrying up #{carry_up.length} #{carry_up}, space: #{space_left}"
430
586
  @list[@current_index-1]=prev + carry_up
@@ -437,7 +593,10 @@ module RubyCurses
437
593
  fire_handler :CHANGE, InputDataEvent.new(oldcurpos,carry_up.length, self, :DELETE, oldprow, carry_up) # 2008-12-24 18:34
438
594
  fire_handler :CHANGE, InputDataEvent.new(prevlen,carry_up.length, self, :INSERT, oldprow-1, carry_up) # 2008-12-24 18:34
439
595
  end
440
- @form.col = @orig_col + @col_offset + @curpos
596
+ # FIXME -- can;t have a naked for reference here.
597
+ #@form.col = @orig_col + @col_offset + @curpos
598
+ col1 = @orig_col + @col_offset + @curpos
599
+ setrowcol nil, col1 # 2010-02-12 13:09 RFED16
441
600
 
442
601
  # $log.debug "carry up: nil" if carry_up.nil?
443
602
  # $log.debug "listrow nil " if @list[@current_index].nil?
@@ -461,10 +620,11 @@ module RubyCurses
461
620
  # This was needed for if i push 10 chars to next line, and the last word is less then the line will
462
621
  # exceed. So i must push as many words as exceed length.
463
622
  def push_last_word lineno=@current_index
623
+ _maxlen = @maxlen || @width - 2
464
624
  #lastspace = @buffer.rindex(" ")
465
625
  #lastspace = @list[lineno].rindex(/ \w/)
466
626
  line = @list[lineno]
467
- line = @list[lineno][0..@maxlen+1] if line.length > @maxlen
627
+ line = @list[lineno][0.._maxlen+1] if line.length > _maxlen
468
628
  lastspace = line.rindex(/ \w/)
469
629
  $log.debug " PUSH:2 #{lastspace},#{line},"
470
630
  if !lastspace.nil?
@@ -493,32 +653,38 @@ module RubyCurses
493
653
  # this attempts to recursively insert into a row, seeing that any stuff exceeding is pushed down further.
494
654
  # Yes, it should check for a para end and insert. Currently it could add to next para.
495
655
  def insert_wrap lineno, pos, lastchars
656
+ _maxlen = @maxlen || @width - 2
496
657
  @list[lineno].insert pos, lastchars
497
658
  len = @list[lineno].length
498
- if len > @maxlen
659
+ if len > _maxlen
499
660
  push_last_word lineno #- sometime i may push down 10 chars but the last word is less
500
661
  end
501
662
  end
502
663
  ##
503
664
  # add one char. careful, i shoved a string in yesterday.
504
- def putch char
505
- @buffer ||= @list[@current_index]
506
- return -1 if !@editable #or @buffer.length >= @maxlen
507
- if @chars_allowed != nil
508
- return if char.match(@chars_allowed).nil?
509
- end
665
+ def putch char
666
+ _maxlen = @maxlen || @width - 2
667
+ @buffer ||= @list[@current_index]
668
+ return -1 if !@editable #or @buffer.length >= _maxlen
669
+ #if @chars_allowed != nil # remove useless functionality
670
+ #return if char.match(@chars_allowed).nil?
671
+ #end
510
672
  raise "putch expects only one char" if char.length != 1
511
673
  oldcurpos = @curpos
512
- $log.debug "putch : pr:#{@current_index}, cp:#{@curpos}, char:#{char}, lc:#{@buffer[-1]}, buf:(#{@buffer})"
513
- @buffer.insert(@curpos, char)
674
+ #$log.debug "putch : pr:#{@current_index}, cp:#{@curpos}, char:#{char}, lc:#{@buffer[-1]}, buf:(#{@buffer})"
675
+ if @overwrite_mode
676
+ @buffer[@curpos] = char
677
+ else
678
+ @buffer.insert(@curpos, char)
679
+ end
514
680
  @curpos += 1
515
- $log.debug "putch INS: cp:#{@curpos}, max:#{@maxlen}, buf:(#{@buffer.length})"
516
- if @curpos-1 > @maxlen or @buffer.length()-1 > @maxlen
681
+ #$log.debug "putch INS: cp:#{@curpos}, max:#{_maxlen}, buf:(#{@buffer.length})"
682
+ if @curpos-1 > _maxlen or @buffer.length()-1 > _maxlen
517
683
  lastchars, lastspace = push_last_word @current_index
518
684
  #$log.debug "last sapce #{lastspace}, lastchars:#{lastchars},lc:#{lastchars[-1]}, #{@list[@current_index]} "
519
685
  ## wrap on word XX If last char is 10 then insert line
520
686
  @buffer = @list[@current_index]
521
- if @curpos-1 > @maxlen or @curpos-1 > @buffer.length()-1
687
+ if @curpos-1 > _maxlen or @curpos-1 > @buffer.length()-1
522
688
  ret = down
523
689
  # keep the cursor in the same position in the string that was pushed down.
524
690
  @curpos = oldcurpos - lastspace #lastchars.length # 0
@@ -528,16 +694,10 @@ module RubyCurses
528
694
  @buffer = @list[@current_index]
529
695
  set_form_col
530
696
  @modified = true
531
- #fire_handler :CHANGE, self # 2008-12-09 14:56
532
697
  fire_handler :CHANGE, InputDataEvent.new(oldcurpos,@curpos, self, :INSERT, @current_index, char) # 2008-12-24 18:34
533
698
  @repaint_required = true
534
699
  0
535
700
  end
536
- def append_row lineno=@current_index, chars=""
537
- $log.debug "append row sapce:#{chars}."
538
- @list.insert lineno+1, chars
539
- end
540
- ##
541
701
  # removes and returns last word in given line number, or nil if no whitespace
542
702
  def remove_last_word lineno
543
703
  @list[lineno].chomp!
@@ -564,26 +724,6 @@ module RubyCurses
564
724
  end
565
725
  return :UNHANDLED
566
726
  end
567
- # DELETE func
568
- def delete_at index=@curpos
569
- return -1 if !@editable
570
- $log.debug "dele : #{@current_index} #{@buffer} #{index}"
571
- char = @buffer.slice!(@curpos,1) # changed added ,1 and take char for event
572
- # if no newline at end of this then bring up prev character/s till maxlen
573
- # NO WE DON'T DO THIS ANYLONGER 2008-12-26 21:09 lets see
574
- =begin
575
- if @buffer[-1,1]!="\r"
576
- @buffer[-1]=" " if @buffer[-1,1]=="\n"
577
- if !next_line.nil? and next_line.length > 0
578
- move_chars_up
579
- end
580
- end
581
- =end
582
- #@modified = true 2008-12-22 15:31
583
- set_modified true
584
- #fire_handler :CHANGE, self # 2008-12-09 14:56
585
- fire_handler :CHANGE, InputDataEvent.new(@curpos,@curpos, self, :DELETE, @current_index, char) # 2008-12-24 18:34
586
- end
587
727
  # move up one char from next row to current, used when deleting in a line
588
728
  # should not be called if line ends in "\r"
589
729
  def move_char_up
@@ -595,7 +735,8 @@ module RubyCurses
595
735
  def move_chars_up
596
736
  oldprow = @current_index
597
737
  oldcurpos = @curpos
598
- space_left = @maxlen - @buffer.length
738
+ _maxlen = @maxlen || @width - 2
739
+ space_left = _maxlen - @buffer.length
599
740
  can_move = [space_left, next_line.length].min
600
741
  carry_up = @list[@current_index+1].slice!(0, can_move)
601
742
  @list[@current_index] << carry_up
@@ -615,16 +756,20 @@ module RubyCurses
615
756
  def set_modified tf=true
616
757
  @modified = tf
617
758
  @repaint_required = tf
618
- @form.modified = true if tf
759
+ @repaint_footer_required = tf
760
+ # 2010-01-14 22:45 putting a check for form, so not necessary to have form set when appending data
761
+ @form.modified = true if tf and !@form.nil?
619
762
  end
620
763
  def cursor_eol
621
- $log.error "ERROR !!! bufferlen gt maxlen #{@buffer.length}, #{@maxlen}" if @buffer.length > @maxlen
764
+ _maxlen = @maxlen || @width - 2
765
+ $log.error "ERROR !!! bufferlen gt _maxlen #{@buffer.length}, #{_maxlen}" if @buffer.length > _maxlen
622
766
  set_form_col current_line().chomp().length()-1
623
767
  end
624
768
  def cursor_bol
625
769
  set_form_col 0
626
770
  end
627
- def to_s
771
+ #def to_s this was just annoying in debugs
772
+ def get_text
628
773
  l = getvalue
629
774
  str = ""
630
775
  old = " "
@@ -639,24 +784,31 @@ module RubyCurses
639
784
  end
640
785
  str
641
786
  end
642
- alias :get_text :to_s
787
+ #alias :get_text :to_s
643
788
  ## ---- for listscrollable ---- ##
644
789
  def scrollatrow
645
- @height-2
790
+ @height-3 # 2010-01-02 19:28 BUFFERED
646
791
  end
647
792
  def row_count
648
793
  @list.size
649
794
  end
650
795
  def paint
651
- print_borders if @to_print_borders == 1 # do this once only, unless everything changes
796
+ # not sure where to put this, once for all or repeat 2010-02-12 RFED16
797
+ my_win = @form? @form.window : @target_window
798
+ $log.warn "neither form not target window given!!! TA paint 751" unless my_win
799
+ @win_left = my_win.left # unused remove TODO
800
+ @win_top = my_win.top
801
+ print_borders if (@suppress_borders == false && @repaint_all) # do this once only, unless everything changes
652
802
  rc = row_count
653
- maxlen = @maxlen ||= @width-2
803
+ _maxlen = @maxlen || @width-2 # TODO fix in other branches remove ||=
804
+ $log.debug " #{@name} textarea repaint width is #{@width}, height is #{@height} , maxlen #{_maxlen}/ #{@maxlen}, #{@graphic.name} "
654
805
  tm = get_content
655
806
  tr = @toprow
656
807
  acolor = get_color $datacolor
657
808
  h = scrollatrow()
658
809
  r,c = rowcol
659
- $log.debug " TA:::: #{tr} , #{h}"
810
+ @longest_line = @width # _maxlen scroll uses width not maxlen
811
+ $log.debug " TA:::: #{tr} , #{h}, r #{r} c #{c} "
660
812
  0.upto(h) do |hh|
661
813
  crow = tr+hh
662
814
  if crow < rc
@@ -666,8 +818,9 @@ module RubyCurses
666
818
  content.gsub!(/\t/, ' ') # don't display tab
667
819
  content.gsub!(/[^[:print:]]/, '') # don't display non print characters
668
820
  if !content.nil?
669
- if content.length > maxlen # only show maxlen
670
- content = content[@pcol..@pcol+maxlen-1]
821
+ if content.length > _maxlen # only show _maxlen
822
+ @longest_line = content.length if content.length > @longest_line
823
+ content = content[@pcol..@pcol+_maxlen-1]
671
824
  else
672
825
  content = content[@pcol..-1]
673
826
  end
@@ -676,20 +829,26 @@ module RubyCurses
676
829
  #renderer = cell_renderer()
677
830
  #renderer.repaint @form.window, r+hh, c+(colix*11), content, focussed, selected
678
831
  #renderer.repaint @form.window, r+hh, c, content, focussed, selected
679
- @form.window.printstring r+hh, c, "%-*s" % [@width-2,content], acolor, @attr
832
+ @graphic.printstring r+hh, c, "%-*s" % [@width-2,content], acolor, @attr
680
833
  if @search_found_ix == tr+hh
681
834
  if !@find_offset.nil?
682
- @form.window.mvchgat(y=r+hh, x=c+@find_offset, @find_offset1-@find_offset, Ncurses::A_NORMAL, $reversecolor, nil)
835
+ @graphic.mvchgat(y=r+hh, x=c+@find_offset, @find_offset1-@find_offset, Ncurses::A_NORMAL, $reversecolor, nil)
683
836
  end
684
837
  end
685
838
 
686
839
  else
687
840
  # clear rows
688
- @form.window.printstring r+hh, c, " " * (@width-2), acolor,@attr
841
+ # TODO the spaces string can be stored once outside loop
842
+ @graphic.printstring r+hh, c, " " * (@width-2), acolor,@attr
689
843
  end
690
844
  end
845
+ show_caret_func
846
+
691
847
  @table_changed = false
692
848
  @repaint_required = false
849
+ @repaint_footer_required = true # 2010-01-23 22:41
850
+ @buffer_modified = true # required by form to call buffer_to_screen
851
+ @repaint_all = false # added 2010-01-14 for redrawing everything
693
852
  end
694
853
  def ask_search_forward
695
854
  regex = get_string("Enter regex to search", 20, @last_regex||"")