// ★コメント未記入
// ShitarabianPlugInManager.cpp: CShitarabianPlugInManager クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "shitarabian.h"
#include "ShitarabianPlugInManager.h"
#include "ShitarabianPlugIn.h"
#include "ShitarabianPlugInTest.h"
#include "ShitarabianPlugInWall.h"
//#include "ShitarabianPlugInHTMLSim.h"
#include "ShitarabianPlugInKeyAssign.h"
#include "ShitarabianPlugInDll.h"
#include "ShitarabianDoc.h"
#include "DocumentIF.h"
#include "ExeCommon.h"
#include "MainFrm.h"
#include "SettingPath.h"

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



//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////

CShitarabianPlugInManager::CShitarabianPlugInManager()
{
	CShitarabianPlugInWall*			pwall = new CShitarabianPlugInWall;
	CShitarabianPlugInTest*			pgrid = new CShitarabianPlugInTest;
//	CShitarabianPlugInHTMLSim*		psim = new CShitarabianPlugInHTMLSim;
	CShitarabianPlugInKeyAssign*	pkey = new CShitarabianPlugInKeyAssign;


	m_apPlugInz.Add( pgrid );
	m_apPlugInz.Add( pwall );
//	m_apPlugInz.Add( psim );
	m_apPlugInz.Add( pkey );

	// フォルダをスキャンし、含まれるdllを列挙。
	EnumlateSbpz();

//	Initialize();

	// メニューに追加
	m_aidMenuCommand.RemoveAll();
	CMainFrame*	pMainFrame = ::GetMainFrame();
	CMenu*		pMenu = pMainFrame->GetMenu()->GetSubMenu( 4 );

	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		int	id = ::UniqueCommandID();
		pMenu->InsertMenu(
			3,
			MF_ENABLED | MF_STRING | MF_BYPOSITION,
			id,
			m_apPlugInz[idxPlugIn]->GetPlugInName()
		);
		m_aidMenuCommand.InsertAt( 0, id );
	}
}


void CShitarabianPlugInManager::OnInitialize(
	CShitarabianDoc*	pDoc
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnInitialize( pDoc->GetInterface() );
	}
}

void CShitarabianPlugInManager::OnDestroy(
	CShitarabianDoc*	pDoc
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnDestroy( pDoc->GetInterface() );
	}
}


void CShitarabianPlugInManager::OnLoad(
	CShitarabianDoc*	pDoc
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnLoad( pDoc->GetInterface() );
	}
}

void CShitarabianPlugInManager::OnSave(
	CShitarabianDoc*	pDoc
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnSave( pDoc->GetInterface() );
	}
}


CShitarabianPlugInManager::~CShitarabianPlugInManager()
{

	RemoveAll();
}


void CShitarabianPlugInManager::RemoveAll()
{
	int	idxPlugIn;
	for( idxPlugIn=0 ; idxPlugIn<m_apPlugInz.GetSize() ; idxPlugIn++ )
	{
		delete m_apPlugInz[idxPlugIn];
	}
	m_apPlugInz.RemoveAll();
}


CShitarabianPlugInManager* CShitarabianPlugInManager::GetInstance()
{
	static CShitarabianPlugInManager Instance;
	return( &Instance );
}


CString CShitarabianPlugInManager::GetPlugInName(
	int		idxPlugIn
)
{
	if( idxPlugIn < m_apPlugInz.GetSize() )
	{
		return( m_apPlugInz[idxPlugIn]->GetPlugInName() );
	}
	return( _T("") );
}

void CShitarabianPlugInManager::OnDrawWall(
		CDocumentIF*	pDocIF,
		CDC*			pDstDC,
	int				iLeft,
	int				iTop,
	int				iWidth,
	int				iHeight
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnDrawWall(
			pDocIF,
			pDstDC,
			iLeft,
			iTop,
			iWidth,
			iHeight
		);
	}
}

void CShitarabianPlugInManager::OnSetting(
	CShitarabianDoc*	pDoc,
	int					idxPlugIn
)
{
	if( idxPlugIn < m_apPlugInz.GetSize() )
	{
		m_apPlugInz[idxPlugIn]->OnSetting( pDoc->GetInterface() );
	}
}

void CShitarabianPlugInManager::OnEdit(
	CShitarabianDoc*	pDoc
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnEdit( pDoc->GetInterface() );
	}
}




#include <stdio.h>
#include <io.h>
#include <time.h>
#include <afxcoll.h>
#include "Common.h"

void CShitarabianPlugInManager::EnumlateSbpz()
{
	// プラグインの列挙
    struct _finddata_t c_file;
    long hFile;

    // カレント ディレクトリ内の最初の .sbp ファイルを探す
	CString	strPath;
	strPath.Format( "%s\\*.sbp", CSettingPath::GetInstance()->GetFolderPath() );
    if( (hFile = _findfirst( strPath, &c_file )) == -1L )
	{
		return;
	}
	else
	{
		BOOL	bEnd = FALSE;
        while( bEnd != TRUE )
		{
			{
			// Plug-Inのロード
				// プラグイン情報を作成し、アレイに追加。
				CShitarabianPlugInDll*	pDll = new CShitarabianPlugInDll;
				CString		strName( c_file.name );
				pDll->Load( strName );
				m_apPlugInz.Add( pDll );

			}

			// 次の要素を調べる
			if ( _findnext( hFile, &c_file ) != 0)
			{
				bEnd = TRUE;
			}
		}
	}
	return;
}



void CShitarabianPlugInManager::OnToolButton(
	HINSTANCE			hDLL,
	CShitarabianDoc*	pDoc,
	int					idxButton
)
{
	// DLLをさがし、コマンド受信を通知する
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		if( m_apPlugInz[idxPlugIn]->GetInstanceHandle() == hDLL )
		{
			m_apPlugInz[idxPlugIn]->OnToolButton(
				pDoc->GetInterface(),
				idxButton
			);
			break;
		}
	}
}


void CShitarabianPlugInManager::OnToolButtonUI(
	HINSTANCE			hDLL,
	CShitarabianDoc*	pDoc,
	int					idxButton,
	CCmdUI*				pCmdUI
)
{
	// DLLをさがし、コマンド受信を通知する
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		if( m_apPlugInz[idxPlugIn]->GetInstanceHandle() == hDLL )
		{
			m_apPlugInz[idxPlugIn]->OnToolButtonUI(
				pDoc->GetInterface(),
				idxButton,
				pCmdUI
			);
		}
	}
}


void CShitarabianPlugInManager::OnKeyDown(
	CShitarabianDoc*	pDoc,
	UCHAR*				punKey,
	BOOL*				pbShift,
	BOOL*				pbCtrl,
	BOOL*				pbAlt
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnKeyDown(
			pDoc->GetInterface(),
			punKey,
			pbShift,
			pbCtrl,
			pbAlt
		);
	}
	return;
}

void CShitarabianPlugInManager::OnChar(
	CShitarabianDoc*	pDoc,
	CString*			pstrChar,
	BOOL*				pbShift,
	BOOL*				pbCtrl,
	BOOL*				pbAlt
)
{
	int idxPlugIn;
	for( idxPlugIn=m_apPlugInz.GetSize()-1 ; idxPlugIn>=0 ; idxPlugIn-- )
	{
		m_apPlugInz[idxPlugIn]->OnChar(
			pDoc->GetInterface(),
			pstrChar,
			pbShift,
			pbCtrl,
			pbAlt
		);
	}
	return;
}


int		CShitarabianPlugInManager::GetPlugInIndexFromMenu(
	int		idCommand
)
{
	int	idxPlugIn;
	for( idxPlugIn=0 ; idxPlugIn<m_aidMenuCommand.GetSize() ; idxPlugIn++ )
	{
		if( m_aidMenuCommand[idxPlugIn] == idCommand )
		{
			return( idxPlugIn );
		}
	}
	return( -1 );
}
