#include "tcl_listvar.h"

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

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

void TclListVar::update()
{
	if (values.size()==0)
	{	
		Tcl_SetVar(interp->getInterp(),guid.getId().c_str(),"",TCL_GLOBAL_ONLY|TCL_LIST_ELEMENT);
	}
	else
	{
		bool front=true;
		for(t_values::const_iterator it=values.begin();it!=values.end();it++)
		{
			string val;
			if (front)
			{
				val="{"+*it+"}";
				Tcl_SetVar(interp->getInterp(),guid.getId().c_str(),val.c_str(),TCL_GLOBAL_ONLY|TCL_LIST_ELEMENT);
				front=false;
			}
			else
			{
				val=*it;
				Tcl_SetVar(interp->getInterp(),guid.getId().c_str(),val.c_str(),TCL_GLOBAL_ONLY|TCL_LIST_ELEMENT|TCL_APPEND_VALUE);
			}
		}
	}
	Tcl_UpdateLinkedVar(interp->getInterp(),guid.getId().c_str());
}

TclListVar::TclListVar(Ptr<TclInterp>& interp):TclVar(interp)
{
	value=0;
	Tcl_LinkVar(interp->getInterp(),guid.getId().c_str(),(char*)&value,TCL_LINK_STRING);
	update();
}

void TclListVar::push_back(const string& value)
{
	values.push_back(value);
	update();
}

void TclListVar::remove(int index)
{
	int i=0;
	for(iterator it=values.begin();it!=values.end();it++)
	{
		if (i==index)
		{
			values.erase(it);
			update();
			return;
		}
		i++;
	}
}

void TclListVar::clear()
{
	values.clear();
	update();
}

const string& TclListVar::getText() const
{
	return *(new string(value));
}

TclListVar::const_iterator TclListVar::begin() const
{
	return values.begin();
}

TclListVar::const_iterator TclListVar::end() const
{
	return values.end();
}

int TclListVar::size() const
{
	return (int)values.size();
}

void TclListVar::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 TclListVar::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);
	}
}

