/*-----------------------------------------------------------------------------
[名称]	FlipDlg.cpp
[概要]	反転文字定義ダイアログクラスの実装
[備考]	なし
[履歴]	2003-04-23	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "FlipDlg.h"
#include "GeneralSetting.h"

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


//-----------------------------------------------------------------------------
// ファイル内変数
//-----------------------------------------------------------------------------
BOOL	g_bVisibleControl = FALSE;		// 再描画中フラグ

// EditBox
int	aEditControl[]={
	IDC_FLIP_LEFTEDIT1,
	IDC_FLIP_RIGHTEDIT1,
	IDC_FLIP_LEFTEDIT2,
	IDC_FLIP_RIGHTEDIT2,
	IDC_FLIP_LEFTEDIT3,
	IDC_FLIP_RIGHTEDIT3,
	IDC_FLIP_LEFTEDIT4,
	IDC_FLIP_RIGHTEDIT4,
	IDC_FLIP_LEFTEDIT5,
	IDC_FLIP_RIGHTEDIT5,
	IDC_FLIP_LEFTEDIT6,
	IDC_FLIP_RIGHTEDIT6,
	IDC_FLIP_LEFTEDIT7,
	IDC_FLIP_RIGHTEDIT7
};


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CFlipDlg::CFlipDlg(CWnd* pParent /*=NULL*/)
	: COwnerTabPage(CFlipDlg::IDD, pParent),
	m_pFlipz( NULL )
{
	//{{AFX_DATA_INIT(CFlipDlg)
	m_bEnable = FALSE;
	//}}AFX_DATA_INIT
}


/*-----------------------------------------------------------------------------
[名称]	データ変換
[機能]	CDialog::DoDataExchange() のヘルプを参照。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CFlipDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFlipDlg)
	DDX_Control(pDX, IDC_FLIP_ENABLE, m_btnEnable);
	DDX_Control(pDX, IDC_FLIP_RIGHTEDIT7, m_EmphasisEdit14);
	DDX_Control(pDX, IDC_FLIP_RIGHTEDIT6, m_EmphasisEdit13);
	DDX_Control(pDX, IDC_FLIP_RIGHTEDIT5, m_EmphasisEdit12);
	DDX_Control(pDX, IDC_FLIP_RIGHTEDIT4, m_EmphasisEdit11);
	DDX_Control(pDX, IDC_FLIP_RIGHTEDIT3, m_EmphasisEdit10);
	DDX_Control(pDX, IDC_FLIP_RIGHTEDIT2, m_EmphasisEdit9);
	DDX_Control(pDX, IDC_FLIP_RIGHTEDIT1, m_EmphasisEdit8);
	DDX_Control(pDX, IDC_FLIP_LEFTEDIT7, m_EmphasisEdit7);
	DDX_Control(pDX, IDC_FLIP_LEFTEDIT6, m_EmphasisEdit6);
	DDX_Control(pDX, IDC_FLIP_LEFTEDIT5, m_EmphasisEdit5);
	DDX_Control(pDX, IDC_FLIP_LEFTEDIT4, m_EmphasisEdit4);
	DDX_Control(pDX, IDC_FLIP_LEFTEDIT3, m_EmphasisEdit3);
	DDX_Control(pDX, IDC_FLIP_LEFTEDIT2, m_EmphasisEdit2);
	DDX_Control(pDX, IDC_FLIP_LEFTEDIT1, m_EmphasisEdit1);
	DDX_Control(pDX, IDC_FLIP_SCROLL, m_scroll);
	DDX_Check(pDX, IDC_FLIP_ENABLE, m_bEnable);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFlipDlg, CDialog)
	//{{AFX_MSG_MAP(CFlipDlg)
	ON_WM_VSCROLL()
	ON_EN_CHANGE(IDC_FLIP_LEFTEDIT1, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_LEFTEDIT2, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_LEFTEDIT3, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_LEFTEDIT4, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_LEFTEDIT5, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_LEFTEDIT6, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_LEFTEDIT7, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_RIGHTEDIT1, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_RIGHTEDIT2, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_RIGHTEDIT3, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_RIGHTEDIT4, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_RIGHTEDIT5, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_RIGHTEDIT6, OnChangeFlipedit)
	ON_EN_CHANGE(IDC_FLIP_RIGHTEDIT7, OnChangeFlipedit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/*-----------------------------------------------------------------------------
[名称]	初期化処理ハンドラ
[機能]	ダイアログコントロール初期化処理。
[戻値]	オンラインヘルプCWnd::OnInitDialog()参照。
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CFlipDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 反転要素のコピー
	{
		if ( m_pFlipz != NULL )
		{
			m_Flipz.GetFliperz()->Copy( *(m_pFlipz->GetFliperz()) );
		}
		TFlip	tNewFlip;
		m_Flipz.GetFliperz()->Add( tNewFlip );
	}

	// 有効フラグ
	m_bEnable = m_pFlipz->GetEnable();

	// 表示更新
	VisibleControl();

	return TRUE;
}


/*-----------------------------------------------------------------------------
[名称]	メッセージハンドラ
[機能]	キー入力処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CFlipDlg::PreTranslateMessage(MSG* pMsg)
{
	BOOL	bBreak = FALSE;

	if( pMsg->hwnd != m_btnEnable.m_hWnd )
	switch( pMsg->message )
	{
	case WM_KEYDOWN:
	// 一部のキー入力でコントロールの移動をする
		switch( pMsg->wParam )
		{
		case VK_TAB:
			if ( ::GetAsyncKeyState( VK_SHIFT ) &0x8000 )
			{
				bBreak = GoPrevControl();
				break;
			}// 下の条件へ
		case VK_RETURN:
		case VK_DOWN:
			bBreak = GoNextControl();
			break;

		case VK_UP:
			bBreak = GoPrevControl();
			break;
		}
		break;

	default:
		break;
	}

	if ( bBreak )
	{
		return( TRUE );
	}
	else
	{
		return COwnerTabPage::PreTranslateMessage(pMsg);
	}
}


/*-----------------------------------------------------------------------------
[名称]	OKボタンハンドラ
[機能]	確定処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CFlipDlg::OnOK()
{
	UpdateData( TRUE );

	//配列コピー
	{
		// 空白要素の削除
		int		idxItem;
		for ( idxItem=m_Flipz.GetFliperz()->GetSize()-1 ; idxItem>=0 ; idxItem-- )
		{
			if( m_Flipz.GetFliperz()->GetAt(idxItem).strLeft.IsEmpty() )
			if( m_Flipz.GetFliperz()->GetAt(idxItem).strRight.IsEmpty() )
			{
				m_Flipz.GetFliperz()->RemoveAt( idxItem, 1 );
			}
		}

		m_pFlipz->GetFliperz()->Copy( *(m_Flipz.GetFliperz()) );
	}

	// 有効フラグ
	m_pFlipz->SetEnable( m_bEnable );

	CDialog::OnOK();
}


/*-----------------------------------------------------------------------------
[名称]	編集ハンドラ
[機能]	空欄の追加などをする。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CFlipDlg::OnChangeFlipedit() 
{
	if ( g_bVisibleControl )
	{
		// 再描画機能によって更新された場合は処理しない
		return;
	}
	// データをアップデートする
	CWnd*		pwndCurrent = GetFocus();
	int			iStartSel;
	int			iEndSel;
	((CEdit*)pwndCurrent)->GetSel(
		iStartSel,
		iEndSel
	);
	{
		// 編集されたテキストを得る
		CString		strEditString;
		pwndCurrent->GetWindowText( strEditString );

		// 編集中の要素番号を得る
		int		idxFlip;
		int		idxControl;
		{
			// コントロールの番号を得る
			int		nControl = sizeof(aEditControl)/sizeof(int);
			for ( idxControl=0 ; idxControl<nControl ; idxControl++ )
			{
				if ( pwndCurrent == GetDlgItem( aEditControl[ idxControl ] ) )
				{
					break;
				}
			}
			if ( idxControl == nControl )
			{
				// 該当コントロールなし
				return;
			}

			idxFlip = m_scroll.GetScrollPos () + (idxControl/2);
		}

		// 要素のアップデートをする
		if ( idxFlip < m_Flipz.GetFliperz()->GetSize() )
		if ( idxControl%2 == 0 )
		{
			CArray< TFlip, TFlip& >*	paz = m_Flipz.GetFliperz();
			(*paz)[ idxFlip ].strLeft = strEditString;
		}
		else
		{
			CArray< TFlip, TFlip& >*	paz = m_Flipz.GetFliperz();
			(*paz)[ idxFlip ].strRight = strEditString;
		}
	}

	// 最下段の要素が空で無い場合は空要素を追加する
	{
		int		idxLast = m_Flipz.GetFliperz()->GetSize() -1;

		if ( idxLast >= 0 )
		{
			if ( m_Flipz.GetFliperz()->GetAt( idxLast ).strLeft.IsEmpty() )
			if ( m_Flipz.GetFliperz()->GetAt( idxLast ).strRight.IsEmpty() )
			{
				return;
			}
		}
		TFlip	tNewFlip;
		m_Flipz.GetFliperz()->Add( tNewFlip );
	}

	VisibleControl();
	((CEdit*)pwndCurrent)->SetSel(
		iStartSel,
		iEndSel
	);
}


/*-----------------------------------------------------------------------------
[名称]	表示更新
[機能]	表示処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CFlipDlg::VisibleControl()
{
g_bVisibleControl = TRUE;

	// エディットボックスにテキストを表示する
	{
		int		idxControl;
		int		nControl = sizeof(aEditControl)/sizeof(int);
		for ( idxControl=0 ; idxControl<nControl ; idxControl+=2 )
		{
			// 要素の存在するぶんだけテキストを表示する
			int		idxItem = m_scroll.GetScrollPos() + idxControl/2;
			if ( idxItem >= m_Flipz.GetFliperz()->GetSize() )
			{
				break;
			}

			CWnd*	pwndLeft = GetDlgItem( aEditControl[ idxControl ] );
			if ( pwndLeft != NULL )
			{
				pwndLeft->SetWindowText( m_Flipz.GetFliperz()->GetAt(idxItem).strLeft );
				pwndLeft->ShowWindow( SW_SHOW );
				pwndLeft->EnableWindow( TRUE );
			}

			CWnd*	pwndRight = GetDlgItem( aEditControl[ idxControl+1 ] );
			if ( pwndRight != NULL )
			{
				pwndRight->SetWindowText( m_Flipz.GetFliperz()->GetAt(idxItem).strRight );
				pwndRight->ShowWindow( SW_SHOW );
				pwndRight->EnableWindow( TRUE );
			}
		}
		for ( ; idxControl<nControl ; idxControl+=2 )
		{
			// 要素の存在しない行は非表示にする
			CWnd*	pwndLeft = GetDlgItem( aEditControl[ idxControl ] );
			if ( pwndLeft != NULL )
			{
				pwndLeft->ShowWindow( SW_HIDE );
				pwndLeft->EnableWindow( SW_HIDE );
			}

			CWnd*	pwndRight = GetDlgItem( aEditControl[ idxControl+1 ] );
			if ( pwndRight != NULL )
			{
				pwndRight->ShowWindow( SW_HIDE );
				pwndRight->EnableWindow( SW_HIDE );
			}
		}

		// スクロールバー制御
		m_scroll.SetScrollRange( 0, m_Flipz.GetFliperz()->GetSize()-1 );

		UpdateData( FALSE );
	}

g_bVisibleControl = FALSE;
}


/*-----------------------------------------------------------------------------
[名称]	次へフォーカス移動
[機能]	次のコントロールへフォーカスを移動する。
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CFlipDlg::GoNextControl()
{

	// 編集中の要素番号を得る
	int		idxControl;
	{
		// フォーカスのあるコントロールの番号を得る
		CWnd*		pwndCurrent = GetFocus();

		int		nControl = sizeof(aEditControl)/sizeof(int);
		for ( idxControl=0 ; idxControl<nControl ; idxControl++ )
		{
			if ( pwndCurrent == GetDlgItem( aEditControl[ idxControl ] ) )
			{
				break;
			}
		}

		// エディットボックス以外での入力。無視。
		if ( idxControl == nControl )
		{
			return( FALSE );
		}

		// 最下段からの移動。スクロールの可能性あり
		if ( idxControl == nControl-1 )
		{
			// 該当コントロールなし
			// もしさらに要素があるならばスクロールさせる
			int		idxFlip = m_scroll.GetScrollPos() + nControl/2;
			if ( idxFlip < m_Flipz.GetFliperz()->GetSize() )
			{
				PostMessage ( WM_VSCROLL , SB_LINEDOWN );
				GetDlgItem( aEditControl[ nControl-2 ] )->SetFocus();
			}
			else
			{
				// エディットボックス要素がなければチェックボックスにフォーカスを当てる
				m_btnEnable.SetFocus();
			}
			return( TRUE );
		}

		// 通常の移動。次の要素にフォーカスを当てる
		{
			CWnd*	pwnd = GetDlgItem( aEditControl[ idxControl +1 ] );
			if ( pwnd->IsWindowVisible() )
			{
				pwnd->SetFocus();
			}

		}
		return( TRUE );
	}
}


/*-----------------------------------------------------------------------------
[名称]	前へフォーカス移動
[機能]	前のコントロールへフォーカスを移動する。
[戻値]	BOOL	処理結果 [-] (TRUE:成功、FALSE:失敗)
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CFlipDlg::GoPrevControl()
{
	// 編集中の要素番号を得る
	int		idxControl;
	{
		// フォーカスのあるコントロールの番号を得る
		CWnd*		pwndCurrent = GetFocus();

		// コントロールの番号を得る
		int		nControl = sizeof(aEditControl)/sizeof(int);
		for ( idxControl=1 ; idxControl<nControl ; idxControl++ )
		{
			if ( pwndCurrent == GetDlgItem( aEditControl[ idxControl ] ) )
			{
				break;
			}
		}
		if ( idxControl == nControl )
		{
			// 該当コントロールなし
			// もしさらに要素があるならばスクロールさせる
			int		idxFlip = m_scroll.GetScrollPos();
			if ( idxFlip > 0 )
			{
				PostMessage ( WM_VSCROLL , SB_LINEUP );
				GetDlgItem( aEditControl[ 1 ] )->SetFocus();
			}
			else
			{
				// エディットボックス要素がなければチェックボックスにフォーカスを当てる
				m_btnEnable.SetFocus();
			}
			return( TRUE );
		}

		// 前の要素にフォーカスを当てる
		{
			if ( idxControl > 0 )
			{
				CWnd*	pwnd = GetDlgItem( aEditControl[ idxControl -1 ] );
				pwnd->SetFocus();
			}
		}
		return( TRUE );
	}
}


/*-----------------------------------------------------------------------------
[名称]	スクロールハンドラ
[機能]	スクロール処理に伴う再表示。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CFlipDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{

	int		iPos = m_scroll.GetScrollPos();
	switch ( nSBCode )
	{
	case	SB_LINEUP:			iPos -= 1;	break;
	case 	SB_LINEDOWN:		iPos += 1;	break;
	case 	SB_THUMBPOSITION:	iPos = nPos;break;
	case 	SB_THUMBTRACK:		iPos = nPos;break;
	case 	SB_PAGEUP:			iPos -= 7;	break;
	case 	SB_PAGEDOWN:		iPos += 7;	break;
	case 	SB_BOTTOM:			iPos = m_scroll.GetScrollLimit();break;
	}
	m_scroll.SetScrollPos( iPos );

	// 再描画
	VisibleControl();

	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
