#!/usr/bin/env ruby
##
## dynarows.rb
##
## This demos shows the use of the validation mechanism of the table
## and uses the table's cache (no -command or -variable) with a cute
## dynamic row routine.
## 
## ( based on 'dynarows.tcl' included source archive of tktable extension )
##
require 'tk'
require 'tkextlib/tktable'

def table_validate(w, idx)
  return unless idx =~ /^(\d+),(\d+)$/
  row = Integer($1)
  col = Integer($2)
  val = w.get(idx)

 [w, idx]
  nrows = w[:rows]
  return if row == nrows - 1 && val == ''

  begin
    time = Tk.tk_call('clock', 'scan', val)
    date = []
    Tk.tk_call('clock', 'format', time, 
               :format=>'%m %d %Y').split(' ').each{|item|
      date << item.sub(/^\s*0*/,'')
    }
    w.set(idx, date.join('/'))
    if row == nrows - 1
      if w.get([row,1]) != '' && w.get([row,2]) != ''
        w.tag_row_reset(row)
        w.set([row,0], row)
        nrows += 1
        row += 1
        w.configure(:rows=>nrows)
        w.tag_row('unset', row)
        w.set([row,0], '*')
        w.see([row,1])
        w.activate([row,1])
      end
    end
  rescue
    Tk.bell
    w.activate(idx)
    w.selection_clear_all
    w.selection_set(:active)
    w.see(:active)
  end
end


lbl = TkLabel.new(:text=>"Dynamic Date Validated Rows")

table = Tk::TkTable.new(:rows=>2, :cols=>3, :cache=>1, :selecttype=>:row, 
                        :titlerows=>1, :titlecols=>1, :height=>5, 
                        :colstretch=>:unset, :rowstretch=>:unset, 
                        :autoclear=>true, 
                        :browsecommand=>[
                          proc{|w,s| table_validate(w, s)}, 
                          '%W %s'
                        ])
table.set([0,1], 'Begin', [0,2], 'End', [1,0], '*')
table.tag_configure('unset', :fg=>'#008811')
table.tag_configure('title', :fg=>'red')
table.tag_row('unset', 1)
table.set_width(0,3)

sx = table.xscrollbar(TkScrollbar.new)
sy = table.yscrollbar(TkScrollbar.new)

Tk.grid(lbl, '-', :sticky=>:ew)
Tk.grid(table, sy, :sticky=>:news)
Tk.grid(sx, :sticky=>:ew)

Tk.root.grid_columnconfig(0, :weight=>1)
Tk.root.grid_rowconfig(1, :weight=>1)

rtn_proc = proc{|w|
  r = w.row_index(:active)
  c = w.col_index(:active)

  if c == 2
    r += 1
    w.activate([r,1])
  else
    c += 1
    w.activate([r,c])
  end
  w.see(:active)
  Tk.callback_break
}

table.bind('Return', rtn_proc, '%W')
table.bind('KP_Enter', rtn_proc, '%W')

Tk.mainloop
