rbcurse 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/CHANGELOG +1570 -0
  2. data/History.txt +6 -0
  3. data/Manifest.txt +54 -0
  4. data/README.txt +304 -0
  5. data/Rakefile +28 -0
  6. data/examples/qdfilechooser.rb +68 -0
  7. data/examples/rfe.rb +853 -0
  8. data/examples/rfe_renderer.rb +69 -0
  9. data/examples/test1.rb +242 -0
  10. data/examples/test2.rb +498 -0
  11. data/examples/testcombo.rb +95 -0
  12. data/examples/testkeypress.rb +61 -0
  13. data/examples/testmenu.rb +105 -0
  14. data/examples/testtable.rb +266 -0
  15. data/examples/testtabp.rb +106 -0
  16. data/examples/testtodo.rb +532 -0
  17. data/examples/viewtodo.rb +512 -0
  18. data/lib/rbcurse/action.rb +31 -0
  19. data/lib/rbcurse/applicationheader.rb +57 -0
  20. data/lib/rbcurse/celleditor.rb +120 -0
  21. data/lib/rbcurse/checkboxcellrenderer.rb +69 -0
  22. data/lib/rbcurse/colormap.rb +133 -0
  23. data/lib/rbcurse/comboboxcellrenderer.rb +45 -0
  24. data/lib/rbcurse/defaultlistselectionmodel.rb +49 -0
  25. data/lib/rbcurse/keylabelprinter.rb +143 -0
  26. data/lib/rbcurse/listcellrenderer.rb +99 -0
  27. data/lib/rbcurse/listkeys.rb +33 -0
  28. data/lib/rbcurse/listscrollable.rb +216 -0
  29. data/lib/rbcurse/listselectable.rb +67 -0
  30. data/lib/rbcurse/mapper.rb +108 -0
  31. data/lib/rbcurse/orderedhash.rb +77 -0
  32. data/lib/rbcurse/rcombo.rb +243 -0
  33. data/lib/rbcurse/rdialogs.rb +183 -0
  34. data/lib/rbcurse/rform.rb +845 -0
  35. data/lib/rbcurse/rinputdataevent.rb +36 -0
  36. data/lib/rbcurse/rlistbox.rb +804 -0
  37. data/lib/rbcurse/rmenu.rb +666 -0
  38. data/lib/rbcurse/rmessagebox.rb +325 -0
  39. data/lib/rbcurse/rpopupmenu.rb +754 -0
  40. data/lib/rbcurse/rtabbedpane.rb +259 -0
  41. data/lib/rbcurse/rtable.rb +1296 -0
  42. data/lib/rbcurse/rtextarea.rb +673 -0
  43. data/lib/rbcurse/rtextview.rb +335 -0
  44. data/lib/rbcurse/rwidget.rb +1731 -0
  45. data/lib/rbcurse/scrollable.rb +301 -0
  46. data/lib/rbcurse/selectable.rb +94 -0
  47. data/lib/rbcurse/table/tablecellrenderer.rb +85 -0
  48. data/lib/rbcurse/table/tabledatecellrenderer.rb +102 -0
  49. data/lib/rbcurse.rb +7 -0
  50. data/lib/ver/keyboard.rb +150 -0
  51. data/lib/ver/keyboard2.rb +170 -0
  52. data/lib/ver/ncurses.rb +102 -0
  53. data/lib/ver/window.rb +369 -0
  54. data/test/test_rbcurse.rb +0 -0
  55. metadata +118 -0
@@ -0,0 +1,335 @@
1
+ =begin
2
+ * Name: TextView
3
+ * $Id$
4
+ * Description View text in this widget.
5
+ * Author: rkumar (arunachalesha)
6
+ TODO
7
+ * file created 2009-01-08 15:23
8
+ --------
9
+ * License:
10
+ Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
11
+
12
+ =end
13
+ require 'rubygems'
14
+ require 'ncurses'
15
+ require 'logger'
16
+ require 'rbcurse'
17
+ require 'rbcurse/listscrollable'
18
+
19
+ include Ncurses
20
+ include RubyCurses
21
+ module RubyCurses
22
+ extend self
23
+
24
+ ##
25
+ # A viewable read only box. Can scroll.
26
+ # Intention is to be able to change content dynamically - the entire list.
27
+ # Use set_content to set content, or just update the list attrib
28
+ # TODO -
29
+ # - searching, goto line - DONE
30
+ class TextView < Widget
31
+ include ListScrollable
32
+ dsl_accessor :height # height of viewport
33
+ dsl_accessor :title # set this on top
34
+ dsl_accessor :title_attrib # bold, reverse, normal
35
+ dsl_accessor :footer_attrib # bold, reverse, normal
36
+ dsl_accessor :list # the array of data to be sent by user
37
+ dsl_accessor :maxlen # max len to be displayed
38
+ attr_reader :toprow # the toprow in the view (offsets are 0)
39
+ # attr_reader :prow # the row on which cursor/focus is
40
+ attr_reader :winrow # the row in the viewport/window
41
+ dsl_accessor :print_footer
42
+
43
+ def initialize form, config={}, &block
44
+ @focusable = true
45
+ @editable = false
46
+ @left_margin = 1
47
+ @row = 0
48
+ @col = 0
49
+ @show_focus = false # don't highlight row under focus
50
+ @list = []
51
+ super
52
+ @row_offset = @col_offset = 1
53
+ @orig_col = @col
54
+ # this does result in a blank line if we insert after creating. That's required at
55
+ # present if we wish to only insert
56
+ @scrollatrow = @height-2
57
+ @content_rows = @list.length
58
+ @win = @form.window
59
+ #init_scrollable
60
+ print_borders
61
+ @maxlen ||= @width-2
62
+ init_vars
63
+ end
64
+ def init_vars
65
+ @curpos = @pcol = @toprow = @current_index = 0
66
+ end
67
+ ##
68
+ # send in a list
69
+ # e.g. set_content File.open("README.txt","r").readlines
70
+ # set wrap at time of passing :WRAP_NONE :WRAP_WORD
71
+ def set_content list, wrap = :WRAP_NONE
72
+ @wrap_policy = wrap
73
+ if list.is_a? String
74
+ if @wrap_policy == :WRAP_WORD
75
+ data = wrap_text list
76
+ @list = data.split("\n")
77
+ else
78
+ @list = list.split("\n")
79
+ end
80
+ elsif list.is_a? Array
81
+ if @wrap_policy == :WRAP_WORD
82
+ data = wrap_text list.join(" ")
83
+ @list = data.split("\n")
84
+ else
85
+ @list = list
86
+ end
87
+ else
88
+ raise "set_content expects Array not #{list.class}"
89
+ end
90
+ end
91
+ ## display this row on top
92
+ def top_row(*val)
93
+ if val.empty?
94
+ @toprow
95
+ else
96
+ @toprow = val[0] || 0
97
+ #@prow = val[0] || 0
98
+ end
99
+ @repaint_required = true
100
+ end
101
+ ## ---- for listscrollable ---- ##
102
+ def scrollatrow
103
+ @height - 2
104
+ end
105
+ def row_count
106
+ @list.length
107
+ end
108
+ ##
109
+ # returns row of first match of given regex (or nil if not found)
110
+ def find_first_match regex
111
+ @list.each_with_index do |row, ix|
112
+ return ix if !row.match(regex).nil?
113
+ end
114
+ return nil
115
+ end
116
+ def rowcol
117
+ #$log.debug "textarea rowcol : #{@row+@row_offset+@winrow}, #{@col+@col_offset}"
118
+ #return @row+@row_offset+@winrow, @col+@col_offset
119
+ #return @row+@row_offset+@winrow, @col+@col_offset
120
+ return @row+@row_offset, @col+@col_offset
121
+ end
122
+ def wrap_text(txt, col = @maxlen)
123
+ $log.debug "inside wrap text for :#{txt}"
124
+ txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/,
125
+ "\\1\\3\n")
126
+ end
127
+ def print_borders
128
+ window = @form.window
129
+ color = $datacolor
130
+ window.print_border @row, @col, @height, @width, color
131
+ print_title
132
+ =begin
133
+ hline = "+%s+" % [ "-"*(width-((1)*2)) ]
134
+ hline2 = "|%s|" % [ " "*(width-((1)*2)) ]
135
+ window.printstring(row=startrow, col=startcol, hline, color)
136
+ print_title
137
+ (startrow+1).upto(startrow+height-1) do |row|
138
+ window.printstring( row, col=startcol, hline2, color)
139
+ end
140
+ window.printstring( startrow+height, col=startcol, hline, color)
141
+ =end
142
+
143
+ end
144
+ def print_title
145
+ @form.window.printstring( @row, @col+(@width-@title.length)/2, @title, $datacolor, @title_attrib) unless @title.nil?
146
+ end
147
+ def print_foot
148
+ @footer_attrib ||= Ncurses::A_REVERSE
149
+ footer = "R: #{@current_index+1}, C: #{@curpos+@pcol}, #{@list.length} lines "
150
+ @form.window.printstring( @row + @height, @col+2, footer, $datacolor, @footer_attrib)
151
+ end
152
+ ### FOR scrollable ###
153
+ def get_content
154
+ @list
155
+ end
156
+ def get_window
157
+ @form.window
158
+ end
159
+ ### FOR scrollable ###
160
+ def repaint # textview
161
+ return unless @repaint_required
162
+ paint
163
+ print_foot if @print_footer
164
+ end
165
+ def getvalue
166
+ @list
167
+ end
168
+ # textview
169
+ # [ ] scroll left right DONE
170
+ def handle_key ch
171
+ @buffer = @list[@current_index]
172
+ if @buffer.nil? and row_count == 0
173
+ @list << "\r"
174
+ @buffer = @list[@current_index]
175
+ end
176
+ return if @buffer.nil?
177
+ $log.debug " before: curpos #{@curpos} blen: #{@buffer.length}"
178
+ if @curpos > @buffer.length
179
+ addcol((@buffer.length-@curpos)+1)
180
+ @curpos = @buffer.length
181
+ set_form_col
182
+ end
183
+ $log.debug "TV after loop : curpos #{@curpos} blen: #{@buffer.length}"
184
+ #pre_key
185
+ case ch
186
+ when ?\C-n
187
+ scroll_forward
188
+ when ?\C-p
189
+ scroll_backward
190
+ when ?0, ?\C-[
191
+ goto_start #start of buffer # cursor_start
192
+ when ?\C-]
193
+ goto_end # end / bottom cursor_end
194
+ when KEY_UP
195
+ #select_prev_row
196
+ ret = up
197
+ check_curpos
198
+ #addrowcol -1,0 if ret != -1 or @winrow != @oldwinrow # positions the cursor up
199
+ #@form.row = @row + 1 + @winrow
200
+ when KEY_DOWN
201
+ ret = down
202
+ check_curpos
203
+ #@form.row = @row + 1 + @winrow
204
+ when KEY_LEFT
205
+ cursor_backward
206
+ when KEY_RIGHT
207
+ cursor_forward
208
+ when KEY_BACKSPACE, 127
209
+ cursor_backward
210
+ when 330
211
+ cursor_backward
212
+ when ?\C-a
213
+ # take care of data that exceeds maxlen by scrolling and placing cursor at start
214
+ set_form_col 0
215
+ @pcol = 0
216
+ when ?\C-e
217
+ # take care of data that exceeds maxlen by scrolling and placing cursor at end
218
+ blen = @buffer.rstrip.length
219
+ if blen < @maxlen
220
+ set_form_col blen
221
+ else
222
+ @pcol = blen-@maxlen
223
+ #wrong curpos wiill be reported
224
+ set_form_col @maxlen-1
225
+ end
226
+ else
227
+ $log.debug("TEXTVIEW XXX ch #{ch}")
228
+ return :UNHANDLED
229
+ end
230
+ #post_key
231
+ # XXX 2008-11-27 13:57 trying out
232
+ set_form_row
233
+ end
234
+ # newly added to check curpos when moving up or down
235
+ def check_curpos
236
+ @buffer = @list[@current_index]
237
+ # if the cursor is ahead of data in this row then move it back
238
+ if @pcol+@curpos > @buffer.length
239
+ addcol((@pcol+@buffer.length-@curpos)+1)
240
+ @curpos = @buffer.length
241
+
242
+ # even this row is gt maxlen, i.e., scrolled right
243
+ if @curpos > @maxlen
244
+ @pcol = @curpos - @maxlen
245
+ @curpos = @maxlen-1
246
+ else
247
+ # this row is within maxlen, make scroll 0
248
+ @pcol=0
249
+ end
250
+ set_form_col
251
+ end
252
+ end
253
+ # set cursor on correct column tview
254
+ def set_form_col col=@curpos
255
+ @curpos = col
256
+ @curpos = @maxlen if @curpos > @maxlen
257
+ @form.col = @orig_col + @col_offset + @curpos
258
+ @repaint_required = true
259
+ end
260
+ def cursor_forward
261
+ if @curpos < @width and @curpos < @maxlen-1 # else it will do out of box
262
+ @curpos += 1
263
+ addcol 1
264
+ else
265
+ # XXX 2008-11-26 23:03 trying out
266
+ @pcol += 1 if @pcol <= @buffer.length
267
+ end
268
+ set_form_col
269
+ @repaint_required = true
270
+ end
271
+ def addcol num
272
+ @repaint_required = true
273
+ @form.addcol num
274
+ end
275
+ def addrowcol row,col
276
+ @repaint_required = true
277
+ @form.addrowcol row, col
278
+ end
279
+ def cursor_backward
280
+ if @curpos > 0
281
+ @curpos -= 1
282
+ set_form_col
283
+ #addcol -1
284
+ elsif @pcol > 0 # XXX added 2008-11-26 23:05
285
+ @pcol -= 1
286
+ end
287
+ @repaint_required = true
288
+ end
289
+ # gives offset of next line, does not move
290
+ def next_line
291
+ @list[@current_index+1]
292
+ end
293
+ def do_relative_row num
294
+ yield @list[@current_index+num]
295
+ end
296
+ def paint
297
+ print_borders if @to_print_borders == 1 # do this once only, unless everything changes
298
+ rc = row_count
299
+ maxlen = @maxlen ||= @width-2
300
+ tm = get_content
301
+ tr = @toprow
302
+ acolor = get_color $datacolor
303
+ h = scrollatrow()
304
+ r,c = rowcol
305
+ 0.upto(h) do |hh|
306
+ crow = tr+hh
307
+ if crow < rc
308
+ #focussed = @current_index == crow ? true : false
309
+ #selected = is_row_selected crow
310
+ content = tm[crow].chomp
311
+ content.gsub!(/\t/, ' ') # don't display tab
312
+ content.gsub!(/[^[:print:]]/, '') # don't display non print characters
313
+ if !content.nil?
314
+ if content.length > maxlen # only show maxlen
315
+ content = content[@pcol..@pcol+maxlen-1]
316
+ else
317
+ content = content[@pcol..-1]
318
+ end
319
+ end
320
+ #renderer = get_default_cell_renderer_for_class content.class.to_s
321
+ #renderer = cell_renderer()
322
+ #renderer.repaint @form.window, r+hh, c+(colix*11), content, focussed, selected
323
+ #renderer.repaint @form.window, r+hh, c, content, focussed, selected
324
+ @form.window.printstring r+hh, c, "%-*s" % [@width-2,content], acolor, @attr
325
+
326
+ else
327
+ # clear rows
328
+ @form.window.printstring r+hh, c, " " * (@width-2), acolor,@attr
329
+ end
330
+ end
331
+ @table_changed = false
332
+ @repaint_required = false
333
+ end
334
+ end # class textview
335
+ end # modul