rbcurse-extras 0.0.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/README.md +75 -0
- data/VERSION +1 -0
- data/examples/data/list.txt +300 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/table.txt +36 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/unix1.txt +21 -0
- data/examples/inc/qdfilechooser.rb +70 -0
- data/examples/inc/rfe_renderer.rb +121 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/rfe.rb +1236 -0
- data/examples/test2.rb +670 -0
- data/examples/testeditlist.rb +78 -0
- data/examples/testtable.rb +270 -0
- data/examples/testvimsplit.rb +141 -0
- data/lib/rbcurse/extras/include/celleditor.rb +112 -0
- data/lib/rbcurse/extras/include/checkboxcellrenderer.rb +57 -0
- data/lib/rbcurse/extras/include/comboboxcellrenderer.rb +30 -0
- data/lib/rbcurse/extras/include/defaultlistselectionmodel.rb +79 -0
- data/lib/rbcurse/extras/include/listkeys.rb +37 -0
- data/lib/rbcurse/extras/include/listselectable.rb +144 -0
- data/lib/rbcurse/extras/include/tableextended.rb +40 -0
- data/lib/rbcurse/extras/widgets/horizlist.rb +203 -0
- data/lib/rbcurse/extras/widgets/menutree.rb +63 -0
- data/lib/rbcurse/extras/widgets/multilinelabel.rb +142 -0
- data/lib/rbcurse/extras/widgets/rcomboedit.rb +256 -0
- data/lib/rbcurse/extras/widgets/rlink.rb.moved +27 -0
- data/lib/rbcurse/extras/widgets/rlistbox.rb +1247 -0
- data/lib/rbcurse/extras/widgets/rmenulink.rb.moved +21 -0
- data/lib/rbcurse/extras/widgets/rmulticontainer.rb +304 -0
- data/lib/rbcurse/extras/widgets/rmultisplit.rb +722 -0
- data/lib/rbcurse/extras/widgets/rmultitextview.rb +306 -0
- data/lib/rbcurse/extras/widgets/rpopupmenu.rb +755 -0
- data/lib/rbcurse/extras/widgets/rtable.rb +1758 -0
- data/lib/rbcurse/extras/widgets/rvimsplit.rb +800 -0
- data/lib/rbcurse/extras/widgets/table/tablecellrenderer.rb +86 -0
- data/lib/rbcurse/extras/widgets/table/tabledatecellrenderer.rb +98 -0
- metadata +94 -0
data/examples/test2.rb
ADDED
@@ -0,0 +1,670 @@
|
|
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) + "Original Demo of basic Ruby Curses Widgets " + 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.md","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
|
+
ct = (listb.size-1) * 1.00
|
187
|
+
pb.fraction(len/ct)
|
188
|
+
i = ((len/ct)*100).to_i
|
189
|
+
i = 100 if i > 100
|
190
|
+
pb.text = "completed:#{i}"
|
191
|
+
}
|
192
|
+
listb.bind(:LEAVE) {
|
193
|
+
pb = @form.by_name["pbar"]
|
194
|
+
pb.visible false
|
195
|
+
r = pb.row
|
196
|
+
c = pb.col
|
197
|
+
@window.wmove(r,c); @window.wclrtoeol
|
198
|
+
#@window.wrefresh
|
199
|
+
}
|
200
|
+
|
201
|
+
# just for demo, lets scroll the text view to the line you enter
|
202
|
+
@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) }
|
203
|
+
@form.by_name["regex"].bind(:LEAVE, @textview) { |fld, tv| tv.top_row(tv.find_first_match(fld.getvalue)) }
|
204
|
+
@form.by_name["regex"].bind(:CHANGED) { |fld|
|
205
|
+
$message.value = "REGEX CHANGED!!! #{fld.getvalue} " }
|
206
|
+
row = 17
|
207
|
+
col = 2
|
208
|
+
align = ComboBox.new @form do
|
209
|
+
name "combo"
|
210
|
+
row row
|
211
|
+
col fc
|
212
|
+
display_length 10
|
213
|
+
editable false
|
214
|
+
list %w[left right center]
|
215
|
+
set_label Label.new @form, {'text' => "Align", 'color'=>'cyan','col'=>1, "mnemonic"=>"I"}
|
216
|
+
list_config :color => :yellow, :bgcolor=>:blue
|
217
|
+
end
|
218
|
+
|
219
|
+
list = ListDataModel.new( %w[white yellow cyan magenta red blue black])
|
220
|
+
list.bind(:LIST_DATA_EVENT) { |lde| $message.value = lde.to_s; $log.debug " STA: #{$message.value} #{lde}"; }
|
221
|
+
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 }
|
222
|
+
|
223
|
+
row += 1
|
224
|
+
combo1 = ComboBoxEdit.new @form do
|
225
|
+
name "combo1"
|
226
|
+
row row
|
227
|
+
col fc
|
228
|
+
display_length 10
|
229
|
+
editable true
|
230
|
+
list_data_model list
|
231
|
+
set_label Label.new @form, {'text' => "Edit Combo",'color'=>'cyan','col'=>1}
|
232
|
+
list_config 'color' => 'white', 'bgcolor'=>'blue', 'max_visible_items' => 6, 'height' => 7
|
233
|
+
end
|
234
|
+
row += 1
|
235
|
+
checkbutton = CheckBox.new @form do
|
236
|
+
variable $results
|
237
|
+
#value = true
|
238
|
+
onvalue "Selected bold "
|
239
|
+
offvalue "UNselected bold"
|
240
|
+
text "Bold attribute "
|
241
|
+
display_length 18 # helps when right aligning
|
242
|
+
row row
|
243
|
+
col col
|
244
|
+
mnemonic 'B'
|
245
|
+
end
|
246
|
+
row += 1
|
247
|
+
@cb_rev = Variable.new false # related to checkbox reverse
|
248
|
+
cbb = @cb_rev
|
249
|
+
checkbutton1 = CheckBox.new @form do
|
250
|
+
variable cbb # $cb_rev
|
251
|
+
#value = true
|
252
|
+
onvalue "Selected reverse "
|
253
|
+
offvalue "UNselected reverse"
|
254
|
+
text "Reverse attribute "
|
255
|
+
display_length 18
|
256
|
+
row row
|
257
|
+
col col
|
258
|
+
mnemonic 'R'
|
259
|
+
end
|
260
|
+
row += 1
|
261
|
+
togglebutton = ToggleButton.new @form do
|
262
|
+
value true
|
263
|
+
onvalue " Toggle Down "
|
264
|
+
offvalue " Untoggle "
|
265
|
+
row row
|
266
|
+
col col
|
267
|
+
mnemonic 'T'
|
268
|
+
#underline 0
|
269
|
+
end
|
270
|
+
# a special case required since another form (combo popup also modifies)
|
271
|
+
$message.update_command() { message_label.repaint }
|
272
|
+
|
273
|
+
f = @form.by_name["line"]
|
274
|
+
f.display_length(3).set_buffer(24).valid_range(1..200).
|
275
|
+
maxlen(3).
|
276
|
+
type(:integer)
|
277
|
+
|
278
|
+
@form.by_name["name"].set_buffer( "Not focusable").
|
279
|
+
set_focusable(false)
|
280
|
+
|
281
|
+
@form.by_name["regex"].valid_regex(/^[A-Z][a-z]*/).
|
282
|
+
set_buffer( "SYNOP").
|
283
|
+
display_length(10).
|
284
|
+
maxlen = 20
|
285
|
+
|
286
|
+
@form.by_name["password"].set_buffer("").
|
287
|
+
show('*').
|
288
|
+
color('red').
|
289
|
+
values(%w[scotty tiger secret pass qwerty]).
|
290
|
+
null_allowed true
|
291
|
+
|
292
|
+
# a form level event, whenever any widget is focussed, make the label red
|
293
|
+
@form.bind(:ENTER) { |f| f.label && f.label.bgcolor = 'red' if f.respond_to? :label}
|
294
|
+
@form.bind(:LEAVE) { |f| f.label && f.label.bgcolor = 'black' if f.respond_to? :label}
|
295
|
+
|
296
|
+
row += 1
|
297
|
+
colorlabel = Label.new @form, {'text' => "Select a color:", "row" => row, "col" => col,
|
298
|
+
"color"=>"cyan", "mnemonic" => 'S'}
|
299
|
+
$radio = Variable.new
|
300
|
+
$radio.update_command(colorlabel) {|tv, label| label.color tv.value; }
|
301
|
+
$radio.update_command() {|tv| message_label.color tv.value; align.bgcolor tv.value;
|
302
|
+
combo1.bgcolor tv.value}
|
303
|
+
$radio.update_command() {|tv| @form.widgets.each { |e| next unless e.is_a? Widget;
|
304
|
+
e.bgcolor tv.value }; @mb.bgcolor = tv.value }
|
305
|
+
|
306
|
+
# whenever updated set colorlabel and messagelabel to bold
|
307
|
+
$results.update_command(colorlabel,checkbutton) {|tv, label, cb|
|
308
|
+
attrs = cb.value ? 'bold' : 'normal'; label.attr(attrs); message_label.attr(attrs)}
|
309
|
+
|
310
|
+
align.bind(:ENTER_ROW) {|fld| message_label.justify fld.getvalue}
|
311
|
+
|
312
|
+
align.bind(:ENTER_ROW) {|fld|
|
313
|
+
if fld.getvalue == 'right'
|
314
|
+
checkbutton1.align_right true
|
315
|
+
checkbutton.align_right true
|
316
|
+
else
|
317
|
+
checkbutton1.align_right false
|
318
|
+
checkbutton.align_right false
|
319
|
+
end
|
320
|
+
}
|
321
|
+
|
322
|
+
# whenever updated set colorlabel and messagelabel to reverse
|
323
|
+
#@cb_rev.update_command(colorlabel,checkbutton1) {|tv, label, cb| attrs = cb.value ? 'reverse' : nil; label.attr(attrs); message_label.attr(attrs)}
|
324
|
+
# changing nil to normal since PROP CHAN handler will not fire if nil being set.
|
325
|
+
@cb_rev.update_command(colorlabel,checkbutton1) {|tv, label, cb|
|
326
|
+
attrs = cb.value ? 'reverse' : 'normal'; label.attr(attrs); message_label.attr(attrs)}
|
327
|
+
|
328
|
+
row += 1
|
329
|
+
dlen = 10
|
330
|
+
radio1 = RadioButton.new @form do
|
331
|
+
variable $radio
|
332
|
+
text "red"
|
333
|
+
value "red"
|
334
|
+
color "red"
|
335
|
+
display_length dlen # helps when right aligning
|
336
|
+
row row
|
337
|
+
col col
|
338
|
+
end
|
339
|
+
radio11 = RadioButton.new @form do
|
340
|
+
variable $radio
|
341
|
+
text "c&yan"
|
342
|
+
value "cyan"
|
343
|
+
color "cyan"
|
344
|
+
display_length dlen # helps when right aligning
|
345
|
+
row row
|
346
|
+
col col+24
|
347
|
+
end
|
348
|
+
|
349
|
+
row += 1
|
350
|
+
radio2 = RadioButton.new @form do
|
351
|
+
variable $radio
|
352
|
+
text "&green"
|
353
|
+
value "green"
|
354
|
+
color "green"
|
355
|
+
display_length dlen # helps when right aligning
|
356
|
+
row row
|
357
|
+
col col
|
358
|
+
end
|
359
|
+
radio22 = RadioButton.new @form do
|
360
|
+
variable $radio
|
361
|
+
text "magenta"
|
362
|
+
value "magenta"
|
363
|
+
color "magenta"
|
364
|
+
display_length dlen # helps when right aligning
|
365
|
+
row row
|
366
|
+
col col+24
|
367
|
+
end
|
368
|
+
colorlabel.label_for radio1
|
369
|
+
align.bind(:ENTER_ROW) {|fld|
|
370
|
+
if fld.getvalue == 'right'
|
371
|
+
radio1.align_right true
|
372
|
+
radio2.align_right true
|
373
|
+
radio11.align_right true
|
374
|
+
radio22.align_right true
|
375
|
+
else
|
376
|
+
radio1.align_right false
|
377
|
+
radio2.align_right false
|
378
|
+
radio11.align_right false
|
379
|
+
radio22.align_right false
|
380
|
+
end
|
381
|
+
}
|
382
|
+
|
383
|
+
# instead of using frozen, I will use a PropertyVeto
|
384
|
+
# to disallow changes to color itself
|
385
|
+
veto = lambda { |e, name|
|
386
|
+
if e.property_name == 'color'
|
387
|
+
if e.newvalue != name
|
388
|
+
raise PropertyVetoException.new("Cannot change this at all!", e)
|
389
|
+
end
|
390
|
+
elsif e.property_name == 'bgcolor'
|
391
|
+
raise PropertyVetoException.new("Cannot change this!", e)
|
392
|
+
end
|
393
|
+
}
|
394
|
+
[radio1, radio2, radio11, radio22].each { |r|
|
395
|
+
r.bind(:PROPERTY_CHANGE) do |e| veto.call(e, r.text) end
|
396
|
+
}
|
397
|
+
|
398
|
+
#
|
399
|
+
# define the menu
|
400
|
+
#
|
401
|
+
@mb = RubyCurses::MenuBar.new
|
402
|
+
filemenu = RubyCurses::Menu.new "File"
|
403
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Open",'O'))
|
404
|
+
item.command(@form) {|it, form| $message.value = "Open called on menu bar";
|
405
|
+
require './inc//qdfilechooser'
|
406
|
+
fchooser = QDFileChooser.new
|
407
|
+
#option = fchooser.show_open_dialog
|
408
|
+
#$message.value = "File Selection #{option}, #{fchooser.get_selected_file}"
|
409
|
+
option = :dummy # we need to redo QDF as per new Messagebox
|
410
|
+
if option == :OK
|
411
|
+
filesel = fchooser.get_selected_file
|
412
|
+
if !filesel.nil?
|
413
|
+
texta.remove_all
|
414
|
+
content = File.open(filesel,"r").readlines
|
415
|
+
content.each do |line|
|
416
|
+
texta << line
|
417
|
+
end
|
418
|
+
else
|
419
|
+
alert "File name #{filesel} nil. Pls check code. "
|
420
|
+
end
|
421
|
+
else
|
422
|
+
alert "Functionality temporarily revoked due to change in Messagebox"
|
423
|
+
end
|
424
|
+
}
|
425
|
+
|
426
|
+
filemenu.insert_separator 1
|
427
|
+
filemenu.add(RubyCurses::MenuItem.new "New",'N')
|
428
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Save",'S'))
|
429
|
+
item.command() do |it|
|
430
|
+
filename = get_string("Please enter file to save in", 20, "t.t")
|
431
|
+
$message.value = "file: #{filename}"
|
432
|
+
filename ||= "tmpzzzz.tmp"
|
433
|
+
str = texta.to_s
|
434
|
+
File.open(filename, 'w') {|f| f.write(str) }
|
435
|
+
$message.value = " written #{str.length} bytes to file: #{filename}"
|
436
|
+
end
|
437
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Test",'T'))
|
438
|
+
item.command(@form, texta) do |it, form, testa|
|
439
|
+
$message.value = "Testing textarea"
|
440
|
+
str = File.open("data/lotr.txt",'r').readlines.join
|
441
|
+
#str = "Hello there good friends and fellow rubyists. Here is a textarea that I am testing out with"
|
442
|
+
#str << " some long data, to see how it acts, how the wrapping takes place. Sit back and enjoy the "
|
443
|
+
#str << " bugs as they crop up."
|
444
|
+
testa.goto_start
|
445
|
+
#testa.cursor_bol
|
446
|
+
testa.handle_key ?\C-a.getbyte(0)
|
447
|
+
str.each_char {|c| testa.putch(c)}
|
448
|
+
testa.repaint
|
449
|
+
3.times { testa.handle_key KEY_DOWN }
|
450
|
+
testa.handle_key ?\C-a.getbyte(0)
|
451
|
+
|
452
|
+
str.each_char {|c| testa.putch(c)}
|
453
|
+
$message.value = "Wrapping textarea"
|
454
|
+
testa.repaint
|
455
|
+
throw(:menubarclose)
|
456
|
+
end
|
457
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Wrap",'W'))
|
458
|
+
item.command(@form, texta) do |it, form, testa|
|
459
|
+
#testa.goto_start
|
460
|
+
testa.handle_key ?\C-a.getbyte(0)
|
461
|
+
testa.wrap_para
|
462
|
+
testa.repaint
|
463
|
+
throw(:menubarclose)
|
464
|
+
end
|
465
|
+
filemenu.add(item = RubyCurses::MenuItem.new("Exit",'X'))
|
466
|
+
item.command() {
|
467
|
+
#throw(:menubarclose);
|
468
|
+
throw(:close)
|
469
|
+
}
|
470
|
+
item = RubyCurses::CheckBoxMenuItem.new "Reverse"
|
471
|
+
# item.onvalue="On"
|
472
|
+
# item.offvalue="Off"
|
473
|
+
#item.checkbox.text "Labelcb"
|
474
|
+
#item.text="Labelcb"
|
475
|
+
# in next line, an explicit repaint is required since label is on another form.
|
476
|
+
item.command(colorlabel){|it, label| att = it.getvalue ? 'reverse' : 'normal'; label.attr(att); label.repaint}
|
477
|
+
@status_line = status_line :row => Ncurses.LINES-2
|
478
|
+
@status_line.command {
|
479
|
+
"F1 Help | F2 Menu | F3 View | F4 Shell | F5 Sh | %20s" % [$message.value]
|
480
|
+
}
|
481
|
+
row += 1 #2
|
482
|
+
ok_button = Button.new @form do
|
483
|
+
text "OK"
|
484
|
+
name "OK"
|
485
|
+
row row
|
486
|
+
col col
|
487
|
+
#attr 'reverse'
|
488
|
+
#highlight_background "white"
|
489
|
+
#highlight_foreground "blue"
|
490
|
+
mnemonic 'O'
|
491
|
+
end
|
492
|
+
ok_button.command() { |eve|
|
493
|
+
alert("Hope you enjoyed this demo ", {'title' => "Hello", :bgcolor => :blue, :color => :white})
|
494
|
+
sw = case @lookfeel
|
495
|
+
when :dialog
|
496
|
+
progress_dialog :color_pair => $reversecolor, :row_offset => 4, :col_offset => 5
|
497
|
+
else
|
498
|
+
status_window # at footer last 2 rows
|
499
|
+
end
|
500
|
+
|
501
|
+
sw.print "I am adding some stuff to list", "And testing out StatusWindow"
|
502
|
+
sleep 1.0
|
503
|
+
listb.list.insert 0, "hello ruby", "so long python", "farewell java", "RIP .Net"
|
504
|
+
sw.printstring 1,1, "And some more now ..."
|
505
|
+
sleep 0.5
|
506
|
+
listb.list.insert 0, "get milk", "make beds", "clean shark pond","sell summer house"
|
507
|
+
sleep 0.5
|
508
|
+
sw.print "This was a test of Window", "we are almost done now ..."
|
509
|
+
clock = %w[ | / - \ ]
|
510
|
+
listb.list.each_with_index { |e, index| sw.print e, clock[index%4]; sleep 0.1 }
|
511
|
+
sw.linger #@window
|
512
|
+
}
|
513
|
+
|
514
|
+
# using ampersand to set mnemonic
|
515
|
+
cancel_button = Button.new @form do
|
516
|
+
#variable $results
|
517
|
+
text "&Cancel"
|
518
|
+
name "Cancel"
|
519
|
+
row row
|
520
|
+
col col + 10
|
521
|
+
#attr 'reverse'
|
522
|
+
#highlight_background "white"
|
523
|
+
#highlight_foreground "blue"
|
524
|
+
#surround_chars ['{ ',' }'] ## change the surround chars
|
525
|
+
end
|
526
|
+
cancel_button.command { |aeve|
|
527
|
+
if @lookfeel == :dialog
|
528
|
+
ret = confirm("Do your really want to quit?")
|
529
|
+
else
|
530
|
+
ret = confirm_window("Do your really want to quit?")
|
531
|
+
end
|
532
|
+
if ret == :YES || ret == true
|
533
|
+
throw(:close);
|
534
|
+
else
|
535
|
+
$message.value = "Quit aborted"
|
536
|
+
end
|
537
|
+
}
|
538
|
+
#col += 22
|
539
|
+
col += 15
|
540
|
+
require 'rbcurse/core/widgets/rprogress'
|
541
|
+
pbar = Progress.new @form, {:width => 20, :row => Ncurses.LINES-1, :col => Ncurses.COLS-20 ,
|
542
|
+
:bgcolor => 'white', :color => 'red', :name => "pbar"}
|
543
|
+
#len = 1
|
544
|
+
#pbar.fraction(len/100.0)
|
545
|
+
pbar.visible false
|
546
|
+
|
547
|
+
|
548
|
+
filemenu.add(item)
|
549
|
+
@mb.add(filemenu)
|
550
|
+
editmenu = RubyCurses::Menu.new "Edit"
|
551
|
+
item = RubyCurses::MenuItem.new "Cut"
|
552
|
+
editmenu.add(item)
|
553
|
+
item.accelerator = "Ctrl-X"
|
554
|
+
item=RubyCurses::MenuItem.new "Copy"
|
555
|
+
editmenu.add(item)
|
556
|
+
item.accelerator = "Ctrl-C"
|
557
|
+
item=RubyCurses::MenuItem.new "Paste"
|
558
|
+
editmenu.add(item)
|
559
|
+
item.accelerator = "Ctrl-V"
|
560
|
+
@mb.add(editmenu)
|
561
|
+
@mb.add(menu=RubyCurses::Menu.new("Others"))
|
562
|
+
#item=RubyCurses::MenuItem.new "Save","S"
|
563
|
+
item = RubyCurses::MenuItem.new "Options ..."
|
564
|
+
item.command() do |it|
|
565
|
+
require './newtabbedwindow'
|
566
|
+
tp = SetupTabbedPane.new
|
567
|
+
tp.run
|
568
|
+
$message.value=$config_hash.inspect
|
569
|
+
$log.debug " returning with #{$config_hash}: #{$config_hash.inspect}"
|
570
|
+
end
|
571
|
+
menu.add(item)
|
572
|
+
item = RubyCurses::MenuItem.new "Shell Command..."
|
573
|
+
item.command { shell_output }
|
574
|
+
menu.add(item)
|
575
|
+
savemenu = RubyCurses::Menu.new "Shell"
|
576
|
+
item = RubyCurses::MenuItem.new "Processes"
|
577
|
+
item.command { run_command "ps -l" }
|
578
|
+
savemenu.add(item)
|
579
|
+
item = RubyCurses::MenuItem.new "Files"
|
580
|
+
item.command { run_command "ls -l" }
|
581
|
+
savemenu.add(item)
|
582
|
+
item = RubyCurses::MenuItem.new "Disk"
|
583
|
+
item.command { run_command "df -h" }
|
584
|
+
savemenu.add(item)
|
585
|
+
menu.add(savemenu)
|
586
|
+
|
587
|
+
savemenu2 = RubyCurses::Menu.new "Git"
|
588
|
+
item = RubyCurses::MenuItem.new "Status"
|
589
|
+
item.command { run_command "git status" }
|
590
|
+
savemenu2.add(item)
|
591
|
+
item = RubyCurses::MenuItem.new "Diff"
|
592
|
+
item.command { run_command "git diff" }
|
593
|
+
savemenu2.add(item)
|
594
|
+
item = RubyCurses::MenuItem.new "Name"
|
595
|
+
item.command { run_command "git diff --name-status" }
|
596
|
+
savemenu2.add(item)
|
597
|
+
savemenu.add(savemenu2)
|
598
|
+
|
599
|
+
@mb.toggle_key = FFI::NCurses::KEY_F2
|
600
|
+
@form.set_menu_bar @mb
|
601
|
+
|
602
|
+
# END
|
603
|
+
@form.bind_key(FFI::NCurses::KEY_F3,'view log') {
|
604
|
+
require 'rbcurse/core/util/viewer'
|
605
|
+
RubyCurses::Viewer.view(path || "rbc13.log", :close_key => KEY_ENTER, :title => "<Enter> to close")
|
606
|
+
}
|
607
|
+
@form.bind_key(FFI::NCurses::KEY_F4, 'system command') { shell_output }
|
608
|
+
@form.bind_key(FFI::NCurses::KEY_F5, 'shell') { suspend }
|
609
|
+
@form.bind_key([?\C-x,?c], 'shell') { suspend }
|
610
|
+
@form.bind_key(?\M-!, 'shell') { suspend }
|
611
|
+
@form.bind_key([?\C-x,?l], 'ls -al') { run_command "ls -al" }
|
612
|
+
@form.bind_key([?\C-x,?p], 'ps -l') { run_command "ps -l" }
|
613
|
+
@form.bind_key([?\C-x,?d], 'df -h') { run_command "df -h" }
|
614
|
+
@form.bind_key([?\C-x,?d], 'git diff') { run_command "git diff --name-status" }
|
615
|
+
@form.bind_key([?\C-x, ?s], 'git st') { run_command "git status" }
|
616
|
+
@form.bind_key([?\C-x,?w], 'git whatchanged') { run_command "git whatchanged" }
|
617
|
+
@form.bind_key(FFI::NCurses::KEY_F1, 'help') { display_app_help help_text() }
|
618
|
+
@form.repaint
|
619
|
+
@window.wrefresh
|
620
|
+
Ncurses::Panel.update_panels
|
621
|
+
|
622
|
+
# the main loop
|
623
|
+
|
624
|
+
while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
|
625
|
+
break if ch == ?\C-q.getbyte(0)
|
626
|
+
begin
|
627
|
+
@form.handle_key(ch)
|
628
|
+
|
629
|
+
rescue FieldValidationException => fve
|
630
|
+
alert fve.to_s
|
631
|
+
|
632
|
+
f = @form.get_current_field
|
633
|
+
# lets restore the value
|
634
|
+
if f.respond_to? :restore_original_value
|
635
|
+
f.restore_original_value
|
636
|
+
@form.repaint
|
637
|
+
end
|
638
|
+
$error_message.value = ""
|
639
|
+
rescue => err
|
640
|
+
$log.error( err) if err
|
641
|
+
$log.error(err.backtrace.join("\n")) if err
|
642
|
+
textdialog err
|
643
|
+
$error_message.value = ""
|
644
|
+
end
|
645
|
+
|
646
|
+
# this should be avoided, we should not muffle the exception and set a variable
|
647
|
+
# However, we have been doing that
|
648
|
+
if $error_message.get_value != ""
|
649
|
+
if @lookfeel == :dialog
|
650
|
+
alert($error_message, {:bgcolor => :red, 'color' => 'yellow'}) if $error_message.get_value != ""
|
651
|
+
else
|
652
|
+
print_error_message $error_message, {:bgcolor => :red, :color => :yellow}
|
653
|
+
end
|
654
|
+
$error_message.value = ""
|
655
|
+
end
|
656
|
+
|
657
|
+
@window.wrefresh
|
658
|
+
end # while loop
|
659
|
+
end # catch
|
660
|
+
rescue => ex
|
661
|
+
ensure
|
662
|
+
$log.debug " -==== EXCEPTION =====-"
|
663
|
+
$log.debug( ex) if ex
|
664
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
665
|
+
@window.destroy if !@window.nil?
|
666
|
+
VER::stop_ncurses
|
667
|
+
puts ex if ex
|
668
|
+
puts(ex.backtrace.join("\n")) if ex
|
669
|
+
end
|
670
|
+
end
|