/****************************************************************************
** varlist.cpp - class for handling a list of string vars
** Copyright (C) 2001, 2002  Justin Karneges
**
** This program is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License
** as published by the Free Software Foundation; either version 2
** of the License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
**
****************************************************************************/

#include <QList>
#include <QStringList>
#include <QDomElement>
#include <QDomDocument>

#include "varlist.h"
#include "optionstree.h"


VarList::VarList() :QList<VarListItem>()
{
}

QStringList VarList::varsToStringList()
{
	QStringList list;
	for(VarList::Iterator it = begin(); it != end(); ++it)
		list.append((*it).key());
	return list;
}

void VarList::fromOptions(OptionsTree *o, QString base)
{
	QStringList bases = o->getChildOptionNames( base, true, true);
	foreach(QString ibase, bases) {
		QString var = o->getOption(ibase + ".key").toString();
		QString val = o->getOption(ibase + ".data").toString();
		set(var, val);
	}
}

void VarList::toOptions(OptionsTree *o, QString base)
{
	o->removeOption(base, true);
	foreach(VarListItem item, *this) {
		QString ibase = o->mapPut(base, item.key());
		o->setOption(ibase + ".data", item.data());
	}
}


QDomElement VarList::toXml(QDomDocument &doc, const QString &tagName)
{
	QDomElement base = doc.createElement(tagName);
	for(VarList::Iterator it = begin(); it != end(); ++it) {
		QDomElement tag = doc.createElement("item");
		tag.setAttribute("name", (*it).key());
		QDomText text = doc.createTextNode((*it).data());
		tag.appendChild(text);
		base.appendChild(tag);
	}
	return base;
}

void VarList::fromXml(const QDomElement &e)
{
	clear();

	for(QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) {
		QDomElement i = n.toElement();
		if(i.isNull())
			continue;
		if(i.tagName() == "item") {
			QString var, val;
			var = i.attribute("name");
			QDomText t = i.firstChild().toText();
			if(!t.isNull())
				val = t.data();
			set(var, val);
		}
	}
}

void VarList::set(const QString &key, const QString &data)
{
	VarList::Iterator it = findByKey(key);
	if(it == end()) {
		VarListItem v;
		v.setKey(key);
		v.setData(data);
		append(v);
	}
	else {
		(*it).setData(data);
	}
}

void VarList::unset(const QString &key)
{
	VarList::Iterator it = findByKey(key);
	if(it == end())
		return;
	erase(it);
}

const QString & VarList::get(const QString &key)
{
	VarList::Iterator it = findByKey(key);
	return (*it).data();
}

VarList::Iterator VarList::findByKey(const QString &key)
{
	VarList::Iterator it;
	for(it = begin(); it != end(); ++it) {
		if((*it).key() == key)
			break;
	}

	return it;
}

VarList::Iterator VarList::findByNum(int x)
{
	int n = 0;
	VarList::Iterator it;
	for(it = begin(); it != end(); ++it) {
		if(n >= x)
			break;
		++n;
	}

	return it;
}
