# HG changeset patch
# User insilmaril
# Date 1199717569 0
# Node ID f83abc1f75b4f96de740e78dc9e643b98604028a
# Parent  459f0a2d5485482a0e8e39ea4a2fa6602be0923d
Included french in vym.pro

diff -r 459f0a2d5485 -r f83abc1f75b4 aboutdialog.cpp
--- a/aboutdialog.cpp	Mon Dec 17 15:40:14 2007 +0000
+++ b/aboutdialog.cpp	Mon Jan 07 14:52:49 2008 +0000
@@ -39,19 +39,44 @@
 				"<ul>"
 					"<li>Please ask general questions about vym  on "
 				"<a href=\"mailto:vym-forum@lists.sourceforge.net\">vym-forum</a></li>"
-				"<li>Subscribe/Unsubscribe and archives can be found  <a href=\"https://sourceforge.net/mail/?group_id=127802\">here</a></li>"
+				"<li>Subscribe/Unsubscribe and archives can be found  "
+				"<a href=\"https://sourceforge.net/mail/?group_id=127802\">here</a></li>"
 				"</ul>"
 		"</ul>"		
 	"<li> Credits " 
 	"<ul>"
-	"<li>Peter Adams for documentation proofreading and polishing</li>"
-	"<li>Jakob Hilmer for image drag and drop in 1.8.1, &quot;About vym&quot; window patch </li>"
-	"<li>Thomas Schraitle for the stylesheet  used for XHTML-export and help with XML processing in general</li>"
-	"<li>Debianization by Christoph Thielecke and Steffen Joeris</li>"
-	"<li>Matt from <a href=\"http://www.satbp.com\">www.satbp.com</a> for <a href=\"http://www.taskjuggler.org\">Taskjuggler</a> export</li>"
-	"<li>Olaf Hering for support with my Powerbook</li>"
-	"<li>All the guys at Trolltech for their Qt toolkit</li>"
-	"<li>All the guys at SuSE for their Linux and support, e.g. to get Linux running on PowerPC and also Macbooks</li>"
+	"<li>Documentation"
+	"  <ul>"
+	"    <li>Peter Adams: documentation proofreading and polishing</li>"
+	"  </ul>"
+	"</li>"
+	"<li>Translation"
+	"  <ul>"
+	"    <li>Spanish: <a href=\"http://ieee.udistrital.edu.co/aclibre\">"
+	"                 ACLibre (Academia y Conocimiento Libre)</a> </li>"
+	"    <li>French: Philippe Caillaud</li>"
+	"  </ul>"
+	"</li>"
+	"<li> Patches"
+	"  <ul>"
+	"    <li>Konstantin Goudkov: sort branches</li>"
+	"    <li>Jakob Hilmer: image drag and drop in 1.8.1, &quot;About vym&quot; window patch </li>"
+	"    <li>Xavier Oswald, Christoph Thielecke and Steffen Joeris: Debian packaging</li>"
+	"    <li>Andrew Ng, Juha Ruotsalainen and Thomas Kriener: Windows</li>"
+	"    <li>Matt from <a href=\"http://www.satbp.com\">www.satbp.com</a>: "
+	"        <a href=\"http://www.taskjuggler.org\">Taskjuggler</a> export</li>"
+	"    <li>Thomas Schraitle for the stylesheet"  
+	"        used for XHTML-export and help with XML processing in general</li>"
+	"  </ul>"
+	"</li>"
+	"<li> General"
+	"  <ul>"
+	"    <li>Olaf Hering for support with my Powerbook</li>"
+	"    <li>All the guys at Trolltech for their Qt toolkit</li>"
+	"    <li>All the guys at SuSE for their Linux and support,"
+	"        e.g. to get Linux running on PowerPC and also Macbooks</li>"
+	"  </ul>"
+	"</li>"
 	"</ul>"
 	"</li>");
     credits->setFrameStyle( QFrame::Panel | QFrame::Plain );
diff -r 459f0a2d5485 -r f83abc1f75b4 attribute.cpp
--- a/attribute.cpp	Mon Dec 17 15:40:14 2007 +0000
+++ b/attribute.cpp	Mon Jan 07 14:52:49 2008 +0000
@@ -1,34 +1,135 @@
+#include <iostream>
+
 #include "attribute.h"
 
+using namespace std;
+
+extern bool debug;
+
 Attribute::Attribute()
 {
-	key="";
-	value="";
+	table=NULL;
+	definition=NULL;
 }
 
-void Attribute::setKey (const QString &k)
+void Attribute::setKey (const QString &k, const AttributeType &t)
 {
-	key=k;
+	if (!table)
+	{
+		qWarning (QString("Attribute::setKey (%1)  No table defined!\n").arg(k).ascii());
+		return;	
+	}
+	
+	if (!definition)
+	{
+		definition=table->getDef(k);
+		if (!definition)
+		{
+			table->addKey (k,t);
+			return;	
+		}
+	}	
+	qWarning (QString("Attribute::setKey (%1)  attribute already defined!\n").arg(k).ascii());
 }
 
 QString Attribute::getKey ()
 {
-	return key;
+	if (!table)
+	{
+		qWarning ("Attribute::getKey ()  No table defined!");
+		return QString();	
+	}
+	if (!definition)
+	{
+		qWarning ("Attribute::getKey ()  No attribute defined!");
+		return QString ();	
+	}	
+	return definition->getKey();
 }
 
 void Attribute::setValue(const QString &v)
 {
-	value=v;
+	if (!table)
+	{
+		qWarning (QString ("Attribute::setValue (%1)  No table defined!").arg(v));
+		return;	
+	}
+	if (!definition)
+	{
+		qWarning (QString ("Attribute::setValue (%1)  No attribute defined!").arg(v));
+		return;	
+	}	
+	definition->setValue (v);
 }
 
-QString Attribute::getValue()
+QVariant Attribute::getValue()
 {
-	return value;
+	if (!table)
+	{
+		qWarning ("Attribute::getValue  No table defined!");
+		return QString();	
+	}
+	if (!definition)
+	{
+		qWarning ("Attribute::getValue  No attribute defined!");
+		return QString();	
+	}	
+	QVariant v= definition->getValue();
+	return v;
+}
+
+void Attribute::setType (const AttributeType &t)
+{
+	if (!table)
+	{
+		qWarning ("Attribute::setType  No table defined!");
+		return;
+	}
+	if (!definition)
+	{
+		qWarning ("Attribute::setType  No attribute defined!");
+		return; 
+	}	
+	definition->setType (t);
+}
+
+AttributeType Attribute::getType()
+{
+	if (!table)
+	{
+		qWarning ("Attribute::getType  No table defined!");
+		return Undefined;	
+	}
+	if (!definition)
+	{
+		qWarning ("Attribute::getType  No attribute defined!");
+		return Undefined;	
+	}	
+	return definition->getType();
+}
+
+QString Attribute::getTypeString()
+{
+	if (!table)
+	{
+		qWarning ("Attribute::getTypeString  No table defined!");
+		return "Undefined";	
+	}
+	if (!definition)
+	{
+		qWarning ("Attribute::getTypeString  No attribute defined!");
+		return "Undefined";	
+	}	
+	return definition->getTypeString();
 }
 
 void Attribute::setTable (AttributeTable *at)
 {
-	table=at;
+	if (at)
+		table=at;
+	 else
+		qWarning ("Attribute::setTable  table==NULL");
+	
 }
 
 AttributeTable* Attribute::getTable()
@@ -38,76 +139,142 @@
 
 QString Attribute::getDataXML()
 {
-	return valueElement ("attribute",key,value);
+	QString a=beginElement ("attribute");
+	a+=attribut ("key",getKey());
+	a+=attribut ("value",getValue().toString() );
+	a+=attribut ("type",getTypeString () );
+	return a;
 }
 
 
 ///////////////////////////////////////////////////////////////
+AttributeDef::AttributeDef()
+{
+}
+
+AttributeDef::~AttributeDef()
+{
+}
+
+void AttributeDef::setType (const AttributeType &t)
+{
+	type=t;
+}
+
+AttributeType AttributeDef::getType ()
+{
+	return type;
+}
+
+QString AttributeDef::getTypeString ()
+{
+	if (type==StringList)
+		return "StringList";
+	else if (type==FreeString)
+		return "FreeString";
+	else if (type==UniqueString)
+		return "UniqueString";
+	return "Undefined";
+}
+
+void AttributeDef::setKey (const QString &k)
+{
+	key=k;
+}
+
+void AttributeDef::setValue (const QString &v)
+{
+}
+
+void AttributeDef::setValue (const QVariant &v)
+{
+	if (type==Undefined)
+		qWarning ("AttributeDef::setValue  No type defined!");
+	else if (type==StringList)
+		value=v;
+	else if (type==UniqueString)
+		value=v;
+	else
+		qWarning ("AttributeDef::setValue Unknown type???");
+		
+}
+
+QVariant AttributeDef::getValue ()
+{
+	return QVariant ();
+}
+
+QString AttributeDef::getKey ()
+{
+	return key;
+}
+
+///////////////////////////////////////////////////////////////
 AttributeTable::AttributeTable()
 {
-	clear();
 }
 
 AttributeTable::~AttributeTable()
 {
+	clear();
 }
 
 void AttributeTable::clear ()
 {
-	keys.clear();
-	values.clear();
+	attdefs.clear();
 }
 
-void AttributeTable::addKey (const QString &k)
+AttributeDef* AttributeTable::addKey (const QString &k, const AttributeType &t)
 {
-	if (!keys.contains (k) )
+	for (int i=0; i<attdefs.count();++i)
 	{
-		keys.append (k);
-		values.append (QStringList() );
+		if (attdefs.at(i)->getKey()==k )
+		{
+			qWarning (QString ("AttributeTable::addKey (%1) already in table\n").arg(k).ascii());
+			return NULL;
+		}
 	}
+	AttributeDef *ad=new AttributeDef;
+	ad->setKey (k);
+	ad->setType (t);
+	attdefs.append (ad);
+	return ad;
 }
 
 void AttributeTable::removeKey (const QString &k)
 {
-	int i=keys.indexOf (k);
-	if (i>=0)
+	for (int i=0; i<attdefs.count();++i)
 	{
-		keys.removeAt(i);
-		values.removeAt(i);
+		if (attdefs.at(i)->getKey()==k )
+		{
+			
+			delete (attdefs.at(i));
+			attdefs.removeAt (i);
+			return ;
+		}
 	}
+	qWarning (QString ("AttributeTable::removeKey (%1) key not in table\n").arg(k).ascii());
+}
+
+AttributeDef* AttributeTable::getDef(const QString &k)
+{
+	for (int i=0; i<attdefs.count();++i)
+		if (attdefs.at(i)->getKey()==k ) return attdefs.at(i);
+	qWarning (QString ("AttributeTable::getDef (%1) key not in table\n").arg(k).ascii());
+	return NULL;	
 }
 
 int AttributeTable::countKeys()
 {
-	return keys.count();
-}
-
-void AttributeTable::addValue (const QString &k, const QString &v)
-{
-	int i=keys.indexOf (k);
-	if (i<0)
-	{
-		keys.append (k);
-		values.append (QStringList (v));
-	} else
-	{
-		int j=values.at(i).indexOf(k);
-		if (j<0) values[i].append (QString(v));
-	}
+	return attdefs.count();
 }
 
 QStringList AttributeTable::getKeys ()
 {
-	return keys;
-}
-
-QStringList AttributeTable::getValues(const QString &k)
-{
-	int i=keys.indexOf (k);
-	if (i>=0)
-		return values.at(i);
-	else
-		return QStringList();
+	QStringList kl;
+	for (int i=0; i<attdefs.count();i++)
+		kl.append (attdefs.at(i)->getKey());
+	return kl;
 }
 
 QString AttributeTable::getDataXML()
diff -r 459f0a2d5485 -r f83abc1f75b4 attribute.h
--- a/attribute.h	Mon Dec 17 15:40:14 2007 +0000
+++ b/attribute.h	Mon Jan 07 14:52:49 2008 +0000
@@ -2,50 +2,85 @@
 #define ATTRIBUTE_H
 
 #include <QStringList>
+#include <QVariant>
 
 #include "xmlobj.h"
 
 class AttributeTable;
+class AttributeDef;
 
-/*! \brief A key and a value
+enum AttributeType {
+	Undefined,	//!< Undefined type
+	StringList, //!< List of strings, one can be attribute value
+	FreeString,	//!< Any string can be attribute value, not unique
+	UniqueString//!< UniqueString, e.g. for IDs
+};
+
+/*! \brief A key and a value 
+    The data itself is stored in Attribute Definitions (AttributeDef). A list of these tables
+	AttributeTable is maintained for every MapEditor.
 */
-
 class Attribute:public XMLObj {
 public:
 	Attribute();
-	void setKey (const QString &k);
+	void setKey (const QString &k, const AttributeType &t);
 	QString getKey ();
 	void setValue (const QString &v);
-	QString getValue();
+	QVariant getValue ();
+	void setType (const AttributeType &t);
+	AttributeType getType ();
+	QString getTypeString ();
 	void setTable (AttributeTable *at);
 	AttributeTable* getTable();
 	QString getDataXML();
 protected:
+	AttributeTable *table;
+	AttributeDef *definition;
+	QString freeString;		//!< String value for type FreeString
+};
+
+
+/*! \brief 
+	Attribute definition, defines possible values and type of attribute.
+*/
+class AttributeDef {
+public:
+	AttributeDef();
+	~AttributeDef();
+	void setType (const AttributeType &t);
+	AttributeType getType();
+	QString getTypeString ();
+	void setKey (const QString &k);
+	QString getKey ();
+	void setValue (const QString &v);
+	void setValue (const QVariant &v);
+	QVariant getValue ();
+private:
 	QString key;
-	QString value;
-	AttributeTable *table;
+	AttributeType type;
+
+	QVariant value;				//!< value (except FreeString, FreeInt ...
 };
 
 /*! \brief A table containing a list of keys and each of these keys has
    a list of default values. The keys and the values for each key are
    unique.
 */
+
 class AttributeTable:public XMLObj{
 public:
 	AttributeTable();
 	~AttributeTable();
 	void clear();
-	void addKey (const QString &k);		//!< Adds a key to the table
+	AttributeDef* addKey (const QString &k, const AttributeType &t);	//!< Adds a key to the table
 	void removeKey (const QString &k);	//!< Removes key and its default values
+	AttributeDef* getDef(const QString &k);	//!< Get defintion of attribute
 	int countKeys();					//!< Return number of keys
-	void addValue (const QString &k, const QString &v);	//!< Adds key and value
 	QStringList getKeys ();
-	QStringList getValues(const QString &k);
 	QString getDataXML();
 
 protected:
-	QStringList keys;
-	QList <QStringList> values;
+	QList <AttributeDef*> attdefs;
 };