rbcurse 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,7 @@
4
4
  * Author: rkumar (arunachalesha)
5
5
 
6
6
 
7
- TODO: NOTE: Needs to be tested under conditions such as no data, deleting all data
7
+ TODO: NOTE:
8
8
  A few higher level methods check for no data but lower level ones do not.
9
9
 
10
10
  --------
@@ -78,7 +78,11 @@ module RubyCurses
78
78
  @toprow = 0
79
79
  @to_print_borders ||= 1
80
80
  @show_grid ||= 1
81
+ @_first_column_print = 0 # intro for horiz scrolling 2009-02-14 16:20
82
+ @_last_column_print = 0 # 2009-02-16 23:57 so we don't tab further etc.
83
+ # table needs to know what columns are being printed.
81
84
  @curpos = 0
85
+ @inter_column_spacing = 1
82
86
  # @selected_color ||= 'yellow'
83
87
  # @selected_bgcolor ||= 'black'
84
88
  @table_changed = true
@@ -112,6 +116,7 @@ module RubyCurses
112
116
  end
113
117
  # added 2009-01-07 13:05 so new scrollable can use
114
118
  def row_count
119
+ return 0 if @table_model.nil?
115
120
  @table_model.row_count
116
121
  end
117
122
  # added 2009-01-07 13:05 so new scrollable can use
@@ -123,17 +128,24 @@ module RubyCurses
123
128
  # Sets the data in models
124
129
  # Should replace if these are created. TODO FIXME
125
130
  def set_data data, colnames_array
131
+ # next 2 added in case set_data called again
132
+ @table_changed = true
133
+ @repaint_required = true
126
134
  if data.is_a? Array
127
135
  model = RubyCurses::DefaultTableModel.new data, colnames_array
128
136
  table_model model
129
137
  elsif data.is_a? RubyCurses::TableModel
130
138
  table_model data
139
+ else
140
+ raise "set_data: don't know how to handle data: #{data.class.to_s}"
131
141
  end
132
142
  if colnames_array.is_a? Array
133
143
  model = DefaultTableColumnModel.new colnames_array
134
144
  table_column_model model
135
145
  elsif colnames_array.is_a? RubyCurses::TableColumnModel
136
146
  table_column_model colnames_array
147
+ else
148
+ raise "set_data: don't know how to handle column data: #{colnames_array.class.to_s}"
137
149
  end
138
150
  create_default_list_selection_model
139
151
  create_table_header
@@ -164,8 +176,13 @@ module RubyCurses
164
176
  @table_model.bind(:TABLE_MODEL_EVENT){|lde| table_data_changed(lde) }
165
177
  end
166
178
  end
167
- def table_column_model tcm
168
- raise "data error" if !tcm.is_a? RubyCurses::TableColumnModel
179
+ # updated this so no param will return the tcm 2009-02-14 12:31
180
+ def table_column_model(*val)
181
+ if val.empty?
182
+ return @table_column_model
183
+ end
184
+ tcm = val[0]
185
+ raise "data error: table_column_model wrong class" if !tcm.is_a? RubyCurses::TableColumnModel
169
186
  @table_column_model = tcm
170
187
  @table_column_model.bind(:TABLE_COLUMN_MODEL_EVENT) {|e|
171
188
  table_structure_changed e
@@ -175,8 +192,9 @@ module RubyCurses
175
192
  #@table_header.column_model(tcm) unless @table_header.nil?
176
193
  @table_header.table_column_model=(tcm) unless @table_header.nil?
177
194
  end
178
- # FIX THIS SO NO GET_ XXX
195
+ # @deprecated, avoid usage
179
196
  def get_table_column_model
197
+ $log.debug " DEPRECATED. Pls use table_column_model()"
180
198
  @table_column_model
181
199
  end
182
200
  #
@@ -381,11 +399,16 @@ module RubyCurses
381
399
  end
382
400
  end
383
401
  editor = get_default_cell_editor_for_class cls
402
+ #$log.debug "EDIT_CELL_AT:1 #{cls} #{editor.component.display_length} = #{@table_column_model.column(col).width}i maxlen #{editor.component.maxlen}"
384
403
  editor.component.display_length = @table_column_model.column(col).width
385
- editor.component.maxlen = editor.component.display_length if editor.component.respond_to? :maxlen and editor.component.maxlen.nil? # 2009-01-18 00:59 XXX don't overwrite if user has set
404
+ # maxlen won't be nil ! This used to work earlier
405
+ #editor.component.maxlen = editor.component.display_length if editor.component.respond_to? :maxlen and editor.component.maxlen.nil? # 2009-01-18 00:59 XXX don't overwrite if user has set
406
+ if editor.component.respond_to? :maxlen
407
+ editor.component.maxlen = @table_column_model.column(col).edit_length || editor.component.display_length
408
+ end
386
409
  #$log.debug "EDIT_CELL_AT: #{cls} #{editor.component.display_length} = #{@table_column_model.column(col).width}i maxlen #{editor.component.maxlen}"
387
410
  end
388
- $log.debug " got an EDITOR #{editor} :: #{editor.component} "
411
+ #$log.debug " got an EDITOR #{editor} :: #{editor.component} "
389
412
  # by now we should have something to edit with. We just need to prepare the widgey.
390
413
  prepare_editor editor, row, col, value
391
414
 
@@ -395,6 +418,14 @@ module RubyCurses
395
418
  row = r + (row - @toprow) +1 # @form.row , 1 added for header row!
396
419
  col = c+get_column_offset()
397
420
  editor.prepare_editor self, row, col, value
421
+ # added on 2009-02-16 23:49
422
+ # if data is longer than can be displayed then update editors disp len too
423
+ if (col+editor.component.display_length)>= @col+@width
424
+ editor.component.display_length = @width-1-col
425
+ $log.debug "DDDXXX #{editor.component.display_length} = @width-1-col"
426
+ else
427
+ $log.debug "EEE if (#{col+editor.component.display_length})> #{@col+@width}"
428
+ end
398
429
  @cell_editor = editor
399
430
  @repaint_required = true
400
431
  set_form_col
@@ -452,6 +483,7 @@ module RubyCurses
452
483
  # key handling
453
484
  # make separate methods so callable programmatically
454
485
  def handle_key(ch)
486
+ return :UNHANDLED if @table_model.nil?
455
487
  @current_index ||= 0
456
488
  @toprow ||= 0
457
489
  h = scrollatrow()
@@ -494,6 +526,12 @@ module RubyCurses
494
526
  when @KEY_GOTO_BOTTOM
495
527
  editing_stopped if @is_editing # 2009-01-16 16:06
496
528
  goto_bottom
529
+ when @KEY_SCROLL_RIGHT
530
+ editing_stopped if @is_editing # dts 2009-02-17 00:35
531
+ scroll_right
532
+ when @KEY_SCROLL_LEFT
533
+ editing_stopped if @is_editing # dts 2009-02-17 00:35
534
+ scroll_left
497
535
  else
498
536
  # there could be a case of editing here too!
499
537
  ret = process_key ch, self
@@ -565,14 +603,16 @@ module RubyCurses
565
603
  end
566
604
  def next_column
567
605
  v = @current_column+1
568
- if v < @table_column_model.column_count
606
+ if v < @table_column_model.column_count and v <= @_last_column_print
569
607
  $log.debug " if v < #{@table_column_model.column_count} "
570
608
  current_column v
571
609
  else
572
- if @current_index < row_count()-1
610
+ if @current_index < row_count()-1
573
611
  $log.debug " GOING TO NEXT ROW FROM NEXT COL : #{@current_index} : #{row_count}"
574
612
  @current_column = 0
613
+ @current_column = @_first_column_print # added 2009-02-17 00:01
575
614
  next_row
615
+ set_form_col
576
616
  else
577
617
  return :UNHANDLED
578
618
  end
@@ -581,11 +621,14 @@ module RubyCurses
581
621
  def previous_column
582
622
  v = @current_column-1
583
623
  # returning unhandled so focus can go to prev field auto
584
- if v < 0 and @current_index <= 0
624
+ if v < @_first_column_print and @current_index <= 0
585
625
  return :UNHANDLED
586
626
  end
587
- if v < 0 and @current_index > 0
627
+ if v < @_first_column_print and @current_index > 0
588
628
  @current_column = @table_column_model.column_count-1
629
+ @current_column = @_last_column_print # added 2009-02-17 00:01
630
+ $log.debug " XXXXXX prev col #{@current_column}, las #{@_last_column_print}, fi: #{@_first_column_print}"
631
+ set_form_col
589
632
  previous_row
590
633
  else
591
634
  current_column @current_column-1
@@ -693,7 +736,7 @@ module RubyCurses
693
736
  super
694
737
  set_form_row
695
738
  set_form_col # 2009-01-17 01:35
696
- on_enter_cell focussed_row(), focussed_col()
739
+ on_enter_cell focussed_row(), focussed_col() unless focussed_row().nil? or focussed_col().nil?
697
740
  end
698
741
  def on_leave
699
742
  super
@@ -713,6 +756,7 @@ module RubyCurses
713
756
  end
714
757
  # protected
715
758
  def get_column_offset columnid=@current_column
759
+ return 0 if @table_column_model.nil?
716
760
  return @table_column_model.column(columnid).column_offset || 0
717
761
  end
718
762
 
@@ -720,11 +764,16 @@ module RubyCurses
720
764
  def repaint
721
765
  return unless @repaint_required
722
766
  print_border @form.window if @to_print_borders == 1 # do this once only, unless everything changes
767
+ return if @table_model.nil? # added 2009-02-17 12:45
768
+ @_first_column_print ||= 0
723
769
  cc = @table_model.column_count
724
770
  rc = @table_model.row_count
771
+ inter_column_padding = " " * @inter_column_spacing
772
+ @_last_column_print = cc-1
725
773
  tcm = @table_column_model
726
774
  tm = @table_model
727
775
  tr = @toprow
776
+ _column_scrolling = false
728
777
  acolor = get_color $datacolor
729
778
  h = scrollatrow()
730
779
  r,c = rowcol
@@ -734,18 +783,19 @@ module RubyCurses
734
783
  # TCM should give modelindex of col which is used to fetch data from TM
735
784
  r += 1 # save for header
736
785
  0.upto(h) do |hh|
737
- crow = tr+hh
786
+ crow = tr+hh # crow is the row
738
787
  if crow < rc
739
- offset = 0
788
+ offset = 0 # offset of column
740
789
  # 0.upto(cc-1) do |colix|
790
+ focussed = @current_index == crow ? true : false
791
+ selected = is_row_selected crow
741
792
  # we loop through column_model and fetch data based on model index
742
793
  # FIXED better to call table.get_value_at since we may now
743
794
  # introduce a view - 2009-01-18 18:21
744
795
  tcm.each_with_index do |acolumn, colix|
796
+ next if colix < @_first_column_print
745
797
  #acolumn = tcm.column(colix)
746
798
  #model_index = acolumn.model_index
747
- focussed = @current_index == crow ? true : false
748
- selected = is_row_selected crow
749
799
  content = get_value_at(crow, colix) # tables
750
800
  #renderer = get_default_cell_renderer_for_class content.class.to_s
751
801
  renderer = get_cell_renderer(crow, colix)
@@ -753,9 +803,33 @@ module RubyCurses
753
803
  renderer = get_default_cell_renderer_for_class(content.class.to_s) if renderer.nil?
754
804
  renderer.display_length acolumn.width unless acolumn.nil?
755
805
  end
756
- width = renderer.display_length + 1
806
+ width = renderer.display_length + @inter_column_spacing
757
807
  #renderer.repaint @form.window, r+hh, c+(colix*11), content, focussed, selected
758
808
  acolumn.column_offset = offset
809
+ # trying to ensure that no overprinting
810
+ # $log.debug " c+offset+width > @col+@width #{c+offset+width} > #{@col}+#{@width}"
811
+ # $log.debug " #{c}+#{offset}+#{width} > @col+@width #{c+offset+width} > #{@col}+#{@width}"
812
+ if c+offset+width > @col+@width
813
+ _column_scrolling = true
814
+ @_last_column_print = colix
815
+ #$log.debug " TABLE BREAKING SINCE "
816
+ #$log.debug " if c+offset+width > @col+@width #{c+offset+width} > #{@col}+#{@width}"
817
+ #$log.debug " if #{c}+#{offset}+#{width} > @col+@width #{c+offset+width} > #{@col}+#{@width}"
818
+ # experimental to print subset of last
819
+ space_left = (@width-3)-(offset) # 3 due to boundaries
820
+ space_left = 0 if space_left < 0
821
+ if content.length > space_left
822
+ clen = space_left
823
+ renderer.display_length clen
824
+ else
825
+ clen = -1
826
+ renderer.display_length space_left # content.length
827
+ end
828
+ # print the inter cell padding just in case things mess up while scrolling
829
+ @form.window.mvprintw r+hh, c+offset-@inter_column_spacing, inter_column_padding
830
+ renderer.repaint @form.window, r+hh, c+offset, crow, content[0..clen], focussed, selected
831
+ break
832
+ end
759
833
  # added crow on 2009-02-11 22:46
760
834
  renderer.repaint @form.window, r+hh, c+(offset), crow, content, focussed, selected
761
835
  offset += width
@@ -768,12 +842,33 @@ module RubyCurses
768
842
  if @is_editing
769
843
  @cell_editor.component.repaint unless @cell_editor.nil? or @cell_editor.component.form.nil?
770
844
  end
845
+ _print_more_columns_marker _column_scrolling
846
+ _print_more_data_marker(rc-1 > tr + h)
847
+ $log.debug " _print_more_data_marker(#{rc} >= #{tr} + #{h})"
771
848
  @table_changed = false
772
849
  @repaint_required = false
773
850
  end
774
851
  def print_border g
775
852
  return unless @table_changed
776
853
  g.print_border @row, @col, @height, @width, $datacolor
854
+ return if @table_model.nil?
855
+ rc = @table_model.row_count
856
+ h = scrollatrow()
857
+ _print_more_data_marker (rc>h)
858
+ end
859
+ # private
860
+ def _print_more_data_marker tf
861
+ marker = tf ? Ncurses::ACS_CKBOARD : Ncurses::ACS_VLINE
862
+ @form.window.mvwaddch @row+@height-1, @col+@width-1, marker
863
+ marker = @toprow > 0 ? Ncurses::ACS_CKBOARD : Ncurses::ACS_VLINE
864
+ @form.window.mvwaddch @row+1, @col+@width-1, marker
865
+ end
866
+ def _print_more_columns_marker tf
867
+ marker = tf ? Ncurses::ACS_CKBOARD : Ncurses::ACS_HLINE
868
+ @form.window.mvwaddch @row+@height, @col+@width-2, marker
869
+ # show if columns to left or not
870
+ marker = @_first_column_print > 0 ? Ncurses::ACS_CKBOARD : Ncurses::ACS_HLINE
871
+ @form.window.mvwaddch @row+@height, @col+@_first_column_print+1, marker
777
872
  end
778
873
  def print_header
779
874
  return unless @table_changed
@@ -782,12 +877,29 @@ module RubyCurses
782
877
  tcm = @table_column_model ## could have been overridden, should we use this at all
783
878
  offset = 0
784
879
  header_model.each_with_index do |tc, colix|
880
+ next if colix < @_first_column_print # added for scrolling rt and left 2009-02-14 17:49
785
881
  acolumn = tcm.column colix
786
882
  renderer = tc.cell_renderer
787
883
  renderer = @table_header.default_renderer if renderer.nil?
788
884
  renderer.display_length acolumn.width unless acolumn.nil?
789
885
  width = renderer.display_length + 1
790
886
  content = tc.header_value
887
+ if c+offset+width > @col+@width
888
+ #$log.debug " TABLE: experimental code to NOT print if chance of exceeding table width"
889
+ # 2009-02-14 14:24 now printing, but truncating data for last column
890
+ space_left = (@width-3)-(offset)
891
+ space_left = 0 if space_left < 0
892
+ if content.length > space_left
893
+ clen = space_left
894
+ renderer.display_length clen
895
+ else
896
+ clen = -1
897
+ renderer.display_length space_left
898
+ end
899
+ #$log.debug " TABLE BREAKING SINCE sl: #{space_left},#{crow},#{colix}: #{clen} "
900
+ renderer.repaint @form.window, r, c+(offset), 0, content[0..clen], false, false
901
+ break
902
+ end
791
903
  renderer.repaint @form.window, r, c+(offset),0, content, false, false
792
904
  offset += width
793
905
  end
@@ -837,6 +949,97 @@ module RubyCurses
837
949
  set_focus_on(ix)
838
950
  end
839
951
  end
952
+ def scroll_right
953
+ cc = @table_model.column_count
954
+ if @_first_column_print < cc-1
955
+ @_first_column_print += 1
956
+ @current_column = @_first_column_print
957
+ set_form_col # FIXME not looking too good till key press
958
+ @repaint_required = true
959
+ @table_changed = true # so columns are modified
960
+ end
961
+ end
962
+ def scroll_left
963
+ if @_first_column_print > 0
964
+ @_first_column_print -= 1
965
+ @current_column = @_first_column_print
966
+ set_form_col
967
+ @repaint_required = true
968
+ @table_changed = true
969
+ end
970
+ end
971
+ ##
972
+ # Makes an estimate of columns sizes, returning a hash, and storing it as @column_widths
973
+ # based on checking first 20 rows of data.
974
+ # This does not try to fit all columns into table, but gives best width, so you
975
+ # can scroll right to see other columns.
976
+ # @params - columns is columns returned by database
977
+ # using the command: @columns, *rows = @db.execute2(command)
978
+ # @param - datatypes is an array returned by following command to DB
979
+ # @datatypes = @content[0].types
980
+ def estimate_column_widths columns, datatypes
981
+ tablewidth = @width-3
982
+ colwidths = {}
983
+ min_column_width = (tablewidth/columns.length) -1
984
+ $log.debug("min: #{min_column_width}, #{tablewidth}")
985
+ 0.upto(20) do |rowix|
986
+ break if rowix >= row_count
987
+ #@content.each_with_index do |row, cix|
988
+ # break if cix >= 20
989
+ @table_column_model.each_with_index do |acolumn, ix|
990
+ col = get_value_at(rowix, ix)
991
+ colwidths[ix] ||= 0
992
+ colwidths[ix] = [colwidths[ix], col.length].max
993
+ end
994
+ end
995
+ total = 0
996
+ colwidths.each_pair do |k,v|
997
+ name = columns[k.to_i]
998
+ colwidths[name] = v
999
+ total += v
1000
+ end
1001
+ colwidths["__TOTAL__"] = total
1002
+ column_widths = colwidths
1003
+ @max_data_widths = column_widths.dup
1004
+
1005
+ columns.each_with_index do | col, i|
1006
+ if datatypes[i].match(/(real|int)/) != nil
1007
+ wid = column_widths[i]
1008
+ # cw = [column_widths[i], [8,min_column_width].min].max
1009
+ $log.debug("XXX #{wid}. #{columns[i].length}")
1010
+ cw = [wid, columns[i].length].max
1011
+ $log.debug("int #{col} #{column_widths[i]}, #{cw}")
1012
+ elsif datatypes[i].match(/(date)/) != nil
1013
+ cw = [column_widths[i], [12,min_column_width].min].max
1014
+ #cw = [12,min_column_width].min
1015
+ $log.debug("date #{col} #{column_widths[i]}, #{cw}")
1016
+ else
1017
+ cw = [column_widths[i], min_column_width].max
1018
+ if column_widths[i] <= col.length and col.length <= min_column_width
1019
+ cw = col.length
1020
+ end
1021
+ $log.debug("else #{col} #{column_widths[i]}, #{col.length} #{cw}")
1022
+ end
1023
+ column_widths[i] = cw
1024
+ total += cw
1025
+ end
1026
+ column_widths["__TOTAL__"] = total
1027
+ $log.debug("Estimated col widths: #{column_widths.inspect}")
1028
+ @column_widths = column_widths
1029
+ return column_widths
1030
+ end
1031
+ ##
1032
+ # convenience method
1033
+ # sets column widths given an array of ints
1034
+ # You may get such an array from estimate_column_widths
1035
+ def set_column_widths cw
1036
+ tcm = @table_column_model
1037
+ tcm.each_with_index do |col, ix|
1038
+ col.width cw[ix]
1039
+ end
1040
+ table_structure_changed(nil)
1041
+ end
1042
+ # ADD METHODS HERE
840
1043
  end # class Table
841
1044
 
842
1045
  ## TC
@@ -863,6 +1066,7 @@ module RubyCurses
863
1066
  ## added column_offset on 2009-01-12 19:01
864
1067
  attr_accessor :column_offset # where we've place this guy. in case we need to position cursor
865
1068
  attr_accessor :cell_editor
1069
+ dsl_accessor :edit_length # corresponds to maxlen, if not set, col width will be useda 2009-02-16 21:55
866
1070
 
867
1071
 
868
1072
  def initialize model_index, identifier, header_value, width, config={}, &block
@@ -1161,8 +1365,8 @@ module RubyCurses
1161
1365
 
1162
1366
  ##
1163
1367
  # LSM
1164
- #
1165
- class DefaultListSelectionModel
1368
+ # XXX UNUSED
1369
+ class OLDDefaultListSelectionModel
1166
1370
  include RubyCurses::EventHandler
1167
1371
  attr_accessor :selection_mode
1168
1372
  attr_reader :anchor_selection_index
@@ -1172,6 +1376,7 @@ module RubyCurses
1172
1376
  @anchor_selection_index = -1
1173
1377
  @lead_selection_index = -1
1174
1378
  @selection_mode = :MULTIPLE
1379
+ $log.debug " OLD VERSION OF LIST SELECTION MODEL IN rtable.rb"
1175
1380
  end
1176
1381
 
1177
1382
  def clear_selection
@@ -27,6 +27,8 @@ module RubyCurses
27
27
  ## a multiline text editing widget
28
28
  # TODO - giving data to user - adding newlines, and withog adding.
29
29
  # - respect newlines for incoming data
30
+ # we need a set_text method, passing nil or blank clears
31
+ # current way is not really good. remove_all sucks.
30
32
  #
31
33
  class TextArea < Widget
32
34
  include ListScrollable
@@ -58,7 +60,7 @@ module RubyCurses
58
60
  # this does result in a blank line if we insert after creating. That's required at
59
61
  # present if we wish to only insert
60
62
  if @list.empty?
61
- @list << "\r"
63
+ # @list << "\r" # removed this on 2009-02-15 17:25 lets see how it goes
62
64
  end
63
65
  # @scrollatrow = @height-2
64
66
  @content_rows = @list.length
@@ -66,6 +68,7 @@ module RubyCurses
66
68
  # init_scrollable
67
69
  print_borders
68
70
  @maxlen ||= @width-2
71
+ install_keys
69
72
  init_vars
70
73
  end
71
74
  def init_vars
@@ -90,6 +93,7 @@ module RubyCurses
90
93
  end
91
94
  def remove_all
92
95
  @list = []
96
+ set_modified # added 2009-02-13 22:28 so repaints
93
97
  end
94
98
  ##
95
99
  # trying to wrap and insert
@@ -259,6 +263,18 @@ module RubyCurses
259
263
  when ?\C-e
260
264
  cursor_eol
261
265
  #set_form_col @buffer.length
266
+ #when @KEY_ASK_FIND_FORWARD
267
+ # ask_search_forward
268
+ #when @KEY_ASK_FIND_BACKWARD
269
+ # ask_search_backward
270
+ when @KEY_ASK_FIND
271
+ ask_search
272
+ when @KEY_FIND_MORE
273
+ find_more
274
+ #when @KEY_FIND_NEXT
275
+ # find_next
276
+ #when @KEY_FIND_PREV
277
+ # find_prev
262
278
  else
263
279
  #$log.debug(" textarea ch #{ch}")
264
280
  ret = putc ch
@@ -622,6 +638,7 @@ module RubyCurses
622
638
  end
623
639
  str
624
640
  end
641
+ alias :get_text :to_s
625
642
  ## ---- for listscrollable ---- ##
626
643
  def scrollatrow
627
644
  @height-2
@@ -644,7 +661,7 @@ module RubyCurses
644
661
  if crow < rc
645
662
  #focussed = @current_index == crow ? true : false
646
663
  #selected = is_row_selected crow
647
- content = tm[crow].chomp
664
+ content = tm[crow].chomp rescue ""
648
665
  content.gsub!(/\t/, ' ') # don't display tab
649
666
  content.gsub!(/[^[:print:]]/, '') # don't display non print characters
650
667
  if !content.nil?
@@ -659,6 +676,11 @@ module RubyCurses
659
676
  #renderer.repaint @form.window, r+hh, c+(colix*11), content, focussed, selected
660
677
  #renderer.repaint @form.window, r+hh, c, content, focussed, selected
661
678
  @form.window.printstring r+hh, c, "%-*s" % [@width-2,content], acolor, @attr
679
+ if @search_found_ix == tr+hh
680
+ if !@find_offset.nil?
681
+ @form.window.mvchgat(y=r+hh, x=c+@find_offset, @find_offset1-@find_offset, Ncurses::A_NORMAL, $reversecolor, nil)
682
+ end
683
+ end
662
684
 
663
685
  else
664
686
  # clear rows
@@ -668,6 +690,16 @@ module RubyCurses
668
690
  @table_changed = false
669
691
  @repaint_required = false
670
692
  end
693
+ def ask_search_forward
694
+ regex = get_string("Enter regex to search", 20, @last_regex||"")
695
+ ix = _find_next regex, @current_index
696
+ if ix.nil?
697
+ alert("No matching data for: #{regex}")
698
+ else
699
+ set_focus_on(ix)
700
+ set_form_col @find_offset
701
+ end
702
+ end
671
703
  end # class textarea
672
704
  ##
673
705
  end # modul
@@ -59,6 +59,7 @@ module RubyCurses
59
59
  #init_scrollable
60
60
  print_borders
61
61
  @maxlen ||= @width-2
62
+ install_keys
62
63
  init_vars
63
64
  end
64
65
  def init_vars
@@ -174,13 +175,13 @@ module RubyCurses
174
175
  @buffer = @list[@current_index]
175
176
  end
176
177
  return if @buffer.nil?
177
- $log.debug " before: curpos #{@curpos} blen: #{@buffer.length}"
178
+ #$log.debug " before: curpos #{@curpos} blen: #{@buffer.length}"
178
179
  if @curpos > @buffer.length
179
180
  addcol((@buffer.length-@curpos)+1)
180
181
  @curpos = @buffer.length
181
182
  set_form_col
182
183
  end
183
- $log.debug "TV after loop : curpos #{@curpos} blen: #{@buffer.length}"
184
+ #$log.debug "TV after loop : curpos #{@curpos} blen: #{@buffer.length}"
184
185
  #pre_key
185
186
  case ch
186
187
  when ?\C-n
@@ -216,6 +217,8 @@ module RubyCurses
216
217
  when ?\C-e
217
218
  # take care of data that exceeds maxlen by scrolling and placing cursor at end
218
219
  blen = @buffer.rstrip.length
220
+ set_form_col blen
221
+ =begin
219
222
  if blen < @maxlen
220
223
  set_form_col blen
221
224
  else
@@ -223,8 +226,14 @@ module RubyCurses
223
226
  #wrong curpos wiill be reported
224
227
  set_form_col @maxlen-1
225
228
  end
229
+ =end
230
+ # search related added on 2009-02-15 21:36
231
+ when @KEY_ASK_FIND
232
+ ask_search
233
+ when @KEY_FIND_MORE
234
+ find_more
226
235
  else
227
- $log.debug("TEXTVIEW XXX ch #{ch}")
236
+ #$log.debug("TEXTVIEW XXX ch #{ch}")
228
237
  return :UNHANDLED
229
238
  end
230
239
  #post_key
@@ -253,7 +262,13 @@ module RubyCurses
253
262
  # set cursor on correct column tview
254
263
  def set_form_col col=@curpos
255
264
  @curpos = col
256
- @curpos = @maxlen if @curpos > @maxlen
265
+ #@curpos = @maxlen if @curpos > @maxlen
266
+ if @curpos > @maxlen
267
+ @pcol = @curpos - @maxlen
268
+ @curpos = @maxlen - 1
269
+ else
270
+ @pcol = 0
271
+ end
257
272
  @form.col = @orig_col + @col_offset + @curpos
258
273
  @repaint_required = true
259
274
  end
@@ -322,6 +337,14 @@ module RubyCurses
322
337
  #renderer.repaint @form.window, r+hh, c+(colix*11), content, focussed, selected
323
338
  #renderer.repaint @form.window, r+hh, c, content, focussed, selected
324
339
  @form.window.printstring r+hh, c, "%-*s" % [@width-2,content], acolor, @attr
340
+ if @search_found_ix == tr+hh
341
+ if !@find_offset.nil?
342
+ # handle exceed bounds, and if scrolling
343
+ if @find_offset1 < maxlen+@pcol and @find_offset > @pcol
344
+ @form.window.mvchgat(y=r+hh, x=c+@find_offset-@pcol, @find_offset1-@find_offset, Ncurses::A_NORMAL, $reversecolor, nil)
345
+ end
346
+ end
347
+ end
325
348
 
326
349
  else
327
350
  # clear rows
@@ -143,9 +143,11 @@ module RubyCurses
143
143
  return "btab"
144
144
  when 481
145
145
  return "M-S-tab"
146
+ when 393..402
147
+ return "M-F"+ (keycode-392).to_s
146
148
  else
147
- others=[?\M--,?\M-+,?\M-=,?\M-',?\M-",?\M-;,?\M-:,?\M-\,, ?\M-.,?\M-<,?\M->]
148
- s_others=%w[M-- M-+ M-= M-' M-" M-; M-: M-\, M-. M-<]
149
+ others=[?\M--,?\M-+,?\M-=,?\M-',?\M-",?\M-;,?\M-:,?\M-\,, ?\M-.,?\M-<,?\M->,?\M-?,?\M-/]
150
+ s_others=%w[M-- M-+ M-= M-' M-" M-; M-: M-, M-. M-< M-> M-? M-/ ]
149
151
  if others.include? keycode
150
152
  index = others.index keycode
151
153
  return s_others[index]
@@ -882,7 +884,7 @@ module RubyCurses
882
884
  attr_reader :form
883
885
  attr_reader :handler # event handler
884
886
  attr_reader :type # datatype of field, currently only sets chars_allowed
885
- attr_reader :curpos # cursor position in buffer current
887
+ #attr_reader :curpos # cursor position in buffer current, in WIDGET
886
888
  attr_accessor :datatype # crrently set during set_buffer
887
889
  attr_reader :original_value # value on entering field
888
890
 
@@ -997,6 +999,9 @@ module RubyCurses
997
999
  end
998
1000
  def repaint
999
1001
  # $log.debug("FIELD: #{id}, #{zorder}, #{focusable}")
1002
+ #return if display_length <= 0 # added 2009-02-17 00:17 sometimes editor comp has 0 and that
1003
+ # becomes negative below, no because editing still happens
1004
+ @display_length = 1 if display_length == 0
1000
1005
  printval = getvalue_for_paint().to_s # added 2009-01-06 23:27
1001
1006
  printval = show()*printval.length unless @show.nil?
1002
1007
  if !printval.nil?
@@ -1472,6 +1477,7 @@ module RubyCurses
1472
1477
  @text_variable.nil? ? @text : @text_variable.get_value(@name)
1473
1478
  end
1474
1479
 
1480
+ # ensure text has been passed or action
1475
1481
  def getvalue_for_paint
1476
1482
  ret = getvalue
1477
1483
  @text_offset = @surround_chars[0].length
@@ -51,6 +51,7 @@ module RubyCurses
51
51
  lablist << value
52
52
  end
53
53
  len = @display_length || value.length
54
+ $log.debug "less ZERO #{@display_length} || #{value.length}, ri: #{row_index}" if len < 0
54
55
  acolor = get_color $datacolor
55
56
  #acolor =get_color $datacolor, @color || @parent.color, @bgcolor || @parent.bgcolor #unless @parent.nil?
56
57
  _attr = Ncurses::A_NORMAL
data/lib/rbcurse.rb CHANGED
@@ -3,5 +3,5 @@ require 'ver/window'
3
3
  require 'rbcurse/rwidget'
4
4
  require 'rbcurse/rdialogs'
5
5
  class Rbcurse
6
- VERSION = '0.1.1'
6
+ VERSION = '0.1.2'
7
7
  end