rbcurse 0.1.3 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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||"")