rndk 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
+