#!/usr/bin/env ruby
#
# This file is gererated by ruby-glade-create-template 1.1.3.
#

require 'optparse'

require 'remastering/remastertool_const'
require 'remastering/glade/remastertool_virtualGlade'
require 'remastering/remastertool_utility'

bindtextdomain(PROG_NAME, nil, nil, "UTF-8")

# Message definition
MSG_ERR_NOGLADE = _("Cannot find glade files\nPlease check installation environment.\n")
MSG_ERR_NO_PLUGIN = _("Cannot find %s plugin.\nPlease check installation environment.\n")
MSG_WARN_OSIMAGE = _("Please specify OS image")
TITLE_DIALOG_VIR_OPEN = _("Choose a OS image files")

class RemastertoolVirtual < RemastertoolVirtualGlade
  include GetText

  attr :glade

	#=== 仮想マシンテスト実行ダイアログクラスのンストラクタ
	#
	#画面オブジェクトの作成&初期状態への設定を行う。
	#
	#gladeDir:: gladeファイル格納ディレクトリ
	#os_image:: OSイメージファイル
	#emulator:: エミュレータソフト
	#復帰値:: なし
	#
	def initialize(glade_dir, os_image, emulator)

		super(File.join(glade_dir, PROG_PATH), nil, PROG_NAME, nil, GladeXML::FILE)

		# ロードしたエミュレータプラグイン名をコンボボックスに設定する
		default = index = 0
		RTUtility.get_emulator_plugins.each_key{|key|
			@glade["combobox"].append_text(key)
			default = index if key == emulator
			index = index + 1
		}
		@glade["combobox"].active = default

		# OSイメージの設定
		@glade["entry_os"].text = os_image
	end

	#=== [開く]ボタンクリック時のイベントハンドラ
	#
	#[開く]ボタンクリック時にリ呼び出され、OSイメージを選択するためのファイル選択
	#ダイアログを表示する。
	#
	#widget:: [開く]ボタンのWidget
	#復帰値:: なし
	#
	def on_button_ref_clicked(widget)
		dialog = Gtk::FileChooserDialog.new(TITLE_DIALOG_VIR_OPEN,
							@glade["dialog_vmtool"],
							Gtk::FileChooser::ACTION_OPEN,
							nil,
							[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
							[Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_OK])
		begin
			path = Pathname.new(path).realpath
			path = File.dirname(path) unless File.directory?(path)
			dialog.current_folder = path
		rescue
		end

		# OKボタンでの終了時はエディットボックスの内容を変更する
		if dialog.run == Gtk::Dialog::RESPONSE_OK
			@glade["entry_os"].text = dialog.filename
		end
		dialog.destroy
	end

	#=== [詳細]ボタンクリック時のイベントハンドラ
	#
	#[詳細]ボタンクリック時にリ呼び出され、選択中のエミュレータプラグインの
	#オプション設定画面を開く
	#
	#widget:: [詳細]ボタンのWidget
	#復帰値:: なし
	#
	def on_button_detail_clicked(widget)
		RTUtility.get_emulator_plugins[@glade["combobox"].active_text].show_option
	end

	#=== コンボボックスの選択変更時のイベントハンドラ
	#
	#コンボボックスの選択変更時に選択したエミュレータプラグインが[詳細]画面(オプションダイアログ)
	#持っているか問い合わせ、持っている場合は[詳細]ボタンを活生化し、持っていない場合は非活性化す
	#る。
	#
	#widget:: [エミュレータ]コンボボックスのWidget
	#復帰値:: なし
	#
	def on_combobox_changed(widget)
		@glade["button_detail"].sensitive = RTUtility.get_emulator_plugins[@glade["combobox"].active_text].have_option?
	end

	#=== [終了]ボタンクリック時のイベントハンドラ
	#
	#[終了]ボタンクリック時にツールを終了する。
	#
	#widget:: [終了]ボタンのWidget
	#復帰値:: なし
	#
	def on_cancelbutton_clicked(widget)
		# mainループの終了
		Gtk.main_quit
	end

	#=== [x]ボタンクリック持のイベントハンドラ
	#
	#[x]ボタンクリック時にキャンセルボタンのハンドラを呼び出し、キャンセルボタンと同じ動作を実現する。
	#
	#widget:: 仮想マシンテストツールメインウインドウのWidget
	#arg0:: 未使用
	#復帰値:: なし
	#
	def on_dialog_vmtool_delete_event(widget, arg0)
		on_cancelbutton_clicked @glade["cancelbutton"]
	end

	#=== [実行]ボタンクリック時のイベントハンドラ
	#
	#[実行]ボタンクリック時に設定内容にしたがって仮想マシンを起動する。
	#
	#widget:: [実行]ボタンのWidget
	#復帰値:: なし
	#
	def on_button_exec_clicked(widget)
		# 入力チェック
		if @glade["entry_os"].text.strip.empty?
			dlg = Gtk::MessageDialog.new(@glade["dialog_vmtool"], Gtk::Dialog::MODAL,
					Gtk::MessageDialog::WARNING,
					Gtk::MessageDialog::BUTTONS_OK, MSG_WARN_OSIMAGE)
			dlg.run
			dlg.destroy
			return
		end

		# OSイメージの起動
		RTUtility.get_emulator_plugins[@glade["combobox"].active_text].run @glade["entry_os"].text.strip
	end

end

# Main program
if __FILE__ == $0


	#===仮想マシンテストツールのオプション解析
	#
	#仮想マシンテストツールのオプション解析を行う。
	#
	#復帰値:: OSイメージファイルとエミュレータソフトを格納した配列( [os_image, emulator] )
	#
	def parse_option
		emu = ""
		os_image = ""
	
		# オプション解析準備
		opt = OptionParser.new
		opt.version = PROG_VERSION
		opt.program_name = PROG_HELP_NAME
		opt.summary_width = 18
		opt.on("-v", ": print version") {|v| puts opt.ver; exit 0 }
		opt.on("-h", ": print this help") {|v| puts opt.help.sub(PROG_HELP_NAME, $0); exit 0 }
		opt.on("-f os_image_file", ": execute os_image_file as OS Image") {|v| os_image = v }
		opt.on("-e emulator", ": execute the emulator to Virtual machine software") {|v| emu = v }

		# オプション解析
		begin
			opt.permute!(ARGV)
		rescue
			puts $!.to_s
			exit 1
		end
		return [os_image, emu]
	end

	#===メイン処理
	#
	#仮想マシンテストツールのメイン処理
	#
	#復帰値:: 0=正常終了、1=異常終了
	#

	# ロガーの設定
	RTUtility.set_logger

	# オプション解析
	os_imege, emulator = parse_option

	# gladeファイルディレクトリの取得
	PROG_PATH = "remastertool_virtual.glade"
	glade_dir = RTUtility.get_glade_dir(PROG_PATH)
	if glade_dir == nil
		puts MSG_ERR_NOGLADE
		exit 1
	end

	begin
		# エミュレータプラグインをロードする
		RTUtility.load_plugin PLUGIN_TYPE_EMULATOR
		raise sprintf(MSG_ERR_NO_PLUGIN, PLUGIN_TYPE_EMULATOR) if RTUtility.get_emulator_plugins.empty?

		Gtk.init
		RemastertoolVirtual.new(glade_dir, os_imege, emulator)
	rescue
		puts $!.to_s
		exit 1
	end
	Gtk.main

	RTUtility.unload_plugin
	exit 0
end
