#include "tk_listoption.h"
#include "../../../exceptions/exceptions.h"

const char* TkListOption::type="TkListOption";

const char* TkListOption::getType() const
{
	return type;
}

void TkListOption::doSerialize(TiXmlElement& element) const
{
	element.SetAttribute("size",size());
	char buf[128];
	int i=0;
	for(const_iterator it=begin();it!=end();it++)
	{
		sprintf(buf,"item%d",i);
		element.SetAttribute(buf,it->c_str());
		i++;
	}
}

void TkListOption::doDeserialize(const TiXmlElement& element)
{
	int mSize;
	element.Attribute("size",&mSize);
	char buf[128];
	for(int i=0;i<mSize;i++)
	{
		sprintf(buf,"item%d",i);
		const char* value=element.Attribute(buf);
		push_back(value);
	}
}

TkListOption::TkListOption()
{
}

TkListOption::TkListOption(const char* values[])
{
	int i=0;
	while(values[i]!=0)
	{
		push_back(values[i]);
		i++;
	}
}

TkListOption::TkListOption(const list<string>& values)
{
	for(const_iterator it=values.begin();it!=values.end();it++)
		push_back(*it);
}

const string& TkListOption::toString() const
{
	string& value=*(new string());
	
	value.append("{");
	for(const_iterator it=begin();it!=end();it++)
	{
		value.append("{");
		value.append(*it);
		value.append("} ");
	}
	value.append("}");
		
	return value;
}

void TkListOption::fromObject(Tcl_Obj* object)
{
	int size;
	clear();
	Tcl_ListObjLength(TclInterp::defaultInterp->getInterp(),object,&size);
	for(int i=0;i<size;i++)
	{
		Tcl_Obj *elementPtr;
		Tcl_ListObjIndex(TclInterp::defaultInterp->getInterp(),object,i,&elementPtr);
		string str=Tcl_GetString(elementPtr);
		push_back(str);
	}
}
