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

#include "ModalDlg.h"

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

CModalDlg::CModalDlg()
{
	IsUnmanaged = true;
	m_dlg = NULL;
}

CModalDlg::~CModalDlg()
{

}

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

// モーダルダイアログを表示
// IsCompletelyに真を設定した場合は、
// argDlgもしくはその子ウィジットのイベントのみをディスパッチする
void CModalDlg::DoModal( Widget argDlg, bool IsCompletely )
{
	XEvent event;

	IsUnmanaged = false;
	XtManageChild( argDlg );	// ダイアログをマネージする
	m_dlg = argDlg;

	while( !IsUnmanaged ) {	// このダイアログが消されるまで
		XtAppNextEvent( XtWidgetToApplicationContext( m_dlg ), &event );
		if ( !IsCompletely || XtWindow( argDlg ) == event.xany.window )
			XtDispatchEvent( &event );
	}
}

// ダイアログを閉じる
void CModalDlg::ExitModal()
{

	// フラグを設定してダイアログをアンマネージする
	IsUnmanaged = true;
	if ( XtIsManaged( m_dlg ) )
		XtUnmanageChild( m_dlg );
}

// ダイアログが表示されているか否か
bool CModalDlg::IsManaged() const
{
	return !IsUnmanaged;
}

// 指定されたウィジットの親子関係を調べる
// cがpの子孫のウィジットであれば真を返す
bool CModalDlg::IsChildWidget( Widget p, Widget c ) const
{
	if ( NULL == c ) return false;
	if ( p == c ) return true;
	return IsChildWidget( p, XtParent( c ) );
}

