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

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

/*-----------------------------------------------------------------------------
ビットマップを読み込んでそれをアイコンとしてボタンに貼り付ける方法と、そのまま
イメージとして表示する方法があります。
-----------------------------------------------------------------------------*/

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 )
{
	NWRECT R;
	SetCaption( "USER FORM" );
	SetFormStyle( NW_FORM_NORMAL );
	
	R.nX = 300;
	R.nY = 200;
	R.nW = NWSCALX(200);		// フォントサイズに対応したスケーリングをかける
	R.nH = NWSCALY(150);		// フォントサイズに対応したスケーリングをかける
	SetRectClip( &R );
	
	// ビットマップを作成し、GDからPVRファイルを読み込みます。
	pBitmap = new NWBITMAP;
	pBitmap->LoadFromFile( "icon.pvr" );
	
	// パネルとボタンを作成します。それぞれ親を指定して作成しています。
	// パネルを上詰で配置し、ボタンはそのパネルの上に左詰で配置します。
	// ボタンにアイコンを設定します。
	pPanel  = new NWGRAPHIC( this );
	R.nH = NWSCALY(40);
	pPanel->SetAlign( alTop );
	pPanel->SetRect( &R );
	
	R.nH  = NWSCALX(40);
	R.nW  = NWSCALY(40);
	for( int i=0; i<4; i++ ) {
		pBtn[i] = new NWBUTTON( pPanel );
		pBtn[i]->SetAlign( alLeft );
		pBtn[i]->SetRect( &R );
		pBtn[i]->SetBitmap( pBitmap );
		pBtn[i]->nTag = 0x100 + i;
		
		NWCOLOR sCol = 0xfeffffff;
		pBtn[i]->SetFontColor( &sCol );
		
		NWRECT R2;
		R2.nX = (i%2)*32;
		R2.nY = (i/2)*32;
		R2.nW = 32;
		R2.nH = 32;
		pBtn[i]->SetBitmapRect( &R2 );
	}
	
	// 登録するメニューのテンプレート(C++のあれとは違う)です。ショートカットキー
	// は登録しても機能しません。階層をつけることも可能です。
	NWMENUTEMPLATE sMenuItem = {
		TRUE,
		TRUE,
		-1,
		0x100,
		'U',
		"&User",
		NW_CMD_ONCLICK,
		NULL,
	};
	
	// メニューを登録する。関数内でインスタンスが作成されそのポインタが返る。
	// nTagにthisを入れることによってイベントをハンドリングしています。
	sMenuItem.nTag = (int)this;
	pMenuItem = nwAddUserMenu( &sMenuItem );
}
//-----------------------------------------------------------------------------
NWUSER::~NWUSER( void )
{
	// メニューを破棄します。インスタンスも関数内で破棄されます。
	nwDelUserMenu( pMenuItem );
	
	// パネルとボタンを破棄します。
	NWDELETE( pBtn[0] );
	NWDELETE( pBtn[1] );
	NWDELETE( pBtn[2] );
	NWDELETE( pBtn[3] );
	NWDELETE( pPanel  );
	NWDELETE( pBitmap );
}
//-----------------------------------------------------------------------------
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();
		}
	}
	return 0;
}
//-----------------------------------------------------------------------------
int NWUSER::OnPaint( PNWPARAM pParam )
{
	// フォームを描画するイベントです。
	if (pParam->pSender==this) {
		PNWFONT pFont = pGlobal->GetCurrentFont();
		pFont->SetColor( &sFontColor );
		
		// イメージと枠を表示しています。
		NWRECT dstR,srcR;
		NWCOLOR Col[2];
		
		srcR.nX =  0;
		srcR.nY =  0;
		srcR.nW = 64;
		srcR.nH = 64;
		dstR.nX =  8;
		dstR.nY = 60;
		dstR.nW = 64;
		dstR.nH = 64;
		
		Col[0] = 0xfeffffff;
		BitBlt( &dstR, &srcR, pBitmap, &Col[0] );
		
		nwInflateRect( &dstR, -1 );
		Col[0] = 0xffffffff;
		Col[1] = 0xff000000;
		DrawBox( &dstR, &Col[0] );
	}
	return 0;
}
//-----------------------------------------------------------------------------
