/*-----------------------------------------------------------------------------
[名称]	LaunchListCtrl.h
[概要]	ランチャ設定ダイアログクラスの実装
[備考]	なし
[履歴]	2004-01-08	NC		(3204)新規作成(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "LaunchDlg.h"
#include "LaunchItemDlg.h"
#include "MainFrm.h"

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


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


/*-----------------------------------------------------------------------------
[名称]	データ変換
[機能]	CDialog::DoDataExchange()のヘルプを参照。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLaunchDlg)
	DDX_Control(pDX, IDC_LAUNCH_UP, m_btnUp);
	DDX_Control(pDX, IDC_LAUNCH_EDIT, m_btnEdit);
	DDX_Control(pDX, IDC_LAUNCH_DOWN, m_btnDown);
	DDX_Control(pDX, IDC_LAUNCH_DELETE, m_btnDelete);
	DDX_Control(pDX, IDC_LAUNCH_ADD, m_btnAdd);
	DDX_Control(pDX, IDC_LAUNCH_LIST, m_listLaunch);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CLaunchDlg, CDialog)
	//{{AFX_MSG_MAP(CLaunchDlg)
	ON_BN_CLICKED(IDC_LAUNCH_EDIT, OnLaunchEdit)
	ON_BN_CLICKED(IDC_LAUNCH_ADD, OnLaunchAdd)
	ON_BN_CLICKED(IDC_LAUNCH_DELETE, OnLaunchDelete)
	ON_BN_CLICKED(IDC_LAUNCH_UP, OnLaunchUp)
	ON_BN_CLICKED(IDC_LAUNCH_DOWN, OnLaunchDown)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LAUNCH_LIST, OnItemchangedLaunchList)
	ON_NOTIFY(NM_DBLCLK, IDC_LAUNCH_LIST, OnDblclkLaunchList)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLaunchDlg メッセージ ハンドラ

/*-----------------------------------------------------------------------------
[名称]	初期化ハンドラ
[機能]	初期値の設定。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL CLaunchDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	// 行の高さを設定する
	m_listLaunch.SetImageList( &m_ImageList, LVSIL_STATE );

	// データのアタッチ
	m_listLaunch.Attach( CLauncher::GetInstance() );

	// 列の設定
	m_listLaunch.InsertColumn(	0,	"有効"	);
	m_listLaunch.InsertColumn(	1,	"ｱｲｺﾝ"	);
	m_listLaunch.InsertColumn(	2,	"名称"	);
	m_listLaunch.InsertColumn(	3,	"ｺﾏﾝﾄﾞ"	);
	m_listLaunch.SetColumnWidth(	0,	40		);
	m_listLaunch.SetColumnWidth(	1,	40		);
	m_listLaunch.SetColumnWidth(	2,	100		);
	m_listLaunch.SetColumnWidth(	3,	1000		);

	// アイテムの追加
	{
		CArray<CLaunchItem, CLaunchItem&>& Itemz = *CLauncher::GetInstance()->GetLaunchDefine();
		for( int idxItem=0 ; idxItem<Itemz.GetSize() ; idxItem++ )
		{
			CLaunchItem&	Launch = Itemz[idxItem];
			m_listLaunch.InsertItem(
				idxItem,
				Launch.m_strButtonName
			);
		}
	}

	// ダイアログ再表示
	VisibleControl();
	UpdateData( FALSE );

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


/*-----------------------------------------------------------------------------
[名称]	[編集]ボタンハンドラ
[機能]	ランチャアイテム編集ダイアログを開く。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnLaunchEdit() 
{
	CLaunchItemDlg	dlg;
	
	int		idxItem = m_listLaunch.GetSelectionMark();
	if ( idxItem >= 0 )
	{
		CArray<CLaunchItem, CLaunchItem&>& Itemz = *CLauncher::GetInstance()->GetLaunchDefine();
		CLaunchItem&	Launch = Itemz[idxItem];

		dlg.Attach( &Launch );
		dlg.DoModal();
		m_listLaunch.Update( idxItem );
	}
	VisibleControl();
}

/*-----------------------------------------------------------------------------
[名称]	[追加]ボタンハンドラ
[機能]	ランチャアイテムをリストの末尾に新規追加する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnLaunchAdd() 
{
	CLaunchItem	Launch;
	Launch.m_strButtonName = _T("（新規ボタン）");

	CArray<CLaunchItem, CLaunchItem&>& Itemz = *CLauncher::GetInstance()->GetLaunchDefine();
	Itemz.Add( Launch );

	m_listLaunch.InsertItem(
		m_listLaunch.GetItemCount(),
		Launch.m_strButtonName
	);

	m_listLaunch.SetSelectionMark( m_listLaunch.GetItemCount()-1 );
	m_listLaunch.SetItemState( m_listLaunch.GetItemCount()-1, LVIS_SELECTED, LVIS_SELECTED );

	RedrawWindow();
	VisibleControl();
}

/*-----------------------------------------------------------------------------
[名称]	[削除]ボタンハンドラ
[機能]	選択されているランチャアイテムを削除する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnLaunchDelete() 
{
	int		idxItem = m_listLaunch.GetSelectionMark();
	if ( idxItem >= 0 )
	{
		CArray<CLaunchItem, CLaunchItem&>& Itemz = *CLauncher::GetInstance()->GetLaunchDefine();
		Itemz.RemoveAt( idxItem );
		m_listLaunch.DeleteItem( idxItem );

		m_listLaunch.SetSelectionMark( idxItem-1 );
		m_listLaunch.SetItemState( idxItem-1, LVIS_SELECTED, LVIS_SELECTED );
	}
	VisibleControl();
}

/*-----------------------------------------------------------------------------
[名称]	[上へ]ボタンハンドラ
[機能]	選択されているランチャアイテムを上に移動する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnLaunchUp() 
{
	int		idxItem = m_listLaunch.GetSelectionMark();
	{
		CArray<CLaunchItem, CLaunchItem&>& Itemz = *CLauncher::GetInstance()->GetLaunchDefine();
		CLaunchItem	Launch = Itemz[idxItem];

		Itemz.RemoveAt( idxItem );
		Itemz.InsertAt( idxItem-1, Launch );

		m_listLaunch.DeleteItem( idxItem );
		m_listLaunch.InsertItem(
			idxItem-1,
			Launch.m_strButtonName
		);

		m_listLaunch.SetSelectionMark( idxItem-1 );
		m_listLaunch.SetItemState( idxItem-1, LVIS_SELECTED, LVIS_SELECTED );
	}
	VisibleControl();
}

/*-----------------------------------------------------------------------------
[名称]	[下へ]ボタンハンドラ
[機能]	選択されているランチャアイテムを下へ移動する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnLaunchDown() 
{
	int		idxItem = m_listLaunch.GetSelectionMark();
	if ( idxItem < m_listLaunch.GetItemCount()-1 )
	{
		CArray<CLaunchItem, CLaunchItem&>& Itemz = *CLauncher::GetInstance()->GetLaunchDefine();
		CLaunchItem	Launch = Itemz[idxItem];

		Itemz.RemoveAt( idxItem );
		Itemz.InsertAt( idxItem+1, Launch );

		m_listLaunch.DeleteItem( idxItem );
		m_listLaunch.InsertItem(
			idxItem+1,
			Launch.m_strButtonName
		);

		m_listLaunch.SetSelectionMark( idxItem+1 );
		m_listLaunch.SetItemState( idxItem+1, LVIS_SELECTED, LVIS_SELECTED );
	}
	VisibleControl();
}

/*-----------------------------------------------------------------------------
[名称]	見た目制御
[機能]	ダイアログコントロールの見た目を制御する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::VisibleControl()
{
	int		idxItem = m_listLaunch.GetSelectionMark();

	m_btnUp.EnableWindow( idxItem > 0 );
	m_btnDown.EnableWindow( idxItem < m_listLaunch.GetItemCount()-1 );

	m_btnAdd.EnableWindow( TRUE );
	m_btnEdit.EnableWindow( idxItem > -1 );
	m_btnDelete.EnableWindow( idxItem >= 0 );
}

/*-----------------------------------------------------------------------------
[名称]	選択アイテム変更ハンドラ
[機能]	ダイアログコントロールの見た目を制御する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnItemchangedLaunchList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	VisibleControl();
	*pResult = 0;
}

/*-----------------------------------------------------------------------------
[名称]	選択アイテムダブルクリックハンドラ
[機能]	ランチャアイテム編集ダイアログを開く。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnDblclkLaunchList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	OnLaunchEdit();
	*pResult = 0;
}

/*-----------------------------------------------------------------------------
[名称]	[OK]ボタンハンドラ
[機能]	データを確定する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::OnOK() 
{
	UpdateData( TRUE );

	// ファイルへ保存
	CLauncher::GetInstance()->Write();

	((CMainFrame*)::AfxGetMainWnd())->RebuildLuncherToolBar();

	CDialog::OnOK();
}

/*-----------------------------------------------------------------------------
[名称]	確定処理
[機能]	データを確定する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::Confirm()
{
	OnOK();
}

/*-----------------------------------------------------------------------------
[名称]	サブクラス化ハンドラ
[機能]	リスト行高さ設定用のイメージリストを作成する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CLaunchDlg::PreSubclassWindow() 
{
	CDialog::PreSubclassWindow();
	m_ImageList.Create( 1, 40, ILC_COLOR, 0, 0 );
}
