/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/********************************************************************/
/**
 * @file GLFileManager.h
 * @brief クラス CGLFileManager の宣言
 */
#pragma once
#include <map>

class CGLFileImporter;
class CGLFileExporter;

class CGLFileManager
{
public:
	typedef std::map<CString, CGLFileImporter*> IMap;
	typedef std::map<CString, CGLFileExporter*> OMap;

private:
	IMap m_mapi;
	OMap m_mapo;

	CGLFileManager();
	~CGLFileManager();

	CGLFileManager(const CGLFileManager&);
	CGLFileManager& operator=(const CGLFileManager&);

public:
	static CGLFileManager& GetInstance();

	CGLFileImporter* GetImporter(LPCTSTR lpszFileName) const;

	/// 保存ファイル名からハンドルできるオブジェクトを返す。
	/// @param[in] lpszFileName 拡張子を含むファイルパス。
	CGLFileExporter* GetExporter(LPCTSTR lpszFileName) const;

	/// 保存ダイアログのフィルター文字列からハンドルできるオブジェクトを返す。
	/// @param[in] lpszFilter "AG Files (*.ag)" のような文字列
	CGLFileExporter* GetExporterFromFilter(LPCTSTR lpszFilter) const;

	/// ハンドラー登録メソッド
	//@{

	/// 拡張子を指定して、インポートハンドラーをマネージャーに追加する。
	/// @param[in] nIDSExt 拡張子文字列のリソース ID
	/// @param[in] pHandler インポートハンドラー
	void RegisterHandler(UINT nIDSExt, CGLFileImporter* pHandler);

	/// 拡張子を指定して、インポートハンドラーをマネージャーに追加する。
	/// @param[in] nIDSExt 拡張子文字列 (e.g. "*.iges;*.igs")
	/// @param[in] pHandler インポートハンドラー
	/// @pre !strExt.IsEmpty()
	void RegisterHandler(const CString& strExt, CGLFileImporter* pHandler);

	/// 拡張子を指定して、エクスポートハンドラーをマネージャーに追加する。
	/// @param[in] nIDSExt 拡張子文字列のリソース ID
	/// @param[in] pHandler エクスポートハンドラー
	void RegisterHandler(UINT nIDSExt, CGLFileExporter* pHandler);

	/// 拡張子を指定して、エクスポートハンドラーをマネージャーに追加する。
	/// @param[in] strExt 拡張子文字列  (e.g. "*.iges;*.igs")
	/// @param[in] pHandler エクスポートハンドラー
	/// @pre !strExt.IsEmpty()
	void RegisterHandler(const CString& strExt, CGLFileExporter* pHandler);
	//@}

	IMap::const_iterator ibegin() const;
	IMap::const_iterator iend() const;

	OMap::const_iterator obegin() const;
	OMap::const_iterator oend() const;

	void GetAllSaveHandler(OMap& omap) const;
};
