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,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
|