/*-----------------------------------------------------------------------------
[名称]	CharPaletteSettingDlg.cpp
[概要]	文字パレット設定ダイアログクラスの実装
[備考]	なし
[履歴]	2003-04-22	NC		コメント付加(moralog)
-----------------------------------------------------------------------------*/


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "CharPaletteSettingDlg.h"
#include "CharPalette.h"
#include <afxtempl.h>
#include "GeneralSetting.h"
#include "ExeCommon.h"
#include "MainFrm.h"
#include "CharPaletteTabEditDlg.h"

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


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CCharPaletteSettingDlg::CCharPaletteSettingDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCharPaletteSettingDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCharPaletteSettingDlg)
	m_iScrollBarAlign = -1;
	m_uiHeight = 0;
	m_uiWidth = 0;
	m_bTopMost = FALSE;
	m_iTabAlign = -1;
	m_uiHistoryCount = 0;
	m_bHistorySort = FALSE;
	//}}AFX_DATA_INIT
}


/*-----------------------------------------------------------------------------
[名称]	データ変換
[機能]	CDialog::DoDataExchange() のヘルプを参照。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCharPaletteSettingDlg)
	DDX_Control(pDX, IDC_CHARPALETTE_SETTING_UP, m_btnUp);
	DDX_Control(pDX, IDC_CHARPALETTE_SETTING_EDIT, m_btnEdit);
	DDX_Control(pDX, IDC_CHARPALETTE_SETTING_DOWN, m_btnDown);
	DDX_Control(pDX, IDC_CHARPALETTE_SETTING_DELETE, m_btnDelete);
	DDX_Control(pDX, IDC_CHARPALETTE_SETTING_ADD, m_btnAdd);
	DDX_Control(pDX, IDC_CHARPALETTE_SETTING_TABLIST, m_listTab);
	DDX_Radio(pDX, IDC_CHARPALETTESETTING_SCROLLBARALIGNTOP, m_iScrollBarAlign);
	DDX_Text(pDX, IDC_CHARPALETTE_SETTING_BUTTONHEIGHT, m_uiHeight);
	DDX_Text(pDX, IDC_CHARPALETTE_SETTING_BUTTONWIDTH, m_uiWidth);
	DDX_Check(pDX, IDC_CHARPALETTE_SETTING_TOPMOST, m_bTopMost);
	DDX_Radio(pDX, IDC_CHARPALETTESETTING_TABALIGNTOP, m_iTabAlign);
	DDX_Text(pDX, IDC_CHARPALETTE_SETTING_HISTORYCOUNT, m_uiHistoryCount);
	DDX_Check(pDX, IDC_CHARPALETTE_SETTING_HISTORYSORT, m_bHistorySort);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCharPaletteSettingDlg, CDialog)
	//{{AFX_MSG_MAP(CCharPaletteSettingDlg)
	ON_BN_CLICKED(IDC_CHARPALETTE_SETTING_ADD, OnCharpaletteSettingAdd)
	ON_BN_CLICKED(IDC_CHARPALETTE_SETTING_EDIT, OnCharpaletteSettingEdit)
	ON_BN_CLICKED(IDC_CHARPALETTE_SETTING_DELETE, OnCharpaletteSettingDelete)
	ON_LBN_SELCHANGE(IDC_CHARPALETTE_SETTING_TABLIST, OnSelchangeCharpaletteSettingTablist)
	ON_BN_CLICKED(IDC_CHARPALETTE_SETTING_UP, OnCharpaletteSettingUp)
	ON_BN_CLICKED(IDC_CHARPALETTE_SETTING_DOWN, OnCharpaletteSettingDown)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/*-----------------------------------------------------------------------------
[名称]	初期化ハンドラ
[機能]	初期化処理。
[戻値]	CDialog::OnInitDialog()のヘルプを参照。
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CCharPaletteSettingDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	// コントロールに初期値を設定
	CCharPaletteManager*	pManager = CGeneralSetting::GetInstance()->GetCharPaletteManager();
	m_bTopMost = pManager->m_bCharPaletteFore;
	m_iScrollBarAlign = (int)pManager->m_eScrollBarAlign;
	m_iTabAlign = (int)pManager->m_eTabAlign;
	m_uiHeight = pManager->m_sizeButton.cy;
	m_uiWidth = pManager->m_sizeButton.cx;
	m_CharPaletteDefine.Copy( *CGeneralSetting::GetInstance()->GetCharPaletteManager()->GetDefine() );
	m_bHistorySort = pManager->m_bHistorySort;
	m_uiHistoryCount = pManager->m_uiHistoryCount;

	// リストへタブを列挙
	CArray<CCharPalette, CCharPalette&>* paPalettez = m_CharPaletteDefine.GetItemz();
	for ( int idxTab=0 ; idxTab<paPalettez->GetSize() ; idxTab++ )
	{
		m_listTab.AddString( paPalettez->GetAt( idxTab ).GetName() );
	}

	UpdateData( FALSE );
	VisibleControl();
	return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
	              // 例外: OCX プロパティ ページの戻り値は FALSE となります
}


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

	CCharPaletteManager*	pManager = CGeneralSetting::GetInstance()->GetCharPaletteManager();

	// コントロールの内容を外部へ反映
	pManager->GetDefine()->Copy( m_CharPaletteDefine );
	pManager->m_bCharPaletteFore = m_bTopMost;
	pManager->m_sizeButton = CSize( m_uiWidth, m_uiHeight );
	pManager->m_eScrollBarAlign = (EScrollBarAlign)m_iScrollBarAlign;
	pManager->m_eTabAlign = (EScrollBarAlign)m_iTabAlign;
	pManager->m_bHistorySort = m_bHistorySort;
	pManager->m_uiHistoryCount = m_uiHistoryCount;

	pManager->RebuildCharPaletteDlg();

	CDialog::OnOK();
}


/*-----------------------------------------------------------------------------
[名称]	Addボタンハンドラ
[機能]	タブの追加処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::OnCharpaletteSettingAdd() 
{
	long	idxTab = m_listTab.GetCurSel();

	CString		strNewName( _T("(新規)") );

	CCharPalette	Palette;
	Palette.SetName( strNewName );
	if ( idxTab < 0 )
	{
		m_listTab.InsertString( 0, strNewName );
		m_CharPaletteDefine.InsertTab( 0, Palette );
	}
	else
	{
		m_listTab.InsertString( idxTab, strNewName );
		m_CharPaletteDefine.InsertTab( idxTab, Palette );
	}
	VisibleControl();
}


/*-----------------------------------------------------------------------------
[名称]	Editボタンハンドラ
[機能]	タブの編集処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::OnCharpaletteSettingEdit() 
{
	long	idxTab = m_listTab.GetCurSel();
	if ( idxTab < 0 )
	{
		return;
	}

	CCharPaletteTabEditDlg	dlg;

	CCharPalette& Palette = (*m_CharPaletteDefine.GetItemz())[ idxTab ];
	dlg.m_strName = Palette.GetName();
	if( dlg.DoModal() == IDOK )
	{
		Palette.SetName( dlg.m_strName );
		m_listTab.DeleteString ( idxTab );
		m_listTab.InsertString( idxTab, dlg.m_strName );
	}
}


/*-----------------------------------------------------------------------------
[名称]	Deleteボタンハンドラ
[機能]	タブの削除処理。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::OnCharpaletteSettingDelete() 
{
	long	idxTab = m_listTab.GetCurSel();
	if ( idxTab < 0 )
	{
		return;
	}
	m_CharPaletteDefine.GetItemz()->RemoveAt( idxTab );
	m_listTab.DeleteString ( idxTab );

	VisibleControl();
}


/*-----------------------------------------------------------------------------
[名称]	タブリスト選択変更ハンドラ
[機能]	タブ選択変更に伴うボタンのEnable制御。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::OnSelchangeCharpaletteSettingTablist() 
{
	VisibleControl();
}


/*-----------------------------------------------------------------------------
[名称]	ボタンのEnable制御
[機能]	ボタンのEnable状態制御。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::VisibleControl() 
{
	// 移動や編集削除は選択状態のときのみ利用できる
	long	idxTab = m_listTab.GetCurSel();
	BOOL	bSelected = ( idxTab >= 0 );

	// 履歴タブ名称は編集できない
	BOOL	bEditable = FALSE;
	if ( bSelected )
	{
		CCharPalette& Palette = (*m_CharPaletteDefine.GetItemz())[ idxTab ];
		bEditable = ( Palette.GetName() != CGeneralSetting::GetInstance()->GetCharPaletteManager()->HistoryTabName() );
	}

	m_btnEdit.EnableWindow( bEditable );
	m_btnDelete.EnableWindow( bSelected );
	m_btnAdd.EnableWindow( TRUE );

	m_btnUp.EnableWindow( idxTab > 0 );
	m_btnDown.EnableWindow( bSelected && idxTab < m_listTab.GetCount()-1 );
}


/*-----------------------------------------------------------------------------
[名称]	Upボタンハンドラ
[機能]	タブの位置移動（上）。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::OnCharpaletteSettingUp() 
{
	long	idxTab = m_listTab.GetCurSel();
	if ( idxTab <= 0 )
	{
		return;
	}

	// ひとつ前へ追加
	CCharPalette Palette = (*m_CharPaletteDefine.GetItemz())[ idxTab ];
	m_CharPaletteDefine.GetItemz()->InsertAt(
		idxTab-1,
		Palette
	);
	m_listTab.InsertString( idxTab-1, Palette.GetName() );

	// 今の位置を削除
	m_CharPaletteDefine.GetItemz()->RemoveAt( idxTab+1 );
	m_listTab.DeleteString ( idxTab+1 );

	// 見た目制御
	m_listTab.SetCurSel( idxTab-1 );
	VisibleControl();
}

/*-----------------------------------------------------------------------------
[名称]	Downボタンハンドラ
[機能]	タブの位置移動（下）。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CCharPaletteSettingDlg::OnCharpaletteSettingDown() 
{
	long	idxTab = m_listTab.GetCurSel();
	if ( idxTab >= m_listTab.GetCount()-1 )
	{
		return;
	}
	if ( idxTab < 0 )
	{
		return;
	}

	// ひとつうしろへ追加
	CCharPalette Palette = (*m_CharPaletteDefine.GetItemz())[ idxTab ];
	m_CharPaletteDefine.GetItemz()->InsertAt(
		idxTab+2,
		Palette
	);
	m_listTab.InsertString( idxTab+2, Palette.GetName() );

	// 今の位置を削除
	m_CharPaletteDefine.GetItemz()->RemoveAt( idxTab );
	m_listTab.DeleteString ( idxTab );

	// 見た目制御
	m_listTab.SetCurSel( idxTab+1 );
	VisibleControl();
}
