// ★コメント未記入
// PlugInDlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include <afxtempl.h>
#include "shitarabian.h"
#include "PlugInDlg.h"
#include "ShitarabianPlugIn.h"
#include "ShitarabianPlugInManager.h"
#include "ShitarabianDoc.h"


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

/////////////////////////////////////////////////////////////////////////////
// CPlugInDlg ダイアログ


CPlugInDlg::CPlugInDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPlugInDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPlugInDlg)
		// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
	//}}AFX_DATA_INIT
}


void CPlugInDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPlugInDlg)
	DDX_Control(pDX, IDC_PLUGIN_DOWN, m_btnDown);
	DDX_Control(pDX, IDC_PLUGIN_SETTING, m_btnSetting);
	DDX_Control(pDX, IDC_PLUGIN_UP, m_btnUp);
	DDX_Control(pDX, IDC_PLUGIN_LIST, m_lstPlugIn);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPlugInDlg, CDialog)
	//{{AFX_MSG_MAP(CPlugInDlg)
	ON_BN_CLICKED(IDC_PLUGIN_SETTING, OnPluginSetting)
	ON_LBN_SELCHANGE(IDC_PLUGIN_LIST, OnSelchangePluginList)
	ON_BN_CLICKED(IDC_PLUGIN_UP, OnPluginUp)
	ON_BN_CLICKED(IDC_PLUGIN_DOWN, OnPluginDown)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

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

BOOL CPlugInDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	// リストの内容を設定する

	CArray<CShitarabianPlugIn*, CShitarabianPlugIn*>*	papPlugInz;
	papPlugInz = CShitarabianPlugInManager::GetInstance()->GetPlugInz();

//	m_lstPlugIn.DeleteAll();
	int idxPlugIn;
	for( idxPlugIn=papPlugInz->GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		CString	strPlugInName = papPlugInz->GetAt(idxPlugIn)->GetPlugInName();
		m_lstPlugIn.InsertString( 0, strPlugInName );
	}

	m_lstPlugIn.SetCurSel( 0 );
	VisibleControl();

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

void CPlugInDlg::OnPluginSetting() 
{
	int	idxPlugIn = m_lstPlugIn.GetCurSel();

	if ( idxPlugIn != LB_ERR )
	{
		CShitarabianPlugInManager::GetInstance()->OnSetting(
			m_pDoc,
			idxPlugIn
		);
	}

	m_pDoc->SetAllUpdate();
	m_pDoc->ReDraw();
}

void CPlugInDlg::OnSelchangePluginList()
{
	VisibleControl();
}

void CPlugInDlg::VisibleControl() 
{
	int	idxPlugIn = m_lstPlugIn.GetCurSel();
	BOOL	bEnable = ( idxPlugIn != LB_ERR );

	BOOL	bUp = idxPlugIn > 0;
	BOOL	bDown = idxPlugIn < m_lstPlugIn.GetCount()-1;

	m_btnUp.EnableWindow( bEnable && bUp );
	m_btnDown.EnableWindow( bEnable && bDown );
	m_btnSetting.EnableWindow( bEnable );
}

void CPlugInDlg::OnPluginUp() 
{
	int	idxPlugIn = m_lstPlugIn.GetCurSel();
	if( idxPlugIn != LB_ERR )
	if( idxPlugIn > 0 )
	{
		CArray<CShitarabianPlugIn*, CShitarabianPlugIn*>*	papPlugInz;
		papPlugInz = CShitarabianPlugInManager::GetInstance()->GetPlugInz();

		// 選択している要素を削除する
		CShitarabianPlugIn* pPlugIn = papPlugInz->GetAt( idxPlugIn );
		papPlugInz->RemoveAt( idxPlugIn );
		m_lstPlugIn.DeleteString( idxPlugIn );

		// ひとつ上に挿入
		papPlugInz->InsertAt( idxPlugIn-1, pPlugIn );
		m_lstPlugIn.InsertString( idxPlugIn-1, pPlugIn->GetPlugInName() );

		m_lstPlugIn.SetCurSel( idxPlugIn-1 );
	}
	VisibleControl();
	m_pDoc->SetAllUpdate();
	m_pDoc->ReDraw();
}

void CPlugInDlg::OnPluginDown() 
{
	int	idxPlugIn = m_lstPlugIn.GetCurSel();
	if( idxPlugIn != LB_ERR )
	if( idxPlugIn < m_lstPlugIn.GetCount() -1 )
	{
		CArray<CShitarabianPlugIn*, CShitarabianPlugIn*>*	papPlugInz;
		papPlugInz = CShitarabianPlugInManager::GetInstance()->GetPlugInz();

		// 選択している要素を削除する
		CShitarabianPlugIn* pPlugIn = papPlugInz->GetAt( idxPlugIn );
		papPlugInz->RemoveAt( idxPlugIn );
		m_lstPlugIn.DeleteString( idxPlugIn );

		// ひとつ下に挿入
		papPlugInz->InsertAt( idxPlugIn+1, pPlugIn );
		m_lstPlugIn.InsertString( idxPlugIn+1, pPlugIn->GetPlugInName() );

		m_lstPlugIn.SetCurSel( idxPlugIn+1 );
	}
	VisibleControl();
	m_pDoc->SetAllUpdate();
	m_pDoc->ReDraw();
}
