rbcurse 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/CHANGELOG +33 -0
  2. data/README.markdown +7 -1
  3. data/TODO2.txt +21 -15
  4. data/VERSION +1 -1
  5. data/examples/abasiclist.rb +2 -2
  6. data/examples/alpmenu.rb +1 -1
  7. data/examples/app.rb +0 -1
  8. data/examples/appdirtree.rb +4 -2
  9. data/examples/appemail.rb +7 -3
  10. data/examples/appemaillb.rb +1 -1
  11. data/examples/appgcompose.rb +2 -2
  12. data/examples/appgmail.rb +1 -1
  13. data/examples/appmethods.rb +20 -2
  14. data/examples/atree.rb +9 -1
  15. data/examples/dbdemo.rb +460 -0
  16. data/examples/dirtree.rb +1 -1
  17. data/examples/menu1.rb +37 -5
  18. data/examples/multispl.rb +1 -1
  19. data/examples/rfe.rb +9 -2
  20. data/examples/splitp.rb +1 -1
  21. data/examples/sqlc.rb +6 -10
  22. data/examples/sqlm.rb +2 -20
  23. data/examples/sqlt.rb +408 -0
  24. data/examples/term2.rb +1 -1
  25. data/examples/test2.rb +169 -97
  26. data/examples/testapp.rb +1 -1
  27. data/examples/testapp2.rb +1 -1
  28. data/examples/testkeypress.rb +4 -2
  29. data/examples/testtable.rb +6 -0
  30. data/examples/testtpane.rb +35 -23
  31. data/examples/testvimsplit.rb +3 -2
  32. data/lib/rbcurse.rb +1 -1
  33. data/lib/rbcurse/action.rb +8 -0
  34. data/lib/rbcurse/app.rb +39 -23
  35. data/lib/rbcurse/extras/bottomline.rb +101 -13
  36. data/lib/rbcurse/extras/directorylist.rb +14 -5
  37. data/lib/rbcurse/extras/divider.rb +1 -1
  38. data/lib/rbcurse/extras/listselectable.rb +42 -8
  39. data/lib/rbcurse/extras/masterdetail.rb +2 -2
  40. data/lib/rbcurse/extras/scrollbar.rb +11 -2
  41. data/lib/rbcurse/extras/statusline.rb +56 -0
  42. data/lib/rbcurse/extras/stdscrwindow.rb +11 -0
  43. data/lib/rbcurse/extras/tabular.rb +2 -1
  44. data/lib/rbcurse/extras/tabularwidget.rb +60 -17
  45. data/lib/rbcurse/extras/viewer.rb +16 -4
  46. data/lib/rbcurse/keylabelprinter.rb +34 -4
  47. data/lib/rbcurse/listeditable.rb +5 -1
  48. data/lib/rbcurse/listkeys.rb +1 -1
  49. data/lib/rbcurse/listscrollable.rb +15 -8
  50. data/lib/rbcurse/rbasiclistbox.rb +44 -23
  51. data/lib/rbcurse/rcommandwindow.rb +8 -14
  52. data/lib/rbcurse/rdialogs.rb +187 -2
  53. data/lib/rbcurse/rlistbox.rb +38 -19
  54. data/lib/rbcurse/rmenu.rb +313 -93
  55. data/lib/rbcurse/rmessagebox.rb +3 -2
  56. data/lib/rbcurse/rmulticontainer.rb +5 -3
  57. data/lib/rbcurse/rmultisplit.rb +2 -11
  58. data/lib/rbcurse/rmultitextview.rb +4 -5
  59. data/lib/rbcurse/rtabbedpane.rb +223 -69
  60. data/lib/rbcurse/rtable.rb +6 -10
  61. data/lib/rbcurse/rtextarea.rb +57 -36
  62. data/lib/rbcurse/rtextview.rb +12 -15
  63. data/lib/rbcurse/rtree.rb +79 -22
  64. data/lib/rbcurse/rvimsplit.rb +16 -25
  65. data/lib/rbcurse/rwidget.rb +376 -523
  66. data/lib/rbcurse/tree/treecellrenderer.rb +24 -11
  67. data/lib/rbcurse/tree/treemodel.rb +1 -1
  68. data/lib/ver/window.rb +130 -66
  69. metadata +5 -3
  70. data/examples/term.rb +0 -48
@@ -18,6 +18,7 @@
18
18
  currently it moves to next row. (examples/sqlc.rb) - DONE
19
19
 
20
20
  * 2010-01-18 19:54 - BUFFERING related changes.
21
+ * 2011-09-30 - removed all buffer related stuff
21
22
  --------
22
23
  * Date: 2008-12-27 21:33
23
24
  * License:
@@ -91,7 +92,6 @@ module RubyCurses
91
92
  init_vars
92
93
  install_list_keys
93
94
  install_keys_bindings
94
- ## create_buffer needs to move to repaint. widget needs values to use when i creates buffer in repaint.
95
95
  if _data && _columns
96
96
  set_data _data, _columns
97
97
  end
@@ -145,7 +145,8 @@ module RubyCurses
145
145
  def focussed_row
146
146
  #raise "No data in table" if row_count < 1
147
147
  return nil if row_count < 1
148
- @current_index
148
+ return @current_index if @current_index < row_count
149
+ @current_index = row_count-1
149
150
  end
150
151
  def focussed_col
151
152
  return nil if row_count < 1
@@ -251,7 +252,7 @@ module RubyCurses
251
252
  end
252
253
  # @deprecated, avoid usage
253
254
  def get_table_column_model
254
- $log.debug " DEPRECATED. Pls use table_column_model()"
255
+ $log.warn " DEPRECATED. Pls use table_column_model()"
255
256
  @table_column_model
256
257
  end
257
258
  #
@@ -338,6 +339,7 @@ module RubyCurses
338
339
  #--- row and column methods of Table ---#
339
340
  # must not give wrong results when columns switched!
340
341
  def get_value_at row, col
342
+ return nil if row.nil? || col.nil? # 2011-09-29
341
343
  model_index = @table_column_model.column(col).model_index
342
344
  @table_model.get_value_at row, model_index
343
345
  end
@@ -487,10 +489,6 @@ module RubyCurses
487
489
  @repaint_required = true
488
490
  # copied from rlistbox, so that editors write on parent's graphic, otherwise
489
491
  # their screen updates get overwritten by parent. 2010-01-19 20:17
490
- if @should_create_buffer
491
- $log.debug "LB #{@name} overriding editors comp with GRAPHIC #{@graphic} "
492
- editor.component.override_graphic(@graphic) # 2010-01-05 00:36 TRYING OUT BUFFERED
493
- end
494
492
  set_form_col
495
493
  end
496
494
  ## Its too late to call components on_leave here
@@ -881,7 +879,6 @@ module RubyCurses
881
879
 
882
880
 
883
881
  def repaint
884
- safe_create_buffer # moved here 2010-02-19 09:53 RFED16
885
882
  return unless @repaint_required
886
883
  my_win = @form ? @form.window : @target_window
887
884
  @graphic = my_win unless @graphic
@@ -980,8 +977,7 @@ module RubyCurses
980
977
  $log.debug " _print_more_data_marker(#{rc} >= #{tr} + #{h})"
981
978
  @table_changed = false
982
979
  @repaint_required = false
983
- @buffer_modified = true
984
- buffer_to_window # RFED16 2010-02-19 09:55
980
+ #@buffer_modified = true # 2011-09-30 CLEANUP
985
981
  end
986
982
  # NEW to correct overflow
987
983
  # 2009-10-05 21:34
@@ -37,14 +37,15 @@ module RubyCurses
37
37
  # work correctly.
38
38
  class TextArea < Widget
39
39
  include ListScrollable
40
+ # NOTE: common editing functions moved to listeditable
40
41
  include ListEditable
41
42
  dsl_accessor :title
42
43
  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
44
- dsl_accessor :list # the array of data to be sent by user
45
- dsl_accessor :maxlen # max display length of a row/line
44
+ dsl_accessor :footer_attrib # bold, reverse, normal added 2009-12-26 18:25 was this missing or delib
45
+ dsl_accessor :list # the array of data to be sent by user
46
+ dsl_accessor :maxlen # max display length of a row/line
46
47
  attr_reader :toprow
47
- dsl_accessor :auto_scroll # boolean, keeps view at end as data is inserted.
48
+ dsl_accessor :auto_scroll # boolean, keeps view at end as data is inserted.
48
49
  dsl_accessor :print_footer
49
50
  dsl_accessor :editable # allow editing
50
51
  dsl_accessor :suppress_borders # added 2010-02-12 12:21 values true or false
@@ -59,6 +60,8 @@ module RubyCurses
59
60
  @list = []
60
61
  @suppress_borders = false
61
62
  @row_offset = @col_offset = 1 # for cursor display on first entry, so not positioned on border
63
+ @_events ||= []
64
+ @_events.push :CHANGE
62
65
  super
63
66
  @orig_col = @col
64
67
  # this does result in a blank line if we insert after creating. That's required at
@@ -69,7 +72,6 @@ module RubyCurses
69
72
  @content_rows = @list.length
70
73
  @win = @graphic # 2009-12-26 14:54 BUFFERED replace form.window with graphic
71
74
  # 2010-01-10 19:35 compute locally if not set
72
- @_events.push :CHANGE
73
75
  install_keys
74
76
  init_vars
75
77
  end
@@ -176,12 +178,15 @@ module RubyCurses
176
178
  # private
177
179
  def print_borders
178
180
  window = @graphic # 2009-12-26 14:54 BUFFERED
179
- color = $datacolor
181
+ @color_pair = get_color($datacolor) # 2011-09-28 V1.3.1
182
+ bordercolor = @border_color || @color_pair
183
+ borderatt = @border_attrib || Ncurses::A_NORMAL
184
+ #color = $datacolor
180
185
  #window.print_border @row, @col, @height, @width, color
181
186
  ## NOTE: If it bombs in next line, either no form passed
182
187
  ##+ or you using this embedded and need to set should_create_buffer true when
183
188
  ##+ creating. See examples/testscrollta.rb.
184
- window.print_border @row, @col, @height-1, @width, color
189
+ window.print_border @row, @col, @height-1, @width, bordercolor, borderatt
185
190
  print_title
186
191
  =begin
187
192
  hline = "+%s+" % [ "-"*(width-((1)*2)) ]
@@ -199,11 +204,12 @@ module RubyCurses
199
204
  def print_title
200
205
  # truncate title if longer than width
201
206
  return unless @title
207
+ @color_pair ||= get_color($datacolor)
202
208
  _title = @title
203
209
  if @title.length > @width - 2
204
210
  _title = @title[0..@width-2]
205
211
  end
206
- @graphic.printstring( @row, @col+(@width-_title.length)/2, _title, $datacolor, @title_attrib) unless @title.nil?
212
+ @graphic.printstring( @row, @col+(@width-_title.length)/2, _title, @color_pair, @title_attrib) unless @title.nil?
207
213
  end
208
214
  # text_area print footer
209
215
  def print_foot
@@ -212,28 +218,44 @@ module RubyCurses
212
218
  #$log.debug " print_foot calling printstring with #{@row} + #{@height} -1, #{@col}+2"
213
219
  # changed 2010-01-02 19:31 BUFFERED we were exceeding 1
214
220
  #@graphic.printstring( @row + @height, @col+2, footer, $datacolor, @footer_attrib)
215
- @graphic.printstring( @row + @height-1, @col+2, footer, $datacolor, @footer_attrib)
221
+ @graphic.printstring( @row + @height-1, @col+2, footer, @color_pair || $datacolor, @footer_attrib)
216
222
  @repaint_footer_required = false
217
223
  end
218
224
  ### FOR scrollable ###
219
225
  def get_content
220
226
  @list
221
227
  end
228
+ #
229
+ # sets content of textarea. I don't know why this was not existing all this while
230
+ # Name to be consistent with textview. Okay, this does not wrap the words, we assume
231
+ # its short enough. FIXME. Avoid using currently till i firm this.
232
+ # NOTE: does not wrap, and does not trigger events
233
+ # Added on 2011-10-10
234
+ # @since 1.4.0
235
+ # @param [String, Array] String is an existing filename, Array is content to be replaced
236
+ def set_content lines
237
+ case lines
238
+ when String
239
+ if File.exists? lines
240
+ lines = File.open(lines,"r").readlines
241
+ else
242
+ raise "set_content String param should be a filename"
243
+ end
244
+ when Array
245
+ else
246
+ raise "Don't know how to handle data in set_content: #{lines.class} "
247
+ end
248
+ @list.replace lines
249
+ @repaint_required = true
250
+ end
222
251
  def get_window
223
252
  @graphic
224
253
  end
225
254
  ### FOR scrollable ###
226
255
  def repaint # textarea
227
- if @screen_buffer.nil? and @should_create_buffer
228
- safe_create_buffer
229
- @screen_buffer.name = "Pad::TXTA_PAD_#{@name}"
230
- $log.debug " textarea creates pad #{@screen_buffer} #{@name}"
231
- end
232
-
233
256
  #return unless @repaint_required # 2010-02-12 19:08 TRYING - won't let footer print if only col move
234
257
  paint if @repaint_required
235
258
  print_foot if @print_footer && !@suppress_borders && (@repaint_footer_required || @repaint_required)
236
- buffer_to_window # 2010-02-12 14:54 RFED16
237
259
  end
238
260
  def getvalue
239
261
  @list
@@ -243,8 +265,10 @@ module RubyCurses
243
265
  return if @keys_mapped
244
266
  bind_key(Ncurses::KEY_LEFT){ cursor_backward }
245
267
  bind_key(Ncurses::KEY_RIGHT){ cursor_forward }
246
- bind_key(Ncurses::KEY_UP){ up }
247
- bind_key(Ncurses::KEY_DOWN){ down }
268
+ bind_key(Ncurses::KEY_UP){ ret = up; get_window.ungetch(KEY_BTAB) if ret == :NO_PREVIOUS_ROW }
269
+ # the next was irritating if user wanted to add a row ! 2011-10-10
270
+ #bind_key(Ncurses::KEY_DOWN){ ret = down ; get_window.ungetch(KEY_TAB) if ret == :NO_NEXT_ROW }
271
+ bind_key(Ncurses::KEY_DOWN){ ret = down ; }
248
272
  bind_key(?\C-a){ cursor_bol }
249
273
  bind_key(?\C-e){ cursor_eol }
250
274
  bind_key(?\C-n) { scroll_forward }
@@ -293,10 +317,6 @@ module RubyCurses
293
317
  case ch
294
318
  when KEY_ENTER, 10, KEY_RETURN
295
319
  insert_break
296
- #when KEY_LEFT
297
- #cursor_backward
298
- #when KEY_RIGHT
299
- #cursor_forward
300
320
  when Ncurses.KEY_BACKSPACE, Ncurses.KEY_BSPACE
301
321
  if @editable # checking here means that i can programmatically bypass!!
302
322
  delete_prev_char
@@ -322,19 +342,9 @@ module RubyCurses
322
342
  #@multiplier = (@multiplier == 0 ? 4 : @multiplier *= 4)
323
343
  #return 0
324
344
  when ?\C-_.getbyte(0) # changed from C-u so i can use C-u for multipliers
325
- if @undo_handler
326
- @undo_handler.undo
327
- else
328
- undo_delete
329
- end
345
+ undo
330
346
  when ?\C-r.getbyte(0) # redo if UndoHandler installed
331
- return unless @undo_handler
332
- @undo_handler.redo
333
- #when ?\C-a.getbyte(0)
334
- #cursor_bol
335
- #when ?\C-e.getbyte(0)
336
- #cursor_eol
337
-
347
+ text_redo # won't accept name redo
338
348
  #when @KEY_ASK_FIND_FORWARD
339
349
  # ask_search_forward
340
350
  #when @KEY_ASK_FIND_BACKWARD
@@ -793,7 +803,7 @@ module RubyCurses
793
803
  def cursor_eol
794
804
  _maxlen = @maxlen || @width - @internal_width
795
805
  $log.error "ERROR !!! bufferlen gt _maxlen #{@buffer.length}, #{_maxlen}" if @buffer.length > _maxlen
796
- set_form_col current_line().chomp().length()-1
806
+ set_form_col current_line().chomp().length() #-1 needs to be one ahead 2011-10-10 TRYING OUT XXX
797
807
  end
798
808
  def cursor_bol
799
809
  set_form_col 0
@@ -838,6 +848,7 @@ module RubyCurses
838
848
  $log.debug " #{@name} textarea repaint width is #{@width}, height is #{@height} , maxlen #{_maxlen}/ #{@maxlen}, #{@graphic.name} "
839
849
  tm = get_content
840
850
  tr = @toprow
851
+ raise "textarea height not specified" unless @height
841
852
  acolor = get_color $datacolor
842
853
  h = scrollatrow()
843
854
  r,c = rowcol
@@ -881,7 +892,6 @@ module RubyCurses
881
892
  @table_changed = false
882
893
  @repaint_required = false
883
894
  @repaint_footer_required = true # 2010-01-23 22:41
884
- @buffer_modified = true # required by form to call buffer_to_screen
885
895
  @repaint_all = false # added 2010-01-14 for redrawing everything
886
896
  end
887
897
  def ask_search_forward
@@ -894,6 +904,17 @@ module RubyCurses
894
904
  set_form_col @find_offset
895
905
  end
896
906
  end
907
+ def undo
908
+ if @undo_handler
909
+ @undo_handler.undo
910
+ else
911
+ undo_delete
912
+ end
913
+ end
914
+ def text_redo
915
+ return unless @undo_handler
916
+ @undo_handler.redo
917
+ end
897
918
  end # class textarea
898
919
  ##
899
920
  end # modul
@@ -180,7 +180,9 @@ module RubyCurses
180
180
 
181
181
  $log.debug " #{@name} print_borders, #{@graphic.name} "
182
182
 
183
- bordercolor = @border_color || $datacolor
183
+ @color_pair = get_color($datacolor) # added 2011-09-28 as in rlistbox
184
+ # bordercolor = @border_color || $datacolor # changed 2011 dts
185
+ bordercolor = @border_color || @color_pair # 2011-09-28 V1.3.1
184
186
  borderatt = @border_attrib || Ncurses::A_NORMAL
185
187
  @graphic.print_border @row, @col, @height-1, @width, bordercolor, borderatt
186
188
  print_title
@@ -188,20 +190,21 @@ module RubyCurses
188
190
  def print_title #:nodoc:
189
191
  return unless @title
190
192
  raise "textview needs width" unless @width
191
- @color_pair ||= get_color($datacolor) # should we not use this ??? XXX
193
+ @color_pair ||= get_color($datacolor) # should we not use this ??? XXX
192
194
  #$log.debug " print_title #{@row}, #{@col}, #{@width} "
193
195
  # check title.length and truncate if exceeds width
194
196
  _title = @title
195
197
  if @title.length > @width - 2
196
198
  _title = @title[0..@width-2]
197
199
  end
198
- @graphic.printstring( @row, @col+(@width-_title.length)/2, _title, $datacolor, @title_attrib) unless @title.nil?
200
+ # @graphic.printstring( @row, @col+(@width-_title.length)/2, _title, $datacolor, @title_attrib) unless @title.nil? # changed 2011 dts
201
+ @graphic.printstring( @row, @col+(@width-_title.length)/2, _title, @color_pair, @title_attrib) unless @title.nil?
199
202
  end
200
203
  def print_foot #:nodoc:
201
204
  @footer_attrib ||= Ncurses::A_REVERSE
202
205
  footer = "R: #{@current_index+1}, C: #{@curpos+@pcol}, #{@list.length} lines "
203
206
  #$log.debug " print_foot calling printstring with #{@row} + #{@height} -1, #{@col}+2"
204
- @graphic.printstring( @row + @height -1 , @col+2, footer, $datacolor, @footer_attrib)
207
+ @graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, @footer_attrib)
205
208
  @repaint_footer_required = false # 2010-01-23 22:55
206
209
  end
207
210
  ### FOR scrollable ###
@@ -213,17 +216,12 @@ module RubyCurses
213
216
  end
214
217
 
215
218
  def repaint # textview :nodoc:
216
- if @screen_buffer.nil?
217
- safe_create_buffer
218
- @screen_buffer.name = "Pad::TV_PAD_#{@name}" unless @screen_buffer.nil?
219
- $log.debug " textview creates pad #{@screen_buffer} #{@name}"
220
- end
219
+ $log.debug "TEXTVIEW repaint r c #{@row}, #{@col} "
221
220
 
222
221
  #return unless @repaint_required # 2010-02-12 19:08 TRYING - won't let footer print for col move
223
222
  paint if @repaint_required
224
223
  # raise "TV 175 graphic nil " unless @graphic
225
224
  print_foot if @print_footer && !@suppress_borders && @repaint_footer_required
226
- buffer_to_window
227
225
  end
228
226
  def getvalue
229
227
  @list
@@ -259,10 +257,12 @@ module RubyCurses
259
257
  when KEY_UP, ?k.getbyte(0)
260
258
  #select_prev_row
261
259
  ret = up
260
+ get_window.ungetch(KEY_BTAB) if ret == :NO_PREVIOUS_ROW
262
261
  check_curpos
263
262
 
264
263
  when KEY_DOWN, ?j.getbyte(0)
265
264
  ret = down
265
+ get_window.ungetch(KEY_TAB) if ret == :NO_NEXT_ROW
266
266
  check_curpos
267
267
  when KEY_LEFT, ?h.getbyte(0)
268
268
  cursor_backward
@@ -320,10 +320,9 @@ module RubyCurses
320
320
  begin
321
321
  ret = process_key ch, self
322
322
  rescue => err
323
- $error_message = err
324
- @form.window.print_error_message
325
323
  $log.error " TEXTVIEW ERROR #{err} "
326
324
  $log.debug(err.backtrace.join("\n"))
325
+ alert err.to_s
327
326
  end
328
327
  return :UNHANDLED if ret == :UNHANDLED
329
328
  end
@@ -487,10 +486,8 @@ module RubyCurses
487
486
  #@table_changed = false
488
487
  @repaint_required = false
489
488
  @repaint_footer_required = true
490
- @buffer_modified = true # required by form to call buffer_to_screen
491
489
  @repaint_all = false
492
490
 
493
- # 2010-02-10 22:08 RFED16
494
491
  end
495
492
  # takes a block, this way anyone extending this class can just pass a block to do his job
496
493
  # This modifies the string
@@ -499,7 +496,7 @@ module RubyCurses
499
496
  content.chomp!
500
497
  # trying out since gsub giving #<ArgumentError: invalid byte sequence in UTF-8> 2011-09-11
501
498
  content = content.encode("ASCII-8BIT", :invalid => :replace, :undef => :replace, :replace => "?")
502
- content.gsub!(/\t/, ' ') # don't display tab
499
+ content.gsub!(/[\t\n\r]/, ' ') # don't display tab
503
500
  content.gsub!(/[^[:print:]]/, '') # don't display non print characters
504
501
  else
505
502
  content
data/lib/rbcurse/rtree.rb CHANGED
@@ -49,12 +49,14 @@ module RubyCurses
49
49
  dsl_property :row_selected_symbol # 2009-01-12 12:01 changed from selector to selected
50
50
  dsl_property :row_unselected_symbol # added 2009-01-12 12:00
51
51
  dsl_property :left_margin
52
+ dsl_accessor :sanitization_required # 2011-10-6
52
53
  #dsl_accessor :valign # popup related
53
54
  #
54
55
  # will pressing a single key move to first matching row. setting it to false lets us use vim keys
55
56
  attr_accessor :one_key_selection # will pressing a single key move to first matching row
56
57
  # index of row selected, relates to internal representation, not tree. @see selected_row
57
58
  attr_reader :selected_index # index of row that is selected. this relates to representation
59
+ attr_reader :treemodel # returns treemodel for further actions 2011-10-2
58
60
 
59
61
  def initialize form, config={}, &block
60
62
  @focusable = true
@@ -75,12 +77,16 @@ module RubyCurses
75
77
  super
76
78
  #@selection_mode ||= :single # default is multiple, anything else given becomes single
77
79
  @win = @graphic # 2010-01-04 12:36 BUFFERED replace form.window with graphic
80
+ @sanitization_required = true
81
+ @longest_line = 0
78
82
 
79
83
 
80
84
  @win_left = 0
81
85
  @win_top = 0
82
86
  @_events.push(*[:ENTER_ROW, :LEAVE_ROW, :TREE_COLLAPSED_EVENT, :TREE_EXPANDED_EVENT, :TREE_SELECTION_EVENT, :TREE_WILL_COLLAPSE_EVENT, :TREE_WILL_EXPAND_EVENT])
83
87
 
88
+
89
+ bind(:PROPERTY_CHANGE){|e| @cell_renderer = nil } # will be recreated if anything changes 2011-09-28 V1.3.1
84
90
  init_vars
85
91
 
86
92
  #if !@list.selected_index.nil?
@@ -114,11 +120,15 @@ module RubyCurses
114
120
  bind_key(KEY_RETURN) { toggle_expanded_state() }
115
121
  bind_key(?o) { toggle_expanded_state() }
116
122
  bind_key(?f){ ask_selection_for_char() }
117
- bind_key(?\M-v){ @one_key_selection = true }
123
+ bind_key(?\M-v){ @one_key_selection = !@one_key_selection }
118
124
  bind_key(KEY_DOWN){ next_row() }
119
125
  bind_key(KEY_UP){ previous_row() }
120
126
  bind_key(?O){ expand_children() }
121
127
  bind_key(?X){ collapse_children() }
128
+ bind_key(?>, :scroll_right)
129
+ bind_key(?<, :scroll_left)
130
+ bind_key(?\M-l, :scroll_right)
131
+ bind_key(?\M-h, :scroll_left)
122
132
  # TODO
123
133
  bind_key(?x){ collapse_parent() }
124
134
  bind_key(?p){ goto_parent() }
@@ -156,15 +166,28 @@ module RubyCurses
156
166
  return @height - 3
157
167
  end
158
168
  end
159
- # this allows a user to use this 2 times !! XXX
160
- def root node, asks_allow_children=false, &block
169
+ #
170
+ # Sets the given node as root and returns treemodel.
171
+ # Returns root if no argument given.
172
+ # Now we return root if already set
173
+ # Made node nillable so we can return root.
174
+ #
175
+ # @raise ArgumentError if setting a root after its set
176
+ # or passing nil if its not been set.
177
+ def root node=nil, asks_allow_children=false, &block
178
+ if @treemodel
179
+ return @treemodel.root unless node
180
+ raise ArgumentError, "Root already set"
181
+ end
182
+
161
183
  raise ArgumentError, "root: node cannot be nil" unless node
162
184
  @treemodel = RubyCurses::DefaultTreeModel.new(node, asks_allow_children, &block)
163
185
  end
186
+
164
187
  # pass data to create this tree model
165
188
  # used to be list
166
189
  def data alist=nil
167
- #return @treemodel if alist.nil?
190
+
168
191
  # if nothing passed, print an empty root, rather than crashing
169
192
  alist = [] if alist.nil?
170
193
  @data = alist # data given by user
@@ -253,7 +276,9 @@ module RubyCurses
253
276
  window = @graphic # 2010-01-04 12:37 BUFFERED
254
277
  startcol = @col
255
278
  startrow = @row
256
- bordercolor = @border_color || $datacolor
279
+ @color_pair = get_color($datacolor)
280
+ # bordercolor = @border_color || $datacolor # changed 2011 dts
281
+ bordercolor = @border_color || @color_pair # 2011-09-28 V1.3.1
257
282
  borderatt = @border_attrib || Ncurses::A_NORMAL
258
283
 
259
284
  window.print_border startrow, startcol, height, width, bordercolor, borderatt
@@ -265,7 +290,7 @@ module RubyCurses
265
290
  if @title.length > @width - 2
266
291
  _title = @title[0..@width-2]
267
292
  end
268
- @color_pair = get_color($datacolor)
293
+ @color_pair ||= get_color($datacolor)
269
294
  @graphic.printstring( @row, @col+(@width-_title.length)/2, _title, @color_pair, @title_attrib) unless @title.nil?
270
295
  end
271
296
  ### START FOR scrollable ###
@@ -417,12 +442,11 @@ module RubyCurses
417
442
  # a section of it.
418
443
  # FIXME: tree may not be clearing till end see appdirtree after divider movement
419
444
  def repaint
420
- safe_create_buffer # 2010-01-04 12:36 BUFFERED moved here 2010-01-05 18:07
421
445
  return unless @repaint_required
422
- # not sure where to put this, once for all or repeat 2010-02-17 23:07 RFED16
446
+
423
447
  my_win = @form ? @form.window : @target_window
424
448
  @graphic = my_win unless @graphic
425
- #$log.warn "neither form not target window given!!! TV paint 368" unless my_win
449
+
426
450
  raise " #{@name} neither form, nor target window given TV paint " unless my_win
427
451
  raise " #{@name} NO GRAPHIC set as yet TV paint " unless @graphic
428
452
  @win_left = my_win.left
@@ -431,6 +455,7 @@ module RubyCurses
431
455
  $log.debug "rtree repaint #{@name} graphic #{@graphic}"
432
456
  print_borders unless @suppress_borders # do this once only, unless everything changes
433
457
  maxlen = @maxlen || @width-@internal_width
458
+ maxlen -= @left_margin # 2011-10-6
434
459
  tm = _list()
435
460
  select_default_values
436
461
  rc = row_count
@@ -438,6 +463,7 @@ module RubyCurses
438
463
  acolor = get_color $datacolor
439
464
  h = scrollatrow()
440
465
  r,c = rowcol
466
+ @longest_line = @width #maxlen
441
467
  0.upto(h) do |hh|
442
468
  crow = tr+hh
443
469
  if crow < rc
@@ -452,24 +478,19 @@ module RubyCurses
452
478
  node = content
453
479
  object = content
454
480
  leaf = node.is_leaf?
481
+ # content passed is rejected by treecellrenderer 2011-10-6
455
482
  content = node.user_object.to_s # may need to trim or truncate
456
483
  expanded = row_expanded? crow
457
484
  elsif content.is_a? String
458
- content = content.dup
459
- content.chomp!
460
- content.gsub!(/\t/, ' ') # don't display tab
461
- content.gsub!(/[^[:print:]]/, '') # don't display non print characters
462
- if !content.nil?
463
- if content.length > maxlen # only show maxlen
464
- content = content[@pcol..@pcol+maxlen-1]
465
- else
466
- content = content[@pcol..-1]
467
- end
468
- end
485
+ $log.warn "Removed this entire block since i don't think it was used XXX "
486
+ # this block does not set object XXX
469
487
  else
470
488
  raise "repaint what is the class #{content.class} "
471
489
  content = content.to_s
472
490
  end
491
+ # this is redundant since data is taken by renderer directly
492
+ #sanitize content if @sanitization_required
493
+ #truncate value
473
494
  ## set the selector symbol if requested
474
495
  selection_symbol = ''
475
496
  if @show_selector
@@ -480,10 +501,13 @@ module RubyCurses
480
501
  end
481
502
  @graphic.printstring r+hh, c, selection_symbol, acolor,@attr
482
503
  end
504
+
483
505
  renderer = cell_renderer()
484
506
  renderer.display_length(@width-@internal_width-@left_margin) # just in case resizing of listbox
507
+ renderer.pcol = @pcol
485
508
  #renderer.repaint @graphic, r+hh, c+@left_margin, crow, content, _focussed, selected
486
509
  renderer.repaint @graphic, r+hh, c+@left_margin, crow, object, content, leaf, focus_type, selected, expanded
510
+ @longest_line = renderer.actual_length if renderer.actual_length > @longest_line
487
511
  else
488
512
  # clear rows
489
513
  @graphic.printstring r+hh, c, " " * (@width-@internal_width), acolor,@attr
@@ -491,9 +515,8 @@ module RubyCurses
491
515
  end
492
516
  @table_changed = false
493
517
  @repaint_required = false
494
- @buffer_modified = true # required by form to call buffer_to_screen BUFFERED
495
- buffer_to_window # RFED16 2010-02-17 23:16
496
518
  end
519
+
497
520
  def list_data_changed
498
521
  if row_count == 0 # added on 2009-02-02 17:13 so cursor not hanging on last row which could be empty
499
522
  init_vars
@@ -707,6 +730,39 @@ module RubyCurses
707
730
  end
708
731
  end
709
732
  end
733
+
734
+ #
735
+ # To retrieve the node corresponding to a path specified as an array or string
736
+ # Do not mention the root.
737
+ # e.g. "ruby/1.9.2/io/console"
738
+ # or %w[ ruby 1.9.3 io console ]
739
+ # @since 1.4.0 2011-10-2
740
+ def get_node_for_path(user_path)
741
+ case user_path
742
+ when String
743
+ user_path = user_path.split "/"
744
+ when Array
745
+ else
746
+ raise ArgumentError, "Should be Array or String delimited with /"
747
+ end
748
+ $log.debug "TREE #{user_path} " if $log.debug?
749
+ root = @treemodel.root
750
+ found = nil
751
+ user_path.each { |e|
752
+ success = false
753
+ root.children.each { |c|
754
+ if c.user_object == e
755
+ found = c
756
+ success = true
757
+ root = c
758
+ break
759
+ end
760
+ }
761
+ return false unless success
762
+
763
+ }
764
+ return found
765
+ end
710
766
  private
711
767
  # please do not rely on this yet, name could change
712
768
  def _structure_changed tf=true
@@ -716,6 +772,7 @@ module RubyCurses
716
772
  end
717
773
 
718
774
 
775
+
719
776
  # ADD HERE
720
777
  end # class tree
721
778