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,584 @@
1
+ require 'logger'
2
+ require 'rbcurse'
3
+ require 'rbcurse/core/widgets/rcombo'
4
+ require 'rbcurse/extras/widgets/rtable'
5
+ require 'rbcurse/extras/include/celleditor'
6
+ #require 'rbcurse/table/tablecellrenderer'
7
+ require 'rbcurse/extras/include/comboboxcellrenderer'
8
+ require 'rbcurse/core/widgets/keylabelprinter'
9
+ require 'rbcurse/core/widgets/applicationheader'
10
+ require 'rbcurse/core/include/action'
11
+
12
+ include RubyCurses
13
+ include RubyCurses::Utils # this was resulting in get_color crashing
14
+ # in rpopupmenu when called from CL, when it was inside _FILE_ block.
15
+ # TODO move the csv to a database so you can update. this sucketh.
16
+ #
17
+ module TestTodo
18
+ class TodoList
19
+ def initialize file
20
+ @file = file
21
+ end
22
+ def load
23
+ #@todomap = YAML::load(File.open(@file));
24
+ @data =[]
25
+ @statuses=[]
26
+ @categories=[]
27
+ @modules=[]
28
+ require 'csv'
29
+ #CSV::Reader.parse(File.open(@file, 'r')) do |row|
30
+ CSV.foreach(@file) do |row| # 1.9 2009-10-05 11:12
31
+ @data << row
32
+ $log.debug " #{row.inspect} "
33
+ @categories << row[0] unless @categories.include? row[0]
34
+ @statuses << row[4] unless @statuses.include? row[4]
35
+ @modules << row[1] unless @modules.include? row[1]
36
+ end
37
+ $log.debug " MOD #{@modules}"
38
+ end
39
+ def get_statuses
40
+ # @todomap['__STATUSES']
41
+ @statuses
42
+ end
43
+ def get_modules
44
+ #@todomap['__MODULES'].sort
45
+ @modules.sort
46
+ end
47
+ def get_categories
48
+ #@todomap.keys.delete_if {|k| k.match(/^__/) }
49
+ @categories
50
+ end
51
+ def get_tasks_for_category categ
52
+ @data.select do |row|
53
+ row[0] == categ
54
+ end
55
+ end
56
+ def insert_task_for_category task, categ
57
+ task[0] = categ
58
+ @data << task
59
+ end
60
+ def delete_task task
61
+ @data.delete task
62
+ end
63
+ def oldget_tasks_for_category categ
64
+ c = @todomap[categ]
65
+ d = []
66
+ c.each_pair {|k,v|
67
+ v.each do |r|
68
+ row=[]
69
+ row << k
70
+ r.each { |r1| row << r1 }
71
+ d << row
72
+ #$log.debug " ROW = #{row.inspect} "
73
+ end
74
+ }
75
+ return d
76
+ end
77
+ def set_tasks_for_category categ, data
78
+ $log.debug " def set_tasks_for_category #{categ}, #{data.size} old #{@data.size}"
79
+ @data.delete_if { |row| row[0] == categ }
80
+ $log.debug " 2 def set_tasks_for_category #{categ}, #{data.size} old #{@data.size}"
81
+ data.each { |row| row[0] = categ }
82
+ @data.insert -1, *data
83
+ $log.debug " 3 def set_tasks_for_category #{categ}, #{data.size} old #{@data.size}"
84
+ end
85
+ def old_set_tasks_for_category categ, data
86
+ d = {}
87
+ data.each do |row|
88
+ #key = row.delete_at 0
89
+ key = row.first
90
+ d[key] ||= []
91
+ d[key] << row[1..-1]
92
+ end
93
+ @todomap[categ]=d
94
+ $log.debug " NEW DATA #{categ}: #{data}"
95
+ end
96
+ def convert_to_text
97
+ =begin
98
+ d = []
99
+ cats = get_categories
100
+ cats.each do |c|
101
+ tasks = get_tasks_for_category c
102
+ tasks.each do |t|
103
+ n = t.dup
104
+ n.insert 0, c
105
+ d << n
106
+ end
107
+ end
108
+ #File.open("todo.yml", "w") { |f| YAML.dump( d, f )}
109
+ buf =''
110
+ =end
111
+ d = @data
112
+ require 'csv'
113
+ #CSV.open('todocsv.csv', 'w') do |writer|
114
+ CSV.open("data/todocsv.csv", "w") do |writer|
115
+ #writer << [nil, nil]
116
+ d.each do |row|
117
+ #parced_cells = CSV.generate_rows(row, row.size, buf)
118
+ writer << row
119
+ end
120
+ end
121
+ end
122
+ def dump
123
+ f = "#{@file}"
124
+ #File.open(f, "w") { |f| YAML.dump( @todomap, f )}
125
+ convert_to_text
126
+ end
127
+ end
128
+ class TodoApp
129
+ def initialize
130
+ @window = VER::Window.root_window
131
+ @form = Form.new @window
132
+
133
+ @todo = TestTodo::TodoList.new "todocsv.csv"
134
+ @todo.load
135
+ end
136
+ def get_key_labels
137
+ key_labels = [
138
+ ['C-q', 'Exit'], nil,
139
+ ['M-s', 'Save'], ['M-m', 'Move']
140
+ ]
141
+ return key_labels
142
+ end
143
+ def get_key_labels_table
144
+ key_labels = [
145
+ ['M-n','NewRow'], ['M-d','DelRow'],
146
+ ['C-x','Select'], nil,
147
+ ['M-0', 'Top'], ['M-9', 'End'],
148
+ ['C-p', 'PgUp'], ['C-n', 'PgDn'],
149
+ ['M-Tab','Nxt Fld'], ['Tab','Nxt Col'],
150
+ ['+','Widen'], ['-','Narrow']
151
+ ]
152
+ return key_labels
153
+ end
154
+ def make_popup table
155
+ require 'rbcurse/extras/widgets/rpopupmenu'
156
+ tablemenu = RubyCurses::PopupMenu.new "Table"
157
+ #tablemenu.add(item = RubyCurses::PMenuItem.new("Open",'O'))
158
+ tablemenu.add(item = RubyCurses::PMenuItem.new("&Open"))
159
+
160
+ tablemenu.insert_separator 1
161
+ #tablemenu.add(RubyCurses::PMenuItem.new "New",'N')
162
+ tablemenu.add(@new_act)
163
+ tablemenu.add(item = RubyCurses::PMenuItem.new("&Save"))
164
+ item.command() { @save_cmd.call }
165
+
166
+ item=RubyCurses::PMenuItem.new "Select"
167
+ item.accelerator = "Ctrl-X"
168
+ item.command() { table.toggle_row_selection() }
169
+ #item.enabled = false
170
+ tablemenu.add(item)
171
+
172
+ item=RubyCurses::PMenuItem.new "Clr Selection"
173
+ item.accelerator = "Alt-e"
174
+ item.command() { table.clear_selection() }
175
+ item.enabled = table.selected_row_count > 0 ? true : false
176
+ tablemenu.add(item)
177
+
178
+ item=RubyCurses::PMenuItem.new "Delete"
179
+ item.accelerator = "Alt-D"
180
+ item.command() { @del_cmd.call }
181
+ tablemenu.add(item)
182
+
183
+ gotomenu = RubyCurses::PMenu.new "&Goto"
184
+
185
+ item = RubyCurses::PMenuItem.new "Top"
186
+ item.accelerator = "Alt-0"
187
+ item.command() { table.goto_top }
188
+ gotomenu.add(item)
189
+
190
+ item = RubyCurses::PMenuItem.new "Bottom"
191
+ item.accelerator = "Alt-9"
192
+ item.command() { table.goto_bottom }
193
+ gotomenu.add(item)
194
+
195
+ item = RubyCurses::PMenuItem.new "Next Page"
196
+ item.accelerator = "Ctrl-n"
197
+ item.command() { table.scroll_forward }
198
+ gotomenu.add(item)
199
+
200
+ item = RubyCurses::PMenuItem.new "Prev Page"
201
+ item.accelerator = "Ctrl-p"
202
+ item.command() { table.scroll_backward }
203
+ gotomenu.add(item)
204
+
205
+ tablemenu.add(gotomenu)
206
+
207
+ searchmenu = RubyCurses::PMenu.new "&Search"
208
+
209
+ item = RubyCurses::PMenuItem.new "Find forward"
210
+ item.accelerator = "Alt-f"
211
+ item.command() { table.ask_search_forward }
212
+ searchmenu.add(item)
213
+
214
+ item = RubyCurses::PMenuItem.new "Find backward"
215
+ item.accelerator = "Alt-F"
216
+ item.command() { table.ask_search_backward }
217
+ searchmenu.add(item)
218
+
219
+ item = RubyCurses::PMenuItem.new "Find Next"
220
+ item.accelerator = "Alt-g"
221
+ item.enabled = false if table.table_model.last_regex.nil?
222
+ item.command() { table.find_next }
223
+ searchmenu.add(item)
224
+
225
+ item = RubyCurses::PMenuItem.new "Find Prev"
226
+ item.accelerator = "Alt-G"
227
+ item.enabled = false if table.table_model.last_regex.nil?
228
+ item.command() { table.find_prev }
229
+ searchmenu.add(item)
230
+
231
+ tablemenu.add(searchmenu)
232
+
233
+ tablemenu.show @atable, 0,1
234
+ end
235
+ def run
236
+ todo = @todo
237
+ statuses = todo.get_statuses
238
+ cats = todo.get_categories
239
+ modules = todo.get_modules
240
+ title = "TODO APP"
241
+ @header = ApplicationHeader.new @form, title, {:text2=>"Some Text", :text_center=>"Task Entry"}
242
+ status_row = RubyCurses::Label.new @form, {'text' => "", :row => Ncurses.LINES-4, :col => 0, :display_length=>60}
243
+ @status_row = status_row
244
+ $error_message.update_command { status_row.text = $error_message.value }
245
+ # setting ENTER across all objects on a form
246
+ @form.bind(:ENTER) {|f| status_row.text = f.help_text unless f.help_text.nil? }
247
+ #@window.printstring 0,(Ncurses.COLS-title.length)/2,title, $datacolor
248
+ r = 1; c = 1;
249
+ categ = ComboBox.new @form do
250
+ name "categ"
251
+ row r
252
+ col 15
253
+ display_length 10
254
+ editable false
255
+ list cats
256
+ set_buffer 'TODO'
257
+ set_label Label.new @form, {'text' => "Category", 'color'=>'cyan','col'=>1, "mnemonic"=>"C"}
258
+ list_config 'height' => 4
259
+ help_text "Select a category and <TAB> out. KEY_UP, KEY_DOWN, M-Down"
260
+ bind(:LEAVE){ status_row.text "" }
261
+ end
262
+ data = todo.get_tasks_for_category 'TODO'
263
+ @data = data
264
+ $log.debug " data is #{data}"
265
+ colnames = %w[ Categ Module Prior Task Status]
266
+
267
+ table_ht = 15
268
+ atable = Table.new @form do
269
+ name "tasktable"
270
+ row r+2
271
+ col c
272
+ width 84
273
+ height table_ht
274
+ #title "A Table"
275
+ #title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
276
+ cell_editing_allowed true
277
+ editing_policy :EDITING_AUTO
278
+ set_data data, colnames
279
+ end
280
+ @atable = atable
281
+ categ.bind(:CHANGED) do |fld| $log.debug " COMBO EXIT XXXXXXXX";
282
+ data = todo.get_tasks_for_category fld.getvalue;
283
+ @data = data
284
+ $log.debug " DATA is #{data.inspect} : #{data.length}"
285
+ data = [['FIXME',nil, 5, "NEW ", "TODO", Time.now]] if data.nil? or data.empty? or data.size == 0
286
+ #$log.debug " DATA is #{data.inspect} : #{data.length}"
287
+ atable.table_model.data = data
288
+ end
289
+
290
+ tcm = atable.get_table_column_model
291
+ #
292
+ ## key bindings fo atable
293
+ # column widths
294
+ #$log.debug " tcm #{tcm.inspect}"
295
+ #$log.debug " tcms #{tcm.columns}"
296
+ tcm.column(0).width 5
297
+ tcm.column(0).editable false
298
+ tcm.column(1).width 8
299
+ tcm.column(2).width 5
300
+ tcm.column(3).width 50
301
+ tcm.column(3).edit_length 80
302
+ tcm.column(4).width 8
303
+ app = self
304
+ atable.configure() do
305
+ #bind_key(330) { atable.remove_column(tcm.column(atable.focussed_col)) rescue "" }
306
+ bind_key(?+) {
307
+ acolumn = atable.column atable.focussed_col()
308
+ w = acolumn.width + 1
309
+ acolumn.width w
310
+ #atable.table_structure_changed
311
+ }
312
+ bind_key(?-) {
313
+ acolumn = atable.column atable.focussed_col()
314
+ w = acolumn.width - 1
315
+ if w > 3
316
+ acolumn.width w
317
+ #atable.table_structure_changed
318
+ end
319
+ }
320
+ bind_key(?>) {
321
+ colcount = tcm.column_count-1
322
+ #atable.move_column sel_col.value, sel_col.value+1 unless sel_col.value == colcount
323
+ col = atable.focussed_col
324
+ atable.move_column col, col+1 unless col == colcount
325
+ }
326
+ bind_key(?<) {
327
+ col = atable.focussed_col
328
+ atable.move_column col, col-1 unless col == 0
329
+ #atable.move_column sel_col.value, sel_col.value-1 unless sel_col.value == 0
330
+ }
331
+ bind_key(?\M-h, app) {|tab,td| $log.debug " BIND... #{tab.class}, #{td.class}"; app.make_popup atable}
332
+ end
333
+ #keylabel = RubyCurses::Label.new @form, {'text' => "", "row" => r+table_ht+3, "col" => c, "color" => "yellow", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
334
+ #eventlabel = RubyCurses::Label.new @form, {'text' => "Events:", "row" => r+table_ht+6, "col" => c, "color" => "white", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
335
+
336
+ # report some events
337
+ #atable.table_model.bind(:TABLE_MODEL_EVENT){|e| #eventlabel.text = "Event: #{e}"}
338
+ #atable.get_table_column_model.bind(:TABLE_COLUMN_MODEL_EVENT){|e| eventlabel.text = "Event: #{e}"}
339
+ atable.bind(:TABLE_TRAVERSAL_EVENT){|e| @header.text_right "Row #{e.newrow+1} of #{atable.row_count}" }
340
+
341
+
342
+ str_renderer = TableCellRenderer.new ""
343
+ num_renderer = TableCellRenderer.new "", { "justify" => :right }
344
+ bool_renderer = CheckBoxCellRenderer.new "", {"parent" => atable, "display_length"=>5}
345
+ combo_renderer = RubyCurses::ComboBoxCellRenderer.new nil, {"parent" => atable, "display_length"=> 8}
346
+ combo_editor = RubyCurses::CellEditor.new(RubyCurses::ComboBox.new nil, {"focusable"=>false, "visible"=>false, "list"=>statuses, "display_length"=>8})
347
+ combo_editor1 = RubyCurses::CellEditor.new(RubyCurses::ComboBox.new nil, {"focusable"=>false, "visible"=>false, "list"=>modules, "display_length"=>8})
348
+ atable.set_default_cell_renderer_for_class "String", str_renderer
349
+ atable.set_default_cell_renderer_for_class "Fixnum", num_renderer
350
+ atable.set_default_cell_renderer_for_class "Float", num_renderer
351
+ atable.set_default_cell_renderer_for_class "TrueClass", bool_renderer
352
+ atable.set_default_cell_renderer_for_class "FalseClass", bool_renderer
353
+ atable.get_table_column_model.column(4).cell_editor = combo_editor
354
+ atable.get_table_column_model.column(1).cell_editor = combo_editor1
355
+ ce = atable.get_default_cell_editor_for_class "String"
356
+ # increase the maxlen of task
357
+ # ce.component.maxlen = 80 # this is obsolete, use edit_length
358
+ # I want up and down to go up and down rows inside the combo box, i can use M-down for changing.
359
+ combo_editor.component.unbind_key(KEY_UP)
360
+ combo_editor.component.unbind_key(KEY_DOWN)
361
+ combo_editor1.component.unbind_key(KEY_UP)
362
+ combo_editor1.component.unbind_key(KEY_DOWN)
363
+ atable.bind(:TABLE_EDITING_EVENT) do |evt|
364
+ #return if evt.oldvalue != evt.newvalue
365
+ $log.debug " TABLE_EDITING : #{evt} "
366
+ if evt.type == :EDITING_STOPPED
367
+ if evt.col == 3
368
+ if @data[evt.row].size == 4
369
+ @data[evt.row] << Time.now
370
+ else
371
+ @data[evt.row][4] == Time.now
372
+ end
373
+ end
374
+ end
375
+ end
376
+ #combo_editor.component.bind(:LEAVE){ alert "LEAVE"; $log.debug " LEAVE FIRED" }
377
+ buttrow = r+table_ht+8 #Ncurses.LINES-4
378
+ buttrow = Ncurses.LINES-5
379
+ create_table_actions atable, todo, data, categ.getvalue
380
+ save_cmd = @save_cmd
381
+ b_save = Button.new @form do
382
+ text "&Save"
383
+ row buttrow
384
+ col c
385
+ command {
386
+ save_cmd.call
387
+ }
388
+ help_text "Save changes to todo.yml "
389
+ end
390
+ =begin
391
+ b_newrow = Button.new @form do
392
+ text "&New"
393
+ row buttrow
394
+ col c+10
395
+ bind(:ENTER) { status_row.text "New button adds a new row below current " }
396
+ end
397
+ b_newrow.command { @new_act.call }
398
+ =end
399
+ ## We use Action to create a button: to test out ampersand with MI and Button
400
+ new_act = @new_act
401
+ b_newrow = Button.new @form do
402
+ action new_act
403
+ row buttrow
404
+ col c+10
405
+ help_text "New button adds a new row below current "
406
+ #bind(:ENTER) { status_row.text "New button adds a new row below current " }
407
+ end
408
+
409
+ # using ampersand to set mnemonic
410
+ b_delrow = Button.new @form do
411
+ text "&Delete"
412
+ row buttrow
413
+ col c+25
414
+ #bind(:ENTER) { status_row.text "Deletes focussed row" }
415
+ help_text "Deletes focussed row"
416
+ end
417
+ b_delrow.command {
418
+ @del_cmd.call
419
+ }
420
+ =begin
421
+ b_change = Button.new @form do
422
+ text "&Lock"
423
+ row buttrow
424
+ col c+35
425
+ command {
426
+ r = atable.focussed_row
427
+ #c = sel_col.value
428
+ #$log.debug " Update gets #{field.getvalue.class}"
429
+ #atable.set_value_at(r, c, field.getvalue)
430
+ toggle = atable.column(atable.focussed_col()).editable
431
+ if toggle.nil? or toggle==true
432
+ toggle = false
433
+ text "Un&lock"
434
+ else
435
+ toggle = true
436
+ text "&Lock "
437
+ end
438
+ #eventlabel.text "Set column #{atable.focussed_col()} editable to #{toggle}"
439
+ atable.column(atable.focussed_col()).editable toggle
440
+ alert("Set column #{atable.focussed_col()} editable to #{toggle}")
441
+ }
442
+ help_text "Toggles editable state of current column "
443
+ end
444
+ =end
445
+ b_move = Button.new @form do
446
+ text "&Move"
447
+ row buttrow
448
+ col c+45
449
+ help_text "Move current row to Done"
450
+ end
451
+ b_move.command { |form|
452
+ #mods = cats.delete categ.getvalue
453
+
454
+ mods = cats - [categ.getvalue]
455
+ @mb = RubyCurses::MessageBox.new do
456
+ title "Change Module"
457
+ message "Move to? "
458
+ type :custom
459
+ button_type :custom
460
+ buttons mods
461
+ end
462
+ #return if categ.getvalue == "DONE"
463
+ amod = mods[@mb.selected_index]
464
+ row = atable.focussed_row
465
+ d = todo.get_tasks_for_category amod
466
+ $log.debug " retrieved #{d.size} rows for #{amod}"
467
+ r = []
468
+ tcm = atable.table_column_model
469
+ tcm.each_with_index do |acol, colix|
470
+ r << atable.get_value_at(row, colix)
471
+ end
472
+ # here i ignore the 5th row tht coud have been added
473
+ r << Time.now
474
+ d << r
475
+ $log.debug " sending #{d.size} rows for #{amod}"
476
+ todo.set_tasks_for_category amod, d
477
+ $log.debug " MOVE #{data.size} rows for #{categ.getvalue}"
478
+ tm = atable.table_model
479
+ ret = tm.delete_at row
480
+ $log.debug " MOVE after del #{data.size} rows for #{categ.getvalue}"
481
+ todo.set_tasks_for_category categ.getvalue, data
482
+ alert("Moved row #{row} to #{amod}.")
483
+ }
484
+ b_view = Button.new @form do
485
+ text "View"
486
+ row r
487
+ col 65
488
+ help_text "View sort and filter tasks in another window"
489
+ command { require './viewtodo'; todo = ViewTodo::TodoApp.new; todo.run }
490
+ end
491
+ buttons = [b_save, b_newrow, b_delrow, b_move , b_view ]
492
+ Button.button_layout buttons, buttrow
493
+ @klp = RubyCurses::KeyLabelPrinter.new @form, get_key_labels
494
+ @klp.set_key_labels get_key_labels_table, :table
495
+ atable.bind(:ENTER){ @klp.mode :table ;
496
+ status_row.text = "Please press Save (M-s) before changing Category."
497
+ }
498
+ atable.bind(:LEAVE){@klp.mode :normal;
499
+ }
500
+
501
+
502
+ @form.repaint
503
+ @window.wrefresh
504
+ Ncurses::Panel.update_panels
505
+ begin
506
+ while((ch = @window.getchar()) != ?\C-q.getbyte(0) )
507
+ colcount = tcm.column_count-1
508
+ #s = keycode_tos ch
509
+ #status_row.text = "Pressed #{ch} , #{s}"
510
+ @form.handle_key(ch)
511
+
512
+ @form.repaint
513
+ @window.wrefresh
514
+ end
515
+ ensure
516
+ @window.destroy if !@window.nil?
517
+ end
518
+ end
519
+ def create_table_actions atable, todo, data, categ
520
+ #@new_act = Action.new("New Row", "mnemonic"=>"N") {
521
+ @new_act = Action.new("&New Row") {
522
+ mod = nil
523
+ cat = 'TODO'
524
+ cc = atable.get_table_column_model.column_count
525
+ if atable.row_count < 1
526
+ frow = 0
527
+ else
528
+ frow = atable.focussed_row
529
+ #frow += 1 # why ?
530
+ cat = atable.get_value_at(frow,0) unless frow.nil?
531
+ mod = atable.get_value_at(frow,1) unless frow.nil?
532
+ end
533
+ tmp = [cat,mod, 5, "", "TODO", Time.now]
534
+ tm = atable.table_model
535
+ tm.insert frow, tmp
536
+ atable.set_focus_on frow
537
+ @status_row.text = "Added a row. Please press Save before changing Category."
538
+ alert("Added a row before current one. Use C-k to clear task.")
539
+ }
540
+ @new_act.accelerator "Alt-N"
541
+ @save_cmd = lambda {
542
+ todo.set_tasks_for_category categ, data
543
+ todo.dump
544
+ alert("Rewritten csv file")
545
+ }
546
+ @del_cmd = lambda {
547
+ row = atable.focussed_row
548
+ if !row.nil?
549
+ if confirm("Do your really want to delete row #{row+1}?")== :YES
550
+ tm = atable.table_model
551
+ tm.delete_at row
552
+ else
553
+ @status_row.text = "Delete cancelled"
554
+ end
555
+ end
556
+ }
557
+
558
+ end
559
+ end
560
+ if $0 == __FILE__
561
+
562
+ begin
563
+ # Initialize curses
564
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
565
+ $log = Logger.new((File.join(ENV["LOGDIR"] || "./" ,"rbc13.log")))
566
+ $log.level = Logger::DEBUG
567
+
568
+ colors = Ncurses.COLORS
569
+ $log.debug "START #{colors} colors ---------"
570
+
571
+ catch(:close) do
572
+ t = TestTodo::TodoApp.new
573
+ t.run
574
+ end
575
+ rescue => ex
576
+ ensure
577
+ VER::stop_ncurses
578
+ p ex if ex
579
+ p(ex.backtrace.join("\n")) if ex
580
+ $log.debug( ex) if ex
581
+ $log.debug(ex.backtrace.join("\n")) if ex
582
+ end
583
+ end
584
+ end