#pragma once
#include "Workspace.h"

/*!
	Workspace List のソートを行うベースクラス
*/
class CWorkspaceListAccessSortBase
{
public:
	virtual int IsBefore(CWorkspaceAccess from, CWorkspaceAccess to) = 0;
};

/*!
	Workspace List のソートを行うクラス
*/
class CWorkspaceListAccessSimpleSort : public CWorkspaceListAccessSortBase
{
public:
	virtual int IsBefore(CWorkspaceAccess from, CWorkspaceAccess to);

	CStringArray	m_keyName;
};

/*!
	Workspace List
*/
class CWorkspaceListAccess : public CWorkspaceAccess
{
public:
	CWorkspaceListAccess(CString listName);
	CWorkspaceListAccess(CWorkspaceAccess &other, CString listName);
	virtual ~CWorkspaceListAccess(void);

	//!	CWorkspaceAccess 設定
	void operator = (CWorkspaceAccess &other) {	CWorkspaceAccess::operator=(other); }

	//////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////
	//!	個数の取得
	int GetItemCount();

	//!	アイテムの取得
	CWorkspaceAccess GetItem(int index);

	//!	アイテムを追加
	CWorkspaceAccess GetNewItem();

	//!	アイテムの削除
	void DeleteItem(CWorkspaceAccess item);

	//!	アイテムの削除
	void DeleteItem(int index);

	//////////////////////////////////////////////////////////////////////////////
	//	ソート
	//////////////////////////////////////////////////////////////////////////////
	//!	ソートする
	void Sort(CWorkspaceListAccessSortBase *sortBase);

	//!	ソートする(キー内容で)
	void Sort(CString key1, CString key2="", CString key3="");

protected:
	/////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////
	//!	名前
	CString			m_listName;
};



/*!
	Workspace List
*/
template<class TYPE>
class CWorkspaceTypedListAccess : public CWorkspaceListAccess
{
public:
	CWorkspaceTypedListAccess(CString listName)
		: CWorkspaceListAccess(listName) {};
	CWorkspaceTypedListAccess(CWorkspaceAccess &other, CString listName)
		 : CWorkspaceListAccess(other, listName) {};

	//!	CWorkspaceAccess 設定
	void operator = (CWorkspaceAccess &other) {	CWorkspaceListAccess::operator=(other); }

	//////////////////////////////////////////////////////////////////////////////
	//	取得
	//////////////////////////////////////////////////////////////////////////////
	//!	アイテムの取得
	TYPE GetItem(int index) { return CWorkspaceListAccess::GetItem(index); };

	//!	アイテムを追加
	TYPE GetNewItem() { return CWorkspaceListAccess::GetNewItem(); };
};
