rbcurse 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +33 -0
- data/README.markdown +7 -1
- data/TODO2.txt +21 -15
- data/VERSION +1 -1
- data/examples/abasiclist.rb +2 -2
- data/examples/alpmenu.rb +1 -1
- data/examples/app.rb +0 -1
- data/examples/appdirtree.rb +4 -2
- data/examples/appemail.rb +7 -3
- data/examples/appemaillb.rb +1 -1
- data/examples/appgcompose.rb +2 -2
- data/examples/appgmail.rb +1 -1
- data/examples/appmethods.rb +20 -2
- data/examples/atree.rb +9 -1
- data/examples/dbdemo.rb +460 -0
- data/examples/dirtree.rb +1 -1
- data/examples/menu1.rb +37 -5
- data/examples/multispl.rb +1 -1
- data/examples/rfe.rb +9 -2
- data/examples/splitp.rb +1 -1
- data/examples/sqlc.rb +6 -10
- data/examples/sqlm.rb +2 -20
- data/examples/sqlt.rb +408 -0
- data/examples/term2.rb +1 -1
- data/examples/test2.rb +169 -97
- data/examples/testapp.rb +1 -1
- data/examples/testapp2.rb +1 -1
- data/examples/testkeypress.rb +4 -2
- data/examples/testtable.rb +6 -0
- data/examples/testtpane.rb +35 -23
- data/examples/testvimsplit.rb +3 -2
- data/lib/rbcurse.rb +1 -1
- data/lib/rbcurse/action.rb +8 -0
- data/lib/rbcurse/app.rb +39 -23
- data/lib/rbcurse/extras/bottomline.rb +101 -13
- data/lib/rbcurse/extras/directorylist.rb +14 -5
- data/lib/rbcurse/extras/divider.rb +1 -1
- data/lib/rbcurse/extras/listselectable.rb +42 -8
- data/lib/rbcurse/extras/masterdetail.rb +2 -2
- data/lib/rbcurse/extras/scrollbar.rb +11 -2
- data/lib/rbcurse/extras/statusline.rb +56 -0
- data/lib/rbcurse/extras/stdscrwindow.rb +11 -0
- data/lib/rbcurse/extras/tabular.rb +2 -1
- data/lib/rbcurse/extras/tabularwidget.rb +60 -17
- data/lib/rbcurse/extras/viewer.rb +16 -4
- data/lib/rbcurse/keylabelprinter.rb +34 -4
- data/lib/rbcurse/listeditable.rb +5 -1
- data/lib/rbcurse/listkeys.rb +1 -1
- data/lib/rbcurse/listscrollable.rb +15 -8
- data/lib/rbcurse/rbasiclistbox.rb +44 -23
- data/lib/rbcurse/rcommandwindow.rb +8 -14
- data/lib/rbcurse/rdialogs.rb +187 -2
- data/lib/rbcurse/rlistbox.rb +38 -19
- data/lib/rbcurse/rmenu.rb +313 -93
- data/lib/rbcurse/rmessagebox.rb +3 -2
- data/lib/rbcurse/rmulticontainer.rb +5 -3
- data/lib/rbcurse/rmultisplit.rb +2 -11
- data/lib/rbcurse/rmultitextview.rb +4 -5
- data/lib/rbcurse/rtabbedpane.rb +223 -69
- data/lib/rbcurse/rtable.rb +6 -10
- data/lib/rbcurse/rtextarea.rb +57 -36
- data/lib/rbcurse/rtextview.rb +12 -15
- data/lib/rbcurse/rtree.rb +79 -22
- data/lib/rbcurse/rvimsplit.rb +16 -25
- data/lib/rbcurse/rwidget.rb +376 -523
- data/lib/rbcurse/tree/treecellrenderer.rb +24 -11
- data/lib/rbcurse/tree/treemodel.rb +1 -1
- data/lib/ver/window.rb +130 -66
- metadata +5 -3
- data/examples/term.rb +0 -48
@@ -46,6 +46,8 @@ module RubyCurses
|
|
46
46
|
bind_key(?+, :ask_select)
|
47
47
|
bind_key(?-, :ask_unselect)
|
48
48
|
bind_key(?I) { @hide_dot_files = !@hide_dot_files; prune_entries; }
|
49
|
+
#bind_key(?v, :view_current) # does not respond to ??? XXX
|
50
|
+
bind_key(?v) {view_current}
|
49
51
|
super
|
50
52
|
end
|
51
53
|
# changing the current path, refreshes files
|
@@ -83,10 +85,8 @@ module RubyCurses
|
|
83
85
|
list @entries
|
84
86
|
@list.insert 0, @_header
|
85
87
|
@title = @current_path
|
86
|
-
|
87
|
-
|
88
|
-
# earlier cursor would appear in header but selection would be data row
|
89
|
-
@current_index = @_header_row_index # FFI 2011-09-16 keeping cursor synched with selection
|
88
|
+
@current_index = @_first_data_index
|
89
|
+
set_form_row
|
90
90
|
end
|
91
91
|
# called by parent's repaint
|
92
92
|
def convert_value_to_text file, crow
|
@@ -227,7 +227,11 @@ module RubyCurses
|
|
227
227
|
@reverse = false
|
228
228
|
end
|
229
229
|
sort_by header.strip, @reverse
|
230
|
+
# this next line will keep the cursor on header after sorting
|
231
|
+
# earlier cursor would appear in header but selection would be data row
|
232
|
+
@current_index = @_header_row_index # FFI 2011-09-16 keeping cursor synched with selection
|
230
233
|
@_last_header_sorted = header
|
234
|
+
set_form_row
|
231
235
|
return
|
232
236
|
end
|
233
237
|
value = current_value
|
@@ -399,6 +403,12 @@ module RubyCurses
|
|
399
403
|
populate @current_path
|
400
404
|
set_form_row
|
401
405
|
end
|
406
|
+
def view_current
|
407
|
+
file = self.current_value
|
408
|
+
require 'rbcurse/extras/viewer.rb'
|
409
|
+
RubyCurses::Viewer.view("#{current_path}/#{file}", :close_key => KEY_RETURN, :title => "<Enter> to close, M-l M-h to scroll")
|
410
|
+
end
|
411
|
+
# ADD HERE
|
402
412
|
##
|
403
413
|
end # class
|
404
414
|
|
@@ -452,7 +462,6 @@ module RubyCurses
|
|
452
462
|
graphic.printstring r, c, "%-*s" % [len, value], @color_pair,@attr
|
453
463
|
end
|
454
464
|
end
|
455
|
-
# ADD HERE
|
456
465
|
end
|
457
466
|
end # module
|
458
467
|
# set filetype=ruby
|
@@ -44,7 +44,7 @@ module RubyCurses
|
|
44
44
|
dsl_property :parent
|
45
45
|
# which row is focussed, current_index of listbox, required.
|
46
46
|
# how many total rows of data does the list have, same as @list.length, required.
|
47
|
-
dsl_accessor :next
|
47
|
+
dsl_accessor :next_component # 'next' bombing in dsl_accessor 2011-10-2 PLS CHANGE ELSEWHERE
|
48
48
|
|
49
49
|
# TODO: if parent passed, we shold bind to ON_ENTER and get current_index, so no extra work is required.
|
50
50
|
|
@@ -5,6 +5,7 @@
|
|
5
5
|
# the original gets into models and has complicated operation as well
|
6
6
|
# as difficult to remember method names. This attempts to be a simple plugin.
|
7
7
|
# Currently being used by rbasiclistbox and now tabularwidget.
|
8
|
+
# NOTE: pls define @_header_adjustment to 0 if you don't use it or know what it means.
|
8
9
|
# TODO: of course we need to fire events so user can do something.
|
9
10
|
module RubyCurses
|
10
11
|
module NewListSelectable
|
@@ -24,16 +25,22 @@ module RubyCurses
|
|
24
25
|
when :multiple
|
25
26
|
if @selected_indices.include? crow
|
26
27
|
@selected_indices.delete crow
|
28
|
+
lse = ListSelectionEvent.new(crow, crow, self, :DELETE)
|
29
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
27
30
|
else
|
28
|
-
#clear_selection
|
29
|
-
#@selected_indices[0] = crow
|
30
31
|
@selected_indices << crow
|
32
|
+
lse = ListSelectionEvent.new(crow, crow, self, :INSERT)
|
33
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
31
34
|
end
|
32
35
|
else
|
33
36
|
if @selected_index == crow
|
34
37
|
@selected_index = nil
|
38
|
+
lse = ListSelectionEvent.new(crow, crow, self, :DELETE)
|
39
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
35
40
|
else
|
36
41
|
@selected_index = crow
|
42
|
+
lse = ListSelectionEvent.new(crow, crow, self, :INSERT)
|
43
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
37
44
|
end
|
38
45
|
end
|
39
46
|
end
|
@@ -53,19 +60,29 @@ module RubyCurses
|
|
53
60
|
if @selected_indices.include? crow
|
54
61
|
# delete from last_clicked until this one in any direction
|
55
62
|
min.upto(max){ |i| @selected_indices.delete i }
|
63
|
+
lse = ListSelectionEvent.new(min, max, self, :DELETE)
|
64
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
56
65
|
else
|
57
66
|
# add to selection from last_clicked until this one in any direction
|
58
67
|
min.upto(max){ |i| @selected_indices << i unless @selected_indices.include?(i) }
|
68
|
+
lse = ListSelectionEvent.new(min, max, self, :INSERT)
|
69
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
59
70
|
end
|
60
71
|
else
|
61
72
|
end
|
62
73
|
@repaint_required = true
|
74
|
+
self
|
63
75
|
end
|
64
76
|
# clears selected indices, typically called when multiple select
|
65
77
|
# Key binding is application specific
|
66
78
|
def clear_selection
|
79
|
+
return if @selected_indices.nil? || @selected_indices.empty?
|
67
80
|
@selected_indices = []
|
68
81
|
@selected_index = nil
|
82
|
+
# Not sure what event type I should give, DELETE or a new one, user should
|
83
|
+
# understand that selection has been cleared, and ignore first two params
|
84
|
+
lse = ListSelectionEvent.new(0, @list.size, self, :CLEAR)
|
85
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
69
86
|
@repaint_required = true
|
70
87
|
end
|
71
88
|
def is_row_selected crow=@current_index-@_header_adjustment
|
@@ -100,8 +117,8 @@ module RubyCurses
|
|
100
117
|
@anchor_selection_index = ix0
|
101
118
|
@lead_selection_index = ix1
|
102
119
|
ix0.upto(ix1) {|i| @selected_indices << i unless @selected_indices.include? i }
|
103
|
-
|
104
|
-
|
120
|
+
lse = ListSelectionEvent.new(ix0, ix1, self, :INSERT)
|
121
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
105
122
|
#$log.debug " DLSM firing LIST_SELECTION EVENT #{lse}"
|
106
123
|
end
|
107
124
|
alias :add_row_selection_interval :add_selection_interval
|
@@ -109,8 +126,8 @@ module RubyCurses
|
|
109
126
|
@anchor_selection_index = ix0
|
110
127
|
@lead_selection_index = ix1
|
111
128
|
@selected_indices.delete_if {|x| x >= ix0 and x <= ix1}
|
112
|
-
|
113
|
-
|
129
|
+
lse = ListSelectionEvent.new(ix0, ix1, self, :DELETE)
|
130
|
+
fire_handler :LIST_SELECTION_EVENT, lse
|
114
131
|
end
|
115
132
|
alias :remove_row_selection_interval :remove_selection_interval
|
116
133
|
# convenience method to select next len rows
|
@@ -122,13 +139,13 @@ module RubyCurses
|
|
122
139
|
# select all rows, you may specify starting row.
|
123
140
|
# if header row, then 1 else should be 0. Actually we should have a way to determine
|
124
141
|
# this, and the default should be zero.
|
125
|
-
def select_all start_row=0
|
142
|
+
def select_all start_row=0 #+@_header_adjustment
|
126
143
|
@repaint_required = true
|
127
144
|
# don't select header row - need to make sure this works for all cases. we may
|
128
145
|
# need a variable instead of hardoded value
|
129
146
|
add_row_selection_interval start_row, row_count()
|
130
147
|
end
|
131
|
-
def invert_selection start_row=
|
148
|
+
def invert_selection start_row=0 #+@_header_adjustment
|
132
149
|
start_row.upto(row_count()){|i| invert_row_selection i }
|
133
150
|
end
|
134
151
|
|
@@ -189,6 +206,8 @@ module RubyCurses
|
|
189
206
|
bind_key(?a, :select_all)
|
190
207
|
bind_key(?*, :invert_selection)
|
191
208
|
bind_key(?u, :clear_selection)
|
209
|
+
@_header_adjustment ||= 0 # incase caller does not use
|
210
|
+
@_events << :LIST_SELECTION_EVENT unless @_events.include? :LIST_SELECTION_EVENT
|
192
211
|
end
|
193
212
|
def list_init_vars
|
194
213
|
@selected_indices = []
|
@@ -219,4 +238,19 @@ module RubyCurses
|
|
219
238
|
@selected_indices
|
220
239
|
end
|
221
240
|
end # mod
|
241
|
+
class ListSelectionEvent
|
242
|
+
attr_accessor :firstrow, :lastrow, :source, :type
|
243
|
+
def initialize firstrow, lastrow, source, type
|
244
|
+
@firstrow = firstrow
|
245
|
+
@lastrow = lastrow
|
246
|
+
@source = source
|
247
|
+
@type = type
|
248
|
+
end
|
249
|
+
def to_s
|
250
|
+
"#{@type.to_s}, firstrow: #{@firstrow}, lastrow: #{@lastrow}, source: #{@source}"
|
251
|
+
end
|
252
|
+
def inspect
|
253
|
+
to_s
|
254
|
+
end
|
255
|
+
end
|
222
256
|
end # mod
|
@@ -28,7 +28,7 @@ class MasterDetail < Widget
|
|
28
28
|
if @first_time
|
29
29
|
@first_time = nil
|
30
30
|
[@vim, @left, @right1, @right2].each { |e|
|
31
|
-
e.set_buffering(:target_window => @target_window || @form.window, :form => @form)
|
31
|
+
e.set_buffering(:target_window => @target_window || @form.window, :form => @form) # removed on 2011-09-29
|
32
32
|
}
|
33
33
|
end
|
34
34
|
@vim.repaint
|
@@ -61,7 +61,7 @@ class MasterDetail < Widget
|
|
61
61
|
# what if user gives in wrong order !!
|
62
62
|
@gb = @vim.add :divider, :SECOND, 0
|
63
63
|
@right2 = @vim.add comp, :SECOND, weight
|
64
|
-
@gb.
|
64
|
+
@gb.next_component(@right2)
|
65
65
|
_add_component comp
|
66
66
|
@right2
|
67
67
|
end
|
@@ -42,6 +42,7 @@ module RubyCurses
|
|
42
42
|
super
|
43
43
|
@color_pair = get_color $datacolor, @color, @bgcolor
|
44
44
|
@scroll_pair = get_color $bottomcolor, :green, :white
|
45
|
+
#$log.debug "SCROLLBAR COLOR cp #{@color_pair} sp #{@scroll_pair} " if $log.debug?
|
45
46
|
@window = form.window
|
46
47
|
@editable = false
|
47
48
|
@focusable = false
|
@@ -55,6 +56,11 @@ module RubyCurses
|
|
55
56
|
@repaint_required = true #requred otherwise at end when same value sent, prop handler
|
56
57
|
# will not be fired (due to optimization).
|
57
58
|
end
|
59
|
+
# in some cases, on leaving a listbox or other component redraws itself to reduce
|
60
|
+
# selected or highlighted object, so the scrollbar gets overwritten. We need to repaint it.
|
61
|
+
@parent.bind :LEAVE do |p|
|
62
|
+
@repaint_required = true
|
63
|
+
end
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
@@ -82,10 +88,11 @@ module RubyCurses
|
|
82
88
|
bc = $datacolor
|
83
89
|
bordercolor = @border_color || bc
|
84
90
|
borderatt = @border_attrib || Ncurses::A_REVERSE
|
91
|
+
#$log.debug "SCROLL bordercolor #{bordercolor} , #{borderatt} " if $log.debug?
|
85
92
|
|
86
93
|
|
87
94
|
@graphic.attron(Ncurses.COLOR_PAIR(bordercolor) | borderatt)
|
88
|
-
|
95
|
+
#$log.debug " XXX SCROLL #{@row} #{@col} #{@length} "
|
89
96
|
@graphic.mvvline(@row+0, @col, 1, @length-0)
|
90
97
|
@graphic.attroff(Ncurses.COLOR_PAIR(bordercolor) | borderatt)
|
91
98
|
|
@@ -95,14 +102,16 @@ module RubyCurses
|
|
95
102
|
@current_index = 0 if @current_index < 0
|
96
103
|
@current_index = listlen-1 if @current_index >= listlen
|
97
104
|
sclen = (pht/listlen)* @length
|
105
|
+
sclen = 1 if sclen < 1 # sometimes 0.7 for large lists 100 items 2011-10-1
|
98
106
|
scloc = (@current_index/listlen)* @length
|
99
107
|
scloc = (@length - sclen) if scloc > @length - sclen # don't exceed end
|
100
108
|
if @current_index == @list_length - 1
|
101
|
-
scloc = @length - sclen + 1
|
109
|
+
scloc = @length - sclen + 0 # earlier 1, but removed since sclen min 1 2011-10-1
|
102
110
|
end
|
103
111
|
@graphic.attron(Ncurses.COLOR_PAIR(@scroll_pair) | borderatt)
|
104
112
|
r = @row + scloc
|
105
113
|
c = @col + 0
|
114
|
+
#$log.debug " XXX SCROLLBAR #{r} #{c} #{sclen} "
|
106
115
|
@graphic.mvvline(r, c, 1, sclen)
|
107
116
|
@graphic.attroff(Ncurses.COLOR_PAIR(@scroll_pair) | borderatt)
|
108
117
|
@repaint_required = false
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rbcurse'
|
2
|
+
|
3
|
+
module RubyCurses
|
4
|
+
|
5
|
+
#
|
6
|
+
# A vim-like application status bar that can display time and various other statuses
|
7
|
+
# at the bottom, typically above the dock (3rd line from last).
|
8
|
+
#
|
9
|
+
class StatusLine < Widget
|
10
|
+
|
11
|
+
def initialize form, config={}, &block
|
12
|
+
@row = Ncurses.LINES-3
|
13
|
+
@col = 0
|
14
|
+
super
|
15
|
+
@focusable = false
|
16
|
+
@editable = false
|
17
|
+
@command = nil
|
18
|
+
@repaint_required = true
|
19
|
+
bind(:PROPERTY_CHANGE) { |e| @color_pair = nil ; }
|
20
|
+
end
|
21
|
+
#
|
22
|
+
# command that returns a string that populates the status line.
|
23
|
+
# See dbdemo.rb
|
24
|
+
# e.g.
|
25
|
+
# @l.command { "%-20s [DB: %-s | %-s ]" % [ Time.now, $current_db || "None", $current_table || "----"] }
|
26
|
+
#
|
27
|
+
def command *args, &blk
|
28
|
+
@command = blk
|
29
|
+
@args = args
|
30
|
+
end
|
31
|
+
|
32
|
+
# NOTE: I have not put a check of repaint_required, so this will print on each key-stroke OR
|
33
|
+
# rather whenever form.repaint is called.
|
34
|
+
def repaint
|
35
|
+
@color_pair ||= get_color($datacolor, @color, @bgcolor)
|
36
|
+
|
37
|
+
# first print dashes through
|
38
|
+
@form.window.printstring @row, @col, "%s" % "-" * Ncurses.COLS, @color_pair, Ncurses::A_REVERSE
|
39
|
+
|
40
|
+
# now call the block to get current values
|
41
|
+
if @command
|
42
|
+
ftext = @command.call(self, @args) if @command
|
43
|
+
else
|
44
|
+
status = $status_message ? $status_message.value : ""
|
45
|
+
ftext = " %-20s | %s" % [Time.now, status] # should we print a default value just in case user doesn't
|
46
|
+
end
|
47
|
+
@form.window.printstring @row, @col, ftext, $datacolor, Ncurses::A_REVERSE
|
48
|
+
|
49
|
+
@repaint_required = false
|
50
|
+
end
|
51
|
+
def handle_keys ch
|
52
|
+
return :UNHANDLED
|
53
|
+
end
|
54
|
+
|
55
|
+
end # class
|
56
|
+
end # module
|
@@ -12,6 +12,12 @@ module RubyCurses
|
|
12
12
|
# FFI: 2011-09-9 The change to FFI has affected this a lot since I do not get window
|
13
13
|
# methods in rbcurse for stdscr whereas suprisingly if i run the samples, i get them
|
14
14
|
# all.
|
15
|
+
#
|
16
|
+
# NOTE:
|
17
|
+
# WARNING: Pls do not use this class. This was just experimentation. Using stdscr
|
18
|
+
# mucks up the display and overwrites objects on the screen. I will remove this class
|
19
|
+
# at some time.
|
20
|
+
#
|
15
21
|
class StdscrWindow
|
16
22
|
attr_reader :width, :height, :top, :left
|
17
23
|
|
@@ -264,7 +270,9 @@ module RubyCurses
|
|
264
270
|
# 2010-09-13 00:22 WE should not use these any longer.
|
265
271
|
# Application should create a label and map a Variable named
|
266
272
|
# $errormessage to it. We should only update the Variable
|
273
|
+
# CLEANUP DEPRECATED
|
267
274
|
def print_error_message text=$error_message
|
275
|
+
raise "DEPRECATED CLEANUP use global method of same name"
|
268
276
|
r = $error_message_row || Ncurses.LINES-1
|
269
277
|
c = $error_message_col || (Ncurses.COLS-text.length)/2
|
270
278
|
|
@@ -274,7 +282,9 @@ module RubyCurses
|
|
274
282
|
$error_message_clear_pending = true
|
275
283
|
end
|
276
284
|
# added by rk 2008-11-29 19:01
|
285
|
+
# CLEANUP DEPRECATED
|
277
286
|
def print_status_message text=$status_message
|
287
|
+
raise "DEPRECATED CLEANUP use global method of same name"
|
278
288
|
r = $status_message_row || Ncurses.LINES-1
|
279
289
|
clear_error r, $datacolor
|
280
290
|
# print it in centre
|
@@ -284,6 +294,7 @@ module RubyCurses
|
|
284
294
|
# I am not only clearing if something was printed. This is since
|
285
295
|
# certain small forms like TabbedForm top form throw an error on printstring.
|
286
296
|
#
|
297
|
+
#raise "DEPRECATED CLEANUP use global method of same name"
|
287
298
|
def clear_error r = $error_message_row, color = $datacolor
|
288
299
|
return unless $error_message_clear_pending
|
289
300
|
c = $error_message_col || (Ncurses.COLS-text.length)/2
|
@@ -26,6 +26,7 @@
|
|
26
26
|
module RubyCurses
|
27
27
|
|
28
28
|
class Tabular
|
29
|
+
GUESSCOLUMNS = 20
|
29
30
|
|
30
31
|
def yield_or_eval &block
|
31
32
|
return unless block
|
@@ -187,7 +188,7 @@ module RubyCurses
|
|
187
188
|
private
|
188
189
|
def _guess_col_widths #:nodoc:
|
189
190
|
@list.each_with_index { |r, i|
|
190
|
-
break if i >
|
191
|
+
break if i > GUESSCOLUMNS
|
191
192
|
next if r == :separator
|
192
193
|
r.each_with_index { |c, j|
|
193
194
|
x = c.to_s.length
|
@@ -156,6 +156,11 @@ module RubyCurses
|
|
156
156
|
bind_key(?b, :previous_column)
|
157
157
|
list_bindings
|
158
158
|
end
|
159
|
+
|
160
|
+
#
|
161
|
+
# set column names
|
162
|
+
# @param [Array] column names or headings
|
163
|
+
#
|
159
164
|
def columns=(array)
|
160
165
|
@_header_adjustment = 1
|
161
166
|
@columns = array
|
@@ -168,7 +173,7 @@ module RubyCurses
|
|
168
173
|
end
|
169
174
|
alias :headings= :columns=
|
170
175
|
##
|
171
|
-
# send in a list
|
176
|
+
# send in a list of data
|
172
177
|
#
|
173
178
|
# @param [Array / Tabular] data to be displayed
|
174
179
|
def set_content list
|
@@ -325,17 +330,11 @@ module RubyCurses
|
|
325
330
|
end
|
326
331
|
|
327
332
|
def repaint # Tabularwidget :nodoc:
|
328
|
-
if @screen_buffer.nil?
|
329
|
-
safe_create_buffer
|
330
|
-
@screen_buffer.name = "Pad::TABW_PAD_#{@name}" unless @screen_buffer.nil?
|
331
|
-
$log.debug " tabularwid creates pad #{@screen_buffer} #{@name}"
|
332
|
-
end
|
333
333
|
|
334
334
|
#return unless @repaint_required # 2010-02-12 19:08 TRYING - won't let footer print for col move
|
335
335
|
paint if @repaint_required
|
336
336
|
# raise "TV 175 graphic nil " unless @graphic
|
337
337
|
print_foot if @print_footer && @repaint_footer_required
|
338
|
-
buffer_to_window
|
339
338
|
end
|
340
339
|
def getvalue
|
341
340
|
@list
|
@@ -367,10 +366,12 @@ module RubyCurses
|
|
367
366
|
when KEY_UP, ?k.getbyte(0)
|
368
367
|
#select_prev_row
|
369
368
|
ret = up
|
369
|
+
get_window.ungetch(KEY_BTAB) if ret == :NO_PREVIOUS_ROW
|
370
370
|
check_curpos
|
371
371
|
|
372
372
|
when KEY_DOWN, ?j.getbyte(0)
|
373
373
|
ret = down
|
374
|
+
get_window.ungetch(KEY_TAB) if ret == :NO_NEXT_ROW
|
374
375
|
check_curpos
|
375
376
|
when KEY_LEFT, ?h.getbyte(0)
|
376
377
|
cursor_backward
|
@@ -390,9 +391,9 @@ module RubyCurses
|
|
390
391
|
blen = @buffer.rstrip.length
|
391
392
|
set_form_col blen
|
392
393
|
# search related
|
393
|
-
when @KEY_ASK_FIND
|
394
|
+
when @KEY_ASK_FIND # FIXME
|
394
395
|
ask_search
|
395
|
-
when @KEY_FIND_MORE
|
396
|
+
when @KEY_FIND_MORE # FIXME
|
396
397
|
find_more
|
397
398
|
when 10, 13, KEY_ENTER
|
398
399
|
#fire_handler :PRESS, self
|
@@ -428,8 +429,9 @@ module RubyCurses
|
|
428
429
|
begin
|
429
430
|
ret = process_key ch, self
|
430
431
|
rescue => err
|
431
|
-
$error_message = err
|
432
|
-
@form.window.print_error_message
|
432
|
+
$error_message.value = err.to_s
|
433
|
+
# @form.window.print_error_message # changed 2011 dts
|
434
|
+
alert err.to_s
|
433
435
|
$log.error " Tabularwidget ERROR #{err} "
|
434
436
|
$log.debug(err.backtrace.join("\n"))
|
435
437
|
# XXX caller app has no idea error occurred so can't do anything !
|
@@ -570,16 +572,16 @@ module RubyCurses
|
|
570
572
|
@graphic = my_win unless @graphic
|
571
573
|
@win_left = my_win.left
|
572
574
|
@win_top = my_win.top
|
573
|
-
#_guess_col_widths
|
574
575
|
tm = get_content
|
576
|
+
rc = tm.length
|
577
|
+
_estimate_column_widths if rc > 0 # will set preferred_width 2011-10-4
|
575
578
|
@left_margin ||= @row_selected_symbol.length
|
576
579
|
@width ||= @preferred_width
|
580
|
+
|
577
581
|
@height ||= [tm.length+3, 10].min
|
578
582
|
_prepare_format
|
579
583
|
|
580
584
|
print_borders if (@suppress_borders == false && @repaint_all) # do this once only, unless everything changes
|
581
|
-
rc = tm.length
|
582
|
-
_estimate_column_widths if rc > 0
|
583
585
|
_maxlen = @maxlen || @width-@internal_width
|
584
586
|
$log.debug " #{@name} Tabularwidget repaint width is #{@width}, height is #{@height} , maxlen #{maxlen}/ #{@maxlen}, #{@graphic.name} roff #{@row_offset} coff #{@col_offset}"
|
585
587
|
tr = @toprow
|
@@ -621,7 +623,6 @@ module RubyCurses
|
|
621
623
|
end
|
622
624
|
@repaint_required = false
|
623
625
|
@repaint_footer_required = true
|
624
|
-
@buffer_modified = true # required by form to call buffer_to_screen
|
625
626
|
@repaint_all = false
|
626
627
|
|
627
628
|
end
|
@@ -630,12 +631,33 @@ module RubyCurses
|
|
630
631
|
def print_data_row r, c, len, value, color, attr
|
631
632
|
@graphic.printstring r, c, "%-*s" % [len,value], color, attr
|
632
633
|
end
|
634
|
+
#
|
635
|
+
# Truncates data to fit into display area.
|
636
|
+
# Copied from listscrollable since we need to take care of left_margin
|
637
|
+
# 2011-10-6 This may need to be reflected in listbox and others FIXME
|
638
|
+
def truncate content #:nodoc:
|
639
|
+
#maxlen = @maxlen || @width-2
|
640
|
+
_maxlen = @maxlen || @width-@internal_width
|
641
|
+
_maxlen = @width-@internal_width if _maxlen > @width-@internal_width
|
642
|
+
_maxlen -= @left_margin
|
643
|
+
if !content.nil?
|
644
|
+
if content.length > _maxlen # only show maxlen
|
645
|
+
@longest_line = content.length if content.length > @longest_line
|
646
|
+
#content = content[@pcol..@pcol+_maxlen-1]
|
647
|
+
content.replace content[@pcol..@pcol+_maxlen-1]
|
648
|
+
else
|
649
|
+
# can this be avoided if pcol is 0 XXX
|
650
|
+
content.replace content[@pcol..-1] if @pcol > 0
|
651
|
+
end
|
652
|
+
end
|
653
|
+
content
|
654
|
+
end
|
633
655
|
|
634
656
|
# print header row
|
635
657
|
# allows user to override
|
636
658
|
def print_header_row r, c, len, value, color, attr
|
637
659
|
#acolor = $promptcolor
|
638
|
-
@graphic.printstring r, c, "%-*s" % [len ,value], color, attr
|
660
|
+
@graphic.printstring r, c+@left_margin, "%-*s" % [len-@left_margin ,value], color, attr
|
639
661
|
end
|
640
662
|
def separator
|
641
663
|
#return @separ if @separ
|
@@ -843,6 +865,8 @@ module RubyCurses
|
|
843
865
|
# FIXME we can create this once and reuse
|
844
866
|
#++
|
845
867
|
def fire_action_event
|
868
|
+
return unless @list
|
869
|
+
return unless @table_row_sorter
|
846
870
|
require 'rbcurse/ractionevent'
|
847
871
|
# the header event must only be used if columns passed
|
848
872
|
if header_row?
|
@@ -1023,6 +1047,25 @@ module RubyCurses
|
|
1023
1047
|
@current_index == @max_index
|
1024
1048
|
end
|
1025
1049
|
end
|
1050
|
+
# for some compatibility with Table
|
1051
|
+
def set_data data, colnames_array
|
1052
|
+
set_content data
|
1053
|
+
columns = colnames_array
|
1054
|
+
end
|
1055
|
+
def get_column_name index
|
1056
|
+
@columns[index]
|
1057
|
+
end
|
1058
|
+
alias :column_name :get_column_name
|
1059
|
+
alias :column :get_column
|
1060
|
+
def method_missing(name, *args)
|
1061
|
+
name = name.to_s
|
1062
|
+
case name
|
1063
|
+
when 'cell_editing_allowed', 'editing_policy'
|
1064
|
+
# silently ignore to keep compatible with Table
|
1065
|
+
else
|
1066
|
+
raise NoMethodError, "Undefined method #{name} for TabularWidget"
|
1067
|
+
end
|
1068
|
+
end
|
1026
1069
|
|
1027
1070
|
end # class tabluarw
|
1028
1071
|
|
@@ -1044,7 +1087,7 @@ App.new do
|
|
1044
1087
|
b << ["russia","europe","a hot country" ]
|
1045
1088
|
#b.column_width 2, 30
|
1046
1089
|
end
|
1047
|
-
s = TabularWidget.new @form , :row => 12, :col => 32
|
1090
|
+
s = TabularWidget.new @form , :row => 12, :col => 32 do |b|
|
1048
1091
|
b.columns = %w{ place continent text }
|
1049
1092
|
b << ["india","asia","a warm country" ]
|
1050
1093
|
b << ["japan","asia","a cool country" ]
|