#!ruby -Ks

        ##
        ##  商品一覧のフォーム
        ##
        ##  ２個のキー入力窓（コード、商品名）
        ##  グリッド
        ##  で構成される。
        ##
        ##  グリッドの表示順の変更
        ##  グリッドに同期するキー入力窓。
        ##  キー入力窓への入力でグリッドの表示も変化する。
        ##
        ##  エントリ用のメソッド select_shohin を公開する。
        ##

require "phi"
require "rdb"
require "RGUI"
require "cct30"     ##  DB
include Phi
include RDB

        ##
        ##  form & menu
        ##
form = RGUI::Form.new :form_shohin , "商品一覧"
class << form
  attr :dataset,true
end

        ##
        ##  上のパネル。
        ##
panel1 = RGUI::Panel.new form , :panel1
panel1.align = Phi::AL_TOP
edits = [
  (rbtn_search_code=RadioButton.new(panel1,:rbtn_search_code,"  商品コード ")),
  (edit_search_code=Edit.new(       panel1,:edit_search_code )),
  (rbtn_search_mei =RadioButton.new(panel1,:rbtn_search_mei ,"  商品名 ")),
  (edit_search_mei =Edit.new(       panel1,:edit_search_mei ))
]
panel1.add( RGUI::Hbox.new.add( edits ))
panel1.height = panel1.edit_search_mei.height

        ##
        ##  下のパネル。
        ##
panel3 = RGUI::Panel.new form
panel3.align = Phi::AL_BOTTOM
panel3.add( RGUI::Hbox.new.add(
  (btn_ok     =Button.new(panel3,:btn_ok     , "OK")),
  (btn_cancel =Button.new(panel3,:btn_cancel , "Cancel" ))
))
panel3.height = btn_ok.height

        ##
        ##  グリッドとメモ用のパネル。
        ##
panel2 = Panel.new form
panel2.align = Phi::AL_CLIENT

grid = DBGrid.new panel2 , :grid
grid.align = Phi::AL_LEFT

memo = DBMemo.new panel2
memo.align = Phi::AL_CLIENT

        ##
        ##  data access
        ##

dataset = form.dataset = DB.new_table("ap01shohin")  # 2003-07-04(金)
datasource = DataSource.new dataset

grid.data_source = datasource
memo.data_source = datasource
memo.data_field = "memo"

        ##
        ##  display for grid
        ##
dataset["shohin_id"]    .visible = false
dataset["memo"]         .visible = false
dataset["shohin_code"]  .display_label = "商品コード"
dataset["shohin_mei"]   .display_label = "商品名"
dataset["tanka"]        .display_label = "単価"

        ##
        ##  menu
        ##
Phi.new_menu form, :menu, [
      Phi.new_item( '&File' , '' , :mi_file ).add(
        Phi.new_item( 'e&xit' , 'Ctrl+Y', :mi_exit )
      )
]
form.menu_attr_flatten

        ##
        ##  event handlers
        ##
form.mi_exit.on_click = proc { exit }

btn_ok      .modal_result = Phi::MR_OK
btn_cancel  .modal_result = Phi::MR_CANCEL

        ##
        ##  イベントハンドラ
        ##
        ##  グリッドの表示順を換える。
        ##
        ##  ラジオボタンをクリックするか、そのキーの編集窓に入ると
        ##  グリッドの表示順が変わる。
        ##
        ##  検索もその表示順に対応したキーで行われる。
        ##
        ##  「rbtn_search_mei.click」では◎にならない。
        ##
        ##  グリッドで行を移動した場合には、キー入力窓の表示も変わる。
        ##
rbtn_search_code.on_click = proc {
  dataset.index_field_names = 'shohin_code'
}

rbtn_search_mei.on_click = proc {
  dataset.index_field_names = 'shohin_mei'
}

edit_search_mei.on_enter = proc{
  rbtn_search_mei.checked = true
}

edit_search_code.on_enter = proc{
  rbtn_search_code.checked = true
}

datasource.on_data_change = proc {
  unless edit_search_mei.focused?
    s = dataset["shohin_mei"].to_s
    edit_search_mei.text = s if s
  end
  unless edit_search_code.focused?
    s = dataset["shohin_code"].to_s
    edit_search_code.text = s if s
  end
}

        ##
        ##  検索の実行
        ##
        ##  locate と find_nearest とでは若干動作が異なる。
        ##  find_nearest の方が好ましい。
        ##  が、Table専用なので、Queryにした場合には使えなくなる。
        ##
##LO_PARTIAL_KEY = 1
edit_search_mei.on_change = proc{
  if edit_search_mei.focused?
    ##dataset.locate 'shohin_mei' , edit_search_mei.text ,[1]
    dataset.find_nearest edit_search_mei.text
  end
}
edit_search_code.on_change = proc{
  if edit_search_code.focused?
    ##dataset.locate 'shohin_code' , edit_search_code.text ,[1]
    dataset.find_nearest edit_search_code.text
  end
}

        ##
        ##  グリッドの商品名をクリックしたときに
        ##  その商品の明細のフォームを開く。
        ##
grid.on_key_press = proc{ |sender,key|
  case key
  when 13       #   "\n"
    p grid.selected_field.field_name
  end
}

        ##
        ##  エントリ用のメソッド
        ##
        ##  debugというのはデバッグ用。
        ##  開いているフォームが１つもない場合には
        ##  show_modalは常にMR_CANCELを返してしまう。
        ##
def form.select_shohin entry_id=nil,entry_code=nil,entry_name=nil
    debug = false
    Phi::SCREEN.forms.each{|f| debug |= !(f.visible?) }
    ##raise "show_modal needs visible forms" unless debug

  if entry_id
    dataset.locate 'shohin_id' , entry_id , []
  elsif entry_code
    panel1.rbtn_search_code.checked = true
    panel1.edit_search_code.text = entry_code.to_s
  elsif entry_name
    panel1.rbtn_search_mei.checked = true
    panel1.edit_search_mei.text = entry_name.to_s
  end
  kakaku = nil
  if ( (mr=show_modal) == Phi::MR_OK ) or debug
    entry_id   = dataset["shohin_id"].to_i
    entry_code = dataset["shohin_code"].to_s
    entry_name = dataset["shohin_mei"].to_s
    kakaku     = dataset["tanka"].to_i
  end
  return mr,entry_id,entry_code,entry_name,kakaku
end

    ##
    ##  layout
    ##
form.client_width = [grid,memo].sum{ |c| c.width } + 10
panel1.layout
panel3.layout

if __FILE__ == $0
  p form.select_shohin
  Phi.mainloop
end
