/*-----------------------------------------------------------------------------
[名称]	OwnerTabCtrl.cpp
[概要]	タブコントロールクラスのヘッダ
[備考]	なし
[履歴]	2003-01-25	NC		コメント付加(moralog)
		2003-12-02	b031130 (3174)共通設定の画面にてCtrl+PgUp/PgDnで移動不可(dincom)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "OwnerTabCtrl.h"
#include "CharPaletteCanvasDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//-----------------------------------------------------------------------------
// コンストラクタ・デストラクタ
//-----------------------------------------------------------------------------
COwnerTabCtrl::COwnerTabCtrl()
{
}

COwnerTabCtrl::~COwnerTabCtrl()
{
}


/*-----------------------------------------------------------------------------
[名称]	ページ成形
[機能]	ページをタブコントロールの大きさにそろえ、アクティブページを表示する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void COwnerTabCtrl::ReflectPagez()
{
	// ページ内ダイアログの大きさと位置を取得
	CRect	rcTabClient;
	CPoint	ptClientLeftTop;
	{
		// タブコントロールのクライアント領域取得
		GetClientRect( &rcTabClient );
		AdjustRect( FALSE, &rcTabClient );

		// タブコントロールのクライアント領域スクリーン座標
		CPoint	ptTabScreen(rcTabClient.left, rcTabClient.top);
		ClientToScreen( &ptTabScreen );

		// コントロールの座標
		CRect	rcControlScreen;
		GetWindowRect( &rcControlScreen );

		// タブのクライアント領域
		ptClientLeftTop.x = rcTabClient.left;
		ptClientLeftTop.y = rcTabClient.top;
	}

	// アクティブなページを取得
	int		idxActiveTab = GetCurFocus();

	// ページの位置大きさ・表示を制御
	int		idxTab;
	for( idxTab=0 ; idxTab<GetItemCount() ; idxTab++ )
	{
		// タブ情報の取得
		TC_ITEM		tTabInfo;
		memset( &tTabInfo, 0x00, sizeof(tTabInfo) );
		tTabInfo.mask = TCIF_PARAM;
		GetItem( idxTab, &tTabInfo );

		CDialog*	pPage = (CDialog*)(tTabInfo.lParam);
		if ( pPage != NULL )
		{
			// ページの位置と大きさを設定
			pPage->SetWindowPos(
					NULL,
					ptClientLeftTop.x,
					ptClientLeftTop.y,
					rcTabClient.Width(),
					rcTabClient.Height(),
					SWP_NOZORDER
			);

			// アクティブなページのみ表示する
			if( idxTab == idxActiveTab )
			{
				pPage->ShowWindow( SW_SHOW );
				pPage->SetFocus();
			}
			else
			{
				pPage->ShowWindow( SW_HIDE );
			}
		}
	}	
}


//-----------------------------------------------------------------------------
// メッセージハンドラ
//-----------------------------------------------------------------------------
BEGIN_MESSAGE_MAP(COwnerTabCtrl, CTabCtrl)
	//{{AFX_MSG_MAP(COwnerTabCtrl)
	ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/*-----------------------------------------------------------------------------
[名称]	タブ変更ハンドラ
[機能]	タブ変更に応じて、ページ（ダイアログ）を表示する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void COwnerTabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
{
// ▼ (ワーニング回避) BGN 2003.12.29 (moralog) warning C4100
	// warning C4100 回避
	pNMHDR;
// ▲ (ワーニング回避) END

	// アクティブなページを取得
	int		idxActiveTab = GetCurFocus();

	// ページの表示を制御
	int		idxTab;
	for( idxTab=0 ; idxTab<GetItemCount() ; idxTab++ )
	{
		// タブ情報の取得
		TC_ITEM		tTabInfo;
		memset( &tTabInfo, 0x00, sizeof(tTabInfo) );
		tTabInfo.mask = TCIF_PARAM;
		GetItem( idxTab, &tTabInfo );

		CDialog*	pPage = (CDialog*)(tTabInfo.lParam);
		if ( pPage != NULL )
		{
			// アクティブなページのみ表示する
			if( idxTab == idxActiveTab )
			{
				pPage->ShowWindow( SW_SHOW );
			}
			else
			{
				pPage->ShowWindow( SW_HIDE );
			}
		}
	}	

	*pResult = 0;
}


/*-----------------------------------------------------------------------------
[名称]	メッセージハンドラ
[機能]	キーボード操作でページへフォーカスを移す。
[戻値]	なし
[備考]	上下でページにフォーカスを移す。
		左右でタブを移動する。
-----------------------------------------------------------------------------*/
BOOL COwnerTabCtrl::PreTranslateMessage(MSG* pMsg) 
{
	if ( pMsg->hwnd == m_hWnd )
	if ( pMsg->message == WM_KEYDOWN )
	{
		switch( pMsg->wParam )
		{
		case VK_UP:
		case VK_DOWN:
			{
				// アクティブなページを取得
				int		idxActiveTab = GetCurFocus();

				// タブ情報の取得
				TC_ITEM		tTabInfo;
				memset( &tTabInfo, 0x00, sizeof(tTabInfo) );
				tTabInfo.mask = TCIF_PARAM;
				GetItem( idxActiveTab, &tTabInfo );

				CDialog*	pPage = (CDialog*)(tTabInfo.lParam);
				if ( pPage != NULL )
				{
					pPage->SetFocus();
				}
			}
			break;
		// ▼ (3174) BGN 2003.12.02 (dincom)
		case VK_PRIOR:
			{
				if( ::GetAsyncKeyState( VK_CONTROL ) )
				{
					//左のタブへ
					ShowPrevPage();
				}
			}
			break;
		case VK_NEXT:
			{
				if( ::GetAsyncKeyState( VK_CONTROL ) )
				{
					//右のタブへ
					ShowNextPage();
				}
			}
			break;
		// ▲ (3174) END

/*
		case VK_LEFT:
			{
				// アクティブなページを取得
				int		idxActiveTab = GetCurFocus();
				idxActiveTab--;
				if ( idxActiveTab < 0 )
				{
					idxActiveTab = GetItemCount()-1;
				}
				SetCurFocus( idxActiveTab );
			}
			break;
		case VK_RIGHT:
			{
				// アクティブなページを取得
				int		idxActiveTab = GetCurFocus();
				idxActiveTab++;
				if ( idxActiveTab >= GetItemCount() )
				{
					idxActiveTab = 0;
				}
				SetCurFocus( idxActiveTab );
			}
			break;
*/
		default:
			break;
		}	
	}
	
	return CTabCtrl::PreTranslateMessage(pMsg);
}

// ▼ (3174) BGN 2003.12.02 (dincom)
/*-----------------------------------------------------------------------------
[名称]	タブページ切り替え（前）
[機能]	タブページを前へ移動する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void COwnerTabCtrl::ShowPrevPage()
{
	int		idxActiveTab = GetCurFocus();
	idxActiveTab--;
	if ( idxActiveTab < 0 )
	{
		idxActiveTab = GetItemCount()-1;
	}
	SetCurFocus( idxActiveTab );
}

/*-----------------------------------------------------------------------------
[名称]	タブページ切り替え（次）
[機能]	タブページを次へ移動する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void COwnerTabCtrl::ShowNextPage()
{
	int		idxActiveTab = GetCurFocus();
	idxActiveTab++;
	if ( idxActiveTab >= GetItemCount() )
	{
		idxActiveTab = 0;
	}
	SetCurFocus( idxActiveTab );
}
// ▲ (3174) END