#include "StdAfx.h"
#include ".\workspacelistaccess.h"

CWorkspaceListAccess::CWorkspaceListAccess(CString listName)
{
	m_listName = listName;
}

CWorkspaceListAccess::~CWorkspaceListAccess(void)
{
}

CWorkspaceListAccess::CWorkspaceListAccess(CWorkspaceAccess &other, CString listName)
{
	m_listName = listName;
	CWorkspaceAccess::operator=(other.GetAccess(listName));
}

//////////////////////////////////////////////////////////////////////////////
//	取得
//////////////////////////////////////////////////////////////////////////////
/*!
	個数の取得
*/
int CWorkspaceListAccess::GetItemCount()
{
	return(GetSubNodeCount());
}


/*!
	アイテムの取得
*/
CWorkspaceAccess CWorkspaceListAccess::GetItem(int index)
{
	//	全てのサブノードを取得
	CStringArray	list;
	GetAllSubNode(list);

	//	安全性チェック
	ASSERT(index >= 0 && index < list.GetCount());

	//	対象を取得
	return(GetAccess(list[index]));
}


/*!
	アイテムを追加
*/
CWorkspaceAccess CWorkspaceListAccess::GetNewItem()
{
	int itemNo = 0;
	CString	name;

	//	重なっていない名前を探す
	CStringArray	list;
	GetAllSubNode(list);
	while(1)
	{
		//	ないか検索
		int loopFlag = 0;
		name.Format("%s_%04d", m_listName, itemNo);
		for(int i=0; i<list.GetSize(); i++)
		{
			if(name.CompareNoCase(list[i]) == 0)
				loopFlag = 1;
		}

		//	なかった
		if(loopFlag == 0)
			break;

		//	あった
		itemNo ++;
	}
	
	return(GetAccess(name));
}


/*!
	アイテムの削除
*/
void CWorkspaceListAccess::DeleteItem(CWorkspaceAccess item)
{
	DeleteNode(item.GetNodeName());
}


/*!
	アイテムの削除
*/
void CWorkspaceListAccess::DeleteItem(int index)
{
	DeleteNode(GetItem(index).GetNodeName());
}

//////////////////////////////////////////////////////////////////////////////
//	ソート
//////////////////////////////////////////////////////////////////////////////
/*!
	ソートする
*/
void CWorkspaceListAccess::Sort(CWorkspaceListAccessSortBase *sortBase)
{
	int					Max = (int)GetItemCount();
	CWorkspaceAccess	keyitem = GetNewItem();

	for(int i=1;i<Max;i++)
	{
		keyitem.Copy(GetItem(i));

		int	j;
		for(j=i-1;j>=0;j--)
		{
			if(sortBase->IsBefore(GetItem(j), keyitem))
			{
				GetItem(j+1).Copy(GetItem(j));
			}
			else
			{
				break;
			}
		}

		GetItem(j+1).Copy(keyitem);
	}

	DeleteItem(keyitem);
}


/*!
	ソートする(キー内容で)
*/
void CWorkspaceListAccess::Sort(CString key1, CString key2, CString key3)
{
	CWorkspaceListAccessSimpleSort	sort;
	sort.m_keyName.Add(key1);
	if(!key2.IsEmpty())
		sort.m_keyName.Add(key2);
	if(!key3.IsEmpty())
		sort.m_keyName.Add(key3);

	Sort(&sort);
}


//////////////////////////////////////////////////////////////////////////////
//	CWorkspaceListAccessSimpleSort
//////////////////////////////////////////////////////////////////////////////
/*!
	比較
*/
int CWorkspaceListAccessSimpleSort::IsBefore(CWorkspaceAccess from, CWorkspaceAccess to)
{
	ASSERT(m_keyName.GetCount() > 0);

	for(int i=0;i<m_keyName.GetCount();i++)
	{
		if(from.GetKeyStr(m_keyName[i], "") != to.GetKeyStr(m_keyName[i], ""))
			return(from.GetKeyStr(m_keyName[i], "") > to.GetKeyStr(m_keyName[i], ""));
	}

	return(TRUE);
}

