rbcurse 1.5.0 → 1.5.2

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 (104) hide show
  1. data/Makefile +21 -0
  2. data/Manifest.txt +6 -0
  3. data/README.markdown +6 -4
  4. data/TODO +372 -0
  5. data/TODO2.txt +121 -0
  6. data/VERSION +1 -1
  7. data/examples/README.txt +67 -0
  8. data/examples/abasiclist.rb +33 -0
  9. data/examples/alpmenu.rb +42 -0
  10. data/examples/app.rb +859 -0
  11. data/examples/app.sample +17 -0
  12. data/examples/appdirtree.rb +74 -0
  13. data/examples/appemail.rb +191 -0
  14. data/examples/appemaillb.rb +308 -0
  15. data/examples/appgcompose.rb +315 -0
  16. data/examples/atree.rb +64 -0
  17. data/examples/common/file.rb +40 -0
  18. data/examples/common/rmail.rb +257 -0
  19. data/examples/data.txt +683 -0
  20. data/examples/data/README.markdown +9 -0
  21. data/examples/data/brew.txt +38 -0
  22. data/examples/data/color.2 +37 -0
  23. data/examples/data/gemlist.txt +60 -0
  24. data/examples/data/lotr.txt +12 -0
  25. data/examples/data/ports.txt +136 -0
  26. data/examples/data/tasks.txt +27 -0
  27. data/examples/data/todocsv.csv +28 -0
  28. data/examples/data/unix1.txt +21 -0
  29. data/examples/data/unix2.txt +11 -0
  30. data/examples/dbdemo.rb +495 -0
  31. data/examples/deprecated/appgmail.rb +952 -0
  32. data/examples/deprecated/splitp.rb +56 -0
  33. data/examples/deprecated/testscrolllb.rb +86 -0
  34. data/examples/deprecated/testscrollp.rb +88 -0
  35. data/examples/deprecated/testscrollta.rb +80 -0
  36. data/examples/deprecated/testscrolltable.rb +165 -0
  37. data/examples/deprecated/testsplit.rb +87 -0
  38. data/examples/deprecated/testsplit2.rb +123 -0
  39. data/examples/deprecated/testsplit3.rb +215 -0
  40. data/examples/deprecated/testsplit3_1.rb +244 -0
  41. data/examples/deprecated/testsplit3a.rb +215 -0
  42. data/examples/deprecated/testsplit3b.rb +237 -0
  43. data/examples/deprecated/testsplitta.rb +148 -0
  44. data/examples/deprecated/testsplittv.rb +142 -0
  45. data/examples/deprecated/testsplittvv.rb +144 -0
  46. data/examples/deprecated/testtpane.rb +215 -0
  47. data/examples/deprecated/testtpane2.rb +145 -0
  48. data/examples/deprecated/testtpanetable.rb +203 -0
  49. data/examples/dirtree.rb +88 -0
  50. data/examples/experimental/resultsetdemo.rb +280 -0
  51. data/examples/experimental/testmform.rb +35 -0
  52. data/examples/experimental/testscroller.rb +117 -0
  53. data/examples/experimental/teststackflow.rb +111 -0
  54. data/examples/menu1.rb +112 -0
  55. data/examples/multispl.rb +86 -0
  56. data/examples/newmessagebox.rb +131 -0
  57. data/examples/newtabbedwindow.rb +100 -0
  58. data/examples/newtesttabp.rb +121 -0
  59. data/examples/qdfilechooser.rb +68 -0
  60. data/examples/rfe.rb +1239 -0
  61. data/examples/rfe_renderer.rb +121 -0
  62. data/examples/sqlc.rb +454 -0
  63. data/examples/sqlm.rb +437 -0
  64. data/examples/sqlt.rb +408 -0
  65. data/examples/status.txt +68 -0
  66. data/examples/table1.rb +24 -0
  67. data/examples/term2.rb +84 -0
  68. data/examples/test1.rb +239 -0
  69. data/examples/test2.rb +674 -0
  70. data/examples/testapp.rb +44 -0
  71. data/examples/testapp2.rb +58 -0
  72. data/examples/testchars.rb +137 -0
  73. data/examples/testcombo.rb +91 -0
  74. data/examples/testkeypress.rb +66 -0
  75. data/examples/testlistbox.rb +113 -0
  76. data/examples/testmenu.rb +101 -0
  77. data/examples/testmulticomp.rb +70 -0
  78. data/examples/testmulticontainer.rb +94 -0
  79. data/examples/testmultispl.rb +199 -0
  80. data/examples/testree.rb +106 -0
  81. data/examples/testtable.rb +264 -0
  82. data/examples/testtabp.rb +107 -0
  83. data/examples/testtodo.rb +584 -0
  84. data/examples/testvimsplit.rb +112 -0
  85. data/examples/testwsshortcuts.rb +64 -0
  86. data/examples/testwsshortcuts2.rb +126 -0
  87. data/examples/todo.db +0 -0
  88. data/examples/todo.yml +191 -0
  89. data/examples/viewtodo.rb +574 -0
  90. data/lib/rbcurse/deprecated/README.markdown +12 -0
  91. data/lib/rbcurse/deprecated/rpad.rb +375 -0
  92. data/lib/rbcurse/deprecated/rscrollpane.rb +512 -0
  93. data/lib/rbcurse/deprecated/rsplitpane.rb +894 -0
  94. data/lib/rbcurse/deprecated/rsplitpane2.rb +1009 -0
  95. data/lib/rbcurse/deprecated/rviewport.rb +204 -0
  96. data/lib/rbcurse/deprecated/widgets/mapper.rb +130 -0
  97. data/lib/rbcurse/deprecated/widgets/rmessagebox.rb +348 -0
  98. data/lib/rbcurse/deprecated/widgets/rtabbedpane.rb +1158 -0
  99. data/lib/rbcurse/deprecated/widgets/rtabbedwindow.rb +167 -0
  100. data/lib/rbcurse/deprecated/widgets/scrollable.rb +301 -0
  101. data/lib/rbcurse/deprecated/widgets/stdscrwindow.rb +309 -0
  102. data/lib/ver/keyboard2.rb +170 -0
  103. data/test/test_rbcurse.rb +0 -0
  104. metadata +131 -9
@@ -0,0 +1,574 @@
1
+ require 'logger'
2
+ require 'rbcurse'
3
+ require 'rbcurse/core/widgets/rcombo'
4
+ require 'rbcurse/extras/widgets/rtable'
5
+ require 'rbcurse/extras/include/tableextended'
6
+ require 'rbcurse/core/widgets/keylabelprinter'
7
+ require 'rbcurse/core/widgets/applicationheader'
8
+ require 'rbcurse/core/include/action'
9
+ require 'sqlite3' # changing to sqlite3 since yml, csv a pain for updating
10
+ #require 'yaml' # 1.9 2009-10-05 13:11
11
+ ###############################
12
+ ## This uses todo.db, if not in gem, please take from github
13
+ ## Please look at testtodo.rb
14
+ ##############################
15
+
16
+ class Table
17
+ # so we can increase and decrease column width using keys
18
+ include TableExtended
19
+ end
20
+ # 2010-09-13 12:00 Added module since class names are same as testtodo
21
+ # and clashing when called from a menu
22
+ # end
23
+ module ViewTodo
24
+ class TodoList
25
+ def initialize file
26
+ @file = file
27
+ end
28
+ def load
29
+ #@todomap = YAML::load(File.open(@file));
30
+ @db = SQLite3::Database.new(@file)
31
+ #@records = convert_to_text
32
+ end
33
+ # get columns and datatypes, prefetch - copied from sqlc.rb
34
+ def get_data command
35
+ @columns, *rows = @db.execute2(command)
36
+ @content = rows
37
+ return nil if @content.nil? or @content[0].nil?
38
+ @datatypes = @content[0].types #if @datatypes.nil?
39
+ @command = command
40
+ return @content
41
+ end
42
+ def get_statuses
43
+ #@todomap['__STATUSES']
44
+ ## temporary due to structure change
45
+ #['TODO', 'TOTEST', 'TESTED']
46
+ c = get_data "select * from status"
47
+ c.flatten
48
+ end
49
+ def get_modules
50
+ #@todomap['__MODULES'].sort
51
+ ## temporary due to structure change
52
+ ['GEN', 'FIELD', 'FORM', 'TABLE']
53
+ #get_data "select * from status"
54
+ end
55
+ def get_categories
56
+ #@todomap.keys.delete_if {|k| k.match(/^__/) }
57
+ ## temporary due to structure change
58
+ #['TODO', 'FIXME','DONE']# earlier i used to keep todo items in a text file in these sections
59
+ c = get_data "select * from categ"
60
+ c.flatten
61
+ end
62
+ def get_tasks_for_category categ
63
+ get_data "select * from todo where categ = '#{categ}' "
64
+ =begin
65
+ c = @todomap[categ]
66
+ d = []
67
+ c.each_pair {|k,v|
68
+ v.each do |r|
69
+ row=[]
70
+ row << k
71
+ r.each { |r1| row << r1 }
72
+ d << row
73
+ #$log.debug " ROW = #{row.inspect} "
74
+ end
75
+ }
76
+ return d
77
+ =end
78
+ end
79
+ # today i really don't know how this differs from previous one (records vs tasks)
80
+ def get_records_for_category categ
81
+ if categ.nil? or categ == ""
82
+ #return @records
83
+ get_data "select * from todo"
84
+ else
85
+ #return @records.select { |row| row[0] == categ }
86
+ get_data "select * from todo where categ = '#{categ}' "
87
+ end
88
+ end
89
+ def sort categ, column, descending=false
90
+ d = get_records_for_category categ
91
+ d = d.sort { |y,x|
92
+ if descending
93
+ if x[column].nil?
94
+ $log.debug "sort -1"
95
+ -1
96
+ elsif y[column].nil?
97
+ $log.debug "sort 1"
98
+ 1
99
+ else
100
+ $log.debug "sort <> #{x[column]} <=> #{y[column]} "
101
+ x[column] <=> y[column]
102
+ end
103
+ else
104
+ if x[column].nil?
105
+ 1
106
+ elsif y[column].nil?
107
+ -1
108
+ else
109
+ y[column] <=> x[column]
110
+ end
111
+ end
112
+ }
113
+ return d
114
+ end
115
+ def set_tasks_for_category categ, data
116
+ d = {}
117
+ data.each do |row|
118
+ #key = row.delete_at 0
119
+ key = row.first
120
+ d[key] ||= []
121
+ d[key] << row[1..-1]
122
+ end
123
+ @todomap[categ]=d
124
+ $log.debug " NEW DATA #{categ}: #{data}"
125
+ end
126
+ def convert_to_text
127
+ d = []
128
+ cats = get_categories
129
+ cats.each do |c|
130
+ tasks = get_tasks_for_category c
131
+ tasks.each do |t|
132
+ n = t.dup
133
+ n.insert 0, c
134
+ d << n
135
+ end
136
+ end
137
+ return d
138
+ end
139
+ =begin
140
+ File.open("todo.csv", "w") { |f| YAML.dump( d, f )}
141
+ buf =''
142
+ require 'csv'
143
+ CSV.open('data/todocsv.csv', 'w') do |writer|
144
+ #writer << [nil, nil]
145
+ d.each do |row|
146
+ #parced_cells = CSV.generate_rows(row, row.size, buf)
147
+ writer << row
148
+ end
149
+ end
150
+ =end
151
+ def dump
152
+ f = "#{@file}"
153
+ #File.open(f, "w") { |f| YAML.dump( @todomap, f )}
154
+ convert_to_text
155
+ end
156
+ end # class
157
+ class TodoApp
158
+ def initialize
159
+ @window = VER::Window.root_window
160
+ @form = Form.new @window
161
+ @sort_dir = true
162
+
163
+ #@todo = TodoList.new "todo.yml"
164
+ @todo = ViewTodo::TodoList.new "todo.db"
165
+ @todo.load
166
+ end
167
+ def run
168
+ todo = @todo
169
+ statuses = todo.get_statuses
170
+ cats = todo.get_categories
171
+ cats.insert 0,""
172
+ modules = todo.get_modules
173
+ title = "TODO APP"
174
+ @header = ApplicationHeader.new @form, title, {:text2=>"Some Text", :text_center=>"Task View"}
175
+ status_row = RubyCurses::Label.new @form, {'text' => "", :row => Ncurses.LINES-4, :col => 0, :display_length=>60}
176
+ @status_row = status_row
177
+ # setting ENTER across all objects on a form
178
+ @form.bind(:ENTER) {|f| status_row.text = f.help_text unless f.help_text.nil? }
179
+ #@window.printstring 0,(Ncurses.COLS-title.length)/2,title, $datacolor
180
+ r = 1; c = 1;
181
+ categ = ComboBox.new @form do
182
+ name "categ"
183
+ row r
184
+ col 15
185
+ display_length 10
186
+ editable false
187
+ list cats
188
+ set_label Label.new @form, {'text' => "Category", 'color'=>'cyan','col'=>1, "mnemonic"=>"C"}
189
+ list_config 'height' => 4
190
+ help_text "Select a category and <TAB> out. KEY_UP, KEY_DOWN, M-Down"
191
+ end
192
+ colnames = %w[Sno Categ Module Prior Task Status Date]
193
+
194
+ colnames_cbl = colnames.dup
195
+ colnames_cbl.insert 0, ""
196
+ col_combo = ComboBox.new @form do
197
+ name "col_combo"
198
+ row r
199
+ col 45
200
+ display_length 10
201
+ editable false
202
+ list colnames_cbl
203
+ set_label Label.new @form, {'text' => "Filter on:", 'color'=>'cyan',"mnemonic"=>"F"}
204
+ list_config 'height' => 6
205
+ help_text "Select a field to filter on"
206
+ end
207
+ col_value = Field.new @form do
208
+ name "col_value"
209
+ row r+1
210
+ col 45
211
+ bgcolor 'cyan'
212
+ color 'white'
213
+ display_length 10
214
+ set_label Label.new @form, {'text' => "Pattern:", 'color'=>'cyan',:bgcolor => 'black',"mnemonic"=>"P"}
215
+ help_text "Pattern/Regex to filter on"
216
+ end
217
+ # prepopulate screen, else error in table
218
+ data = todo.get_records_for_category 'TODO' # earlier TODO
219
+ @data = data
220
+ b_filter = Button.new @form do
221
+ text "Fi&lter"
222
+ row r
223
+ col 65
224
+ help_text "Filter on selected filter column and value"
225
+ #bind(:ENTER) { status_row.text "New button adds a new row below current " }
226
+ end
227
+
228
+
229
+ table_ht = 15
230
+ atable = Table.new @form do
231
+ name "tasktable"
232
+ row r+2
233
+ col c
234
+ width 104
235
+ height table_ht
236
+ #title "A Table"
237
+ #title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
238
+ cell_editing_allowed false
239
+ set_data data, colnames
240
+ end
241
+ @atable = atable
242
+ categ.bind(:CHANGED) do |fld| $log.debug " COMBO EXIT XXXXXXXX";
243
+ data = todo.get_records_for_category fld.getvalue;
244
+ @data = data
245
+ atable.table_model.data = data
246
+ end
247
+ b_filter.command {
248
+ alert("Data is blank") if data.nil? or data.size == 0
249
+ raise("Data is blank") if data.nil? or data.size == 0
250
+ raise("selected is blank") if col_combo.selected_item.nil?
251
+ raise("col_val is blank") if col_value.getvalue.nil?
252
+
253
+ $log.debug "#{col_combo.selected_index}, .#{col_value.getvalue}"
254
+ d = data.select {|row| row[col_combo.selected_index-1].to_s.match(col_value.getvalue) }
255
+ atable.table_model.data = d unless d.nil? or d.size == 0
256
+ }
257
+
258
+ tcm = atable.get_table_column_model
259
+ #
260
+ ## key bindings fo atable
261
+ # column widths
262
+ x = 0
263
+ tcm.column(x).width 2 # RK 2010-05-11 19:59 added serial number for updating
264
+ x += 1
265
+ tcm.column(x).width 8
266
+ x += 1
267
+ tcm.column(x).width 8
268
+ x += 1
269
+ tcm.column(x).width 5
270
+ x += 1
271
+ tcm.column(x).width 50
272
+ x += 1
273
+ tcm.column(x).width 8
274
+ x += 1
275
+ tcm.column(x).width 16
276
+ app = self
277
+ atable.configure() do
278
+ #bind_key(330) { atable.remove_column(tcm.column(atable.focussed_col)) rescue "" }
279
+ #bind_key(?+) {
280
+ #acolumn = atable.column atable.focussed_col()
281
+ ##num = $multiplier || 1
282
+ #num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
283
+ #$multiplier = 0
284
+ #w = acolumn.width + num
285
+ #acolumn.width w
286
+ ##atable.table_structure_changed
287
+ #}
288
+ bind_key(?+) {
289
+ # this automatically takes care of numeric arguments such as 12+ 22+ etc
290
+ atable.increase_column
291
+ }
292
+ bind_key(?-) {
293
+ # this automatically takes care of numeric arguments such as 12- 22- etc
294
+ atable.decrease_column
295
+ }
296
+ #bind_key(?-) {
297
+ #acolumn = atable.column atable.focussed_col()
298
+ #num=(($multiplier.nil? or $multiplier == 0) ? 1 : $multiplier)
299
+ #w = acolumn.width - num
300
+ #$multiplier = 0
301
+ #if w > 3
302
+ #acolumn.width w
303
+ ##atable.table_structure_changed
304
+ #end
305
+ #}
306
+ bind_key(?>) {
307
+ colcount = tcm.column_count-1
308
+ #atable.move_column sel_col.value, sel_col.value+1 unless sel_col.value == colcount
309
+ col = atable.focussed_col
310
+ atable.move_column col, col+1 unless col == colcount
311
+ }
312
+ bind_key(?<) {
313
+ col = atable.focussed_col
314
+ atable.move_column col, col-1 unless col == 0
315
+ #atable.move_column sel_col.value, sel_col.value-1 unless sel_col.value == 0
316
+ }
317
+ bind_key(?\M-h, app) {|tab,td| $log.debug " BIND... #{tab.class}, #{td.class}"; app.make_popup atable}
318
+ end
319
+ #keylabel = RubyCurses::Label.new @form, {'text' => "", "row" => r+table_ht+3, "col" => c, "color" => "yellow", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
320
+ #eventlabel = RubyCurses::Label.new @form, {'text' => "Events:", "row" => r+table_ht+6, "col" => c, "color" => "white", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
321
+
322
+ # report some events
323
+ #atable.table_model.bind(:TABLE_MODEL_EVENT){|e| #eventlabel.text = "Event: #{e}"}
324
+ #atable.get_table_column_model.bind(:TABLE_COLUMN_MODEL_EVENT){|e| eventlabel.text = "Event: #{e}"}
325
+ atable.bind(:TABLE_TRAVERSAL_EVENT){|e| @header.text_right "Row #{e.newrow+1} of #{atable.row_count}" }
326
+
327
+
328
+ #str_renderer = TableCellRenderer.new ""
329
+ #num_renderer = TableCellRenderer.new "", { "justify" => :right }
330
+ #bool_renderer = CheckBoxCellRenderer.new "", {"parent" => atable, "display_length"=>5}
331
+ #combo_renderer = RubyCurses::ComboBoxCellRenderer.new nil, {"parent" => atable, "display_length"=> 8}
332
+ #combo_editor = RubyCurses::CellEditor.new(RubyCurses::ComboBox.new nil, {"focusable"=>false, "visible"=>false, "list"=>statuses, "display_length"=>8})
333
+ #combo_editor1 = RubyCurses::CellEditor.new(RubyCurses::ComboBox.new nil, {"focusable"=>false, "visible"=>false, "list"=>modules, "display_length"=>8})
334
+ #atable.set_default_cell_renderer_for_class "String", str_renderer
335
+ #atable.set_default_cell_renderer_for_class "Fixnum", num_renderer
336
+ #atable.set_default_cell_renderer_for_class "Float", num_renderer
337
+ #atable.set_default_cell_renderer_for_class "TrueClass", bool_renderer
338
+ #atable.set_default_cell_renderer_for_class "FalseClass", bool_renderer
339
+ #atable.get_table_column_model.column(3).cell_editor = combo_editor
340
+ #atable.get_table_column_model.column(0).cell_editor = combo_editor1
341
+ #ce = atable.get_default_cell_editor_for_class "String"
342
+ # increase the maxlen of task
343
+ #ce.component.maxlen = 80
344
+ # I want up and down to go up and down rows inside the combo box, i can use M-down for changing.
345
+ #combo_editor.component.unbind_key(KEY_UP)
346
+ #combo_editor.component.unbind_key(KEY_DOWN)
347
+ #combo_editor1.component.unbind_key(KEY_UP)
348
+ #combo_editor1.component.unbind_key(KEY_DOWN)
349
+ buttrow = r+table_ht+8 #Ncurses.LINES-4
350
+ buttrow = Ncurses.LINES-5
351
+ create_table_actions atable, todo, data, categ.getvalue
352
+ =begin
353
+ b_newrow = Button.new @form do
354
+ text "&New"
355
+ row buttrow
356
+ col c+10
357
+ bind(:ENTER) { status_row.text "New button adds a new row below current " }
358
+ end
359
+ b_newrow.command { @new_act.call }
360
+ =end
361
+ ## We use Action to create a button: to test out ampersand with MI and Button
362
+ new_act = @new_act
363
+ # using ampersand to set mnemonic
364
+ b_sort = Button.new @form do
365
+ text "&Sort"
366
+ row buttrow
367
+ col c+25
368
+ #bind(:ENTER) { status_row.text "Deletes focussed row" }
369
+ help_text "Sort focussed row"
370
+ end
371
+ b_sort.command {
372
+ if @sorted_key == atable.focussed_col
373
+ @sort_dir = !@sort_dir
374
+ else
375
+ @sort_dir = true
376
+ end
377
+ @sorted_key = atable.focussed_col
378
+
379
+ $log.debug " SORT = #{categ.getvalue}, #{atable.focussed_col}, sort:#{@sort_dir}"
380
+ d = @todo.sort categ.getvalue, atable.focussed_col, @sort_dir
381
+ atable.table_model.data = d
382
+ }
383
+ =begin
384
+ b_change = Button.new @form do
385
+ text "&Lock"
386
+ row buttrow
387
+ col c+35
388
+ command {
389
+ r = atable.focussed_row
390
+ #c = sel_col.value
391
+ #$log.debug " Update gets #{field.getvalue.class}"
392
+ #atable.set_value_at(r, c, field.getvalue)
393
+ toggle = atable.column(atable.focussed_col()).editable
394
+ if toggle.nil? or toggle==true
395
+ toggle = false
396
+ text "Un&lock"
397
+ else
398
+ toggle = true
399
+ text "&Lock "
400
+ end
401
+ #eventlabel.text "Set column #{atable.focussed_col()} editable to #{toggle}"
402
+ atable.column(atable.focussed_col()).editable toggle
403
+ alert("Set column #{atable.focussed_col()} editable to #{toggle}")
404
+ }
405
+ help_text "Toggles editable state of current column "
406
+ end
407
+ =end
408
+ #buttons = [b_save, b_newrow, b_delrow, b_move ]
409
+ #Button.button_layout buttons, buttrow
410
+ @klp = RubyCurses::KeyLabelPrinter.new @form, get_key_labels
411
+ @klp.set_key_labels get_key_labels_table, :table
412
+ atable.bind(:ENTER){ @klp.mode :table ;
413
+ }
414
+ atable.bind(:LEAVE){@klp.mode :normal;
415
+ }
416
+
417
+
418
+ @form.repaint
419
+ @window.wrefresh
420
+ Ncurses::Panel.update_panels
421
+ begin
422
+ while((ch = @window.getchar()) != ?\C-q.getbyte(0) )
423
+ colcount = tcm.column_count-1
424
+ s = keycode_tos ch
425
+ #status_row.text = "Pressed #{ch} , #{s}"
426
+ @form.handle_key(ch)
427
+
428
+ @form.repaint
429
+ @window.wrefresh
430
+ end
431
+ ensure
432
+ @window.destroy if !@window.nil?
433
+ end
434
+ end
435
+ # Adding was done in testtodo.rb. this is view only
436
+ def create_table_actions atable, todo, data, categ
437
+ #@new_act = Action.new("New Row", "mnemonic"=>"N") {
438
+ @new_act = Action.new("&New Row") {
439
+ cc = atable.get_table_column_model.column_count
440
+ if atable.row_count < 1
441
+ categ = nil
442
+ frow = 0
443
+ else
444
+ frow = atable.focussed_row
445
+ categ = atable.get_value_at(frow,1)
446
+ frow += 1
447
+ end
448
+ tmp = [nil, categ, "", 5, "", "TODO", Time.now]
449
+ tm = atable.table_model
450
+ tm.insert frow, tmp
451
+ atable.set_focus_on frow
452
+ @status_row.text = "Added a row. Please press Save before changing Category."
453
+ alert("Added a row below current one. Use C-k to clear task.")
454
+ }
455
+ @new_act.accelerator "Alt-N"
456
+ @save_cmd = lambda {
457
+ todo.set_tasks_for_category categ, data
458
+ todo.dump
459
+ alert("Rewritten yaml file")
460
+ }
461
+ @del_cmd = lambda {
462
+ row = atable.focussed_row
463
+ if confirm("Do your really want to delete row #{row+1}?")== :YES
464
+ tm = atable.table_model
465
+ tm.delete_at row
466
+ else
467
+ @status_row.text = "Delete cancelled"
468
+ end
469
+ }
470
+
471
+ end
472
+ def make_popup table
473
+ require 'rbcurse/extras/widgets/rpopupmenu'
474
+ tablemenu = RubyCurses::PopupMenu.new "Table"
475
+ #tablemenu.add(item = RubyCurses::PMenuItem.new("Open",'O'))
476
+ tablemenu.add(item = RubyCurses::PMenuItem.new("&Open"))
477
+
478
+ tablemenu.insert_separator 1
479
+ #tablemenu.add(RubyCurses::PMenuItem.new "New",'N')
480
+ tablemenu.add(@new_act)
481
+ tablemenu.add(item = RubyCurses::PMenuItem.new("&Save"))
482
+ item.command() { @save_cmd.call }
483
+
484
+ item=RubyCurses::PMenuItem.new "Select"
485
+ item.accelerator = "Ctrl-X"
486
+ item.command() { table.toggle_row_selection() }
487
+ #item.enabled = false
488
+ tablemenu.add(item)
489
+
490
+ item=RubyCurses::PMenuItem.new "Clr Selection"
491
+ item.accelerator = "Alt-e"
492
+ item.command() { table.clear_selection() }
493
+ item.enabled = table.selected_row_count > 0 ? true : false
494
+ tablemenu.add(item)
495
+
496
+ item=RubyCurses::PMenuItem.new "Delete"
497
+ item.accelerator = "Alt-D"
498
+ item.command() { @del_cmd.call }
499
+ tablemenu.add(item)
500
+
501
+ gotomenu = RubyCurses::PMenu.new "&Goto"
502
+
503
+ item = RubyCurses::PMenuItem.new "Top"
504
+ item.accelerator = "Alt-0"
505
+ item.command() { table.goto_top }
506
+ gotomenu.add(item)
507
+
508
+ item = RubyCurses::PMenuItem.new "Bottom"
509
+ item.accelerator = "Alt-9"
510
+ item.command() { table.goto_bottom }
511
+ gotomenu.add(item)
512
+
513
+ item = RubyCurses::PMenuItem.new "Next Page"
514
+ item.accelerator = "Ctrl-n"
515
+ item.command() { table.scroll_forward }
516
+ gotomenu.add(item)
517
+
518
+ item = RubyCurses::PMenuItem.new "Prev Page"
519
+ item.accelerator = "Ctrl-p"
520
+ item.command() { table.scroll_backward }
521
+ gotomenu.add(item)
522
+
523
+ tablemenu.add(gotomenu)
524
+
525
+
526
+ tablemenu.show @atable, 0,1
527
+ end
528
+ def get_key_labels
529
+ key_labels = [
530
+ ['C-q', 'Exit'], nil,
531
+ ['M-c', 'Category'], nil,
532
+ ['M-f', 'Filter Fld'], ['M-p', 'Pattern'],
533
+ ['M-s', 'Sort'], ['M-i', 'Filter']
534
+ ]
535
+ return key_labels
536
+ end
537
+ def get_key_labels_table
538
+ key_labels = [
539
+ #['M-n','NewRow'], ['M-d','DelRow'],
540
+ ['C-x','Select'], ['M-h', 'Popup'],
541
+ ['M-0', 'Top'], ['M-9', 'End'],
542
+ ['C-p', 'PgUp'], ['C-n', 'PgDn'],
543
+ ['M-Tab','Nxt Fld'], ['Tab','Nxt Col'],
544
+ ['+','Widen'], ['-','Narrow']
545
+ ]
546
+ return key_labels
547
+ end
548
+ end
549
+ end # module
550
+ if $0 == __FILE__
551
+ include RubyCurses
552
+ include RubyCurses::Utils
553
+
554
+ begin
555
+ # Initialize curses
556
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
557
+ $log = Logger.new("rbc13.log")
558
+ $log.level = Logger::DEBUG
559
+
560
+ colors = Ncurses.COLORS
561
+
562
+ catch(:close) do
563
+ t = ViewTodo::TodoApp.new
564
+ t.run
565
+ end
566
+ rescue => ex
567
+ ensure
568
+ VER::stop_ncurses
569
+ p ex if ex
570
+ p(ex.backtrace.join("\n")) if ex
571
+ $log.debug( ex) if ex
572
+ $log.debug(ex.backtrace.join("\n")) if ex
573
+ end
574
+ end