rndk 0.2.0 → 1.0.0

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -4
  3. data/TODO +21 -1
  4. data/demos/appointment.rb +279 -299
  5. data/demos/clock.rb +13 -8
  6. data/demos/rss-reader.rb +84 -0
  7. data/examples/01-hello-world.rb +13 -11
  8. data/examples/02-colors.rb +14 -21
  9. data/examples/03-markup.rb +7 -7
  10. data/examples/04-quick-widgets.rb +2 -2
  11. data/examples/05-position-widget.rb +50 -31
  12. data/examples/06-callbacks.rb +77 -0
  13. data/examples/07-traverse.rb +90 -0
  14. data/examples/10-all-widgets.rb +165 -0
  15. data/examples/calendar.rb +20 -32
  16. data/examples/entry.rb +15 -20
  17. data/examples/label.rb +11 -11
  18. data/examples/scroll.rb +16 -60
  19. data/examples/slider.rb +18 -19
  20. data/examples/viewer.rb +65 -0
  21. data/lib/rndk.rb +28 -7
  22. data/lib/rndk/alphalist.rb +309 -313
  23. data/lib/rndk/button.rb +239 -157
  24. data/lib/rndk/buttonbox.rb +136 -103
  25. data/lib/rndk/calendar.rb +246 -203
  26. data/lib/rndk/core/color.rb +63 -13
  27. data/lib/rndk/core/display.rb +1 -1
  28. data/lib/rndk/core/draw.rb +11 -11
  29. data/lib/rndk/core/markup.rb +21 -21
  30. data/lib/rndk/core/quick_widgets.rb +75 -96
  31. data/lib/rndk/core/screen.rb +145 -102
  32. data/lib/rndk/core/traverse.rb +150 -136
  33. data/lib/rndk/core/utils.rb +5 -6
  34. data/lib/rndk/core/widget.rb +207 -191
  35. data/lib/rndk/core/widget_bind.rb +108 -0
  36. data/lib/rndk/dialog.rb +88 -56
  37. data/lib/rndk/entry.rb +79 -64
  38. data/lib/rndk/fscale.rb +38 -20
  39. data/lib/rndk/fslider.rb +38 -23
  40. data/lib/rndk/graph.rb +92 -53
  41. data/lib/rndk/itemlist.rb +80 -62
  42. data/lib/rndk/label.rb +111 -77
  43. data/lib/rndk/radio.rb +138 -128
  44. data/lib/rndk/scale.rb +123 -122
  45. data/lib/rndk/scroll.rb +444 -391
  46. data/lib/rndk/scroller.rb +21 -21
  47. data/lib/rndk/slider.rb +149 -140
  48. data/lib/rndk/template.rb +74 -61
  49. data/lib/rndk/version.rb +1 -1
  50. data/lib/rndk/viewer.rb +499 -298
  51. metadata +8 -14
  52. data/demos/fileview.rb +0 -141
  53. data/lib/rndk/dscale.rb +0 -13
  54. data/lib/rndk/fselect.rb +0 -938
  55. data/lib/rndk/histogram.rb +0 -412
  56. data/lib/rndk/marquee.rb +0 -244
  57. data/lib/rndk/matrix.rb +0 -1189
  58. data/lib/rndk/mentry.rb +0 -619
  59. data/lib/rndk/menu.rb +0 -478
  60. data/lib/rndk/selection.rb +0 -630
  61. data/lib/rndk/swindow.rb +0 -766
  62. data/lib/rndk/uscale.rb +0 -14
  63. data/lib/rndk/uslider.rb +0 -14
@@ -1,21 +1,41 @@
1
1
  require 'rndk'
2
2
 
3
3
  module RNDK
4
- class TEMPLATE < Widget
5
- def initialize(rndkscreen, xplace, yplace, title, label, plate,
6
- overlay, box, shadow)
4
+ class Template < Widget
5
+ def initialize(screen, config={})
7
6
  super()
8
- parent_width = Ncurses.getmaxx(rndkscreen.window)
9
- parent_height = Ncurses.getmaxy(rndkscreen.window)
7
+ @widget_type = :template
8
+ @supported_signals += [:before_input, :after_input]
9
+
10
+ x = 0
11
+ y = 0
12
+ title = "template"
13
+ label = "label"
14
+ plate = "##/##/####"
15
+ overlay = "dd/mm/yyyy"
16
+ box = true
17
+ shadow = false
18
+
19
+ config.each do |key, val|
20
+ x = val if key == :x
21
+ y = val if key == :y
22
+ title = val if key == :title
23
+ label = val if key == :label
24
+ plate = val if key == :plate
25
+ overlay = val if key == :overlay
26
+ box = val if key == :box
27
+ shadow = val if key == :shadow
28
+ end
29
+
30
+ parent_width = Ncurses.getmaxx(screen.window)
31
+ parent_height = Ncurses.getmaxy(screen.window)
10
32
  box_width = 0
11
33
  box_height = if box then 3 else 1 end
12
34
  plate_len = 0
13
35
 
14
- if plate.nil? || plate.size == 0
15
- return nil
16
- end
36
+ return nil if plate.nil? || plate.size == 0
17
37
 
18
- self.set_box(box)
38
+ self.set_box box
19
39
 
20
40
  field_width = plate.size + 2 * @border_size
21
41
 
@@ -36,11 +56,11 @@ module RNDK
36
56
  overlay_len = []
37
57
  @overlay = RNDK.char2Chtype(overlay, overlay_len, [])
38
58
  @overlay_len = overlay_len[0]
39
- @field_attr = @overlay[0] & Ncurses::A_ATTRIBUTES
59
+ @field_attr = @overlay[0] & RNDK::Color[:extract]
40
60
  else
41
61
  @overlay = []
42
62
  @overlay_len = 0
43
- @field_attr = Ncurses::A_NORMAL
63
+ @field_attr = RNDK::Color[:normal]
44
64
  end
45
65
 
46
66
  # Set the box width.
@@ -59,9 +79,9 @@ module RNDK
59
79
  box_width - @label_len - 2 * @border_size].min
60
80
 
61
81
  # Rejustify the x and y positions if we need to.
62
- xtmp = [xplace]
63
- ytmp = [yplace]
64
- RNDK.alignxy(rndkscreen.window, xtmp, ytmp, box_width, box_height)
82
+ xtmp = [x]
83
+ ytmp = [y]
84
+ RNDK.alignxy(screen.window, xtmp, ytmp, box_width, box_height)
65
85
  xpos = xtmp[0]
66
86
  ypos = ytmp[0]
67
87
 
@@ -95,8 +115,8 @@ module RNDK
95
115
  @plate = plate.clone
96
116
 
97
117
  # Set up the rest of the structure.
98
- @screen = rndkscreen
99
- @parent = rndkscreen.window
118
+ @screen = screen
119
+ @parent = screen.window
100
120
  @shadow_win = nil
101
121
  @field_width = field_width
102
122
  @box_height = box_height
@@ -161,7 +181,7 @@ module RNDK
161
181
  end
162
182
 
163
183
  if change
164
- if self.validTemplate(test)
184
+ if self.valid_template? test
165
185
  @info = test
166
186
  self.drawField
167
187
  else
@@ -187,16 +207,16 @@ module RNDK
187
207
  ypos + 1, xpos + 1)
188
208
  end
189
209
 
190
- rndkscreen.register(:TEMPLATE, self)
210
+ screen.register(@widget_type, self)
191
211
  end
192
212
 
193
213
  # This actually manages the tempalte widget
194
- def activate(actions)
195
- self.draw(@box)
214
+ def activate(actions=[])
215
+ self.draw
196
216
 
197
217
  if actions.nil? || actions.size == 0
198
218
  while true
199
- input = self.getch([])
219
+ input = self.getch
200
220
 
201
221
  # Inject each character into the widget.
202
222
  ret = self.inject(input)
@@ -220,10 +240,10 @@ module RNDK
220
240
  end
221
241
 
222
242
  # This injects a character into the widget.
223
- def inject(input)
224
- pp_return = 1
243
+ def inject input
244
+ pp_return = true
225
245
  complete = false
226
- ret = -1
246
+ ret = false
227
247
 
228
248
  self.set_exit_type(0)
229
249
 
@@ -231,16 +251,14 @@ module RNDK
231
251
  self.drawField
232
252
 
233
253
  # Check if there is a pre-process function to be called.
234
- unless @pre_process_func.nil?
235
- pp_return = @pre_process_func.call(:TEMPLATE, self,
236
- @pre_process_data, input)
237
- end
254
+ keep_going = self.run_signal_binding(:before_input, input)
255
+
256
+ if keep_going
238
257
 
239
- # Should we continue?
240
- if pp_return != 0
241
258
  # Check a predefined binding
242
- if self.checkBind(:TEMPLATE, input)
243
- complete = true
259
+ if self.is_bound? input
260
+ self.run_key_binding input
261
+ #complete = true
244
262
  else
245
263
  case input
246
264
  when RNDK::ERASE
@@ -296,26 +314,22 @@ module RNDK
296
314
  end
297
315
  end
298
316
 
299
- # Should we call a post-process?
300
- if !complete && !(@post_process_func.nil?)
301
- @post_process_func.call(:TEMPLATE, self, @post_process_data, input)
302
- end
317
+ self.run_signal_binding(:after_input) if not complete
303
318
  end
304
319
 
305
- if !complete
306
- self.set_exit_type(0)
307
- end
308
320
 
321
+ self.set_exit_type(0) if not complete
309
322
  @return_data = ret
310
- return ret
323
+
324
+ ret
311
325
  end
312
326
 
313
- def validTemplate(input)
327
+ def valid_template? input
314
328
  pp = 0
315
329
  ip = 0
316
330
  while ip < input.size && pp < @plate.size
317
331
  newchar = input[ip]
318
- while pp < @plate.size && !RNDK::TEMPLATE.isPlateChar(@plate[pp])
332
+ while pp < @plate.size && !RNDK::Template.isPlateChar(@plate[pp])
319
333
  pp += 1
320
334
  end
321
335
  if pp == @plate.size
@@ -352,7 +366,7 @@ module RNDK
352
366
  if @info.size > 0
353
367
  mixed_string = ''
354
368
  while plate_pos < @plate_len && info_pos < @info.size
355
- mixed_string << if RNDK::TEMPLATE.isPlateChar(@plate[plate_pos])
369
+ mixed_string << if RNDK::Template.isPlateChar(@plate[plate_pos])
356
370
  then info_pos += 1; @info[info_pos - 1]
357
371
  else @plate[plate_pos]
358
372
  end
@@ -369,7 +383,7 @@ module RNDK
369
383
  unmixed_string = ''
370
384
 
371
385
  while pos < @info.size
372
- if RNDK::TEMPLATE.isPlateChar(@plate[pos])
386
+ if RNDK::Template.isPlateChar(@plate[pos])
373
387
  unmixed_string << info[pos]
374
388
  end
375
389
  pos += 1
@@ -379,9 +393,9 @@ module RNDK
379
393
  end
380
394
 
381
395
  # Move the template field to the given location.
382
- def move(xplace, yplace, relative, refresh_flag)
396
+ def move(x, y, relative, refresh_flag)
383
397
  windows = [@win, @label_win, @field_win, @shadow_win]
384
- self.move_specific(xplace, yplace, relative, refresh_flag,
398
+ self.move_specific(x, y, relative, refresh_flag,
385
399
  windows, [])
386
400
  end
387
401
 
@@ -397,7 +411,7 @@ module RNDK
397
411
  Draw.drawObjBox(@win, self)
398
412
  end
399
413
 
400
- self.drawTitle(@win)
414
+ self.draw_title(@win)
401
415
 
402
416
  Ncurses.wrefresh @win
403
417
 
@@ -408,7 +422,7 @@ module RNDK
408
422
  def drawField
409
423
  field_color = 0
410
424
 
411
- # Draw in the label and the template object.
425
+ # Draw in the label and the template widget.
412
426
  unless @label_win.nil?
413
427
  Draw.writeChtype(@label_win, 0, 0, @label, RNDK::HORIZONTAL,
414
428
  0, @label_len)
@@ -425,8 +439,8 @@ module RNDK
425
439
  if @info.size > 0
426
440
  pos = 0
427
441
  (0...[@field_width, @plate.size].min).each do |x|
428
- if RNDK::TEMPLATE.isPlateChar(@plate[x]) && pos < @info.size
429
- field_color = @overlay[x] & Ncurses::A_ATTRIBUTES
442
+ if RNDK::Template.isPlateChar(@plate[x]) && pos < @info.size
443
+ field_color = @overlay[x] & RNDK::Color[:extract]
430
444
  Ncurses.mvwaddch(@field_win, 0, x, @info[pos].ord | field_color)
431
445
  pos += 1
432
446
  end
@@ -441,7 +455,7 @@ module RNDK
441
455
  # Adjust the cursor for the template
442
456
  def adjustCursor(direction)
443
457
  while @plate_pos < [@field_width, @plate.size].min &&
444
- !RNDK::TEMPLATE.isPlateChar(@plate[@plate_pos])
458
+ !RNDK::Template.isPlateChar(@plate[@plate_pos])
445
459
  @plate_pos += direction
446
460
  @screen_pos += direction
447
461
  end
@@ -450,7 +464,7 @@ module RNDK
450
464
  end
451
465
 
452
466
  # Set the background attribute of the widget.
453
- def set_bg_attrib(attrib)
467
+ def set_bg_color(attrib)
454
468
  Ncurses.wbkgd(@win, attrib)
455
469
  Ncurses.wbkgd(@field_win, attrib)
456
470
  Ncurses.wbkgd(@label_win, attrib) unless @label_win.nil?
@@ -458,7 +472,7 @@ module RNDK
458
472
 
459
473
  # Destroy this widget.
460
474
  def destroy
461
- self.cleanTitle
475
+ self.clean_title
462
476
 
463
477
  # Delete the windows
464
478
  RNDK.window_delete(@field_win)
@@ -467,14 +481,14 @@ module RNDK
467
481
  RNDK.window_delete(@win)
468
482
 
469
483
  # Clean the key bindings.
470
- self.clean_bindings(:TEMPLATE)
484
+ self.clean_bindings
471
485
 
472
- RNDK::Screen.unregister(:TEMPLATE, self)
486
+ @screen.unregister self
473
487
  end
474
488
 
475
489
  # Erase the widget.
476
490
  def erase
477
- if self.valid_widget?
491
+ if self.valid?
478
492
  RNDK.window_erase(@field_win)
479
493
  RNDK.window_erase(@label_win)
480
494
  RNDK.window_erase(@shadow_win)
@@ -538,11 +552,11 @@ module RNDK
538
552
  end
539
553
 
540
554
  def focus
541
- self.draw(@box)
555
+ self.draw
542
556
  end
543
557
 
544
558
  def unfocus
545
- self.draw(@box)
559
+ self.draw
546
560
  end
547
561
 
548
562
  def self.isPlateChar(c)
@@ -553,8 +567,7 @@ module RNDK
553
567
  super(@win)
554
568
  end
555
569
 
556
- def object_type
557
- :TEMPLATE
558
- end
570
+
571
+
559
572
  end
560
573
  end
@@ -1,5 +1,5 @@
1
1
  module RNDK
2
- VERSION="0.2.0"
2
+ VERSION="1.0.0"
3
3
  VERSION_MAJOR = VERSION.split('.')[0]
4
4
  VERSION_MINOR = VERSION.split('.')[1]
5
5
  VERSION_PATCH = VERSION.split('.')[2]
@@ -1,41 +1,144 @@
1
1
  require 'rndk'
2
+ require 'rndk/label'
3
+ require 'rndk/entry'
2
4
 
3
5
  module RNDK
4
- class VIEWER < Widget
5
- DOWN = 0
6
- UP = 1
7
6
 
8
- def initialize(rndkscreen, xplace, yplace, height, width,
9
- buttons, button_count, button_highlight, box, shadow)
7
+ # Shows a list of lines with lots of fancy things.
8
+ # Generally used to view files, has Buttons, Label and Entry.
9
+ #
10
+ # ## Example
11
+ #
12
+ # ```
13
+ # viewer = RNDK::Viewer.new(screen, {
14
+ # :x => RNDK::CENTER,
15
+ # :y => RNDK::CENTER,
16
+ # :title => "</77>Awesome Viewer",
17
+ # :buttons => buttons,
18
+ # :shadow => true
19
+ # })
20
+ #
21
+ # # To set the lines of Viewer we must use Viewer#set.
22
+ # # No way to do it on the constructor :(
23
+ # viewer.set :items => lines
24
+ # ```
25
+ #
26
+ # ## Keybindings
27
+ #
28
+ # Left Arrow:: Shifts the viewport one column left.
29
+ # Right Arrow:: Shifts the viewport one column left
30
+ # Up Arrow:: Scrolls the viewport one line up.
31
+ # Down Arrow:: Scrolls the viewport one line down.
32
+ # Prev Page:: Scroll one page backward.
33
+ # Ctrl-B:: Scroll one page backward.
34
+ # B:: Scroll one page backward.
35
+ # b:: Scroll one page backward.
36
+ # Next Page:: Scroll one page forward.
37
+ # Ctrl-F:: Scroll one page forward.
38
+ # Space:: Scroll one page forward.
39
+ # F:: Scroll one page forward.
40
+ # f:: Scroll one page forward.
41
+ # Home:: Shift the whole list to the far left.
42
+ # |:: Shift the whole list to the far left.
43
+ # End:: Shift the whole list to the far right.
44
+ # $:: Shift the whole list to the far right.
45
+ # 1:: Moves to the first line in the viewer.
46
+ # <:: Moves to the first line in the viewer.
47
+ # g:: Moves to the first line in the viewer.
48
+ # >:: Moves to the last line in the viewer.
49
+ # G:: Moves to the last line in the viewer.
50
+ # L:: Moves half the distance to the end of the viewer.
51
+ # l:: Moves half the distance to the top of the viewer.
52
+ # ?:: Searches up for a pattern.
53
+ # /:: Searches down for a pattern.
54
+ # n:: Repeats last search.
55
+ # N:: Repeats last search, reversed direction.
56
+ # ::: Jumps to a given line.
57
+ # i:: Displays file statistics.
58
+ # s:: Displays file statistics.
59
+ # Tab:: Switches buttons.
60
+ # Return:: Exit the widget and return the index of the selected button. Set `exit_type` to `:NORMAL`.
61
+ # Escape:: Exit the widget and return -1. Set `exit_type` to `:ESCAPE_HIT`.
62
+ # Ctrl-L:: Refreshes the screen.
63
+ #
64
+ #
65
+ # TODO There's something wrong with this widget
66
+ # why wont it work with Traverse?
67
+ class Viewer < Widget
68
+
69
+ DOWN = 0
70
+ UP = 1
71
+
72
+ # Creates a new Viewer Widget.
73
+ #
74
+ # ## Settings
75
+ #
76
+ # * `x` is the x position - can be an integer or
77
+ # `RNDK::LEFT`, `RNDK::RIGHT`, `RNDK::CENTER`.
78
+ # * `y` is the y position - can be an integer or
79
+ # `RNDK::TOP`, `RNDK::BOTTOM`, `RNDK::CENTER`.
80
+ # * `width`/`height` are integers - if either are 0, Widget
81
+ # will be created with full width/height of the screen.
82
+ # If it's a negative value, will create with full width/height
83
+ # minus the value.
84
+ # * `title` can be more than one line - just split them
85
+ # with `\n`s.
86
+ # * `buttons` is an Array of Strings with all buttons.
87
+ #
88
+ # @todo complete documentation
89
+ #
90
+ # @note To set the data inside Viewer, you _must_ call
91
+ # Viewer#set! No stuffin' things on the constructor.
92
+ #
93
+ def initialize(screen, config={})
10
94
  super()
11
- parent_width = Ncurses.getmaxx(rndkscreen.window)
12
- parent_height = Ncurses.getmaxy(rndkscreen.window)
13
- box_width = width
95
+ @widget_type = :viewer
96
+ @supported_signals += [:before_input, :after_input]
97
+
98
+ # This is UGLY AS HELL
99
+ # But I don't have time to clean this up right now
100
+ # (lots of widgets, you know) :(
101
+ x = 0
102
+ y = 0
103
+ width = 0
104
+ height = 0
105
+ title = "viewer"
106
+ buttons = []
107
+ button_highlight = RNDK::Color[:reverse]
108
+ box = true
109
+ shadow = false
110
+
111
+ config.each do |key, val|
112
+ x = val if key == :x
113
+ y = val if key == :y
114
+ width = val if key == :width
115
+ height = val if key == :height
116
+ title = val if key == :title
117
+ buttons = val if key == :buttons
118
+ button_highlight = val if key == :button_highlight
119
+ box = val if key == :box
120
+ shadow = val if key == :shadow
121
+ end
122
+
123
+ parent_width = Ncurses.getmaxx screen.window
124
+ parent_height = Ncurses.getmaxy screen.window
125
+
126
+ box_width = width
14
127
  box_height = height
128
+
15
129
  button_width = 0
16
130
  button_adj = 0
17
131
  button_pos = 1
18
- bindings = {
19
- RNDK::BACKCHAR => Ncurses::KEY_PPAGE,
20
- 'b' => Ncurses::KEY_PPAGE,
21
- 'B' => Ncurses::KEY_PPAGE,
22
- RNDK::FORCHAR => Ncurses::KEY_NPAGE,
23
- ' ' => Ncurses::KEY_NPAGE,
24
- 'f' => Ncurses::KEY_NPAGE,
25
- 'F' => Ncurses::KEY_NPAGE,
26
- '|' => Ncurses::KEY_HOME,
27
- '$' => Ncurses::KEY_END,
28
- }
29
-
30
- self.set_box(box)
31
-
32
- box_height = RNDK.setWidgetDimension(parent_height, height, 0)
33
- box_width = RNDK.setWidgetDimension(parent_width, width, 0)
132
+
133
+ self.set_box box
134
+
135
+ box_width = RNDK.set_widget_dimension(parent_width, width, 0)
136
+ box_height = RNDK.set_widget_dimension(parent_height, height, 0)
34
137
 
35
138
  # Rejustify the x and y positions if we need to.
36
- xtmp = [xplace]
37
- ytmp = [yplace]
38
- RNDK.alignxy(rndkscreen.window, xtmp, ytmp, box_width, box_height)
139
+ xtmp = [x]
140
+ ytmp = [y]
141
+ RNDK.alignxy(screen.window, xtmp, ytmp, box_width, box_height)
39
142
  xpos = xtmp[0]
40
143
  ypos = ytmp[0]
41
144
 
@@ -50,28 +153,29 @@ module RNDK
50
153
  Ncurses.keypad(@win, true)
51
154
 
52
155
  # Create the buttons.
53
- @button_count = button_count
156
+ @button_count = buttons.size
54
157
  @button = []
55
158
  @button_len = []
56
159
  @button_pos = []
57
- if button_count > 0
58
- (0...button_count).each do |x|
160
+
161
+ if @button_count > 0
162
+ (0...@button_count).each do |x|
59
163
  button_len = []
60
164
  @button << RNDK.char2Chtype(buttons[x], button_len, [])
61
165
  @button_len << button_len[0]
62
166
  button_width += @button_len[x] + 1
63
167
  end
64
- button_adj = (box_width - button_width) / (button_count + 1)
168
+ button_adj = (box_width - button_width) / (@button_count + 1)
65
169
  button_pos = 1 + button_adj
66
- (0...button_count).each do |x|
170
+ (0...@button_count).each do |x|
67
171
  @button_pos << button_pos
68
172
  button_pos += button_adj + @button_len[x]
69
173
  end
70
174
  end
71
175
 
72
176
  # Set the rest of the variables.
73
- @screen = rndkscreen
74
- @parent = rndkscreen.window
177
+ @screen = screen
178
+ @parent = screen.window
75
179
  @shadow_win = nil
76
180
  @button_highlight = button_highlight
77
181
  @box_height = box_height
@@ -86,10 +190,14 @@ module RNDK
86
190
  @max_left_char = 0
87
191
  @max_top_line = 0
88
192
  @characters = 0
89
- @list_size = -1
90
- @show_line_info = 1
193
+ @items_size = -1
194
+ @show_line_items = 1
91
195
  @exit_type = :EARLY_EXIT
92
196
 
197
+ @search_pattern = []
198
+
199
+ self.set_title title
200
+
93
201
  # Do we need to create a shadow?
94
202
  if shadow
95
203
  @shadow_win = Ncurses.newwin(box_height,
@@ -103,26 +211,53 @@ module RNDK
103
211
  end
104
212
 
105
213
  # Setup the key bindings.
106
- bindings.each do |from, to|
107
- self.bind(:VIEWER, from, :getc, to)
108
- end
109
-
110
- rndkscreen.register(:VIEWER, self)
214
+ self.bind_key('b') { self.scroll_page_up }
215
+ self.bind_key('B') { self.scroll_page_up }
216
+ self.bind_key(' ') { self.scroll_page_down }
217
+ self.bind_key('f') { self.scroll_page_down }
218
+ self.bind_key('F') { self.scroll_page_down }
219
+ self.bind_key('|') { self.scroll_begin }
220
+ self.bind_key('$') { self.scroll_end }
221
+
222
+ screen.register(@widget_type, self)
111
223
  end
112
224
 
113
225
  # This function sets various attributes of the widget.
114
- def set(title, list, list_size, button_highlight,
115
- attr_interp, show_line_info, box)
116
- self.set_title(title)
117
- self.set_highlight(button_highlight)
118
- self.setInfoLine(show_line_info)
119
- self.set_box(box)
120
- return self.setInfo(list, list_size, attr_interp)
226
+ def set(config)
227
+ items = @items
228
+ hide_control_chars = @hide_control_chars
229
+ show_line_items = @show_line_items
230
+ title = @title
231
+ buttons = @buttons
232
+ button_highlight = @button_highlight
233
+ box = @box
234
+ shadow = @shadow
235
+
236
+ config.each do |key, val|
237
+ x = val if key == :x
238
+ y = val if key == :y
239
+ width = val if key == :width
240
+ height = val if key == :height
241
+ title = val if key == :title
242
+ items = val if key == :items
243
+ hide_control_chars = val if key == :hide_control_chars
244
+ show_line_items = val if key == :show_line_items
245
+ buttons = val if key == :buttons
246
+ button_highlight = val if key == :button_highlight
247
+ box = val if key == :box
248
+ shadow = val if key == :shadow
249
+ end
250
+
251
+ self.set_title(title) if title != @title
252
+ self.set_highlight(button_highlight) if button_highlight != @button_highlight
253
+ self.set_items_line(show_line_items) if show_line_items != @show_line_items
254
+ self.set_box(box) if box != @box
255
+ self.set_items(items, hide_control_chars) if items != @items
121
256
  end
122
257
 
123
258
  # This sets the title of the viewer. (A nil title is allowed.
124
259
  # It just means that the viewer will not have a title when drawn.)
125
- def set_title(title)
260
+ def set_title title
126
261
  super(title, -(@box_width + 1))
127
262
  @title_adj = @title_lines
128
263
 
@@ -130,66 +265,64 @@ module RNDK
130
265
  @view_size = @box_height - (@title_lines + 1) - 2
131
266
  end
132
267
 
133
- def getTitle
134
- return @title
268
+ def get_title
269
+ @title
135
270
  end
136
271
 
137
- def setupLine(interpret, list, x)
272
+ def setup_line(interpret, items, x)
138
273
  # Did they ask for attribute interpretation?
139
274
  if interpret
140
- list_len = []
141
- list_pos = []
142
- @list[x] = RNDK.char2Chtype(list, list_len, list_pos)
143
- @list_len[x] = list_len[0]
144
- @list_pos[x] = RNDK.justifyString(@box_width, @list_len[x], list_pos[0])
275
+ items_len = []
276
+ items_pos = []
277
+ @items[x] = RNDK.char2Chtype(items, items_len, items_pos)
278
+ @items_len[x] = items_len[0]
279
+ @items_pos[x] = RNDK.justifyString(@box_width, @items_len[x], items_pos[0])
145
280
  else
146
281
  # We must convert tabs and other nonprinting characters. The curses
147
282
  # library normally does this, but we are bypassing it by writing
148
283
  # chtypes directly.
149
284
  t = ''
150
285
  len = 0
151
- (0...list.size).each do |y|
152
- if list[y] == "\t".ord
286
+ (0...items.size).each do |y|
287
+ if items[y] == "\t".ord
153
288
  begin
154
289
  t << ' '
155
290
  len += 1
156
291
  end while (len & 7) != 0
157
- elsif RNDK.CharOf(list[y].ord).match(/^[[:print:]]$/)
158
- t << RNDK.CharOf(list[y].ord)
292
+ elsif RNDK.char_of(items[y].ord).match(/^[[:print:]]$/)
293
+ t << RNDK.char_of(items[y].ord)
159
294
  len += 1
160
295
  else
161
- t << Ncurses.unctrl(list[y].ord)
296
+ t << Ncurses.unctrl(items[y].ord)
162
297
  len += 1
163
298
  end
164
299
  end
165
- @list[x] = t
166
- @list_len[x] = t.size
167
- @list_pos[x] = 0
300
+ @items[x] = t
301
+ @items_len[x] = t.size
302
+ @items_pos[x] = 0
168
303
  end
169
- @widest_line = [@widest_line, @list_len[x]].max
304
+ @widest_line = [@widest_line, @items_len[x]].max
170
305
  end
171
306
 
172
- def freeLine(x)
173
- if x < @list_size
174
- @list[x] = ''
175
- end
307
+ def free_line(x)
308
+ @items[x] = '' if x < @items_size
176
309
  end
177
310
 
178
311
  # This function sets the contents of the viewer.
179
- def setInfo(list, list_size, interpret)
312
+ def set_items(items, interpret)
180
313
  current_line = 0
181
- viewer_size = list_size
314
+ viewer_size = items.size
182
315
 
183
- if list_size < 0
184
- list_size = list.size
316
+ if items.size < 0
317
+ items.size = items.size
185
318
  end
186
319
 
187
320
  # Compute the size of the resulting display
188
- viewer_size = list_size
189
- if list.size > 0 && interpret
190
- (0...list_size).each do |x|
321
+ viewer_size = items.size
322
+ if items.size > 0 && interpret
323
+ (0...items.size).each do |x|
191
324
  filename = ''
192
- if RNDK.checkForLink(list[x], filename) == 1
325
+ if RNDK.checkForLink(items[x], filename) == 1
193
326
  file_contents = []
194
327
  file_len = RNDK.read_file(filename, file_contents)
195
328
 
@@ -200,27 +333,27 @@ module RNDK
200
333
  end
201
334
  end
202
335
 
203
- # Clean out the old viewer info. (if there is any)
336
+ # Clean out the old viewer items. (if there is any)
204
337
  @in_progress = true
205
338
  self.clean
206
- self.createList(viewer_size)
339
+ self.create_items(viewer_size)
207
340
 
208
- # Keep some semi-permanent info
341
+ # Keep some semi-permanent items
209
342
  @interpret = interpret
210
343
 
211
- # Copy the information given.
344
+ # Copy the itemsrmation given.
212
345
  current_line = 0
213
346
  x = 0
214
- while x < list_size && current_line < viewer_size
215
- if list[x].size == 0
216
- @list[current_line] = ''
217
- @list_len[current_line] = 0
218
- @list_pos[current_line] = 0
347
+ while x < items.size && current_line < viewer_size
348
+ if items[x].size == 0
349
+ @items[current_line] = ''
350
+ @items_len[current_line] = 0
351
+ @items_pos[current_line] = 0
219
352
  current_line += 1
220
353
  else
221
354
  # Check if we have a file link in this line.
222
355
  filename = []
223
- if RNDK.checkForLink(list[x], filename) == 1
356
+ if RNDK.checkForLink(items[x], filename) == 1
224
357
  # We have a link, open the file.
225
358
  file_contents = []
226
359
  file_len = 0
@@ -233,7 +366,7 @@ module RNDK
233
366
  else '<C></K>Link Failed: Could not open the file %s'
234
367
  end
235
368
  temp = fopen_fmt % filename
236
- self.setupLine(true, temp, current_line)
369
+ self.setup_line(true, temp, current_line)
237
370
  current_line += 1
238
371
  else
239
372
  # For each line read, copy it into the viewer.
@@ -242,14 +375,14 @@ module RNDK
242
375
  if current_line >= viewer_size
243
376
  break
244
377
  end
245
- self.setupLine(false, file_contents[file_line], current_line)
246
- @characters += @list_len[current_line]
378
+ self.setup_line(false, file_contents[file_line], current_line)
379
+ @characters += @items_len[current_line]
247
380
  current_line += 1
248
381
  end
249
382
  end
250
383
  elsif current_line < viewer_size
251
- self.setupLine(@interpret, list[x], current_line)
252
- @characters += @list_len[current_line]
384
+ self.setup_line(@interpret, items[x], current_line)
385
+ @characters += @items_len[current_line]
253
386
  current_line += 1
254
387
  end
255
388
  end
@@ -264,20 +397,20 @@ module RNDK
264
397
  @max_left_char = 0
265
398
  end
266
399
 
267
- # Set up the needed vars for the viewer list.
400
+ # Set up the needed vars for the viewer items.
268
401
  @in_progress = false
269
- @list_size = viewer_size
270
- if @list_size <= @view_size
402
+ @items_size = viewer_size
403
+ if @items_size <= @view_size
271
404
  @max_top_line = 0
272
405
  else
273
- @max_top_line = @list_size - 1
406
+ @max_top_line = @items_size - 1
274
407
  end
275
- return @list_size
408
+ return @items_size
276
409
  end
277
410
 
278
- def getInfo(size)
279
- size << @list_size
280
- return @list
411
+ def get_items(size)
412
+ size << @items_size
413
+ @items
281
414
  end
282
415
 
283
416
  # This function sets the highlight type of the buttons.
@@ -285,72 +418,101 @@ module RNDK
285
418
  @button_highlight = button_highlight
286
419
  end
287
420
 
288
- def getHighlight
289
- return @button_highlight
421
+ def get_highlight
422
+ @button_highlight
290
423
  end
291
424
 
292
- # This sets whether or not you wnat to set the viewer info line.
293
- def setInfoLine(show_line_info)
294
- @show_line_info = show_line_info
425
+ # This sets whether or not you wnat to set the viewer
426
+ # items line.
427
+ def set_items_line(show_line_items)
428
+ @show_line_items = show_line_items
295
429
  end
296
430
 
297
- def getInfoLine
298
- return @show_line_info
431
+ def get_items_line
432
+ @show_line_items
299
433
  end
300
434
 
301
435
  # This removes all the lines inside the scrolling window.
302
436
  def clean
303
437
  # Clean up the memory used...
304
- (0...@list_size).each do |x|
305
- self.freeLine(x)
438
+ (0...@items_size).each do |x|
439
+ self.free_line(x)
306
440
  end
307
441
 
308
442
  # Reset some variables.
309
- @list_size = 0
443
+ @items_size = 0
310
444
  @max_left_char = 0
311
445
  @widest_line = 0
312
446
  @current_top = 0
313
447
  @max_top_line = 0
314
448
 
315
449
  # Redraw the window.
316
- self.draw @box
450
+ self.draw
317
451
  end
318
452
 
319
453
  def PatternNotFound(pattern)
320
- temp_info = [
454
+ temp_items = [
321
455
  "</U/5>Pattern '%s' not found.<!U!5>" % pattern,
322
456
  ]
323
- self.popUpLabel(temp_info)
457
+ @screen.popup_label temp_items
324
458
  end
325
459
 
326
460
  # This function actually controls the viewer...
327
- def activate(actions)
461
+ def activate(actions=[])
462
+ self.draw
463
+
464
+ if actions.nil? || actions.size == 0
465
+ loop do
466
+ input = self.getch
467
+
468
+ # Inject the character into the widget.
469
+ ret = self.inject input
470
+
471
+ return ret if @exit_type != :EARLY_EXIT
472
+ end
473
+ else
474
+ # Inject each character one at a time.
475
+ actions.each do |action|
476
+ ret = self.inject action
477
+
478
+ return ret if @exit_type != :EARLY_EXIT
479
+ end
480
+ end
481
+
482
+ # Set the exit type for the widget and return
483
+ self.set_exit_type(0)
484
+ return nil
485
+ end
486
+
487
+ def inject input
488
+
328
489
  refresh = false
329
- # Create the information about the file stats.
330
- file_info = [
490
+ # Create the itemsrmation about the file stats.
491
+ file_items = [
331
492
  '</5> </U>File Statistics<!U> <!5>',
332
493
  '</5> <!5>',
333
494
  '</5/R>Character Count:<!R> %-4d <!5>' % @characters,
334
- '</5/R>Line Count :<!R> %-4d <!5>' % @list_size,
495
+ '</5/R>Line Count :<!R> %-4d <!5>' % @items_size,
335
496
  '</5> <!5>',
336
497
  '<C></5>Press Any Key To Continue.<!5>'
337
498
  ]
338
499
 
339
- temp_info = ['<C></5>Press Any Key To Continue.<!5>']
500
+ temp_items = ['<C></5>Press Any Key To Continue.<!5>']
340
501
 
341
- # Set the current button.
342
- @current_button = 0
502
+ # Calls a pre-process block if exists.
503
+ # They can interrup input.
504
+ continue = run_signal_binding(:before_input, input)
343
505
 
344
- # Draw the widget list.
345
- self.draw(@box)
506
+ if continue
346
507
 
347
- # Do this until KEY_ENTER is hit.
348
- while true
349
508
  # Reset the refresh flag.
350
509
  refresh = false
351
510
 
352
- input = self.getch([])
353
- if !self.checkBind(:VIEWER, input)
511
+ if self.is_bound? input
512
+ self.run_key_binding input
513
+ #complete = true
514
+
515
+ else
354
516
  case input
355
517
  when RNDK::KEY_TAB
356
518
  if @button_count > 1
@@ -361,7 +523,7 @@ module RNDK
361
523
  end
362
524
 
363
525
  # Redraw the buttons.
364
- self.drawButtons
526
+ self.draw_buttons
365
527
  end
366
528
  when RNDK::PREV
367
529
  if @button_count > 1
@@ -372,78 +534,36 @@ module RNDK
372
534
  end
373
535
 
374
536
  # Redraw the buttons.
375
- self.drawButtons
376
- end
377
- when Ncurses::KEY_UP
378
- if @current_top > 0
379
- @current_top -= 1
380
- refresh = true
381
- else
382
- RNDK.beep
383
- end
384
- when Ncurses::KEY_DOWN
385
- if @current_top < @max_top_line
386
- @current_top += 1
387
- refresh = true
388
- else
389
- RNDK.beep
390
- end
391
- when Ncurses::KEY_RIGHT
392
- if @left_char < @max_left_char
393
- @left_char += 1
394
- refresh = true
395
- else
396
- RNDK.beep
397
- end
398
- when Ncurses::KEY_LEFT
399
- if @left_char > 0
400
- @left_char -= 1
401
- refresh = true
402
- else
403
- RNDK.beep
404
- end
405
- when Ncurses::KEY_PPAGE
406
- if @current_top > 0
407
- if @current_top - (@view_size - 1) > 0
408
- @current_top = @current_top - (@view_size - 1)
409
- else
410
- @current_top = 0
411
- end
412
- refresh = true
413
- else
414
- RNDK.beep
415
- end
416
- when Ncurses::KEY_NPAGE
417
- if @current_top < @max_top_line
418
- if @current_top + @view_size < @max_top_line
419
- @current_top = @current_top + (@view_size - 1)
420
- else
421
- @current_top = @max_top_line
422
- end
423
- refresh = true
424
- else
425
- RNDK.beep
537
+ self.draw_buttons
426
538
  end
427
- when Ncurses::KEY_HOME
428
- @left_char = 0
429
- refresh = true
430
- when Ncurses::KEY_END
431
- @left_char = @max_left_char
432
- refresh = true
539
+ when Ncurses::KEY_UP then self.scroll_up
540
+ when Ncurses::KEY_DOWN then self.scroll_down
541
+ when Ncurses::KEY_RIGHT then self.scroll_right
542
+ when Ncurses::KEY_LEFT then self.scroll_left
543
+ when Ncurses::KEY_HOME then self.scroll_begin
544
+ when Ncurses::KEY_END then self.scroll_end
545
+ when Ncurses::KEY_PPAGE, RNDK::BACKCHAR
546
+ self.scroll_page_up
547
+ when Ncurses::KEY_NPAGE, RNDK::FORCHAR
548
+ self.scroll_page_down
549
+
433
550
  when 'g'.ord, '1'.ord, '<'.ord
434
551
  @current_top = 0
435
552
  refresh = true
553
+
436
554
  when 'G'.ord, '>'.ord
437
555
  @current_top = @max_top_line
438
556
  refresh = true
557
+
439
558
  when 'L'.ord
440
- x = (@list_size + @current_top) / 2
559
+ x = (@items_size + @current_top) / 2
441
560
  if x < @max_top_line
442
561
  @current_top = x
443
562
  refresh = true
444
563
  else
445
564
  RNDK.beep
446
565
  end
566
+
447
567
  when 'l'.ord
448
568
  x = @current_top / 2
449
569
  if x >= 0
@@ -452,25 +572,29 @@ module RNDK
452
572
  else
453
573
  RNDK.beep
454
574
  end
575
+
455
576
  when '?'.ord
456
- @search_direction = RNDK::VIEWER::UP
457
- self.getAndStorePattern(@screen)
458
- if !self.searchForWord(@search_pattern, @search_direction)
577
+ @search_direction = Viewer::UP
578
+ self.get_and_store_pattern(@screen)
579
+ if !self.search_for_word(@search_pattern, @search_direction)
459
580
  self.PatternNotFound(@search_pattern)
460
581
  end
461
582
  refresh = true
583
+
462
584
  when '/'.ord
463
- @search_direction = RNDK::VIEWER:DOWN
464
- self.getAndStorePattern(@screen)
465
- if !self.searchForWord(@search_pattern, @search_direction)
585
+ @search_direction = Viewer::DOWN
586
+ self.get_and_store_pattern(@screen)
587
+ if !self.search_for_word(@search_pattern, @search_direction)
466
588
  self.PatternNotFound(@search_pattern)
467
589
  end
468
590
  refresh = true
591
+
469
592
  when 'N'.ord, 'n'.ord
470
593
  if @search_pattern == ''
471
- temp_info[0] = '</5>There is no pattern in the buffer.<!5>'
472
- self.popUpLabel(temp_info)
473
- elsif !self.searchForWord(@search_pattern,
594
+ temp_items[0] = '</5>There is no pattern in the buffer.<!5>'
595
+ @screen.popup_label temp_items
596
+
597
+ elsif !self.search_for_word(@search_pattern,
474
598
  if input == 'n'.ord
475
599
  then @search_direction
476
600
  else 1 - @search_direction
@@ -478,11 +602,12 @@ module RNDK
478
602
  self.PatternNotFound(@search_pattern)
479
603
  end
480
604
  refresh = true
605
+
481
606
  when ':'.ord
482
- @current_top = self.jumpToLine
607
+ @current_top = self.jump_to_line
483
608
  refresh = true
484
609
  when 'i'.ord, 's'.ord, 'S'.ord
485
- self.popUpLabel(file_info)
610
+ @screen.popup_label file_items
486
611
  refresh = true
487
612
  when RNDK::KEY_ESC
488
613
  self.set_exit_type(input)
@@ -494,36 +619,41 @@ module RNDK
494
619
  self.set_exit_type(input)
495
620
  return @current_button
496
621
  when RNDK::REFRESH
497
- @screen.erase
498
- @screen.refresh
622
+ self.draw
499
623
  else
500
624
  RNDK.beep
501
625
  end
626
+
627
+ run_signal_binding(:after_input, input)
502
628
  end
503
629
 
504
630
  # Do we need to redraw the screen?
505
- if refresh
506
- self.drawInfo
507
- end
631
+ self.draw_items if refresh
508
632
  end
633
+ self.draw
509
634
  end
510
635
 
511
636
  # This searches the document looking for the given word.
512
- def getAndStorePattern(screen)
637
+ def get_and_store_pattern(screen)
513
638
  temp = ''
514
639
 
515
640
  # Check the direction.
516
- if @search_direction == RNDK::VIEWER::UP
641
+ if @search_direction == Viewer::UP
517
642
  temp = '</5>Search Up : <!5>'
518
643
  else
519
644
  temp = '</5>Search Down: <!5>'
520
645
  end
521
646
 
522
647
  # Pop up the entry field.
523
- get_pattern = RNDK::Entry.new(screen, RNDK::CENTER, RNDK::CENTER,
524
- '', label, Ncurses.COLOR_PAIR(5) | Ncurses::A_BOLD,
525
- '.' | Ncurses.COLOR_PAIR(5) | Ncurses::A_BOLD,
526
- :MIXED, 10, 0, 256, true, false)
648
+ get_pattern = RNDK::Entry.new(screen, {
649
+ :x => RNDK::CENTER,
650
+ :y => RNDK::CENTER,
651
+ :title => '',
652
+ :label => temp,
653
+ :field_color => RNDK::Color[:white_blue] | RNDK::Color[:bold],
654
+ :filler => '.'.ord | RNDK::Color[:white_blue] | RNDK::Color[:bold],
655
+ :field_width => 10
656
+ })
527
657
 
528
658
  # Is there an old search pattern?
529
659
  if @search_pattern.size != 0
@@ -532,11 +662,11 @@ module RNDK
532
662
  end
533
663
 
534
664
  # Activate this baby.
535
- list = get_pattern.activate([])
665
+ items = get_pattern.activate([])
536
666
 
537
- # Save teh list.
538
- if list.size != 0
539
- @search_pattern = list
667
+ # Save teh items.
668
+ if items.size != 0
669
+ @search_pattern = items
540
670
  end
541
671
 
542
672
  # Clean up.
@@ -545,22 +675,22 @@ module RNDK
545
675
 
546
676
  # This searches for a line containing the word and realigns the value on
547
677
  # the screen.
548
- def searchForWord(pattern, direction)
678
+ def search_for_word(pattern, direction)
549
679
  found = false
550
680
 
551
681
  # If the pattern is empty then return.
552
682
  if pattern.size != 0
553
- if direction == RNDK::VIEWER::DOWN
683
+ if direction == Viewer::DOWN
554
684
  # Start looking from 'here' down.
555
685
  x = @current_top + 1
556
- while !found && x < @list_size
686
+ while !found && x < @items_size
557
687
  pos = 0
558
688
  y = 0
559
- while y < @list[x].size
560
- plain_char = RNDK.CharOf(@list[x][y])
689
+ while y < @items[x].size
690
+ plain_char = RNDK.char_of(@items[x][y])
561
691
 
562
692
  pos += 1
563
- if @RNDK.CharOf(pattern[pos-1]) != plain_char
693
+ if RNDK.char_of(pattern[pos-1]) != plain_char
564
694
  y -= (pos - 1)
565
695
  pos = 0
566
696
  elsif pos == pattern.size
@@ -579,11 +709,11 @@ module RNDK
579
709
  while ! found && x >= 0
580
710
  y = 0
581
711
  pos = 0
582
- while y < @list[x].size
583
- plain_char = RNDK.CharOf(@list[x][y])
712
+ while y < @items[x].size
713
+ plain_char = RNDK.char_of(@items[x][y])
584
714
 
585
715
  pos += 1
586
- if RNDK.CharOf(pattern[pos-1]) != plain_char
716
+ if RNDK.char_of(pattern[pos-1]) != plain_char
587
717
  y -= (pos - 1)
588
718
  pos = 0
589
719
  elsif pos == pattern.size
@@ -596,62 +726,55 @@ module RNDK
596
726
  end
597
727
  end
598
728
  end
599
- return found
729
+ found
600
730
  end
601
731
 
602
732
  # This allows us to 'jump' to a given line in the file.
603
- def jumpToLine
604
- newline = RNDK::SCALE.new(@screen, RNDK::CENTER, RNDK::CENTER,
605
- '<C>Jump To Line', '</5>Line :', Ncurses::A_BOLD,
606
- @list_size.size + 1, @current_top + 1, 0, @max_top_line + 1,
607
- 1, 10, true, true)
608
- line = newline.activate([])
733
+ def jump_to_line
734
+ newline = RNDK::Scale.new(@screen, {
735
+ :x => RNDK::CENTER,
736
+ :y => RNDK::CENTER,
737
+ :title => '<C>Jump To Line',
738
+ :label => '</5>Line :',
739
+ :field_color => RNDK::Color[:bold],
740
+ :field_width => @items_size.size + 1,
741
+ :start => @current_top + 1,
742
+ :high => @max_top_line + 1,
743
+ :fast_increment => 10,
744
+ :shador => true
745
+ })
746
+
747
+ line = newline.activate
609
748
  newline.destroy
610
- return line - 1
611
- end
612
-
613
- # This pops a little message up on the screen.
614
- def popUpLabel(mesg)
615
- # Set up variables.
616
- label = RNDK::Label.new(@screen, RNDK::CENTER, RNDK::CENTER,
617
- mesg, mesg.size, true, false)
618
-
619
- # Draw the label and wait.
620
- label.draw(true)
621
- label.getch([])
622
-
623
- # Clean up.
624
- label.destroy
749
+ line - 1
625
750
  end
626
751
 
627
752
  # This moves the viewer field to the given location.
628
753
  # Inherited
629
- # def move(xplace, yplace, relative, refresh_flag)
754
+ # def move(x, y, relative, refresh_flag)
630
755
  # end
631
756
 
632
757
  # This function draws the viewer widget.
633
- def draw(box)
758
+ def draw
634
759
  # Do we need to draw in the shadow?
635
760
  unless @shadow_win.nil?
636
761
  Draw.drawShadow @shadow_win
637
762
  end
638
763
 
639
764
  # Box it if it was asked for.
640
- if box
765
+ if @box
641
766
  Draw.drawObjBox(@win, self)
642
767
  Ncurses.wrefresh @win
643
768
  end
644
769
 
645
- # Draw the info in the viewer.
646
- self.drawInfo
770
+ # Draw the items in the viewer.
771
+ self.draw_items
647
772
  end
648
773
 
649
774
  # This redraws the viewer buttons.
650
- def drawButtons
775
+ def draw_buttons
651
776
  # No buttons, no drawing
652
- if @button_count == 0
653
- return
654
- end
777
+ return if @button_count == 0
655
778
 
656
779
  # Redraw the buttons.
657
780
  (0...@button_count).each do |x|
@@ -667,7 +790,7 @@ module RNDK
667
790
  # Highlight the current button.
668
791
  (0...@button_len[@current_button]).each do |x|
669
792
  # Strip the character of any extra attributes.
670
- character = RNDK.CharOf(@button[@current_button][x])
793
+ character = RNDK.char_of @button[@current_button][x]
671
794
 
672
795
  # Add the character into the window.
673
796
  Ncurses.mvwaddch(@win,
@@ -681,73 +804,72 @@ module RNDK
681
804
  end
682
805
 
683
806
  # This sets the background attribute of the widget.
684
- def set_bg_attrib(attrib)
807
+ def set_bg_color(attrib)
685
808
  Ncurses.wbkgd(@win, attrib)
686
809
  end
687
810
 
688
- def destroyInfo
689
- @list = []
690
- @list_pos = []
691
- @list_len = []
811
+ def destroy_items
812
+ @items = []
813
+ @items_pos = []
814
+ @items_len = []
692
815
  end
693
816
 
694
817
  # This function destroys the viewer widget.
695
818
  def destroy
696
- self.destroyInfo
697
-
698
- self.cleanTitle
819
+ self.destroy_items
820
+ self.clean_title
699
821
 
700
822
  # Clean up the windows.
701
- RNDK.window_delete(@shadow_win)
702
- RNDK.window_delete(@win)
823
+ RNDK.window_delete @shadow_win
824
+ RNDK.window_delete @win
703
825
 
704
826
  # Clean the key bindings.
705
- self.clean_bindings(:VIEWER)
827
+ self.clean_bindings
706
828
 
707
- # Unregister this object.
708
- RNDK::Screen.unregister(:VIEWER, self)
829
+ # Unregister this widget.
830
+ @screen.unregister self
709
831
  end
710
832
 
711
833
  # This function erases the viewer widget from the screen.
712
834
  def erase
713
- if self.valid_widget?
835
+ if self.valid?
714
836
  RNDK.window_erase(@win)
715
837
  RNDK.window_erase(@shadow_win)
716
838
  end
717
839
  end
718
840
 
719
- # This draws the viewer info lines.
720
- def drawInfo
841
+ # This draws the viewer items lines.
842
+ def draw_items
721
843
  temp = ''
722
844
  line_adjust = false
723
845
 
724
846
  # Clear the window.
725
847
  Ncurses.werase(@win)
726
848
 
727
- self.drawTitle(@win)
849
+ self.draw_title @win
728
850
 
729
851
  # Draw in the current line at the top.
730
- if @show_line_info == true
731
- # Set up the info line and draw it.
852
+ if @show_line_items == true
853
+ # Set up the items line and draw it.
732
854
  if @in_progress
733
855
  temp = 'processing...'
734
- elsif @list_size != 0
735
- temp = '%d/%d %2.0f%%' % [@current_top + 1, @list_size,
736
- ((1.0 * @current_top + 1) / (@list_size)) * 100]
856
+ elsif @items_size != 0
857
+ temp = '%d/%d %2.0f%%' % [@current_top + 1, @items_size,
858
+ ((1.0 * @current_top + 1) / (@items_size)) * 100]
737
859
  else
738
860
  temp = '%d/%d %2.0f%%' % [0, 0, 0.0]
739
861
  end
740
862
 
741
- # The list_adjust variable tells us if we have to shift down one line
863
+ # The items_adjust variable tells us if we have to shift down one line
742
864
  # because the person asked for the line X of Y line at the top of the
743
- # screen. We only want to set this to true if they asked for the info
865
+ # screen. We only want to set this to true if they asked for the items
744
866
  # line and there is no title or if the two items overlap.
745
867
  if @title_lines == '' || @title_pos[0] < temp.size + 2
746
- list_adjust = true
868
+ items_adjust = true
747
869
  end
748
870
  Draw.writeChar(@win,
749
871
  1,
750
- if list_adjust then @title_lines else 0 end + 1,
872
+ if items_adjust then @title_lines else 0 end + 1,
751
873
  temp,
752
874
  RNDK::HORIZONTAL,
753
875
  0,
@@ -755,24 +877,24 @@ module RNDK
755
877
  end
756
878
 
757
879
  # Determine the last line to draw.
758
- last_line = [@list_size, @view_size].min
759
- last_line -= if list_adjust then 1 else 0 end
880
+ last_line = [@items_size, @view_size].min
881
+ last_line -= if items_adjust then 1 else 0 end
760
882
 
761
- # Redraw the list.
883
+ # Redraw the items.
762
884
  (0...last_line).each do |x|
763
- if @current_top + x < @list_size
764
- screen_pos = @list_pos[@current_top + x] + 1 - @left_char
885
+ if @current_top + x < @items_size
886
+ screen_pos = @items_pos[@current_top + x] + 1 - @left_char
765
887
 
766
888
  Draw.writeChtype(@win,
767
889
  if screen_pos >= 0 then screen_pos else 1 end,
768
- x + @title_lines + if list_adjust then 1 else 0 end + 1,
769
- @list[x + @current_top],
890
+ x + @title_lines + if items_adjust then 1 else 0 end + 1,
891
+ @items[x + @current_top],
770
892
  RNDK::HORIZONTAL,
771
893
  if screen_pos >= 0
772
894
  then 0
773
- else @left_char - @list_pos[@current_top + x]
895
+ else @left_char - @items_pos[@current_top + x]
774
896
  end,
775
- @list_len[x + @current_top])
897
+ @items_len[x + @current_top])
776
898
  end
777
899
  end
778
900
 
@@ -795,21 +917,21 @@ module RNDK
795
917
  end
796
918
 
797
919
  # Draw the buttons. This will call refresh on the viewer win.
798
- self.drawButtons
920
+ self.draw_buttons
799
921
  end
800
922
 
801
- # The list_size may be negative, to assign no definite limit.
802
- def createList(list_size)
923
+ # The items_size may be negative, to assign no definite limit.
924
+ def create_items(items_size)
803
925
  status = false
804
926
 
805
- self.destroyInfo
927
+ self.destroy_items
806
928
 
807
- if list_size >= 0
929
+ if items_size >= 0
808
930
  status = true
809
931
 
810
- @list = []
811
- @list_pos = []
812
- @list_len = []
932
+ @items = []
933
+ @items_pos = []
934
+ @items_len = []
813
935
  end
814
936
  return status
815
937
  end
@@ -818,8 +940,87 @@ module RNDK
818
940
  super(@win)
819
941
  end
820
942
 
821
- def object_type
822
- :VIEWER
943
+ def scroll_up
944
+ if @current_top > 0
945
+ @current_top -= 1
946
+ refresh = true
947
+ else
948
+ RNDK.beep
949
+ end
950
+ end
951
+
952
+ def scroll_down
953
+ if @current_top < @max_top_line
954
+ @current_top += 1
955
+ refresh = true
956
+ else
957
+ RNDK.beep
958
+ end
959
+ end
960
+
961
+ def scroll_right
962
+ if @left_char < @max_left_char
963
+ @left_char += 1
964
+ refresh = true
965
+ else
966
+ RNDK.beep
967
+ end
968
+ end
969
+
970
+ def scroll_left
971
+ if @left_char > 0
972
+ @left_char -= 1
973
+ refresh = true
974
+ else
975
+ RNDK.beep
976
+ end
977
+ end
978
+
979
+ def scroll_page_up
980
+ if @current_top > 0
981
+ if @current_top - (@view_size - 1) > 0
982
+ @current_top = @current_top - (@view_size - 1)
983
+ else
984
+ @current_top = 0
985
+ end
986
+ refresh = true
987
+ else
988
+ RNDK.beep
989
+ end
990
+
991
+ end
992
+
993
+ def scroll_page_down
994
+ if @current_top < @max_top_line
995
+ if @current_top + @view_size < @max_top_line
996
+ @current_top = @current_top + (@view_size - 1)
997
+ else
998
+ @current_top = @max_top_line
999
+ end
1000
+ refresh = true
1001
+ else
1002
+ RNDK.beep
1003
+ end
823
1004
  end
1005
+
1006
+ def scroll_begin
1007
+ @left_char = 0
1008
+ refresh = true
1009
+ end
1010
+
1011
+ def scroll_end
1012
+ @left_char = @max_left_char
1013
+ refresh = true
1014
+ end
1015
+
1016
+ def focus
1017
+ self.draw
1018
+ end
1019
+
1020
+ def unfocus
1021
+ self.draw
1022
+ end
1023
+
824
1024
  end
825
1025
  end
1026
+