rndk 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/COPYING +137 -0
  4. data/Gemfile +4 -0
  5. data/README.md +100 -0
  6. data/Rakefile +3 -0
  7. data/TODO +68 -0
  8. data/demos/appointment.rb +346 -0
  9. data/demos/clock.rb +56 -0
  10. data/examples/01-hello-world.rb +56 -0
  11. data/examples/05-position-widget.rb +108 -0
  12. data/lib/rndk.rb +912 -0
  13. data/lib/rndk/alphalist.rb +572 -0
  14. data/lib/rndk/button.rb +370 -0
  15. data/lib/rndk/buttonbox.rb +359 -0
  16. data/lib/rndk/calendar.rb +766 -0
  17. data/lib/rndk/core/display.rb +63 -0
  18. data/lib/rndk/core/draw.rb +238 -0
  19. data/lib/rndk/core/quick_widgets.rb +106 -0
  20. data/lib/rndk/core/screen.rb +269 -0
  21. data/lib/rndk/core/traverse.rb +289 -0
  22. data/lib/rndk/core/widget.rb +506 -0
  23. data/lib/rndk/dialog.rb +367 -0
  24. data/lib/rndk/dscale.rb +13 -0
  25. data/lib/rndk/entry.rb +575 -0
  26. data/lib/rndk/fscale.rb +61 -0
  27. data/lib/rndk/fselect.rb +940 -0
  28. data/lib/rndk/fslider.rb +80 -0
  29. data/lib/rndk/graph.rb +401 -0
  30. data/lib/rndk/histogram.rb +412 -0
  31. data/lib/rndk/itemlist.rb +474 -0
  32. data/lib/rndk/label.rb +218 -0
  33. data/lib/rndk/marquee.rb +244 -0
  34. data/lib/rndk/matrix.rb +1189 -0
  35. data/lib/rndk/mentry.rb +619 -0
  36. data/lib/rndk/menu.rb +478 -0
  37. data/lib/rndk/radio.rb +538 -0
  38. data/lib/rndk/scale.rb +538 -0
  39. data/lib/rndk/scroll.rb +633 -0
  40. data/lib/rndk/scroller.rb +183 -0
  41. data/lib/rndk/selection.rb +630 -0
  42. data/lib/rndk/slider.rb +545 -0
  43. data/lib/rndk/swindow.rb +766 -0
  44. data/lib/rndk/template.rb +560 -0
  45. data/lib/rndk/uscale.rb +14 -0
  46. data/lib/rndk/uslider.rb +14 -0
  47. data/lib/rndk/version.rb +6 -0
  48. data/lib/rndk/viewer.rb +825 -0
  49. data/rndk.gemspec +35 -0
  50. metadata +141 -0
@@ -0,0 +1,766 @@
1
+ require 'rndk'
2
+
3
+ module RNDK
4
+ # TODO This Widget's very buggy! Somehow improve it later!
5
+ class SWINDOW < RNDK::Widget
6
+ def initialize(rndkscreen, xplace, yplace, height, width, title,
7
+ save_lines, box, shadow)
8
+ super()
9
+ parent_width = Ncurses.getmaxx(rndkscreen.window)
10
+ parent_height = Ncurses.getmaxy(rndkscreen.window)
11
+ box_width = width
12
+ box_height = height
13
+ bindings = {
14
+ RNDK::BACKCHAR => Ncurses::KEY_PPAGE,
15
+ 'b' => Ncurses::KEY_PPAGE,
16
+ 'B' => Ncurses::KEY_PPAGE,
17
+ RNDK::FORCHAR => Ncurses::KEY_NPAGE,
18
+ ' ' => Ncurses::KEY_NPAGE,
19
+ 'f' => Ncurses::KEY_NPAGE,
20
+ 'F' => Ncurses::KEY_NPAGE,
21
+ '|' => Ncurses::KEY_HOME,
22
+ '$' => Ncurses::KEY_END,
23
+ }
24
+
25
+ self.setBox(box)
26
+
27
+ # If the height is a negative value, the height will be
28
+ # ROWS-height, otherwise the height will be the given height.
29
+ box_height = RNDK.setWidgetDimension(parent_height, height, 0)
30
+
31
+ # If the width is a negative value, the width will be
32
+ # COLS-width, otherwise the widget will be the given width.
33
+ box_width = RNDK.setWidgetDimension(parent_width, width, 0)
34
+ box_width = self.setTitle(title, box_width)
35
+
36
+ # Set the box height.
37
+ box_height += @title_lines + 1
38
+
39
+ # Make sure we didn't extend beyond the dimensions of the window.
40
+ box_width = [box_width, parent_width].min
41
+ box_height = [box_height, parent_height].min
42
+
43
+ # Set the rest of the variables.
44
+ @title_adj = @title_lines + 1
45
+
46
+ # Rejustify the x and y positions if we need to.
47
+ xtmp = [xplace]
48
+ ytmp = [yplace]
49
+ RNDK.alignxy(rndkscreen.window, xtmp, ytmp, box_width, box_height)
50
+ xpos = xtmp[0]
51
+ ypos = ytmp[0]
52
+
53
+ # Make the scrolling window.
54
+ @win = Ncurses.newwin(box_height, box_width, ypos, xpos)
55
+ if @win.nil?
56
+ self.destroy
57
+ return nil
58
+ end
59
+ Ncurses.keypad(@win, true)
60
+
61
+ # Make the field window
62
+ @field_win = Ncurses.subwin(@win,
63
+ box_height - @title_lines - 2,
64
+ box_width - 2,
65
+ ypos + @title_lines + 1,
66
+ xpos + 1)
67
+ Ncurses.keypad(@field_win, true)
68
+
69
+ # Set the rest of the variables
70
+ @screen = rndkscreen
71
+ @parent = rndkscreen.window
72
+ @shadow_win = nil
73
+ @box_height = box_height
74
+ @box_width = box_width
75
+ @view_size = box_height - @title_lines - 2
76
+ @current_top = 0
77
+ @max_top_line = 0
78
+ @left_char = 0
79
+ @max_left_char = 0
80
+ @list_size = 0
81
+ @widest_line = -1
82
+ @save_lines = save_lines
83
+ @accepts_focus = true
84
+ @input_window = @win
85
+ @shadow = shadow
86
+
87
+ if !self.createList(save_lines)
88
+ self.destroy
89
+ return nil
90
+ end
91
+
92
+ # Do we need to create a shadow?
93
+ if shadow
94
+ @shadow_win = Ncurses.newwin(box_height, box_width,
95
+ ypos + 1, xpos + 1)
96
+ end
97
+
98
+ # Create the key bindings
99
+ bindings.each do |from, to|
100
+ self.bind(:SWINDOW, from, :getc, to)
101
+ end
102
+
103
+ # Register this baby.
104
+ rndkscreen.register(:SWINDOW, self)
105
+ end
106
+
107
+ # This sets the lines and the box attribute of the scrolling window.
108
+ def set(list, lines, box)
109
+ self.setContents(list, lines)
110
+ self.setBox(box)
111
+ end
112
+
113
+ def setupLine(list, x)
114
+ list_len = []
115
+ list_pos = []
116
+ @list[x] = RNDK.char2Chtype(list, list_len, list_pos)
117
+ @list_len[x] = list_len[0]
118
+ @list_pos[x] = RNDK.justifyString(@box_width, list_len[0], list_pos[0])
119
+ @widest_line = [@widest_line, @list_len[x]].max
120
+ end
121
+
122
+ # This sets all the lines inside the scrolling window.
123
+ def setContents(list, list_size)
124
+ # First let's clean all the lines in the window.
125
+ self.clean
126
+ self.createList(list_size)
127
+
128
+ # Now let's set all the lines inside the window.
129
+ (0...list_size).each do |x|
130
+ self.setupLine(list[x], x)
131
+ end
132
+
133
+ # Set some more important members of the scrolling window.
134
+ @list_size = list_size
135
+ @max_top_line = @list_size - @view_size
136
+ @max_top_line = [@max_top_line, 0].max
137
+ @max_left_char = @widest_line - (@box_width - 2)
138
+ @current_top = 0
139
+ @left_char = 0
140
+ end
141
+
142
+ def getContents(size)
143
+ size << @list_size
144
+ return @list
145
+ end
146
+
147
+ def freeLine(x)
148
+ # if x < @list_size
149
+ # @list[x] = 0
150
+ # end
151
+ end
152
+
153
+ # This adds a line to the scrolling window.
154
+ def add(list, insert_pos)
155
+ # If we are at the maximum number of save lines erase the first
156
+ # position and bump everything up one spot
157
+ if @list_size == @save_lines and @list_size > 0
158
+ @list = @list[1..-1]
159
+ @list_pos = @list_pos[1..-1]
160
+ @list_len = @list_len[1..-1]
161
+ @list_size -= 1
162
+ end
163
+
164
+ # Determine where the line is being added.
165
+ if insert_pos == RNDK::TOP
166
+ # We need to 'bump' everything down one line...
167
+ @list = [@list[0]] + @list
168
+ @list_pos = [@list_pos[0]] + @list_pos
169
+ @list_len = [@list_len[0]] + @list_len
170
+
171
+ # Add it into the scrolling window.
172
+ self.setupLine(list, 0)
173
+
174
+ # set some variables.
175
+ @current_top = 0
176
+ if @list_size < @save_lines
177
+ @list_size += 1
178
+ end
179
+
180
+ # Set the maximum top line.
181
+ @max_top_line = @list_size - @view_size
182
+ @max_top_line = [@max_top_line, 0].max
183
+
184
+ @max_left_char = @widest_line - (@box_width - 2)
185
+ else
186
+ # Add to the bottom.
187
+ @list += ['']
188
+ @list_pos += [0]
189
+ @list_len += [0]
190
+ self.setupLine(list, @list_size)
191
+
192
+ @max_left_char = @widest_line - (@box_width - 2)
193
+
194
+ # Increment the item count and zero out the next row.
195
+ if @list_size < @save_lines
196
+ @list_size += 1
197
+ self.freeLine(@list_size)
198
+ end
199
+
200
+ # Set the maximum top line.
201
+ if @list_size <= @view_size
202
+ @max_top_line = 0
203
+ @current_top = 0
204
+ else
205
+ @max_top_line = @list_size - @view_size
206
+ @current_top = @max_top_line
207
+ end
208
+ end
209
+
210
+ # Draw in the list.
211
+ self.drawList(@box)
212
+ end
213
+
214
+ # This jumps to a given line.
215
+ def jumpToLine(line)
216
+ # Make sure the line is in bounds.
217
+ if line == RNDK::BOTTOM || line >= @list_size
218
+ # We are moving to the last page.
219
+ @current_top = @list_size - @view_size
220
+ elsif line == TOP || line <= 0
221
+ # We are moving to the top of the page.
222
+ @current_top = 0
223
+ else
224
+ # We are moving in the middle somewhere.
225
+ if @view_size + line < @list_size
226
+ @current_top = line
227
+ else
228
+ @current_top = @list_size - @view_size
229
+ end
230
+ end
231
+
232
+ # A little sanity check to make sure we don't do something silly
233
+ if @current_top < 0
234
+ @current_top = 0
235
+ end
236
+
237
+ # Redraw the window.
238
+ self.draw(@box)
239
+ end
240
+
241
+ # This removes all the lines inside the scrolling window.
242
+ def clean
243
+ # Clean up the memory used...
244
+ (0...@list_size).each do |x|
245
+ self.freeLine(x)
246
+ end
247
+
248
+ # Reset some variables.
249
+ @list_size = 0
250
+ @max_left_char = 0
251
+ @widest_line = 0
252
+ @current_top = 0
253
+ @max_top_line = 0
254
+
255
+ # Redraw the window.
256
+ self.draw(@box)
257
+ end
258
+
259
+ # This trims lines from the scrolling window.
260
+ def trim(begin_line, end_line)
261
+ # Check the value of begin_line
262
+ if begin_line < 0
263
+ start = 0
264
+ elsif begin_line >= @list_size
265
+ start = @list_size - 1
266
+ else
267
+ start = begin_line
268
+ end
269
+
270
+ # Check the value of end_line
271
+ if end_line < 0
272
+ finish = 0
273
+ elsif end_line >= @list_size
274
+ finish = @list_size - 1
275
+ else
276
+ finish = end_line
277
+ end
278
+
279
+ # Make sure the start is lower than the end.
280
+ if start > finish
281
+ return
282
+ end
283
+
284
+ # Start nuking elements from the window
285
+ (start..finish).each do |x|
286
+ self.freeLine(x)
287
+
288
+ if x < list_size - 1
289
+ @list[x] = @list[x + 1]
290
+ @list_pos[x] = @list_pos[x + 1]
291
+ @list_len[x] = @list_len[x + 1]
292
+ end
293
+ end
294
+
295
+ # Adjust the item count correctly.
296
+ @list_size = @list_size - (end_line - begin_line) - 1
297
+
298
+ # Redraw the window.
299
+ self.draw(@box)
300
+ end
301
+
302
+ # This allows the user to play inside the scrolling window.
303
+ def activate(actions)
304
+ # Draw the scrolling list.
305
+ self.draw(@box)
306
+
307
+ if actions.nil? || actions.size == 0
308
+ while true
309
+ input = self.getch([])
310
+
311
+ # inject the character into the widget.
312
+ self.inject(input)
313
+ if @exit_type != :EARLY_EXIT
314
+ return
315
+ end
316
+ end
317
+ else
318
+ #Inject each character one at a time
319
+ actions.each do |action|
320
+ self.inject(action)
321
+ if @exit_type != :EARLY_EXIT
322
+ return
323
+ end
324
+ end
325
+ end
326
+
327
+ # Set the exit type and return.
328
+ self.setExitType(0)
329
+ end
330
+
331
+ # This injects a single character into the widget.
332
+ def inject(input)
333
+ pp_return = 1
334
+ ret = -1
335
+ complete = false
336
+
337
+ # Set the exit type.
338
+ self.setExitType(0)
339
+
340
+ # Draw the window....
341
+ self.draw(@box)
342
+
343
+ # Check if there is a pre-process function to be called.
344
+ unless @pre_process_func.nil?
345
+ # Call the pre-process function.
346
+ pp_return = @pre_process_func.call(:SWINDOW, self,
347
+ @pre_process_data, input)
348
+ end
349
+
350
+ # Should we continue?
351
+ if pp_return != 0
352
+ # Check for a key binding.
353
+ if self.checkBind(:SWINDOW, input)
354
+ complete = true
355
+ else
356
+ case input
357
+ when Ncurses::KEY_UP
358
+ if @current_top > 0
359
+ @current_top -= 1
360
+ else
361
+ RNDK.beep
362
+ end
363
+ when Ncurses::KEY_DOWN
364
+ if @current_top >= 0 && @current_top < @max_top_line
365
+ @current_top += 1
366
+ else
367
+ RNDK.beep
368
+ end
369
+ when Ncurses::KEY_RIGHT
370
+ if @left_char < @max_left_char
371
+ @left_char += 1
372
+ else
373
+ RNDK.beep
374
+ end
375
+ when Ncurses::KEY_LEFT
376
+ if @left_char > 0
377
+ @left_char -= 1
378
+ else
379
+ RNDK.beep
380
+ end
381
+ when Ncurses::KEY_PPAGE
382
+ if @current_top != 0
383
+ if @current_top >= @view_size
384
+ @current_top = @current_top - (@view_size - 1)
385
+ else
386
+ @current_top = 0
387
+ end
388
+ else
389
+ RNDK.beep
390
+ end
391
+ when Ncurses::KEY_NPAGE
392
+ if @current_top != @max_top_line
393
+ if @current_top + @view_size < @max_top_line
394
+ @current_top = @current_top + (@view_size - 1)
395
+ else
396
+ @current_top = @max_top_line
397
+ end
398
+ else
399
+ RNDK.beep
400
+ end
401
+ when Ncurses::KEY_HOME
402
+ @left_char = 0
403
+ when Ncurses::KEY_END
404
+ @left_char = @max_left_char + 1
405
+ when 'g'.ord, '1'.ord, '<'.ord
406
+ @current_top = 0
407
+ when 'G'.ord, '>'.ord
408
+ @current_top = @max_top_line
409
+ when 'l'.ord, 'L'.ord
410
+ self.loadInformation
411
+ when 's'.ord, 'S'.ord
412
+ self.saveInformation
413
+ when RNDK::KEY_TAB, RNDK::KEY_RETURN, Ncurses::KEY_ENTER
414
+ self.setExitType(input)
415
+ ret = 1
416
+ complete = true
417
+ when RNDK::KEY_ESC
418
+ self.setExitType(input)
419
+ complete = true
420
+ when Ncurses::ERR
421
+ self.setExitType(input)
422
+ complete = true
423
+ when RNDK::REFRESH
424
+ @screen.erase
425
+ @screen.refresh
426
+ end
427
+ end
428
+
429
+ # Should we call a post-process?
430
+ if !complete && !(@post_process_func.nil?)
431
+ @post_process_func.call(:SWINDOW, self, @post_process_data, input)
432
+ end
433
+ end
434
+
435
+ if !complete
436
+ self.drawList(@box)
437
+ self.setExitType(0)
438
+ end
439
+
440
+ @return_data = ret
441
+ return ret
442
+ end
443
+
444
+ # This moves the window field to the given location.
445
+ # Inherited
446
+ # def move(xplace, yplace, relative, refresh_flag)
447
+ # end
448
+
449
+ # This function draws the swindow window widget.
450
+ def draw(box)
451
+ # Do we need to draw in the shadow.
452
+ unless @shadow_win.nil?
453
+ Draw.drawShadow(@shadow_win)
454
+ end
455
+
456
+ # Box the widget if needed
457
+ if box
458
+ Draw.drawObjBox(@win, self)
459
+ end
460
+
461
+ self.drawTitle(@win)
462
+
463
+ Ncurses.wrefresh @win
464
+
465
+ # Draw in the list.
466
+ self.drawList(box)
467
+ end
468
+
469
+ # This draws in the contents of the scrolling window
470
+ def drawList(box)
471
+ # Determine the last line to draw.
472
+ if @list_size < @view_size
473
+ last_line = @list_size
474
+ else
475
+ last_line = @view_size
476
+ end
477
+
478
+ # Erase the scrolling window.
479
+ Ncurses.werase @field_win
480
+
481
+ # Start drawing in each line.
482
+ (0...last_line).each do |x|
483
+ screen_pos = @list_pos[x + @current_top] - @left_char
484
+
485
+ # Write in the correct line.
486
+ if screen_pos >= 0
487
+ Draw.writeChtype(@field_win, screen_pos, x,
488
+ @list[x + @current_top], RNDK::HORIZONTAL, 0,
489
+ @list_len[x + @current_top])
490
+ else
491
+ Draw.writeChtype(@field_win, 0, x, @list[x + @current_top],
492
+ RNDK::HORIZONTAL, @left_char - @list_pos[x + @current_top],
493
+ @list_len[x + @current_top])
494
+ end
495
+ end
496
+
497
+ Ncurses.wrefresh @field_win
498
+ end
499
+
500
+ # This sets the background attribute of the widget.
501
+ def setBKattr(attrib)
502
+ Ncurses.wbkgd(@win, attrib)
503
+ Ncurses.wbkgd(@field_win, attrib)
504
+ end
505
+
506
+ # Free any storage associated with the info-list.
507
+ def destroyInfo
508
+ @list = []
509
+ @list_pos = []
510
+ @list_len = []
511
+ end
512
+
513
+ # This function destroys the scrolling window widget.
514
+ def destroy
515
+ self.destroyInfo
516
+
517
+ self.cleanTitle
518
+
519
+ # Delete the windows.
520
+ RNDK.deleteCursesWindow(@shadow_win)
521
+ RNDK.deleteCursesWindow(@field_win)
522
+ RNDK.deleteCursesWindow(@win)
523
+
524
+ # Clean the key bindings.
525
+ self.cleanBindings(:SWINDOW)
526
+
527
+ # Unregister this object.
528
+ RNDK::Screen.unregister(:SWINDOW, self)
529
+ end
530
+
531
+ # This function erases the scrolling window widget.
532
+ def erase
533
+ if self.validRNDKObject
534
+ RNDK.eraseCursesWindow(@win)
535
+ RNDK.eraseCursesWindow(@shadow_win)
536
+ end
537
+ end
538
+
539
+ # This execs a command and redirects the output to the scrolling window.
540
+ def exec(command, insert_pos)
541
+ count = -1
542
+ Ncurses.endwin
543
+
544
+ # Try to open the command.
545
+ # XXX This especially needs exception handling given how Ruby
546
+ # implements popen
547
+ unless (ps = IO.popen(command.split, 'r')).nil?
548
+ # Start reading.
549
+ until (temp = ps.gets).nil?
550
+ if temp.size != 0 && temp[-1] == '\n'
551
+ temp = temp[0...-1]
552
+ end
553
+ # Add the line to the scrolling window.
554
+ self.add(temp, insert_pos)
555
+ count += 1
556
+ end
557
+
558
+ # Close the pipe
559
+ ps.close
560
+ end
561
+ return count
562
+ end
563
+
564
+ def showMessage2(msg, msg2, filename)
565
+ mesg = [
566
+ msg,
567
+ msg2,
568
+ "<C>(%s)" % [filename],
569
+ ' ',
570
+ '<C> Press any key to continue.',
571
+ ]
572
+ @screen.popupLabel(mesg, mesg.size)
573
+ end
574
+
575
+ # This function allows the user to dump the information from the
576
+ # scrolling window to a file.
577
+ def saveInformation
578
+ # Create the entry field to get the filename.
579
+ entry = RNDK::ENTRY.new(@screen, RNDK::CENTER, RNDK::CENTER,
580
+ '<C></B/5>Enter the filename of the save file.',
581
+ 'Filename: ', Ncurses::A_NORMAL, '_'.ord, :MIXED,
582
+ 20, 1, 256, true, false)
583
+
584
+ # Get the filename.
585
+ filename = entry.activate([])
586
+
587
+ # Did they hit escape?
588
+ if entry.exit_type == :ESCAPE_HIT
589
+ # Popup a message.
590
+ mesg = [
591
+ '<C></B/5>Save Canceled.',
592
+ '<C>Escape hit. Scrolling window information not saved.',
593
+ ' ',
594
+ '<C>Press any key to continue.'
595
+ ]
596
+ @screen.popupLabel(mesg, 4)
597
+
598
+ # Clean up and exit.
599
+ entry.destroy
600
+ end
601
+
602
+ # Write the contents of the scrolling window to the file.
603
+ lines_saved = self.dump(filename)
604
+
605
+ # Was the save successful?
606
+ if lines_saved == -1
607
+ # Nope, tell 'em
608
+ self.showMessage2('<C></B/16>Error', '<C>Could not save to the file.',
609
+ filename)
610
+ else
611
+ # Yep, let them know how many lines were saved.
612
+ self.showMessage2('<C></B/5>Save Successful',
613
+ '<C>There were %d lines saved to the file' % [lines_saved],
614
+ filename)
615
+ end
616
+
617
+ # Clean up and exit.
618
+ entry.destroy
619
+ @screen.erase
620
+ @screen.draw
621
+ end
622
+
623
+ # This function allows the user to load new information into the scrolling
624
+ # window.
625
+ def loadInformation
626
+ # Create the file selector to choose the file.
627
+ fselect = RNDK::FSELECT.new(@screen, RNDK::CENTER, RNDK::CENTER, 20, 55,
628
+ '<C>Load Which File', 'FIlename', Ncurses::A_NORMAL, '.',
629
+ Ncurses::A_REVERSE, '</5>', '</48>', '</N>', '</N>', true, false)
630
+
631
+ # Get the filename to load.
632
+ filename = fselect.activate([])
633
+
634
+ # Make sure they selected a file.
635
+ if fselect.exit_type == :ESCAPE_HIT
636
+ # Popup a message.
637
+ mesg = [
638
+ '<C></B/5>Load Canceled.',
639
+ ' ',
640
+ '<C>Press any key to continue.',
641
+ ]
642
+ @screen.popupLabel(mesg, 3)
643
+
644
+ # Clean up and exit
645
+ fselect.destroy
646
+ return
647
+ end
648
+
649
+ # Copy the filename and destroy the file selector.
650
+ filename = fselect.pathname
651
+ fselect.destroy
652
+
653
+ # Maybe we should check before nuking all the information in the
654
+ # scrolling window...
655
+ if @list_size > 0
656
+ # Create the dialog message.
657
+ mesg = [
658
+ '<C></B/5>Save Information First',
659
+ '<C>There is information in the scrolling window.',
660
+ '<C>Do you want to save it to a file first?',
661
+ ]
662
+ button = ['(Yes)', '(No)']
663
+
664
+ # Create the dialog widget.
665
+ dialog = RNDK::DIALOG.new(@screen, RNDK::CENTER, RNDK::CENTER,
666
+ mesg, 3, button, 2, Ncurses.COLOR_PAIR(2) | Ncurses::A_REVERSE,
667
+ true, true, false)
668
+
669
+ # Activate the widet.
670
+ answer = dialog.activate([])
671
+ dialog.destroy
672
+
673
+ # Check the answer.
674
+ if (answer == -1 || answer == 0)
675
+ # Save the information.
676
+ self.saveInformation
677
+ end
678
+ end
679
+
680
+ # Open the file and read it in.
681
+ f = File.open(filename)
682
+ file_info = f.readlines.map do |line|
683
+ if line.size > 0 && line[-1] == "\n"
684
+ line[0...-1]
685
+ else
686
+ line
687
+ end
688
+ end.compact
689
+
690
+ # TODO error handling
691
+ # if (lines == -1)
692
+ # {
693
+ # /* The file read didn't work. */
694
+ # showMessage2 (swindow,
695
+ # "<C></B/16>Error",
696
+ # "<C>Could not read the file",
697
+ # filename);
698
+ # freeChar (filename);
699
+ # return;
700
+ # }
701
+
702
+ # Clean out the scrolling window.
703
+ self.clean
704
+
705
+ # Set the new information in the scrolling window.
706
+ self.set(file_info, file_info.size, @box)
707
+ end
708
+
709
+ # This actually dumps the information from the scrolling window to a file.
710
+ def dump(filename)
711
+ # Try to open the file.
712
+ #if ((outputFile = fopen (filename, "w")) == 0)
713
+ #{
714
+ # return -1;
715
+ #}
716
+ output_file = File.new(filename, 'w')
717
+
718
+ # Start writing out the file.
719
+ @list.each do |item|
720
+ raw_line = RNDK.chtype2Char(item)
721
+ output_file << "%s\n" % raw_line
722
+ end
723
+
724
+ # Close the file and return the number of lines written.
725
+ output_file.close
726
+ return @list_size
727
+ end
728
+
729
+ def focus
730
+ self.draw(@box)
731
+ end
732
+
733
+ def unfocus
734
+ self.draw(@box)
735
+ end
736
+
737
+ def createList(list_size)
738
+ status = false
739
+
740
+ if list_size >= 0
741
+ new_list = []
742
+ new_pos = []
743
+ new_len = []
744
+
745
+ status = true
746
+ self.destroyInfo
747
+
748
+ @list = new_list
749
+ @list_pos = new_pos
750
+ @list_len = new_len
751
+ else
752
+ self.destroyInfo
753
+ status = false
754
+ end
755
+ return status
756
+ end
757
+
758
+ def position
759
+ super(@win)
760
+ end
761
+
762
+ def object_type
763
+ :SWINDOW
764
+ end
765
+ end
766
+ end