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
@@ -0,0 +1,326 @@
|
|
1
|
+
=begin
|
2
|
+
* Name: tabbed pane: can have multiple forms overlapping.
|
3
|
+
* Description: This is the old program that uses multiple windows.
|
4
|
+
* This cannot be embedded inside a form, but can be used as a popup.
|
5
|
+
* Avoid using this, move to the widget TabbedPane which can be embedded inside a form.
|
6
|
+
* Author: rkumar
|
7
|
+
|
8
|
+
|
9
|
+
*** rtabbedpane renamed to rtabbedwindow 2009-11-02 13:04
|
10
|
+
|
11
|
+
--------
|
12
|
+
* Date: 2008-12-13 13:06
|
13
|
+
* License:
|
14
|
+
Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
15
|
+
|
16
|
+
=end
|
17
|
+
require 'rubygems'
|
18
|
+
require 'ncurses'
|
19
|
+
require 'logger'
|
20
|
+
require 'rbcurse'
|
21
|
+
|
22
|
+
include Ncurses
|
23
|
+
include RubyCurses
|
24
|
+
module RubyCurses
|
25
|
+
extend self
|
26
|
+
|
27
|
+
# TODO : insert_tab, remove_tab, disable/hide tab
|
28
|
+
# Hotkeys should be defined with ampersand, too.
|
29
|
+
#
|
30
|
+
# Multiple independent overlapping forms using the tabbed metaphor.
|
31
|
+
class TabbedButton < RubyCurses::RadioButton
|
32
|
+
def getvalue_for_paint
|
33
|
+
@text
|
34
|
+
end
|
35
|
+
##
|
36
|
+
# highlight abd selected colors and attribs should perhaps be in a
|
37
|
+
# structure, so user can override easily
|
38
|
+
def repaint # tabbedbutton
|
39
|
+
# $log.debug("BUTTon repaint : #{self.class()} r:#{@row} c:#{@col} #{getvalue_for_paint}" )
|
40
|
+
r,c = rowcol
|
41
|
+
attribs = @attrs
|
42
|
+
@highlight_foreground ||= $reversecolor
|
43
|
+
@highlight_background ||= 0
|
44
|
+
_state = @state
|
45
|
+
_state = :SELECTED if @variable.value == @value
|
46
|
+
case _state
|
47
|
+
when :HIGHLIGHTED
|
48
|
+
bgcolor = @highlight_background
|
49
|
+
color = @highlight_foreground
|
50
|
+
bgcolor = @bgcolor
|
51
|
+
color = @color
|
52
|
+
attribs = Ncurses::A_BOLD
|
53
|
+
when :SELECTED
|
54
|
+
bgcolor = @bgcolor
|
55
|
+
color = @color
|
56
|
+
attribs = Ncurses::A_REVERSE
|
57
|
+
else
|
58
|
+
bgcolor = @bgcolor
|
59
|
+
color = @color
|
60
|
+
end
|
61
|
+
#bgcolor = @state==:HIGHLIGHTED ? @highlight_background : @bgcolor
|
62
|
+
#color = @state==:HIGHLIGHTED ? @highlight_foreground : @color
|
63
|
+
if bgcolor.is_a? String and color.is_a? String
|
64
|
+
color = ColorMap.get_color(color, bgcolor)
|
65
|
+
end
|
66
|
+
value = getvalue_for_paint
|
67
|
+
# $log.debug("button repaint : r:#{r} c:#{c} col:#{color} bg #{bgcolor} v: #{value} ")
|
68
|
+
len = @display_length || value.length
|
69
|
+
@form.window.printstring r, c, "%-*s" % [len, value], color, attribs
|
70
|
+
# @form.window.mvchgat(y=r, x=c, max=len, Ncurses::A_NORMAL, bgcolor, nil)
|
71
|
+
if @underline != nil
|
72
|
+
# changed +1 to +0 on 2008-12-15 21:23 pls check.
|
73
|
+
@form.window.mvchgat(y=r, x=c+@underline+0, max=1, Ncurses::A_BOLD|Ncurses::A_UNDERLINE, color, nil)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
class TabbedWindow
|
78
|
+
include DSL
|
79
|
+
include EventHandler
|
80
|
+
dsl_accessor :row, :col
|
81
|
+
dsl_accessor :height, :width
|
82
|
+
dsl_accessor :button_type # ok, ok_cancel, yes_no
|
83
|
+
dsl_accessor :buttons # used if type :custom
|
84
|
+
attr_reader :selected_index
|
85
|
+
def initialize win, aconfig={}, &block
|
86
|
+
@parent = win
|
87
|
+
@tabs ||= []
|
88
|
+
@forms ||= []
|
89
|
+
@bgcolor ||= "black" # 0
|
90
|
+
@color ||= "white" # $datacolor
|
91
|
+
@attr = nil
|
92
|
+
@current_form = nil
|
93
|
+
@current_tab = nil
|
94
|
+
@config = aconfig
|
95
|
+
@config.each_pair { |k,v| variable_set(k,v) }
|
96
|
+
instance_eval &block if block_given?
|
97
|
+
end
|
98
|
+
##
|
99
|
+
# when adding tabs, you may use ampersand in text to create hotkey
|
100
|
+
def add_tab text, aconfig={}, &block
|
101
|
+
#create a button here and block is taken care of in button's instance
|
102
|
+
#or push this for later creation.
|
103
|
+
@tabs << Tab.new(text, aconfig, &block)
|
104
|
+
tab = @tabs.last
|
105
|
+
@forms << create_tab_form(tab)
|
106
|
+
tab.form = @forms.last
|
107
|
+
return tab
|
108
|
+
end
|
109
|
+
# private
|
110
|
+
def variable_set var, val
|
111
|
+
var = "@#{var}"
|
112
|
+
instance_variable_set(var, val)
|
113
|
+
end
|
114
|
+
# private
|
115
|
+
def configure(*val , &block)
|
116
|
+
case val.size
|
117
|
+
when 1
|
118
|
+
return @config[val[0]]
|
119
|
+
when 2
|
120
|
+
@config[val[0]] = val[1]
|
121
|
+
variable_set(val[0], val[1])
|
122
|
+
end
|
123
|
+
instance_eval &block if block_given?
|
124
|
+
end
|
125
|
+
def repaint
|
126
|
+
@window || create_window
|
127
|
+
@window.show
|
128
|
+
end
|
129
|
+
def show
|
130
|
+
repaint
|
131
|
+
end
|
132
|
+
def create_window
|
133
|
+
# first create the main top window with the tab buttons on it.
|
134
|
+
@layout = { :height => @height, :width => @width, :top => @row, :left => @col }
|
135
|
+
@window = VER::Window.new(@layout)
|
136
|
+
@form = RubyCurses::Form.new @window
|
137
|
+
@form.navigation_policy = :NON_CYCLICAL
|
138
|
+
@current_form = @form
|
139
|
+
@window.bkgd(Ncurses.COLOR_PAIR($datacolor));
|
140
|
+
@window.box( 0, 0);
|
141
|
+
@window.wrefresh
|
142
|
+
Ncurses::Panel.update_panels
|
143
|
+
col = 1
|
144
|
+
@buttons = []
|
145
|
+
## create a button for each tab
|
146
|
+
$tabradio = Variable.new
|
147
|
+
@tabs.each do |tab|
|
148
|
+
text = tab.text
|
149
|
+
@buttons << RubyCurses::TabbedButton.new(@form) do
|
150
|
+
variable $tabradio
|
151
|
+
text text
|
152
|
+
name text
|
153
|
+
value text
|
154
|
+
row 1
|
155
|
+
col col
|
156
|
+
end
|
157
|
+
col += text.length+4
|
158
|
+
# @forms << create_tab_form(tab)
|
159
|
+
# form = @forms.last
|
160
|
+
form = tab.form
|
161
|
+
form.window = @window if form.window.nil? ## XXX
|
162
|
+
panel = form.window.panel
|
163
|
+
@buttons.last.command { Ncurses::Panel.top_panel(panel)
|
164
|
+
Ncurses::Panel.update_panels();
|
165
|
+
Ncurses.doupdate();
|
166
|
+
form.repaint
|
167
|
+
@current_form = form
|
168
|
+
@current_tab = form
|
169
|
+
}
|
170
|
+
|
171
|
+
end
|
172
|
+
create_buttons
|
173
|
+
@form.repaint
|
174
|
+
end
|
175
|
+
def display_form form
|
176
|
+
panel = form.window.panel
|
177
|
+
Ncurses::Panel.top_panel(panel)
|
178
|
+
Ncurses::Panel.update_panels();
|
179
|
+
Ncurses.doupdate();
|
180
|
+
form.repaint
|
181
|
+
end
|
182
|
+
def create_tab_form tab
|
183
|
+
layout = { :height => @height-2, :width => @width, :top => @row+2, :left => @col }
|
184
|
+
window = VER::Window.new(layout)
|
185
|
+
form = RubyCurses::Form.new window
|
186
|
+
form.navigation_policy = :NON_CYCLICAL
|
187
|
+
window.bkgd(Ncurses.COLOR_PAIR($datacolor));
|
188
|
+
window.box( 0, 0);
|
189
|
+
window.mvprintw(1,1, tab.text.tr('&', ''))
|
190
|
+
##window.wrefresh
|
191
|
+
##Ncurses::Panel.update_panels
|
192
|
+
return form
|
193
|
+
end
|
194
|
+
def handle_keys
|
195
|
+
begin
|
196
|
+
while (( ch=@window.getchar()) != 999)
|
197
|
+
if ch == ?\C-q.getbyte(0)
|
198
|
+
@selected_index = -1 # this signifies cancel by ?C-q
|
199
|
+
@stop = true
|
200
|
+
return
|
201
|
+
end
|
202
|
+
return if @stop
|
203
|
+
@current_form ||= @form
|
204
|
+
ret = @current_form.handle_key(ch)
|
205
|
+
case ret
|
206
|
+
when :NO_NEXT_FIELD
|
207
|
+
if @current_form != @form
|
208
|
+
@current_form = @form
|
209
|
+
#@current_form.select_field -1
|
210
|
+
@current_form.req_first_field
|
211
|
+
#ret = @current_form.handle_key(ch)
|
212
|
+
else
|
213
|
+
if !@current_tab.nil?
|
214
|
+
@current_form = @current_tab
|
215
|
+
display_form @current_form
|
216
|
+
@current_form.req_first_field
|
217
|
+
#@current_form.select_field -1
|
218
|
+
#ret = @current_form.handle_key(ch)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
when :NO_PREV_FIELD
|
222
|
+
if @current_form != @form
|
223
|
+
$log.debug " 1 no prev field - going to button "
|
224
|
+
@current_form = @form
|
225
|
+
@current_form.req_last_field
|
226
|
+
else
|
227
|
+
if !@current_tab.nil?
|
228
|
+
@current_form = @current_tab
|
229
|
+
display_form @current_form
|
230
|
+
@current_form.req_last_field
|
231
|
+
end
|
232
|
+
end
|
233
|
+
when :UNHANDLED
|
234
|
+
$log.debug " unhandled in tabbed pane #{ch}"
|
235
|
+
ret = @form.process_key ch, self # field
|
236
|
+
@form.repaint
|
237
|
+
#return :UNHANDLED if ret == :UNHANDLED
|
238
|
+
end
|
239
|
+
return if @stop
|
240
|
+
@current_form.window.wrefresh
|
241
|
+
@window.refresh
|
242
|
+
end
|
243
|
+
ensure
|
244
|
+
destroy
|
245
|
+
end
|
246
|
+
end
|
247
|
+
def destroy
|
248
|
+
@window.destroy
|
249
|
+
@forms.each { |f| w = f.window; w.destroy unless w.nil? }
|
250
|
+
end
|
251
|
+
def create_buttons
|
252
|
+
case @button_type.to_s.downcase
|
253
|
+
when "ok"
|
254
|
+
make_buttons ["&OK"]
|
255
|
+
when "ok_cancel" #, "input", "list", "field_list"
|
256
|
+
make_buttons %w[&OK &Cancel]
|
257
|
+
when "yes_no"
|
258
|
+
make_buttons %w[&Yes &No]
|
259
|
+
when "yes_no_cancel"
|
260
|
+
make_buttons ["&Yes", "&No", "&Cancel"]
|
261
|
+
when "custom"
|
262
|
+
raise "Blank list of buttons passed to custom" if @buttons.nil? or @buttons.size == 0
|
263
|
+
make_buttons @buttons
|
264
|
+
else
|
265
|
+
$log.debug "No buttontype passed for creating tabbedpane. Using default (OK)"
|
266
|
+
make_buttons ["&OK"]
|
267
|
+
end
|
268
|
+
end
|
269
|
+
def make_buttons names
|
270
|
+
total = names.inject(0) {|total, item| total + item.length + 4}
|
271
|
+
bcol = center_column total
|
272
|
+
|
273
|
+
brow = @layout[:height]-2
|
274
|
+
button_ct=0
|
275
|
+
names.each_with_index do |bname, ix|
|
276
|
+
text = bname
|
277
|
+
#underline = @underlines[ix] if !@underlines.nil?
|
278
|
+
|
279
|
+
button = Button.new @form do
|
280
|
+
text text
|
281
|
+
name bname
|
282
|
+
row brow
|
283
|
+
col bcol
|
284
|
+
#underline underline
|
285
|
+
highlight_background $reversecolor
|
286
|
+
color $datacolor
|
287
|
+
bgcolor $datacolor
|
288
|
+
end
|
289
|
+
index = button_ct
|
290
|
+
button.command { |form| @selected_index = index; @stop = true; $log.debug "Pressed Button #{bname}";}
|
291
|
+
button_ct += 1
|
292
|
+
bcol += text.length+6
|
293
|
+
end
|
294
|
+
end
|
295
|
+
def center_column textlen
|
296
|
+
width = @layout[:width]
|
297
|
+
return (width-textlen)/2
|
298
|
+
end
|
299
|
+
|
300
|
+
##
|
301
|
+
# nested class tab
|
302
|
+
class Tab
|
303
|
+
attr_reader :text
|
304
|
+
attr_reader :config
|
305
|
+
attr_accessor :form
|
306
|
+
def initialize text, aconfig={}, &block
|
307
|
+
@text = text
|
308
|
+
@config = aconfig
|
309
|
+
@config.each_pair { |k,v| variable_set(k,v) }
|
310
|
+
instance_eval &block if block_given?
|
311
|
+
end
|
312
|
+
# private
|
313
|
+
def variable_set var, val
|
314
|
+
var = "@#{var}"
|
315
|
+
instance_variable_set(var, val)
|
316
|
+
end
|
317
|
+
def repaint
|
318
|
+
|
319
|
+
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
end # class TabbedWindow
|
324
|
+
|
325
|
+
|
326
|
+
end # module
|
data/lib/rbcurse/rtable.rb
CHANGED
@@ -1,12 +1,23 @@
|
|
1
1
|
=begin
|
2
2
|
* Name: table widget
|
3
3
|
* Description:
|
4
|
-
* Author: rkumar
|
4
|
+
* Author: rkumar
|
5
5
|
|
6
6
|
|
7
7
|
TODO: NOTE:
|
8
8
|
A few higher level methods check for no data but lower level ones do not.
|
9
|
+
XXX FIXME if M-tab to exit table then editing_stopped should be called.
|
10
|
+
currenty valus is lost if exiting table using Mtab or M-S-tab 2009-10-06 15:10
|
11
|
+
FIXME if a field is not printed since it is going out, tab still goes there, and celleditor
|
12
|
+
still prints there. - DONE
|
13
|
+
|
14
|
+
FIXME Increasing a column shoud decrease others till min size but not push off.
|
15
|
+
Should we have a method for changing column width online that recomputes others?
|
16
|
+
See testtable.rb - TODO a bit later
|
17
|
+
FIXME - tabbing in a row, should auto scroll to columns not displayed ?
|
18
|
+
currently it moves to next row. (examples/sqlc.rb) - DONE
|
9
19
|
|
20
|
+
* 2010-01-18 19:54 - BUFFERING related changes.
|
10
21
|
--------
|
11
22
|
* Date: 2008-12-27 21:33
|
12
23
|
* License:
|
@@ -45,7 +56,6 @@ module RubyCurses
|
|
45
56
|
include RubyCurses::ListSelectable
|
46
57
|
include RubyCurses::ListKeys
|
47
58
|
|
48
|
-
dsl_accessor :height
|
49
59
|
dsl_accessor :title
|
50
60
|
dsl_accessor :title_attrib
|
51
61
|
dsl_accessor :selected_color, :selected_bgcolor, :selected_attr
|
@@ -61,11 +71,12 @@ module RubyCurses
|
|
61
71
|
# In addition, A column to be editable must either have editable as nil or true
|
62
72
|
dsl_accessor :cell_editing_allowed # 2009-01-16 22:55
|
63
73
|
|
64
|
-
def initialize form, config={}, &block
|
74
|
+
def initialize form = nil, config={}, &block
|
65
75
|
super
|
66
76
|
init_vars
|
67
77
|
install_list_keys
|
68
78
|
install_keys_bindings
|
79
|
+
## create_buffer needs to move to repaint. widget needs values to use when i creates buffer in repaint.
|
69
80
|
end
|
70
81
|
|
71
82
|
def init_vars
|
@@ -121,7 +132,8 @@ module RubyCurses
|
|
121
132
|
end
|
122
133
|
# added 2009-01-07 13:05 so new scrollable can use
|
123
134
|
def scrollatrow
|
124
|
-
|
135
|
+
#@height -3
|
136
|
+
@height -4 # we forgot to remove 1 from height in border.
|
125
137
|
end
|
126
138
|
|
127
139
|
#
|
@@ -151,17 +163,17 @@ module RubyCurses
|
|
151
163
|
create_table_header
|
152
164
|
end
|
153
165
|
def set_model tm, tcm=nil, lsm=nil
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
166
|
+
table_model tm
|
167
|
+
if tcm.nil?
|
168
|
+
create_default_table_column_model
|
169
|
+
else
|
170
|
+
table_column_model tcm
|
171
|
+
end
|
172
|
+
if lsm.nil?
|
173
|
+
create_default_list_selection_model
|
174
|
+
else
|
175
|
+
list_selection_model lsm
|
176
|
+
end
|
165
177
|
create_table_header
|
166
178
|
end
|
167
179
|
|
@@ -428,6 +440,12 @@ module RubyCurses
|
|
428
440
|
end
|
429
441
|
@cell_editor = editor
|
430
442
|
@repaint_required = true
|
443
|
+
# copied from rlistbox, so that editors write on parent's graphic, otherwise
|
444
|
+
# their screen updates get overwritten by parent. 2010-01-19 20:17
|
445
|
+
if @should_create_buffer
|
446
|
+
$log.debug "LB #{@name} overriding editors comp with GRAPHIC #{@graphic} "
|
447
|
+
editor.component.override_graphic(@graphic) # 2010-01-05 00:36 TRYING OUT BUFFERED
|
448
|
+
end
|
431
449
|
set_form_col
|
432
450
|
end
|
433
451
|
## Its too late to call components on_leave here
|
@@ -449,15 +467,15 @@ module RubyCurses
|
|
449
467
|
case cname
|
450
468
|
when 'String'
|
451
469
|
# I do not know cell width here, you will have toset display_length NOTE
|
452
|
-
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 8}
|
470
|
+
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 8, :name => "tb_field_str"}
|
453
471
|
@ceh['String'] = ce
|
454
472
|
return ce
|
455
473
|
when 'Fixnum'
|
456
|
-
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 5}
|
474
|
+
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 5, :name => "tb_field_num"}
|
457
475
|
@ceh[cname] = ce
|
458
476
|
return ce
|
459
477
|
when 'Float'
|
460
|
-
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 5}
|
478
|
+
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 5, :name => "tb_field_flt"}
|
461
479
|
@ceh[cname] = ce
|
462
480
|
return ce
|
463
481
|
when "Boolean" #'TrueClass', 'FalseClass'
|
@@ -466,7 +484,7 @@ module RubyCurses
|
|
466
484
|
return ce
|
467
485
|
else
|
468
486
|
$log.debug " get_default_cell_editor_for_class UNKNOWN #{cname}"
|
469
|
-
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 6}
|
487
|
+
ce = RubyCurses::CellEditor.new RubyCurses::Field.new nil, {"focusable"=>false, "visible"=>false, "display_length"=> 6, :name => "tb_field_unk"}
|
470
488
|
@ceh[cname] = ce
|
471
489
|
return ce
|
472
490
|
end
|
@@ -493,6 +511,7 @@ module RubyCurses
|
|
493
511
|
ret = @cell_editor.component.handle_key(ch)
|
494
512
|
@repaint_required = true
|
495
513
|
$log.debug "RET #{ret} got from to cell editor"
|
514
|
+
#set_form_col if ret != :UNHANDLED # added 2010-01-30 20:17 CURSOR POS TABBEDPANE
|
496
515
|
return if ret != :UNHANDLED
|
497
516
|
end
|
498
517
|
case ch
|
@@ -502,21 +521,21 @@ module RubyCurses
|
|
502
521
|
when KEY_DOWN # show previous value
|
503
522
|
editing_stopped if @is_editing # 2009-01-16 16:06
|
504
523
|
next_row
|
505
|
-
when 27, ?\C-c
|
524
|
+
when 27, ?\C-c
|
506
525
|
editing_canceled
|
507
|
-
when KEY_ENTER, 10, 13
|
526
|
+
when KEY_ENTER, 10, 13
|
508
527
|
# actually it should fall through to the else
|
509
528
|
return :UNHANDLED unless @cell_editing_allowed
|
510
529
|
toggle_cell_editing
|
511
530
|
|
512
|
-
when @KEY_ROW_SELECTOR # ?\C-x #32
|
531
|
+
when @KEY_ROW_SELECTOR # ?\C-x #32
|
513
532
|
#add_row_selection_interval @current_index, @current_index
|
514
533
|
toggle_row_selection @current_index #, @current_index
|
515
534
|
@repaint_required = true
|
516
|
-
when ?\C-n
|
535
|
+
when ?\C-n.getbyte(0)
|
517
536
|
editing_stopped if @is_editing # 2009-01-16 16:06
|
518
537
|
scroll_forward
|
519
|
-
when ?\C-p
|
538
|
+
when ?\C-p.getbyte(0)
|
520
539
|
editing_stopped if @is_editing # 2009-01-16 16:06
|
521
540
|
scroll_backward
|
522
541
|
when 48, @KEY_GOTO_TOP
|
@@ -537,6 +556,7 @@ module RubyCurses
|
|
537
556
|
ret = process_key ch, self
|
538
557
|
return :UNHANDLED if ret == :UNHANDLED
|
539
558
|
end
|
559
|
+
return 0 # added 2010-03-14 13:27
|
540
560
|
end
|
541
561
|
def editing_canceled
|
542
562
|
return unless @cell_editing_allowed
|
@@ -601,37 +621,63 @@ module RubyCurses
|
|
601
621
|
bounds_check
|
602
622
|
end
|
603
623
|
end
|
624
|
+
# move focus to next column
|
625
|
+
# 2009-10-07 12:47 behavior change. earlier this would move to next row
|
626
|
+
# if focus was on last visible field. Now it scrolls so that first invisible
|
627
|
+
# field becomes the first column.
|
604
628
|
def next_column
|
605
629
|
v = @current_column+1
|
606
|
-
|
607
|
-
|
608
|
-
|
630
|
+
# normal situation, there is a next column go to
|
631
|
+
if v < @table_column_model.column_count
|
632
|
+
if v <= @_last_column_print
|
633
|
+
$log.debug " if v < #{@table_column_model.column_count} nd lastcolprint "
|
634
|
+
current_column v
|
635
|
+
else
|
636
|
+
# there is a col but its not visible
|
637
|
+
# XXX inefficient but i scroll completely to next column (putting it at start)
|
638
|
+
# otherwise sometimes it was still not visible if last column
|
639
|
+
(v-@_first_column_print).times(){scroll_right}
|
640
|
+
current_column v
|
641
|
+
set_form_col
|
642
|
+
end
|
643
|
+
|
609
644
|
else
|
610
645
|
if @current_index < row_count()-1
|
611
646
|
$log.debug " GOING TO NEXT ROW FROM NEXT COL : #{@current_index} : #{row_count}"
|
612
647
|
@current_column = 0
|
613
|
-
|
648
|
+
#@current_column = @_first_column_print # added 2009-02-17 00:01
|
649
|
+
@_first_column_print = 0 # added 2009-10-07 11:25
|
614
650
|
next_row
|
615
651
|
set_form_col
|
652
|
+
@repaint_required = true
|
653
|
+
@table_changed = true # so columns are modified by print_header
|
616
654
|
else
|
617
655
|
return :UNHANDLED
|
618
656
|
end
|
619
657
|
end
|
620
658
|
end
|
659
|
+
# move focus to previous column
|
660
|
+
# if you are on first column, check if scrolling required, else move up to
|
661
|
+
# last *visible* column of prev row
|
621
662
|
def previous_column
|
622
663
|
v = @current_column-1
|
623
664
|
# returning unhandled so focus can go to prev field auto
|
624
665
|
if v < @_first_column_print and @current_index <= 0
|
625
666
|
return :UNHANDLED
|
626
667
|
end
|
627
|
-
if v < @_first_column_print
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
668
|
+
if v < @_first_column_print
|
669
|
+
if v > 0
|
670
|
+
scroll_left
|
671
|
+
current_column v
|
672
|
+
elsif @current_index > 0
|
673
|
+
@current_column = @table_column_model.column_count-1
|
674
|
+
@current_column = @_last_column_print # added 2009-02-17 00:01
|
675
|
+
$log.debug " XXXXXX prev col #{@current_column}, las #{@_last_column_print}, fi: #{@_first_column_print}"
|
676
|
+
set_form_col
|
677
|
+
previous_row
|
678
|
+
end
|
633
679
|
else
|
634
|
-
current_column
|
680
|
+
current_column v
|
635
681
|
end
|
636
682
|
end
|
637
683
|
def goto_bottom
|
@@ -745,14 +791,24 @@ module RubyCurses
|
|
745
791
|
end
|
746
792
|
def set_form_row
|
747
793
|
r,c = rowcol
|
794
|
+
@rows_panned ||= 0 # RFED16 2010-02-19 10:00
|
795
|
+
win_row = 0
|
796
|
+
#win_row=@form.window.top # 2010-01-18 20:28 added
|
748
797
|
# +1 is due to header
|
749
|
-
|
798
|
+
#@form.row = r + (@current_index-@toprow) + 1
|
799
|
+
frow = r + (@current_index-@toprow) + 1 + win_row + @rows_panned
|
800
|
+
setrowcol(frow, nil) # 2010-01-18 20:04
|
750
801
|
end
|
751
802
|
# set cursor on correct column, widget
|
752
803
|
def set_form_col col=@curpos
|
753
804
|
@curpos = col
|
805
|
+
@cols_panned ||= 0 # RFED16 2010-02-19 10:00
|
754
806
|
@current_column_offset = get_column_offset
|
755
|
-
|
807
|
+
#@form.col = @col + @col_offset + @curpos + @current_column_offset
|
808
|
+
#win_col=@form.window.left
|
809
|
+
win_col = 0 # RFED16 2010-02-19 10:00
|
810
|
+
fcol = @col + @col_offset + @curpos + @current_column_offset + @cols_panned + win_col
|
811
|
+
setrowcol(nil, fcol) # 2010-01-18 20:04
|
756
812
|
end
|
757
813
|
# protected
|
758
814
|
def get_column_offset columnid=@current_column
|
@@ -762,8 +818,17 @@ module RubyCurses
|
|
762
818
|
|
763
819
|
|
764
820
|
def repaint
|
821
|
+
safe_create_buffer # moved here 2010-02-19 09:53 RFED16
|
765
822
|
return unless @repaint_required
|
766
|
-
|
823
|
+
my_win = @form ? @form.window : @target_window
|
824
|
+
@graphic = my_win unless @graphic
|
825
|
+
#$log.warn "neither form not target window given!!! TV paint 368" unless my_win
|
826
|
+
raise " #{@name} neither form, nor target window given TV paint " unless my_win
|
827
|
+
raise " #{@name} NO GRAPHIC set as yet TV paint " unless @graphic
|
828
|
+
@win_left = my_win.left # unused remove TODO
|
829
|
+
@win_top = my_win.top
|
830
|
+
|
831
|
+
print_border @graphic if @to_print_borders == 1 # do this once only, unless everything changes
|
767
832
|
return if @table_model.nil? # added 2009-02-17 12:45
|
768
833
|
@_first_column_print ||= 0
|
769
834
|
cc = @table_model.column_count
|
@@ -797,45 +862,50 @@ module RubyCurses
|
|
797
862
|
#acolumn = tcm.column(colix)
|
798
863
|
#model_index = acolumn.model_index
|
799
864
|
content = get_value_at(crow, colix) # tables
|
800
|
-
#renderer = get_default_cell_renderer_for_class content.class.to_s
|
801
865
|
renderer = get_cell_renderer(crow, colix)
|
802
866
|
if renderer.nil?
|
803
867
|
renderer = get_default_cell_renderer_for_class(content.class.to_s) if renderer.nil?
|
804
868
|
renderer.display_length acolumn.width unless acolumn.nil?
|
805
869
|
end
|
806
870
|
width = renderer.display_length + @inter_column_spacing
|
807
|
-
#renderer.repaint @form.window, r+hh, c+(colix*11), content, focussed, selected
|
808
871
|
acolumn.column_offset = offset
|
809
872
|
# 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
873
|
if c+offset+width > @col+@width
|
813
874
|
_column_scrolling = true
|
814
875
|
@_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
876
|
# experimental to print subset of last
|
819
877
|
space_left = (@width-3)-(offset) # 3 due to boundaries
|
820
878
|
space_left = 0 if space_left < 0
|
821
|
-
|
879
|
+
# length bombed for trueclass 2009-10-05 19:34
|
880
|
+
contentlen = content.length rescue content.to_s.length
|
881
|
+
#if content.length > space_left
|
882
|
+
if contentlen > space_left
|
822
883
|
clen = space_left
|
823
884
|
renderer.display_length clen
|
824
885
|
else
|
825
886
|
clen = -1
|
826
887
|
renderer.display_length space_left # content.length
|
827
888
|
end
|
889
|
+
# added 2009-10-05 20:29 since non strings were bombing
|
890
|
+
# in other cases should be just pass the content as-is. XXX
|
891
|
+
contenttrim = content[0..clen] rescue content # .to_s[0..clen]
|
828
892
|
# print the inter cell padding just in case things mess up while scrolling
|
829
|
-
@
|
830
|
-
renderer.repaint @
|
893
|
+
@graphic.mvprintw r+hh, c+offset-@inter_column_spacing, inter_column_padding
|
894
|
+
#renderer.repaint @graphic, r+hh, c+offset, crow, content[0..clen], focussed, selected
|
895
|
+
#renderer.repaint @graphic, r+hh, c+offset, crow, contenttrim, focussed, selected
|
896
|
+
# 2009-10-05 20:35 XXX passing self so we check it doesn't print outside
|
897
|
+
renderer.repaint self, r+hh, c+offset, crow, contenttrim, focussed, selected
|
831
898
|
break
|
832
899
|
end
|
833
900
|
# added crow on 2009-02-11 22:46
|
834
|
-
renderer.repaint @
|
901
|
+
#renderer.repaint @graphic, r+hh, c+(offset), crow, content, focussed, selected
|
902
|
+
# 2009-10-05 20:35 XXX
|
903
|
+
renderer.repaint self, r+hh, c+(offset), crow, content, focussed, selected
|
835
904
|
offset += width
|
836
905
|
end
|
837
906
|
else
|
838
|
-
|
907
|
+
#@graphic.printstring r+hh, c, " " * (@width-2), acolor,@attr
|
908
|
+
printstring r+hh, c, " " * (@width-2), acolor,@attr
|
839
909
|
# clear rows
|
840
910
|
end
|
841
911
|
end
|
@@ -847,10 +917,30 @@ module RubyCurses
|
|
847
917
|
$log.debug " _print_more_data_marker(#{rc} >= #{tr} + #{h})"
|
848
918
|
@table_changed = false
|
849
919
|
@repaint_required = false
|
920
|
+
@buffer_modified = true
|
921
|
+
buffer_to_window # RFED16 2010-02-19 09:55
|
922
|
+
end
|
923
|
+
# NEW to correct overflow
|
924
|
+
# 2009-10-05 21:34
|
925
|
+
# when resizing columns a renderer can go outside the table bounds
|
926
|
+
# so printing should be done by parent not window
|
927
|
+
def printstring(r,c,string, color, att)
|
928
|
+
# 3 is table borders
|
929
|
+
# if renderer trying to print outside don't let it
|
930
|
+
if c > @col+@width-3
|
931
|
+
return
|
932
|
+
end
|
933
|
+
# if date exceeds boundary truncate
|
934
|
+
if c+string.length > (@col+@width)-3
|
935
|
+
len = string.length-((c+string.length)-(@col+@width-3))
|
936
|
+
@graphic.printstring(r,c,string[0..len], color,att)
|
937
|
+
else
|
938
|
+
@graphic.printstring(r,c,string, color,att)
|
939
|
+
end
|
850
940
|
end
|
851
941
|
def print_border g
|
852
942
|
return unless @table_changed
|
853
|
-
g.print_border @row, @col, @height, @width, $datacolor
|
943
|
+
g.print_border @row, @col, @height-1, @width, $datacolor
|
854
944
|
return if @table_model.nil?
|
855
945
|
rc = @table_model.row_count
|
856
946
|
h = scrollatrow()
|
@@ -859,19 +949,21 @@ module RubyCurses
|
|
859
949
|
# private
|
860
950
|
def _print_more_data_marker tf
|
861
951
|
marker = tf ? Ncurses::ACS_CKBOARD : Ncurses::ACS_VLINE
|
862
|
-
@
|
952
|
+
@graphic.mvwaddch @row+@height-2, @col+@width-1, marker
|
863
953
|
marker = @toprow > 0 ? Ncurses::ACS_CKBOARD : Ncurses::ACS_VLINE
|
864
|
-
@
|
954
|
+
@graphic.mvwaddch @row+1, @col+@width-1, marker
|
865
955
|
end
|
866
956
|
def _print_more_columns_marker tf
|
867
957
|
marker = tf ? Ncurses::ACS_CKBOARD : Ncurses::ACS_HLINE
|
868
|
-
@
|
958
|
+
@graphic.mvwaddch @row+@height-1, @col+@width-2, marker
|
869
959
|
# show if columns to left or not
|
870
960
|
marker = @_first_column_print > 0 ? Ncurses::ACS_CKBOARD : Ncurses::ACS_HLINE
|
871
|
-
@
|
961
|
+
@graphic.mvwaddch @row+@height-1, @col+@_first_column_print+1, marker
|
872
962
|
end
|
873
963
|
def print_header
|
874
964
|
return unless @table_changed
|
965
|
+
$log.debug " TABLE: inside printheader 2009-10-07 11:51 DDD "
|
966
|
+
|
875
967
|
r,c = rowcol
|
876
968
|
header_model = @table_header.table_column_model
|
877
969
|
tcm = @table_column_model ## could have been overridden, should we use this at all
|
@@ -897,10 +989,14 @@ module RubyCurses
|
|
897
989
|
renderer.display_length space_left
|
898
990
|
end
|
899
991
|
#$log.debug " TABLE BREAKING SINCE sl: #{space_left},#{crow},#{colix}: #{clen} "
|
900
|
-
|
992
|
+
# passing self so can prevent renderer from printing outside 2009-10-05 22:56
|
993
|
+
#renderer.repaint @graphic, r, c+(offset), 0, content[0..clen], false, false
|
994
|
+
renderer.repaint self, r, c+(offset), 0, content[0..clen], false, false
|
901
995
|
break
|
902
996
|
end
|
903
|
-
renderer
|
997
|
+
# passing self so can prevent renderer from printing outside 2009-10-05 22:56
|
998
|
+
#renderer.repaint @graphic, r, c+(offset),0, content, false, false
|
999
|
+
renderer.repaint self, r, c+(offset),0, content, false, false
|
904
1000
|
offset += width
|
905
1001
|
end
|
906
1002
|
end
|
@@ -953,6 +1049,7 @@ module RubyCurses
|
|
953
1049
|
cc = @table_model.column_count
|
954
1050
|
if @_first_column_print < cc-1
|
955
1051
|
@_first_column_print += 1
|
1052
|
+
@_last_column_print += 1 if @_last_column_print < cc-1
|
956
1053
|
@current_column = @_first_column_print
|
957
1054
|
set_form_col # FIXME not looking too good till key press
|
958
1055
|
@repaint_required = true
|
@@ -1039,6 +1136,35 @@ module RubyCurses
|
|
1039
1136
|
end
|
1040
1137
|
table_structure_changed(nil)
|
1041
1138
|
end
|
1139
|
+
def size_columns_to_fit
|
1140
|
+
delta = @width - table_column_model().get_total_column_width()
|
1141
|
+
tcw = table_column_model().get_total_column_width()
|
1142
|
+
|
1143
|
+
$log.debug "size_columns_to_fit D #{delta}, W #{@width}, TCW #{tcw}"
|
1144
|
+
accomodate_delta(delta) if delta != 0
|
1145
|
+
#set_width_from_preferred_widths
|
1146
|
+
end
|
1147
|
+
private
|
1148
|
+
def accomodate_delta delta
|
1149
|
+
tcm = @table_column_model
|
1150
|
+
cc = tcm.column_count
|
1151
|
+
average = (delta/cc).ceil
|
1152
|
+
total = 0
|
1153
|
+
tcm.each do |col|
|
1154
|
+
oldcw = col.width + average
|
1155
|
+
next if oldcw < col.min_width or oldcw > col.max_width
|
1156
|
+
if delta >0
|
1157
|
+
break if total > delta
|
1158
|
+
else
|
1159
|
+
break if total < delta
|
1160
|
+
end
|
1161
|
+
col.width oldcw
|
1162
|
+
total += average
|
1163
|
+
end
|
1164
|
+
$log.debug "accomodate_delta: #{average}. #{total}"
|
1165
|
+
table_structure_changed(nil)
|
1166
|
+
end
|
1167
|
+
|
1042
1168
|
# ADD METHODS HERE
|
1043
1169
|
end # class Table
|
1044
1170
|
|
@@ -1047,6 +1173,9 @@ module RubyCurses
|
|
1047
1173
|
# TODO - can't change width beyond min and max if set
|
1048
1174
|
# resizable - user can't resize but programatically can
|
1049
1175
|
# model_index
|
1176
|
+
# XXX Seems we are not using min_width and max_width.
|
1177
|
+
# min should be used for when resizing,, max should not be used. we are using width which is
|
1178
|
+
# updated as changed
|
1050
1179
|
class TableColumn
|
1051
1180
|
include RubyCurses::EventHandler # 2009-01-15 22:49
|
1052
1181
|
attr_reader :identifier
|
@@ -1056,7 +1185,8 @@ module RubyCurses
|
|
1056
1185
|
# user may override or set for this column, else headers default will be used
|
1057
1186
|
attr_accessor :header_renderer
|
1058
1187
|
dsl_property :header_value
|
1059
|
-
dsl_property :width
|
1188
|
+
dsl_property :width # XXX don;t let user set width later, should be readonly
|
1189
|
+
dsl_property :preferred_width # user should use this when requesting a change
|
1060
1190
|
# some columns may not be editable. e.g in a Finder, file size or time not editable
|
1061
1191
|
# whereas name is.
|
1062
1192
|
|
@@ -1069,8 +1199,13 @@ module RubyCurses
|
|
1069
1199
|
dsl_accessor :edit_length # corresponds to maxlen, if not set, col width will be useda 2009-02-16 21:55
|
1070
1200
|
|
1071
1201
|
|
1202
|
+
# width is used as initial and preferred width. It has actual value at any time
|
1203
|
+
# width must never be directly set, use preferred width later
|
1072
1204
|
def initialize model_index, identifier, header_value, width, config={}, &block
|
1073
1205
|
@width = width
|
1206
|
+
@preferred_width = width
|
1207
|
+
@min_width = 4
|
1208
|
+
@max_width = 1000
|
1074
1209
|
@model_index = model_index
|
1075
1210
|
@identifier = identifier
|
1076
1211
|
@header_value = header_value
|
@@ -1106,7 +1241,7 @@ module RubyCurses
|
|
1106
1241
|
nil
|
1107
1242
|
end
|
1108
1243
|
def total_column_width
|
1109
|
-
|
1244
|
+
-1
|
1110
1245
|
end
|
1111
1246
|
def get_selection_model
|
1112
1247
|
nil
|
@@ -1134,6 +1269,7 @@ module RubyCurses
|
|
1134
1269
|
# takes a column names array
|
1135
1270
|
def initialize cols=[]
|
1136
1271
|
@columns = []
|
1272
|
+
@total_column_width= -1
|
1137
1273
|
##cols.each_with_index {|c, index| @columns << TableColumn.new(index, c, c, 10) }
|
1138
1274
|
cols.each_with_index {|c, index| add_column(TableColumn.new(index, c, c, 10)) }
|
1139
1275
|
@selected_columns = []
|
@@ -1162,8 +1298,16 @@ module RubyCurses
|
|
1162
1298
|
def clear_selection
|
1163
1299
|
@selected_columns = []
|
1164
1300
|
end
|
1165
|
-
|
1166
|
-
|
1301
|
+
##
|
1302
|
+
# added 2009-10-07 23:04
|
1303
|
+
def get_total_column_width
|
1304
|
+
@total_column_width = -1 # XXX
|
1305
|
+
if @total_column_width == -1
|
1306
|
+
total = 0
|
1307
|
+
each { |c| total += c.width ; $log.debug "get_total_column_width: #{c.width}"}
|
1308
|
+
@total_column_width = total
|
1309
|
+
end
|
1310
|
+
return @total_column_width
|
1167
1311
|
end
|
1168
1312
|
def set_selection_model lsm
|
1169
1313
|
@column_selection_model = lsm
|
@@ -1218,6 +1362,8 @@ module RubyCurses
|
|
1218
1362
|
end
|
1219
1363
|
def get_value_at row, col
|
1220
1364
|
end
|
1365
|
+
def get_total_column_width
|
1366
|
+
end
|
1221
1367
|
=begin
|
1222
1368
|
def << obj
|
1223
1369
|
end
|
@@ -1241,7 +1387,9 @@ module RubyCurses
|
|
1241
1387
|
@column_identifiers = colnames_array
|
1242
1388
|
end
|
1243
1389
|
def column_count
|
1244
|
-
|
1390
|
+
# 2010-01-12 19:35 changed count to size since size is supported in 1.8.6 also
|
1391
|
+
#@column_identifiers.count
|
1392
|
+
@column_identifiers.size
|
1245
1393
|
end
|
1246
1394
|
def row_count
|
1247
1395
|
@data.length
|
@@ -1412,7 +1560,8 @@ module RubyCurses
|
|
1412
1560
|
end
|
1413
1561
|
end # class DefaultListSelectionModel
|
1414
1562
|
##
|
1415
|
-
#
|
1563
|
+
# Class that manages Table's Header
|
1564
|
+
# are we not taking events such as column added, removed ?
|
1416
1565
|
class TableHeader
|
1417
1566
|
attr_accessor :default_renderer
|
1418
1567
|
attr_accessor :table_column_model
|
@@ -1425,7 +1574,14 @@ module RubyCurses
|
|
1425
1574
|
@default_renderer = TableCellRenderer.new "", {"display_length" => 10, "justify" => :center, "color"=>"white", "bgcolor"=>"blue"}
|
1426
1575
|
end
|
1427
1576
|
|
1428
|
-
|
1577
|
+
# added 2009-10-07 14:03
|
1578
|
+
# returns the column being resized
|
1579
|
+
# @returns TableColumn
|
1580
|
+
# @protected
|
1581
|
+
def get_resizing_column
|
1582
|
+
end
|
1583
|
+
|
1584
|
+
end # class TableHeader
|
1429
1585
|
##
|
1430
1586
|
# When an event is fired by TableModel, contents are changed, then this object will be passed
|
1431
1587
|
# to trigger
|