rbcurse 0.1.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +126 -0
- data/Manifest.txt +53 -20
- data/README.markdown +423 -0
- data/Rakefile +3 -1
- data/examples/keytest.rb +177 -0
- data/examples/mpad2.rb +156 -0
- data/examples/newtesttabp.rb +121 -0
- data/examples/rfe.rb +48 -10
- data/examples/rfe_renderer.rb +4 -4
- data/examples/rvimsplit.rb +376 -0
- data/examples/sqlc.rb +97 -106
- data/examples/sqlm.rb +446 -0
- data/examples/test1.rb +4 -4
- data/examples/test2.rb +12 -12
- data/examples/testchars.rb +140 -0
- data/examples/testkeypress.rb +9 -4
- data/examples/testmulticomp.rb +72 -0
- data/examples/testscroller.rb +136 -0
- data/examples/testscrolllb.rb +86 -0
- data/examples/testscrollp.rb +87 -0
- data/examples/testscrollta.rb +80 -0
- data/examples/testscrolltable.rb +166 -0
- data/examples/testsplit.rb +87 -0
- data/examples/testsplit2.rb +123 -0
- data/examples/testsplit3.rb +215 -0
- data/examples/testsplit3_1.rb +244 -0
- data/examples/testsplit3a.rb +215 -0
- data/examples/testsplit3b.rb +237 -0
- data/examples/testsplitta.rb +148 -0
- data/examples/testsplittv.rb +142 -0
- data/examples/testsplittvv.rb +144 -0
- data/examples/testtable.rb +1 -1
- data/examples/testtabp.rb +3 -2
- data/examples/testtestw.rb +69 -0
- data/examples/testtodo.rb +5 -3
- data/examples/testtpane.rb +203 -0
- data/examples/testtpane2.rb +145 -0
- data/examples/testtpanetable.rb +199 -0
- data/examples/viewtodo.rb +5 -3
- data/lib/rbcurse.rb +1 -1
- data/lib/rbcurse/celleditor.rb +2 -2
- data/lib/rbcurse/colormap.rb +5 -5
- data/lib/rbcurse/defaultlistselectionmodel.rb +3 -3
- data/lib/rbcurse/io.rb +663 -0
- data/lib/rbcurse/listeditable.rb +306 -0
- data/lib/rbcurse/listkeys.rb +15 -15
- data/lib/rbcurse/listscrollable.rb +168 -27
- data/lib/rbcurse/mapper.rb +35 -13
- data/lib/rbcurse/rchangeevent.rb +28 -0
- data/lib/rbcurse/rform.rb +845 -0
- data/lib/rbcurse/rlistbox.rb +144 -34
- data/lib/rbcurse/rmessagebox.rb +10 -5
- data/lib/rbcurse/rmulticontainer.rb +325 -0
- data/lib/rbcurse/rmultitextview.rb +306 -0
- data/lib/rbcurse/rscrollform.rb +369 -0
- data/lib/rbcurse/rscrollpane.rb +511 -0
- data/lib/rbcurse/rsplitpane.rb +820 -0
- data/lib/rbcurse/rtabbedpane.rb +737 -109
- data/lib/rbcurse/rtabbedwindow.rb +326 -0
- data/lib/rbcurse/rtable.rb +220 -64
- data/lib/rbcurse/rtextarea.rb +340 -181
- data/lib/rbcurse/rtextview.rb +237 -101
- data/lib/rbcurse/rviewport.rb +203 -0
- data/lib/rbcurse/rwidget.rb +919 -95
- data/lib/rbcurse/scrollable.rb +7 -7
- data/lib/rbcurse/selectable.rb +4 -4
- data/lib/rbcurse/table/tablecellrenderer.rb +3 -0
- data/lib/rbcurse/undomanager.rb +181 -0
- data/lib/rbcurse/vieditable.rb +100 -0
- data/lib/ver/window.rb +471 -21
- metadata +66 -22
- data/README.txt +0 -312
- data/examples/testd.db +0 -0
- data/examples/todocsv.csv +0 -28
data/lib/rbcurse/rtextview.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
=begin
|
2
2
|
* Name: TextView
|
3
|
-
* $Id$
|
4
3
|
* Description View text in this widget.
|
5
4
|
* Author: rkumar (arunachalesha)
|
6
|
-
TODO
|
7
5
|
* file created 2009-01-08 15:23
|
6
|
+
* major change: 2010-02-10 19:43 simplifying the buffer stuff.
|
7
|
+
* FIXME : since currently paint is directly doing copywin, there are no checks
|
8
|
+
to prevent crashing or -1 when panning. We need to integrate it back to a call to Pad.
|
9
|
+
* unnecessary repainting when moving cursor, evn if no change in coords and data
|
10
|
+
* on reentering cursor does not go to where it last was (test2.rb) - sure it used to.
|
11
|
+
TODO
|
12
|
+
* border, and footer could be objects (classes) at some future stage.
|
8
13
|
--------
|
9
14
|
* License:
|
10
15
|
Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
@@ -26,10 +31,10 @@ module RubyCurses
|
|
26
31
|
# Intention is to be able to change content dynamically - the entire list.
|
27
32
|
# Use set_content to set content, or just update the list attrib
|
28
33
|
# TODO -
|
29
|
-
# -
|
34
|
+
# - goto line - DONE
|
30
35
|
class TextView < Widget
|
31
36
|
include ListScrollable
|
32
|
-
dsl_accessor :height # height of viewport
|
37
|
+
#dsl_accessor :height # height of viewport cmmented on 2010-01-09 19:29 since widget has method
|
33
38
|
dsl_accessor :title # set this on top
|
34
39
|
dsl_accessor :title_attrib # bold, reverse, normal
|
35
40
|
dsl_accessor :footer_attrib # bold, reverse, normal
|
@@ -38,32 +43,51 @@ module RubyCurses
|
|
38
43
|
attr_reader :toprow # the toprow in the view (offsets are 0)
|
39
44
|
# attr_reader :prow # the row on which cursor/focus is
|
40
45
|
attr_reader :winrow # the row in the viewport/window
|
46
|
+
# painting the footer does slow down cursor painting slightly if one is moving cursor fast
|
41
47
|
dsl_accessor :print_footer
|
48
|
+
dsl_accessor :suppress_borders # added 2010-02-10 20:05 values true or false
|
42
49
|
|
43
|
-
def initialize form, config={}, &block
|
50
|
+
def initialize form = nil, config={}, &block
|
44
51
|
@focusable = true
|
45
52
|
@editable = false
|
46
|
-
@left_margin = 1
|
47
53
|
@row = 0
|
48
54
|
@col = 0
|
49
55
|
@show_focus = false # don't highlight row under focus
|
50
56
|
@list = []
|
51
57
|
super
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
@scrollatrow = @height-2
|
58
|
+
# ideally this should have been 2 to take care of borders, but that would break
|
59
|
+
# too much stuff !
|
60
|
+
@row_offset = @col_offset = 1
|
61
|
+
#@scrollatrow = @height-2
|
57
62
|
@content_rows = @list.length
|
58
|
-
@win = @
|
59
|
-
|
60
|
-
print_borders
|
61
|
-
@maxlen ||= @width-2
|
63
|
+
@win = @graphic
|
64
|
+
|
62
65
|
install_keys
|
63
66
|
init_vars
|
64
67
|
end
|
65
68
|
def init_vars
|
66
69
|
@curpos = @pcol = @toprow = @current_index = 0
|
70
|
+
@repaint_all=true
|
71
|
+
## 2010-02-10 20:20 RFED16 taking care if no border requested
|
72
|
+
@suppress_borders ||= false
|
73
|
+
@row_offset = @col_offset = 0 if @suppress_borders == true
|
74
|
+
# added 2010-02-11 15:11 RFED16 so we don't need a form.
|
75
|
+
@win_left = 0
|
76
|
+
@win_top = 0
|
77
|
+
$error_message_row ||= 23
|
78
|
+
$error_message_col ||= 1
|
79
|
+
# currently i scroll right only if current line is longer than display width, i should use
|
80
|
+
# longest line on screen.
|
81
|
+
@longest_line = 0 # the longest line printed on this page, used to determine if scrolling shd work
|
82
|
+
|
83
|
+
bind_key([?g,?g]){ goto_start } # mapping double keys like vim
|
84
|
+
bind_key([?',?']){ goto_last_position } # vim , goto last row position (not column)
|
85
|
+
bind_key(?/, :ask_search)
|
86
|
+
bind_key(?n, :find_more)
|
87
|
+
bind_key([?\C-x, ?>], :scroll_right)
|
88
|
+
bind_key([?\C-x, ?<], :scroll_left)
|
89
|
+
bind_key(?r) { getstr("Enter a word") }
|
90
|
+
bind_key(?m, :disp_menu)
|
67
91
|
end
|
68
92
|
##
|
69
93
|
# send in a list
|
@@ -101,7 +125,7 @@ module RubyCurses
|
|
101
125
|
end
|
102
126
|
## ---- for listscrollable ---- ##
|
103
127
|
def scrollatrow
|
104
|
-
@height -
|
128
|
+
@height - 3 # trying out 2009-10-31 15:22 XXX since we seem to be printing one more line
|
105
129
|
end
|
106
130
|
def row_count
|
107
131
|
@list.length
|
@@ -114,60 +138,61 @@ module RubyCurses
|
|
114
138
|
end
|
115
139
|
return nil
|
116
140
|
end
|
141
|
+
## returns the position where cursor was to be positioned by default
|
142
|
+
# It may no longer work like that.
|
117
143
|
def rowcol
|
118
|
-
#$log.debug "textarea rowcol : #{@row+@row_offset+@winrow}, #{@col+@col_offset}"
|
119
|
-
#return @row+@row_offset+@winrow, @col+@col_offset
|
120
|
-
#return @row+@row_offset+@winrow, @col+@col_offset
|
121
144
|
return @row+@row_offset, @col+@col_offset
|
122
145
|
end
|
123
146
|
def wrap_text(txt, col = @maxlen)
|
147
|
+
col ||= @width-2
|
124
148
|
$log.debug "inside wrap text for :#{txt}"
|
125
149
|
txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/,
|
126
150
|
"\\1\\3\n")
|
127
151
|
end
|
152
|
+
## print a border
|
153
|
+
## Note that print_border clears the area too, so should be used sparingly.
|
128
154
|
def print_borders
|
129
|
-
|
155
|
+
$log.debug " #{@name} print_borders, #{@graphic.name} "
|
130
156
|
color = $datacolor
|
131
|
-
|
132
|
-
print_title
|
133
|
-
=begin
|
134
|
-
hline = "+%s+" % [ "-"*(width-((1)*2)) ]
|
135
|
-
hline2 = "|%s|" % [ " "*(width-((1)*2)) ]
|
136
|
-
window.printstring(row=startrow, col=startcol, hline, color)
|
157
|
+
@graphic.print_border @row, @col, @height-1, @width, color #, Ncurses::A_REVERSE
|
137
158
|
print_title
|
138
|
-
(startrow+1).upto(startrow+height-1) do |row|
|
139
|
-
window.printstring( row, col=startcol, hline2, color)
|
140
|
-
end
|
141
|
-
window.printstring( startrow+height, col=startcol, hline, color)
|
142
|
-
=end
|
143
|
-
|
144
159
|
end
|
145
160
|
def print_title
|
146
|
-
|
161
|
+
$log.debug " print_title #{@row}, #{@col}, #{@width} "
|
162
|
+
@graphic.printstring( @row, @col+(@width-@title.length)/2, @title, $datacolor, @title_attrib) unless @title.nil?
|
147
163
|
end
|
148
164
|
def print_foot
|
149
165
|
@footer_attrib ||= Ncurses::A_REVERSE
|
150
166
|
footer = "R: #{@current_index+1}, C: #{@curpos+@pcol}, #{@list.length} lines "
|
151
|
-
|
167
|
+
$log.debug " print_foot calling printstring with #{@row} + #{@height} -1, #{@col}+2"
|
168
|
+
@graphic.printstring( @row + @height -1 , @col+2, footer, $datacolor, @footer_attrib)
|
169
|
+
@repaint_footer_required = false # 2010-01-23 22:55
|
152
170
|
end
|
153
171
|
### FOR scrollable ###
|
154
172
|
def get_content
|
155
173
|
@list
|
156
174
|
end
|
157
175
|
def get_window
|
158
|
-
@
|
176
|
+
@graphic
|
159
177
|
end
|
160
178
|
### FOR scrollable ###
|
161
179
|
def repaint # textview
|
162
|
-
|
163
|
-
|
164
|
-
|
180
|
+
if @screen_buffer.nil?
|
181
|
+
safe_create_buffer
|
182
|
+
@screen_buffer.name = "Pad::TV_PAD_#{@name}" unless @screen_buffer.nil?
|
183
|
+
$log.debug " textview creates pad #{@screen_buffer} #{@name}"
|
184
|
+
end
|
185
|
+
|
186
|
+
#return unless @repaint_required # 2010-02-12 19:08 TRYING - won't let footer print for col move
|
187
|
+
paint if @repaint_required
|
188
|
+
# raise "TV 175 graphic nil " unless @graphic
|
189
|
+
print_foot if @print_footer && @repaint_footer_required
|
190
|
+
buffer_to_window
|
165
191
|
end
|
166
192
|
def getvalue
|
167
193
|
@list
|
168
194
|
end
|
169
195
|
# textview
|
170
|
-
# [ ] scroll left right DONE
|
171
196
|
def handle_key ch
|
172
197
|
@buffer = @list[@current_index]
|
173
198
|
if @buffer.nil? and row_count == 0
|
@@ -181,64 +206,87 @@ module RubyCurses
|
|
181
206
|
@curpos = @buffer.length
|
182
207
|
set_form_col
|
183
208
|
end
|
184
|
-
|
185
|
-
#pre_key
|
209
|
+
# We can improve later
|
186
210
|
case ch
|
187
|
-
when ?\C-n
|
211
|
+
when ?\C-n.getbyte(0), 32
|
188
212
|
scroll_forward
|
189
|
-
when ?\C-p
|
213
|
+
when ?\C-p.getbyte(0)
|
190
214
|
scroll_backward
|
191
|
-
when
|
215
|
+
when ?\C-[.getbyte(0), ?t.getbyte(0)
|
192
216
|
goto_start #start of buffer # cursor_start
|
193
|
-
when ?\C-]
|
217
|
+
when ?\C-].getbyte(0), ?G.getbyte(0)
|
194
218
|
goto_end # end / bottom cursor_end
|
195
|
-
when KEY_UP
|
219
|
+
when KEY_UP, ?k.getbyte(0)
|
196
220
|
#select_prev_row
|
197
221
|
ret = up
|
198
222
|
check_curpos
|
199
|
-
|
200
|
-
|
201
|
-
when KEY_DOWN
|
223
|
+
|
224
|
+
when KEY_DOWN, ?j.getbyte(0)
|
202
225
|
ret = down
|
203
226
|
check_curpos
|
204
|
-
|
205
|
-
when KEY_LEFT
|
227
|
+
when KEY_LEFT, ?h.getbyte(0)
|
206
228
|
cursor_backward
|
207
|
-
when KEY_RIGHT
|
229
|
+
when KEY_RIGHT, ?l.getbyte(0)
|
208
230
|
cursor_forward
|
209
|
-
when KEY_BACKSPACE, 127
|
231
|
+
when KEY_BACKSPACE, 127, 330
|
210
232
|
cursor_backward
|
211
|
-
when
|
212
|
-
cursor_backward
|
213
|
-
when ?\C-a
|
233
|
+
when ?\C-a.getbyte(0) #, ?0.getbyte(0)
|
214
234
|
# take care of data that exceeds maxlen by scrolling and placing cursor at start
|
235
|
+
@repaint_required = true if @pcol > 0 # tried other things but did not work
|
215
236
|
set_form_col 0
|
216
237
|
@pcol = 0
|
217
|
-
when ?\C-e
|
238
|
+
when ?\C-e.getbyte(0), ?$.getbyte(0)
|
218
239
|
# take care of data that exceeds maxlen by scrolling and placing cursor at end
|
240
|
+
# This use to actually pan the screen to actual end of line, but now somewhere
|
241
|
+
# it only goes to end of visible screen, set_form probably does a sanity check
|
219
242
|
blen = @buffer.rstrip.length
|
220
|
-
|
221
|
-
|
222
|
-
if blen < @maxlen
|
223
|
-
set_form_col blen
|
224
|
-
else
|
225
|
-
@pcol = blen-@maxlen
|
226
|
-
#wrong curpos wiill be reported
|
227
|
-
set_form_col @maxlen-1
|
228
|
-
end
|
229
|
-
=end
|
230
|
-
# search related added on 2009-02-15 21:36
|
243
|
+
set_form_col blen
|
244
|
+
# search related
|
231
245
|
when @KEY_ASK_FIND
|
232
246
|
ask_search
|
233
247
|
when @KEY_FIND_MORE
|
234
248
|
find_more
|
249
|
+
when ?0.getbyte(0)..?9.getbyte(0)
|
250
|
+
# FIXME the assumption here was that if numbers are being entered then a 0 is a number
|
251
|
+
# not a beg-of-line command.
|
252
|
+
# However, after introducing universal_argument, we can enters numbers using C-u and then press another
|
253
|
+
# C-u to stop. In that case a 0 should act as a command, even though multiplier has been set
|
254
|
+
if ch == ?0.getbyte(0) and $multiplier == 0
|
255
|
+
# copy of C-a - start of line
|
256
|
+
@repaint_required = true if @pcol > 0 # tried other things but did not work
|
257
|
+
set_form_col 0
|
258
|
+
@pcol = 0
|
259
|
+
return 0
|
260
|
+
end
|
261
|
+
# storing digits entered so we can multiply motion actions
|
262
|
+
$multiplier *= 10 ; $multiplier += (ch-48)
|
263
|
+
return 0
|
264
|
+
#when ?\C-u.getbyte(0)
|
265
|
+
## multiplier. Series is 4 16 64
|
266
|
+
#@multiplier = (@multiplier == 0 ? 4 : @multiplier *= 4)
|
267
|
+
#return 0
|
268
|
+
when ?\M-l.getbyte(0) # just added 2010-03-05 not perfect
|
269
|
+
scroll_right # scroll data horizontally
|
270
|
+
when ?\M-h.getbyte(0)
|
271
|
+
scroll_left
|
272
|
+
when ?\C-c.getbyte(0)
|
273
|
+
$multiplier = 0
|
274
|
+
return 0
|
235
275
|
else
|
236
|
-
|
237
|
-
|
276
|
+
# check for bindings, these cannot override above keys since placed at end
|
277
|
+
begin
|
278
|
+
ret = process_key ch, self
|
279
|
+
rescue => err
|
280
|
+
$error_message = err
|
281
|
+
@form.window.print_error_message
|
282
|
+
$log.error " TEXTVIEW ERROR #{err} "
|
283
|
+
$log.debug(err.backtrace.join("\n"))
|
284
|
+
end
|
285
|
+
return :UNHANDLED if ret == :UNHANDLED
|
238
286
|
end
|
239
|
-
#
|
240
|
-
# XXX 2008-11-27 13:57 trying out
|
287
|
+
$multiplier = 0 # you must reset if you've handled a key. if unhandled, don't reset since parent could use
|
241
288
|
set_form_row
|
289
|
+
return 0 # added 2010-01-12 22:17 else down arrow was going into next field
|
242
290
|
end
|
243
291
|
# newly added to check curpos when moving up or down
|
244
292
|
def check_curpos
|
@@ -247,11 +295,12 @@ module RubyCurses
|
|
247
295
|
if @pcol+@curpos > @buffer.length
|
248
296
|
addcol((@pcol+@buffer.length-@curpos)+1)
|
249
297
|
@curpos = @buffer.length
|
298
|
+
maxlen = (@maxlen || @width-2)
|
250
299
|
|
251
300
|
# even this row is gt maxlen, i.e., scrolled right
|
252
|
-
if @curpos >
|
253
|
-
@pcol = @curpos -
|
254
|
-
@curpos =
|
301
|
+
if @curpos > maxlen
|
302
|
+
@pcol = @curpos - maxlen
|
303
|
+
@curpos = maxlen-1
|
255
304
|
else
|
256
305
|
# this row is within maxlen, make scroll 0
|
257
306
|
@pcol=0
|
@@ -260,46 +309,71 @@ module RubyCurses
|
|
260
309
|
end
|
261
310
|
end
|
262
311
|
# set cursor on correct column tview
|
263
|
-
def set_form_col
|
264
|
-
@
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
312
|
+
def set_form_col col1=@curpos
|
313
|
+
@cols_panned ||= 0
|
314
|
+
@pad_offset ||= 0 # added 2010-02-11 21:54 since padded widgets get an offset.
|
315
|
+
@curpos = col1
|
316
|
+
maxlen = @maxlen || @width-2
|
317
|
+
#@curpos = maxlen if @curpos > maxlen
|
318
|
+
if @curpos > maxlen
|
319
|
+
@pcol = @curpos - maxlen
|
320
|
+
@curpos = maxlen - 1
|
321
|
+
@repaint_required = true # this is required so C-e can pan screen
|
269
322
|
else
|
270
323
|
@pcol = 0
|
271
324
|
end
|
272
|
-
|
273
|
-
|
325
|
+
# the rest only determines cursor placement
|
326
|
+
win_col = 0 # 2010-02-07 23:19 new cursor stuff
|
327
|
+
col2 = win_col + @col + @col_offset + @curpos + @cols_panned + @pad_offset
|
328
|
+
$log.debug "TV SFC #{@name} setting c to #{col2} #{win_col} #{@col} #{@col_offset} #{@curpos} "
|
329
|
+
#@form.setrowcol @form.row, col
|
330
|
+
setrowcol nil, col2
|
331
|
+
@repaint_footer_required = true
|
274
332
|
end
|
275
333
|
def cursor_forward
|
276
|
-
|
334
|
+
maxlen = @maxlen || @width-2
|
335
|
+
repeatm {
|
336
|
+
if @curpos < @width and @curpos < maxlen-1 # else it will do out of box
|
277
337
|
@curpos += 1
|
278
338
|
addcol 1
|
279
339
|
else
|
280
|
-
# XXX 2008-11-26 23:03 trying out
|
281
340
|
@pcol += 1 if @pcol <= @buffer.length
|
282
341
|
end
|
342
|
+
}
|
283
343
|
set_form_col
|
284
|
-
|
344
|
+
#@repaint_required = true
|
345
|
+
@repaint_footer_required = true # 2010-01-23 22:41
|
285
346
|
end
|
286
347
|
def addcol num
|
287
|
-
|
288
|
-
@
|
348
|
+
#@repaint_required = true
|
349
|
+
@repaint_footer_required = true # 2010-01-23 22:41
|
350
|
+
if @form
|
351
|
+
@form.addcol num
|
352
|
+
else
|
353
|
+
@parent_component.form.addcol num
|
354
|
+
end
|
289
355
|
end
|
290
356
|
def addrowcol row,col
|
291
|
-
|
357
|
+
#@repaint_required = true
|
358
|
+
@repaint_footer_required = true # 2010-01-23 22:41
|
359
|
+
if @form
|
292
360
|
@form.addrowcol row, col
|
361
|
+
else
|
362
|
+
@parent_component.form.addrowcol num
|
363
|
+
end
|
293
364
|
end
|
294
365
|
def cursor_backward
|
366
|
+
repeatm {
|
295
367
|
if @curpos > 0
|
296
368
|
@curpos -= 1
|
297
369
|
set_form_col
|
298
370
|
#addcol -1
|
299
|
-
elsif @pcol > 0
|
371
|
+
elsif @pcol > 0
|
300
372
|
@pcol -= 1
|
301
373
|
end
|
302
|
-
|
374
|
+
}
|
375
|
+
#@repaint_required = true
|
376
|
+
@repaint_footer_required = true # 2010-01-23 22:41
|
303
377
|
end
|
304
378
|
# gives offset of next line, does not move
|
305
379
|
def next_line
|
@@ -308,15 +382,36 @@ module RubyCurses
|
|
308
382
|
def do_relative_row num
|
309
383
|
yield @list[@current_index+num]
|
310
384
|
end
|
385
|
+
|
386
|
+
## NOTE: earlier print_border was called only once in constructor, but when
|
387
|
+
##+ a window is resized, and destroyed, then this was never called again, so the
|
388
|
+
##+ border would not be seen in splitpane unless the width coincided exactly with
|
389
|
+
##+ what is calculated in divider_location.
|
311
390
|
def paint
|
312
|
-
|
391
|
+
# not sure where to put this, once for all or repeat 2010-02-11 15:06 RFED16
|
392
|
+
my_win = nil
|
393
|
+
if @form
|
394
|
+
my_win = @form.window
|
395
|
+
else
|
396
|
+
my_win = @target_window
|
397
|
+
end
|
398
|
+
@graphic = my_win unless @graphic
|
399
|
+
#$log.warn "neither form not target window given!!! TV paint 368" unless my_win
|
400
|
+
#raise " #{@name} neither form, nor target window given TV paint " unless my_win
|
401
|
+
#raise " #{@name} NO GRAPHIC set as yet TV paint " unless @graphic
|
402
|
+
@win_left = my_win.left
|
403
|
+
@win_top = my_win.top
|
404
|
+
|
405
|
+
print_borders if (@suppress_borders == false && @repaint_all) # do this once only, unless everything changes
|
313
406
|
rc = row_count
|
314
|
-
maxlen = @maxlen
|
407
|
+
maxlen = @maxlen || @width-2
|
408
|
+
$log.debug " #{@name} textview repaint width is #{@width}, height is #{@height} , maxlen #{maxlen}/ #{@maxlen}, #{@graphic.name} roff #{@row_offset} coff #{@col_offset}"
|
315
409
|
tm = get_content
|
316
410
|
tr = @toprow
|
317
411
|
acolor = get_color $datacolor
|
318
|
-
h = scrollatrow()
|
412
|
+
h = scrollatrow()
|
319
413
|
r,c = rowcol
|
414
|
+
@longest_line = @width #maxlen
|
320
415
|
0.upto(h) do |hh|
|
321
416
|
crow = tr+hh
|
322
417
|
if crow < rc
|
@@ -327,32 +422,73 @@ module RubyCurses
|
|
327
422
|
content.gsub!(/[^[:print:]]/, '') # don't display non print characters
|
328
423
|
if !content.nil?
|
329
424
|
if content.length > maxlen # only show maxlen
|
425
|
+
@longest_line = content.length if content.length > @longest_line
|
330
426
|
content = content[@pcol..@pcol+maxlen-1]
|
331
427
|
else
|
332
428
|
content = content[@pcol..-1]
|
333
429
|
end
|
334
430
|
end
|
335
|
-
|
336
|
-
#renderer = cell_renderer()
|
337
|
-
#renderer.repaint @form.window, r+hh, c+(colix*11), content, focussed, selected
|
338
|
-
#renderer.repaint @form.window, r+hh, c, content, focussed, selected
|
339
|
-
@form.window.printstring r+hh, c, "%-*s" % [@width-2,content], acolor, @attr
|
431
|
+
@graphic.printstring r+hh, c, "%-*s" % [@width-2,content], acolor, @attr
|
340
432
|
if @search_found_ix == tr+hh
|
341
433
|
if !@find_offset.nil?
|
342
434
|
# handle exceed bounds, and if scrolling
|
343
435
|
if @find_offset1 < maxlen+@pcol and @find_offset > @pcol
|
344
|
-
@
|
436
|
+
@graphic.mvchgat(y=r+hh, x=c+@find_offset-@pcol, @find_offset1-@find_offset, Ncurses::A_NORMAL, $reversecolor, nil)
|
345
437
|
end
|
346
438
|
end
|
347
439
|
end
|
348
440
|
|
349
441
|
else
|
350
442
|
# clear rows
|
351
|
-
@
|
443
|
+
@graphic.printstring r+hh, c, " " * (@width-2), acolor,@attr
|
352
444
|
end
|
353
445
|
end
|
446
|
+
show_caret_func
|
354
447
|
@table_changed = false
|
355
448
|
@repaint_required = false
|
449
|
+
@repaint_footer_required = true # 2010-01-23 22:41
|
450
|
+
@buffer_modified = true # required by form to call buffer_to_screen
|
451
|
+
@repaint_all = false # added 2010-01-08 18:56 for redrawing everything
|
452
|
+
|
453
|
+
# 2010-02-10 22:08 RFED16
|
454
|
+
end
|
455
|
+
## this is just a test of prompting user for a string
|
456
|
+
#+ as an alternative to the dialog.
|
457
|
+
def getstr prompt, maxlen=10
|
458
|
+
tabc = Proc.new {|str| Dir.glob(str +"*") }
|
459
|
+
config={}; config[:tab_completion] = tabc
|
460
|
+
config[:default] = "defaulT"
|
461
|
+
$log.debug " inside getstr before call "
|
462
|
+
ret, str = rbgetstr(@form.window, @row+@height-1, @col+1, prompt, maxlen, config)
|
463
|
+
$log.debug " rbgetstr returned #{ret} , #{str} "
|
464
|
+
return "" if ret != 0
|
465
|
+
return str
|
466
|
+
end
|
467
|
+
# this is just a test of the simple "most" menu
|
468
|
+
def disp_menu
|
469
|
+
menu = PromptMenu.new self
|
470
|
+
menu.add( menu.create_mitem( 's', "Goto start ", "Going to start", Proc.new { goto_start} ))
|
471
|
+
menu.add(menu.create_mitem( 'r', "scroll right", "I have scrolled ", :scroll_right ))
|
472
|
+
menu.add(menu.create_mitem( 'l', "scroll left", "I have scrolled ", :scroll_left ))
|
473
|
+
item = menu.create_mitem( 'm', "submenu", "submenu options" )
|
474
|
+
menu1 = PromptMenu.new( self, "Submenu Options")
|
475
|
+
menu1.add(menu1.create_mitem( 's', "CASE sensitive", "Ignoring Case in search" ))
|
476
|
+
menu1.add(menu1.create_mitem( 't', "goto last position", "moved to previous position", Proc.new { goto_last_position} ))
|
477
|
+
item.action = menu1
|
478
|
+
menu.add(item)
|
479
|
+
# how do i know what's available. the application or window should know where to place
|
480
|
+
#menu.display @form.window, 23, 1, $datacolor #, menu
|
481
|
+
menu.display @form.window, $error_message_row, $error_message_col, $datacolor #, menu
|
356
482
|
end
|
483
|
+
##
|
484
|
+
# dynamically load a module and execute init method.
|
485
|
+
# Hopefully, we can get behavior like this such as vieditable or multibuffers
|
486
|
+
def load_module requirename, includename
|
487
|
+
require "rbcurse/#{requirename}"
|
488
|
+
extend Object.const_get("#{includename}")
|
489
|
+
send("#{requirename}_init") #if respond_to? "#{includename}_init"
|
490
|
+
end
|
491
|
+
|
357
492
|
end # class textview
|
493
|
+
|
358
494
|
end # modul
|