canis 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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,43 @@
|
|
1
|
+
# ----------------------------------------------------------------------------- #
|
2
|
+
# File: testflowlayout.rb
|
3
|
+
# Description:
|
4
|
+
# Author: j kepler http://github.com/mare-imbrium/canis/
|
5
|
+
# Date: 2014-05-09 - 20:24
|
6
|
+
# License: MIT
|
7
|
+
# Last update: 2014-05-09 20:39
|
8
|
+
# ----------------------------------------------------------------------------- #
|
9
|
+
# testflowlayout.rb Copyright (C) 2012-2014 j kepler
|
10
|
+
|
11
|
+
if __FILE__ == $PROGRAM_NAME
|
12
|
+
require 'canis/core/util/app'
|
13
|
+
require 'canis/core/widgets/listbox'
|
14
|
+
require 'canis/core/include/layouts/flowlayout'
|
15
|
+
App.new do
|
16
|
+
|
17
|
+
# if i add form here, it will repaint them first, and have no dimensions
|
18
|
+
lb = Listbox.new @form, :list => ["borodin","berlioz","bernstein","balakirev", "elgar"] , :name => "mylist"
|
19
|
+
lb1 = Listbox.new @form, :list => ["bach","beethoven","mozart","gorecki", "chopin","wagner","grieg","holst"] , :name => "mylist1"
|
20
|
+
|
21
|
+
lb2 = Listbox.new @form, :list => `gem list --local`.split("\n") , :name => "mylist2"
|
22
|
+
=begin
|
23
|
+
|
24
|
+
alist = %w[ ruby perl python java jruby macruby rubinius rails rack sinatra pylons django cakephp grails]
|
25
|
+
str = "Hello, people of Earth.\nI am HAL, a textbox.\nUse arrow keys, j/k/h/l/gg/G/C-a/C-e/C-n/C-p\n"
|
26
|
+
str << alist.join("\n")
|
27
|
+
tv = TextPad.new @form, :name => "text", :text => str.split("\n")
|
28
|
+
=end
|
29
|
+
|
30
|
+
w = Ncurses.COLS-1
|
31
|
+
h = Ncurses.LINES-3
|
32
|
+
#layout = StackLayout.new :height => -1, :top_margin => 1, :bottom_margin => 1, :left_margin => 1
|
33
|
+
layout = FlowLayout.new :height => -1, :top_margin => 1, :bottom_margin => 1, :left_margin => 1
|
34
|
+
layout.form = @form
|
35
|
+
@form.layout_manager = layout
|
36
|
+
layout.cset lb, :weight, 15
|
37
|
+
layout.cset lb1, :weight, 25
|
38
|
+
#$status_message.value =" Flow: #{@r.components[0].orientation} | Stack #{@r.components[1].orientation}. Use Ctrl-Space to change "
|
39
|
+
|
40
|
+
|
41
|
+
st = status_line :row => -1
|
42
|
+
end # app
|
43
|
+
end # if
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# demo to test keypresses
|
2
|
+
# press any key and see the value that ncurses or our routines catch.
|
3
|
+
# Press alt and control combinations and Function keys
|
4
|
+
# Ideally each key should return only one value. Sometimes, some TERM setting
|
5
|
+
# or terminal emulator may not give correct values or may give different values
|
6
|
+
# from what we are expecting.
|
7
|
+
# Exit using 'q'.
|
8
|
+
# # see window.rb for keycodes related to shift+F C_LEFT C_RIGHT etc.
|
9
|
+
require 'logger'
|
10
|
+
require 'canis'
|
11
|
+
#require 'canis/core/widgets/rtextview'
|
12
|
+
if $0 == __FILE__
|
13
|
+
include Canis
|
14
|
+
include Canis::Utils
|
15
|
+
|
16
|
+
dumpfile = "dump.yml"
|
17
|
+
|
18
|
+
begin
|
19
|
+
# Initialize curses
|
20
|
+
Canis::start_ncurses # this is initializing colors via ColorMap.setup
|
21
|
+
$log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"canis14.log")))
|
22
|
+
|
23
|
+
$log.level = Logger::DEBUG
|
24
|
+
|
25
|
+
@window = Canis::Window.root_window
|
26
|
+
|
27
|
+
catch(:close) do
|
28
|
+
colors = Ncurses.COLORS
|
29
|
+
$log.debug "START #{colors} colors ---------"
|
30
|
+
@form = Form.new @window
|
31
|
+
r = 1; c = 1;
|
32
|
+
w = Ncurses.COLS - c
|
33
|
+
h = Ncurses.LINES - 4
|
34
|
+
FFI::NCurses.set_escdelay(500)
|
35
|
+
nd = Ncurses.ESCDELAY
|
36
|
+
|
37
|
+
# please use a hash to pass these values, avoid this old style
|
38
|
+
# i want to move away from it as it comlpicates code
|
39
|
+
texta = TextPad.new @form do
|
40
|
+
name "mytext"
|
41
|
+
row r
|
42
|
+
col c
|
43
|
+
width w
|
44
|
+
height h
|
45
|
+
#editable false
|
46
|
+
focusable false
|
47
|
+
title "[ Keypresses ]"
|
48
|
+
#title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
|
49
|
+
title_attrib (Ncurses::A_BOLD)
|
50
|
+
end
|
51
|
+
help = "q to quit. escdelay is #{nd}. Check keys. F1..10, C-a..z, Alt a-zA-Z0-9, C-left,rt, Sh-F5..10 .: #{$0}"
|
52
|
+
help1 = "Press in quick succession: 1) M-[, w and (2) M-[, M-w. (3) M-Sh-O, w."
|
53
|
+
Canis::Label.new @form, {'text' => help, "row" => r+h+1, "col" => 2, "color" => "yellow"}
|
54
|
+
Canis::Label.new @form, {'text' => help1, "row" => r+h+2, "col" => 2, "color" => "green"}
|
55
|
+
texta.text = ["Press any key, Function, control, alt etc to see ","if it works.",
|
56
|
+
"See window.rb for keycodes if something is not being trapped properly"]
|
57
|
+
|
58
|
+
@form.repaint
|
59
|
+
@window.wrefresh
|
60
|
+
Ncurses::Panel.update_panels
|
61
|
+
while((ch = @window.getchar()) != 999 )
|
62
|
+
str = keycode_tos ch if ch.is_a? Fixnum
|
63
|
+
#str1 = @window.key_tos ch if ch.is_a? Fixnum
|
64
|
+
str1 = $key_chr
|
65
|
+
$log.debug "#{ch} got (#{str} #{str1})"
|
66
|
+
texta << "#{ch} got (#{str}) #{str1}"
|
67
|
+
if ch == 99999
|
68
|
+
name = get_string "Add a name for #{$key_chr}?"
|
69
|
+
if name
|
70
|
+
texta << "setting #{name} for #{str1} "
|
71
|
+
$kh[str1] = name
|
72
|
+
_name = $kh[str1]
|
73
|
+
texta << "set #{_name} for #{str1} "
|
74
|
+
$kh.each_pair { |name, val| $log.debug " MMMAP #{name} : #{val}" }
|
75
|
+
File.open(dumpfile, 'w' ) do |f|
|
76
|
+
f << YAML::dump($kh)
|
77
|
+
end
|
78
|
+
texta << "Written new keys to #{dumpfile}. Pls copy over ~/ncurses-keys.yml"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
texta.goto_end
|
82
|
+
texta.repaint
|
83
|
+
@form.repaint
|
84
|
+
@window.wrefresh
|
85
|
+
break if ch == ?\q.getbyte(0)
|
86
|
+
#break if ch == "q"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
rescue => ex
|
90
|
+
ensure
|
91
|
+
@window.destroy if !@window.nil?
|
92
|
+
Canis::stop_ncurses
|
93
|
+
p ex if ex
|
94
|
+
p(ex.backtrace.join("\n")) if ex
|
95
|
+
$log.debug( ex) if ex
|
96
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,187 @@
|
|
1
|
+
# NOTE: If the listbox is empty, that could mean that you have not generated
|
2
|
+
# ri documentation for this version of ruby. You can do so by doing:
|
3
|
+
# rvm docs generate-ri
|
4
|
+
# or
|
5
|
+
# rvm docs generate
|
6
|
+
# (This assumes you are using rvm)
|
7
|
+
#
|
8
|
+
# WARNING : IF THIS PROGRAM HANGS check the ri command
|
9
|
+
# Maybe your version of ri has different options and is going interactive.
|
10
|
+
# ruby 1.9.3's ri requires a -l option or else if becomes interactive.
|
11
|
+
# this program tests out a listbox
|
12
|
+
# This is written in the old style where we start and end ncurses and initiate a
|
13
|
+
# getch loop. It gives more control.
|
14
|
+
# The new style is to use App which does the ncurses setup and teardown, as well
|
15
|
+
# as manages keys. It also takes care of logger and includes major stuff.
|
16
|
+
# NOTE : this is the new listbox (based on Textpad version, the original
|
17
|
+
# version has been moved to deprecated. 2014-04-08 - 18:32
|
18
|
+
require 'logger'
|
19
|
+
require 'canis'
|
20
|
+
require 'canis/core/widgets/listbox'
|
21
|
+
require 'canis/core/include/vieditable'
|
22
|
+
#require 'canis/experimental/widgets/undomanager'
|
23
|
+
class Canis::Listbox
|
24
|
+
# vieditable includes listeditable which
|
25
|
+
# does bring in some functions which can crash program like x and X TODO
|
26
|
+
# also, f overrides list f mapping. TODO
|
27
|
+
include ViEditable
|
28
|
+
end
|
29
|
+
def get_data str
|
30
|
+
#lines = `ri -f bs #{str}`.split("\n")
|
31
|
+
lines = `ri -f ansi #{str} 2>&1`.gsub('[m','[0m').split("\n")
|
32
|
+
end
|
33
|
+
def my_help_text
|
34
|
+
<<-eos
|
35
|
+
|
36
|
+
=========================================================================
|
37
|
+
## Basic Usage
|
38
|
+
|
39
|
+
Press <ENTER> on a class name on the first list, to view `ri` information
|
40
|
+
for it on the right.
|
41
|
+
|
42
|
+
Tab to right box, navigate to a method name, and press <ENTER> on a method
|
43
|
+
name, to see its details in a popup screen.
|
44
|
+
Press */* <slash> in any box to search. e.g "/String" will take you to the
|
45
|
+
first occurrence of "String". <n> will take you to the next match.
|
46
|
+
|
47
|
+
To go quickly to the first Class starting with 'S', type <f> followed by <S>.
|
48
|
+
Then press <n> to go to next match.
|
49
|
+
|
50
|
+
=========================================================================
|
51
|
+
## Vim Edit Keys
|
52
|
+
|
53
|
+
The [[list]] on left has some extra vim keys enabled such as :
|
54
|
+
>
|
55
|
+
yy - yank/copy current line/s
|
56
|
+
P, p - paste after or before
|
57
|
+
dd - delete current line
|
58
|
+
o - insert a line after this one
|
59
|
+
C - change content of current line
|
60
|
+
<
|
61
|
+
These are not of use here, but are demonstrative of list capabilities.
|
62
|
+
|
63
|
+
=========================================================================
|
64
|
+
## Buffers
|
65
|
+
|
66
|
+
Ordinary a [[textpad]] contains only one buffer. However, the one on the right
|
67
|
+
is extended for multiple buffers. Pressing <ENTER> on the left on several
|
68
|
+
rows opens multiple buffers on the right. Use <M-n> (Alt-N) and <M-p> to navigate.
|
69
|
+
ALternatively, <:> maps to a menu, so :n and :p may also be used.
|
70
|
+
<BACKSPACE> will also go to previous buffer, like a browser.
|
71
|
+
|
72
|
+
=========================================================================
|
73
|
+
Press <M-n> for next help screen, or try ":n", [[index]]
|
74
|
+
|
75
|
+
eos
|
76
|
+
end
|
77
|
+
if $0 == __FILE__
|
78
|
+
include Canis
|
79
|
+
|
80
|
+
begin
|
81
|
+
# Initialize curses
|
82
|
+
Canis::start_ncurses # this is initializing colors via ColorMap.setup
|
83
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"canis14.log")
|
84
|
+
logfilename = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
85
|
+
$log = Logger.new(logfilename)
|
86
|
+
$log.level = Logger::DEBUG
|
87
|
+
|
88
|
+
@window = Canis::Window.root_window
|
89
|
+
$log.debug " WINDOW #{FFI::NCurses.LINES} "
|
90
|
+
$catch_alt_digits = true; # emacs like alt-1..9 numeric arguments
|
91
|
+
# Initialize few color pairs
|
92
|
+
# Create the window to be associated with the form
|
93
|
+
# Un post form and free the memory
|
94
|
+
|
95
|
+
catch(:close) do
|
96
|
+
@form = Form.new @window
|
97
|
+
@form.help_manager.help_text = my_help_text
|
98
|
+
#@form.bind_key(KEY_F1, 'help'){ display_app_help }
|
99
|
+
|
100
|
+
# this is the old style of printing something directly on the window.
|
101
|
+
# The new style is to use a header
|
102
|
+
@form.window.printstring 0, 30, "Demo of Listbox - some vim keys", $normalcolor, BOLD
|
103
|
+
r = 1; fc = 1;
|
104
|
+
|
105
|
+
# this is the old style of using a label at the screen bottom, you can use the status_line
|
106
|
+
|
107
|
+
v = "F10 quits. F1 Help. Try j k gg G o O C dd f<char> w yy p P / . Press ENTER on Class or Method"
|
108
|
+
var = Canis::Label.new @form, {'text' => v, "row" => FFI::NCurses.LINES-2,
|
109
|
+
"col" => fc, "width" => 100}
|
110
|
+
|
111
|
+
h = FFI::NCurses.LINES-3
|
112
|
+
file = "./data/ports.txt"
|
113
|
+
#mylist = File.open(file,'r').readlines
|
114
|
+
mylist = `ri -l `.split("\n")
|
115
|
+
w = 25
|
116
|
+
#0.upto(100) { |v| mylist << "#{v} scrollable data" }
|
117
|
+
#
|
118
|
+
listb = Listbox.new @form, :name => "mylist" ,
|
119
|
+
:row => r ,
|
120
|
+
:col => 1 ,
|
121
|
+
:width => w,
|
122
|
+
:height => h,
|
123
|
+
:list => mylist,
|
124
|
+
:selection_mode => :single,
|
125
|
+
:show_selector => true,
|
126
|
+
#row_selected_symbol "[X] "
|
127
|
+
#row_unselected_symbol "[ ] "
|
128
|
+
:title => " Ruby Classes "
|
129
|
+
#title_attrib 'reverse'
|
130
|
+
#listb.one_key_selection = false # this allows us to map keys to methods
|
131
|
+
listb.vieditable_init_listbox
|
132
|
+
include Io
|
133
|
+
listb.bind_key(?r, 'get file'){ get_file("Get a file:") }
|
134
|
+
listb.bind(:PRESS) {
|
135
|
+
w = @form.by_name["tv"];
|
136
|
+
#lines = `ri -f bs #{listb.current_value}`.split("\n")
|
137
|
+
#lines = `ri -f ansi #{listb.current_value} 2>&1`.gsub('[m','[0m').split("\n")
|
138
|
+
lines = get_data listb.current_value
|
139
|
+
#w.set_content(lines, :ansi)
|
140
|
+
w.add_content(lines, {:content_type => :ansi, :title => listb.current_value})
|
141
|
+
w.buffer_last
|
142
|
+
#w.title = listb.current_value
|
143
|
+
}
|
144
|
+
|
145
|
+
tv = Canis::TextPad.new @form, :row => r, :col => w+1, :height => h, :width => FFI::NCurses.COLS-w-1,
|
146
|
+
:name => "tv", :title => "Press Enter on method"
|
147
|
+
tv.set_content ["Press Enter on list to view ri information in this area.",
|
148
|
+
"Press ENTER on method name to see details"]
|
149
|
+
require 'canis/core/include/multibuffer'
|
150
|
+
tv.extend(Canis::MultiBuffers)
|
151
|
+
# with format 'bs' we had a '=' but now it is colored so we've lost section.
|
152
|
+
tv.text_patterns[:section] = Regexp.new(/^= /)
|
153
|
+
tv.bind_key(?s, "goto section") { tv.next_regex(:section) }
|
154
|
+
|
155
|
+
# pressing ENTER on a method name will popup details for that method
|
156
|
+
tv.bind(:PRESS) { |ev|
|
157
|
+
w = ev.word_under_cursor.strip
|
158
|
+
# check that user did not hit enter on empty area
|
159
|
+
if w != ""
|
160
|
+
#_text = `ri -f bs #{tv.title}.#{w} 2>&1`
|
161
|
+
#_text = _text.split("\n")
|
162
|
+
_text = get_data "#{tv.title}.#{w}"
|
163
|
+
if _text && _text.size != 0
|
164
|
+
view(_text, :content_type => :ansi)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
}
|
168
|
+
|
169
|
+
|
170
|
+
@form.repaint
|
171
|
+
@window.wrefresh
|
172
|
+
Ncurses::Panel.update_panels
|
173
|
+
while((ch = @window.getchar()) != KEY_F10 )
|
174
|
+
@form.handle_key(ch)
|
175
|
+
@window.wrefresh
|
176
|
+
end
|
177
|
+
end
|
178
|
+
rescue => ex
|
179
|
+
$log.debug( ex) if ex
|
180
|
+
$log.debug(ex.backtrace.join("\n")) if ex
|
181
|
+
ensure
|
182
|
+
@window.destroy if !@window.nil?
|
183
|
+
Canis::stop_ncurses
|
184
|
+
p ex if ex
|
185
|
+
p(ex.backtrace.join("\n")) if ex
|
186
|
+
end
|
187
|
+
end
|
@@ -0,0 +1,199 @@
|
|
1
|
+
require 'canis/core/util/app'
|
2
|
+
require 'canis/core/include/appmethods'
|
3
|
+
require 'canis/core/widgets/listbox'
|
4
|
+
require 'canis/core/util/promptmenu'
|
5
|
+
require './common/devel.rb'
|
6
|
+
|
7
|
+
def my_help_text
|
8
|
+
<<-eos
|
9
|
+
|abasiclist.rb|
|
10
|
+
=========================================================================
|
11
|
+
**Basic Usage**
|
12
|
+
|
13
|
+
This simple example shows 2 lists inside a "flow". Each takes 50 percent
|
14
|
+
of the screen's width.
|
15
|
+
|
16
|
+
If you have brew installed, you can refresh the list to show actual
|
17
|
+
brew packages on your system, using ':r'. Then you can view info, edit,
|
18
|
+
or see the man page for that program.
|
19
|
+
|
20
|
+
In the second list, you can refresh the list with your gems using ":r".
|
21
|
+
Place cursor on any gem, and execute any of the ":" commands to see the
|
22
|
+
output. "edit" shells out to your EDITOR.
|
23
|
+
|
24
|
+
You can try multiple selection using <v> and <V> for range
|
25
|
+
select. Check the general help screen for more [[list]] commands. The selections
|
26
|
+
are not mapped to any command.
|
27
|
+
|
28
|
+
=========================================================================
|
29
|
+
:n or Alt-n for next buffer. 'q' to quit. [[index]]
|
30
|
+
|
31
|
+
eos
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
# just a simple test to ensure that rbasiclistbox is running inside a container.
|
37
|
+
App.new do
|
38
|
+
devel_bindings
|
39
|
+
def disp_menu
|
40
|
+
# ideally this shuld get action_manager and add_action so these are added to widgets actions
|
41
|
+
f = @form.get_current_field
|
42
|
+
|
43
|
+
if f.name == "lb1"
|
44
|
+
menu = PromptMenu.new self do
|
45
|
+
item :r, :refresh
|
46
|
+
item :i, :info
|
47
|
+
item :m, :brew_man
|
48
|
+
item :e, :edit
|
49
|
+
end
|
50
|
+
else
|
51
|
+
menu = PromptMenu.new self do
|
52
|
+
item :r, :refresh
|
53
|
+
item :e, :edit
|
54
|
+
item :d, :dependency
|
55
|
+
item :s, :specification
|
56
|
+
item :w, :which
|
57
|
+
end
|
58
|
+
end
|
59
|
+
menu.display_new :title => "Menu"
|
60
|
+
end
|
61
|
+
# fill list with actual gems available on your system
|
62
|
+
def refresh
|
63
|
+
f = @form.get_current_field
|
64
|
+
if f.name == "lb2"
|
65
|
+
l = %x[gem list --local].split("\n")
|
66
|
+
w = @form.by_name['lb2']
|
67
|
+
w.list l
|
68
|
+
else
|
69
|
+
l = %x[brew list].split("\n")
|
70
|
+
w = @form.by_name['lb1']
|
71
|
+
w.list l
|
72
|
+
end
|
73
|
+
end
|
74
|
+
def specification
|
75
|
+
w = @form.by_name['lb2']
|
76
|
+
name = w.current_value.split()[0]
|
77
|
+
textdialog(%x[ gem specification #{name} ].split("\n") , :title => 'Specification')
|
78
|
+
end
|
79
|
+
|
80
|
+
# execute just man for the brew package
|
81
|
+
def brew_man
|
82
|
+
w = @form.by_name['lb1']
|
83
|
+
#name = w.text.split()[0]
|
84
|
+
name = w.current_value.split()[0]
|
85
|
+
shell_out "man #{name}"
|
86
|
+
end
|
87
|
+
|
88
|
+
# using gem which to get path, and then shelling out to EDITOR
|
89
|
+
def edit
|
90
|
+
f = @form.get_current_field
|
91
|
+
if f.name == "lb2"
|
92
|
+
name = f.current_value.split()[0]
|
93
|
+
shell_out "gem edit #{name}"
|
94
|
+
else
|
95
|
+
name = f.current_value.split()[0]
|
96
|
+
shell_out "brew edit #{name}"
|
97
|
+
end
|
98
|
+
return
|
99
|
+
|
100
|
+
# this is our own home-cooked version which opens the actual file in your editor
|
101
|
+
res = %x[ gem which #{name} ].split("\n")
|
102
|
+
res = res[0]
|
103
|
+
if File.exists? res
|
104
|
+
require './common/file.rb'
|
105
|
+
file_edit res
|
106
|
+
end
|
107
|
+
end
|
108
|
+
#
|
109
|
+
# general purpose command to catch miscellaneous actions that can be
|
110
|
+
# executed in the same way. Or even take complex command lines
|
111
|
+
# such as what vim has.
|
112
|
+
def execute_this *cmd
|
113
|
+
f = @form.get_current_field
|
114
|
+
if f.name == "lb2"
|
115
|
+
m = "gem"
|
116
|
+
else
|
117
|
+
m = "brew"
|
118
|
+
end
|
119
|
+
w = f
|
120
|
+
# textpad returns array not just line DARN
|
121
|
+
#name = w.text.split()[0]
|
122
|
+
name = w.current_value.split()[0]
|
123
|
+
cmd = cmd[0].to_s
|
124
|
+
res = %x[ #{m} #{cmd} #{name}].split("\n")
|
125
|
+
res ||= "Error in command [#{cmd}] [#{name}] "
|
126
|
+
textdialog( res, :title => cmd ) if res
|
127
|
+
end
|
128
|
+
# handle resizing, sadly I am not sure flow and stack can do a resize, i am sure the xperimental one can.
|
129
|
+
def resize
|
130
|
+
lb1 = @form.by_name["lb1"]
|
131
|
+
lb2 = @form.by_name["lb2"]
|
132
|
+
maxc = Ncurses.COLS
|
133
|
+
maxr = Ncurses.LINES
|
134
|
+
lb1.height = maxr-2
|
135
|
+
lb2.height = maxr-2
|
136
|
+
lb1.width = ((lb1.width_pc * maxc) / 100).floor
|
137
|
+
lb2.width = ((lb2.width_pc * maxc) / 100).floor
|
138
|
+
lb2.col = lb1.col + lb1.width
|
139
|
+
lab = @form.by_name["lab"]
|
140
|
+
lab.row = maxr-1
|
141
|
+
end
|
142
|
+
|
143
|
+
colors = Ncurses.COLORS
|
144
|
+
back = :blue
|
145
|
+
back = 234 if colors >= 256
|
146
|
+
header = app_header "canis #{Canis::VERSION}", :text_center => "Basic List Demo", :text_right =>"New Improved!", :color => :white, :bgcolor => back #, :attr => :bold
|
147
|
+
message "Press F10 to escape from here"
|
148
|
+
#install_help_text my_help_text
|
149
|
+
@form.help_manager.help_text = my_help_text
|
150
|
+
|
151
|
+
@form.define_prefix_command :csmap, :scope => self
|
152
|
+
#@form.define_key(:csmap, "r", 'refresh') { refresh }
|
153
|
+
@form.define_key(:csmap, "r", 'refresh', :refresh )
|
154
|
+
@form.define_key(:csmap, "s", 'specification') { specification }
|
155
|
+
@form.bind_key ?\C-s, :csmap
|
156
|
+
#pm = PrefixCommand.new :csmap, self do |p|
|
157
|
+
#p.key("r", 'refresh', :refresh )
|
158
|
+
#p.key("s", 'specification'){ specification }
|
159
|
+
#end
|
160
|
+
#@form.bind_key(?\C-x){ pm.call }
|
161
|
+
# testing that 'q' works along with 'qq'
|
162
|
+
@form.bind_key(?q){ ht = @form.current_widget.help_text || "No help for this widget"; alert ht }
|
163
|
+
|
164
|
+
# testing triple bindings, along with a fall-back with only two bindings.
|
165
|
+
@form.bind_key([?\\, ?\\, ?h]){ ht = @form.current_widget.help_text || "No help for this widget"; alert ht }
|
166
|
+
@form.bind_key([?\\, ?\\, ?H]){ ht = @form.current_widget.help_text || "No help for this widget";
|
167
|
+
str = get_string("Enter help text:", :default => ht);
|
168
|
+
@form.current_widget.help_text = str
|
169
|
+
}
|
170
|
+
@form.bind_key([?\\, ?\\]){ alert "Enter h for seeing helptext on this widget, H for setting it"; }
|
171
|
+
|
172
|
+
alist = File.open("data/brew.txt",'r').readlines
|
173
|
+
list2 = File.open("data/gemlist.txt",'r').readlines
|
174
|
+
lb = nil
|
175
|
+
|
176
|
+
flow :margin_top => 1, :height => FFI::NCurses.LINES-2 do
|
177
|
+
lb = listbox :list => alist, :suppress_borders => false, :title => "[ brew packages ]",
|
178
|
+
:left_margin => 0, :width_pc => 50, :name => 'lb1', :selection_mode => :single
|
179
|
+
lb.show_selector = false
|
180
|
+
lb.help_text = "Brew packages on your system. Use vim keys to navigate, or : to run a command"
|
181
|
+
|
182
|
+
lb2 = listbox :list => list2, :justify => :left, :title => "[ gems ]", :suppress_borders => false,
|
183
|
+
:left_margin => 0, :width_pc => 50, :name => 'lb2'
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
label({:text => "F1 Help, F10 Quit. : for menu. Press F4 and F5 to test popup, v to select", :row => Ncurses.LINES-1, :col => 0, :name => 'lab'})
|
188
|
+
|
189
|
+
@form.bind(:RESIZE) { resize() }
|
190
|
+
@form.bind_key(FFI::NCurses::KEY_F4, "Popup") { row = lb.visual_index+lb.row; col=lb.col+lb.current_value.length+1;
|
191
|
+
|
192
|
+
row = [row, FFI::NCurses.LINES - 8].min
|
193
|
+
ret = popuplist(%w[ chopin berlioz strauss tchaiko matz beethoven], :row => row, :col => col, :title => "Names", :bgcolor => :blue, :color => :white) ; alert "got #{ret} "}
|
194
|
+
|
195
|
+
@form.bind_key(FFI::NCurses::KEY_F5, "Popup") { list = %x[ls].split("\n");ret = popuplist(list, :title => "Files"); alert "Got #{ret} #{list[ret]} " }
|
196
|
+
|
197
|
+
@form.bind_key(?:, "Menu") { disp_menu;
|
198
|
+
}
|
199
|
+
end # app
|