rbcurse 0.1.1 → 0.1.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.
data/examples/sqlc.rb ADDED
@@ -0,0 +1,419 @@
1
+ require 'rubygems'
2
+ require 'ncurses'
3
+ require 'logger'
4
+ require 'sqlite3'
5
+ require 'rbcurse'
6
+ require 'rbcurse/rcombo'
7
+ require 'rbcurse/rtextarea'
8
+ require 'rbcurse/rtable'
9
+ #require 'rbcurse/table/tablecellrenderer'
10
+ require 'rbcurse/comboboxcellrenderer'
11
+ require 'rbcurse/keylabelprinter'
12
+ require 'rbcurse/applicationheader'
13
+ require 'rbcurse/action'
14
+
15
+ # pls get testd.db from
16
+ # http://www.benegal.org/files/screen/testd.db
17
+ # or put some other sqlite3 db name there.
18
+
19
+ ## must give me @content, @columns, @datatypes (opt)
20
+ class Datasource
21
+ # attr_reader :field_length # specified by user, length of row in display table
22
+ attr_accessor :columns # names of columns in array
23
+ attr_accessor :datatypes # array of datatyps of columns required to align: int, real, float, smallint
24
+ attr_accessor :content # 2 dim data
25
+ attr_accessor :user_columns # columnnames provided by user, overrides what is generated for display
26
+ # attr_reader :sqlstring # specified by user
27
+
28
+ # constructor
29
+ def initialize(config={}, &block)
30
+ @content = []
31
+ @columns = nil # actual db columnnames -- needed to figure out datatypes
32
+ @user_columns = nil # user specified db columnnames, overrides what may be provided
33
+ @datatypes = nil
34
+ # @rows = nil
35
+ # @sqlstring = nil
36
+ # @command = nil
37
+
38
+ instance_eval(&block) if block_given?
39
+ end
40
+ def connect dbname
41
+ @db = SQLite3::Database.new(dbname)
42
+ end
43
+ # get columns and datatypes, prefetch
44
+ def get_data command
45
+ @columns, *rows = @db.execute2(command)
46
+ @content = rows
47
+ return nil if @content.nil? or @content[0].nil?
48
+ @datatypes = @content[0].types #if @datatypes.nil?
49
+ @command = command
50
+ return @content
51
+ end
52
+ def get_metadata table
53
+ get_data "select * from #{table} limit 1"
54
+ return @columns
55
+ end
56
+ ##
57
+ # returns columns_widths, and updates that variable
58
+ def estimate_column_widths tablewidth, columns
59
+ colwidths = {}
60
+ min_column_width = (tablewidth/columns.length) -1
61
+ $log.debug("min: #{min_column_width}, #{tablewidth}")
62
+ @content.each_with_index do |row, cix|
63
+ break if cix >= 20
64
+ row.each_index do |ix|
65
+ col = row[ix]
66
+ colwidths[ix] ||= 0
67
+ colwidths[ix] = [colwidths[ix], col.length].max
68
+ end
69
+ end
70
+ total = 0
71
+ colwidths.each_pair do |k,v|
72
+ name = columns[k.to_i]
73
+ colwidths[name] = v
74
+ total += v
75
+ end
76
+ colwidths["__TOTAL__"] = total
77
+ column_widths = colwidths
78
+ @max_data_widths = column_widths.dup
79
+
80
+ columns.each_with_index do | col, i|
81
+ if @datatypes[i].match(/(real|int)/) != nil
82
+ wid = column_widths[i]
83
+ # cw = [column_widths[i], [8,min_column_width].min].max
84
+ $log.debug("XXX #{wid}. #{columns[i].length}")
85
+ cw = [wid, columns[i].length].max
86
+ $log.debug("int #{col} #{column_widths[i]}, #{cw}")
87
+ elsif @datatypes[i].match(/(date)/) != nil
88
+ cw = [column_widths[i], [12,min_column_width].min].max
89
+ #cw = [12,min_column_width].min
90
+ $log.debug("date #{col} #{column_widths[i]}, #{cw}")
91
+ else
92
+ cw = [column_widths[i], min_column_width].max
93
+ if column_widths[i] <= col.length and col.length <= min_column_width
94
+ cw = col.length
95
+ end
96
+ $log.debug("else #{col} #{column_widths[i]}, #{col.length} #{cw}")
97
+ end
98
+ column_widths[i] = cw
99
+ total += cw
100
+ end
101
+ column_widths["__TOTAL__"] = total
102
+ $log.debug("Estimated col widths: #{column_widths.inspect}")
103
+ @column_widths = column_widths
104
+ return column_widths
105
+ end
106
+
107
+ # added to enable query form to allow movement into table only if
108
+ # there is data 2008-10-08 17:46
109
+ # returns number of rows fetched
110
+ def data_length
111
+ return @content.length
112
+ end
113
+
114
+ end
115
+ def get_key_labels
116
+ key_labels = [
117
+ ['C-q', 'Exit'], nil,
118
+ ['M-s', 'Save'], ['M-m', 'Move']
119
+ ]
120
+ return key_labels
121
+ end
122
+ def get_key_labels_table
123
+ key_labels = [
124
+ ['M-n','NewRow'], ['M-d','DelRow'],
125
+ ['C-x','Select'], nil,
126
+ ['M-0', 'Top'], ['M-9', 'End'],
127
+ ['C-p', 'PgUp'], ['C-n', 'PgDn'],
128
+ ['M-Tab','Nxt Fld'], ['Tab','Nxt Col'],
129
+ ['+','Widen'], ['-','Narrow']
130
+ ]
131
+ return key_labels
132
+ end
133
+ class Sqlc
134
+ def initialize
135
+ @window = VER::Window.root_window
136
+ @form = Form.new @window
137
+
138
+ #@todo = Sql.new "todo.yml"
139
+ #@todo.load
140
+ @db = Datasource.new
141
+ @db.connect "testd.db"
142
+ end
143
+ def run
144
+ title = "rbcurse"
145
+ @header = ApplicationHeader.new @form, title, {:text2=>"Demo", :text_center=>"SQL Client"}
146
+ status_row = RubyCurses::Label.new @form, {'text' => "", :row => Ncurses.LINES-4, :col => 0, :display_length=>60}
147
+ @status_row = status_row
148
+ # setting ENTER across all objects on a form
149
+ @form.bind(:ENTER) {|f| status_row.text = f.help_text unless f.help_text.nil? }
150
+ r = 1; c = 1;
151
+ @data = [ ["No data"] ]
152
+ data = @data
153
+ colnames = %w[ Result ]
154
+
155
+ ta_ht = 5
156
+ t_width = 78
157
+ sqlarea = TextArea.new @form do
158
+ name "sqlarea"
159
+ row r
160
+ col c
161
+ width t_width
162
+ height ta_ht
163
+ title "Sql Query"
164
+ title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
165
+ help_text "Enter query and press Run or Meta-r"
166
+ end
167
+ sqlarea << "select * from contacts"
168
+ buttrow = r+ta_ht+1 #Ncurses.LINES-4
169
+ #create_table_actions atable, todo, data, categ.getvalue
170
+ #save_cmd = @save_cmd
171
+ b_run = Button.new @form do
172
+ text "&Run"
173
+ row buttrow
174
+ col c
175
+ help_text "Run query"
176
+ end
177
+ ## We use Action to create a button: to test out ampersand with MI and Button
178
+ #clear_act = @clear_act
179
+ b_clear = Button.new @form do
180
+ #action new_act
181
+ text "&Clear"
182
+ row buttrow
183
+ col c+10
184
+ help_text "Clear query entry box "
185
+ #bind(:ENTER) { status_row.text "New button adds a new row below current " }
186
+ end
187
+ b_clear.command {
188
+ sqlarea.remove_all
189
+ sqlarea.focus
190
+ }
191
+
192
+ # using ampersand to set mnemonic
193
+ =begin
194
+ b_delrow = Button.new @form do
195
+ text "&Delete"
196
+ row buttrow
197
+ col c+25
198
+ #bind(:ENTER) { status_row.text "Deletes focussed row" }
199
+ help_text ""
200
+ end
201
+ b_delrow.command {
202
+ #@del_cmd.call
203
+ }
204
+ =end
205
+ Button.button_layout [b_run, b_clear], buttrow, startcol=5, cols=Ncurses.COLS-1, gap=5
206
+
207
+ table_ht = 15
208
+ atable = Table.new @form do
209
+ name "tasktable"
210
+ row buttrow+1
211
+ col c
212
+ width t_width
213
+ height table_ht
214
+ #title "A Table"
215
+ #title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
216
+ #set_data data, colnames
217
+ #cell_editing_allowed true
218
+ #editing_policy :EDITING_AUTO
219
+ help_text "M-Tab for next field"
220
+ end
221
+ @atable = atable
222
+ @data = data
223
+ #atable.table_model.data = data
224
+
225
+ tcm = atable.get_table_column_model
226
+ b_run.command {
227
+ query = sqlarea.get_text
228
+ run_query query
229
+ }
230
+ #
231
+ ## key bindings fo atable
232
+ # column widths
233
+ app = self
234
+ atable.configure() do
235
+ #bind_key(330) { atable.remove_column(tcm.column(atable.focussed_col)) rescue "" }
236
+ bind_key(?+) {
237
+ acolumn = atable.column atable.focussed_col()
238
+ w = acolumn.width + 1
239
+ acolumn.width w
240
+ #atable.table_structure_changed
241
+ }
242
+ bind_key(?-) {
243
+ acolumn = atable.column atable.focussed_col()
244
+ w = acolumn.width - 1
245
+ if w > 3
246
+ acolumn.width w
247
+ #atable.table_structure_changed
248
+ end
249
+ }
250
+ bind_key(?>) {
251
+ colcount = tcm.column_count-1
252
+ #atable.move_column sel_col.value, sel_col.value+1 unless sel_col.value == colcount
253
+ col = atable.focussed_col
254
+ atable.move_column col, col+1 unless col == colcount
255
+ }
256
+ bind_key(?<) {
257
+ col = atable.focussed_col
258
+ atable.move_column col, col-1 unless col == 0
259
+ #atable.move_column sel_col.value, sel_col.value-1 unless sel_col.value == 0
260
+ }
261
+ bind_key(?\M-h, app) {|tab,td| $log.debug " BIND... #{tab.class}, #{td.class}"; app.make_popup atable}
262
+ end
263
+ #keylabel = RubyCurses::Label.new @form, {'text' => "", "row" => r+table_ht+3, "col" => c, "color" => "yellow", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
264
+ #eventlabel = RubyCurses::Label.new @form, {'text' => "Events:", "row" => r+table_ht+6, "col" => c, "color" => "white", "bgcolor"=>"blue", "display_length"=>60, "height"=>2}
265
+
266
+ # report some events
267
+ #atable.table_model.bind(:TABLE_MODEL_EVENT){|e| #eventlabel.text = "Event: #{e}"}
268
+ #atable.get_table_column_model.bind(:TABLE_COLUMN_MODEL_EVENT){|e| eventlabel.text = "Event: #{e}"}
269
+ atable.bind(:TABLE_TRAVERSAL_EVENT){|e| @header.text_right "Row #{e.newrow+1} of #{atable.row_count}" }
270
+
271
+ tablist_ht = 6
272
+ mylist = @db.get_data "select name from sqlite_master"
273
+ $listdata = Variable.new mylist
274
+ tablelist = Listbox.new @form do
275
+ name "tablelist"
276
+ row 1
277
+ col t_width+2
278
+ width 20
279
+ height tablist_ht
280
+ # list mylist
281
+ list_variable $listdata
282
+ #selection_mode :SINGLE
283
+ #show_selector true
284
+ title "Tables"
285
+ title_attrib 'reverse'
286
+ end
287
+ #tablelist.bind(:PRESS) { |alist| @status_row.text = "Selected #{alist.current_index}" }
288
+ tablelist.list_selection_model().bind(:LIST_SELECTION_EVENT,tablelist) { |lsm, alist| @status_row.text = "Selected #{alist.current_index}" }
289
+
290
+ collist = []
291
+ $coldata = Variable.new collist
292
+ columnlist = Listbox.new @form do
293
+ name "columnlist"
294
+ row tablist_ht+2
295
+ col t_width+2
296
+ width 20
297
+ height 15
298
+ # list mylist
299
+ list_variable $coldata
300
+ #selection_mode :SINGLE
301
+ #show_selector true
302
+ title "Columns"
303
+ title_attrib 'reverse'
304
+ end
305
+ tablelist.bind_key(32) {
306
+ @status_row.text = "Selected #{tablelist.get_content()[tablelist.current_index]}"
307
+ table = "#{tablelist.get_content()[tablelist.current_index]}"
308
+ columnlist.list_data_model.remove_all
309
+ columnlist.list_data_model.insert 0, *@db.get_metadata(table)
310
+ }
311
+ tablelist.bind_key(13) {
312
+ @status_row.text = "Selected #{tablelist.get_content()[tablelist.current_index]}"
313
+ table = "#{tablelist.get_content()[tablelist.current_index]}"
314
+ run_query "select * from #{table}"
315
+ }
316
+
317
+
318
+ @form.repaint
319
+ @window.wrefresh
320
+ Ncurses::Panel.update_panels
321
+ begin
322
+ while((ch = @window.getchar()) != ?\C-q )
323
+ #colcount = tcm.column_count-1
324
+ s = keycode_tos ch
325
+ #status_row.text = "Pressed #{ch} , #{s}"
326
+ @form.handle_key(ch)
327
+
328
+ @form.repaint
329
+ @window.wrefresh
330
+ end
331
+ ensure
332
+ @window.destroy if !@window.nil?
333
+ end
334
+ end
335
+ def run_query sql
336
+ #query = sqlarea.get_text
337
+ query = sql
338
+ begin
339
+ @content = @db.get_data query
340
+ if @content.nil?
341
+ @status_row.text = "0 rows retrieved"
342
+ return
343
+ end
344
+ #cw = @db.estimate_column_widths @atable.width, @db.columns
345
+ @atable.set_data @content, @db.columns
346
+ cw = @atable.estimate_column_widths @db.columns, @db.datatypes
347
+ @atable.set_column_widths cw
348
+ rescue => exc
349
+ alert exc.to_s
350
+ return
351
+ end
352
+ @status_row.text = "#{@content.size} rows retrieved"
353
+ @atable.repaint
354
+ end
355
+ def create_table_actions atable, todo, data, categ
356
+ #@new_act = Action.new("New Row", "mnemonic"=>"N") {
357
+ @new_act = Action.new("&New Row") {
358
+ mod = nil
359
+ cc = atable.get_table_column_model.column_count
360
+ if atable.row_count < 1
361
+ frow = 0
362
+ else
363
+ frow = atable.focussed_row
364
+ #frow += 1 # why ?
365
+ mod = atable.get_value_at(frow,0) unless frow.nil?
366
+ end
367
+ tmp = [mod, 5, "", "TODO", Time.now]
368
+ tm = atable.table_model
369
+ tm.insert frow, tmp
370
+ atable.set_focus_on frow
371
+ @status_row.text = "Added a row. Please press Save before changing Category."
372
+ alert("Added a row before current one. Use C-k to clear task.")
373
+ }
374
+ @new_act.accelerator "Alt-N"
375
+ @save_cmd = lambda {
376
+ todo.set_tasks_for_category categ, data
377
+ todo.dump
378
+ alert("Rewritten yaml file")
379
+ }
380
+ @del_cmd = lambda {
381
+ row = atable.focussed_row
382
+ if !row.nil?
383
+ if confirm("Do your really want to delete row #{row+1}?")== :YES
384
+ tm = atable.table_model
385
+ tm.delete_at row
386
+ else
387
+ @status_row.text = "Delete cancelled"
388
+ end
389
+ end
390
+ }
391
+
392
+ end
393
+ end
394
+ if $0 == __FILE__
395
+ include RubyCurses
396
+ include RubyCurses::Utils
397
+
398
+ begin
399
+ # Initialize curses
400
+ VER::start_ncurses # this is initializing colors via ColorMap.setup
401
+ $log = Logger.new("view.log")
402
+ $log.level = Logger::DEBUG
403
+
404
+ colors = Ncurses.COLORS
405
+ $log.debug "START #{colors} colors ---------"
406
+
407
+ catch(:close) do
408
+ t = Sqlc.new
409
+ t.run
410
+ end
411
+ rescue => ex
412
+ ensure
413
+ VER::stop_ncurses
414
+ p ex if ex
415
+ p(ex.backtrace.join("\n")) if ex
416
+ $log.debug( ex) if ex
417
+ $log.debug(ex.backtrace.join("\n")) if ex
418
+ end
419
+ end
data/examples/testd.db ADDED
Binary file
@@ -83,10 +83,6 @@ if $0 == __FILE__
83
83
  #
84
84
  ## key bindings fo texta
85
85
  # column widths
86
- $log.debug " tcm #{tcm.inspect}"
87
- $log.debug " tcms #{tcm.columns}"
88
- $log.debug " tcm0 #{tcm.column(0).identifier}"
89
- $log.debug " tcm0 #{tcm.column(0).width}"
90
86
  tcm.column(0).width 24
91
87
  tcm.column(1).width 5
92
88
  tcm.column(2).width 18
data/examples/testtabp.rb CHANGED
@@ -20,6 +20,7 @@ class TestTabbedPane
20
20
  width 50
21
21
  row 5
22
22
  col 10
23
+ button_type :ok
23
24
  end
24
25
  @tab1 = @tp.add_tab "&Language"
25
26
  f1 = @tab1.form
@@ -95,6 +96,7 @@ if $0 == __FILE__
95
96
  $log = Logger.new("view.log")
96
97
  $log.level = Logger::DEBUG
97
98
  n = TestTabbedPane.new
99
+ n.run
98
100
  rescue => ex
99
101
  ensure
100
102
  VER::stop_ncurses
data/examples/testtodo.rb CHANGED
@@ -13,23 +13,53 @@ require 'rbcurse/keylabelprinter'
13
13
  require 'rbcurse/applicationheader'
14
14
  require 'rbcurse/action'
15
15
 
16
+ # TODO move the csv to a database so you can update. this sucketh.
17
+ #
16
18
  class TodoList
17
19
  def initialize file
18
20
  @file = file
19
21
  end
20
22
  def load
21
- @todomap = YAML::load(File.open(@file));
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
+ @data << row
31
+ $log.debug " #{row.inspect} "
32
+ @categories << row[0] unless @categories.include? row[0]
33
+ @statuses << row[4] unless @statuses.include? row[4]
34
+ @modules << row[1] unless @modules.include? row[1]
35
+ end
36
+ $log.debug " MOD #{@modules}"
22
37
  end
23
38
  def get_statuses
24
- @todomap['__STATUSES']
39
+ # @todomap['__STATUSES']
40
+ @statuses
25
41
  end
26
42
  def get_modules
27
- @todomap['__MODULES'].sort
43
+ #@todomap['__MODULES'].sort
44
+ @modules.sort
28
45
  end
29
46
  def get_categories
30
- @todomap.keys.delete_if {|k| k.match(/^__/) }
47
+ #@todomap.keys.delete_if {|k| k.match(/^__/) }
48
+ @categories
31
49
  end
32
50
  def get_tasks_for_category categ
51
+ @data.select do |row|
52
+ row[0] == categ
53
+ end
54
+ end
55
+ def insert_task_for_category task, categ
56
+ task[0] = categ
57
+ @data << task
58
+ end
59
+ def delete_task task
60
+ @data.delete task
61
+ end
62
+ def oldget_tasks_for_category categ
33
63
  c = @todomap[categ]
34
64
  d = []
35
65
  c.each_pair {|k,v|
@@ -44,6 +74,14 @@ class TodoList
44
74
  return d
45
75
  end
46
76
  def set_tasks_for_category categ, data
77
+ $log.debug " def set_tasks_for_category #{categ}, #{data.size} old #{@data.size}"
78
+ @data.delete_if { |row| row[0] == categ }
79
+ $log.debug " 2 def set_tasks_for_category #{categ}, #{data.size} old #{@data.size}"
80
+ data.each { |row| row[0] = categ }
81
+ @data.insert -1, *data
82
+ $log.debug " 3 def set_tasks_for_category #{categ}, #{data.size} old #{@data.size}"
83
+ end
84
+ def old_set_tasks_for_category categ, data
47
85
  d = {}
48
86
  data.each do |row|
49
87
  #key = row.delete_at 0
@@ -55,6 +93,7 @@ class TodoList
55
93
  $log.debug " NEW DATA #{categ}: #{data}"
56
94
  end
57
95
  def convert_to_text
96
+ =begin
58
97
  d = []
59
98
  cats = get_categories
60
99
  cats.each do |c|
@@ -65,8 +104,10 @@ class TodoList
65
104
  d << n
66
105
  end
67
106
  end
68
- File.open("todo.csv", "w") { |f| YAML.dump( d, f )}
107
+ #File.open("todo.yml", "w") { |f| YAML.dump( d, f )}
69
108
  buf =''
109
+ =end
110
+ d = @data
70
111
  require 'csv'
71
112
  CSV.open('todocsv.csv', 'w') do |writer|
72
113
  #writer << [nil, nil]
@@ -105,7 +146,7 @@ class TodoApp
105
146
  @window = VER::Window.root_window
106
147
  @form = Form.new @window
107
148
 
108
- @todo = TodoList.new "todo.yml"
149
+ @todo = TodoList.new "todocsv.csv"
109
150
  @todo.load
110
151
  end
111
152
  def make_popup table
@@ -218,14 +259,14 @@ class TodoApp
218
259
  data = todo.get_tasks_for_category 'TODO'
219
260
  @data = data
220
261
  $log.debug " data is #{data}"
221
- colnames = %w[ Module Prior Task Status]
262
+ colnames = %w[ Categ Module Prior Task Status]
222
263
 
223
264
  table_ht = 15
224
265
  atable = Table.new @form do
225
266
  name "tasktable"
226
267
  row r+2
227
268
  col c
228
- width 78
269
+ width 84
229
270
  height table_ht
230
271
  #title "A Table"
231
272
  #title_attrib (Ncurses::A_REVERSE | Ncurses::A_BOLD)
@@ -238,8 +279,8 @@ class TodoApp
238
279
  data = todo.get_tasks_for_category fld.getvalue;
239
280
  @data = data
240
281
  $log.debug " DATA is #{data.inspect} : #{data.length}"
241
- data = [[nil, 5, "NEW ", "TODO", Time.now]] if data.nil? or data.empty? or data.size == 0
242
- $log.debug " DATA is #{data.inspect} : #{data.length}"
282
+ data = [['FIXME',nil, 5, "NEW ", "TODO", Time.now]] if data.nil? or data.empty? or data.size == 0
283
+ #$log.debug " DATA is #{data.inspect} : #{data.length}"
243
284
  atable.table_model.data = data
244
285
  end
245
286
 
@@ -247,12 +288,15 @@ class TodoApp
247
288
  #
248
289
  ## key bindings fo atable
249
290
  # column widths
250
- $log.debug " tcm #{tcm.inspect}"
251
- $log.debug " tcms #{tcm.columns}"
252
- tcm.column(0).width 8
253
- tcm.column(1).width 5
254
- tcm.column(2).width 50
255
- tcm.column(3).width 8
291
+ #$log.debug " tcm #{tcm.inspect}"
292
+ #$log.debug " tcms #{tcm.columns}"
293
+ tcm.column(0).width 5
294
+ tcm.column(0).editable false
295
+ tcm.column(1).width 8
296
+ tcm.column(2).width 5
297
+ tcm.column(3).width 50
298
+ tcm.column(3).edit_length 80
299
+ tcm.column(4).width 8
256
300
  app = self
257
301
  atable.configure() do
258
302
  #bind_key(330) { atable.remove_column(tcm.column(atable.focussed_col)) rescue "" }
@@ -303,11 +347,11 @@ class TodoApp
303
347
  atable.set_default_cell_renderer_for_class "Float", num_renderer
304
348
  atable.set_default_cell_renderer_for_class "TrueClass", bool_renderer
305
349
  atable.set_default_cell_renderer_for_class "FalseClass", bool_renderer
306
- atable.get_table_column_model.column(3).cell_editor = combo_editor
307
- atable.get_table_column_model.column(0).cell_editor = combo_editor1
350
+ atable.get_table_column_model.column(4).cell_editor = combo_editor
351
+ atable.get_table_column_model.column(1).cell_editor = combo_editor1
308
352
  ce = atable.get_default_cell_editor_for_class "String"
309
353
  # increase the maxlen of task
310
- ce.component.maxlen = 80
354
+ # ce.component.maxlen = 80 # this is obsolete, use edit_length
311
355
  # I want up and down to go up and down rows inside the combo box, i can use M-down for changing.
312
356
  combo_editor.component.unbind_key(KEY_UP)
313
357
  combo_editor.component.unbind_key(KEY_DOWN)
@@ -416,17 +460,21 @@ class TodoApp
416
460
  amod = mods[@mb.selected_index]
417
461
  row = atable.focussed_row
418
462
  d = todo.get_tasks_for_category amod
463
+ $log.debug " retrieved #{d.size} rows for #{amod}"
419
464
  r = []
420
- tcm = atable.get_table_column_model
465
+ tcm = atable.table_column_model
421
466
  tcm.each_with_index do |acol, colix|
422
467
  r << atable.get_value_at(row, colix)
423
468
  end
424
469
  # here i ignore the 5th row tht coud have been added
425
470
  r << Time.now
426
471
  d << r
472
+ $log.debug " sending #{d.size} rows for #{amod}"
427
473
  todo.set_tasks_for_category amod, d
474
+ $log.debug " MOVE #{data.size} rows for #{categ.getvalue}"
428
475
  tm = atable.table_model
429
476
  ret = tm.delete_at row
477
+ $log.debug " MOVE after del #{data.size} rows for #{categ.getvalue}"
430
478
  todo.set_tasks_for_category categ.getvalue, data
431
479
  alert("Moved row #{row} to #{amod}.")
432
480
  }
@@ -469,15 +517,17 @@ class TodoApp
469
517
  #@new_act = Action.new("New Row", "mnemonic"=>"N") {
470
518
  @new_act = Action.new("&New Row") {
471
519
  mod = nil
520
+ cat = 'TODO'
472
521
  cc = atable.get_table_column_model.column_count
473
522
  if atable.row_count < 1
474
523
  frow = 0
475
524
  else
476
525
  frow = atable.focussed_row
477
526
  #frow += 1 # why ?
478
- mod = atable.get_value_at(frow,0) unless frow.nil?
527
+ cat = atable.get_value_at(frow,0) unless frow.nil?
528
+ mod = atable.get_value_at(frow,1) unless frow.nil?
479
529
  end
480
- tmp = [mod, 5, "", "TODO", Time.now]
530
+ tmp = [cat,mod, 5, "", "TODO", Time.now]
481
531
  tm = atable.table_model
482
532
  tm.insert frow, tmp
483
533
  atable.set_focus_on frow
@@ -488,7 +538,7 @@ class TodoApp
488
538
  @save_cmd = lambda {
489
539
  todo.set_tasks_for_category categ, data
490
540
  todo.dump
491
- alert("Rewritten yaml file")
541
+ alert("Rewritten csv file")
492
542
  }
493
543
  @del_cmd = lambda {
494
544
  row = atable.focussed_row
@@ -0,0 +1,28 @@
1
+ FIXME,MSGBOX,5,Confirm dialog: box vertical line overwritten in 2 spots,TODO
2
+ FIXME,MSGBOX,5,Confirm dialog: use normal key as hotkey also,TODO,Tue Jan 20 11:44:49 +0530 2009
3
+ FIXME,MSGBOX,5,Confirm dialog: arrow keys not navigating anylonger,TODO,Tue Jan 20 11:45:27 +0530 2009
4
+ FIXME,GEN,9,Message Box sizing,TODO,Thu Jan 22 20:39:21 +0530 2009
5
+ DONE,LIST,5,case insensitive char search in list and combo,TESTED,Sat Feb 21 20:43:05 +0530 2009
6
+ DONE,TABLE,5,increase the maxlen of this field please. Let us see how it goes.,TESTED
7
+ DONE,TABLE,5,Can we disable down arrow in Chkbox in table?,TESTED,Mon Jan 19 00:00:00 +0530 2009
8
+ DONE,TABLE,0,editing on enter,TESTED,Mon Jan 19 01:37:00 +0530 2009
9
+ DONE,TABLE,5,cell editors pcol is not being reset each time,TESTED,Mon Jan 19 17:47:00 +0530 2009
10
+ DONE,TABLE,5,Use TAB for intercell navig. use M-TAB for next f,TESTED,Tue Jan 20 00:38:19 +0530 2009
11
+ DONE,TABLE,5,Searching,TESTED,Sat Feb 21 20:42:10 +0530 2009
12
+ DONE,TABLE,3,Columns editable or not,TESTED,Sat Feb 21 20:43:10 +0530 2009
13
+ DONE,TABLE,1,Any way to start a table with no data and pop late,TODO,Sat Feb 21 20:43:33 +0530 2009
14
+ DONE,GEN,5,Make widget of Keylabelprinter,TESTED,Tue Jan 20 00:38:43 +0530 2009
15
+ DONE,GEN,5,Added Action class shared by Button Menuitem ,TESTED,Thu Jan 22 18:08:28 +0530 2009
16
+ DONE,GEN,5,Added PopupMenu 2009-01-22 18:09 ,TESTED,Thu Jan 22 18:09:34 +0530 2009
17
+ DONE,LIST,0,call on_enter and on_leave of component,TOTEST,Sun Feb 22 12:19:38 +0530 2009
18
+ TODO,TABLE,1,table.set_data should check if models already created.,TODO
19
+ TODO,TABLE,5,"Set column_class in TableColumn, to avoid hassles",TODO
20
+ TODO,TABLE,2,Table sorting and filtering is required - using VIEW,TODO
21
+ TODO,TABLE,5,Table height and col widths auto sizing or FILLING extra space.,TODO
22
+ TODO,TEXTAREA,9,"Textarea: wrap options NONE, COLUMN",TODO,Tue Jan 20 01:04:15 +0530 2009
23
+ TODO,GEN,5,"Modified should check if value changed, not UP etc",TOTEST
24
+ TODO,GEN,5,Give a decent FileChooser and FileSaver,TODO
25
+ TODO,GEN,5,Focus Traversable vs focusable,TODO
26
+ TODO,GEN,5,Action class: fire event for listeners,TODO,Thu Jan 22 20:09:50 +0530 2009
27
+ TODO,FIELD,5,Field: OVERWRITE Mode,TODO
28
+ TODO,FIELD,5,Field: Auto-skip when reaching end of maxlen,TODO