#! ruby -Ks

# http://www.geocities.co.jp/SiliconValley/4805/bcbtips/bcbtips077.htm
#
# http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=17#0021.txt

require "phi"
form = Phi::Form.new
list = Phi::ListView.new form
list.align = Phi::AL_CLIENT
list.view_style = Phi::VS_REPORT

(0..5).each{|i|
  col = list.columns.add
  if i == 0
    col.caption = "Col:#{i}, Caption"
  else
    col.caption = "Col:#{i}, Fld:#{i-1}"
  end
  col.width = -2 # -1:FieldLen -2:CaptionLen
}

(0..100).each{|i|
  list.items.add().caption = i.to_s;
  list.items[i].sub_items.add("項目0-" + rand(100).to_i.to_s);
  list.items[i].sub_items.add("項目1-" + rand(100).to_i.to_s);
  list.items[i].sub_items.add("項目2-" + rand(100).to_i.to_s);
  list.items[i].sub_items.add("項目3-" + rand(100).to_i.to_s);
  list.items[i].sub_items.add("項目4-" + i.to_s);
}

##stNone	ソートは行われない
##stData	項目は Data プロパティに基づいてソートされる。
##			Data 値を比較するためにイベントハンドラを提供しなければならない
##stText	項目は Caption プロパティに基づいてソートされる
##stBoth	項目は Data と Caption に基づいてソートされる。
##			Data 値は，比較するためのイベントハンドラが提供されない場合は無視される

$ListViewSort = 0

list.on_compare = proc{|sender,cmp,item1,item2,data|
  ##p [:on_compare,sender,cmp,item1,item2,data,$ListViewSort]
  ix = $ListViewSort.abs - 2
  if ix < 0
    (item1.caption > item2.caption) ? 1 : -1
  elsif $ListViewSort > 0
    (item1.sub_items[ix] > item2.sub_items[ix]) ? 1 : -1
  else
    (item1.sub_items[ix] < item2.sub_items[ix]) ? 1 : -1
  end
}

##list.sort_type = 0
##list.sort_type = 1

list.on_column_click = proc{|sender,column|
 if $ListViewSort.abs == column.index+1
    $ListViewSort = -$ListViewSort;
 else
     $ListViewSort = column.index+1;
 end;
 list.sort_type = 0 ## list.sort_type = Phi::ST_NONE
 list.sort_type = 1 ## list.sort_type = Phi::ST_DATA
}

form.show
Phi.mainloop
