rkumar-rbcurse 0.1.0
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 +1577 -0
- data/README.txt +310 -0
- data/examples/qdfilechooser.rb +68 -0
- data/examples/rfe.rb +853 -0
- data/examples/rfe_renderer.rb +69 -0
- data/examples/test1.rb +242 -0
- data/examples/test2.rb +498 -0
- data/examples/testcombo.rb +95 -0
- data/examples/testkeypress.rb +61 -0
- data/examples/testmenu.rb +105 -0
- data/examples/testtable.rb +266 -0
- data/examples/testtabp.rb +106 -0
- data/examples/testtodo.rb +532 -0
- data/examples/viewtodo.rb +512 -0
- data/lib/rbcurse.rb +7 -0
- data/lib/rbcurse/action.rb +31 -0
- data/lib/rbcurse/applicationheader.rb +57 -0
- data/lib/rbcurse/celleditor.rb +120 -0
- data/lib/rbcurse/checkboxcellrenderer.rb +69 -0
- data/lib/rbcurse/colormap.rb +133 -0
- data/lib/rbcurse/comboboxcellrenderer.rb +45 -0
- data/lib/rbcurse/defaultlistselectionmodel.rb +49 -0
- data/lib/rbcurse/keylabelprinter.rb +143 -0
- data/lib/rbcurse/listcellrenderer.rb +99 -0
- data/lib/rbcurse/listkeys.rb +33 -0
- data/lib/rbcurse/listscrollable.rb +216 -0
- data/lib/rbcurse/listselectable.rb +67 -0
- data/lib/rbcurse/mapper.rb +108 -0
- data/lib/rbcurse/orderedhash.rb +77 -0
- data/lib/rbcurse/rcombo.rb +243 -0
- data/lib/rbcurse/rdialogs.rb +183 -0
- data/lib/rbcurse/rform.rb +845 -0
- data/lib/rbcurse/rinputdataevent.rb +36 -0
- data/lib/rbcurse/rlistbox.rb +804 -0
- data/lib/rbcurse/rmenu.rb +666 -0
- data/lib/rbcurse/rmessagebox.rb +325 -0
- data/lib/rbcurse/rpopupmenu.rb +754 -0
- data/lib/rbcurse/rtabbedpane.rb +259 -0
- data/lib/rbcurse/rtable.rb +1296 -0
- data/lib/rbcurse/rtextarea.rb +673 -0
- data/lib/rbcurse/rtextview.rb +335 -0
- data/lib/rbcurse/rwidget.rb +1731 -0
- data/lib/rbcurse/scrollable.rb +301 -0
- data/lib/rbcurse/selectable.rb +94 -0
- data/lib/rbcurse/table/tablecellrenderer.rb +85 -0
- data/lib/rbcurse/table/tabledatecellrenderer.rb +102 -0
- data/lib/ver/keyboard.rb +150 -0
- data/lib/ver/keyboard2.rb +170 -0
- data/lib/ver/ncurses.rb +102 -0
- data/lib/ver/window.rb +369 -0
- data/test/test_rbcurse.rb +0 -0
- metadata +117 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
#$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
|
2
|
+
require 'rubygems'
|
3
|
+
require 'ncurses'
|
4
|
+
require 'logger'
|
5
|
+
#require 'lib/rbcurse/mapper'
|
6
|
+
#require 'lib/rbcurse/keylabelprinter'
|
7
|
+
#require 'lib/rbcurse/commonio'
|
8
|
+
#require 'lib/rbcurse/rwidget'
|
9
|
+
#require 'lib/rbcurse/rform'
|
10
|
+
require 'rbcurse/rcombo'
|
11
|
+
if $0 == __FILE__
|
12
|
+
include RubyCurses
|
13
|
+
|
14
|
+
begin
|
15
|
+
# Initialize curses
|
16
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
17
|
+
$log = Logger.new("view.log")
|
18
|
+
$log.level = Logger::DEBUG
|
19
|
+
|
20
|
+
@window = VER::Window.root_window
|
21
|
+
# Initialize few color pairs
|
22
|
+
# Create the window to be associated with the form
|
23
|
+
# Un post form and free the memory
|
24
|
+
|
25
|
+
catch(:close) do
|
26
|
+
colors = Ncurses.COLORS
|
27
|
+
$log.debug "START #{colors} colors ---------"
|
28
|
+
@form = Form.new @window
|
29
|
+
r = 1; c = 30;
|
30
|
+
mylist = []
|
31
|
+
0.upto(100) { |i| mylist << i.to_s }
|
32
|
+
combo = ComboBox.new @form do
|
33
|
+
name "combo"
|
34
|
+
row r
|
35
|
+
col c
|
36
|
+
bgcolor 'magenta'
|
37
|
+
display_length 10
|
38
|
+
editable false
|
39
|
+
list mylist
|
40
|
+
set_label Label.new @form, {'text' => "Non-edit Combo"}
|
41
|
+
list_config 'color' => 'yellow', 'bgcolor'=>'magenta', 'max_visible_items' => 6
|
42
|
+
end
|
43
|
+
r+=1
|
44
|
+
$results = Variable.new
|
45
|
+
$results.value = "Event:"
|
46
|
+
status = RubyCurses::Label.new @form, {'text_variable' => $results, "row" => 22, "col" => 2}
|
47
|
+
# since updated from another window, so explicit repaint required
|
48
|
+
$results.update_command { status.repaint }
|
49
|
+
|
50
|
+
v_positions = [:BELOW, :SAME, :CENTER, :CENTER, :ABOVE, :ABOVE]
|
51
|
+
#h_positions = [:SAME, :LEFT, :RIGHT, :SAME, :SAME, :ABOVE]
|
52
|
+
policies = [:NO_INSERT, :INSERT_AT_TOP, :INSERT_AT_BOTTOM,
|
53
|
+
:INSERT_AT_CURRENT, :INSERT_BEFORE_CURRENT, :INSERT_AFTER_CURRENT]
|
54
|
+
policies.each_with_index do |policy, ix|
|
55
|
+
name="combo#{r}"
|
56
|
+
list = ListDataModel.new( %w[spotty tiger secret pass torvalds qwerty quail toiletry])
|
57
|
+
list.bind(:LIST_DATA_EVENT, name) { |lde,n| $results.value = lde.to_s[0,70]; $log.debug " STA: #{$results} #{lde}" }
|
58
|
+
list.bind(:ENTER_ROW, name) { |obj,n| $results.value = "ENTER_ROW :#{obj.current_index} : #{obj.selected_item} "; $log.debug " ENTER_ROW: #{$results.value} , #{obj}" }
|
59
|
+
ComboBox.new @form do
|
60
|
+
name name
|
61
|
+
row r
|
62
|
+
col 30
|
63
|
+
display_length 10
|
64
|
+
bgcolor 'cyan'
|
65
|
+
editable true
|
66
|
+
#list %w[spotty tiger secret pass torvalds qwerty quail toiletry]
|
67
|
+
list_data_model list
|
68
|
+
insert_policy policy
|
69
|
+
set_label Label.new @form, {'text' => "Combo: "+policy.to_s}
|
70
|
+
list_config 'color' => 'white', 'bgcolor'=>'blue', 'valign' => v_positions[ix]
|
71
|
+
end
|
72
|
+
r+=2
|
73
|
+
end
|
74
|
+
|
75
|
+
@help = "Use UP and DOWN to navigate values, alt-DOWN for popup, TAB / BACKTAB between fields. F1-quit"
|
76
|
+
RubyCurses::Label.new @form, {'text' => @help, "row" => 21, "col" => 2, "color" => "yellow"}
|
77
|
+
|
78
|
+
@form.repaint
|
79
|
+
@window.wrefresh
|
80
|
+
Ncurses::Panel.update_panels
|
81
|
+
while((ch = @window.getchar()) != KEY_F1 )
|
82
|
+
@form.handle_key(ch)
|
83
|
+
@window.wrefresh
|
84
|
+
end
|
85
|
+
end
|
86
|
+
rescue => ex
|
87
|
+
ensure
|
88
|
+
@window.destroy if !@window.nil?
|
89
|
+
VER::stop_ncurses
|
90
|
+
p ex if ex
|
91
|
+
p(ex.backtrace.join("\n")) if ex
|
92
|
+
$log.debug( ex) if ex
|
93
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
|
2
|
+
require 'rubygems'
|
3
|
+
require 'ncurses'
|
4
|
+
require 'logger'
|
5
|
+
#require 'lib/ver/keyboard'
|
6
|
+
require 'rbcurse'
|
7
|
+
require 'rbcurse/rtextarea'
|
8
|
+
if $0 == __FILE__
|
9
|
+
include RubyCurses
|
10
|
+
include RubyCurses::Utils
|
11
|
+
|
12
|
+
begin
|
13
|
+
# Initialize curses
|
14
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
15
|
+
$log = Logger.new("view.log")
|
16
|
+
$log.level = Logger::DEBUG
|
17
|
+
|
18
|
+
@window = VER::Window.root_window
|
19
|
+
|
20
|
+
catch(:close) do
|
21
|
+
colors = Ncurses.COLORS
|
22
|
+
$log.debug "START #{colors} colors ---------"
|
23
|
+
@form = Form.new @window
|
24
|
+
r = 1; c = 30;
|
25
|
+
|
26
|
+
texta = TextArea.new @form do
|
27
|
+
name "mytext"
|
28
|
+
row r
|
29
|
+
col c
|
30
|
+
width 60
|
31
|
+
height 15
|
32
|
+
editable false
|
33
|
+
focusable false
|
34
|
+
title "Keypresses"
|
35
|
+
auto_scroll true
|
36
|
+
title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
|
37
|
+
end
|
38
|
+
@help = "q to quit. Use any key of key combination to see what's caught. Check logger too"
|
39
|
+
RubyCurses::Label.new @form, {'text' => @help, "row" => 21, "col" => 2, "color" => "yellow"}
|
40
|
+
|
41
|
+
@form.repaint
|
42
|
+
@window.wrefresh
|
43
|
+
Ncurses::Panel.update_panels
|
44
|
+
while((ch = @window.getchar()) != ?q )
|
45
|
+
str = keycode_tos ch
|
46
|
+
texta << "#{ch} got (#{str})"
|
47
|
+
texta.repaint
|
48
|
+
@form.handle_key(ch)
|
49
|
+
@window.wrefresh
|
50
|
+
end
|
51
|
+
end
|
52
|
+
rescue => ex
|
53
|
+
ensure
|
54
|
+
@window.destroy if !@window.nil?
|
55
|
+
VER::stop_ncurses
|
56
|
+
p ex if ex
|
57
|
+
p(ex.backtrace.join("\n")) if ex
|
58
|
+
$log.debug( ex) if ex
|
59
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
|
2
|
+
# this program tests out various widgets.
|
3
|
+
require 'rubygems'
|
4
|
+
require 'ncurses'
|
5
|
+
require 'logger'
|
6
|
+
require 'rbcurse'
|
7
|
+
#require 'lib/rbcurse/rform'
|
8
|
+
require 'rbcurse/rpopupmenu'
|
9
|
+
if $0 == __FILE__
|
10
|
+
include RubyCurses
|
11
|
+
|
12
|
+
begin
|
13
|
+
# Initialize curses
|
14
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
15
|
+
$log = Logger.new("view.log")
|
16
|
+
$log.level = Logger::DEBUG
|
17
|
+
|
18
|
+
@window = VER::Window.root_window
|
19
|
+
# Initialize few color pairs
|
20
|
+
# Create the window to be associated with the form
|
21
|
+
# Un post form and free the memory
|
22
|
+
|
23
|
+
catch(:close) do
|
24
|
+
colors = Ncurses.COLORS
|
25
|
+
$log.debug "START #{colors} colors #{$datacolor} ---------"
|
26
|
+
@form = Form.new @window
|
27
|
+
@form.window.printstring 0, 25, "Demo of Ruby Curses PopupMenu", $normalcolor, 'reverse'
|
28
|
+
r = 1; fc = 12;
|
29
|
+
row = 10; col = 10
|
30
|
+
colorlabel = Label.new @form, {'text' => "A label:", "row" => row, "col" => col, "color"=>"cyan", "mnemonic" => 'A'}
|
31
|
+
|
32
|
+
#@mb = RubyCurses::MenuBar.new
|
33
|
+
#filemenu = RubyCurses::Menu.new "File"
|
34
|
+
filemenu = RubyCurses::PopupMenu.new "File"
|
35
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Open",'O'))
|
36
|
+
|
37
|
+
filemenu.insert_separator 1
|
38
|
+
filemenu.add(RubyCurses::MenuItem.new "New",'N')
|
39
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Save",'S'))
|
40
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Test",'T'))
|
41
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Wrap Text",'W'))
|
42
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Exit",'X'))
|
43
|
+
item.command() {
|
44
|
+
#throw(:menubarclose);
|
45
|
+
throw(:close)
|
46
|
+
}
|
47
|
+
item = RubyCurses::CheckBoxMenuItem.new "Reverse"
|
48
|
+
#filemenu.create_window
|
49
|
+
# item.onvalue="On"
|
50
|
+
# item.offvalue="Off"
|
51
|
+
#item.checkbox.text "Labelcb"
|
52
|
+
#item.text="Labelcb"
|
53
|
+
# in next line, an explicit repaint is required since label is on another form.
|
54
|
+
#item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' : nil; label.attr(att); label.repaint}
|
55
|
+
|
56
|
+
|
57
|
+
filemenu.add(item)
|
58
|
+
#@mb.add(filemenu)
|
59
|
+
editmenu = RubyCurses::Menu.new "Edit"
|
60
|
+
item = RubyCurses::MenuItem.new "Cut"
|
61
|
+
editmenu.add(item)
|
62
|
+
item.accelerator = "Ctrl-X"
|
63
|
+
item=RubyCurses::MenuItem.new "Copy"
|
64
|
+
editmenu.add(item)
|
65
|
+
item.accelerator = "Ctrl-C"
|
66
|
+
item=RubyCurses::MenuItem.new "Paste"
|
67
|
+
editmenu.add(item)
|
68
|
+
item.accelerator = "Ctrl-V"
|
69
|
+
#@mb.add(editmenu)
|
70
|
+
#@mb.add(
|
71
|
+
menu=RubyCurses::Menu.new("Others")
|
72
|
+
filemenu.add(menu)
|
73
|
+
#item=RubyCurses::MenuItem.new "Save","S"
|
74
|
+
item = RubyCurses::MenuItem.new "Config"
|
75
|
+
menu.add(item)
|
76
|
+
item = RubyCurses::MenuItem.new "Tables"
|
77
|
+
menu.add(item)
|
78
|
+
savemenu = RubyCurses::Menu.new "EditM"
|
79
|
+
item = RubyCurses::MenuItem.new "CutM"
|
80
|
+
savemenu.add(item)
|
81
|
+
item = RubyCurses::MenuItem.new "DeleteM"
|
82
|
+
savemenu.add(item)
|
83
|
+
item = RubyCurses::MenuItem.new "PasteM"
|
84
|
+
savemenu.add(item)
|
85
|
+
menu.add(savemenu)
|
86
|
+
# 2008-12-20 13:06 no longer hardcoding toggle key of menu_bar.
|
87
|
+
#@mb.toggle_key = KEY_F2
|
88
|
+
#@form.set_menu_bar @mb
|
89
|
+
#@cell = CellRenderer.new "Hello", {"col" => 1, "row"=>29, "justify"=>:right, "display_length" => 30}
|
90
|
+
# END
|
91
|
+
@form.repaint
|
92
|
+
filemenu.show colorlabel, 0,1
|
93
|
+
@window.wrefresh
|
94
|
+
Ncurses::Panel.update_panels
|
95
|
+
end
|
96
|
+
rescue => ex
|
97
|
+
ensure
|
98
|
+
@window.destroy if !@window.nil?
|
99
|
+
VER::stop_ncurses
|
100
|
+
p ex if ex
|
101
|
+
p(ex.backtrace.join("\n")) if ex
|
102
|
+
$log.debug( ex) if ex
|
103
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,266 @@
|
|
1
|
+
#$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
|
2
|
+
require 'rubygems'
|
3
|
+
require 'ncurses'
|
4
|
+
require 'logger'
|
5
|
+
#require 'ver/keyboard'
|
6
|
+
require 'rbcurse'
|
7
|
+
require 'rbcurse/rcombo'
|
8
|
+
require 'rbcurse/rtable'
|
9
|
+
require 'rbcurse/celleditor'
|
10
|
+
#require 'rbcurse/table/tablecellrenderer'
|
11
|
+
require 'rbcurse/comboboxcellrenderer'
|
12
|
+
require 'rbcurse/action'
|
13
|
+
|
14
|
+
##
|
15
|
+
# a renderer which paints alternate lines with
|
16
|
+
# another color, for people with poor taste.
|
17
|
+
class MyRenderer < TableCellRenderer
|
18
|
+
def initialize text="", config={}, &block
|
19
|
+
super
|
20
|
+
@orig_bgcolor = @bgcolor
|
21
|
+
@orig_color = @color
|
22
|
+
end
|
23
|
+
def repaint graphic, r=@row,c=@col, value=@text, focussed=false, selected=false
|
24
|
+
@bgcolor = @orig_bgcolor
|
25
|
+
@color = @orig_color
|
26
|
+
if !focussed and !selected
|
27
|
+
@bgcolor = r % 2 == 0 ? "green" : @orig_bgcolor
|
28
|
+
@color = r % 2 == 0 ? "black" : @orig_color
|
29
|
+
end
|
30
|
+
super
|
31
|
+
end
|
32
|
+
end
|
33
|
+
if $0 == __FILE__
|
34
|
+
include RubyCurses
|
35
|
+
include RubyCurses::Utils
|
36
|
+
|
37
|
+
begin
|
38
|
+
# Initialize curses
|
39
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
40
|
+
$log = Logger.new("view.log")
|
41
|
+
$log.level = Logger::DEBUG
|
42
|
+
|
43
|
+
@window = VER::Window.root_window
|
44
|
+
|
45
|
+
catch(:close) do
|
46
|
+
colors = Ncurses.COLORS
|
47
|
+
$log.debug "START #{colors} colors ---------"
|
48
|
+
@form = Form.new @window
|
49
|
+
@window.printstring 0,30,"Demo of Ruby Curses Table: Edit, Resize, Insert, Move, Delete Row/Col", $datacolor
|
50
|
+
r = 1; c = 30;
|
51
|
+
data = [["You're beautiful",3,"James Blunt",3.21, true, "WIP"],
|
52
|
+
["Where are you",3,"London Beat",3.47, true, "WIP"],
|
53
|
+
["I'll always love my mama",92,"Intruders",412, true, "Fin"],
|
54
|
+
["I believe in love",4,"Paula Cole",110.0, false, "Cancel"],
|
55
|
+
["Red Sky at night",4,"Dave Gilmour",102.72, false, "Postp"],
|
56
|
+
["Midnight and you",8,"Barry White",12.72, false, "Todo"],
|
57
|
+
["Let the music play",9,"Barry White",12.2, false, "WIP"],
|
58
|
+
["I swear",nil,"Boyz II Men",112.7, true, "Cancel"],
|
59
|
+
["Believe",9,"Elton John",12.2, false, "Todo"],
|
60
|
+
["Private Dancer",9,"Tina Turner",12.2, false, "Todo"],
|
61
|
+
["Liberian Girl",9,"Michael Jackson",12.2, false, "Todo"],
|
62
|
+
["Like a prayer",163,"Charlotte Perrelli",5.4, false, "WIP"]]
|
63
|
+
|
64
|
+
colnames = %w[ Song Cat Artist Ratio Flag Status]
|
65
|
+
statuses = ["Todo", "WIP", "Fin", "Cancel", "Postp"]
|
66
|
+
|
67
|
+
texta = Table.new @form do
|
68
|
+
name "mytext"
|
69
|
+
row r
|
70
|
+
col c
|
71
|
+
width 78
|
72
|
+
height 15
|
73
|
+
#title "A Table"
|
74
|
+
#title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
|
75
|
+
cell_editing_allowed true
|
76
|
+
editing_policy :EDITING_AUTO
|
77
|
+
set_data data, colnames
|
78
|
+
end
|
79
|
+
sel_col = Variable.new 0
|
80
|
+
sel_col.value = 0
|
81
|
+
tcm = texta.get_table_column_model
|
82
|
+
selcolname = texta.get_column_name sel_col.value
|
83
|
+
#
|
84
|
+
## key bindings fo texta
|
85
|
+
# column widths
|
86
|
+
$log.debug " tcm #{tcm.inspect}"
|
87
|
+
$log.debug " tcms #{tcm.columns}"
|
88
|
+
$log.debug " tcm0 #{tcm.column(0).identifier}"
|
89
|
+
$log.debug " tcm0 #{tcm.column(0).width}"
|
90
|
+
tcm.column(0).width 24
|
91
|
+
tcm.column(1).width 5
|
92
|
+
tcm.column(2).width 18
|
93
|
+
#tcm.column(2).editable false
|
94
|
+
tcm.column(3).width 7
|
95
|
+
tcm.column(4).width 5
|
96
|
+
tcm.column(5).width 8
|
97
|
+
texta.configure() do
|
98
|
+
bind_key(330) { texta.remove_column(tcm.column(texta.focussed_col)) rescue "" }
|
99
|
+
bind_key(?+) {
|
100
|
+
acolumn = texta.get_column selcolname
|
101
|
+
w = acolumn.width + 1
|
102
|
+
acolumn.width w
|
103
|
+
#texta.table_structure_changed
|
104
|
+
}
|
105
|
+
bind_key(?-) {
|
106
|
+
acolumn = texta.get_column selcolname
|
107
|
+
w = acolumn.width - 1
|
108
|
+
if w > 3
|
109
|
+
acolumn.width w
|
110
|
+
#texta.table_structure_changed
|
111
|
+
end
|
112
|
+
}
|
113
|
+
bind_key(?>) {
|
114
|
+
colcount = tcm.column_count-1
|
115
|
+
#texta.move_column sel_col.value, sel_col.value+1 unless sel_col.value == colcount
|
116
|
+
col = texta.focussed_col
|
117
|
+
texta.move_column col, col+1 unless col == colcount
|
118
|
+
}
|
119
|
+
bind_key(?<) {
|
120
|
+
col = texta.focussed_col
|
121
|
+
texta.move_column col, col-1 unless col == 0
|
122
|
+
#texta.move_column sel_col.value, sel_col.value-1 unless sel_col.value == 0
|
123
|
+
}
|
124
|
+
#bind_key(KEY_RIGHT) { sel_col.value = sel_col.value+1; current_column sel_col.value}
|
125
|
+
#bind_key(KEY_LEFT) { sel_col.value = sel_col.value-1;current_column sel_col.value}
|
126
|
+
end
|
127
|
+
keylabel = RubyCurses::Label.new @form, {'text' => "", "row" => r+16, "col" => c, "color" => "yellow", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
|
128
|
+
eventlabel = RubyCurses::Label.new @form, {'text' => "Events:", "row" => r+19, "col" => c, "color" => "white", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
|
129
|
+
|
130
|
+
# report some events
|
131
|
+
texta.table_model.bind(:TABLE_MODEL_EVENT){|e| eventlabel.text = "Event: #{e}"}
|
132
|
+
texta.get_table_column_model.bind(:TABLE_COLUMN_MODEL_EVENT){|e| eventlabel.text = "Event: #{e}"}
|
133
|
+
texta.bind(:TABLE_TRAVERSAL_EVENT){|e| eventlabel.text = "Event: #{e}"}
|
134
|
+
|
135
|
+
@help = "C-q to quit. M-Tab (next col) C-n (Pg Dn), C-p (Pg Up), M-0 Top, M-9 End, C-x (select). Columns:- Narrow, + expand, > < switch"
|
136
|
+
RubyCurses::Label.new @form, {'text' => @help, "row" => Ncurses.LINES-3, "col" => 2, "color" => "yellow", "height"=>2}
|
137
|
+
|
138
|
+
str_renderer = TableCellRenderer.new ""
|
139
|
+
num_renderer = TableCellRenderer.new "", { "justify" => :right }
|
140
|
+
bool_renderer = CheckBoxCellRenderer.new "", {"parent" => texta, "display_length"=>5}
|
141
|
+
combo_renderer = RubyCurses::ComboBoxCellRenderer.new nil, {"parent" => texta, "display_length"=> 8}
|
142
|
+
combo_editor = RubyCurses::CellEditor.new(RubyCurses::ComboBox.new nil, {"focusable"=>false, "visible"=>false, "list"=>statuses, "display_length"=>8})
|
143
|
+
texta.set_default_cell_renderer_for_class "String", str_renderer
|
144
|
+
texta.set_default_cell_renderer_for_class "Fixnum", num_renderer
|
145
|
+
texta.set_default_cell_renderer_for_class "Float", num_renderer
|
146
|
+
texta.set_default_cell_renderer_for_class "TrueClass", bool_renderer
|
147
|
+
texta.set_default_cell_renderer_for_class "FalseClass", bool_renderer
|
148
|
+
texta.get_table_column_model.column(5).cell_editor = combo_editor
|
149
|
+
=begin
|
150
|
+
field = Field.new @form do
|
151
|
+
name "value"
|
152
|
+
row r+18
|
153
|
+
col c
|
154
|
+
display_length 30
|
155
|
+
bgcolor "cyan"
|
156
|
+
set_label Label.new @form, {'text' => "Value", 'mnemonic'=> 'V'}
|
157
|
+
# bind :ENTER do $editing = true end
|
158
|
+
# bind :LEAVE do $editing = false end
|
159
|
+
end
|
160
|
+
=end
|
161
|
+
buttrow = r+21 #Ncurses.LINES-4
|
162
|
+
b_newrow = Button.new @form do
|
163
|
+
text "&New"
|
164
|
+
row buttrow
|
165
|
+
col c
|
166
|
+
bind(:ENTER) { eventlabel.text "New button adds a new row at the bottom " }
|
167
|
+
end
|
168
|
+
tm = texta.table_model
|
169
|
+
b_newrow.command {
|
170
|
+
cc = texta.get_table_column_model.column_count
|
171
|
+
# need to get datatypes etc, this is just a junk test
|
172
|
+
tmp=[]
|
173
|
+
#0.upto(cc-1) { tmp << "" }
|
174
|
+
0.upto(cc-1) { tmp << nil }
|
175
|
+
tm << tmp
|
176
|
+
#texta.table_data_changed
|
177
|
+
keylabel.text = "Added a row"
|
178
|
+
alert("Added a row at bottom of table")
|
179
|
+
|
180
|
+
}
|
181
|
+
|
182
|
+
# using ampersand to set mnemonic
|
183
|
+
b_delrow = Button.new @form do
|
184
|
+
text "&Delete"
|
185
|
+
row buttrow
|
186
|
+
col c+10
|
187
|
+
bind(:ENTER) { eventlabel.text "Deletes focussed row" }
|
188
|
+
end
|
189
|
+
b_delrow.command { |form|
|
190
|
+
row = texta.focussed_row
|
191
|
+
if confirm("Do your really want to delete row #{row}?")== :YES
|
192
|
+
tm.delete_at row
|
193
|
+
#texta.table_data_changed
|
194
|
+
else
|
195
|
+
#$message.value = "Quit aborted"
|
196
|
+
end
|
197
|
+
}
|
198
|
+
b_change = Button.new @form do
|
199
|
+
text "&Lock"
|
200
|
+
row buttrow
|
201
|
+
col c+20
|
202
|
+
command {
|
203
|
+
r = texta.focussed_row
|
204
|
+
c = sel_col.value
|
205
|
+
#$log.debug " Update gets #{field.getvalue.class}"
|
206
|
+
#texta.set_value_at(r, c, field.getvalue)
|
207
|
+
toggle = texta.column(texta.focussed_col()).editable
|
208
|
+
if toggle.nil? or toggle==true
|
209
|
+
toggle = false
|
210
|
+
text "Un&lock"
|
211
|
+
else
|
212
|
+
toggle = true
|
213
|
+
text "&Lock "
|
214
|
+
end
|
215
|
+
eventlabel.text "Set column #{texta.focussed_col()} editable to #{toggle}"
|
216
|
+
texta.column(texta.focussed_col()).editable toggle
|
217
|
+
alert("Set column #{texta.focussed_col()} editable to #{toggle}")
|
218
|
+
}
|
219
|
+
bind(:ENTER) { eventlabel.text "Toggles editable state of current column " }
|
220
|
+
end
|
221
|
+
b_insert = Button.new @form do
|
222
|
+
text "&Insert"
|
223
|
+
row buttrow
|
224
|
+
col c+32
|
225
|
+
command {
|
226
|
+
# this does not trigger a data change since we are not updating model. so update
|
227
|
+
# on pressing up or down
|
228
|
+
#0.upto(100) { |i| data << ["test", rand(100), "abc:#{i}", rand(100)/2.0]}
|
229
|
+
#texta.table_data_changed
|
230
|
+
}
|
231
|
+
bind(:ENTER) { eventlabel.text "Does nothing " }
|
232
|
+
end
|
233
|
+
|
234
|
+
|
235
|
+
@form.repaint
|
236
|
+
@window.wrefresh
|
237
|
+
Ncurses::Panel.update_panels
|
238
|
+
while((ch = @window.getchar()) != ?\C-q )
|
239
|
+
colcount = tcm.column_count-1
|
240
|
+
s = keycode_tos ch
|
241
|
+
keylabel.text = "Pressed #{ch} , #{s}"
|
242
|
+
@form.handle_key(ch)
|
243
|
+
|
244
|
+
sel_col.value = tcm.column_count-1 if sel_col.value > tcm.column_count-1
|
245
|
+
sel_col.value = 0 if sel_col.value < 0
|
246
|
+
selcolname = texta.get_column_name sel_col.value
|
247
|
+
keylabel.text = "Pressed #{ch} , #{s}. Column selected #{texta.focussed_col}: Width:#{tcm.column(sel_col.value).width} #{selcolname}. Focussed Row: #{texta.focussed_row}, Rows: #{texta.table_model.row_count}, Cols: #{colcount}"
|
248
|
+
s = texta.get_value_at(texta.focussed_row, texta.focussed_col)
|
249
|
+
#s = s.to_s
|
250
|
+
## $log.debug " updating Field #{s}, #{s.class}"
|
251
|
+
## field.set_buffer s unless field.state == :HIGHLIGHTED # $editing
|
252
|
+
|
253
|
+
@form.repaint
|
254
|
+
@window.wrefresh
|
255
|
+
end
|
256
|
+
end
|
257
|
+
rescue => ex
|
258
|
+
ensure
|
259
|
+
@window.destroy if !@window.nil?
|
260
|
+
VER::stop_ncurses
|
261
|
+
p ex if ex
|
262
|
+
p(ex.backtrace.join("\n")) if ex
|
263
|
+
$log.debug( ex) if ex
|
264
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
265
|
+
end
|
266
|
+
end
|