Class: RubyCurses::CommandWindow

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/rbcurse/core/util/rcommandwindow.rb

Defined Under Namespace

Classes: ListObject

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utils

#OLDdefine_key, #_process_key, #bind_key, #bind_keys, #clean_string!, #define_key, #define_prefix_command, #display_app_help, #get_attrib, #get_color, #keycode_tos, #last_line, #one_line_window, #parse_formatted_text, #print_key_bindings, #repeatm, #run_command, #shell_out, #shell_output, #suspend, #view, #wrap_text

Constructor Details

#initialize(form = nil, aconfig = {}, &block) ⇒ CommandWindow

Returns a new instance of CommandWindow.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 28

def initialize form=nil, aconfig={}, &block
  @config = aconfig
  @config.each_pair { |k,v| instance_variable_set("@#{k}",v) }
  instance_eval &block if block_given?
  if @layout.nil? 
      set_layout(1,80, -1, 0) 
  end
  @height = @layout[:height]
  @width = @layout[:width]
  @window = VER::Window.new(@layout)
  @start = 0 # row for display of text with paging
  @list = []
  # 2013-03-21 - 00:34 removed due to 187
  #require 'forwardable'
  require 'rbcurse/core/util/bottomline'
  @bottomline = Bottomline.new @window, 0
  @bottomline.name = "rcommandwindow's bl"
  # 187compat next line throws up on 187 module_eval undefined method for commandwindow
  #extend Forwardable
  #def_delegators :@bottomline, :ask, :say, :agree, :choose #, :display_text_interactive
  if @box == :border
    @window.box 0,0
  elsif @box
    @window.attron(Ncurses.COLOR_PAIR($normalcolor) | Ncurses::A_REVERSE)
    @window.mvhline 0,0,1,@width
    @window.printstring 0,0,@title, $normalcolor #, 'normal' if @title
    @window.attroff(Ncurses.COLOR_PAIR($normalcolor) | Ncurses::A_REVERSE)
  else
    #@window.printstring 0,0,@title, $normalcolor,  'reverse' if @title
    title @title
  end
  @window.wrefresh
  @panel = @window.panel
  Ncurses::Panel.update_panels
  @window.wrefresh
  @row_offset = 0
  if @box
    @row_offset = 1
  end
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



23
24
25
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 23

def config
  @config
end

#layoutObject (readonly)

Returns the value of attribute layout.



24
25
26
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 24

def layout
  @layout
end

#windowObject (readonly)

required for keyboard or printing



25
26
27
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 25

def window
  @window
end

Instance Method Details

#agree(*args) ⇒ Object



76
77
78
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 76

def agree *args
  @bottomline.send(:agree, *args)
end

#ask(*args) ⇒ Object

2013-03-21 - 187compat def_delegators :@bottomline, :ask, :say, :agree, :choose #, :display_text_interactive



70
71
72
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 70

def ask *args
  @bottomline.send(:ask, *args)
end

#cget(param) ⇒ Object



156
157
158
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 156

def cget param
  @config[param]
end

#choose(*args) ⇒ Object



79
80
81
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 79

def choose *args
  @bottomline.send(:choose, *args)
end

#clearObject

clears the window, leaving the title line as is, from row 1 onwards



282
283
284
285
286
287
288
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 282

def clear
  @window.wmove 1,1
  @window.wclrtobot
  @window.box 0,0 if @box == :border
  # lower line of border will get erased currently since we are writing to 
  # last line FIXME
end

#configure(*val, &block) ⇒ Object

might as well add more keys for paging.



146
147
148
149
150
151
152
153
154
155
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 146

def configure(*val , &block)
  case val.size
  when 1
    return @config[val[0]]
  when 2
    @config[val[0]] = val[1]
    instance_variable_set("@#{val[0]}", val[1]) 
  end
  instance_eval &block if block_given?
end

#destroyObject



169
170
171
172
173
174
175
176
177
178
179
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 169

def destroy
  $log.debug "DESTROY : rcommandwindow"
  if @window
    begin
      panel = @window.panel
      Ncurses::Panel.del_panel(panel.pointer) if panel
      @window.delwin
    rescue => exc
    end
  end
end

#display_interactive(text, config = {}) {|@to| ... } ⇒ Object

lower line of border will get erased currently since we are writing to last line FIXME

Yields:

  • (@to)


289
290
291
292
293
294
295
296
297
298
299
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 289

def display_interactive text, config={}
  if @to
    @to.content text
  else
    config[:box] = @box
    @to = ListObject.new self, text, config
  end
  yield @to if block_given?
  @to.display_interactive # this returns the item selected
  @to   # this will return the ListObject to the user with list and current_index
end

#display_menu(list, options = {}) ⇒ Object

Displays list in a window at bottom of screen, if large then 2 or 3 columns. indexing - can be letter or number. Anything else will be ignored, however

it will result in first letter being highlighted in indexcolor

indexcolor - color of mnemonic, default green

Parameters:

  • list (Array)

    of string to be displayed

  • configuration (Hash)

    options: indexing and indexcolor



187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 187

def display_menu list, options={}
  indexing = options[:indexing]
  indexcolor = options[:indexcolor] || get_color($normalcolor, :yellow, :black)
  indexatt = Ncurses::A_BOLD
  #
  # the index to start from (used when scrolling a long menu such as file list)
  startindex = options[:startindex] || 0

  max_cols = 3 #  maximum no of columns, we will reduce based on data size
  l_succ = "`"
  act_height = @height
  if @box
    act_height = @height - 2
  end
  lh = list.size
  if lh < act_height
    $log.debug "DDD inside one window" if $log.debug? 
    list.each_with_index { |e, i| 
      text = e
      case e
      when Array
        text = e.first + " ..."
      end
      if indexing == :number
        mnem = i+1
        text = "%d. %s" % [i+1, text] 
      elsif indexing == :letter
        mnem = l_succ.succ!
        text = "%s. %s" % [mnem, text] 
      end
      @window.printstring i+@row_offset, 1, text, $normalcolor  
      if indexing
        window.mvchgat(y=i+@row_offset, x=1, max=1, indexatt, indexcolor, nil)
      end
    }
  else
    $log.debug "DDD inside two window" if $log.debug? 
    row = 0
    h = act_height
    cols = (lh*1.0 / h).ceil
    cols = max_cols if cols > max_cols
    # sometimes elements are large like directory paths, so check size
    datasize = list.first.length
    if datasize > @width/3 # keep safety margin since checking only first row
      cols = 1
    elsif datasize > @width/2
      cols = [2,cols].min
    end
    adv = (@width/cols).to_i
    colct = 0
    col = 1
    $log.debug "DDDcols #{cols}, adv #{adv} size: #{lh} h: #{act_height} w #{@width} " if $log.debug? 
    list.each_with_index { |e, i| 
      text = e
      # signify that there's a deeper level
      case e
      when Array
        text = e.first + "..."
      end
      if indexing == :number
        mnem = i+1
        text = "%d. %s" % [mnem, text] 
      elsif indexing == :letter
        mnem = l_succ.succ!
        text = "%s. %s" % [mnem, text] 
      end
      # print only within range and window height
      if i >= startindex && row < @window.actual_height
        $log.debug "XXX: MENU #{i} > #{startindex} row #{row} col #{col} "
        @window.printstring row+@row_offset, col, text, $normalcolor  
        if indexing
          @window.mvchgat(y=row+@row_offset, x=col, max=1, indexatt, indexcolor, nil)
        end
      colct += 1
      if colct == cols
        col = 1
        row += 1
        colct = 0
      else
        col += adv
      end
      end # startindex
    }
  end
  Ncurses::Panel.update_panels();
  Ncurses.doupdate();
  @window.wrefresh
end

#handle_keysObject

todo handle mappings, so user can map keys TODO



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 94

def handle_keys
  begin
    while((ch = @window.getchar()) != 999 )
      case ch
      when -1
        next
      else
        press ch
        break if @stop
        yield ch if block_given?
      end
    end
  ensure
    destroy  
  end
  return #@selected_index
end

#press(ch) ⇒ Object

handles a key, commandline



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 112

def press ch 
  ch = ch.getbyte(0) if ch.class==String ## 1.9
  $log.debug " XXX press #{ch} " if $log.debug? 
  case ch
  when -1
    return
  when KEY_F1, 27, ?\C-q.getbyte(0)   
    @stop = true
    return
  when KEY_ENTER, 10, 13
    #$log.debug "popup ENTER : #{@selected_index} "
    #$log.debug "popup ENTER :  #{field.name}" if !field.nil?
    @stop = true
    return
  when ?\C-d.getbyte(0)
    @start += @height-1
    bounds_check
  when KEY_UP
    @start -= 1
    @start = 0 if @start < 0
  when KEY_DOWN
    @start += 1
    bounds_check
  when ?\C-b.getbyte(0)
    @start -= @height-1
    @start = 0 if @start < 0
  when 0
    @start = 0
  end
  Ncurses::Panel.update_panels();
  Ncurses.doupdate();
  @window.wrefresh
end

#refreshObject

refresh whatevers painted onto the window



276
277
278
279
280
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 276

def refresh
  Ncurses::Panel.update_panels();
  Ncurses.doupdate();
  @window.wrefresh
end

#say(*args) ⇒ Object



73
74
75
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 73

def say *args
  @bottomline.send(:say, *args)
end

#set_layout(height = 0, width = 0, top = 0, left = 0) ⇒ Object



160
161
162
163
164
165
166
167
168
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 160

def set_layout(height=0, width=0, top=0, left=0)
  # negative means top should be n rows from last line. -1 is last line
  if top < 0
    top = Ncurses.LINES-top
  end
  @layout = { :height => height, :width => width, :top => top, :left => left } 
  @height = height
  @width = width
end

#stopping?Boolean

message box

Returns:

  • (Boolean)


90
91
92
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 90

def stopping?
  @stop
end

#title(t = nil) ⇒ Object

modify the window title, or get it if no params passed.



83
84
85
86
87
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 83

def title t=nil
  return @title unless t
  @title = t
  @window.printstring 0,0,@title, $normalcolor,  'reverse' if @title
end

#udisplay_list(text, config = {}) {|@to| ... } ⇒ Object

non interactive list display - EACH CALL IS CREATING A LIST OBJECT

Yields:

  • (@to)


301
302
303
304
305
306
307
308
309
310
311
312
# File 'lib/rbcurse/core/util/rcommandwindow.rb', line 301

def udisplay_list text, config={}
  if @to
    @to.content text
  else
    config[:box] = @box
    @to = ListObject.new self, text, config
  end
  #@to ||= ListObject.new self, text, config
  yield @to if block_given?
  @to.display_content
  @to
end