rbcurse 1.5.0 → 1.5.2
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/Makefile +21 -0
- data/Manifest.txt +6 -0
- data/README.markdown +6 -4
- data/TODO +372 -0
- data/TODO2.txt +121 -0
- data/VERSION +1 -1
- data/examples/README.txt +67 -0
- data/examples/abasiclist.rb +33 -0
- data/examples/alpmenu.rb +42 -0
- data/examples/app.rb +859 -0
- data/examples/app.sample +17 -0
- data/examples/appdirtree.rb +74 -0
- data/examples/appemail.rb +191 -0
- data/examples/appemaillb.rb +308 -0
- data/examples/appgcompose.rb +315 -0
- data/examples/atree.rb +64 -0
- data/examples/common/file.rb +40 -0
- data/examples/common/rmail.rb +257 -0
- data/examples/data.txt +683 -0
- data/examples/data/README.markdown +9 -0
- data/examples/data/brew.txt +38 -0
- data/examples/data/color.2 +37 -0
- data/examples/data/gemlist.txt +60 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/ports.txt +136 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/todocsv.csv +28 -0
- data/examples/data/unix1.txt +21 -0
- data/examples/data/unix2.txt +11 -0
- data/examples/dbdemo.rb +495 -0
- data/examples/deprecated/appgmail.rb +952 -0
- data/examples/deprecated/splitp.rb +56 -0
- data/examples/deprecated/testscrolllb.rb +86 -0
- data/examples/deprecated/testscrollp.rb +88 -0
- data/examples/deprecated/testscrollta.rb +80 -0
- data/examples/deprecated/testscrolltable.rb +165 -0
- data/examples/deprecated/testsplit.rb +87 -0
- data/examples/deprecated/testsplit2.rb +123 -0
- data/examples/deprecated/testsplit3.rb +215 -0
- data/examples/deprecated/testsplit3_1.rb +244 -0
- data/examples/deprecated/testsplit3a.rb +215 -0
- data/examples/deprecated/testsplit3b.rb +237 -0
- data/examples/deprecated/testsplitta.rb +148 -0
- data/examples/deprecated/testsplittv.rb +142 -0
- data/examples/deprecated/testsplittvv.rb +144 -0
- data/examples/deprecated/testtpane.rb +215 -0
- data/examples/deprecated/testtpane2.rb +145 -0
- data/examples/deprecated/testtpanetable.rb +203 -0
- data/examples/dirtree.rb +88 -0
- data/examples/experimental/resultsetdemo.rb +280 -0
- data/examples/experimental/testmform.rb +35 -0
- data/examples/experimental/testscroller.rb +117 -0
- data/examples/experimental/teststackflow.rb +111 -0
- data/examples/menu1.rb +112 -0
- data/examples/multispl.rb +86 -0
- data/examples/newmessagebox.rb +131 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/newtesttabp.rb +121 -0
- data/examples/qdfilechooser.rb +68 -0
- data/examples/rfe.rb +1239 -0
- data/examples/rfe_renderer.rb +121 -0
- data/examples/sqlc.rb +454 -0
- data/examples/sqlm.rb +437 -0
- data/examples/sqlt.rb +408 -0
- data/examples/status.txt +68 -0
- data/examples/table1.rb +24 -0
- data/examples/term2.rb +84 -0
- data/examples/test1.rb +239 -0
- data/examples/test2.rb +674 -0
- data/examples/testapp.rb +44 -0
- data/examples/testapp2.rb +58 -0
- data/examples/testchars.rb +137 -0
- data/examples/testcombo.rb +91 -0
- data/examples/testkeypress.rb +66 -0
- data/examples/testlistbox.rb +113 -0
- data/examples/testmenu.rb +101 -0
- data/examples/testmulticomp.rb +70 -0
- data/examples/testmulticontainer.rb +94 -0
- data/examples/testmultispl.rb +199 -0
- data/examples/testree.rb +106 -0
- data/examples/testtable.rb +264 -0
- data/examples/testtabp.rb +107 -0
- data/examples/testtodo.rb +584 -0
- data/examples/testvimsplit.rb +112 -0
- data/examples/testwsshortcuts.rb +64 -0
- data/examples/testwsshortcuts2.rb +126 -0
- data/examples/todo.db +0 -0
- data/examples/todo.yml +191 -0
- data/examples/viewtodo.rb +574 -0
- data/lib/rbcurse/deprecated/README.markdown +12 -0
- data/lib/rbcurse/deprecated/rpad.rb +375 -0
- data/lib/rbcurse/deprecated/rscrollpane.rb +512 -0
- data/lib/rbcurse/deprecated/rsplitpane.rb +894 -0
- data/lib/rbcurse/deprecated/rsplitpane2.rb +1009 -0
- data/lib/rbcurse/deprecated/rviewport.rb +204 -0
- data/lib/rbcurse/deprecated/widgets/mapper.rb +130 -0
- data/lib/rbcurse/deprecated/widgets/rmessagebox.rb +348 -0
- data/lib/rbcurse/deprecated/widgets/rtabbedpane.rb +1158 -0
- data/lib/rbcurse/deprecated/widgets/rtabbedwindow.rb +167 -0
- data/lib/rbcurse/deprecated/widgets/scrollable.rb +301 -0
- data/lib/rbcurse/deprecated/widgets/stdscrwindow.rb +309 -0
- data/lib/ver/keyboard2.rb +170 -0
- data/test/test_rbcurse.rb +0 -0
- metadata +131 -9
data/examples/status.txt
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
PROGRAM STATUS
|
2
|
+
==============
|
3
|
+
/// vim:ts=4:sw=4:tw=80:ai:formatoptions=tcqnl:
|
4
|
+
|
5
|
+
I need to maintain the status of various test programs, what all is working and
|
6
|
+
particularly what is not, after testing. That way after making changes if
|
7
|
+
something is not working, i know whether it was a newly introduced issue or an
|
8
|
+
existing issue that was not closed.
|
9
|
+
|
10
|
+
|
11
|
+
testsplit3_1.rb ERROR
|
12
|
+
2010-02-08 20:47
|
13
|
+
ERROR
|
14
|
+
M-w works on left split to jump. C-a C-e etc working fine.
|
15
|
+
|
16
|
+
[ ] TAB no longer working to go to right split. Tab puts me in the top left corner
|
17
|
+
of current split.
|
18
|
+
|
19
|
+
------------
|
20
|
+
testsplit3.rb
|
21
|
+
2010-02-08 20:49
|
22
|
+
OK
|
23
|
+
|
24
|
+
M-w working.
|
25
|
+
Tab working to get to right side.
|
26
|
+
|
27
|
+
------------
|
28
|
+
testsplit3a.rb ERROR
|
29
|
+
2010-02-08 20:53
|
30
|
+
ERROR
|
31
|
+
|
32
|
+
Display. Left top split shows NOTES instead of README. After cursor movement,
|
33
|
+
it shows README.
|
34
|
+
Middle separator not showing.
|
35
|
+
Cursor off by -2, -1 in top left.
|
36
|
+
TAB does not go to right split.
|
37
|
+
M-w brings bottom tab to top!
|
38
|
+
------------
|
39
|
+
|
40
|
+
testsplitta.rb
|
41
|
+
2010-02-08 21:00
|
42
|
+
OKAY
|
43
|
+
|
44
|
+
M-w
|
45
|
+
Ca Ce
|
46
|
+
M- M+ M=
|
47
|
+
Cursor pos
|
48
|
+
|
49
|
+
------------
|
50
|
+
testsplittv.rb
|
51
|
+
2010-02-08 21:37
|
52
|
+
OKAY
|
53
|
+
|
54
|
+
M-w
|
55
|
+
Ca Ce
|
56
|
+
+ - =
|
57
|
+
curpos
|
58
|
+
|
59
|
+
------------
|
60
|
+
testsplittvv.rb
|
61
|
+
2010-02-08 21:39
|
62
|
+
OKAY
|
63
|
+
|
64
|
+
M-w
|
65
|
+
Ca Ce
|
66
|
+
+ = -
|
67
|
+
Cn Tab Cn
|
68
|
+
------------
|
data/examples/table1.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rbcurse/core/util/app'
|
2
|
+
|
3
|
+
if $0 == __FILE__
|
4
|
+
# NOTE try using the readonly tabular or tabular widget instead, see term2.rb
|
5
|
+
App.new do
|
6
|
+
@window.printstring 1, 30, "Demo of Table - rbcurse", $normalcolor, 'reverse'
|
7
|
+
@window.printstring 2, 30, "Hit F1 to quit", $datacolor, 'normal'
|
8
|
+
data = [["Roger Federer",16,"SWI"],
|
9
|
+
["Pete Sampras",14, "USA"],
|
10
|
+
["Roy Emerson", 12, "AUS"],
|
11
|
+
["Bjorn Borg", 11, "SWE"],
|
12
|
+
["Rod Laver", 11, "AUS"],
|
13
|
+
["Bill Tilden", 10, "USA"]]
|
14
|
+
colnames = %w[ Player Wins Nation ]
|
15
|
+
stack :margin_top => 3, :margin => 10 do
|
16
|
+
# we leave out :width so it gets calculated by column_widths
|
17
|
+
t = table :height => 10, :columns => colnames, :data => data, :column_widths => [15,5,10], :extended_keys => true
|
18
|
+
# :estimate_widths => true
|
19
|
+
# other options are :column_widths => [12,4,12]
|
20
|
+
# :size_to_fit => true
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/examples/term2.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'rbcurse/core/util/app'
|
2
|
+
require 'rbcurse/core/widgets/tabular'
|
3
|
+
require 'rbcurse/core/widgets/scrollbar'
|
4
|
+
|
5
|
+
App.new do
|
6
|
+
header = app_header "rbcurse #{Rbcurse::VERSION}", :text_center => "Tabular Demo", :text_right =>"New Improved!", :color => :black, :bgcolor => :white, :attr => :bold
|
7
|
+
message "Press F10 to escape from here"
|
8
|
+
|
9
|
+
stack :margin_top => 2, :margin => 5, :width => 30 do
|
10
|
+
t = Tabular.new(['a', 'b'], [1, 2], [3, 4])
|
11
|
+
listbox :list => t.render
|
12
|
+
t = Tabular.new ['a', 'b']
|
13
|
+
t << [1, 2]
|
14
|
+
t << [3, 4]
|
15
|
+
t << [4, 6]
|
16
|
+
#list_box :list => t.to_s.split("\n")
|
17
|
+
listbox :list => t.render
|
18
|
+
end # stack
|
19
|
+
r = `/bin/df -gh` # stock BSD df
|
20
|
+
#r = `df -gh` # I've installed brew, the df (maybe coreutils gives an error due to g option"
|
21
|
+
|
22
|
+
raise "df -gh not returning anything. correct command here. Try removing g option" if r == ""
|
23
|
+
# on my system there are extra spaces so i need to remove them, or else
|
24
|
+
# there'll be a mismatch between headers and columns
|
25
|
+
r.gsub!("Mounted on", "Mounted_on")
|
26
|
+
r.gsub!("map ", "map_")
|
27
|
+
res = r.split("\n")
|
28
|
+
heads = res.shift.split
|
29
|
+
t = Tabular.new do |t|
|
30
|
+
t.headings = heads
|
31
|
+
#t.headings = 'First Name', 'Last Name', 'Email'
|
32
|
+
#t << %w( TJ Holowaychuk tj@vision-media.ca )
|
33
|
+
#t << %w( TJ Holowaychuk tj@vision-media.ca 1 2 3 )
|
34
|
+
#t << %w( Bob Someone bob@vision-media.ca )
|
35
|
+
#t << %w( Joe Whatever bob@vision-media.ca )
|
36
|
+
|
37
|
+
#res.each { |e| t << e.split.flatten }
|
38
|
+
res.each { |e| t.add_row e.split }
|
39
|
+
end
|
40
|
+
|
41
|
+
t = t.render
|
42
|
+
wid = t[0].length + 2
|
43
|
+
stack :margin_top => 2, :margin => 35, :width => wid do
|
44
|
+
listbox :list => t, :title => '[df -gh]'
|
45
|
+
|
46
|
+
r = `ls -l`
|
47
|
+
res = r.split("\n")
|
48
|
+
|
49
|
+
t = Tabular.new do
|
50
|
+
# self.headings = 'Perm', 'Gr', 'User', 'U', 'Size', 'Mon', 'Date', 'Time', 'File' # changed 2011 dts
|
51
|
+
self.headings = 'User', 'Size', 'Mon', 'Date', 'Time', 'File'
|
52
|
+
res.each { |e|
|
53
|
+
cols = e.split
|
54
|
+
next if cols.count < 6
|
55
|
+
cols = cols[3..-1]
|
56
|
+
cols = cols[0..5] if cols.count > 6
|
57
|
+
#cols[1] = cols[1].to_i
|
58
|
+
add_row cols
|
59
|
+
}
|
60
|
+
column_width 1, 6
|
61
|
+
align_column 1, :right
|
62
|
+
#self.headings = 'First Name', 'Last Name', 'Email'
|
63
|
+
#add_row ['Roald', 'Amundsen', 'ra@explorers.org']
|
64
|
+
#add_row ['Francis', 'Drake', 'joe@ducks.com']
|
65
|
+
#add_row ['Hsuan', 'Tsang', 'tsang@asia.org']
|
66
|
+
#add_separator
|
67
|
+
#add_row ['Ernest', 'Shackleton', 'jack@radio-schakc.org']
|
68
|
+
#add_row ['Fa', 'Hsien', 'fa@sheen.net']
|
69
|
+
#add_row ['Vasco', 'Da Gama', 'bob@vasco.org']
|
70
|
+
#add_row ['David', 'Livingstone', 'jack@trolls.com']
|
71
|
+
##add_row ['Total', { :value => '3', :colspan => 2, :alignment => :right }]
|
72
|
+
#align_column 1, :center
|
73
|
+
#self.numbering = true
|
74
|
+
end
|
75
|
+
#lb = list_box :list => t.render2
|
76
|
+
lb = textview :set_content => t.render, :height => 15, :title => '[ls -l]'
|
77
|
+
lb.bind(:PRESS){|tae|
|
78
|
+
alert "Pressed list on line #{tae.current_index} #{tae.word_under_cursor(nil, nil, "|")} "
|
79
|
+
}
|
80
|
+
Scrollbar.new @form, :parent => lb
|
81
|
+
#make a textview that is vienabled by default.
|
82
|
+
end
|
83
|
+
|
84
|
+
end # app
|
data/examples/test1.rb
ADDED
@@ -0,0 +1,239 @@
|
|
1
|
+
# this is a test program, tests out messageboxes. type F1 to exit
|
2
|
+
# 2008-12-17 22:13 tried out the listdatamodel
|
3
|
+
# Certain terminals are not displaying background colors correctly.
|
4
|
+
# TERM=screen does but does not show UNDERLINES.
|
5
|
+
# TERM=xterm-color does but does not trap F1, f2 etc
|
6
|
+
# TERM=xterm does not but other things are fine.
|
7
|
+
#
|
8
|
+
require 'logger'
|
9
|
+
require 'rbcurse'
|
10
|
+
require 'rbcurse/deprecated/widgets/rmessagebox'
|
11
|
+
|
12
|
+
if $0 == __FILE__
|
13
|
+
# Initialize curses
|
14
|
+
begin
|
15
|
+
# XXX update with new color and kb
|
16
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
17
|
+
$log = Logger.new((File.join(ENV['LOGDIR'] || "./" ,"rbc13.log")))
|
18
|
+
$log.level = Logger::DEBUG
|
19
|
+
|
20
|
+
# @window = VER::Window.root_window
|
21
|
+
|
22
|
+
|
23
|
+
catch(:close) do
|
24
|
+
choice = ARGV[0] && ARGV[0].to_i || 3
|
25
|
+
$log.debug "START MESSAGE BOX TEST #{ARGV[0]}. choice==#{choice} ---------"
|
26
|
+
# need to pass a form, not window.
|
27
|
+
case choice
|
28
|
+
when 1
|
29
|
+
@mb = RubyCurses::MessageBox.new do
|
30
|
+
title "Enter your name"
|
31
|
+
message "Enter your name"
|
32
|
+
type :list
|
33
|
+
button_type :ok_cancel
|
34
|
+
list %w[john tim lee wong rahul edward why chad andy]
|
35
|
+
list_selection_mode :multiple
|
36
|
+
default_values %w[ lee why ]
|
37
|
+
|
38
|
+
default_button 0
|
39
|
+
end
|
40
|
+
when 2
|
41
|
+
@mb = RubyCurses::MessageBox.new do
|
42
|
+
title "Color selector"
|
43
|
+
message "Select a color"
|
44
|
+
type :custom
|
45
|
+
button_type :custom
|
46
|
+
buttons %w[&red &green &blue &yellow]
|
47
|
+
underlines [0,0,0,0]
|
48
|
+
default_button 0
|
49
|
+
end
|
50
|
+
when 3
|
51
|
+
config = {}
|
52
|
+
config["input_config"] = {}
|
53
|
+
config["input_config"]["chars_allowed"]=/[^xzq]/
|
54
|
+
config["input_config"]["valid_regex"]=/[A-Z][a-z]*/
|
55
|
+
@mb = RubyCurses::MessageBox.new nil, config do
|
56
|
+
title "Enter your name"
|
57
|
+
#message "Enter your first name. You are not permitted to enter x z or q and must enter a capital first"
|
58
|
+
message "Enter your first name. "
|
59
|
+
type :input
|
60
|
+
button_type :ok_cancel
|
61
|
+
default_value "Rahul"
|
62
|
+
end
|
63
|
+
when 4
|
64
|
+
@form = RubyCurses::Form.new nil
|
65
|
+
field_list = []
|
66
|
+
titlelabel = RubyCurses::Label.new @form, {'text' => 'User', 'row'=>3, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white', 'mnemonic'=>'U'}
|
67
|
+
field_list << titlelabel
|
68
|
+
field = RubyCurses::Field.new @form do
|
69
|
+
name "url"
|
70
|
+
row 3
|
71
|
+
col 10
|
72
|
+
display_length 30
|
73
|
+
# set_buffer "http://"
|
74
|
+
set_label titlelabel
|
75
|
+
end
|
76
|
+
checkbutton = RubyCurses::CheckBox.new @form do
|
77
|
+
# variable $results
|
78
|
+
#value = true
|
79
|
+
onvalue "Selected cb "
|
80
|
+
offvalue "UNselected cb"
|
81
|
+
color 'black'
|
82
|
+
bgcolor 'white'
|
83
|
+
text "No &frames"
|
84
|
+
row 4
|
85
|
+
col 4
|
86
|
+
end
|
87
|
+
field_list << field
|
88
|
+
field_list << checkbutton
|
89
|
+
checkbutton = RubyCurses::CheckBox.new @form do
|
90
|
+
# variable $results
|
91
|
+
value true
|
92
|
+
color 'black'
|
93
|
+
bgcolor 'white'
|
94
|
+
text "Use &HTTP/1.0"
|
95
|
+
row 5
|
96
|
+
col 4
|
97
|
+
end
|
98
|
+
field_list << checkbutton
|
99
|
+
checkbutton = RubyCurses::CheckBox.new @form do
|
100
|
+
# variable $results
|
101
|
+
color 'black'
|
102
|
+
bgcolor 'white'
|
103
|
+
text "Use &passive FTP"
|
104
|
+
row 6
|
105
|
+
col 4
|
106
|
+
end
|
107
|
+
field_list << checkbutton
|
108
|
+
titlelabel = RubyCurses::Label.new @form, {'text' => 'Language', 'row'=>8, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white'}
|
109
|
+
field_list << titlelabel
|
110
|
+
$radio = RubyCurses::Variable.new
|
111
|
+
#$radio.update_command(colorlabel) {|tv, label| label.color tv.value}
|
112
|
+
radio1 = RubyCurses::RadioButton.new @form do
|
113
|
+
variable $radio
|
114
|
+
text "rub&y"
|
115
|
+
value "ruby"
|
116
|
+
color "red"
|
117
|
+
bgcolor 'white'
|
118
|
+
row 9
|
119
|
+
col 4
|
120
|
+
end
|
121
|
+
radio2 = RubyCurses::RadioButton.new @form do
|
122
|
+
variable $radio
|
123
|
+
text "python"
|
124
|
+
value "py&thon"
|
125
|
+
color "blue"
|
126
|
+
bgcolor 'white'
|
127
|
+
row 10
|
128
|
+
col 4
|
129
|
+
end
|
130
|
+
field_list << radio1
|
131
|
+
field_list << radio2
|
132
|
+
field.bind(:ENTER) do |f|
|
133
|
+
listconfig = {'bgcolor' => 'blue', 'color' => 'white'}
|
134
|
+
url_list= RubyCurses::ListDataModel.new(%w[john tim lee wong rahul edward _why chad andy])
|
135
|
+
pl = RubyCurses::PopupList.new do
|
136
|
+
# title "Enter URL "
|
137
|
+
row 4
|
138
|
+
col 10
|
139
|
+
width 30
|
140
|
+
#list url_list
|
141
|
+
list_data_model url_list
|
142
|
+
list_selection_mode 'single'
|
143
|
+
relative_to f
|
144
|
+
list_config listconfig
|
145
|
+
#default_values %w[ lee _why ]
|
146
|
+
bind :PRESS do |index|
|
147
|
+
field.set_buffer url_list[index]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
@mb = RubyCurses::MessageBox.new @form do
|
152
|
+
#title "Color selector"
|
153
|
+
title "HTTP Configuration"
|
154
|
+
# message "Enter your name"
|
155
|
+
# type :custom
|
156
|
+
# buttons %w[red green blue yellow]
|
157
|
+
# underlines [0,0,0,0]
|
158
|
+
# type :input
|
159
|
+
# default_value "rahul"
|
160
|
+
#type :field_list
|
161
|
+
#field_list field_list
|
162
|
+
button_type :ok
|
163
|
+
default_button 0
|
164
|
+
end
|
165
|
+
when 5
|
166
|
+
@form = RubyCurses::Form.new nil
|
167
|
+
label = RubyCurses::Label.new @form, {'text' => 'File', 'row'=>3, 'col'=>4, 'color'=>'black', 'bgcolor'=>'white', 'mnemonic'=>'F'}
|
168
|
+
field = RubyCurses::Field.new @form do
|
169
|
+
name "file"
|
170
|
+
row 3
|
171
|
+
col 10
|
172
|
+
display_length 40
|
173
|
+
set_label label
|
174
|
+
end
|
175
|
+
flist = Dir.glob("*.*")
|
176
|
+
listb = RubyCurses::Listbox.new @form do
|
177
|
+
name "mylist"
|
178
|
+
row 5
|
179
|
+
col 10
|
180
|
+
width 40
|
181
|
+
height 10
|
182
|
+
list flist
|
183
|
+
title "File list"
|
184
|
+
title_attrib 'bold'
|
185
|
+
end
|
186
|
+
#listb.list.bind(:ENTER_ROW) { field.set_buffer listb.selected_item }
|
187
|
+
# if you find that cursor goes into listbox while typing, then
|
188
|
+
# i've put set_form_row in listbox list_data_changed
|
189
|
+
field.bind(:CHANGE) do |f|
|
190
|
+
flist = Dir.glob(f.getvalue+"*")
|
191
|
+
l = listb.list
|
192
|
+
l.remove_all
|
193
|
+
l.insert( 0, *flist) if flist
|
194
|
+
end
|
195
|
+
@mb = RubyCurses::MessageBox.new @form do
|
196
|
+
title "Sample File Selector"
|
197
|
+
type :override
|
198
|
+
height 20
|
199
|
+
width 60
|
200
|
+
top 5
|
201
|
+
left 20
|
202
|
+
default_button 0
|
203
|
+
button_type :ok_cancel
|
204
|
+
|
205
|
+
end
|
206
|
+
$log.debug "MBOX :selected #{listb.selected_item}"
|
207
|
+
end
|
208
|
+
|
209
|
+
$log.debug "MBOX :selected button index #{@mb.selected_index} "
|
210
|
+
$log.debug "MBOX :input val #{@mb.input_value} "
|
211
|
+
# $log.debug "row : #{@form.row} "
|
212
|
+
# $log.debug "col : #{@form.col} "
|
213
|
+
# $log.debug "Config : #{@form.config.inspect} "
|
214
|
+
# @form.configure "row", 23
|
215
|
+
# @form.configure "col", 83
|
216
|
+
# $log.debug "row : #{@form.row} "
|
217
|
+
# x = @form.row
|
218
|
+
# @form.depth 21
|
219
|
+
# @form.depth = 22
|
220
|
+
# @form.depth 24
|
221
|
+
# @form.depth = 25
|
222
|
+
# $log.debug "col : #{@form.col} "
|
223
|
+
# $log.debug "config : #{@form.config.inspect} "
|
224
|
+
# $log.debug "row : #{@form.configure('row')} "
|
225
|
+
#$log.debug "mrgods : #{@form.public_methods.sort.inspect}"
|
226
|
+
#while((ch = @window.getchar()) != ?q )
|
227
|
+
# @window.wrefresh
|
228
|
+
#end
|
229
|
+
end
|
230
|
+
rescue => ex
|
231
|
+
ensure
|
232
|
+
@window.destroy unless @window.nil?
|
233
|
+
VER::stop_ncurses
|
234
|
+
p ex if ex
|
235
|
+
p(ex.backtrace.join("\n")) if ex
|
236
|
+
$log.debug( ex) if ex
|
237
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
238
|
+
end
|
239
|
+
end
|
data/examples/test2.rb
ADDED
@@ -0,0 +1,674 @@
|
|
1
|
+
# This program tests out various widgets.
|
2
|
+
# This is the old style of creating an application in which the user
|
3
|
+
# has to start and stop ncurses. No shortcuts for widget constructors are available.
|
4
|
+
#
|
5
|
+
# The newer easier way is to use 'App' which manages the environment, and provides shortcuts
|
6
|
+
# for all widgets. See app*.rb, alpmenu.rb, dbdemo.rb etc for samples.
|
7
|
+
#
|
8
|
+
# In case, you are running this in a directory that does not allow writing, set LOGDIR to
|
9
|
+
# your home directory, or temp directory so a log file can be generated.
|
10
|
+
#
|
11
|
+
require 'logger'
|
12
|
+
require 'rbcurse'
|
13
|
+
require 'rbcurse/core/widgets/rtextarea'
|
14
|
+
require 'rbcurse/core/widgets/rtextview'
|
15
|
+
require 'rbcurse/core/widgets/rmenu'
|
16
|
+
require 'rbcurse/core/widgets/rcombo'
|
17
|
+
require 'rbcurse/extras/widgets/rcomboedit'
|
18
|
+
require 'rbcurse/core/include/listcellrenderer'
|
19
|
+
require 'rbcurse/extras/include/checkboxcellrenderer'
|
20
|
+
require 'rbcurse/extras/include/comboboxcellrenderer'
|
21
|
+
require 'rbcurse/extras/include/celleditor'
|
22
|
+
require 'rbcurse/extras/widgets/rlistbox'
|
23
|
+
require 'rbcurse/core/widgets/rlist'
|
24
|
+
#require 'rbcurse/deprecated/widgets/rmessagebox'
|
25
|
+
require 'rbcurse/core/widgets/rtree'
|
26
|
+
require 'rbcurse/core/include/appmethods.rb'
|
27
|
+
require 'rbcurse/core/widgets/scrollbar'
|
28
|
+
def help_text
|
29
|
+
<<-eos
|
30
|
+
TEST2 HELP 1.5.0
|
31
|
+
|
32
|
+
This is some help text for test2.
|
33
|
+
|
34
|
+
Alt-C/F10 - Exit application
|
35
|
+
Alt-! - Drop to shell
|
36
|
+
C-x c - Drop to shell
|
37
|
+
C-x l - list of files
|
38
|
+
C-x p - process list
|
39
|
+
C-x d - disk usage list
|
40
|
+
C-x s - Git status
|
41
|
+
C-x d - Git diff
|
42
|
+
C-x w - Git whatchanged
|
43
|
+
Alt-x - Command mode (<tab> to see commands and select)
|
44
|
+
|
45
|
+
Some commands for using bottom of screen as vim and emacs do.
|
46
|
+
To add
|
47
|
+
|
48
|
+
-----------------------------------------------------------------------
|
49
|
+
eos
|
50
|
+
end
|
51
|
+
if $0 == __FILE__
|
52
|
+
|
53
|
+
include RubyCurses
|
54
|
+
include RubyCurses::Utils
|
55
|
+
|
56
|
+
begin
|
57
|
+
# Initialize curses
|
58
|
+
VER::start_ncurses # this is initializing colors via ColorMap.setup
|
59
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")
|
60
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
61
|
+
$log = Logger.new(path)
|
62
|
+
$log.level = Logger::DEBUG
|
63
|
+
|
64
|
+
@lookfeel = :classic # :dialog # or :classic
|
65
|
+
|
66
|
+
@window = VER::Window.root_window
|
67
|
+
# Initialize few color pairs
|
68
|
+
# Create the window to be associated with the form
|
69
|
+
# Un post form and free the memory
|
70
|
+
|
71
|
+
catch(:close) do
|
72
|
+
colors = Ncurses.COLORS
|
73
|
+
$log.debug "START #{colors} colors test2.rb --------- #{@window} "
|
74
|
+
@form = Form.new @window
|
75
|
+
title = (" "*30) + "Demo of some Ruby Curses Widgets - rbcurse " + Rbcurse::VERSION
|
76
|
+
Label.new @form, {'text' => title, :row => 0, :col => 0, :color => 'green', :bgcolor => 'black'}
|
77
|
+
r = 1; fc = 12;
|
78
|
+
mnemonics = %w[ n l r p]
|
79
|
+
%w[ name line regex password].each_with_index do |w,i|
|
80
|
+
field = Field.new @form do
|
81
|
+
name w
|
82
|
+
row r
|
83
|
+
col fc
|
84
|
+
display_length 30
|
85
|
+
#set_buffer "abcd "
|
86
|
+
set_label Label.new @form, {'text' => w, 'color'=>'cyan','mnemonic'=> mnemonics[i]}
|
87
|
+
end
|
88
|
+
r += 1
|
89
|
+
end
|
90
|
+
|
91
|
+
$message = Variable.new
|
92
|
+
$message.value = "Message Comes Here"
|
93
|
+
message_label = RubyCurses::Label.new @form, {'text_variable' => $message,
|
94
|
+
"name"=>"message_label","row" => Ncurses.LINES-1, "col" => 1, "display_length" => 60,
|
95
|
+
"height" => 2, 'color' => 'cyan'}
|
96
|
+
|
97
|
+
$results = Variable.new
|
98
|
+
$results.value = "A variable"
|
99
|
+
var = RubyCurses::Label.new @form, {'text_variable' => $results, "row" => r, "col" => fc}
|
100
|
+
r += 1
|
101
|
+
mylist = File.open("data/tasks.txt",'r').readlines
|
102
|
+
#0.upto(100) { |v| mylist << "#{v} scrollable data" }
|
103
|
+
listb = List.new @form do
|
104
|
+
name "mylist"
|
105
|
+
row r
|
106
|
+
col 1
|
107
|
+
width 40
|
108
|
+
height 11
|
109
|
+
list mylist
|
110
|
+
#selection_mode :SINGLE
|
111
|
+
show_selector true
|
112
|
+
#row_selected_symbol "*"
|
113
|
+
#row_unselected_symbol " "
|
114
|
+
selected_bgcolor :white
|
115
|
+
selected_color :blue
|
116
|
+
title "Todo List"
|
117
|
+
end
|
118
|
+
Scrollbar.new @form, :parent => listb # 2011-10-1 added
|
119
|
+
#listb.list_data_model.insert -1, "rake build", "rake release", "bump version", "fix bugs"
|
120
|
+
col2 = 42
|
121
|
+
texta = TextArea.new @form do
|
122
|
+
name "mytext"
|
123
|
+
row 1
|
124
|
+
col col2
|
125
|
+
width 50
|
126
|
+
height 14
|
127
|
+
title "Editable box"
|
128
|
+
#title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
|
129
|
+
print_footer true
|
130
|
+
bind(:CHANGE){|e| $message.value = e.to_s+" CP:"+e.source.curpos.to_s }
|
131
|
+
end
|
132
|
+
lines = File.open("data/unix1.txt",'r').readlines
|
133
|
+
lines.each { |e| texta << e }
|
134
|
+
#texta << "I expect to pass through this world but once." << "Any good therefore that I can do, or any kindness or abilities that I can show to any fellow creature, let me do it now."
|
135
|
+
#texta << "Let me not defer it or neglect it, for I shall not pass this way again."
|
136
|
+
#texta << " "
|
137
|
+
#texta << " F10 to exit. or click cancel button"
|
138
|
+
#texta << " Or alt-c"
|
139
|
+
|
140
|
+
col3 = 92
|
141
|
+
treemodel = nil
|
142
|
+
atree = Tree.new @form, :title => "Tree", :row =>1, :col=>col3, :height => 14, :width => 15 do
|
143
|
+
treemodel = root "ruby language" do
|
144
|
+
branch "mri" do
|
145
|
+
leaf "1.9.1"
|
146
|
+
leaf "1.9.2"
|
147
|
+
leaf "1.9.3"
|
148
|
+
end
|
149
|
+
branch "jruby" do
|
150
|
+
leaf "1.5"
|
151
|
+
leaf "a really long leaf"
|
152
|
+
|
153
|
+
end
|
154
|
+
branch "ree" do
|
155
|
+
leaf "1.8"
|
156
|
+
leaf "1.9"
|
157
|
+
leaf "2.0"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
root = treemodel.root
|
162
|
+
atree.set_expanded_state root, true
|
163
|
+
#listcb.cell_editor.component.form = @form
|
164
|
+
|
165
|
+
w1 = Ncurses.COLS-col2-1
|
166
|
+
@textview = TextView.new @form do
|
167
|
+
name "myView"
|
168
|
+
row 15
|
169
|
+
col col2
|
170
|
+
width w1
|
171
|
+
height 11
|
172
|
+
title "README.mark"
|
173
|
+
#title_attrib 'bold'
|
174
|
+
print_footer true
|
175
|
+
footer_attrib 'bold'
|
176
|
+
end
|
177
|
+
content = File.open("../README.markdown","r").readlines
|
178
|
+
@textview.set_content content #, :WRAP_WORD
|
179
|
+
#@textview.top_row 21
|
180
|
+
|
181
|
+
# just for demo, lets scroll the text view as we scroll this.
|
182
|
+
listb.bind(:ENTER_ROW, @textview) { |alist, tview| tview.top_row alist.current_index
|
183
|
+
pb = @form.by_name["pbar"]
|
184
|
+
pb.visible true
|
185
|
+
len = alist.current_index
|
186
|
+
pb.fraction(len/100.0)
|
187
|
+
i = ((len/100.0)*100).to_i
|
188
|
+
i = 100 if i > 100
|
189
|
+
pb.text = "completed:#{i}"
|
190
|
+
}
|
191
|
+
listb.bind(:LEAVE) {
|
192
|
+
pb = @form.by_name["pbar"]
|
193
|
+
pb.visible false
|
194
|
+
r = pb.row
|
195
|
+
c = pb.col
|
196
|
+
@window.wmove(r,c); @window.wclrtoeol
|
197
|
+
#@window.wrefresh
|
198
|
+
}
|
199
|
+
|
200
|
+
# just for demo, lets scroll the text view to the line you enter
|
201
|
+
@form.by_name["line"].bind(:LEAVE, @textview) { |fld, tv| raise(FieldValidationException, "#{fld.getvalue.to_i} Outside range 1,200") if fld.getvalue.to_i >200; tv.top_row(fld.getvalue.to_i) }
|
202
|
+
@form.by_name["regex"].bind(:LEAVE, @textview) { |fld, tv| tv.top_row(tv.find_first_match(fld.getvalue)) }
|
203
|
+
@form.by_name["regex"].bind(:CHANGED) { |fld|
|
204
|
+
$message.value = "REGEX CHANGED!!! #{fld.getvalue} " }
|
205
|
+
row = 17
|
206
|
+
col = 2
|
207
|
+
align = ComboBox.new @form do
|
208
|
+
name "combo"
|
209
|
+
row row
|
210
|
+
col fc
|
211
|
+
display_length 10
|
212
|
+
editable false
|
213
|
+
list %w[left right center]
|
214
|
+
set_label Label.new @form, {'text' => "Align", 'color'=>'cyan','col'=>1, "mnemonic"=>"I"}
|
215
|
+
list_config :color => :yellow, :bgcolor=>:blue
|
216
|
+
end
|
217
|
+
|
218
|
+
list = ListDataModel.new( %w[white yellow cyan magenta red blue black])
|
219
|
+
list.bind(:LIST_DATA_EVENT) { |lde| $message.value = lde.to_s; $log.debug " STA: #{$message.value} #{lde}"; }
|
220
|
+
list.bind(:ENTER_ROW) { |obj| $message.value = "ENTER_ROW :#{obj.current_index} : #{obj.selected_item} "; $log.debug " ENTER_ROW: #{$message.value} , #{obj}"; @form.widgets.each { |e| next unless e.is_a? Widget; e.color = obj.selected_item }; @mb.color = obj.selected_item }
|
221
|
+
|
222
|
+
row += 1
|
223
|
+
combo1 = ComboBoxEdit.new @form do
|
224
|
+
name "combo1"
|
225
|
+
row row
|
226
|
+
col fc
|
227
|
+
display_length 10
|
228
|
+
editable true
|
229
|
+
list_data_model list
|
230
|
+
set_label Label.new @form, {'text' => "Edit Combo",'color'=>'cyan','col'=>1}
|
231
|
+
list_config 'color' => 'white', 'bgcolor'=>'blue', 'max_visible_items' => 6, 'height' => 7
|
232
|
+
end
|
233
|
+
row += 1
|
234
|
+
checkbutton = CheckBox.new @form do
|
235
|
+
variable $results
|
236
|
+
#value = true
|
237
|
+
onvalue "Selected bold "
|
238
|
+
offvalue "UNselected bold"
|
239
|
+
text "Bold attribute "
|
240
|
+
display_length 18 # helps when right aligning
|
241
|
+
row row
|
242
|
+
col col
|
243
|
+
mnemonic 'B'
|
244
|
+
end
|
245
|
+
row += 1
|
246
|
+
@cb_rev = Variable.new false # related to checkbox reverse
|
247
|
+
cbb = @cb_rev
|
248
|
+
checkbutton1 = CheckBox.new @form do
|
249
|
+
variable cbb # $cb_rev
|
250
|
+
#value = true
|
251
|
+
onvalue "Selected reverse "
|
252
|
+
offvalue "UNselected reverse"
|
253
|
+
text "Reverse attribute "
|
254
|
+
display_length 18
|
255
|
+
row row
|
256
|
+
col col
|
257
|
+
mnemonic 'R'
|
258
|
+
end
|
259
|
+
row += 1
|
260
|
+
togglebutton = ToggleButton.new @form do
|
261
|
+
value true
|
262
|
+
onvalue " Toggle Down "
|
263
|
+
offvalue " Untoggle "
|
264
|
+
row row
|
265
|
+
col col
|
266
|
+
mnemonic 'T'
|
267
|
+
#underline 0
|
268
|
+
end
|
269
|
+
# a special case required since another form (combo popup also modifies)
|
270
|
+
$message.update_command() { message_label.repaint }
|
271
|
+
|
272
|
+
f = @form.by_name["line"]
|
273
|
+
f.display_length(3).set_buffer(24).valid_range(1..200).
|
274
|
+
maxlen(3).
|
275
|
+
type(:integer)
|
276
|
+
|
277
|
+
@form.by_name["name"].set_buffer( "Not focusable").
|
278
|
+
set_focusable(false)
|
279
|
+
|
280
|
+
@form.by_name["regex"].valid_regex(/^[A-Z][a-z]*/).
|
281
|
+
set_buffer( "SYNOP").
|
282
|
+
display_length(10).
|
283
|
+
maxlen = 20
|
284
|
+
|
285
|
+
@form.by_name["password"].set_buffer("").
|
286
|
+
show('*').
|
287
|
+
color('red').
|
288
|
+
values(%w[scotty tiger secret pass qwerty]).
|
289
|
+
null_allowed true
|
290
|
+
|
291
|
+
# a form level event, whenever any widget is focussed, make the label red
|
292
|
+
@form.bind(:ENTER) { |f| f.label && f.label.bgcolor = 'red' if f.respond_to? :label}
|
293
|
+
@form.bind(:LEAVE) { |f| f.label && f.label.bgcolor = 'black' if f.respond_to? :label}
|
294
|
+
|
295
|
+
row += 1
|
296
|
+
colorlabel = Label.new @form, {'text' => "Select a color:", "row" => row, "col" => col,
|
297
|
+
"color"=>"cyan", "mnemonic" => 'S'}
|
298
|
+
$radio = Variable.new
|
299
|
+
$radio.update_command(colorlabel) {|tv, label| label.color tv.value; }
|
300
|
+
$radio.update_command() {|tv| message_label.color tv.value; align.bgcolor tv.value;
|
301
|
+
combo1.bgcolor tv.value}
|
302
|
+
$radio.update_command() {|tv| @form.widgets.each { |e| next unless e.is_a? Widget;
|
303
|
+
e.bgcolor tv.value }; @mb.bgcolor = tv.value }
|
304
|
+
|
305
|
+
# whenever updated set colorlabel and messagelabel to bold
|
306
|
+
$results.update_command(colorlabel,checkbutton) {|tv, label, cb|
|
307
|
+
attrs = cb.value ? 'bold' : 'normal'; label.attr(attrs); message_label.attr(attrs)}
|
308
|
+
|
309
|
+
align.bind(:ENTER_ROW) {|fld| message_label.justify fld.getvalue}
|
310
|
+
|
311
|
+
align.bind(:ENTER_ROW) {|fld|
|
312
|
+
if fld.getvalue == 'right'
|
313
|
+
checkbutton1.align_right true
|
314
|
+
checkbutton.align_right true
|
315
|
+
else
|
316
|
+
checkbutton1.align_right false
|
317
|
+
checkbutton.align_right false
|
318
|
+
end
|
319
|
+
}
|
320
|
+
|
321
|
+
# whenever updated set colorlabel and messagelabel to reverse
|
322
|
+
#@cb_rev.update_command(colorlabel,checkbutton1) {|tv, label, cb| attrs = cb.value ? 'reverse' : nil; label.attr(attrs); message_label.attr(attrs)}
|
323
|
+
# changing nil to normal since PROP CHAN handler will not fire if nil being set.
|
324
|
+
@cb_rev.update_command(colorlabel,checkbutton1) {|tv, label, cb|
|
325
|
+
attrs = cb.value ? 'reverse' : 'normal'; label.attr(attrs); message_label.attr(attrs)}
|
326
|
+
|
327
|
+
row += 1
|
328
|
+
dlen = 10
|
329
|
+
radio1 = RadioButton.new @form do
|
330
|
+
variable $radio
|
331
|
+
text "red"
|
332
|
+
value "red"
|
333
|
+
color "red"
|
334
|
+
display_length dlen # helps when right aligning
|
335
|
+
row row
|
336
|
+
col col
|
337
|
+
end
|
338
|
+
radio11 = RadioButton.new @form do
|
339
|
+
variable $radio
|
340
|
+
text "c&yan"
|
341
|
+
value "cyan"
|
342
|
+
color "cyan"
|
343
|
+
display_length dlen # helps when right aligning
|
344
|
+
row row
|
345
|
+
col col+24
|
346
|
+
end
|
347
|
+
|
348
|
+
row += 1
|
349
|
+
radio2 = RadioButton.new @form do
|
350
|
+
variable $radio
|
351
|
+
text "&green"
|
352
|
+
value "green"
|
353
|
+
color "green"
|
354
|
+
display_length dlen # helps when right aligning
|
355
|
+
row row
|
356
|
+
col col
|
357
|
+
end
|
358
|
+
radio22 = RadioButton.new @form do
|
359
|
+
variable $radio
|
360
|
+
text "magenta"
|
361
|
+
value "magenta"
|
362
|
+
color "magenta"
|
363
|
+
display_length dlen # helps when right aligning
|
364
|
+
row row
|
365
|
+
col col+24
|
366
|
+
end
|
367
|
+
colorlabel.label_for radio1
|
368
|
+
align.bind(:ENTER_ROW) {|fld|
|
369
|
+
if fld.getvalue == 'right'
|
370
|
+
radio1.align_right true
|
371
|
+
radio2.align_right true
|
372
|
+
radio11.align_right true
|
373
|
+
radio22.align_right true
|
374
|
+
else
|
375
|
+
radio1.align_right false
|
376
|
+
radio2.align_right false
|
377
|
+
radio11.align_right false
|
378
|
+
radio22.align_right false
|
379
|
+
end
|
380
|
+
}
|
381
|
+
|
382
|
+
# instead of using frozen, I will use a PropertyVeto
|
383
|
+
# to disallow changes to color itself
|
384
|
+
veto = lambda { |e, name|
|
385
|
+
if e.property_name == 'color'
|
386
|
+
if e.newvalue != name
|
387
|
+
raise PropertyVetoException.new("Cannot change this at all!", e)
|
388
|
+
end
|
389
|
+
elsif e.property_name == 'bgcolor'
|
390
|
+
raise PropertyVetoException.new("Cannot change this!", e)
|
391
|
+
end
|
392
|
+
}
|
393
|
+
[radio1, radio2, radio11, radio22].each { |r|
|
394
|
+
r.bind(:PROPERTY_CHANGE) do |e| veto.call(e, r.text) end
|
395
|
+
}
|
396
|
+
|
397
|
+
#
|
398
|
+
# define the menu
|
399
|
+
#
|
400
|
+
@mb = RubyCurses::MenuBar.new
|
401
|
+
filemenu = RubyCurses::Menu.new "File"
|
402
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Open",'O'))
|
403
|
+
item.command(@form) {|it, form| $message.value = "Open called on menu bar";
|
404
|
+
require './qdfilechooser'
|
405
|
+
fchooser = QDFileChooser.new
|
406
|
+
option = fchooser.show_open_dialog
|
407
|
+
$message.value = "File Selection #{option}, #{fchooser.get_selected_file}"
|
408
|
+
if option == :OK
|
409
|
+
filesel = fchooser.get_selected_file
|
410
|
+
if !filesel.nil?
|
411
|
+
texta.remove_all
|
412
|
+
content = File.open(filesel,"r").readlines
|
413
|
+
content.each do |line|
|
414
|
+
texta << line
|
415
|
+
end
|
416
|
+
else
|
417
|
+
alert "File name #{filesel} nil. Pls check code. "
|
418
|
+
end
|
419
|
+
end
|
420
|
+
}
|
421
|
+
|
422
|
+
filemenu.insert_separator 1
|
423
|
+
filemenu.add(RubyCurses::MenuItem.new "New",'N')
|
424
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Save",'S'))
|
425
|
+
item.command() do |it|
|
426
|
+
filename = get_string("Please enter file to save in", 20, "t.t")
|
427
|
+
$message.value = "file: #{filename}"
|
428
|
+
filename ||= "tmpzzzz.tmp"
|
429
|
+
str = texta.to_s
|
430
|
+
File.open(filename, 'w') {|f| f.write(str) }
|
431
|
+
$message.value = " written #{str.length} bytes to file: #{filename}"
|
432
|
+
end
|
433
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Test",'T'))
|
434
|
+
item.command(@form, texta) do |it, form, testa|
|
435
|
+
$message.value = "Testing textarea"
|
436
|
+
str = File.open("data/lotr.txt",'r').readlines.join
|
437
|
+
#str = "Hello there good friends and fellow rubyists. Here is a textarea that I am testing out with"
|
438
|
+
#str << " some long data, to see how it acts, how the wrapping takes place. Sit back and enjoy the "
|
439
|
+
#str << " bugs as they crop up."
|
440
|
+
testa.goto_start
|
441
|
+
#testa.cursor_bol
|
442
|
+
testa.handle_key ?\C-a.getbyte(0)
|
443
|
+
str.each_char {|c| testa.putch(c)}
|
444
|
+
testa.repaint
|
445
|
+
3.times { testa.handle_key KEY_DOWN }
|
446
|
+
testa.handle_key ?\C-a.getbyte(0)
|
447
|
+
|
448
|
+
str.each_char {|c| testa.putch(c)}
|
449
|
+
$message.value = "Wrapping textarea"
|
450
|
+
testa.repaint
|
451
|
+
throw(:menubarclose)
|
452
|
+
end
|
453
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Wrap",'W'))
|
454
|
+
item.command(@form, texta) do |it, form, testa|
|
455
|
+
#testa.goto_start
|
456
|
+
testa.handle_key ?\C-a.getbyte(0)
|
457
|
+
testa.wrap_para
|
458
|
+
testa.repaint
|
459
|
+
throw(:menubarclose)
|
460
|
+
end
|
461
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Exit",'X'))
|
462
|
+
item.command() {
|
463
|
+
#throw(:menubarclose);
|
464
|
+
throw(:close)
|
465
|
+
}
|
466
|
+
item = RubyCurses::CheckBoxMenuItem.new "Reverse"
|
467
|
+
# item.onvalue="On"
|
468
|
+
# item.offvalue="Off"
|
469
|
+
#item.checkbox.text "Labelcb"
|
470
|
+
#item.text="Labelcb"
|
471
|
+
# in next line, an explicit repaint is required since label is on another form.
|
472
|
+
item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' : 'normal'; label.attr(att); label.repaint}
|
473
|
+
@status_line = status_line :row => Ncurses.LINES-2
|
474
|
+
@status_line.command {
|
475
|
+
"F1 Help | F2 Menu | F3 View | F4 Shell | F5 Sh | %20s" % [$message.value]
|
476
|
+
}
|
477
|
+
row += 1 #2
|
478
|
+
ok_button = Button.new @form do
|
479
|
+
text "OK"
|
480
|
+
name "OK"
|
481
|
+
row row
|
482
|
+
col col
|
483
|
+
#attr 'reverse'
|
484
|
+
#highlight_background "white"
|
485
|
+
#highlight_foreground "blue"
|
486
|
+
mnemonic 'O'
|
487
|
+
end
|
488
|
+
ok_button.command() { |eve|
|
489
|
+
alert("Hope you enjoyed this demo ", {'title' => "Hello", :bgcolor => :blue, :color => :white})
|
490
|
+
sw = case @lookfeel
|
491
|
+
when :dialog
|
492
|
+
progress_dialog :color_pair => $reversecolor, :row_offset => 4, :col_offset => 5
|
493
|
+
else
|
494
|
+
status_window # at footer last 2 rows
|
495
|
+
end
|
496
|
+
|
497
|
+
sw.print "I am adding some stuff to list", "And testing out StatusWindow"
|
498
|
+
sleep 1.0
|
499
|
+
listb.list.insert 0, "hello ruby", "so long python", "farewell java", "RIP .Net"
|
500
|
+
sw.printstring 1,1, "And some more now ..."
|
501
|
+
sleep 0.5
|
502
|
+
listb.list.insert 0, "get milk", "make beds", "clean shark pond","sell summer house"
|
503
|
+
sleep 0.5
|
504
|
+
sw.print "This was a test of Window", "we are almost done now ..."
|
505
|
+
clock = %w[ | / - \ ]
|
506
|
+
listb.list.each_with_index { |e, index| sw.print e, clock[index%4]; sleep 0.1 }
|
507
|
+
sw.linger #@window
|
508
|
+
}
|
509
|
+
|
510
|
+
# using ampersand to set mnemonic
|
511
|
+
cancel_button = Button.new @form do
|
512
|
+
#variable $results
|
513
|
+
text "&Cancel"
|
514
|
+
row row
|
515
|
+
col col + 10
|
516
|
+
#attr 'reverse'
|
517
|
+
#highlight_background "white"
|
518
|
+
#highlight_foreground "blue"
|
519
|
+
#surround_chars ['{ ',' }'] ## change the surround chars
|
520
|
+
end
|
521
|
+
cancel_button.command { |aeve|
|
522
|
+
if @lookfeel == :dialog
|
523
|
+
ret = confirm("Do your really want to quit?")
|
524
|
+
else
|
525
|
+
ret = confirm_window("Do your really want to quit?")
|
526
|
+
end
|
527
|
+
if ret == :YES
|
528
|
+
throw(:close);
|
529
|
+
else
|
530
|
+
$message.value = "Quit aborted"
|
531
|
+
end
|
532
|
+
}
|
533
|
+
#col += 22
|
534
|
+
col += 15
|
535
|
+
require 'rbcurse/core/widgets/rprogress'
|
536
|
+
pbar = Progress.new @form, {:width => 20, :row => Ncurses.LINES-1, :col => Ncurses.COLS-20 ,
|
537
|
+
:bgcolor => 'white', :color => 'red', :name => "pbar"}
|
538
|
+
#len = 1
|
539
|
+
#pbar.fraction(len/100.0)
|
540
|
+
pbar.visible false
|
541
|
+
|
542
|
+
|
543
|
+
filemenu.add(item)
|
544
|
+
@mb.add(filemenu)
|
545
|
+
editmenu = RubyCurses::Menu.new "Edit"
|
546
|
+
item = RubyCurses::MenuItem.new "Cut"
|
547
|
+
editmenu.add(item)
|
548
|
+
item.accelerator = "Ctrl-X"
|
549
|
+
item=RubyCurses::MenuItem.new "Copy"
|
550
|
+
editmenu.add(item)
|
551
|
+
item.accelerator = "Ctrl-C"
|
552
|
+
item=RubyCurses::MenuItem.new "Paste"
|
553
|
+
editmenu.add(item)
|
554
|
+
item.accelerator = "Ctrl-V"
|
555
|
+
@mb.add(editmenu)
|
556
|
+
@mb.add(menu=RubyCurses::Menu.new("Others"))
|
557
|
+
#item=RubyCurses::MenuItem.new "Save","S"
|
558
|
+
item = RubyCurses::MenuItem.new "Options ..."
|
559
|
+
item.command() do |it|
|
560
|
+
require './testtabp'
|
561
|
+
tp = TestTabbedPane.new
|
562
|
+
tp.run
|
563
|
+
$message.value=$config_hash.inspect
|
564
|
+
$log.debug " returning with #{$config_hash}: #{$config_hash.inspect}"
|
565
|
+
end
|
566
|
+
menu.add(item)
|
567
|
+
item = RubyCurses::MenuItem.new "Options2 ..."
|
568
|
+
item.command() do |it|
|
569
|
+
require './newtabbedwindow'
|
570
|
+
tp = SetupTabbedPane.new
|
571
|
+
tp.run
|
572
|
+
$message.value=$config_hash.inspect
|
573
|
+
$log.debug " returning with #{$config_hash}: #{$config_hash.inspect}"
|
574
|
+
end
|
575
|
+
menu.add(item)
|
576
|
+
item = RubyCurses::MenuItem.new "Shell Command..."
|
577
|
+
item.command { shell_output }
|
578
|
+
menu.add(item)
|
579
|
+
savemenu = RubyCurses::Menu.new "Shell"
|
580
|
+
item = RubyCurses::MenuItem.new "Processes"
|
581
|
+
item.command { run_command "ps -l" }
|
582
|
+
savemenu.add(item)
|
583
|
+
item = RubyCurses::MenuItem.new "Files"
|
584
|
+
item.command { run_command "ls -l" }
|
585
|
+
savemenu.add(item)
|
586
|
+
item = RubyCurses::MenuItem.new "Disk"
|
587
|
+
item.command { run_command "df -h" }
|
588
|
+
savemenu.add(item)
|
589
|
+
menu.add(savemenu)
|
590
|
+
|
591
|
+
savemenu2 = RubyCurses::Menu.new "Git"
|
592
|
+
item = RubyCurses::MenuItem.new "Status"
|
593
|
+
item.command { run_command "git status" }
|
594
|
+
savemenu2.add(item)
|
595
|
+
item = RubyCurses::MenuItem.new "Diff"
|
596
|
+
item.command { run_command "git diff" }
|
597
|
+
savemenu2.add(item)
|
598
|
+
item = RubyCurses::MenuItem.new "Name"
|
599
|
+
item.command { run_command "git diff --name-status" }
|
600
|
+
savemenu2.add(item)
|
601
|
+
savemenu.add(savemenu2)
|
602
|
+
|
603
|
+
@mb.toggle_key = FFI::NCurses::KEY_F2
|
604
|
+
@form.set_menu_bar @mb
|
605
|
+
|
606
|
+
# END
|
607
|
+
@form.bind_key(FFI::NCurses::KEY_F3) {
|
608
|
+
require 'rbcurse/core/util/viewer'
|
609
|
+
RubyCurses::Viewer.view(path || "rbc13.log", :close_key => KEY_ENTER, :title => "<Enter> to close")
|
610
|
+
}
|
611
|
+
@form.bind_key(FFI::NCurses::KEY_F4) { shell_output }
|
612
|
+
@form.bind_key(FFI::NCurses::KEY_F5) { suspend }
|
613
|
+
@form.bind_key([?\C-x,?c]) { suspend }
|
614
|
+
@form.bind_key(?\M-!) { suspend }
|
615
|
+
@form.bind_key([?\C-x,?l]) { run_command "ls -al" }
|
616
|
+
@form.bind_key([?\C-x,?p]) { run_command "ps -l" }
|
617
|
+
@form.bind_key([?\C-x,?d]) { run_command "df -h" }
|
618
|
+
@form.bind_key([?\C-x,?d]) { run_command "git diff --name-status" }
|
619
|
+
@form.bind_key([?\C-x, ?s]) { run_command "git status" }
|
620
|
+
@form.bind_key([?\C-x,?w]) { run_command "git whatchanged" }
|
621
|
+
@form.bind_key(FFI::NCurses::KEY_F1) { display_app_help help_text() }
|
622
|
+
@form.repaint
|
623
|
+
@window.wrefresh
|
624
|
+
Ncurses::Panel.update_panels
|
625
|
+
|
626
|
+
# the main loop
|
627
|
+
|
628
|
+
while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
|
629
|
+
break if ch == ?\C-q.getbyte(0)
|
630
|
+
begin
|
631
|
+
@form.handle_key(ch)
|
632
|
+
|
633
|
+
rescue FieldValidationException => fve
|
634
|
+
alert fve.to_s
|
635
|
+
|
636
|
+
f = @form.get_current_field
|
637
|
+
# lets restore the value
|
638
|
+
if f.respond_to? :restore_original_value
|
639
|
+
f.restore_original_value
|
640
|
+
@form.repaint
|
641
|
+
end
|
642
|
+
$error_message.value = ""
|
643
|
+
rescue => err
|
644
|
+
$log.error( err) if err
|
645
|
+
$log.error(err.backtrace.join("\n")) if err
|
646
|
+
alert "Got an exception in test2: #{err} "
|
647
|
+
$error_message.value = ""
|
648
|
+
end
|
649
|
+
|
650
|
+
# this should be avoided, we should not muffle the exception and set a variable
|
651
|
+
# However, we have been doing that
|
652
|
+
if $error_message.get_value != ""
|
653
|
+
if @lookfeel == :dialog
|
654
|
+
alert($error_message, {:bgcolor => :red, 'color' => 'yellow'}) if $error_message.get_value != ""
|
655
|
+
else
|
656
|
+
print_error_message $error_message, {:bgcolor => :red, :color => :yellow}
|
657
|
+
end
|
658
|
+
$error_message.value = ""
|
659
|
+
end
|
660
|
+
|
661
|
+
@window.wrefresh
|
662
|
+
end # while loop
|
663
|
+
end # catch
|
664
|
+
rescue => ex
|
665
|
+
ensure
|
666
|
+
$log.debug " -==== EXCEPTION =====-"
|
667
|
+
$log.debug( ex) if ex
|
668
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
669
|
+
@window.destroy if !@window.nil?
|
670
|
+
VER::stop_ncurses
|
671
|
+
puts ex if ex
|
672
|
+
puts(ex.backtrace.join("\n")) if ex
|
673
|
+
end
|
674
|
+
end
|