//-----------------------------------------------------------------------------
// ユーザー
//-----------------------------------------------------------------------------

#include <NWHEAP.H>
#include <Nindows2SDK.H>
#include "nwUser.H"

/*-----------------------------------------------------------------------------
フォームを作成したあとにフォント切り替え時に発生するコールバックを登録します。
フォント切り替えが発生した場合、一旦フォームを破棄し、再構築します。ユーザー
メニューへメニューアイテムを登録し、メニュークリック時のイベントを取得します。
その他フォーム描画イベント、ボタンクリックイベントを取得します。
フォントサイズが変更された場合ウインドウやボタンのサイズも変更する必要があり、
それを実現しているのがNWSCALマクロです。スケーリングする必要のある値にはこの
マクロを使用してください。
-----------------------------------------------------------------------------*/

NWUSER *pUser;
//-----------------------------------------------------------------------------
// コールバック発生時に呼ばれます。
static void nwCallback( NWCALLBACKCONTEXT eCtx, void* pParam )
{
	switch (eCtx) {
	// フォント切り替え前に呼ばれます。ここでフォームを破棄してください。
	case NW_CALLBACK_FONT_CHANGING:
		nwUnregistForm( pUser );
		NWDELETE( pUser );
		break;
	// フォント切り替え後に呼ばれます。再びフォームを構築します。
	case NW_CALLBACK_FONT_CHANGED:
		pUser = new NWUSER( nwGetDesktop() );
		nwRegistForm( pUser );
		pUser->Show();
		break;
	}
}
//-----------------------------------------------------------------------------
void nwInitializeUser( void )
{
	pUser = new NWUSER( nwGetDesktop() );
	nwRegistForm( pUser );
	pUser->Show();
	
	// コールバックを登録します
	pGlobal->RegistCallback( NW_CALLBACK_FONT_CHANGING, nwCallback );
	pGlobal->RegistCallback( NW_CALLBACK_FONT_CHANGED , nwCallback );
}
void nwFinalizeUser( void )
{
	// コールバックを解除します
	pGlobal->UnregistCallback( NW_CALLBACK_FONT_CHANGING, nwCallback );
	pGlobal->UnregistCallback( NW_CALLBACK_FONT_CHANGED , nwCallback );
	
	nwUnregistForm( pUser );
	NWDELETE( pUser );
}
//-----------------------------------------------------------------------------
NWUSER::NWUSER( void )
{
}
//-----------------------------------------------------------------------------
NWUSER::NWUSER( PNWCONTROL pRootControl ) :
	NWFORM( pRootControl )
{
	// 登録するメニューのテンプレート(C++のあれとは違う)です。ショートカットキー
	// は登録しても機能しません。階層をつけることも可能です。
	NWMENUTEMPLATE sMenuItem = {
		TRUE,
		TRUE,
		-1,
		0x100,
		'U',
		"&User",
		NW_CMD_ONCLICK,
		NULL,
	};
	
	SetCaption( "USER FORM" );
	SetFormStyle( NW_FORM_NORMAL );
	
	NWRECT R;
	R.nX = 300;
	R.nY = 200;
	R.nW = NWSCALX(200);		// フォントサイズに対応したスケーリングをかける
	R.nH = NWSCALY(150);		// フォントサイズに対応したスケーリングをかける
	SetRectClip( &R );
	
	// パネルとボタンを作成します。それぞれ親を指定して作成しています。
	// パネルを上詰で配置し、ボタンはそのパネルの上に左詰で配置します。
	pPanel   = new NWGRAPHIC( this );
	pButtonA = new NWBUTTON( pPanel );
	pButtonB = new NWBUTTON( pPanel );
	
	R.nH = NWSCALY(20);
	pPanel->SetAlign( alTop );
	pPanel->SetRect( &R );
	
	R.nW = NWSCALX(48);
	pButtonA->SetAlign( alLeft );
	pButtonA->SetRect( &R );
	pButtonA->SetCaption( "OK" );
	pButtonA->nTag = 0x100;
	
	pButtonB->SetAlign( alLeft );
	pButtonB->SetRect( &R );
	pButtonB->SetCaption( "CANCEL" );
	pButtonB->nTag = 0x101;
	
	nTest = 0;
	
	// メニューを登録する。関数内でインスタンスが作成されそのポインタが返る。
	// nTagにthisを入れることによってイベントをハンドリングしています。
	sMenuItem.nTag = (int)this;
	pMenuItem = nwAddUserMenu( &sMenuItem );
}
//-----------------------------------------------------------------------------
NWUSER::~NWUSER( void )
{
	// メニューを破棄します。インスタンスも関数内で破棄されます。
	nwDelUserMenu( pMenuItem );
	
	// パネルとボタンを破棄します。
	NWDELETE( pPanel   );
	NWDELETE( pButtonA );
	NWDELETE( pButtonB );
}
//-----------------------------------------------------------------------------
int NWUSER::OnShow( PNWPARAM pParam )
{
	// コントロールが表示されたときに発生するイベント。コントロールがフォームか
	// どうかをチェックしてから内容を記述します。ここではメニューアイテムの
	// チェックマークをオンにしています。
	if (pParam->pSender==this)
		pMenuItem->SetIconIndex(26);
	return 0;
}
//-----------------------------------------------------------------------------
int NWUSER::OnHide( PNWPARAM pParam )
{
	// コントロールが隠蔽されたときに発生するイベント。コントロールがフォームか
	// どうかをチェックしてから内容を記述します。ここではメニューアイテムの
	// チェックマークをオフにしています。
	if (pParam->pSender==this)
		pMenuItem->SetIconIndex(-1);
	return 0;
}
//-----------------------------------------------------------------------------
int NWUSER::OnClick( PNWPARAM pParam )
{
	// メニューがクリックされたときのイベントです。
	if (pParam->pSender==pMenuItem) {
		if (IsVisible()==FALSE) {
			// 非表示だった場合は、表示した後アクティブにして前面に出します。
			Show();
			nwSetActiveForm( this );
			nwBringToFront( this );
		} else {
			// 表示中だった場合は、非表示にします。
			Hide();
		}
	}
	// ボタンＡがクリックされたときのイベントです。
	if (pParam->pSender==pButtonA) {
		
		// 描画関係の関数は必ずペイントイベント内で呼んでください。
		nTest = 1;
	}
	// ボタンＢがクリックされたときのイベントです。
	if (pParam->pSender==pButtonB) {
		
		nTest = 0;
	}
	return 0;
}
//-----------------------------------------------------------------------------
int NWUSER::OnPaint( PNWPARAM pParam )
{
	// フォームを描画するイベントです。
	if (pParam->pSender==this) {
		PNWFONT pFont = pGlobal->GetCurrentFont();
		pFont->SetColor( &sFontColor );
		
		// 描画するコントロールに対する相対座標です。フォームの場合(0,0)を
		// 指定すると左上隅になります。
		SetPos( NWSCALX(60), NWSCALY(70) );
		Print( "Hello World." );
	}
	// パネルを描画するイベントです。
	if (pParam->pSender==pPanel) {
		if (nTest==1) {
			PNWFONT pFont = pGlobal->GetCurrentFont();
			pFont->SetColor( &sFontColor );
			
			pPanel->SetPos( NWSCALX(110), NWSCALY(4) );
			pPanel->Print( "CLICK" );
		}
	}
	return 0;
}
//-----------------------------------------------------------------------------
