canis 0.0.4
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.
- checksums.yaml +7 -0
- data/.gitignore +45 -0
- data/CHANGES +52 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +2 -0
- data/canis.gemspec +25 -0
- data/examples/alpmenu.rb +46 -0
- data/examples/app.sample +19 -0
- data/examples/appemail.rb +191 -0
- data/examples/atree.rb +105 -0
- data/examples/bline.rb +181 -0
- data/examples/common/devel.rb +319 -0
- data/examples/common/file.rb +93 -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 +59 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/ports.txt +136 -0
- data/examples/data/table.txt +37 -0
- data/examples/data/tasks.csv +88 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/todo.txt +16 -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 +506 -0
- data/examples/dirtree.rb +177 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/newtesttabp.rb +92 -0
- data/examples/tabular.rb +212 -0
- data/examples/tasks.rb +179 -0
- data/examples/term2.rb +88 -0
- data/examples/testbuttons.rb +307 -0
- data/examples/testcombo.rb +102 -0
- data/examples/testdb.rb +182 -0
- data/examples/testfields.rb +208 -0
- data/examples/testflowlayout.rb +43 -0
- data/examples/testkeypress.rb +98 -0
- data/examples/testlistbox.rb +187 -0
- data/examples/testlistbox1.rb +199 -0
- data/examples/testmessagebox.rb +144 -0
- data/examples/testprogress.rb +116 -0
- data/examples/testree.rb +107 -0
- data/examples/testsplitlayout.rb +53 -0
- data/examples/testsplitlayout1.rb +49 -0
- data/examples/teststacklayout.rb +48 -0
- data/examples/testwsshortcuts.rb +68 -0
- data/examples/testwsshortcuts2.rb +129 -0
- data/lib/canis.rb +16 -0
- data/lib/canis/core/docs/index.txt +104 -0
- data/lib/canis/core/docs/list.txt +16 -0
- data/lib/canis/core/docs/style_help.yml +34 -0
- data/lib/canis/core/docs/tabbedpane.txt +15 -0
- data/lib/canis/core/docs/table.txt +31 -0
- data/lib/canis/core/docs/textpad.txt +48 -0
- data/lib/canis/core/docs/tree.txt +23 -0
- data/lib/canis/core/include/.DS_Store +0 -0
- data/lib/canis/core/include/action.rb +83 -0
- data/lib/canis/core/include/actionmanager.rb +49 -0
- data/lib/canis/core/include/appmethods.rb +179 -0
- data/lib/canis/core/include/bordertitle.rb +49 -0
- data/lib/canis/core/include/canisparser.rb +100 -0
- data/lib/canis/core/include/colorparser.rb +437 -0
- data/lib/canis/core/include/defaultfilerenderer.rb +64 -0
- data/lib/canis/core/include/io.rb +320 -0
- data/lib/canis/core/include/layouts/SplitLayout.rb +161 -0
- data/lib/canis/core/include/layouts/abstractlayout.rb +213 -0
- data/lib/canis/core/include/layouts/flowlayout.rb +104 -0
- data/lib/canis/core/include/layouts/stacklayout.rb +109 -0
- data/lib/canis/core/include/listbindings.rb +89 -0
- data/lib/canis/core/include/listeditable.rb +319 -0
- data/lib/canis/core/include/listoperations.rb +61 -0
- data/lib/canis/core/include/listselectionmodel.rb +388 -0
- data/lib/canis/core/include/multibuffer.rb +173 -0
- data/lib/canis/core/include/ractionevent.rb +73 -0
- data/lib/canis/core/include/rchangeevent.rb +27 -0
- data/lib/canis/core/include/rhistory.rb +95 -0
- data/lib/canis/core/include/rinputdataevent.rb +47 -0
- data/lib/canis/core/include/textdocument.rb +111 -0
- data/lib/canis/core/include/vieditable.rb +175 -0
- data/lib/canis/core/include/widgetmenu.rb +66 -0
- data/lib/canis/core/system/colormap.rb +165 -0
- data/lib/canis/core/system/keydefs.rb +32 -0
- data/lib/canis/core/system/ncurses.rb +237 -0
- data/lib/canis/core/system/panel.rb +129 -0
- data/lib/canis/core/system/window.rb +1081 -0
- data/lib/canis/core/util/ansiparser.rb +119 -0
- data/lib/canis/core/util/app.rb +696 -0
- data/lib/canis/core/util/basestack.rb +412 -0
- data/lib/canis/core/util/defaultcolorparser.rb +84 -0
- data/lib/canis/core/util/extras/README +5 -0
- data/lib/canis/core/util/extras/bottomline.rb +1815 -0
- data/lib/canis/core/util/extras/padreader.rb +192 -0
- data/lib/canis/core/util/focusmanager.rb +31 -0
- data/lib/canis/core/util/helpmanager.rb +160 -0
- data/lib/canis/core/util/oldwidgetshortcuts.rb +304 -0
- data/lib/canis/core/util/promptmenu.rb +235 -0
- data/lib/canis/core/util/rcommandwindow.rb +933 -0
- data/lib/canis/core/util/rdialogs.rb +520 -0
- data/lib/canis/core/util/textutils.rb +74 -0
- data/lib/canis/core/util/viewer.rb +238 -0
- data/lib/canis/core/util/widgetshortcuts.rb +508 -0
- data/lib/canis/core/widgets/applicationheader.rb +103 -0
- data/lib/canis/core/widgets/box.rb +58 -0
- data/lib/canis/core/widgets/divider.rb +310 -0
- data/lib/canis/core/widgets/extras/README.md +12 -0
- data/lib/canis/core/widgets/extras/rtextarea.rb +960 -0
- data/lib/canis/core/widgets/extras/stackflow.rb +474 -0
- data/lib/canis/core/widgets/keylabelprinter.rb +194 -0
- data/lib/canis/core/widgets/listbox.rb +326 -0
- data/lib/canis/core/widgets/listfooter.rb +86 -0
- data/lib/canis/core/widgets/rcombo.rb +210 -0
- data/lib/canis/core/widgets/rcontainer.rb +415 -0
- data/lib/canis/core/widgets/rlink.rb +30 -0
- data/lib/canis/core/widgets/rmenu.rb +970 -0
- data/lib/canis/core/widgets/rmenulink.rb +30 -0
- data/lib/canis/core/widgets/rmessagebox.rb +400 -0
- data/lib/canis/core/widgets/rprogress.rb +118 -0
- data/lib/canis/core/widgets/rtabbedpane.rb +631 -0
- data/lib/canis/core/widgets/rtabbedwindow.rb +70 -0
- data/lib/canis/core/widgets/rwidget.rb +3634 -0
- data/lib/canis/core/widgets/scrollbar.rb +147 -0
- data/lib/canis/core/widgets/statusline.rb +113 -0
- data/lib/canis/core/widgets/table.rb +1072 -0
- data/lib/canis/core/widgets/tabular.rb +264 -0
- data/lib/canis/core/widgets/textpad.rb +1674 -0
- data/lib/canis/core/widgets/tree.rb +690 -0
- data/lib/canis/core/widgets/tree/treecellrenderer.rb +150 -0
- data/lib/canis/core/widgets/tree/treemodel.rb +432 -0
- data/lib/canis/version.rb +3 -0
- metadata +229 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'logger'
|
|
2
|
+
require 'canis'
|
|
3
|
+
require 'canis/core/widgets/rcombo'
|
|
4
|
+
require 'canis/core/include/appmethods.rb'
|
|
5
|
+
def help_text
|
|
6
|
+
<<-eos
|
|
7
|
+
# COMBO HELP
|
|
8
|
+
|
|
9
|
+
This is some help text for |Combos|
|
|
10
|
+
|
|
11
|
+
You may press <SPACE> to invoke the popup and then use arrow keys to traverse. (j and k may also work)
|
|
12
|
+
'v' on the popup to select (or whatever has been set as $row_selector (#{keycode_tos($row_selector)}) )
|
|
13
|
+
|
|
14
|
+
You may press the first character of the desired item to see all those items starting with that char.
|
|
15
|
+
e.g. pressing "v" will cycle through vt100 and vt102
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
If the `arrow_key_policy` is set to `:popup` then a down arrow will also invoke popup. However, if you
|
|
19
|
+
prefer the down arrow to go to the next field, use `:ignore`. In that case, only <SPACE> can trigger POPUP.
|
|
20
|
+
|
|
21
|
+
-----------------------------------------------------------------------
|
|
22
|
+
eos
|
|
23
|
+
end
|
|
24
|
+
if $0 == __FILE__
|
|
25
|
+
|
|
26
|
+
include Canis
|
|
27
|
+
include Canis::Utils
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
# Initialize curses
|
|
31
|
+
Canis::start_ncurses # this is initializing colors via ColorMap.setup
|
|
32
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"canis14.log")
|
|
33
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
|
34
|
+
$log = Logger.new(path)
|
|
35
|
+
$log.level = Logger::DEBUG
|
|
36
|
+
|
|
37
|
+
@window = Canis::Window.root_window
|
|
38
|
+
# Initialize few color pairs
|
|
39
|
+
# Create the window to be associated with the form
|
|
40
|
+
# Un post form and free the memory
|
|
41
|
+
|
|
42
|
+
catch(:close) do
|
|
43
|
+
colors = Ncurses.COLORS
|
|
44
|
+
$log.debug "START #{colors} colors testcombo.rb --------- #{@window} "
|
|
45
|
+
@form = Form.new @window
|
|
46
|
+
title = (" "*30) + "Demo of Combo (F10 quits, F1 help, SPACE to popup combo) " + Canis::VERSION
|
|
47
|
+
Label.new @form, {:text => title, :row => 1, :col => 0, :color => :green, :bgcolor => :black}
|
|
48
|
+
r = 3; fc = 12;
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
cb = ComboBox.new @form, :row => 7, :col => 2, :width => 20,
|
|
53
|
+
:list => %w[xterm xterm-color xterm-256color screen vt100 vt102],
|
|
54
|
+
:arrow_key_policy => :popup,
|
|
55
|
+
:label => "Declare terminal as: "
|
|
56
|
+
|
|
57
|
+
# arrow_key_policy can be popup or ignore
|
|
58
|
+
# width is used to place combo symbol and popup and should be calculated
|
|
59
|
+
# from label.text
|
|
60
|
+
|
|
61
|
+
@form.help_manager.help_text = help_text
|
|
62
|
+
#@form.bind_key(FFI::NCurses::KEY_F1, 'help') { display_app_help help_text() }
|
|
63
|
+
#@form.bind_key(FFI::NCurses::KEY_F1, 'help') { display_app_help }
|
|
64
|
+
@form.repaint
|
|
65
|
+
@window.wrefresh
|
|
66
|
+
Ncurses::Panel.update_panels
|
|
67
|
+
|
|
68
|
+
# the main loop
|
|
69
|
+
|
|
70
|
+
while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
|
|
71
|
+
break if ch == ?\C-q.getbyte(0)
|
|
72
|
+
begin
|
|
73
|
+
@form.handle_key(ch)
|
|
74
|
+
|
|
75
|
+
rescue => err
|
|
76
|
+
$log.error( err) if err
|
|
77
|
+
$log.error(err.backtrace.join("\n")) if err
|
|
78
|
+
textdialog err
|
|
79
|
+
$error_message.value = ""
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# this should be avoided, we should not muffle the exception and set a variable
|
|
83
|
+
# However, we have been doing that
|
|
84
|
+
if $error_message.get_value != ""
|
|
85
|
+
alert($error_message, {:bgcolor => :red, 'color' => 'yellow'}) if $error_message.get_value != ""
|
|
86
|
+
$error_message.value = ""
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
@window.wrefresh
|
|
90
|
+
end # while loop
|
|
91
|
+
end # catch
|
|
92
|
+
rescue => ex
|
|
93
|
+
ensure
|
|
94
|
+
$log.debug " -==== EXCEPTION =====-"
|
|
95
|
+
$log.debug( ex) if ex
|
|
96
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
97
|
+
@window.destroy if !@window.nil?
|
|
98
|
+
Canis::stop_ncurses
|
|
99
|
+
puts ex if ex
|
|
100
|
+
puts(ex.backtrace.join("\n")) if ex
|
|
101
|
+
end
|
|
102
|
+
end
|
data/examples/testdb.rb
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# Using tablewidget with sqlite3 resultset
|
|
4
|
+
# TODO : make columns hidden on key - toggle, how to get back then
|
|
5
|
+
# TODO : move column position
|
|
6
|
+
# TODO : filter column
|
|
7
|
+
# TODO : menu on C-x to delete a column, hide unhide expand etc, use pad menu
|
|
8
|
+
require 'logger'
|
|
9
|
+
require 'canis'
|
|
10
|
+
require 'canis/core/widgets/table'
|
|
11
|
+
require 'sqlite3'
|
|
12
|
+
#
|
|
13
|
+
def get_data
|
|
14
|
+
dbname = "movie.sqlite"
|
|
15
|
+
raise unless File.exists? dbname
|
|
16
|
+
db = SQLite3::Database.new(dbname)
|
|
17
|
+
sql = "select * from movie"
|
|
18
|
+
$columns, *rows = db.execute2(sql)
|
|
19
|
+
content = rows
|
|
20
|
+
return nil if content.nil? or content[0].nil?
|
|
21
|
+
$datatypes = content[0].types #if @datatypes.nil?
|
|
22
|
+
return content
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def edit_row tw
|
|
26
|
+
row = tw.current_value
|
|
27
|
+
h = tw.columns
|
|
28
|
+
_edit h, row, " Edit "
|
|
29
|
+
tw.fire_row_changed tw.current_index
|
|
30
|
+
end
|
|
31
|
+
def insert_row tw
|
|
32
|
+
h = tw.columns
|
|
33
|
+
row = []
|
|
34
|
+
h.each { |e| row << "" }
|
|
35
|
+
ret = _edit h, row, "Insert"
|
|
36
|
+
if ret
|
|
37
|
+
tw.add row
|
|
38
|
+
tw.fire_dimension_changed
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# making a generic edit messagebox - quick dirty
|
|
43
|
+
def _edit h, row, title
|
|
44
|
+
_l = longest_in_list h
|
|
45
|
+
_w = _l.size
|
|
46
|
+
# _w can be longer than 70, assuming that screen is 70 or more
|
|
47
|
+
config = { :width => 70, :title => title }
|
|
48
|
+
bw = get_color $datacolor, :black, :white
|
|
49
|
+
mb = MessageBox.new config do
|
|
50
|
+
txt = nil
|
|
51
|
+
h.each_with_index { |f, i|
|
|
52
|
+
txt = row[i] || ""
|
|
53
|
+
add LabeledField.new :label => "%*s:" % [_w, f], :text => txt.chomp, :name => i.to_s,
|
|
54
|
+
:bgcolor => :cyan,
|
|
55
|
+
:width => 50,
|
|
56
|
+
:label_color_pair => bw
|
|
57
|
+
}
|
|
58
|
+
button_type :ok_cancel
|
|
59
|
+
end
|
|
60
|
+
index = mb.run
|
|
61
|
+
return nil if index != 0
|
|
62
|
+
h.each_with_index { |e, i|
|
|
63
|
+
f = mb.widget(i.to_s)
|
|
64
|
+
row[i] = f.text
|
|
65
|
+
}
|
|
66
|
+
row
|
|
67
|
+
end
|
|
68
|
+
begin
|
|
69
|
+
# Initialize curses
|
|
70
|
+
Canis::start_ncurses # this is initializing colors via ColorMap.setup
|
|
71
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"canis14.log")
|
|
72
|
+
logfilename = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
|
73
|
+
$log = Logger.new(logfilename)
|
|
74
|
+
$log.level = Logger::DEBUG
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
colors = Ncurses.COLORS
|
|
78
|
+
back = :black
|
|
79
|
+
lineback = :blue
|
|
80
|
+
back = 234 if colors >= 256
|
|
81
|
+
lineback = 236 if colors >= 256
|
|
82
|
+
|
|
83
|
+
catch(:close) do
|
|
84
|
+
@window = Canis::Window.root_window
|
|
85
|
+
@form = Form.new @window
|
|
86
|
+
|
|
87
|
+
#header = app_header "0.0.1", :text_center => "Movie Database", :text_right =>"" , :name => "header" , :color => :white, :bgcolor => lineback , :attr => :bold
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
_col = "#[fg=yellow]"
|
|
92
|
+
$message = Variable.new
|
|
93
|
+
$message.value = ""
|
|
94
|
+
=begin
|
|
95
|
+
@status_line = status_line :row => Ncurses.LINES-1 #, :bgcolor => :red, :color => :yellow
|
|
96
|
+
@status_line.command {
|
|
97
|
+
"#[bg=236, fg=black]#{_col}F1#[/end] Help | #{_col}?#[/end] Keys | #{_col}M-c#[/end] Ask | #{_col}M-d#[/end] History | #{_col}M-m#[/end] Methods | %20s" % [$message.value]
|
|
98
|
+
}
|
|
99
|
+
=end
|
|
100
|
+
|
|
101
|
+
h = FFI::NCurses.LINES-4
|
|
102
|
+
w = FFI::NCurses.COLS
|
|
103
|
+
r = 1
|
|
104
|
+
#header = %w[ Pos Last Title Director Year Country Mins BW]
|
|
105
|
+
#file = "movies1000.txt"
|
|
106
|
+
|
|
107
|
+
arr = get_data
|
|
108
|
+
tv = Canis::Table.new @form, :row => 1, :col => 0, :height => h, :width => w, :name => "tv", :suppress_borders => false do |b|
|
|
109
|
+
|
|
110
|
+
b.resultset $columns, arr
|
|
111
|
+
|
|
112
|
+
b.model_row 1
|
|
113
|
+
b.column_width 0, 5
|
|
114
|
+
#b.get_column(2).color = :red
|
|
115
|
+
#b.get_column(3).color = :yellow
|
|
116
|
+
#b.get_column(2).bgcolor = :blue
|
|
117
|
+
b.column_width 1, 5
|
|
118
|
+
b.column_width 4, 5
|
|
119
|
+
#b.column_width 2, 5
|
|
120
|
+
b.column_align 6, :right
|
|
121
|
+
#b.column_width 2, b.calculate_column_width(2)
|
|
122
|
+
b.column_width 2, 50
|
|
123
|
+
b.column_width 3, 25
|
|
124
|
+
b.column_width 5, 10
|
|
125
|
+
#b.column_width 3, 55
|
|
126
|
+
#b.column_hidden 1, true
|
|
127
|
+
end
|
|
128
|
+
mcr = Canis::DefaultTableRenderer.new tv
|
|
129
|
+
mcr.header_colors :white, :red
|
|
130
|
+
tv.renderer mcr
|
|
131
|
+
mcr.column_model ( tv.column_model )
|
|
132
|
+
tv.create_default_sorter
|
|
133
|
+
tv.move_column 1,-1
|
|
134
|
+
|
|
135
|
+
# pressing ENTER on a method name will popup details for that method
|
|
136
|
+
tv.bind(:PRESS) { |ev|
|
|
137
|
+
if @current_index > 0
|
|
138
|
+
w = ev.word_under_cursor.strip
|
|
139
|
+
w = ev.text
|
|
140
|
+
# the curpos does not correspond to the formatted display, this is just the array
|
|
141
|
+
# without the width info XXX
|
|
142
|
+
alert "#{ev.current_index}, #{ev.curpos}: #{w}"
|
|
143
|
+
end
|
|
144
|
+
}
|
|
145
|
+
tv.bind_key(?e) { edit_row(tv) }
|
|
146
|
+
tv.bind_key(?i) { insert_row(tv) }
|
|
147
|
+
tv.bind_key(?D) { tv.delete_at tv.current_index }
|
|
148
|
+
@form.bind_key(?\M-c, "Filter") {
|
|
149
|
+
tv = @form.by_name["tv"];
|
|
150
|
+
str = get_string "Enter name of director:"
|
|
151
|
+
if str && str.length > 0
|
|
152
|
+
m = tv.matching_indices do |ix, fields|
|
|
153
|
+
fields[3] =~ /#{str}/i
|
|
154
|
+
end
|
|
155
|
+
else
|
|
156
|
+
tv.clear_matches
|
|
157
|
+
end
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
$message.value = "#{tv.current_index}: #{tv.lastrow}, #{tv.lastcol}"
|
|
162
|
+
@form.repaint
|
|
163
|
+
@window.wrefresh
|
|
164
|
+
Ncurses::Panel.update_panels
|
|
165
|
+
while((ch = @window.getchar()) != KEY_F10 )
|
|
166
|
+
break if ch == ?q.ord || ch == ?\C-q.getbyte(0)
|
|
167
|
+
@form.handle_key(ch)
|
|
168
|
+
$message.value = "#{tv.current_index}: #{tv.lastrow}, #{tv.lastcol}"
|
|
169
|
+
@window.wrefresh
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
rescue => ex
|
|
173
|
+
textdialog ["Error in rib: #{ex} ", *ex.backtrace], :title => "Exception"
|
|
174
|
+
$log.debug( ex) if ex
|
|
175
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
176
|
+
ensure
|
|
177
|
+
@window.destroy if !@window.nil?
|
|
178
|
+
Canis::stop_ncurses
|
|
179
|
+
p ex if ex
|
|
180
|
+
p(ex.backtrace.join("\n")) if ex
|
|
181
|
+
end
|
|
182
|
+
# a test renderer to see how things go
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
require 'logger'
|
|
2
|
+
require 'canis'
|
|
3
|
+
require 'canis/core/include/appmethods.rb'
|
|
4
|
+
def help_text
|
|
5
|
+
<<-eos
|
|
6
|
+
# FIELD HELP
|
|
7
|
+
|
|
8
|
+
This is some help text for |Fields|
|
|
9
|
+
|
|
10
|
+
*Name* is non-focusable
|
|
11
|
+
*Line* takes numbers from 1 to 200
|
|
12
|
+
*Regex* takes only alpha
|
|
13
|
+
*Password* takes only scotty or tiger or pass or qwerty, and can be left blank
|
|
14
|
+
|
|
15
|
+
Use Alt (meta) with the highlighted character to jump to that field.
|
|
16
|
+
<Alt-m> goes to line, <Alt-p> to password.
|
|
17
|
+
|
|
18
|
+
Notice how the field label (for first 3 fields) becomes red when focused (as in Pine/Alpine). This uses
|
|
19
|
+
the event `:ENTER` and `:LEAVE` and +set_label+. The other fields use `LabeledField+. In the first 3, the
|
|
20
|
+
labels row and col have not been specified, so are calculated. In the last 3, label's lcol and lrow are
|
|
21
|
+
specified for custom placement.
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
>
|
|
25
|
+
F10 - Exit application (also C-q)
|
|
26
|
+
Alt-! - Drop to shell
|
|
27
|
+
C-x c - Drop to shell
|
|
28
|
+
C-x l - list of files
|
|
29
|
+
C-x p - process list
|
|
30
|
+
C-x d - disk usage list
|
|
31
|
+
C-x s - Git status
|
|
32
|
+
C-x w - Git whatchanged
|
|
33
|
+
Alt-x - Command mode (<tab> to see commands and select)
|
|
34
|
+
|
|
35
|
+
F3 - View log
|
|
36
|
+
F4 - prompt for unix command and display in viewer
|
|
37
|
+
F5 - Drop to shell
|
|
38
|
+
<
|
|
39
|
+
|
|
40
|
+
-----------------------------------------------------------------------
|
|
41
|
+
eos
|
|
42
|
+
end
|
|
43
|
+
if $0 == __FILE__
|
|
44
|
+
|
|
45
|
+
include Canis
|
|
46
|
+
include Canis::Utils
|
|
47
|
+
|
|
48
|
+
begin
|
|
49
|
+
# Initialize curses
|
|
50
|
+
Canis::start_ncurses # this is initializing colors via ColorMap.setup
|
|
51
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"canis14.log")
|
|
52
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
|
53
|
+
$log = Logger.new(path)
|
|
54
|
+
$log.level = Logger::DEBUG
|
|
55
|
+
|
|
56
|
+
@lookfeel = :classic # :dialog # or :classic
|
|
57
|
+
|
|
58
|
+
@window = Canis::Window.root_window
|
|
59
|
+
# Initialize few color pairs
|
|
60
|
+
# Create the window to be associated with the form
|
|
61
|
+
# Un post form and free the memory
|
|
62
|
+
|
|
63
|
+
catch(:close) do
|
|
64
|
+
colors = Ncurses.COLORS
|
|
65
|
+
$log.debug "START #{colors} colors testfield.rb --------- #{@window} "
|
|
66
|
+
@form = Form.new @window
|
|
67
|
+
title = (" "*30) + "Demo of Field (F10 quits, F1 help) " + Canis::VERSION
|
|
68
|
+
Label.new @form, {:text => title, :row => 1, :col => 0, :color => :green, :bgcolor => :black}
|
|
69
|
+
r = 3; fc = 12;
|
|
70
|
+
mnemonics = %w[ n l r p]
|
|
71
|
+
%w[ name line regex password].each_with_index do |w,i|
|
|
72
|
+
field = Field.new @form do
|
|
73
|
+
name w
|
|
74
|
+
row r
|
|
75
|
+
col fc
|
|
76
|
+
width 30
|
|
77
|
+
#text "abcd "
|
|
78
|
+
set_label Label.new @form, {:text => w, :color=> :cyan, :mnemonic => mnemonics[i]}
|
|
79
|
+
end
|
|
80
|
+
r += 1
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
f = @form.by_name["line"]
|
|
84
|
+
f.width(3).text(24).valid_range(1..200).
|
|
85
|
+
maxlen(3).
|
|
86
|
+
type(:integer)
|
|
87
|
+
|
|
88
|
+
@form.by_name["name"].text( "Not focusable").
|
|
89
|
+
focusable(false)
|
|
90
|
+
|
|
91
|
+
@form.by_name["regex"].valid_regex(/^[A-Z][a-z]*/).
|
|
92
|
+
text( "SYNOP").
|
|
93
|
+
width(10).
|
|
94
|
+
maxlen = 20
|
|
95
|
+
|
|
96
|
+
@form.by_name["password"].text("").
|
|
97
|
+
mask('*').
|
|
98
|
+
color(:red).
|
|
99
|
+
values(%w[scotty tiger secret pass qwerty]).
|
|
100
|
+
null_allowed true
|
|
101
|
+
|
|
102
|
+
r += 3
|
|
103
|
+
l1 = Label.new @form, :name => "LabeledField", :attr => 'bold', :text => "Profile", :row => r, :col => fc
|
|
104
|
+
r += 1
|
|
105
|
+
f1 = LabeledField.new @form, :name => "name1", :maxlen => 20, :width => 20, :bgcolor => :white,
|
|
106
|
+
:color => :black, :text => "abc", :label => ' Name: ', :row => r, :col => fc
|
|
107
|
+
r += 1
|
|
108
|
+
f2 = LabeledField.new @form, :name => "email", :width => 20, :bgcolor => :white,
|
|
109
|
+
:color => :blue, :text => "me@google.com", :label => ' Email: ', :row => r, :col => fc
|
|
110
|
+
r += 3
|
|
111
|
+
f3 = LabeledField.new @form
|
|
112
|
+
f3.name("mobile").width(20).bgcolor(:white).color(:black).
|
|
113
|
+
text("").label(' Mobile: ').
|
|
114
|
+
row(r).col(fc).
|
|
115
|
+
type(:integer)
|
|
116
|
+
r += 2
|
|
117
|
+
|
|
118
|
+
LabeledField.new(@form).
|
|
119
|
+
name("landline").width(20).bgcolor(:white).color(:black).
|
|
120
|
+
text("").label('Landline: ').
|
|
121
|
+
row(r).col(fc).
|
|
122
|
+
chars_allowed(/[\d\-]/)
|
|
123
|
+
# a form level event, whenever any widget is focussed, make the label red
|
|
124
|
+
#
|
|
125
|
+
|
|
126
|
+
r += 2
|
|
127
|
+
%w[ profession title department].each_with_index do |w,i|
|
|
128
|
+
LabeledField.new(@form).label(w).width(20).text("").
|
|
129
|
+
bgcolor(:white).color(:black).
|
|
130
|
+
row(r+i).col(fc).lcol(01)
|
|
131
|
+
end
|
|
132
|
+
@form.bind_key(FFI::NCurses::KEY_F3,'view log') {
|
|
133
|
+
require 'canis/core/util/viewer'
|
|
134
|
+
Canis::Viewer.view(path || "canis14.log", :close_key => KEY_ENTER, :title => "<Enter> to close")
|
|
135
|
+
}
|
|
136
|
+
@form.bind_key(FFI::NCurses::KEY_F4, 'system command') { shell_output }
|
|
137
|
+
@form.bind_key(FFI::NCurses::KEY_F5, 'shell') { suspend }
|
|
138
|
+
@form.bind_key([?\C-x,?c], 'shell') { suspend }
|
|
139
|
+
@form.bind_key(?\M-!, 'shell') { suspend }
|
|
140
|
+
@form.bind_key([?\C-x,?l], 'ls -al') { run_command "ls -al" }
|
|
141
|
+
@form.bind_key([?\C-x,?p], 'ps -l') { run_command "ps -l" }
|
|
142
|
+
@form.bind_key([?\C-x,?d], 'df -h') { run_command "df -h" }
|
|
143
|
+
#@form.bind_key([?\C-x,?d], 'git diff') { run_command "git diff --name-status" }
|
|
144
|
+
@form.bind_key([?\C-x, ?s], 'git st') { run_command "git status" }
|
|
145
|
+
@form.bind_key([?\C-x,?w], 'git whatchanged') { run_command "git whatchanged" }
|
|
146
|
+
|
|
147
|
+
@form.help_manager.help_text = help_text
|
|
148
|
+
@form.repaint
|
|
149
|
+
@form.widgets.each { |ff|
|
|
150
|
+
if ff.focusable?
|
|
151
|
+
ff.bind(:ENTER) { |f| f.label && f.label.bgcolor = :red if (f.respond_to? :label and f.label.respond_to?(:bgcolor))}
|
|
152
|
+
ff.bind(:LEAVE) { |f| f.label && f.label.bgcolor = 'black' if (f.respond_to? :label and f.label.respond_to?(:bgcolor))}
|
|
153
|
+
end
|
|
154
|
+
}
|
|
155
|
+
@window.wrefresh
|
|
156
|
+
Ncurses::Panel.update_panels
|
|
157
|
+
|
|
158
|
+
# the main loop
|
|
159
|
+
|
|
160
|
+
while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
|
|
161
|
+
break if ch == ?\C-q.getbyte(0)
|
|
162
|
+
begin
|
|
163
|
+
@form.handle_key(ch)
|
|
164
|
+
|
|
165
|
+
rescue FieldValidationException => fve
|
|
166
|
+
#alert fve.to_s
|
|
167
|
+
textdialog fve
|
|
168
|
+
|
|
169
|
+
f = @form.get_current_field
|
|
170
|
+
# lets restore the value
|
|
171
|
+
if f.respond_to? :restore_original_value
|
|
172
|
+
f.restore_original_value
|
|
173
|
+
#@form.select_field @form.active_index
|
|
174
|
+
@form.repaint
|
|
175
|
+
end
|
|
176
|
+
$error_message.value = ""
|
|
177
|
+
rescue => err
|
|
178
|
+
$log.error( err) if err
|
|
179
|
+
$log.error(err.backtrace.join("\n")) if err
|
|
180
|
+
textdialog err
|
|
181
|
+
$error_message.value = ""
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# this should be avoided, we should not muffle the exception and set a variable
|
|
185
|
+
# However, we have been doing that
|
|
186
|
+
if $error_message.get_value != ""
|
|
187
|
+
if @lookfeel == :dialog
|
|
188
|
+
alert($error_message, {:bgcolor => :red, 'color' => 'yellow'}) if $error_message.get_value != ""
|
|
189
|
+
else
|
|
190
|
+
print_error_message $error_message, {:bgcolor => :red, :color => :yellow}
|
|
191
|
+
end
|
|
192
|
+
$error_message.value = ""
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
@window.wrefresh
|
|
196
|
+
end # while loop
|
|
197
|
+
end # catch
|
|
198
|
+
rescue => ex
|
|
199
|
+
ensure
|
|
200
|
+
$log.debug " -==== EXCEPTION =====-" if ex
|
|
201
|
+
$log.debug( ex) if ex
|
|
202
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
|
203
|
+
@window.destroy if !@window.nil?
|
|
204
|
+
Canis::stop_ncurses
|
|
205
|
+
puts ex if ex
|
|
206
|
+
puts(ex.backtrace.join("\n")) if ex
|
|
207
|
+
end
|
|
208
|
+
end
|