Class: Canis::ControlPHandler
- Includes:
- KeyDispatcher
- Defined in:
- lib/canis/core/util/rcommandwindow.rb
Overview
This is a keyhandler that traps some keys, much like control-p which filters down a list based on some alpha numeric chars. The rest, such as arrow-keys, are passed to the key_map
Instance Attribute Summary collapse
-
#buffer ⇒ Object
string the user is currently entering in (pattern to filter on).
-
#command ⇒ Object
specify command to requery data.
-
#default_layout ⇒ Object
Returns the value of attribute default_layout.
-
#header ⇒ Object
application_header object whose text can be changed.
-
#key_map ⇒ Object
Returns the value of attribute key_map.
-
#keychr ⇒ Object
readonly
Returns the value of attribute keychr.
-
#keyint ⇒ Object
readonly
Returns the value of attribute keyint.
-
#maxht ⇒ Object
Returns the value of attribute maxht.
-
#source ⇒ Object
readonly
Returns the value of attribute source.
Instance Method Summary collapse
-
#buffer_changed ⇒ Object
signal that the user has added or deleted a char from the pattern and data should be requeried, etc.
-
#current_value ⇒ Object
the line on which focus is.
-
#data_changed(list) ⇒ Object
signal that the data has changed and should be redisplayed with window resizing etc.
-
#default_key_map ⇒ Object
setting up some keys.
-
#directory_key_map ⇒ Object
specific actions for directory listers currently for stepping into directory under cursor and going to parent dir.
-
#handle_key(ch) ⇒ Object
key handler of Controlphandler which overrides KeyDispatcher since we need to intercept KEY_ENTER WARNING: Please note that if this is used in
Viewer.view
, thatview
has already trapped CLOSE_KEY which is KEY_ENTER/13 for closing, so we won’t get 13 anywhere. -
#initialize(source) ⇒ ControlPHandler
constructor
A new instance of ControlPHandler.
-
#recursive_search(glob = "**/*") ⇒ Object
a default proc to requery data based on glob supplied and the pattern user enters.
-
#set_buffer(str) ⇒ Object
modify the pattern (used if some procs are trying to change using handle to self).
Methods included from KeyDispatcher
#bind_key, #default_string_key_map, #process_key
Constructor Details
#initialize(source) ⇒ ControlPHandler
Returns a new instance of ControlPHandler.
771 772 773 774 775 776 777 778 779 780 781 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 771 def initialize source @source = source @list = source.text # backup of data to refilter from if no command given to update @__list = @list @buffer = "" @maxht ||=15 default_string_key_map default_key_map @no_match = false end |
Instance Attribute Details
#buffer ⇒ Object
string the user is currently entering in (pattern to filter on)
762 763 764 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 762 def buffer @buffer end |
#command ⇒ Object
specify command to requery data
767 768 769 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 767 def command @command end |
#default_layout ⇒ Object
Returns the value of attribute default_layout.
760 761 762 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 760 def default_layout @default_layout end |
#header ⇒ Object
application_header object whose text can be changed
764 765 766 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 764 def header @header end |
#key_map ⇒ Object
Returns the value of attribute key_map.
765 766 767 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 765 def key_map @key_map end |
#keychr ⇒ Object (readonly)
Returns the value of attribute keychr.
770 771 772 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 770 def keychr @keychr end |
#keyint ⇒ Object (readonly)
Returns the value of attribute keyint.
769 770 771 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 769 def @keyint end |
#maxht ⇒ Object
Returns the value of attribute maxht.
759 760 761 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 759 def maxht @maxht end |
#source ⇒ Object (readonly)
Returns the value of attribute source.
768 769 770 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 768 def source @source end |
Instance Method Details
#buffer_changed ⇒ Object
signal that the user has added or deleted a char from the pattern and data should be requeried, etc
838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 838 def buffer_changed # display the pattern on the header @header.text1(">>>#{@buffer}_") if @header @header.text_right(Dir.pwd) if @header @no_match = false if @command @list = @command.call(@buffer) else @list = @__list.select do |line| line.index @buffer end end sz = @list.size if sz == 0 Ncurses.beep #return 1 #this should make ENTER and arrow keys unusable except for BS or Esc, @list = ["No entries"] @no_match = true end data_changed @list 0 end |
#current_value ⇒ Object
the line on which focus is.
928 929 930 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 928 def current_value @source.current_value end |
#data_changed(list) ⇒ Object
signal that the data has changed and should be redisplayed with window resizing etc.
796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 796 def data_changed list sz = list.size @source.text(list) wh = @source.form.window.height @source.form.window.hide th = @source.height sh = Ncurses.LINES-1 if sz < @maxht # rows is less than tp size so reduce tp and window @source.height = sz nl = _new_layout sz+1 $log.debug "XXX: adjust ht to #{sz} layout is #{nl} size is #{sz}" @source.form.window.resize_with(nl) #Window.refresh_all else # expand the window ht to maxht tt = @maxht-1 @source.height = tt nl = _new_layout tt+1 $log.debug "XXX: increase ht to #{tt} def layout is #{nl} size is #{sz}" @source.form.window.resize_with(nl) end @source.fire_dimension_changed @source.init_vars # do if rows is less than current_index. @source.set_form_row @source.form.window.show #Window.refresh_all @source.form.window.wrefresh Ncurses::Panel.update_panels(); Ncurses.doupdate(); end |
#default_key_map ⇒ Object
setting up some keys
899 900 901 902 903 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 899 def default_key_map tp = source source.bind_key(?\M-n.getbyte(0), 'goto_end'){ tp.goto_end } source.bind_key(?\M-p.getbyte(0), 'goto_start'){ tp.goto_start } end |
#directory_key_map ⇒ Object
specific actions for directory listers currently for stepping into directory under cursor and going to parent dir.
908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 908 def directory_key_map @key_map["<"] = Action.new("Goto Parent Dir") { |obj| # go to parent dir $log.debug "KKK: called proc for <" Dir.chdir("..") obj.buffer_changed } @key_map[">"] = Action.new("Change Dir"){ |obj| $log.debug "KKK: called proc for > : #{obj.current_value} " # step into directory dir = obj.current_value if File.directory? dir Dir.chdir dir obj.buffer_changed end } end |
#handle_key(ch) ⇒ Object
key handler of Controlphandler which overrides KeyDispatcher since we need to intercept KEY_ENTER WARNING: Please note that if this is used in Viewer.view
, that view
has already trapped CLOSE_KEY which is KEY_ENTER/13 for closing, so we won’t get 13 anywhere
869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 869 def handle_key ch $log.debug " HANDLER GOT KEY #{ch} " @keyint = ch @keychr = nil # accumulate keys in a string # need to track insertion point if user uses left and right arrow @buffer ||= "" chr = nil chr = ch.chr if ch > 47 and ch < 127 @keychr = chr # Don't let user hit enter or keys if no match if [13,10, KEY_ENTER, KEY_UP, KEY_DOWN].include? ch if @no_match $log.warn "XXX: KEY GOT WAS #{ch}, #{chr} " # viewer has already blocked KEY_ENTER ! return 0 if [13,10, KEY_ENTER, KEY_UP, KEY_DOWN].include? ch else if [13,10, KEY_ENTER].include? ch @source.form.window.ungetch(1001) return 0 end end end ret = process_key ch # revert to the basic handling of key_map and refreshing pad. # but this will rerun the keys and may once again run a mapping. @source._handle_key(ch) if ret == :UNHANDLED end |
#recursive_search(glob = "**/*") ⇒ Object
a default proc to requery data based on glob supplied and the pattern user enters
784 785 786 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 784 def recursive_search glob="**/*" @command = Proc.new {|str| Dir.glob(glob).select do |p| p.index str; end } end |
#set_buffer(str) ⇒ Object
modify the pattern (used if some procs are trying to change using handle to self)
831 832 833 834 |
# File 'lib/canis/core/util/rcommandwindow.rb', line 831 def set_buffer str @buffer = str buffer_changed end |