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

#include "TaEditProcessingDlg.h"
#include "TaEditShell.h"


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

CTaEditProcessingDlg::CTaEditProcessingDlg() :
	IsInterrupted( false ), EnableTimer( false )
{
}

CTaEditProcessingDlg::~CTaEditProcessingDlg()
{
	// 万一の場合
	if ( EnableTimer )
		XtRemoveTimeOut( TimerID );
	EnableTimer = false;
}

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

// 構築
void CTaEditProcessingDlg::OnCreate( Widget argWgt, XtPointer user_data )
{
	Widget wWgt = XmMessageBoxGetChild ( argWgt, XmDIALOG_CANCEL_BUTTON );
	XtUnmanageChild( wWgt );
	wWgt = XmMessageBoxGetChild ( argWgt, XmDIALOG_HELP_BUTTON );
	XtUnmanageChild( wWgt );
}

// ダイアログを表示・処理を開始する
bool CTaEditProcessingDlg::ShowDlg( CProcesingObj *pArgPO, int delay )
{
	IsInterrupted = false;
	pProcessingObj = pArgPO;

	// 監視用タイマを生成
	EnableTimer = true;
	TimerID = XtAppAddTimeOut( XtWidgetToApplicationContext( m_ProcessingDlg ), 100, CTaEditProcessingDlg::TimerEventEntry, this );

	pProcessingObj->start();	// ワーカースレッドを開始する

	// 指定された時間だけ、ダイアログを表示しないで待つ
	if ( !pProcessingObj->WaitThreadTerminateForTime( delay ) ) {
		// 一定時間が経過しても終了しない場合は、ダイアログを表示する
		m_ModalDlg.DoModal( m_ProcessingDlg, false );
	}

	// タイマが登録されていた場合は、それを破棄する
	if ( EnableTimer ) XtRemoveTimeOut( TimerID );
	EnableTimer = false;

	pProcessingObj->WaitThreadTerminate();	// ワーカースレッドの終了を待ち合わせる
	return IsInterrupted;
}

// OKボタンの押下（処理を中断する）
void CTaEditProcessingDlg::OnOK( Widget argWgt, XtPointer user_data )
{
	pProcessingObj->Interrupt();	// ワーカースレッドに割り込みをかける
	m_ModalDlg.ExitModal();	// ダイアログを閉じる
	IsInterrupted = true;	// フラグを設定する
}

// タイマイベント
void CTaEditProcessingDlg::OnTimer()
{
	EnableTimer = false;

	// ワーカースレッドの処理が終了したか否かを問い合わせる
	if ( pProcessingObj->EnableExit() ) {
		// 処理が終了したらダイアログを閉じる
		if ( m_ModalDlg.IsManaged() )
			m_ModalDlg.ExitModal();
	}
	else {
		// 再度タイマを設定する
		TimerID = XtAppAddTimeOut( XtWidgetToApplicationContext( m_ProcessingDlg ), 100, CTaEditProcessingDlg::TimerEventEntry, this );
		EnableTimer = true;
	}
}

// タイマイベントの受け取り用
void CTaEditProcessingDlg::TimerEventEntry( XtPointer client_data, XtIntervalId *timer )
{
	reinterpret_cast< CTaEditProcessingDlg* >( client_data )->OnTimer();
}

