#! ruby -Ks
#-- DBGrid_adjust_width.rb
#-- DBGrid_adjust_width.pi

require "phi"
require "rdb"
require "Enumerable_sum"

module RDB
class DBGrid

  #-- 再入するのかもしれない……。

  def adjust_width(options={})
    if @adjust_width_entered
      p :reenter_adjust_width
      return
    end
    @adjust_width_entered = true
    begin

    #-- 本来のサイズを保存しておく。
    #-- オブジェクトそのもの（c、c.field）は毎回違う値になる。
    @col_widths ||= {}
    columns.each{|c|
      @col_widths[c.field_name] ||= c.width
    }

    form     = options[:form]     || nil
    mini     = options[:mini]     || (form ? form.client_width : nil) || 50

    #-- 枠のサイズを減らす。
    diff = 13 + 23 # 13:col0 23:scroller ??
    maxi     = options[:max]      || Phi::SCREEN.width * 0.90
    maxi = [maxi-diff , 50].max
    col_mini = options[:col_mini] || ( mini / 2 ) - 2

    #
    #-- col_sum = self.columns.sum{|c|c.width} では
    #-- いったん小さくなると、小さくなりっぱなし……
    #-- col_sum = self.columns.sum{|c|c.field.display_width}
    # では、display_width は文字単位
    #
    col_sum = self.columns.sum{|c| @col_widths[c.field_name]}

    if col_sum < maxi
p self.columns
p self.columns.count
      self.columns.each{|c| c.width = @col_widths[c.field_name] }
      width = [col_sum, mini].max
    else
      width = maxi
      #-- adjust col width
      over  = col_sum - maxi

# 激しく揺らしたとき。
#モジュール 'vcldb60.bpl' のアドレス 406860D3 でアドレス 00000130 に対する読み込み違反がおきました。 (Phi::DelphiError)
#  G:\Apollo\TkUtils\DBGrid_adjust_width.rb:56:in `columns'

      over_col_sum = self.columns.sum{|c| [ @col_widths[c.field_name] - col_mini , 0].max}
      rate  = [ over * 1.0 / over_col_sum , 1 ].min
      self.columns.each{|c|
        col_width = @col_widths[c.field_name]

#out of range (IndexError)
#  c:/program files/apollo/bin/phi.rb:118:in `[]'
#  c:/program files/apollo/bin/phi.rb:118:in `each'
#  c:/program files/apollo/bin/phi.rb:118:in `each'
#  c:/program files/apollo/bin/phi.rb:118:in `each'
#  G:\Apollo\TkUtils\DBGrid_adjust_width.rb:62:in `adjust_width'

        if col_width > col_mini
          c.width = col_width - ( col_width - col_mini ) * rate
        else
          c.width = col_width
        end
      }
    end
    self.width = width += diff # 13:col0 23:scroller ??
    return width
    ensure
      @adjust_width_entered = false
    end
  end
end # of class DBGrid
end # of module RDB

if __FILE__ == $0
  require "dir_to_dataset"

  #-- 2個のタイプ
  form = Phi::Form.new
  r_grid = RDB::DBGrid.new form
  r_grid.data_source = RDB::DataSource.new dir_to_dataset
  l_grid = RDB::DBGrid.new form
  l_grid.data_source = RDB::DataSource.new dir_to_dataset
  form.client_width = Phi::SCREEN.width * 0.9
  form.on_resize = proc{
    max = form.client_width / 2
    r_width = r_grid.adjust_width(:max => max)
    l_width = l_grid.adjust_width(:max => max)
    l_grid.align = Phi::AL_LEFT

    r_grid.left = l_grid.right
    r_grid.align = Phi::AL_CLIENT
  }
  form.show
  Phi.mainloop

##  #-- 一つのタイプ
##  form = Phi::Form.new
##  grid = RDB::DBGrid.new form
##  grid.data_source = RDB::DataSource.new dir_to_dataset
##  form.client_width = grid.adjust_width(:form => form)
##  form.on_resize= proc{ grid.adjust_width(:form => form) }
##  grid.align = Phi::AL_CLIENT
##  form.show
##  Phi.mainloop

end
