////////////////////////////////////////////////////////////////////////////
// CMsgBox クラスのインプリメンテーション
//
////////////////////////////////////////////////////////////////////////////

#include <Xm/XmAll.h>
#include "MsgBox.h"
#include "CompoundStr.h"

////////////////////////////////////////////////////////////////////////////
// 構築/破棄
////////////////////////////////////////////////////////////////////////////

CMsgBox::CMsgBox()
{

}

CMsgBox::~CMsgBox()
{

}

////////////////////////////////////////////////////////////////////////////
// メソッド
////////////////////////////////////////////////////////////////////////////

// 初期化
void CMsgBox::Initialize( Widget wgtPrent, const CConfigInfo& rConfig )
{
	int ac = 0;
	Arg al[20];
	CCompoundStr TitleStr( "Syuhitu" );

	// 情報
	ac = 0;
	XtSetArg( al[ac], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL ); ac++;
	XtSetArg( al[ac], XmNdialogTitle, TitleStr.GetStr() ); ac++;
	XtSetArg( al[ac], XmNokLabelString, rConfig.RefOkStr().GetStr() ); ac++;
	wgtInfo = XmCreateInformationDialog( wgtPrent, const_cast< char* >( "infoDlg" ), al, ac );

	XtUnmanageChild( XmMessageBoxGetChild ( wgtInfo, XmDIALOG_CANCEL_BUTTON ) );
	XtUnmanageChild( XmMessageBoxGetChild ( wgtInfo, XmDIALOG_HELP_BUTTON ) );

	// 質問
	ac = 0;
	XtSetArg( al[ac], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL ); ac++;
	XtSetArg( al[ac], XmNdialogTitle, TitleStr.GetStr() ); ac++;
	XtSetArg( al[ac], XmNokLabelString, rConfig.RefYesStr().GetStr() ); ac++;
	XtSetArg( al[ac], XmNcancelLabelString, rConfig.RefNoStr().GetStr() ); ac++;
	XtSetArg( al[ac], XmNhelpLabelString, rConfig.RefCancelStr().GetStr() ); ac++;
	wgtQuestion = XmCreateQuestionDialog( wgtPrent, const_cast< char* >( "quesDlg" ), al, ac );

	// エラー
	ac = 0;
	XtSetArg( al[ac], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL ); ac++;
	XtSetArg( al[ac], XmNdialogTitle, TitleStr.GetStr() ); ac++;
	XtSetArg( al[ac], XmNokLabelString, rConfig.RefOkStr().GetStr() ); ac++;
	wgtErr = XmCreateErrorDialog( wgtPrent, const_cast< char* >( "errDlg" ), al, ac );

	XtUnmanageChild( XmMessageBoxGetChild ( wgtErr, XmDIALOG_CANCEL_BUTTON ) );
	XtUnmanageChild( XmMessageBoxGetChild ( wgtErr, XmDIALOG_HELP_BUTTON ) );
}

void CMsgBox::ShowInformationMsgBox( const CCompoundStr &rStr ) const
{
	ShowMsgBox( wgtInfo, rStr );
}

int CMsgBox::ShowQuestionMsgBox( const CCompoundStr &rStr, bool ShowCancel ) const
{
	Widget wgt = XmMessageBoxGetChild ( wgtQuestion, XmDIALOG_HELP_BUTTON );
	if ( ShowCancel )
		XtManageChild( wgt );
	else
		XtUnmanageChild( wgt );

	int r = ShowMsgBox( wgtQuestion, rStr ); 
	if ( 3 == r && !ShowCancel ) r = 2;
	return r;
}

void CMsgBox::ShowErrorMsgBox( const CCompoundStr &rStr ) const
{
	ShowMsgBox( wgtErr, rStr );
}

int CMsgBox::ShowMsgBox( Widget wgrMsgBox, const CCompoundStr &rStr ) const
{
	Arg al[2];
	int ac = 0;
	bool OkFlg = false;
	bool CancelFlg = false;
	bool HelpFlg = false;
	bool CloseByWMFlg = false;

	struct tagCallBackData vData[4] = {
		{ &ModalDlgMgr, &OkFlg },
		{ &ModalDlgMgr, &CancelFlg },
		{ &ModalDlgMgr, &HelpFlg },
		{ &ModalDlgMgr, &CloseByWMFlg }
	};

	// コールバックの関数を設定する。
	XtAddCallback( wgrMsgBox, XmNokCallback, MsgBoxBtnPushCB, vData + 0 );
	XtAddCallback( wgrMsgBox, XmNcancelCallback, MsgBoxBtnPushCB, vData + 1 );
	XtAddCallback( wgrMsgBox, XmNhelpCallback, MsgBoxBtnPushCB, vData + 2 );
	XtAddCallback( wgrMsgBox, XmNunmapCallback, MsgBoxBtnPushCB, vData + 3 );

	// メッセージを設定する
	XtSetArg( al[ac], XmNmessageString, rStr.GetStr() ); ac++;
	XtSetValues( wgrMsgBox, al, ac );

	// ダイアログを表示する
	ModalDlgMgr.DoModal( wgrMsgBox );

	// コールバック関数の登録を削除する
	XtRemoveAllCallbacks( wgrMsgBox, XmNokCallback );
	XtRemoveAllCallbacks( wgrMsgBox, XmNcancelCallback );
	XtRemoveAllCallbacks( wgrMsgBox, XmNhelpCallback );
	XtRemoveAllCallbacks( wgrMsgBox, XmNunmapCallback );

	if ( OkFlg ) return 1;
	if ( CancelFlg ) return 2;
	if ( HelpFlg ) return 3;
	return 3;
}

// メッセージボックスのボタンが押されたときのコールバック関数
void CMsgBox::MsgBoxBtnPushCB( Widget w, XtPointer client_data, XtPointer call_data )
{
	struct tagCallBackData *pData = reinterpret_cast< struct tagCallBackData* >( client_data );

	// フラグを設定する
	// （「はい」「いいえ」のボタンが押下されたときのイベントよりも、
	//  　ウインドウマネージャにより閉じられたときのイベントの方が先に通知されることに注意）
	if ( pData->pFlg ) (*pData->pFlg) = true;

	// すでに閉じられている場合は何もしない
	if ( !pData->pModalDlgMgr->IsManaged() )
		return ;

	// ダイアログを閉じる
	pData->pModalDlgMgr->ExitModal();

}
