# python script to generate configoptions.cpp from config.xml
#
# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby 
# granted. No representations are made about the suitability of this software 
# for any purpose. It is provided "as is" without express or implied warranty.
# See the GNU General Public License for more details.
#
# Documents produced by Doxygen are derivative works derived from the
# input used in their production; they are not affected by this license.
#
import xml.dom.minidom
import sys
from xml.dom import minidom, Node

def addValues(var,node):
	for n in node.childNodes:
		if n.nodeType == Node.ELEMENT_NODE:
			name = n.getAttribute('name');
			print "	 %s->addValue(\"%s\");" % (var,name)
	
def parseOption(node):
	name	= node.getAttribute('id')
	type	= node.getAttribute('type')
	format	= node.getAttribute('format')
	doc	= node.getAttribute('docs')
	defval	= node.getAttribute('defval')
	adefval = node.getAttribute('altdefval')
	depends = node.getAttribute('depends')
	setting = node.getAttribute('setting')
	# replace \ by \\, replace " by \", and '  ' by a newline with end string and start string at next line
	docC	= doc.strip().replace('\\','\\\\').replace('"','\\"').replace('	 ','\\n"\n		   "')
	if len(setting)>0:
		print "#if %s" % (setting)
	print "	 //----"
	if type=='bool':
		if len(adefval)>0:
			enabled = adefval
		elif defval=='1':
			enabled = "TRUE"
		else:
			enabled = "FALSE"
		print "	 cb = cfg->addBool("
		print "			\"%s\"," % (name)
		print "			\"%s\"," % (docC)
		print "			%s"  % (enabled)
		print "		       );"
		if depends!='':
			print "	 cb->addDependency(\"%s\");" % (depends)
	elif type=='string':
		print "	 cs = cfg->addString("
		print "			\"%s\"," % (name)
		print "			\"%s\""	 % (docC)
		print "		       );"
		if defval!='':
			print "	 cs->setDefaultValue(\"%s\");" % (defval)
		if format=='file':
			print "	 cs->setWidgetType(ConfigString::File);"
		elif format=='dir':
			print "	 cs->setWidgetType(ConfigString::Dir);"
		if depends!='':
			print "	 cs->addDependency(\"%s\");" % (depends)
	elif type=='enum':
		print "	 ce = cfg->addEnum("
		print "			\"%s\"," % (name)
		print "			\"%s\"," % (docC)
		print "			\"%s\""	 % (defval)
		print "		       );"
		addValues("ce",node)
		if depends!='':
			print "	 ce->addDependency(\"%s\");" % (depends)
	elif type=='int':
		minval = node.getAttribute('minval')
		maxval = node.getAttribute('maxval')
		print "	 ci = cfg->addInt("
		print "			\"%s\"," % (name)
		print "			\"%s\"," % (docC)
		print "			%s,%s,%s" % (minval,maxval,defval)
		print "		       );"
		if depends!='':
			print "	 ci->addDependency(\"%s\");" % (depends)
	elif type=='list':
		print "	 cl = cfg->addList("
		print "			\"%s\"," % (name)
		print "			\"%s\""	 % (docC)
		print "		       );"
		addValues("cl",node)
		if depends!='':
			print "	 cl->addDependency(\"%s\");" % (depends)
		if format=='file':
			print "	 cl->setWidgetType(ConfigList::File);"
		elif format=='dir':
			print "	 cl->setWidgetType(ConfigList::Dir);"
		elif format=='filedir':
			print "	 cl->setWidgetType(ConfigList::FileAndDir);"
	elif type=='obsolete':
		print "	 cfg->addObsolete(\"%s\");" % (name)
	if len(setting)>0:
		print "#else"
		print "	 cfg->addDisabled(\"%s\");" % (name)
		print "#endif"
		



def parseGroups(node):
	name = node.getAttribute('name')
	doc  = node.getAttribute('docs')
	print "	 //---------------------------------------------------------------------------";
	print "	 cfg->addInfo(\"%s\",\"%s\");" % (name,doc)
	print "	 //---------------------------------------------------------------------------";
	print
	for n in node.childNodes:
		if n.nodeType == Node.ELEMENT_NODE:
			parseOption(n)
	

def main():
	doc = xml.dom.minidom.parse(sys.argv[1])
	elem = doc.documentElement
	print "/* WARNING: This file is generated!"
	print " * Do not edit this file, but edit config.xml instead and run"
	print " * python configgen.py to regenerate this file!"
	print " */"
	print ""
	print "#include \"configoptions.h\""
	print "#include \"config.h\""
	print "#include \"portable.h\""
	print "#include \"settings.h\""
	print ""
	print "void addConfigOptions(Config *cfg)"
	print "{"
	print "	 ConfigString *cs;"
	print "	 ConfigEnum   *ce;"
	print "	 ConfigList   *cl;"
	print "	 ConfigInt    *ci;"
	print "	 ConfigBool   *cb;"
	print ""
	for n in elem.childNodes:
		if n.nodeType == Node.ELEMENT_NODE:
			parseGroups(n)
	print "}"

if __name__ == '__main__':
	main()

