Class: Cygnus::TextPad

Inherits:
Widget
  • Object
show all
Includes:
BorderTitle
Defined in:
lib/cygnus/textpad.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

You may pass height, width, row and col for creating a window otherwise a fullscreen window will be created. If you pass a window from caller then that window will be used. Some keys are trapped, jkhl space, pgup, pgdown, end, home, t b This is currently very minimal and was created to get me started to integrating pads into other classes such as textview.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/cygnus/textpad.rb', line 47

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

  @editable = false
  @focusable = true
  @config = config
  @row = @col = 0
  @prow = @pcol = 0
  @startrow = 0
  @startcol = 0
  @list = []
  super

  ## NOTE 
  #  ---------------------------------------------------
  #  Since we are using pads, you need to get your height, width and rows correct
  #  Make sure the height factors in the row, else nothing may show
  #  ---------------------------------------------------
  #@height = @height.ifzero(FFI::NCurses.LINES)
  #@width = @width.ifzero(FFI::NCurses.COLS)
  @rows = @height
  @cols = @width
  # NOTE XXX if cols is > COLS then padrefresh can fail
  @startrow = @row
  @startcol = @col
  #@suppress_border = config[:suppress_border]
  @row_offset = @col_offset = 1
  unless @suppress_border
    @startrow += 1
    @startcol += 1
    @rows -=3  # 3 is since print_border_only reduces one from width, to check whether this is correct
    @cols -=3
  else
    # seeing why nothing is printing
    @rows -=0  # 3 is since print_border_only reduces one from width, to check whether this is correct
    ## if next is 0 then padrefresh doesn't print
    @cols -=1
  end
  @row_offset = @col_offset = 0 if @suppress_borders
  @top = @row
  @left = @col
  @lastrow = @row + 1
  @lastcol = @col + 1
  @_events << :PRESS
  @_events << :ENTER_ROW
  @scrollatrows = @height - 3
  init_vars
end

Instance Attribute Details

#colsObject (readonly)

Returns the value of attribute cols.



41
42
43
# File 'lib/cygnus/textpad.rb', line 41

def cols
  @cols
end

#current_indexObject (readonly)

Returns the value of attribute current_index.



40
41
42
# File 'lib/cygnus/textpad.rb', line 40

def current_index
  @current_index
end

#rowsObject (readonly)

Returns the value of attribute rows.



41
42
43
# File 'lib/cygnus/textpad.rb', line 41

def rows
  @rows
end

Instance Method Details

#ask_searchObject

Ask user for string to search for This uses the dialog, but what if user wants the old style. Isn’t there a cleaner way to let user override style, or allow user to use own UI for getting pattern and then passing here.



722
723
724
725
726
727
728
729
730
731
732
733
734
735
# File 'lib/cygnus/textpad.rb', line 722

def ask_search
  str = get_string("Enter pattern: ")
  return if str.nil? 
  str = @last_regex if str == ""
  return if str == ""
  ix = next_match str
  return unless ix
  @last_regex = str

  #@oldindex = @current_index
  @current_index = ix[0]
  @curpos = ix[1]
  ensure_visible
end

#bottom_of_windowObject



440
441
442
443
444
445
446
447
# File 'lib/cygnus/textpad.rb', line 440

def bottom_of_window
  @current_index = @prow + @scrollatrows
  $multiplier ||= 0
  if $multiplier > 0
    @current_index -= $multiplier
    $multiplier = 0
  end
end

#contentObject Also known as: get_content



223
224
225
226
# File 'lib/cygnus/textpad.rb', line 223

def content
  raise "content is nil " unless @content
  return @content
end

#current_valueObject

returns current value (what cursor is on)



614
615
616
# File 'lib/cygnus/textpad.rb', line 614

def current_value
  @content[@current_index]
end

#cursor_backwardObject

move cursor backward by one char (currently will not pan)



824
825
826
827
828
829
830
831
832
# File 'lib/cygnus/textpad.rb', line 824

def cursor_backward
  $multiplier = 1 if $multiplier == 0
  if @curpos > 0
    @curpos -= $multiplier
    @curpos = 0 if @curpos < 0
    @repaint_required = true
  end
  $multiplier = 0
end

#cursor_bolObject

moves cursor to start of line, panning if required



845
846
847
848
849
850
# File 'lib/cygnus/textpad.rb', line 845

def cursor_bol
  # copy of C-a - start of line
  @repaint_required = true if @pcol > 0
  @pcol = 0
  @curpos = 0
end

#cursor_eolObject

moves cursor to end of line also panning window if necessary NOTE: if one line on another page (not displayed) is way longer than any displayed line, then this will pan way ahead, so may not be very intelligent in such situations.



837
838
839
840
841
842
# File 'lib/cygnus/textpad.rb', line 837

def cursor_eol
  # pcol is based on max length not current line's length
  @pcol = @content_cols - @cols - 1
  @curpos = @content[@current_index].size
  @repaint_required = true
end

#cursor_forwardObject

move cursor forward by one char (currently will not pan)



811
812
813
814
815
816
817
818
819
820
821
# File 'lib/cygnus/textpad.rb', line 811

def cursor_forward
  $multiplier = 1 if $multiplier == 0
  if @curpos < @cols
    @curpos += $multiplier
    if @curpos > @cols
      @curpos = @cols
    end
    @repaint_required = true
  end
  $multiplier = 0
end

#destroyObject

Now since we use get_pad from window, upon the window being destroyed, it will call this. Else it will destroy pad



635
636
637
638
# File 'lib/cygnus/textpad.rb', line 635

def destroy
  FFI::NCurses.delwin(@pad) if @pad # when do i do this ? FIXME
  @pad = nil
end

#down(num = (($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)) ⇒ Object

move down a line mimicking vim’s j key

Parameters:

  • multiplier (int)

    entered prior to invoking key



455
456
457
458
459
460
# File 'lib/cygnus/textpad.rb', line 455

def down num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
  #@oldindex = @current_index if num > 10
  @current_index += num
  ensure_visible
  $multiplier = 0
end

#ensure_visible(row = @current_index) ⇒ Object

Ensure current row is visible, if not make it first row NOTE - need to check if its at end and then reduce scroll at rows, check_prow does that

Parameters:

  • current_index (default if not given)


774
775
776
777
778
# File 'lib/cygnus/textpad.rb', line 774

def ensure_visible row = @current_index
  unless is_visible? row
      @prow = @current_index
  end
end

#filename(filename, reader = nil) ⇒ Object

supply a filename as source for textpad Reads up file into @content One can optionally send in a method which takes a filename and returns an array of data This is required if you are processing files which are binary such as zip/archives and wish to print the contents. (e.g. cygnus gem sends in :get_file_contents).

filename("a.c", method(:get_file_contents))


187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/cygnus/textpad.rb', line 187

def filename(filename, reader=nil)
  @file = filename
  unless File.exists? filename
    alert "#{filename} does not exist"
    return
  end
  @filetype = File.extname filename
  if reader
    @content = reader.call(filename)
  else
    @content = File.open(filename,"r").readlines
  end
  if @filetype == ""
    if @content.first.index("ruby")
      @filetype = ".rb"
    end
  end
  init_vars
  @repaint_all = true
  @_populate_needed = true
end

#find_moreObject

Find next matching row for string accepted in ask_search



739
740
741
742
743
744
745
746
747
# File 'lib/cygnus/textpad.rb', line 739

def find_more
  return unless @last_regex
  ix = next_match @last_regex
  return unless ix
  #@oldindex = @current_index
  @current_index = ix[0]
  @curpos = ix[1]
  ensure_visible
end

#fire_action_eventObject

event when user hits enter on a row, user would bind :PRESS



606
607
608
609
610
611
# File 'lib/cygnus/textpad.rb', line 606

def fire_action_event
  return if @content.nil? || @content.size == 0
  require 'rbcurse/core/include/ractionevent'
  aev = TextActionEvent.new self, :PRESS, current_value().to_s, @current_index, @curpos
  fire_handler :PRESS, aev
end

#formatted_text(text, fmt) ⇒ Object

pass in formatted text along with parser (:tmux or :ansi)



281
282
283
284
285
286
287
288
289
# File 'lib/cygnus/textpad.rb', line 281

def formatted_text text, fmt
  require 'rbcurse/core/include/chunk'
  @formatted_text = text
  @color_parser = fmt
  @repaint_required = true
  # don't know if start is always required. so putting in caller
  #goto_start
  #remove_all
end

#forward_wordObject

jumps cursor to next work, like vim’s w key



782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
# File 'lib/cygnus/textpad.rb', line 782

def forward_word
  $multiplier = 1 if !$multiplier || $multiplier == 0
  line = @current_index
  buff = @content[line].to_s
  return unless buff
  pos = @curpos || 0 # list does not have curpos
  $multiplier.times {
    found = buff.index(/[[:punct:][:space:]]\w/, pos)
    if !found
      # if not found, we've lost a counter
      if line+1 < @content.length
        line += 1
      else
        return
      end
      pos = 0
    else
      pos = found + 1
    end
    $log.debug " forward_word: pos #{pos} line #{line} buff: #{buff}"
  }
  $multiplier = 0
  @current_index = line
  @curpos = pos
  ensure_visible
  @repaint_required = true
end

#goto_endObject

goto last line of file



413
414
415
416
417
418
419
420
421
422
423
# File 'lib/cygnus/textpad.rb', line 413

def goto_end
  #@oldindex = @current_index
  $multiplier ||= 0
  if $multiplier > 0
    goto_line $multiplier - 1
    return
  end
  @current_index = @content.count() - 1
  @prow = @current_index - @scrollatrows
  $multiplier = 0
end

#goto_last_positionObject



513
514
515
516
517
518
519
# File 'lib/cygnus/textpad.rb', line 513

def goto_last_position
  return unless @oldindex
  tmp = @current_index
  @current_index = @oldindex
  @oldindex = tmp
  bounds_check
end

#goto_line(line) ⇒ Object



424
425
426
427
428
429
430
431
# File 'lib/cygnus/textpad.rb', line 424

def goto_line line
  ## we may need to calculate page, zfm style and place at right position for ensure visible
  #line -= 1
  @current_index = line
  ensure_visible line
  bounds_check
  $multiplier = 0
end

#goto_startObject

goto first line of file



399
400
401
402
403
404
405
406
407
408
409
410
# File 'lib/cygnus/textpad.rb', line 399

def goto_start
  #@oldindex = @current_index
  $multiplier ||= 0
  if $multiplier > 0
    goto_line $multiplier - 1
    return
  end
  @current_index = 0
  @curpos = @pcol = @prow = 0
  @prow = 0
  $multiplier = 0
end

#handle_key(ch) ⇒ Object



547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
# File 'lib/cygnus/textpad.rb', line 547

def handle_key ch
  return :UNHANDLED unless @content
  map_keys unless @mapped_keys


  @oldrow = @prow
  @oldcol = @pcol
  $log.debug "XXX: PAD got #{ch} prow = #{@prow}"
  begin
    case ch
  when ?0.getbyte(0)..?9.getbyte(0)
    if ch == ?0.getbyte(0) && $multiplier == 0
      cursor_bol
      return 0
    end
    # storing digits entered so we can multiply motion actions
    $multiplier *= 10 ; $multiplier += (ch-48)
    return 0
    when ?\C-c.getbyte(0)
      $multiplier = 0
      return 0
    else
      # check for bindings, these cannot override above keys since placed at end
      begin
        ret = process_key ch, self
        $multiplier = 0
        bounds_check
        ## If i press C-x > i get an alert from rwidgets which blacks the screen
        # if i put a padrefresh here it becomes okay but only for one pad,
        # i still need to do it for all pads.
      rescue => err
        $log.error " TEXTPAD ERROR INS #{err} "
        $log.debug(err.backtrace.join("\n"))
        textdialog ["Error in TextPad: #{err} ", *err.backtrace], :title => "Exception"
      end
      ## NOTE if textpad does not handle the event and it goes to form which pops
      # up a messagebox, then padrefresh does not happen, since control does not 
      # come back here, so a black rect is left on screen
      # please note that a bounds check will not happen for stuff that 
      # is triggered by form, so you'll have to to it yourself or 
      # call setrowcol explicity if the cursor is not updated
      return :UNHANDLED if ret == :UNHANDLED
    end
  rescue => err
    $log.error " TEXTPAD ERROR 591 #{err} "
    $log.debug( err) if err
    $log.debug(err.backtrace.join("\n")) if err
    textdialog ["Error in TextPad: #{err} ", *err.backtrace], :title => "Exception"
    $error_message.value = ""
  ensure
    padrefresh
    Ncurses::Panel.update_panels
  end
  return 0
end

#init_varsObject



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/cygnus/textpad.rb', line 94

def init_vars
  $multiplier = 0
  @oldindex = @current_index = 0
  # column cursor
  @prow = @pcol = @curpos = 0
  if @row && @col
    @lastrow = @row + 1
    @lastcol = @col + 1
  end
  @repaint_required = true
end

#is_visible?(index) ⇒ Boolean

return true if the given row is visible

Returns:

  • (Boolean)


641
642
643
644
# File 'lib/cygnus/textpad.rb', line 641

def is_visible? index
  j = index - @prow #@toprow
  j >= 0 && j <= @scrollatrows
end

#map_keysObject

key mappings



369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
# File 'lib/cygnus/textpad.rb', line 369

def map_keys
  @mapped_keys = true
  bind_key([?g,?g], 'goto_start'){ goto_start } # mapping double keys like vim
  bind_key(279, 'goto_start'){ goto_start } 
  bind_keys([?G,277], 'goto end'){ goto_end } 
  bind_keys([?k,KEY_UP], "Up"){ up } 
  bind_keys([?j,KEY_DOWN], "Down"){ down } 
  bind_key(?\C-e, "Scroll Window Down"){ scroll_window_down } 
  bind_key(?\C-y, "Scroll Window Up"){ scroll_window_up } 
  bind_keys([32,338, ?\C-d], "Scroll Forward"){ scroll_forward } 
  bind_keys([?\C-b,339]){ scroll_backward } 
  # the next one invalidates the single-quote binding for bookmarks
  #bind_key([?',?']){ goto_last_position } # vim , goto last row position (not column)
  bind_key(?/, :ask_search)
  bind_key(?n, :find_more)
  bind_key([?\C-x, ?>], :scroll_right)
  bind_key([?\C-x, ?<], :scroll_left)
  bind_key(?\M-l, :scroll_right)
  bind_key(?\M-h, :scroll_left)
  bind_key(?L, :bottom_of_window)
  bind_key(?M, :middle_of_window)
  bind_key(?H, :top_of_window)
  bind_key(?w, :forward_word)
  bind_key(?l, :cursor_forward)
  bind_key(?h, :cursor_backward)
  bind_key(?$, :cursor_eol)
  bind_key(KEY_ENTER, :fire_action_event)
end

#middle_of_windowObject



448
449
450
451
# File 'lib/cygnus/textpad.rb', line 448

def middle_of_window
  @current_index = @prow + (@scrollatrows/2)
  $multiplier = 0
end

#next_match(str) ⇒ Object

Find the next row that contains given string

Parameters:

  • String

    to find

Returns:

  • row and col offset of match, or nil



753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
# File 'lib/cygnus/textpad.rb', line 753

def next_match str
  first = nil
  ## content can be string or Chunkline, so we had to write <tt>index</tt> for this.
  ## =~ does not give an error, but it does not work.
  @content.each_with_index do |line, ix|
    col = line.index str
    if col
      first ||= [ ix, col ]
      if ix > @current_index
        return [ix, col]
      end
    end
  end
  return first
end

#on_enterObject

called when this widget is entered, by form



647
648
649
# File 'lib/cygnus/textpad.rb', line 647

def on_enter
  set_form_row
end

#on_enter_row(arow) ⇒ Object

execute binding when a row is entered, used more in lists to display some text in a header or footer as one traverses



621
622
623
624
625
626
627
# File 'lib/cygnus/textpad.rb', line 621

def on_enter_row arow
  return if @content.nil? || @content.size == 0
  require 'rbcurse/core/include/ractionevent'
  aev = TextActionEvent.new self, :ENTER_ROW, current_value().to_s, @current_index, @curpos
  fire_handler :ENTER_ROW, aev
  @repaint_required = true
end

#padrefreshObject

write pad onto window private



293
294
295
296
297
298
299
300
301
302
# File 'lib/cygnus/textpad.rb', line 293

def padrefresh
  top = @window.top
  left = @window.left
  sr = @startrow + top
  sc = @startcol + left
  retval = FFI::NCurses.prefresh(@pad,@prow,@pcol, sr , sc , @rows + sr , @cols+ sc );
  $log.warn "XXX:  PADREFRESH #{retval}, #{@prow}, #{@pcol}, #{sr}, #{sc}, #{@rows+sr}, #{@cols+sc}." if retval == -1
  # padrefresh can fail if width is greater than NCurses.COLS
  #FFI::NCurses.prefresh(@pad,@prow,@pcol, @startrow + top, @startcol + left, @rows + @startrow + top, @cols+@startcol + left);
end

2013-03-07 - 19:57 changed width to @content_cols since data not printing in some cases fully when ansi sequences were present int some line but not in others lines without ansi were printing less by a few chars. This was prolly copied from rwindow, where it is okay since its for a specific width



246
247
248
249
250
# File 'lib/cygnus/textpad.rb', line 246

def print(string, _width = @content_cols)
  #return unless visible?
  w = _width == 0? Ncurses.COLS : _width
  FFI::NCurses.waddnstr(@pad,string.to_s, w) # changed 2011 dts  
end

print footer containing line and position



230
231
232
233
234
235
236
# File 'lib/cygnus/textpad.rb', line 230

def print_foot #:nodoc:
  @footer_attrib ||= Ncurses::A_REVERSE
  footer = "R: #{@current_index+1}, C: #{@curpos+@pcol}, #{@list.length} lines  "
  $log.debug " print_foot calling printstring with #{@row} + #{@height} -1, #{@col}+2"
  @graphic.printstring( @row + @height -1 , @col+2, footer, @color_pair || $datacolor, @footer_attrib) 
  @repaint_footer_required = false # 2010-01-23 22:55 
end

#render(pad, lineno, text) ⇒ Object

default method for rendering a line



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/cygnus/textpad.rb', line 158

def render pad, lineno, text
  if text.is_a? Chunks::ChunkLine
    FFI::NCurses.wmove @pad, lineno, 0
    a = get_attrib @attrib
  
    show_colored_chunks text, nil, a
    return
  end
  if @renderer
    @renderer.render @pad, lineno, text
  else
    ## messabox does have a method to paint the whole window in bg color its in rwidget.rb
    att = NORMAL
    FFI::NCurses.wattron(@pad, @cp | att)
    FFI::NCurses.mvwaddstr(@pad,lineno, 0, @clearstring) if @clearstring
    FFI::NCurses.mvwaddstr(@pad,lineno, 0, @content[lineno])

    #FFI::NCurses.mvwaddstr(pad, lineno, 0, text)
    FFI::NCurses.wattroff(@pad, @cp | att)
  end
end

#renderer(r) ⇒ Object

supply a custom renderer that implements render()

See Also:



152
153
154
# File 'lib/cygnus/textpad.rb', line 152

def renderer r
  @renderer = r
end

#repaintObject



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
# File 'lib/cygnus/textpad.rb', line 322

def repaint
  ## 2013-03-08 - 21:01 This is the fix to the issue of form callign an event like ? or F1
  # which throws up a messagebox which leaves a black rect. We have no place to put a refresh
  # However, form does call repaint for all objects, so we can do a padref here. Otherwise,
  # it would get rejected. UNfortunately this may happen more often we want, but we never know
  # when something pops up on the screen.
  padrefresh unless @repaint_required
  return unless @repaint_required
  if @formatted_text
    $log.debug "XXX:  INSIDE FORMATTED TEXT "

    l = RubyCurses::Utils.parse_formatted_text(@color_parser,
                                           @formatted_text)

    text(l)
    @formatted_text = nil
  end

  ## moved this line up or else create_p was crashing
  @window ||= @graphic
  populate_pad if @_populate_needed
  #HERE we need to populate once so user can pass a renderer
  unless @suppress_border
    if @repaint_all
      ## XXX im not getting the background color.
      #@window.print_border_only @top, @left, @height-1, @width, $datacolor
      clr = get_color $datacolor, @color, @bgcolor
      #@window.print_border @top, @left, @height-1, @width, clr
      @window.print_border_only @top, @left, @height-1, @width, clr
      print_title

      @repaint_footer_required = true if @oldrow != @current_index 
      print_foot if @print_footer && !@suppress_borders && @repaint_footer_required

      @window.wrefresh
    end
  end

  padrefresh
  Ncurses::Panel.update_panels
  @repaint_required = false
  @repaint_all = false
end

#rowcolObject

:nodoc:



105
106
107
# File 'lib/cygnus/textpad.rb', line 105

def rowcol #:nodoc:
  return @row+@row_offset, @col+@col_offset
end

#scroll_backwardObject

scrolls lines backward a window full at a time, on pressing pageup C-u may not work since it is trapped by form earlier. Need to fix



508
509
510
511
512
# File 'lib/cygnus/textpad.rb', line 508

def scroll_backward
  #@oldindex = @current_index
  @current_index -= @scrollatrows
  @prow = @current_index - @scrollatrows
end

#scroll_forwardObject

scrolls lines a window full at a time, on pressing ENTER or C-d or pagedown



500
501
502
503
504
# File 'lib/cygnus/textpad.rb', line 500

def scroll_forward
  #@oldindex = @current_index
  @current_index += @scrollatrows
  @prow = @current_index - @scrollatrows
end

#scroll_leftObject

to prevent right from retaining earlier painted values padreader does not do a clear, yet works fine. OK it has an update_panel after padrefresh, that clears it seems. this clears entire window not just the pad FFI::NCurses.wclear(@window.get_window) so border and title is repainted after window clearing

Next line was causing all sorts of problems when scrolling with ansi formatted text



540
541
542
# File 'lib/cygnus/textpad.rb', line 540

def scroll_left
  @pcol -= 1
end

#scroll_rightObject



520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
# File 'lib/cygnus/textpad.rb', line 520

def scroll_right
  # I don't think it will ever be less since we've increased it to cols
  if @content_cols <= @cols
    maxpcol = 0
    @pcol = 0
  else
    maxpcol = @content_cols - @cols - 1
    @pcol += 1
    @pcol = maxpcol if @pcol > maxpcol
  end
  # to prevent right from retaining earlier painted values
  # padreader does not do a clear, yet works fine.
  # OK it has an update_panel after padrefresh, that clears it seems.
  #this clears entire window not just the pad
  #FFI::NCurses.wclear(@window.get_window)
  # so border and title is repainted after window clearing
  #
  # Next line was causing all sorts of problems when scrolling  with ansi formatted text
  #@repaint_all = true
end

#scroll_window_down(num = (($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)) ⇒ Object

scrolls window down mimicking vim C-e

Parameters:

  • multiplier (int)

    entered prior to invoking key



479
480
481
482
483
484
485
486
# File 'lib/cygnus/textpad.rb', line 479

def scroll_window_down num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
  @prow += num
    if @prow > @current_index
      @current_index += 1
    end
  #check_prow
  $multiplier = 0
end

#scroll_window_up(num = (($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)) ⇒ Object

scrolls window up mimicking vim C-y

Parameters:

  • multiplier (int)

    entered prior to invoking key



490
491
492
493
494
495
496
497
# File 'lib/cygnus/textpad.rb', line 490

def scroll_window_up num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
  @prow -= num
  unless is_visible? @current_index
    # one more check may be needed here TODO
    @current_index -= num
  end
  $multiplier = 0
end

#set_form_colObject

called by form



655
656
# File 'lib/cygnus/textpad.rb', line 655

def set_form_col
end

#set_form_rowObject

called by form



651
652
653
# File 'lib/cygnus/textpad.rb', line 651

def set_form_row
  setrowcol @lastrow, @lastcol
end

#show_colored_chunks(chunks, defcolor = nil, defattr = nil) ⇒ Object



252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'lib/cygnus/textpad.rb', line 252

def show_colored_chunks(chunks, defcolor = nil, defattr = nil)
  #return unless visible?
  chunks.each do |chunk| #|color, chunk, attrib|
    case chunk
    when Chunks::Chunk
      color = chunk.color
      attrib = chunk.attrib
      text = chunk.text
    when Array
      # for earlier demos that used an array
      color = chunk[0]
      attrib = chunk[2]
      text = chunk[1]
    end

    color ||= defcolor
    attrib ||= defattr || NORMAL

    #cc, bg = ColorMap.get_colors_for_pair color
    #$log.debug "XXX: CHUNK textpad #{text}, cp #{color} ,  attrib #{attrib}. #{cc}, #{bg} "
    FFI::NCurses.wcolor_set(@pad, color,nil) if color
    FFI::NCurses.wattron(@pad, attrib) if attrib
    print(text)
    FFI::NCurses.wattroff(@pad, attrib) if attrib
  end
end

#text(lines) ⇒ Object Also known as: list

XXX in list text returns the selected row, list returns the full thing, keep consistent



213
214
215
216
217
218
219
220
221
# File 'lib/cygnus/textpad.rb', line 213

def text(lines)
  #raise "text() receiving null content" unless lines
  return @content if lines.empty?
  @content = lines
  @_populate_needed = true
  @repaint_all = true
  init_vars
  self
end

#top_of_windowObject



432
433
434
435
436
437
438
439
# File 'lib/cygnus/textpad.rb', line 432

def top_of_window
  @current_index = @prow 
  $multiplier ||= 0
  if $multiplier > 0
    @current_index += $multiplier
    $multiplier = 0
  end
end

#up(num = (($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)) ⇒ Object

move up a line mimicking vim’s k key

Parameters:

  • multiplier (int)

    entered prior to invoking key



464
465
466
467
468
469
470
471
472
473
474
475
# File 'lib/cygnus/textpad.rb', line 464

def up num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
  #@oldindex = @current_index if num > 10
  @current_index -= num
  #unless is_visible? @current_index
    #if @prow > @current_index
      ##$status_message.value = "1 #{@prow} > #{@current_index} "
      #@prow -= 1
    #else
    #end
  #end
  $multiplier = 0
end