2009-04-19 18:07:22 +00:00
|
|
|
|
|
|
|
#region ================== Copyright (c) 2007 Pascal vd Heiden
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
|
|
|
|
* This program is released under GNU General Public License
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Namespaces
|
|
|
|
|
2016-04-04 12:09:38 +00:00
|
|
|
using System;
|
2009-04-19 18:07:22 +00:00
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Globalization;
|
|
|
|
using CodeImp.DoomBuilder.IO;
|
2015-05-30 12:42:55 +00:00
|
|
|
using CodeImp.DoomBuilder.Types;
|
2009-04-19 18:07:22 +00:00
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
namespace CodeImp.DoomBuilder.Config
|
|
|
|
{
|
|
|
|
public class ArgumentInfo
|
|
|
|
{
|
|
|
|
#region ================== Constants
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Variables
|
|
|
|
|
2014-12-05 14:33:31 +00:00
|
|
|
private readonly string title;
|
2015-05-23 21:01:44 +00:00
|
|
|
private readonly string tooltip; //mxd
|
2014-12-05 14:33:31 +00:00
|
|
|
private readonly bool used;
|
|
|
|
private readonly int type;
|
2015-04-14 11:33:57 +00:00
|
|
|
private EnumList enumlist;
|
2016-04-11 12:05:23 +00:00
|
|
|
private EnumList flagslist; //mxd
|
2014-12-05 14:33:31 +00:00
|
|
|
private readonly object defaultvalue; //mxd
|
2016-04-04 12:09:38 +00:00
|
|
|
private readonly HashSet<string> targetclasses; //mxd
|
2009-04-19 18:07:22 +00:00
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Properties
|
|
|
|
|
|
|
|
public string Title { get { return title; } }
|
2015-05-23 21:01:44 +00:00
|
|
|
public string ToolTip { get { return tooltip; } } //mxd
|
2009-04-19 18:07:22 +00:00
|
|
|
public bool Used { get { return used; } }
|
|
|
|
public int Type { get { return type; } }
|
2016-04-04 12:09:38 +00:00
|
|
|
public HashSet<string> TargetClasses { get { return targetclasses; } } //mxd
|
2015-04-14 11:33:57 +00:00
|
|
|
public EnumList Enum { get { return enumlist; } internal set { enumlist = value; } }
|
2016-04-11 12:05:23 +00:00
|
|
|
public EnumList Flags { get { return flagslist; } internal set { flagslist = value; } } //mxd
|
2014-12-05 14:33:31 +00:00
|
|
|
public object DefaultValue { get { return defaultvalue; } } //mxd
|
2009-04-19 18:07:22 +00:00
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Constructor / Disposer
|
|
|
|
|
|
|
|
// Constructor for argument info from configuration
|
|
|
|
internal ArgumentInfo(Configuration cfg, string argspath, int argindex, IDictionary<string, EnumList> enums)
|
|
|
|
{
|
|
|
|
// Read
|
|
|
|
string istr = argindex.ToString(CultureInfo.InvariantCulture);
|
|
|
|
this.used = cfg.SettingExists(argspath + ".arg" + istr);
|
|
|
|
this.title = cfg.ReadSetting(argspath + ".arg" + istr + ".title", "Argument " + (argindex + 1));
|
2015-05-23 21:01:44 +00:00
|
|
|
this.tooltip = cfg.ReadSetting(argspath + ".arg" + istr + ".tooltip", string.Empty); //mxd
|
2009-04-19 18:07:22 +00:00
|
|
|
this.type = cfg.ReadSetting(argspath + ".arg" + istr + ".type", 0);
|
2014-12-05 14:33:31 +00:00
|
|
|
this.defaultvalue = cfg.ReadSetting(argspath + ".arg" + istr + ".default", 0); //mxd
|
2012-07-10 10:20:45 +00:00
|
|
|
|
2016-04-04 12:09:38 +00:00
|
|
|
//mxd. Check for TargetClass?
|
|
|
|
this.targetclasses = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
|
|
|
|
if(this.type == (int)UniversalType.ThingTag)
|
|
|
|
{
|
|
|
|
string s = cfg.ReadSetting(argspath + ".arg" + istr + ".targetclasses", string.Empty);
|
|
|
|
if(!string.IsNullOrEmpty(s))
|
|
|
|
{
|
|
|
|
foreach(string tclass in s.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries))
|
|
|
|
targetclasses.Add(tclass.Trim());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-04-19 18:07:22 +00:00
|
|
|
// Determine enum type
|
|
|
|
IDictionary argdic = cfg.ReadSetting(argspath + ".arg" + istr, new Hashtable());
|
2015-12-28 15:01:53 +00:00
|
|
|
if(argdic.Contains("enum"))
|
2009-04-19 18:07:22 +00:00
|
|
|
{
|
|
|
|
// Enum fully specified?
|
2015-12-28 15:01:53 +00:00
|
|
|
if(argdic["enum"] is IDictionary)
|
2009-04-19 18:07:22 +00:00
|
|
|
{
|
|
|
|
// Create anonymous enum
|
2016-03-18 12:52:12 +00:00
|
|
|
this.enumlist = new EnumList((IDictionary)argdic["enum"]);
|
2009-04-19 18:07:22 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Check if referenced enum exists
|
2015-12-28 15:01:53 +00:00
|
|
|
if((argdic["enum"].ToString().Length > 0) && enums.ContainsKey(argdic["enum"].ToString()))
|
2009-04-19 18:07:22 +00:00
|
|
|
{
|
|
|
|
// Get the enum list
|
2014-02-18 14:04:14 +00:00
|
|
|
this.enumlist = enums[argdic["enum"].ToString()];
|
2009-04-19 18:07:22 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2016-02-22 08:04:06 +00:00
|
|
|
General.ErrorLogger.Add(ErrorType.Warning, "\"" + argspath + ".arg" + istr + "\" references unknown enumeration \"" + argdic["enum"] + "\".");
|
2009-04-19 18:07:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-04-11 12:05:23 +00:00
|
|
|
|
|
|
|
//mxd. Determine flags type
|
|
|
|
if(argdic.Contains("flags"))
|
|
|
|
{
|
|
|
|
// Enum fully specified?
|
|
|
|
if(argdic["flags"] is IDictionary)
|
|
|
|
{
|
|
|
|
// Create anonymous enum
|
|
|
|
this.flagslist = new EnumList((IDictionary)argdic["flags"]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Check if referenced enum exists
|
|
|
|
if((argdic["flags"].ToString().Length > 0) && enums.ContainsKey(argdic["flags"].ToString()))
|
|
|
|
{
|
|
|
|
// Get the enum list
|
|
|
|
this.flagslist = enums[argdic["flags"].ToString()];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
General.ErrorLogger.Add(ErrorType.Warning, "\"" + argspath + ".arg" + istr + "\" references unknown flags enumeration \"" + argdic["flags"] + "\".");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-12-05 14:33:31 +00:00
|
|
|
|
2015-12-28 15:01:53 +00:00
|
|
|
if(this.enumlist == null) this.enumlist = new EnumList(); //mxd
|
2016-04-11 12:05:23 +00:00
|
|
|
if(this.flagslist == null) this.flagslist = new EnumList(); //mxd
|
2009-04-19 18:07:22 +00:00
|
|
|
}
|
|
|
|
|
2015-02-04 18:02:03 +00:00
|
|
|
//mxd. Constructor for an argument info defined in DECORATE
|
2015-05-31 21:11:21 +00:00
|
|
|
internal ArgumentInfo(string actorname, string argtitle, string tooltip, int type, int defaultvalue, string enumstr, IDictionary<string, EnumList> enums)
|
2015-02-04 18:02:03 +00:00
|
|
|
{
|
|
|
|
this.used = true;
|
2015-05-30 12:42:55 +00:00
|
|
|
this.title = argtitle;
|
2015-05-23 21:01:44 +00:00
|
|
|
this.tooltip = tooltip;
|
2015-05-31 21:11:21 +00:00
|
|
|
this.defaultvalue = defaultvalue;
|
2016-04-11 12:05:23 +00:00
|
|
|
this.flagslist = new EnumList(); //mxd
|
2015-05-30 12:42:55 +00:00
|
|
|
|
|
|
|
// Get argument type
|
|
|
|
if(System.Enum.IsDefined(typeof(UniversalType), type))
|
|
|
|
{
|
|
|
|
this.type = type;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
General.ErrorLogger.Add(ErrorType.Error, actorname + ": action argument \"" + argtitle + "\" has unknown type " + type + "!");
|
|
|
|
this.type = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get or create enum
|
|
|
|
if(!string.IsNullOrEmpty(enumstr))
|
|
|
|
{
|
|
|
|
if(enums.ContainsKey(enumstr.ToLowerInvariant()))
|
|
|
|
{
|
|
|
|
this.enumlist = enums[enumstr.ToLowerInvariant()];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Configuration cfg = new Configuration();
|
|
|
|
if(cfg.InputConfiguration("enum" + enumstr, true))
|
|
|
|
{
|
|
|
|
IDictionary argdic = cfg.ReadSetting("enum", new Hashtable());
|
|
|
|
if(argdic.Keys.Count > 0)
|
|
|
|
this.enumlist = new EnumList(argdic);
|
|
|
|
else
|
|
|
|
General.ErrorLogger.Add(ErrorType.Error, actorname + ": unable to parse explicit enum structure for argument \"" + argtitle + "\"!");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
General.ErrorLogger.Add(ErrorType.Error, actorname + ": unable to parse enum structure for argument \"" + argtitle + "\"!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(this.enumlist == null) this.enumlist = new EnumList();
|
2015-02-04 18:02:03 +00:00
|
|
|
}
|
|
|
|
|
2009-04-19 18:07:22 +00:00
|
|
|
// Constructor for unknown argument info
|
|
|
|
internal ArgumentInfo(int argindex)
|
|
|
|
{
|
|
|
|
this.used = false;
|
|
|
|
this.title = "Argument " + (argindex + 1);
|
|
|
|
this.type = 0;
|
|
|
|
this.enumlist = new EnumList();
|
2016-04-11 12:05:23 +00:00
|
|
|
this.flagslist = new EnumList(); //mxd
|
2014-12-05 14:33:31 +00:00
|
|
|
this.defaultvalue = 0; //mxd
|
2009-04-19 18:07:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ================== Methods
|
|
|
|
|
|
|
|
// This gets the description for an argument value
|
|
|
|
public string GetValueDescription(int value)
|
|
|
|
{
|
|
|
|
// TODO: Use the registered type editor to get the description!
|
|
|
|
|
|
|
|
return value.ToString();
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
|
|
}
|