rbcurse 0.1.3 → 1.1.1

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 (74) hide show
  1. data/CHANGELOG +126 -0
  2. data/Manifest.txt +53 -20
  3. data/README.markdown +423 -0
  4. data/Rakefile +3 -1
  5. data/examples/keytest.rb +177 -0
  6. data/examples/mpad2.rb +156 -0
  7. data/examples/newtesttabp.rb +121 -0
  8. data/examples/rfe.rb +48 -10
  9. data/examples/rfe_renderer.rb +4 -4
  10. data/examples/rvimsplit.rb +376 -0
  11. data/examples/sqlc.rb +97 -106
  12. data/examples/sqlm.rb +446 -0
  13. data/examples/test1.rb +4 -4
  14. data/examples/test2.rb +12 -12
  15. data/examples/testchars.rb +140 -0
  16. data/examples/testkeypress.rb +9 -4
  17. data/examples/testmulticomp.rb +72 -0
  18. data/examples/testscroller.rb +136 -0
  19. data/examples/testscrolllb.rb +86 -0
  20. data/examples/testscrollp.rb +87 -0
  21. data/examples/testscrollta.rb +80 -0
  22. data/examples/testscrolltable.rb +166 -0
  23. data/examples/testsplit.rb +87 -0
  24. data/examples/testsplit2.rb +123 -0
  25. data/examples/testsplit3.rb +215 -0
  26. data/examples/testsplit3_1.rb +244 -0
  27. data/examples/testsplit3a.rb +215 -0
  28. data/examples/testsplit3b.rb +237 -0
  29. data/examples/testsplitta.rb +148 -0
  30. data/examples/testsplittv.rb +142 -0
  31. data/examples/testsplittvv.rb +144 -0
  32. data/examples/testtable.rb +1 -1
  33. data/examples/testtabp.rb +3 -2
  34. data/examples/testtestw.rb +69 -0
  35. data/examples/testtodo.rb +5 -3
  36. data/examples/testtpane.rb +203 -0
  37. data/examples/testtpane2.rb +145 -0
  38. data/examples/testtpanetable.rb +199 -0
  39. data/examples/viewtodo.rb +5 -3
  40. data/lib/rbcurse.rb +1 -1
  41. data/lib/rbcurse/celleditor.rb +2 -2
  42. data/lib/rbcurse/colormap.rb +5 -5
  43. data/lib/rbcurse/defaultlistselectionmodel.rb +3 -3
  44. data/lib/rbcurse/io.rb +663 -0
  45. data/lib/rbcurse/listeditable.rb +306 -0
  46. data/lib/rbcurse/listkeys.rb +15 -15
  47. data/lib/rbcurse/listscrollable.rb +168 -27
  48. data/lib/rbcurse/mapper.rb +35 -13
  49. data/lib/rbcurse/rchangeevent.rb +28 -0
  50. data/lib/rbcurse/rform.rb +845 -0
  51. data/lib/rbcurse/rlistbox.rb +144 -34
  52. data/lib/rbcurse/rmessagebox.rb +10 -5
  53. data/lib/rbcurse/rmulticontainer.rb +325 -0
  54. data/lib/rbcurse/rmultitextview.rb +306 -0
  55. data/lib/rbcurse/rscrollform.rb +369 -0
  56. data/lib/rbcurse/rscrollpane.rb +511 -0
  57. data/lib/rbcurse/rsplitpane.rb +820 -0
  58. data/lib/rbcurse/rtabbedpane.rb +737 -109
  59. data/lib/rbcurse/rtabbedwindow.rb +326 -0
  60. data/lib/rbcurse/rtable.rb +220 -64
  61. data/lib/rbcurse/rtextarea.rb +340 -181
  62. data/lib/rbcurse/rtextview.rb +237 -101
  63. data/lib/rbcurse/rviewport.rb +203 -0
  64. data/lib/rbcurse/rwidget.rb +919 -95
  65. data/lib/rbcurse/scrollable.rb +7 -7
  66. data/lib/rbcurse/selectable.rb +4 -4
  67. data/lib/rbcurse/table/tablecellrenderer.rb +3 -0
  68. data/lib/rbcurse/undomanager.rb +181 -0
  69. data/lib/rbcurse/vieditable.rb +100 -0
  70. data/lib/ver/window.rb +471 -21
  71. metadata +66 -22
  72. data/README.txt +0 -312
  73. data/examples/testd.db +0 -0
  74. data/examples/todocsv.csv +0 -28
@@ -1,3 +1,12 @@
1
+ #####################################################
2
+ # This is a sample program demonstrating a 2 pane file explorer using
3
+ # rbcurse's widgets.
4
+ # I have used a listbox here, perhaps a Table would be more configurable
5
+ # than a listbox.
6
+ #
7
+ # Copyright rkumar 2009, 2010 under Ruby License.
8
+ #
9
+ ####################################################
1
10
  require 'rubygems'
2
11
  require 'ncurses'
3
12
  require 'logger'
@@ -10,6 +19,7 @@ require 'rbcurse/keylabelprinter'
10
19
  require 'rbcurse/applicationheader'
11
20
  require 'rbcurse/action'
12
21
  require 'fileutils'
22
+ require 'yaml' ## added for 1.9
13
23
  #$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
14
24
 
15
25
  # TODO
@@ -160,9 +170,9 @@ class FileExplorer
160
170
  def readable_file_size(size, precision)
161
171
  case
162
172
  #when size == 1 : "1 B"
163
- when size < KILO_SIZE : "%d B" % size
164
- when size < MEGA_SIZE : "%.#{precision}f K" % (size / KILO_SIZE)
165
- when size < GIGA_SIZE : "%.#{precision}f M" % (size / MEGA_SIZE)
173
+ when size < KILO_SIZE then "%d B" % size
174
+ when size < MEGA_SIZE then "%.#{precision}f K" % (size / KILO_SIZE)
175
+ when size < GIGA_SIZE then "%.#{precision}f M" % (size / MEGA_SIZE)
166
176
  else "%.#{precision}f G" % (size / GIGA_SIZE)
167
177
  end
168
178
  end
@@ -285,13 +295,13 @@ class RFe
285
295
  status_row = RubyCurses::Label.new @form, {'text' => "", :row => Ncurses.LINES-4, :col => 0, :display_length=>Ncurses.COLS-2}
286
296
  @status_row = status_row
287
297
  colb = Ncurses.COLS/2
288
- ht = Ncurses.LINES - 7
298
+ ht = Ncurses.LINES - 5
289
299
  wid = Ncurses.COLS/2 - 0
290
300
  @trash_path = File.expand_path("~/.Trash")
291
301
  @trash_exists = File.directory? @trash_path
292
302
  $log.debug " trash_path #{@trash_path}, #{@trash_exists}"
293
- @lista = FileExplorer.new @form, self, row=2, col=1, ht, wid
294
- @listb = FileExplorer.new @form, self, row=2, col=colb, ht, wid
303
+ @lista = FileExplorer.new @form, self, row=1, col=1, ht, wid
304
+ @listb = FileExplorer.new @form, self, row=1, col=colb, ht, wid
295
305
 
296
306
  init_vars
297
307
  end
@@ -306,6 +316,7 @@ class RFe
306
316
  end
307
317
  end
308
318
  @config ||={}
319
+ @stopping = false
309
320
  end
310
321
  def save_config
311
322
  @config["last_dirs"]=[@lista.current_dir(),@listb.current_dir()]
@@ -480,7 +491,7 @@ class RFe
480
491
  @v_window.wrefresh
481
492
  Ncurses::Panel.update_panels
482
493
  begin
483
- while((ch = @v_window.getchar()) != ?\C-q )
494
+ while((ch = @v_window.getchar()) != ?\C-q.getbyte(0) )
484
495
  break if ch == KEY_F3
485
496
  @v_form.handle_key ch
486
497
  @v_form.repaint
@@ -497,6 +508,9 @@ class RFe
497
508
  when '.tgz','.gz'
498
509
  cmd = "tar -ztvf #{fp}"
499
510
  content = %x[#{cmd}]
511
+ when '.zip'
512
+ cmd = "unzip -l #{fp}"
513
+ content = %x[#{cmd}]
500
514
  else
501
515
  content = File.open(fp,"r").readlines
502
516
  end
@@ -611,6 +625,9 @@ class RFe
611
625
  $log.debug " edit #{fp}"
612
626
  shell_out "/opt/local/bin/vim #{fp}"
613
627
  end
628
+ def stopping?
629
+ @stopping
630
+ end
614
631
  def draw_screens
615
632
  lasta = lastb = nil
616
633
  if !@config["last_dirs"].nil?
@@ -623,6 +640,26 @@ class RFe
623
640
  # @form.bind_key(?\M-x){
624
641
  # @current_list.mark_block
625
642
  # }
643
+ # i am just testing out double key bindings
644
+ @form.bind_key([?\C-w,?v]){
645
+ @status_row.text = "got C-w, v"
646
+ $log.debug " Got C-w v "
647
+ view()
648
+ }
649
+ @form.bind_key([?\C-w,?e]){
650
+ @status_row.text = "got C-w, e"
651
+ $log.debug " Got C-w e "
652
+ edit()
653
+ }
654
+ # bind dd to delete file
655
+ # actually this should be in listbox, and we should listen for row delete and then call opt_file
656
+ @form.bind_key([?d,?d]){
657
+ opt_file 'd'
658
+ }
659
+ @form.bind_key([?q,?q]){
660
+ @stopping = true
661
+ }
662
+ # this won't work since the listbox will consume the d first
626
663
  @form.bind_key(?@){
627
664
  @current_list.change_dir File.expand_path("~/")
628
665
  }
@@ -633,7 +670,7 @@ class RFe
633
670
  @klp.mode :file
634
671
  @klp.repaint
635
672
  ## FIXME chr could fail !!
636
- while((ch = @window.getchar()) != ?\C-c )
673
+ while((ch = @window.getchar()) != ?\C-c.getbyte(0) )
637
674
  if "cmdsuvrex".index(ch.chr) == nil
638
675
  Ncurses.beep
639
676
  else
@@ -648,7 +685,7 @@ class RFe
648
685
  @klp.repaint
649
686
  keys = @klp.get_current_keys
650
687
  ## FIXME chr could fail !!
651
- while((ch = @window.getchar()) != ?\C-c )
688
+ while((ch = @window.getchar()) != ?\C-c.getbyte(0) )
652
689
  if !keys.include?(ch.chr)
653
690
  Ncurses.beep
654
691
  else
@@ -704,7 +741,8 @@ class RFe
704
741
  @window.wrefresh
705
742
  Ncurses::Panel.update_panels
706
743
  begin
707
- while((ch = @window.getchar()) != ?\C-q )
744
+ ## qq stops program, but only if M-v (vim mode)
745
+ while(!stopping? && (ch = @window.getchar()) != ?\C-q.getbyte(0) )
708
746
  s = keycode_tos ch
709
747
  status_row.text = "Pressed #{ch} , #{s}"
710
748
  @form.handle_key(ch)
@@ -47,10 +47,10 @@ module RubyCurses
47
47
  # Return the file size with a readable style.
48
48
  def readable_file_size(size, precision)
49
49
  case
50
- #when size == 1 : "1 B"
51
- when size < KILO_SIZE : "%d B" % size
52
- when size < MEGA_SIZE : "%.#{precision}f K" % (size / KILO_SIZE)
53
- when size < GIGA_SIZE : "%.#{precision}f M" % (size / MEGA_SIZE)
50
+ #when size == 1 then "1 B"
51
+ when size < KILO_SIZE then "%d B" % size
52
+ when size < MEGA_SIZE then "%.#{precision}f K" % (size / KILO_SIZE)
53
+ when size < GIGA_SIZE then "%.#{precision}f M" % (size / MEGA_SIZE)
54
54
  else "%.#{precision}f G" % (size / GIGA_SIZE)
55
55
  end
56
56
  end
@@ -0,0 +1,376 @@
1
+ # this is a test program,
2
+ # testing out if subwins can help in splitpanes
3
+ # derwins, although easy to use flunk movement and resizing
4
+ # So i've changed Window to use subwins, so top and left are maintained
5
+ # We need to create events for resizing so refreshing window can be done.
6
+ #
7
+ # FIXME - resizing, divider change
8
+ # FIXME - left top 2 splits are not expanding to full height. check in draw box mode
9
+ # TODO = when resixing a split, if the other one has been split, its children need to be resized.
10
+ #
11
+ #$LOAD_PATH << "/Users/rahul/work/projects/rbcurse/"
12
+ require 'rubygems'
13
+ require 'ncurses'
14
+ require 'logger'
15
+ require 'rbcurse'
16
+
17
+ class Split
18
+ def initialize type, first, second, win
19
+ @c1 = first
20
+ @c2 = second
21
+ @type = type # :VERTICAL or :HORIZONTAL
22
+ @parent = win # needed to draw divider on
23
+ end
24
+ def first_win; @c1; end
25
+ def second_win; @c2; end
26
+ def divider_location y,x
27
+ @y = y
28
+ @x = x
29
+ end
30
+
31
+ # change the size of a split
32
+ # still to redo the line etc.
33
+ def increase comp, units=1
34
+ $log.debug " increase got #{comp}, #{comp.class}, #{units} "
35
+ if @type == :HORIZONTAL
36
+ if comp == @c1
37
+ else
38
+ comp = @c1
39
+ units *= -1
40
+ end
41
+ other = @c2
42
+ #comp.wclear
43
+ #other.wclear
44
+ #comp.wrefresh
45
+ #other.wrefresh
46
+ # increase h
47
+ layout = comp.layout
48
+ $log.debug " layout #{layout} "
49
+ h = layout[:height]
50
+ w = layout[:width]
51
+ top = layout[:top]
52
+ left = layout[:left]
53
+ $log.debug "H1 ht change #{h} , #{h} + #{units} "
54
+ layout[:height]= h + units
55
+ divloc = h + units + 1
56
+ comp.resize_with(layout)
57
+ # decrease second, and push inc top
58
+ layout = other.layout
59
+ h = layout[:height]
60
+ w = layout[:width]
61
+ top = layout[:top]
62
+ left = layout[:left]
63
+ h = layout[:height]
64
+ top = layout[:top]
65
+ layout[:top] = top + units
66
+ layout[:height] = h- units
67
+ $log.debug "H1 c2 ht change #{h} , #{h} - #{units}, top #{top} + #{units} "
68
+ other.resize_with(layout)
69
+ h = @parent.height
70
+ w = @parent.width
71
+ #@parent.mvwhline( divloc, 0, ACS_HLINE, w+2)
72
+ @y += units
73
+ #@parent.werase #wclear
74
+ @parent.wclear
75
+ # FIXME double line printing ??? after tabbing or hitting a key
76
+ @parent.mvwhline( @y, 0, ACS_HLINE, w)
77
+ comp.wrefresh
78
+ other.wrefresh
79
+ @parent.wrefresh
80
+ # do wnoutrefresh and doupdate
81
+ return
82
+ end
83
+ if @type == :VERTICAL
84
+ if comp == @c1
85
+ else
86
+ units *= -1
87
+ comp = @c1
88
+ end
89
+ other = @c2
90
+ # increase w
91
+ layout = comp.layout
92
+ h = layout[:width]
93
+ layout[:width]= h + units
94
+ $log.debug "V1 ht change #{h} , #{h} + #{units} "
95
+ comp.resize_with(layout)
96
+ # decrease second, and push inc top
97
+ layout = other.layout
98
+ h = layout[:width]
99
+ top = layout[:left]
100
+ layout[:left] = top + units
101
+ layout[:width] = h - units
102
+ $log.debug "V c2 ht change #{h} , #{h} - #{units}, top #{top} + #{units} "
103
+ other.resize_with(layout)
104
+ # TODO add line here
105
+ comp.wclear
106
+ other.wclear
107
+ return
108
+ end
109
+
110
+ end
111
+ end
112
+ class VimSplit
113
+ def initialize window, lay
114
+ # array of window, to delete later
115
+ @wins = []
116
+ # mapping of a subwin and its Split, so i can resize
117
+ @splits = {}
118
+
119
+ # hash of windows and component attached
120
+ @win_comp = {}
121
+ @children = {} # parent and children array, since we have not designed this properly
122
+ # only those windows that can be focused, child windows when split, parent is invisible
123
+ @focusables = []
124
+ # main window
125
+ @window = window
126
+ @splouter = @window._subwin(lay)
127
+ # (0..@splouter.height).each {|i| @splouter.highlight_line($reversecolor,i,0,@splouter.width)}
128
+ @wins << @splouter
129
+ #@focusables << @splouter
130
+ @splouter.box(0,0)
131
+ @draw_boxes = false
132
+
133
+ @str = "" # dummy
134
+ end
135
+ def self.color_window win, color=$datacolor
136
+ (0..win.height).each {|i| win.highlight_line(color,i,0,win.width)}
137
+ end
138
+ # focussed component
139
+ def current
140
+ @current || _switch_split
141
+ end
142
+ # when we make the first split we want to keep the borders. AFter that we always want to start with zero
143
+ # so the window we split is "consumed".
144
+ def get_offset
145
+ if @wins.length == 1
146
+ return 1
147
+ end
148
+ 0
149
+ end
150
+ def get_win; @splouter; end
151
+
152
+ # splits horizontally at centre
153
+ # We need to give an initial weight or location for divider
154
+ def split_h win
155
+ h = win.height
156
+ w = win.width
157
+ off = get_offset()
158
+ #lay1 = { :height => h/2-0, :width => w-2, :top => 0, :left => off }
159
+ #lay2 = { :height => h/2-1, :width => w-2, :top => h/2+1, :left => 1 }
160
+ lay1 = { :height => h/2-0, :width => w-2, :top => off, :left => off }
161
+ lay2 = { :height => h/2-1, :width => w-2, :top => h/2+1, :left => off }
162
+ split1 = win._subwin(lay1)
163
+ split2 = win._subwin(lay2)
164
+ win.mvwhline( h/2, 0, ACS_HLINE, w+2)
165
+
166
+ if @draw_boxes
167
+ split1.box(0,0)
168
+ split2.box(0,0)
169
+ end
170
+ # if a window is split, then tab doesn't go there, it goes to its two subwins
171
+ @focusables.delete win
172
+ @wins << split1
173
+ @wins << split2
174
+ @focusables << split1 << split2
175
+ spl = Split.new :HORIZONTAL, split1, split2, win
176
+ spl.divider_location(h/2,0)
177
+ @splits[split1] = spl
178
+ @splits[split2] = spl
179
+ @children[win] = [ split1, split2 ]
180
+ #return split1, split2
181
+ return spl
182
+ end
183
+ def split_v win
184
+ h = win.height
185
+ w = win.width
186
+ off = get_offset()
187
+ lay1 = { :height => h-2, :width => w/2-1, :top => off, :left => off }
188
+ lay2 = { :height => h-2, :width => w/2-1, :top => off, :left => w/2+1 }
189
+ split1 = win._subwin(lay1)
190
+ split2 = win._subwin(lay2)
191
+ win.mvwvline( 0, w/2, ACS_VLINE, h+2)
192
+ if @draw_boxes
193
+ split1.box(0,0)
194
+ split2.box(0,0)
195
+ end
196
+ @focusables.delete win
197
+ @wins << split1
198
+ @wins << split2
199
+ @focusables << split1 << split2
200
+ spl = Split.new :VERTICAL, split1, split2, win
201
+ spl.divider_location(0,h/2)
202
+ @splits[split1] = spl
203
+ @splits[split2] = spl
204
+ @children[win] = [ split1, split2 ]
205
+ #return split1, split2
206
+ return spl
207
+ end
208
+ def set_focus_on split
209
+ raise "Given split not focusable" if @focusables.index.nil?
210
+ # actually we can take it's split and keep going down till first. But we don;t have a tree
211
+ @current = split
212
+ end
213
+
214
+ def destroy
215
+ @wins.each {|w| w.destroy}
216
+ super
217
+ end
218
+ ## attach a component to a window/split, so that all keys to that win go to the window
219
+ # create the comp without a form.
220
+ def attach win, comp
221
+ # i need to set the window to win.
222
+ comp.override_graphic(win) # i think XXX
223
+ @win_comp[win] = comp
224
+ end
225
+ def _switch_split
226
+ index = @focusables.index @current
227
+ index ||= 0
228
+ index+=1
229
+ if index >= @focusables.length
230
+ index = 0
231
+ end
232
+ @current = @focusables.at index
233
+ @current.wmove 0,0
234
+ @current.wrefresh
235
+ @current
236
+ end
237
+ def handle_key ch
238
+ case ch
239
+ when 9
240
+ _switch_split
241
+ return 0
242
+ #when 32..126
243
+ #char = ch.chr
244
+ #@str << char
245
+ #@current.printstring 0,0, @str, 0
246
+ #@current.wrefresh
247
+ #when 330, 127
248
+ #@str = @str[0..-2]
249
+ ##@current.wclear # casuses a flash
250
+ #@current.printstring 0,0, @str, 0
251
+ #@current.wrefresh
252
+ #when 10,13
253
+ #@str << "\n"
254
+ when ?\M-v.getbyte(0)
255
+ # allow user to split but this does not give the user programmatic control over the splits ??
256
+ # unless we call some events
257
+ split_v @current
258
+ @current.wrefresh
259
+ set_focus_on @focusables.last
260
+ @window.wrefresh
261
+ when ?\M-h.getbyte(0)
262
+ split_h @current
263
+ @current.wrefresh
264
+ set_focus_on @focusables.last
265
+ @window.wrefresh
266
+ when ?\M-+.getbyte(0)
267
+ spl = @splits[@current]
268
+ spl.increase(@current)
269
+ when ?\M--.getbyte(0)
270
+ spl = @splits[@current]
271
+ spl.increase(@current,-1)
272
+ else
273
+ comp = @win_comp[@current]
274
+ ret = :UNHANDLED
275
+ ret = comp.handle_key(ch) unless comp.nil?
276
+ return ret
277
+ end
278
+ ret = :UNHANDLED
279
+ end
280
+
281
+ end
282
+ class TestSubwin
283
+ def initialize
284
+ acolor = $reversecolor
285
+ end
286
+ def run
287
+ @window = VER::Window.root_window
288
+
289
+ h = 20; w = 75; t = 3; l = 4
290
+ @layoutouter = { :height => h, :width => w, :top => t, :left => l }
291
+
292
+ @vim = VimSplit.new @window, @layoutouter
293
+ @splouter = @vim.get_win
294
+ spl = @vim.split_v @splouter
295
+ @splleft = spl.first_win
296
+ @splright = spl.second_win
297
+ spl = @vim.split_h @splleft
298
+ @splleft1 = spl.first_win
299
+ @splleft2 = spl.second_win
300
+ @vim.split_h @splright
301
+ @vim.split_v @splleft1
302
+
303
+ @window.printstring(1,10,"Ncurses Subwindow test - splitpanes emulation using subwin",0)
304
+ @splouter.printstring(0,2, " Outer ", 0)
305
+ @splleft.printstring(0,2, "-Left ", 0)
306
+ @splleft1.printstring(0,1, "Top ", 0)
307
+ @splleft2.printstring(0,1, "Bottom ", 0)
308
+ #@vim.set_focus_on @splleft1
309
+
310
+ @window.printstring(2,10,"q to quit",2)
311
+ #
312
+ @form = Form.new @window
313
+ @help = "q to quit. "
314
+ RubyCurses::Label.new @form, {'text' => @help, "row" => 1, "col" => 2, "color" => "yellow"}
315
+ @form.repaint
316
+ @window.wrefresh
317
+ Ncurses::Panel.update_panels
318
+ ctr = 0
319
+ row = 2
320
+ str = "Hello"
321
+ buffers = {}
322
+ while((ch = @window.getchar()) != KEY_F1 )
323
+ ret = @vim.handle_key ch
324
+ if ret == :UNHANDLED
325
+ curr = @vim.current
326
+ buff = buffers[curr]
327
+ if buff.nil?
328
+ buff ||= ""
329
+ buffers[curr] = buff
330
+ end
331
+ case ch
332
+ when 32..126
333
+ char = ch.chr
334
+ buff << char
335
+ curr.printstring 0,0, buff, 0
336
+ curr.wrefresh
337
+ when 330, 127
338
+ buff = buff[0..-2]
339
+ buffers[curr] = buff
340
+ #@current.wclear # casuses a flash
341
+ curr.printstring 0,0, buff, 0
342
+ curr.clrtobot
343
+ curr.wrefresh
344
+ when 10,13
345
+ buff << "\n"
346
+ curr.printstring 0,0, buff, 0
347
+ curr.wrefresh
348
+ end
349
+
350
+ end
351
+ end
352
+
353
+ @window.destroy
354
+
355
+ end
356
+ end
357
+ if $0 == __FILE__
358
+ include RubyCurses
359
+ include RubyCurses::Utils
360
+ # Initialize curses
361
+ begin
362
+ # XXX update with new color and kb
363
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
364
+ $log = Logger.new("view.log")
365
+ $log.level = Logger::DEBUG
366
+ n = TestSubwin.new
367
+ n.run
368
+ rescue => ex
369
+ ensure
370
+ VER::stop_ncurses
371
+ p ex if ex
372
+ p(ex.backtrace.join("\n")) if ex
373
+ $log.debug( ex) if ex
374
+ $log.debug(ex.backtrace.join("\n")) if ex
375
+ end
376
+ end