Class: RubyCurses::MultiTextView

Inherits:
TextView show all
Includes:
ListScrollable
Defined in:
lib/rbcurse/rmultitextview.rb

Overview

A viewable read only box. Can scroll. Extends TextView with ability to load more than one file or content and switch between files (buffers). NOTE: ideally, i should be able to dynamically add this functionality to either Textview or TextArea or even ListBox or Table someday. Should then be a Module rather than a class.

Constant Summary

Constants included from Io

Io::ERROR_COLOR_PAIR, Io::FOOTER_COLOR_PAIR, Io::LINEONE, Io::MAIN_WINDOW_COLOR_PAIR

Instance Attribute Summary

Attributes included from ListScrollable

#find_offset, #find_offset1, #search_found_ix, #show_caret

Attributes inherited from TextView

#toprow, #winrow

Attributes inherited from Widget

#col_offset, #cols_panned, #config, #curpos, #ext_col_offset, #ext_row_offset, #form, #id, #parent_component, #row_offset, #rows_panned, #should_create_buffer, #state

Instance Method Summary collapse

Methods included from ListScrollable

#OLDscrollable_handle_key, #OLDset_focus_on, #_find_next, #_find_prev, #ask_search, #bounds_check, #find_more, #find_next, #find_prev, #focussed_index, #forward_char, #forward_word, #goto_bottom, #goto_last_position, #goto_top, #install_keys, #next_match, #next_row, #previous_row, #scroll_backward, #scroll_forward, #scroll_left, #scroll_right, #selected_item, #set_focus_on, #set_form_row, #set_selection_for_char, #show_caret_func

Methods inherited from TextView

#addcol, #addrowcol, #check_curpos, #cursor_backward, #cursor_forward, #disp_menu, #do_relative_row, #find_first_match, #get_content, #get_window, #getstr, #getvalue, #load_module, #next_line, #paint, #print_borders, #print_foot, #print_title, #repaint, #row_count, #rowcol, #scrollatrow, #set_form_col, #top_row, #wrap_text

Methods inherited from Widget

#OLDbind_key, #buffer_to_screen, #buffer_to_window, #create_buffer, #destroy, #destroy_buffer, #focus, #get_buffer, #get_color, #get_preferred_size, #getvalue, #getvalue_for_paint, #height, #height=, #hide, #is_double_buffered?, #modified?, #move, #on_enter, #on_leave, #override_graphic, #printstring, #process_key, #remove, #repaint, #repaint_all, #repaint_required, #rowcol, #safe_create_buffer, #set_buffer_modified, #set_buffering, #set_form, #set_form_col, #set_form_row, #set_modified, #setformrowcol, #setrowcol, #show, #text_variable, #unbind_key, #width, #width=

Methods included from Io

#askchoice, #askyesno, #askyesnocancel, #clear_error, #clear_this, #get_string, #newaskyesno, #old_print_header, #old_print_top_right, #print_action, #print_error, #print_footer_help, #print_header, #print_headers, #print_help, #print_help_page, #print_in_middle, #print_key_labels, #print_key_labels_row, #print_screen_labels, #print_status, #print_this, #print_top_right, #rbgetstr

Methods included from Utils

#_process_key, #bind_key, #clean_string!, #get_color, #keycode_tos, #repeatm, #wrap_text

Methods included from ConfigSetup

#cget, #config_setup, #configure, #variable_set

Methods included from EventHandler

#bind, #fire_handler, #fire_property_change

Methods included from DSL

#OLD_method_missing

Constructor Details

#initialize(form = nil, config = {}, &block) ⇒ MultiTextView

Returns a new instance of MultiTextView.



35
36
37
38
39
40
# File 'lib/rbcurse/rmultitextview.rb', line 35

def initialize form = nil, config={}, &block

  super
  @bmanager = BufferManager.new self

end

Instance Method Details

#add(file, title) ⇒ Object

load a file into the textview. This is the preferred method since it lets us add a title too Shucks, this misses wrap_style which the other one has

Parameters:

  • filename (String)


172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/rbcurse/rmultitextview.rb', line 172

def add file, title
  begin
    @current_buffer = @bmanager.add file, title
    $log.debug " file edit got cb : #{@current_buffer} "
    set_current_buffer
  rescue => err
    $error_message = "Error: #{err} "
    @form.window.print_error_message
    Ncurses.beep
    return -1
  end
end

#buffer_at(index) ⇒ Object



184
185
186
187
188
# File 'lib/rbcurse/rmultitextview.rb', line 184

def buffer_at index
  @current_buffer = @bmanager.element_at index
  $log.debug " buffer_last got #{@current_buffer} "
  set_current_buffer
end

#buffer_deleteObject



141
142
143
144
145
146
147
148
149
# File 'lib/rbcurse/rmultitextview.rb', line 141

def buffer_delete
  if @bmanager.size > 1
    @bmanager.delete_at
    @current_buffer = @bmanager.previous
    set_current_buffer
  else
    perror "Only one buffer. Cannot delete."
  end
end

#buffer_firstObject



131
132
133
134
135
# File 'lib/rbcurse/rmultitextview.rb', line 131

def buffer_first
  @current_buffer = @bmanager.first
  $log.debug " buffer_first got #{@current_buffer} "
  set_current_buffer
end

#buffer_lastObject



136
137
138
139
140
# File 'lib/rbcurse/rmultitextview.rb', line 136

def buffer_last
  @current_buffer = @bmanager.last
  $log.debug " buffer_last got #{@current_buffer} "
  set_current_buffer
end

#buffer_menuObject

this is just a test of the simple “most” menu can use this for next, prev, first, last, new, delete, overwrite etc



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/rbcurse/rmultitextview.rb', line 91

def buffer_menu
  menu = PromptMenu.new self 
  menu.add(menu.create_mitem( 'e', "edit a file", "opened file ", :file_edit ))
  menu.add(menu.create_mitem( 'o', "overwrite file", "opened a file ", :file_overwrite ))
  menu.add(menu.create_mitem( 'l', "list buffers", "list buffers ", :buffers_list ))
  item = menu.create_mitem( 'b', "Buffer Options", "Buffer Options" )
  menu1 = PromptMenu.new( self, "Buffer Options")
  menu1.add(menu1.create_mitem( 'n', "Next", "Switched to next buffer", :buffer_next ))
  menu1.add(menu1.create_mitem( 'p', "Prev", "Switched to previous buffer", :buffer_previous ))
  menu1.add(menu1.create_mitem( 'f', "First", "Switched to first buffer", :buffer_first ))
  menu1.add(menu1.create_mitem( 'l', "Last", "Switched to last buffer", :buffer_last ))
  menu1.add(menu1.create_mitem( 'd', "Delete", "Deleted buffer", :buffer_delete ))
  item.action = menu1
  menu.add(item)
  # how do i know what's available. the application or window should know where to place
  menu.display @form.window, $error_message_row, $error_message_col, $datacolor #, menu
end

#buffer_nextObject



118
119
120
121
122
123
# File 'lib/rbcurse/rmultitextview.rb', line 118

def buffer_next
  perror "No other buffer" and return if @bmanager.size < 2

  @current_buffer = @bmanager.next
  set_current_buffer
end

#buffer_previousObject



124
125
126
127
128
129
130
# File 'lib/rbcurse/rmultitextview.rb', line 124

def buffer_previous
  perror "No other buffer" and return if @bmanager.size < 2

  @current_buffer = @bmanager.previous
  $log.debug " buffer_prev got #{@current_buffer} "
  set_current_buffer
end

#buffers_listObject



150
151
152
153
154
155
156
157
158
159
# File 'lib/rbcurse/rmultitextview.rb', line 150

def buffers_list
  menu = PromptMenu.new self 
  @bmanager.each_with_index{ |b, ix|
    aproc = Proc.new { buffer_at(ix) }
    name = b.title
    num = ix + 1
    menu.add(menu.create_mitem( num.to_s, name, "Switched to buffer #{ix}", aproc ))
  }
  menu.display @form.window, $error_message_row, $error_message_col, $datacolor
end

#current_bufferRBuffer

returns current buffer

Returns:



53
54
55
# File 'lib/rbcurse/rmultitextview.rb', line 53

def current_buffer
  @bmanager.current
end

#file_editObject

prompts user for filename and opens in buffer Like vim’s :e



162
163
164
165
166
167
# File 'lib/rbcurse/rmultitextview.rb', line 162

def file_edit
  file = getfilename()
  $log.debug " got file_edit: #{file} "
  return if file == ""
  add file, file
end

#getfilename(prompt = "Enter filename: ", maxlen = 90) ⇒ Object

prompt user for a filename to read in



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/rbcurse/rmultitextview.rb', line 78

def getfilename prompt="Enter filename: ", maxlen=90
  tabc = Proc.new {|str| Dir.glob(str +"*") }
  config={}; config[:tab_completion] = tabc
  #config[:default] = "defaulT"
  $log.debug " inside getstr before call #{$error_message_row} +  #{$error_message_col}  "
  #ret, str = rbgetstr(@form.window, @row+@height-1, @col+1, prompt, maxlen, config)
  ret, str = rbgetstr(@form.window, $error_message_row, $error_message_col, prompt, maxlen, config)
  $log.debug " rbgetstr returned #{ret} , #{str} "
  return "" if ret != 0
  return str
end

#handle_key(ch) ⇒ Object

multi-textview



67
68
69
70
71
72
73
74
75
76
# File 'lib/rbcurse/rmultitextview.rb', line 67

def handle_key ch
  # put list as current list and buffer too then super
  #@current_buffer = @bmanager.current
  #@list = @current_buffer.list
  @buffer = @list[@current_index]
  #@buffer = @bmanager.current
  ret = super
  # check for any keys not handled and check our own ones
  return ret # 
end

#init_varsObject



41
42
43
44
45
46
47
48
49
50
# File 'lib/rbcurse/rmultitextview.rb', line 41

def init_vars
  super
  bind_key(?:, :buffer_menu)
  bind_key(?e, :file_edit)
  bind_key([?\C-x, ?f], :file_edit)
  bind_key([?\C-x, ?k], :buffer_delete)
  bind_key([?\C-x, ?\C-b], :buffers_list)
  # easily cycle using p. n is used for next search.
  bind_key(?p, :buffer_previous)
end

#perror(errmess = $error_message) ⇒ Object



195
196
197
# File 'lib/rbcurse/rmultitextview.rb', line 195

def perror errmess=$error_message
  @form.window.print_error_message errmess
end

#set_content(list, wrap = :WRAP_NONE) ⇒ Object

send in a list e.g. set_content File.open(“README.txt”,“r”).readlines set wrap at time of passing :WRAP_NONE :WRAP_WORD



61
62
63
64
65
# File 'lib/rbcurse/rmultitextview.rb', line 61

def set_content list, wrap = :WRAP_NONE
  ret = super
#  buff = @bmanager.add_content @list
  return ret
end

#set_current_bufferObject



189
190
191
192
193
194
# File 'lib/rbcurse/rmultitextview.rb', line 189

def set_current_buffer
  @current_index = @current_buffer.current_index
  @curpos = @current_buffer.curpos
  @title = @current_buffer.title
  @list = @current_buffer.list
end