#include "StdAfx.h"
#include "WorkspaceListAccess.h"


/*****************************************************************************************************/
//	文字列リストクラス
/*****************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////
//	CWorkspaceStringListAccess
//////////////////////////////////////////////////////////////////////////////
CWorkspaceStringListAccess::CWorkspaceStringListAccess(CUTF8String listName)
{
	m_listName = listName;
}

CWorkspaceStringListAccess::~CWorkspaceStringListAccess(void)
{
}

CWorkspaceStringListAccess::CWorkspaceStringListAccess(CWorkspaceAccess &other, CUTF8String listName)
{
	m_listName = listName;
	CWorkspaceAccess::operator=(other);
}

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

/*!
	アイテムの取得
*/
CUTF8String CWorkspaceStringListAccess::GetItem(int index)
{
	//	全てのサブノードを取得
	CUTF8StringArray	list;
	GetAllKey(list);

	//	対象を取得
	return(GetKeyStr(list[index], _U8("")));
}

/*!
	アイテムの設定
*/
void CWorkspaceStringListAccess::SetItem(int index, CUTF8String str)
{
	//	全てのサブノードを取得
	CUTF8StringArray	list;
	GetAllKey(list);

	//	対象を上書き
	SetKeyStr(list[index], str);
}

/*!
	アイテムを追加
*/
void CWorkspaceStringListAccess::AddNewItem(CUTF8String str, int checkExist, int noCase)
{
	//	重なってる？
	if(checkExist)
		if(FindIndex(str, noCase) != -1)
			return;

	int itemNo = 0;
	CUTF8String	name;

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

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

		//	あった
		itemNo ++;
	}
	
	SetKeyStr(name, str);
}

/*!
	アイテムの削除
*/
void CWorkspaceStringListAccess::DeleteItem(int index)
{
	//	全てのサブノードを取得
	CUTF8StringArray	list;
	GetAllKey(list);

	//	対象を削除
	DeleteKey(list[index]);
}

/*!
	まとめて追加
*/
void CWorkspaceStringListAccess::AddList(CUTF8StringArray &list, int checkExist, int noCase)
{
	for(int i=0;i<list.GetCount();i++)
		AddNewItem(list[i], checkExist, noCase);
}

/*!
	まとめて取得
*/
void CWorkspaceStringListAccess::GetList(CUTF8StringArray &list)
{
	GetAllData(list);
}

/*!
	検索
*/
int CWorkspaceStringListAccess::FindIndex(CUTF8String str, int noCase)
{
	//	すべて取得
	CUTF8StringArray	list;
	GetList(list);

	//	検索
	for(int i=0;i<list.GetCount();i++)
	{
		if(noCase)
		{
			if(str.CompareNoCase(list[i]) == 0)
				return(i);
		}
		else
		{
			if(str == list[i])
				return(i);
		}
	}

	return(-1);
}



/*****************************************************************************************************/
//	リストクラス
/*****************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////
//	CWorkspaceListAccess
//////////////////////////////////////////////////////////////////////////////
CWorkspaceListAccess::CWorkspaceListAccess(CUTF8String listName)
{
	m_listName = listName;
}

CWorkspaceListAccess::~CWorkspaceListAccess(void)
{
}

CWorkspaceListAccess::CWorkspaceListAccess(CWorkspaceAccess &other, CUTF8String listName)
{
	m_listName = listName;
	CWorkspaceAccess::operator=(other);
}

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


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

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

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


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

	//	重なっていない名前を探す
	CUTF8StringArray	list;
	GetAllSubNode(list);
	while(1)
	{
		//	ないか検索
		int loopFlag = 0;
		name.Format(_U8("%s_%04d"), m_listName, itemNo);
		for(int i=0; i<list.GetCount(); 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(IWorkspaceListAccessSortBase &sortBase, int reverse)
{
	//	テンポラリ
	CWorkspaceAccess	keyitem = GetNewItem();

	//	ソートする
	int Max = (int)GetItemCount();
	for(int i=1;i<Max;i++)
	{
		keyitem.Copy(GetItem(i));

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

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

	//	テンポラリ削除
	DeleteItem(keyitem);
}


/*!
	ソートする(キー内容で)
*/
void CWorkspaceListAccess::Sort(CUTF8String key1, CUTF8String key2, CUTF8String key3)
{
	//	ソート用クラス準備
	CWorkspaceListAccessSimpleSort	sort;

	//	ソート条件追加
	sort.AddKeyName(key1);
	if(!key2.IsEmpty())
		sort.AddKeyName(key2);
	if(!key3.IsEmpty())
		sort.AddKeyName(key3);

	//	ソート
	Sort(sort);
}

/*****************************************************************************************************/
//	ソート用クラス
/*****************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////
//	CWorkspaceListAccessSimpleSort
//////////////////////////////////////////////////////////////////////////////
/*!
	比較
*/
int CWorkspaceListAccessSimpleSort::IsBefore(CWorkspaceAccess from, CWorkspaceAccess to)
{
	ASSERT(m_keyNameArray.GetCount() > 0);

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

	return(TRUE);
}

